diff --git a/experiment/aim.md b/experiment/aim.md index 4bc1c54..1e2c932 100644 --- a/experiment/aim.md +++ b/experiment/aim.md @@ -1 +1,5 @@ -### Aim of the experiment +### To study the performance characteristics of SCR. + +### To study the performance characteristics of IGBT. + +### To study the performance characteristics of MOSFET. diff --git a/experiment/experiment-name.md b/experiment/experiment-name.md index b0d364b..64bf5ef 100644 --- a/experiment/experiment-name.md +++ b/experiment/experiment-name.md @@ -1 +1 @@ -## Experiment name +## Characteristics of controlled switching power devices diff --git a/experiment/images/ith1.png b/experiment/images/ith1.png new file mode 100644 index 0000000..52c1ee1 Binary files /dev/null and b/experiment/images/ith1.png differ diff --git a/experiment/images/ith2.png b/experiment/images/ith2.png new file mode 100644 index 0000000..3ca6c2d Binary files /dev/null and b/experiment/images/ith2.png differ diff --git a/experiment/images/ith3.png b/experiment/images/ith3.png new file mode 100644 index 0000000..3d72030 Binary files /dev/null and b/experiment/images/ith3.png differ diff --git a/experiment/images/ith4.png b/experiment/images/ith4.png new file mode 100644 index 0000000..b5b6aac Binary files /dev/null and b/experiment/images/ith4.png differ diff --git a/experiment/images/ith5.png b/experiment/images/ith5.png new file mode 100644 index 0000000..07f52a7 Binary files /dev/null and b/experiment/images/ith5.png differ diff --git a/experiment/images/ith6.png b/experiment/images/ith6.png new file mode 100644 index 0000000..7866d0f Binary files /dev/null and b/experiment/images/ith6.png differ diff --git a/experiment/images/ith7.png b/experiment/images/ith7.png new file mode 100644 index 0000000..0900511 Binary files /dev/null and b/experiment/images/ith7.png differ diff --git a/experiment/images/mth1.png b/experiment/images/mth1.png new file mode 100644 index 0000000..cf00ee3 Binary files /dev/null and b/experiment/images/mth1.png differ diff --git a/experiment/images/mth2.png b/experiment/images/mth2.png new file mode 100644 index 0000000..9433cb7 Binary files /dev/null and b/experiment/images/mth2.png differ diff --git a/experiment/images/mth3.png b/experiment/images/mth3.png new file mode 100644 index 0000000..250d628 Binary files /dev/null and b/experiment/images/mth3.png differ diff --git a/experiment/images/mth4.png b/experiment/images/mth4.png new file mode 100644 index 0000000..762adeb Binary files /dev/null and b/experiment/images/mth4.png differ diff --git a/experiment/images/mth5.png b/experiment/images/mth5.png new file mode 100644 index 0000000..cb758f7 Binary files /dev/null and b/experiment/images/mth5.png differ diff --git a/experiment/images/mth6.png b/experiment/images/mth6.png new file mode 100644 index 0000000..6feb821 Binary files /dev/null and b/experiment/images/mth6.png differ diff --git a/experiment/images/mth7.png b/experiment/images/mth7.png new file mode 100644 index 0000000..d33615b Binary files /dev/null and b/experiment/images/mth7.png differ diff --git a/experiment/images/pos2.png b/experiment/images/pos2.png new file mode 100644 index 0000000..fdc0cc8 Binary files /dev/null and b/experiment/images/pos2.png differ diff --git a/experiment/images/pre2.png b/experiment/images/pre2.png new file mode 100644 index 0000000..f71560c Binary files /dev/null and b/experiment/images/pre2.png differ diff --git a/experiment/images/pre3.png b/experiment/images/pre3.png new file mode 100644 index 0000000..bd1e6ab Binary files /dev/null and b/experiment/images/pre3.png differ diff --git a/experiment/images/pre4.png b/experiment/images/pre4.png new file mode 100644 index 0000000..3bd1220 Binary files /dev/null and b/experiment/images/pre4.png differ diff --git a/experiment/images/pre5.png b/experiment/images/pre5.png new file mode 100644 index 0000000..f2b244a Binary files /dev/null and b/experiment/images/pre5.png differ diff --git a/experiment/images/pre6.png b/experiment/images/pre6.png new file mode 100644 index 0000000..a05b43a Binary files /dev/null and b/experiment/images/pre6.png differ diff --git a/experiment/images/th10.png b/experiment/images/th10.png new file mode 100644 index 0000000..2da3d65 Binary files /dev/null and b/experiment/images/th10.png differ diff --git a/experiment/images/th4.png b/experiment/images/th4.png new file mode 100644 index 0000000..a17cf30 Binary files /dev/null and b/experiment/images/th4.png differ diff --git a/experiment/images/th5.png b/experiment/images/th5.png new file mode 100644 index 0000000..b4672ee Binary files /dev/null and b/experiment/images/th5.png differ diff --git a/experiment/images/th6.png b/experiment/images/th6.png new file mode 100644 index 0000000..684a2f9 Binary files /dev/null and b/experiment/images/th6.png differ diff --git a/experiment/images/th7.png b/experiment/images/th7.png new file mode 100644 index 0000000..849717e Binary files /dev/null and b/experiment/images/th7.png differ diff --git a/experiment/images/th8.png b/experiment/images/th8.png new file mode 100644 index 0000000..468eedc Binary files /dev/null and b/experiment/images/th8.png differ diff --git a/experiment/images/th9.png b/experiment/images/th9.png new file mode 100644 index 0000000..ec1d8c0 Binary files /dev/null and b/experiment/images/th9.png differ diff --git a/experiment/posttest.json b/experiment/posttest.json index e0e6fc2..93d149c 100644 --- a/experiment/posttest.json +++ b/experiment/posttest.json @@ -2,38 +2,227 @@ "version": 2.0, "questions": [ { - "question": "This is a Sample Question 1?", + "question": "1. In SCR, the magnitude of latching current (IL) compared to holding current (IH) is:", + "answers": { + "a": "Higher", + "b": "Lower", + "c": "Equal", + "d": "Negligible" + }, + "explanations": { + "a": "Explanation 1: The latching current is always higher than the holding current.", + "b": "Explanation 2", + "c": "Explanation 3", + "d": "Explanation 4" + }, + "correctAnswer": "a", + "difficulty": "beginner" + }, + + { + "question": "2. The v-i characteristics of SCR is a plot between:", + "answers": { + "a": "Gate voltage (vg)-vs-Anode Current (iA)", + "b": "Anode-to-Cathode voltage (vAK)-vs-Anode Current (iA)", + "c": "Anode-to-Cathode voltage (vAK)-vs-Gate Current (Ig)", + "d": "Gate voltage (vg)-vs-Gate Current (Ig)" + }, + "explanations": { + "a": "Explanation 1", + "b": "Explanation 2: v-i characteristics shows the relation between the voltage across anode-to-cathode and the anode current.", + "c": "Explanation 3", + "d": "Explanation 4" + }, + "correctAnswer": "b", + "difficulty": "beginner" + }, + + { + + "question": "3. The minimum value of anode current (iA) below which the SCR turns-OFF is called the", + "answers": { + "a": "Peak anode current", + "b": "Latching current", + "c": "Holding current", + "d": "Forward breakover current" + }, + "explanations": { + "a": "Explanation 1", + "b": "Explanation 2", + "c": "Explanation 3: Holding current is the minimum current required to keep SCR in conduction mode.", + "d": "Explanation 4" + }, + "correctAnswer": "c", + "difficulty": "beginner" + }, + + { + + "question": "4. Under forward blocking state, the three junctions of the SCR (J1, J2 and J3) are in which states?

", + "answers": { + "a": "All are forward biased", + "b": "All are reverse biased", + "c": "'J1, J3' are forward biased while 'J2' is reverse biased", + "d": "'J1, J2' are forward biased while 'J3' is reverse biased" + }, + "explanations": { + "a": "Explanation 1", + "b": "Explanation 2", + "c": "Explanation 3: During forward blocking J1 and J2 are forward biased because a positive Anode-to-Cathode voltage is applied. Whereas J2 is reverse biased due to the absence of gate current.", + "d": "Explanation 4" + }, + "correctAnswer": "c", + "difficulty": "beginner" + }, + + { + "question": "5. A SCR is triggered using a gate current. After sometime the gate signal is stopped. What is the status of SCR?", + "answers": { + "a": "SCR stops conducting.", + "b": "SCR goes into reverse breakdown.", + "c": "SCR continues to conduct if anode current is maintained above latching current.", + "d": "SCR continues to conduct if anode current is maintained above holding current." + }, + "explanations": { + "a": "Explanation 1", + "b": "Explanation 2", + "c": "Explanation 3", + "d": "Explanation 4: SCR is a semi-controlled device i.e. once turned- ON (by gate current), it continues conducting even when gate pulse is removed (provided anode current is greater than the holding current)." + }, + "correctAnswer": "d", + "difficulty": "beginner" + }, + + { + + "question": "6. A forward biased MOSFET comes into ON-state by?", + "answers": { + "a": "Allowing Drain current (ID)", + "b": "Applying Drain-to-Source voltage (VDS)", + "c": "Applying Gate-to-Source voltage (VGS)", + "d": "Allowing Gate current (IG)" + }, + "explanations": { + "a": "Explanation 1", + "b": "Explanation 2", + "c": "Explanation 3: MOSFET is a voltage controlled device. Applying a positive Gate-to-Source voltage turns- ON the MOSFET.", + "d": "Explanation 4" + }, + "correctAnswer": "c", + "difficulty": "beginner" + }, + + { + + "question": "7. In comparison to IGBT the losses in MOSFET are?", + "answers": { + "a": "Lower", + "b": "Higher", + "c": "Almost equal", + "d": "Double" + }, + "explanations": { + "a": "Explanation 1", + "b": "Explanation 2: IGBT has lower conduction losses compared to MOSFET.", + "c": "Explanation 3", + "d": "Explanation 4" + }, + "correctAnswer": "b", + "difficulty": "beginner" + }, + + { + "question": "8. Reliable method for firing an SCR is?", + "answers": { + "a": "High dv/dt", + "b": "Continuous gate signal", + "c": "Firing pulses", + "d": "High di/dt" + }, + "explanations": { + "a": "Explanation 1", + "b": "Explanation 2", + "c": "Explanation 3: SCR is a unidirectional device and allows current to flow only from Anode to Cathode when sufficient Gate current or firing pulses is applied.", + "d": "Explanation 4" + }, + "correctAnswer": "c", + "difficulty": "beginner" + }, + + { + "question": "9. In practice, the correct method of turning-ON a SCR is?", + "answers": { + "a": "Increasing the anode-to-cathode voltage (vAK) till it reaches a value equal to or above forward breakover voltage (vBO).", + "b": "The anode-to-cathode voltage (vAK) is maintained below the breakover voltage (vBO) and a positive voltage between the gate and cathode (Vg) is applied across SCR.", + "c": "Increasing the anode-to-cathode voltage (vAK) till the anode current (iA) reaches above holding current (IH).", + "d": "Positive anode-to-cathode voltage (vAK) automatically turns- ON the SCR." + }, + "explanations": { + "a": "Explanation 1", + "b": "Explanation 2: SCR is turned- ON by forward biasing it and giving it sufficient gate current.", + "c": "Explanation 3", + "d": "Explanation 4" + }, + "correctAnswer": "b", + "difficulty": "beginner" + }, + + { + "question": "10. How can a conducting SCR be turned-OFF?", "answers": { - "a": "answer1", - "b": "answer2", - "c": "answer3", - "d": "answer4" + "a": "By application of negative anode current (iA) or negative anode-to-cathode voltage (vAK).", + "b": "By application of negative gate current (Ig).", + "c": "By reducing the gate current (Ig) to zero.", + "d": "All of the above methods are correct." }, "explanations": { - "a": "Explanation 1 here", + "a": "Explanation 1: Applying negative anode current or negative anode-to-cathode voltage reverse biases the SCR, turning it OFF.", "b": "Explanation 2", - "c": "Explanation 2", - "d": "Explanation 2" + "c": "Explanation 3", + "d": "Explanation 4" }, "correctAnswer": "a", "difficulty": "beginner" }, + + + { + + "question": "11. An IGBT is in ON- state. It is observed that with increasing collector-to-emitter voltage (VCE) the collector current (IC) is almost constant. Which region is the IGBT operating in?", + "answers": { + "a": "Cutoff", + "b": "Linear", + "c": "Saturation", + "d": "Reverse blocking" + }, + "explanations": { + "a": "Explanation 1", + "b": "Explanation 2", + "c": "Explanation 3: In saturation mode, the IGBT current remains constant even when Collector-to-emitter voltage is increased.", + "d": "Explanation 4" + }, + "correctAnswer": "c", + "difficulty": "beginner" + }, + { - "question": "This is a Sample Question 2?", + + "question": "12. When compared to MOSFET the time required to turn- OFF an IGBT is?", "answers": { - "a": "answer1", - "b": "answer2", - "c": "answer3", - "d": "answer4" + "a": "Almost equal", + "b": "Lower", + "c": "Higher", + "d": "Half" }, "explanations": { - "a": "Explanation 1 here", + "a": "Explanation 1", "b": "Explanation 2", - "c": "Explanation 2", - "d": "Explanation 2" + "c": "Explanation 3: Switching time of IGBT is greater than MOSFET due to the presence of tail current.", + "d": "Explanation 4" }, "correctAnswer": "c", "difficulty": "beginner" } + ] } diff --git a/experiment/pretest.json b/experiment/pretest.json index e0e6fc2..7c622c5 100644 --- a/experiment/pretest.json +++ b/experiment/pretest.json @@ -1,39 +1,228 @@ { "version": 2.0, "questions": [ + { + "question": "1. Select the false statement:", + "answers": { + "a": "SCR has three terminals: anode, cathode and gate.", + "b": "SCR is a four-layer semiconductor device.", + "c": "SCR allows current in either directions.", + "d": "SCR has three junctions." + }, + "explanations": { + "a": "Explanation 1", + "b": "Explanation 2", + "c": "Explanation 3: SCR is a unidirectional device and allows current to flow only from Anode to Cathode when firing pulses are given.", + "d": "Explanation 4" + }, + "correctAnswer": "c", + "difficulty": "beginner" + }, + { - "question": "This is a Sample Question 1?", + + "question": "2. Select the false statement:", + "answers": { + "a": "IGBT has three terminals: Collector, Emitter and Gate.", + "b": "IGBT is a four-layer semiconductor device.", + "c": "IGBT allows current in either directions.", + "d": "IGBT has three junctions." + }, + "explanations": { + "a": "Explanation 1", + "b": "Explanation 2", + "c": "Explanation 3: IGBT is a unidirectional device and allows current to flow only from Collector to Emitter when sufficient Gate-to-Emitter voltage is applied.", + "d": "Explanation 4" + }, + "correctAnswer": "c", + "difficulty": "beginner" + }, + + + { + + "question": "3. The properties of IGBT are a combination of which of the following two devices?", "answers": { - "a": "answer1", - "b": "answer2", - "c": "answer3", - "d": "answer4" + "a": "MOSFET and SCR", + "b": "MOSFET and BJT", + "c": "SCR and TRIAC", + "d": "BJT and TRIAC" }, "explanations": { - "a": "Explanation 1 here", + "a": "Explanation 1", + "b": "Explanation 2: IGBT structure is a combination of MOSFET (at the input side) and BJT (output side).", + "c": "Explanation 3", + "d": "Explanation 4" + }, + "correctAnswer": "b", + "difficulty": "beginner" + }, + + { + + "question": "4. SCR has a:", + "answers": { + "a": "PNPN structure", + "b": "PNP structure", + "c": "NPNP structure", + "d": "NPN structure" + }, + "explanations": { + "a": "Explanation 1: SCR is made up of four layers of alternating P-type and N-type silicon semiconductors, forming a PNPN structure.", "b": "Explanation 2", - "c": "Explanation 2", - "d": "Explanation 2" + "c": "Explanation 3", + "d": "Explanation 4" }, "correctAnswer": "a", "difficulty": "beginner" }, + { - "question": "This is a Sample Question 2?", + + "question": "5. Identify the three terminals of SCR- anode (A), cathode (K) and gate (G) in the SCR figure given below from left-to-right.

", "answers": { - "a": "answer1", - "b": "answer2", - "c": "answer3", - "d": "answer4" + "a": "(i)- cathode, (ii)- anode, (iii)- gate", + "b": "(i)- anode, (ii)- cathode, (iii)- gate", + "c": "(i)- gate, (ii)- anode, (iii)- cathode", + "d": "(i)- gate, (ii)- cathode, (iii)- anode" }, "explanations": { - "a": "Explanation 1 here", + "a": "Explanation 1: Standard nomenclature is adopted.", "b": "Explanation 2", - "c": "Explanation 2", - "d": "Explanation 2" + "c": "Explanation 3", + "d": "Explanation 4" }, - "correctAnswer": "c", + "correctAnswer": "a", + "difficulty": "beginner" + }, + + { + "question": "6. In order to trigger or turn- ON a SCR, the potential difference between anode-to-cathode must be:", + "answers": { + "a": "Positive", + "b": "Negative", + "c": "Zero", + "d": "Equal to gate-to-cathode voltage" + }, + "explanations": { + "a": "Explanation 1: SCR turns-ON or goes into forward conduction mode when a positive voltage is applied between the anode and cathode together with positive gate current.", + "b": "Explanation 2", + "c": "Explanation 3", + "d": "Explanation 4" + }, + "correctAnswer": "a", + "difficulty": "beginner" + }, + + { + "question": "7. Which of the following statements differentiate the SCR from a diode?", + "answers": { + "a": "It blocks current when reverse biased.", + "b": "It conducts when forward biased at a given gate signal.", + "c": "It conducts when forward biased without any gate signal.", + "d": "It conducts when reverse biased at a given gate signal." + }, + "explanations": { + "a": "Explanation 1", + "b": "Explanation 2: A diode conducts when the voltage between the anode and cathode is positive (forward biased). For a SCR to conduct, in addition to positive anode-to-cathode voltage, a sufficient gate current is also necessary.", + "c": "Explanation 3", + "d": "Explanation 4" + }, + "correctAnswer": "b", + "difficulty": "beginner" + }, + + { + "question": "8. The correct symbolic representation of an SCR is?", + "answers": { + "a": "", + "b": "", + "c": "", + "d": "" + }, + "explanations": { + "a": "Explanation 1", + "b": "Explanation 2", + "c": "Explanation 3", + "d": "Explanation 4: Standard nomenclature is adopted." + }, + "correctAnswer": "d", + "difficulty": "beginner" + }, + + { + "question": "9. Choose the correct statement.", + "answers": { + "a": "SCR is a fully controlled device.", + "b": "SCR is a semi-controlled device.", + "c": "SCR is a uncontrolled device.", + "d": "All the above statements are false." + }, + "explanations": { + "a": "Explanation 1", + "b": "Explanation 2: SCR is turned- ON using firing pulses but it cannot be turned- OFF by removing firing pulses. Hence, it a semi-controlled device.", + "c": "Explanation 3", + "d": "Explanation 4" + }, + "correctAnswer": "b", + "difficulty": "beginner" + }, + + { + "question": "10. SCR is capable of blocking:", + "answers": { + "a": "neither positive nor negative anode-to-cathode voltages.", + "b": "only positive anode-to-cathode voltages.", + "c": "only negative anode-to-cathode voltages.", + "d": "both positive and negative anode-to-cathode voltages." + }, + "explanations": { + "a": "Explanation 1", + "b": "Explanation 2", + "c": "Explanation 3", + "d": "Explanation 4: SCR is capable of blocking both polarities of anode-to-cathode voltage (VAK). During forward blocking it blocks positive VAK and during reverse blocking it blocks negative VAK." + }, + "correctAnswer": "d", + "difficulty": "beginner" + }, + + { + + "question": "11. Which of the following statements is correct?", + "answers": { + "a": "MOSFET is a voltage controlled device", + "b": "Switching speed of IGBT is faster than MOSFET", + "c": "MOSFET is a current controlled device", + "d": "MOSFET is suitable for line frequency AC-DC rectifiers" + }, + "explanations": { + "a": "Explanation 1: MOSFET conducts when gate pulses or positive Gate-to-Source voltage is applied. Hence, it is a voltage controlled device.", + "b": "Explanation 2", + "c": "Explanation 3", + "d": "Explanation 4" + }, + "correctAnswer": "a", + "difficulty": "beginner" + }, + + { + + "question": "12. Which of the following is the correct for MOSFET from application point of view?", + "answers": { + "a": "High power, high frequency", + "b": "Low power, high frequency", + "c": "Low power, low frequency", + "d": "High power, low frequency" + }, + "explanations": { + "a": "Explanation 1", + "b": "Explanation 2: MOSFET is capable of operating at high switching frequencies and hence it is used in low power applications.", + "c": "Explanation 3", + "d": "Explanation 4" + }, + "correctAnswer": "b", "difficulty": "beginner" } + ] } diff --git a/experiment/procedure.md b/experiment/procedure.md index 37929cc..f0308da 100644 --- a/experiment/procedure.md +++ b/experiment/procedure.md @@ -1 +1,112 @@ -### Procedure \ No newline at end of file +### Procedure + + +### For “Low frequency switching device (SCR)” + +**1. 'v-i' Characteristics using meters:** + +a) Click on ‘Connections’ icon. A table containing all will terminals appear. + +b) Click on each starting terminal and observe the corresponding connection. + +c) After all nodes are connected, Click on ‘Connections Completed’ icon. + +d) ‘Switch- ON’ the main supply (Vin). + +e) Click on ‘Start Experiment’ icon. + + +**On the Experiment page:** + +a) Observe the ‘v-i’ characteristics plotted on the graph on the right side. They are plotted for three different values of gate currents (Ig) by using the data logging features of the meters. + +**2. 'v-i' Characteristics using probes and oscilloscope:** + +a) Click on ‘Connections’ icon. A table containing all will terminals appear. + +b) Click on each starting terminal and observe the corresponding connection. + +c) After all nodes are connected, Click on ‘Connections Completed’ icon. + +d) ‘Switch- ON’ the main supply (Vin). + +e) Click on ‘Start Experiment’ icon. + + +**On the Experiment page:** + +a) Click on the ‘Rg’ slider to set it at an initial maximum value of 25 kΩ. This sets the gate current (Ig) to zero. +Click on the Resistance icon- ‘R’ to set the load. + +b) Click on the ‘vin’ slider to set the main supply voltage to 15 V (rms) + +c) Click on the ‘plot’ icon. Observe the Reverse blocking and Forward blocking characteristics on the graph. + +d) Click on the ‘Rg’ slider to set it to 750 Ω. Observe the gate current ‘Ig’. Click on the ‘plot’ icon. Observe the forward conduction characteristics of the SCR. + +e) Repeat Step-4 for Rg = 150 Ω and 50 Ω. + + +### For “Medium frequency switching device (IGBT)” + +**Output Characteristics using probes and oscilloscope:** + +a) Click on ‘Make connections’ icon. + +b) A table listing all the terminals pops up. This a simple series circuit. Click on each ‘From’ terminal one after the other. + +c) Observe the simultaneous connection being formed. + +d) Once all the terminals are connected, click on ‘Connections Completed’ icon. + +e) ‘Switch- ON’ the main supply. + +f) ‘Switch- ON’ the Gate-to-Source supply. + +g) Click on ‘Start Experiment’. + + +**On the Experiment page:** + +a) Click on the Resistance icon- ‘R’ to set the load. + +b) Set the initial Gate-to-Source voltage ‘VGS’ using the slider. + +c) Vary the Main voltage (Vin) using the “Vin” slider. + +d) Click on ‘Plot’ to trace the characteristics. + +e) Repeat Steps-2 to 4 for a total of five values of Gate-to-Source voltage (VGE). + + +### For “High frequency switching device (MOSFET)” + +**Output Characteristics using probes and oscilloscope:** + +a) Click on ‘Make connections’ icon. + +b) A table listing all the terminals pops up. This a simple series circuit. Click on each ‘From’ terminal one after the other. + +c) Observe the simultaneous connection being formed. + +d) Once all the terminals are connected, click on ‘Connections Completed’ icon. + +e) ‘Switch- ON’ the main supply. + +f) ‘Switch- ON’ the Gate-to-Source supply. + +g) Click on ‘Start Experiment’. + + +**On the Experiment page:** + +a) Click on the Resistance icon- ‘R’ to set the load. + +b) Set the initial Gate-to-Source voltage ‘VGS’ using the slider. + +c) Vary the Main voltage (Vin) using the “Vin” slider. + +d) Click on ‘Plot’ to trace the characteristics. + +e) Repeat Steps-2 to 4 for a total of five values of Gate-to-Source voltage (VGS). + diff --git a/experiment/references.md b/experiment/references.md index b15b47e..02acb08 100644 --- a/experiment/references.md +++ b/experiment/references.md @@ -1 +1,5 @@ -### Link your references in here \ No newline at end of file +### References + +1. R. Erickson & D. Maksimović, Fundamentals of Power Electronics. Springer Nature, July 2020 + +2. M. H. Rashid, Power Electronics: Devices, Circuits, and Applications. Pearson Education Limited, 2014. diff --git a/experiment/simulation/Dom.js b/experiment/simulation/Dom.js new file mode 100644 index 0000000..4f68dc5 --- /dev/null +++ b/experiment/simulation/Dom.js @@ -0,0 +1,240 @@ + +// global for document object +const get = (query) => { + return document.querySelector(query); +}; + +const getAll = (query) => { + return document.querySelectorAll(query); +}; + +class Dom { + constructor(selector) { + this.item = null; + if (selector[0] == "." || selector[0] == "#") { + this.item = get(selector); + } else if (selector instanceof HTMLElement) { + this.item = selector; + } else { + this.item = src.get(selector); + } + this.selector = selector; + // push + } + getValue(){ + return this.item.attributes['value'].value + } + setValue(val){ + this.item.attributes['value'].value = val; + } + setAttribute(attribute,value){ + this.item.attributes[attribute] = value + } + getAttribute(attribute){ + this.item.attributes[attribute].value + } + hidden(isHidden) { + if (isHidden == false) this.item.style.visibility = "visible"; + else this.item.style.visibility = "hidden"; + } + setContent(text) { + this.item.innerHTML = text; + return this; + } + zIndex(idx) { + this.item.style.zIndex = idx; + return this; + } + opacity(val = 1) { + this.item.style.opacity = val; + return this; + } + rotate(deg) { + this.item.style.transform = `rotate(${deg}deg)`; + return this; + } + addClass(className) { + this.item.classList.add(className); + return this; + } + removeClass(className) { + this.item.classList.remove(className); + return this; + } + borderRadius(amount) { + amount += "px"; + this.styles({ + borderRadius: amount, + }); + } + scale(val = 1) { + this.item.style.scale = val; + return this; + } + get() { + return this.item; + } + set( + left = null, + top = null, + height = null, + width = null, + bottom = null, + right = null, + disp = "block" + ) { + // coordinates + this.left = left; + this.top = top; + this.bottom = bottom; + this.right = right; + this.height = height; + this.width = width; + this.item.style.opacity = 1; + this.item.style.transform = "translateX(0) translateY(0)"; + + if (this.left !== null) this.item.style.left = String(this.left) + "px"; + if (this.top !== null) this.item.style.top = String(this.top) + "px"; + if (this.bottom !== null) + this.item.style.bottom = String(this.bottom) + "px"; + if (this.right !== null) this.item.style.right = String(this.right) + "px"; + if (this.height !== null) + this.item.style.height = String(this.height) + "px"; + if (this.width !== null) this.item.style.width = String(this.width) + "px"; + this.show(disp); + return this; + } + show(disp = "block") { + //! push for every element + this.push(); + + this.item.style.display = disp; + // this.opacity(); + return this; + } + hide() { + this.item.style.display = "none"; + return this; + } + play(speed = 1) { + this.item.play(); + this.item.playbackRate = speed; + return this; + } + // for setting styles + styles(props) { + for (let property in props) { + this.item.style[property] = props[property]; + } + return this; + } + // * static elements/objects of anime + static arrayOfAnimes = []; + static arrayOfItems = []; + static animePush(animeObj) { + Dom.arrayOfAnimes.push(animeObj); + } + static resetAnimeItems() { + Dom.arrayOfAnimes = []; + } + static hideAll() { + //to empty the setCC + setCC(""); + // to delete all content of content adder menu + Scenes.items.contentAdderBox.setContent(""); + for (let i of Dom.arrayOfItems) { + i.hide(); + i.opacity(); + } + // * reset animes + for (let i of Dom.arrayOfAnimes) { + // to reset each anime after back btn pressed + i.reset(); + } + Dom.resetItems(); + } + static resetItems() { + Dom.arrayOfItems = []; + } + static setBlinkArrowRed( + isX = true, + left = null, + top = null, + height = 30, + width = null, + rotate = 0 + ) { + let blinkArrow = new Dom(".blinkArrowRed") + .set(left, top, height, width) + .rotate(rotate) + .zIndex(10000); + if (isX === -1) { + blinkArrow.hide(); + return; + } + let x = 0, + y = 0; + if (isX) { + x = 20; + } else { + y = 20; + } + var blink = anime({ + targets: blinkArrow.item, + easing: "easeInOutQuad", + opacity: 1, + translateX: x, + translateY: y, + direction: "alternate", + loop: true, + autoplay: false, + duration: 300, + }); + + return blink; + } + static setBlinkArrow( + isX = true, + left = null, + top = null, + height = 60, + width = 60, + rotate = 0 + ) { + // because we added the blinkArrow image out of the anime-main + top += 130; + let blinkArrow = new Dom(".blinkArrow") + .set(left, top, height, width) + .rotate(rotate) + .zIndex(10000); + if (isX === -1) { + blinkArrow.hide(); + return; + } + let x = 0, + y = 0; + if (isX) { + x = 20; + } else { + y = 20; + } + var blink = anime({ + targets: blinkArrow.item, + easing: "easeInOutQuad", + opacity: 1, + translateX: x, + translateY: y, + direction: "alternate", + loop: true, + autoplay: false, + duration: 300, + }); + + return blink; + } + push() { + if (this.selector != ".anime-header") Dom.arrayOfItems.push(this); + return this; + } + forMathematicalExpressionBtn = 0; + } \ No newline at end of file diff --git a/experiment/simulation/EE4/.vscode/settings.json b/experiment/simulation/EE4/.vscode/settings.json new file mode 100644 index 0000000..5b06ac3 --- /dev/null +++ b/experiment/simulation/EE4/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "liveServer.settings.port": 5506 +} \ No newline at end of file diff --git a/experiment/simulation/EE4/css/EE4_styling.css b/experiment/simulation/EE4/css/EE4_styling.css new file mode 100644 index 0000000..4c49f47 --- /dev/null +++ b/experiment/simulation/EE4/css/EE4_styling.css @@ -0,0 +1,88 @@ +.connections-box{ + border: solid 1px black; + display: flex; + width: 504px; + position: absolute; + z-index: 100; + } + .connections-box .btn-box span{ + padding: 5px 10px; + font-weight: bold; + font-size: 16px; + } + .connections-box .head{ + background-color: #ffc000; + width: 70px!important; + } + .connections-box .btn-box{ + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + padding: 0; + width: 44px; + border-radius: none; + cursor: pointer; + } + .connections-box .middle-border{ + border-bottom: 2px solid; + width: 502px; + top: 30px; + position: absolute; + } + + .part_2_connections_box{ + display: none; + } + + .part_1_1_connections_box{ + display: none; + width: auto; + } + .part_1_1_connections_box .middle-border{ + width: 422px; + } + + .part_1_2_connections_box{ + display: none; + } + + +/* Table style */ +.table{ + display: none; + position: absolute; + border: 1px solid black; + border-collapse: collapse; +} + +.table td, .table th { + height: 25px; + padding: 0 20px; + font-weight: bold; + text-align: center; + border: 1px solid black; +} + +.part_2_table th{ + background-color: #002060; + color: white; +} + +/* part3 table */ +.part3_table_two{ + width: 430px; +} + +.part3_table_two th, +.part3_table_two td +{ + width: 73px!important; + font-size: 13px; + padding: 0!important; +} + +.part3_table_two th{ + font-size: 15px!important; + height: 15px!important; +} diff --git a/experiment/simulation/EE4/css/certificate.css b/experiment/simulation/EE4/css/certificate.css new file mode 100644 index 0000000..6fbf347 --- /dev/null +++ b/experiment/simulation/EE4/css/certificate.css @@ -0,0 +1,72 @@ +@import url("https://fonts.googleapis.com/css?family=Open+Sans|Pinyon+Script|Rochester|Homemade+Apple"); + +.certificate { + position: absolute; + box-shadow: inset 0px 0px 20px 12px #3d246c; + min-width: 800px; + min-height: 400px; + border: 14px solid #3d246c; + flex-direction: column; + display: none; + padding-top: 35px; +} + +.certificate .header { + transform: translateY(-25px); + display: flex; + align-items: center; + flex-direction: column; +} + +.certificate .student-detail { + display: flex; + flex-direction: column; + gap: 5px; + align-items: center; +} + +.cursive { + font-size: 1.8rem; + font-family: "Pinyon Script", cursive !important; + font-family: "Rochester", cursive !important; + font-style: italic; + /* font-family: "Homemade Apple", cursive !important; */ +} + +.certificate hr { + width: 90%; +} + +.sans { + font-family: "Open Sans", sans-serif; + text-align: center; +} + +.title {} + +.bold { + font-weight: bold; +} + +.red{ + color: red; +} + +.certificate .logo { + height: 80px; + /* transform: translateY(-25px); */ +} + +.certificate .row { + display: flex; + flex-direction: column; +} + +.btn-save{ + display: none; +} + +.certificate #certificateStuName{ + font-size: 1.8rem; + border-bottom: 2px solid black; +} \ No newline at end of file diff --git a/experiment/simulation/EE4/css/chart.css b/experiment/simulation/EE4/css/chart.css new file mode 100644 index 0000000..2fab3e3 --- /dev/null +++ b/experiment/simulation/EE4/css/chart.css @@ -0,0 +1,15 @@ +.chart { + display: none; + position: absolute; + padding: 10px; + width: fit-content; + border-radius: 20px; + box-shadow: 3px 3px 12px 0px; + height: 220px !important; + width: 364px !important; +} + +.chart #myChart { + height: 100%!important; + width: 100%!important; +} \ No newline at end of file diff --git a/experiment/simulation/EE4/css/component_styling.css b/experiment/simulation/EE4/css/component_styling.css new file mode 100644 index 0000000..8ddb655 --- /dev/null +++ b/experiment/simulation/EE4/css/component_styling.css @@ -0,0 +1,626 @@ +@font-face { + font-family: "Cosmic Sans MS"; + src: url(../fonts/ComicSansMS3.ttf); +} + +.qs{ + cursor: pointer; + display: none; + position: absolute; + /* display: flex; */ + text-align: center; + box-shadow: 1px 1px 5px lime; + border-radius: 10px; + font-size: 3.5em; + font-weight: bolder; + color: white; + height: 70px; + width: 70px; + background-color: #05bc57; + justify-content: center; + align-items: center; + align-content: center; +} + +/* * Slider */ +.slider-box{ + /* display: none; */ + position: absolute; + /* user-select: none; */ + } + + +/* table styling */ + +/* part3 table one */ +.part3_table_one{ + display: none; + bottom: 0px; + position: absolute; + right: 10px; + text-align: center; + gap: 20px; + border-collapse: collapse; +} +.part3_table_one td,tr,th{ + border: 1px solid black; +} +.part3_table_one thead{ + background-color: #0000cc; + color: white; +} +.part3_table_one thead tr th{ + width: 64px; +} +.part3_table_one tbody tr{ + height: 29px; +} +.part3_table_one td{ + text-align: center; + font-weight: bold; + width: 100px; + font-size: 1.2em; + padding: 0; + margin: 0; +} +.part3_table_one th{ + font-size: 1.2em; +} +.part3_table_one tbody tr:nth-child(2n){ + background-color: #eaeff7; +} +.part3_table_one tbody tr:nth-child(2n+1){ + background-color: #d2deef; +} +/* +.part3_table_one td:nth-child(2){ + background-color: rgb(194, 194, 194); +} +.part3_table_one td:nth-child(3){ + background-color: rgb(194, 194, 194); +} +.part3_table_one td:nth-child(4){ + background-color: rgb(194, 194, 194); */ +/* } */ +/* .part3_table_one td:nth-child(10){ + background-color: #ffff00; +} +.part3_table_one td:nth-child(11){ + background-color: #ffc000; +} */ + +/* part table two */ +.part3_table_two{ + display: none; + position: absolute; + right: 10px; + width: 500px; + text-align: center; + border-collapse: collapse; +} +.part3_table_two td,tr,th{ + border: 1px solid black; +} +.part3_table_two thead{ + /* background-color: #0000cc; */ + background-color: #660066; + color: white; +} +.part3_table_two thead tr th{ + width: 10px; + font-size: 16px; + padding: 0; + height: 60px; +} + +.part3_table_two tbody tr{ + height: 20px; +} +.part3_table_two td{ + text-align: center; + font-weight: bold; + width: 10px; + font-size: 16px; + padding: 0 14px!important; + margin: 0; +} +/* .part3_table_two tbody tr:nth-child(2n){ + background-color: #eaeff7; +} +.part3_table_two tbody tr:nth-child(2n+1){ + background-color: #d2deef; +} */ +.part3_table_two.v0-bg td:nth-child(5){ + background-color: rgb(194, 194, 194); +} +.part3_table_two.v0-bg td:nth-child(6){ + background-color: rgb(194, 194, 194); +} +.part3_table_two.m-bg td:nth-child(7){ + background-color: rgb(194, 194, 194); +} +.part3_table_two.m-bg td:nth-child(8){ + background-color: rgb(194, 194, 194); +} +.part3_table_two.iIn-bg td:nth-child(9){ + background-color: rgb(194, 194, 194); +} +.part3_table_two.iIn-bg td:nth-child(10){ + background-color: rgb(194, 194, 194); +} + + +/* part3 table three */ +.part3_table_three{ + width: 1000px; + display: none; + bottom: 0px; + position: absolute; + right: 10px; + text-align: center; + gap: 20px; + border-collapse: collapse; +} +.part3_table_three td,tr,th{ + border: 1px solid black; +} +.part3_table_three thead{ + background-color: #0000cc; + color: white; +} +.part3_table_three thead tr th{ + width: 426px; +} +.part3_table_three tbody tr{ + height: 29px; +} +.part3_table_three td{ + text-align: center; + font-weight: bold; + width: 426px; + font-size: 1.2em; + padding: 0; + margin: 0; +} +.part3_table_three th{ + font-size: 1.2em; +} +.part3_table_three tbody tr:nth-child(2n){ + background-color: #eaeff7; +} +.part3_table_three tbody tr:nth-child(2n+1){ + background-color: #d2deef; +} +/* +.part3_table_three td:nth-child(2){ + background-color: rgb(194, 194, 194); +} +.part3_table_three td:nth-child(3){ + background-color: rgb(194, 194, 194); +} +.part3_table_three td:nth-child(4){ + background-color: rgb(194, 194, 194); */ +/* } */ +/* .part3_table_three td:nth-child(10){ + background-color: #ffff00; +} +.part3_table_three td:nth-child(11){ + background-color: #ffc000; +} */ +/* table four */ + +.deactive{ + pointer-events: none; + cursor:not-allowed; + user-select: none; + opacity: 0.9; + box-shadow: none!important; +} +.disabled{ + pointer-events: none; + cursor:not-allowed; + user-select: none; + opacity: 0.9; + box-shadow: none!important; +} + +.graph_box{ + display: none; + padding: 0 0 22px 22px; + width: 377px; + height: 242px; + position: absolute; + right: 10px; + top: -75px; + box-sizing: border-box; + background-color: white; + border-radius: 20px; + box-shadow: 2px 2px 4px; +} + +.graph{ + /* background-color: white; */ + padding: 5px; + /* background-color: #202020; */ + display: none; +} + +/* ! Next Btn Deactive class */ +.btn-deactive{ + transition: 1s; + opacity: 0.7; + cursor: not-allowed; + background-color: rgb(97, 97, 97)!important ; + box-shadow: none!important; + color: black; + pointer-events: none; +} + +.btn-deactive:hover { + box-shadow: none!important; +} + +.btn-deactive:active{ + opacity: none!important; + transform: none!important; +} + +/* * Part 3 table two btns */ +.btn-box1 button{ + background-color: #0000ff; +} + +.btn-box2 button{ + background-color: #d26315; +} +.btn-box3 button{ + background-color: #5d8c3b; +} + +.table-btn{ + color: white; + position: relative; + width: 31.5%; + padding: 5px; + font-size: 1.2em; + font-weight: bold; + z-index: 1000; + border-radius: 10px; + cursor: pointer; + border: 2px solid black +} +.table-btn:hover{ + border-color: white; + transition: 0.2s; +} +.table-btn:active{ + transition: 0s; + border-color: black; + background-color: black; +} + +/* ! Delte reset */ +.btn-delete{ + background-color: #05056f; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; + border-radius: 20px; + font-size: 1.25em; + padding: 12px 7px; + width: 90px; + /* top: 360px; + left: 10px; */ + +} + +.btn-reset{ + background-color: #5d8c3b; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; + border-radius: 20px; + font-size: 1.25em; + padding: 12px 7px; + width: 90px; + /* top: 360px; + left: 120px; */ + +} +.btn-record{ + background-color: #975f52; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; + border-radius: 20px; + font-size: 1.25em; + padding: 12px 0px; + width: 90px; + /* top: 360px; + left: 120px; */ + +} + +/* ! check connection and circuit diagram btn */ +.btn-check-connections{ + background-color: #d26315!important; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; +} + +.btn-circuit-diagram{ + background-color: #7937aa!important; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; +} + +/* ! check reset hint btn for ee3 */ + +.ee3-btn-check{ + background-color: #814141; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; + border-radius: 20px; +} +.ee3-btn-reset{ + background-color: #055794; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; + border-radius: 20px; + +} +.ee3-btn-hint{ + background-color: #385238; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; + border-radius: 20px; +} + + + +.bg-black{ + background-color: black!important; +} + +.theory{ + height: 495px; + width: 950px; + top: -46px; + left: 0; + z-index: 1001; +} + + +.btn-transparent { + display: block; + position: absolute; + width: 92px; + height: 35px; + bottom: -95px; + right: -3px; + border-radius: 8px; + font-weight: bolder; + z-index: 6000; + } + + .btn-transparent:active { + box-shadow: #422800 2px 2px 0 0; + transform: translate(4px, 4px); + } + + .btn-disabled{ + color: gray; + box-shadow: none; + background-color: #f1f2f4; + user-select: none; + cursor: not-allowed; + /* pointer-events: none; */ + } + .btn-disabled:active{ + opacity: none!important; + transform: none!important; + } + .btn-disabled:hover{ + border: none; + box-shadow: none; + } + + /* Pop window */ + .btn-popup-box{ + display: flex; + position: relative; + left: 23px; + justify-content: center; + align-items: center; + /* background-color: rgba(0, 0, 0, 0.619); */ + padding: 0 2px; + height: 40px; + border-radius: 10px; + z-index: 5000; + } + + .btn-popup{ + padding: 8px 10px; + margin: 0 2px; + font-size: 17px; + font-weight: bold; + cursor:help; + transition: 0.1s; + border-radius: 20px; + box-shadow: 1px 1px 5px white; + } + + .btn-popup:nth-child(1){ + background-color: #8e4311; + } + .btn-popup:nth-child(2){ + background-color: #0505a4; + } + .btn-popup:nth-child(3){ + background-color: #3f5f29; + } + + .btn-popup:hover ~ .btn-popup-window{ + display: block!important; + } + .btn-popup:hover{ + scale: 0.94; + background-color: transparent; + } + + .btn-popup-window{ + display: none; + position: absolute; + left: -422px; + top: 39px; + width: 950px; + height: 495px; + z-index: 5001; + } + + .blur{ + display: none; + top: 45px; + z-index: 5000; + background-color: rgba(0, 0, 0, 0.389); + filter: blur(7px); + -webkit-filter: blur(7px); + } + + /* vertex */ + .vertex-box{ + display: none; + } + .vertex-box .vertex{ + /* display: none; */ + position: absolute; + /* background-color: black; + width: 20px; + height: 20px; + z-index: 2000; + color: white; + border-radius: 100vh; */ + /* left: 10px; + top: 20px; */ + } + + #vertex1{ + left: 124px; + top: 23px; +} + #vertex2{ + left: 124px; + top: 162px; +} +#vertex3{ + left: 205px; + top: 309px; +} +#vertex4{ + left: 341px; + top: 308px; +} +#vertex5{ + left: 684px; + top: 31px; +} + +#vertex6 { + left: 682px; + top: 181px; +} +#vertex7 { + left: 427px; + top: -16px; +} +#vertex8 { + left: 573px; + top: -16px; +} +#vertex9 { + left: 387px; + top: 307px; +} +#vertex10 { + left: 497px; + top: 307px; +} + +/* ! Added Font */ +.main-window{ + font-family: "Cosmic Sans MS"; +} + +/* !added cursor pointer to imgs */ +.ee3-imgs{ + cursor: pointer; +} + +/*! part1 boxes of ee3 exp */ + +.part1_box1{ + height: 90px; + width: 90px; + border-radius: 20px; + background-color: #f5f29e; + position: relative; + top: 75px; + left: -330px; + border: 1px solid #f5f29e; +} + +/* * concept dev */ + +.concept_development{ + display: none; +} + +/*! EE4 images */ +.ee4_imgs { + cursor: pointer; +} + +.exp-4 th{ + background-color: #ffc000; + color: #203864 ; +} + +.exp-4 { + border: 2px solid black; + /* width: fit-content; */ + /* gap: 20px; */ +} + +.exp-4 td{ + border-right: 2px solid black; + border-bottom: 2px solid black; +} +.part_1_table_1{ + position: absolute; + display: none; +} +.part_1_table_2{ + position: absolute; + display: none; +} \ No newline at end of file diff --git a/experiment/simulation/EE4/css/imgs.css b/experiment/simulation/EE4/css/imgs.css new file mode 100644 index 0000000..b0f5aae --- /dev/null +++ b/experiment/simulation/EE4/css/imgs.css @@ -0,0 +1,63 @@ +.anime-main{ + position: relative; + height: 404px; + width: 946px; + /* overflow: hidden!important; */ +} + +.markings{ + /* display: none; */ + opacity: 0; + height: 4.8px; + width: 38px; + height: 10px; + top: -30px; + left: 212px; + z-index: 5; + position: relative; + /* position: absolute; */ + /* visibility: hidden; */ + filter: brightness(0); +} + +.markings2{ + height: 25px; + z-index: 5; + position: relative; + left: -410px; + top: -57px; + opacity: 0; + display: none; +} +.markings3{ + height: 10px; + z-index: 9; + position: absolute; + left: 59px; + filter: brightness(0); + top: 120px; + opacity: 0; + display: none; +} +.main-window-imgs{ + display: none; + position: absolute; + +} +.blinkArrow{ + display: none; + filter:brightness(200); + position: absolute; + z-index: 2000; + +} +.blinkArrowRed{ + display: none; + position: absolute; + z-index: 2000; +} + +.main-window-videos{ + display: none; + position: absolute; +} diff --git a/experiment/simulation/EE4/css/layout.css b/experiment/simulation/EE4/css/layout.css new file mode 100644 index 0000000..2ee9a7c --- /dev/null +++ b/experiment/simulation/EE4/css/layout.css @@ -0,0 +1,398 @@ +/* #drawer */ +@import url('https://fonts.googleapis.com/css?family=Roboto&display=swap'); +body{ + margin: 0; + display: flex; + justify-content: center; + /* padding-top: 70px; */ + font-family: Roboto; +} +#drawer{ + font-family: Roboto,Noto,sans-serif; + min-width: 230px; + max-width: 230px; + padding: 10px; + background-color: #f8f9fa; + height: 638px; + overflow-y: auto; + grid-area: drawer; + grid-column-start: 1; +} + +#drawer ol{ + list-style: none; + margin: 0px auto !important; + padding: 0; +} + +#drawer ol li{ + display: flex; + justify-content: start; + align-items: center; + margin: 6px 0; + padding: 3px 10px; + min-height: 48px; + border-radius: 5px; + border: 1px solid rgb(218, 220, 224); + counter-increment: li-count; + opacity: 0.7; + line-height: 20px; + font-stretch: 100%; +} + +#drawer ol li a .step{ + display: flex; + justify-content: center; + align-items: center; +} +#drawer ol li a .step::before{ + content: counter(li-count); + display: flex; + justify-content: center; + align-items: center; + height: 26px; + min-width: 26px; + border-radius: 50%; + background-color: gray; + margin-right: 8px; + font-size: 14px; + font-weight: bold; + color: white; +} + +.right-container{ + /* overflow: hidden; */ + width: 100%; + display: flex; +} + +.active{ + box-shadow: 2px 2px 4px rgba(0,0,0,.15); + font-weight: bold!important; + opacity: 1!important; +} + +.active .step::before{ + background-color: #2b80ee!important; +} + +.completed{ + opacity: 1!important; + font-weight: 400; +} + +.completed .step::before{ + background-color: #2b80ee!important; +} + +/* Other */ +.main-container{ + display: flex; + /* gap: 25px; */ + /* display: grid; */ + /* grid-template-areas: "drawer progressBar" */ + /* "drawer mainWindow"; */ +} + +.main-window{ + background-color: #f1ece3; + position: relative; + grid-area: mainWindow; + display: flex; + flex-direction: column; + justify-content: space-between; + /* height: calc(100vh - 78px - 60px); */ + min-height: calc(404px + 200px); + width: 950px; + border: 2px solid; + overflow: hidden; +} + +.main-window .anime-header{ + display: flex; + justify-content: center; + align-items: center; + font-size: 2rem; + font-weight: bold; + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + height: 50px; + color: white; + background-color: #3D246C; +} +.main-window .anime-footer{ + display: flex; + align-items: center; + justify-content: space-between; + /* height: 70px; */ + height: 55px; + color: white; + background-color: #5C4B99; +} + +.right-box{ + display: flex; + margin-left: 1%; + flex-direction: column; + overflow: hiddenw1; +} + +.anime-footer .steps-subtitle{ + display: flex; + align-items: center; + gap: 10px; +} +.anime-footer .steps-subtitle .user-name{ + font-size: 1.05rem; + font-weight: bold; + background-color: #fff; + padding: 10px; + border-radius: 10px; +} +.anime-footer .steps-subtitle .subtitle{ + font-size: 1.1rem; + font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif; + font-weight: bold; +} + +/* Steps Title description */ +.step-heading{ + display: none; + gap: 10px; + margin-left: 20px; + align-items: center; +} +.step-heading .step-title{ + background-color: #9F91CC; + border-radius: 20px; + font-weight: bold; + padding: 10px 15px; +} + +.step-heading .step-description{ + font-weight: bold; +} + +.anime-main .measurements{ + position: absolute; + z-index: 300; + /* border: 1px solid; */ + display: none; +} +.anime-main .measurements .cell{ + border: 1px solid; +} + +/* temp text */ +.anime-main .temp-text, .temp-text2{ + position: absolute; + background-color: white; + padding: 5px 10px; + display: none; +} + +/* Project Welcome */ +.welcome-box{ + display: none; + flex-direction: column; + align-items: center; + position: absolute; + } + .welcome-box .title{ + display: flex; + flex-direction: column; + align-items: center; + margin-top: 25px; + gap: 4px; + } + .welcome-box .iit-logo{ + height: 140px; + width: 200px; + } + .welcome-box .prof-img{ + /* margin-top: 20px; */ + height: 120px; + width: 100px; + } + .welcome-box .title span{ + font-size: 1.5rem; + } + .welcome-box .title span:nth-child(2n - 1){ + color: red + } + .welcome-box .title span:nth-child(2n){ + font-weight: bold; + color: black; + font-family: Roboto; + } + .welcome-box .prof-description{ + font-size: 0.8rem; + transform: translate(40px,15px); + display: flex; + flex-direction: column; + align-items: end; + padding: 5px; + font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif; + border: 2px solid; + border-radius: 5px; + align-self: end; + } + + /* Mute Btn */ +.btn-mute{ + z-index: 500; +} + +/* Video box */ +.video-box{ + position: absolute; + display:none ; + /* display: flex; */ + flex-direction: column; + border: 2px solid; + box-shadow: 5px 5px 10px 2px black; + align-items: center; + justify-content: center; + z-index: 10; + width: fit-content; + height: fit-content; + border-radius: 3px; + overflow: hidden; +} + +/* .video-box .video{ + /* height: 150px!important; */ +/* } */ + +.video-box .title{ + background-color: purple; + margin: 0; + text-align: center; + color: white; + padding: 3px; + font-size: 1.2em; + +} + +.video-box .controls{ + display: flex; + background-color: purple; + align-items: center; + justify-content: space-around; + width: 100%; +} +.video-box .controls img{ + height: 26px; + +} + +.video-box .controls .restart{ + padding: 2px; + display: flex; + justify-content: center; + align-items: center; +} + +/* Temp texts/titles */ +.temp{ + display: none; + font-weight: bold; + font-size: 1.0rem; + position: absolute; + text-align: justify; + background-color: black; + color: white; + width: 35px; + padding: 0 1px; + border-radius: 4px; +} + + +/* Content Adder Boxc */ +.content-adder-box{ + padding: 10px 5px; + /* display: flex; */ + display: none; + flex-direction: column; + gap: 5px; + height: fit-content; + width: fit-content; + z-index: 1000; + border-radius: 10px; + background-color: #5c4b99; + box-shadow: 3px 3px 5px ; + position: absolute; + right: 20px; + top: 80px!important; +} + + + /* print */ + @media print{ + #drawer, .progress-bar, .anime-header, .anime-footer{ + display: none!important; + } + .main-window{ + border: none; + } + .certificate{ + display: flex; + transform: translateY(400px) rotate(90deg) scale(1.5,2); + + + } + } + /* for transparent box */ + .transparent-box{ + display: none; + height: 100% ; + width: 950px; + background-color: transparent; + z-index: 500; + position: absolute; + + } + + + .image-box{ + /* display: flex; */ + display: none; + border: 2px solid; + text-align: center; + flex-direction: column; + justify-content: center; + /* background-color: white; */ + height: fit-content; + width: fit-content; + position: absolute; + padding: 3px; + border-radius: 10px; + box-shadow: 5px 5px 14px ; + } + .image-box .title{ + margin: 0; + font-weight: bold; + } + .image-box .image{ + border-radius: 10px; + } + + .pointer{ + cursor: pointer; + } + + .btn-img{ + transition: 0.1s; + } + .btn-img:hover{ + scale: 0.95; + } + .btn-img:active{ + filter: opacity(0.9); + } + + .btn-img-disabled{ + /* filter: grayscale(1); */ + } + + + \ No newline at end of file diff --git a/experiment/simulation/EE4/css/progressBar.css b/experiment/simulation/EE4/css/progressBar.css new file mode 100644 index 0000000..4b55d7e --- /dev/null +++ b/experiment/simulation/EE4/css/progressBar.css @@ -0,0 +1,128 @@ +:root { + --primary-color: rgb(11, 78, 179); + --gray: #e5e5e5; + --gray2: #808080; + --blue: #2183dd; + --primary: #0d6efc; + --green: #009900; + --white: #ffffff; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + + + + + + + +/* Progressbar */ +.progress-bar { + /* width: clamp(320px, 30%, 430px); */ + grid-area: progressBar; + font-family: Roboto; + width: 100%; + margin-bottom: 10px; +} + +.progressbar { + position: relative; + display: flex; + justify-content: space-between; + counter-reset: step; +} + +.progressbar::before, +.progress { + content: ""; + position: absolute; + top: 50%; + transform: translateY(-50%); + height: 5px; + width: 100%; + background-color: var(--gray); + z-index: -1; +} + +.progress { + background-color: var(--primary); + width: 0%; + transition: 0.3s; +} + +.progress-step { + width: 1.5rem; + height: 1.5rem; + /* background-color: var(--gray); */ + background-color: white; + border-radius: 50%; + border: 2px solid var(--gray2); + display: flex; + justify-content: center; + align-items: center; +} + +.progress-step::before { + counter-increment: step; + content: counter(step); + font-weight: bold; + /* content: "\f00c"; */ +} + +.progress-step::after { + display: none; + content: attr(data-title); + position: absolute; + top: calc(100% + 0.5rem); + font-size: 0.85rem; + color: #666; +} + +.progress-step-active { + background-color: var(--primary); + color: #f3f3f3; +} + +/* Form */ + + + +/* Button */ +.btns-group { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 1.5rem; +} + +.btn { + box-shadow: 3px 2px 4px 0px black; + padding: 0.75rem; + display: block; + text-decoration: none; + /* background-color: var(--primary); */ + background-color: #FFDBC3; + color: black; + text-align: center; + border: none; + border-radius: 0.25rem; + cursor: pointer; + transition: 0.1s; + height: fit-content; + margin: 0 10px; + font-family: Roboto; + font-weight: bold; + +} + +.btn:hover { + box-shadow: 0 0 0 2px #fff, 0 0 0 3px var(--green); +} + +.btn:active{ + opacity: 0.8!important; + transform: scale(0.95)!important; +} diff --git a/experiment/simulation/EE4/css/quiz.css b/experiment/simulation/EE4/css/quiz.css new file mode 100644 index 0000000..512981b --- /dev/null +++ b/experiment/simulation/EE4/css/quiz.css @@ -0,0 +1,86 @@ +.quiz-container { + z-index: 501; + top: 0; + position: absolute; + color: #000000; + border-radius: 10px; + box-shadow: 3px 3px 20px 1px black; + overflow: hidden; + width: 350px; + min-height: 350px; + height: fit-content; + max-width: 100%; + /* background-color: #fff5; */ + background-color: #ffffffc2; + backdrop-filter: blur(10px); + padding: 0.9rem; + display: none; + /* border: 2px solid ; */ + } + + + .quiz-container h2 { + padding: 1rem; + font-size: 1.2rem; + text-align: center; + margin: 0; + } + + .quiz-container ul { + list-style-type: none; + padding: 0; + } + + .quiz-container ul li { + font-size: 1.2rem; + margin: 1rem 0; + } + + .quiz-container ul li label { + cursor: pointer; + } + + .quiz-container button { + background-color: #aa84bb; + border: none; + color: white; + cursor: pointer; + display: block; + font-family: inherit; + font-size: 1.1rem; + width: 100%; + padding: 1rem; + border-radius: 5px; + } + + .quiz-container button:hover { + background-color: #732d91; + } + + .quiz-container button:focus { + background-color: #5e3370; + outline: none; + } + + .quiz-container #quizAns{ + display: none; + } + + .quiz-container #closeQuiz{ + margin: 10px; + right: 0; + top: 0; + position: absolute; + font-size: 1rem; + color: white; + padding: 4px 10px; + height: fit-content; + font-weight: bold; + background-color: #732d91; + cursor: pointer; + border-radius: 50%; +} + .quiz-container .title{ + display: flex; + justify-content: space-between; + } \ No newline at end of file diff --git a/experiment/simulation/EE4/css/resultTable.css b/experiment/simulation/EE4/css/resultTable.css new file mode 100644 index 0000000..44aeb3f --- /dev/null +++ b/experiment/simulation/EE4/css/resultTable.css @@ -0,0 +1,142 @@ +/* +Responsive HTML Table With Pure CSS - Web Design/UI Design + +Code written by: +👨🏻‍⚕️ Coding Design (Jeet Saru) + +> You can do whatever you want with the code. However if you love my content, you can **SUBSCRIBED** my YouTube Channel. + +🌎link: www.youtube.com/codingdesign +*/ + + + +main.table { + width: 82vw; + height: 90vh; + background-color: #fff5; + + backdrop-filter: blur(7px); + box-shadow: 0 .4rem .8rem #0005; + border-radius: .8rem; + + overflow: hidden; +} + +main.table__header { + width: 100%; + height: 10%; + background-color: #fff4; + padding: .8rem 1rem; + + display: flex; + justify-content: space-between; + align-items: center; +} + + + + + +main.table__body { + width: 95%; + max-height: calc(89% - 1.6rem); + background-color: #fffb; + + margin: .8rem auto; + border-radius: .6rem; + + overflow: auto; + overflow: overlay; +} + +main.table__body::-webkit-scrollbar{ + width: 0.5rem; + height: 0.5rem; +} + +main.table__body::-webkit-scrollbar-thumb{ + border-radius: .5rem; + background-color: #0004; + visibility: hidden; +} + +main.table__body:hover::-webkit-scrollbar-thumb{ + visibility: visible; +} + +main table { + width: 100%; +} + +main td img { + width: 36px; + height: 36px; + margin-right: .5rem; + border-radius: 50%; + + vertical-align: middle; +} + +main table, th, td { + border-collapse: collapse; + padding: 1rem; + text-align: left; +} + +main thead th { + position: sticky; + top: 0; + left: 0; + background-color: #d5d1defe; + cursor: pointer; + text-transform: capitalize; +} + +main tbody tr:nth-child(even) { + background-color: #0000000b; +} + +main tbody tr { + --delay: .1s; + transition: .5s ease-in-out var(--delay), background-color 0s; +} + +main tbody tr.hide { + opacity: 0; + transform: translateX(100%); +} + +main tbody tr:hover { + background-color: #fff6 !important; +} + +main tbody tr td, +main tbody tr td p, +main tbody tr td img { + transition: .2s ease-in-out; +} + +main tbody tr.hide td, +main tbody tr.hide td p { + padding: 0; + font: 0 / 0 sans-serif; + transition: .2s ease-in-out .5s; +} + +main tbody tr.hide td img { + width: 0; + height: 0; + transition: .2s ease-in-out .5s; +} + + + +main thead th:hover { + color: #6c00bd; +} + +main thead th.active,tbody td.active { + color: #6c00bd; +} + diff --git a/experiment/simulation/EE4/css/scenes.css b/experiment/simulation/EE4/css/scenes.css new file mode 100644 index 0000000..128ec3e --- /dev/null +++ b/experiment/simulation/EE4/css/scenes.css @@ -0,0 +1,116 @@ +.anime-main{ + display: flex; + justify-content: center; + align-items: center; +} + +/* Scene 1 */ +/* step1 */ +.user-input{ + font-size: 1.5rem; + flex-direction: column; + display: none; + gap: 10px; + position: absolute; + left: 200; +} +.user-input p{ + margin: 0; +} +.user-input *{ + padding: 10px; + +} + +.anime-header{ + display: none; + position: relative; + top: 0px; + z-index: 6000; +} + +/* step2 - project intro */ +.project-intro{ + top: 50px; + padding: 10px; + display: none; + position: absolute; +} + +.project-intro .heading{ + font-weight: bold; + font-size: 1.1rem; +} +.project-intro .description{ + margin: 5px 0 15px 0; + color: rgb(48, 48, 48); +} + + + + +/* Mouse position */ + +#demo { + height: 100%; + width: 100%; + background-color: #222831; +} + +#info { + z-index: 200; + padding-left: 10px; + border-radius: 10px; + position: absolute; + user-select: none; + font-size: 2em; + width: 120px; + color: #EEEEEE; + background-color: #FD7013; +} + +/* step3 */ +/* input template */ +.temp-input{ + position: absolute; + font-size: 1.5rem; + display: none; +} +.temp-input span{ + margin: 5px; +} +.error{ + color: red; + font-size: 1rem; + text-align: center; + display: none; +} +.temp-input .input{ + font-size: 1.5rem; + width: 100px; + padding: 5px; +} + +.temp-input .submit-btn{ + margin: 20px 0; +} + +/* step 7 */ +.utm-button{ + cursor: pointer; + background-color: rgb(0, 255, 0); + padding: 4px; + box-shadow: 1px 1px 10px 3px green; + border-radius: 50%; + /* border: 1px solid; */ + left: 251px; + top: 147px; + position: absolute; + z-index: 6; + opacity: 0; +} + +.celebration{ + display: none; + position: absolute; +} \ No newline at end of file diff --git a/experiment/simulation/EE4/css/sliders.css b/experiment/simulation/EE4/css/sliders.css new file mode 100644 index 0000000..b7515ed --- /dev/null +++ b/experiment/simulation/EE4/css/sliders.css @@ -0,0 +1,74 @@ +.slider-box .row1{ + display: flex; + gap: 20px; +} +.slider-box .header{ + color: white; + font-size: 1.2rem; + font-weight: bold; + text-align: center; + padding: 2px; +} +.slider-box .header_v{ + background-color: #0000cc; +} +.slider-box .header_r{ + background-color: #c00000; + +} +.slider-box .header_c{ + background-color: #ff0066; + } +.slider-box .slider{ + width: 155px; + height: 30px; +} +.slider-box .slider_vIn{ + background-color: #fff5cc; +} +.slider-box .slider_R{ + background-color: #f5efff; +} +.slider-box .slider_C{ + background-color: #f5efff; +} +.slider-box .slider { + font-family: 'Times New Roman', Times, serif; + font-weight: bold; + font-size: 1.4rem; + color: #c00000; + +} +.slider-box .slider option:hover{ + background-color: #a8cf40; +} +.slider-box .slider-box-container-4 .header_d{ + height: 10px; + width: fit-content; +} +.slider-box .slider-box-container-4 { + margin-top: 20px; +} +.slider-box .slider_D_input{ + width: 50px; + height: 30px; + font-weight: bold; + font-size: 1.1rem; + text-align: center; + border: 2px solid black; + margin-left: 5px; + border-radius: 12px; +} +.slider-box .slider option:hover{ + background-color: #a8cf40!important ; +} +.slider-box .slider-box-container-4{ + display: flex; + width: fit-content; + padding: 7px 18px; + border-radius: 81px; + background-color: #7030a0; +} +.slider-box .slider_D{ + /* width: 210px; */ +} \ No newline at end of file diff --git a/experiment/simulation/EE4/css/table.css b/experiment/simulation/EE4/css/table.css new file mode 100644 index 0000000..91dbed8 --- /dev/null +++ b/experiment/simulation/EE4/css/table.css @@ -0,0 +1,163 @@ +table { + background-color: #fff5; + + backdrop-filter: blur(7px); + box-shadow: 0 .4rem .8rem #0005; + border-radius: .8rem; + + overflow: hidden; +} + +main.table { + min-width: 600px; + height: 430px; + background-color: #fff5; + + backdrop-filter: blur(7px); + box-shadow: 0 .4rem .8rem #0005; + border-radius: .8rem; + + overflow: overlay; +} +.table__header .input-group { + width: 35%; + height: 100%; + background-color: #fff5; + padding: 0 .8rem; + border-radius: 2rem; + + display: flex; + justify-content: center; + align-items: center; + + transition: .2s; +} + +.table__header .input-group:hover { + width: 45%; + background-color: #fff8; + box-shadow: 0 .0.7rem .4rem #0002; +} + +.table__header .input-group img { + width: 1.2rem; + height: 1.2rem; +} + +.table__header .input-group input { + width: 100%; + padding: 0 .5rem 0 .3rem; + background-color: transparent; + border: none; + outline: none; +} + +main .table__body { + /* width: 95%; */ + /* max-height: calc(89% - 1.6rem); */ + background-color: #fffb; + display: flex; + justify-content: center; + border-radius: .6rem; + + overflow: auto; + /* overflow: overlay!important; */ +} + +.table__body::-webkit-scrollbar{ + width: 0.5rem; + height: 0.5rem; +} + +.table__body::-webkit-scrollbar-thumb{ + border-radius: .5rem; + background-color: #0004; + visibility: hidden; +} + +.table__body:hover::-webkit-scrollbar-thumb{ + visibility: visible; +} + + +td img { + width: 36px; + height: 36px; + margin-right: .5rem; + border-radius: 50%; + + vertical-align: middle; +} + +table, th, td { + border-collapse: collapse; + padding: 0.7rem; + text-align: left; +} +table{ + padding: 0.3rem; +} + +thead th { + position: sticky; + top: 0; + left: 0; + background-color: #d5d1defe; + cursor: pointer; + text-transform: capitalize; +} + +tbody tr:nth-child(even) { + background-color: #0000000b; +} + +tbody tr { + --delay: .1s; + transition: .5s ease-in-out var(--delay), background-color 0s; +} + +tbody tr.hide { + opacity: 0; + transform: translateX(100%); +} + +tbody tr:hover { + background-color: #fff6 !important; +} + +tbody tr td, +tbody tr td p, +tbody tr td img { + transition: .2s ease-in-out; +} + +tbody tr.hide td, +tbody tr.hide td p { + padding: 0; + font: 0 / 0 sans-serif; + transition: .2s ease-in-out .5s; +} + +tbody tr.hide td img { + width: 0; + height: 0; + transition: .2s ease-in-out .5s; +} + + + +.result-table{ + position: absolute; + left: 400; + display: none; +} + +.result-table .table__header{ + height: ""; + min-width: 600px!important; +} +.result-table th{ + display: flex; + align-items: center; +} + diff --git a/experiment/simulation/EE4/fonts/ComicSansMS3.ttf b/experiment/simulation/EE4/fonts/ComicSansMS3.ttf new file mode 100644 index 0000000..da55369 Binary files /dev/null and b/experiment/simulation/EE4/fonts/ComicSansMS3.ttf differ diff --git a/experiment/simulation/EE4/helper/GRAPH/graph.html b/experiment/simulation/EE4/helper/GRAPH/graph.html new file mode 100644 index 0000000..8bd3618 --- /dev/null +++ b/experiment/simulation/EE4/helper/GRAPH/graph.html @@ -0,0 +1,78 @@ + + + + + Horizontal Bar Chart with Rotated Y-axis Labels + + + +
+ +
+ + + + diff --git a/experiment/simulation/EE4/helper/cable/css/simstyle.css b/experiment/simulation/EE4/helper/cable/css/simstyle.css new file mode 100644 index 0000000..eb0fbe5 --- /dev/null +++ b/experiment/simulation/EE4/helper/cable/css/simstyle.css @@ -0,0 +1,150 @@ +.exp { + position: absolute; + top: 0em; + border: 5px; + left: 0%; + height: 48em; + width: 89em; + border-style: groove; + background-color: white; + /* width: 1422px; */ +} +/* input { + background: #228b22; + color: white; + padding: 10px 10px; + border: none; + border-radius: 3px; +} */ + #dragDropWindow1{ + left: 19.9em; + top: 27.6em; + position: fixed; + } + #dragDropWindow6{ + left: 17.5em; + top: 27.6em; + position: fixed; + } + #dragDropWindow8{ + left: 62.1em; + top: 29.3em; + position: fixed; + } + #dragDropWindow4{ + left: 73.55em; + top: 23.1em; + position: fixed; + } + #dragDropWindow5{ + left: 42.5em; + top: 27em; + position: fixed; + } + #dragDropWindow2{ + left: 27.7em; + top: 24em; + position: fixed; + } + #dragDropWindow7{ + left: 71.3em; + top: 23.1em; + position: absolute; + } + #dragDropWindow3{ + left: 62.1em; + top: 25.7em; + position: fixed; + } + .image{ + position:relative; + margin-top:100px; + } + .top{ + position:absolute; + bottom:50px; + right:30px; + /*z-index:10;*/ + } + .instruct{ + float:right; + } + .b1:hover{ + background-color:yellow; + color:red; + cursor:pointer; + } + .b2:hover{ + background-color:red; + color:white; + cursor:pointer; + } + .button{ + display:inline-flex; + margin-right:50px; + } + .modal { + display: none; + position: fixed; + z-index: 1; + padding-top: 100px; + left: 0; + top: 0; + width: 100%; + height: 100%; + overflow: auto; + } + .modal-content { + background-color: #fefefe; + margin: auto; + padding: 20px; + border: 1px solid #888; + width: 80%; + -webkit-animation-name: animatetop; + -webkit-animation-duration: 0.4s; + animation-name: animatetop; + animation-duration: 0.4s + } + @-webkit-keyframes animatetop { + from {top:-300px; opacity:0} + to {top:0; opacity:1} + } + @keyframes animatetop { + from {top:-300px; opacity:0} + to {top:0; opacity:1} + } + .close { + color: #ffffff; + float: right; + font-size: 28px; + font-weight: bold; + } + .close:hover, + .close:focus { + text-decoration: none; + cursor: pointer; + } + .modal-header { + padding: 2px 16px; + background-color: #044ca3; + color: white; + } + .modal-body {padding: 2px 16px;} + .modal-footer { + padding: 2px 16px; + background-color: #044ca3; + color: white; + } + path, .jtk-endpoint { cursor:pointer; } + .cmdLink { font-size:0.80em;} + .drag-drop-demo a, .drag-drop-demo a:visited { + color:#057D9F; + } + .demo { + /* for IE10+ touch devices */ + touch-action:none; + } + body{ + margin-left: 15px!important; + margin-top: -23px!important; + } \ No newline at end of file diff --git a/experiment/simulation/EE4/helper/cable/images/Log.png b/experiment/simulation/EE4/helper/cable/images/Log.png new file mode 100644 index 0000000..33a261a Binary files /dev/null and b/experiment/simulation/EE4/helper/cable/images/Log.png differ diff --git a/experiment/simulation/EE4/helper/cable/images/meter.png b/experiment/simulation/EE4/helper/cable/images/meter.png new file mode 100644 index 0000000..cde49fa Binary files /dev/null and b/experiment/simulation/EE4/helper/cable/images/meter.png differ diff --git a/experiment/simulation/EE4/helper/cable/images/meter2.png b/experiment/simulation/EE4/helper/cable/images/meter2.png new file mode 100644 index 0000000..f6efa4e Binary files /dev/null and b/experiment/simulation/EE4/helper/cable/images/meter2.png differ diff --git a/experiment/simulation/EE4/helper/cable/images/setup.PNG b/experiment/simulation/EE4/helper/cable/images/setup.PNG new file mode 100644 index 0000000..56f5f66 Binary files /dev/null and b/experiment/simulation/EE4/helper/cable/images/setup.PNG differ diff --git a/experiment/simulation/EE4/helper/cable/js/demo.js b/experiment/simulation/EE4/helper/cable/js/demo.js new file mode 100644 index 0000000..cc5ade7 --- /dev/null +++ b/experiment/simulation/EE4/helper/cable/js/demo.js @@ -0,0 +1,261 @@ +(function () { + var yy = document.getElementById("check"); + yy.onclick = checkk; + + // ! check + function checkk() { + if (connections.length == 0) { + alert("Please make the connections first"); + return false; + } + + if (connections.length < 6) { + alert("Wrong Connections\nPlease go through the instructions once"); + return false; + } + let isConnectionRight = false + if (connections.length >= 6) { + let matrixForCheckGraph = [ + // 0 1 2 3 4 5 6 7 8 9 10 + [0,0,0,0,0,0,0,0,0,0,0], // 0 + [0,0,0,1,0,0,0,0,0,0,0], // 1 + [0,0,0,0,0,0,1,0,1,0,0], // 2 + [0,1,0,0,0,0,0,0,0,0,0], // 3 + [0,0,0,0,0,0,0,1,0,1,0], // 4 + [0,0,0,0,0,0,0,0,0,0,1], // 5 + [0,0,1,0,0,0,0,0,1,0,0], // 6 + [0,0,0,0,1,0,0,0,0,1,0], // 7 + [0,0,1,0,0,0,1,0,0,0,0], // 8 + [0,0,0,0,1,0,0,1,0,0,0], // 9 + [0,0,0,0,0,1,0,0,0,0,0], // 10 + ] + var listDiv = []; + for (var j = 0; j < connections.length; j++) { + let pos = [connections[j].targetId,connections[j].sourceId] + listDiv.push(pos) + } + for(let i=0;i 0) { + var listDiv = []; + for (var j = 0; j < connections.length; j++) { + let pos = [connections[j].targetId,connections[j].sourceId] + listDiv.push(pos) + } + showConnectionInfo(listDiv); + } + }); + + jsPlumb.ready(function () { + var instance = jsPlumb.getInstance(); + + // suspend drawing and initialise. + instance.batch(function () { + // bind to connection/connectionDetached events, and update the list of connections on screen. + instance.bind("connection", function (info, originalEvent) { + updateConnections(info.connection); + }); + instance.bind("connectionDetached", function (info, originalEvent) { + updateConnections(info.connection, true); + }); + + instance.bind("connectionMoved", function (info, originalEvent) { + // only remove here, because a 'connection' event is also fired. + // in a future release of jsplumb this extra connection event will not + // be fired. + updateConnections(info.connection, true); + }); + + // configure some drop options for use by all endpoints. + var exampleDropOptions = { + tolerance: "touch", + hoverClass: "dropHover", + activeClass: "dragActive", + }; + let radius = 14 + var exampleEndpoint1 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "pink" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "pink", strokeWidth: 6 }, + connector: ["Bezier", { curviness: 10 }], + maxConnections: 1, + isTarget: true, + dropOptions: exampleDropOptions, + }; + var exampleEndpoint2 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "black" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "black", strokeWidth: 6 }, + connector: ["Bezier", { curviness: -50 }], + maxConnections: 3, + isTarget: true, + dropOptions: exampleDropOptions, + }; + var exampleEndpoint3 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "red" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "red", strokeWidth: 6 }, + connector: ["Bezier", { curviness: -30 }], + maxConnections: 3, + isTarget: true, + dropOptions: exampleDropOptions, + }; + var exampleEndpoint4 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "green" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "green", strokeWidth: 6 }, + connector: ["Bezier", { curviness: -50 }], + maxConnections: 1, + isTarget: true, + dropOptions: exampleDropOptions, + }; + // conn 1 + instance.addEndpoint( + "dragDropWindow1", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint1 + ); + instance.addEndpoint( + "dragDropWindow3", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint1 + ); + + // conn 2 + instance.addEndpoint( + "dragDropWindow4", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint2 + ); + instance.addEndpoint( + "dragDropWindow7", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint2 + ); + instance.addEndpoint( + "dragDropWindow9", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint2 + ); + + // conn 3 + instance.addEndpoint( + "dragDropWindow8", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint3 + ); + instance.addEndpoint( + "dragDropWindow6", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint3 + ); + instance.addEndpoint( + "dragDropWindow2", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint3 + ); + + // conn 4 + instance.addEndpoint( + "dragDropWindow10", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint4 + ); + instance.addEndpoint( + "dragDropWindow5", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint4 + ); + /*instance.addEndpoint("dragDropWindow9", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint4); + instance.addEndpoint("dragDropWindow10", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint4); + instance.addEndpoint("dragDropWindow11", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint3); + instance.addEndpoint("dragDropWindow12", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint3);*/ + + instance.draggable(jsPlumb.getSelector(".drag-drop-demo .window")); + + var hideLinks = jsPlumb.getSelector(".drag-drop-demo .hide"); + instance.on(hideLinks, "click", function (e) { + instance.toggleVisible(this.getAttribute("rel")); + jsPlumbUtil.consume(e); + }); + + var dragLinks = jsPlumb.getSelector(".drag-drop-demo .drag"); + instance.on(dragLinks, "click", function (e) { + var s = instance.toggleDraggable(this.getAttribute("rel")); + this.innerHTML = s ? "disable dragging" : "enable dragging"; + jsPlumbUtil.consume(e); + }); + + var detachLinks = jsPlumb.getSelector(".drag-drop-demo .detach"); + instance.on(detachLinks, "click", function (e) { + instance.deleteConnectionsForElement(this.getAttribute("rel")); + jsPlumbUtil.consume(e); + }); + + // ! reset + instance.on(document.getElementById("reset"), "click", function (e) { + // instance.detachEveryConnection(); + instance.deleteEveryConnection() + showConnectionInfo(""); + jsPlumbUtil.consume(e); + }); + }); + + jsPlumb.fire("jsPlumbDemoLoaded", instance); + }); + +})(); diff --git a/experiment/simulation/EE4/helper/cable/js/jsplumb.js b/experiment/simulation/EE4/helper/cable/js/jsplumb.js new file mode 100644 index 0000000..5c66789 --- /dev/null +++ b/experiment/simulation/EE4/helper/cable/js/jsplumb.js @@ -0,0 +1,15949 @@ +/** + * jsBezier + * + * Copyright (c) 2010 - 2017 jsPlumb (hello@jsplumbtoolkit.com) + * + * licensed under the MIT license. + * + * a set of Bezier curve functions that deal with Beziers, used by jsPlumb, and perhaps useful for other people. These functions work with Bezier + * curves of arbitrary degree. + * + * - functions are all in the 'jsBezier' namespace. + * + * - all input points should be in the format {x:.., y:..}. all output points are in this format too. + * + * - all input curves should be in the format [ {x:.., y:..}, {x:.., y:..}, {x:.., y:..}, {x:.., y:..} ] + * + * - 'location' as used as an input here refers to a decimal in the range 0-1 inclusive, which indicates a point some proportion along the length + * of the curve. location as output has the same format and meaning. + * + * + * Function List: + * -------------- + * + * distanceFromCurve(point, curve) + * + * Calculates the distance that the given point lies from the given Bezier. Note that it is computed relative to the center of the Bezier, + * so if you have stroked the curve with a wide pen you may wish to take that into account! The distance returned is relative to the values + * of the curve and the point - it will most likely be pixels. + * + * gradientAtPoint(curve, location) + * + * Calculates the gradient to the curve at the given location, as a decimal between 0 and 1 inclusive. + * + * gradientAtPointAlongCurveFrom (curve, location) + * + * Calculates the gradient at the point on the given curve that is 'distance' units from location. + * + * nearestPointOnCurve(point, curve) + * + * Calculates the nearest point to the given point on the given curve. The return value of this is a JS object literal, containing both the + *point's coordinates and also the 'location' of the point (see above), for example: { point:{x:551,y:150}, location:0.263365 }. + * + * pointOnCurve(curve, location) + * + * Calculates the coordinates of the point on the given Bezier curve at the given location. + * + * pointAlongCurveFrom(curve, location, distance) + * + * Calculates the coordinates of the point on the given curve that is 'distance' units from location. 'distance' should be in the same coordinate + * space as that used to construct the Bezier curve. For an HTML Canvas usage, for example, distance would be a measure of pixels. + * + * locationAlongCurveFrom(curve, location, distance) + * + * Calculates the location on the given curve that is 'distance' units from location. 'distance' should be in the same coordinate + * space as that used to construct the Bezier curve. For an HTML Canvas usage, for example, distance would be a measure of pixels. + * + * perpendicularToCurveAt(curve, location, length, distance) + * + * Calculates the perpendicular to the given curve at the given location. length is the length of the line you wish for (it will be centered + * on the point at 'location'). distance is optional, and allows you to specify a point along the path from the given location as the center of + * the perpendicular returned. The return value of this is an array of two points: [ {x:...,y:...}, {x:...,y:...} ]. + * + * + */ + + (function() { + + var root = this; + + if(typeof Math.sgn == "undefined") { + Math.sgn = function(x) { return x == 0 ? 0 : x > 0 ? 1 :-1; }; + } + + var Vectors = { + subtract : function(v1, v2) { return {x:v1.x - v2.x, y:v1.y - v2.y }; }, + dotProduct : function(v1, v2) { return (v1.x * v2.x) + (v1.y * v2.y); }, + square : function(v) { return Math.sqrt((v.x * v.x) + (v.y * v.y)); }, + scale : function(v, s) { return {x:v.x * s, y:v.y * s }; } + }, + + maxRecursion = 64, + flatnessTolerance = Math.pow(2.0,-maxRecursion-1); + + /** + * Calculates the distance that the point lies from the curve. + * + * @param point a point in the form {x:567, y:3342} + * @param curve a Bezier curve in the form [{x:..., y:...}, {x:..., y:...}, {x:..., y:...}, {x:..., y:...}]. note that this is currently + * hardcoded to assume cubiz beziers, but would be better off supporting any degree. + * @return a JS object literal containing location and distance, for example: {location:0.35, distance:10}. Location is analogous to the location + * argument you pass to the pointOnPath function: it is a ratio of distance travelled along the curve. Distance is the distance in pixels from + * the point to the curve. + */ + var _distanceFromCurve = function(point, curve) { + var candidates = [], + w = _convertToBezier(point, curve), + degree = curve.length - 1, higherDegree = (2 * degree) - 1, + numSolutions = _findRoots(w, higherDegree, candidates, 0), + v = Vectors.subtract(point, curve[0]), dist = Vectors.square(v), t = 0.0; + + for (var i = 0; i < numSolutions; i++) { + v = Vectors.subtract(point, _bezier(curve, degree, candidates[i], null, null)); + var newDist = Vectors.square(v); + if (newDist < dist) { + dist = newDist; + t = candidates[i]; + } + } + v = Vectors.subtract(point, curve[degree]); + newDist = Vectors.square(v); + if (newDist < dist) { + dist = newDist; + t = 1.0; + } + return {location:t, distance:dist}; + }; + /** + * finds the nearest point on the curve to the given point. + */ + var _nearestPointOnCurve = function(point, curve) { + var td = _distanceFromCurve(point, curve); + return {point:_bezier(curve, curve.length - 1, td.location, null, null), location:td.location}; + }; + var _convertToBezier = function(point, curve) { + var degree = curve.length - 1, higherDegree = (2 * degree) - 1, + c = [], d = [], cdTable = [], w = [], + z = [ [1.0, 0.6, 0.3, 0.1], [0.4, 0.6, 0.6, 0.4], [0.1, 0.3, 0.6, 1.0] ]; + + for (var i = 0; i <= degree; i++) c[i] = Vectors.subtract(curve[i], point); + for (var i = 0; i <= degree - 1; i++) { + d[i] = Vectors.subtract(curve[i+1], curve[i]); + d[i] = Vectors.scale(d[i], 3.0); + } + for (var row = 0; row <= degree - 1; row++) { + for (var column = 0; column <= degree; column++) { + if (!cdTable[row]) cdTable[row] = []; + cdTable[row][column] = Vectors.dotProduct(d[row], c[column]); + } + } + for (i = 0; i <= higherDegree; i++) { + if (!w[i]) w[i] = []; + w[i].y = 0.0; + w[i].x = parseFloat(i) / higherDegree; + } + var n = degree, m = degree-1; + for (var k = 0; k <= n + m; k++) { + var lb = Math.max(0, k - m), + ub = Math.min(k, n); + for (i = lb; i <= ub; i++) { + var j = k - i; + w[i+j].y += cdTable[j][i] * z[j][i]; + } + } + return w; + }; + /** + * counts how many roots there are. + */ + var _findRoots = function(w, degree, t, depth) { + var left = [], right = [], + left_count, right_count, + left_t = [], right_t = []; + + switch (_getCrossingCount(w, degree)) { + case 0 : { + return 0; + } + case 1 : { + if (depth >= maxRecursion) { + t[0] = (w[0].x + w[degree].x) / 2.0; + return 1; + } + if (_isFlatEnough(w, degree)) { + t[0] = _computeXIntercept(w, degree); + return 1; + } + break; + } + } + _bezier(w, degree, 0.5, left, right); + left_count = _findRoots(left, degree, left_t, depth+1); + right_count = _findRoots(right, degree, right_t, depth+1); + for (var i = 0; i < left_count; i++) t[i] = left_t[i]; + for (var i = 0; i < right_count; i++) t[i+left_count] = right_t[i]; + return (left_count+right_count); + }; + var _getCrossingCount = function(curve, degree) { + var n_crossings = 0, sign, old_sign; + sign = old_sign = Math.sgn(curve[0].y); + for (var i = 1; i <= degree; i++) { + sign = Math.sgn(curve[i].y); + if (sign != old_sign) n_crossings++; + old_sign = sign; + } + return n_crossings; + }; + var _isFlatEnough = function(curve, degree) { + var error, + intercept_1, intercept_2, left_intercept, right_intercept, + a, b, c, det, dInv, a1, b1, c1, a2, b2, c2; + a = curve[0].y - curve[degree].y; + b = curve[degree].x - curve[0].x; + c = curve[0].x * curve[degree].y - curve[degree].x * curve[0].y; + + var max_distance_above, max_distance_below; + max_distance_above = max_distance_below = 0.0; + + for (var i = 1; i < degree; i++) { + var value = a * curve[i].x + b * curve[i].y + c; + if (value > max_distance_above) + max_distance_above = value; + else if (value < max_distance_below) + max_distance_below = value; + } + + a1 = 0.0; b1 = 1.0; c1 = 0.0; a2 = a; b2 = b; + c2 = c - max_distance_above; + det = a1 * b2 - a2 * b1; + dInv = 1.0/det; + intercept_1 = (b1 * c2 - b2 * c1) * dInv; + a2 = a; b2 = b; c2 = c - max_distance_below; + det = a1 * b2 - a2 * b1; + dInv = 1.0/det; + intercept_2 = (b1 * c2 - b2 * c1) * dInv; + left_intercept = Math.min(intercept_1, intercept_2); + right_intercept = Math.max(intercept_1, intercept_2); + error = right_intercept - left_intercept; + return (error < flatnessTolerance)? 1 : 0; + }; + var _computeXIntercept = function(curve, degree) { + var XLK = 1.0, YLK = 0.0, + XNM = curve[degree].x - curve[0].x, YNM = curve[degree].y - curve[0].y, + XMK = curve[0].x - 0.0, YMK = curve[0].y - 0.0, + det = XNM*YLK - YNM*XLK, detInv = 1.0/det, + S = (XNM*YMK - YNM*XMK) * detInv; + return 0.0 + XLK * S; + }; + var _bezier = function(curve, degree, t, left, right) { + var temp = [[]]; + for (var j =0; j <= degree; j++) temp[0][j] = curve[j]; + for (var i = 1; i <= degree; i++) { + for (var j =0 ; j <= degree - i; j++) { + if (!temp[i]) temp[i] = []; + if (!temp[i][j]) temp[i][j] = {}; + temp[i][j].x = (1.0 - t) * temp[i-1][j].x + t * temp[i-1][j+1].x; + temp[i][j].y = (1.0 - t) * temp[i-1][j].y + t * temp[i-1][j+1].y; + } + } + if (left != null) + for (j = 0; j <= degree; j++) left[j] = temp[j][0]; + if (right != null) + for (j = 0; j <= degree; j++) right[j] = temp[degree-j][j]; + + return (temp[degree][0]); + }; + + var _curveFunctionCache = {}; + var _getCurveFunctions = function(order) { + var fns = _curveFunctionCache[order]; + if (!fns) { + fns = []; + var f_term = function() { return function(t) { return Math.pow(t, order); }; }, + l_term = function() { return function(t) { return Math.pow((1-t), order); }; }, + c_term = function(c) { return function(t) { return c; }; }, + t_term = function() { return function(t) { return t; }; }, + one_minus_t_term = function() { return function(t) { return 1-t; }; }, + _termFunc = function(terms) { + return function(t) { + var p = 1; + for (var i = 0; i < terms.length; i++) p = p * terms[i](t); + return p; + }; + }; + + fns.push(new f_term()); // first is t to the power of the curve order + for (var i = 1; i < order; i++) { + var terms = [new c_term(order)]; + for (var j = 0 ; j < (order - i); j++) terms.push(new t_term()); + for (var j = 0 ; j < i; j++) terms.push(new one_minus_t_term()); + fns.push(new _termFunc(terms)); + } + fns.push(new l_term()); // last is (1-t) to the power of the curve order + + _curveFunctionCache[order] = fns; + } + + return fns; + }; + + + /** + * calculates a point on the curve, for a Bezier of arbitrary order. + * @param curve an array of control points, eg [{x:10,y:20}, {x:50,y:50}, {x:100,y:100}, {x:120,y:100}]. For a cubic bezier this should have four points. + * @param location a decimal indicating the distance along the curve the point should be located at. this is the distance along the curve as it travels, taking the way it bends into account. should be a number from 0 to 1, inclusive. + */ + var _pointOnPath = function(curve, location) { + var cc = _getCurveFunctions(curve.length - 1), + _x = 0, _y = 0; + for (var i = 0; i < curve.length ; i++) { + _x = _x + (curve[i].x * cc[i](location)); + _y = _y + (curve[i].y * cc[i](location)); + } + + return {x:_x, y:_y}; + }; + + var _dist = function(p1,p2) { + return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2)); + }; + + var _isPoint = function(curve) { + return curve[0].x === curve[1].x && curve[0].y === curve[1].y; + }; + + /** + * finds the point that is 'distance' along the path from 'location'. this method returns both the x,y location of the point and also + * its 'location' (proportion of travel along the path); the method below - _pointAlongPathFrom - calls this method and just returns the + * point. + */ + var _pointAlongPath = function(curve, location, distance) { + + if (_isPoint(curve)) { + return { + point:curve[0], + location:location + }; + } + + var prev = _pointOnPath(curve, location), + tally = 0, + curLoc = location, + direction = distance > 0 ? 1 : -1, + cur = null; + + while (tally < Math.abs(distance)) { + curLoc += (0.005 * direction); + cur = _pointOnPath(curve, curLoc); + tally += _dist(cur, prev); + prev = cur; + } + + return {point:cur, location:curLoc}; + }; + + var _length = function(curve) { + + var d = new Date().getTime(); + + if (_isPoint(curve)) return 0; + + var prev = _pointOnPath(curve, 0), + tally = 0, + curLoc = 0, + direction = 1, + cur = null; + + while (curLoc < 1) { + curLoc += (0.005 * direction); + cur = _pointOnPath(curve, curLoc); + tally += _dist(cur, prev); + prev = cur; + } + console.log("length", new Date().getTime() - d); + + return tally; + }; + + /** + * finds the point that is 'distance' along the path from 'location'. + */ + var _pointAlongPathFrom = function(curve, location, distance) { + return _pointAlongPath(curve, location, distance).point; + }; + + /** + * finds the location that is 'distance' along the path from 'location'. + */ + var _locationAlongPathFrom = function(curve, location, distance) { + return _pointAlongPath(curve, location, distance).location; + }; + + /** + * returns the gradient of the curve at the given location, which is a decimal between 0 and 1 inclusive. + * + * thanks // http://bimixual.org/AnimationLibrary/beziertangents.html + */ + var _gradientAtPoint = function(curve, location) { + + var p1 = _pointOnPath(curve, location), + p2 = _pointOnPath(curve.slice(0, curve.length - 1), location), + dy = p2.y - p1.y, dx = p2.x - p1.x; + + return dy === 0 ? Infinity : Math.atan(dy / dx); + }; + + /** + returns the gradient of the curve at the point which is 'distance' from the given location. + if this point is greater than location 1, the gradient at location 1 is returned. + if this point is less than location 0, the gradient at location 0 is returned. + */ + var _gradientAtPointAlongPathFrom = function(curve, location, distance) { + var p = _pointAlongPath(curve, location, distance); + if (p.location > 1) p.location = 1; + if (p.location < 0) p.location = 0; + return _gradientAtPoint(curve, p.location); + }; + + /** + * calculates a line that is 'length' pixels long, perpendicular to, and centered on, the path at 'distance' pixels from the given location. + * if distance is not supplied, the perpendicular for the given location is computed (ie. we set distance to zero). + */ + var _perpendicularToPathAt = function(curve, location, length, distance) { + distance = distance == null ? 0 : distance; + var p = _pointAlongPath(curve, location, distance), + m = _gradientAtPoint(curve, p.location), + _theta2 = Math.atan(-1 / m), + y = length / 2 * Math.sin(_theta2), + x = length / 2 * Math.cos(_theta2); + return [{x:p.point.x + x, y:p.point.y + y}, {x:p.point.x - x, y:p.point.y - y}]; + }; + + /** + * Calculates all intersections of the given line with the given curve. + * @param x1 + * @param y1 + * @param x2 + * @param y2 + * @param curve + * @returns {Array} + */ + var _lineIntersection = function(x1, y1, x2, y2, curve) { + var a = y2 - y1, + b = x1 - x2, + c = (x1 * (y1 - y2)) + (y1 * (x2-x1)), + coeffs = _computeCoefficients(curve), + p = [ + (a*coeffs[0][0]) + (b * coeffs[1][0]), + (a*coeffs[0][1])+(b*coeffs[1][1]), + (a*coeffs[0][2])+(b*coeffs[1][2]), + (a*coeffs[0][3])+(b*coeffs[1][3]) + c + ], + r = _cubicRoots.apply(null, p), + intersections = []; + + if (r != null) { + + for (var i = 0; i < 3; i++) { + var t = r[i], + t2 = Math.pow(t, 2), + t3 = Math.pow(t, 3), + x = [ + (coeffs[0][0] * t3) + (coeffs[0][1] * t2) + (coeffs[0][2] * t) + coeffs[0][3], + (coeffs[1][0] * t3) + (coeffs[1][1] * t2) + (coeffs[1][2] * t) + coeffs[1][3] + ]; + + // check bounds of the line + var s; + if ((x2 - x1) !== 0) { + s = (x[0] - x1) / (x2 - x1); + } + else { + s = (x[1] - y1) / (y2 - y1); + } + + if (t >= 0 && t <= 1.0 && s >= 0 && s <= 1.0) { + intersections.push(x); + } + } + } + + return intersections; + }; + + /** + * Calculates all intersections of the given box with the given curve. + * @param x X position of top left corner of box + * @param y Y position of top left corner of box + * @param w width of box + * @param h height of box + * @param curve + * @returns {Array} + */ + var _boxIntersection = function(x, y, w, h, curve) { + var i = []; + i.push.apply(i, _lineIntersection(x, y, x + w, y, curve)); + i.push.apply(i, _lineIntersection(x + w, y, x + w, y + h, curve)); + i.push.apply(i, _lineIntersection(x + w, y + h, x, y + h, curve)); + i.push.apply(i, _lineIntersection(x, y + h, x, y, curve)); + return i; + }; + + /** + * Calculates all intersections of the given bounding box with the given curve. + * @param boundingBox Bounding box, in { x:.., y:..., w:..., h:... } format. + * @param curve + * @returns {Array} + */ + var _boundingBoxIntersection = function(boundingBox, curve) { + var i = []; + i.push.apply(i, _lineIntersection(boundingBox.x, boundingBox.y, boundingBox.x + boundingBox.w, boundingBox.y, curve)); + i.push.apply(i, _lineIntersection(boundingBox.x + boundingBox.w, boundingBox.y, boundingBox.x + boundingBox.w, boundingBox.y + boundingBox.h, curve)); + i.push.apply(i, _lineIntersection(boundingBox.x + boundingBox.w, boundingBox.y + boundingBox.h, boundingBox.x, boundingBox.y + boundingBox.h, curve)); + i.push.apply(i, _lineIntersection(boundingBox.x, boundingBox.y + boundingBox.h, boundingBox.x, boundingBox.y, curve)); + return i; + }; + + + function _computeCoefficientsForAxis(curve, axis) { + return [ + -(curve[0][axis]) + (3*curve[1][axis]) + (-3 * curve[2][axis]) + curve[3][axis], + (3*(curve[0][axis])) - (6*(curve[1][axis])) + (3*(curve[2][axis])), + -3*curve[0][axis] + 3*curve[1][axis], + curve[0][axis] + ]; + } + + function _computeCoefficients(curve) + { + return [ + _computeCoefficientsForAxis(curve, "x"), + _computeCoefficientsForAxis(curve, "y") + ]; + } + + function sgn(x) { + return x < 0 ? -1 : x > 0 ? 1 : 0; + } + + function _cubicRoots(a, b, c, d) { + var A = b / a, + B = c / a, + C = d / a, + Q = (3*B - Math.pow(A, 2))/9, + R = (9*A*B - 27*C - 2*Math.pow(A, 3))/54, + D = Math.pow(Q, 3) + Math.pow(R, 2), + S, + T, + t = []; + + if (D >= 0) // complex or duplicate roots + { + S = sgn(R + Math.sqrt(D))*Math.pow(Math.abs(R + Math.sqrt(D)),(1/3)); + T = sgn(R - Math.sqrt(D))*Math.pow(Math.abs(R - Math.sqrt(D)),(1/3)); + + t[0] = -A/3 + (S + T); + t[1] = -A/3 - (S + T)/2; + t[2] = -A/3 - (S + T)/2; + + /*discard complex roots*/ + if (Math.abs(Math.sqrt(3)*(S - T)/2) !== 0) { + t[1] = -1; + t[2] = -1; + } + } + else // distinct real roots + { + var th = Math.acos(R/Math.sqrt(-Math.pow(Q, 3))); + t[0] = 2*Math.sqrt(-Q)*Math.cos(th/3) - A/3; + t[1] = 2*Math.sqrt(-Q)*Math.cos((th + 2*Math.PI)/3) - A/3; + t[2] = 2*Math.sqrt(-Q)*Math.cos((th + 4*Math.PI)/3) - A/3; + } + + // discard out of spec roots + for (var i = 0; i < 3; i++) { + if (t[i] < 0 || t[i] > 1.0) { + t[i] = -1; + } + } + + return t; + } + + var jsBezier = this.jsBezier = { + distanceFromCurve : _distanceFromCurve, + gradientAtPoint : _gradientAtPoint, + gradientAtPointAlongCurveFrom : _gradientAtPointAlongPathFrom, + nearestPointOnCurve : _nearestPointOnCurve, + pointOnCurve : _pointOnPath, + pointAlongCurveFrom : _pointAlongPathFrom, + perpendicularToCurveAt : _perpendicularToPathAt, + locationAlongCurveFrom:_locationAlongPathFrom, + getLength:_length, + lineIntersection:_lineIntersection, + boxIntersection:_boxIntersection, + boundingBoxIntersection:_boundingBoxIntersection, + version:"0.9.0" + }; + + if (typeof exports !== "undefined") { + exports.jsBezier = jsBezier; + } + +}).call(typeof window !== 'undefined' ? window : this); + +/** + * Biltong v0.4.0 + * + * Various geometry functions written as part of jsPlumb and perhaps useful for others. + * + * Copyright (c) 2017 jsPlumb + * https://jsplumbtoolkit.com + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +;(function() { + + "use strict"; + var root = this; + + var Biltong = root.Biltong = { + version:"0.4.0" + }; + + if (typeof exports !== "undefined") { + exports.Biltong = Biltong; + } + + var _isa = function(a) { return Object.prototype.toString.call(a) === "[object Array]"; }, + _pointHelper = function(p1, p2, fn) { + p1 = _isa(p1) ? p1 : [p1.x, p1.y]; + p2 = _isa(p2) ? p2 : [p2.x, p2.y]; + return fn(p1, p2); + }, + /** + * @name Biltong.gradient + * @function + * @desc Calculates the gradient of a line between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The gradient of a line between the two points. + */ + _gradient = Biltong.gradient = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + if (_p2[0] == _p1[0]) + return _p2[1] > _p1[1] ? Infinity : -Infinity; + else if (_p2[1] == _p1[1]) + return _p2[0] > _p1[0] ? 0 : -0; + else + return (_p2[1] - _p1[1]) / (_p2[0] - _p1[0]); + }); + }, + /** + * @name Biltong.normal + * @function + * @desc Calculates the gradient of a normal to a line between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The gradient of a normal to a line between the two points. + */ + _normal = Biltong.normal = function(p1, p2) { + return -1 / _gradient(p1, p2); + }, + /** + * @name Biltong.lineLength + * @function + * @desc Calculates the length of a line between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The length of a line between the two points. + */ + _lineLength = Biltong.lineLength = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + return Math.sqrt(Math.pow(_p2[1] - _p1[1], 2) + Math.pow(_p2[0] - _p1[0], 2)); + }); + }, + /** + * @name Biltong.quadrant + * @function + * @desc Calculates the quadrant in which the angle between the two points lies. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Integer} The quadrant - 1 for upper right, 2 for lower right, 3 for lower left, 4 for upper left. + */ + _quadrant = Biltong.quadrant = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + if (_p2[0] > _p1[0]) { + return (_p2[1] > _p1[1]) ? 2 : 1; + } + else if (_p2[0] == _p1[0]) { + return _p2[1] > _p1[1] ? 2 : 1; + } + else { + return (_p2[1] > _p1[1]) ? 3 : 4; + } + }); + }, + /** + * @name Biltong.theta + * @function + * @desc Calculates the angle between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The angle between the two points. + */ + _theta = Biltong.theta = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + var m = _gradient(_p1, _p2), + t = Math.atan(m), + s = _quadrant(_p1, _p2); + if ((s == 4 || s== 3)) t += Math.PI; + if (t < 0) t += (2 * Math.PI); + + return t; + }); + }, + /** + * @name Biltong.intersects + * @function + * @desc Calculates whether or not the two rectangles intersect. + * @param {Rectangle} r1 First rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @param {Rectangle} r2 Second rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @return {Boolean} True if the rectangles intersect, false otherwise. + */ + _intersects = Biltong.intersects = function(r1, r2) { + var x1 = r1.x, x2 = r1.x + r1.w, y1 = r1.y, y2 = r1.y + r1.h, + a1 = r2.x, a2 = r2.x + r2.w, b1 = r2.y, b2 = r2.y + r2.h; + + return ( (x1 <= a1 && a1 <= x2) && (y1 <= b1 && b1 <= y2) ) || + ( (x1 <= a2 && a2 <= x2) && (y1 <= b1 && b1 <= y2) ) || + ( (x1 <= a1 && a1 <= x2) && (y1 <= b2 && b2 <= y2) ) || + ( (x1 <= a2 && a1 <= x2) && (y1 <= b2 && b2 <= y2) ) || + ( (a1 <= x1 && x1 <= a2) && (b1 <= y1 && y1 <= b2) ) || + ( (a1 <= x2 && x2 <= a2) && (b1 <= y1 && y1 <= b2) ) || + ( (a1 <= x1 && x1 <= a2) && (b1 <= y2 && y2 <= b2) ) || + ( (a1 <= x2 && x1 <= a2) && (b1 <= y2 && y2 <= b2) ); + }, + /** + * @name Biltong.encloses + * @function + * @desc Calculates whether or not r2 is completely enclosed by r1. + * @param {Rectangle} r1 First rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @param {Rectangle} r2 Second rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @param {Boolean} [allowSharedEdges=false] If true, the concept of enclosure allows for one or more edges to be shared by the two rectangles. + * @return {Boolean} True if r1 encloses r2, false otherwise. + */ + _encloses = Biltong.encloses = function(r1, r2, allowSharedEdges) { + var x1 = r1.x, x2 = r1.x + r1.w, y1 = r1.y, y2 = r1.y + r1.h, + a1 = r2.x, a2 = r2.x + r2.w, b1 = r2.y, b2 = r2.y + r2.h, + c = function(v1, v2, v3, v4) { return allowSharedEdges ? v1 <= v2 && v3>= v4 : v1 < v2 && v3 > v4; }; + + return c(x1,a1,x2,a2) && c(y1,b1,y2,b2); + }, + _segmentMultipliers = [null, [1, -1], [1, 1], [-1, 1], [-1, -1] ], + _inverseSegmentMultipliers = [null, [-1, -1], [-1, 1], [1, 1], [1, -1] ], + /** + * @name Biltong.pointOnLine + * @function + * @desc Calculates a point on the line from `fromPoint` to `toPoint` that is `distance` units along the length of the line. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Point} Point on the line, in the form `{ x:..., y:... }`. + */ + _pointOnLine = Biltong.pointOnLine = function(fromPoint, toPoint, distance) { + var m = _gradient(fromPoint, toPoint), + s = _quadrant(fromPoint, toPoint), + segmentMultiplier = distance > 0 ? _segmentMultipliers[s] : _inverseSegmentMultipliers[s], + theta = Math.atan(m), + y = Math.abs(distance * Math.sin(theta)) * segmentMultiplier[1], + x = Math.abs(distance * Math.cos(theta)) * segmentMultiplier[0]; + return { x:fromPoint.x + x, y:fromPoint.y + y }; + }, + /** + * @name Biltong.perpendicularLineTo + * @function + * @desc Calculates a line of length `length` that is perpendicular to the line from `fromPoint` to `toPoint` and passes through `toPoint`. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Line} Perpendicular line, in the form `[ { x:..., y:... }, { x:..., y:... } ]`. + */ + _perpendicularLineTo = Biltong.perpendicularLineTo = function(fromPoint, toPoint, length) { + var m = _gradient(fromPoint, toPoint), + theta2 = Math.atan(-1 / m), + y = length / 2 * Math.sin(theta2), + x = length / 2 * Math.cos(theta2); + return [{x:toPoint.x + x, y:toPoint.y + y}, {x:toPoint.x - x, y:toPoint.y - y}]; + }; +}).call(typeof window !== 'undefined' ? window : this); +; +(function () { + + "use strict"; + + /** + * Creates a Touch object. + * @param view + * @param target + * @param pageX + * @param pageY + * @param screenX + * @param screenY + * @param clientX + * @param clientY + * @returns {Touch} + * @private + */ + function _touch(view, target, pageX, pageY, screenX, screenY, clientX, clientY) { + + return new Touch({ + target:target, + identifier:_uuid(), + pageX: pageX, + pageY: pageY, + screenX: screenX, + screenY: screenY, + clientX: clientX || screenX, + clientY: clientY || screenY + }); + } + + /** + * Create a synthetic touch list from the given list of Touch objects. + * @returns {Array} + * @private + */ + function _touchList() { + var list = []; + Array.prototype.push.apply(list, arguments); + list.item = function(index) { return this[index]; }; + return list; + } + + /** + * Create a Touch object and then insert it into a synthetic touch list, returning the list.s + * @param view + * @param target + * @param pageX + * @param pageY + * @param screenX + * @param screenY + * @param clientX + * @param clientY + * @returns {Array} + * @private + */ + function _touchAndList(view, target, pageX, pageY, screenX, screenY, clientX, clientY) { + return _touchList(_touch.apply(null, arguments)); + } + + var root = this, + matchesSelector = function (el, selector, ctx) { + ctx = ctx || el.parentNode; + var possibles = ctx.querySelectorAll(selector); + for (var i = 0; i < possibles.length; i++) { + if (possibles[i] === el) { + return true; + } + } + return false; + }, + _gel = function (el) { + return (typeof el == "string" || el.constructor === String) ? document.getElementById(el) : el; + }, + _t = function (e) { + return e.srcElement || e.target; + }, + // + // gets path info for the given event - the path from target to obj, in the event's bubble chain. if doCompute + // is false we just return target for the path. + // + _pi = function(e, target, obj, doCompute) { + if (!doCompute) return { path:[target], end:1 }; + else if (typeof e.path !== "undefined" && e.path.indexOf) { + return { path: e.path, end: e.path.indexOf(obj) }; + } else { + var out = { path:[], end:-1 }, _one = function(el) { + out.path.push(el); + if (el === obj) { + out.end = out.path.length - 1; + } + else if (el.parentNode != null) { + _one(el.parentNode) + } + }; + _one(target); + return out; + } + }, + _d = function (l, fn) { + for (var i = 0, j = l.length; i < j; i++) { + if (l[i] == fn) break; + } + if (i < l.length) l.splice(i, 1); + }, + guid = 1, + // + // this function generates a guid for every handler, sets it on the handler, then adds + // it to the associated object's map of handlers for the given event. this is what enables us + // to unbind all events of some type, or all events (the second of which can be requested by the user, + // but it also used by Mottle when an element is removed.) + _store = function (obj, event, fn) { + var g = guid++; + obj.__ta = obj.__ta || {}; + obj.__ta[event] = obj.__ta[event] || {}; + // store each handler with a unique guid. + obj.__ta[event][g] = fn; + // set the guid on the handler. + fn.__tauid = g; + return g; + }, + _unstore = function (obj, event, fn) { + obj.__ta && obj.__ta[event] && delete obj.__ta[event][fn.__tauid]; + // a handler might have attached extra functions, so we unbind those too. + if (fn.__taExtra) { + for (var i = 0; i < fn.__taExtra.length; i++) { + _unbind(obj, fn.__taExtra[i][0], fn.__taExtra[i][1]); + } + fn.__taExtra.length = 0; + } + // a handler might have attached an unstore callback + fn.__taUnstore && fn.__taUnstore(); + }, + _curryChildFilter = function (children, obj, fn, evt) { + if (children == null) return fn; + else { + var c = children.split(","), + _fn = function (e) { + _fn.__tauid = fn.__tauid; + var t = _t(e), target = t; // t is the target element on which the event occurred. it is the + // element we will wish to pass to any callbacks. + var pathInfo = _pi(e, t, obj, children != null) + if (pathInfo.end != -1) { + for (var p = 0; p < pathInfo.end; p++) { + target = pathInfo.path[p]; + for (var i = 0; i < c.length; i++) { + if (matchesSelector(target, c[i], obj)) { + fn.apply(target, arguments); + } + } + } + } + }; + registerExtraFunction(fn, evt, _fn); + return _fn; + } + }, + // + // registers an 'extra' function on some event listener function we were given - a function that we + // created and bound to the element as part of our housekeeping, and which we want to unbind and remove + // whenever the given function is unbound. + registerExtraFunction = function (fn, evt, newFn) { + fn.__taExtra = fn.__taExtra || []; + fn.__taExtra.push([evt, newFn]); + }, + DefaultHandler = function (obj, evt, fn, children) { + if (isTouchDevice && touchMap[evt]) { + var tfn = _curryChildFilter(children, obj, fn, touchMap[evt]); + _bind(obj, touchMap[evt], tfn , fn); + } + if (evt === "focus" && obj.getAttribute("tabindex") == null) { + obj.setAttribute("tabindex", "1"); + } + _bind(obj, evt, _curryChildFilter(children, obj, fn, evt), fn); + }, + SmartClickHandler = function (obj, evt, fn, children) { + if (obj.__taSmartClicks == null) { + var down = function (e) { + obj.__tad = _pageLocation(e); + }, + up = function (e) { + obj.__tau = _pageLocation(e); + }, + click = function (e) { + if (obj.__tad && obj.__tau && obj.__tad[0] === obj.__tau[0] && obj.__tad[1] === obj.__tau[1]) { + for (var i = 0; i < obj.__taSmartClicks.length; i++) + obj.__taSmartClicks[i].apply(_t(e), [ e ]); + } + }; + DefaultHandler(obj, "mousedown", down, children); + DefaultHandler(obj, "mouseup", up, children); + DefaultHandler(obj, "click", click, children); + obj.__taSmartClicks = []; + } + + // store in the list of callbacks + obj.__taSmartClicks.push(fn); + // the unstore function removes this function from the object's listener list for this type. + fn.__taUnstore = function () { + _d(obj.__taSmartClicks, fn); + }; + }, + _tapProfiles = { + "tap": {touches: 1, taps: 1}, + "dbltap": {touches: 1, taps: 2}, + "contextmenu": {touches: 2, taps: 1} + }, + TapHandler = function (clickThreshold, dblClickThreshold) { + return function (obj, evt, fn, children) { + // if event is contextmenu, for devices which are mouse only, we want to + // use the default bind. + if (evt == "contextmenu" && isMouseDevice) + DefaultHandler(obj, evt, fn, children); + else { + // the issue here is that this down handler gets registered only for the + // child nodes in the first registration. in fact it should be registered with + // no child selector and then on down we should cycle through the registered + // functions to see if one of them matches. on mouseup we should execute ALL of + // the functions whose children are either null or match the element. + if (obj.__taTapHandler == null) { + var tt = obj.__taTapHandler = { + tap: [], + dbltap: [], + contextmenu: [], + down: false, + taps: 0, + downSelectors: [] + }; + var down = function (e) { + var target = _t(e), pathInfo = _pi(e, target, obj, children != null), finished = false; + for (var p = 0; p < pathInfo.end; p++) { + if (finished) return; + target = pathInfo.path[p]; + for (var i = 0; i < tt.downSelectors.length; i++) { + if (tt.downSelectors[i] == null || matchesSelector(target, tt.downSelectors[i], obj)) { + tt.down = true; + setTimeout(clearSingle, clickThreshold); + setTimeout(clearDouble, dblClickThreshold); + finished = true; + break; // we only need one match on mousedown + } + } + } + }, + up = function (e) { + if (tt.down) { + var target = _t(e), currentTarget, pathInfo; + tt.taps++; + var tc = _touchCount(e); + for (var eventId in _tapProfiles) { + if (_tapProfiles.hasOwnProperty(eventId)) { + var p = _tapProfiles[eventId]; + if (p.touches === tc && (p.taps === 1 || p.taps === tt.taps)) { + for (var i = 0; i < tt[eventId].length; i++) { + pathInfo = _pi(e, target, obj, tt[eventId][i][1] != null); + for (var pLoop = 0; pLoop < pathInfo.end; pLoop++) { + currentTarget = pathInfo.path[pLoop]; + // this is a single event registration handler. + if (tt[eventId][i][1] == null || matchesSelector(currentTarget, tt[eventId][i][1], obj)) { + tt[eventId][i][0].apply(currentTarget, [ e ]); + break; + } + } + } + } + } + } + } + }, + clearSingle = function () { + tt.down = false; + }, + clearDouble = function () { + tt.taps = 0; + }; + + DefaultHandler(obj, "mousedown", down); + DefaultHandler(obj, "mouseup", up); + } + // add this child selector (it can be null, that's fine). + obj.__taTapHandler.downSelectors.push(children); + + obj.__taTapHandler[evt].push([fn, children]); + // the unstore function removes this function from the object's listener list for this type. + fn.__taUnstore = function () { + _d(obj.__taTapHandler[evt], fn); + }; + } + }; + }, + meeHelper = function (type, evt, obj, target) { + for (var i in obj.__tamee[type]) { + if (obj.__tamee[type].hasOwnProperty(i)) { + obj.__tamee[type][i].apply(target, [ evt ]); + } + } + }, + MouseEnterExitHandler = function () { + var activeElements = []; + return function (obj, evt, fn, children) { + if (!obj.__tamee) { + // __tamee holds a flag saying whether the mouse is currently "in" the element, and a list of + // both mouseenter and mouseexit functions. + obj.__tamee = { over: false, mouseenter: [], mouseexit: [] }; + // register over and out functions + var over = function (e) { + var t = _t(e); + if ((children == null && (t == obj && !obj.__tamee.over)) || (matchesSelector(t, children, obj) && (t.__tamee == null || !t.__tamee.over))) { + meeHelper("mouseenter", e, obj, t); + t.__tamee = t.__tamee || {}; + t.__tamee.over = true; + activeElements.push(t); + } + }, + out = function (e) { + var t = _t(e); + // is the current target one of the activeElements? and is the + // related target NOT a descendant of it? + for (var i = 0; i < activeElements.length; i++) { + if (t == activeElements[i] && !matchesSelector((e.relatedTarget || e.toElement), "*", t)) { + t.__tamee.over = false; + activeElements.splice(i, 1); + meeHelper("mouseexit", e, obj, t); + } + } + }; + + _bind(obj, "mouseover", _curryChildFilter(children, obj, over, "mouseover"), over); + _bind(obj, "mouseout", _curryChildFilter(children, obj, out, "mouseout"), out); + } + + fn.__taUnstore = function () { + delete obj.__tamee[evt][fn.__tauid]; + }; + + _store(obj, evt, fn); + obj.__tamee[evt][fn.__tauid] = fn; + }; + }, + isTouchDevice = "ontouchstart" in document.documentElement || navigator.maxTouchPoints, + isMouseDevice = "onmousedown" in document.documentElement, + touchMap = { "mousedown": "touchstart", "mouseup": "touchend", "mousemove": "touchmove" }, + touchstart = "touchstart", touchend = "touchend", touchmove = "touchmove", + iev = (function () { + var rv = -1; + if (navigator.appName == 'Microsoft Internet Explorer') { + var ua = navigator.userAgent, + re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); + if (re.exec(ua) != null) + rv = parseFloat(RegExp.$1); + } + return rv; + })(), + isIELT9 = iev > -1 && iev < 9, + _genLoc = function (e, prefix) { + if (e == null) return [ 0, 0 ]; + var ts = _touches(e), t = _getTouch(ts, 0); + return [t[prefix + "X"], t[prefix + "Y"]]; + }, + _pageLocation = function (e) { + if (e == null) return [ 0, 0 ]; + if (isIELT9) { + return [ e.clientX + document.documentElement.scrollLeft, e.clientY + document.documentElement.scrollTop ]; + } + else { + return _genLoc(e, "page"); + } + }, + _screenLocation = function (e) { + return _genLoc(e, "screen"); + }, + _clientLocation = function (e) { + return _genLoc(e, "client"); + }, + _getTouch = function (touches, idx) { + return touches.item ? touches.item(idx) : touches[idx]; + }, + _touches = function (e) { + return e.touches && e.touches.length > 0 ? e.touches : + e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches : + e.targetTouches && e.targetTouches.length > 0 ? e.targetTouches : + [ e ]; + }, + _touchCount = function (e) { + return _touches(e).length; + }, + //http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html + _bind = function (obj, type, fn, originalFn) { + _store(obj, type, fn); + originalFn.__tauid = fn.__tauid; + if (obj.addEventListener) + obj.addEventListener(type, fn, false); + else if (obj.attachEvent) { + var key = type + fn.__tauid; + obj["e" + key] = fn; + // TODO look at replacing with .call(..) + obj[key] = function () { + obj["e" + key] && obj["e" + key](window.event); + }; + obj.attachEvent("on" + type, obj[key]); + } + }, + _unbind = function (obj, type, fn) { + if (fn == null) return; + _each(obj, function () { + var _el = _gel(this); + _unstore(_el, type, fn); + // it has been bound if there is a tauid. otherwise it was not bound and we can ignore it. + if (fn.__tauid != null) { + if (_el.removeEventListener) { + _el.removeEventListener(type, fn, false); + if (isTouchDevice && touchMap[type]) _el.removeEventListener(touchMap[type], fn, false); + } + else if (this.detachEvent) { + var key = type + fn.__tauid; + _el[key] && _el.detachEvent("on" + type, _el[key]); + _el[key] = null; + _el["e" + key] = null; + } + } + + // if a touch event was also registered, deregister now. + if (fn.__taTouchProxy) { + _unbind(obj, fn.__taTouchProxy[1], fn.__taTouchProxy[0]); + } + }); + }, + _each = function (obj, fn) { + if (obj == null) return; + // if a list (or list-like), use it. if a string, get a list + // by running the string through querySelectorAll. else, assume + // it's an Element. + // obj.top is "unknown" in IE8. + obj = (typeof Window !== "undefined" && (typeof obj.top !== "unknown" && obj == obj.top)) ? [ obj ] : + (typeof obj !== "string") && (obj.tagName == null && obj.length != null) ? obj : + typeof obj === "string" ? document.querySelectorAll(obj) + : [ obj ]; + + for (var i = 0; i < obj.length; i++) + fn.apply(obj[i]); + }, + _uuid = function () { + return ('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + })); + }; + + /** + * Mottle offers support for abstracting out the differences + * between touch and mouse devices, plus "smart click" functionality + * (don't fire click if the mouse has moved between mousedown and mouseup), + * and synthesized click/tap events. + * @class Mottle + * @constructor + * @param {Object} params Constructor params + * @param {Number} [params.clickThreshold=250] Threshold, in milliseconds beyond which a touchstart followed by a touchend is not considered to be a click. + * @param {Number} [params.dblClickThreshold=450] Threshold, in milliseconds beyond which two successive tap events are not considered to be a click. + * @param {Boolean} [params.smartClicks=false] If true, won't fire click events if the mouse has moved between mousedown and mouseup. Note that this functionality + * requires that Mottle consume the mousedown event, and so may not be viable in all use cases. + */ + root.Mottle = function (params) { + params = params || {}; + var clickThreshold = params.clickThreshold || 250, + dblClickThreshold = params.dblClickThreshold || 450, + mouseEnterExitHandler = new MouseEnterExitHandler(), + tapHandler = new TapHandler(clickThreshold, dblClickThreshold), + _smartClicks = params.smartClicks, + _doBind = function (obj, evt, fn, children) { + if (fn == null) return; + _each(obj, function () { + var _el = _gel(this); + if (_smartClicks && evt === "click") + SmartClickHandler(_el, evt, fn, children); + else if (evt === "tap" || evt === "dbltap" || evt === "contextmenu") { + tapHandler(_el, evt, fn, children); + } + else if (evt === "mouseenter" || evt == "mouseexit") + mouseEnterExitHandler(_el, evt, fn, children); + else + DefaultHandler(_el, evt, fn, children); + }); + }; + + /** + * Removes an element from the DOM, and deregisters all event handlers for it. You should use this + * to ensure you don't leak memory. + * @method remove + * @param {String|Element} el Element, or id of the element, to remove. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.remove = function (el) { + _each(el, function () { + var _el = _gel(this); + if (_el.__ta) { + for (var evt in _el.__ta) { + if (_el.__ta.hasOwnProperty(evt)) { + for (var h in _el.__ta[evt]) { + if (_el.__ta[evt].hasOwnProperty(h)) + _unbind(_el, evt, _el.__ta[evt][h]); + } + } + } + } + _el.parentNode && _el.parentNode.removeChild(_el); + }); + return this; + }; + + /** + * Register an event handler, optionally as a delegate for some set of descendant elements. Note + * that this method takes either 3 or 4 arguments - if you supply 3 arguments it is assumed you have + * omitted the `children` parameter, and that the event handler should be bound directly to the given element. + * @method on + * @param {Element[]|Element|String} el Either an Element, or a CSS spec for a list of elements, or an array of Elements. + * @param {String} [children] Comma-delimited list of selectors identifying allowed children. + * @param {String} event Event ID. + * @param {Function} fn Event handler function. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.on = function (el, event, children, fn) { + var _el = arguments[0], + _c = arguments.length == 4 ? arguments[2] : null, + _e = arguments[1], + _f = arguments[arguments.length - 1]; + + _doBind(_el, _e, _f, _c); + return this; + }; + + /** + * Cancel delegate event handling for the given function. Note that unlike with 'on' you do not supply + * a list of child selectors here: it removes event delegation from all of the child selectors for which the + * given function was registered (if any). + * @method off + * @param {Element[]|Element|String} el Element - or ID of element - from which to remove event listener. + * @param {String} event Event ID. + * @param {Function} fn Event handler function. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.off = function (el, event, fn) { + _unbind(el, event, fn); + return this; + }; + + /** + * Triggers some event for a given element. + * @method trigger + * @param {Element} el Element for which to trigger the event. + * @param {String} event Event ID. + * @param {Event} originalEvent The original event. Should be optional of course, but currently is not, due + * to the jsPlumb use case that caused this method to be added. + * @param {Object} [payload] Optional object to set as `payload` on the generated event; useful for message passing. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.trigger = function (el, event, originalEvent, payload) { + // MouseEvent undefined in old IE; that's how we know it's a mouse event. A fine Microsoft paradox. + var originalIsMouse = isMouseDevice && (typeof MouseEvent === "undefined" || originalEvent == null || originalEvent.constructor === MouseEvent); + + var eventToBind = (isTouchDevice && !isMouseDevice && touchMap[event]) ? touchMap[event] : event, + bindingAMouseEvent = !(isTouchDevice && !isMouseDevice && touchMap[event]); + + var pl = _pageLocation(originalEvent), sl = _screenLocation(originalEvent), cl = _clientLocation(originalEvent); + _each(el, function () { + var _el = _gel(this), evt; + originalEvent = originalEvent || { + screenX: sl[0], + screenY: sl[1], + clientX: cl[0], + clientY: cl[1] + }; + + var _decorate = function (_evt) { + if (payload) _evt.payload = payload; + }; + + var eventGenerators = { + "TouchEvent": function (evt) { + + var touchList = _touchAndList(window, _el, 0, pl[0], pl[1], sl[0], sl[1], cl[0], cl[1]), + init = evt.initTouchEvent || evt.initEvent; + + init(eventToBind, true, true, window, null, sl[0], sl[1], + cl[0], cl[1], false, false, false, false, + touchList, touchList, touchList, 1, 0); + }, + "MouseEvents": function (evt) { + evt.initMouseEvent(eventToBind, true, true, window, 0, + sl[0], sl[1], + cl[0], cl[1], + false, false, false, false, 1, _el); + } + }; + + if (document.createEvent) { + + var ite = !bindingAMouseEvent && !originalIsMouse && (isTouchDevice && touchMap[event]), + evtName = ite ? "TouchEvent" : "MouseEvents"; + + evt = document.createEvent(evtName); + eventGenerators[evtName](evt); + _decorate(evt); + _el.dispatchEvent(evt); + } + else if (document.createEventObject) { + evt = document.createEventObject(); + evt.eventType = evt.eventName = eventToBind; + evt.screenX = sl[0]; + evt.screenY = sl[1]; + evt.clientX = cl[0]; + evt.clientY = cl[1]; + _decorate(evt); + _el.fireEvent('on' + eventToBind, evt); + } + }); + return this; + } + }; + + /** + * Static method to assist in 'consuming' an element: uses `stopPropagation` where available, or sets + * `e.returnValue=false` where it is not. + * @method Mottle.consume + * @param {Event} e Event to consume + * @param {Boolean} [doNotPreventDefault=false] If true, does not call `preventDefault()` on the event. + */ + root.Mottle.consume = function (e, doNotPreventDefault) { + if (e.stopPropagation) + e.stopPropagation(); + else + e.returnValue = false; + + if (!doNotPreventDefault && e.preventDefault) + e.preventDefault(); + }; + + /** + * Gets the page location corresponding to the given event. For touch events this means get the page location of the first touch. + * @method Mottle.pageLocation + * @param {Event} e Event to get page location for. + * @return {Number[]} [left, top] for the given event. + */ + root.Mottle.pageLocation = _pageLocation; + + /** + * Forces touch events to be turned "on". Useful for testing: even if you don't have a touch device, you can still + * trigger a touch event when this is switched on and it will be captured and acted on. + * @method setForceTouchEvents + * @param {Boolean} value If true, force touch events to be on. + */ + root.Mottle.setForceTouchEvents = function (value) { + isTouchDevice = value; + }; + + /** + * Forces mouse events to be turned "on". Useful for testing: even if you don't have a mouse, you can still + * trigger a mouse event when this is switched on and it will be captured and acted on. + * @method setForceMouseEvents + * @param {Boolean} value If true, force mouse events to be on. + */ + root.Mottle.setForceMouseEvents = function (value) { + isMouseDevice = value; + }; + + root.Mottle.version = "0.8.0"; + + if (typeof exports !== "undefined") { + exports.Mottle = root.Mottle; + } + +}).call(typeof window === "undefined" ? this : window); + +/** + drag/drop functionality for use with jsPlumb but with + no knowledge of jsPlumb. supports multiple scopes (separated by whitespace), dragging + multiple elements, constrain to parent, drop filters, drag start filters, custom + css classes. + + a lot of the functionality of this script is expected to be plugged in: + + addClass + removeClass + + addEvent + removeEvent + + getPosition + setPosition + getSize + + indexOf + intersects + + the name came from here: + + http://mrsharpoblunto.github.io/foswig.js/ + + copyright 2016 jsPlumb + */ + +;(function() { + + "use strict"; + var root = this; + + var _suggest = function(list, item, head) { + if (list.indexOf(item) === -1) { + head ? list.unshift(item) : list.push(item); + return true; + } + return false; + }; + + var _vanquish = function(list, item) { + var idx = list.indexOf(item); + if (idx !== -1) list.splice(idx, 1); + }; + + var _difference = function(l1, l2) { + var d = []; + for (var i = 0; i < l1.length; i++) { + if (l2.indexOf(l1[i]) === -1) + d.push(l1[i]); + } + return d; + }; + + var _isString = function(f) { + return f == null ? false : (typeof f === "string" || f.constructor === String); + }; + + var getOffsetRect = function (elem) { + // (1) + var box = elem.getBoundingClientRect(), + body = document.body, + docElem = document.documentElement, + // (2) + scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop, + scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft, + // (3) + clientTop = docElem.clientTop || body.clientTop || 0, + clientLeft = docElem.clientLeft || body.clientLeft || 0, + // (4) + top = box.top + scrollTop - clientTop, + left = box.left + scrollLeft - clientLeft; + + return { top: Math.round(top), left: Math.round(left) }; + }; + + var matchesSelector = function(el, selector, ctx) { + ctx = ctx || el.parentNode; + var possibles = ctx.querySelectorAll(selector); + for (var i = 0; i < possibles.length; i++) { + if (possibles[i] === el) + return true; + } + return false; + }; + + var findDelegateElement = function(parentElement, childElement, selector) { + if (matchesSelector(childElement, selector, parentElement)) { + return childElement; + } else { + var currentParent = childElement.parentNode; + while (currentParent != null && currentParent !== parentElement) { + if (matchesSelector(currentParent, selector, parentElement)) { + return currentParent; + } else { + currentParent = currentParent.parentNode; + } + } + } + }; + + /** + * Finds all elements matching the given selector, for the given parent. In order to support "scoped root" selectors, + * ie. things like "> .someClass", that is .someClass elements that are direct children of `parentElement`, we have to + * jump through a small hoop here: when a delegate draggable is registered, we write a `katavorio-draggable` attribute + * on the element on which the draggable is registered. Then when this method runs, we grab the value of that attribute and + * prepend it as part of the selector we're looking for. So "> .someClass" ends up being written as + * "[katavorio-draggable='...' > .someClass]", which works with querySelectorAll. + * + * @param availableSelectors + * @param parentElement + * @param childElement + * @returns {*} + */ + var findMatchingSelector = function(availableSelectors, parentElement, childElement) { + var el = null; + var draggableId = parentElement.getAttribute("katavorio-draggable"), + prefix = draggableId != null ? "[katavorio-draggable='" + draggableId + "'] " : ""; + + for (var i = 0; i < availableSelectors.length; i++) { + el = findDelegateElement(parentElement, childElement, prefix + availableSelectors[i].selector); + if (el != null) { + if (availableSelectors[i].filter) { + var matches = matchesSelector(childElement, availableSelectors[i].filter, el), + exclude = availableSelectors[i].filterExclude === true; + + if ( (exclude && !matches) || matches) { + return null; + } + + } + return [ availableSelectors[i], el ]; + } + } + return null; + }; + + var iev = (function() { + var rv = -1; + if (navigator.appName === 'Microsoft Internet Explorer') { + var ua = navigator.userAgent, + re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); + if (re.exec(ua) != null) + rv = parseFloat(RegExp.$1); + } + return rv; + })(), + DEFAULT_GRID_X = 10, + DEFAULT_GRID_Y = 10, + isIELT9 = iev > -1 && iev < 9, + isIE9 = iev === 9, + _pl = function(e) { + if (isIELT9) { + return [ e.clientX + document.documentElement.scrollLeft, e.clientY + document.documentElement.scrollTop ]; + } + else { + var ts = _touches(e), t = _getTouch(ts, 0); + // for IE9 pageX might be null if the event was synthesized. We try for pageX/pageY first, + // falling back to clientX/clientY if necessary. In every other browser we want to use pageX/pageY. + return isIE9 ? [t.pageX || t.clientX, t.pageY || t.clientY] : [t.pageX, t.pageY]; + } + }, + _getTouch = function(touches, idx) { return touches.item ? touches.item(idx) : touches[idx]; }, + _touches = function(e) { + return e.touches && e.touches.length > 0 ? e.touches : + e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches : + e.targetTouches && e.targetTouches.length > 0 ? e.targetTouches : + [ e ]; + }, + _classes = { + delegatedDraggable:"katavorio-delegated-draggable", // elements that are the delegated drag handler for a bunch of other elements + draggable:"katavorio-draggable", // draggable elements + droppable:"katavorio-droppable", // droppable elements + drag : "katavorio-drag", // elements currently being dragged + selected:"katavorio-drag-selected", // elements in current drag selection + active : "katavorio-drag-active", // droppables that are targets of a currently dragged element + hover : "katavorio-drag-hover", // droppables over which a matching drag element is hovering + noSelect : "katavorio-drag-no-select", // added to the body to provide a hook to suppress text selection + ghostProxy:"katavorio-ghost-proxy", // added to a ghost proxy element in use when a drag has exited the bounds of its parent. + clonedDrag:"katavorio-clone-drag" // added to a node that is a clone of an element created at the start of a drag + }, + _defaultScope = "katavorio-drag-scope", + _events = [ "stop", "start", "drag", "drop", "over", "out", "beforeStart" ], + _devNull = function() {}, + _true = function() { return true; }, + _foreach = function(l, fn, from) { + for (var i = 0; i < l.length; i++) { + if (l[i] != from) + fn(l[i]); + } + }, + _setDroppablesActive = function(dd, val, andHover, drag) { + _foreach(dd, function(e) { + e.setActive(val); + if (val) e.updatePosition(); + if (andHover) e.setHover(drag, val); + }); + }, + _each = function(obj, fn) { + if (obj == null) return; + obj = !_isString(obj) && (obj.tagName == null && obj.length != null) ? obj : [ obj ]; + for (var i = 0; i < obj.length; i++) + fn.apply(obj[i], [ obj[i] ]); + }, + _consume = function(e) { + if (e.stopPropagation) { + e.stopPropagation(); + e.preventDefault(); + } + else { + e.returnValue = false; + } + }, + _defaultInputFilterSelector = "input,textarea,select,button,option", + // + // filters out events on all input elements, like textarea, checkbox, input, select. + _inputFilter = function(e, el, _katavorio) { + var t = e.srcElement || e.target; + return !matchesSelector(t, _katavorio.getInputFilterSelector(), el); + }; + + var Super = function(el, params, css, scope) { + this.params = params || {}; + this.el = el; + this.params.addClass(this.el, this._class); + this.uuid = _uuid(); + var enabled = true; + this.setEnabled = function(e) { enabled = e; }; + this.isEnabled = function() { return enabled; }; + this.toggleEnabled = function() { enabled = !enabled; }; + this.setScope = function(scopes) { + this.scopes = scopes ? scopes.split(/\s+/) : [ scope ]; + }; + this.addScope = function(scopes) { + var m = {}; + _each(this.scopes, function(s) { m[s] = true;}); + _each(scopes ? scopes.split(/\s+/) : [], function(s) { m[s] = true;}); + this.scopes = []; + for (var i in m) this.scopes.push(i); + }; + this.removeScope = function(scopes) { + var m = {}; + _each(this.scopes, function(s) { m[s] = true;}); + _each(scopes ? scopes.split(/\s+/) : [], function(s) { delete m[s];}); + this.scopes = []; + for (var i in m) this.scopes.push(i); + }; + this.toggleScope = function(scopes) { + var m = {}; + _each(this.scopes, function(s) { m[s] = true;}); + _each(scopes ? scopes.split(/\s+/) : [], function(s) { + if (m[s]) delete m[s]; + else m[s] = true; + }); + this.scopes = []; + for (var i in m) this.scopes.push(i); + }; + this.setScope(params.scope); + this.k = params.katavorio; + return params.katavorio; + }; + + var TRUE = function() { return true; }; + var FALSE = function() { return false; }; + + var Drag = function(el, params, css, scope) { + this._class = css.draggable; + var k = Super.apply(this, arguments); + this.rightButtonCanDrag = this.params.rightButtonCanDrag; + var downAt = [0,0], posAtDown = null, pagePosAtDown = null, pageDelta = [0,0], moving = false, initialScroll = [0,0], + consumeStartEvent = this.params.consumeStartEvent !== false, + dragEl = this.el, + clone = this.params.clone, + scroll = this.params.scroll, + _multipleDrop = params.multipleDrop !== false, + isConstrained = false, + useGhostProxy = params.ghostProxy === true ? TRUE : params.ghostProxy && typeof params.ghostProxy === "function" ? params.ghostProxy : FALSE, + ghostProxy = function(el) { return el.cloneNode(true); }, + elementToDrag = null, + availableSelectors = [], + activeSelectorParams = null, // which, if any, selector config is currently active. + ghostProxyParent = params.ghostProxyParent, + currentParentPosition, + ghostParentPosition, + ghostDx, + ghostDy; + + // if an initial selector was provided, push the entire set of params as a selector config. + if (params.selector) { + var draggableId = el.getAttribute("katavorio-draggable"); + if (draggableId == null) { + draggableId = "" + new Date().getTime(); + el.setAttribute("katavorio-draggable", draggableId); + } + + availableSelectors.push(params); + } + + var snapThreshold = params.snapThreshold, + _snap = function(pos, gridX, gridY, thresholdX, thresholdY) { + var _dx = Math.floor(pos[0] / gridX), + _dxl = gridX * _dx, + _dxt = _dxl + gridX, + _x = Math.abs(pos[0] - _dxl) <= thresholdX ? _dxl : Math.abs(_dxt - pos[0]) <= thresholdX ? _dxt : pos[0]; + + var _dy = Math.floor(pos[1] / gridY), + _dyl = gridY * _dy, + _dyt = _dyl + gridY, + _y = Math.abs(pos[1] - _dyl) <= thresholdY ? _dyl : Math.abs(_dyt - pos[1]) <= thresholdY ? _dyt : pos[1]; + + return [ _x, _y]; + }; + + this.posses = []; + this.posseRoles = {}; + + this.toGrid = function(pos) { + if (this.params.grid == null) { + return pos; + } + else { + var tx = this.params.grid ? this.params.grid[0] / 2 : snapThreshold ? snapThreshold : DEFAULT_GRID_X / 2, + ty = this.params.grid ? this.params.grid[1] / 2 : snapThreshold ? snapThreshold : DEFAULT_GRID_Y / 2; + + return _snap(pos, this.params.grid[0], this.params.grid[1], tx, ty); + } + }; + + this.snap = function(x, y) { + if (dragEl == null) return; + x = x || (this.params.grid ? this.params.grid[0] : DEFAULT_GRID_X); + y = y || (this.params.grid ? this.params.grid[1] : DEFAULT_GRID_Y); + var p = this.params.getPosition(dragEl), + tx = this.params.grid ? this.params.grid[0] / 2 : snapThreshold, + ty = this.params.grid ? this.params.grid[1] / 2 : snapThreshold, + snapped = _snap(p, x, y, tx, ty); + + this.params.setPosition(dragEl, snapped); + return snapped; + }; + + this.setUseGhostProxy = function(val) { + useGhostProxy = val ? TRUE : FALSE; + }; + + var constrain; + var negativeFilter = function(pos) { + return (params.allowNegative === false) ? [ Math.max (0, pos[0]), Math.max(0, pos[1]) ] : pos; + }; + + var _setConstrain = function(value) { + constrain = typeof value === "function" ? value : value ? function(pos, dragEl, _constrainRect, _size) { + return negativeFilter([ + Math.max(0, Math.min(_constrainRect.w - _size[0], pos[0])), + Math.max(0, Math.min(_constrainRect.h - _size[1], pos[1])) + ]); + }.bind(this) : function(pos) { return negativeFilter(pos); }; + }.bind(this); + + _setConstrain(typeof this.params.constrain === "function" ? this.params.constrain : (this.params.constrain || this.params.containment)); + + + /** + * Sets whether or not the Drag is constrained. A value of 'true' means constrain to parent bounds; a function + * will be executed and returns true if the position is allowed. + * @param value + */ + this.setConstrain = function(value) { + _setConstrain(value); + }; + + var revertFunction; + /** + * Sets a function to call on drag stop, which, if it returns true, indicates that the given element should + * revert to its position before the previous drag. + * @param fn + */ + this.setRevert = function(fn) { + revertFunction = fn; + }; + + if (this.params.revert) { + revertFunction = this.params.revert; + } + + var _assignId = function(obj) { + if (typeof obj === "function") { + obj._katavorioId = _uuid(); + return obj._katavorioId; + } else { + return obj; + } + }, + // a map of { spec -> [ fn, exclusion ] } entries. + _filters = {}, + _testFilter = function(e) { + for (var key in _filters) { + var f = _filters[key]; + var rv = f[0](e); + if (f[1]) rv = !rv; + if (!rv) return false; + } + return true; + }, + _setFilter = this.setFilter = function(f, _exclude) { + if (f) { + var key = _assignId(f); + _filters[key] = [ + function(e) { + var t = e.srcElement || e.target, m; + if (_isString(f)) { + m = matchesSelector(t, f, el); + } + else if (typeof f === "function") { + m = f(e, el); + } + return m; + }, + _exclude !== false + ]; + + } + }, + _addFilter = this.addFilter = _setFilter, + _removeFilter = this.removeFilter = function(f) { + var key = typeof f === "function" ? f._katavorioId : f; + delete _filters[key]; + }; + + this.clearAllFilters = function() { + _filters = {}; + }; + + this.canDrag = this.params.canDrag || _true; + + var constrainRect, + matchingDroppables = [], + intersectingDroppables = []; + + this.addSelector = function(params) { + if (params.selector) { + availableSelectors.push(params); + } + }; + + this.downListener = function(e) { + if (e.defaultPrevented) { return; } + var isNotRightClick = this.rightButtonCanDrag || (e.which !== 3 && e.button !== 2); + if (isNotRightClick && this.isEnabled() && this.canDrag()) { + + var _f = _testFilter(e) && _inputFilter(e, this.el, this.k); + if (_f) { + + activeSelectorParams = null; + elementToDrag = null; + + // if (selector) { + // elementToDrag = findDelegateElement(this.el, e.target || e.srcElement, selector); + // if(elementToDrag == null) { + // return; + // } + // } + if (availableSelectors.length > 0) { + var match = findMatchingSelector(availableSelectors, this.el, e.target || e.srcElement); + if (match != null) { + activeSelectorParams = match[0]; + elementToDrag = match[1]; + } + // elementToDrag = findDelegateElement(this.el, e.target || e.srcElement, selector); + if(elementToDrag == null) { + return; + } + } + else { + elementToDrag = this.el; + } + + if (clone) { + dragEl = elementToDrag.cloneNode(true); + this.params.addClass(dragEl, _classes.clonedDrag); + + dragEl.setAttribute("id", null); + dragEl.style.position = "absolute"; + + if (this.params.parent != null) { + var p = this.params.getPosition(this.el); + dragEl.style.left = p[0] + "px"; + dragEl.style.top = p[1] + "px"; + this.params.parent.appendChild(dragEl); + } else { + // the clone node is added to the body; getOffsetRect gives us a value + // relative to the body. + var b = getOffsetRect(elementToDrag); + dragEl.style.left = b.left + "px"; + dragEl.style.top = b.top + "px"; + + document.body.appendChild(dragEl); + } + + } else { + dragEl = elementToDrag; + } + + consumeStartEvent && _consume(e); + downAt = _pl(e); + if (dragEl && dragEl.parentNode) + { + initialScroll = [dragEl.parentNode.scrollLeft, dragEl.parentNode.scrollTop]; + } + // + this.params.bind(document, "mousemove", this.moveListener); + this.params.bind(document, "mouseup", this.upListener); + k.markSelection(this); + k.markPosses(this); + this.params.addClass(document.body, css.noSelect); + _dispatch("beforeStart", {el:this.el, pos:posAtDown, e:e, drag:this}); + } + else if (this.params.consumeFilteredEvents) { + _consume(e); + } + } + }.bind(this); + + this.moveListener = function(e) { + if (downAt) { + if (!moving) { + var _continue = _dispatch("start", {el:this.el, pos:posAtDown, e:e, drag:this}); + if (_continue !== false) { + if (!downAt) { + return; + } + this.mark(true); + moving = true; + } else { + this.abort(); + } + } + + // it is possible that the start event caused the drag to be aborted. So we check + // again that we are currently dragging. + if (downAt) { + intersectingDroppables.length = 0; + var pos = _pl(e), dx = pos[0] - downAt[0], dy = pos[1] - downAt[1], + z = this.params.ignoreZoom ? 1 : k.getZoom(); + if (dragEl && dragEl.parentNode) + { + dx += dragEl.parentNode.scrollLeft - initialScroll[0]; + dy += dragEl.parentNode.scrollTop - initialScroll[1]; + } + dx /= z; + dy /= z; + this.moveBy(dx, dy, e); + k.updateSelection(dx, dy, this); + k.updatePosses(dx, dy, this); + } + } + }.bind(this); + + this.upListener = function(e) { + if (downAt) { + downAt = null; + this.params.unbind(document, "mousemove", this.moveListener); + this.params.unbind(document, "mouseup", this.upListener); + this.params.removeClass(document.body, css.noSelect); + this.unmark(e); + k.unmarkSelection(this, e); + k.unmarkPosses(this, e); + this.stop(e); + + k.notifyPosseDragStop(this, e); + moving = false; + intersectingDroppables.length = 0; + + if (clone) { + dragEl && dragEl.parentNode && dragEl.parentNode.removeChild(dragEl); + dragEl = null; + } else { + if (revertFunction && revertFunction(dragEl, this.params.getPosition(dragEl)) === true) { + this.params.setPosition(dragEl, posAtDown); + _dispatch("revert", dragEl); + } + } + + } + }.bind(this); + + this.getFilters = function() { return _filters; }; + + this.abort = function() { + if (downAt != null) { + this.upListener(); + } + }; + + /** + * Returns the element that was last dragged. This may be some original element from the DOM, or if `clone` is + * set, then its actually a copy of some original DOM element. In some client calls to this method, it is the + * actual element that was dragged that is desired. In others, it is the original DOM element that the user + * wishes to get - in which case, pass true for `retrieveOriginalElement`. + * + * @returns {*} + */ + this.getDragElement = function(retrieveOriginalElement) { + return retrieveOriginalElement ? elementToDrag || this.el : dragEl || this.el; + }; + + var listeners = {"start":[], "drag":[], "stop":[], "over":[], "out":[], "beforeStart":[], "revert":[] }; + if (params.events.start) listeners.start.push(params.events.start); + if (params.events.beforeStart) listeners.beforeStart.push(params.events.beforeStart); + if (params.events.stop) listeners.stop.push(params.events.stop); + if (params.events.drag) listeners.drag.push(params.events.drag); + if (params.events.revert) listeners.revert.push(params.events.revert); + + this.on = function(evt, fn) { + if (listeners[evt]) listeners[evt].push(fn); + }; + + this.off = function(evt, fn) { + if (listeners[evt]) { + var l = []; + for (var i = 0; i < listeners[evt].length; i++) { + if (listeners[evt][i] !== fn) l.push(listeners[evt][i]); + } + listeners[evt] = l; + } + }; + + var _dispatch = function(evt, value) { + var result = null; + if (activeSelectorParams && activeSelectorParams[evt]) { + result = activeSelectorParams[evt](value); + } else if (listeners[evt]) { + for (var i = 0; i < listeners[evt].length; i++) { + try { + var v = listeners[evt][i](value); + if (v != null) { + result = v; + } + } + catch (e) { } + } + } + return result; + }; + + this.notifyStart = function(e) { + _dispatch("start", {el:this.el, pos:this.params.getPosition(dragEl), e:e, drag:this}); + }; + + this.stop = function(e, force) { + if (force || moving) { + var positions = [], + sel = k.getSelection(), + dPos = this.params.getPosition(dragEl); + + if (sel.length > 0) { + for (var i = 0; i < sel.length; i++) { + var p = this.params.getPosition(sel[i].el); + positions.push([ sel[i].el, { left: p[0], top: p[1] }, sel[i] ]); + } + } + else { + positions.push([ dragEl, {left:dPos[0], top:dPos[1]}, this ]); + } + + _dispatch("stop", { + el: dragEl, + pos: ghostProxyOffsets || dPos, + finalPos:dPos, + e: e, + drag: this, + selection:positions + }); + } + }; + + this.mark = function(andNotify) { + posAtDown = this.params.getPosition(dragEl); + pagePosAtDown = this.params.getPosition(dragEl, true); + pageDelta = [pagePosAtDown[0] - posAtDown[0], pagePosAtDown[1] - posAtDown[1]]; + this.size = this.params.getSize(dragEl); + matchingDroppables = k.getMatchingDroppables(this); + _setDroppablesActive(matchingDroppables, true, false, this); + this.params.addClass(dragEl, this.params.dragClass || css.drag); + + var cs; + if (this.params.getConstrainingRectangle) { + cs = this.params.getConstrainingRectangle(dragEl) + } else { + cs = this.params.getSize(dragEl.parentNode); + } + constrainRect = {w: cs[0], h: cs[1]}; + + ghostDx = 0; + ghostDy = 0; + + if (andNotify) { + k.notifySelectionDragStart(this); + } + }; + var ghostProxyOffsets; + this.unmark = function(e, doNotCheckDroppables) { + _setDroppablesActive(matchingDroppables, false, true, this); + + if (isConstrained && useGhostProxy(elementToDrag, dragEl)) { + ghostProxyOffsets = [dragEl.offsetLeft - ghostDx, dragEl.offsetTop - ghostDy]; + dragEl.parentNode.removeChild(dragEl); + dragEl = elementToDrag; + } + else { + ghostProxyOffsets = null; + } + + this.params.removeClass(dragEl, this.params.dragClass || css.drag); + matchingDroppables.length = 0; + isConstrained = false; + if (!doNotCheckDroppables) { + if (intersectingDroppables.length > 0 && ghostProxyOffsets) { + params.setPosition(elementToDrag, ghostProxyOffsets); + } + intersectingDroppables.sort(_rankSort); + for (var i = 0; i < intersectingDroppables.length; i++) { + var retVal = intersectingDroppables[i].drop(this, e); + if (retVal === true) break; + } + } + }; + this.moveBy = function(dx, dy, e) { + intersectingDroppables.length = 0; + + var desiredLoc = this.toGrid([posAtDown[0] + dx, posAtDown[1] + dy]), + cPos = constrain(desiredLoc, dragEl, constrainRect, this.size); + + // if we should use a ghost proxy... + if (useGhostProxy(this.el, dragEl)) { + // and the element has been dragged outside of its parent bounds + if (desiredLoc[0] !== cPos[0] || desiredLoc[1] !== cPos[1]) { + + // ...if ghost proxy not yet created + if (!isConstrained) { + // create it + var gp = ghostProxy(elementToDrag); + params.addClass(gp, _classes.ghostProxy); + + if (ghostProxyParent) { + ghostProxyParent.appendChild(gp); + // find offset between drag el's parent the ghost parent + currentParentPosition = params.getPosition(elementToDrag.parentNode, true); + ghostParentPosition = params.getPosition(params.ghostProxyParent, true); + ghostDx = currentParentPosition[0] - ghostParentPosition[0]; + ghostDy = currentParentPosition[1] - ghostParentPosition[1]; + + } else { + elementToDrag.parentNode.appendChild(gp); + } + + // the ghost proxy is the drag element + dragEl = gp; + // set this flag so we dont recreate the ghost proxy + isConstrained = true; + } + // now the drag position can be the desired position, as the ghost proxy can support it. + cPos = desiredLoc; + } + else { + // if the element is not outside of its parent bounds, and ghost proxy is in place, + if (isConstrained) { + // remove the ghost proxy from the dom + dragEl.parentNode.removeChild(dragEl); + // reset the drag element to the original element + dragEl = elementToDrag; + // clear this flag. + isConstrained = false; + currentParentPosition = null; + ghostParentPosition = null; + ghostDx = 0; + ghostDy = 0; + } + } + } + + var rect = { x:cPos[0], y:cPos[1], w:this.size[0], h:this.size[1]}, + pageRect = { x:rect.x + pageDelta[0], y:rect.y + pageDelta[1], w:rect.w, h:rect.h}, + focusDropElement = null; + + this.params.setPosition(dragEl, [cPos[0] + ghostDx, cPos[1] + ghostDy]); + + for (var i = 0; i < matchingDroppables.length; i++) { + var r2 = { x:matchingDroppables[i].pagePosition[0], y:matchingDroppables[i].pagePosition[1], w:matchingDroppables[i].size[0], h:matchingDroppables[i].size[1]}; + if (this.params.intersects(pageRect, r2) && (_multipleDrop || focusDropElement == null || focusDropElement === matchingDroppables[i].el) && matchingDroppables[i].canDrop(this)) { + if (!focusDropElement) focusDropElement = matchingDroppables[i].el; + intersectingDroppables.push(matchingDroppables[i]); + matchingDroppables[i].setHover(this, true, e); + } + else if (matchingDroppables[i].isHover()) { + matchingDroppables[i].setHover(this, false, e); + } + } + + _dispatch("drag", {el:this.el, pos:cPos, e:e, drag:this}); + + /* test to see if the parent needs to be scrolled (future) + if (scroll) { + var pnsl = dragEl.parentNode.scrollLeft, pnst = dragEl.parentNode.scrollTop; + console.log("scroll!", pnsl, pnst); + }*/ + }; + this.destroy = function() { + this.params.unbind(this.el, "mousedown", this.downListener); + this.params.unbind(document, "mousemove", this.moveListener); + this.params.unbind(document, "mouseup", this.upListener); + this.downListener = null; + this.upListener = null; + this.moveListener = null; + }; + + // init:register mousedown, and perhaps set a filter + this.params.bind(this.el, "mousedown", this.downListener); + + // if handle provided, use that. otherwise, try to set a filter. + // note that a `handle` selector always results in filterExclude being set to false, ie. + // the selector defines the handle element(s). + if (this.params.handle) + _setFilter(this.params.handle, false); + else + _setFilter(this.params.filter, this.params.filterExclude); + }; + + var Drop = function(el, params, css, scope) { + this._class = css.droppable; + this.params = params || {}; + this.rank = params.rank || 0; + this._activeClass = this.params.activeClass || css.active; + this._hoverClass = this.params.hoverClass || css.hover; + Super.apply(this, arguments); + var hover = false; + this.allowLoopback = this.params.allowLoopback !== false; + + this.setActive = function(val) { + this.params[val ? "addClass" : "removeClass"](this.el, this._activeClass); + }; + + this.updatePosition = function() { + this.position = this.params.getPosition(this.el); + this.pagePosition = this.params.getPosition(this.el, true); + this.size = this.params.getSize(this.el); + }; + + this.canDrop = this.params.canDrop || function(drag) { + return true; + }; + + this.isHover = function() { return hover; }; + + this.setHover = function(drag, val, e) { + // if turning off hover but this was not the drag that caused the hover, ignore. + if (val || this.el._katavorioDragHover == null || this.el._katavorioDragHover === drag.el._katavorio) { + this.params[val ? "addClass" : "removeClass"](this.el, this._hoverClass); + this.el._katavorioDragHover = val ? drag.el._katavorio : null; + if (hover !== val) { + this.params.events[val ? "over" : "out"]({el: this.el, e: e, drag: drag, drop: this}); + } + hover = val; + } + }; + + /** + * A drop event. `drag` is the corresponding Drag object, which may be a Drag for some specific element, or it + * may be a Drag on some element acting as a delegate for elements contained within it. + * @param drag + * @param event + * @returns {*} + */ + this.drop = function(drag, event) { + return this.params.events["drop"]({ drag:drag, e:event, drop:this }); + }; + + this.destroy = function() { + this._class = null; + this._activeClass = null; + this._hoverClass = null; + hover = null; + }; + }; + + var _uuid = function() { + return ('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = Math.random()*16|0, v = c === 'x' ? r : (r&0x3|0x8); + return v.toString(16); + })); + }; + + var _rankSort = function(a,b) { + return a.rank < b.rank ? 1 : a.rank > b.rank ? -1 : 0; + }; + + var _gel = function(el) { + if (el == null) return null; + el = (typeof el === "string" || el.constructor === String) ? document.getElementById(el) : el; + if (el == null) return null; + el._katavorio = el._katavorio || _uuid(); + return el; + }; + + root.Katavorio = function(katavorioParams) { + + var _selection = [], + _selectionMap = {}; + + this._dragsByScope = {}; + this._dropsByScope = {}; + var _zoom = 1, + _reg = function(obj, map) { + _each(obj, function(_obj) { + for(var i = 0; i < _obj.scopes.length; i++) { + map[_obj.scopes[i]] = map[_obj.scopes[i]] || []; + map[_obj.scopes[i]].push(_obj); + } + }); + }, + _unreg = function(obj, map) { + var c = 0; + _each(obj, function(_obj) { + for(var i = 0; i < _obj.scopes.length; i++) { + if (map[_obj.scopes[i]]) { + var idx = katavorioParams.indexOf(map[_obj.scopes[i]], _obj); + if (idx !== -1) { + map[_obj.scopes[i]].splice(idx, 1); + c++; + } + } + } + }); + + return c > 0 ; + }, + _getMatchingDroppables = this.getMatchingDroppables = function(drag) { + var dd = [], _m = {}; + for (var i = 0; i < drag.scopes.length; i++) { + var _dd = this._dropsByScope[drag.scopes[i]]; + if (_dd) { + for (var j = 0; j < _dd.length; j++) { + if (_dd[j].canDrop(drag) && !_m[_dd[j].uuid] && (_dd[j].allowLoopback || _dd[j].el !== drag.el)) { + _m[_dd[j].uuid] = true; + dd.push(_dd[j]); + } + } + } + } + dd.sort(_rankSort); + return dd; + }, + _prepareParams = function(p) { + p = p || {}; + var _p = { + events:{} + }, i; + for (i in katavorioParams) _p[i] = katavorioParams[i]; + for (i in p) _p[i] = p[i]; + // events + + for (i = 0; i < _events.length; i++) { + _p.events[_events[i]] = p[_events[i]] || _devNull; + } + _p.katavorio = this; + return _p; + }.bind(this), + _mistletoe = function(existingDrag, params) { + for (var i = 0; i < _events.length; i++) { + if (params[_events[i]]) { + existingDrag.on(_events[i], params[_events[i]]); + } + } + }.bind(this), + _css = {}, + overrideCss = katavorioParams.css || {}, + _scope = katavorioParams.scope || _defaultScope; + + // prepare map of css classes based on defaults frst, then optional overrides + for (var i in _classes) _css[i] = _classes[i]; + for (var i in overrideCss) _css[i] = overrideCss[i]; + + var inputFilterSelector = katavorioParams.inputFilterSelector || _defaultInputFilterSelector; + /** + * Gets the selector identifying which input elements to filter from drag events. + * @method getInputFilterSelector + * @return {String} Current input filter selector. + */ + this.getInputFilterSelector = function() { return inputFilterSelector; }; + + /** + * Sets the selector identifying which input elements to filter from drag events. + * @method setInputFilterSelector + * @param {String} selector Input filter selector to set. + * @return {Katavorio} Current instance; method may be chained. + */ + this.setInputFilterSelector = function(selector) { + inputFilterSelector = selector; + return this; + }; + + /** + * Either makes the given element draggable, or identifies it as an element inside which some identified list + * of elements may be draggable. + * @param el + * @param params + * @returns {Array} + */ + this.draggable = function(el, params) { + var o = []; + _each(el, function (_el) { + _el = _gel(_el); + if (_el != null) { + if (_el._katavorioDrag == null) { + var p = _prepareParams(params); + _el._katavorioDrag = new Drag(_el, p, _css, _scope); + _reg(_el._katavorioDrag, this._dragsByScope); + o.push(_el._katavorioDrag); + katavorioParams.addClass(_el, p.selector ? _css.delegatedDraggable : _css.draggable); + } + else { + _mistletoe(_el._katavorioDrag, params); + } + } + }.bind(this)); + return o; + }; + + this.droppable = function(el, params) { + var o = []; + _each(el, function(_el) { + _el = _gel(_el); + if (_el != null) { + var drop = new Drop(_el, _prepareParams(params), _css, _scope); + _el._katavorioDrop = _el._katavorioDrop || []; + _el._katavorioDrop.push(drop); + _reg(drop, this._dropsByScope); + o.push(drop); + katavorioParams.addClass(_el, _css.droppable); + } + }.bind(this)); + return o; + }; + + /** + * @name Katavorio#select + * @function + * @desc Adds an element to the current selection (for multiple node drag) + * @param {Element|String} DOM element - or id of the element - to add. + */ + this.select = function(el) { + _each(el, function() { + var _el = _gel(this); + if (_el && _el._katavorioDrag) { + if (!_selectionMap[_el._katavorio]) { + _selection.push(_el._katavorioDrag); + _selectionMap[_el._katavorio] = [ _el, _selection.length - 1 ]; + katavorioParams.addClass(_el, _css.selected); + } + } + }); + return this; + }; + + /** + * @name Katavorio#deselect + * @function + * @desc Removes an element from the current selection (for multiple node drag) + * @param {Element|String} DOM element - or id of the element - to remove. + */ + this.deselect = function(el) { + _each(el, function() { + var _el = _gel(this); + if (_el && _el._katavorio) { + var e = _selectionMap[_el._katavorio]; + if (e) { + var _s = []; + for (var i = 0; i < _selection.length; i++) + if (_selection[i].el !== _el) _s.push(_selection[i]); + _selection = _s; + delete _selectionMap[_el._katavorio]; + katavorioParams.removeClass(_el, _css.selected); + } + } + }); + return this; + }; + + this.deselectAll = function() { + for (var i in _selectionMap) { + var d = _selectionMap[i]; + katavorioParams.removeClass(d[0], _css.selected); + } + + _selection.length = 0; + _selectionMap = {}; + }; + + this.markSelection = function(drag) { + _foreach(_selection, function(e) { e.mark(); }, drag); + }; + + this.markPosses = function(drag) { + if (drag.posses) { + _each(drag.posses, function(p) { + if (drag.posseRoles[p] && _posses[p]) { + _foreach(_posses[p].members, function (d) { + d.mark(); + }, drag); + } + }) + } + }; + + this.unmarkSelection = function(drag, event) { + _foreach(_selection, function(e) { e.unmark(event); }, drag); + }; + + this.unmarkPosses = function(drag, event) { + if (drag.posses) { + _each(drag.posses, function(p) { + if (drag.posseRoles[p] && _posses[p]) { + _foreach(_posses[p].members, function (d) { + d.unmark(event, true); + }, drag); + } + }); + } + }; + + this.getSelection = function() { return _selection.slice(0); }; + + this.updateSelection = function(dx, dy, drag) { + _foreach(_selection, function(e) { e.moveBy(dx, dy); }, drag); + }; + + var _posseAction = function(fn, drag) { + if (drag.posses) { + _each(drag.posses, function(p) { + if (drag.posseRoles[p] && _posses[p]) { + _foreach(_posses[p].members, function (e) { + fn(e); + }, drag); + } + }); + } + }; + + this.updatePosses = function(dx, dy, drag) { + _posseAction(function(e) { e.moveBy(dx, dy); }, drag); + }; + + this.notifyPosseDragStop = function(drag, evt) { + _posseAction(function(e) { e.stop(evt, true); }, drag); + }; + + this.notifySelectionDragStop = function(drag, evt) { + _foreach(_selection, function(e) { e.stop(evt, true); }, drag); + }; + + this.notifySelectionDragStart = function(drag, evt) { + _foreach(_selection, function(e) { e.notifyStart(evt);}, drag); + }; + + this.setZoom = function(z) { _zoom = z; }; + this.getZoom = function() { return _zoom; }; + + // does the work of changing scopes + var _scopeManip = function(kObj, scopes, map, fn) { + _each(kObj, function(_kObj) { + _unreg(_kObj, map); // deregister existing scopes + _kObj[fn](scopes); // set scopes + _reg(_kObj, map); // register new ones + }); + }; + + _each([ "set", "add", "remove", "toggle"], function(v) { + this[v + "Scope"] = function(el, scopes) { + _scopeManip(el._katavorioDrag, scopes, this._dragsByScope, v + "Scope"); + _scopeManip(el._katavorioDrop, scopes, this._dropsByScope, v + "Scope"); + }.bind(this); + this[v + "DragScope"] = function(el, scopes) { + _scopeManip(el.constructor === Drag ? el : el._katavorioDrag, scopes, this._dragsByScope, v + "Scope"); + }.bind(this); + this[v + "DropScope"] = function(el, scopes) { + _scopeManip(el.constructor === Drop ? el : el._katavorioDrop, scopes, this._dropsByScope, v + "Scope"); + }.bind(this); + }.bind(this)); + + this.snapToGrid = function(x, y) { + for (var s in this._dragsByScope) { + _foreach(this._dragsByScope[s], function(d) { d.snap(x, y); }); + } + }; + + this.getDragsForScope = function(s) { return this._dragsByScope[s]; }; + this.getDropsForScope = function(s) { return this._dropsByScope[s]; }; + + var _destroy = function(el, type, map) { + el = _gel(el); + if (el[type]) { + + // remove from selection, if present. + var selIdx = _selection.indexOf(el[type]); + if (selIdx >= 0) { + _selection.splice(selIdx, 1); + } + + if (_unreg(el[type], map)) { + _each(el[type], function(kObj) { kObj.destroy() }); + } + + delete el[type]; + } + }; + + var _removeListener = function(el, type, evt, fn) { + el = _gel(el); + if (el[type]) { + el[type].off(evt, fn); + } + }; + + this.elementRemoved = function(el) { + this.destroyDraggable(el); + this.destroyDroppable(el); + }; + + /** + * Either completely remove drag functionality from the given element, or remove a specific event handler. If you + * call this method with a single argument - the element - all drag functionality is removed from it. Otherwise, if + * you provide an event name and listener function, this function is de-registered (if found). + * @param el Element to update + * @param {string} [evt] Optional event name to unsubscribe + * @param {Function} [fn] Optional function to unsubscribe + */ + this.destroyDraggable = function(el, evt, fn) { + if (arguments.length === 1) { + _destroy(el, "_katavorioDrag", this._dragsByScope); + } else { + _removeListener(el, "_katavorioDrag", evt, fn); + } + }; + + /** + * Either completely remove drop functionality from the given element, or remove a specific event handler. If you + * call this method with a single argument - the element - all drop functionality is removed from it. Otherwise, if + * you provide an event name and listener function, this function is de-registered (if found). + * @param el Element to update + * @param {string} [evt] Optional event name to unsubscribe + * @param {Function} [fn] Optional function to unsubscribe + */ + this.destroyDroppable = function(el, evt, fn) { + if (arguments.length === 1) { + _destroy(el, "_katavorioDrop", this._dropsByScope); + } else { + _removeListener(el, "_katavorioDrop", evt, fn); + } + }; + + this.reset = function() { + this._dragsByScope = {}; + this._dropsByScope = {}; + _selection = []; + _selectionMap = {}; + _posses = {}; + }; + + // ----- groups + var _posses = {}; + + var _processOneSpec = function(el, _spec, dontAddExisting) { + var posseId = _isString(_spec) ? _spec : _spec.id; + var active = _isString(_spec) ? true : _spec.active !== false; + var posse = _posses[posseId] || (function() { + var g = {name:posseId, members:[]}; + _posses[posseId] = g; + return g; + })(); + _each(el, function(_el) { + if (_el._katavorioDrag) { + + if (dontAddExisting && _el._katavorioDrag.posseRoles[posse.name] != null) return; + + _suggest(posse.members, _el._katavorioDrag); + _suggest(_el._katavorioDrag.posses, posse.name); + _el._katavorioDrag.posseRoles[posse.name] = active; + } + }); + return posse; + }; + + /** + * Add the given element to the posse with the given id, creating the group if it at first does not exist. + * @method addToPosse + * @param {Element} el Element to add. + * @param {String...|Object...} spec Variable args parameters. Each argument can be a either a String, indicating + * the ID of a Posse to which the element should be added as an active participant, or an Object containing + * `{ id:"posseId", active:false/true}`. In the latter case, if `active` is not provided it is assumed to be + * true. + * @returns {Posse|Posse[]} The Posse(s) to which the element(s) was/were added. + */ + this.addToPosse = function(el, spec) { + + var posses = []; + + for (var i = 1; i < arguments.length; i++) { + posses.push(_processOneSpec(el, arguments[i])); + } + + return posses.length === 1 ? posses[0] : posses; + }; + + /** + * Sets the posse(s) for the element with the given id, creating those that do not yet exist, and removing from + * the element any current Posses that are not specified by this method call. This method will not change the + * active/passive state if it is given a posse in which the element is already a member. + * @method setPosse + * @param {Element} el Element to set posse(s) on. + * @param {String...|Object...} spec Variable args parameters. Each argument can be a either a String, indicating + * the ID of a Posse to which the element should be added as an active participant, or an Object containing + * `{ id:"posseId", active:false/true}`. In the latter case, if `active` is not provided it is assumed to be + * true. + * @returns {Posse|Posse[]} The Posse(s) to which the element(s) now belongs. + */ + this.setPosse = function(el, spec) { + + var posses = []; + + for (var i = 1; i < arguments.length; i++) { + posses.push(_processOneSpec(el, arguments[i], true).name); + } + + _each(el, function(_el) { + if (_el._katavorioDrag) { + var diff = _difference(_el._katavorioDrag.posses, posses); + var p = []; + Array.prototype.push.apply(p, _el._katavorioDrag.posses); + for (var i = 0; i < diff.length; i++) { + this.removeFromPosse(_el, diff[i]); + } + } + }.bind(this)); + + return posses.length === 1 ? posses[0] : posses; + }; + + /** + * Remove the given element from the given posse(s). + * @method removeFromPosse + * @param {Element} el Element to remove. + * @param {String...} posseId Varargs parameter: one value for each posse to remove the element from. + */ + this.removeFromPosse = function(el, posseId) { + if (arguments.length < 2) throw new TypeError("No posse id provided for remove operation"); + for(var i = 1; i < arguments.length; i++) { + posseId = arguments[i]; + _each(el, function (_el) { + if (_el._katavorioDrag && _el._katavorioDrag.posses) { + var d = _el._katavorioDrag; + _each(posseId, function (p) { + _vanquish(_posses[p].members, d); + _vanquish(d.posses, p); + delete d.posseRoles[p]; + }); + } + }); + } + }; + + /** + * Remove the given element from all Posses to which it belongs. + * @method removeFromAllPosses + * @param {Element|Element[]} el Element to remove from Posses. + */ + this.removeFromAllPosses = function(el) { + _each(el, function(_el) { + if (_el._katavorioDrag && _el._katavorioDrag.posses) { + var d = _el._katavorioDrag; + _each(d.posses, function(p) { + _vanquish(_posses[p].members, d); + }); + d.posses.length = 0; + d.posseRoles = {}; + } + }); + }; + + /** + * Changes the participation state for the element in the Posse with the given ID. + * @param {Element|Element[]} el Element(s) to change state for. + * @param {String} posseId ID of the Posse to change element state for. + * @param {Boolean} state True to make active, false to make passive. + */ + this.setPosseState = function(el, posseId, state) { + var posse = _posses[posseId]; + if (posse) { + _each(el, function(_el) { + if (_el._katavorioDrag && _el._katavorioDrag.posses) { + _el._katavorioDrag.posseRoles[posse.name] = state; + } + }); + } + }; + + }; + + root.Katavorio.version = "1.0.0"; + + if (typeof exports !== "undefined") { + exports.Katavorio = root.Katavorio; + } + +}).call(typeof window !== 'undefined' ? window : this); + + +(function() { + + var root = this; + root.jsPlumbUtil = root.jsPlumbUtil || {}; + var jsPlumbUtil = root.jsPlumbUtil; + + if (typeof exports !=='undefined') { exports.jsPlumbUtil = jsPlumbUtil;} + + + /** + * Tests if the given object is an Array. + * @param a + */ + function isArray(a) { + return Object.prototype.toString.call(a) === "[object Array]"; + } + jsPlumbUtil.isArray = isArray; + /** + * Tests if the given object is a Number. + * @param n + */ + function isNumber(n) { + return Object.prototype.toString.call(n) === "[object Number]"; + } + jsPlumbUtil.isNumber = isNumber; + function isString(s) { + return typeof s === "string"; + } + jsPlumbUtil.isString = isString; + function isBoolean(s) { + return typeof s === "boolean"; + } + jsPlumbUtil.isBoolean = isBoolean; + function isNull(s) { + return s == null; + } + jsPlumbUtil.isNull = isNull; + function isObject(o) { + return o == null ? false : Object.prototype.toString.call(o) === "[object Object]"; + } + jsPlumbUtil.isObject = isObject; + function isDate(o) { + return Object.prototype.toString.call(o) === "[object Date]"; + } + jsPlumbUtil.isDate = isDate; + function isFunction(o) { + return Object.prototype.toString.call(o) === "[object Function]"; + } + jsPlumbUtil.isFunction = isFunction; + function isNamedFunction(o) { + return isFunction(o) && o.name != null && o.name.length > 0; + } + jsPlumbUtil.isNamedFunction = isNamedFunction; + function isEmpty(o) { + for (var i in o) { + if (o.hasOwnProperty(i)) { + return false; + } + } + return true; + } + jsPlumbUtil.isEmpty = isEmpty; + function clone(a) { + if (isString(a)) { + return "" + a; + } + else if (isBoolean(a)) { + return !!a; + } + else if (isDate(a)) { + return new Date(a.getTime()); + } + else if (isFunction(a)) { + return a; + } + else if (isArray(a)) { + var b = []; + for (var i = 0; i < a.length; i++) { + b.push(clone(a[i])); + } + return b; + } + else if (isObject(a)) { + var c = {}; + for (var j in a) { + c[j] = clone(a[j]); + } + return c; + } + else { + return a; + } + } + jsPlumbUtil.clone = clone; + function merge(a, b, collations, overwrites) { + // first change the collations array - if present - into a lookup table, because its faster. + var cMap = {}, ar, i, oMap = {}; + collations = collations || []; + overwrites = overwrites || []; + for (i = 0; i < collations.length; i++) { + cMap[collations[i]] = true; + } + for (i = 0; i < overwrites.length; i++) { + oMap[overwrites[i]] = true; + } + var c = clone(a); + for (i in b) { + if (c[i] == null || oMap[i]) { + c[i] = b[i]; + } + else if (isString(b[i]) || isBoolean(b[i])) { + if (!cMap[i]) { + c[i] = b[i]; // if we dont want to collate, just copy it in. + } + else { + ar = []; + // if c's object is also an array we can keep its values. + ar.push.apply(ar, isArray(c[i]) ? c[i] : [c[i]]); + ar.push.apply(ar, isBoolean(b[i]) ? b[i] : [b[i]]); + c[i] = ar; + } + } + else { + if (isArray(b[i])) { + ar = []; + // if c's object is also an array we can keep its values. + if (isArray(c[i])) { + ar.push.apply(ar, c[i]); + } + ar.push.apply(ar, b[i]); + c[i] = ar; + } + else if (isObject(b[i])) { + // overwrite c's value with an object if it is not already one. + if (!isObject(c[i])) { + c[i] = {}; + } + for (var j in b[i]) { + c[i][j] = b[i][j]; + } + } + } + } + return c; + } + jsPlumbUtil.merge = merge; + function replace(inObj, path, value) { + if (inObj == null) { + return; + } + var q = inObj, t = q; + path.replace(/([^\.])+/g, function (term, lc, pos, str) { + var array = term.match(/([^\[0-9]+){1}(\[)([0-9+])/), last = pos + term.length >= str.length, _getArray = function () { + return t[array[1]] || (function () { + t[array[1]] = []; + return t[array[1]]; + })(); + }; + if (last) { + // set term = value on current t, creating term as array if necessary. + if (array) { + _getArray()[array[3]] = value; + } + else { + t[term] = value; + } + } + else { + // set to current t[term], creating t[term] if necessary. + if (array) { + var a_1 = _getArray(); + t = a_1[array[3]] || (function () { + a_1[array[3]] = {}; + return a_1[array[3]]; + })(); + } + else { + t = t[term] || (function () { + t[term] = {}; + return t[term]; + })(); + } + } + return ""; + }); + return inObj; + } + jsPlumbUtil.replace = replace; + // + // chain a list of functions, supplied by [ object, method name, args ], and return on the first + // one that returns the failValue. if none return the failValue, return the successValue. + // + function functionChain(successValue, failValue, fns) { + for (var i = 0; i < fns.length; i++) { + var o = fns[i][0][fns[i][1]].apply(fns[i][0], fns[i][2]); + if (o === failValue) { + return o; + } + } + return successValue; + } + jsPlumbUtil.functionChain = functionChain; + /** + * + * Take the given model and expand out any parameters. 'functionPrefix' is optional, and if present, helps jsplumb figure out what to do if a value is a Function. + * if you do not provide it (and doNotExpandFunctions is null, or false), jsplumb will run the given values through any functions it finds, and use the function's + * output as the value in the result. if you do provide the prefix, only functions that are named and have this prefix + * will be executed; other functions will be passed as values to the output. + * + * @param model + * @param values + * @param functionPrefix + * @param doNotExpandFunctions + * @returns {any} + */ + function populate(model, values, functionPrefix, doNotExpandFunctions) { + // for a string, see if it has parameter matches, and if so, try to make the substitutions. + var getValue = function (fromString) { + var matches = fromString.match(/(\${.*?})/g); + if (matches != null) { + for (var i = 0; i < matches.length; i++) { + var val = values[matches[i].substring(2, matches[i].length - 1)] || ""; + if (val != null) { + fromString = fromString.replace(matches[i], val); + } + } + } + return fromString; + }; + // process one entry. + var _one = function (d) { + if (d != null) { + if (isString(d)) { + return getValue(d); + } + else if (isFunction(d) && !doNotExpandFunctions && (functionPrefix == null || (d.name || "").indexOf(functionPrefix) === 0)) { + return d(values); + } + else if (isArray(d)) { + var r = []; + for (var i = 0; i < d.length; i++) { + r.push(_one(d[i])); + } + return r; + } + else if (isObject(d)) { + var s = {}; + for (var j in d) { + s[j] = _one(d[j]); + } + return s; + } + else { + return d; + } + } + }; + return _one(model); + } + jsPlumbUtil.populate = populate; + /** + * Find the index of a given object in an array. + * @param a The array to search + * @param f The function to run on each element. Return true if the element matches. + * @returns {number} -1 if not found, otherwise the index in the array. + */ + function findWithFunction(a, f) { + if (a) { + for (var i = 0; i < a.length; i++) { + if (f(a[i])) { + return i; + } + } + } + return -1; + } + jsPlumbUtil.findWithFunction = findWithFunction; + /** + * Remove some element from an array by matching each element in the array against some predicate function. Note that this + * is an in-place removal; the array is altered. + * @param a The array to search + * @param f The function to run on each element. Return true if the element matches. + * @returns {boolean} true if removed, false otherwise. + */ + function removeWithFunction(a, f) { + var idx = findWithFunction(a, f); + if (idx > -1) { + a.splice(idx, 1); + } + return idx !== -1; + } + jsPlumbUtil.removeWithFunction = removeWithFunction; + /** + * Remove some element from an array by simple lookup in the array for the given element. Note that this + * is an in-place removal; the array is altered. + * @param l The array to search + * @param v The value to remove. + * @returns {boolean} true if removed, false otherwise. + */ + function remove(l, v) { + var idx = l.indexOf(v); + if (idx > -1) { + l.splice(idx, 1); + } + return idx !== -1; + } + jsPlumbUtil.remove = remove; + /** + * Add some element to the given array, unless it is determined that it is already in the array. + * @param list The array to add the element to. + * @param item The item to add. + * @param hashFunction A function to use to determine if the given item already exists in the array. + */ + function addWithFunction(list, item, hashFunction) { + if (findWithFunction(list, hashFunction) === -1) { + list.push(item); + } + } + jsPlumbUtil.addWithFunction = addWithFunction; + /** + * Add some element to a list that is contained in a map of lists. + * @param map The map of [ key -> list ] entries + * @param key The name of the list to insert into + * @param value The value to insert + * @param insertAtStart Whether or not to insert at the start; defaults to false. + */ + function addToList(map, key, value, insertAtStart) { + var l = map[key]; + if (l == null) { + l = []; + map[key] = l; + } + l[insertAtStart ? "unshift" : "push"](value); + return l; + } + jsPlumbUtil.addToList = addToList; + /** + * Add an item to a list, unless it is already in the list. The test for pre-existence is a simple list lookup. + * If you want to do something more complex, perhaps #addWithFunction might help. + * @param list List to add the item to + * @param item Item to add + * @param insertAtHead Whether or not to insert at the start; defaults to false. + */ + function suggest(list, item, insertAtHead) { + if (list.indexOf(item) === -1) { + if (insertAtHead) { + list.unshift(item); + } + else { + list.push(item); + } + return true; + } + return false; + } + jsPlumbUtil.suggest = suggest; + /** + * Extends the given obj (which can be an array) with the given constructor function, prototype functions, and class members, any of which may be null. + * @param child + * @param parent + * @param _protoFn + */ + function extend(child, parent, _protoFn) { + var i; + parent = isArray(parent) ? parent : [parent]; + var _copyProtoChain = function (focus) { + var proto = focus.__proto__; + while (proto != null) { + if (proto.prototype != null) { + for (var j in proto.prototype) { + if (proto.prototype.hasOwnProperty(j) && !child.prototype.hasOwnProperty(j)) { + child.prototype[j] = proto.prototype[j]; + } + } + proto = proto.prototype.__proto__; + } + else { + proto = null; + } + } + }; + for (i = 0; i < parent.length; i++) { + for (var j in parent[i].prototype) { + if (parent[i].prototype.hasOwnProperty(j) && !child.prototype.hasOwnProperty(j)) { + child.prototype[j] = parent[i].prototype[j]; + } + } + _copyProtoChain(parent[i]); + } + var _makeFn = function (name, protoFn) { + return function () { + for (i = 0; i < parent.length; i++) { + if (parent[i].prototype[name]) { + parent[i].prototype[name].apply(this, arguments); + } + } + return protoFn.apply(this, arguments); + }; + }; + var _oneSet = function (fns) { + for (var k in fns) { + child.prototype[k] = _makeFn(k, fns[k]); + } + }; + if (arguments.length > 2) { + for (i = 2; i < arguments.length; i++) { + _oneSet(arguments[i]); + } + } + return child; + } + jsPlumbUtil.extend = extend; + /** + * Generate a UUID. + */ + // export function uuid(): string { + // return ('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + // let r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8); + // return v.toString(16); + // })); + // } + var lut = []; + for (var i = 0; i < 256; i++) { + lut[i] = (i < 16 ? '0' : '') + (i).toString(16); + } + function uuid() { + var d0 = Math.random() * 0xffffffff | 0; + var d1 = Math.random() * 0xffffffff | 0; + var d2 = Math.random() * 0xffffffff | 0; + var d3 = Math.random() * 0xffffffff | 0; + return lut[d0 & 0xff] + lut[d0 >> 8 & 0xff] + lut[d0 >> 16 & 0xff] + lut[d0 >> 24 & 0xff] + '-' + + lut[d1 & 0xff] + lut[d1 >> 8 & 0xff] + '-' + lut[d1 >> 16 & 0x0f | 0x40] + lut[d1 >> 24 & 0xff] + '-' + + lut[d2 & 0x3f | 0x80] + lut[d2 >> 8 & 0xff] + '-' + lut[d2 >> 16 & 0xff] + lut[d2 >> 24 & 0xff] + + lut[d3 & 0xff] + lut[d3 >> 8 & 0xff] + lut[d3 >> 16 & 0xff] + lut[d3 >> 24 & 0xff]; + } + jsPlumbUtil.uuid = uuid; + /** + * Trim a string. + * @param s String to trim + * @returns the String with leading and trailing whitespace removed. + */ + function fastTrim(s) { + if (s == null) { + return null; + } + var str = s.replace(/^\s\s*/, ''), ws = /\s/, i = str.length; + while (ws.test(str.charAt(--i))) { + } + return str.slice(0, i + 1); + } + jsPlumbUtil.fastTrim = fastTrim; + function each(obj, fn) { + obj = obj.length == null || typeof obj === "string" ? [obj] : obj; + for (var i = 0; i < obj.length; i++) { + fn(obj[i]); + } + } + jsPlumbUtil.each = each; + function map(obj, fn) { + var o = []; + for (var i = 0; i < obj.length; i++) { + o.push(fn(obj[i])); + } + return o; + } + jsPlumbUtil.map = map; + function mergeWithParents(type, map, parentAttribute) { + parentAttribute = parentAttribute || "parent"; + var _def = function (id) { + return id ? map[id] : null; + }; + var _parent = function (def) { + return def ? _def(def[parentAttribute]) : null; + }; + var _one = function (parent, def) { + if (parent == null) { + return def; + } + else { + var overrides = ["anchor", "anchors", "cssClass", "connector", "paintStyle", "hoverPaintStyle", "endpoint", "endpoints"]; + if (def.mergeStrategy === "override") { + Array.prototype.push.apply(overrides, ["events", "overlays"]); + } + var d_1 = merge(parent, def, [], overrides); + return _one(_parent(parent), d_1); + } + }; + var _getDef = function (t) { + if (t == null) { + return {}; + } + if (typeof t === "string") { + return _def(t); + } + else if (t.length) { + var done = false, i = 0, _dd = void 0; + while (!done && i < t.length) { + _dd = _getDef(t[i]); + if (_dd) { + done = true; + } + else { + i++; + } + } + return _dd; + } + }; + var d = _getDef(type); + if (d) { + return _one(_parent(d), d); + } + else { + return {}; + } + } + jsPlumbUtil.mergeWithParents = mergeWithParents; + jsPlumbUtil.logEnabled = true; + function log() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (jsPlumbUtil.logEnabled && typeof console !== "undefined") { + try { + var msg = arguments[arguments.length - 1]; + console.log(msg); + } + catch (e) { + } + } + } + jsPlumbUtil.log = log; + /** + * Wraps one function with another, creating a placeholder for the + * wrapped function if it was null. this is used to wrap the various + * drag/drop event functions - to allow jsPlumb to be notified of + * important lifecycle events without imposing itself on the user's + * drag/drop functionality. + * @method jsPlumbUtil.wrap + * @param {Function} wrappedFunction original function to wrap; may be null. + * @param {Function} newFunction function to wrap the original with. + * @param {Object} [returnOnThisValue] Optional. Indicates that the wrappedFunction should + * not be executed if the newFunction returns a value matching 'returnOnThisValue'. + * note that this is a simple comparison and only works for primitives right now. + */ + function wrap(wrappedFunction, newFunction, returnOnThisValue) { + return function () { + var r = null; + try { + if (newFunction != null) { + r = newFunction.apply(this, arguments); + } + } + catch (e) { + log("jsPlumb function failed : " + e); + } + if ((wrappedFunction != null) && (returnOnThisValue == null || (r !== returnOnThisValue))) { + try { + r = wrappedFunction.apply(this, arguments); + } + catch (e) { + log("wrapped function failed : " + e); + } + } + return r; + }; + } + jsPlumbUtil.wrap = wrap; + var EventGenerator = /** @class */ (function () { + function EventGenerator() { + var _this = this; + this._listeners = {}; + this.eventsSuspended = false; + this.tick = false; + // this is a list of events that should re-throw any errors that occur during their dispatch. + this.eventsToDieOn = { "ready": true }; + this.queue = []; + this.bind = function (event, listener, insertAtStart) { + var _one = function (evt) { + addToList(_this._listeners, evt, listener, insertAtStart); + listener.__jsPlumb = listener.__jsPlumb || {}; + listener.__jsPlumb[uuid()] = evt; + }; + if (typeof event === "string") { + _one(event); + } + else if (event.length != null) { + for (var i = 0; i < event.length; i++) { + _one(event[i]); + } + } + return _this; + }; + this.fire = function (event, value, originalEvent) { + if (!this.tick) { + this.tick = true; + if (!this.eventsSuspended && this._listeners[event]) { + var l = this._listeners[event].length, i = 0, _gone = false, ret = null; + if (!this.shouldFireEvent || this.shouldFireEvent(event, value, originalEvent)) { + while (!_gone && i < l && ret !== false) { + // doing it this way rather than catching and then possibly re-throwing means that an error propagated by this + // method will have the whole call stack available in the debugger. + if (this.eventsToDieOn[event]) { + this._listeners[event][i].apply(this, [value, originalEvent]); + } + else { + try { + ret = this._listeners[event][i].apply(this, [value, originalEvent]); + } + catch (e) { + log("jsPlumb: fire failed for event " + event + " : " + e); + } + } + i++; + if (this._listeners == null || this._listeners[event] == null) { + _gone = true; + } + } + } + } + this.tick = false; + this._drain(); + } + else { + this.queue.unshift(arguments); + } + return this; + }; + this._drain = function () { + var n = _this.queue.pop(); + if (n) { + _this.fire.apply(_this, n); + } + }; + this.unbind = function (eventOrListener, listener) { + if (arguments.length === 0) { + this._listeners = {}; + } + else if (arguments.length === 1) { + if (typeof eventOrListener === "string") { + delete this._listeners[eventOrListener]; + } + else if (eventOrListener.__jsPlumb) { + var evt = void 0; + for (var i in eventOrListener.__jsPlumb) { + evt = eventOrListener.__jsPlumb[i]; + remove(this._listeners[evt] || [], eventOrListener); + } + } + } + else if (arguments.length === 2) { + remove(this._listeners[eventOrListener] || [], listener); + } + return this; + }; + this.getListener = function (forEvent) { + return _this._listeners[forEvent]; + }; + this.setSuspendEvents = function (val) { + _this.eventsSuspended = val; + }; + this.isSuspendEvents = function () { + return _this.eventsSuspended; + }; + this.silently = function (fn) { + _this.setSuspendEvents(true); + try { + fn(); + } + catch (e) { + log("Cannot execute silent function " + e); + } + _this.setSuspendEvents(false); + }; + this.cleanupListeners = function () { + for (var i in _this._listeners) { + _this._listeners[i] = null; + } + }; + } + return EventGenerator; + }()); + jsPlumbUtil.EventGenerator = EventGenerator; + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains utility functions that run in browsers only. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ + ;(function() { + + "use strict"; + + var root = this; + + root.jsPlumbUtil.matchesSelector = function(el, selector, ctx) { + ctx = ctx || el.parentNode; + var possibles = ctx.querySelectorAll(selector); + for (var i = 0; i < possibles.length; i++) { + if (possibles[i] === el) { + return true; + } + } + return false; + }; + + root.jsPlumbUtil.consume = function(e, doNotPreventDefault) { + if (e.stopPropagation) { + e.stopPropagation(); + } + else { + e.returnValue = false; + } + + if (!doNotPreventDefault && e.preventDefault){ + e.preventDefault(); + } + }; + + /* + * Function: sizeElement + * Helper to size and position an element. You would typically use + * this when writing your own Connector or Endpoint implementation. + * + * Parameters: + * x - [int] x position for the element origin + * y - [int] y position for the element origin + * w - [int] width of the element + * h - [int] height of the element + * + */ + root.jsPlumbUtil.sizeElement = function(el, x, y, w, h) { + if (el) { + el.style.height = h + "px"; + el.height = h; + el.style.width = w + "px"; + el.width = w; + el.style.left = x + "px"; + el.style.top = y + "px"; + } + }; + + }).call(typeof window !== 'undefined' ? window : this); + +;(function() { + + var DEFAULT_OPTIONS = { + deriveAnchor:function(edge, index, ep, conn) { + return { + top:["TopRight", "TopLeft"], + bottom:["BottomRight", "BottomLeft"] + }[edge][index]; + } + }; + + var root = this; + + var ListManager = function(jsPlumbInstance, params) { + + this.count = 0; + this.instance = jsPlumbInstance; + this.lists = {}; + this.options = params || {}; + + this.instance.addList = function(el, options) { + return this.listManager.addList(el, options); + }; + + this.instance.removeList = function(el) { + this.listManager.removeList(el); + }; + + this.instance.bind("manageElement", function(p) { + + //look for [jtk-scrollable-list] elements and attach scroll listeners if necessary + var scrollableLists = this.instance.getSelector(p.el, "[jtk-scrollable-list]"); + for (var i = 0; i < scrollableLists.length; i++) { + this.addList(scrollableLists[i]); + } + + }.bind(this)); + + this.instance.bind("unmanageElement", function(p) { + this.removeList(p.el); + }); + + + this.instance.bind("connection", function(c, evt) { + if (evt == null) { + // not added by mouse. look for an ancestor of the source and/or target element that is a scrollable list, and run + // its scroll method. + this._maybeUpdateParentList(c.source); + this._maybeUpdateParentList(c.target); + } + }.bind(this)); + }; + + root.jsPlumbListManager = ListManager; + + ListManager.prototype = { + + addList : function(el, options) { + var dp = this.instance.extend({}, DEFAULT_OPTIONS); + this.instance.extend(dp, this.options); + options = this.instance.extend(dp, options || {}); + var id = [this.instance.getInstanceIndex(), this.count++].join("_"); + this.lists[id] = new List(this.instance, el, options, id); + }, + + removeList:function(el) { + var list = this.lists[el._jsPlumbList]; + if (list) { + list.destroy(); + delete this.lists[el._jsPlumbList]; + } + }, + + _maybeUpdateParentList:function (el) { + var parent = el.parentNode, container = this.instance.getContainer(); + while(parent != null && parent !== container) { + if (parent._jsPlumbList != null && this.lists[parent._jsPlumbList] != null) { + parent._jsPlumbScrollHandler(); + return + } + parent = parent.parentNode; + } + } + + + }; + + var List = function(instance, el, options, id) { + + el["_jsPlumbList"] = id; + + // + // Derive an anchor to use for the current situation. In contrast to the way we derive an endpoint, here we use `anchor` from the options, if present, as + // our first choice, and then `deriveAnchor` as our next choice. There is a default `deriveAnchor` implementation that uses TopRight/TopLeft for top and + // BottomRight/BottomLeft for bottom. + // + // edge - "top" or "bottom" + // index - 0 when endpoint is connection source, 1 when endpoint is connection target + // ep - the endpoint that is being proxied + // conn - the connection that is being proxied + // + function deriveAnchor(edge, index, ep, conn) { + return options.anchor ? options.anchor : options.deriveAnchor(edge, index, ep, conn); + } + + // + // Derive an endpoint to use for the current situation. We'll use a `deriveEndpoint` function passed in to the options as our first choice, + // followed by `endpoint` (an endpoint spec) from the options, and failing either of those we just use the `type` of the endpoint that is being proxied. + // + // edge - "top" or "bottom" + // index - 0 when endpoint is connection source, 1 when endpoint is connection target + // endpoint - the endpoint that is being proxied + // connection - the connection that is being proxied + // + function deriveEndpoint(edge, index, ep, conn) { + return options.deriveEndpoint ? options.deriveEndpoint(edge, index, ep, conn) : options.endpoint ? options.endpoint : ep.type; + } + + // + // look for a parent of the given scrollable list that is draggable, and then update the child offsets for it. this should not + // be necessary in the delegated drag stuff from the upcoming 3.0.0 release. + // + function _maybeUpdateDraggable(el) { + var parent = el.parentNode, container = instance.getContainer(); + while(parent != null && parent !== container) { + if (instance.hasClass(parent, "jtk-managed")) { + instance.recalculateOffsets(parent); + return + } + parent = parent.parentNode; + } + } + + var scrollHandler = function(e) { + + var children = instance.getSelector(el, ".jtk-managed"); + var elId = instance.getId(el); + + for (var i = 0; i < children.length; i++) { + + if (children[i].offsetTop < el.scrollTop) { + if (!children[i]._jsPlumbProxies) { + children[i]._jsPlumbProxies = children[i]._jsPlumbProxies || []; + instance.select({source: children[i]}).each(function (c) { + + + instance.proxyConnection(c, 0, el, elId, function () { + return deriveEndpoint("top", 0, c.endpoints[0], c); + }, function () { + return deriveAnchor("top", 0, c.endpoints[0], c); + }); + children[i]._jsPlumbProxies.push([c, 0]); + }); + + instance.select({target: children[i]}).each(function (c) { + instance.proxyConnection(c, 1, el, elId, function () { + return deriveEndpoint("top", 1, c.endpoints[1], c); + }, function () { + return deriveAnchor("top", 1, c.endpoints[1], c); + }); + children[i]._jsPlumbProxies.push([c, 1]); + }); + } + } + // + else if (children[i].offsetTop + children[i].offsetHeight > el.scrollTop + el.offsetHeight) { + if (!children[i]._jsPlumbProxies) { + children[i]._jsPlumbProxies = children[i]._jsPlumbProxies || []; + + instance.select({source: children[i]}).each(function (c) { + instance.proxyConnection(c, 0, el, elId, function () { + return deriveEndpoint("bottom", 0, c.endpoints[0], c); + }, function () { + return deriveAnchor("bottom", 0, c.endpoints[0], c); + }); + children[i]._jsPlumbProxies.push([c, 0]); + }); + + instance.select({target: children[i]}).each(function (c) { + instance.proxyConnection(c, 1, el, elId, function () { + return deriveEndpoint("bottom", 1, c.endpoints[1], c); + }, function () { + return deriveAnchor("bottom", 1, c.endpoints[1], c); + }); + children[i]._jsPlumbProxies.push([c, 1]); + }); + } + } else if (children[i]._jsPlumbProxies) { + for (var j = 0; j < children[i]._jsPlumbProxies.length; j++) { + instance.unproxyConnection(children[i]._jsPlumbProxies[j][0], children[i]._jsPlumbProxies[j][1], elId); + } + + delete children[i]._jsPlumbProxies; + } + + instance.revalidate(children[i]); + } + + _maybeUpdateDraggable(el); + }; + + instance.setAttribute(el, "jtk-scrollable-list", "true"); + el._jsPlumbScrollHandler = scrollHandler; + instance.on(el, "scroll", scrollHandler); + scrollHandler(); // run it once; there may be connections already. + + this.destroy = function() { + instance.off(el, "scroll", scrollHandler); + delete el._jsPlumbScrollHandler; + + var children = instance.getSelector(el, ".jtk-managed"); + var elId = instance.getId(el); + + for (var i = 0; i < children.length; i++) { + if (children[i]._jsPlumbProxies) { + for (var j = 0; j < children[i]._jsPlumbProxies.length; j++) { + instance.unproxyConnection(children[i]._jsPlumbProxies[j][0], children[i]._jsPlumbProxies[j][1], elId); + } + + delete children[i]._jsPlumbProxies; + } + } + }; + }; + + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the core code. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function () { + + "use strict"; + + var root = this; + + var _ju = root.jsPlumbUtil, + + /** + * creates a timestamp, using milliseconds since 1970, but as a string. + */ + _timestamp = function () { + return "" + (new Date()).getTime(); + }, + + // helper method to update the hover style whenever it, or paintStyle, changes. + // we use paintStyle as the foundation and merge hoverPaintStyle over the + // top. + _updateHoverStyle = function (component) { + if (component._jsPlumb.paintStyle && component._jsPlumb.hoverPaintStyle) { + var mergedHoverStyle = {}; + jsPlumb.extend(mergedHoverStyle, component._jsPlumb.paintStyle); + jsPlumb.extend(mergedHoverStyle, component._jsPlumb.hoverPaintStyle); + delete component._jsPlumb.hoverPaintStyle; + // we want the fill of paintStyle to override a gradient, if possible. + if (mergedHoverStyle.gradient && component._jsPlumb.paintStyle.fill) { + delete mergedHoverStyle.gradient; + } + component._jsPlumb.hoverPaintStyle = mergedHoverStyle; + } + }, + events = ["tap", "dbltap", "click", "dblclick", "mouseover", "mouseout", "mousemove", "mousedown", "mouseup", "contextmenu" ], + eventFilters = { "mouseout": "mouseleave", "mouseexit": "mouseleave" }, + _updateAttachedElements = function (component, state, timestamp, sourceElement) { + var affectedElements = component.getAttachedElements(); + if (affectedElements) { + for (var i = 0, j = affectedElements.length; i < j; i++) { + if (!sourceElement || sourceElement !== affectedElements[i]) { + affectedElements[i].setHover(state, true, timestamp); // tell the attached elements not to inform their own attached elements. + } + } + } + }, + _splitType = function (t) { + return t == null ? null : t.split(" "); + }, + _mapType = function(map, obj, typeId) { + for (var i in obj) { + map[i] = typeId; + } + }, + _each = function(fn, obj) { + obj = _ju.isArray(obj) || (obj.length != null && !_ju.isString(obj)) ? obj : [ obj ]; + for (var i = 0; i < obj.length; i++) { + try { + fn.apply(obj[i], [ obj[i] ]); + } + catch (e) { + _ju.log(".each iteration failed : " + e); + } + } + }, + _applyTypes = function (component, params, doNotRepaint) { + if (component.getDefaultType) { + var td = component.getTypeDescriptor(), map = {}; + var defType = component.getDefaultType(); + var o = _ju.merge({}, defType); + _mapType(map, defType, "__default"); + for (var i = 0, j = component._jsPlumb.types.length; i < j; i++) { + var tid = component._jsPlumb.types[i]; + if (tid !== "__default") { + var _t = component._jsPlumb.instance.getType(tid, td); + if (_t != null) { + + var overrides = ["anchor", "anchors", "connector", "paintStyle", "hoverPaintStyle", "endpoint", "endpoints", "connectorOverlays", "connectorStyle", "connectorHoverStyle", "endpointStyle", "endpointHoverStyle"]; + var collations = [ ]; + + if (_t.mergeStrategy === "override") { + Array.prototype.push.apply(overrides, ["events", "overlays", "cssClass"]); + } else { + collations.push("cssClass"); + } + + o = _ju.merge(o, _t, collations, overrides); + _mapType(map, _t, tid); + } + } + } + + if (params) { + o = _ju.populate(o, params, "_"); + } + + component.applyType(o, doNotRepaint, map); + if (!doNotRepaint) { + component.repaint(); + } + } + }, + +// ------------------------------ BEGIN jsPlumbUIComponent -------------------------------------------- + + jsPlumbUIComponent = root.jsPlumbUIComponent = function (params) { + + _ju.EventGenerator.apply(this, arguments); + + var self = this, + a = arguments, + idPrefix = self.idPrefix, + id = idPrefix + (new Date()).getTime(); + + this._jsPlumb = { + instance: params._jsPlumb, + parameters: params.parameters || {}, + paintStyle: null, + hoverPaintStyle: null, + paintStyleInUse: null, + hover: false, + beforeDetach: params.beforeDetach, + beforeDrop: params.beforeDrop, + overlayPlacements: [], + hoverClass: params.hoverClass || params._jsPlumb.Defaults.HoverClass, + types: [], + typeCache:{} + }; + + this.cacheTypeItem = function(key, item, typeId) { + this._jsPlumb.typeCache[typeId] = this._jsPlumb.typeCache[typeId] || {}; + this._jsPlumb.typeCache[typeId][key] = item; + }; + this.getCachedTypeItem = function(key, typeId) { + return this._jsPlumb.typeCache[typeId] ? this._jsPlumb.typeCache[typeId][key] : null; + }; + + this.getId = function () { + return id; + }; + +// ----------------------------- default type -------------------------------------------- + + + var o = params.overlays || [], oo = {}; + if (this.defaultOverlayKeys) { + for (var i = 0; i < this.defaultOverlayKeys.length; i++) { + Array.prototype.push.apply(o, this._jsPlumb.instance.Defaults[this.defaultOverlayKeys[i]] || []); + } + + for (i = 0; i < o.length; i++) { + // if a string, convert to object representation so that we can store the typeid on it. + // also assign an id. + var fo = jsPlumb.convertToFullOverlaySpec(o[i]); + oo[fo[1].id] = fo; + } + } + + var _defaultType = { + overlays:oo, + parameters: params.parameters || {}, + scope: params.scope || this._jsPlumb.instance.getDefaultScope() + }; + this.getDefaultType = function() { + return _defaultType; + }; + this.appendToDefaultType = function(obj) { + for (var i in obj) { + _defaultType[i] = obj[i]; + } + }; + +// ----------------------------- end default type -------------------------------------------- + + // all components can generate events + + if (params.events) { + for (var evtName in params.events) { + self.bind(evtName, params.events[evtName]); + } + } + + // all components get this clone function. + // TODO issue 116 showed a problem with this - it seems 'a' that is in + // the clone function's scope is shared by all invocations of it, the classic + // JS closure problem. for now, jsPlumb does a version of this inline where + // it used to call clone. but it would be nice to find some time to look + // further at this. + this.clone = function () { + var o = Object.create(this.constructor.prototype); + this.constructor.apply(o, a); + return o; + }.bind(this); + + // user can supply a beforeDetach callback, which will be executed before a detach + // is performed; returning false prevents the detach. + this.isDetachAllowed = function (connection) { + var r = true; + if (this._jsPlumb.beforeDetach) { + try { + r = this._jsPlumb.beforeDetach(connection); + } + catch (e) { + _ju.log("jsPlumb: beforeDetach callback failed", e); + } + } + return r; + }; + + // user can supply a beforeDrop callback, which will be executed before a dropped + // connection is confirmed. user can return false to reject connection. + this.isDropAllowed = function (sourceId, targetId, scope, connection, dropEndpoint, source, target) { + var r = this._jsPlumb.instance.checkCondition("beforeDrop", { + sourceId: sourceId, + targetId: targetId, + scope: scope, + connection: connection, + dropEndpoint: dropEndpoint, + source: source, target: target + }); + if (this._jsPlumb.beforeDrop) { + try { + r = this._jsPlumb.beforeDrop({ + sourceId: sourceId, + targetId: targetId, + scope: scope, + connection: connection, + dropEndpoint: dropEndpoint, + source: source, target: target + }); + } + catch (e) { + _ju.log("jsPlumb: beforeDrop callback failed", e); + } + } + return r; + }; + + var domListeners = []; + + // sets the component associated with listener events. for instance, an overlay delegates + // its events back to a connector. but if the connector is swapped on the underlying connection, + // then this component must be changed. This is called by setConnector in the Connection class. + this.setListenerComponent = function (c) { + for (var i = 0; i < domListeners.length; i++) { + domListeners[i][3] = c; + } + }; + + + }; + + var _removeTypeCssHelper = function (component, typeIndex) { + var typeId = component._jsPlumb.types[typeIndex], + type = component._jsPlumb.instance.getType(typeId, component.getTypeDescriptor()); + + if (type != null && type.cssClass && component.canvas) { + component._jsPlumb.instance.removeClass(component.canvas, type.cssClass); + } + }; + + _ju.extend(root.jsPlumbUIComponent, _ju.EventGenerator, { + + getParameter: function (name) { + return this._jsPlumb.parameters[name]; + }, + + setParameter: function (name, value) { + this._jsPlumb.parameters[name] = value; + }, + + getParameters: function () { + return this._jsPlumb.parameters; + }, + + setParameters: function (p) { + this._jsPlumb.parameters = p; + }, + + getClass:function() { + return jsPlumb.getClass(this.canvas); + }, + + hasClass:function(clazz) { + return jsPlumb.hasClass(this.canvas, clazz); + }, + + addClass: function (clazz) { + jsPlumb.addClass(this.canvas, clazz); + }, + + removeClass: function (clazz) { + jsPlumb.removeClass(this.canvas, clazz); + }, + + updateClasses: function (classesToAdd, classesToRemove) { + jsPlumb.updateClasses(this.canvas, classesToAdd, classesToRemove); + }, + + setType: function (typeId, params, doNotRepaint) { + this.clearTypes(); + this._jsPlumb.types = _splitType(typeId) || []; + _applyTypes(this, params, doNotRepaint); + }, + + getType: function () { + return this._jsPlumb.types; + }, + + reapplyTypes: function (params, doNotRepaint) { + _applyTypes(this, params, doNotRepaint); + }, + + hasType: function (typeId) { + return this._jsPlumb.types.indexOf(typeId) !== -1; + }, + + addType: function (typeId, params, doNotRepaint) { + var t = _splitType(typeId), _cont = false; + if (t != null) { + for (var i = 0, j = t.length; i < j; i++) { + if (!this.hasType(t[i])) { + this._jsPlumb.types.push(t[i]); + _cont = true; + } + } + if (_cont) { + _applyTypes(this, params, doNotRepaint); + } + } + }, + + removeType: function (typeId, params, doNotRepaint) { + var t = _splitType(typeId), _cont = false, _one = function (tt) { + var idx = this._jsPlumb.types.indexOf(tt); + if (idx !== -1) { + // remove css class if necessary + _removeTypeCssHelper(this, idx); + this._jsPlumb.types.splice(idx, 1); + return true; + } + return false; + }.bind(this); + + if (t != null) { + for (var i = 0, j = t.length; i < j; i++) { + _cont = _one(t[i]) || _cont; + } + if (_cont) { + _applyTypes(this, params, doNotRepaint); + } + } + }, + clearTypes: function (params, doNotRepaint) { + var i = this._jsPlumb.types.length; + for (var j = 0; j < i; j++) { + _removeTypeCssHelper(this, 0); + this._jsPlumb.types.splice(0, 1); + } + _applyTypes(this, params, doNotRepaint); + }, + + toggleType: function (typeId, params, doNotRepaint) { + var t = _splitType(typeId); + if (t != null) { + for (var i = 0, j = t.length; i < j; i++) { + var idx = this._jsPlumb.types.indexOf(t[i]); + if (idx !== -1) { + _removeTypeCssHelper(this, idx); + this._jsPlumb.types.splice(idx, 1); + } + else { + this._jsPlumb.types.push(t[i]); + } + } + + _applyTypes(this, params, doNotRepaint); + } + }, + applyType: function (t, doNotRepaint) { + this.setPaintStyle(t.paintStyle, doNotRepaint); + this.setHoverPaintStyle(t.hoverPaintStyle, doNotRepaint); + if (t.parameters) { + for (var i in t.parameters) { + this.setParameter(i, t.parameters[i]); + } + } + this._jsPlumb.paintStyleInUse = this.getPaintStyle(); + }, + setPaintStyle: function (style, doNotRepaint) { + // this._jsPlumb.paintStyle = jsPlumb.extend({}, style); + // TODO figure out if we want components to clone paintStyle so as not to share it. + this._jsPlumb.paintStyle = style; + this._jsPlumb.paintStyleInUse = this._jsPlumb.paintStyle; + _updateHoverStyle(this); + if (!doNotRepaint) { + this.repaint(); + } + }, + getPaintStyle: function () { + return this._jsPlumb.paintStyle; + }, + setHoverPaintStyle: function (style, doNotRepaint) { + //this._jsPlumb.hoverPaintStyle = jsPlumb.extend({}, style); + // TODO figure out if we want components to clone paintStyle so as not to share it. + this._jsPlumb.hoverPaintStyle = style; + _updateHoverStyle(this); + if (!doNotRepaint) { + this.repaint(); + } + }, + getHoverPaintStyle: function () { + return this._jsPlumb.hoverPaintStyle; + }, + destroy: function (force) { + if (force || this.typeId == null) { + this.cleanupListeners(); // this is on EventGenerator + this.clone = null; + this._jsPlumb = null; + } + }, + + isHover: function () { + return this._jsPlumb.hover; + }, + + setHover: function (hover, ignoreAttachedElements, timestamp) { + // while dragging, we ignore these events. this keeps the UI from flashing and + // swishing and whatevering. + if (this._jsPlumb && !this._jsPlumb.instance.currentlyDragging && !this._jsPlumb.instance.isHoverSuspended()) { + + this._jsPlumb.hover = hover; + var method = hover ? "addClass" : "removeClass"; + + if (this.canvas != null) { + if (this._jsPlumb.instance.hoverClass != null) { + this._jsPlumb.instance[method](this.canvas, this._jsPlumb.instance.hoverClass); + } + if (this._jsPlumb.hoverClass != null) { + this._jsPlumb.instance[method](this.canvas, this._jsPlumb.hoverClass); + } + } + if (this._jsPlumb.hoverPaintStyle != null) { + this._jsPlumb.paintStyleInUse = hover ? this._jsPlumb.hoverPaintStyle : this._jsPlumb.paintStyle; + if (!this._jsPlumb.instance.isSuspendDrawing()) { + timestamp = timestamp || _timestamp(); + this.repaint({timestamp: timestamp, recalc: false}); + } + } + // get the list of other affected elements, if supported by this component. + // for a connection, its the endpoints. for an endpoint, its the connections! surprise. + if (this.getAttachedElements && !ignoreAttachedElements) { + _updateAttachedElements(this, hover, _timestamp(), this); + } + } + } + }); + +// ------------------------------ END jsPlumbUIComponent -------------------------------------------- + + var _jsPlumbInstanceIndex = 0, + getInstanceIndex = function () { + var i = _jsPlumbInstanceIndex + 1; + _jsPlumbInstanceIndex++; + return i; + }; + + var jsPlumbInstance = root.jsPlumbInstance = function (_defaults) { + + this.version = "2.13.2"; + + this.Defaults = { + Anchor: "Bottom", + Anchors: [ null, null ], + ConnectionsDetachable: true, + ConnectionOverlays: [ ], + Connector: "Bezier", + Container: null, + DoNotThrowErrors: false, + DragOptions: { }, + DropOptions: { }, + Endpoint: "Dot", + EndpointOverlays: [ ], + Endpoints: [ null, null ], + EndpointStyle: { fill: "#456" }, + EndpointStyles: [ null, null ], + EndpointHoverStyle: null, + EndpointHoverStyles: [ null, null ], + HoverPaintStyle: null, + LabelStyle: { color: "black" }, + ListStyle: { }, + LogEnabled: false, + Overlays: [ ], + MaxConnections: 1, + PaintStyle: { "stroke-width": 4, stroke: "#456" }, + ReattachConnections: false, + RenderMode: "svg", + Scope: "jsPlumb_DefaultScope" + }; + + if (_defaults) { + jsPlumb.extend(this.Defaults, _defaults); + } + + this.logEnabled = this.Defaults.LogEnabled; + this._connectionTypes = {}; + this._endpointTypes = {}; + + _ju.EventGenerator.apply(this); + + var _currentInstance = this, + _instanceIndex = getInstanceIndex(), + _bb = _currentInstance.bind, + _initialDefaults = {}, + _zoom = 1, + _info = function (el) { + if (el == null) { + return null; + } + else if (el.nodeType === 3 || el.nodeType === 8) { + return { el:el, text:true }; + } + else { + var _el = _currentInstance.getElement(el); + return { el: _el, id: (_ju.isString(el) && _el == null) ? el : _getId(_el) }; + } + }; + + this.getInstanceIndex = function () { + return _instanceIndex; + }; + + // CONVERTED + this.setZoom = function (z, repaintEverything) { + _zoom = z; + _currentInstance.fire("zoom", _zoom); + if (repaintEverything) { + _currentInstance.repaintEverything(); + } + return true; + }; + // CONVERTED + this.getZoom = function () { + return _zoom; + }; + + for (var i in this.Defaults) { + _initialDefaults[i] = this.Defaults[i]; + } + + var _container, _containerDelegations = []; + this.unbindContainer = function() { + if (_container != null && _containerDelegations.length > 0) { + for (var i = 0; i < _containerDelegations.length; i++) { + _currentInstance.off(_container, _containerDelegations[i][0], _containerDelegations[i][1]); + } + } + }; + this.setContainer = function (c) { + + this.unbindContainer(); + + // get container as dom element. + c = this.getElement(c); + // move existing connections and endpoints, if any. + this.select().each(function (conn) { + conn.moveParent(c); + }); + this.selectEndpoints().each(function (ep) { + ep.moveParent(c); + }); + + // set container. + var previousContainer = _container; + _container = c; + _containerDelegations.length = 0; + var eventAliases = { + "endpointclick":"endpointClick", + "endpointdblclick":"endpointDblClick" + }; + + var _oneDelegateHandler = function (id, e, componentType) { + var t = e.srcElement || e.target, + jp = (t && t.parentNode ? t.parentNode._jsPlumb : null) || (t ? t._jsPlumb : null) || (t && t.parentNode && t.parentNode.parentNode ? t.parentNode.parentNode._jsPlumb : null); + if (jp) { + jp.fire(id, jp, e); + var alias = componentType ? eventAliases[componentType + id] || id : id; + // jsplumb also fires every event coming from components/overlays. That's what the test for `jp.component` is for. + _currentInstance.fire(alias, jp.component || jp, e); + } + }; + + var _addOneDelegate = function(eventId, selector, fn) { + _containerDelegations.push([eventId, fn]); + _currentInstance.on(_container, eventId, selector, fn); + }; + + // delegate one event on the container to jsplumb elements. it might be possible to + // abstract this out: each of endpoint, connection and overlay could register themselves with + // jsplumb as "component types" or whatever, and provide a suitable selector. this would be + // done by the renderer (although admittedly from 2.0 onwards we're not supporting vml anymore) + var _oneDelegate = function (id) { + // connections. + _addOneDelegate(id, ".jtk-connector", function (e) { + _oneDelegateHandler(id, e); + }); + // endpoints. note they can have an enclosing div, or not. + _addOneDelegate(id, ".jtk-endpoint", function (e) { + _oneDelegateHandler(id, e, "endpoint"); + }); + // overlays + _addOneDelegate(id, ".jtk-overlay", function (e) { + _oneDelegateHandler(id, e); + }); + }; + + for (var i = 0; i < events.length; i++) { + _oneDelegate(events[i]); + } + + // managed elements + for (var elId in managedElements) { + var el = managedElements[elId].el; + if (el.parentNode === previousContainer) { + previousContainer.removeChild(el); + _container.appendChild(el); + } + } + + }; + this.getContainer = function () { + return _container; + }; + + this.bind = function (event, fn) { + if ("ready" === event && initialized) { + fn(); + } + else { + _bb.apply(_currentInstance, [event, fn]); + } + }; + + _currentInstance.importDefaults = function (d) { + for (var i in d) { + _currentInstance.Defaults[i] = d[i]; + } + if (d.Container) { + _currentInstance.setContainer(d.Container); + } + + return _currentInstance; + }; + + _currentInstance.restoreDefaults = function () { + _currentInstance.Defaults = jsPlumb.extend({}, _initialDefaults); + return _currentInstance; + }; + + var log = null, + initialized = false, + // TODO remove from window scope + connections = [], + // map of element id -> endpoint lists. an element can have an arbitrary + // number of endpoints on it, and not all of them have to be connected + // to anything. + endpointsByElement = {}, + endpointsByUUID = {}, + managedElements = {}, + offsets = {}, + offsetTimestamps = {}, + draggableStates = {}, + connectionBeingDragged = false, + sizes = [], + _suspendDrawing = false, + _suspendedAt = null, + DEFAULT_SCOPE = this.Defaults.Scope, + _curIdStamp = 1, + _idstamp = function () { + return "" + _curIdStamp++; + }, + + // + // appends an element to some other element, which is calculated as follows: + // + // 1. if Container exists, use that element. + // 2. if the 'parent' parameter exists, use that. + // 3. otherwise just use the root element. + // + // + _appendElement = function (el, parent) { + if (_container) { + _container.appendChild(el); + } + else if (!parent) { + this.appendToRoot(el); + } + else { + this.getElement(parent).appendChild(el); + } + }.bind(this), + + // + // Draws an endpoint and its connections. this is the main entry point into drawing connections as well + // as endpoints, since jsPlumb is endpoint-centric under the hood. + // + // @param element element to draw (of type library specific element object) + // @param ui UI object from current library's event system. optional. + // @param timestamp timestamp for this paint cycle. used to speed things up a little by cutting down the amount of offset calculations we do. + // @param clearEdits defaults to false; indicates that mouse edits for connectors should be cleared + /// + _draw = function (element, ui, timestamp, clearEdits) { + + if (!_suspendDrawing) { + + element = _currentInstance.getElement(element); + + if (element != null) { + + var id = _getId(element), + repaintEls = element.querySelectorAll(".jtk-managed"); + + if (timestamp == null) { + timestamp = _timestamp(); + } + + // update the offset of everything _before_ we try to draw anything. + var o = _updateOffset({elId: id, offset: ui, recalc: false, timestamp: timestamp}); + + for (var i = 0; i < repaintEls.length; i++) { + _updateOffset({ + elId: repaintEls[i].getAttribute("id"), + // offset: { + // left: o.o.left + repaintEls[i].offset.left, + // top: o.o.top + repaintEls[i].offset.top + // }, + recalc: true, + timestamp: timestamp + }); + } + + _currentInstance.anchorManager.redraw(id, ui, timestamp, null, clearEdits); + + if (repaintEls) { + for (var j = 0; j < repaintEls.length; j++) { + _currentInstance.anchorManager.redraw(repaintEls[j].getAttribute("id"), null, timestamp, null, clearEdits, true); + } + } + } + } + }, + + // + // gets an Endpoint by uuid. + // + _getEndpoint = function (uuid) { + return endpointsByUUID[uuid]; + }, + + /** + * inits a draggable if it's not already initialised. + * TODO: somehow abstract this to the adapter, because the concept of "draggable" has no + * place on the server. + */ + + + _scopeMatch = function (e1, e2) { + var s1 = e1.scope.split(/\s/), s2 = e2.scope.split(/\s/); + for (var i = 0; i < s1.length; i++) { + for (var j = 0; j < s2.length; j++) { + if (s2[j] === s1[i]) { + return true; + } + } + } + + return false; + }, + + _mergeOverrides = function (def, values) { + var m = jsPlumb.extend({}, def); + for (var i in values) { + if (values[i]) { + m[i] = values[i]; + } + } + return m; + }, + + /* + * prepares a final params object that can be passed to _newConnection, taking into account defaults, events, etc. + */ + _prepareConnectionParams = function (params, referenceParams) { + var _p = jsPlumb.extend({ }, params); + if (referenceParams) { + jsPlumb.extend(_p, referenceParams); + } + + // hotwire endpoints passed as source or target to sourceEndpoint/targetEndpoint, respectively. + if (_p.source) { + if (_p.source.endpoint) { + _p.sourceEndpoint = _p.source; + } + else { + _p.source = _currentInstance.getElement(_p.source); + } + } + if (_p.target) { + if (_p.target.endpoint) { + _p.targetEndpoint = _p.target; + } + else { + _p.target = _currentInstance.getElement(_p.target); + } + } + + // test for endpoint uuids to connect + if (params.uuids) { + _p.sourceEndpoint = _getEndpoint(params.uuids[0]); + _p.targetEndpoint = _getEndpoint(params.uuids[1]); + } + + // now ensure that if we do have Endpoints already, they're not full. + // source: + if (_p.sourceEndpoint && _p.sourceEndpoint.isFull()) { + _ju.log(_currentInstance, "could not add connection; source endpoint is full"); + return; + } + + // target: + if (_p.targetEndpoint && _p.targetEndpoint.isFull()) { + _ju.log(_currentInstance, "could not add connection; target endpoint is full"); + return; + } + + // if source endpoint mandates connection type and nothing specified in our params, use it. + if (!_p.type && _p.sourceEndpoint) { + _p.type = _p.sourceEndpoint.connectionType; + } + + // copy in any connectorOverlays that were specified on the source endpoint. + // it doesnt copy target endpoint overlays. i'm not sure if we want it to or not. + if (_p.sourceEndpoint && _p.sourceEndpoint.connectorOverlays) { + _p.overlays = _p.overlays || []; + for (var i = 0, j = _p.sourceEndpoint.connectorOverlays.length; i < j; i++) { + _p.overlays.push(_p.sourceEndpoint.connectorOverlays[i]); + } + } + + // scope + if (_p.sourceEndpoint && _p.sourceEndpoint.scope) { + _p.scope = _p.sourceEndpoint.scope; + } + + // pointer events + if (!_p["pointer-events"] && _p.sourceEndpoint && _p.sourceEndpoint.connectorPointerEvents) { + _p["pointer-events"] = _p.sourceEndpoint.connectorPointerEvents; + } + + + var _addEndpoint = function (el, def, idx) { + var params = _mergeOverrides(def, { + anchor: _p.anchors ? _p.anchors[idx] : _p.anchor, + endpoint: _p.endpoints ? _p.endpoints[idx] : _p.endpoint, + paintStyle: _p.endpointStyles ? _p.endpointStyles[idx] : _p.endpointStyle, + hoverPaintStyle: _p.endpointHoverStyles ? _p.endpointHoverStyles[idx] : _p.endpointHoverStyle + }); + return _currentInstance.addEndpoint(el, params); + }; + + // check for makeSource/makeTarget specs. + + var _oneElementDef = function (type, idx, defs, matchType) { + if (_p[type] && !_p[type].endpoint && !_p[type + "Endpoint"] && !_p.newConnection) { + var tid = _getId(_p[type]), tep = defs[tid]; + + tep = tep ? tep[matchType] : null; + + if (tep) { + // if not enabled, return. + if (!tep.enabled) { + return false; + } + + var epDef = jsPlumb.extend({}, tep.def); + delete epDef.label; + + var newEndpoint = tep.endpoint != null && tep.endpoint._jsPlumb ? tep.endpoint : _addEndpoint(_p[type], epDef, idx); + if (newEndpoint.isFull()) { + return false; + } + _p[type + "Endpoint"] = newEndpoint; + if (!_p.scope && epDef.scope) { + _p.scope = epDef.scope; + } // provide scope if not already provided and endpoint def has one. + if (tep.uniqueEndpoint) { + if (!tep.endpoint) { + tep.endpoint = newEndpoint; + newEndpoint.setDeleteOnEmpty(false); + } + else { + newEndpoint.finalEndpoint = tep.endpoint; + } + } else { + newEndpoint.setDeleteOnEmpty(true); + } + + // + // copy in connector overlays if present on the source definition. + // + if (idx === 0 && tep.def.connectorOverlays) { + _p.overlays = _p.overlays || []; + Array.prototype.push.apply(_p.overlays, tep.def.connectorOverlays); + } + } + } + }; + + if (_oneElementDef("source", 0, this.sourceEndpointDefinitions, _p.type || "default") === false) { + return; + } + if (_oneElementDef("target", 1, this.targetEndpointDefinitions, _p.type || "default") === false) { + return; + } + + // last, ensure scopes match + if (_p.sourceEndpoint && _p.targetEndpoint) { + if (!_scopeMatch(_p.sourceEndpoint, _p.targetEndpoint)) { + _p = null; + } + } + + return _p; + }.bind(_currentInstance), + + _newConnection = function (params) { + var connectionFunc = _currentInstance.Defaults.ConnectionType || _currentInstance.getDefaultConnectionType(); + + params._jsPlumb = _currentInstance; + params.newConnection = _newConnection; + params.newEndpoint = _newEndpoint; + params.endpointsByUUID = endpointsByUUID; + params.endpointsByElement = endpointsByElement; + params.finaliseConnection = _finaliseConnection; + params.id = "con_" + _idstamp(); + var con = new connectionFunc(params); + + // if the connection is draggable, then maybe we need to tell the target endpoint to init the + // dragging code. it won't run again if it already configured to be draggable. + if (con.isDetachable()) { + con.endpoints[0].initDraggable("_jsPlumbSource"); + con.endpoints[1].initDraggable("_jsPlumbTarget"); + } + + return con; + }, + + // + // adds the connection to the backing model, fires an event if necessary and then redraws + // + _finaliseConnection = _currentInstance.finaliseConnection = function (jpc, params, originalEvent, doInformAnchorManager) { + params = params || {}; + // add to list of connections (by scope). + if (!jpc.suspendedEndpoint) { + connections.push(jpc); + } + + jpc.pending = null; + + // turn off isTemporarySource on the source endpoint (only viable on first draw) + jpc.endpoints[0].isTemporarySource = false; + + // always inform the anchor manager + // except that if jpc has a suspended endpoint it's not true to say the + // connection is new; it has just (possibly) moved. the question is whether + // to make that call here or in the anchor manager. i think perhaps here. + if (doInformAnchorManager !== false) { + _currentInstance.anchorManager.newConnection(jpc); + } + + // force a paint + _draw(jpc.source); + + // fire an event + if (!params.doNotFireConnectionEvent && params.fireEvent !== false) { + + var eventArgs = { + connection: jpc, + source: jpc.source, target: jpc.target, + sourceId: jpc.sourceId, targetId: jpc.targetId, + sourceEndpoint: jpc.endpoints[0], targetEndpoint: jpc.endpoints[1] + }; + + _currentInstance.fire("connection", eventArgs, originalEvent); + } + }, + + /* + factory method to prepare a new endpoint. this should always be used instead of creating Endpoints + manually, since this method attaches event listeners and an id. + */ + _newEndpoint = function (params, id) { + var endpointFunc = _currentInstance.Defaults.EndpointType || jsPlumb.Endpoint; + var _p = jsPlumb.extend({}, params); + //delete _p.label; // not supported by endpoint. + _p._jsPlumb = _currentInstance; + _p.newConnection = _newConnection; + _p.newEndpoint = _newEndpoint; + _p.endpointsByUUID = endpointsByUUID; + _p.endpointsByElement = endpointsByElement; + _p.fireDetachEvent = fireDetachEvent; + _p.elementId = id || _getId(_p.source); + var ep = new endpointFunc(_p); + ep.id = "ep_" + _idstamp(); + _manage(_p.elementId, _p.source); + + if (!jsPlumb.headless) { + _currentInstance.getDragManager().endpointAdded(_p.source, id); + } + + return ep; + }, + + /* + * performs the given function operation on all the connections found + * for the given element id; this means we find all the endpoints for + * the given element, and then for each endpoint find the connectors + * connected to it. then we pass each connection in to the given + * function. + */ + _operation = function (elId, func, endpointFunc) { + var endpoints = endpointsByElement[elId]; + if (endpoints && endpoints.length) { + for (var i = 0, ii = endpoints.length; i < ii; i++) { + for (var j = 0, jj = endpoints[i].connections.length; j < jj; j++) { + var retVal = func(endpoints[i].connections[j]); + // if the function passed in returns true, we exit. + // most functions return false. + if (retVal) { + return; + } + } + if (endpointFunc) { + endpointFunc(endpoints[i]); + } + } + } + }, + + _setDraggable = function (element, draggable) { + return jsPlumb.each(element, function (el) { + if (_currentInstance.isDragSupported(el)) { + draggableStates[_currentInstance.getAttribute(el, "id")] = draggable; + _currentInstance.setElementDraggable(el, draggable); + } + }); + }, + /* + * private method to do the business of hiding/showing. + * + * @param el + * either Id of the element in question or a library specific + * object for the element. + * @param state + * String specifying a value for the css 'display' property + * ('block' or 'none'). + */ + _setVisible = function (el, state, alsoChangeEndpoints) { + state = state === "block"; + var endpointFunc = null; + if (alsoChangeEndpoints) { + endpointFunc = function (ep) { + ep.setVisible(state, true, true); + }; + } + var info = _info(el); + _operation(info.id, function (jpc) { + if (state && alsoChangeEndpoints) { + // this test is necessary because this functionality is new, and i wanted to maintain backwards compatibility. + // this block will only set a connection to be visible if the other endpoint in the connection is also visible. + var oidx = jpc.sourceId === info.id ? 1 : 0; + if (jpc.endpoints[oidx].isVisible()) { + jpc.setVisible(true); + } + } + else { // the default behaviour for show, and what always happens for hide, is to just set the visibility without getting clever. + jpc.setVisible(state); + } + }, endpointFunc); + }, + /** + * private method to do the business of toggling hiding/showing. + */ + _toggleVisible = function (elId, changeEndpoints) { + var endpointFunc = null; + if (changeEndpoints) { + endpointFunc = function (ep) { + var state = ep.isVisible(); + ep.setVisible(!state); + }; + } + _operation(elId, function (jpc) { + var state = jpc.isVisible(); + jpc.setVisible(!state); + }, endpointFunc); + }, + + // TODO comparison performance + _getCachedData = function (elId) { + var o = offsets[elId]; + if (!o) { + return _updateOffset({elId: elId}); + } + else { + return {o: o, s: sizes[elId]}; + } + }, + + /** + * gets an id for the given element, creating and setting one if + * necessary. the id is of the form + * + * jsPlumb__ + * + * where "index in instance" is a monotonically increasing integer that starts at 0, + * for each instance. this method is used not only to assign ids to elements that do not + * have them but also to connections and endpoints. + */ + _getId = function (element, uuid, doNotCreateIfNotFound) { + if (_ju.isString(element)) { + return element; + } + if (element == null) { + return null; + } + var id = _currentInstance.getAttribute(element, "id"); + if (!id || id === "undefined") { + // check if fixed uuid parameter is given + if (arguments.length === 2 && arguments[1] !== undefined) { + id = uuid; + } + else if (arguments.length === 1 || (arguments.length === 3 && !arguments[2])) { + id = "jsPlumb_" + _instanceIndex + "_" + _idstamp(); + } + + if (!doNotCreateIfNotFound) { + _currentInstance.setAttribute(element, "id", id); + } + } + return id; + }; + + this.setConnectionBeingDragged = function (v) { + connectionBeingDragged = v; + }; + this.isConnectionBeingDragged = function () { + return connectionBeingDragged; + }; + + /** + * Returns a map of all the elements this jsPlumbInstance is currently managing. + * @returns {Object} Map of [id-> {el, endpoint[], connection, position}] information. + */ + this.getManagedElements = function() { + return managedElements; + }; + + this.connectorClass = "jtk-connector"; + this.connectorOutlineClass = "jtk-connector-outline"; + this.connectedClass = "jtk-connected"; + this.hoverClass = "jtk-hover"; + this.endpointClass = "jtk-endpoint"; + this.endpointConnectedClass = "jtk-endpoint-connected"; + this.endpointFullClass = "jtk-endpoint-full"; + this.endpointDropAllowedClass = "jtk-endpoint-drop-allowed"; + this.endpointDropForbiddenClass = "jtk-endpoint-drop-forbidden"; + this.overlayClass = "jtk-overlay"; + this.draggingClass = "jtk-dragging";// CONVERTED + this.elementDraggingClass = "jtk-element-dragging";// CONVERTED + this.sourceElementDraggingClass = "jtk-source-element-dragging"; // CONVERTED + this.targetElementDraggingClass = "jtk-target-element-dragging";// CONVERTED + this.endpointAnchorClassPrefix = "jtk-endpoint-anchor"; + this.hoverSourceClass = "jtk-source-hover"; + this.hoverTargetClass = "jtk-target-hover"; + this.dragSelectClass = "jtk-drag-select"; + + this.Anchors = {}; + this.Connectors = { "svg": {} }; + this.Endpoints = { "svg": {} }; + this.Overlays = { "svg": {} } ; + this.ConnectorRenderers = {}; + this.SVG = "svg"; + +// --------------------------- jsPlumbInstance public API --------------------------------------------------------- + + + this.addEndpoint = function (el, params, referenceParams) { + referenceParams = referenceParams || {}; + var p = jsPlumb.extend({}, referenceParams); + jsPlumb.extend(p, params); + p.endpoint = p.endpoint || _currentInstance.Defaults.Endpoint; + p.paintStyle = p.paintStyle || _currentInstance.Defaults.EndpointStyle; + + var results = [], + inputs = (_ju.isArray(el) || (el.length != null && !_ju.isString(el))) ? el : [ el ]; + + for (var i = 0, j = inputs.length; i < j; i++) { + p.source = _currentInstance.getElement(inputs[i]); + _ensureContainer(p.source); + + var id = _getId(p.source), e = _newEndpoint(p, id); + + // ensure element is managed. force a recalc if drawing not suspended, to ensure the cached value is fresh + var myOffset = _manage(id, p.source, null, !_suspendDrawing).info.o; + _ju.addToList(endpointsByElement, id, e); + + if (!_suspendDrawing) { + e.paint({ + anchorLoc: e.anchor.compute({ xy: [ myOffset.left, myOffset.top ], wh: sizes[id], element: e, timestamp: _suspendedAt }), + timestamp: _suspendedAt + }); + } + + results.push(e); + } + + return results.length === 1 ? results[0] : results; + }; + + this.addEndpoints = function (el, endpoints, referenceParams) { + var results = []; + for (var i = 0, j = endpoints.length; i < j; i++) { + var e = _currentInstance.addEndpoint(el, endpoints[i], referenceParams); + if (_ju.isArray(e)) { + Array.prototype.push.apply(results, e); + } + else { + results.push(e); + } + } + return results; + }; + + this.animate = function (el, properties, options) { + if (!this.animationSupported) { + return false; + } + + options = options || {}; + var del = _currentInstance.getElement(el), + id = _getId(del), + stepFunction = jsPlumb.animEvents.step, + completeFunction = jsPlumb.animEvents.complete; + + options[stepFunction] = _ju.wrap(options[stepFunction], function () { + _currentInstance.revalidate(id); + }); + + // onComplete repaints, just to make sure everything looks good at the end of the animation. + options[completeFunction] = _ju.wrap(options[completeFunction], function () { + _currentInstance.revalidate(id); + }); + + _currentInstance.doAnimate(del, properties, options); + }; + + /** + * checks for a listener for the given condition, executing it if found, passing in the given value. + * condition listeners would have been attached using "bind" (which is, you could argue, now overloaded, since + * firing click events etc is a bit different to what this does). i thought about adding a "bindCondition" + * or something, but decided against it, for the sake of simplicity. jsPlumb will never fire one of these + * condition events anyway. + */ + this.checkCondition = function (conditionName, args) { + var l = _currentInstance.getListener(conditionName), + r = true; + + if (l && l.length > 0) { + var values = Array.prototype.slice.call(arguments, 1); + try { + for (var i = 0, j = l.length; i < j; i++) { + r = r && l[i].apply(l[i], values); + } + } + catch (e) { + _ju.log(_currentInstance, "cannot check condition [" + conditionName + "]" + e); + } + } + return r; + }; + + this.connect = function (params, referenceParams) { + // prepare a final set of parameters to create connection with + var _p = _prepareConnectionParams(params, referenceParams), jpc; + // TODO probably a nicer return value if the connection was not made. _prepareConnectionParams + // will return null (and log something) if either endpoint was full. what would be nicer is to + // create a dedicated 'error' object. + if (_p) { + if (_p.source == null && _p.sourceEndpoint == null) { + _ju.log("Cannot establish connection - source does not exist"); + return; + } + if (_p.target == null && _p.targetEndpoint == null) { + _ju.log("Cannot establish connection - target does not exist"); + return; + } + _ensureContainer(_p.source); + // create the connection. it is not yet registered + jpc = _newConnection(_p); + // now add it the model, fire an event, and redraw + _finaliseConnection(jpc, _p); + } + return jpc; + }; + + var stTypes = [ + { el: "source", elId: "sourceId", epDefs: "sourceEndpointDefinitions" }, + { el: "target", elId: "targetId", epDefs: "targetEndpointDefinitions" } + ]; + + var _set = function (c, el, idx, doNotRepaint) { + var ep, _st = stTypes[idx], cId = c[_st.elId], cEl = c[_st.el], sid, sep, + oldEndpoint = c.endpoints[idx]; + + var evtParams = { + index: idx, + originalSourceId: idx === 0 ? cId : c.sourceId, + newSourceId: c.sourceId, + originalTargetId: idx === 1 ? cId : c.targetId, + newTargetId: c.targetId, + connection: c + }; + + if (el.constructor === jsPlumb.Endpoint) { + ep = el; + ep.addConnection(c); + el = ep.element; + } + else { + sid = _getId(el); + sep = this[_st.epDefs][sid]; + + if (sid === c[_st.elId]) { + ep = null; // dont change source/target if the element is already the one given. + } + else if (sep) { + for (var t in sep) { + if (!sep[t].enabled) { + return; + } + ep = sep[t].endpoint != null && sep[t].endpoint._jsPlumb ? sep[t].endpoint : this.addEndpoint(el, sep[t].def); + if (sep[t].uniqueEndpoint) { + sep[t].endpoint = ep; + } + ep.addConnection(c); + } + } + else { + ep = c.makeEndpoint(idx === 0, el, sid); + } + } + + if (ep != null) { + oldEndpoint.detachFromConnection(c); + c.endpoints[idx] = ep; + c[_st.el] = ep.element; + c[_st.elId] = ep.elementId; + evtParams[idx === 0 ? "newSourceId" : "newTargetId"] = ep.elementId; + + fireMoveEvent(evtParams); + + if (!doNotRepaint) { + c.repaint(); + } + } + + evtParams.element = el; + return evtParams; + + }.bind(this); + + this.setSource = function (connection, el, doNotRepaint) { + var p = _set(connection, el, 0, doNotRepaint); + this.anchorManager.sourceChanged(p.originalSourceId, p.newSourceId, connection, p.el); + }; + this.setTarget = function (connection, el, doNotRepaint) { + var p = _set(connection, el, 1, doNotRepaint); + this.anchorManager.updateOtherEndpoint(p.originalSourceId, p.originalTargetId, p.newTargetId, connection); + }; + + this.deleteEndpoint = function (object, dontUpdateHover, deleteAttachedObjects) { + var endpoint = (typeof object === "string") ? endpointsByUUID[object] : object; + if (endpoint) { + _currentInstance.deleteObject({ endpoint: endpoint, dontUpdateHover: dontUpdateHover, deleteAttachedObjects:deleteAttachedObjects }); + } + return _currentInstance; + }; + + this.deleteEveryEndpoint = function () { + var _is = _currentInstance.setSuspendDrawing(true); + for (var id in endpointsByElement) { + var endpoints = endpointsByElement[id]; + if (endpoints && endpoints.length) { + for (var i = 0, j = endpoints.length; i < j; i++) { + _currentInstance.deleteEndpoint(endpoints[i], true); + } + } + } + endpointsByElement = {}; + managedElements = {}; + endpointsByUUID = {}; + offsets = {}; + offsetTimestamps = {}; + _currentInstance.anchorManager.reset(); + var dm = _currentInstance.getDragManager(); + if (dm) { + dm.reset(); + } + if (!_is) { + _currentInstance.setSuspendDrawing(false); + } + return _currentInstance; + }; + + var fireDetachEvent = function (jpc, doFireEvent, originalEvent) { + // may have been given a connection, or in special cases, an object + var connType = _currentInstance.Defaults.ConnectionType || _currentInstance.getDefaultConnectionType(), + argIsConnection = jpc.constructor === connType, + params = argIsConnection ? { + connection: jpc, + source: jpc.source, target: jpc.target, + sourceId: jpc.sourceId, targetId: jpc.targetId, + sourceEndpoint: jpc.endpoints[0], targetEndpoint: jpc.endpoints[1] + } : jpc; + + if (doFireEvent) { + _currentInstance.fire("connectionDetached", params, originalEvent); + } + + // always fire this. used by internal jsplumb stuff. + _currentInstance.fire("internal.connectionDetached", params, originalEvent); + + _currentInstance.anchorManager.connectionDetached(params); + }; + + var fireMoveEvent = _currentInstance.fireMoveEvent = function (params, evt) { + _currentInstance.fire("connectionMoved", params, evt); + }; + + this.unregisterEndpoint = function (endpoint) { + if (endpoint._jsPlumb.uuid) { + endpointsByUUID[endpoint._jsPlumb.uuid] = null; + } + _currentInstance.anchorManager.deleteEndpoint(endpoint); + // TODO at least replace this with a removeWithFunction call. + for (var e in endpointsByElement) { + var endpoints = endpointsByElement[e]; + if (endpoints) { + var newEndpoints = []; + for (var i = 0, j = endpoints.length; i < j; i++) { + if (endpoints[i] !== endpoint) { + newEndpoints.push(endpoints[i]); + } + } + + endpointsByElement[e] = newEndpoints; + } + if (endpointsByElement[e].length < 1) { + delete endpointsByElement[e]; + } + } + }; + + var IS_DETACH_ALLOWED = "isDetachAllowed"; + var BEFORE_DETACH = "beforeDetach"; + var CHECK_CONDITION = "checkCondition"; + + /** + * Deletes a Connection. + * @method deleteConnection + * @param connection Connection to delete + * @param {Object} [params] Optional delete parameters + * @param {Boolean} [params.doNotFireEvent=false] If true, a connection detached event will not be fired. Otherwise one will. + * @param {Boolean} [params.force=false] If true, the connection will be deleted even if a beforeDetach interceptor tries to stop the deletion. + * @returns {Boolean} True if the connection was deleted, false otherwise. + */ + this.deleteConnection = function(connection, params) { + + if (connection != null) { + params = params || {}; + + if (params.force || _ju.functionChain(true, false, [ + [ connection.endpoints[0], IS_DETACH_ALLOWED, [ connection ] ], + [ connection.endpoints[1], IS_DETACH_ALLOWED, [ connection ] ], + [ connection, IS_DETACH_ALLOWED, [ connection ] ], + [ _currentInstance, CHECK_CONDITION, [ BEFORE_DETACH, connection ] ] + ])) { + + connection.setHover(false); + fireDetachEvent(connection, !connection.pending && params.fireEvent !== false, params.originalEvent); + + connection.endpoints[0].detachFromConnection(connection); + connection.endpoints[1].detachFromConnection(connection); + _ju.removeWithFunction(connections, function (_c) { + return connection.id === _c.id; + }); + + connection.cleanup(); + connection.destroy(); + return true; + } + } + return false; + }; + + /** + * Remove all Connections from all elements, but leaves Endpoints in place ((unless a connection is set to auto delete its Endpoints). + * @method deleteEveryConnection + * @param {Object} [params] optional params object for the call + * @param {Boolean} [params.fireEvent=true] Whether or not to fire detach events + * @param {Boolean} [params.forceDetach=false] If true, this call will ignore any `beforeDetach` interceptors. + * @returns {Number} The number of connections that were deleted. + */ + this.deleteEveryConnection = function (params) { + params = params || {}; + var count = connections.length, deletedCount = 0; + _currentInstance.batch(function () { + for (var i = 0; i < count; i++) { + deletedCount += _currentInstance.deleteConnection(connections[0], params) ? 1 : 0; + } + }); + return deletedCount; + }; + + /** + * Removes all an element's Connections. + * @method deleteConnectionsForElement + * @param {Object} el Either the id of the element, or a selector for the element. + * @param {Object} [params] Optional parameters. + * @param {Boolean} [params.fireEvent=true] Whether or not to fire the detach event. + * @param {Boolean} [params.forceDetach=false] If true, this call will ignore any `beforeDetach` interceptors. + * @return {jsPlumbInstance} The current jsPlumb instance. + */ + this.deleteConnectionsForElement = function (el, params) { + params = params || {}; + el = _currentInstance.getElement(el); + var id = _getId(el), endpoints = endpointsByElement[id]; + if (endpoints && endpoints.length) { + for (var i = 0, j = endpoints.length; i < j; i++) { + endpoints[i].deleteEveryConnection(params); + } + } + return _currentInstance; + }; + + /// not public. but of course its exposed. how to change this. + this.deleteObject = function (params) { + var result = { + endpoints: {}, + connections: {}, + endpointCount: 0, + connectionCount: 0 + }, + deleteAttachedObjects = params.deleteAttachedObjects !== false; + + var unravelConnection = function (connection) { + if (connection != null && result.connections[connection.id] == null) { + if (!params.dontUpdateHover && connection._jsPlumb != null) { + connection.setHover(false); + } + result.connections[connection.id] = connection; + result.connectionCount++; + } + }; + var unravelEndpoint = function (endpoint) { + if (endpoint != null && result.endpoints[endpoint.id] == null) { + if (!params.dontUpdateHover && endpoint._jsPlumb != null) { + endpoint.setHover(false); + } + result.endpoints[endpoint.id] = endpoint; + result.endpointCount++; + + if (deleteAttachedObjects) { + for (var i = 0; i < endpoint.connections.length; i++) { + var c = endpoint.connections[i]; + unravelConnection(c); + } + } + } + }; + + if (params.connection) { + unravelConnection(params.connection); + } + else { + unravelEndpoint(params.endpoint); + } + + // loop through connections + for (var i in result.connections) { + var c = result.connections[i]; + if (c._jsPlumb) { + _ju.removeWithFunction(connections, function (_c) { + return c.id === _c.id; + }); + + fireDetachEvent(c, params.fireEvent === false ? false : !c.pending, params.originalEvent); + var doNotCleanup = params.deleteAttachedObjects == null ? null : !params.deleteAttachedObjects; + + c.endpoints[0].detachFromConnection(c, null, doNotCleanup); + c.endpoints[1].detachFromConnection(c, null, doNotCleanup); + + c.cleanup(true); + c.destroy(true); + } + } + + // loop through endpoints + for (var j in result.endpoints) { + var e = result.endpoints[j]; + if (e._jsPlumb) { + _currentInstance.unregisterEndpoint(e); + // FIRE some endpoint deleted event? + e.cleanup(true); + e.destroy(true); + } + } + + return result; + }; + + + // helpers for select/selectEndpoints + var _setOperation = function (list, func, args, selector) { + for (var i = 0, j = list.length; i < j; i++) { + list[i][func].apply(list[i], args); + } + return selector(list); + }, + _getOperation = function (list, func, args) { + var out = []; + for (var i = 0, j = list.length; i < j; i++) { + out.push([ list[i][func].apply(list[i], args), list[i] ]); + } + return out; + }, + setter = function (list, func, selector) { + return function () { + return _setOperation(list, func, arguments, selector); + }; + }, + getter = function (list, func) { + return function () { + return _getOperation(list, func, arguments); + }; + }, + prepareList = function (input, doNotGetIds) { + var r = []; + if (input) { + if (typeof input === 'string') { + if (input === "*") { + return input; + } + r.push(input); + } + else { + if (doNotGetIds) { + r = input; + } + else { + if (input.length) { + for (var i = 0, j = input.length; i < j; i++) { + r.push(_info(input[i]).id); + } + } + else { + r.push(_info(input).id); + } + } + } + } + return r; + }, + filterList = function (list, value, missingIsFalse) { + if (list === "*") { + return true; + } + return list.length > 0 ? list.indexOf(value) !== -1 : !missingIsFalse; + }; + + // get some connections, specifying source/target/scope + this.getConnections = function (options, flat) { + if (!options) { + options = {}; + } else if (options.constructor === String) { + options = { "scope": options }; + } + var scope = options.scope || _currentInstance.getDefaultScope(), + scopes = prepareList(scope, true), + sources = prepareList(options.source), + targets = prepareList(options.target), + results = (!flat && scopes.length > 1) ? {} : [], + _addOne = function (scope, obj) { + if (!flat && scopes.length > 1) { + var ss = results[scope]; + if (ss == null) { + ss = results[scope] = []; + } + ss.push(obj); + } else { + results.push(obj); + } + }; + + for (var j = 0, jj = connections.length; j < jj; j++) { + var c = connections[j], + sourceId = c.proxies && c.proxies[0] ? c.proxies[0].originalEp.elementId : c.sourceId, + targetId = c.proxies && c.proxies[1] ? c.proxies[1].originalEp.elementId : c.targetId; + + if (filterList(scopes, c.scope) && filterList(sources, sourceId) && filterList(targets, targetId)) { + _addOne(c.scope, c); + } + } + + return results; + }; + + var _curryEach = function (list, executor) { + return function (f) { + for (var i = 0, ii = list.length; i < ii; i++) { + f(list[i]); + } + return executor(list); + }; + }, + _curryGet = function (list) { + return function (idx) { + return list[idx]; + }; + }; + + var _makeCommonSelectHandler = function (list, executor) { + var out = { + length: list.length, + each: _curryEach(list, executor), + get: _curryGet(list) + }, + setters = ["setHover", "removeAllOverlays", "setLabel", "addClass", "addOverlay", "removeOverlay", + "removeOverlays", "showOverlay", "hideOverlay", "showOverlays", "hideOverlays", "setPaintStyle", + "setHoverPaintStyle", "setSuspendEvents", "setParameter", "setParameters", "setVisible", + "repaint", "addType", "toggleType", "removeType", "removeClass", "setType", "bind", "unbind" ], + + getters = ["getLabel", "getOverlay", "isHover", "getParameter", "getParameters", "getPaintStyle", + "getHoverPaintStyle", "isVisible", "hasType", "getType", "isSuspendEvents" ], + i, ii; + + for (i = 0, ii = setters.length; i < ii; i++) { + out[setters[i]] = setter(list, setters[i], executor); + } + + for (i = 0, ii = getters.length; i < ii; i++) { + out[getters[i]] = getter(list, getters[i]); + } + + return out; + }; + + var _makeConnectionSelectHandler = function (list) { + var common = _makeCommonSelectHandler(list, _makeConnectionSelectHandler); + return jsPlumb.extend(common, { + // setters + setDetachable: setter(list, "setDetachable", _makeConnectionSelectHandler), + setReattach: setter(list, "setReattach", _makeConnectionSelectHandler), + setConnector: setter(list, "setConnector", _makeConnectionSelectHandler), + delete: function () { + for (var i = 0, ii = list.length; i < ii; i++) { + _currentInstance.deleteConnection(list[i]); + } + }, + // getters + isDetachable: getter(list, "isDetachable"), + isReattach: getter(list, "isReattach") + }); + }; + + var _makeEndpointSelectHandler = function (list) { + var common = _makeCommonSelectHandler(list, _makeEndpointSelectHandler); + return jsPlumb.extend(common, { + setEnabled: setter(list, "setEnabled", _makeEndpointSelectHandler), + setAnchor: setter(list, "setAnchor", _makeEndpointSelectHandler), + isEnabled: getter(list, "isEnabled"), + deleteEveryConnection: function () { + for (var i = 0, ii = list.length; i < ii; i++) { + list[i].deleteEveryConnection(); + } + }, + "delete": function () { + for (var i = 0, ii = list.length; i < ii; i++) { + _currentInstance.deleteEndpoint(list[i]); + } + } + }); + }; + + this.select = function (params) { + params = params || {}; + params.scope = params.scope || "*"; + return _makeConnectionSelectHandler(params.connections || _currentInstance.getConnections(params, true)); + }; + + this.selectEndpoints = function (params) { + params = params || {}; + params.scope = params.scope || "*"; + var noElementFilters = !params.element && !params.source && !params.target, + elements = noElementFilters ? "*" : prepareList(params.element), + sources = noElementFilters ? "*" : prepareList(params.source), + targets = noElementFilters ? "*" : prepareList(params.target), + scopes = prepareList(params.scope, true); + + var ep = []; + + for (var el in endpointsByElement) { + var either = filterList(elements, el, true), + source = filterList(sources, el, true), + sourceMatchExact = sources !== "*", + target = filterList(targets, el, true), + targetMatchExact = targets !== "*"; + + // if they requested 'either' then just match scope. otherwise if they requested 'source' (not as a wildcard) then we have to match only endpoints that have isSource set to to true, and the same thing with isTarget. + if (either || source || target) { + inner: + for (var i = 0, ii = endpointsByElement[el].length; i < ii; i++) { + var _ep = endpointsByElement[el][i]; + if (filterList(scopes, _ep.scope, true)) { + + var noMatchSource = (sourceMatchExact && sources.length > 0 && !_ep.isSource), + noMatchTarget = (targetMatchExact && targets.length > 0 && !_ep.isTarget); + + if (noMatchSource || noMatchTarget) { + continue inner; + } + + ep.push(_ep); + } + } + } + } + + return _makeEndpointSelectHandler(ep); + }; + + // get all connections managed by the instance of jsplumb. + this.getAllConnections = function () { + return connections; + }; + this.getDefaultScope = function () { + return DEFAULT_SCOPE; + }; + // get an endpoint by uuid. + this.getEndpoint = _getEndpoint; + /** + * Gets the list of Endpoints for a given element. + * @method getEndpoints + * @param {String|Element|Selector} el The element to get endpoints for. + * @return {Endpoint[]} An array of Endpoints for the specified element. + */ + this.getEndpoints = function (el) { + return endpointsByElement[_info(el).id] || []; + }; + // gets the default endpoint type. used when subclassing. see wiki. + this.getDefaultEndpointType = function () { + return jsPlumb.Endpoint; + }; + // gets the default connection type. used when subclassing. see wiki. + this.getDefaultConnectionType = function () { + return jsPlumb.Connection; + }; + /* + * Gets an element's id, creating one if necessary. really only exposed + * for the lib-specific functionality to access; would be better to pass + * the current instance into the lib-specific code (even though this is + * a static call. i just don't want to expose it to the public API). + */ + this.getId = _getId; + this.draw = _draw; + this.info = _info; + + this.appendElement = _appendElement; + + var _hoverSuspended = false; + this.isHoverSuspended = function () { + return _hoverSuspended; + }; + this.setHoverSuspended = function (s) { + _hoverSuspended = s; + }; + + // set an element's connections to be hidden + this.hide = function (el, changeEndpoints) { + _setVisible(el, "none", changeEndpoints); + return _currentInstance; + }; + + // exposed for other objects to use to get a unique id. + this.idstamp = _idstamp; + + // ensure that, if the current container exists, it is a DOM element and not a selector. + // if it does not exist and `candidate` is supplied, the offset parent of that element will be set as the Container. + // this is used to do a better default behaviour for the case that the user has not set a container: + // addEndpoint, makeSource, makeTarget and connect all call this method with the offsetParent of the + // element in question (for connect it is the source element). So if no container is set, it is inferred + // to be the offsetParent of the first element the user tries to connect. + var _ensureContainer = function (candidate) { + if (!_container && candidate) { + var can = _currentInstance.getElement(candidate); + if (can.offsetParent) { + _currentInstance.setContainer(can.offsetParent); + } + } + }; + + var _getContainerFromDefaults = function () { + if (_currentInstance.Defaults.Container) { + _currentInstance.setContainer(_currentInstance.Defaults.Container); + } + }; + + // check if a given element is managed or not. if not, add to our map. if drawing is not suspended then + // we'll also stash its dimensions; otherwise we'll do this in a lazy way through updateOffset. + var _manage = _currentInstance.manage = function (id, element, _transient, _recalc) { + if (!managedElements[id]) { + managedElements[id] = { + el: element, + endpoints: [], + connections: [] + }; + + managedElements[id].info = _updateOffset({ elId: id, timestamp: _suspendedAt }); + _currentInstance.addClass(element, "jtk-managed"); + + if (!_transient) { + _currentInstance.fire("manageElement", { id:id, info:managedElements[id].info, el:element }); + } + } else { + if (_recalc) { + managedElements[id].info = _updateOffset({ elId: id, timestamp: _suspendedAt, recalc:true }); + } + } + + return managedElements[id]; + }; + + var _unmanage = _currentInstance.unmanage = function(id) { + if (managedElements[id]) { + var el = managedElements[id].el; + _currentInstance.removeClass(el, "jtk-managed"); + delete managedElements[id]; + _currentInstance.fire("unmanageElement", {id:id, el:el}); + } + }; + + /** + * updates the offset and size for a given element, and stores the + * values. if 'offset' is not null we use that (it would have been + * passed in from a drag call) because it's faster; but if it is null, + * or if 'recalc' is true in order to force a recalculation, we get the current values. + * @method updateOffset + */ + var _updateOffset = function (params) { + + var timestamp = params.timestamp, recalc = params.recalc, offset = params.offset, elId = params.elId, s; + if (_suspendDrawing && !timestamp) { + timestamp = _suspendedAt; + } + if (!recalc) { + if (timestamp && timestamp === offsetTimestamps[elId]) { + return {o: params.offset || offsets[elId], s: sizes[elId]}; + } + } + if (recalc || (!offset && offsets[elId] == null)) { // if forced repaint or no offset available, we recalculate. + + // get the current size and offset, and store them + s = managedElements[elId] ? managedElements[elId].el : null; + if (s != null) { + sizes[elId] = _currentInstance.getSize(s); + offsets[elId] = _currentInstance.getOffset(s); + offsetTimestamps[elId] = timestamp; + } + } else { + offsets[elId] = offset || offsets[elId]; + if (sizes[elId] == null) { + s = managedElements[elId].el; + if (s != null) { + sizes[elId] = _currentInstance.getSize(s); + } + } + offsetTimestamps[elId] = timestamp; + } + + if (offsets[elId] && !offsets[elId].right) { + offsets[elId].right = offsets[elId].left + sizes[elId][0]; + offsets[elId].bottom = offsets[elId].top + sizes[elId][1]; + offsets[elId].width = sizes[elId][0]; + offsets[elId].height = sizes[elId][1]; + offsets[elId].centerx = offsets[elId].left + (offsets[elId].width / 2); + offsets[elId].centery = offsets[elId].top + (offsets[elId].height / 2); + } + + return {o: offsets[elId], s: sizes[elId]}; + }; + + this.updateOffset = _updateOffset; + + /** + * callback from the current library to tell us to prepare ourselves (attach + * mouse listeners etc; can't do that until the library has provided a bind method) + */ + this.init = function () { + if (!initialized) { + _getContainerFromDefaults(); + _currentInstance.anchorManager = new root.jsPlumb.AnchorManager({jsPlumbInstance: _currentInstance}); + initialized = true; + _currentInstance.fire("ready", _currentInstance); + } + }.bind(this); + + this.log = log; + this.jsPlumbUIComponent = jsPlumbUIComponent; + + /* + * Creates an anchor with the given params. + * + * + * Returns: The newly created Anchor. + * Throws: an error if a named anchor was not found. + */ + this.makeAnchor = function () { + var pp, _a = function (t, p) { + if (root.jsPlumb.Anchors[t]) { + return new root.jsPlumb.Anchors[t](p); + } + if (!_currentInstance.Defaults.DoNotThrowErrors) { + throw { msg: "jsPlumb: unknown anchor type '" + t + "'" }; + } + }; + if (arguments.length === 0) { + return null; + } + var specimen = arguments[0], elementId = arguments[1], jsPlumbInstance = arguments[2], newAnchor = null; + // if it appears to be an anchor already... + if (specimen.compute && specimen.getOrientation) { + return specimen; + } //TODO hazy here about whether it should be added or is already added somehow. + // is it the name of an anchor type? + else if (typeof specimen === "string") { + newAnchor = _a(arguments[0], {elementId: elementId, jsPlumbInstance: _currentInstance}); + } + // is it an array? it will be one of: + // an array of [spec, params] - this defines a single anchor, which may be dynamic, but has parameters. + // an array of arrays - this defines some dynamic anchors + // an array of numbers - this defines a single anchor. + else if (_ju.isArray(specimen)) { + if (_ju.isArray(specimen[0]) || _ju.isString(specimen[0])) { + // if [spec, params] format + if (specimen.length === 2 && _ju.isObject(specimen[1])) { + // if first arg is a string, its a named anchor with params + if (_ju.isString(specimen[0])) { + pp = root.jsPlumb.extend({elementId: elementId, jsPlumbInstance: _currentInstance}, specimen[1]); + newAnchor = _a(specimen[0], pp); + } + // otherwise first arg is array, second is params. we treat as a dynamic anchor, which is fine + // even if the first arg has only one entry. you could argue all anchors should be implicitly dynamic in fact. + else { + pp = root.jsPlumb.extend({elementId: elementId, jsPlumbInstance: _currentInstance, anchors: specimen[0]}, specimen[1]); + newAnchor = new root.jsPlumb.DynamicAnchor(pp); + } + } + else { + newAnchor = new jsPlumb.DynamicAnchor({anchors: specimen, selector: null, elementId: elementId, jsPlumbInstance: _currentInstance}); + } + + } + else { + var anchorParams = { + x: specimen[0], y: specimen[1], + orientation: (specimen.length >= 4) ? [ specimen[2], specimen[3] ] : [0, 0], + offsets: (specimen.length >= 6) ? [ specimen[4], specimen[5] ] : [ 0, 0 ], + elementId: elementId, + jsPlumbInstance: _currentInstance, + cssClass: specimen.length === 7 ? specimen[6] : null + }; + newAnchor = new root.jsPlumb.Anchor(anchorParams); + newAnchor.clone = function () { + return new root.jsPlumb.Anchor(anchorParams); + }; + } + } + + if (!newAnchor.id) { + newAnchor.id = "anchor_" + _idstamp(); + } + return newAnchor; + }; + + /** + * makes a list of anchors from the given list of types or coords, eg + * ["TopCenter", "RightMiddle", "BottomCenter", [0, 1, -1, -1] ] + */ + this.makeAnchors = function (types, elementId, jsPlumbInstance) { + var r = []; + for (var i = 0, ii = types.length; i < ii; i++) { + if (typeof types[i] === "string") { + r.push(root.jsPlumb.Anchors[types[i]]({elementId: elementId, jsPlumbInstance: jsPlumbInstance})); + } + else if (_ju.isArray(types[i])) { + r.push(_currentInstance.makeAnchor(types[i], elementId, jsPlumbInstance)); + } + } + return r; + }; + + /** + * Makes a dynamic anchor from the given list of anchors (which may be in shorthand notation as strings or dimension arrays, or Anchor + * objects themselves) and the given, optional, anchorSelector function (jsPlumb uses a default if this is not provided; most people will + * not need to provide this - i think). + */ + this.makeDynamicAnchor = function (anchors, anchorSelector) { + return new root.jsPlumb.DynamicAnchor({anchors: anchors, selector: anchorSelector, elementId: null, jsPlumbInstance: _currentInstance}); + }; + +// --------------------- makeSource/makeTarget ---------------------------------------------- + + this.targetEndpointDefinitions = {}; + this.sourceEndpointDefinitions = {}; + + var selectorFilter = function (evt, _el, selector, _instance, negate) { + var t = evt.target || evt.srcElement, ok = false, + sel = _instance.getSelector(_el, selector); + for (var j = 0; j < sel.length; j++) { + if (sel[j] === t) { + ok = true; + break; + } + } + return negate ? !ok : ok; + }; + + var _makeElementDropHandler = function (elInfo, p, dropOptions, isSource, isTarget) { + var proxyComponent = new jsPlumbUIComponent(p); + var _drop = p._jsPlumb.EndpointDropHandler({ + jsPlumb: _currentInstance, + enabled: function () { + return elInfo.def.enabled; + }, + isFull: function () { + var targetCount = _currentInstance.select({target: elInfo.id}).length; + return elInfo.def.maxConnections > 0 && targetCount >= elInfo.def.maxConnections; + }, + element: elInfo.el, + elementId: elInfo.id, + isSource: isSource, + isTarget: isTarget, + addClass: function (clazz) { + _currentInstance.addClass(elInfo.el, clazz); + }, + removeClass: function (clazz) { + _currentInstance.removeClass(elInfo.el, clazz); + }, + onDrop: function (jpc) { + var source = jpc.endpoints[0]; + source.anchor.unlock(); + }, + isDropAllowed: function () { + return proxyComponent.isDropAllowed.apply(proxyComponent, arguments); + }, + isRedrop:function(jpc) { + return (jpc.suspendedElement != null && jpc.suspendedEndpoint != null && jpc.suspendedEndpoint.element === elInfo.el); + }, + getEndpoint: function (jpc) { + + // make a new Endpoint for the target, or get it from the cache if uniqueEndpoint + // is set. if its a redrop the new endpoint will be immediately cleaned up. + + var newEndpoint = elInfo.def.endpoint; + + // if no cached endpoint, or there was one but it has been cleaned up + // (ie. detached), create a new one + if (newEndpoint == null || newEndpoint._jsPlumb == null) { + var eps = _currentInstance.deriveEndpointAndAnchorSpec(jpc.getType().join(" "), true); + var pp = eps.endpoints ? root.jsPlumb.extend(p, { + endpoint:elInfo.def.def.endpoint || eps.endpoints[1] + }) :p; + if (eps.anchors) { + pp = root.jsPlumb.extend(pp, { + anchor:elInfo.def.def.anchor || eps.anchors[1] + }); + } + newEndpoint = _currentInstance.addEndpoint(elInfo.el, pp); + newEndpoint._mtNew = true; + } + + if (p.uniqueEndpoint) { + elInfo.def.endpoint = newEndpoint; + } + + newEndpoint.setDeleteOnEmpty(true); + + // if connection is detachable, init the new endpoint to be draggable, to support that happening. + if (jpc.isDetachable()) { + newEndpoint.initDraggable(); + } + + // if the anchor has a 'positionFinder' set, then delegate to that function to find + // out where to locate the anchor. + if (newEndpoint.anchor.positionFinder != null) { + var dropPosition = _currentInstance.getUIPosition(arguments, _currentInstance.getZoom()), + elPosition = _currentInstance.getOffset(elInfo.el), + elSize = _currentInstance.getSize(elInfo.el), + ap = dropPosition == null ? [0,0] : newEndpoint.anchor.positionFinder(dropPosition, elPosition, elSize, newEndpoint.anchor.constructorParams); + + newEndpoint.anchor.x = ap[0]; + newEndpoint.anchor.y = ap[1]; + // now figure an orientation for it..kind of hard to know what to do actually. probably the best thing i can do is to + // support specifying an orientation in the anchor's spec. if one is not supplied then i will make the orientation + // be what will cause the most natural link to the source: it will be pointing at the source, but it needs to be + // specified in one axis only, and so how to make that choice? i think i will use whichever axis is the one in which + // the target is furthest away from the source. + } + + return newEndpoint; + }, + maybeCleanup: function (ep) { + if (ep._mtNew && ep.connections.length === 0) { + _currentInstance.deleteObject({endpoint: ep}); + } + else { + delete ep._mtNew; + } + } + }); + + // wrap drop events as needed and initialise droppable + var dropEvent = root.jsPlumb.dragEvents.drop; + dropOptions.scope = dropOptions.scope || (p.scope || _currentInstance.Defaults.Scope); + dropOptions[dropEvent] = _ju.wrap(dropOptions[dropEvent], _drop, true); + dropOptions.rank = p.rank || 0; + + // if target, return true from the over event. this will cause katavorio to stop setting drops to hover + // if multipleDrop is set to false. + if (isTarget) { + dropOptions[root.jsPlumb.dragEvents.over] = function () { return true; }; + } + + // vanilla jsplumb only + if (p.allowLoopback === false) { + dropOptions.canDrop = function (_drag) { + var de = _drag.getDragElement()._jsPlumbRelatedElement; + return de !== elInfo.el; + }; + } + _currentInstance.initDroppable(elInfo.el, dropOptions, "internal"); + + return _drop; + + }; + + // see API docs + this.makeTarget = function (el, params, referenceParams) { + + // put jsplumb ref into params without altering the params passed in + var p = root.jsPlumb.extend({_jsPlumb: this}, referenceParams); + root.jsPlumb.extend(p, params); + + var maxConnections = p.maxConnections || -1, + + _doOne = function (el) { + + // get the element's id and store the endpoint definition for it. jsPlumb.connect calls will look for one of these, + // and use the endpoint definition if found. + // decode the info for this element (id and element) + var elInfo = _info(el), + elid = elInfo.id, + dropOptions = root.jsPlumb.extend({}, p.dropOptions || {}), + type = p.connectionType || "default"; + + this.targetEndpointDefinitions[elid] = this.targetEndpointDefinitions[elid] || {}; + + _ensureContainer(elid); + + // if this is a group and the user has not mandated a rank, set to -1 so that Nodes takes + // precedence. + if (elInfo.el._isJsPlumbGroup && dropOptions.rank == null) { + dropOptions.rank = -1; + } + + // store the definition + var _def = { + def: root.jsPlumb.extend({}, p), + uniqueEndpoint: p.uniqueEndpoint, + maxConnections: maxConnections, + enabled: true + }; + + if (p.createEndpoint) { + _def.uniqueEndpoint = true; + _def.endpoint = _currentInstance.addEndpoint(el, _def.def); + _def.endpoint.setDeleteOnEmpty(false); + } + + elInfo.def = _def; + this.targetEndpointDefinitions[elid][type] = _def; + _makeElementDropHandler(elInfo, p, dropOptions, p.isSource === true, true); + // stash the definition on the drop + elInfo.el._katavorioDrop[elInfo.el._katavorioDrop.length - 1].targetDef = _def; + + }.bind(this); + + // make an array if only given one element + var inputs = el.length && el.constructor !== String ? el : [ el ]; + + // register each one in the list. + for (var i = 0, ii = inputs.length; i < ii; i++) { + _doOne(inputs[i]); + } + + return this; + }; + + // see api docs + this.unmakeTarget = function (el, doNotClearArrays) { + var info = _info(el); + _currentInstance.destroyDroppable(info.el, "internal"); + if (!doNotClearArrays) { + delete this.targetEndpointDefinitions[info.id]; + } + + return this; + }; + + // see api docs + this.makeSource = function (el, params, referenceParams) { + var p = root.jsPlumb.extend({_jsPlumb: this}, referenceParams); + root.jsPlumb.extend(p, params); + var type = p.connectionType || "default"; + var aae = _currentInstance.deriveEndpointAndAnchorSpec(type); + p.endpoint = p.endpoint || aae.endpoints[0]; + p.anchor = p.anchor || aae.anchors[0]; + var maxConnections = p.maxConnections || -1, + onMaxConnections = p.onMaxConnections, + _doOne = function (elInfo) { + // get the element's id and store the endpoint definition for it. jsPlumb.connect calls will look for one of these, + // and use the endpoint definition if found. + var elid = elInfo.id, + _del = this.getElement(elInfo.el); + + this.sourceEndpointDefinitions[elid] = this.sourceEndpointDefinitions[elid] || {}; + _ensureContainer(elid); + + var _def = { + def:root.jsPlumb.extend({}, p), + uniqueEndpoint: p.uniqueEndpoint, + maxConnections: maxConnections, + enabled: true + }; + + if (p.createEndpoint) { + _def.uniqueEndpoint = true; + _def.endpoint = _currentInstance.addEndpoint(el, _def.def); + _def.endpoint.setDeleteOnEmpty(false); + } + + this.sourceEndpointDefinitions[elid][type] = _def; + elInfo.def = _def; + + var stopEvent = root.jsPlumb.dragEvents.stop, + dragEvent = root.jsPlumb.dragEvents.drag, + dragOptions = root.jsPlumb.extend({ }, p.dragOptions || {}), + existingDrag = dragOptions.drag, + existingStop = dragOptions.stop, + ep = null, + endpointAddedButNoDragYet = false; + + // set scope if its not set in dragOptions but was passed in in params + dragOptions.scope = dragOptions.scope || p.scope; + + dragOptions[dragEvent] = _ju.wrap(dragOptions[dragEvent], function () { + if (existingDrag) { + existingDrag.apply(this, arguments); + } + endpointAddedButNoDragYet = false; + }); + + dragOptions[stopEvent] = _ju.wrap(dragOptions[stopEvent], function () { + + if (existingStop) { + existingStop.apply(this, arguments); + } + this.currentlyDragging = false; + if (ep._jsPlumb != null) { // if not cleaned up... + + // reset the anchor to the anchor that was initially provided. the one we were using to drag + // the connection was just a placeholder that was located at the place the user pressed the + // mouse button to initiate the drag. + var anchorDef = p.anchor || this.Defaults.Anchor, + oldAnchor = ep.anchor, + oldConnection = ep.connections[0]; + + var newAnchor = this.makeAnchor(anchorDef, elid, this), + _el = ep.element; + + // if the anchor has a 'positionFinder' set, then delegate to that function to find + // out where to locate the anchor. issue 117. + if (newAnchor.positionFinder != null) { + var elPosition = _currentInstance.getOffset(_el), + elSize = this.getSize(_el), + dropPosition = { left: elPosition.left + (oldAnchor.x * elSize[0]), top: elPosition.top + (oldAnchor.y * elSize[1]) }, + ap = newAnchor.positionFinder(dropPosition, elPosition, elSize, newAnchor.constructorParams); + + newAnchor.x = ap[0]; + newAnchor.y = ap[1]; + } + + ep.setAnchor(newAnchor, true); + ep.repaint(); + this.repaint(ep.elementId); + if (oldConnection != null) { + this.repaint(oldConnection.targetId); + } + } + }.bind(this)); + + // when the user presses the mouse, add an Endpoint, if we are enabled. + var mouseDownListener = function (e) { + // on right mouse button, abort. + if (e.which === 3 || e.button === 2) { + return; + } + + elid = this.getId(this.getElement(elInfo.el)); // elid might have changed since this method was called to configure the element. + + // TODO store def on element. + var def = this.sourceEndpointDefinitions[elid][type]; + + // if disabled, return. + if (!def.enabled) { + return; + } + + // if a filter was given, run it, and return if it says no. + if (p.filter) { + var r = _ju.isString(p.filter) ? selectorFilter(e, elInfo.el, p.filter, this, p.filterExclude) : p.filter(e, elInfo.el); + if (r === false) { + return; + } + } + + // if maxConnections reached + var sourceCount = this.select({source: elid}).length; + if (def.maxConnections >= 0 && (sourceCount >= def.maxConnections)) { + if (onMaxConnections) { + onMaxConnections({ + element: elInfo.el, + maxConnections: maxConnections + }, e); + } + return false; + } + + // find the position on the element at which the mouse was pressed; this is where the endpoint + // will be located. + var elxy = root.jsPlumb.getPositionOnElement(e, _del, _zoom); + + // we need to override the anchor in here, and force 'isSource', but we don't want to mess with + // the params passed in, because after a connection is established we're going to reset the endpoint + // to have the anchor we were given. + var tempEndpointParams = {}; + root.jsPlumb.extend(tempEndpointParams, def.def); + tempEndpointParams.isTemporarySource = true; + tempEndpointParams.anchor = [ elxy[0], elxy[1] , 0, 0]; + tempEndpointParams.dragOptions = dragOptions; + + if (def.def.scope) { + tempEndpointParams.scope = def.def.scope; + } + + ep = this.addEndpoint(elid, tempEndpointParams); + endpointAddedButNoDragYet = true; + ep.setDeleteOnEmpty(true); + + // if unique endpoint and it's already been created, push it onto the endpoint we create. at the end + // of a successful connection we'll switch to that endpoint. + // TODO this is the same code as the programmatic endpoints create on line 1050 ish + if (def.uniqueEndpoint) { + if (!def.endpoint) { + def.endpoint = ep; + ep.setDeleteOnEmpty(false); + } + else { + ep.finalEndpoint = def.endpoint; + } + } + + var _delTempEndpoint = function () { + // this mouseup event is fired only if no dragging occurred, by jquery and yui, but for mootools + // it is fired even if dragging has occurred, in which case we would blow away a perfectly + // legitimate endpoint, were it not for this check. the flag is set after adding an + // endpoint and cleared in a drag listener we set in the dragOptions above. + _currentInstance.off(ep.canvas, "mouseup", _delTempEndpoint); + _currentInstance.off(elInfo.el, "mouseup", _delTempEndpoint); + if (endpointAddedButNoDragYet) { + endpointAddedButNoDragYet = false; + _currentInstance.deleteEndpoint(ep); + } + }; + + _currentInstance.on(ep.canvas, "mouseup", _delTempEndpoint); + _currentInstance.on(elInfo.el, "mouseup", _delTempEndpoint); + + // optionally check for attributes to extract from the source element + var payload = {}; + if (def.def.extract) { + for (var att in def.def.extract) { + var v = (e.srcElement || e.target).getAttribute(att); + if (v) { + payload[def.def.extract[att]] = v; + } + } + } + + // and then trigger its mousedown event, which will kick off a drag, which will start dragging + // a new connection from this endpoint. + _currentInstance.trigger(ep.canvas, "mousedown", e, payload); + + _ju.consume(e); + + }.bind(this); + + this.on(elInfo.el, "mousedown", mouseDownListener); + _def.trigger = mouseDownListener; + + // if a filter was provided, set it as a dragFilter on the element, + // to prevent the element drag function from kicking in when we want to + // drag a new connection + if (p.filter && (_ju.isString(p.filter) || _ju.isFunction(p.filter))) { + _currentInstance.setDragFilter(elInfo.el, p.filter); + } + + var dropOptions = root.jsPlumb.extend({}, p.dropOptions || {}); + + _makeElementDropHandler(elInfo, p, dropOptions, true, p.isTarget === true); + + }.bind(this); + + var inputs = el.length && el.constructor !== String ? el : [ el ]; + for (var i = 0, ii = inputs.length; i < ii; i++) { + _doOne(_info(inputs[i])); + } + + return this; + }; + + // see api docs + this.unmakeSource = function (el, connectionType, doNotClearArrays) { + var info = _info(el); + _currentInstance.destroyDroppable(info.el, "internal"); + var eldefs = this.sourceEndpointDefinitions[info.id]; + if (eldefs) { + for (var def in eldefs) { + if (connectionType == null || connectionType === def) { + var mouseDownListener = eldefs[def].trigger; + if (mouseDownListener) { + _currentInstance.off(info.el, "mousedown", mouseDownListener); + } + if (!doNotClearArrays) { + delete this.sourceEndpointDefinitions[info.id][def]; + } + } + } + } + + return this; + }; + + // see api docs + this.unmakeEverySource = function () { + for (var i in this.sourceEndpointDefinitions) { + _currentInstance.unmakeSource(i, null, true); + } + + this.sourceEndpointDefinitions = {}; + return this; + }; + + var _getScope = function (el, types, connectionType) { + types = _ju.isArray(types) ? types : [ types ]; + var id = _getId(el); + connectionType = connectionType || "default"; + for (var i = 0; i < types.length; i++) { + var eldefs = this[types[i]][id]; + if (eldefs && eldefs[connectionType]) { + return eldefs[connectionType].def.scope || this.Defaults.Scope; + } + } + }.bind(this); + + var _setScope = function (el, scope, types, connectionType) { + types = _ju.isArray(types) ? types : [ types ]; + var id = _getId(el); + connectionType = connectionType || "default"; + for (var i = 0; i < types.length; i++) { + var eldefs = this[types[i]][id]; + if (eldefs && eldefs[connectionType]) { + eldefs[connectionType].def.scope = scope; + } + } + + }.bind(this); + + this.getScope = function (el, scope) { + return _getScope(el, [ "sourceEndpointDefinitions", "targetEndpointDefinitions" ]); + }; + this.getSourceScope = function (el) { + return _getScope(el, "sourceEndpointDefinitions"); + }; + this.getTargetScope = function (el) { + return _getScope(el, "targetEndpointDefinitions"); + }; + this.setScope = function (el, scope, connectionType) { + this.setSourceScope(el, scope, connectionType); + this.setTargetScope(el, scope, connectionType); + }; + this.setSourceScope = function (el, scope, connectionType) { + _setScope(el, scope, "sourceEndpointDefinitions", connectionType); + // we get the source scope during the mousedown event, but we also want to set this. + this.setDragScope(el, scope); + }; + this.setTargetScope = function (el, scope, connectionType) { + _setScope(el, scope, "targetEndpointDefinitions", connectionType); + this.setDropScope(el, scope); + }; + + // see api docs + this.unmakeEveryTarget = function () { + for (var i in this.targetEndpointDefinitions) { + _currentInstance.unmakeTarget(i, true); + } + + this.targetEndpointDefinitions = {}; + return this; + }; + + // does the work of setting a source enabled or disabled. + var _setEnabled = function (type, el, state, toggle, connectionType) { + var a = type === "source" ? this.sourceEndpointDefinitions : this.targetEndpointDefinitions, + originalState, info, newState; + + connectionType = connectionType || "default"; + + // a selector or an array + if (el.length && !_ju.isString(el)) { + originalState = []; + for (var i = 0, ii = el.length; i < ii; i++) { + info = _info(el[i]); + if (a[info.id] && a[info.id][connectionType]) { + originalState[i] = a[info.id][connectionType].enabled; + newState = toggle ? !originalState[i] : state; + a[info.id][connectionType].enabled = newState; + _currentInstance[newState ? "removeClass" : "addClass"](info.el, "jtk-" + type + "-disabled"); + } + } + } + // otherwise a DOM element or a String ID. + else { + info = _info(el); + var id = info.id; + if (a[id] && a[id][connectionType]) { + originalState = a[id][connectionType].enabled; + newState = toggle ? !originalState : state; + a[id][connectionType].enabled = newState; + _currentInstance[newState ? "removeClass" : "addClass"](info.el, "jtk-" + type + "-disabled"); + } + } + return originalState; + }.bind(this); + + var _first = function (el, fn) { + if (_ju.isString(el) || !el.length) { + return fn.apply(this, [ el ]); + } + else if (el.length) { + return fn.apply(this, [ el[0] ]); + } + + }.bind(this); + + this.toggleSourceEnabled = function (el, connectionType) { + _setEnabled("source", el, null, true, connectionType); + return this.isSourceEnabled(el, connectionType); + }; + + this.setSourceEnabled = function (el, state, connectionType) { + return _setEnabled("source", el, state, null, connectionType); + }; + this.isSource = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var eldefs = this.sourceEndpointDefinitions[_info(_el).id]; + return eldefs != null && eldefs[connectionType] != null; + }.bind(this)); + }; + this.isSourceEnabled = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var sep = this.sourceEndpointDefinitions[_info(_el).id]; + return sep && sep[connectionType] && sep[connectionType].enabled === true; + }.bind(this)); + }; + + this.toggleTargetEnabled = function (el, connectionType) { + _setEnabled("target", el, null, true, connectionType); + return this.isTargetEnabled(el, connectionType); + }; + + this.isTarget = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var eldefs = this.targetEndpointDefinitions[_info(_el).id]; + return eldefs != null && eldefs[connectionType] != null; + }.bind(this)); + }; + this.isTargetEnabled = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var tep = this.targetEndpointDefinitions[_info(_el).id]; + return tep && tep[connectionType] && tep[connectionType].enabled === true; + }.bind(this)); + }; + this.setTargetEnabled = function (el, state, connectionType) { + return _setEnabled("target", el, state, null, connectionType); + }; + +// --------------------- end makeSource/makeTarget ---------------------------------------------- + + this.ready = function (fn) { + _currentInstance.bind("ready", fn); + }; + + var _elEach = function(el, fn) { + // support both lists... + if (typeof el === 'object' && el.length) { + for (var i = 0, ii = el.length; i < ii; i++) { + fn(el[i]); + } + } + else {// ...and single strings or elements. + fn(el); + } + + return _currentInstance; + }; + + // repaint some element's endpoints and connections + this.repaint = function (el, ui, timestamp) { + return _elEach(el, function(_el) { + _draw(_el, ui, timestamp); + }); + }; + + this.revalidate = function (el, timestamp, isIdAlready) { + return _elEach(el, function(_el) { + var elId = isIdAlready ? _el : _currentInstance.getId(_el); + _currentInstance.updateOffset({ elId: elId, recalc: true, timestamp:timestamp }); + var dm = _currentInstance.getDragManager(); + if (dm) { + dm.updateOffsets(elId); + } + _currentInstance.repaint(_el); + }); + }; + + // repaint every endpoint and connection. + this.repaintEverything = function () { + // TODO this timestamp causes continuous anchors to not repaint properly. + // fix this. do not just take out the timestamp. it runs a lot faster with + // the timestamp included. + var timestamp = _timestamp(), elId; + + for (elId in endpointsByElement) { + _currentInstance.updateOffset({ elId: elId, recalc: true, timestamp: timestamp }); + } + + for (elId in endpointsByElement) { + _draw(elId, null, timestamp); + } + + return this; + }; + + this.removeAllEndpoints = function (el, recurse, affectedElements) { + affectedElements = affectedElements || []; + var _one = function (_el) { + var info = _info(_el), + ebe = endpointsByElement[info.id], + i, ii; + + if (ebe) { + affectedElements.push(info); + for (i = 0, ii = ebe.length; i < ii; i++) { + _currentInstance.deleteEndpoint(ebe[i], false); + } + } + delete endpointsByElement[info.id]; + + if (recurse) { + if (info.el && info.el.nodeType !== 3 && info.el.nodeType !== 8) { + for (i = 0, ii = info.el.childNodes.length; i < ii; i++) { + _one(info.el.childNodes[i]); + } + } + } + + }; + _one(el); + return this; + }; + + var _doRemove = function(info, affectedElements) { + _currentInstance.removeAllEndpoints(info.id, true, affectedElements); + var dm = _currentInstance.getDragManager(); + var _one = function(_info) { + + if (dm) { + dm.elementRemoved(_info.id); + } + _currentInstance.anchorManager.clearFor(_info.id); + _currentInstance.anchorManager.removeFloatingConnection(_info.id); + + if (_currentInstance.isSource(_info.el)) { + _currentInstance.unmakeSource(_info.el); + } + if (_currentInstance.isTarget(_info.el)) { + _currentInstance.unmakeTarget(_info.el); + } + _currentInstance.destroyDraggable(_info.el); + _currentInstance.destroyDroppable(_info.el); + + + delete _currentInstance.floatingConnections[_info.id]; + delete managedElements[_info.id]; + delete offsets[_info.id]; + if (_info.el) { + _currentInstance.removeElement(_info.el); + _info.el._jsPlumb = null; + } + }; + + // remove all affected child elements + for (var ae = 1; ae < affectedElements.length; ae++) { + _one(affectedElements[ae]); + } + // and always remove the requested one from the dom. + _one(info); + }; + + /** + * Remove the given element, including cleaning up all endpoints registered for it. + * This is exposed in the public API but also used internally by jsPlumb when removing the + * element associated with a connection drag. + */ + this.remove = function (el, doNotRepaint) { + var info = _info(el), affectedElements = []; + if (info.text && info.el.parentNode) { + info.el.parentNode.removeChild(info.el); + } + else if (info.id) { + _currentInstance.batch(function () { + _doRemove(info, affectedElements); + }, doNotRepaint === true); + } + return _currentInstance; + }; + + this.empty = function (el, doNotRepaint) { + var affectedElements = []; + var _one = function(el, dontRemoveFocus) { + var info = _info(el); + if (info.text) { + info.el.parentNode.removeChild(info.el); + } + else if (info.el) { + while(info.el.childNodes.length > 0) { + _one(info.el.childNodes[0]); + } + if (!dontRemoveFocus) { + _doRemove(info, affectedElements); + } + } + }; + + _currentInstance.batch(function() { + _one(el, true); + }, doNotRepaint === false); + + return _currentInstance; + }; + + this.reset = function (doNotUnbindInstanceEventListeners) { + _currentInstance.silently(function() { + _hoverSuspended = false; + _currentInstance.removeAllGroups(); + _currentInstance.removeGroupManager(); + _currentInstance.deleteEveryEndpoint(); + if (!doNotUnbindInstanceEventListeners) { + _currentInstance.unbind(); + } + this.targetEndpointDefinitions = {}; + this.sourceEndpointDefinitions = {}; + connections.length = 0; + if (this.doReset) { + this.doReset(); + } + }.bind(this)); + }; + + var _clearObject = function (obj) { + if (obj.canvas && obj.canvas.parentNode) { + obj.canvas.parentNode.removeChild(obj.canvas); + } + obj.cleanup(); + obj.destroy(); + }; + + this.clear = function () { + _currentInstance.select().each(_clearObject); + _currentInstance.selectEndpoints().each(_clearObject); + + endpointsByElement = {}; + endpointsByUUID = {}; + }; + + this.setDefaultScope = function (scope) { + DEFAULT_SCOPE = scope; + return _currentInstance; + }; + + this.deriveEndpointAndAnchorSpec = function(type, dontPrependDefault) { + var bits = ((dontPrependDefault ? "" : "default ") + type).split(/[\s]/), eps = null, ep = null, a = null, as = null; + for (var i = 0; i < bits.length; i++) { + var _t = _currentInstance.getType(bits[i], "connection"); + if (_t) { + if (_t.endpoints) { + eps = _t.endpoints; + } + if (_t.endpoint) { + ep = _t.endpoint; + } + if (_t.anchors) { + as = _t.anchors; + } + if (_t.anchor) { + a = _t.anchor; + } + } + } + return { endpoints: eps ? eps : [ ep, ep ], anchors: as ? as : [a, a ]}; + }; + + // sets the id of some element, changing whatever we need to to keep track. + this.setId = function (el, newId, doNotSetAttribute) { + // + var id; + + if (_ju.isString(el)) { + id = el; + } + else { + el = this.getElement(el); + id = this.getId(el); + } + + var sConns = this.getConnections({source: id, scope: '*'}, true), + tConns = this.getConnections({target: id, scope: '*'}, true); + + newId = "" + newId; + + if (!doNotSetAttribute) { + el = this.getElement(id); + this.setAttribute(el, "id", newId); + } + else { + el = this.getElement(newId); + } + + endpointsByElement[newId] = endpointsByElement[id] || []; + for (var i = 0, ii = endpointsByElement[newId].length; i < ii; i++) { + endpointsByElement[newId][i].setElementId(newId); + endpointsByElement[newId][i].setReferenceElement(el); + } + delete endpointsByElement[id]; + + this.sourceEndpointDefinitions[newId] = this.sourceEndpointDefinitions[id]; + delete this.sourceEndpointDefinitions[id]; + this.targetEndpointDefinitions[newId] = this.targetEndpointDefinitions[id]; + delete this.targetEndpointDefinitions[id]; + + this.anchorManager.changeId(id, newId); + var dm = this.getDragManager(); + if (dm) { + dm.changeId(id, newId); + } + managedElements[newId] = managedElements[id]; + delete managedElements[id]; + + var _conns = function (list, epIdx, type) { + for (var i = 0, ii = list.length; i < ii; i++) { + list[i].endpoints[epIdx].setElementId(newId); + list[i].endpoints[epIdx].setReferenceElement(el); + list[i][type + "Id"] = newId; + list[i][type] = el; + } + }; + _conns(sConns, 0, "source"); + _conns(tConns, 1, "target"); + + this.repaint(newId); + }; + + this.setDebugLog = function (debugLog) { + log = debugLog; + }; + + this.setSuspendDrawing = function (val, repaintAfterwards) { + var curVal = _suspendDrawing; + _suspendDrawing = val; + if (val) { + _suspendedAt = new Date().getTime(); + } else { + _suspendedAt = null; + } + if (repaintAfterwards) { + this.repaintEverything(); + } + return curVal; + }; + + // returns whether or not drawing is currently suspended. + this.isSuspendDrawing = function () { + return _suspendDrawing; + }; + + // return timestamp for when drawing was suspended. + this.getSuspendedAt = function () { + return _suspendedAt; + }; + + this.batch = function (fn, doNotRepaintAfterwards) { + var _wasSuspended = this.isSuspendDrawing(); + if (!_wasSuspended) { + this.setSuspendDrawing(true); + } + try { + fn(); + } + catch (e) { + _ju.log("Function run while suspended failed", e); + } + if (!_wasSuspended) { + this.setSuspendDrawing(false, !doNotRepaintAfterwards); + } + }; + + this.doWhileSuspended = this.batch; + + this.getCachedData = _getCachedData; + this.timestamp = _timestamp; + this.show = function (el, changeEndpoints) { + _setVisible(el, "block", changeEndpoints); + return _currentInstance; + }; + + // TODO: update this method to return the current state. + this.toggleVisible = _toggleVisible; + this.addListener = this.bind; + + var floatingConnections = []; + this.registerFloatingConnection = function(info, conn, ep) { + floatingConnections[info.id] = conn; + // only register for the target endpoint; we will not be dragging the source at any time + // before this connection is either discarded or made into a permanent connection. + _ju.addToList(endpointsByElement, info.id, ep); + }; + this.getFloatingConnectionFor = function(id) { + return floatingConnections[id]; + }; + + this.listManager = new root.jsPlumbListManager(this, this.Defaults.ListStyle); + }; + + _ju.extend(root.jsPlumbInstance, _ju.EventGenerator, { + setAttribute: function (el, a, v) { + this.setAttribute(el, a, v); + }, + getAttribute: function (el, a) { + return this.getAttribute(root.jsPlumb.getElement(el), a); + }, + convertToFullOverlaySpec: function(spec) { + if (_ju.isString(spec)) { + spec = [ spec, { } ]; + } + spec[1].id = spec[1].id || _ju.uuid(); + return spec; + }, + registerConnectionType: function (id, type) { + this._connectionTypes[id] = root.jsPlumb.extend({}, type); + if (type.overlays) { + var to = {}; + for (var i = 0; i < type.overlays.length; i++) { + // if a string, convert to object representation so that we can store the typeid on it. + // also assign an id. + var fo = this.convertToFullOverlaySpec(type.overlays[i]); + to[fo[1].id] = fo; + } + this._connectionTypes[id].overlays = to; + } + }, + registerConnectionTypes: function (types) { + for (var i in types) { + this.registerConnectionType(i, types[i]); + } + }, + registerEndpointType: function (id, type) { + this._endpointTypes[id] = root.jsPlumb.extend({}, type); + if (type.overlays) { + var to = {}; + for (var i = 0; i < type.overlays.length; i++) { + // if a string, convert to object representation so that we can store the typeid on it. + // also assign an id. + var fo = this.convertToFullOverlaySpec(type.overlays[i]); + to[fo[1].id] = fo; + } + this._endpointTypes[id].overlays = to; + } + }, + registerEndpointTypes: function (types) { + for (var i in types) { + this.registerEndpointType(i, types[i]); + } + }, + getType: function (id, typeDescriptor) { + return typeDescriptor === "connection" ? this._connectionTypes[id] : this._endpointTypes[id]; + }, + setIdChanged: function (oldId, newId) { + this.setId(oldId, newId, true); + }, + // set parent: change the parent for some node and update all the registrations we need to. + setParent: function (el, newParent) { + var _dom = this.getElement(el), + _id = this.getId(_dom), + _pdom = this.getElement(newParent), + _pid = this.getId(_pdom), + dm = this.getDragManager(); + + _dom.parentNode.removeChild(_dom); + _pdom.appendChild(_dom); + if (dm) { + dm.setParent(_dom, _id, _pdom, _pid); + } + }, + extend: function (o1, o2, names) { + var i; + if (names) { + for (i = 0; i < names.length; i++) { + o1[names[i]] = o2[names[i]]; + } + } + else { + for (i in o2) { + o1[i] = o2[i]; + } + } + + return o1; + }, + floatingConnections: {}, + getFloatingAnchorIndex: function (jpc) { + return jpc.endpoints[0].isFloating() ? 0 : jpc.endpoints[1].isFloating() ? 1 : -1; + }, + proxyConnection :function(connection, index, proxyEl, proxyElId, endpointGenerator, anchorGenerator) { + var proxyEp, + originalElementId = connection.endpoints[index].elementId, + originalEndpoint = connection.endpoints[index]; + + connection.proxies = connection.proxies || []; + if(connection.proxies[index]) { + proxyEp = connection.proxies[index].ep; + }else { + proxyEp = this.addEndpoint(proxyEl, { + endpoint:endpointGenerator(connection, index), + anchor:anchorGenerator(connection, index), + parameters:{ + isProxyEndpoint:true + } + }); + } + proxyEp.setDeleteOnEmpty(true); + + // for this index, stash proxy info: the new EP, the original EP. + connection.proxies[index] = { ep:proxyEp, originalEp: originalEndpoint }; + + // and advise the anchor manager + if (index === 0) { + // TODO why are there two differently named methods? Why is there not one method that says "some end of this + // connection changed (you give the index), and here's the new element and element id." + this.anchorManager.sourceChanged(originalElementId, proxyElId, connection, proxyEl); + } + else { + this.anchorManager.updateOtherEndpoint(connection.endpoints[0].elementId, originalElementId, proxyElId, connection); + connection.target = proxyEl; + connection.targetId = proxyElId; + } + + // detach the original EP from the connection. + originalEndpoint.detachFromConnection(connection, null, true); + + // set the proxy as the new ep + proxyEp.connections = [ connection ]; + connection.endpoints[index] = proxyEp; + + originalEndpoint.setVisible(false); + + connection.setVisible(true); + + this.revalidate(proxyEl); + }, + unproxyConnection : function(connection, index, proxyElId) { + // if connection cleaned up, no proxies, or none for this end of the connection, abort. + if (connection._jsPlumb == null || connection.proxies == null || connection.proxies[index] == null) { + return; + } + + var originalElement = connection.proxies[index].originalEp.element, + originalElementId = connection.proxies[index].originalEp.elementId; + + connection.endpoints[index] = connection.proxies[index].originalEp; + // and advise the anchor manager + if (index === 0) { + // TODO why are there two differently named methods? Why is there not one method that says "some end of this + // connection changed (you give the index), and here's the new element and element id." + this.anchorManager.sourceChanged(proxyElId, originalElementId, connection, originalElement); + } + else { + this.anchorManager.updateOtherEndpoint(connection.endpoints[0].elementId, proxyElId, originalElementId, connection); + connection.target = originalElement; + connection.targetId = originalElementId; + } + + // detach the proxy EP from the connection (which will cause it to be removed as we no longer need it) + connection.proxies[index].ep.detachFromConnection(connection, null); + + connection.proxies[index].originalEp.addConnection(connection); + if(connection.isVisible()) { + connection.proxies[index].originalEp.setVisible(true); + } + + // cleanup + delete connection.proxies[index]; + } + }); + +// --------------------- static instance + module registration ------------------------------------------- + +// create static instance and assign to window if window exists. + var jsPlumb = new jsPlumbInstance(); + // register on 'root' (lets us run on server or browser) + root.jsPlumb = jsPlumb; + // add 'getInstance' method to static instance + jsPlumb.getInstance = function (_defaults, overrideFns) { + var j = new jsPlumbInstance(_defaults); + if (overrideFns) { + for (var ovf in overrideFns) { + j[ovf] = overrideFns[ovf]; + } + } + j.init(); + return j; + }; + jsPlumb.each = function (spec, fn) { + if (spec == null) { + return; + } + if (typeof spec === "string") { + fn(jsPlumb.getElement(spec)); + } + else if (spec.length != null) { + for (var i = 0; i < spec.length; i++) { + fn(jsPlumb.getElement(spec[i])); + } + } + else { + fn(spec); + } // assume it's an element. + }; + + // CommonJS + if (typeof exports !== 'undefined') { + exports.jsPlumb = jsPlumb; + } + +// --------------------- end static instance + AMD registration ------------------------------------------- + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function() { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + // ------------------------------ BEGIN OverlayCapablejsPlumbUIComponent -------------------------------------------- + + var _internalLabelOverlayId = "__label", + // this is a shortcut helper method to let people add a label as + // overlay. + _makeLabelOverlay = function (component, params) { + + var _params = { + cssClass: params.cssClass, + labelStyle: component.labelStyle, + id: _internalLabelOverlayId, + component: component, + _jsPlumb: component._jsPlumb.instance // TODO not necessary, since the instance can be accessed through the component. + }, + mergedParams = _jp.extend(_params, params); + + return new _jp.Overlays[component._jsPlumb.instance.getRenderMode()].Label(mergedParams); + }, + _processOverlay = function (component, o) { + var _newOverlay = null; + if (_ju.isArray(o)) { // this is for the shorthand ["Arrow", { width:50 }] syntax + // there's also a three arg version: + // ["Arrow", { width:50 }, {location:0.7}] + // which merges the 3rd arg into the 2nd. + var type = o[0], + // make a copy of the object so as not to mess up anyone else's reference... + p = _jp.extend({component: component, _jsPlumb: component._jsPlumb.instance}, o[1]); + if (o.length === 3) { + _jp.extend(p, o[2]); + } + _newOverlay = new _jp.Overlays[component._jsPlumb.instance.getRenderMode()][type](p); + } else if (o.constructor === String) { + _newOverlay = new _jp.Overlays[component._jsPlumb.instance.getRenderMode()][o]({component: component, _jsPlumb: component._jsPlumb.instance}); + } else { + _newOverlay = o; + } + + _newOverlay.id = _newOverlay.id || _ju.uuid(); + component.cacheTypeItem("overlay", _newOverlay, _newOverlay.id); + component._jsPlumb.overlays[_newOverlay.id] = _newOverlay; + + return _newOverlay; + }; + + _jp.OverlayCapableJsPlumbUIComponent = function (params) { + + root.jsPlumbUIComponent.apply(this, arguments); + this._jsPlumb.overlays = {}; + this._jsPlumb.overlayPositions = {}; + + if (params.label) { + this.getDefaultType().overlays[_internalLabelOverlayId] = ["Label", { + label: params.label, + location: params.labelLocation || this.defaultLabelLocation || 0.5, + labelStyle: params.labelStyle || this._jsPlumb.instance.Defaults.LabelStyle, + id:_internalLabelOverlayId + }]; + } + + this.setListenerComponent = function (c) { + if (this._jsPlumb) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].setListenerComponent(c); + } + } + }; + }; + + _jp.OverlayCapableJsPlumbUIComponent.applyType = function (component, t) { + if (t.overlays) { + // loop through the ones in the type. if already present on the component, + // dont remove or re-add. + var keep = {}, i; + + for (i in t.overlays) { + + var existing = component._jsPlumb.overlays[t.overlays[i][1].id]; + if (existing) { + // maybe update from data, if there were parameterised values for instance. + existing.updateFrom(t.overlays[i][1]); + keep[t.overlays[i][1].id] = true; + + existing.reattach(component._jsPlumb.instance, component); + } + else { + var c = component.getCachedTypeItem("overlay", t.overlays[i][1].id); + if (c != null) { + c.reattach(component._jsPlumb.instance, component); + c.setVisible(true); + // maybe update from data, if there were parameterised values for instance. + c.updateFrom(t.overlays[i][1]); + component._jsPlumb.overlays[c.id] = c; + } + else { + c = component.addOverlay(t.overlays[i], true); + } + keep[c.id] = true; + } + } + + // now loop through the full overlays and remove those that we dont want to keep + for (i in component._jsPlumb.overlays) { + if (keep[component._jsPlumb.overlays[i].id] == null) { + component.removeOverlay(component._jsPlumb.overlays[i].id, true); // remove overlay but dont clean it up. + // that would remove event listeners etc; overlays are never discarded by the types stuff, they are + // just detached/reattached. + } + } + } + }; + + _ju.extend(_jp.OverlayCapableJsPlumbUIComponent, root.jsPlumbUIComponent, { + + setHover: function (hover, ignoreAttachedElements) { + if (this._jsPlumb && !this._jsPlumb.instance.isConnectionBeingDragged()) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i][hover ? "addClass" : "removeClass"](this._jsPlumb.instance.hoverClass); + } + } + }, + addOverlay: function (overlay, doNotRepaint) { + var o = _processOverlay(this, overlay); + + if (this.getData && o.type === "Label" && _ju.isArray(overlay)) { + // + // component data might contain label location - look for it here. + var d = this.getData(), p = overlay[1]; + if (d) { + var locationAttribute = p.labelLocationAttribute || "labelLocation"; + var loc = d ? d[locationAttribute] : null; + + if (loc) { + o.loc = loc; + } + } + } + + if (!doNotRepaint) { + this.repaint(); + } + return o; + }, + getOverlay: function (id) { + return this._jsPlumb.overlays[id]; + }, + getOverlays: function () { + return this._jsPlumb.overlays; + }, + hideOverlay: function (id) { + var o = this.getOverlay(id); + if (o) { + o.hide(); + } + }, + hideOverlays: function () { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].hide(); + } + }, + showOverlay: function (id) { + var o = this.getOverlay(id); + if (o) { + o.show(); + } + }, + showOverlays: function () { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].show(); + } + }, + removeAllOverlays: function (doNotRepaint) { + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays[i].cleanup) { + this._jsPlumb.overlays[i].cleanup(); + } + } + + this._jsPlumb.overlays = {}; + this._jsPlumb.overlayPositions = null; + this._jsPlumb.overlayPlacements= {}; + if (!doNotRepaint) { + this.repaint(); + } + }, + removeOverlay: function (overlayId, dontCleanup) { + var o = this._jsPlumb.overlays[overlayId]; + if (o) { + o.setVisible(false); + if (!dontCleanup && o.cleanup) { + o.cleanup(); + } + delete this._jsPlumb.overlays[overlayId]; + if (this._jsPlumb.overlayPositions) { + delete this._jsPlumb.overlayPositions[overlayId]; + } + + if (this._jsPlumb.overlayPlacements) { + delete this._jsPlumb.overlayPlacements[overlayId]; + } + } + }, + removeOverlays: function () { + for (var i = 0, j = arguments.length; i < j; i++) { + this.removeOverlay(arguments[i]); + } + }, + moveParent: function (newParent) { + if (this.bgCanvas) { + this.bgCanvas.parentNode.removeChild(this.bgCanvas); + newParent.appendChild(this.bgCanvas); + } + + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + newParent.appendChild(this.canvas); + + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays[i].isAppendedAtTopLevel) { + var el = this._jsPlumb.overlays[i].getElement(); + el.parentNode.removeChild(el); + newParent.appendChild(el); + } + } + } + }, + getLabel: function () { + var lo = this.getOverlay(_internalLabelOverlayId); + return lo != null ? lo.getLabel() : null; + }, + getLabelOverlay: function () { + return this.getOverlay(_internalLabelOverlayId); + }, + setLabel: function (l) { + var lo = this.getOverlay(_internalLabelOverlayId); + if (!lo) { + var params = l.constructor === String || l.constructor === Function ? { label: l } : l; + lo = _makeLabelOverlay(this, params); + this._jsPlumb.overlays[_internalLabelOverlayId] = lo; + } + else { + if (l.constructor === String || l.constructor === Function) { + lo.setLabel(l); + } + else { + if (l.label) { + lo.setLabel(l.label); + } + if (l.location) { + lo.setLocation(l.location); + } + } + } + + if (!this._jsPlumb.instance.isSuspendDrawing()) { + this.repaint(); + } + }, + cleanup: function (force) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].cleanup(force); + this._jsPlumb.overlays[i].destroy(force); + } + if (force) { + this._jsPlumb.overlays = {}; + this._jsPlumb.overlayPositions = null; + } + }, + setVisible: function (v) { + this[v ? "showOverlays" : "hideOverlays"](); + }, + setAbsoluteOverlayPosition: function (overlay, xy) { + this._jsPlumb.overlayPositions[overlay.id] = xy; + }, + getAbsoluteOverlayPosition: function (overlay) { + return this._jsPlumb.overlayPositions ? this._jsPlumb.overlayPositions[overlay.id] : null; + }, + _clazzManip:function(action, clazz, dontUpdateOverlays) { + if (!dontUpdateOverlays) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i][action + "Class"](clazz); + } + } + }, + addClass:function(clazz, dontUpdateOverlays) { + this._clazzManip("add", clazz, dontUpdateOverlays); + }, + removeClass:function(clazz, dontUpdateOverlays) { + this._clazzManip("remove", clazz, dontUpdateOverlays); + } + }); + +// ------------------------------ END OverlayCapablejsPlumbUIComponent -------------------------------------------- + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the code for Endpoints. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + // create the drag handler for a connection + var _makeConnectionDragHandler = function (endpoint, placeholder, _jsPlumb) { + var stopped = false; + return { + drag: function () { + if (stopped) { + stopped = false; + return true; + } + + if (placeholder.element) { + var _ui = _jsPlumb.getUIPosition(arguments, _jsPlumb.getZoom()); + if (_ui != null) { + _jsPlumb.setPosition(placeholder.element, _ui); + } + _jsPlumb.repaint(placeholder.element, _ui); + // always repaint the source endpoint, because only continuous/dynamic anchors cause the endpoint + // to be repainted, so static anchors need to be told (or the endpoint gets dragged around) + endpoint.paint({anchorPoint:endpoint.anchor.getCurrentLocation({element:endpoint})}); + } + }, + stopDrag: function () { + stopped = true; + } + }; + }; + + // creates a placeholder div for dragging purposes, adds it, and pre-computes its offset. + var _makeDraggablePlaceholder = function (placeholder, _jsPlumb, ipco, ips) { + var n = _jsPlumb.createElement("div", { position : "absolute" }); + _jsPlumb.appendElement(n); + var id = _jsPlumb.getId(n); + _jsPlumb.setPosition(n, ipco); + n.style.width = ips[0] + "px"; + n.style.height = ips[1] + "px"; + _jsPlumb.manage(id, n, true); // TRANSIENT MANAGE + // create and assign an id, and initialize the offset. + placeholder.id = id; + placeholder.element = n; + }; + + // create a floating endpoint (for drag connections) + var _makeFloatingEndpoint = function (paintStyle, referenceAnchor, endpoint, referenceCanvas, sourceElement, _jsPlumb, _newEndpoint, scope) { + var floatingAnchor = new _jp.FloatingAnchor({ reference: referenceAnchor, referenceCanvas: referenceCanvas, jsPlumbInstance: _jsPlumb }); + //setting the scope here should not be the way to fix that mootools issue. it should be fixed by not + // adding the floating endpoint as a droppable. that makes more sense anyway! + // TRANSIENT MANAGE + return _newEndpoint({ + paintStyle: paintStyle, + endpoint: endpoint, + anchor: floatingAnchor, + source: sourceElement, + scope: scope + }); + }; + + var typeParameters = [ "connectorStyle", "connectorHoverStyle", "connectorOverlays", + "connector", "connectionType", "connectorClass", "connectorHoverClass" ]; + + // a helper function that tries to find a connection to the given element, and returns it if so. if elementWithPrecedence is null, + // or no connection to it is found, we return the first connection in our list. + var findConnectionToUseForDynamicAnchor = function (ep, elementWithPrecedence) { + var idx = 0; + if (elementWithPrecedence != null) { + for (var i = 0; i < ep.connections.length; i++) { + if (ep.connections[i].sourceId === elementWithPrecedence || ep.connections[i].targetId === elementWithPrecedence) { + idx = i; + break; + } + } + } + + return ep.connections[idx]; + }; + + _jp.Endpoint = function (params) { + var _jsPlumb = params._jsPlumb, + _newConnection = params.newConnection, + _newEndpoint = params.newEndpoint; + + this.idPrefix = "_jsplumb_e_"; + this.defaultLabelLocation = [ 0.5, 0.5 ]; + this.defaultOverlayKeys = ["Overlays", "EndpointOverlays"]; + _jp.OverlayCapableJsPlumbUIComponent.apply(this, arguments); + +// TYPE + + this.appendToDefaultType({ + connectionType:params.connectionType, + maxConnections: params.maxConnections == null ? this._jsPlumb.instance.Defaults.MaxConnections : params.maxConnections, // maximum number of connections this endpoint can be the source of., + paintStyle: params.endpointStyle || params.paintStyle || params.style || this._jsPlumb.instance.Defaults.EndpointStyle || _jp.Defaults.EndpointStyle, + hoverPaintStyle: params.endpointHoverStyle || params.hoverPaintStyle || this._jsPlumb.instance.Defaults.EndpointHoverStyle || _jp.Defaults.EndpointHoverStyle, + connectorStyle: params.connectorStyle, + connectorHoverStyle: params.connectorHoverStyle, + connectorClass: params.connectorClass, + connectorHoverClass: params.connectorHoverClass, + connectorOverlays: params.connectorOverlays, + connector: params.connector, + connectorTooltip: params.connectorTooltip + }); + +// END TYPE + + this._jsPlumb.enabled = !(params.enabled === false); + this._jsPlumb.visible = true; + this.element = _jp.getElement(params.source); + this._jsPlumb.uuid = params.uuid; + this._jsPlumb.floatingEndpoint = null; + var inPlaceCopy = null; + if (this._jsPlumb.uuid) { + params.endpointsByUUID[this._jsPlumb.uuid] = this; + } + this.elementId = params.elementId; + this.dragProxy = params.dragProxy; + + this._jsPlumb.connectionCost = params.connectionCost; + this._jsPlumb.connectionsDirected = params.connectionsDirected; + this._jsPlumb.currentAnchorClass = ""; + this._jsPlumb.events = {}; + + var deleteOnEmpty = params.deleteOnEmpty === true; + this.setDeleteOnEmpty = function(d) { + deleteOnEmpty = d; + }; + + var _updateAnchorClass = function () { + // stash old, get new + var oldAnchorClass = _jsPlumb.endpointAnchorClassPrefix + "-" + this._jsPlumb.currentAnchorClass; + this._jsPlumb.currentAnchorClass = this.anchor.getCssClass(); + var anchorClass = _jsPlumb.endpointAnchorClassPrefix + (this._jsPlumb.currentAnchorClass ? "-" + this._jsPlumb.currentAnchorClass : ""); + + this.removeClass(oldAnchorClass); + this.addClass(anchorClass); + // add and remove at the same time to reduce the number of reflows. + _jp.updateClasses(this.element, anchorClass, oldAnchorClass); + }.bind(this); + + this.prepareAnchor = function(anchorParams) { + var a = this._jsPlumb.instance.makeAnchor(anchorParams, this.elementId, _jsPlumb); + a.bind("anchorChanged", function (currentAnchor) { + this.fire("anchorChanged", {endpoint: this, anchor: currentAnchor}); + _updateAnchorClass(); + }.bind(this)); + return a; + }; + + this.setPreparedAnchor = function(anchor, doNotRepaint) { + this._jsPlumb.instance.continuousAnchorFactory.clear(this.elementId); + this.anchor = anchor; + _updateAnchorClass(); + + if (!doNotRepaint) { + this._jsPlumb.instance.repaint(this.elementId); + } + + return this; + }; + + this.setAnchor = function (anchorParams, doNotRepaint) { + var a = this.prepareAnchor(anchorParams); + this.setPreparedAnchor(a, doNotRepaint); + return this; + }; + + var internalHover = function (state) { + if (this.connections.length > 0) { + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].setHover(state, false); + } + } + else { + this.setHover(state); + } + }.bind(this); + + this.bind("mouseover", function () { + internalHover(true); + }); + this.bind("mouseout", function () { + internalHover(false); + }); + + // ANCHOR MANAGER + if (!params._transient) { // in place copies, for example, are transient. they will never need to be retrieved during a paint cycle, because they dont move, and then they are deleted. + this._jsPlumb.instance.anchorManager.add(this, this.elementId); + } + + this.prepareEndpoint = function(ep, typeId) { + var _e = function (t, p) { + var rm = _jsPlumb.getRenderMode(); + if (_jp.Endpoints[rm][t]) { + return new _jp.Endpoints[rm][t](p); + } + if (!_jsPlumb.Defaults.DoNotThrowErrors) { + throw { msg: "jsPlumb: unknown endpoint type '" + t + "'" }; + } + }; + + var endpointArgs = { + _jsPlumb: this._jsPlumb.instance, + cssClass: params.cssClass, + container: params.container, + tooltip: params.tooltip, + connectorTooltip: params.connectorTooltip, + endpoint: this + }; + + var endpoint; + + if (_ju.isString(ep)) { + endpoint = _e(ep, endpointArgs); + } + else if (_ju.isArray(ep)) { + endpointArgs = _ju.merge(ep[1], endpointArgs); + endpoint = _e(ep[0], endpointArgs); + } + else { + endpoint = ep.clone(); + } + + // assign a clone function using a copy of endpointArgs. this is used when a drag starts: the endpoint that was dragged is cloned, + // and the clone is left in its place while the original one goes off on a magical journey. + // the copy is to get around a closure problem, in which endpointArgs ends up getting shared by + // the whole world. + //var argsForClone = jsPlumb.extend({}, endpointArgs); + endpoint.clone = function () { + // TODO this, and the code above, can be refactored to be more dry. + if (_ju.isString(ep)) { + return _e(ep, endpointArgs); + } + else if (_ju.isArray(ep)) { + endpointArgs = _ju.merge(ep[1], endpointArgs); + return _e(ep[0], endpointArgs); + } + }.bind(this); + + endpoint.typeId = typeId; + return endpoint; + }; + + this.setEndpoint = function(ep, doNotRepaint) { + var _ep = this.prepareEndpoint(ep); + this.setPreparedEndpoint(_ep, true); + }; + + this.setPreparedEndpoint = function (ep, doNotRepaint) { + if (this.endpoint != null) { + this.endpoint.cleanup(); + this.endpoint.destroy(); + } + this.endpoint = ep; + this.type = this.endpoint.type; + this.canvas = this.endpoint.canvas; + }; + + _jp.extend(this, params, typeParameters); + + this.isSource = params.isSource || false; + this.isTemporarySource = params.isTemporarySource || false; + this.isTarget = params.isTarget || false; + + this.connections = params.connections || []; + this.connectorPointerEvents = params["connector-pointer-events"]; + + this.scope = params.scope || _jsPlumb.getDefaultScope(); + this.timestamp = null; + this.reattachConnections = params.reattach || _jsPlumb.Defaults.ReattachConnections; + this.connectionsDetachable = _jsPlumb.Defaults.ConnectionsDetachable; + if (params.connectionsDetachable === false || params.detachable === false) { + this.connectionsDetachable = false; + } + this.dragAllowedWhenFull = params.dragAllowedWhenFull !== false; + + if (params.onMaxConnections) { + this.bind("maxConnections", params.onMaxConnections); + } + + // + // add a connection. not part of public API. + // + this.addConnection = function (connection) { + this.connections.push(connection); + this[(this.connections.length > 0 ? "add" : "remove") + "Class"](_jsPlumb.endpointConnectedClass); + this[(this.isFull() ? "add" : "remove") + "Class"](_jsPlumb.endpointFullClass); + }; + + this.detachFromConnection = function (connection, idx, doNotCleanup) { + idx = idx == null ? this.connections.indexOf(connection) : idx; + if (idx >= 0) { + this.connections.splice(idx, 1); + this[(this.connections.length > 0 ? "add" : "remove") + "Class"](_jsPlumb.endpointConnectedClass); + this[(this.isFull() ? "add" : "remove") + "Class"](_jsPlumb.endpointFullClass); + } + + if (!doNotCleanup && deleteOnEmpty && this.connections.length === 0) { + _jsPlumb.deleteObject({ + endpoint: this, + fireEvent: false, + deleteAttachedObjects: doNotCleanup !== true + }); + } + }; + + this.deleteEveryConnection = function(params) { + var c = this.connections.length; + for (var i = 0; i < c; i++) { + _jsPlumb.deleteConnection(this.connections[0], params); + } + }; + + this.detachFrom = function (targetEndpoint, fireEvent, originalEvent) { + var c = []; + for (var i = 0; i < this.connections.length; i++) { + if (this.connections[i].endpoints[1] === targetEndpoint || this.connections[i].endpoints[0] === targetEndpoint) { + c.push(this.connections[i]); + } + } + for (var j = 0, count = c.length; j < count; j++) { + _jsPlumb.deleteConnection(c[0]); + } + return this; + }; + + this.getElement = function () { + return this.element; + }; + + this.setElement = function (el) { + var parentId = this._jsPlumb.instance.getId(el), + curId = this.elementId; + // remove the endpoint from the list for the current endpoint's element + _ju.removeWithFunction(params.endpointsByElement[this.elementId], function (e) { + return e.id === this.id; + }.bind(this)); + this.element = _jp.getElement(el); + this.elementId = _jsPlumb.getId(this.element); + _jsPlumb.anchorManager.rehomeEndpoint(this, curId, this.element); + _jsPlumb.dragManager.endpointAdded(this.element); + _ju.addToList(params.endpointsByElement, parentId, this); + return this; + }; + + /** + * private but must be exposed. + */ + this.makeInPlaceCopy = function () { + var loc = this.anchor.getCurrentLocation({element: this}), + o = this.anchor.getOrientation(this), + acc = this.anchor.getCssClass(), + inPlaceAnchor = { + bind: function () { + }, + compute: function () { + return [ loc[0], loc[1] ]; + }, + getCurrentLocation: function () { + return [ loc[0], loc[1] ]; + }, + getOrientation: function () { + return o; + }, + getCssClass: function () { + return acc; + } + }; + + return _newEndpoint({ + dropOptions: params.dropOptions, + anchor: inPlaceAnchor, + source: this.element, + paintStyle: this.getPaintStyle(), + endpoint: params.hideOnDrag ? "Blank" : this.endpoint, + _transient: true, + scope: this.scope, + reference:this + }); + }; + + /** + * returns a connection from the pool; used when dragging starts. just gets the head of the array if it can. + */ + this.connectorSelector = function () { + return this.connections[0]; + }; + + this.setStyle = this.setPaintStyle; + + this.paint = function (params) { + params = params || {}; + var timestamp = params.timestamp, recalc = !(params.recalc === false); + if (!timestamp || this.timestamp !== timestamp) { + + var info = _jsPlumb.updateOffset({ elId: this.elementId, timestamp: timestamp }); + + var xy = params.offset ? params.offset.o : info.o; + if (xy != null) { + var ap = params.anchorPoint, connectorPaintStyle = params.connectorPaintStyle; + if (ap == null) { + var wh = params.dimensions || info.s, + anchorParams = { xy: [ xy.left, xy.top ], wh: wh, element: this, timestamp: timestamp }; + if (recalc && this.anchor.isDynamic && this.connections.length > 0) { + var c = findConnectionToUseForDynamicAnchor(this, params.elementWithPrecedence), + oIdx = c.endpoints[0] === this ? 1 : 0, + oId = oIdx === 0 ? c.sourceId : c.targetId, + oInfo = _jsPlumb.getCachedData(oId), + oOffset = oInfo.o, oWH = oInfo.s; + + anchorParams.index = oIdx === 0 ? 1 : 0; + anchorParams.connection = c; + anchorParams.txy = [ oOffset.left, oOffset.top ]; + anchorParams.twh = oWH; + anchorParams.tElement = c.endpoints[oIdx]; + } else if (this.connections.length > 0) { + anchorParams.connection = this.connections[0]; + } + ap = this.anchor.compute(anchorParams); + } + + this.endpoint.compute(ap, this.anchor.getOrientation(this), this._jsPlumb.paintStyleInUse, connectorPaintStyle || this.paintStyleInUse); + this.endpoint.paint(this._jsPlumb.paintStyleInUse, this.anchor); + this.timestamp = timestamp; + + // paint overlays + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays.hasOwnProperty(i)) { + var o = this._jsPlumb.overlays[i]; + if (o.isVisible()) { + this._jsPlumb.overlayPlacements[i] = o.draw(this.endpoint, this._jsPlumb.paintStyleInUse); + o.paint(this._jsPlumb.overlayPlacements[i]); + } + } + } + } + } + }; + + this.getTypeDescriptor = function () { + return "endpoint"; + }; + this.isVisible = function () { + return this._jsPlumb.visible; + }; + + this.repaint = this.paint; + + var draggingInitialised = false; + this.initDraggable = function () { + + // is this a connection source? we make it draggable and have the + // drag listener maintain a connection with a floating endpoint. + if (!draggingInitialised && _jp.isDragSupported(this.element)) { + var placeholderInfo = { id: null, element: null }, + jpc = null, + existingJpc = false, + existingJpcParams = null, + _dragHandler = _makeConnectionDragHandler(this, placeholderInfo, _jsPlumb), + dragOptions = params.dragOptions || {}, + defaultOpts = {}, + startEvent = _jp.dragEvents.start, + stopEvent = _jp.dragEvents.stop, + dragEvent = _jp.dragEvents.drag, + beforeStartEvent = _jp.dragEvents.beforeStart, + payload; + + // respond to beforeStart from katavorio; this will have, optionally, a payload of attribute values + // that were placed there by the makeSource mousedown listener. + var beforeStart = function(beforeStartParams) { + payload = beforeStartParams.e.payload || {}; + }; + + var start = function (startParams) { + +// ------------- first, get a connection to drag. this may be null, in which case we are dragging a new one. + + jpc = this.connectorSelector(); + +// -------------------------------- now a bunch of tests about whether or not to proceed ------------------------- + + var _continue = true; + // if not enabled, return + if (!this.isEnabled()) { + _continue = false; + } + // if no connection and we're not a source - or temporarily a source, as is the case with makeSource - return. + if (jpc == null && !this.isSource && !this.isTemporarySource) { + _continue = false; + } + // otherwise if we're full and not allowed to drag, also return false. + if (this.isSource && this.isFull() && !(jpc != null && this.dragAllowedWhenFull)) { + _continue = false; + } + // if the connection was setup as not detachable or one of its endpoints + // was setup as connectionsDetachable = false, or Defaults.ConnectionsDetachable + // is set to false... + if (jpc != null && !jpc.isDetachable(this)) { + // .. and the endpoint is full + if (this.isFull()) { + _continue = false; + } else { + // otherwise, if not full, set the connection to null, and we will now proceed + // to drag a new connection. + jpc = null; + } + } + + var beforeDrag = _jsPlumb.checkCondition(jpc == null ? "beforeDrag" : "beforeStartDetach", { + endpoint:this, + source:this.element, + sourceId:this.elementId, + connection:jpc + }); + if (beforeDrag === false) { + _continue = false; + } + // else we might have been given some data. we'll pass it in to a new connection as 'data'. + // here we also merge in the optional payload we were given on mousedown. + else if (typeof beforeDrag === "object") { + _jp.extend(beforeDrag, payload || {}); + } + else { + // or if no beforeDrag data, maybe use the payload on its own. + beforeDrag = payload || {}; + } + + if (_continue === false) { + // this is for mootools and yui. returning false from this causes jquery to stop drag. + // the events are wrapped in both mootools and yui anyway, but i don't think returning + // false from the start callback would stop a drag. + if (_jsPlumb.stopDrag) { + _jsPlumb.stopDrag(this.canvas); + } + _dragHandler.stopDrag(); + return false; + } + +// --------------------------------------------------------------------------------------------------------------------- + + // ok to proceed. + + // clear hover for all connections for this endpoint before continuing. + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].setHover(false); + } + + this.addClass("endpointDrag"); + _jsPlumb.setConnectionBeingDragged(true); + + // if we're not full but there was a connection, make it null. we'll create a new one. + if (jpc && !this.isFull() && this.isSource) { + jpc = null; + } + + _jsPlumb.updateOffset({ elId: this.elementId }); + +// ---------------- make the element we will drag around, and position it ----------------------------- + + var ipco = this._jsPlumb.instance.getOffset(this.canvas), + canvasElement = this.canvas, + ips = this._jsPlumb.instance.getSize(this.canvas); + + _makeDraggablePlaceholder(placeholderInfo, _jsPlumb, ipco, ips); + + // store the id of the dragging div and the source element. the drop function will pick these up. + _jsPlumb.setAttributes(this.canvas, { + "dragId": placeholderInfo.id, + "elId": this.elementId + }); + +// ------------------- create an endpoint that will be our floating endpoint ------------------------------------ + + var endpointToFloat = this.dragProxy || this.endpoint; + if (this.dragProxy == null && this.connectionType != null) { + var aae = this._jsPlumb.instance.deriveEndpointAndAnchorSpec(this.connectionType); + if (aae.endpoints[1]) { + endpointToFloat = aae.endpoints[1]; + } + } + var centerAnchor = this._jsPlumb.instance.makeAnchor("Center"); + centerAnchor.isFloating = true; + this._jsPlumb.floatingEndpoint = _makeFloatingEndpoint(this.getPaintStyle(), centerAnchor, endpointToFloat, this.canvas, placeholderInfo.element, _jsPlumb, _newEndpoint, this.scope); + var _savedAnchor = this._jsPlumb.floatingEndpoint.anchor; + + + if (jpc == null) { + + this.setHover(false, false); + // create a connection. one end is this endpoint, the other is a floating endpoint. + jpc = _newConnection({ + sourceEndpoint: this, + targetEndpoint: this._jsPlumb.floatingEndpoint, + source: this.element, // for makeSource with parent option. ensure source element is represented correctly. + target: placeholderInfo.element, + anchors: [ this.anchor, this._jsPlumb.floatingEndpoint.anchor ], + paintStyle: params.connectorStyle, // this can be null. Connection will use the default. + hoverPaintStyle: params.connectorHoverStyle, + connector: params.connector, // this can also be null. Connection will use the default. + overlays: params.connectorOverlays, + type: this.connectionType, + cssClass: this.connectorClass, + hoverClass: this.connectorHoverClass, + scope:params.scope, + data:beforeDrag + }); + jpc.pending = true; + jpc.addClass(_jsPlumb.draggingClass); + this._jsPlumb.floatingEndpoint.addClass(_jsPlumb.draggingClass); + this._jsPlumb.floatingEndpoint.anchor = _savedAnchor; + // fire an event that informs that a connection is being dragged + _jsPlumb.fire("connectionDrag", jpc); + + // register the new connection on the drag manager. This connection, at this point, is 'pending', + // and has as its target a temporary element (the 'placeholder'). If the connection subsequently + // becomes established, the anchor manager is informed that the target of the connection has + // changed. + + _jsPlumb.anchorManager.newConnection(jpc); + + } else { + existingJpc = true; + jpc.setHover(false); + // new anchor idx + var anchorIdx = jpc.endpoints[0].id === this.id ? 0 : 1; + this.detachFromConnection(jpc, null, true); // detach from the connection while dragging is occurring. but dont cleanup automatically. + + // store the original scope (issue 57) + var dragScope = _jsPlumb.getDragScope(canvasElement); + _jsPlumb.setAttribute(this.canvas, "originalScope", dragScope); + + // fire an event that informs that a connection is being dragged. we do this before + // replacing the original target with the floating element info. + _jsPlumb.fire("connectionDrag", jpc); + + // now we replace ourselves with the temporary div we created above: + if (anchorIdx === 0) { + existingJpcParams = [ jpc.source, jpc.sourceId, canvasElement, dragScope ]; + _jsPlumb.anchorManager.sourceChanged(jpc.endpoints[anchorIdx].elementId, placeholderInfo.id, jpc, placeholderInfo.element); + + } else { + existingJpcParams = [ jpc.target, jpc.targetId, canvasElement, dragScope ]; + jpc.target = placeholderInfo.element; + jpc.targetId = placeholderInfo.id; + + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.endpoints[anchorIdx].elementId, jpc.targetId, jpc); + } + + // store the original endpoint and assign the new floating endpoint for the drag. + jpc.suspendedEndpoint = jpc.endpoints[anchorIdx]; + + // PROVIDE THE SUSPENDED ELEMENT, BE IT A SOURCE OR TARGET (ISSUE 39) + jpc.suspendedElement = jpc.endpoints[anchorIdx].getElement(); + jpc.suspendedElementId = jpc.endpoints[anchorIdx].elementId; + jpc.suspendedElementType = anchorIdx === 0 ? "source" : "target"; + + jpc.suspendedEndpoint.setHover(false); + this._jsPlumb.floatingEndpoint.referenceEndpoint = jpc.suspendedEndpoint; + jpc.endpoints[anchorIdx] = this._jsPlumb.floatingEndpoint; + + jpc.addClass(_jsPlumb.draggingClass); + this._jsPlumb.floatingEndpoint.addClass(_jsPlumb.draggingClass); + } + + _jsPlumb.registerFloatingConnection(placeholderInfo, jpc, this._jsPlumb.floatingEndpoint); + + // // register it and register connection on it. + // _jsPlumb.floatingConnections[placeholderInfo.id] = jpc; + // + // // only register for the target endpoint; we will not be dragging the source at any time + // // before this connection is either discarded or made into a permanent connection. + // _ju.addToList(params.endpointsByElement, placeholderInfo.id, this._jsPlumb.floatingEndpoint); + + + // tell jsplumb about it + _jsPlumb.currentlyDragging = true; + }.bind(this); + + var stop = function () { + _jsPlumb.setConnectionBeingDragged(false); + + if (jpc && jpc.endpoints != null) { + // get the actual drop event (decode from library args to stop function) + var originalEvent = _jsPlumb.getDropEvent(arguments); + // unlock the other endpoint (if it is dynamic, it would have been locked at drag start) + var idx = _jsPlumb.getFloatingAnchorIndex(jpc); + jpc.endpoints[idx === 0 ? 1 : 0].anchor.unlock(); + // TODO: Dont want to know about css classes inside jsplumb, ideally. + jpc.removeClass(_jsPlumb.draggingClass); + + // if we have the floating endpoint then the connection has not been dropped + // on another endpoint. If it is a new connection we throw it away. If it is an + // existing connection we check to see if we should reattach it, throwing it away + // if not. + if (this._jsPlumb && (jpc.deleteConnectionNow || jpc.endpoints[idx] === this._jsPlumb.floatingEndpoint)) { + // 6a. if the connection was an existing one... + if (existingJpc && jpc.suspendedEndpoint) { + // fix for issue35, thanks Sylvain Gizard: when firing the detach event make sure the + // floating endpoint has been replaced. + if (idx === 0) { + jpc.floatingElement = jpc.source; + jpc.floatingId = jpc.sourceId; + jpc.floatingEndpoint = jpc.endpoints[0]; + jpc.floatingIndex = 0; + jpc.source = existingJpcParams[0]; + jpc.sourceId = existingJpcParams[1]; + } else { + // keep a copy of the floating element; the anchor manager will want to clean up. + jpc.floatingElement = jpc.target; + jpc.floatingId = jpc.targetId; + jpc.floatingEndpoint = jpc.endpoints[1]; + jpc.floatingIndex = 1; + jpc.target = existingJpcParams[0]; + jpc.targetId = existingJpcParams[1]; + } + + var fe = this._jsPlumb.floatingEndpoint; // store for later removal. + // restore the original scope (issue 57) + _jsPlumb.setDragScope(existingJpcParams[2], existingJpcParams[3]); + jpc.endpoints[idx] = jpc.suspendedEndpoint; + // if the connection should be reattached, or the other endpoint refuses detach, then + // reset the connection to its original state + if (jpc.isReattach() || jpc._forceReattach || jpc._forceDetach || !_jsPlumb.deleteConnection(jpc, {originalEvent: originalEvent})) { + + jpc.setHover(false); + jpc._forceDetach = null; + jpc._forceReattach = null; + this._jsPlumb.floatingEndpoint.detachFromConnection(jpc); + jpc.suspendedEndpoint.addConnection(jpc); + + // TODO this code is duplicated in lots of places...and there is nothing external + // in the code; it all refers to the connection itself. we could add a + // `checkSanity(connection)` method to anchorManager that did this. + if (idx === 1) { + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.floatingId, jpc.targetId, jpc); + } + else { + _jsPlumb.anchorManager.sourceChanged(jpc.floatingId, jpc.sourceId, jpc, jpc.source); + } + + _jsPlumb.repaint(existingJpcParams[1]); + } + else { + _jsPlumb.deleteObject({endpoint: fe}); + } + } + } + + // makeTargets sets this flag, to tell us we have been replaced and should delete this object. + if (this.deleteAfterDragStop) { + _jsPlumb.deleteObject({endpoint: this}); + } + else { + if (this._jsPlumb) { + this.paint({recalc: false}); + } + } + + // although the connection is no longer valid, there are use cases where this is useful. + _jsPlumb.fire("connectionDragStop", jpc, originalEvent); + // fire this event to give people more fine-grained control (connectionDragStop fires a lot) + if (jpc.pending) { + _jsPlumb.fire("connectionAborted", jpc, originalEvent); + } + // tell jsplumb that dragging is finished. + _jsPlumb.currentlyDragging = false; + jpc.suspendedElement = null; + jpc.suspendedEndpoint = null; + jpc = null; + } + + // if no endpoints, jpc already cleaned up. but still we want to ensure we're reset properly. + // remove the element associated with the floating endpoint + // (and its associated floating endpoint and visual artefacts) + if (placeholderInfo && placeholderInfo.element) { + _jsPlumb.remove(placeholderInfo.element, false, false); + } + // remove the inplace copy + if (inPlaceCopy) { + _jsPlumb.deleteObject({endpoint: inPlaceCopy}); + } + + if (this._jsPlumb) { + // make our canvas visible (TODO: hand off to library; we should not know about DOM) + this.canvas.style.visibility = "visible"; + // unlock our anchor + this.anchor.unlock(); + // clear floating anchor. + this._jsPlumb.floatingEndpoint = null; + } + + }.bind(this); + + dragOptions = _jp.extend(defaultOpts, dragOptions); + dragOptions.scope = this.scope || dragOptions.scope; + dragOptions[beforeStartEvent] = _ju.wrap(dragOptions[beforeStartEvent], beforeStart, false); + dragOptions[startEvent] = _ju.wrap(dragOptions[startEvent], start, false); + // extracted drag handler function so can be used by makeSource + dragOptions[dragEvent] = _ju.wrap(dragOptions[dragEvent], _dragHandler.drag); + dragOptions[stopEvent] = _ju.wrap(dragOptions[stopEvent], stop); + dragOptions.multipleDrop = false; + + dragOptions.canDrag = function () { + return this.isSource || this.isTemporarySource || (this.connections.length > 0 && this.connectionsDetachable !== false); + }.bind(this); + + _jsPlumb.initDraggable(this.canvas, dragOptions, "internal"); + + this.canvas._jsPlumbRelatedElement = this.element; + + draggingInitialised = true; + } + }; + + var ep = params.endpoint || this._jsPlumb.instance.Defaults.Endpoint || _jp.Defaults.Endpoint; + this.setEndpoint(ep, true); + var anchorParamsToUse = params.anchor ? params.anchor : params.anchors ? params.anchors : (_jsPlumb.Defaults.Anchor || "Top"); + this.setAnchor(anchorParamsToUse, true); + + // finally, set type if it was provided + var type = [ "default", (params.type || "")].join(" "); + this.addType(type, params.data, true); + this.canvas = this.endpoint.canvas; + this.canvas._jsPlumb = this; + + this.initDraggable(); + + // pulled this out into a function so we can reuse it for the inPlaceCopy canvas; you can now drop detached connections + // back onto the endpoint you detached it from. + var _initDropTarget = function (canvas, isTransient, endpoint, referenceEndpoint) { + + if (_jp.isDropSupported(this.element)) { + var dropOptions = params.dropOptions || _jsPlumb.Defaults.DropOptions || _jp.Defaults.DropOptions; + dropOptions = _jp.extend({}, dropOptions); + dropOptions.scope = dropOptions.scope || this.scope; + var dropEvent = _jp.dragEvents.drop, + overEvent = _jp.dragEvents.over, + outEvent = _jp.dragEvents.out, + _ep = this, + drop = _jsPlumb.EndpointDropHandler({ + getEndpoint: function () { + return _ep; + }, + jsPlumb: _jsPlumb, + enabled: function () { + return endpoint != null ? endpoint.isEnabled() : true; + }, + isFull: function () { + return endpoint.isFull(); + }, + element: this.element, + elementId: this.elementId, + isSource: this.isSource, + isTarget: this.isTarget, + addClass: function (clazz) { + _ep.addClass(clazz); + }, + removeClass: function (clazz) { + _ep.removeClass(clazz); + }, + isDropAllowed: function () { + return _ep.isDropAllowed.apply(_ep, arguments); + }, + reference:referenceEndpoint, + isRedrop:function(jpc, dhParams) { + return jpc.suspendedEndpoint && dhParams.reference && (jpc.suspendedEndpoint.id === dhParams.reference.id); + } + }); + + dropOptions[dropEvent] = _ju.wrap(dropOptions[dropEvent], drop, true); + dropOptions[overEvent] = _ju.wrap(dropOptions[overEvent], function () { + var draggable = _jp.getDragObject(arguments), + id = _jsPlumb.getAttribute(_jp.getElement(draggable), "dragId"), + _jpc = _jsPlumb.getFloatingConnectionFor(id);//_jsPlumb.floatingConnections[id]; + + if (_jpc != null) { + var idx = _jsPlumb.getFloatingAnchorIndex(_jpc); + // here we should fire the 'over' event if we are a target and this is a new connection, + // or we are the same as the floating endpoint. + var _cont = (this.isTarget && idx !== 0) || (_jpc.suspendedEndpoint && this.referenceEndpoint && this.referenceEndpoint.id === _jpc.suspendedEndpoint.id); + if (_cont) { + var bb = _jsPlumb.checkCondition("checkDropAllowed", { + sourceEndpoint: _jpc.endpoints[idx], + targetEndpoint: this, + connection: _jpc + }); + this[(bb ? "add" : "remove") + "Class"](_jsPlumb.endpointDropAllowedClass); + this[(bb ? "remove" : "add") + "Class"](_jsPlumb.endpointDropForbiddenClass); + _jpc.endpoints[idx].anchor.over(this.anchor, this); + } + } + }.bind(this)); + + dropOptions[outEvent] = _ju.wrap(dropOptions[outEvent], function () { + var draggable = _jp.getDragObject(arguments), + id = draggable == null ? null : _jsPlumb.getAttribute(_jp.getElement(draggable), "dragId"), + _jpc = id ? _jsPlumb.getFloatingConnectionFor(id) : null; + + if (_jpc != null) { + var idx = _jsPlumb.getFloatingAnchorIndex(_jpc); + var _cont = (this.isTarget && idx !== 0) || (_jpc.suspendedEndpoint && this.referenceEndpoint && this.referenceEndpoint.id === _jpc.suspendedEndpoint.id); + if (_cont) { + this.removeClass(_jsPlumb.endpointDropAllowedClass); + this.removeClass(_jsPlumb.endpointDropForbiddenClass); + _jpc.endpoints[idx].anchor.out(); + } + } + }.bind(this)); + + _jsPlumb.initDroppable(canvas, dropOptions, "internal", isTransient); + } + }.bind(this); + + // Initialise the endpoint's canvas as a drop target. The drop handler will take care of the logic of whether + // something can actually be dropped. + if (!this.anchor.isFloating) { + _initDropTarget(this.canvas, !(params._transient || this.anchor.isFloating), this, params.reference); + } + + return this; + }; + + _ju.extend(_jp.Endpoint, _jp.OverlayCapableJsPlumbUIComponent, { + + setVisible: function (v, doNotChangeConnections, doNotNotifyOtherEndpoint) { + this._jsPlumb.visible = v; + if (this.canvas) { + this.canvas.style.display = v ? "block" : "none"; + } + this[v ? "showOverlays" : "hideOverlays"](); + if (!doNotChangeConnections) { + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].setVisible(v); + if (!doNotNotifyOtherEndpoint) { + var oIdx = this === this.connections[i].endpoints[0] ? 1 : 0; + // only change the other endpoint if this is its only connection. + if (this.connections[i].endpoints[oIdx].connections.length === 1) { + this.connections[i].endpoints[oIdx].setVisible(v, true, true); + } + } + } + } + }, + getAttachedElements: function () { + return this.connections; + }, + applyType: function (t, doNotRepaint) { + this.setPaintStyle(t.endpointStyle || t.paintStyle, doNotRepaint); + this.setHoverPaintStyle(t.endpointHoverStyle || t.hoverPaintStyle, doNotRepaint); + if (t.maxConnections != null) { + this._jsPlumb.maxConnections = t.maxConnections; + } + if (t.scope) { + this.scope = t.scope; + } + _jp.extend(this, t, typeParameters); + if (t.cssClass != null && this.canvas) { + this._jsPlumb.instance.addClass(this.canvas, t.cssClass); + } + _jp.OverlayCapableJsPlumbUIComponent.applyType(this, t); + }, + isEnabled: function () { + return this._jsPlumb.enabled; + }, + setEnabled: function (e) { + this._jsPlumb.enabled = e; + }, + cleanup: function () { + var anchorClass = this._jsPlumb.instance.endpointAnchorClassPrefix + (this._jsPlumb.currentAnchorClass ? "-" + this._jsPlumb.currentAnchorClass : ""); + _jp.removeClass(this.element, anchorClass); + this.anchor = null; + this.endpoint.cleanup(true); + this.endpoint.destroy(); + this.endpoint = null; + // drag/drop + this._jsPlumb.instance.destroyDraggable(this.canvas, "internal"); + this._jsPlumb.instance.destroyDroppable(this.canvas, "internal"); + }, + setHover: function (h) { + if (this.endpoint && this._jsPlumb && !this._jsPlumb.instance.isConnectionBeingDragged()) { + this.endpoint.setHover(h); + } + }, + isFull: function () { + return this._jsPlumb.maxConnections === 0 ? true : !(this.isFloating() || this._jsPlumb.maxConnections < 0 || this.connections.length < this._jsPlumb.maxConnections); + }, + /** + * private but needs to be exposed. + */ + isFloating: function () { + return this.anchor != null && this.anchor.isFloating; + }, + isConnectedTo: function (endpoint) { + var found = false; + if (endpoint) { + for (var i = 0; i < this.connections.length; i++) { + if (this.connections[i].endpoints[1] === endpoint || this.connections[i].endpoints[0] === endpoint) { + found = true; + break; + } + } + } + return found; + }, + getConnectionCost: function () { + return this._jsPlumb.connectionCost; + }, + setConnectionCost: function (c) { + this._jsPlumb.connectionCost = c; + }, + areConnectionsDirected: function () { + return this._jsPlumb.connectionsDirected; + }, + setConnectionsDirected: function (b) { + this._jsPlumb.connectionsDirected = b; + }, + setElementId: function (_elId) { + this.elementId = _elId; + this.anchor.elementId = _elId; + }, + setReferenceElement: function (_el) { + this.element = _jp.getElement(_el); + }, + setDragAllowedWhenFull: function (allowed) { + this.dragAllowedWhenFull = allowed; + }, + equals: function (endpoint) { + return this.anchor.equals(endpoint.anchor); + }, + getUuid: function () { + return this._jsPlumb.uuid; + }, + computeAnchor: function (params) { + return this.anchor.compute(params); + } + }); + + root.jsPlumbInstance.prototype.EndpointDropHandler = function (dhParams) { + return function (e) { + + var _jsPlumb = dhParams.jsPlumb; + + // remove the classes that are added dynamically. drop is neither forbidden nor allowed now that + // the drop is finishing. + dhParams.removeClass(_jsPlumb.endpointDropAllowedClass); + dhParams.removeClass(_jsPlumb.endpointDropForbiddenClass); + + var originalEvent = _jsPlumb.getDropEvent(arguments), + draggable = _jsPlumb.getDragObject(arguments), + id = _jsPlumb.getAttribute(draggable, "dragId"), + elId = _jsPlumb.getAttribute(draggable, "elId"), + scope = _jsPlumb.getAttribute(draggable, "originalScope"), + jpc = _jsPlumb.getFloatingConnectionFor(id); + + // if no active connection, bail. + if (jpc == null) { + return; + } + + // calculate if this is an existing connection. + var existingConnection = jpc.suspendedEndpoint != null; + + // if suspended endpoint exists but has been cleaned up, bail. This means it's an existing connection + // that has been detached and will shortly be discarded. + if (existingConnection && jpc.suspendedEndpoint._jsPlumb == null) { + return; + } + + // get the drop endpoint. for a normal connection this is just the one that would replace the currently + // floating endpoint. for a makeTarget this is a new endpoint that is created on drop. But we leave that to + // the handler to figure out. + var _ep = dhParams.getEndpoint(jpc); + + // If we're not given an endpoint to use, bail. + if (_ep == null) { + return; + } + + // if this is a drop back where the connection came from, mark it force reattach and + // return; the stop handler will reattach. without firing an event. + if (dhParams.isRedrop(jpc, dhParams)) { + jpc._forceReattach = true; + jpc.setHover(false); + if (dhParams.maybeCleanup) { + dhParams.maybeCleanup(_ep); + } + return; + } + + // ensure we dont bother trying to drop sources on non-source eps, and same for target. + var idx = _jsPlumb.getFloatingAnchorIndex(jpc); + if ((idx === 0 && !dhParams.isSource)|| (idx === 1 && !dhParams.isTarget)){ + if (dhParams.maybeCleanup) { + dhParams.maybeCleanup(_ep); + } + return; + } + + if (dhParams.onDrop) { + dhParams.onDrop(jpc); + } + + // restore the original scope if necessary (issue 57) + if (scope) { + _jsPlumb.setDragScope(draggable, scope); + } + + // if the target of the drop is full, fire an event (we abort below) + // makeTarget: keep. + var isFull = dhParams.isFull(e); + if (isFull) { + _ep.fire("maxConnections", { + endpoint: this, + connection: jpc, + maxConnections: _ep._jsPlumb.maxConnections + }, originalEvent); + } + // + // if endpoint enabled, not full, and matches the index of the floating endpoint... + if (!isFull && dhParams.enabled()) { + var _doContinue = true; + + // before testing for beforeDrop, reset the connection's source/target to be the actual DOM elements + // involved (that is, stash any temporary stuff used for dragging. but we need to keep it around in + // order that the anchor manager can clean things up properly). + if (idx === 0) { + jpc.floatingElement = jpc.source; + jpc.floatingId = jpc.sourceId; + jpc.floatingEndpoint = jpc.endpoints[0]; + jpc.floatingIndex = 0; + jpc.source = dhParams.element; + jpc.sourceId = _jsPlumb.getId(dhParams.element); + } else { + jpc.floatingElement = jpc.target; + jpc.floatingId = jpc.targetId; + jpc.floatingEndpoint = jpc.endpoints[1]; + jpc.floatingIndex = 1; + jpc.target = dhParams.element; + jpc.targetId = _jsPlumb.getId(dhParams.element); + } + + // if this is an existing connection and detach is not allowed we won't continue. The connection's + // endpoints have been reinstated; everything is back to how it was. + if (existingConnection && jpc.suspendedEndpoint.id !== _ep.id) { + if (!jpc.isDetachAllowed(jpc) || !jpc.endpoints[idx].isDetachAllowed(jpc) || !jpc.suspendedEndpoint.isDetachAllowed(jpc) || !_jsPlumb.checkCondition("beforeDetach", jpc)) { + _doContinue = false; + } + } + +// ------------ wrap the execution path in a function so we can support asynchronous beforeDrop + + var continueFunction = function (optionalData) { + // remove this jpc from the current endpoint, which is a floating endpoint that we will + // subsequently discard. + jpc.endpoints[idx].detachFromConnection(jpc); + + // if there's a suspended endpoint, detach it from the connection. + if (jpc.suspendedEndpoint) { + jpc.suspendedEndpoint.detachFromConnection(jpc); + } + + jpc.endpoints[idx] = _ep; + _ep.addConnection(jpc); + + // copy our parameters in to the connection: + var params = _ep.getParameters(); + for (var aParam in params) { + jpc.setParameter(aParam, params[aParam]); + } + + if (!existingConnection) { + // if not an existing connection and + if (params.draggable) { + _jsPlumb.initDraggable(this.element, dhParams.dragOptions, "internal", _jsPlumb); + } + } + else { + var suspendedElementId = jpc.suspendedEndpoint.elementId; + _jsPlumb.fireMoveEvent({ + index: idx, + originalSourceId: idx === 0 ? suspendedElementId : jpc.sourceId, + newSourceId: idx === 0 ? _ep.elementId : jpc.sourceId, + originalTargetId: idx === 1 ? suspendedElementId : jpc.targetId, + newTargetId: idx === 1 ? _ep.elementId : jpc.targetId, + originalSourceEndpoint: idx === 0 ? jpc.suspendedEndpoint : jpc.endpoints[0], + newSourceEndpoint: idx === 0 ? _ep : jpc.endpoints[0], + originalTargetEndpoint: idx === 1 ? jpc.suspendedEndpoint : jpc.endpoints[1], + newTargetEndpoint: idx === 1 ? _ep : jpc.endpoints[1], + connection: jpc + }, originalEvent); + } + + if (idx === 1) { + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.floatingId, jpc.targetId, jpc); + } + else { + _jsPlumb.anchorManager.sourceChanged(jpc.floatingId, jpc.sourceId, jpc, jpc.source); + } + + // when makeSource has uniqueEndpoint:true, we want to create connections with new endpoints + // that are subsequently deleted. So makeSource sets `finalEndpoint`, which is the Endpoint to + // which the connection should be attached. The `detachFromConnection` call below results in the + // temporary endpoint being cleaned up. + if (jpc.endpoints[0].finalEndpoint) { + var _toDelete = jpc.endpoints[0]; + _toDelete.detachFromConnection(jpc); + jpc.endpoints[0] = jpc.endpoints[0].finalEndpoint; + jpc.endpoints[0].addConnection(jpc); + } + + // if optionalData was given, merge it onto the connection's data. + if (_ju.isObject(optionalData)) { + jpc.mergeData(optionalData); + } + // finalise will inform the anchor manager and also add to + // connectionsByScope if necessary. + _jsPlumb.finaliseConnection(jpc, null, originalEvent, false); + jpc.setHover(false); + + // SP continuous anchor flush + _jsPlumb.revalidate(jpc.endpoints[0].element); + + }.bind(this); + + var dontContinueFunction = function () { + // otherwise just put it back on the endpoint it was on before the drag. + if (jpc.suspendedEndpoint) { + jpc.endpoints[idx] = jpc.suspendedEndpoint; + jpc.setHover(false); + jpc._forceDetach = true; + if (idx === 0) { + jpc.source = jpc.suspendedEndpoint.element; + jpc.sourceId = jpc.suspendedEndpoint.elementId; + } else { + jpc.target = jpc.suspendedEndpoint.element; + jpc.targetId = jpc.suspendedEndpoint.elementId; + } + jpc.suspendedEndpoint.addConnection(jpc); + + // TODO checkSanity + if (idx === 1) { + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.floatingId, jpc.targetId, jpc); + } + else { + _jsPlumb.anchorManager.sourceChanged(jpc.floatingId, jpc.sourceId, jpc, jpc.source); + } + + _jsPlumb.repaint(jpc.sourceId); + jpc._forceDetach = false; + } + }; + +// -------------------------------------- + // now check beforeDrop. this will be available only on Endpoints that are setup to + // have a beforeDrop condition (although, secretly, under the hood all Endpoints and + // the Connection have them, because they are on jsPlumbUIComponent. shhh!), because + // it only makes sense to have it on a target endpoint. + _doContinue = _doContinue && dhParams.isDropAllowed(jpc.sourceId, jpc.targetId, jpc.scope, jpc, _ep);// && jpc.pending; + + if (_doContinue) { + continueFunction(_doContinue); + return true; + } + else { + dontContinueFunction(); + } + } + + if (dhParams.maybeCleanup) { + dhParams.maybeCleanup(_ep); + } + + _jsPlumb.currentlyDragging = false; + }; + }; +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the code for Connections. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, + _jp = root.jsPlumb, + _ju = root.jsPlumbUtil; + + var makeConnector = function (_jsPlumb, renderMode, connectorName, connectorArgs, forComponent) { + // first make sure we have a cache for the specified renderer + _jp.Connectors[renderMode] = _jp.Connectors[renderMode] || {}; + + // now see if the one we want exists; if not we will try to make it + if (_jp.Connectors[renderMode][connectorName] == null) { + + if (_jp.Connectors[connectorName] == null) { + if (!_jsPlumb.Defaults.DoNotThrowErrors) { + throw new TypeError("jsPlumb: unknown connector type '" + connectorName + "'"); + } else { + return null; + } + } + + _jp.Connectors[renderMode][connectorName] = function() { + _jp.Connectors[connectorName].apply(this, arguments); + _jp.ConnectorRenderers[renderMode].apply(this, arguments); + }; + + _ju.extend(_jp.Connectors[renderMode][connectorName], [ _jp.Connectors[connectorName], _jp.ConnectorRenderers[renderMode]]); + + } + + return new _jp.Connectors[renderMode][connectorName](connectorArgs, forComponent); + }, + _makeAnchor = function (anchorParams, elementId, _jsPlumb) { + return (anchorParams) ? _jsPlumb.makeAnchor(anchorParams, elementId, _jsPlumb) : null; + }, + _updateConnectedClass = function (conn, element, _jsPlumb, remove) { + if (element != null) { + element._jsPlumbConnections = element._jsPlumbConnections || {}; + if (remove) { + delete element._jsPlumbConnections[conn.id]; + } + else { + element._jsPlumbConnections[conn.id] = true; + } + + if (_ju.isEmpty(element._jsPlumbConnections)) { + _jsPlumb.removeClass(element, _jsPlumb.connectedClass); + } + else { + _jsPlumb.addClass(element, _jsPlumb.connectedClass); + } + } + }; + + _jp.Connection = function (params) { + var _newEndpoint = params.newEndpoint; + + this.id = params.id; + this.connector = null; + this.idPrefix = "_jsplumb_c_"; + this.defaultLabelLocation = 0.5; + this.defaultOverlayKeys = ["Overlays", "ConnectionOverlays"]; + // if a new connection is the result of moving some existing connection, params.previousConnection + // will have that Connection in it. listeners for the jsPlumbConnection event can look for that + // member and take action if they need to. + this.previousConnection = params.previousConnection; + this.source = _jp.getElement(params.source); + this.target = _jp.getElement(params.target); + + + _jp.OverlayCapableJsPlumbUIComponent.apply(this, arguments); + + // sourceEndpoint and targetEndpoint override source/target, if they are present. but + // source is not overridden if the Endpoint has declared it is not the final target of a connection; + // instead we use the source that the Endpoint declares will be the final source element. + if (params.sourceEndpoint) { + this.source = params.sourceEndpoint.getElement(); + this.sourceId = params.sourceEndpoint.elementId; + } else { + this.sourceId = this._jsPlumb.instance.getId(this.source); + } + + if (params.targetEndpoint) { + this.target = params.targetEndpoint.getElement(); + this.targetId = params.targetEndpoint.elementId; + } else { + this.targetId = this._jsPlumb.instance.getId(this.target); + } + + + this.scope = params.scope; // scope may have been passed in to the connect call. if it wasn't, we will pull it from the source endpoint, after having initialised the endpoints. + this.endpoints = []; + this.endpointStyles = []; + + var _jsPlumb = this._jsPlumb.instance; + + _jsPlumb.manage(this.sourceId, this.source); + _jsPlumb.manage(this.targetId, this.target); + + this._jsPlumb.visible = true; + + this._jsPlumb.params = { + cssClass: params.cssClass, + container: params.container, + "pointer-events": params["pointer-events"], + editorParams: params.editorParams, + overlays: params.overlays + }; + this._jsPlumb.lastPaintedAt = null; + + // listen to mouseover and mouseout events passed from the container delegate. + this.bind("mouseover", function () { + this.setHover(true); + }.bind(this)); + this.bind("mouseout", function () { + this.setHover(false); + }.bind(this)); + + +// INITIALISATION CODE + + this.makeEndpoint = function (isSource, el, elId, ep, definition) { + elId = elId || this._jsPlumb.instance.getId(el); + return this.prepareEndpoint(_jsPlumb, _newEndpoint, this, ep, isSource ? 0 : 1, params, el, elId, definition); + }; + + // if type given, get the endpoint definitions mapping to that type from the jsplumb instance, and use those. + // we apply types at the end of this constructor but endpoints are only honoured in a type definition at + // create time. + if (params.type) { + params.endpoints = params.endpoints || this._jsPlumb.instance.deriveEndpointAndAnchorSpec(params.type).endpoints; + } + + var eS = this.makeEndpoint(true, this.source, this.sourceId, params.sourceEndpoint), + eT = this.makeEndpoint(false, this.target, this.targetId, params.targetEndpoint); + + if (eS) { + _ju.addToList(params.endpointsByElement, this.sourceId, eS); + } + if (eT) { + _ju.addToList(params.endpointsByElement, this.targetId, eT); + } + // if scope not set, set it to be the scope for the source endpoint. + if (!this.scope) { + this.scope = this.endpoints[0].scope; + } + + // if explicitly told to (or not to) delete endpoints when empty, override endpoint's preferences + if (params.deleteEndpointsOnEmpty != null) { + this.endpoints[0].setDeleteOnEmpty(params.deleteEndpointsOnEmpty); + this.endpoints[1].setDeleteOnEmpty(params.deleteEndpointsOnEmpty); + } + +// -------------------------- DEFAULT TYPE --------------------------------------------- + + // DETACHABLE + var _detachable = _jsPlumb.Defaults.ConnectionsDetachable; + if (params.detachable === false) { + _detachable = false; + } + if (this.endpoints[0].connectionsDetachable === false) { + _detachable = false; + } + if (this.endpoints[1].connectionsDetachable === false) { + _detachable = false; + } + // REATTACH + var _reattach = params.reattach || this.endpoints[0].reattachConnections || this.endpoints[1].reattachConnections || _jsPlumb.Defaults.ReattachConnections; + + this.appendToDefaultType({ + detachable: _detachable, + reattach: _reattach, + paintStyle:this.endpoints[0].connectorStyle || this.endpoints[1].connectorStyle || params.paintStyle || _jsPlumb.Defaults.PaintStyle || _jp.Defaults.PaintStyle, + hoverPaintStyle:this.endpoints[0].connectorHoverStyle || this.endpoints[1].connectorHoverStyle || params.hoverPaintStyle || _jsPlumb.Defaults.HoverPaintStyle || _jp.Defaults.HoverPaintStyle + }); + + var _suspendedAt = _jsPlumb.getSuspendedAt(); + if (!_jsPlumb.isSuspendDrawing()) { + // paint the endpoints + var myInfo = _jsPlumb.getCachedData(this.sourceId), + myOffset = myInfo.o, myWH = myInfo.s, + otherInfo = _jsPlumb.getCachedData(this.targetId), + otherOffset = otherInfo.o, + otherWH = otherInfo.s, + initialTimestamp = _suspendedAt || _jsPlumb.timestamp(), + anchorLoc = this.endpoints[0].anchor.compute({ + xy: [ myOffset.left, myOffset.top ], wh: myWH, element: this.endpoints[0], + elementId: this.endpoints[0].elementId, + txy: [ otherOffset.left, otherOffset.top ], twh: otherWH, tElement: this.endpoints[1], + timestamp: initialTimestamp + }); + + this.endpoints[0].paint({ anchorLoc: anchorLoc, timestamp: initialTimestamp }); + + anchorLoc = this.endpoints[1].anchor.compute({ + xy: [ otherOffset.left, otherOffset.top ], wh: otherWH, element: this.endpoints[1], + elementId: this.endpoints[1].elementId, + txy: [ myOffset.left, myOffset.top ], twh: myWH, tElement: this.endpoints[0], + timestamp: initialTimestamp + }); + this.endpoints[1].paint({ anchorLoc: anchorLoc, timestamp: initialTimestamp }); + } + + this.getTypeDescriptor = function () { + return "connection"; + }; + this.getAttachedElements = function () { + return this.endpoints; + }; + + this.isDetachable = function (ep) { + return this._jsPlumb.detachable === false ? false : ep != null ? ep.connectionsDetachable === true : this._jsPlumb.detachable === true; + }; + this.setDetachable = function (detachable) { + this._jsPlumb.detachable = detachable === true; + }; + this.isReattach = function () { + return this._jsPlumb.reattach === true || this.endpoints[0].reattachConnections === true || this.endpoints[1].reattachConnections === true; + }; + this.setReattach = function (reattach) { + this._jsPlumb.reattach = reattach === true; + }; + +// END INITIALISATION CODE + + +// COST + DIRECTIONALITY + // if cost not supplied, try to inherit from source endpoint + this._jsPlumb.cost = params.cost || this.endpoints[0].getConnectionCost(); + this._jsPlumb.directed = params.directed; + // inherit directed flag if set no source endpoint + if (params.directed == null) { + this._jsPlumb.directed = this.endpoints[0].areConnectionsDirected(); + } +// END COST + DIRECTIONALITY + +// PARAMETERS + // merge all the parameters objects into the connection. parameters set + // on the connection take precedence; then source endpoint params, then + // finally target endpoint params. + var _p = _jp.extend({}, this.endpoints[1].getParameters()); + _jp.extend(_p, this.endpoints[0].getParameters()); + _jp.extend(_p, this.getParameters()); + this.setParameters(_p); +// END PARAMETERS + +// PAINTING + + this.setConnector(this.endpoints[0].connector || this.endpoints[1].connector || params.connector || _jsPlumb.Defaults.Connector || _jp.Defaults.Connector, true); + var data = params.data == null || !_ju.isObject(params.data) ? {} : params.data; + this.getData = function() { return data; }; + this.setData = function(d) { data = d || {}; }; + this.mergeData = function(d) { data = _jp.extend(data, d); }; + + // the very last thing we do is apply types, if there are any. + var _types = [ "default", this.endpoints[0].connectionType, this.endpoints[1].connectionType, params.type ].join(" "); + if (/[^\s]/.test(_types)) { + this.addType(_types, params.data, true); + } + + this.updateConnectedClass(); + +// END PAINTING + }; + + _ju.extend(_jp.Connection, _jp.OverlayCapableJsPlumbUIComponent, { + applyType: function (t, doNotRepaint, typeMap) { + + var _connector = null; + if (t.connector != null) { + _connector = this.getCachedTypeItem("connector", typeMap.connector); + if (_connector == null) { + _connector = this.prepareConnector(t.connector, typeMap.connector); + this.cacheTypeItem("connector", _connector, typeMap.connector); + } + this.setPreparedConnector(_connector); + } + + // none of these things result in the creation of objects so can be ignored. + if (t.detachable != null) { + this.setDetachable(t.detachable); + } + if (t.reattach != null) { + this.setReattach(t.reattach); + } + if (t.scope) { + this.scope = t.scope; + } + + if (t.cssClass != null && this.canvas) { + this._jsPlumb.instance.addClass(this.canvas, t.cssClass); + } + + var _anchors = null; + // this also results in the creation of objects. + if (t.anchor) { + // note that even if the param was anchor, we store `anchors`. + _anchors = this.getCachedTypeItem("anchors", typeMap.anchor); + if (_anchors == null) { + _anchors = [ this._jsPlumb.instance.makeAnchor(t.anchor), this._jsPlumb.instance.makeAnchor(t.anchor) ]; + this.cacheTypeItem("anchors", _anchors, typeMap.anchor); + } + } + else if (t.anchors) { + _anchors = this.getCachedTypeItem("anchors", typeMap.anchors); + if (_anchors == null) { + _anchors = [ + this._jsPlumb.instance.makeAnchor(t.anchors[0]), + this._jsPlumb.instance.makeAnchor(t.anchors[1]) + ]; + this.cacheTypeItem("anchors", _anchors, typeMap.anchors); + } + } + if (_anchors != null) { + this.endpoints[0].anchor = _anchors[0]; + this.endpoints[1].anchor = _anchors[1]; + if (this.endpoints[1].anchor.isDynamic) { + this._jsPlumb.instance.repaint(this.endpoints[1].elementId); + } + } + + _jp.OverlayCapableJsPlumbUIComponent.applyType(this, t); + }, + addClass: function (c, informEndpoints) { + if (informEndpoints) { + this.endpoints[0].addClass(c); + this.endpoints[1].addClass(c); + if (this.suspendedEndpoint) { + this.suspendedEndpoint.addClass(c); + } + } + if (this.connector) { + this.connector.addClass(c); + } + }, + removeClass: function (c, informEndpoints) { + if (informEndpoints) { + this.endpoints[0].removeClass(c); + this.endpoints[1].removeClass(c); + if (this.suspendedEndpoint) { + this.suspendedEndpoint.removeClass(c); + } + } + if (this.connector) { + this.connector.removeClass(c); + } + }, + isVisible: function () { + return this._jsPlumb.visible; + }, + setVisible: function (v) { + this._jsPlumb.visible = v; + if (this.connector) { + this.connector.setVisible(v); + } + this.repaint(); + }, + cleanup: function () { + this.updateConnectedClass(true); + this.endpoints = null; + this.source = null; + this.target = null; + if (this.connector != null) { + this.connector.cleanup(true); + this.connector.destroy(true); + } + this.connector = null; + }, + updateConnectedClass:function(remove) { + if (this._jsPlumb) { + _updateConnectedClass(this, this.source, this._jsPlumb.instance, remove); + _updateConnectedClass(this, this.target, this._jsPlumb.instance, remove); + } + }, + setHover: function (state) { + if (this.connector && this._jsPlumb && !this._jsPlumb.instance.isConnectionBeingDragged()) { + this.connector.setHover(state); + root.jsPlumb[state ? "addClass" : "removeClass"](this.source, this._jsPlumb.instance.hoverSourceClass); + root.jsPlumb[state ? "addClass" : "removeClass"](this.target, this._jsPlumb.instance.hoverTargetClass); + } + }, + getUuids:function() { + return [ this.endpoints[0].getUuid(), this.endpoints[1].getUuid() ]; + }, + getCost: function () { + return this._jsPlumb ? this._jsPlumb.cost : -Infinity; + }, + setCost: function (c) { + this._jsPlumb.cost = c; + }, + isDirected: function () { + return this._jsPlumb.directed; + }, + getConnector: function () { + return this.connector; + }, + prepareConnector:function(connectorSpec, typeId) { + var connectorArgs = { + _jsPlumb: this._jsPlumb.instance, + cssClass: this._jsPlumb.params.cssClass, + container: this._jsPlumb.params.container, + "pointer-events": this._jsPlumb.params["pointer-events"] + }, + renderMode = this._jsPlumb.instance.getRenderMode(), + connector; + + if (_ju.isString(connectorSpec)) { + connector = makeConnector(this._jsPlumb.instance, renderMode, connectorSpec, connectorArgs, this); + } // lets you use a string as shorthand. + else if (_ju.isArray(connectorSpec)) { + if (connectorSpec.length === 1) { + connector = makeConnector(this._jsPlumb.instance, renderMode, connectorSpec[0], connectorArgs, this); + } + else { + connector = makeConnector(this._jsPlumb.instance, renderMode, connectorSpec[0], _ju.merge(connectorSpec[1], connectorArgs), this); + } + } + if (typeId != null) { + connector.typeId = typeId; + } + return connector; + }, + setPreparedConnector: function(connector, doNotRepaint, doNotChangeListenerComponent, typeId) { + + if (this.connector !== connector) { + + var previous, previousClasses = ""; + // the connector will not be cleaned up if it was set as part of a type, because `typeId` will be set on it + // and we havent passed in `true` for "force" here. + if (this.connector != null) { + previous = this.connector; + previousClasses = previous.getClass(); + this.connector.cleanup(); + this.connector.destroy(); + } + + this.connector = connector; + if (typeId) { + this.cacheTypeItem("connector", connector, typeId); + } + + this.canvas = this.connector.canvas; + this.bgCanvas = this.connector.bgCanvas; + + this.connector.reattach(this._jsPlumb.instance); + + // put classes from prior connector onto the canvas + this.addClass(previousClasses); + + // new: instead of binding listeners per connector, we now just have one delegate on the container. + // so for that handler we set the connection as the '_jsPlumb' member of the canvas element, and + // bgCanvas, if it exists, which it does right now in the VML renderer, so it won't from v 2.0.0 onwards. + if (this.canvas) { + this.canvas._jsPlumb = this; + } + if (this.bgCanvas) { + this.bgCanvas._jsPlumb = this; + } + + if (previous != null) { + var o = this.getOverlays(); + for (var i = 0; i < o.length; i++) { + if (o[i].transfer) { + o[i].transfer(this.connector); + } + } + } + + if (!doNotChangeListenerComponent) { + this.setListenerComponent(this.connector); + } + if (!doNotRepaint) { + this.repaint(); + } + } + }, + setConnector: function (connectorSpec, doNotRepaint, doNotChangeListenerComponent, typeId) { + var connector = this.prepareConnector(connectorSpec, typeId); + this.setPreparedConnector(connector, doNotRepaint, doNotChangeListenerComponent, typeId); + }, + paint: function (params) { + + if (!this._jsPlumb.instance.isSuspendDrawing() && this._jsPlumb.visible) { + params = params || {}; + var timestamp = params.timestamp, + // if the moving object is not the source we must transpose the two references. + swap = false, + tId = swap ? this.sourceId : this.targetId, sId = swap ? this.targetId : this.sourceId, + tIdx = swap ? 0 : 1, sIdx = swap ? 1 : 0; + + if (timestamp == null || timestamp !== this._jsPlumb.lastPaintedAt) { + var sourceInfo = this._jsPlumb.instance.updateOffset({elId:sId}).o, + targetInfo = this._jsPlumb.instance.updateOffset({elId:tId}).o, + sE = this.endpoints[sIdx], tE = this.endpoints[tIdx]; + + var sAnchorP = sE.anchor.getCurrentLocation({xy: [sourceInfo.left, sourceInfo.top], wh: [sourceInfo.width, sourceInfo.height], element: sE, timestamp: timestamp}), + tAnchorP = tE.anchor.getCurrentLocation({xy: [targetInfo.left, targetInfo.top], wh: [targetInfo.width, targetInfo.height], element: tE, timestamp: timestamp}); + + this.connector.resetBounds(); + + this.connector.compute({ + sourcePos: sAnchorP, + targetPos: tAnchorP, + sourceOrientation:sE.anchor.getOrientation(sE), + targetOrientation:tE.anchor.getOrientation(tE), + sourceEndpoint: this.endpoints[sIdx], + targetEndpoint: this.endpoints[tIdx], + "stroke-width": this._jsPlumb.paintStyleInUse.strokeWidth, + sourceInfo: sourceInfo, + targetInfo: targetInfo + }); + + var overlayExtents = { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity }; + + // compute overlays. we do this first so we can get their placements, and adjust the + // container if needs be (if an overlay would be clipped) + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays.hasOwnProperty(i)) { + var o = this._jsPlumb.overlays[i]; + if (o.isVisible()) { + this._jsPlumb.overlayPlacements[i] = o.draw(this.connector, this._jsPlumb.paintStyleInUse, this.getAbsoluteOverlayPosition(o)); + overlayExtents.minX = Math.min(overlayExtents.minX, this._jsPlumb.overlayPlacements[i].minX); + overlayExtents.maxX = Math.max(overlayExtents.maxX, this._jsPlumb.overlayPlacements[i].maxX); + overlayExtents.minY = Math.min(overlayExtents.minY, this._jsPlumb.overlayPlacements[i].minY); + overlayExtents.maxY = Math.max(overlayExtents.maxY, this._jsPlumb.overlayPlacements[i].maxY); + } + } + } + + var lineWidth = parseFloat(this._jsPlumb.paintStyleInUse.strokeWidth || 1) / 2, + outlineWidth = parseFloat(this._jsPlumb.paintStyleInUse.strokeWidth || 0), + extents = { + xmin: Math.min(this.connector.bounds.minX - (lineWidth + outlineWidth), overlayExtents.minX), + ymin: Math.min(this.connector.bounds.minY - (lineWidth + outlineWidth), overlayExtents.minY), + xmax: Math.max(this.connector.bounds.maxX + (lineWidth + outlineWidth), overlayExtents.maxX), + ymax: Math.max(this.connector.bounds.maxY + (lineWidth + outlineWidth), overlayExtents.maxY) + }; + // paint the connector. + this.connector.paintExtents = extents; + this.connector.paint(this._jsPlumb.paintStyleInUse, null, extents); + // and then the overlays + for (var j in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays.hasOwnProperty(j)) { + var p = this._jsPlumb.overlays[j]; + if (p.isVisible()) { + p.paint(this._jsPlumb.overlayPlacements[j], extents); + } + } + } + } + this._jsPlumb.lastPaintedAt = timestamp; + } + }, + repaint: function (params) { + var p = jsPlumb.extend(params || {}, {}); + p.elId = this.sourceId; + this.paint(p); + }, + prepareEndpoint: function (_jsPlumb, _newEndpoint, conn, existing, index, params, element, elementId, definition) { + var e; + if (existing) { + conn.endpoints[index] = existing; + existing.addConnection(conn); + } else { + if (!params.endpoints) { + params.endpoints = [ null, null ]; + } + var ep = definition || params.endpoints[index] || params.endpoint || _jsPlumb.Defaults.Endpoints[index] || _jp.Defaults.Endpoints[index] || _jsPlumb.Defaults.Endpoint || _jp.Defaults.Endpoint; + if (!params.endpointStyles) { + params.endpointStyles = [ null, null ]; + } + if (!params.endpointHoverStyles) { + params.endpointHoverStyles = [ null, null ]; + } + var es = params.endpointStyles[index] || params.endpointStyle || _jsPlumb.Defaults.EndpointStyles[index] || _jp.Defaults.EndpointStyles[index] || _jsPlumb.Defaults.EndpointStyle || _jp.Defaults.EndpointStyle; + // Endpoints derive their fill from the connector's stroke, if no fill was specified. + if (es.fill == null && params.paintStyle != null) { + es.fill = params.paintStyle.stroke; + } + + if (es.outlineStroke == null && params.paintStyle != null) { + es.outlineStroke = params.paintStyle.outlineStroke; + } + if (es.outlineWidth == null && params.paintStyle != null) { + es.outlineWidth = params.paintStyle.outlineWidth; + } + + var ehs = params.endpointHoverStyles[index] || params.endpointHoverStyle || _jsPlumb.Defaults.EndpointHoverStyles[index] || _jp.Defaults.EndpointHoverStyles[index] || _jsPlumb.Defaults.EndpointHoverStyle || _jp.Defaults.EndpointHoverStyle; + // endpoint hover fill style is derived from connector's hover stroke style + if (params.hoverPaintStyle != null) { + if (ehs == null) { + ehs = {}; + } + if (ehs.fill == null) { + ehs.fill = params.hoverPaintStyle.stroke; + } + } + var a = params.anchors ? params.anchors[index] : + params.anchor ? params.anchor : + _makeAnchor(_jsPlumb.Defaults.Anchors[index], elementId, _jsPlumb) || + _makeAnchor(_jp.Defaults.Anchors[index], elementId, _jsPlumb) || + _makeAnchor(_jsPlumb.Defaults.Anchor, elementId, _jsPlumb) || + _makeAnchor(_jp.Defaults.Anchor, elementId, _jsPlumb), + u = params.uuids ? params.uuids[index] : null; + + e = _newEndpoint({ + paintStyle: es, hoverPaintStyle: ehs, endpoint: ep, connections: [ conn ], + uuid: u, anchor: a, source: element, scope: params.scope, + reattach: params.reattach || _jsPlumb.Defaults.ReattachConnections, + detachable: params.detachable || _jsPlumb.Defaults.ConnectionsDetachable + }); + if (existing == null) { + e.setDeleteOnEmpty(true); + } + conn.endpoints[index] = e; + + if (params.drawEndpoints === false) { + e.setVisible(false, true, true); + } + + } + return e; + }, + replaceEndpoint:function(idx, endpointDef) { + + var current = this.endpoints[idx], + elId = current.elementId, + ebe = this._jsPlumb.instance.getEndpoints(elId), + _idx = ebe.indexOf(current), + _new = this.makeEndpoint(idx === 0, current.element, elId, null, endpointDef); + + this.endpoints[idx] = _new; + + ebe.splice(_idx, 1, _new); + this._jsPlumb.instance.deleteObject({endpoint:current, deleteAttachedObjects:false}); + this._jsPlumb.instance.fire("endpointReplaced", {previous:current, current:_new}); + + this._jsPlumb.instance.anchorManager.updateOtherEndpoint(this.endpoints[0].elementId, this.endpoints[1].elementId, this.endpoints[1].elementId, this); + + } + + }); // END Connection class +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the code for creating and manipulating anchors. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + + var root = this, + _ju = root.jsPlumbUtil, + _jp = root.jsPlumb; + + // + // manages anchors for all elements. + // + _jp.AnchorManager = function (params) { + var _amEndpoints = {}, + continuousAnchorLocations = {}, + continuousAnchorOrientations = {}, + connectionsByElementId = {}, + self = this, + anchorLists = {}, + jsPlumbInstance = params.jsPlumbInstance, + floatingConnections = {}, + // used by placeAnchors function + placeAnchorsOnLine = function (desc, elementDimensions, elementPosition, connections, horizontal, otherMultiplier, reverse) { + var a = [], step = elementDimensions[horizontal ? 0 : 1] / (connections.length + 1); + + for (var i = 0; i < connections.length; i++) { + var val = (i + 1) * step, other = otherMultiplier * elementDimensions[horizontal ? 1 : 0]; + if (reverse) { + val = elementDimensions[horizontal ? 0 : 1] - val; + } + + var dx = (horizontal ? val : other), x = elementPosition[0] + dx, xp = dx / elementDimensions[0], + dy = (horizontal ? other : val), y = elementPosition[1] + dy, yp = dy / elementDimensions[1]; + + a.push([ x, y, xp, yp, connections[i][1], connections[i][2] ]); + } + + return a; + }, + rightAndBottomSort = function(a, b) { + return b[0][0] - a[0][0]; + }, + // used by edgeSortFunctions + leftAndTopSort = function (a, b) { + var p1 = a[0][0] < 0 ? -Math.PI - a[0][0] : Math.PI - a[0][0], + p2 = b[0][0] < 0 ? -Math.PI - b[0][0] : Math.PI - b[0][0]; + + return p1 - p2; + }, + // used by placeAnchors + edgeSortFunctions = { + "top":leftAndTopSort, + "right": rightAndBottomSort, + "bottom": rightAndBottomSort, + "left": leftAndTopSort + }, + // used by placeAnchors + _sortHelper = function (_array, _fn) { + return _array.sort(_fn); + }, + // used by AnchorManager.redraw + placeAnchors = function (elementId, _anchorLists) { + var cd = jsPlumbInstance.getCachedData(elementId), sS = cd.s, sO = cd.o, + placeSomeAnchors = function (desc, elementDimensions, elementPosition, unsortedConnections, isHorizontal, otherMultiplier, orientation) { + if (unsortedConnections.length > 0) { + var sc = _sortHelper(unsortedConnections, edgeSortFunctions[desc]), // puts them in order based on the target element's pos on screen + reverse = desc === "right" || desc === "top", + anchors = placeAnchorsOnLine(desc, elementDimensions, + elementPosition, sc, + isHorizontal, otherMultiplier, reverse); + + // takes a computed anchor position and adjusts it for parent offset and scroll, then stores it. + var _setAnchorLocation = function (endpoint, anchorPos) { + continuousAnchorLocations[endpoint.id] = [ anchorPos[0], anchorPos[1], anchorPos[2], anchorPos[3] ]; + continuousAnchorOrientations[endpoint.id] = orientation; + }; + + for (var i = 0; i < anchors.length; i++) { + var c = anchors[i][4], weAreSource = c.endpoints[0].elementId === elementId, weAreTarget = c.endpoints[1].elementId === elementId; + if (weAreSource) { + _setAnchorLocation(c.endpoints[0], anchors[i]); + } + if (weAreTarget) { + _setAnchorLocation(c.endpoints[1], anchors[i]); + } + } + } + }; + + placeSomeAnchors("bottom", sS, [sO.left, sO.top], _anchorLists.bottom, true, 1, [0, 1]); + placeSomeAnchors("top", sS, [sO.left, sO.top], _anchorLists.top, true, 0, [0, -1]); + placeSomeAnchors("left", sS, [sO.left, sO.top], _anchorLists.left, false, 0, [-1, 0]); + placeSomeAnchors("right", sS, [sO.left, sO.top], _anchorLists.right, false, 1, [1, 0]); + }; + + this.reset = function () { + _amEndpoints = {}; + connectionsByElementId = {}; + anchorLists = {}; + }; + this.addFloatingConnection = function (key, conn) { + floatingConnections[key] = conn; + }; + this.removeFloatingConnection = function (key) { + delete floatingConnections[key]; + }; + this.newConnection = function (conn) { + var sourceId = conn.sourceId, targetId = conn.targetId, + ep = conn.endpoints, + doRegisterTarget = true, + registerConnection = function (otherIndex, otherEndpoint, otherAnchor, elId, c) { + if ((sourceId === targetId) && otherAnchor.isContinuous) { + // remove the target endpoint's canvas. we dont need it. + conn._jsPlumb.instance.removeElement(ep[1].canvas); + doRegisterTarget = false; + } + _ju.addToList(connectionsByElementId, elId, [c, otherEndpoint, otherAnchor.constructor === _jp.DynamicAnchor]); + }; + + registerConnection(0, ep[0], ep[0].anchor, targetId, conn); + if (doRegisterTarget) { + registerConnection(1, ep[1], ep[1].anchor, sourceId, conn); + } + }; + var removeEndpointFromAnchorLists = function (endpoint) { + (function (list, eId) { + if (list) { // transient anchors dont get entries in this list. + var f = function (e) { + return e[4] === eId; + }; + _ju.removeWithFunction(list.top, f); + _ju.removeWithFunction(list.left, f); + _ju.removeWithFunction(list.bottom, f); + _ju.removeWithFunction(list.right, f); + } + })(anchorLists[endpoint.elementId], endpoint.id); + }; + this.connectionDetached = function (connInfo, doNotRedraw) { + var connection = connInfo.connection || connInfo, + sourceId = connInfo.sourceId, + targetId = connInfo.targetId, + ep = connection.endpoints, + removeConnection = function (otherIndex, otherEndpoint, otherAnchor, elId, c) { + _ju.removeWithFunction(connectionsByElementId[elId], function (_c) { + return _c[0].id === c.id; + }); + }; + + removeConnection(1, ep[1], ep[1].anchor, sourceId, connection); + removeConnection(0, ep[0], ep[0].anchor, targetId, connection); + if (connection.floatingId) { + removeConnection(connection.floatingIndex, connection.floatingEndpoint, connection.floatingEndpoint.anchor, connection.floatingId, connection); + removeEndpointFromAnchorLists(connection.floatingEndpoint); + } + + // remove from anchorLists + removeEndpointFromAnchorLists(connection.endpoints[0]); + removeEndpointFromAnchorLists(connection.endpoints[1]); + + if (!doNotRedraw) { + self.redraw(connection.sourceId); + if (connection.targetId !== connection.sourceId) { + self.redraw(connection.targetId); + } + } + }; + this.add = function (endpoint, elementId) { + _ju.addToList(_amEndpoints, elementId, endpoint); + }; + this.changeId = function (oldId, newId) { + connectionsByElementId[newId] = connectionsByElementId[oldId]; + _amEndpoints[newId] = _amEndpoints[oldId]; + delete connectionsByElementId[oldId]; + delete _amEndpoints[oldId]; + }; + this.getConnectionsFor = function (elementId) { + return connectionsByElementId[elementId] || []; + }; + this.getEndpointsFor = function (elementId) { + return _amEndpoints[elementId] || []; + }; + this.deleteEndpoint = function (endpoint) { + _ju.removeWithFunction(_amEndpoints[endpoint.elementId], function (e) { + return e.id === endpoint.id; + }); + removeEndpointFromAnchorLists(endpoint); + }; + this.clearFor = function (elementId) { + delete _amEndpoints[elementId]; + _amEndpoints[elementId] = []; + }; + // updates the given anchor list by either updating an existing anchor's info, or adding it. this function + // also removes the anchor from its previous list, if the edge it is on has changed. + // all connections found along the way (those that are connected to one of the faces this function + // operates on) are added to the connsToPaint list, as are their endpoints. in this way we know to repaint + // them wthout having to calculate anything else about them. + var _updateAnchorList = function (lists, theta, order, conn, aBoolean, otherElId, idx, reverse, edgeId, elId, connsToPaint, endpointsToPaint) { + // first try to find the exact match, but keep track of the first index of a matching element id along the way.s + var exactIdx = -1, + firstMatchingElIdx = -1, + endpoint = conn.endpoints[idx], + endpointId = endpoint.id, + oIdx = [1, 0][idx], + values = [ + [ theta, order ], + conn, + aBoolean, + otherElId, + endpointId + ], + listToAddTo = lists[edgeId], + listToRemoveFrom = endpoint._continuousAnchorEdge ? lists[endpoint._continuousAnchorEdge] : null, + i, + candidate; + + if (listToRemoveFrom) { + var rIdx = _ju.findWithFunction(listToRemoveFrom, function (e) { + return e[4] === endpointId; + }); + if (rIdx !== -1) { + listToRemoveFrom.splice(rIdx, 1); + // get all connections from this list + for (i = 0; i < listToRemoveFrom.length; i++) { + candidate = listToRemoveFrom[i][1]; + _ju.addWithFunction(connsToPaint, candidate, function (c) { + return c.id === candidate.id; + }); + _ju.addWithFunction(endpointsToPaint, listToRemoveFrom[i][1].endpoints[idx], function (e) { + return e.id === candidate.endpoints[idx].id; + }); + _ju.addWithFunction(endpointsToPaint, listToRemoveFrom[i][1].endpoints[oIdx], function (e) { + return e.id === candidate.endpoints[oIdx].id; + }); + } + } + } + + for (i = 0; i < listToAddTo.length; i++) { + candidate = listToAddTo[i][1]; + if (params.idx === 1 && listToAddTo[i][3] === otherElId && firstMatchingElIdx === -1) { + firstMatchingElIdx = i; + } + _ju.addWithFunction(connsToPaint, candidate, function (c) { + return c.id === candidate.id; + }); + _ju.addWithFunction(endpointsToPaint, listToAddTo[i][1].endpoints[idx], function (e) { + return e.id === candidate.endpoints[idx].id; + }); + _ju.addWithFunction(endpointsToPaint, listToAddTo[i][1].endpoints[oIdx], function (e) { + return e.id === candidate.endpoints[oIdx].id; + }); + } + if (exactIdx !== -1) { + listToAddTo[exactIdx] = values; + } + else { + var insertIdx = reverse ? firstMatchingElIdx !== -1 ? firstMatchingElIdx : 0 : listToAddTo.length; // of course we will get this from having looked through the array shortly. + listToAddTo.splice(insertIdx, 0, values); + } + + // store this for next time. + endpoint._continuousAnchorEdge = edgeId; + }; + + // + // find the entry in an endpoint's list for this connection and update its target endpoint + // with the current target in the connection. + // This method and sourceChanged need to be folder into one. + // + this.updateOtherEndpoint = function (sourceElId, oldTargetId, newTargetId, connection) { + var sIndex = _ju.findWithFunction(connectionsByElementId[sourceElId], function (i) { + return i[0].id === connection.id; + }), + tIndex = _ju.findWithFunction(connectionsByElementId[oldTargetId], function (i) { + return i[0].id === connection.id; + }); + + // update or add data for source + if (sIndex !== -1) { + connectionsByElementId[sourceElId][sIndex][0] = connection; + connectionsByElementId[sourceElId][sIndex][1] = connection.endpoints[1]; + connectionsByElementId[sourceElId][sIndex][2] = connection.endpoints[1].anchor.constructor === _jp.DynamicAnchor; + } + + // remove entry for previous target (if there) + if (tIndex > -1) { + connectionsByElementId[oldTargetId].splice(tIndex, 1); + // add entry for new target + _ju.addToList(connectionsByElementId, newTargetId, [connection, connection.endpoints[0], connection.endpoints[0].anchor.constructor === _jp.DynamicAnchor]); + } + + connection.updateConnectedClass(); + }; + + // + // notification that the connection given has changed source from the originalId to the newId. + // This involves: + // 1. removing the connection from the list of connections stored for the originalId + // 2. updating the source information for the target of the connection + // 3. re-registering the connection in connectionsByElementId with the newId + // + this.sourceChanged = function (originalId, newId, connection, newElement) { + if (originalId !== newId) { + + connection.sourceId = newId; + connection.source = newElement; + + // remove the entry that points from the old source to the target + _ju.removeWithFunction(connectionsByElementId[originalId], function (info) { + return info[0].id === connection.id; + }); + // find entry for target and update it + var tIdx = _ju.findWithFunction(connectionsByElementId[connection.targetId], function (i) { + return i[0].id === connection.id; + }); + if (tIdx > -1) { + connectionsByElementId[connection.targetId][tIdx][0] = connection; + connectionsByElementId[connection.targetId][tIdx][1] = connection.endpoints[0]; + connectionsByElementId[connection.targetId][tIdx][2] = connection.endpoints[0].anchor.constructor === _jp.DynamicAnchor; + } + // add entry for new source + _ju.addToList(connectionsByElementId, newId, [connection, connection.endpoints[1], connection.endpoints[1].anchor.constructor === _jp.DynamicAnchor]); + + // TODO SP not final on this yet. when a user drags an existing connection and it turns into a self + // loop, then this code hides the target endpoint (by removing it from the DOM) But I think this should + // occur only if the anchor is Continuous + if (connection.endpoints[1].anchor.isContinuous) { + if (connection.source === connection.target) { + connection._jsPlumb.instance.removeElement(connection.endpoints[1].canvas); + } + else { + if (connection.endpoints[1].canvas.parentNode == null) { + connection._jsPlumb.instance.appendElement(connection.endpoints[1].canvas); + } + } + } + + connection.updateConnectedClass(); + } + }; + + // + // moves the given endpoint from `currentId` to `element`. + // This involves: + // + // 1. changing the key in _amEndpoints under which the endpoint is stored + // 2. changing the source or target values in all of the endpoint's connections + // 3. changing the array in connectionsByElementId in which the endpoint's connections + // are stored (done by either sourceChanged or updateOtherEndpoint) + // + this.rehomeEndpoint = function (ep, currentId, element) { + var eps = _amEndpoints[currentId] || [], + elementId = jsPlumbInstance.getId(element); + + if (elementId !== currentId) { + var idx = eps.indexOf(ep); + if (idx > -1) { + var _ep = eps.splice(idx, 1)[0]; + self.add(_ep, elementId); + } + } + + for (var i = 0; i < ep.connections.length; i++) { + if (ep.connections[i].sourceId === currentId) { + self.sourceChanged(currentId, ep.elementId, ep.connections[i], ep.element); + } + else if (ep.connections[i].targetId === currentId) { + ep.connections[i].targetId = ep.elementId; + ep.connections[i].target = ep.element; + self.updateOtherEndpoint(ep.connections[i].sourceId, currentId, ep.elementId, ep.connections[i]); + } + } + }; + + this.redraw = function (elementId, ui, timestamp, offsetToUI, clearEdits, doNotRecalcEndpoint) { + + if (!jsPlumbInstance.isSuspendDrawing()) { + // get all the endpoints for this element + var ep = _amEndpoints[elementId] || [], + endpointConnections = connectionsByElementId[elementId] || [], + connectionsToPaint = [], + endpointsToPaint = [], + anchorsToUpdate = []; + + timestamp = timestamp || jsPlumbInstance.timestamp(); + // offsetToUI are values that would have been calculated in the dragManager when registering + // an endpoint for an element that had a parent (somewhere in the hierarchy) that had been + // registered as draggable. + offsetToUI = offsetToUI || {left: 0, top: 0}; + if (ui) { + ui = { + left: ui.left + offsetToUI.left, + top: ui.top + offsetToUI.top + }; + } + + // valid for one paint cycle. + var myOffset = jsPlumbInstance.updateOffset({ elId: elementId, offset: ui, recalc: false, timestamp: timestamp }), + orientationCache = {}; + + // actually, first we should compute the orientation of this element to all other elements to which + // this element is connected with a continuous anchor (whether both ends of the connection have + // a continuous anchor or just one) + + for (var i = 0; i < endpointConnections.length; i++) { + var conn = endpointConnections[i][0], + sourceId = conn.sourceId, + targetId = conn.targetId, + sourceContinuous = conn.endpoints[0].anchor.isContinuous, + targetContinuous = conn.endpoints[1].anchor.isContinuous; + + if (sourceContinuous || targetContinuous) { + var oKey = sourceId + "_" + targetId, + o = orientationCache[oKey], + oIdx = conn.sourceId === elementId ? 1 : 0; + + if (sourceContinuous && !anchorLists[sourceId]) { + anchorLists[sourceId] = { top: [], right: [], bottom: [], left: [] }; + } + if (targetContinuous && !anchorLists[targetId]) { + anchorLists[targetId] = { top: [], right: [], bottom: [], left: [] }; + } + + if (elementId !== targetId) { + jsPlumbInstance.updateOffset({ elId: targetId, timestamp: timestamp }); + } + if (elementId !== sourceId) { + jsPlumbInstance.updateOffset({ elId: sourceId, timestamp: timestamp }); + } + + var td = jsPlumbInstance.getCachedData(targetId), + sd = jsPlumbInstance.getCachedData(sourceId); + + if (targetId === sourceId && (sourceContinuous || targetContinuous)) { + // here we may want to improve this by somehow determining the face we'd like + // to put the connector on. ideally, when drawing, the face should be calculated + // by determining which face is closest to the point at which the mouse button + // was released. for now, we're putting it on the top face. + _updateAnchorList( anchorLists[sourceId], -Math.PI / 2, 0, conn, false, targetId, 0, false, "top", sourceId, connectionsToPaint, endpointsToPaint); + _updateAnchorList( anchorLists[targetId], -Math.PI / 2, 0, conn, false, sourceId, 1, false, "top", targetId, connectionsToPaint, endpointsToPaint); + } + else { + if (!o) { + o = this.calculateOrientation(sourceId, targetId, sd.o, td.o, conn.endpoints[0].anchor, conn.endpoints[1].anchor, conn); + orientationCache[oKey] = o; + // this would be a performance enhancement, but the computed angles need to be clamped to + //the (-PI/2 -> PI/2) range in order for the sorting to work properly. + /* orientationCache[oKey2] = { + orientation:o.orientation, + a:[o.a[1], o.a[0]], + theta:o.theta + Math.PI, + theta2:o.theta2 + Math.PI + };*/ + } + if (sourceContinuous) { + _updateAnchorList(anchorLists[sourceId], o.theta, 0, conn, false, targetId, 0, false, o.a[0], sourceId, connectionsToPaint, endpointsToPaint); + } + if (targetContinuous) { + _updateAnchorList(anchorLists[targetId], o.theta2, -1, conn, true, sourceId, 1, true, o.a[1], targetId, connectionsToPaint, endpointsToPaint); + } + } + + if (sourceContinuous) { + _ju.addWithFunction(anchorsToUpdate, sourceId, function (a) { + return a === sourceId; + }); + } + if (targetContinuous) { + _ju.addWithFunction(anchorsToUpdate, targetId, function (a) { + return a === targetId; + }); + } + _ju.addWithFunction(connectionsToPaint, conn, function (c) { + return c.id === conn.id; + }); + if ((sourceContinuous && oIdx === 0) || (targetContinuous && oIdx === 1)) { + _ju.addWithFunction(endpointsToPaint, conn.endpoints[oIdx], function (e) { + return e.id === conn.endpoints[oIdx].id; + }); + } + } + } + + // place Endpoints whose anchors are continuous but have no Connections + for (i = 0; i < ep.length; i++) { + if (ep[i].connections.length === 0 && ep[i].anchor.isContinuous) { + if (!anchorLists[elementId]) { + anchorLists[elementId] = { top: [], right: [], bottom: [], left: [] }; + } + _updateAnchorList(anchorLists[elementId], -Math.PI / 2, 0, {endpoints: [ep[i], ep[i]], paint: function () { + }}, false, elementId, 0, false, ep[i].anchor.getDefaultFace(), elementId, connectionsToPaint, endpointsToPaint); + _ju.addWithFunction(anchorsToUpdate, elementId, function (a) { + return a === elementId; + }); + } + } + + // now place all the continuous anchors we need to; + for (i = 0; i < anchorsToUpdate.length; i++) { + placeAnchors(anchorsToUpdate[i], anchorLists[anchorsToUpdate[i]]); + } + + // now that continuous anchors have been placed, paint all the endpoints for this element + for (i = 0; i < ep.length; i++) { + ep[i].paint({ timestamp: timestamp, offset: myOffset, dimensions: myOffset.s, recalc: doNotRecalcEndpoint !== true }); + } + + // ... and any other endpoints we came across as a result of the continuous anchors. + for (i = 0; i < endpointsToPaint.length; i++) { + var cd = jsPlumbInstance.getCachedData(endpointsToPaint[i].elementId); + //endpointsToPaint[i].paint({ timestamp: timestamp, offset: cd, dimensions: cd.s }); + endpointsToPaint[i].paint({ timestamp: null, offset: cd, dimensions: cd.s }); + } + + // paint all the standard and "dynamic connections", which are connections whose other anchor is + // static and therefore does need to be recomputed; we make sure that happens only one time. + + // TODO we could have compiled a list of these in the first pass through connections; might save some time. + for (i = 0; i < endpointConnections.length; i++) { + var otherEndpoint = endpointConnections[i][1]; + if (otherEndpoint.anchor.constructor === _jp.DynamicAnchor) { + otherEndpoint.paint({ elementWithPrecedence: elementId, timestamp: timestamp }); + _ju.addWithFunction(connectionsToPaint, endpointConnections[i][0], function (c) { + return c.id === endpointConnections[i][0].id; + }); + // all the connections for the other endpoint now need to be repainted + for (var k = 0; k < otherEndpoint.connections.length; k++) { + if (otherEndpoint.connections[k] !== endpointConnections[i][0]) { + _ju.addWithFunction(connectionsToPaint, otherEndpoint.connections[k], function (c) { + return c.id === otherEndpoint.connections[k].id; + }); + } + } + } else { + _ju.addWithFunction(connectionsToPaint, endpointConnections[i][0], function (c) { + return c.id === endpointConnections[i][0].id; + }); + } + } + + // paint current floating connection for this element, if there is one. + var fc = floatingConnections[elementId]; + if (fc) { + fc.paint({timestamp: timestamp, recalc: false, elId: elementId}); + } + + // paint all the connections + for (i = 0; i < connectionsToPaint.length; i++) { + connectionsToPaint[i].paint({elId: elementId, timestamp: null, recalc: false, clearEdits: clearEdits}); + } + } + }; + + var ContinuousAnchor = function (anchorParams) { + _ju.EventGenerator.apply(this); + this.type = "Continuous"; + this.isDynamic = true; + this.isContinuous = true; + var faces = anchorParams.faces || ["top", "right", "bottom", "left"], + clockwise = !(anchorParams.clockwise === false), + availableFaces = { }, + opposites = { "top": "bottom", "right": "left", "left": "right", "bottom": "top" }, + clockwiseOptions = { "top": "right", "right": "bottom", "left": "top", "bottom": "left" }, + antiClockwiseOptions = { "top": "left", "right": "top", "left": "bottom", "bottom": "right" }, + secondBest = clockwise ? clockwiseOptions : antiClockwiseOptions, + lastChoice = clockwise ? antiClockwiseOptions : clockwiseOptions, + cssClass = anchorParams.cssClass || "", + _currentFace = null, _lockedFace = null, X_AXIS_FACES = ["left", "right"], Y_AXIS_FACES = ["top", "bottom"], + _lockedAxis = null; + + for (var i = 0; i < faces.length; i++) { + availableFaces[faces[i]] = true; + } + + this.getDefaultFace = function () { + return faces.length === 0 ? "top" : faces[0]; + }; + + this.isRelocatable = function() { return true; }; + this.isSnapOnRelocate = function() { return true; }; + + // if the given edge is supported, returns it. otherwise looks for a substitute that _is_ + // supported. if none supported we also return the request edge. + this.verifyEdge = function (edge) { + if (availableFaces[edge]) { + return edge; + } + else if (availableFaces[opposites[edge]]) { + return opposites[edge]; + } + else if (availableFaces[secondBest[edge]]) { + return secondBest[edge]; + } + else if (availableFaces[lastChoice[edge]]) { + return lastChoice[edge]; + } + return edge; // we have to give them something. + }; + + this.isEdgeSupported = function (edge) { + return _lockedAxis == null ? + + (_lockedFace == null ? availableFaces[edge] === true : _lockedFace === edge) + + : _lockedAxis.indexOf(edge) !== -1; + }; + + this.setCurrentFace = function(face, overrideLock) { + _currentFace = face; + // if currently locked, and the user wants to override, do that. + if (overrideLock && _lockedFace != null) { + _lockedFace = _currentFace; + } + }; + + this.getCurrentFace = function() { return _currentFace; }; + this.getSupportedFaces = function() { + var af = []; + for (var k in availableFaces) { + if (availableFaces[k]) { + af.push(k); + } + } + return af; + }; + + this.lock = function() { + _lockedFace = _currentFace; + }; + this.unlock = function() { + _lockedFace = null; + }; + this.isLocked = function() { + return _lockedFace != null; + }; + + this.lockCurrentAxis = function() { + if (_currentFace != null) { + _lockedAxis = (_currentFace === "left" || _currentFace === "right") ? X_AXIS_FACES : Y_AXIS_FACES; + } + }; + + this.unlockCurrentAxis = function() { + _lockedAxis = null; + }; + + this.compute = function (params) { + return continuousAnchorLocations[params.element.id] || [0, 0]; + }; + this.getCurrentLocation = function (params) { + return continuousAnchorLocations[params.element.id] || [0, 0]; + }; + this.getOrientation = function (endpoint) { + return continuousAnchorOrientations[endpoint.id] || [0, 0]; + }; + this.getCssClass = function () { + return cssClass; + }; + }; + + // continuous anchors + jsPlumbInstance.continuousAnchorFactory = { + get: function (params) { + return new ContinuousAnchor(params); + }, + clear: function (elementId) { + delete continuousAnchorLocations[elementId]; + } + }; + }; + + _jp.AnchorManager.prototype.calculateOrientation = function (sourceId, targetId, sd, td, sourceAnchor, targetAnchor) { + + var Orientation = { HORIZONTAL: "horizontal", VERTICAL: "vertical", DIAGONAL: "diagonal", IDENTITY: "identity" }, + axes = ["left", "top", "right", "bottom"]; + + if (sourceId === targetId) { + return { + orientation: Orientation.IDENTITY, + a: ["top", "top"] + }; + } + + var theta = Math.atan2((td.centery - sd.centery), (td.centerx - sd.centerx)), + theta2 = Math.atan2((sd.centery - td.centery), (sd.centerx - td.centerx)); + +// -------------------------------------------------------------------------------------- + + // improved face calculation. get midpoints of each face for source and target, then put in an array with all combinations of + // source/target faces. sort this array by distance between midpoints. the entry at index 0 is our preferred option. we can + // go through the array one by one until we find an entry in which each requested face is supported. + var candidates = [], midpoints = { }; + (function (types, dim) { + for (var i = 0; i < types.length; i++) { + midpoints[types[i]] = { + "left": [ dim[i].left, dim[i].centery ], + "right": [ dim[i].right, dim[i].centery ], + "top": [ dim[i].centerx, dim[i].top ], + "bottom": [ dim[i].centerx , dim[i].bottom] + }; + } + })([ "source", "target" ], [ sd, td ]); + + for (var sf = 0; sf < axes.length; sf++) { + for (var tf = 0; tf < axes.length; tf++) { + candidates.push({ + source: axes[sf], + target: axes[tf], + dist: Biltong.lineLength(midpoints.source[axes[sf]], midpoints.target[axes[tf]]) + }); + } + } + + candidates.sort(function (a, b) { + return a.dist < b.dist ? -1 : a.dist > b.dist ? 1 : 0; + }); + + // now go through this list and try to get an entry that satisfies both (there will be one, unless one of the anchors + // declares no available faces) + var sourceEdge = candidates[0].source, targetEdge = candidates[0].target; + for (var i = 0; i < candidates.length; i++) { + + if (!sourceAnchor.isContinuous || sourceAnchor.isEdgeSupported(candidates[i].source)) { + sourceEdge = candidates[i].source; + } + else { + sourceEdge = null; + } + + if (!targetAnchor.isContinuous || targetAnchor.isEdgeSupported(candidates[i].target)) { + targetEdge = candidates[i].target; + } + else { + targetEdge = null; + } + + if (sourceEdge != null && targetEdge != null) { + break; + } + } + + if (sourceAnchor.isContinuous) { + sourceAnchor.setCurrentFace(sourceEdge); + } + + if (targetAnchor.isContinuous) { + targetAnchor.setCurrentFace(targetEdge); + } + +// -------------------------------------------------------------------------------------- + + return { + a: [ sourceEdge, targetEdge ], + theta: theta, + theta2: theta2 + }; + }; + + /** + * Anchors model a position on some element at which an Endpoint may be located. They began as a first class citizen of jsPlumb, ie. a user + * was required to create these themselves, but over time this has been replaced by the concept of referring to them either by name (eg. "TopMiddle"), + * or by an array describing their coordinates (eg. [ 0, 0.5, 0, -1 ], which is the same as "TopMiddle"). jsPlumb now handles all of the + * creation of Anchors without user intervention. + */ + _jp.Anchor = function (params) { + this.x = params.x || 0; + this.y = params.y || 0; + this.elementId = params.elementId; + this.cssClass = params.cssClass || ""; + this.userDefinedLocation = null; + this.orientation = params.orientation || [ 0, 0 ]; + this.lastReturnValue = null; + this.offsets = params.offsets || [ 0, 0 ]; + this.timestamp = null; + + var relocatable = params.relocatable !== false; + this.isRelocatable = function() { return relocatable; }; + this.setRelocatable = function(_relocatable) { relocatable = _relocatable; }; + var snapOnRelocate = params.snapOnRelocate !== false; + this.isSnapOnRelocate = function() { return snapOnRelocate; }; + + var locked = false; + this.lock = function() { locked = true; }; + this.unlock = function() { locked = false; }; + this.isLocked = function() { return locked; }; + + _ju.EventGenerator.apply(this); + + this.compute = function (params) { + + var xy = params.xy, wh = params.wh, timestamp = params.timestamp; + + if (params.clearUserDefinedLocation) { + this.userDefinedLocation = null; + } + + if (timestamp && timestamp === this.timestamp) { + return this.lastReturnValue; + } + + if (this.userDefinedLocation != null) { + this.lastReturnValue = this.userDefinedLocation; + } + else { + this.lastReturnValue = [ xy[0] + (this.x * wh[0]) + this.offsets[0], xy[1] + (this.y * wh[1]) + this.offsets[1], this.x, this.y ]; + } + + this.timestamp = timestamp; + return this.lastReturnValue; + }; + + this.getCurrentLocation = function (params) { + params = params || {}; + return (this.lastReturnValue == null || (params.timestamp != null && this.timestamp !== params.timestamp)) ? this.compute(params) : this.lastReturnValue; + }; + + this.setPosition = function(x, y, ox, oy, overrideLock) { + if (!locked || overrideLock) { + this.x = x; + this.y = y; + this.orientation = [ ox, oy ]; + this.lastReturnValue = null; + } + }; + }; + _ju.extend(_jp.Anchor, _ju.EventGenerator, { + equals: function (anchor) { + if (!anchor) { + return false; + } + var ao = anchor.getOrientation(), + o = this.getOrientation(); + return this.x === anchor.x && this.y === anchor.y && this.offsets[0] === anchor.offsets[0] && this.offsets[1] === anchor.offsets[1] && o[0] === ao[0] && o[1] === ao[1]; + }, + getUserDefinedLocation: function () { + return this.userDefinedLocation; + }, + setUserDefinedLocation: function (l) { + this.userDefinedLocation = l; + }, + clearUserDefinedLocation: function () { + this.userDefinedLocation = null; + }, + getOrientation: function () { + return this.orientation; + }, + getCssClass: function () { + return this.cssClass; + } + }); + + /** + * An Anchor that floats. its orientation is computed dynamically from + * its position relative to the anchor it is floating relative to. It is used when creating + * a connection through drag and drop. + * + * TODO FloatingAnchor could totally be refactored to extend Anchor just slightly. + */ + _jp.FloatingAnchor = function (params) { + + _jp.Anchor.apply(this, arguments); + + // this is the anchor that this floating anchor is referenced to for + // purposes of calculating the orientation. + var ref = params.reference, + // the canvas this refers to. + refCanvas = params.referenceCanvas, + size = _jp.getSize(refCanvas), + // these are used to store the current relative position of our + // anchor wrt the reference anchor. they only indicate + // direction, so have a value of 1 or -1 (or, very rarely, 0). these + // values are written by the compute method, and read + // by the getOrientation method. + xDir = 0, yDir = 0, + // temporary member used to store an orientation when the floating + // anchor is hovering over another anchor. + orientation = null, + _lastResult = null; + + // clear from parent. we want floating anchor orientation to always be computed. + this.orientation = null; + + // set these to 0 each; they are used by certain types of connectors in the loopback case, + // when the connector is trying to clear the element it is on. but for floating anchor it's not + // very important. + this.x = 0; + this.y = 0; + + this.isFloating = true; + + this.compute = function (params) { + var xy = params.xy, + result = [ xy[0] + (size[0] / 2), xy[1] + (size[1] / 2) ]; // return origin of the element. we may wish to improve this so that any object can be the drag proxy. + _lastResult = result; + return result; + }; + + this.getOrientation = function (_endpoint) { + if (orientation) { + return orientation; + } + else { + var o = ref.getOrientation(_endpoint); + // here we take into account the orientation of the other + // anchor: if it declares zero for some direction, we declare zero too. this might not be the most awesome. perhaps we can come + // up with a better way. it's just so that the line we draw looks like it makes sense. maybe this wont make sense. + return [ Math.abs(o[0]) * xDir * -1, + Math.abs(o[1]) * yDir * -1 ]; + } + }; + + /** + * notification the endpoint associated with this anchor is hovering + * over another anchor; we want to assume that anchor's orientation + * for the duration of the hover. + */ + this.over = function (anchor, endpoint) { + orientation = anchor.getOrientation(endpoint); + }; + + /** + * notification the endpoint associated with this anchor is no + * longer hovering over another anchor; we should resume calculating + * orientation as we normally do. + */ + this.out = function () { + orientation = null; + }; + + this.getCurrentLocation = function (params) { + return _lastResult == null ? this.compute(params) : _lastResult; + }; + }; + _ju.extend(_jp.FloatingAnchor, _jp.Anchor); + + var _convertAnchor = function (anchor, jsPlumbInstance, elementId) { + return anchor.constructor === _jp.Anchor ? anchor : jsPlumbInstance.makeAnchor(anchor, elementId, jsPlumbInstance); + }; + + /* + * A DynamicAnchor is an Anchor that contains a list of other Anchors, which it cycles + * through at compute time to find the one that is located closest to + * the center of the target element, and returns that Anchor's compute + * method result. this causes endpoints to follow each other with + * respect to the orientation of their target elements, which is a useful + * feature for some applications. + * + */ + _jp.DynamicAnchor = function (params) { + _jp.Anchor.apply(this, arguments); + + this.isDynamic = true; + this.anchors = []; + this.elementId = params.elementId; + this.jsPlumbInstance = params.jsPlumbInstance; + + for (var i = 0; i < params.anchors.length; i++) { + this.anchors[i] = _convertAnchor(params.anchors[i], this.jsPlumbInstance, this.elementId); + } + + this.getAnchors = function () { + return this.anchors; + }; + + var _curAnchor = this.anchors.length > 0 ? this.anchors[0] : null, + _lastAnchor = _curAnchor, + self = this, + + // helper method to calculate the distance between the centers of the two elements. + _distance = function (anchor, cx, cy, xy, wh) { + var ax = xy[0] + (anchor.x * wh[0]), ay = xy[1] + (anchor.y * wh[1]), + acx = xy[0] + (wh[0] / 2), acy = xy[1] + (wh[1] / 2); + return (Math.sqrt(Math.pow(cx - ax, 2) + Math.pow(cy - ay, 2)) + + Math.sqrt(Math.pow(acx - ax, 2) + Math.pow(acy - ay, 2))); + }, + // default method uses distance between element centers. you can provide your own method in the dynamic anchor + // constructor (and also to jsPlumb.makeDynamicAnchor). the arguments to it are four arrays: + // xy - xy loc of the anchor's element + // wh - anchor's element's dimensions + // txy - xy loc of the element of the other anchor in the connection + // twh - dimensions of the element of the other anchor in the connection. + // anchors - the list of selectable anchors + _anchorSelector = params.selector || function (xy, wh, txy, twh, anchors) { + var cx = txy[0] + (twh[0] / 2), cy = txy[1] + (twh[1] / 2); + var minIdx = -1, minDist = Infinity; + for (var i = 0; i < anchors.length; i++) { + var d = _distance(anchors[i], cx, cy, xy, wh); + if (d < minDist) { + minIdx = i + 0; + minDist = d; + } + } + return anchors[minIdx]; + }; + + this.compute = function (params) { + var xy = params.xy, wh = params.wh, txy = params.txy, twh = params.twh; + + this.timestamp = params.timestamp; + + var udl = self.getUserDefinedLocation(); + if (udl != null) { + return udl; + } + + // if anchor is locked or an opposite element was not given, we + // maintain our state. anchor will be locked + // if it is the source of a drag and drop. + if (this.isLocked() || txy == null || twh == null) { + return _curAnchor.compute(params); + } + else { + params.timestamp = null; // otherwise clear this, i think. we want the anchor to compute. + } + + _curAnchor = _anchorSelector(xy, wh, txy, twh, this.anchors); + this.x = _curAnchor.x; + this.y = _curAnchor.y; + + if (_curAnchor !== _lastAnchor) { + this.fire("anchorChanged", _curAnchor); + } + + _lastAnchor = _curAnchor; + + return _curAnchor.compute(params); + }; + + this.getCurrentLocation = function (params) { + return this.getUserDefinedLocation() || (_curAnchor != null ? _curAnchor.getCurrentLocation(params) : null); + }; + + this.getOrientation = function (_endpoint) { + return _curAnchor != null ? _curAnchor.getOrientation(_endpoint) : [ 0, 0 ]; + }; + this.over = function (anchor, endpoint) { + if (_curAnchor != null) { + _curAnchor.over(anchor, endpoint); + } + }; + this.out = function () { + if (_curAnchor != null) { + _curAnchor.out(); + } + }; + + this.setAnchor = function(a) { + _curAnchor = a; + }; + + this.getCssClass = function () { + return (_curAnchor && _curAnchor.getCssClass()) || ""; + }; + + /** + * Attempt to match an anchor with the given coordinates and then set it. + * @param coords + * @returns true if matching anchor found, false otherwise. + */ + this.setAnchorCoordinates = function(coords) { + var idx = jsPlumbUtil.findWithFunction(this.anchors, function(a) { + return a.x === coords[0] && a.y === coords[1]; + }); + if (idx !== -1) { + this.setAnchor(this.anchors[idx]); + return true; + } else { + return false; + } + }; + }; + _ju.extend(_jp.DynamicAnchor, _jp.Anchor); + +// -------- basic anchors ------------------ + var _curryAnchor = function (x, y, ox, oy, type, fnInit) { + _jp.Anchors[type] = function (params) { + var a = params.jsPlumbInstance.makeAnchor([ x, y, ox, oy, 0, 0 ], params.elementId, params.jsPlumbInstance); + a.type = type; + if (fnInit) { + fnInit(a, params); + } + return a; + }; + }; + + _curryAnchor(0.5, 0, 0, -1, "TopCenter"); + _curryAnchor(0.5, 1, 0, 1, "BottomCenter"); + _curryAnchor(0, 0.5, -1, 0, "LeftMiddle"); + _curryAnchor(1, 0.5, 1, 0, "RightMiddle"); + + _curryAnchor(0.5, 0, 0, -1, "Top"); + _curryAnchor(0.5, 1, 0, 1, "Bottom"); + _curryAnchor(0, 0.5, -1, 0, "Left"); + _curryAnchor(1, 0.5, 1, 0, "Right"); + _curryAnchor(0.5, 0.5, 0, 0, "Center"); + _curryAnchor(1, 0, 0, -1, "TopRight"); + _curryAnchor(1, 1, 0, 1, "BottomRight"); + _curryAnchor(0, 0, 0, -1, "TopLeft"); + _curryAnchor(0, 1, 0, 1, "BottomLeft"); + +// ------- dynamic anchors ------------------- + + // default dynamic anchors chooses from Top, Right, Bottom, Left + _jp.Defaults.DynamicAnchors = function (params) { + return params.jsPlumbInstance.makeAnchors(["TopCenter", "RightMiddle", "BottomCenter", "LeftMiddle"], params.elementId, params.jsPlumbInstance); + }; + + // default dynamic anchors bound to name 'AutoDefault' + _jp.Anchors.AutoDefault = function (params) { + var a = params.jsPlumbInstance.makeDynamicAnchor(_jp.Defaults.DynamicAnchors(params)); + a.type = "AutoDefault"; + return a; + }; + +// ------- continuous anchors ------------------- + + var _curryContinuousAnchor = function (type, faces) { + _jp.Anchors[type] = function (params) { + var a = params.jsPlumbInstance.makeAnchor(["Continuous", { faces: faces }], params.elementId, params.jsPlumbInstance); + a.type = type; + return a; + }; + }; + + _jp.Anchors.Continuous = function (params) { + return params.jsPlumbInstance.continuousAnchorFactory.get(params); + }; + + _curryContinuousAnchor("ContinuousLeft", ["left"]); + _curryContinuousAnchor("ContinuousTop", ["top"]); + _curryContinuousAnchor("ContinuousBottom", ["bottom"]); + _curryContinuousAnchor("ContinuousRight", ["right"]); + +// ------- position assign anchors ------------------- + + // this anchor type lets you assign the position at connection time. + _curryAnchor(0, 0, 0, 0, "Assign", function (anchor, params) { + // find what to use as the "position finder". the user may have supplied a String which represents + // the id of a position finder in jsPlumb.AnchorPositionFinders, or the user may have supplied the + // position finder as a function. we find out what to use and then set it on the anchor. + var pf = params.position || "Fixed"; + anchor.positionFinder = pf.constructor === String ? params.jsPlumbInstance.AnchorPositionFinders[pf] : pf; + // always set the constructor params; the position finder might need them later (the Grid one does, + // for example) + anchor.constructorParams = params; + }); + + // these are the default anchor positions finders, which are used by the makeTarget function. supplying + // a position finder argument to that function allows you to specify where the resulting anchor will + // be located + root.jsPlumbInstance.prototype.AnchorPositionFinders = { + "Fixed": function (dp, ep, es) { + return [ (dp.left - ep.left) / es[0], (dp.top - ep.top) / es[1] ]; + }, + "Grid": function (dp, ep, es, params) { + var dx = dp.left - ep.left, dy = dp.top - ep.top, + gx = es[0] / (params.grid[0]), gy = es[1] / (params.grid[1]), + mx = Math.floor(dx / gx), my = Math.floor(dy / gy); + return [ ((mx * gx) + (gx / 2)) / es[0], ((my * gy) + (gy / 2)) / es[1] ]; + } + }; + +// ------- perimeter anchors ------------------- + + _jp.Anchors.Perimeter = function (params) { + params = params || {}; + var anchorCount = params.anchorCount || 60, + shape = params.shape; + + if (!shape) { + throw new Error("no shape supplied to Perimeter Anchor type"); + } + + var _circle = function () { + var r = 0.5, step = Math.PI * 2 / anchorCount, current = 0, a = []; + for (var i = 0; i < anchorCount; i++) { + var x = r + (r * Math.sin(current)), + y = r + (r * Math.cos(current)); + a.push([ x, y, 0, 0 ]); + current += step; + } + return a; + }, + _path = function (segments) { + var anchorsPerFace = anchorCount / segments.length, a = [], + _computeFace = function (x1, y1, x2, y2, fractionalLength, ox, oy) { + anchorsPerFace = anchorCount * fractionalLength; + var dx = (x2 - x1) / anchorsPerFace, dy = (y2 - y1) / anchorsPerFace; + for (var i = 0; i < anchorsPerFace; i++) { + a.push([ + x1 + (dx * i), + y1 + (dy * i), + ox == null ? 0 : ox, + oy == null ? 0 : oy + ]); + } + }; + + for (var i = 0; i < segments.length; i++) { + _computeFace.apply(null, segments[i]); + } + + return a; + }, + _shape = function (faces) { + var s = []; + for (var i = 0; i < faces.length; i++) { + s.push([faces[i][0], faces[i][1], faces[i][2], faces[i][3], 1 / faces.length, faces[i][4], faces[i][5]]); + } + return _path(s); + }, + _rectangle = function () { + return _shape([ + [ 0, 0, 1, 0, 0, -1 ], + [ 1, 0, 1, 1, 1, 0 ], + [ 1, 1, 0, 1, 0, 1 ], + [ 0, 1, 0, 0, -1, 0 ] + ]); + }; + + var _shapes = { + "Circle": _circle, + "Ellipse": _circle, + "Diamond": function () { + return _shape([ + [ 0.5, 0, 1, 0.5 ], + [ 1, 0.5, 0.5, 1 ], + [ 0.5, 1, 0, 0.5 ], + [ 0, 0.5, 0.5, 0 ] + ]); + }, + "Rectangle": _rectangle, + "Square": _rectangle, + "Triangle": function () { + return _shape([ + [ 0.5, 0, 1, 1 ], + [ 1, 1, 0, 1 ], + [ 0, 1, 0.5, 0] + ]); + }, + "Path": function (params) { + var points = params.points, p = [], tl = 0; + for (var i = 0; i < points.length - 1; i++) { + var l = Math.sqrt(Math.pow(points[i][2] - points[i][0]) + Math.pow(points[i][3] - points[i][1])); + tl += l; + p.push([points[i][0], points[i][1], points[i + 1][0], points[i + 1][1], l]); + } + for (var j = 0; j < p.length; j++) { + p[j][4] = p[j][4] / tl; + } + return _path(p); + } + }, + _rotate = function (points, amountInDegrees) { + var o = [], theta = amountInDegrees / 180 * Math.PI; + for (var i = 0; i < points.length; i++) { + var _x = points[i][0] - 0.5, + _y = points[i][1] - 0.5; + + o.push([ + 0.5 + ((_x * Math.cos(theta)) - (_y * Math.sin(theta))), + 0.5 + ((_x * Math.sin(theta)) + (_y * Math.cos(theta))), + points[i][2], + points[i][3] + ]); + } + return o; + }; + + if (!_shapes[shape]) { + throw new Error("Shape [" + shape + "] is unknown by Perimeter Anchor type"); + } + + var da = _shapes[shape](params); + if (params.rotation) { + da = _rotate(da, params.rotation); + } + var a = params.jsPlumbInstance.makeDynamicAnchor(da); + a.type = "Perimeter"; + return a; + }; +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the default Connectors, Endpoint and Overlay definitions. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil, _jg = root.Biltong; + + _jp.Segments = { + + /* + * Class: AbstractSegment + * A Connector is made up of 1..N Segments, each of which has a Type, such as 'Straight', 'Arc', + * 'Bezier'. This is new from 1.4.2, and gives us a lot more flexibility when drawing connections: things such + * as rounded corners for flowchart connectors, for example, or a straight line stub for Bezier connections, are + * much easier to do now. + * + * A Segment is responsible for providing coordinates for painting it, and also must be able to report its length. + * + */ + AbstractSegment: function (params) { + this.params = params; + + /** + * Function: findClosestPointOnPath + * Finds the closest point on this segment to the given [x, y], + * returning both the x and y of the point plus its distance from + * the supplied point, and its location along the length of the + * path inscribed by the segment. This implementation returns + * Infinity for distance and null values for everything else; + * subclasses are expected to override. + */ + this.findClosestPointOnPath = function (x, y) { + return { + d: Infinity, + x: null, + y: null, + l: null + }; + }; + + this.getBounds = function () { + return { + minX: Math.min(params.x1, params.x2), + minY: Math.min(params.y1, params.y2), + maxX: Math.max(params.x1, params.x2), + maxY: Math.max(params.y1, params.y2) + }; + }; + + /** + * Computes the list of points on the segment that intersect the given line. + * @method lineIntersection + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @returns {Array<[number, number]>} + */ + this.lineIntersection = function(x1, y1, x2, y2) { + return []; + }; + + /** + * Computes the list of points on the segment that intersect the box with the given origin and size. + * @method boxIntersection + * @param {number} x1 + * @param {number} y1 + * @param {number} w + * @param {number} h + * @returns {Array<[number, number]>} + */ + this.boxIntersection = function(x, y, w, h) { + var a = []; + a.push.apply(a, this.lineIntersection(x, y, x + w, y)); + a.push.apply(a, this.lineIntersection(x + w, y, x + w, y + h)); + a.push.apply(a, this.lineIntersection(x + w, y + h, x, y + h)); + a.push.apply(a, this.lineIntersection(x, y + h, x, y)); + return a; + }; + + /** + * Computes the list of points on the segment that intersect the given bounding box, which is an object of the form { x:.., y:.., w:.., h:.. }. + * @method lineIntersection + * @param {BoundingRectangle} box + * @returns {Array<[number, number]>} + */ + this.boundingBoxIntersection = function(box) { + return this.boxIntersection(box.x, box.y, box.w, box.y); + }; + }, + Straight: function (params) { + var _super = _jp.Segments.AbstractSegment.apply(this, arguments), + length, m, m2, x1, x2, y1, y2, + _recalc = function () { + length = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); + m = _jg.gradient({x: x1, y: y1}, {x: x2, y: y2}); + m2 = -1 / m; + }; + + this.type = "Straight"; + + this.getLength = function () { + return length; + }; + this.getGradient = function () { + return m; + }; + + this.getCoordinates = function () { + return { x1: x1, y1: y1, x2: x2, y2: y2 }; + }; + this.setCoordinates = function (coords) { + x1 = coords.x1; + y1 = coords.y1; + x2 = coords.x2; + y2 = coords.y2; + _recalc(); + }; + this.setCoordinates({x1: params.x1, y1: params.y1, x2: params.x2, y2: params.y2}); + + this.getBounds = function () { + return { + minX: Math.min(x1, x2), + minY: Math.min(y1, y2), + maxX: Math.max(x1, x2), + maxY: Math.max(y1, y2) + }; + }; + + /** + * returns the point on the segment's path that is 'location' along the length of the path, where 'location' is a decimal from + * 0 to 1 inclusive. for the straight line segment this is simple maths. + */ + this.pointOnPath = function (location, absolute) { + if (location === 0 && !absolute) { + return { x: x1, y: y1 }; + } + else if (location === 1 && !absolute) { + return { x: x2, y: y2 }; + } + else { + var l = absolute ? location > 0 ? location : length + location : location * length; + return _jg.pointOnLine({x: x1, y: y1}, {x: x2, y: y2}, l); + } + }; + + /** + * returns the gradient of the segment at the given point - which for us is constant. + */ + this.gradientAtPoint = function (_) { + return m; + }; + + /** + * returns the point on the segment's path that is 'distance' along the length of the path from 'location', where + * 'location' is a decimal from 0 to 1 inclusive, and 'distance' is a number of pixels. + * this hands off to jsPlumbUtil to do the maths, supplying two points and the distance. + */ + this.pointAlongPathFrom = function (location, distance, absolute) { + var p = this.pointOnPath(location, absolute), + farAwayPoint = distance <= 0 ? {x: x1, y: y1} : {x: x2, y: y2 }; + + /* + location == 1 ? { + x:x1 + ((x2 - x1) * 10), + y:y1 + ((y1 - y2) * 10) + } : + */ + + if (distance <= 0 && Math.abs(distance) > 1) { + distance *= -1; + } + + return _jg.pointOnLine(p, farAwayPoint, distance); + }; + + // is c between a and b? + var within = function (a, b, c) { + return c >= Math.min(a, b) && c <= Math.max(a, b); + }; + // find which of a and b is closest to c + var closest = function (a, b, c) { + return Math.abs(c - a) < Math.abs(c - b) ? a : b; + }; + + /** + Function: findClosestPointOnPath + Finds the closest point on this segment to [x,y]. See + notes on this method in AbstractSegment. + */ + this.findClosestPointOnPath = function (x, y) { + var out = { + d: Infinity, + x: null, + y: null, + l: null, + x1: x1, + x2: x2, + y1: y1, + y2: y2 + }; + + if (m === 0) { + out.y = y1; + out.x = within(x1, x2, x) ? x : closest(x1, x2, x); + } + else if (m === Infinity || m === -Infinity) { + out.x = x1; + out.y = within(y1, y2, y) ? y : closest(y1, y2, y); + } + else { + // closest point lies on normal from given point to this line. + var b = y1 - (m * x1), + b2 = y - (m2 * x), + // y1 = m.x1 + b and y1 = m2.x1 + b2 + // so m.x1 + b = m2.x1 + b2 + // x1(m - m2) = b2 - b + // x1 = (b2 - b) / (m - m2) + _x1 = (b2 - b) / (m - m2), + _y1 = (m * _x1) + b; + + out.x = within(x1, x2, _x1) ? _x1 : closest(x1, x2, _x1);//_x1; + out.y = within(y1, y2, _y1) ? _y1 : closest(y1, y2, _y1);//_y1; + } + + var fractionInSegment = _jg.lineLength([ out.x, out.y ], [ x1, y1 ]); + out.d = _jg.lineLength([x, y], [out.x, out.y]); + out.l = fractionInSegment / length; + return out; + }; + + var _pointLiesBetween = function(q, p1, p2) { + return (p2 > p1) ? (p1 <= q && q <= p2) : (p1 >= q && q >= p2); + }, _plb = _pointLiesBetween; + + /** + * Calculates all intersections of the given line with this segment. + * @param _x1 + * @param _y1 + * @param _x2 + * @param _y2 + * @returns {Array} + */ + this.lineIntersection = function(_x1, _y1, _x2, _y2) { + var m2 = Math.abs(_jg.gradient({x: _x1, y: _y1}, {x: _x2, y: _y2})), + m1 = Math.abs(m), + b = m1 === Infinity ? x1 : y1 - (m1 * x1), + out = [], + b2 = m2 === Infinity ? _x1 : _y1 - (m2 * _x1); + + // if lines parallel, no intersection + if (m2 !== m1) { + // perpendicular, segment horizontal + if(m2 === Infinity && m1 === 0) { + if (_plb(_x1, x1, x2) && _plb(y1, _y1, _y2)) { + out = [ _x1, y1 ]; // we return X on the incident line and Y from the segment + } + } else if(m2 === 0 && m1 === Infinity) { + // perpendicular, segment vertical + if(_plb(_y1, y1, y2) && _plb(x1, _x1, _x2)) { + out = [x1, _y1]; // we return X on the segment and Y from the incident line + } + } else { + var X, Y; + if (m2 === Infinity) { + // test line is a vertical line. where does it cross the segment? + X = _x1; + if (_plb(X, x1, x2)) { + Y = (m1 * _x1) + b; + if (_plb(Y, _y1, _y2)) { + out = [ X, Y ]; + } + } + } else if (m2 === 0) { + Y = _y1; + // test line is a horizontal line. where does it cross the segment? + if (_plb(Y, y1, y2)) { + X = (_y1 - b) / m1; + if (_plb(X, _x1, _x2)) { + out = [ X, Y ]; + } + } + } else { + // mX + b = m2X + b2 + // mX - m2X = b2 - b + // X(m - m2) = b2 - b + // X = (b2 - b) / (m - m2) + // Y = mX + b + X = (b2 - b) / (m1 - m2); + Y = (m1 * X) + b; + if(_plb(X, x1, x2) && _plb(Y, y1, y2)) { + out = [ X, Y]; + } + } + } + } + + return out; + }; + + /** + * Calculates all intersections of the given box with this segment. By default this method simply calls `lineIntersection` with each of the four + * faces of the box; subclasses can override this if they think there's a faster way to compute the entire box at once. + * @param x X position of top left corner of box + * @param y Y position of top left corner of box + * @param w width of box + * @param h height of box + * @returns {Array} + */ + this.boxIntersection = function(x, y, w, h) { + var a = []; + a.push.apply(a, this.lineIntersection(x, y, x + w, y)); + a.push.apply(a, this.lineIntersection(x + w, y, x + w, y + h)); + a.push.apply(a, this.lineIntersection(x + w, y + h, x, y + h)); + a.push.apply(a, this.lineIntersection(x, y + h, x, y)); + return a; + }; + + /** + * Calculates all intersections of the given bounding box with this segment. By default this method simply calls `lineIntersection` with each of the four + * faces of the box; subclasses can override this if they think there's a faster way to compute the entire box at once. + * @param box Bounding box, in { x:.., y:..., w:..., h:... } format. + * @returns {Array} + */ + this.boundingBoxIntersection = function(box) { + return this.boxIntersection(box.x, box.y, box.w, box.h); + }; + }, + + /* + Arc Segment. You need to supply: + + r - radius + cx - center x for the arc + cy - center y for the arc + ac - whether the arc is anticlockwise or not. default is clockwise. + + and then either: + + startAngle - startAngle for the arc. + endAngle - endAngle for the arc. + + or: + + x1 - x for start point + y1 - y for start point + x2 - x for end point + y2 - y for end point + + */ + Arc: function (params) { + var _super = _jp.Segments.AbstractSegment.apply(this, arguments), + _calcAngle = function (_x, _y) { + return _jg.theta([params.cx, params.cy], [_x, _y]); + }, + _calcAngleForLocation = function (segment, location) { + if (segment.anticlockwise) { + var sa = segment.startAngle < segment.endAngle ? segment.startAngle + TWO_PI : segment.startAngle, + s = Math.abs(sa - segment.endAngle); + return sa - (s * location); + } + else { + var ea = segment.endAngle < segment.startAngle ? segment.endAngle + TWO_PI : segment.endAngle, + ss = Math.abs(ea - segment.startAngle); + + return segment.startAngle + (ss * location); + } + }, + TWO_PI = 2 * Math.PI; + + this.radius = params.r; + this.anticlockwise = params.ac; + this.type = "Arc"; + + if (params.startAngle && params.endAngle) { + this.startAngle = params.startAngle; + this.endAngle = params.endAngle; + this.x1 = params.cx + (this.radius * Math.cos(params.startAngle)); + this.y1 = params.cy + (this.radius * Math.sin(params.startAngle)); + this.x2 = params.cx + (this.radius * Math.cos(params.endAngle)); + this.y2 = params.cy + (this.radius * Math.sin(params.endAngle)); + } + else { + this.startAngle = _calcAngle(params.x1, params.y1); + this.endAngle = _calcAngle(params.x2, params.y2); + this.x1 = params.x1; + this.y1 = params.y1; + this.x2 = params.x2; + this.y2 = params.y2; + } + + if (this.endAngle < 0) { + this.endAngle += TWO_PI; + } + if (this.startAngle < 0) { + this.startAngle += TWO_PI; + } + + // segment is used by vml + //this.segment = _jg.quadrant([this.x1, this.y1], [this.x2, this.y2]); + + // we now have startAngle and endAngle as positive numbers, meaning the + // absolute difference (|d|) between them is the sweep (s) of this arc, unless the + // arc is 'anticlockwise' in which case 's' is given by 2PI - |d|. + + var ea = this.endAngle < this.startAngle ? this.endAngle + TWO_PI : this.endAngle; + this.sweep = Math.abs(ea - this.startAngle); + if (this.anticlockwise) { + this.sweep = TWO_PI - this.sweep; + } + var circumference = 2 * Math.PI * this.radius, + frac = this.sweep / TWO_PI, + length = circumference * frac; + + this.getLength = function () { + return length; + }; + + this.getBounds = function () { + return { + minX: params.cx - params.r, + maxX: params.cx + params.r, + minY: params.cy - params.r, + maxY: params.cy + params.r + }; + }; + + var VERY_SMALL_VALUE = 0.0000000001, + gentleRound = function (n) { + var f = Math.floor(n), r = Math.ceil(n); + if (n - f < VERY_SMALL_VALUE) { + return f; + } + else if (r - n < VERY_SMALL_VALUE) { + return r; + } + return n; + }; + + /** + * returns the point on the segment's path that is 'location' along the length of the path, where 'location' is a decimal from + * 0 to 1 inclusive. + */ + this.pointOnPath = function (location, absolute) { + + if (location === 0) { + return { x: this.x1, y: this.y1, theta: this.startAngle }; + } + else if (location === 1) { + return { x: this.x2, y: this.y2, theta: this.endAngle }; + } + + if (absolute) { + location = location / length; + } + + var angle = _calcAngleForLocation(this, location), + _x = params.cx + (params.r * Math.cos(angle)), + _y = params.cy + (params.r * Math.sin(angle)); + + return { x: gentleRound(_x), y: gentleRound(_y), theta: angle }; + }; + + /** + * returns the gradient of the segment at the given point. + */ + this.gradientAtPoint = function (location, absolute) { + var p = this.pointOnPath(location, absolute); + var m = _jg.normal([ params.cx, params.cy ], [p.x, p.y ]); + if (!this.anticlockwise && (m === Infinity || m === -Infinity)) { + m *= -1; + } + return m; + }; + + this.pointAlongPathFrom = function (location, distance, absolute) { + var p = this.pointOnPath(location, absolute), + arcSpan = distance / circumference * 2 * Math.PI, + dir = this.anticlockwise ? -1 : 1, + startAngle = p.theta + (dir * arcSpan), + startX = params.cx + (this.radius * Math.cos(startAngle)), + startY = params.cy + (this.radius * Math.sin(startAngle)); + + return {x: startX, y: startY}; + }; + + // TODO: lineIntersection + }, + + Bezier: function (params) { + this.curve = [ + { x: params.x1, y: params.y1}, + { x: params.cp1x, y: params.cp1y }, + { x: params.cp2x, y: params.cp2y }, + { x: params.x2, y: params.y2 } + ]; + + var _isPoint = function(c) { + return c[0].x === c[1].x && c[0].y === c[1].y; + }; + + var _dist = function(p1, p2 ) { + return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2)); + }; + + var _compute = function(loc) { + + var EMPTY_POINT = {x:0, y:0}; + + if (loc === 0) { + return this.curve[0]; + } + + var degree = this.curve.length - 1; + + if (loc === 1) { + return this.curve[degree]; + } + + var o = this.curve; + var s = 1 - loc; + + if (degree === 0) { + return this.curve[0]; + } + + if (degree === 1) { + return { + x: s * o[0].x + loc * o[1].x, + y: s * o[0].y + loc * o[1].y + }; + } + + if (degree < 4) { + + var l = s * s, h = loc * loc, u = 0, m, g, f; + + if (degree === 2) { + o = [o[0], o[1], o[2], EMPTY_POINT]; + m = l; + g = 2 * (s * loc); + f = h; + } else if (degree === 3) { + m = l * s; + g = 3 * (l * loc); + f = 3 * (s * h); + u = loc * h; + } + + return { + x: m * o[0].x + g * o[1].x + f * o[2].x + u * o[3].x, + y: m * o[0].y + g * o[1].y + f * o[2].y + u * o[3].y + }; + } else { + return EMPTY_POINT; // not supported. + } + }.bind(this); + + var _getLUT = function(steps) { + var out = []; + steps--; + for (var n = 0; n <= steps; n++) { + out.push(_compute(n / steps)); + } + return out; + }; + + var _computeLength = function() { + + if (_isPoint(this.curve)) { + this.length = 0; + } + + var steps = 16; + var lut = _getLUT(steps); + this.length = 0; + + for (var i = 0; i < steps - 1; i++) { + var a = lut[i], b = lut[i + 1]; + this.length += _dist(a, b); + } + }.bind(this); + + var _super = _jp.Segments.AbstractSegment.apply(this, arguments); + // although this is not a strictly rigorous determination of bounds + // of a bezier curve, it works for the types of curves that this segment + // type produces. + this.bounds = { + minX: Math.min(params.x1, params.x2, params.cp1x, params.cp2x), + minY: Math.min(params.y1, params.y2, params.cp1y, params.cp2y), + maxX: Math.max(params.x1, params.x2, params.cp1x, params.cp2x), + maxY: Math.max(params.y1, params.y2, params.cp1y, params.cp2y) + }; + + this.type = "Bezier"; + + _computeLength(); + + var _translateLocation = function (_curve, location, absolute) { + if (absolute) { + location = root.jsBezier.locationAlongCurveFrom(_curve, location > 0 ? 0 : 1, location); + } + + return location; + }; + + /** + * returns the point on the segment's path that is 'location' along the length of the path, where 'location' is a decimal from + * 0 to 1 inclusive. + */ + this.pointOnPath = function (location, absolute) { + location = _translateLocation(this.curve, location, absolute); + return root.jsBezier.pointOnCurve(this.curve, location); + }; + + /** + * returns the gradient of the segment at the given point. + */ + this.gradientAtPoint = function (location, absolute) { + location = _translateLocation(this.curve, location, absolute); + return root.jsBezier.gradientAtPoint(this.curve, location); + }; + + this.pointAlongPathFrom = function (location, distance, absolute) { + location = _translateLocation(this.curve, location, absolute); + return root.jsBezier.pointAlongCurveFrom(this.curve, location, distance); + }; + + this.getLength = function () { + return this.length; + }; + + this.getBounds = function () { + return this.bounds; + }; + + this.findClosestPointOnPath = function (x, y) { + var p = root.jsBezier.nearestPointOnCurve({x:x,y:y}, this.curve); + return { + d:Math.sqrt(Math.pow(p.point.x - x, 2) + Math.pow(p.point.y - y, 2)), + x:p.point.x, + y:p.point.y, + l:1 - p.location, + s:this + }; + }; + + this.lineIntersection = function(x1, y1, x2, y2) { + return root.jsBezier.lineIntersection(x1, y1, x2, y2, this.curve); + }; + } + }; + + _jp.SegmentRenderer = { + getPath: function (segment, isFirstSegment) { + return ({ + "Straight": function (isFirstSegment) { + var d = segment.getCoordinates(); + return (isFirstSegment ? "M " + d.x1 + " " + d.y1 + " " : "") + "L " + d.x2 + " " + d.y2; + }, + "Bezier": function (isFirstSegment) { + var d = segment.params; + return (isFirstSegment ? "M " + d.x2 + " " + d.y2 + " " : "") + + "C " + d.cp2x + " " + d.cp2y + " " + d.cp1x + " " + d.cp1y + " " + d.x1 + " " + d.y1; + }, + "Arc": function (isFirstSegment) { + var d = segment.params, + laf = segment.sweep > Math.PI ? 1 : 0, + sf = segment.anticlockwise ? 0 : 1; + + return (isFirstSegment ? "M" + segment.x1 + " " + segment.y1 + " " : "") + "A " + segment.radius + " " + d.r + " 0 " + laf + "," + sf + " " + segment.x2 + " " + segment.y2; + } + })[segment.type](isFirstSegment); + } + }; + + /* + Class: UIComponent + Superclass for Connector and AbstractEndpoint. + */ + var AbstractComponent = function () { + this.resetBounds = function () { + this.bounds = { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity }; + }; + this.resetBounds(); + }; + + /* + * Class: Connector + * Superclass for all Connectors; here is where Segments are managed. This is exposed on jsPlumb just so it + * can be accessed from other files. You should not try to instantiate one of these directly. + * + * When this class is asked for a pointOnPath, or gradient etc, it must first figure out which segment to dispatch + * that request to. This is done by keeping track of the total connector length as segments are added, and also + * their cumulative ratios to the total length. Then when the right segment is found it is a simple case of dispatching + * the request to it (and adjusting 'location' so that it is relative to the beginning of that segment.) + */ + _jp.Connectors.AbstractConnector = function (params) { + + AbstractComponent.apply(this, arguments); + + var segments = [], + totalLength = 0, + segmentProportions = [], + segmentProportionalLengths = [], + stub = params.stub || 0, + sourceStub = _ju.isArray(stub) ? stub[0] : stub, + targetStub = _ju.isArray(stub) ? stub[1] : stub, + gap = params.gap || 0, + sourceGap = _ju.isArray(gap) ? gap[0] : gap, + targetGap = _ju.isArray(gap) ? gap[1] : gap, + userProvidedSegments = null, + paintInfo = null; + + this.getPathData = function() { + var p = ""; + for (var i = 0; i < segments.length; i++) { + p += _jp.SegmentRenderer.getPath(segments[i], i === 0); + p += " "; + } + return p; + }; + + /** + * Function: findSegmentForPoint + * Returns the segment that is closest to the given [x,y], + * null if nothing found. This function returns a JS + * object with: + * + * d - distance from segment + * l - proportional location in segment + * x - x point on the segment + * y - y point on the segment + * s - the segment itself. + * connectorLocation - the location on the connector of the point, expressed as a decimal between 0 and 1 inclusive. + */ + this.findSegmentForPoint = function (x, y) { + var out = { d: Infinity, s: null, x: null, y: null, l: null }; + for (var i = 0; i < segments.length; i++) { + var _s = segments[i].findClosestPointOnPath(x, y); + if (_s.d < out.d) { + out.d = _s.d; + out.l = _s.l; + out.x = _s.x; + out.y = _s.y; + out.s = segments[i]; + out.x1 = _s.x1; + out.x2 = _s.x2; + out.y1 = _s.y1; + out.y2 = _s.y2; + out.index = i; + out.connectorLocation = segmentProportions[i][0] + (_s.l * (segmentProportions[i][1] - segmentProportions[i][0])); + } + } + + return out; + }; + + this.lineIntersection = function(x1, y1, x2, y2) { + var out = []; + for (var i = 0; i < segments.length; i++) { + out.push.apply(out, segments[i].lineIntersection(x1, y1, x2, y2)); + } + return out; + }; + + this.boxIntersection = function(x, y, w, h) { + var out = []; + for (var i = 0; i < segments.length; i++) { + out.push.apply(out, segments[i].boxIntersection(x, y, w, h)); + } + return out; + }; + + this.boundingBoxIntersection = function(box) { + var out = []; + for (var i = 0; i < segments.length; i++) { + out.push.apply(out, segments[i].boundingBoxIntersection(box)); + } + return out; + }; + + var _updateSegmentProportions = function () { + var curLoc = 0; + for (var i = 0; i < segments.length; i++) { + var sl = segments[i].getLength(); + segmentProportionalLengths[i] = sl / totalLength; + segmentProportions[i] = [curLoc, (curLoc += (sl / totalLength)) ]; + } + }, + + /** + * returns [segment, proportion of travel in segment, segment index] for the segment + * that contains the point which is 'location' distance along the entire path, where + * 'location' is a decimal between 0 and 1 inclusive. in this connector type, paths + * are made up of a list of segments, each of which contributes some fraction to + * the total length. + * From 1.3.10 this also supports the 'absolute' property, which lets us specify a location + * as the absolute distance in pixels, rather than a proportion of the total path. + */ + _findSegmentForLocation = function (location, absolute) { + + var idx, i, inSegmentProportion; + + if (absolute) { + location = location > 0 ? location / totalLength : (totalLength + location) / totalLength; + } + + // if location 1 we know its the last segment + if (location === 1) { + idx = segments.length - 1; + inSegmentProportion = 1; + } else if (location === 0) { + // if location 0 we know its the first segment + inSegmentProportion = 0; + idx = 0; + } else { + + // if location >= 0.5, traverse backwards (of course not exact, who knows the segment proportions. but + // an educated guess at least) + if (location >= 0.5) { + + idx = 0; + inSegmentProportion = 0; + for (i = segmentProportions.length - 1; i > -1; i--) { + if (segmentProportions[i][1] >= location && segmentProportions[i][0] <= location) { + idx = i; + inSegmentProportion = (location - segmentProportions[i][0]) / segmentProportionalLengths[i]; + break; + } + } + + } else { + idx = segmentProportions.length - 1; + inSegmentProportion = 1; + for (i = 0; i < segmentProportions.length; i++) { + if (segmentProportions[i][1] >= location) { + idx = i; + inSegmentProportion = (location - segmentProportions[i][0]) / segmentProportionalLengths[i]; + break; + } + } + } + } + + return { segment: segments[idx], proportion: inSegmentProportion, index: idx }; + }, + _addSegment = function (conn, type, params) { + if (params.x1 === params.x2 && params.y1 === params.y2) { + return; + } + var s = new _jp.Segments[type](params); + segments.push(s); + totalLength += s.getLength(); + conn.updateBounds(s); + }, + _clearSegments = function () { + totalLength = segments.length = segmentProportions.length = segmentProportionalLengths.length = 0; + }; + + this.setSegments = function (_segs) { + userProvidedSegments = []; + totalLength = 0; + for (var i = 0; i < _segs.length; i++) { + userProvidedSegments.push(_segs[i]); + totalLength += _segs[i].getLength(); + } + }; + + this.getLength = function() { + return totalLength; + }; + + var _prepareCompute = function (params) { + this.strokeWidth = params.strokeWidth; + var segment = _jg.quadrant(params.sourcePos, params.targetPos), + swapX = params.targetPos[0] < params.sourcePos[0], + swapY = params.targetPos[1] < params.sourcePos[1], + lw = params.strokeWidth || 1, + so = params.sourceEndpoint.anchor.getOrientation(params.sourceEndpoint), + to = params.targetEndpoint.anchor.getOrientation(params.targetEndpoint), + x = swapX ? params.targetPos[0] : params.sourcePos[0], + y = swapY ? params.targetPos[1] : params.sourcePos[1], + w = Math.abs(params.targetPos[0] - params.sourcePos[0]), + h = Math.abs(params.targetPos[1] - params.sourcePos[1]); + + // if either anchor does not have an orientation set, we derive one from their relative + // positions. we fix the axis to be the one in which the two elements are further apart, and + // point each anchor at the other element. this is also used when dragging a new connection. + if (so[0] === 0 && so[1] === 0 || to[0] === 0 && to[1] === 0) { + var index = w > h ? 0 : 1, oIndex = [1, 0][index]; + so = []; + to = []; + so[index] = params.sourcePos[index] > params.targetPos[index] ? -1 : 1; + to[index] = params.sourcePos[index] > params.targetPos[index] ? 1 : -1; + so[oIndex] = 0; + to[oIndex] = 0; + } + + var sx = swapX ? w + (sourceGap * so[0]) : sourceGap * so[0], + sy = swapY ? h + (sourceGap * so[1]) : sourceGap * so[1], + tx = swapX ? targetGap * to[0] : w + (targetGap * to[0]), + ty = swapY ? targetGap * to[1] : h + (targetGap * to[1]), + oProduct = ((so[0] * to[0]) + (so[1] * to[1])); + + var result = { + sx: sx, sy: sy, tx: tx, ty: ty, lw: lw, + xSpan: Math.abs(tx - sx), + ySpan: Math.abs(ty - sy), + mx: (sx + tx) / 2, + my: (sy + ty) / 2, + so: so, to: to, x: x, y: y, w: w, h: h, + segment: segment, + startStubX: sx + (so[0] * sourceStub), + startStubY: sy + (so[1] * sourceStub), + endStubX: tx + (to[0] * targetStub), + endStubY: ty + (to[1] * targetStub), + isXGreaterThanStubTimes2: Math.abs(sx - tx) > (sourceStub + targetStub), + isYGreaterThanStubTimes2: Math.abs(sy - ty) > (sourceStub + targetStub), + opposite: oProduct === -1, + perpendicular: oProduct === 0, + orthogonal: oProduct === 1, + sourceAxis: so[0] === 0 ? "y" : "x", + points: [x, y, w, h, sx, sy, tx, ty ], + stubs:[sourceStub, targetStub] + }; + result.anchorOrientation = result.opposite ? "opposite" : result.orthogonal ? "orthogonal" : "perpendicular"; + return result; + }; + + this.getSegments = function () { + return segments; + }; + + this.updateBounds = function (segment) { + var segBounds = segment.getBounds(); + this.bounds.minX = Math.min(this.bounds.minX, segBounds.minX); + this.bounds.maxX = Math.max(this.bounds.maxX, segBounds.maxX); + this.bounds.minY = Math.min(this.bounds.minY, segBounds.minY); + this.bounds.maxY = Math.max(this.bounds.maxY, segBounds.maxY); + }; + + var dumpSegmentsToConsole = function () { + console.log("SEGMENTS:"); + for (var i = 0; i < segments.length; i++) { + console.log(segments[i].type, segments[i].getLength(), segmentProportions[i]); + } + }; + + this.pointOnPath = function (location, absolute) { + var seg = _findSegmentForLocation(location, absolute); + return seg.segment && seg.segment.pointOnPath(seg.proportion, false) || [0, 0]; + }; + + this.gradientAtPoint = function (location, absolute) { + var seg = _findSegmentForLocation(location, absolute); + return seg.segment && seg.segment.gradientAtPoint(seg.proportion, false) || 0; + }; + + this.pointAlongPathFrom = function (location, distance, absolute) { + var seg = _findSegmentForLocation(location, absolute); + // TODO what happens if this crosses to the next segment? + return seg.segment && seg.segment.pointAlongPathFrom(seg.proportion, distance, false) || [0, 0]; + }; + + this.compute = function (params) { + paintInfo = _prepareCompute.call(this, params); + + _clearSegments(); + this._compute(paintInfo, params); + this.x = paintInfo.points[0]; + this.y = paintInfo.points[1]; + this.w = paintInfo.points[2]; + this.h = paintInfo.points[3]; + this.segment = paintInfo.segment; + _updateSegmentProportions(); + }; + + return { + addSegment: _addSegment, + prepareCompute: _prepareCompute, + sourceStub: sourceStub, + targetStub: targetStub, + maxStub: Math.max(sourceStub, targetStub), + sourceGap: sourceGap, + targetGap: targetGap, + maxGap: Math.max(sourceGap, targetGap) + }; + }; + _ju.extend(_jp.Connectors.AbstractConnector, AbstractComponent); + + + // ********************************* END OF CONNECTOR TYPES ******************************************************************* + + // ********************************* ENDPOINT TYPES ******************************************************************* + + _jp.Endpoints.AbstractEndpoint = function (params) { + AbstractComponent.apply(this, arguments); + var compute = this.compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + var out = this._compute.apply(this, arguments); + this.x = out[0]; + this.y = out[1]; + this.w = out[2]; + this.h = out[3]; + this.bounds.minX = this.x; + this.bounds.minY = this.y; + this.bounds.maxX = this.x + this.w; + this.bounds.maxY = this.y + this.h; + return out; + }; + return { + compute: compute, + cssClass: params.cssClass + }; + }; + _ju.extend(_jp.Endpoints.AbstractEndpoint, AbstractComponent); + + /** + * Class: Endpoints.Dot + * A round endpoint, with default radius 10 pixels. + */ + + /** + * Function: Constructor + * + * Parameters: + * + * radius - radius of the endpoint. defaults to 10 pixels. + */ + _jp.Endpoints.Dot = function (params) { + this.type = "Dot"; + var _super = _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + params = params || {}; + this.radius = params.radius || 10; + this.defaultOffset = 0.5 * this.radius; + this.defaultInnerRadius = this.radius / 3; + + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + this.radius = endpointStyle.radius || this.radius; + var x = anchorPoint[0] - this.radius, + y = anchorPoint[1] - this.radius, + w = this.radius * 2, + h = this.radius * 2; + + if (endpointStyle.stroke) { + var lw = endpointStyle.strokeWidth || 1; + x -= lw; + y -= lw; + w += (lw * 2); + h += (lw * 2); + } + return [ x, y, w, h, this.radius ]; + }; + }; + _ju.extend(_jp.Endpoints.Dot, _jp.Endpoints.AbstractEndpoint); + + _jp.Endpoints.Rectangle = function (params) { + this.type = "Rectangle"; + var _super = _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + params = params || {}; + this.width = params.width || 20; + this.height = params.height || 20; + + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + var width = endpointStyle.width || this.width, + height = endpointStyle.height || this.height, + x = anchorPoint[0] - (width / 2), + y = anchorPoint[1] - (height / 2); + + return [ x, y, width, height]; + }; + }; + _ju.extend(_jp.Endpoints.Rectangle, _jp.Endpoints.AbstractEndpoint); + + var DOMElementEndpoint = function (params) { + _jp.jsPlumbUIComponent.apply(this, arguments); + this._jsPlumb.displayElements = []; + }; + _ju.extend(DOMElementEndpoint, _jp.jsPlumbUIComponent, { + getDisplayElements: function () { + return this._jsPlumb.displayElements; + }, + appendDisplayElement: function (el) { + this._jsPlumb.displayElements.push(el); + } + }); + + /** + * Class: Endpoints.Image + * Draws an image as the Endpoint. + */ + /** + * Function: Constructor + * + * Parameters: + * + * src - location of the image to use. + + TODO: multiple references to self. not sure quite how to get rid of them entirely. perhaps self = null in the cleanup + function will suffice + + TODO this class still might leak memory. + + */ + _jp.Endpoints.Image = function (params) { + + this.type = "Image"; + DOMElementEndpoint.apply(this, arguments); + _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + + var _onload = params.onload, + src = params.src || params.url, + clazz = params.cssClass ? " " + params.cssClass : ""; + + this._jsPlumb.img = new Image(); + this._jsPlumb.ready = false; + this._jsPlumb.initialized = false; + this._jsPlumb.deleted = false; + this._jsPlumb.widthToUse = params.width; + this._jsPlumb.heightToUse = params.height; + this._jsPlumb.endpoint = params.endpoint; + + this._jsPlumb.img.onload = function () { + if (this._jsPlumb != null) { + this._jsPlumb.ready = true; + this._jsPlumb.widthToUse = this._jsPlumb.widthToUse || this._jsPlumb.img.width; + this._jsPlumb.heightToUse = this._jsPlumb.heightToUse || this._jsPlumb.img.height; + if (_onload) { + _onload(this); + } + } + }.bind(this); + + /* + Function: setImage + Sets the Image to use in this Endpoint. + + Parameters: + img - may be a URL or an Image object + onload - optional; a callback to execute once the image has loaded. + */ + this._jsPlumb.endpoint.setImage = function (_img, onload) { + var s = _img.constructor === String ? _img : _img.src; + _onload = onload; + this._jsPlumb.img.src = s; + + if (this.canvas != null) { + this.canvas.setAttribute("src", this._jsPlumb.img.src); + } + }.bind(this); + + this._jsPlumb.endpoint.setImage(src, _onload); + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + this.anchorPoint = anchorPoint; + if (this._jsPlumb.ready) { + return [anchorPoint[0] - this._jsPlumb.widthToUse / 2, anchorPoint[1] - this._jsPlumb.heightToUse / 2, + this._jsPlumb.widthToUse, this._jsPlumb.heightToUse]; + } + else { + return [0, 0, 0, 0]; + } + }; + + this.canvas = _jp.createElement("img", { + position:"absolute", + margin:0, + padding:0, + outline:0 + }, this._jsPlumb.instance.endpointClass + clazz); + + if (this._jsPlumb.widthToUse) { + this.canvas.setAttribute("width", this._jsPlumb.widthToUse); + } + if (this._jsPlumb.heightToUse) { + this.canvas.setAttribute("height", this._jsPlumb.heightToUse); + } + this._jsPlumb.instance.appendElement(this.canvas); + + this.actuallyPaint = function (d, style, anchor) { + if (!this._jsPlumb.deleted) { + if (!this._jsPlumb.initialized) { + this.canvas.setAttribute("src", this._jsPlumb.img.src); + this.appendDisplayElement(this.canvas); + this._jsPlumb.initialized = true; + } + var x = this.anchorPoint[0] - (this._jsPlumb.widthToUse / 2), + y = this.anchorPoint[1] - (this._jsPlumb.heightToUse / 2); + _ju.sizeElement(this.canvas, x, y, this._jsPlumb.widthToUse, this._jsPlumb.heightToUse); + } + }; + + this.paint = function (style, anchor) { + if (this._jsPlumb != null) { // may have been deleted + if (this._jsPlumb.ready) { + this.actuallyPaint(style, anchor); + } + else { + root.setTimeout(function () { + this.paint(style, anchor); + }.bind(this), 200); + } + } + }; + }; + _ju.extend(_jp.Endpoints.Image, [ DOMElementEndpoint, _jp.Endpoints.AbstractEndpoint ], { + cleanup: function (force) { + if (force) { + this._jsPlumb.deleted = true; + if (this.canvas) { + this.canvas.parentNode.removeChild(this.canvas); + } + this.canvas = null; + } + } + }); + + /* + * Class: Endpoints.Blank + * An Endpoint that paints nothing (visible) on the screen. Supports cssClass and hoverClass parameters like all Endpoints. + */ + _jp.Endpoints.Blank = function (params) { + var _super = _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + this.type = "Blank"; + DOMElementEndpoint.apply(this, arguments); + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + return [anchorPoint[0], anchorPoint[1], 10, 0]; + }; + + var clazz = params.cssClass ? " " + params.cssClass : ""; + + this.canvas = _jp.createElement("div", { + display: "block", + width: "1px", + height: "1px", + background: "transparent", + position: "absolute" + }, this._jsPlumb.instance.endpointClass + clazz); + + this._jsPlumb.instance.appendElement(this.canvas); + + this.paint = function (style, anchor) { + _ju.sizeElement(this.canvas, this.x, this.y, this.w, this.h); + }; + }; + _ju.extend(_jp.Endpoints.Blank, [_jp.Endpoints.AbstractEndpoint, DOMElementEndpoint], { + cleanup: function () { + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + } + }); + + /* + * Class: Endpoints.Triangle + * A triangular Endpoint. + */ + /* + * Function: Constructor + * + * Parameters: + * + * width width of the triangle's base. defaults to 55 pixels. + * height height of the triangle from base to apex. defaults to 55 pixels. + */ + _jp.Endpoints.Triangle = function (params) { + this.type = "Triangle"; + _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + var self = this; + params = params || { }; + params.width = params.width || 55; + params.height = params.height || 55; + this.width = params.width; + this.height = params.height; + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + var width = endpointStyle.width || self.width, + height = endpointStyle.height || self.height, + x = anchorPoint[0] - (width / 2), + y = anchorPoint[1] - (height / 2); + return [ x, y, width, height ]; + }; + }; +// ********************************* END OF ENDPOINT TYPES ******************************************************************* + + +// ********************************* OVERLAY DEFINITIONS *********************************************************************** + + var AbstractOverlay = _jp.Overlays.AbstractOverlay = function (params) { + this.visible = true; + this.isAppendedAtTopLevel = true; + this.component = params.component; + this.loc = params.location == null ? 0.5 : params.location; + this.endpointLoc = params.endpointLocation == null ? [ 0.5, 0.5] : params.endpointLocation; + this.visible = params.visible !== false; + }; + AbstractOverlay.prototype = { + cleanup: function (force) { + if (force) { + this.component = null; + this.canvas = null; + this.endpointLoc = null; + } + }, + reattach:function(instance, component) { }, + setVisible: function (val) { + this.visible = val; + this.component.repaint(); + }, + isVisible: function () { + return this.visible; + }, + hide: function () { + this.setVisible(false); + }, + show: function () { + this.setVisible(true); + }, + incrementLocation: function (amount) { + this.loc += amount; + this.component.repaint(); + }, + setLocation: function (l) { + this.loc = l; + this.component.repaint(); + }, + getLocation: function () { + return this.loc; + }, + updateFrom:function() { } + }; + + + /* + * Class: Overlays.Arrow + * + * An arrow overlay, defined by four points: the head, the two sides of the tail, and a 'foldback' point at some distance along the length + * of the arrow that lines from each tail point converge into. The foldback point is defined using a decimal that indicates some fraction + * of the length of the arrow and has a default value of 0.623. A foldback point value of 1 would mean that the arrow had a straight line + * across the tail. + */ + /* + * @constructor + * + * @param {Object} params Constructor params. + * @param {Number} [params.length] Distance in pixels from head to tail baseline. default 20. + * @param {Number} [params.width] Width in pixels of the tail baseline. default 20. + * @param {String} [params.fill] Style to use when filling the arrow. defaults to "black". + * @param {String} [params.stroke] Style to use when stroking the arrow. defaults to null, which means the arrow is not stroked. + * @param {Number} [params.stroke-width] Line width to use when stroking the arrow. defaults to 1, but only used if stroke is not null. + * @param {Number} [params.foldback] Distance (as a decimal from 0 to 1 inclusive) along the length of the arrow marking the point the tail points should fold back to. defaults to 0.623. + * @param {Number} [params.location] Distance (as a decimal from 0 to 1 inclusive) marking where the arrow should sit on the connector. defaults to 0.5. + * @param {NUmber} [params.direction] Indicates the direction the arrow points in. valid values are -1 and 1; 1 is default. + */ + _jp.Overlays.Arrow = function (params) { + this.type = "Arrow"; + AbstractOverlay.apply(this, arguments); + this.isAppendedAtTopLevel = false; + params = params || {}; + var self = this; + + this.length = params.length || 20; + this.width = params.width || 20; + this.id = params.id; + this.direction = (params.direction || 1) < 0 ? -1 : 1; + var paintStyle = params.paintStyle || { "stroke-width": 1 }, + // how far along the arrow the lines folding back in come to. default is 62.3%. + foldback = params.foldback || 0.623; + + this.computeMaxSize = function () { + return self.width * 1.5; + }; + + this.elementCreated = function(p, component) { + this.path = p; + if (params.events) { + for (var i in params.events) { + _jp.on(p, i, params.events[i]); + } + } + }; + + this.draw = function (component, currentConnectionPaintStyle) { + + var hxy, mid, txy, tail, cxy; + if (component.pointAlongPathFrom) { + + if (_ju.isString(this.loc) || this.loc > 1 || this.loc < 0) { + var l = parseInt(this.loc, 10), + fromLoc = this.loc < 0 ? 1 : 0; + hxy = component.pointAlongPathFrom(fromLoc, l, false); + mid = component.pointAlongPathFrom(fromLoc, l - (this.direction * this.length / 2), false); + txy = _jg.pointOnLine(hxy, mid, this.length); + } + else if (this.loc === 1) { + hxy = component.pointOnPath(this.loc); + mid = component.pointAlongPathFrom(this.loc, -(this.length)); + txy = _jg.pointOnLine(hxy, mid, this.length); + + if (this.direction === -1) { + var _ = txy; + txy = hxy; + hxy = _; + } + } + else if (this.loc === 0) { + txy = component.pointOnPath(this.loc); + mid = component.pointAlongPathFrom(this.loc, this.length); + hxy = _jg.pointOnLine(txy, mid, this.length); + if (this.direction === -1) { + var __ = txy; + txy = hxy; + hxy = __; + } + } + else { + hxy = component.pointAlongPathFrom(this.loc, this.direction * this.length / 2); + mid = component.pointOnPath(this.loc); + txy = _jg.pointOnLine(hxy, mid, this.length); + } + + tail = _jg.perpendicularLineTo(hxy, txy, this.width); + cxy = _jg.pointOnLine(hxy, txy, foldback * this.length); + + var d = { hxy: hxy, tail: tail, cxy: cxy }, + stroke = paintStyle.stroke || currentConnectionPaintStyle.stroke, + fill = paintStyle.fill || currentConnectionPaintStyle.stroke, + lineWidth = paintStyle.strokeWidth || currentConnectionPaintStyle.strokeWidth; + + return { + component: component, + d: d, + "stroke-width": lineWidth, + stroke: stroke, + fill: fill, + minX: Math.min(hxy.x, tail[0].x, tail[1].x), + maxX: Math.max(hxy.x, tail[0].x, tail[1].x), + minY: Math.min(hxy.y, tail[0].y, tail[1].y), + maxY: Math.max(hxy.y, tail[0].y, tail[1].y) + }; + } + else { + return {component: component, minX: 0, maxX: 0, minY: 0, maxY: 0}; + } + }; + }; + _ju.extend(_jp.Overlays.Arrow, AbstractOverlay, { + updateFrom:function(d) { + this.length = d.length || this.length; + this.width = d.width|| this.width; + this.direction = d.direction != null ? d.direction : this.direction; + this.foldback = d.foldback|| this.foldback; + }, + cleanup:function() { + if (this.path && this.path.parentNode) { + this.path.parentNode.removeChild(this.path); + } + } + }); + + /* + * Class: Overlays.PlainArrow + * + * A basic arrow. This is in fact just one instance of the more generic case in which the tail folds back on itself to some + * point along the length of the arrow: in this case, that foldback point is the full length of the arrow. so it just does + * a 'call' to Arrow with foldback set appropriately. + */ + /* + * Function: Constructor + * See for allowed parameters for this overlay. + */ + _jp.Overlays.PlainArrow = function (params) { + params = params || {}; + var p = _jp.extend(params, {foldback: 1}); + _jp.Overlays.Arrow.call(this, p); + this.type = "PlainArrow"; + }; + _ju.extend(_jp.Overlays.PlainArrow, _jp.Overlays.Arrow); + + /* + * Class: Overlays.Diamond + * + * A diamond. Like PlainArrow, this is a concrete case of the more generic case of the tail points converging on some point...it just + * happens that in this case, that point is greater than the length of the the arrow. + * + * this could probably do with some help with positioning...due to the way it reuses the Arrow paint code, what Arrow thinks is the + * center is actually 1/4 of the way along for this guy. but we don't have any knowledge of pixels at this point, so we're kind of + * stuck when it comes to helping out the Arrow class. possibly we could pass in a 'transpose' parameter or something. the value + * would be -l/4 in this case - move along one quarter of the total length. + */ + /* + * Function: Constructor + * See for allowed parameters for this overlay. + */ + _jp.Overlays.Diamond = function (params) { + params = params || {}; + var l = params.length || 40, + p = _jp.extend(params, {length: l / 2, foldback: 2}); + _jp.Overlays.Arrow.call(this, p); + this.type = "Diamond"; + }; + _ju.extend(_jp.Overlays.Diamond, _jp.Overlays.Arrow); + + var _getDimensions = function (component, forceRefresh) { + if (component._jsPlumb.cachedDimensions == null || forceRefresh) { + component._jsPlumb.cachedDimensions = component.getDimensions(); + } + return component._jsPlumb.cachedDimensions; + }; + + // abstract superclass for overlays that add an element to the DOM. + var AbstractDOMOverlay = function (params) { + _jp.jsPlumbUIComponent.apply(this, arguments); + AbstractOverlay.apply(this, arguments); + + // hand off fired events to associated component. + var _f = this.fire; + this.fire = function () { + _f.apply(this, arguments); + if (this.component) { + this.component.fire.apply(this.component, arguments); + } + }; + + this.detached=false; + this.id = params.id; + this._jsPlumb.div = null; + this._jsPlumb.initialised = false; + this._jsPlumb.component = params.component; + this._jsPlumb.cachedDimensions = null; + this._jsPlumb.create = params.create; + this._jsPlumb.initiallyInvisible = params.visible === false; + + this.getElement = function () { + if (this._jsPlumb.div == null) { + var div = this._jsPlumb.div = _jp.getElement(this._jsPlumb.create(this._jsPlumb.component)); + div.style.position = "absolute"; + jsPlumb.addClass(div, this._jsPlumb.instance.overlayClass + " " + + (this.cssClass ? this.cssClass : + params.cssClass ? params.cssClass : "")); + this._jsPlumb.instance.appendElement(div); + this._jsPlumb.instance.getId(div); + this.canvas = div; + + // in IE the top left corner is what it placed at the desired location. This will not + // be fixed. IE8 is not going to be supported for much longer. + var ts = "translate(-50%, -50%)"; + div.style.webkitTransform = ts; + div.style.mozTransform = ts; + div.style.msTransform = ts; + div.style.oTransform = ts; + div.style.transform = ts; + + // write the related component into the created element + div._jsPlumb = this; + + if (params.visible === false) { + div.style.display = "none"; + } + } + return this._jsPlumb.div; + }; + + this.draw = function (component, currentConnectionPaintStyle, absolutePosition) { + var td = _getDimensions(this); + if (td != null && td.length === 2) { + var cxy = { x: 0, y: 0 }; + + // absolutePosition would have been set by a call to connection.setAbsoluteOverlayPosition. + if (absolutePosition) { + cxy = { x: absolutePosition[0], y: absolutePosition[1] }; + } + else if (component.pointOnPath) { + var loc = this.loc, absolute = false; + if (_ju.isString(this.loc) || this.loc < 0 || this.loc > 1) { + loc = parseInt(this.loc, 10); + absolute = true; + } + cxy = component.pointOnPath(loc, absolute); // a connection + } + else { + var locToUse = this.loc.constructor === Array ? this.loc : this.endpointLoc; + cxy = { x: locToUse[0] * component.w, + y: locToUse[1] * component.h }; + } + + var minx = cxy.x - (td[0] / 2), + miny = cxy.y - (td[1] / 2); + + return { + component: component, + d: { minx: minx, miny: miny, td: td, cxy: cxy }, + minX: minx, + maxX: minx + td[0], + minY: miny, + maxY: miny + td[1] + }; + } + else { + return {minX: 0, maxX: 0, minY: 0, maxY: 0}; + } + }; + }; + _ju.extend(AbstractDOMOverlay, [_jp.jsPlumbUIComponent, AbstractOverlay], { + getDimensions: function () { + return [1,1]; + }, + setVisible: function (state) { + if (this._jsPlumb.div) { + this._jsPlumb.div.style.display = state ? "block" : "none"; + // if initially invisible, dimensions are 0,0 and never get updated + if (state && this._jsPlumb.initiallyInvisible) { + _getDimensions(this, true); + this.component.repaint(); + this._jsPlumb.initiallyInvisible = false; + } + } + }, + /* + * Function: clearCachedDimensions + * Clears the cached dimensions for the label. As a performance enhancement, label dimensions are + * cached from 1.3.12 onwards. The cache is cleared when you change the label text, of course, but + * there are other reasons why the text dimensions might change - if you make a change through CSS, for + * example, you might change the font size. in that case you should explicitly call this method. + */ + clearCachedDimensions: function () { + this._jsPlumb.cachedDimensions = null; + }, + cleanup: function (force) { + if (force) { + if (this._jsPlumb.div != null) { + this._jsPlumb.div._jsPlumb = null; + this._jsPlumb.instance.removeElement(this._jsPlumb.div); + } + } + else { + // if not a forced cleanup, just detach child from parent for now. + if (this._jsPlumb && this._jsPlumb.div && this._jsPlumb.div.parentNode) { + this._jsPlumb.div.parentNode.removeChild(this._jsPlumb.div); + } + this.detached = true; + } + + }, + reattach:function(instance, component) { + if (this._jsPlumb.div != null) { + instance.getContainer().appendChild(this._jsPlumb.div); + } + this.detached = false; + }, + computeMaxSize: function () { + var td = _getDimensions(this); + return Math.max(td[0], td[1]); + }, + paint: function (p, containerExtents) { + if (!this._jsPlumb.initialised) { + this.getElement(); + p.component.appendDisplayElement(this._jsPlumb.div); + this._jsPlumb.initialised = true; + if (this.detached) { + this._jsPlumb.div.parentNode.removeChild(this._jsPlumb.div); + } + } + this._jsPlumb.div.style.left = (p.component.x + p.d.minx) + "px"; + this._jsPlumb.div.style.top = (p.component.y + p.d.miny) + "px"; + } + }); + + /* + * Class: Overlays.Custom + * A Custom overlay. You supply a 'create' function which returns some DOM element, and jsPlumb positions it. + * The 'create' function is passed a Connection or Endpoint. + */ + /* + * Function: Constructor + * + * Parameters: + * create - function for jsPlumb to call that returns a DOM element. + * location - distance (as a decimal from 0 to 1 inclusive) marking where the label should sit on the connector. defaults to 0.5. + * id - optional id to use for later retrieval of this overlay. + * + */ + _jp.Overlays.Custom = function (params) { + this.type = "Custom"; + AbstractDOMOverlay.apply(this, arguments); + }; + _ju.extend(_jp.Overlays.Custom, AbstractDOMOverlay); + + _jp.Overlays.GuideLines = function () { + var self = this; + self.length = 50; + self.strokeWidth = 5; + this.type = "GuideLines"; + AbstractOverlay.apply(this, arguments); + _jp.jsPlumbUIComponent.apply(this, arguments); + this.draw = function (connector, currentConnectionPaintStyle) { + + var head = connector.pointAlongPathFrom(self.loc, self.length / 2), + mid = connector.pointOnPath(self.loc), + tail = _jg.pointOnLine(head, mid, self.length), + tailLine = _jg.perpendicularLineTo(head, tail, 40), + headLine = _jg.perpendicularLineTo(tail, head, 20); + + return { + connector: connector, + head: head, + tail: tail, + headLine: headLine, + tailLine: tailLine, + minX: Math.min(head.x, tail.x, headLine[0].x, headLine[1].x), + minY: Math.min(head.y, tail.y, headLine[0].y, headLine[1].y), + maxX: Math.max(head.x, tail.x, headLine[0].x, headLine[1].x), + maxY: Math.max(head.y, tail.y, headLine[0].y, headLine[1].y) + }; + }; + + // this.cleanup = function() { }; // nothing to clean up for GuideLines + }; + + /* + * Class: Overlays.Label + + */ + /* + * Function: Constructor + * + * Parameters: + * cssClass - optional css class string to append to css class. This string is appended "as-is", so you can of course have multiple classes + * defined. This parameter is preferred to using labelStyle, borderWidth and borderStyle. + * label - the label to paint. May be a string or a function that returns a string. Nothing will be painted if your label is null or your + * label function returns null. empty strings _will_ be painted. + * location - distance (as a decimal from 0 to 1 inclusive) marking where the label should sit on the connector. defaults to 0.5. + * id - optional id to use for later retrieval of this overlay. + * + * + */ + _jp.Overlays.Label = function (params) { + this.labelStyle = params.labelStyle; + + var labelWidth = null, labelHeight = null, labelText = null, labelPadding = null; + this.cssClass = this.labelStyle != null ? this.labelStyle.cssClass : null; + var p = _jp.extend({ + create: function () { + return _jp.createElement("div"); + }}, params); + _jp.Overlays.Custom.call(this, p); + this.type = "Label"; + this.label = params.label || ""; + this.labelText = null; + if (this.labelStyle) { + var el = this.getElement(); + this.labelStyle.font = this.labelStyle.font || "12px sans-serif"; + el.style.font = this.labelStyle.font; + el.style.color = this.labelStyle.color || "black"; + if (this.labelStyle.fill) { + el.style.background = this.labelStyle.fill; + } + if (this.labelStyle.borderWidth > 0) { + var dStyle = this.labelStyle.borderStyle ? this.labelStyle.borderStyle : "black"; + el.style.border = this.labelStyle.borderWidth + "px solid " + dStyle; + } + if (this.labelStyle.padding) { + el.style.padding = this.labelStyle.padding; + } + } + + }; + _ju.extend(_jp.Overlays.Label, _jp.Overlays.Custom, { + cleanup: function (force) { + if (force) { + this.div = null; + this.label = null; + this.labelText = null; + this.cssClass = null; + this.labelStyle = null; + } + }, + getLabel: function () { + return this.label; + }, + /* + * Function: setLabel + * sets the label's, um, label. you would think i'd call this function + * 'setText', but you can pass either a Function or a String to this, so + * it makes more sense as 'setLabel'. This uses innerHTML on the label div, so keep + * that in mind if you need escaped HTML. + */ + setLabel: function (l) { + this.label = l; + this.labelText = null; + this.clearCachedDimensions(); + this.update(); + this.component.repaint(); + }, + getDimensions: function () { + this.update(); + return AbstractDOMOverlay.prototype.getDimensions.apply(this, arguments); + }, + update: function () { + if (typeof this.label === "function") { + var lt = this.label(this); + this.getElement().innerHTML = lt.replace(/\r\n/g, "
"); + } + else { + if (this.labelText == null) { + this.labelText = this.label; + this.getElement().innerHTML = this.labelText.replace(/\r\n/g, "
"); + } + } + }, + updateFrom:function(d) { + if(d.label != null){ + this.setLabel(d.label); + } + } + }); + + // ********************************* END OF OVERLAY DEFINITIONS *********************************************************************** + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * Copyright (c) 2010 - 2020 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function() { + "use strict"; + + var root = this, + _ju = root.jsPlumbUtil, + _jpi = root.jsPlumbInstance; + + var GROUP_COLLAPSED_CLASS = "jtk-group-collapsed"; + var GROUP_EXPANDED_CLASS = "jtk-group-expanded"; + var GROUP_CONTAINER_SELECTOR = "[jtk-group-content]"; + var ELEMENT_DRAGGABLE_EVENT = "elementDraggable"; + var STOP = "stop"; + var REVERT = "revert"; + var GROUP_MANAGER = "_groupManager"; + var GROUP = "_jsPlumbGroup"; + var GROUP_DRAG_SCOPE = "_jsPlumbGroupDrag"; + var EVT_CHILD_ADDED = "group:addMember"; + var EVT_CHILD_REMOVED = "group:removeMember"; + var EVT_GROUP_ADDED = "group:add"; + var EVT_GROUP_REMOVED = "group:remove"; + var EVT_EXPAND = "group:expand"; + var EVT_COLLAPSE = "group:collapse"; + var EVT_GROUP_DRAG_STOP = "groupDragStop"; + var EVT_CONNECTION_MOVED = "connectionMoved"; + var EVT_INTERNAL_CONNECTION_DETACHED = "internal.connectionDetached"; + + var CMD_REMOVE_ALL = "removeAll"; + var CMD_ORPHAN_ALL = "orphanAll"; + var CMD_SHOW = "show"; + var CMD_HIDE = "hide"; + + var GroupManager = function(_jsPlumb) { + var _managedGroups = {}, _connectionSourceMap = {}, _connectionTargetMap = {}, self = this; + + // function findGroupFor(el) { + // var c = _jsPlumb.getContainer(); + // var abort = false, g = null, child = null; + // while (!abort) { + // if (el == null || el === c) { + // abort = true; + // } else { + // if (el[GROUP]) { + // g = el[GROUP]; + // child = el; + // abort = true; + // } else { + // el = el.parentNode; + // } + // } + // } + // return g; + // } + + function isDescendant(el, parentEl) { + var c = _jsPlumb.getContainer(); + var abort = false, g = null, child = null; + while (!abort) { + if (el == null || el === c) { + return false; + } else { + if (el === parentEl) { + return true; + } else { + el = el.parentNode; + } + } + } + } + + _jsPlumb.bind("connection", function(p) { + + var sourceGroup = _jsPlumb.getGroupFor(p.source); + var targetGroup = _jsPlumb.getGroupFor(p.target); + + if (sourceGroup != null && targetGroup != null && sourceGroup === targetGroup) { + _connectionSourceMap[p.connection.id] = sourceGroup; + _connectionTargetMap[p.connection.id] = sourceGroup; + } + else { + if (sourceGroup != null) { + _ju.suggest(sourceGroup.connections.source, p.connection); + _connectionSourceMap[p.connection.id] = sourceGroup; + } + if (targetGroup != null) { + _ju.suggest(targetGroup.connections.target, p.connection); + _connectionTargetMap[p.connection.id] = targetGroup; + } + } + }); + + function _cleanupDetachedConnection(conn) { + delete conn.proxies; + var group = _connectionSourceMap[conn.id], f; + if (group != null) { + f = function(c) { return c.id === conn.id; }; + _ju.removeWithFunction(group.connections.source, f); + _ju.removeWithFunction(group.connections.target, f); + delete _connectionSourceMap[conn.id]; + } + + group = _connectionTargetMap[conn.id]; + if (group != null) { + f = function(c) { return c.id === conn.id; }; + _ju.removeWithFunction(group.connections.source, f); + _ju.removeWithFunction(group.connections.target, f); + delete _connectionTargetMap[conn.id]; + } + } + + _jsPlumb.bind(EVT_INTERNAL_CONNECTION_DETACHED, function(p) { + _cleanupDetachedConnection(p.connection); + }); + + _jsPlumb.bind(EVT_CONNECTION_MOVED, function(p) { + var connMap = p.index === 0 ? _connectionSourceMap : _connectionTargetMap; + var group = connMap[p.connection.id]; + if (group) { + var list = group.connections[p.index === 0 ? "source" : "target"]; + var idx = list.indexOf(p.connection); + if (idx !== -1) { + list.splice(idx, 1); + } + } + }); + + this.addGroup = function(group) { + _jsPlumb.addClass(group.getEl(), GROUP_EXPANDED_CLASS); + _managedGroups[group.id] = group; + group.manager = this; + _updateConnectionsForGroup(group); + _jsPlumb.fire(EVT_GROUP_ADDED, { group:group }); + }; + + this.addToGroup = function(group, el, doNotFireEvent) { + group = this.getGroup(group); + if (group) { + var groupEl = group.getEl(); + + if (el._isJsPlumbGroup) { + return; + } + var currentGroup = el._jsPlumbGroup; + // if already a member of this group, do nothing + if (currentGroup !== group) { + + _jsPlumb.removeFromDragSelection(el); + + var elpos = _jsPlumb.getOffset(el, true); + var cpos = group.collapsed ? _jsPlumb.getOffset(groupEl, true) : _jsPlumb.getOffset(group.getDragArea(), true); + + // otherwise, transfer to this group. + if (currentGroup != null) { + currentGroup.remove(el, false, doNotFireEvent, false, group); + self.updateConnectionsForGroup(currentGroup); + } + group.add(el, doNotFireEvent/*, currentGroup*/); + + var handleDroppedConnections = function (list, index) { + var oidx = index === 0 ? 1 : 0; + list.each(function (c) { + c.setVisible(false); + if (c.endpoints[oidx].element._jsPlumbGroup === group) { + c.endpoints[oidx].setVisible(false); + _expandConnection(c, oidx, group); + } + else { + c.endpoints[index].setVisible(false); + _collapseConnection(c, index, group); + } + }); + }; + + if (group.collapsed) { + handleDroppedConnections(_jsPlumb.select({source: el}), 0); + handleDroppedConnections(_jsPlumb.select({target: el}), 1); + } + + var elId = _jsPlumb.getId(el); + _jsPlumb.dragManager.setParent(el, elId, groupEl, _jsPlumb.getId(groupEl), elpos); + + var newPosition = { left: elpos.left - cpos.left, top: elpos.top - cpos.top }; + + _jsPlumb.setPosition(el, newPosition); + + _jsPlumb.dragManager.revalidateParent(el, elId, elpos); + + self.updateConnectionsForGroup(group); + + _jsPlumb.revalidate(elId); + + if (!doNotFireEvent) { + var p = {group: group, el: el, pos:newPosition}; + if (currentGroup) { + p.sourceGroup = currentGroup; + } + _jsPlumb.fire(EVT_CHILD_ADDED, p); + } + } + } + }; + + this.removeFromGroup = function(group, el, doNotFireEvent) { + group = this.getGroup(group); + if (group) { + + // if this group is currently collapsed then any proxied connections for the given el (or its descendants) need + // to be put back on their original element, and unproxied + if (group.collapsed) { + var _expandSet = function (conns, index) { + for (var i = 0; i < conns.length; i++) { + var c = conns[i]; + if (c.proxies) { + for(var j = 0; j < c.proxies.length; j++) { + if (c.proxies[j] != null) { + var proxiedElement = c.proxies[j].originalEp.element; + if (proxiedElement === el || isDescendant(proxiedElement, el)) { + _expandConnection(c, index, group); + } + } + + } + } + } + }; + + // setup proxies for sources and targets + _expandSet(group.connections.source.slice(), 0); + _expandSet(group.connections.target.slice(), 1); + } + + group.remove(el, null, doNotFireEvent); + } + }; + + this.getGroup = function(groupId) { + var group = groupId; + if (_ju.isString(groupId)) { + group = _managedGroups[groupId]; + if (group == null) { + throw new TypeError("No such group [" + groupId + "]"); + } + } + return group; + }; + + this.getGroups = function() { + var o = []; + for (var g in _managedGroups) { + o.push(_managedGroups[g]); + } + return o; + }; + + this.removeGroup = function(group, deleteMembers, manipulateDOM, doNotFireEvent) { + group = this.getGroup(group); + this.expandGroup(group, true); // this reinstates any original connections and removes all proxies, but does not fire an event. + var newPositions = group[deleteMembers ? CMD_REMOVE_ALL : CMD_ORPHAN_ALL](manipulateDOM, doNotFireEvent); + _jsPlumb.remove(group.getEl()); + delete _managedGroups[group.id]; + delete _jsPlumb._groups[group.id]; + _jsPlumb.fire(EVT_GROUP_REMOVED, { group:group }); + return newPositions; // this will be null in the case or remove, but be a map of {id->[x,y]} in the case of orphan + }; + + this.removeAllGroups = function(deleteMembers, manipulateDOM, doNotFireEvent) { + for (var g in _managedGroups) { + this.removeGroup(_managedGroups[g], deleteMembers, manipulateDOM, doNotFireEvent); + } + }; + + function _setVisible(group, state) { + + // TODO discovering the list of elements would ideally be a pluggable function. + var m = group.getEl().querySelectorAll(".jtk-managed"); + for (var i = 0; i < m.length; i++) { + _jsPlumb[state ? CMD_SHOW : CMD_HIDE](m[i], true); + } + } + + var _collapseConnection = function(c, index, group) { + + var otherEl = c.endpoints[index === 0 ? 1 : 0].element; + if (otherEl[GROUP] && (!otherEl[GROUP].shouldProxy() && otherEl[GROUP].collapsed)) { + return; + } + + var groupEl = group.getEl(), groupElId = _jsPlumb.getId(groupEl); + + _jsPlumb.proxyConnection(c, index, groupEl, groupElId, function(c, index) { return group.getEndpoint(c, index); }, function(c, index) { return group.getAnchor(c, index); }); + }; + + this.collapseGroup = function(group) { + group = this.getGroup(group); + if (group == null || group.collapsed) { + return; + } + var groupEl = group.getEl(); + + // todo remove old proxy endpoints first, just in case? + //group.proxies.length = 0; + + // hide all connections + _setVisible(group, false); + + if (group.shouldProxy()) { + // collapses all connections in a group. + var _collapseSet = function (conns, index) { + for (var i = 0; i < conns.length; i++) { + var c = conns[i]; + _collapseConnection(c, index, group); + } + }; + + // setup proxies for sources and targets + _collapseSet(group.connections.source, 0); + _collapseSet(group.connections.target, 1); + } + + group.collapsed = true; + _jsPlumb.removeClass(groupEl, GROUP_EXPANDED_CLASS); + _jsPlumb.addClass(groupEl, GROUP_COLLAPSED_CLASS); + _jsPlumb.revalidate(groupEl); + _jsPlumb.fire(EVT_COLLAPSE, { group:group }); + }; + + var _expandConnection = function(c, index, group) { + _jsPlumb.unproxyConnection(c, index, _jsPlumb.getId(group.getEl())); + }; + + this.expandGroup = function(group, doNotFireEvent) { + + group = this.getGroup(group); + + if (group == null || !group.collapsed) { + return; + } + var groupEl = group.getEl(); + + _setVisible(group, true); + + if (group.shouldProxy()) { + // expands all connections in a group. + var _expandSet = function (conns, index) { + for (var i = 0; i < conns.length; i++) { + var c = conns[i]; + _expandConnection(c, index, group); + } + }; + + // setup proxies for sources and targets + _expandSet(group.connections.source, 0); + _expandSet(group.connections.target, 1); + } + + group.collapsed = false; + _jsPlumb.addClass(groupEl, GROUP_EXPANDED_CLASS); + _jsPlumb.removeClass(groupEl, GROUP_COLLAPSED_CLASS); + _jsPlumb.revalidate(groupEl); + this.repaintGroup(group); + if (!doNotFireEvent) { + _jsPlumb.fire(EVT_EXPAND, { group: group}); + } + }; + + this.repaintGroup = function(group) { + group = this.getGroup(group); + var m = group.getMembers(); + for (var i = 0; i < m.length; i++) { + _jsPlumb.revalidate(m[i]); + } + }; + + // TODO refactor this with the code that responds to `connection` events. + function _updateConnectionsForGroup(group) { + var members = group.getMembers().slice(); + + var childMembers = []; + for (var i = 0; i < members.length; i++) { + Array.prototype.push.apply(childMembers, members[i].querySelectorAll(".jtk-managed")); + } + Array.prototype.push.apply(members, childMembers); + + var c1 = _jsPlumb.getConnections({source:members, scope:"*"}, true); + var c2 = _jsPlumb.getConnections({target:members, scope:"*"}, true); + + var processed = {}; + group.connections.source.length = 0; + group.connections.target.length = 0; + var oneSet = function(c) { + for (var i = 0; i < c.length; i++) { + if (processed[c[i].id]) { + continue; + } + processed[c[i].id] = true; + var gs = _jsPlumb.getGroupFor(c[i].source), + gt = _jsPlumb.getGroupFor(c[i].target); + + if (gs === group) { + if (gt !== group) { + group.connections.source.push(c[i]); + } + _connectionSourceMap[c[i].id] = group; + } + else if (gt === group) { + group.connections.target.push(c[i]); + _connectionTargetMap[c[i].id] = group; + } + } + }; + oneSet(c1); oneSet(c2); + } + + this.updateConnectionsForGroup = _updateConnectionsForGroup; + this.refreshAllGroups = function() { + for (var g in _managedGroups) { + _updateConnectionsForGroup(_managedGroups[g]); + _jsPlumb.dragManager.updateOffsets(_jsPlumb.getId(_managedGroups[g].getEl())); + } + }; + }; + + /** + * + * @param {jsPlumbInstance} _jsPlumb Associated jsPlumb instance. + * @param {Object} params + * @param {Element} params.el The DOM element representing the Group. + * @param {String} [params.id] Optional ID for the Group. A UUID will be assigned as the Group's ID if you do not provide one. + * @param {Boolean} [params.constrain=false] If true, child elements will not be able to be dragged outside of the Group container. + * @param {Boolean} [params.revert=true] By default, child elements revert to the container if dragged outside. You can change this by setting `revert:false`. This behaviour is also overridden if you set `orphan` or `prune`. + * @param {Boolean} [params.orphan=false] If true, child elements dropped outside of the Group container will be removed from the Group (but not from the DOM). + * @param {Boolean} [params.prune=false] If true, child elements dropped outside of the Group container will be removed from the Group and also from the DOM. + * @param {Boolean} [params.dropOverride=false] If true, a child element that has been dropped onto some other Group will not be subject to the controls imposed by `prune`, `revert` or `orphan`. + * @constructor + */ + var Group = function(_jsPlumb, params) { + var self = this; + var el = params.el; + this.getEl = function() { return el; }; + this.id = params.id || _ju.uuid(); + el._isJsPlumbGroup = true; + + var getDragArea = this.getDragArea = function() { + var da = _jsPlumb.getSelector(el, GROUP_CONTAINER_SELECTOR); + return da && da.length > 0 ? da[0] : el; + }; + + var ghost = params.ghost === true; + var constrain = ghost || (params.constrain === true); + var revert = params.revert !== false; + var orphan = params.orphan === true; + var prune = params.prune === true; + var dropOverride = params.dropOverride === true; + var proxied = params.proxied !== false; + var elements = []; + this.connections = { source:[], target:[], internal:[] }; + + // this function, and getEndpoint below, are stubs for a future setup in which we can choose endpoint + // and anchor based upon the connection and the index (source/target) of the endpoint to be proxied. + this.getAnchor = function(conn, endpointIndex) { + return params.anchor || "Continuous"; + }; + + this.getEndpoint = function(conn, endpointIndex) { + return params.endpoint || [ "Dot", { radius:10 }]; + }; + + this.collapsed = false; + if (params.draggable !== false) { + var opts = { + drag:function() { + for (var i = 0; i < elements.length; i++) { + _jsPlumb.draw(elements[i]); + } + }, + stop:function(params) { + _jsPlumb.fire(EVT_GROUP_DRAG_STOP, jsPlumb.extend(params, {group:self})); + }, + scope:GROUP_DRAG_SCOPE + }; + if (params.dragOptions) { + root.jsPlumb.extend(opts, params.dragOptions); + } + _jsPlumb.draggable(params.el, opts); + } + if (params.droppable !== false) { + _jsPlumb.droppable(params.el, { + drop:function(p) { + var el = p.drag.el; + if (el._isJsPlumbGroup) { + return; + } + var currentGroup = el._jsPlumbGroup; + if (currentGroup !== self) { + if (currentGroup != null) { + if (currentGroup.overrideDrop(el, self)) { + return; + } + } + _jsPlumb.getGroupManager().addToGroup(self, el, false); + } + + } + }); + } + var _each = function(_el, fn) { + var els = _el.nodeType == null ? _el : [ _el ]; + for (var i = 0; i < els.length; i++) { + fn(els[i]); + } + }; + + this.overrideDrop = function(_el, targetGroup) { + return dropOverride && (revert || prune || orphan); + }; + + this.add = function(_el, doNotFireEvent/*, sourceGroup*/) { + var dragArea = getDragArea(); + _each(_el, function(__el) { + + if (__el._jsPlumbGroup != null) { + if (__el._jsPlumbGroup === self) { + return; + } else { + __el._jsPlumbGroup.remove(__el, true, doNotFireEvent, false); + } + } + + __el._jsPlumbGroup = self; + elements.push(__el); + // test if draggable and add handlers if so. + if (_jsPlumb.isAlreadyDraggable(__el)) { + _bindDragHandlers(__el); + } + + if (__el.parentNode !== dragArea) { + dragArea.appendChild(__el); + } + + // if (!doNotFireEvent) { + // var p = {group: self, el: __el}; + // if (sourceGroup) { + // p.sourceGroup = sourceGroup; + // } + // //_jsPlumb.fire(EVT_CHILD_ADDED, p); + // } + }); + + _jsPlumb.getGroupManager().updateConnectionsForGroup(self); + }; + + this.remove = function(el, manipulateDOM, doNotFireEvent, doNotUpdateConnections, targetGroup) { + + _each(el, function(__el) { + if (__el._jsPlumbGroup === self) { + delete __el._jsPlumbGroup; + _ju.removeWithFunction(elements, function (e) { + return e === __el; + }); + + + if (manipulateDOM) { + try { + self.getDragArea().removeChild(__el); + } catch (e) { + jsPlumbUtil.log("Could not remove element from Group " + e); + } + } + _unbindDragHandlers(__el); + + if (!doNotFireEvent) { + var p = {group: self, el: __el}; + if (targetGroup) { + p.targetGroup = targetGroup; + } + _jsPlumb.fire(EVT_CHILD_REMOVED, p); + } + } + }); + if (!doNotUpdateConnections) { + _jsPlumb.getGroupManager().updateConnectionsForGroup(self); + } + }; + this.removeAll = function(manipulateDOM, doNotFireEvent) { + for (var i = 0, l = elements.length; i < l; i++) { + var el = elements[0]; + self.remove(el, manipulateDOM, doNotFireEvent, true); + _jsPlumb.remove(el, true); + } + elements.length = 0; + _jsPlumb.getGroupManager().updateConnectionsForGroup(self); + }; + this.orphanAll = function() { + var orphanedPositions = {}; + for (var i = 0; i < elements.length; i++) { + var newPosition = _orphan(elements[i]); + orphanedPositions[newPosition[0]] = newPosition[1]; + } + elements.length = 0; + + return orphanedPositions; + }; + this.getMembers = function() { return elements; }; + + el[GROUP] = this; + + _jsPlumb.bind(ELEMENT_DRAGGABLE_EVENT, function(dragParams) { + // if its for the current group, + if (dragParams.el._jsPlumbGroup === this) { + _bindDragHandlers(dragParams.el); + } + }.bind(this)); + + function _findParent(_el) { + return _el.offsetParent; + } + + function _isInsideParent(_el, pos) { + var p = _findParent(_el), + s = _jsPlumb.getSize(p), + ss = _jsPlumb.getSize(_el), + leftEdge = pos[0], + rightEdge = leftEdge + ss[0], + topEdge = pos[1], + bottomEdge = topEdge + ss[1]; + + return rightEdge > 0 && leftEdge < s[0] && bottomEdge > 0 && topEdge < s[1]; + } + + // + // orphaning an element means taking it out of the group and adding it to the main jsplumb container. + // we return the new calculated position from this method and the element's id. + // + function _orphan(_el) { + var id = _jsPlumb.getId(_el); + var pos = _jsPlumb.getOffset(_el); + _el.parentNode.removeChild(_el); + _jsPlumb.getContainer().appendChild(_el); + _jsPlumb.setPosition(_el, pos); + _unbindDragHandlers(_el); + _jsPlumb.dragManager.clearParent(_el, id); + return [id, pos]; + } + + // + // remove an element from the group, then either prune it from the jsplumb instance, or just orphan it. + // + function _pruneOrOrphan(p) { + + var out = []; + + function _one(el, left, top) { + var orphanedPosition = null; + if (!_isInsideParent(el, [left, top])) { + var group = el._jsPlumbGroup; + if (prune) { + _jsPlumb.remove(el); + } else { + orphanedPosition = _orphan(el); + } + + group.remove(el); + } + + return orphanedPosition; + } + + for (var i = 0; i < p.selection.length; i++) { + out.push(_one(p.selection[i][0], p.selection[i][1].left, p.selection[i][1].top)); + } + + return out.length === 1 ? out[0] : out; + + } + + // + // redraws the element + // + function _revalidate(_el) { + var id = _jsPlumb.getId(_el); + _jsPlumb.revalidate(_el); + _jsPlumb.dragManager.revalidateParent(_el, id); + } + + // + // unbind the group specific drag/revert handlers. + // + function _unbindDragHandlers(_el) { + if (!_el._katavorioDrag) { + return; + } + if (prune || orphan) { + _el._katavorioDrag.off(STOP, _pruneOrOrphan); + } + if (!prune && !orphan && revert) { + _el._katavorioDrag.off(REVERT, _revalidate); + _el._katavorioDrag.setRevert(null); + } + } + + function _bindDragHandlers(_el) { + if (!_el._katavorioDrag) { + return; + } + if (prune || orphan) { + _el._katavorioDrag.on(STOP, _pruneOrOrphan); + } + + if (constrain) { + _el._katavorioDrag.setConstrain(true); + } + + if (ghost) { + _el._katavorioDrag.setUseGhostProxy(true); + } + + if (!prune && !orphan && revert) { + _el._katavorioDrag.on(REVERT, _revalidate); + _el._katavorioDrag.setRevert(function(__el, pos) { + return !_isInsideParent(__el, pos); + }); + } + } + + this.shouldProxy = function() { + return proxied; + }; + + _jsPlumb.getGroupManager().addGroup(this); + }; + + /** + * Adds a group to the jsPlumb instance. + * @method addGroup + * @param {Object} params + * @return {Group} The newly created Group. + */ + _jpi.prototype.addGroup = function(params) { + var j = this; + j._groups = j._groups || {}; + if (j._groups[params.id] != null) { + throw new TypeError("cannot create Group [" + params.id + "]; a Group with that ID exists"); + } + if (params.el[GROUP] != null) { + throw new TypeError("cannot create Group [" + params.id + "]; the given element is already a Group"); + } + var group = new Group(j, params); + j._groups[group.id] = group; + if (params.collapsed) { + this.collapseGroup(group); + } + return group; + }; + + /** + * Add an element to a group. + * @method addToGroup + * @param {String} group Group, or ID of the group, to add the element to. + * @param {Element} el Element to add to the group. + */ + _jpi.prototype.addToGroup = function(group, el, doNotFireEvent) { + + var _one = function(_el) { + var id = this.getId(_el); + this.manage(id, _el); + this.getGroupManager().addToGroup(group, _el, doNotFireEvent); + }.bind(this); + + if (Array.isArray(el)) { + for (var i = 0; i < el.length; i++) { + _one(el[i]); + } + } else { + _one(el); + } + }; + + /** + * Remove an element from a group, and sets its DOM element to be a child of the container again. ?? + * @method removeFromGroup + * @param {String} group Group, or ID of the group, to remove the element from. + * @param {Element} el Element to add to the group. + */ + _jpi.prototype.removeFromGroup = function(group, el, doNotFireEvent) { + this.getGroupManager().removeFromGroup(group, el, doNotFireEvent); + this.getContainer().appendChild(el); + }; + + /** + * Remove a group, and optionally remove its members from the jsPlumb instance. + * @method removeGroup + * @param {String|Group} group Group to delete, or ID of Group to delete. + * @param {Boolean} [deleteMembers=false] If true, group members will be removed along with the group. Otherwise they will + * just be 'orphaned' (returned to the main container). + * @returns {Map[String, Position}} When deleteMembers is false, this method returns a map of {id->position} + */ + _jpi.prototype.removeGroup = function(group, deleteMembers, manipulateDOM, doNotFireEvent) { + return this.getGroupManager().removeGroup(group, deleteMembers, manipulateDOM, doNotFireEvent); + }; + + /** + * Remove all groups, and optionally remove their members from the jsPlumb instance. + * @method removeAllGroup + * @param {Boolean} [deleteMembers=false] If true, group members will be removed along with the groups. Otherwise they will + * just be 'orphaned' (returned to the main container). + */ + _jpi.prototype.removeAllGroups = function(deleteMembers, manipulateDOM, doNotFireEvent) { + this.getGroupManager().removeAllGroups(deleteMembers, manipulateDOM, doNotFireEvent); + }; + + /** + * Get a Group + * @method getGroup + * @param {String} groupId ID of the group to get + * @return {Group} Group with the given ID, null if not found. + */ + _jpi.prototype.getGroup = function(groupId) { + return this.getGroupManager().getGroup(groupId); + }; + + /** + * Gets all the Groups managed by the jsPlumb instance. + * @returns {Group[]} List of Groups. Empty if none. + */ + _jpi.prototype.getGroups = function() { + return this.getGroupManager().getGroups(); + }; + + /** + * Expands a group element. jsPlumb doesn't do "everything" for you here, because what it means to expand a Group + * will vary from application to application. jsPlumb does these things: + * + * - Hides any connections that are internal to the group (connections between members, and connections from member of + * the group to the group itself) + * - Proxies all connections for which the source or target is a member of the group. + * - Hides the proxied connections. + * - Adds the jtk-group-expanded class to the group's element + * - Removes the jtk-group-collapsed class from the group's element. + * + * @method expandGroup + * @param {String|Group} group Group to expand, or ID of Group to expand. + */ + _jpi.prototype.expandGroup = function(group) { + this.getGroupManager().expandGroup(group); + }; + + /** + * Collapses a group element. jsPlumb doesn't do "everything" for you here, because what it means to collapse a Group + * will vary from application to application. jsPlumb does these things: + * + * - Shows any connections that are internal to the group (connections between members, and connections from member of + * the group to the group itself) + * - Removes proxies for all connections for which the source or target is a member of the group. + * - Shows the previously proxied connections. + * - Adds the jtk-group-collapsed class to the group's element + * - Removes the jtk-group-expanded class from the group's element. + * + * @method expandGroup + * @param {String|Group} group Group to expand, or ID of Group to expand. + */ + _jpi.prototype.collapseGroup = function(groupId) { + this.getGroupManager().collapseGroup(groupId); + }; + + + _jpi.prototype.repaintGroup = function(group) { + this.getGroupManager().repaintGroup(group); + }; + + /** + * Collapses or expands a group element depending on its current state. See notes in the collapseGroup and expandGroup method. + * + * @method toggleGroup + * @param {String|Group} group Group to expand/collapse, or ID of Group to expand/collapse. + */ + _jpi.prototype.toggleGroup = function(group) { + group = this.getGroupManager().getGroup(group); + if (group != null) { + this.getGroupManager()[group.collapsed ? "expandGroup" : "collapseGroup"](group); + } + }; + + // + // lazy init a group manager for the given jsplumb instance. + // + _jpi.prototype.getGroupManager = function() { + var mgr = this[GROUP_MANAGER]; + if (mgr == null) { + mgr = this[GROUP_MANAGER] = new GroupManager(this); + } + return mgr; + }; + + _jpi.prototype.removeGroupManager = function() { + delete this[GROUP_MANAGER]; + }; + + /** + * Gets the Group that the given element belongs to, null if none. + * @method getGroupFor + * @param {String|Element} el Element, or element ID. + * @returns {Group} A Group, if found, or null. + */ + _jpi.prototype.getGroupFor = function(el) { + el = this.getElement(el); + if (el) { + var c = this.getContainer(); + var abort = false, g = null, child = null; + while (!abort) { + if (el == null || el === c) { + abort = true; + } else { + if (el[GROUP]) { + g = el[GROUP]; + child = el; + abort = true; + } else { + el = el.parentNode; + } + } + } + return g; + } + }; + +}).call(typeof window !== 'undefined' ? window : this); + + +/* + * This file contains the 'flowchart' connectors, consisting of vertical and horizontal line segments. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + var STRAIGHT = "Straight"; + var ARC = "Arc"; + + var Flowchart = function (params) { + this.type = "Flowchart"; + params = params || {}; + params.stub = params.stub == null ? 30 : params.stub; + var segments, + _super = _jp.Connectors.AbstractConnector.apply(this, arguments), + midpoint = params.midpoint == null ? 0.5 : params.midpoint, + alwaysRespectStubs = params.alwaysRespectStubs === true, + lastx = null, lasty = null, lastOrientation, + cornerRadius = params.cornerRadius != null ? params.cornerRadius : 0, + + // TODO now common between this and AbstractBezierEditor; refactor into superclass? + loopbackRadius = params.loopbackRadius || 25, + isLoopbackCurrently = false, + + sgn = function (n) { + return n < 0 ? -1 : n === 0 ? 0 : 1; + }, + segmentDirections = function(segment) { + return [ + sgn( segment[2] - segment[0] ), + sgn( segment[3] - segment[1] ) + ]; + }, + /** + * helper method to add a segment. + */ + addSegment = function (segments, x, y, paintInfo) { + if (lastx === x && lasty === y) { + return; + } + var lx = lastx == null ? paintInfo.sx : lastx, + ly = lasty == null ? paintInfo.sy : lasty, + o = lx === x ? "v" : "h"; + + lastx = x; + lasty = y; + segments.push([ lx, ly, x, y, o ]); + }, + segLength = function (s) { + return Math.sqrt(Math.pow(s[0] - s[2], 2) + Math.pow(s[1] - s[3], 2)); + }, + _cloneArray = function (a) { + var _a = []; + _a.push.apply(_a, a); + return _a; + }, + writeSegments = function (conn, segments, paintInfo) { + var current = null, next, currentDirection, nextDirection; + for (var i = 0; i < segments.length - 1; i++) { + + current = current || _cloneArray(segments[i]); + next = _cloneArray(segments[i + 1]); + + currentDirection = segmentDirections(current); + nextDirection = segmentDirections(next); + + if (cornerRadius > 0 && current[4] !== next[4]) { + + var minSegLength = Math.min(segLength(current), segLength(next)); + var radiusToUse = Math.min(cornerRadius, minSegLength / 2); + + current[2] -= currentDirection[0] * radiusToUse; + current[3] -= currentDirection[1] * radiusToUse; + next[0] += nextDirection[0] * radiusToUse; + next[1] += nextDirection[1] * radiusToUse; + + var ac = (currentDirection[1] === nextDirection[0] && nextDirection[0] === 1) || + ((currentDirection[1] === nextDirection[0] && nextDirection[0] === 0) && currentDirection[0] !== nextDirection[1]) || + (currentDirection[1] === nextDirection[0] && nextDirection[0] === -1), + sgny = next[1] > current[3] ? 1 : -1, + sgnx = next[0] > current[2] ? 1 : -1, + sgnEqual = sgny === sgnx, + cx = (sgnEqual && ac || (!sgnEqual && !ac)) ? next[0] : current[2], + cy = (sgnEqual && ac || (!sgnEqual && !ac)) ? current[3] : next[1]; + + _super.addSegment(conn, STRAIGHT, { + x1: current[0], y1: current[1], x2: current[2], y2: current[3] + }); + + _super.addSegment(conn, ARC, { + r: radiusToUse, + x1: current[2], + y1: current[3], + x2: next[0], + y2: next[1], + cx: cx, + cy: cy, + ac: ac + }); + } + else { + // dx + dy are used to adjust for line width. + var dx = (current[2] === current[0]) ? 0 : (current[2] > current[0]) ? (paintInfo.lw / 2) : -(paintInfo.lw / 2), + dy = (current[3] === current[1]) ? 0 : (current[3] > current[1]) ? (paintInfo.lw / 2) : -(paintInfo.lw / 2); + + _super.addSegment(conn, STRAIGHT, { + x1: current[0] - dx, y1: current[1] - dy, x2: current[2] + dx, y2: current[3] + dy + }); + } + current = next; + } + if (next != null) { + // last segment + _super.addSegment(conn, STRAIGHT, { + x1: next[0], y1: next[1], x2: next[2], y2: next[3] + }); + } + }; + + this._compute = function (paintInfo, params) { + + segments = []; + lastx = null; + lasty = null; + lastOrientation = null; + + var commonStubCalculator = function () { + return [paintInfo.startStubX, paintInfo.startStubY, paintInfo.endStubX, paintInfo.endStubY]; + }, + stubCalculators = { + perpendicular: commonStubCalculator, + orthogonal: commonStubCalculator, + opposite: function (axis) { + var pi = paintInfo, + idx = axis === "x" ? 0 : 1, + areInProximity = { + "x": function () { + return ( (pi.so[idx] === 1 && ( + ( (pi.startStubX > pi.endStubX) && (pi.tx > pi.startStubX) ) || + ( (pi.sx > pi.endStubX) && (pi.tx > pi.sx))))) || + + ( (pi.so[idx] === -1 && ( + ( (pi.startStubX < pi.endStubX) && (pi.tx < pi.startStubX) ) || + ( (pi.sx < pi.endStubX) && (pi.tx < pi.sx))))); + }, + "y": function () { + return ( (pi.so[idx] === 1 && ( + ( (pi.startStubY > pi.endStubY) && (pi.ty > pi.startStubY) ) || + ( (pi.sy > pi.endStubY) && (pi.ty > pi.sy))))) || + + ( (pi.so[idx] === -1 && ( + ( (pi.startStubY < pi.endStubY) && (pi.ty < pi.startStubY) ) || + ( (pi.sy < pi.endStubY) && (pi.ty < pi.sy))))); + } + }; + + if (!alwaysRespectStubs && areInProximity[axis]()) { + return { + "x": [(paintInfo.sx + paintInfo.tx) / 2, paintInfo.startStubY, (paintInfo.sx + paintInfo.tx) / 2, paintInfo.endStubY], + "y": [paintInfo.startStubX, (paintInfo.sy + paintInfo.ty) / 2, paintInfo.endStubX, (paintInfo.sy + paintInfo.ty) / 2] + }[axis]; + } + else { + return [paintInfo.startStubX, paintInfo.startStubY, paintInfo.endStubX, paintInfo.endStubY]; + } + } + }; + + // calculate Stubs. + var stubs = stubCalculators[paintInfo.anchorOrientation](paintInfo.sourceAxis), + idx = paintInfo.sourceAxis === "x" ? 0 : 1, + oidx = paintInfo.sourceAxis === "x" ? 1 : 0, + ss = stubs[idx], + oss = stubs[oidx], + es = stubs[idx + 2], + oes = stubs[oidx + 2]; + + // add the start stub segment. use stubs for loopback as it will look better, with the loop spaced + // away from the element. + addSegment(segments, stubs[0], stubs[1], paintInfo); + + // if its a loopback and we should treat it differently. + // if (false && params.sourcePos[0] === params.targetPos[0] && params.sourcePos[1] === params.targetPos[1]) { + // + // // we use loopbackRadius here, as statemachine connectors do. + // // so we go radius to the left from stubs[0], then upwards by 2*radius, to the right by 2*radius, + // // down by 2*radius, left by radius. + // addSegment(segments, stubs[0] - loopbackRadius, stubs[1], paintInfo); + // addSegment(segments, stubs[0] - loopbackRadius, stubs[1] - (2 * loopbackRadius), paintInfo); + // addSegment(segments, stubs[0] + loopbackRadius, stubs[1] - (2 * loopbackRadius), paintInfo); + // addSegment(segments, stubs[0] + loopbackRadius, stubs[1], paintInfo); + // addSegment(segments, stubs[0], stubs[1], paintInfo); + // + // } + // else { + + + var midx = paintInfo.startStubX + ((paintInfo.endStubX - paintInfo.startStubX) * midpoint), + midy = paintInfo.startStubY + ((paintInfo.endStubY - paintInfo.startStubY) * midpoint); + + var orientations = {x: [0, 1], y: [1, 0]}, + lineCalculators = { + perpendicular: function (axis) { + var pi = paintInfo, + sis = { + x: [ + [[1, 2, 3, 4], null, [2, 1, 4, 3]], + null, + [[4, 3, 2, 1], null, [3, 4, 1, 2]] + ], + y: [ + [[3, 2, 1, 4], null, [2, 3, 4, 1]], + null, + [[4, 1, 2, 3], null, [1, 4, 3, 2]] + ] + }, + stubs = { + x: [[pi.startStubX, pi.endStubX], null, [pi.endStubX, pi.startStubX]], + y: [[pi.startStubY, pi.endStubY], null, [pi.endStubY, pi.startStubY]] + }, + midLines = { + x: [[midx, pi.startStubY], [midx, pi.endStubY]], + y: [[pi.startStubX, midy], [pi.endStubX, midy]] + }, + linesToEnd = { + x: [[pi.endStubX, pi.startStubY]], + y: [[pi.startStubX, pi.endStubY]] + }, + startToEnd = { + x: [[pi.startStubX, pi.endStubY], [pi.endStubX, pi.endStubY]], + y: [[pi.endStubX, pi.startStubY], [pi.endStubX, pi.endStubY]] + }, + startToMidToEnd = { + x: [[pi.startStubX, midy], [pi.endStubX, midy], [pi.endStubX, pi.endStubY]], + y: [[midx, pi.startStubY], [midx, pi.endStubY], [pi.endStubX, pi.endStubY]] + }, + otherStubs = { + x: [pi.startStubY, pi.endStubY], + y: [pi.startStubX, pi.endStubX] + }, + soIdx = orientations[axis][0], toIdx = orientations[axis][1], + _so = pi.so[soIdx] + 1, + _to = pi.to[toIdx] + 1, + otherFlipped = (pi.to[toIdx] === -1 && (otherStubs[axis][1] < otherStubs[axis][0])) || (pi.to[toIdx] === 1 && (otherStubs[axis][1] > otherStubs[axis][0])), + stub1 = stubs[axis][_so][0], + stub2 = stubs[axis][_so][1], + segmentIndexes = sis[axis][_so][_to]; + + if (pi.segment === segmentIndexes[3] || (pi.segment === segmentIndexes[2] && otherFlipped)) { + return midLines[axis]; + } + else if (pi.segment === segmentIndexes[2] && stub2 < stub1) { + return linesToEnd[axis]; + } + else if ((pi.segment === segmentIndexes[2] && stub2 >= stub1) || (pi.segment === segmentIndexes[1] && !otherFlipped)) { + return startToMidToEnd[axis]; + } + else if (pi.segment === segmentIndexes[0] || (pi.segment === segmentIndexes[1] && otherFlipped)) { + return startToEnd[axis]; + } + }, + orthogonal: function (axis, startStub, otherStartStub, endStub, otherEndStub) { + var pi = paintInfo, + extent = { + "x": pi.so[0] === -1 ? Math.min(startStub, endStub) : Math.max(startStub, endStub), + "y": pi.so[1] === -1 ? Math.min(startStub, endStub) : Math.max(startStub, endStub) + }[axis]; + + return { + "x": [ + [extent, otherStartStub], + [extent, otherEndStub], + [endStub, otherEndStub] + ], + "y": [ + [otherStartStub, extent], + [otherEndStub, extent], + [otherEndStub, endStub] + ] + }[axis]; + }, + opposite: function (axis, ss, oss, es) { + var pi = paintInfo, + otherAxis = {"x": "y", "y": "x"}[axis], + dim = {"x": "height", "y": "width"}[axis], + comparator = pi["is" + axis.toUpperCase() + "GreaterThanStubTimes2"]; + + if (params.sourceEndpoint.elementId === params.targetEndpoint.elementId) { + var _val = oss + ((1 - params.sourceEndpoint.anchor[otherAxis]) * params.sourceInfo[dim]) + _super.maxStub; + return { + "x": [ + [ss, _val], + [es, _val] + ], + "y": [ + [_val, ss], + [_val, es] + ] + }[axis]; + + } + else if (!comparator || (pi.so[idx] === 1 && ss > es) || (pi.so[idx] === -1 && ss < es)) { + return { + "x": [ + [ss, midy], + [es, midy] + ], + "y": [ + [midx, ss], + [midx, es] + ] + }[axis]; + } + else if ((pi.so[idx] === 1 && ss < es) || (pi.so[idx] === -1 && ss > es)) { + return { + "x": [ + [midx, pi.sy], + [midx, pi.ty] + ], + "y": [ + [pi.sx, midy], + [pi.tx, midy] + ] + }[axis]; + } + } + }; + + // compute the rest of the line + var p = lineCalculators[paintInfo.anchorOrientation](paintInfo.sourceAxis, ss, oss, es, oes); + if (p) { + for (var i = 0; i < p.length; i++) { + addSegment(segments, p[i][0], p[i][1], paintInfo); + } + } + + // line to end stub + addSegment(segments, stubs[2], stubs[3], paintInfo); + + //} + + // end stub to end (common) + addSegment(segments, paintInfo.tx, paintInfo.ty, paintInfo); + + + + // write out the segments. + writeSegments(this, segments, paintInfo); + + }; + }; + + _jp.Connectors.Flowchart = Flowchart; + _ju.extend(_jp.Connectors.Flowchart, _jp.Connectors.AbstractConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the code for the Bezier connector type. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + _jp.Connectors.AbstractBezierConnector = function(params) { + params = params || {}; + var showLoopback = params.showLoopback !== false, + curviness = params.curviness || 10, + margin = params.margin || 5, + proximityLimit = params.proximityLimit || 80, + clockwise = params.orientation && params.orientation === "clockwise", + loopbackRadius = params.loopbackRadius || 25, + isLoopbackCurrently = false, + _super; + + this._compute = function (paintInfo, p) { + + var sp = p.sourcePos, + tp = p.targetPos, + _w = Math.abs(sp[0] - tp[0]), + _h = Math.abs(sp[1] - tp[1]); + + if (!showLoopback || (p.sourceEndpoint.elementId !== p.targetEndpoint.elementId)) { + isLoopbackCurrently = false; + this._computeBezier(paintInfo, p, sp, tp, _w, _h); + } else { + isLoopbackCurrently = true; + // a loopback connector. draw an arc from one anchor to the other. + var x1 = p.sourcePos[0], y1 = p.sourcePos[1] - margin, + cx = x1, cy = y1 - loopbackRadius, + // canvas sizing stuff, to ensure the whole painted area is visible. + _x = cx - loopbackRadius, + _y = cy - loopbackRadius; + + _w = 2 * loopbackRadius; + _h = 2 * loopbackRadius; + + paintInfo.points[0] = _x; + paintInfo.points[1] = _y; + paintInfo.points[2] = _w; + paintInfo.points[3] = _h; + + // ADD AN ARC SEGMENT. + _super.addSegment(this, "Arc", { + loopback: true, + x1: (x1 - _x) + 4, + y1: y1 - _y, + startAngle: 0, + endAngle: 2 * Math.PI, + r: loopbackRadius, + ac: !clockwise, + x2: (x1 - _x) - 4, + y2: y1 - _y, + cx: cx - _x, + cy: cy - _y + }); + } + }; + + _super = _jp.Connectors.AbstractConnector.apply(this, arguments); + return _super; + }; + _ju.extend(_jp.Connectors.AbstractBezierConnector, _jp.Connectors.AbstractConnector); + + var Bezier = function (params) { + params = params || {}; + this.type = "Bezier"; + + var _super = _jp.Connectors.AbstractBezierConnector.apply(this, arguments), + majorAnchor = params.curviness || 150, + minorAnchor = 10; + + this.getCurviness = function () { + return majorAnchor; + }; + + this._findControlPoint = function (point, sourceAnchorPosition, targetAnchorPosition, sourceEndpoint, targetEndpoint, soo, too) { + // determine if the two anchors are perpendicular to each other in their orientation. we swap the control + // points around if so (code could be tightened up) + var perpendicular = soo[0] !== too[0] || soo[1] === too[1], + p = []; + + if (!perpendicular) { + if (soo[0] === 0) { + p.push(sourceAnchorPosition[0] < targetAnchorPosition[0] ? point[0] + minorAnchor : point[0] - minorAnchor); + } + else { + p.push(point[0] - (majorAnchor * soo[0])); + } + + if (soo[1] === 0) { + p.push(sourceAnchorPosition[1] < targetAnchorPosition[1] ? point[1] + minorAnchor : point[1] - minorAnchor); + } + else { + p.push(point[1] + (majorAnchor * too[1])); + } + } + else { + if (too[0] === 0) { + p.push(targetAnchorPosition[0] < sourceAnchorPosition[0] ? point[0] + minorAnchor : point[0] - minorAnchor); + } + else { + p.push(point[0] + (majorAnchor * too[0])); + } + + if (too[1] === 0) { + p.push(targetAnchorPosition[1] < sourceAnchorPosition[1] ? point[1] + minorAnchor : point[1] - minorAnchor); + } + else { + p.push(point[1] + (majorAnchor * soo[1])); + } + } + + return p; + }; + + this._computeBezier = function (paintInfo, p, sp, tp, _w, _h) { + + var _CP, _CP2, + _sx = sp[0] < tp[0] ? _w : 0, + _sy = sp[1] < tp[1] ? _h : 0, + _tx = sp[0] < tp[0] ? 0 : _w, + _ty = sp[1] < tp[1] ? 0 : _h; + + _CP = this._findControlPoint([_sx, _sy], sp, tp, p.sourceEndpoint, p.targetEndpoint, paintInfo.so, paintInfo.to); + _CP2 = this._findControlPoint([_tx, _ty], tp, sp, p.targetEndpoint, p.sourceEndpoint, paintInfo.to, paintInfo.so); + + + _super.addSegment(this, "Bezier", { + x1: _sx, y1: _sy, x2: _tx, y2: _ty, + cp1x: _CP[0], cp1y: _CP[1], cp2x: _CP2[0], cp2y: _CP2[1] + }); + }; + + + }; + + _jp.Connectors.Bezier = Bezier; + _ju.extend(Bezier, _jp.Connectors.AbstractBezierConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the state machine connectors, which extend AbstractBezierConnector. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + var _segment = function (x1, y1, x2, y2) { + if (x1 <= x2 && y2 <= y1) { + return 1; + } + else if (x1 <= x2 && y1 <= y2) { + return 2; + } + else if (x2 <= x1 && y2 >= y1) { + return 3; + } + return 4; + }, + + // the control point we will use depends on the faces to which each end of the connection is assigned, specifically whether or not the + // two faces are parallel or perpendicular. if they are parallel then the control point lies on the midpoint of the axis in which they + // are parellel and varies only in the other axis; this variation is proportional to the distance that the anchor points lie from the + // center of that face. if the two faces are perpendicular then the control point is at some distance from both the midpoints; the amount and + // direction are dependent on the orientation of the two elements. 'seg', passed in to this method, tells you which segment the target element + // lies in with respect to the source: 1 is top right, 2 is bottom right, 3 is bottom left, 4 is top left. + // + // sourcePos and targetPos are arrays of info about where on the source and target each anchor is located. their contents are: + // + // 0 - absolute x + // 1 - absolute y + // 2 - proportional x in element (0 is left edge, 1 is right edge) + // 3 - proportional y in element (0 is top edge, 1 is bottom edge) + // + _findControlPoint = function (midx, midy, segment, sourceEdge, targetEdge, dx, dy, distance, proximityLimit) { + // TODO (maybe) + // - if anchor pos is 0.5, make the control point take into account the relative position of the elements. + if (distance <= proximityLimit) { + return [midx, midy]; + } + + if (segment === 1) { + if (sourceEdge[3] <= 0 && targetEdge[3] >= 1) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] >= 1 && targetEdge[2] <= 0) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + (-1 * dx) , midy + (-1 * dy) ]; + } + } + else if (segment === 2) { + if (sourceEdge[3] >= 1 && targetEdge[3] <= 0) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] >= 1 && targetEdge[2] <= 0) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + dx, midy + (-1 * dy) ]; + } + } + else if (segment === 3) { + if (sourceEdge[3] >= 1 && targetEdge[3] <= 0) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] <= 0 && targetEdge[2] >= 1) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + (-1 * dx) , midy + (-1 * dy) ]; + } + } + else if (segment === 4) { + if (sourceEdge[3] <= 0 && targetEdge[3] >= 1) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] <= 0 && targetEdge[2] >= 1) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + dx , midy + (-1 * dy) ]; + } + } + + }; + + var StateMachine = function (params) { + params = params || {}; + this.type = "StateMachine"; + + var _super = _jp.Connectors.AbstractBezierConnector.apply(this, arguments), + curviness = params.curviness || 10, + margin = params.margin || 5, + proximityLimit = params.proximityLimit || 80, + clockwise = params.orientation && params.orientation === "clockwise", + _controlPoint; + + this._computeBezier = function(paintInfo, params, sp, tp, w, h) { + var _sx = params.sourcePos[0] < params.targetPos[0] ? 0 : w, + _sy = params.sourcePos[1] < params.targetPos[1] ? 0 : h, + _tx = params.sourcePos[0] < params.targetPos[0] ? w : 0, + _ty = params.sourcePos[1] < params.targetPos[1] ? h : 0; + + // now adjust for the margin + if (params.sourcePos[2] === 0) { + _sx -= margin; + } + if (params.sourcePos[2] === 1) { + _sx += margin; + } + if (params.sourcePos[3] === 0) { + _sy -= margin; + } + if (params.sourcePos[3] === 1) { + _sy += margin; + } + if (params.targetPos[2] === 0) { + _tx -= margin; + } + if (params.targetPos[2] === 1) { + _tx += margin; + } + if (params.targetPos[3] === 0) { + _ty -= margin; + } + if (params.targetPos[3] === 1) { + _ty += margin; + } + + // + // these connectors are quadratic bezier curves, having a single control point. if both anchors + // are located at 0.5 on their respective faces, the control point is set to the midpoint and you + // get a straight line. this is also the case if the two anchors are within 'proximityLimit', since + // it seems to make good aesthetic sense to do that. outside of that, the control point is positioned + // at 'curviness' pixels away along the normal to the straight line connecting the two anchors. + // + // there may be two improvements to this. firstly, we might actually support the notion of avoiding nodes + // in the UI, or at least making a good effort at doing so. if a connection would pass underneath some node, + // for example, we might increase the distance the control point is away from the midpoint in a bid to + // steer it around that node. this will work within limits, but i think those limits would also be the likely + // limits for, once again, aesthetic good sense in the layout of a chart using these connectors. + // + // the second possible change is actually two possible changes: firstly, it is possible we should gradually + // decrease the 'curviness' as the distance between the anchors decreases; start tailing it off to 0 at some + // point (which should be configurable). secondly, we might slightly increase the 'curviness' for connectors + // with respect to how far their anchor is from the center of its respective face. this could either look cool, + // or stupid, and may indeed work only in a way that is so subtle as to have been a waste of time. + // + + var _midx = (_sx + _tx) / 2, + _midy = (_sy + _ty) / 2, + segment = _segment(_sx, _sy, _tx, _ty), + distance = Math.sqrt(Math.pow(_tx - _sx, 2) + Math.pow(_ty - _sy, 2)), + cp1x, cp2x, cp1y, cp2y; + + + // calculate the control point. this code will be where we'll put in a rudimentary element avoidance scheme; it + // will work by extending the control point to force the curve to be, um, curvier. + _controlPoint = _findControlPoint(_midx, + _midy, + segment, + params.sourcePos, + params.targetPos, + curviness, curviness, + distance, + proximityLimit); + + cp1x = _controlPoint[0]; + cp2x = _controlPoint[0]; + cp1y = _controlPoint[1]; + cp2y = _controlPoint[1]; + + _super.addSegment(this, "Bezier", { + x1: _tx, y1: _ty, x2: _sx, y2: _sy, + cp1x: cp1x, cp1y: cp1y, + cp2x: cp2x, cp2y: cp2y + }); + }; + }; + + _jp.Connectors.StateMachine = StateMachine; + _ju.extend(StateMachine, _jp.Connectors.AbstractBezierConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the 'flowchart' connectors, consisting of vertical and horizontal line segments. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + var STRAIGHT = "Straight"; + + var Straight = function (params) { + this.type = STRAIGHT; + var _super = _jp.Connectors.AbstractConnector.apply(this, arguments); + + this._compute = function (paintInfo, _) { + _super.addSegment(this, STRAIGHT, {x1: paintInfo.sx, y1: paintInfo.sy, x2: paintInfo.startStubX, y2: paintInfo.startStubY}); + _super.addSegment(this, STRAIGHT, {x1: paintInfo.startStubX, y1: paintInfo.startStubY, x2: paintInfo.endStubX, y2: paintInfo.endStubY}); + _super.addSegment(this, STRAIGHT, {x1: paintInfo.endStubX, y1: paintInfo.endStubY, x2: paintInfo.tx, y2: paintInfo.ty}); + }; + }; + + _jp.Connectors.Straight = Straight; + _ju.extend(Straight, _jp.Connectors.AbstractConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the SVG renderers. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + +// ************************** SVG utility methods ******************************************** + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + var svgAttributeMap = { + "stroke-linejoin": "stroke-linejoin", + "stroke-dashoffset": "stroke-dashoffset", + "stroke-linecap": "stroke-linecap" + }, + STROKE_DASHARRAY = "stroke-dasharray", + DASHSTYLE = "dashstyle", + LINEAR_GRADIENT = "linearGradient", + RADIAL_GRADIENT = "radialGradient", + DEFS = "defs", + FILL = "fill", + STOP = "stop", + STROKE = "stroke", + STROKE_WIDTH = "stroke-width", + STYLE = "style", + NONE = "none", + JSPLUMB_GRADIENT = "jsplumb_gradient_", + LINE_WIDTH = "strokeWidth", + ns = { + svg: "http://www.w3.org/2000/svg" + }, + _attr = function (node, attributes) { + for (var i in attributes) { + node.setAttribute(i, "" + attributes[i]); + } + }, + _node = function (name, attributes) { + attributes = attributes || {}; + attributes.version = "1.1"; + attributes.xmlns = ns.svg; + return _jp.createElementNS(ns.svg, name, null, null, attributes); + }, + _pos = function (d) { + return "position:absolute;left:" + d[0] + "px;top:" + d[1] + "px"; + }, + _clearGradient = function (parent) { + var els = parent.querySelectorAll(" defs,linearGradient,radialGradient"); + for (var i = 0; i < els.length; i++) { + els[i].parentNode.removeChild(els[i]); + } + }, + _updateGradient = function (parent, node, style, dimensions, uiComponent) { + var id = JSPLUMB_GRADIENT + uiComponent._jsPlumb.instance.idstamp(); + // first clear out any existing gradient + _clearGradient(parent); + // this checks for an 'offset' property in the gradient, and in the absence of it, assumes + // we want a linear gradient. if it's there, we create a radial gradient. + // it is possible that a more explicit means of defining the gradient type would be + // better. relying on 'offset' means that we can never have a radial gradient that uses + // some default offset, for instance. + // issue 244 suggested the 'gradientUnits' attribute; without this, straight/flowchart connectors with gradients would + // not show gradients when the line was perfectly horizontal or vertical. + var g; + if (!style.gradient.offset) { + g = _node(LINEAR_GRADIENT, {id: id, gradientUnits: "userSpaceOnUse"}); + } + else { + g = _node(RADIAL_GRADIENT, { id: id }); + } + + var defs = _node(DEFS); + parent.appendChild(defs); + defs.appendChild(g); + + // the svg radial gradient seems to treat stops in the reverse + // order to how canvas does it. so we want to keep all the maths the same, but + // iterate the actual style declarations in reverse order, if the x indexes are not in order. + for (var i = 0; i < style.gradient.stops.length; i++) { + var styleToUse = uiComponent.segment === 1 || uiComponent.segment === 2 ? i : style.gradient.stops.length - 1 - i, + stopColor = style.gradient.stops[styleToUse][1], + s = _node(STOP, {"offset": Math.floor(style.gradient.stops[i][0] * 100) + "%", "stop-color": stopColor}); + + g.appendChild(s); + } + var applyGradientTo = style.stroke ? STROKE : FILL; + node.setAttribute(applyGradientTo, "url(#" + id + ")"); + }, + _applyStyles = function (parent, node, style, dimensions, uiComponent) { + + node.setAttribute(FILL, style.fill ? style.fill : NONE); + node.setAttribute(STROKE, style.stroke ? style.stroke : NONE); + + if (style.gradient) { + _updateGradient(parent, node, style, dimensions, uiComponent); + } + else { + // make sure we clear any existing gradient + _clearGradient(parent); + node.setAttribute(STYLE, ""); + } + + if (style.strokeWidth) { + node.setAttribute(STROKE_WIDTH, style.strokeWidth); + } + + // in SVG there is a stroke-dasharray attribute we can set, and its syntax looks like + // the syntax in VML but is actually kind of nasty: values are given in the pixel + // coordinate space, whereas in VML they are multiples of the width of the stroked + // line, which makes a lot more sense. for that reason, jsPlumb is supporting both + // the native svg 'stroke-dasharray' attribute, and also the 'dashstyle' concept from + // VML, which will be the preferred method. the code below this converts a dashstyle + // attribute given in terms of stroke width into a pixel representation, by using the + // stroke's lineWidth. + if (style[DASHSTYLE] && style[LINE_WIDTH] && !style[STROKE_DASHARRAY]) { + var sep = style[DASHSTYLE].indexOf(",") === -1 ? " " : ",", + parts = style[DASHSTYLE].split(sep), + styleToUse = ""; + parts.forEach(function (p) { + styleToUse += (Math.floor(p * style.strokeWidth) + sep); + }); + node.setAttribute(STROKE_DASHARRAY, styleToUse); + } + else if (style[STROKE_DASHARRAY]) { + node.setAttribute(STROKE_DASHARRAY, style[STROKE_DASHARRAY]); + } + + // extra attributes such as join type, dash offset. + for (var i in svgAttributeMap) { + if (style[i]) { + node.setAttribute(svgAttributeMap[i], style[i]); + } + } + }, + _appendAtIndex = function (svg, path, idx) { + if (svg.childNodes.length > idx) { + svg.insertBefore(path, svg.childNodes[idx]); + } + else { + svg.appendChild(path); + } + }; + + /** + utility methods for other objects to use. + */ + _ju.svg = { + node: _node, + attr: _attr, + pos: _pos + }; + + // ************************** / SVG utility methods ******************************************** + + /* + * Base class for SVG components. + */ + var SvgComponent = function (params) { + var pointerEventsSpec = params.pointerEventsSpec || "all", renderer = {}; + + _jp.jsPlumbUIComponent.apply(this, params.originalArgs); + this.canvas = null; + this.path = null; + this.svg = null; + this.bgCanvas = null; + + var clazz = params.cssClass + " " + (params.originalArgs[0].cssClass || ""), + svgParams = { + "style": "", + "width": 0, + "height": 0, + "pointer-events": pointerEventsSpec, + "position": "absolute" + }; + + this.svg = _node("svg", svgParams); + + if (params.useDivWrapper) { + this.canvas = _jp.createElement("div", { position : "absolute" }); + _ju.sizeElement(this.canvas, 0, 0, 1, 1); + this.canvas.className = clazz; + } + else { + _attr(this.svg, { "class": clazz }); + this.canvas = this.svg; + } + + params._jsPlumb.appendElement(this.canvas, params.originalArgs[0].parent); + if (params.useDivWrapper) { + this.canvas.appendChild(this.svg); + } + + var displayElements = [ this.canvas ]; + this.getDisplayElements = function () { + return displayElements; + }; + + this.appendDisplayElement = function (el) { + displayElements.push(el); + }; + + this.paint = function (style, anchor, extents) { + if (style != null) { + + var xy = [ this.x, this.y ], wh = [ this.w, this.h ], p; + if (extents != null) { + if (extents.xmin < 0) { + xy[0] += extents.xmin; + } + if (extents.ymin < 0) { + xy[1] += extents.ymin; + } + wh[0] = extents.xmax + ((extents.xmin < 0) ? -extents.xmin : 0); + wh[1] = extents.ymax + ((extents.ymin < 0) ? -extents.ymin : 0); + } + + if (params.useDivWrapper) { + _ju.sizeElement(this.canvas, xy[0], xy[1], wh[0], wh[1]); + xy[0] = 0; + xy[1] = 0; + p = _pos([ 0, 0 ]); + } + else { + p = _pos([ xy[0], xy[1] ]); + } + + renderer.paint.apply(this, arguments); + + _attr(this.svg, { + "style": p, + "width": wh[0] || 0, + "height": wh[1] || 0 + }); + } + }; + + return { + renderer: renderer + }; + }; + + _ju.extend(SvgComponent, _jp.jsPlumbUIComponent, { + cleanup: function (force) { + if (force || this.typeId == null) { + if (this.canvas) { + this.canvas._jsPlumb = null; + } + if (this.svg) { + this.svg._jsPlumb = null; + } + if (this.bgCanvas) { + this.bgCanvas._jsPlumb = null; + } + + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + if (this.bgCanvas && this.bgCanvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + + this.svg = null; + this.canvas = null; + this.path = null; + this.group = null; + } + else { + // if not a forced cleanup, just detach from DOM for now. + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + if (this.bgCanvas && this.bgCanvas.parentNode) { + this.bgCanvas.parentNode.removeChild(this.bgCanvas); + } + } + }, + reattach:function(instance) { + var c = instance.getContainer(); + if (this.canvas && this.canvas.parentNode == null) { + c.appendChild(this.canvas); + } + if (this.bgCanvas && this.bgCanvas.parentNode == null) { + c.appendChild(this.bgCanvas); + } + }, + setVisible: function (v) { + if (this.canvas) { + this.canvas.style.display = v ? "block" : "none"; + } + } + }); + + /* + * Base class for SVG connectors. + */ + _jp.ConnectorRenderers.svg = function (params) { + var self = this, + _super = SvgComponent.apply(this, [ + { + cssClass: params._jsPlumb.connectorClass, + originalArgs: arguments, + pointerEventsSpec: "none", + _jsPlumb: params._jsPlumb + } + ]); + + _super.renderer.paint = function (style, anchor, extents) { + + var segments = self.getSegments(), p = "", offset = [0, 0]; + if (extents.xmin < 0) { + offset[0] = -extents.xmin; + } + if (extents.ymin < 0) { + offset[1] = -extents.ymin; + } + + if (segments.length > 0) { + + p = self.getPathData(); + + var a = { + d: p, + transform: "translate(" + offset[0] + "," + offset[1] + ")", + "pointer-events": params["pointer-events"] || "visibleStroke" + }, + outlineStyle = null, + d = [self.x, self.y, self.w, self.h]; + + // outline style. actually means drawing an svg object underneath the main one. + if (style.outlineStroke) { + var outlineWidth = style.outlineWidth || 1, + outlineStrokeWidth = style.strokeWidth + (2 * outlineWidth); + outlineStyle = _jp.extend({}, style); + delete outlineStyle.gradient; + outlineStyle.stroke = style.outlineStroke; + outlineStyle.strokeWidth = outlineStrokeWidth; + + if (self.bgPath == null) { + self.bgPath = _node("path", a); + _jp.addClass(self.bgPath, _jp.connectorOutlineClass); + _appendAtIndex(self.svg, self.bgPath, 0); + } + else { + _attr(self.bgPath, a); + } + + _applyStyles(self.svg, self.bgPath, outlineStyle, d, self); + } + + if (self.path == null) { + self.path = _node("path", a); + _appendAtIndex(self.svg, self.path, style.outlineStroke ? 1 : 0); + } + else { + _attr(self.path, a); + } + + _applyStyles(self.svg, self.path, style, d, self); + } + }; + }; + _ju.extend(_jp.ConnectorRenderers.svg, SvgComponent); + +// ******************************* svg segment renderer ***************************************************** + + +// ******************************* /svg segments ***************************************************** + + /* + * Base class for SVG endpoints. + */ + var SvgEndpoint = _jp.SvgEndpoint = function (params) { + var _super = SvgComponent.apply(this, [ + { + cssClass: params._jsPlumb.endpointClass, + originalArgs: arguments, + pointerEventsSpec: "all", + useDivWrapper: true, + _jsPlumb: params._jsPlumb + } + ]); + + _super.renderer.paint = function (style) { + var s = _jp.extend({}, style); + if (s.outlineStroke) { + s.stroke = s.outlineStroke; + } + + if (this.node == null) { + this.node = this.makeNode(s); + this.svg.appendChild(this.node); + } + else if (this.updateNode != null) { + this.updateNode(this.node); + } + _applyStyles(this.svg, this.node, s, [ this.x, this.y, this.w, this.h ], this); + _pos(this.node, [ this.x, this.y ]); + }.bind(this); + + }; + _ju.extend(SvgEndpoint, SvgComponent); + + /* + * SVG Dot Endpoint + */ + _jp.Endpoints.svg.Dot = function () { + _jp.Endpoints.Dot.apply(this, arguments); + SvgEndpoint.apply(this, arguments); + this.makeNode = function (style) { + return _node("circle", { + "cx": this.w / 2, + "cy": this.h / 2, + "r": this.radius + }); + }; + this.updateNode = function (node) { + _attr(node, { + "cx": this.w / 2, + "cy": this.h / 2, + "r": this.radius + }); + }; + }; + _ju.extend(_jp.Endpoints.svg.Dot, [_jp.Endpoints.Dot, SvgEndpoint]); + + /* + * SVG Rectangle Endpoint + */ + _jp.Endpoints.svg.Rectangle = function () { + _jp.Endpoints.Rectangle.apply(this, arguments); + SvgEndpoint.apply(this, arguments); + this.makeNode = function (style) { + return _node("rect", { + "width": this.w, + "height": this.h + }); + }; + this.updateNode = function (node) { + _attr(node, { + "width": this.w, + "height": this.h + }); + }; + }; + _ju.extend(_jp.Endpoints.svg.Rectangle, [_jp.Endpoints.Rectangle, SvgEndpoint]); + + /* + * SVG Image Endpoint is the default image endpoint. + */ + _jp.Endpoints.svg.Image = _jp.Endpoints.Image; + /* + * Blank endpoint in svg renderer is the default Blank endpoint. + */ + _jp.Endpoints.svg.Blank = _jp.Endpoints.Blank; + /* + * Label overlay in svg renderer is the default Label overlay. + */ + _jp.Overlays.svg.Label = _jp.Overlays.Label; + /* + * Custom overlay in svg renderer is the default Custom overlay. + */ + _jp.Overlays.svg.Custom = _jp.Overlays.Custom; + + var AbstractSvgArrowOverlay = function (superclass, originalArgs) { + superclass.apply(this, originalArgs); + _jp.jsPlumbUIComponent.apply(this, originalArgs); + this.isAppendedAtTopLevel = false; + var self = this; + this.path = null; + this.paint = function (params, containerExtents) { + // only draws on connections, not endpoints. + if (params.component.svg && containerExtents) { + if (this.path == null) { + this.path = _node("path", { + "pointer-events": "all" + }); + params.component.svg.appendChild(this.path); + if (this.elementCreated) { + this.elementCreated(this.path, params.component); + } + + this.canvas = params.component.svg; // for the sake of completeness; this behaves the same as other overlays + } + var clazz = originalArgs && (originalArgs.length === 1) ? (originalArgs[0].cssClass || "") : "", + offset = [0, 0]; + + if (containerExtents.xmin < 0) { + offset[0] = -containerExtents.xmin; + } + if (containerExtents.ymin < 0) { + offset[1] = -containerExtents.ymin; + } + + _attr(this.path, { + "d": makePath(params.d), + "class": clazz, + stroke: params.stroke ? params.stroke : null, + fill: params.fill ? params.fill : null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + } + }; + var makePath = function (d) { + return (isNaN(d.cxy.x) || isNaN(d.cxy.y)) ? "" : "M" + d.hxy.x + "," + d.hxy.y + + " L" + d.tail[0].x + "," + d.tail[0].y + + " L" + d.cxy.x + "," + d.cxy.y + + " L" + d.tail[1].x + "," + d.tail[1].y + + " L" + d.hxy.x + "," + d.hxy.y; + }; + this.transfer = function(target) { + if (target.canvas && this.path && this.path.parentNode) { + this.path.parentNode.removeChild(this.path); + target.canvas.appendChild(this.path); + } + }; + }; + + var svgProtoFunctions = { + cleanup : function (force) { + if (this.path != null) { + if (force) { + this._jsPlumb.instance.removeElement(this.path); + } + else { + if (this.path.parentNode) { + this.path.parentNode.removeChild(this.path); + } + } + } + }, reattach :function(instance, component) { + if (this.path && component.canvas) { + component.canvas.appendChild(this.path); + } + }, + setVisible : function (v) { + if (this.path != null) { + (this.path.style.display = (v ? "block" : "none")); + } + } + }; + + _ju.extend(AbstractSvgArrowOverlay, [_jp.jsPlumbUIComponent, _jp.Overlays.AbstractOverlay]); + + _jp.Overlays.svg.Arrow = function () { + AbstractSvgArrowOverlay.apply(this, [_jp.Overlays.Arrow, arguments]); + }; + _ju.extend(_jp.Overlays.svg.Arrow, [ _jp.Overlays.Arrow, AbstractSvgArrowOverlay ], svgProtoFunctions); + + _jp.Overlays.svg.PlainArrow = function () { + AbstractSvgArrowOverlay.apply(this, [_jp.Overlays.PlainArrow, arguments]); + }; + _ju.extend(_jp.Overlays.svg.PlainArrow, [ _jp.Overlays.PlainArrow, AbstractSvgArrowOverlay ], svgProtoFunctions); + + _jp.Overlays.svg.Diamond = function () { + AbstractSvgArrowOverlay.apply(this, [_jp.Overlays.Diamond, arguments]); + }; + _ju.extend(_jp.Overlays.svg.Diamond, [ _jp.Overlays.Diamond, AbstractSvgArrowOverlay ], svgProtoFunctions); + + // a test + _jp.Overlays.svg.GuideLines = function () { + var path = null, self = this, p1_1, p1_2; + _jp.Overlays.GuideLines.apply(this, arguments); + this.paint = function (params, containerExtents) { + if (path == null) { + path = _node("path"); + params.connector.svg.appendChild(path); + self.attachListeners(path, params.connector); + self.attachListeners(path, self); + + p1_1 = _node("path"); + params.connector.svg.appendChild(p1_1); + self.attachListeners(p1_1, params.connector); + self.attachListeners(p1_1, self); + + p1_2 = _node("path"); + params.connector.svg.appendChild(p1_2); + self.attachListeners(p1_2, params.connector); + self.attachListeners(p1_2, self); + } + + var offset = [0, 0]; + if (containerExtents.xmin < 0) { + offset[0] = -containerExtents.xmin; + } + if (containerExtents.ymin < 0) { + offset[1] = -containerExtents.ymin; + } + + _attr(path, { + "d": makePath(params.head, params.tail), + stroke: "red", + fill: null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + + _attr(p1_1, { + "d": makePath(params.tailLine[0], params.tailLine[1]), + stroke: "blue", + fill: null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + + _attr(p1_2, { + "d": makePath(params.headLine[0], params.headLine[1]), + stroke: "green", + fill: null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + }; + + var makePath = function (d1, d2) { + return "M " + d1.x + "," + d1.y + + " L" + d2.x + "," + d2.y; + }; + }; + _ju.extend(_jp.Overlays.svg.GuideLines, _jp.Overlays.GuideLines); +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains code used when jsPlumb is being rendered in a DOM. + * + * Copyright (c) 2010 - 2019 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil, + _jk = root.Katavorio, _jg = root.Biltong; + + var _getEventManager = function(instance) { + var e = instance._mottle; + if (!e) { + e = instance._mottle = new root.Mottle(); + } + return e; + }; + + var _getDragManager = function (instance, category) { + + category = category || "main"; + var key = "_katavorio_" + category; + var k = instance[key], + e = instance.getEventManager(); + + if (!k) { + k = new _jk({ + bind: e.on, + unbind: e.off, + getSize: _jp.getSize, + getConstrainingRectangle:function(el) { + return [ el.parentNode.scrollWidth, el.parentNode.scrollHeight ]; + }, + getPosition: function (el, relativeToRoot) { + // if this is a nested draggable then compute the offset against its own offsetParent, otherwise + // compute against the Container's origin. see also the getUIPosition method below. + var o = instance.getOffset(el, relativeToRoot, el._katavorioDrag ? el.offsetParent : null); + return [o.left, o.top]; + }, + setPosition: function (el, xy) { + el.style.left = xy[0] + "px"; + el.style.top = xy[1] + "px"; + }, + addClass: _jp.addClass, + removeClass: _jp.removeClass, + intersects: _jg.intersects, + indexOf: function(l, i) { return l.indexOf(i); }, + scope:instance.getDefaultScope(), + css: { + noSelect: instance.dragSelectClass, + droppable: "jtk-droppable", + draggable: "jtk-draggable", + drag: "jtk-drag", + selected: "jtk-drag-selected", + active: "jtk-drag-active", + hover: "jtk-drag-hover", + ghostProxy:"jtk-ghost-proxy" + } + }); + k.setZoom(instance.getZoom()); + instance[key] = k; + instance.bind("zoom", k.setZoom); + } + return k; + }; + + var _dragStart=function(params) { + var options = params.el._jsPlumbDragOptions; + var cont = true; + if (options.canDrag) { + cont = options.canDrag(); + } + if (cont) { + this.setHoverSuspended(true); + this.select({source: params.el}).addClass(this.elementDraggingClass + " " + this.sourceElementDraggingClass, true); + this.select({target: params.el}).addClass(this.elementDraggingClass + " " + this.targetElementDraggingClass, true); + this.setConnectionBeingDragged(true); + } + return cont; + }; + var _dragMove=function(params) { + var ui = this.getUIPosition(arguments, this.getZoom()); + if (ui != null) { + var o = params.el._jsPlumbDragOptions; + this.draw(params.el, ui, null, true); + if (o._dragging) { + this.addClass(params.el, "jtk-dragged"); + } + o._dragging = true; + } + }; + var _dragStop=function(params) { + var elements = params.selection, uip; + + var _one = function (_e) { + if (_e[1] != null) { + // run the reported offset through the code that takes parent containers + // into account, to adjust if necessary (issue 554) + uip = this.getUIPosition([{ + el:_e[2].el, + pos:[_e[1].left, _e[1].top] + }]); + this.draw(_e[2].el, uip); + } + + if (_e[0]._jsPlumbDragOptions != null) { + delete _e[0]._jsPlumbDragOptions._dragging; + } + + this.removeClass(_e[0], "jtk-dragged"); + this.select({source: _e[2].el}).removeClass(this.elementDraggingClass + " " + this.sourceElementDraggingClass, true); + this.select({target: _e[2].el}).removeClass(this.elementDraggingClass + " " + this.targetElementDraggingClass, true); + this.getDragManager().dragEnded(_e[2].el); + }.bind(this); + + for (var i = 0; i < elements.length; i++) { + _one(elements[i]); + } + + this.setHoverSuspended(false); + this.setConnectionBeingDragged(false); + }; + + var _animProps = function (o, p) { + var _one = function (pName) { + if (p[pName] != null) { + if (_ju.isString(p[pName])) { + var m = p[pName].match(/-=/) ? -1 : 1, + v = p[pName].substring(2); + return o[pName] + (m * v); + } + else { + return p[pName]; + } + } + else { + return o[pName]; + } + }; + return [ _one("left"), _one("top") ]; + }; + + var _genLoc = function (prefix, e) { + if (e == null) { + return [ 0, 0 ]; + } + var ts = _touches(e), t = _getTouch(ts, 0); + return [t[prefix + "X"], t[prefix + "Y"]]; + }, + _pageLocation = _genLoc.bind(this, "page"), + _screenLocation = _genLoc.bind(this, "screen"), + _clientLocation = _genLoc.bind(this, "client"), + _getTouch = function (touches, idx) { + return touches.item ? touches.item(idx) : touches[idx]; + }, + _touches = function (e) { + return e.touches && e.touches.length > 0 ? e.touches : + e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches : + e.targetTouches && e.targetTouches.length > 0 ? e.targetTouches : + [ e ]; + }; + + /** + Manages dragging for some instance of jsPlumb. + + TODO instead of this being accessed directly, it should subscribe to events on the jsPlumb instance: every method + in here is called directly by jsPlumb. But what should happen is that we have unpublished events that this listens + to. The only trick is getting one of these instantiated with every jsPlumb instance: it needs to have a hook somehow. + Basically the general idea is to pull ALL the drag code out (prototype method registrations plus this) into a + dedicated drag script), that does not necessarily need to be included. + + + */ + var DragManager = function (_currentInstance) { + var _draggables = {}, _dlist = [], _delements = {}, _elementsWithEndpoints = {}, + // elementids mapped to the draggable to which they belong. + _draggablesForElements = {}; + + /** + register some element as draggable. right now the drag init stuff is done elsewhere, and it is + possible that will continue to be the case. + */ + this.register = function (el) { + var id = _currentInstance.getId(el), + parentOffset; + + if (!_draggables[id]) { + _draggables[id] = el; + _dlist.push(el); + _delements[id] = {}; + } + + // look for child elements that have endpoints and register them against this draggable. + var _oneLevel = function (p) { + if (p) { + for (var i = 0; i < p.childNodes.length; i++) { + if (p.childNodes[i].nodeType !== 3 && p.childNodes[i].nodeType !== 8) { + var cEl = jsPlumb.getElement(p.childNodes[i]), + cid = _currentInstance.getId(p.childNodes[i], null, true); + if (cid && _elementsWithEndpoints[cid] && _elementsWithEndpoints[cid] > 0) { + if (!parentOffset) { + parentOffset = _currentInstance.getOffset(el); + } + var cOff = _currentInstance.getOffset(cEl); + _delements[id][cid] = { + id: cid, + offset: { + left: cOff.left - parentOffset.left, + top: cOff.top - parentOffset.top + } + }; + _draggablesForElements[cid] = id; + } + _oneLevel(p.childNodes[i]); + } + } + } + }; + + _oneLevel(el); + }; + + // refresh the offsets for child elements of this element. + this.updateOffsets = function (elId, childOffsetOverrides) { + if (elId != null) { + childOffsetOverrides = childOffsetOverrides || {}; + var domEl = jsPlumb.getElement(elId), + id = _currentInstance.getId(domEl), + children = _delements[id], + parentOffset; + + if (children) { + for (var i in children) { + if (children.hasOwnProperty(i)) { + var cel = jsPlumb.getElement(i), + cOff = childOffsetOverrides[i] || _currentInstance.getOffset(cel); + + // do not update if we have a value already and we'd just be writing 0,0 + if (cel.offsetParent == null && _delements[id][i] != null) { + continue; + } + + if (!parentOffset) { + parentOffset = _currentInstance.getOffset(domEl); + } + + _delements[id][i] = { + id: i, + offset: { + left: cOff.left - parentOffset.left, + top: cOff.top - parentOffset.top + } + }; + _draggablesForElements[i] = id; + } + } + } + } + }; + + /** + notification that an endpoint was added to the given el. we go up from that el's parent + node, looking for a parent that has been registered as a draggable. if we find one, we add this + el to that parent's list of elements to update on drag (if it is not there already) + */ + this.endpointAdded = function (el, id) { + + id = id || _currentInstance.getId(el); + + var b = document.body, + p = el.parentNode; + + _elementsWithEndpoints[id] = _elementsWithEndpoints[id] ? _elementsWithEndpoints[id] + 1 : 1; + + while (p != null && p !== b) { + var pid = _currentInstance.getId(p, null, true); + if (pid && _draggables[pid]) { + var pLoc = _currentInstance.getOffset(p); + + if (_delements[pid][id] == null) { + var cLoc = _currentInstance.getOffset(el); + _delements[pid][id] = { + id: id, + offset: { + left: cLoc.left - pLoc.left, + top: cLoc.top - pLoc.top + } + }; + _draggablesForElements[id] = pid; + } + break; + } + p = p.parentNode; + } + }; + + this.endpointDeleted = function (endpoint) { + if (_elementsWithEndpoints[endpoint.elementId]) { + _elementsWithEndpoints[endpoint.elementId]--; + if (_elementsWithEndpoints[endpoint.elementId] <= 0) { + for (var i in _delements) { + if (_delements.hasOwnProperty(i) && _delements[i]) { + delete _delements[i][endpoint.elementId]; + delete _draggablesForElements[endpoint.elementId]; + } + } + } + } + }; + + this.changeId = function (oldId, newId) { + _delements[newId] = _delements[oldId]; + _delements[oldId] = {}; + _draggablesForElements[newId] = _draggablesForElements[oldId]; + _draggablesForElements[oldId] = null; + }; + + this.getElementsForDraggable = function (id) { + return _delements[id]; + }; + + this.elementRemoved = function (elementId) { + var elId = _draggablesForElements[elementId]; + if (elId) { + delete _delements[elId][elementId]; + delete _draggablesForElements[elementId]; + } + }; + + this.reset = function () { + _draggables = {}; + _dlist = []; + _delements = {}; + _elementsWithEndpoints = {}; + }; + + // + // notification drag ended. We check automatically if need to update some + // ancestor's offsets. + // + this.dragEnded = function (el) { + if (el.offsetParent != null) { + var id = _currentInstance.getId(el), + ancestor = _draggablesForElements[id]; + + if (ancestor) { + this.updateOffsets(ancestor); + } + } + }; + + this.setParent = function (el, elId, p, pId, currentChildLocation) { + var current = _draggablesForElements[elId]; + if (!_delements[pId]) { + _delements[pId] = {}; + } + var pLoc = _currentInstance.getOffset(p), + cLoc = currentChildLocation || _currentInstance.getOffset(el); + + if (current && _delements[current]) { + delete _delements[current][elId]; + } + + _delements[pId][elId] = { + id:elId, + offset : { + left: cLoc.left - pLoc.left, + top: cLoc.top - pLoc.top + } + }; + _draggablesForElements[elId] = pId; + }; + + this.clearParent = function(el, elId) { + var current = _draggablesForElements[elId]; + if (current) { + delete _delements[current][elId]; + delete _draggablesForElements[elId]; + } + }; + + this.revalidateParent = function(el, elId, childOffset) { + var current = _draggablesForElements[elId]; + if (current) { + var co = {}; + co[elId] = childOffset; + this.updateOffsets(current, co); + _currentInstance.revalidate(current); + } + }; + + this.getDragAncestor = function (el) { + var de = jsPlumb.getElement(el), + id = _currentInstance.getId(de), + aid = _draggablesForElements[id]; + + if (aid) { + return jsPlumb.getElement(aid); + } + else { + return null; + } + }; + + }; + + var _setClassName = function (el, cn, classList) { + cn = _ju.fastTrim(cn); + if (typeof el.className.baseVal !== "undefined") { + el.className.baseVal = cn; + } + else { + el.className = cn; + } + + // recent (i currently have 61.0.3163.100) version of chrome do not update classList when you set the base val + // of an svg element's className. in the long run we'd like to move to just using classList anyway + try { + var cl = el.classList; + if (cl != null) { + while (cl.length > 0) { + cl.remove(cl.item(0)); + } + for (var i = 0; i < classList.length; i++) { + if (classList[i]) { + cl.add(classList[i]); + } + } + } + } + catch(e) { + // not fatal + _ju.log("JSPLUMB: cannot set class list", e); + } + }, + _getClassName = function (el) { + return (typeof el.className.baseVal === "undefined") ? el.className : el.className.baseVal; + }, + _classManip = function (el, classesToAdd, classesToRemove) { + classesToAdd = classesToAdd == null ? [] : _ju.isArray(classesToAdd) ? classesToAdd : classesToAdd.split(/\s+/); + classesToRemove = classesToRemove == null ? [] : _ju.isArray(classesToRemove) ? classesToRemove : classesToRemove.split(/\s+/); + + var className = _getClassName(el), + curClasses = className.split(/\s+/); + + var _oneSet = function (add, classes) { + for (var i = 0; i < classes.length; i++) { + if (add) { + if (curClasses.indexOf(classes[i]) === -1) { + curClasses.push(classes[i]); + } + } + else { + var idx = curClasses.indexOf(classes[i]); + if (idx !== -1) { + curClasses.splice(idx, 1); + } + } + } + }; + + _oneSet(true, classesToAdd); + _oneSet(false, classesToRemove); + + _setClassName(el, curClasses.join(" "), curClasses); + }; + + root.jsPlumb.extend(root.jsPlumbInstance.prototype, { + + headless: false, + + pageLocation: _pageLocation, + screenLocation: _screenLocation, + clientLocation: _clientLocation, + + getDragManager:function() { + if (this.dragManager == null) { + this.dragManager = new DragManager(this); + } + + return this.dragManager; + }, + + recalculateOffsets:function(elId) { + this.getDragManager().updateOffsets(elId); + }, + + createElement:function(tag, style, clazz, atts) { + return this.createElementNS(null, tag, style, clazz, atts); + }, + + createElementNS:function(ns, tag, style, clazz, atts) { + var e = ns == null ? document.createElement(tag) : document.createElementNS(ns, tag); + var i; + style = style || {}; + for (i in style) { + e.style[i] = style[i]; + } + + if (clazz) { + e.className = clazz; + } + + atts = atts || {}; + for (i in atts) { + e.setAttribute(i, "" + atts[i]); + } + + return e; + }, + + getAttribute: function (el, attName) { + return el.getAttribute != null ? el.getAttribute(attName) : null; + }, + + setAttribute: function (el, a, v) { + if (el.setAttribute != null) { + el.setAttribute(a, v); + } + }, + + setAttributes: function (el, atts) { + for (var i in atts) { + if (atts.hasOwnProperty(i)) { + el.setAttribute(i, atts[i]); + } + } + }, + appendToRoot: function (node) { + document.body.appendChild(node); + }, + getRenderModes: function () { + return [ "svg" ]; + }, + getClass:_getClassName, + addClass: function (el, clazz) { + jsPlumb.each(el, function (e) { + _classManip(e, clazz); + }); + }, + hasClass: function (el, clazz) { + el = jsPlumb.getElement(el); + if (el.classList) { + return el.classList.contains(clazz); + } + else { + return _getClassName(el).indexOf(clazz) !== -1; + } + }, + removeClass: function (el, clazz) { + jsPlumb.each(el, function (e) { + _classManip(e, null, clazz); + }); + }, + toggleClass:function(el, clazz) { + if (jsPlumb.hasClass(el, clazz)) { + jsPlumb.removeClass(el, clazz); + } else { + jsPlumb.addClass(el, clazz); + } + }, + updateClasses: function (el, toAdd, toRemove) { + jsPlumb.each(el, function (e) { + _classManip(e, toAdd, toRemove); + }); + }, + setClass: function (el, clazz) { + if (clazz != null) { + jsPlumb.each(el, function (e) { + _setClassName(e, clazz, clazz.split(/\s+/)); + }); + } + }, + setPosition: function (el, p) { + el.style.left = p.left + "px"; + el.style.top = p.top + "px"; + }, + getPosition: function (el) { + var _one = function (prop) { + var v = el.style[prop]; + return v ? v.substring(0, v.length - 2) : 0; + }; + return { + left: _one("left"), + top: _one("top") + }; + }, + getStyle:function(el, prop) { + if (typeof window.getComputedStyle !== 'undefined') { + return getComputedStyle(el, null).getPropertyValue(prop); + } else { + return el.currentStyle[prop]; + } + }, + getSelector: function (ctx, spec) { + var sel = null; + if (arguments.length === 1) { + sel = ctx.nodeType != null ? ctx : document.querySelectorAll(ctx); + } + else { + sel = ctx.querySelectorAll(spec); + } + + return sel; + }, + getOffset:function(el, relativeToRoot, container) { + el = jsPlumb.getElement(el); + container = container || this.getContainer(); + var out = { + left: el.offsetLeft, + top: el.offsetTop + }, + op = (relativeToRoot || (container != null && (el !== container && el.offsetParent !== container))) ? el.offsetParent : null, + _maybeAdjustScroll = function(offsetParent) { + if (offsetParent != null && offsetParent !== document.body && (offsetParent.scrollTop > 0 || offsetParent.scrollLeft > 0)) { + out.left -= offsetParent.scrollLeft; + out.top -= offsetParent.scrollTop; + } + }.bind(this); + + while (op != null) { + out.left += op.offsetLeft; + out.top += op.offsetTop; + _maybeAdjustScroll(op); + op = relativeToRoot ? op.offsetParent : + op.offsetParent === container ? null : op.offsetParent; + } + + // if container is scrolled and the element (or its offset parent) is not absolute or fixed, adjust accordingly. + if (container != null && !relativeToRoot && (container.scrollTop > 0 || container.scrollLeft > 0)) { + var pp = el.offsetParent != null ? this.getStyle(el.offsetParent, "position") : "static", + p = this.getStyle(el, "position"); + if (p !== "absolute" && p !== "fixed" && pp !== "absolute" && pp !== "fixed") { + out.left -= container.scrollLeft; + out.top -= container.scrollTop; + } + } + return out; + }, + // + // return x+y proportion of the given element's size corresponding to the location of the given event. + // + getPositionOnElement: function (evt, el, zoom) { + var box = typeof el.getBoundingClientRect !== "undefined" ? el.getBoundingClientRect() : { left: 0, top: 0, width: 0, height: 0 }, + body = document.body, + docElem = document.documentElement, + scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop, + scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft, + clientTop = docElem.clientTop || body.clientTop || 0, + clientLeft = docElem.clientLeft || body.clientLeft || 0, + pst = 0, + psl = 0, + top = box.top + scrollTop - clientTop + (pst * zoom), + left = box.left + scrollLeft - clientLeft + (psl * zoom), + cl = jsPlumb.pageLocation(evt), + w = box.width || (el.offsetWidth * zoom), + h = box.height || (el.offsetHeight * zoom), + x = (cl[0] - left) / w, + y = (cl[1] - top) / h; + + return [ x, y ]; + }, + + /** + * Gets the absolute position of some element as read from the left/top properties in its style. + * @method getAbsolutePosition + * @param {Element} el The element to retrieve the absolute coordinates from. **Note** this is a DOM element, not a selector from the underlying library. + * @return {Number[]} [left, top] pixel values. + */ + getAbsolutePosition: function (el) { + var _one = function (s) { + var ss = el.style[s]; + if (ss) { + return parseFloat(ss.substring(0, ss.length - 2)); + } + }; + return [ _one("left"), _one("top") ]; + }, + + /** + * Sets the absolute position of some element by setting the left/top properties in its style. + * @method setAbsolutePosition + * @param {Element} el The element to set the absolute coordinates on. **Note** this is a DOM element, not a selector from the underlying library. + * @param {Number[]} xy x and y coordinates + * @param {Number[]} [animateFrom] Optional previous xy to animate from. + * @param {Object} [animateOptions] Options for the animation. + */ + setAbsolutePosition: function (el, xy, animateFrom, animateOptions) { + if (animateFrom) { + this.animate(el, { + left: "+=" + (xy[0] - animateFrom[0]), + top: "+=" + (xy[1] - animateFrom[1]) + }, animateOptions); + } + else { + el.style.left = xy[0] + "px"; + el.style.top = xy[1] + "px"; + } + }, + /** + * gets the size for the element, in an array : [ width, height ]. + */ + getSize: function (el) { + return [ el.offsetWidth, el.offsetHeight ]; + }, + getWidth: function (el) { + return el.offsetWidth; + }, + getHeight: function (el) { + return el.offsetHeight; + }, + getRenderMode : function() { return "svg"; }, + draggable : function (el, options) { + var info; + el = _ju.isArray(el) || (el.length != null && !_ju.isString(el)) ? el: [ el ]; + Array.prototype.slice.call(el).forEach(function(_el) { + info = this.info(_el); + if (info.el) { + this._initDraggableIfNecessary(info.el, true, options, info.id, true); + } + }.bind(this)); + return this; + }, + snapToGrid : function(el, x, y) { + var out = []; + var _oneEl = function(_el) { + var info = this.info(_el); + if (info.el != null && info.el._katavorioDrag) { + var snapped = info.el._katavorioDrag.snap(x, y); + this.revalidate(info.el); + out.push([info.el, snapped]); + } + }.bind(this); + + // if you call this method with 0 arguments or 2 arguments it is assumed you want to snap all managed elements to + // a grid. if you supply one argument or 3, then you are assumed to be specifying one element. + if(arguments.length === 1 || arguments.length === 3) { + _oneEl(el, x, y); + } else { + var _me = this.getManagedElements(); + for (var mel in _me) { + _oneEl(mel, arguments[0], arguments[1]); + } + } + + return out; + }, + initDraggable: function (el, options, category) { + _getDragManager(this, category).draggable(el, options); + el._jsPlumbDragOptions = options; + }, + destroyDraggable: function (el, category) { + _getDragManager(this, category).destroyDraggable(el); + delete el._jsPlumbDragOptions; + }, + unbindDraggable: function (el, evt, fn, category) { + _getDragManager(this, category).destroyDraggable(el, evt, fn); + }, + setDraggable : function (element, draggable) { + return jsPlumb.each(element, function (el) { + if (this.isDragSupported(el)) { + this._draggableStates[this.getAttribute(el, "id")] = draggable; + this.setElementDraggable(el, draggable); + } + }.bind(this)); + }, + _draggableStates : {}, + /* + * toggles the draggable state of the given element(s). + * el is either an id, or an element object, or a list of ids/element objects. + */ + toggleDraggable : function (el) { + var state; + jsPlumb.each(el, function (el) { + var elId = this.getAttribute(el, "id"); + state = this._draggableStates[elId] == null ? false : this._draggableStates[elId]; + state = !state; + this._draggableStates[elId] = state; + this.setDraggable(el, state); + return state; + }.bind(this)); + return state; + }, + _initDraggableIfNecessary : function (element, isDraggable, dragOptions, id, fireEvent) { + // TODO FIRST: move to DragManager. including as much of the decision to init dragging as possible. + if (!jsPlumb.headless) { + var _draggable = isDraggable == null ? false : isDraggable; + if (_draggable) { + if (jsPlumb.isDragSupported(element, this)) { + var options = dragOptions || this.Defaults.DragOptions; + options = jsPlumb.extend({}, options); // make a copy. + if (!jsPlumb.isAlreadyDraggable(element, this)) { + var dragEvent = jsPlumb.dragEvents.drag, + stopEvent = jsPlumb.dragEvents.stop, + startEvent = jsPlumb.dragEvents.start; + + this.manage(id, element); + + options[startEvent] = _ju.wrap(options[startEvent], _dragStart.bind(this)); + + options[dragEvent] = _ju.wrap(options[dragEvent], _dragMove.bind(this)); + + options[stopEvent] = _ju.wrap(options[stopEvent], _dragStop.bind(this)); + + var elId = this.getId(element); // need ID + + this._draggableStates[elId] = true; + var draggable = this._draggableStates[elId]; + + options.disabled = draggable == null ? false : !draggable; + this.initDraggable(element, options); + this.getDragManager().register(element); + if (fireEvent) { + this.fire("elementDraggable", {el:element, options:options}); + } + } + else { + // already draggable. attach any start, drag or stop listeners to the current Drag. + if (dragOptions.force) { + this.initDraggable(element, options); + } + } + } + } + } + }, + animationSupported:true, + getElement: function (el) { + if (el == null) { + return null; + } + // here we pluck the first entry if el was a list of entries. + // this is not my favourite thing to do, but previous versions of + // jsplumb supported jquery selectors, and it is possible a selector + // will be passed in here. + el = typeof el === "string" ? el : el.length != null && el.enctype == null ? el[0] : el; + return typeof el === "string" ? document.getElementById(el) : el; + }, + removeElement: function (element) { + _getDragManager(this).elementRemoved(element); + this.getEventManager().remove(element); + }, + // + // this adapter supports a rudimentary animation function. no easing is supported. only + // left/top properties are supported. property delta args are expected to be in the form + // + // +=x.xxxx + // + // or + // + // -=x.xxxx + // + doAnimate: function (el, properties, options) { + options = options || {}; + var o = this.getOffset(el), + ap = _animProps(o, properties), + ldist = ap[0] - o.left, + tdist = ap[1] - o.top, + d = options.duration || 250, + step = 15, steps = d / step, + linc = (step / d) * ldist, + tinc = (step / d) * tdist, + idx = 0, + _int = setInterval(function () { + _jp.setPosition(el, { + left: o.left + (linc * (idx + 1)), + top: o.top + (tinc * (idx + 1)) + }); + if (options.step != null) { + options.step(idx, Math.ceil(steps)); + } + idx++; + if (idx >= steps) { + window.clearInterval(_int); + if (options.complete != null) { + options.complete(); + } + } + }, step); + }, + // DRAG/DROP + + + destroyDroppable: function (el, category) { + _getDragManager(this, category).destroyDroppable(el); + }, + unbindDroppable: function (el, evt, fn, category) { + _getDragManager(this, category).destroyDroppable(el, evt, fn); + }, + + droppable :function(el, options) { + el = _ju.isArray(el) || (el.length != null && !_ju.isString(el)) ? el: [ el ]; + var info; + options = options || {}; + options.allowLoopback = false; + Array.prototype.slice.call(el).forEach(function(_el) { + info = this.info(_el); + if (info.el) { + this.initDroppable(info.el, options); + } + }.bind(this)); + return this; + }, + + initDroppable: function (el, options, category) { + _getDragManager(this, category).droppable(el, options); + }, + isAlreadyDraggable: function (el) { + return el._katavorioDrag != null; + }, + isDragSupported: function (el, options) { + return true; + }, + isDropSupported: function (el, options) { + return true; + }, + isElementDraggable: function (el) { + el = _jp.getElement(el); + return el._katavorioDrag && el._katavorioDrag.isEnabled(); + }, + getDragObject: function (eventArgs) { + return eventArgs[0].drag.getDragElement(); + }, + getDragScope: function (el) { + return el._katavorioDrag && el._katavorioDrag.scopes.join(" ") || ""; + }, + getDropEvent: function (args) { + return args[0].e; + }, + getUIPosition: function (eventArgs, zoom) { + // here the position reported to us by Katavorio is relative to the element's offsetParent. For top + // level nodes that is fine, but if we have a nested draggable then its offsetParent is actually + // not going to be the jsplumb container; it's going to be some child of that element. In that case + // we want to adjust the UI position to account for the offsetParent's position relative to the Container + // origin. + var el = eventArgs[0].el; + if (el.offsetParent == null) { + return null; + } + var finalPos = eventArgs[0].finalPos || eventArgs[0].pos; + var p = { left:finalPos[0], top:finalPos[1] }; + if (el._katavorioDrag && el.offsetParent !== this.getContainer()) { + var oc = this.getOffset(el.offsetParent); + p.left += oc.left; + p.top += oc.top; + } + return p; + }, + setDragFilter: function (el, filter, _exclude) { + if (el._katavorioDrag) { + el._katavorioDrag.setFilter(filter, _exclude); + } + }, + setElementDraggable: function (el, draggable) { + el = _jp.getElement(el); + if (el._katavorioDrag) { + el._katavorioDrag.setEnabled(draggable); + } + }, + setDragScope: function (el, scope) { + if (el._katavorioDrag) { + el._katavorioDrag.k.setDragScope(el, scope); + } + }, + setDropScope:function(el, scope) { + if (el._katavorioDrop && el._katavorioDrop.length > 0) { + el._katavorioDrop[0].k.setDropScope(el, scope); + } + }, + addToPosse:function(el, spec) { + var specs = Array.prototype.slice.call(arguments, 1); + var dm = _getDragManager(this); + _jp.each(el, function(_el) { + _el = [ _jp.getElement(_el) ]; + _el.push.apply(_el, specs ); + dm.addToPosse.apply(dm, _el); + }); + }, + setPosse:function(el, spec) { + var specs = Array.prototype.slice.call(arguments, 1); + var dm = _getDragManager(this); + _jp.each(el, function(_el) { + _el = [ _jp.getElement(_el) ]; + _el.push.apply(_el, specs ); + dm.setPosse.apply(dm, _el); + }); + }, + removeFromPosse:function(el, posseId) { + var specs = Array.prototype.slice.call(arguments, 1); + var dm = _getDragManager(this); + _jp.each(el, function(_el) { + _el = [ _jp.getElement(_el) ]; + _el.push.apply(_el, specs ); + dm.removeFromPosse.apply(dm, _el); + }); + }, + removeFromAllPosses:function(el) { + var dm = _getDragManager(this); + _jp.each(el, function(_el) { dm.removeFromAllPosses(_jp.getElement(_el)); }); + }, + setPosseState:function(el, posseId, state) { + var dm = _getDragManager(this); + _jp.each(el, function(_el) { dm.setPosseState(_jp.getElement(_el), posseId, state); }); + }, + dragEvents: { + 'start': 'start', 'stop': 'stop', 'drag': 'drag', 'step': 'step', + 'over': 'over', 'out': 'out', 'drop': 'drop', 'complete': 'complete', + 'beforeStart':'beforeStart' + }, + animEvents: { + 'step': "step", 'complete': 'complete' + }, + stopDrag: function (el) { + if (el._katavorioDrag) { + el._katavorioDrag.abort(); + } + }, + addToDragSelection: function (spec) { + var el = this.getElement(spec); + if (el != null && (el._isJsPlumbGroup || el._jsPlumbGroup == null)) { + _getDragManager(this).select(spec); + } + }, + removeFromDragSelection: function (spec) { + _getDragManager(this).deselect(spec); + }, + getDragSelection:function() { + return _getDragManager(this).getSelection(); + }, + clearDragSelection: function () { + _getDragManager(this).deselectAll(); + }, + trigger: function (el, event, originalEvent, payload) { + this.getEventManager().trigger(el, event, originalEvent, payload); + }, + doReset:function() { + // look for katavorio instances and reset each one if found. + for (var key in this) { + if (key.indexOf("_katavorio_") === 0) { + this[key].reset(); + } + } + }, + getEventManager:function() { + return _getEventManager(this); + }, + on : function(el, event, callback) { + // TODO: here we would like to map the tap event if we know its + // an internal bind to a click. we have to know its internal because only + // then can we be sure that the UP event wont be consumed (tap is a synthesized + // event from a mousedown followed by a mouseup). + //event = { "click":"tap", "dblclick":"dbltap"}[event] || event; + this.getEventManager().on.apply(this, arguments); + return this; + }, + off : function(el, event, callback) { + this.getEventManager().off.apply(this, arguments); + return this; + } + + }); + + var ready = function (f) { + var _do = function () { + if (/complete|loaded|interactive/.test(document.readyState) && typeof(document.body) !== "undefined" && document.body != null) { + f(); + } + else { + setTimeout(_do, 9); + } + }; + + _do(); + }; + ready(_jp.init); + +}).call(typeof window !== 'undefined' ? window : this); diff --git a/experiment/simulation/EE4/helper/cable/simulate.html b/experiment/simulation/EE4/helper/cable/simulate.html new file mode 100644 index 0000000..d650bcc --- /dev/null +++ b/experiment/simulation/EE4/helper/cable/simulate.html @@ -0,0 +1,117 @@ + + + Log Amplifier + + + + + + + +
+ +

Log Amplifier

+ + + + +
+

1

+

2

+

3

+

4

+

5

+

6

+

7

+

8

+

9

+

10

+
+ + + +
+
+
+
+
+
+
+
+ +
+
+ Copyright©2019 | Lab developed by Virtual Labs, IIT Roorkee
+
+ + +
+ + + + + + + \ No newline at end of file diff --git a/experiment/simulation/EE4/helper/cable/temp.html b/experiment/simulation/EE4/helper/cable/temp.html new file mode 100644 index 0000000..8311e75 --- /dev/null +++ b/experiment/simulation/EE4/helper/cable/temp.html @@ -0,0 +1,76 @@ + + + + + + JsPlumb Circuit Simulator + + + + + + +
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+ + + + + diff --git a/experiment/simulation/EE4/helper/img/slider_D_blank.png b/experiment/simulation/EE4/helper/img/slider_D_blank.png new file mode 100644 index 0000000..d7893b4 Binary files /dev/null and b/experiment/simulation/EE4/helper/img/slider_D_blank.png differ diff --git a/experiment/simulation/EE4/helper/img/slider_R_arrow.png b/experiment/simulation/EE4/helper/img/slider_R_arrow.png new file mode 100644 index 0000000..cbbb9c5 Binary files /dev/null and b/experiment/simulation/EE4/helper/img/slider_R_arrow.png differ diff --git a/experiment/simulation/EE4/helper/img/slider_V_arrow.png b/experiment/simulation/EE4/helper/img/slider_V_arrow.png new file mode 100644 index 0000000..b855b94 Binary files /dev/null and b/experiment/simulation/EE4/helper/img/slider_V_arrow.png differ diff --git a/experiment/simulation/EE4/helper/img/slider_V_back.png b/experiment/simulation/EE4/helper/img/slider_V_back.png new file mode 100644 index 0000000..14ddcee Binary files /dev/null and b/experiment/simulation/EE4/helper/img/slider_V_back.png differ diff --git a/experiment/simulation/EE4/helper/img/slider_circuit.png b/experiment/simulation/EE4/helper/img/slider_circuit.png new file mode 100644 index 0000000..f58870f Binary files /dev/null and b/experiment/simulation/EE4/helper/img/slider_circuit.png differ diff --git a/experiment/simulation/EE4/helper/img/slider_tip.png b/experiment/simulation/EE4/helper/img/slider_tip.png new file mode 100644 index 0000000..13c5348 Binary files /dev/null and b/experiment/simulation/EE4/helper/img/slider_tip.png differ diff --git a/experiment/simulation/EE4/helper/practice component/leet.js b/experiment/simulation/EE4/helper/practice component/leet.js new file mode 100644 index 0000000..41e7fb1 --- /dev/null +++ b/experiment/simulation/EE4/helper/practice component/leet.js @@ -0,0 +1,8 @@ +let sc = "!@#$%^&*()-+" + + +let pass = "sneha@@33" + +console.log("skjdkj") + +console.log(pass.indexOf(sc)); \ No newline at end of file diff --git a/experiment/simulation/EE4/helper/practice component/temp.html b/experiment/simulation/EE4/helper/practice component/temp.html new file mode 100644 index 0000000..c79f92f --- /dev/null +++ b/experiment/simulation/EE4/helper/practice component/temp.html @@ -0,0 +1,202 @@ + + + + + + Document + + + +
+
+
+
V in (V)
+ +
+
+
R (Ω)
+ +
+
+
Characteristics
+ +
+
+ +
+
+
D
+ + +
+
+
+ + + \ No newline at end of file diff --git a/experiment/simulation/EE4/helper/practice component/tempCodeRunnerFile.js b/experiment/simulation/EE4/helper/practice component/tempCodeRunnerFile.js new file mode 100644 index 0000000..2550fd3 --- /dev/null +++ b/experiment/simulation/EE4/helper/practice component/tempCodeRunnerFile.js @@ -0,0 +1,8 @@ +let sc = "!@#$%^&*()-+" + + +let pass = "sneha@@33" + +console.log("skjdkj") + +console.log(pass.indexOf("sc")); \ No newline at end of file diff --git a/experiment/simulation/EE4/helper/sliders.css b/experiment/simulation/EE4/helper/sliders.css new file mode 100644 index 0000000..6a7e6fc --- /dev/null +++ b/experiment/simulation/EE4/helper/sliders.css @@ -0,0 +1,137 @@ +body{ + background-color: #f1ece3; +} +.universal-slider{ + +} +.universal-slider .slider-circuit{ + position: relative; + z-index: 20; +} +.slider .slider_R,.range-slider{ + position: absolute; + left: 557px; + top: 115px; + z-index: 499; + -webkit-appearance: none; + appearance: none; + transform: rotate(-90deg); + width: 80px; + height: 30px; + height: 10px; + border-radius: 5px; + /* background: #d3d3d3; */ + background: transparent; + outline: none; + opacity: 0.9; + -webkit-transition: .2s; + transition: opacity .2s; +} +.slider .slider_R::-webkit-slider-thumb,.range-slider::-webkit-slider-thumb{ + -webkit-appearance: none; + appearance: none; + height: 30px; + width: 30px; + border: 0; + transform: rotate(90deg); + background: url('./img/slider_tip.png'); + background-position: center; + background-size: cover; + background-repeat: no-repeat; + cursor: pointer; + +} +.slider .slider_R:hover,.range-slider:hover{ + /* background-color: black; */ + opacity: 1; +} + +.slider .slider_R+img{ + position: absolute; + left: 569px; + top: 120px; + z-index: 498; +} +.slider .value-box{ + background-color: white; + text-align: black; + border: 1px solid black; + width: fit-content; + display: flex; + padding: 0 3px; +} +.slider .value-box input{ + border: none; + outline: none; + width: 25px; + font-weight: bold; +} + + + + +/* ! Fix positions of all slider input value */ +.slider .r .value-box{ + position: absolute; + left: 588px; + top: 54px; + z-index: 500; +} +/* slider d */ +.slider .slider_D{ + transform: rotate(0deg); + left: 281px; + top: 143.8px; + width: 80px; + background-color: transparent; +} + +.slider .d .value-box{ + position: absolute; + left: 299px; + top: 97px; + z-index: 500; +} +.slider .slider_D+img{ + position: absolute; + left: 218px; + top: 141px; + width: 80px; + z-index: 10; +} + +/* slider v */ +.slider .v .meter{ + width: 113px; + position: absolute; + top: 12px; + left: 70px; +} + +.slider .v .slider-V-arrow{ + width: 35px; + position: absolute; + z-index: 200; +} + +.slider-v-r1{ + transform: rotate(0deg); + top: 65px; + left: 100px; +} +.slider-v-r2{ + transform: rotate(50deg); + top: 62px; + left: 110px; +} +.slider-v-r3{ + transform: rotate(110deg); + top: 67px; + left: 119px; +} +.slider .v .value-box{ + position: absolute; + top: 103px; + left: 116px; + z-index: 200; +} diff --git a/experiment/simulation/EE4/helper/sliders.js b/experiment/simulation/EE4/helper/sliders.js new file mode 100644 index 0000000..eadb1ec --- /dev/null +++ b/experiment/simulation/EE4/helper/sliders.js @@ -0,0 +1,103 @@ +function sliderR(){ + let slider_R = document.querySelector(".slider_R") + let sliderImg = document.querySelector(".slider-R-arrow") + let sliderValueInput = document.querySelector(".r .value-box input") + // ratio to move 450/50 = 1:10 + // max img 71px -> min 120 px + let val = 0 + + // slider function + function slide(e){ + e = e instanceof Event + if(e){ + sliderValueInput.value = slider_R.value + } + else{ + slider_R.value = sliderValueInput.value + } + val = (slider_R.value / 9.3) - 5 + sliderImg.style.top = `${120 - val}px` + } + + const slideInput = ()=>{ + let val = sliderValueInput.value + if(val > 500){ + val = 500 + } + sliderValueInput.value = val + slide(false) + } + + slider_R.oninput = slide + sliderValueInput.onkeyup = slideInput + sliderValueInput.addEventListener("focusout",()=>{ + if(sliderValueInput.value < 50){ + sliderValueInput.value = 50 + } + slide(false) + }) +} +function sliderD(){ + let slider_D = document.querySelector(".slider_D") + let sliderImg = document.querySelector(".slider-D-arrow") + let sliderValueInput = document.querySelector(".d .value-box input") + let val = 0 + + // slider function + function slide(e){ + e = e instanceof Event + if(e){ + sliderValueInput.value = slider_D.value + } + else{ + slider_D.value = sliderValueInput.value + } + val = ((slider_D.value*100) / 1.7) - 5 + sliderImg.style.left = `${218 + val}px` + } + + const slideInput = ()=>{ + let val = sliderValueInput.value + if(val > 0.95){ + val = 0.95 + } + sliderValueInput.value = val + slide(false) + } + + slider_D.oninput = slide + sliderValueInput.onkeyup = slideInput + sliderValueInput.addEventListener("focusout",()=>{ + if(sliderValueInput.value < 0.1){ + sliderValueInput.value = 0.1 + } + slide(false) + }) +} +function sliderV(){ + let sliderArrow = document.querySelector(".slider-V-arrow") + let sliderValueInput = document.querySelector(".v .value-box input") + + // slider function + function rotateArrow(rot=0){ + if(sliderArrow.classList.contains("slider-v-r3")){ + sliderArrow.classList.remove("slider-v-r3") + sliderArrow.classList.add("slider-v-r1") + sliderValueInput.value = 24 + + }else if(sliderArrow.classList.contains("slider-v-r1")){ + sliderArrow.classList.remove("slider-v-r1") + sliderArrow.classList.add("slider-v-r2") + sliderValueInput.value = 48 + }else if(sliderArrow.classList.contains("slider-v-r2")){ + sliderArrow.classList.remove("slider-v-r2") + sliderArrow.classList.add("slider-v-r3") + sliderValueInput.value = 72 + } + } + + sliderArrow.onclick = rotateArrow +} +sliderV() +sliderR() +sliderD() \ No newline at end of file diff --git a/experiment/simulation/EE4/helper/temp.html b/experiment/simulation/EE4/helper/temp.html new file mode 100644 index 0000000..33e8c0d --- /dev/null +++ b/experiment/simulation/EE4/helper/temp.html @@ -0,0 +1,97 @@ + + + + + + Document + + + + + + +
+ + + + + + + + + + + + +
+ + + diff --git a/experiment/simulation/EE4/helper/temp.py b/experiment/simulation/EE4/helper/temp.py new file mode 100644 index 0000000..232a5d6 --- /dev/null +++ b/experiment/simulation/EE4/helper/temp.py @@ -0,0 +1,51 @@ +import os +def html(name): + return ''' + + '''.format(name) + +def src(name :str): + return name[0:name.find('.')] + ":this.allImgsDom[index++],\n" + + +def dom(name): + name1 = name[0: name.find(".")] + return f'{name1} : new Dom("{name1}"),\n' + + +sneha_folder_path = "E:\\office project\\vlabs-EE\\EE4\\src\\images\\new imgs\\" + +# utkarsh_folder_path = "S:\\Users\\Utkarsh\\Documents\\Office Main\\All Projects Repo\\vlabs-EE\\EE4\\src\\images\\exp4\\part2\\" + +names = os.listdir(sneha_folder_path) + +# namesStr = '' +# for name in names: +# namesStr = namesStr + f'{name}\n' + +# open("temp3.txt","w").write(namesStr) + +# BASE_COUNT = 13 +# count = 168 + +srcs = '' +doms = '' +htms = '' +for i in range(len(names)): + htms = htms + html(names[i]) + doms = doms + dom(names[i]) + srcs = srcs + src(names[i]) + + + + +# open("temp.txt","w").write() +allItems = f'{htms}\n\n{srcs}\n\n{doms}' +open("temp2.txt","w").write(allItems) + +print("Done 👍") +# print(os.__path__) +# \ No newline at end of file diff --git a/experiment/simulation/EE4/helper/temp.txt b/experiment/simulation/EE4/helper/temp.txt new file mode 100644 index 0000000..e69de29 diff --git a/experiment/simulation/EE4/helper/temp2.py b/experiment/simulation/EE4/helper/temp2.py new file mode 100644 index 0000000..6554647 --- /dev/null +++ b/experiment/simulation/EE4/helper/temp2.py @@ -0,0 +1,325 @@ +domitems = ''' + anchor_plate.webp + anchor_plate.webp + anchor_plate.webp + anchor_plate.webp + + beam_3d_1.png + beam_3d_1.png + + beam_3d_with_holes.png + beam_3d_with_holes.png + + ct_prop.png + ct_prop.png + ct_prop.png + ct_prop.png + ct_prop.png + ct_prop.png + + foot_adapter.png + foot_adapter.png + foot_adapter.png + + head_adapter.webp + head_adapter.webp + full_column.jpeg + drill_machine.png + hammer.png + nail.png + objective.png + real_foot_adapter.png + real_head_adapter.png + + sheathing.png + sheathing.png + sheathing.png + sheathing.png + sheathing.png + + steel_waler.png + steel_waler.png + steel_waler.png + tie_rod.png + tie_rod.png + tie_rod.png + tie_rod.png + wing_nut_top-cutout.png + wing_nut_top-cutout.png + wing_nut_top-cutout.png + wing_nut_top-cutout.png + wing_nut_top-cutout.png + wing_nut_full.png +''' + +names = '''anchor_plate +anchor_plate +anchor_plate +anchor_plate +beam_3d_1 +beam_3d_1 +beam_3d_with_holes +beam_3d_with_holes +ct_prop +ct_prop +ct_prop +ct_prop +ct_prop +ct_prop +foot_adapter +foot_adapter +foot_adapter +head_adapter +head_adapter +full_column +drill_machine +hammer +nail +objective +real_foot_adapter +real_head_adapter +sheathing +sheathing +sheathing +sheathing +sheathing +steel +steel +steel +tie_rod +tie_rod +tie_rod +tie_rod +wing_nut_top +wing_nut_top +wing_nut_top +wing_nut_top +wing_nut_top +wing_nut_full +''' + +names = names.split("\n") +for i in range(27,len(names)+27): + l = names[i-27] + ": this.allImgsDom[{0}],".format(i) + print(l) + \ No newline at end of file diff --git a/experiment/simulation/EE4/helper/temp2.txt b/experiment/simulation/EE4/helper/temp2.txt new file mode 100644 index 0000000..a802c50 --- /dev/null +++ b/experiment/simulation/EE4/helper/temp2.txt @@ -0,0 +1,68 @@ + + formulas_component_stress.png + + formulas_efficiency.png + + formulas_ideal.png + + formulas_nomenclautre.png + + formulas_non_ideal.png + + formulas_procedure.png + + formulas_universal.png + + graph2_arrow.png + + +formulas_component_stress:this.allImgsDom[134], +formulas_efficiency:this.allImgsDom[135], +formulas_ideal:this.allImgsDom[136], +formulas_nomenclautre:this.allImgsDom[137], +formulas_non_ideal:this.allImgsDom[138], +formulas_procedure:this.allImgsDom[139], +formulas_universal:this.allImgsDom[140], +graph2_arrow:this.allImgsDom[141], + + +formulas_component_stress : new Dom("formulas_component_stress"), +formulas_efficiency : new Dom("formulas_efficiency"), +formulas_ideal : new Dom("formulas_ideal"), +formulas_nomenclautre : new Dom("formulas_nomenclautre"), +formulas_non_ideal : new Dom("formulas_non_ideal"), +formulas_procedure : new Dom("formulas_procedure"), +formulas_universal : new Dom("formulas_universal"), +graph2_arrow : new Dom("graph2_arrow"), diff --git a/experiment/simulation/EE4/helper/temp3.txt b/experiment/simulation/EE4/helper/temp3.txt new file mode 100644 index 0000000..56fbe1c --- /dev/null +++ b/experiment/simulation/EE4/helper/temp3.txt @@ -0,0 +1,90 @@ +slide_1.png +slide_2.png +slide_3_page_1.png +slide_3_page_2.png +slide_3_page_3.png +slide_3_page_4.png +slide_4_page_1.png +slide_4_page_1_fan.png +slide_4_page_2_battery_1.png +slide_4_page_2_battery_2.png +slide_4_page_2_battery_3.png +slide_4_page_2_volt_text.png +slide_4_page_3_text_1.png +slide_4_page_3_text_2.png +slide_4_page_3_wire.png +slide_5_page_1.png +slide_5_page_2_text_1.png +slide_5_page_2_volt_text.png +slide_5_page_3_1_text_1.png +slide_5_page_3_2_wire.png +slide_5_page_3_3_light.png +slide_5_page_3_4_blast.gif +slide_5_page_3_5_cross.png +slide_5_page_3_6_emoji.png +slide_5_page_3_7_text_2.png +slide_5_page_3_8_text_3.png +slide_5_page_4_1_text_1.png +slide_6_page_1.png +slide_6_page_2_1_text_1.png +slide_6_page_2_2_emoji_blink.png +slide_6_page_3_1_text_1.png +slide_6_page_3_2_emoji_blink.png +slide_7_page_1_1.png +slide_7_page_1_2.png +slide_7_page_1_3.png +slide_8_page_1.png +slide_8_page_2_and_rotate_the_fan.png +slide_8_page_3_1.png +slide_8_page_3_2_light.png +slide_8_page_3_3_blank.png +slide_8_page_3_4_emoji.png +slide_8_page_3_5_text.png +slide_9.png +slide_10_page_1.png +slide_10_page_2.png +slide_10_page_3.png +slide_10_page_4_1.png +slide_10_page_4_2_plus.png +slide_10_page_4_3_minus.png +slide_10_page_4_4_arrow.png +slide_10_page_4_5_text.png +slide_11_page_1.png +slide_11_page_2_1.png +slide_11_page_2_2_blink.png +slide_11_page_3_1.png +slide_11_page_3_2_rotate_it.png +slide_11_page_3_3_text_and_arrow.png +slide_12_page_1.png +slide_12_page_2_1_pwm_blink.png +slide_12_page_2_2.png +slide_12_page_2_3_text.png +slide_12_page_3_1_pwn_blink.png +slide_12_page_3_2.png +slide_12_page_3_3_text.png +slide_12_page_3_4_text_2.png +slide_13_page_1.png +slide_13_page_2.png +slide_13_page_3_1_plus.png +slide_13_page_3_2_minus_rotate_both.png +slide_13_page_3_4.png +slide_13_page_3_5_text.png +['slide_14_helper.png', +'slide_14_page_1.png', +'slide_14_page_1_ball.png', +'slide_14_page_2_1_blink.png', +'slide_14_page_2_2_text.png', +'slide_14_page_3_1_symbols.png', +'slide_14_page_3_2_green_graph_and_start_ball.png', +'slide_14_page_3_3_white_image_for_blue_line.png', +'slide_15_page_1.png', +'slide_15_page_1_ball.png', +'slide_15_page_1_green_graph.png', +'slide_15_page_1_minus.png', +'slide_15_page_1_plus.png', +'slide_15_page_2_1_blink.png', +'slide_15_page_2_2_text.png', +'slide_15_page_3_1_arrow_and_text.png', +'slide_15_page_3_1_white.png', +'slide_15_page_3_2_graph.png', +'slide_15_page_3_3_text.png',] \ No newline at end of file diff --git a/experiment/simulation/EE4/helper/tempCodeRunnerFile.py b/experiment/simulation/EE4/helper/tempCodeRunnerFile.py new file mode 100644 index 0000000..0b8a6fb --- /dev/null +++ b/experiment/simulation/EE4/helper/tempCodeRunnerFile.py @@ -0,0 +1,42 @@ +import os + +def html(name): + return ''' + {0} + '''.format(name) + +def src(name :str,i :int): + return name[0:name.find('.')] + ":this.allImgsDom[{0}],\n".format(i) + + +def dom(name): + name1 = name[0: name.find(".")] + return f'{name1} : new Dom("{name1}"),\n' + + +names = os.listdir("S:\\Users\\Utkarsh\\Documents\\Project2\\CE8\\src\\images\\Beam and Slab") + +count = 108 + +srcs = '' +doms = '' +htms = '' +for i in range(len(names)): + htms = htms + html(names[i]) + doms = doms + dom(names[i]) + srcs = srcs + src(names[i],i+count) + + + +# open("temp.txt","w").write() +allItems = f'{htms}\n\n{srcs}\n\n{doms}' +open("temp2.txt","w").write(allItems) + +print("Done 👍") +# print(os.__path__) +# \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/apple-touch-icon.png b/experiment/simulation/EE4/iframes/data/apple-touch-icon.png new file mode 100644 index 0000000..5add869 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/apple-touch-icon.png differ diff --git a/experiment/simulation/EE4/iframes/data/browsersupport.js b/experiment/simulation/EE4/iframes/data/browsersupport.js new file mode 100644 index 0000000..0b1d9d3 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/browsersupport.js @@ -0,0 +1,7 @@ +!function(e,n,s){function t(e,n){return typeof e===n}function o(){var e,n,s,o,a,i,l;for(var c in f)if(f.hasOwnProperty(c)){if(e=[],n=f[c],n.name&&(e.push(n.name.toLowerCase()),n.options&&n.options.aliases&&n.options.aliases.length))for(s=0;si;i++){var r=g[i],f=r.toUpperCase()+"_"+t;if(f in a)return"@-"+r.toLowerCase()+"-"+n}return!1};l.atRule=m;var g=l._config.usePrefixes?" -webkit- -moz- -o- -ms- ".split(" "):["",""];l._prefixes=g,o(),a(r),delete l.addTest,delete l.addAsyncTest;for(var v=0;vparseFloat(r)){q=String(u);break a}}q=r};var w=e(),x=g()||d("iPod"),y=d("iPad"),z=d("Android")&&!(f()||e()||d("Opera")||d("Silk")),A=f(),B=d("Safari")&&!(f()||d("Coast")||d("Opera")||d("Edge")||d("Edg/")||d("OPR")||e()||d("Silk")||d("Android"))&&!(g()||d("iPad")||d("iPod"));function C(b){return(b=b.exec(c()))?b[1]:""}var D=function(){if(w)return C(/Firefox\/([0-9.]+)/);if(l||m||k)return q;if(A){if(g()||d("iPad")||d("iPod")||d("Macintosh")){var b=C(/CriOS\/([0-9.]+)/);if(b)return b}return C(/Chrome\/([0-9.]+)/)}if(B&&!(g()||d("iPad")||d("iPod")))return C(/Version\/([0-9.]+)/);if(x||y){if(b=/Version\/(\S+).*Mobile\/(\S+)/.exec(c()))return b[1]+"."+b[2]}else if(z)return(b=C(/Android\s+([0-9.]+)/))?b:C(/Version\/([0-9.]+)/);return""}();function E(b){var h;(h=!Modernizr.inlinesvg||l)||(h=parseInt(D,10),h=B&&14>h);return h?(location.replace(b+window.location.search),!0):!1}var F=["ispring","compatibility","performRedirectIfNeeded"],G=a;F[0]in G||"undefined"==typeof G.execScript||G.execScript("var "+F[0]);for(var H;F.length&&(H=F.shift());)F.length||void 0===E?G=G[H]&&G[H]!==Object.prototype[H]?G[H]:G[H]={}:G[H]=E;E("data/html5-unsupported.html");window.onerror=function(){return!0};a.console||(window._log="",a.console={log:function(b){window._log+="\n"+b},warn:function(b){window._log+="\nwarn: "+b},error:function(b){window._log+="\nerror: "+b}});})(); diff --git a/experiment/simulation/EE4/iframes/data/eraser.cur b/experiment/simulation/EE4/iframes/data/eraser.cur new file mode 100644 index 0000000..d88b5b8 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/eraser.cur differ diff --git a/experiment/simulation/EE4/iframes/data/favicon.ico b/experiment/simulation/EE4/iframes/data/favicon.ico new file mode 100644 index 0000000..9e6bd46 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/favicon.ico differ diff --git a/experiment/simulation/EE4/iframes/data/fnt0.woff b/experiment/simulation/EE4/iframes/data/fnt0.woff new file mode 100644 index 0000000..f322b8a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/fnt0.woff differ diff --git a/experiment/simulation/EE4/iframes/data/fnt1.woff b/experiment/simulation/EE4/iframes/data/fnt1.woff new file mode 100644 index 0000000..621a37f Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/fnt1.woff differ diff --git a/experiment/simulation/EE4/iframes/data/fnt10.woff b/experiment/simulation/EE4/iframes/data/fnt10.woff new file mode 100644 index 0000000..d0423ec Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/fnt10.woff differ diff --git a/experiment/simulation/EE4/iframes/data/fnt11.woff b/experiment/simulation/EE4/iframes/data/fnt11.woff new file mode 100644 index 0000000..a1baaa7 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/fnt11.woff differ diff --git a/experiment/simulation/EE4/iframes/data/fnt12.woff b/experiment/simulation/EE4/iframes/data/fnt12.woff new file mode 100644 index 0000000..31560b3 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/fnt12.woff differ diff --git a/experiment/simulation/EE4/iframes/data/fnt13.woff b/experiment/simulation/EE4/iframes/data/fnt13.woff new file mode 100644 index 0000000..2d4870c Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/fnt13.woff differ diff --git a/experiment/simulation/EE4/iframes/data/fnt14.woff b/experiment/simulation/EE4/iframes/data/fnt14.woff new file mode 100644 index 0000000..f171d8c Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/fnt14.woff differ diff --git a/experiment/simulation/EE4/iframes/data/fnt2.woff b/experiment/simulation/EE4/iframes/data/fnt2.woff new file mode 100644 index 0000000..7dbc547 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/fnt2.woff differ diff --git a/experiment/simulation/EE4/iframes/data/fnt3.woff b/experiment/simulation/EE4/iframes/data/fnt3.woff new file mode 100644 index 0000000..56fc9ab Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/fnt3.woff differ diff --git a/experiment/simulation/EE4/iframes/data/fnt4.woff b/experiment/simulation/EE4/iframes/data/fnt4.woff new file mode 100644 index 0000000..4edb33a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/fnt4.woff differ diff --git a/experiment/simulation/EE4/iframes/data/fnt5.woff b/experiment/simulation/EE4/iframes/data/fnt5.woff new file mode 100644 index 0000000..1fda4ed Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/fnt5.woff differ diff --git a/experiment/simulation/EE4/iframes/data/fnt6.woff b/experiment/simulation/EE4/iframes/data/fnt6.woff new file mode 100644 index 0000000..2426e78 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/fnt6.woff differ diff --git a/experiment/simulation/EE4/iframes/data/fnt7.woff b/experiment/simulation/EE4/iframes/data/fnt7.woff new file mode 100644 index 0000000..fafb725 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/fnt7.woff differ diff --git a/experiment/simulation/EE4/iframes/data/fnt8.woff b/experiment/simulation/EE4/iframes/data/fnt8.woff new file mode 100644 index 0000000..a546f79 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/fnt8.woff differ diff --git a/experiment/simulation/EE4/iframes/data/fnt9.woff b/experiment/simulation/EE4/iframes/data/fnt9.woff new file mode 100644 index 0000000..4e78c6d Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/fnt9.woff differ diff --git a/experiment/simulation/EE4/iframes/data/highlighter.cur b/experiment/simulation/EE4/iframes/data/highlighter.cur new file mode 100644 index 0000000..9656c6a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/highlighter.cur differ diff --git a/experiment/simulation/EE4/iframes/data/html5-unsupported.html b/experiment/simulation/EE4/iframes/data/html5-unsupported.html new file mode 100644 index 0000000..787b7f5 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/html5-unsupported.html @@ -0,0 +1,375 @@ + + + + + + + + + + Page Not Available + + + + + + \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/img0.png b/experiment/simulation/EE4/iframes/data/img0.png new file mode 100644 index 0000000..736ccfd Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img0.png differ diff --git a/experiment/simulation/EE4/iframes/data/img1.png b/experiment/simulation/EE4/iframes/data/img1.png new file mode 100644 index 0000000..cdeafe9 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img1.png differ diff --git a/experiment/simulation/EE4/iframes/data/img10.png b/experiment/simulation/EE4/iframes/data/img10.png new file mode 100644 index 0000000..4bf2012 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img10.png differ diff --git a/experiment/simulation/EE4/iframes/data/img100.png b/experiment/simulation/EE4/iframes/data/img100.png new file mode 100644 index 0000000..78d0d47 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img100.png differ diff --git a/experiment/simulation/EE4/iframes/data/img101.png b/experiment/simulation/EE4/iframes/data/img101.png new file mode 100644 index 0000000..8ade93a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img101.png differ diff --git a/experiment/simulation/EE4/iframes/data/img102.png b/experiment/simulation/EE4/iframes/data/img102.png new file mode 100644 index 0000000..c7d47f3 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img102.png differ diff --git a/experiment/simulation/EE4/iframes/data/img103.png b/experiment/simulation/EE4/iframes/data/img103.png new file mode 100644 index 0000000..7e1f1b7 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img103.png differ diff --git a/experiment/simulation/EE4/iframes/data/img104.png b/experiment/simulation/EE4/iframes/data/img104.png new file mode 100644 index 0000000..d5ef1f0 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img104.png differ diff --git a/experiment/simulation/EE4/iframes/data/img105.png b/experiment/simulation/EE4/iframes/data/img105.png new file mode 100644 index 0000000..9c8afb8 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img105.png differ diff --git a/experiment/simulation/EE4/iframes/data/img106.png b/experiment/simulation/EE4/iframes/data/img106.png new file mode 100644 index 0000000..f29a2cd Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img106.png differ diff --git a/experiment/simulation/EE4/iframes/data/img107.png b/experiment/simulation/EE4/iframes/data/img107.png new file mode 100644 index 0000000..6136bdd Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img107.png differ diff --git a/experiment/simulation/EE4/iframes/data/img108.png b/experiment/simulation/EE4/iframes/data/img108.png new file mode 100644 index 0000000..c1a69f5 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img108.png differ diff --git a/experiment/simulation/EE4/iframes/data/img109.png b/experiment/simulation/EE4/iframes/data/img109.png new file mode 100644 index 0000000..6078112 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img109.png differ diff --git a/experiment/simulation/EE4/iframes/data/img11.png b/experiment/simulation/EE4/iframes/data/img11.png new file mode 100644 index 0000000..0b884e8 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img11.png differ diff --git a/experiment/simulation/EE4/iframes/data/img110.png b/experiment/simulation/EE4/iframes/data/img110.png new file mode 100644 index 0000000..fc42a29 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img110.png differ diff --git a/experiment/simulation/EE4/iframes/data/img111.png b/experiment/simulation/EE4/iframes/data/img111.png new file mode 100644 index 0000000..2a77a22 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img111.png differ diff --git a/experiment/simulation/EE4/iframes/data/img112.png b/experiment/simulation/EE4/iframes/data/img112.png new file mode 100644 index 0000000..a52bc25 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img112.png differ diff --git a/experiment/simulation/EE4/iframes/data/img113.png b/experiment/simulation/EE4/iframes/data/img113.png new file mode 100644 index 0000000..c70c879 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img113.png differ diff --git a/experiment/simulation/EE4/iframes/data/img114.png b/experiment/simulation/EE4/iframes/data/img114.png new file mode 100644 index 0000000..8806c5d Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img114.png differ diff --git a/experiment/simulation/EE4/iframes/data/img115.png b/experiment/simulation/EE4/iframes/data/img115.png new file mode 100644 index 0000000..4d49eed Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img115.png differ diff --git a/experiment/simulation/EE4/iframes/data/img116.png b/experiment/simulation/EE4/iframes/data/img116.png new file mode 100644 index 0000000..5433041 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img116.png differ diff --git a/experiment/simulation/EE4/iframes/data/img117.png b/experiment/simulation/EE4/iframes/data/img117.png new file mode 100644 index 0000000..718eef5 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img117.png differ diff --git a/experiment/simulation/EE4/iframes/data/img118.png b/experiment/simulation/EE4/iframes/data/img118.png new file mode 100644 index 0000000..a5077c1 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img118.png differ diff --git a/experiment/simulation/EE4/iframes/data/img119.png b/experiment/simulation/EE4/iframes/data/img119.png new file mode 100644 index 0000000..9a6553f Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img119.png differ diff --git a/experiment/simulation/EE4/iframes/data/img12.png b/experiment/simulation/EE4/iframes/data/img12.png new file mode 100644 index 0000000..f8c2cfd Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img12.png differ diff --git a/experiment/simulation/EE4/iframes/data/img120.png b/experiment/simulation/EE4/iframes/data/img120.png new file mode 100644 index 0000000..c8ba191 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img120.png differ diff --git a/experiment/simulation/EE4/iframes/data/img121.png b/experiment/simulation/EE4/iframes/data/img121.png new file mode 100644 index 0000000..72bbf04 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img121.png differ diff --git a/experiment/simulation/EE4/iframes/data/img122.png b/experiment/simulation/EE4/iframes/data/img122.png new file mode 100644 index 0000000..611c7d4 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img122.png differ diff --git a/experiment/simulation/EE4/iframes/data/img123.png b/experiment/simulation/EE4/iframes/data/img123.png new file mode 100644 index 0000000..d1d8a39 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img123.png differ diff --git a/experiment/simulation/EE4/iframes/data/img124.png b/experiment/simulation/EE4/iframes/data/img124.png new file mode 100644 index 0000000..f662b59 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img124.png differ diff --git a/experiment/simulation/EE4/iframes/data/img125.png b/experiment/simulation/EE4/iframes/data/img125.png new file mode 100644 index 0000000..1288b61 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img125.png differ diff --git a/experiment/simulation/EE4/iframes/data/img126.png b/experiment/simulation/EE4/iframes/data/img126.png new file mode 100644 index 0000000..aba12c6 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img126.png differ diff --git a/experiment/simulation/EE4/iframes/data/img127.png b/experiment/simulation/EE4/iframes/data/img127.png new file mode 100644 index 0000000..a608244 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img127.png differ diff --git a/experiment/simulation/EE4/iframes/data/img128.png b/experiment/simulation/EE4/iframes/data/img128.png new file mode 100644 index 0000000..28773cb Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img128.png differ diff --git a/experiment/simulation/EE4/iframes/data/img129.png b/experiment/simulation/EE4/iframes/data/img129.png new file mode 100644 index 0000000..74996ea Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img129.png differ diff --git a/experiment/simulation/EE4/iframes/data/img13.png b/experiment/simulation/EE4/iframes/data/img13.png new file mode 100644 index 0000000..1bd3e91 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img13.png differ diff --git a/experiment/simulation/EE4/iframes/data/img130.png b/experiment/simulation/EE4/iframes/data/img130.png new file mode 100644 index 0000000..e198587 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img130.png differ diff --git a/experiment/simulation/EE4/iframes/data/img131.png b/experiment/simulation/EE4/iframes/data/img131.png new file mode 100644 index 0000000..a9c69fc Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img131.png differ diff --git a/experiment/simulation/EE4/iframes/data/img132.png b/experiment/simulation/EE4/iframes/data/img132.png new file mode 100644 index 0000000..e9e1392 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img132.png differ diff --git a/experiment/simulation/EE4/iframes/data/img133.png b/experiment/simulation/EE4/iframes/data/img133.png new file mode 100644 index 0000000..a8d8eb1 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img133.png differ diff --git a/experiment/simulation/EE4/iframes/data/img134.png b/experiment/simulation/EE4/iframes/data/img134.png new file mode 100644 index 0000000..051e59a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img134.png differ diff --git a/experiment/simulation/EE4/iframes/data/img135.png b/experiment/simulation/EE4/iframes/data/img135.png new file mode 100644 index 0000000..79a6877 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img135.png differ diff --git a/experiment/simulation/EE4/iframes/data/img136.png b/experiment/simulation/EE4/iframes/data/img136.png new file mode 100644 index 0000000..f744855 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img136.png differ diff --git a/experiment/simulation/EE4/iframes/data/img137.png b/experiment/simulation/EE4/iframes/data/img137.png new file mode 100644 index 0000000..b556cd9 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img137.png differ diff --git a/experiment/simulation/EE4/iframes/data/img138.png b/experiment/simulation/EE4/iframes/data/img138.png new file mode 100644 index 0000000..43e889f Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img138.png differ diff --git a/experiment/simulation/EE4/iframes/data/img139.png b/experiment/simulation/EE4/iframes/data/img139.png new file mode 100644 index 0000000..4db8459 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img139.png differ diff --git a/experiment/simulation/EE4/iframes/data/img14.jpg b/experiment/simulation/EE4/iframes/data/img14.jpg new file mode 100644 index 0000000..697a03a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img14.jpg differ diff --git a/experiment/simulation/EE4/iframes/data/img140.png b/experiment/simulation/EE4/iframes/data/img140.png new file mode 100644 index 0000000..f95fc21 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img140.png differ diff --git a/experiment/simulation/EE4/iframes/data/img141.png b/experiment/simulation/EE4/iframes/data/img141.png new file mode 100644 index 0000000..56a8bff Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img141.png differ diff --git a/experiment/simulation/EE4/iframes/data/img142.png b/experiment/simulation/EE4/iframes/data/img142.png new file mode 100644 index 0000000..53ad844 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img142.png differ diff --git a/experiment/simulation/EE4/iframes/data/img143.png b/experiment/simulation/EE4/iframes/data/img143.png new file mode 100644 index 0000000..f88f9e7 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img143.png differ diff --git a/experiment/simulation/EE4/iframes/data/img144.png b/experiment/simulation/EE4/iframes/data/img144.png new file mode 100644 index 0000000..9617b77 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img144.png differ diff --git a/experiment/simulation/EE4/iframes/data/img145.png b/experiment/simulation/EE4/iframes/data/img145.png new file mode 100644 index 0000000..cf925a3 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img145.png differ diff --git a/experiment/simulation/EE4/iframes/data/img146.png b/experiment/simulation/EE4/iframes/data/img146.png new file mode 100644 index 0000000..b04143a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img146.png differ diff --git a/experiment/simulation/EE4/iframes/data/img147.png b/experiment/simulation/EE4/iframes/data/img147.png new file mode 100644 index 0000000..52951ba Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img147.png differ diff --git a/experiment/simulation/EE4/iframes/data/img148.png b/experiment/simulation/EE4/iframes/data/img148.png new file mode 100644 index 0000000..b5d0cc3 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img148.png differ diff --git a/experiment/simulation/EE4/iframes/data/img149.png b/experiment/simulation/EE4/iframes/data/img149.png new file mode 100644 index 0000000..811aed4 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img149.png differ diff --git a/experiment/simulation/EE4/iframes/data/img15.png b/experiment/simulation/EE4/iframes/data/img15.png new file mode 100644 index 0000000..7701eb2 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img15.png differ diff --git a/experiment/simulation/EE4/iframes/data/img150.png b/experiment/simulation/EE4/iframes/data/img150.png new file mode 100644 index 0000000..af0b250 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img150.png differ diff --git a/experiment/simulation/EE4/iframes/data/img151.png b/experiment/simulation/EE4/iframes/data/img151.png new file mode 100644 index 0000000..996ffd0 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img151.png differ diff --git a/experiment/simulation/EE4/iframes/data/img152.png b/experiment/simulation/EE4/iframes/data/img152.png new file mode 100644 index 0000000..0dcdd67 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img152.png differ diff --git a/experiment/simulation/EE4/iframes/data/img153.png b/experiment/simulation/EE4/iframes/data/img153.png new file mode 100644 index 0000000..859e8b6 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img153.png differ diff --git a/experiment/simulation/EE4/iframes/data/img154.png b/experiment/simulation/EE4/iframes/data/img154.png new file mode 100644 index 0000000..f6858f6 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img154.png differ diff --git a/experiment/simulation/EE4/iframes/data/img155.png b/experiment/simulation/EE4/iframes/data/img155.png new file mode 100644 index 0000000..ce1b604 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img155.png differ diff --git a/experiment/simulation/EE4/iframes/data/img156.png b/experiment/simulation/EE4/iframes/data/img156.png new file mode 100644 index 0000000..0357397 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img156.png differ diff --git a/experiment/simulation/EE4/iframes/data/img157.png b/experiment/simulation/EE4/iframes/data/img157.png new file mode 100644 index 0000000..d984fcf Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img157.png differ diff --git a/experiment/simulation/EE4/iframes/data/img158.png b/experiment/simulation/EE4/iframes/data/img158.png new file mode 100644 index 0000000..c8cd4db Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img158.png differ diff --git a/experiment/simulation/EE4/iframes/data/img159.png b/experiment/simulation/EE4/iframes/data/img159.png new file mode 100644 index 0000000..d4006c6 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img159.png differ diff --git a/experiment/simulation/EE4/iframes/data/img16.png b/experiment/simulation/EE4/iframes/data/img16.png new file mode 100644 index 0000000..28d8221 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img16.png differ diff --git a/experiment/simulation/EE4/iframes/data/img160.png b/experiment/simulation/EE4/iframes/data/img160.png new file mode 100644 index 0000000..d096146 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img160.png differ diff --git a/experiment/simulation/EE4/iframes/data/img161.png b/experiment/simulation/EE4/iframes/data/img161.png new file mode 100644 index 0000000..452fee6 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img161.png differ diff --git a/experiment/simulation/EE4/iframes/data/img162.png b/experiment/simulation/EE4/iframes/data/img162.png new file mode 100644 index 0000000..aad720a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img162.png differ diff --git a/experiment/simulation/EE4/iframes/data/img163.png b/experiment/simulation/EE4/iframes/data/img163.png new file mode 100644 index 0000000..55211e1 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img163.png differ diff --git a/experiment/simulation/EE4/iframes/data/img164.png b/experiment/simulation/EE4/iframes/data/img164.png new file mode 100644 index 0000000..c7cab0e Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img164.png differ diff --git a/experiment/simulation/EE4/iframes/data/img165.png b/experiment/simulation/EE4/iframes/data/img165.png new file mode 100644 index 0000000..d3b26f6 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img165.png differ diff --git a/experiment/simulation/EE4/iframes/data/img166.png b/experiment/simulation/EE4/iframes/data/img166.png new file mode 100644 index 0000000..9bc8937 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img166.png differ diff --git a/experiment/simulation/EE4/iframes/data/img167.png b/experiment/simulation/EE4/iframes/data/img167.png new file mode 100644 index 0000000..3b4181a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img167.png differ diff --git a/experiment/simulation/EE4/iframes/data/img168.png b/experiment/simulation/EE4/iframes/data/img168.png new file mode 100644 index 0000000..16d1939 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img168.png differ diff --git a/experiment/simulation/EE4/iframes/data/img169.png b/experiment/simulation/EE4/iframes/data/img169.png new file mode 100644 index 0000000..4bd0f6e Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img169.png differ diff --git a/experiment/simulation/EE4/iframes/data/img17.png b/experiment/simulation/EE4/iframes/data/img17.png new file mode 100644 index 0000000..d314efe Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img17.png differ diff --git a/experiment/simulation/EE4/iframes/data/img170.png b/experiment/simulation/EE4/iframes/data/img170.png new file mode 100644 index 0000000..f6a3d72 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img170.png differ diff --git a/experiment/simulation/EE4/iframes/data/img171.png b/experiment/simulation/EE4/iframes/data/img171.png new file mode 100644 index 0000000..35a6390 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img171.png differ diff --git a/experiment/simulation/EE4/iframes/data/img172.png b/experiment/simulation/EE4/iframes/data/img172.png new file mode 100644 index 0000000..87fd201 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img172.png differ diff --git a/experiment/simulation/EE4/iframes/data/img173.png b/experiment/simulation/EE4/iframes/data/img173.png new file mode 100644 index 0000000..624561c Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img173.png differ diff --git a/experiment/simulation/EE4/iframes/data/img174.png b/experiment/simulation/EE4/iframes/data/img174.png new file mode 100644 index 0000000..fc00125 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img174.png differ diff --git a/experiment/simulation/EE4/iframes/data/img175.png b/experiment/simulation/EE4/iframes/data/img175.png new file mode 100644 index 0000000..569c455 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img175.png differ diff --git a/experiment/simulation/EE4/iframes/data/img176.png b/experiment/simulation/EE4/iframes/data/img176.png new file mode 100644 index 0000000..f9e8b3f Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img176.png differ diff --git a/experiment/simulation/EE4/iframes/data/img177.png b/experiment/simulation/EE4/iframes/data/img177.png new file mode 100644 index 0000000..8098ef2 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img177.png differ diff --git a/experiment/simulation/EE4/iframes/data/img178.png b/experiment/simulation/EE4/iframes/data/img178.png new file mode 100644 index 0000000..9efe52d Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img178.png differ diff --git a/experiment/simulation/EE4/iframes/data/img179.png b/experiment/simulation/EE4/iframes/data/img179.png new file mode 100644 index 0000000..72d6db5 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img179.png differ diff --git a/experiment/simulation/EE4/iframes/data/img18.png b/experiment/simulation/EE4/iframes/data/img18.png new file mode 100644 index 0000000..539b554 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img18.png differ diff --git a/experiment/simulation/EE4/iframes/data/img180.png b/experiment/simulation/EE4/iframes/data/img180.png new file mode 100644 index 0000000..04fb879 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img180.png differ diff --git a/experiment/simulation/EE4/iframes/data/img181.png b/experiment/simulation/EE4/iframes/data/img181.png new file mode 100644 index 0000000..8bb4de0 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img181.png differ diff --git a/experiment/simulation/EE4/iframes/data/img182.png b/experiment/simulation/EE4/iframes/data/img182.png new file mode 100644 index 0000000..ab41ed0 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img182.png differ diff --git a/experiment/simulation/EE4/iframes/data/img183.png b/experiment/simulation/EE4/iframes/data/img183.png new file mode 100644 index 0000000..dd9a746 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img183.png differ diff --git a/experiment/simulation/EE4/iframes/data/img184.png b/experiment/simulation/EE4/iframes/data/img184.png new file mode 100644 index 0000000..e47a8d9 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img184.png differ diff --git a/experiment/simulation/EE4/iframes/data/img185.png b/experiment/simulation/EE4/iframes/data/img185.png new file mode 100644 index 0000000..eaf1e2a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img185.png differ diff --git a/experiment/simulation/EE4/iframes/data/img186.png b/experiment/simulation/EE4/iframes/data/img186.png new file mode 100644 index 0000000..417ded2 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img186.png differ diff --git a/experiment/simulation/EE4/iframes/data/img187.png b/experiment/simulation/EE4/iframes/data/img187.png new file mode 100644 index 0000000..b917b17 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img187.png differ diff --git a/experiment/simulation/EE4/iframes/data/img188.png b/experiment/simulation/EE4/iframes/data/img188.png new file mode 100644 index 0000000..590193c Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img188.png differ diff --git a/experiment/simulation/EE4/iframes/data/img189.png b/experiment/simulation/EE4/iframes/data/img189.png new file mode 100644 index 0000000..c33cb73 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img189.png differ diff --git a/experiment/simulation/EE4/iframes/data/img19.png b/experiment/simulation/EE4/iframes/data/img19.png new file mode 100644 index 0000000..5d1b28b Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img19.png differ diff --git a/experiment/simulation/EE4/iframes/data/img190.png b/experiment/simulation/EE4/iframes/data/img190.png new file mode 100644 index 0000000..b278e28 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img190.png differ diff --git a/experiment/simulation/EE4/iframes/data/img191.png b/experiment/simulation/EE4/iframes/data/img191.png new file mode 100644 index 0000000..96e0fca Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img191.png differ diff --git a/experiment/simulation/EE4/iframes/data/img192.png b/experiment/simulation/EE4/iframes/data/img192.png new file mode 100644 index 0000000..fe91fb8 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img192.png differ diff --git a/experiment/simulation/EE4/iframes/data/img193.png b/experiment/simulation/EE4/iframes/data/img193.png new file mode 100644 index 0000000..216c43c Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img193.png differ diff --git a/experiment/simulation/EE4/iframes/data/img194.png b/experiment/simulation/EE4/iframes/data/img194.png new file mode 100644 index 0000000..faab1fd Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img194.png differ diff --git a/experiment/simulation/EE4/iframes/data/img195.png b/experiment/simulation/EE4/iframes/data/img195.png new file mode 100644 index 0000000..9b6b9ef Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img195.png differ diff --git a/experiment/simulation/EE4/iframes/data/img196.png b/experiment/simulation/EE4/iframes/data/img196.png new file mode 100644 index 0000000..de84574 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img196.png differ diff --git a/experiment/simulation/EE4/iframes/data/img197.png b/experiment/simulation/EE4/iframes/data/img197.png new file mode 100644 index 0000000..0c80522 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img197.png differ diff --git a/experiment/simulation/EE4/iframes/data/img198.png b/experiment/simulation/EE4/iframes/data/img198.png new file mode 100644 index 0000000..91f7f6f Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img198.png differ diff --git a/experiment/simulation/EE4/iframes/data/img199.png b/experiment/simulation/EE4/iframes/data/img199.png new file mode 100644 index 0000000..cb9dc7c Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img199.png differ diff --git a/experiment/simulation/EE4/iframes/data/img2.png b/experiment/simulation/EE4/iframes/data/img2.png new file mode 100644 index 0000000..4a332c2 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img2.png differ diff --git a/experiment/simulation/EE4/iframes/data/img20.png b/experiment/simulation/EE4/iframes/data/img20.png new file mode 100644 index 0000000..6947a02 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img20.png differ diff --git a/experiment/simulation/EE4/iframes/data/img200.png b/experiment/simulation/EE4/iframes/data/img200.png new file mode 100644 index 0000000..9f87203 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img200.png differ diff --git a/experiment/simulation/EE4/iframes/data/img201.png b/experiment/simulation/EE4/iframes/data/img201.png new file mode 100644 index 0000000..8cec636 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img201.png differ diff --git a/experiment/simulation/EE4/iframes/data/img202.png b/experiment/simulation/EE4/iframes/data/img202.png new file mode 100644 index 0000000..20a91ca Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img202.png differ diff --git a/experiment/simulation/EE4/iframes/data/img203.png b/experiment/simulation/EE4/iframes/data/img203.png new file mode 100644 index 0000000..a3ab5cc Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img203.png differ diff --git a/experiment/simulation/EE4/iframes/data/img204.png b/experiment/simulation/EE4/iframes/data/img204.png new file mode 100644 index 0000000..d60beb6 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img204.png differ diff --git a/experiment/simulation/EE4/iframes/data/img205.png b/experiment/simulation/EE4/iframes/data/img205.png new file mode 100644 index 0000000..50c9ace Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img205.png differ diff --git a/experiment/simulation/EE4/iframes/data/img206.png b/experiment/simulation/EE4/iframes/data/img206.png new file mode 100644 index 0000000..050e30d Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img206.png differ diff --git a/experiment/simulation/EE4/iframes/data/img207.png b/experiment/simulation/EE4/iframes/data/img207.png new file mode 100644 index 0000000..96532b7 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img207.png differ diff --git a/experiment/simulation/EE4/iframes/data/img208.png b/experiment/simulation/EE4/iframes/data/img208.png new file mode 100644 index 0000000..bb403ff Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img208.png differ diff --git a/experiment/simulation/EE4/iframes/data/img209.png b/experiment/simulation/EE4/iframes/data/img209.png new file mode 100644 index 0000000..238cd3c Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img209.png differ diff --git a/experiment/simulation/EE4/iframes/data/img21.png b/experiment/simulation/EE4/iframes/data/img21.png new file mode 100644 index 0000000..8e7ddd8 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img21.png differ diff --git a/experiment/simulation/EE4/iframes/data/img210.png b/experiment/simulation/EE4/iframes/data/img210.png new file mode 100644 index 0000000..68f85e1 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img210.png differ diff --git a/experiment/simulation/EE4/iframes/data/img211.png b/experiment/simulation/EE4/iframes/data/img211.png new file mode 100644 index 0000000..cb985c1 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img211.png differ diff --git a/experiment/simulation/EE4/iframes/data/img212.png b/experiment/simulation/EE4/iframes/data/img212.png new file mode 100644 index 0000000..ef2a905 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img212.png differ diff --git a/experiment/simulation/EE4/iframes/data/img213.png b/experiment/simulation/EE4/iframes/data/img213.png new file mode 100644 index 0000000..ac359f5 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img213.png differ diff --git a/experiment/simulation/EE4/iframes/data/img214.png b/experiment/simulation/EE4/iframes/data/img214.png new file mode 100644 index 0000000..35abcc5 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img214.png differ diff --git a/experiment/simulation/EE4/iframes/data/img215.png b/experiment/simulation/EE4/iframes/data/img215.png new file mode 100644 index 0000000..847a991 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img215.png differ diff --git a/experiment/simulation/EE4/iframes/data/img216.png b/experiment/simulation/EE4/iframes/data/img216.png new file mode 100644 index 0000000..c7a5861 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img216.png differ diff --git a/experiment/simulation/EE4/iframes/data/img217.png b/experiment/simulation/EE4/iframes/data/img217.png new file mode 100644 index 0000000..73653c1 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img217.png differ diff --git a/experiment/simulation/EE4/iframes/data/img218.png b/experiment/simulation/EE4/iframes/data/img218.png new file mode 100644 index 0000000..cae13ae Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img218.png differ diff --git a/experiment/simulation/EE4/iframes/data/img219.png b/experiment/simulation/EE4/iframes/data/img219.png new file mode 100644 index 0000000..03ef945 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img219.png differ diff --git a/experiment/simulation/EE4/iframes/data/img22.png b/experiment/simulation/EE4/iframes/data/img22.png new file mode 100644 index 0000000..fe0925c Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img22.png differ diff --git a/experiment/simulation/EE4/iframes/data/img220.png b/experiment/simulation/EE4/iframes/data/img220.png new file mode 100644 index 0000000..936d938 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img220.png differ diff --git a/experiment/simulation/EE4/iframes/data/img221.png b/experiment/simulation/EE4/iframes/data/img221.png new file mode 100644 index 0000000..c65bb21 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img221.png differ diff --git a/experiment/simulation/EE4/iframes/data/img222.png b/experiment/simulation/EE4/iframes/data/img222.png new file mode 100644 index 0000000..d3e2e7b Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img222.png differ diff --git a/experiment/simulation/EE4/iframes/data/img223.png b/experiment/simulation/EE4/iframes/data/img223.png new file mode 100644 index 0000000..5c1a1c5 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img223.png differ diff --git a/experiment/simulation/EE4/iframes/data/img224.png b/experiment/simulation/EE4/iframes/data/img224.png new file mode 100644 index 0000000..cb29693 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img224.png differ diff --git a/experiment/simulation/EE4/iframes/data/img225.png b/experiment/simulation/EE4/iframes/data/img225.png new file mode 100644 index 0000000..151b45e Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img225.png differ diff --git a/experiment/simulation/EE4/iframes/data/img226.png b/experiment/simulation/EE4/iframes/data/img226.png new file mode 100644 index 0000000..3c1b665 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img226.png differ diff --git a/experiment/simulation/EE4/iframes/data/img227.png b/experiment/simulation/EE4/iframes/data/img227.png new file mode 100644 index 0000000..94e7da9 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img227.png differ diff --git a/experiment/simulation/EE4/iframes/data/img228.png b/experiment/simulation/EE4/iframes/data/img228.png new file mode 100644 index 0000000..feaad78 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img228.png differ diff --git a/experiment/simulation/EE4/iframes/data/img229.png b/experiment/simulation/EE4/iframes/data/img229.png new file mode 100644 index 0000000..eeaa6cb Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img229.png differ diff --git a/experiment/simulation/EE4/iframes/data/img23.png b/experiment/simulation/EE4/iframes/data/img23.png new file mode 100644 index 0000000..46b8cd3 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img23.png differ diff --git a/experiment/simulation/EE4/iframes/data/img230.png b/experiment/simulation/EE4/iframes/data/img230.png new file mode 100644 index 0000000..cb4b57a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img230.png differ diff --git a/experiment/simulation/EE4/iframes/data/img231.png b/experiment/simulation/EE4/iframes/data/img231.png new file mode 100644 index 0000000..e8e9d7d Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img231.png differ diff --git a/experiment/simulation/EE4/iframes/data/img232.png b/experiment/simulation/EE4/iframes/data/img232.png new file mode 100644 index 0000000..faf9305 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img232.png differ diff --git a/experiment/simulation/EE4/iframes/data/img233.png b/experiment/simulation/EE4/iframes/data/img233.png new file mode 100644 index 0000000..0c15da8 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img233.png differ diff --git a/experiment/simulation/EE4/iframes/data/img234.png b/experiment/simulation/EE4/iframes/data/img234.png new file mode 100644 index 0000000..fc162f1 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img234.png differ diff --git a/experiment/simulation/EE4/iframes/data/img235.png b/experiment/simulation/EE4/iframes/data/img235.png new file mode 100644 index 0000000..515bb97 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img235.png differ diff --git a/experiment/simulation/EE4/iframes/data/img236.png b/experiment/simulation/EE4/iframes/data/img236.png new file mode 100644 index 0000000..afee920 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img236.png differ diff --git a/experiment/simulation/EE4/iframes/data/img237.png b/experiment/simulation/EE4/iframes/data/img237.png new file mode 100644 index 0000000..3f50114 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img237.png differ diff --git a/experiment/simulation/EE4/iframes/data/img238.png b/experiment/simulation/EE4/iframes/data/img238.png new file mode 100644 index 0000000..0c52f8f Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img238.png differ diff --git a/experiment/simulation/EE4/iframes/data/img239.png b/experiment/simulation/EE4/iframes/data/img239.png new file mode 100644 index 0000000..5d1f843 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img239.png differ diff --git a/experiment/simulation/EE4/iframes/data/img24.png b/experiment/simulation/EE4/iframes/data/img24.png new file mode 100644 index 0000000..a1788d6 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img24.png differ diff --git a/experiment/simulation/EE4/iframes/data/img240.png b/experiment/simulation/EE4/iframes/data/img240.png new file mode 100644 index 0000000..b0edc42 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img240.png differ diff --git a/experiment/simulation/EE4/iframes/data/img241.png b/experiment/simulation/EE4/iframes/data/img241.png new file mode 100644 index 0000000..ba96ffe Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img241.png differ diff --git a/experiment/simulation/EE4/iframes/data/img242.png b/experiment/simulation/EE4/iframes/data/img242.png new file mode 100644 index 0000000..28a04f2 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img242.png differ diff --git a/experiment/simulation/EE4/iframes/data/img243.png b/experiment/simulation/EE4/iframes/data/img243.png new file mode 100644 index 0000000..66b8028 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img243.png differ diff --git a/experiment/simulation/EE4/iframes/data/img244.png b/experiment/simulation/EE4/iframes/data/img244.png new file mode 100644 index 0000000..a3a2d6e Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img244.png differ diff --git a/experiment/simulation/EE4/iframes/data/img245.png b/experiment/simulation/EE4/iframes/data/img245.png new file mode 100644 index 0000000..4843406 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img245.png differ diff --git a/experiment/simulation/EE4/iframes/data/img246.png b/experiment/simulation/EE4/iframes/data/img246.png new file mode 100644 index 0000000..a87e186 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img246.png differ diff --git a/experiment/simulation/EE4/iframes/data/img247.png b/experiment/simulation/EE4/iframes/data/img247.png new file mode 100644 index 0000000..086c437 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img247.png differ diff --git a/experiment/simulation/EE4/iframes/data/img248.png b/experiment/simulation/EE4/iframes/data/img248.png new file mode 100644 index 0000000..97e1e8d Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img248.png differ diff --git a/experiment/simulation/EE4/iframes/data/img249.png b/experiment/simulation/EE4/iframes/data/img249.png new file mode 100644 index 0000000..3361dce Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img249.png differ diff --git a/experiment/simulation/EE4/iframes/data/img25.png b/experiment/simulation/EE4/iframes/data/img25.png new file mode 100644 index 0000000..5c3948a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img25.png differ diff --git a/experiment/simulation/EE4/iframes/data/img250.png b/experiment/simulation/EE4/iframes/data/img250.png new file mode 100644 index 0000000..25c936d Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img250.png differ diff --git a/experiment/simulation/EE4/iframes/data/img251.png b/experiment/simulation/EE4/iframes/data/img251.png new file mode 100644 index 0000000..5c132f7 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img251.png differ diff --git a/experiment/simulation/EE4/iframes/data/img252.png b/experiment/simulation/EE4/iframes/data/img252.png new file mode 100644 index 0000000..f024d3e Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img252.png differ diff --git a/experiment/simulation/EE4/iframes/data/img253.png b/experiment/simulation/EE4/iframes/data/img253.png new file mode 100644 index 0000000..0e1d8fd Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img253.png differ diff --git a/experiment/simulation/EE4/iframes/data/img254.png b/experiment/simulation/EE4/iframes/data/img254.png new file mode 100644 index 0000000..577c5a3 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img254.png differ diff --git a/experiment/simulation/EE4/iframes/data/img255.png b/experiment/simulation/EE4/iframes/data/img255.png new file mode 100644 index 0000000..071e2df Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img255.png differ diff --git a/experiment/simulation/EE4/iframes/data/img256.png b/experiment/simulation/EE4/iframes/data/img256.png new file mode 100644 index 0000000..a9b9843 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img256.png differ diff --git a/experiment/simulation/EE4/iframes/data/img257.png b/experiment/simulation/EE4/iframes/data/img257.png new file mode 100644 index 0000000..16eac56 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img257.png differ diff --git a/experiment/simulation/EE4/iframes/data/img258.png b/experiment/simulation/EE4/iframes/data/img258.png new file mode 100644 index 0000000..dcdd775 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img258.png differ diff --git a/experiment/simulation/EE4/iframes/data/img259.png b/experiment/simulation/EE4/iframes/data/img259.png new file mode 100644 index 0000000..d757d48 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img259.png differ diff --git a/experiment/simulation/EE4/iframes/data/img26.png b/experiment/simulation/EE4/iframes/data/img26.png new file mode 100644 index 0000000..867aa23 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img26.png differ diff --git a/experiment/simulation/EE4/iframes/data/img260.png b/experiment/simulation/EE4/iframes/data/img260.png new file mode 100644 index 0000000..59da1df Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img260.png differ diff --git a/experiment/simulation/EE4/iframes/data/img261.png b/experiment/simulation/EE4/iframes/data/img261.png new file mode 100644 index 0000000..b7d6d4d Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img261.png differ diff --git a/experiment/simulation/EE4/iframes/data/img262.png b/experiment/simulation/EE4/iframes/data/img262.png new file mode 100644 index 0000000..49a36f3 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img262.png differ diff --git a/experiment/simulation/EE4/iframes/data/img263.png b/experiment/simulation/EE4/iframes/data/img263.png new file mode 100644 index 0000000..b765cd4 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img263.png differ diff --git a/experiment/simulation/EE4/iframes/data/img264.png b/experiment/simulation/EE4/iframes/data/img264.png new file mode 100644 index 0000000..85fe42b Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img264.png differ diff --git a/experiment/simulation/EE4/iframes/data/img265.png b/experiment/simulation/EE4/iframes/data/img265.png new file mode 100644 index 0000000..3c89406 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img265.png differ diff --git a/experiment/simulation/EE4/iframes/data/img266.png b/experiment/simulation/EE4/iframes/data/img266.png new file mode 100644 index 0000000..5acc02f Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img266.png differ diff --git a/experiment/simulation/EE4/iframes/data/img267.png b/experiment/simulation/EE4/iframes/data/img267.png new file mode 100644 index 0000000..7928e25 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img267.png differ diff --git a/experiment/simulation/EE4/iframes/data/img268.png b/experiment/simulation/EE4/iframes/data/img268.png new file mode 100644 index 0000000..2e37f6b Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img268.png differ diff --git a/experiment/simulation/EE4/iframes/data/img269.png b/experiment/simulation/EE4/iframes/data/img269.png new file mode 100644 index 0000000..65af341 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img269.png differ diff --git a/experiment/simulation/EE4/iframes/data/img27.png b/experiment/simulation/EE4/iframes/data/img27.png new file mode 100644 index 0000000..be9bba2 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img27.png differ diff --git a/experiment/simulation/EE4/iframes/data/img270.png b/experiment/simulation/EE4/iframes/data/img270.png new file mode 100644 index 0000000..2af9b1e Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img270.png differ diff --git a/experiment/simulation/EE4/iframes/data/img271.png b/experiment/simulation/EE4/iframes/data/img271.png new file mode 100644 index 0000000..4b54fa7 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img271.png differ diff --git a/experiment/simulation/EE4/iframes/data/img272.png b/experiment/simulation/EE4/iframes/data/img272.png new file mode 100644 index 0000000..b1f5828 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img272.png differ diff --git a/experiment/simulation/EE4/iframes/data/img273.png b/experiment/simulation/EE4/iframes/data/img273.png new file mode 100644 index 0000000..094f80d Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img273.png differ diff --git a/experiment/simulation/EE4/iframes/data/img274.png b/experiment/simulation/EE4/iframes/data/img274.png new file mode 100644 index 0000000..b9aa282 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img274.png differ diff --git a/experiment/simulation/EE4/iframes/data/img275.png b/experiment/simulation/EE4/iframes/data/img275.png new file mode 100644 index 0000000..15d79fa Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img275.png differ diff --git a/experiment/simulation/EE4/iframes/data/img276.png b/experiment/simulation/EE4/iframes/data/img276.png new file mode 100644 index 0000000..0728c45 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img276.png differ diff --git a/experiment/simulation/EE4/iframes/data/img277.png b/experiment/simulation/EE4/iframes/data/img277.png new file mode 100644 index 0000000..d8ad2b6 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img277.png differ diff --git a/experiment/simulation/EE4/iframes/data/img278.png b/experiment/simulation/EE4/iframes/data/img278.png new file mode 100644 index 0000000..825a3d9 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img278.png differ diff --git a/experiment/simulation/EE4/iframes/data/img279.png b/experiment/simulation/EE4/iframes/data/img279.png new file mode 100644 index 0000000..b76af07 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img279.png differ diff --git a/experiment/simulation/EE4/iframes/data/img28.png b/experiment/simulation/EE4/iframes/data/img28.png new file mode 100644 index 0000000..a4d5663 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img28.png differ diff --git a/experiment/simulation/EE4/iframes/data/img280.png b/experiment/simulation/EE4/iframes/data/img280.png new file mode 100644 index 0000000..37174d1 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img280.png differ diff --git a/experiment/simulation/EE4/iframes/data/img281.png b/experiment/simulation/EE4/iframes/data/img281.png new file mode 100644 index 0000000..2c0977d Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img281.png differ diff --git a/experiment/simulation/EE4/iframes/data/img282.png b/experiment/simulation/EE4/iframes/data/img282.png new file mode 100644 index 0000000..2ba4dc9 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img282.png differ diff --git a/experiment/simulation/EE4/iframes/data/img283.png b/experiment/simulation/EE4/iframes/data/img283.png new file mode 100644 index 0000000..5c42bf2 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img283.png differ diff --git a/experiment/simulation/EE4/iframes/data/img284.png b/experiment/simulation/EE4/iframes/data/img284.png new file mode 100644 index 0000000..e4d0f20 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img284.png differ diff --git a/experiment/simulation/EE4/iframes/data/img285.png b/experiment/simulation/EE4/iframes/data/img285.png new file mode 100644 index 0000000..efb6f65 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img285.png differ diff --git a/experiment/simulation/EE4/iframes/data/img286.png b/experiment/simulation/EE4/iframes/data/img286.png new file mode 100644 index 0000000..b3a37eb Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img286.png differ diff --git a/experiment/simulation/EE4/iframes/data/img287.png b/experiment/simulation/EE4/iframes/data/img287.png new file mode 100644 index 0000000..e6451f7 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img287.png differ diff --git a/experiment/simulation/EE4/iframes/data/img288.png b/experiment/simulation/EE4/iframes/data/img288.png new file mode 100644 index 0000000..a645db9 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img288.png differ diff --git a/experiment/simulation/EE4/iframes/data/img289.png b/experiment/simulation/EE4/iframes/data/img289.png new file mode 100644 index 0000000..08a5706 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img289.png differ diff --git a/experiment/simulation/EE4/iframes/data/img29.png b/experiment/simulation/EE4/iframes/data/img29.png new file mode 100644 index 0000000..7eede7e Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img29.png differ diff --git a/experiment/simulation/EE4/iframes/data/img290.png b/experiment/simulation/EE4/iframes/data/img290.png new file mode 100644 index 0000000..5322c2b Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img290.png differ diff --git a/experiment/simulation/EE4/iframes/data/img291.png b/experiment/simulation/EE4/iframes/data/img291.png new file mode 100644 index 0000000..d00e1c7 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img291.png differ diff --git a/experiment/simulation/EE4/iframes/data/img292.png b/experiment/simulation/EE4/iframes/data/img292.png new file mode 100644 index 0000000..de93a31 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img292.png differ diff --git a/experiment/simulation/EE4/iframes/data/img293.png b/experiment/simulation/EE4/iframes/data/img293.png new file mode 100644 index 0000000..a165027 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img293.png differ diff --git a/experiment/simulation/EE4/iframes/data/img294.png b/experiment/simulation/EE4/iframes/data/img294.png new file mode 100644 index 0000000..76323e5 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img294.png differ diff --git a/experiment/simulation/EE4/iframes/data/img295.png b/experiment/simulation/EE4/iframes/data/img295.png new file mode 100644 index 0000000..c65e94c Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img295.png differ diff --git a/experiment/simulation/EE4/iframes/data/img296.png b/experiment/simulation/EE4/iframes/data/img296.png new file mode 100644 index 0000000..de80039 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img296.png differ diff --git a/experiment/simulation/EE4/iframes/data/img297.png b/experiment/simulation/EE4/iframes/data/img297.png new file mode 100644 index 0000000..a9deae6 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img297.png differ diff --git a/experiment/simulation/EE4/iframes/data/img298.png b/experiment/simulation/EE4/iframes/data/img298.png new file mode 100644 index 0000000..dd9b4f9 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img298.png differ diff --git a/experiment/simulation/EE4/iframes/data/img299.png b/experiment/simulation/EE4/iframes/data/img299.png new file mode 100644 index 0000000..3455e9a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img299.png differ diff --git a/experiment/simulation/EE4/iframes/data/img3.png b/experiment/simulation/EE4/iframes/data/img3.png new file mode 100644 index 0000000..035266b Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img3.png differ diff --git a/experiment/simulation/EE4/iframes/data/img30.png b/experiment/simulation/EE4/iframes/data/img30.png new file mode 100644 index 0000000..5673f1b Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img30.png differ diff --git a/experiment/simulation/EE4/iframes/data/img300.png b/experiment/simulation/EE4/iframes/data/img300.png new file mode 100644 index 0000000..8f96983 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img300.png differ diff --git a/experiment/simulation/EE4/iframes/data/img301.png b/experiment/simulation/EE4/iframes/data/img301.png new file mode 100644 index 0000000..675d1eb Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img301.png differ diff --git a/experiment/simulation/EE4/iframes/data/img302.png b/experiment/simulation/EE4/iframes/data/img302.png new file mode 100644 index 0000000..d029dd9 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img302.png differ diff --git a/experiment/simulation/EE4/iframes/data/img303.png b/experiment/simulation/EE4/iframes/data/img303.png new file mode 100644 index 0000000..35b738a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img303.png differ diff --git a/experiment/simulation/EE4/iframes/data/img304.png b/experiment/simulation/EE4/iframes/data/img304.png new file mode 100644 index 0000000..8e57879 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img304.png differ diff --git a/experiment/simulation/EE4/iframes/data/img305.png b/experiment/simulation/EE4/iframes/data/img305.png new file mode 100644 index 0000000..3f6912b Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img305.png differ diff --git a/experiment/simulation/EE4/iframes/data/img306.png b/experiment/simulation/EE4/iframes/data/img306.png new file mode 100644 index 0000000..1647bda Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img306.png differ diff --git a/experiment/simulation/EE4/iframes/data/img307.png b/experiment/simulation/EE4/iframes/data/img307.png new file mode 100644 index 0000000..428c99e Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img307.png differ diff --git a/experiment/simulation/EE4/iframes/data/img308.png b/experiment/simulation/EE4/iframes/data/img308.png new file mode 100644 index 0000000..b1086a1 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img308.png differ diff --git a/experiment/simulation/EE4/iframes/data/img309.png b/experiment/simulation/EE4/iframes/data/img309.png new file mode 100644 index 0000000..191fcd5 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img309.png differ diff --git a/experiment/simulation/EE4/iframes/data/img31.png b/experiment/simulation/EE4/iframes/data/img31.png new file mode 100644 index 0000000..c717eb7 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img31.png differ diff --git a/experiment/simulation/EE4/iframes/data/img310.png b/experiment/simulation/EE4/iframes/data/img310.png new file mode 100644 index 0000000..66123fb Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img310.png differ diff --git a/experiment/simulation/EE4/iframes/data/img311.png b/experiment/simulation/EE4/iframes/data/img311.png new file mode 100644 index 0000000..215d6f4 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img311.png differ diff --git a/experiment/simulation/EE4/iframes/data/img312.png b/experiment/simulation/EE4/iframes/data/img312.png new file mode 100644 index 0000000..542ed48 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img312.png differ diff --git a/experiment/simulation/EE4/iframes/data/img313.png b/experiment/simulation/EE4/iframes/data/img313.png new file mode 100644 index 0000000..aff833a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img313.png differ diff --git a/experiment/simulation/EE4/iframes/data/img314.png b/experiment/simulation/EE4/iframes/data/img314.png new file mode 100644 index 0000000..59111ba Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img314.png differ diff --git a/experiment/simulation/EE4/iframes/data/img315.png b/experiment/simulation/EE4/iframes/data/img315.png new file mode 100644 index 0000000..783443c Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img315.png differ diff --git a/experiment/simulation/EE4/iframes/data/img316.png b/experiment/simulation/EE4/iframes/data/img316.png new file mode 100644 index 0000000..09e03ba Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img316.png differ diff --git a/experiment/simulation/EE4/iframes/data/img317.png b/experiment/simulation/EE4/iframes/data/img317.png new file mode 100644 index 0000000..9f75a7f Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img317.png differ diff --git a/experiment/simulation/EE4/iframes/data/img318.png b/experiment/simulation/EE4/iframes/data/img318.png new file mode 100644 index 0000000..21e6b59 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img318.png differ diff --git a/experiment/simulation/EE4/iframes/data/img319.png b/experiment/simulation/EE4/iframes/data/img319.png new file mode 100644 index 0000000..98e416c Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img319.png differ diff --git a/experiment/simulation/EE4/iframes/data/img32.png b/experiment/simulation/EE4/iframes/data/img32.png new file mode 100644 index 0000000..0d5165c Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img32.png differ diff --git a/experiment/simulation/EE4/iframes/data/img320.png b/experiment/simulation/EE4/iframes/data/img320.png new file mode 100644 index 0000000..465e9fe Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img320.png differ diff --git a/experiment/simulation/EE4/iframes/data/img321.png b/experiment/simulation/EE4/iframes/data/img321.png new file mode 100644 index 0000000..6fd5a94 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img321.png differ diff --git a/experiment/simulation/EE4/iframes/data/img322.png b/experiment/simulation/EE4/iframes/data/img322.png new file mode 100644 index 0000000..eb4fd97 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img322.png differ diff --git a/experiment/simulation/EE4/iframes/data/img323.png b/experiment/simulation/EE4/iframes/data/img323.png new file mode 100644 index 0000000..f1dae99 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img323.png differ diff --git a/experiment/simulation/EE4/iframes/data/img324.png b/experiment/simulation/EE4/iframes/data/img324.png new file mode 100644 index 0000000..91bb6bb Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img324.png differ diff --git a/experiment/simulation/EE4/iframes/data/img325.png b/experiment/simulation/EE4/iframes/data/img325.png new file mode 100644 index 0000000..3571e42 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img325.png differ diff --git a/experiment/simulation/EE4/iframes/data/img326.png b/experiment/simulation/EE4/iframes/data/img326.png new file mode 100644 index 0000000..01d2e7a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img326.png differ diff --git a/experiment/simulation/EE4/iframes/data/img327.png b/experiment/simulation/EE4/iframes/data/img327.png new file mode 100644 index 0000000..7265691 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img327.png differ diff --git a/experiment/simulation/EE4/iframes/data/img328.png b/experiment/simulation/EE4/iframes/data/img328.png new file mode 100644 index 0000000..d2d9a0e Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img328.png differ diff --git a/experiment/simulation/EE4/iframes/data/img329.png b/experiment/simulation/EE4/iframes/data/img329.png new file mode 100644 index 0000000..46d9fc6 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img329.png differ diff --git a/experiment/simulation/EE4/iframes/data/img33.png b/experiment/simulation/EE4/iframes/data/img33.png new file mode 100644 index 0000000..9228003 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img33.png differ diff --git a/experiment/simulation/EE4/iframes/data/img330.png b/experiment/simulation/EE4/iframes/data/img330.png new file mode 100644 index 0000000..3025f1f Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img330.png differ diff --git a/experiment/simulation/EE4/iframes/data/img331.png b/experiment/simulation/EE4/iframes/data/img331.png new file mode 100644 index 0000000..36a328f Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img331.png differ diff --git a/experiment/simulation/EE4/iframes/data/img332.png b/experiment/simulation/EE4/iframes/data/img332.png new file mode 100644 index 0000000..8c78df6 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img332.png differ diff --git a/experiment/simulation/EE4/iframes/data/img333.png b/experiment/simulation/EE4/iframes/data/img333.png new file mode 100644 index 0000000..fb98962 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img333.png differ diff --git a/experiment/simulation/EE4/iframes/data/img334.png b/experiment/simulation/EE4/iframes/data/img334.png new file mode 100644 index 0000000..b298c8e Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img334.png differ diff --git a/experiment/simulation/EE4/iframes/data/img335.png b/experiment/simulation/EE4/iframes/data/img335.png new file mode 100644 index 0000000..f8f3877 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img335.png differ diff --git a/experiment/simulation/EE4/iframes/data/img336.png b/experiment/simulation/EE4/iframes/data/img336.png new file mode 100644 index 0000000..cf15ece Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img336.png differ diff --git a/experiment/simulation/EE4/iframes/data/img337.png b/experiment/simulation/EE4/iframes/data/img337.png new file mode 100644 index 0000000..e8baff8 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img337.png differ diff --git a/experiment/simulation/EE4/iframes/data/img338.png b/experiment/simulation/EE4/iframes/data/img338.png new file mode 100644 index 0000000..f24a03a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img338.png differ diff --git a/experiment/simulation/EE4/iframes/data/img339.png b/experiment/simulation/EE4/iframes/data/img339.png new file mode 100644 index 0000000..3bbde15 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img339.png differ diff --git a/experiment/simulation/EE4/iframes/data/img34.png b/experiment/simulation/EE4/iframes/data/img34.png new file mode 100644 index 0000000..cd7ed43 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img34.png differ diff --git a/experiment/simulation/EE4/iframes/data/img340.png b/experiment/simulation/EE4/iframes/data/img340.png new file mode 100644 index 0000000..2717650 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img340.png differ diff --git a/experiment/simulation/EE4/iframes/data/img341.png b/experiment/simulation/EE4/iframes/data/img341.png new file mode 100644 index 0000000..bb4baba Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img341.png differ diff --git a/experiment/simulation/EE4/iframes/data/img342.png b/experiment/simulation/EE4/iframes/data/img342.png new file mode 100644 index 0000000..b951cfe Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img342.png differ diff --git a/experiment/simulation/EE4/iframes/data/img343.png b/experiment/simulation/EE4/iframes/data/img343.png new file mode 100644 index 0000000..873a4de Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img343.png differ diff --git a/experiment/simulation/EE4/iframes/data/img344.png b/experiment/simulation/EE4/iframes/data/img344.png new file mode 100644 index 0000000..94e5f84 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img344.png differ diff --git a/experiment/simulation/EE4/iframes/data/img345.png b/experiment/simulation/EE4/iframes/data/img345.png new file mode 100644 index 0000000..85ac309 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img345.png differ diff --git a/experiment/simulation/EE4/iframes/data/img346.png b/experiment/simulation/EE4/iframes/data/img346.png new file mode 100644 index 0000000..79e30d4 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img346.png differ diff --git a/experiment/simulation/EE4/iframes/data/img347.png b/experiment/simulation/EE4/iframes/data/img347.png new file mode 100644 index 0000000..d2db4ad Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img347.png differ diff --git a/experiment/simulation/EE4/iframes/data/img348.png b/experiment/simulation/EE4/iframes/data/img348.png new file mode 100644 index 0000000..a94c645 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img348.png differ diff --git a/experiment/simulation/EE4/iframes/data/img349.png b/experiment/simulation/EE4/iframes/data/img349.png new file mode 100644 index 0000000..398b788 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img349.png differ diff --git a/experiment/simulation/EE4/iframes/data/img35.png b/experiment/simulation/EE4/iframes/data/img35.png new file mode 100644 index 0000000..c7452f4 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img35.png differ diff --git a/experiment/simulation/EE4/iframes/data/img350.png b/experiment/simulation/EE4/iframes/data/img350.png new file mode 100644 index 0000000..d1bf1b2 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img350.png differ diff --git a/experiment/simulation/EE4/iframes/data/img351.png b/experiment/simulation/EE4/iframes/data/img351.png new file mode 100644 index 0000000..78e4943 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img351.png differ diff --git a/experiment/simulation/EE4/iframes/data/img352.png b/experiment/simulation/EE4/iframes/data/img352.png new file mode 100644 index 0000000..29688d6 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img352.png differ diff --git a/experiment/simulation/EE4/iframes/data/img353.png b/experiment/simulation/EE4/iframes/data/img353.png new file mode 100644 index 0000000..664af69 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img353.png differ diff --git a/experiment/simulation/EE4/iframes/data/img354.png b/experiment/simulation/EE4/iframes/data/img354.png new file mode 100644 index 0000000..7763a75 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img354.png differ diff --git a/experiment/simulation/EE4/iframes/data/img355.png b/experiment/simulation/EE4/iframes/data/img355.png new file mode 100644 index 0000000..5811669 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img355.png differ diff --git a/experiment/simulation/EE4/iframes/data/img356.png b/experiment/simulation/EE4/iframes/data/img356.png new file mode 100644 index 0000000..06f0190 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img356.png differ diff --git a/experiment/simulation/EE4/iframes/data/img357.png b/experiment/simulation/EE4/iframes/data/img357.png new file mode 100644 index 0000000..dc246d2 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img357.png differ diff --git a/experiment/simulation/EE4/iframes/data/img358.png b/experiment/simulation/EE4/iframes/data/img358.png new file mode 100644 index 0000000..14e6989 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img358.png differ diff --git a/experiment/simulation/EE4/iframes/data/img359.png b/experiment/simulation/EE4/iframes/data/img359.png new file mode 100644 index 0000000..dd24706 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img359.png differ diff --git a/experiment/simulation/EE4/iframes/data/img36.png b/experiment/simulation/EE4/iframes/data/img36.png new file mode 100644 index 0000000..dc1a8db Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img36.png differ diff --git a/experiment/simulation/EE4/iframes/data/img360.png b/experiment/simulation/EE4/iframes/data/img360.png new file mode 100644 index 0000000..a5e36a8 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img360.png differ diff --git a/experiment/simulation/EE4/iframes/data/img361.png b/experiment/simulation/EE4/iframes/data/img361.png new file mode 100644 index 0000000..7fd3382 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img361.png differ diff --git a/experiment/simulation/EE4/iframes/data/img362.png b/experiment/simulation/EE4/iframes/data/img362.png new file mode 100644 index 0000000..ebbffcd Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img362.png differ diff --git a/experiment/simulation/EE4/iframes/data/img363.png b/experiment/simulation/EE4/iframes/data/img363.png new file mode 100644 index 0000000..f29eb77 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img363.png differ diff --git a/experiment/simulation/EE4/iframes/data/img364.png b/experiment/simulation/EE4/iframes/data/img364.png new file mode 100644 index 0000000..56d2e10 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img364.png differ diff --git a/experiment/simulation/EE4/iframes/data/img365.png b/experiment/simulation/EE4/iframes/data/img365.png new file mode 100644 index 0000000..cedc74f Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img365.png differ diff --git a/experiment/simulation/EE4/iframes/data/img366.png b/experiment/simulation/EE4/iframes/data/img366.png new file mode 100644 index 0000000..1944e9a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img366.png differ diff --git a/experiment/simulation/EE4/iframes/data/img367.png b/experiment/simulation/EE4/iframes/data/img367.png new file mode 100644 index 0000000..842c8c2 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img367.png differ diff --git a/experiment/simulation/EE4/iframes/data/img368.png b/experiment/simulation/EE4/iframes/data/img368.png new file mode 100644 index 0000000..f0fcba6 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img368.png differ diff --git a/experiment/simulation/EE4/iframes/data/img369.png b/experiment/simulation/EE4/iframes/data/img369.png new file mode 100644 index 0000000..887f758 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img369.png differ diff --git a/experiment/simulation/EE4/iframes/data/img37.png b/experiment/simulation/EE4/iframes/data/img37.png new file mode 100644 index 0000000..c7d668b Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img37.png differ diff --git a/experiment/simulation/EE4/iframes/data/img370.png b/experiment/simulation/EE4/iframes/data/img370.png new file mode 100644 index 0000000..ee525e7 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img370.png differ diff --git a/experiment/simulation/EE4/iframes/data/img371.png b/experiment/simulation/EE4/iframes/data/img371.png new file mode 100644 index 0000000..652ccfb Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img371.png differ diff --git a/experiment/simulation/EE4/iframes/data/img372.png b/experiment/simulation/EE4/iframes/data/img372.png new file mode 100644 index 0000000..125a2b5 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img372.png differ diff --git a/experiment/simulation/EE4/iframes/data/img373.png b/experiment/simulation/EE4/iframes/data/img373.png new file mode 100644 index 0000000..2c384b9 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img373.png differ diff --git a/experiment/simulation/EE4/iframes/data/img374.png b/experiment/simulation/EE4/iframes/data/img374.png new file mode 100644 index 0000000..0d3881c Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img374.png differ diff --git a/experiment/simulation/EE4/iframes/data/img375.png b/experiment/simulation/EE4/iframes/data/img375.png new file mode 100644 index 0000000..e5c6c78 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img375.png differ diff --git a/experiment/simulation/EE4/iframes/data/img376.png b/experiment/simulation/EE4/iframes/data/img376.png new file mode 100644 index 0000000..799f304 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img376.png differ diff --git a/experiment/simulation/EE4/iframes/data/img377.png b/experiment/simulation/EE4/iframes/data/img377.png new file mode 100644 index 0000000..b4e8900 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img377.png differ diff --git a/experiment/simulation/EE4/iframes/data/img378.png b/experiment/simulation/EE4/iframes/data/img378.png new file mode 100644 index 0000000..b65daf7 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img378.png differ diff --git a/experiment/simulation/EE4/iframes/data/img379.png b/experiment/simulation/EE4/iframes/data/img379.png new file mode 100644 index 0000000..87cedde Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img379.png differ diff --git a/experiment/simulation/EE4/iframes/data/img38.png b/experiment/simulation/EE4/iframes/data/img38.png new file mode 100644 index 0000000..ad83ec0 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img38.png differ diff --git a/experiment/simulation/EE4/iframes/data/img380.png b/experiment/simulation/EE4/iframes/data/img380.png new file mode 100644 index 0000000..f2f71f5 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img380.png differ diff --git a/experiment/simulation/EE4/iframes/data/img381.png b/experiment/simulation/EE4/iframes/data/img381.png new file mode 100644 index 0000000..877b548 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img381.png differ diff --git a/experiment/simulation/EE4/iframes/data/img382.png b/experiment/simulation/EE4/iframes/data/img382.png new file mode 100644 index 0000000..3e04aa6 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img382.png differ diff --git a/experiment/simulation/EE4/iframes/data/img383.png b/experiment/simulation/EE4/iframes/data/img383.png new file mode 100644 index 0000000..656b941 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img383.png differ diff --git a/experiment/simulation/EE4/iframes/data/img384.png b/experiment/simulation/EE4/iframes/data/img384.png new file mode 100644 index 0000000..a0ee88b Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img384.png differ diff --git a/experiment/simulation/EE4/iframes/data/img385.png b/experiment/simulation/EE4/iframes/data/img385.png new file mode 100644 index 0000000..96da029 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img385.png differ diff --git a/experiment/simulation/EE4/iframes/data/img386.png b/experiment/simulation/EE4/iframes/data/img386.png new file mode 100644 index 0000000..7e06f94 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img386.png differ diff --git a/experiment/simulation/EE4/iframes/data/img387.png b/experiment/simulation/EE4/iframes/data/img387.png new file mode 100644 index 0000000..5a2896c Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img387.png differ diff --git a/experiment/simulation/EE4/iframes/data/img388.png b/experiment/simulation/EE4/iframes/data/img388.png new file mode 100644 index 0000000..5a41921 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img388.png differ diff --git a/experiment/simulation/EE4/iframes/data/img389.png b/experiment/simulation/EE4/iframes/data/img389.png new file mode 100644 index 0000000..18caa61 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img389.png differ diff --git a/experiment/simulation/EE4/iframes/data/img39.png b/experiment/simulation/EE4/iframes/data/img39.png new file mode 100644 index 0000000..6dd7ce1 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img39.png differ diff --git a/experiment/simulation/EE4/iframes/data/img390.png b/experiment/simulation/EE4/iframes/data/img390.png new file mode 100644 index 0000000..e929ee3 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img390.png differ diff --git a/experiment/simulation/EE4/iframes/data/img391.png b/experiment/simulation/EE4/iframes/data/img391.png new file mode 100644 index 0000000..fd22325 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img391.png differ diff --git a/experiment/simulation/EE4/iframes/data/img392.png b/experiment/simulation/EE4/iframes/data/img392.png new file mode 100644 index 0000000..4bbe1ae Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img392.png differ diff --git a/experiment/simulation/EE4/iframes/data/img393.png b/experiment/simulation/EE4/iframes/data/img393.png new file mode 100644 index 0000000..3d34eb0 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img393.png differ diff --git a/experiment/simulation/EE4/iframes/data/img394.png b/experiment/simulation/EE4/iframes/data/img394.png new file mode 100644 index 0000000..b040b73 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img394.png differ diff --git a/experiment/simulation/EE4/iframes/data/img395.png b/experiment/simulation/EE4/iframes/data/img395.png new file mode 100644 index 0000000..1acc8b5 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img395.png differ diff --git a/experiment/simulation/EE4/iframes/data/img396.png b/experiment/simulation/EE4/iframes/data/img396.png new file mode 100644 index 0000000..65877c5 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img396.png differ diff --git a/experiment/simulation/EE4/iframes/data/img397.png b/experiment/simulation/EE4/iframes/data/img397.png new file mode 100644 index 0000000..ee57683 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img397.png differ diff --git a/experiment/simulation/EE4/iframes/data/img398.png b/experiment/simulation/EE4/iframes/data/img398.png new file mode 100644 index 0000000..13fd750 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img398.png differ diff --git a/experiment/simulation/EE4/iframes/data/img399.png b/experiment/simulation/EE4/iframes/data/img399.png new file mode 100644 index 0000000..2b20163 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img399.png differ diff --git a/experiment/simulation/EE4/iframes/data/img4.png b/experiment/simulation/EE4/iframes/data/img4.png new file mode 100644 index 0000000..a54919a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img4.png differ diff --git a/experiment/simulation/EE4/iframes/data/img40.png b/experiment/simulation/EE4/iframes/data/img40.png new file mode 100644 index 0000000..6dc1b81 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img40.png differ diff --git a/experiment/simulation/EE4/iframes/data/img400.png b/experiment/simulation/EE4/iframes/data/img400.png new file mode 100644 index 0000000..dab6501 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img400.png differ diff --git a/experiment/simulation/EE4/iframes/data/img401.png b/experiment/simulation/EE4/iframes/data/img401.png new file mode 100644 index 0000000..59648ea Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img401.png differ diff --git a/experiment/simulation/EE4/iframes/data/img402.png b/experiment/simulation/EE4/iframes/data/img402.png new file mode 100644 index 0000000..d99d90b Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img402.png differ diff --git a/experiment/simulation/EE4/iframes/data/img403.png b/experiment/simulation/EE4/iframes/data/img403.png new file mode 100644 index 0000000..bc8eaa2 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img403.png differ diff --git a/experiment/simulation/EE4/iframes/data/img404.png b/experiment/simulation/EE4/iframes/data/img404.png new file mode 100644 index 0000000..a6fad87 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img404.png differ diff --git a/experiment/simulation/EE4/iframes/data/img405.png b/experiment/simulation/EE4/iframes/data/img405.png new file mode 100644 index 0000000..8e094f4 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img405.png differ diff --git a/experiment/simulation/EE4/iframes/data/img406.png b/experiment/simulation/EE4/iframes/data/img406.png new file mode 100644 index 0000000..b2d3877 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img406.png differ diff --git a/experiment/simulation/EE4/iframes/data/img407.png b/experiment/simulation/EE4/iframes/data/img407.png new file mode 100644 index 0000000..f852d75 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img407.png differ diff --git a/experiment/simulation/EE4/iframes/data/img41.png b/experiment/simulation/EE4/iframes/data/img41.png new file mode 100644 index 0000000..4cb91af Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img41.png differ diff --git a/experiment/simulation/EE4/iframes/data/img42.png b/experiment/simulation/EE4/iframes/data/img42.png new file mode 100644 index 0000000..d8d6a8b Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img42.png differ diff --git a/experiment/simulation/EE4/iframes/data/img43.png b/experiment/simulation/EE4/iframes/data/img43.png new file mode 100644 index 0000000..63ee2b6 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img43.png differ diff --git a/experiment/simulation/EE4/iframes/data/img44.png b/experiment/simulation/EE4/iframes/data/img44.png new file mode 100644 index 0000000..4b68c99 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img44.png differ diff --git a/experiment/simulation/EE4/iframes/data/img45.png b/experiment/simulation/EE4/iframes/data/img45.png new file mode 100644 index 0000000..c79fa1a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img45.png differ diff --git a/experiment/simulation/EE4/iframes/data/img46.png b/experiment/simulation/EE4/iframes/data/img46.png new file mode 100644 index 0000000..8ebff3c Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img46.png differ diff --git a/experiment/simulation/EE4/iframes/data/img47.png b/experiment/simulation/EE4/iframes/data/img47.png new file mode 100644 index 0000000..656b4b7 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img47.png differ diff --git a/experiment/simulation/EE4/iframes/data/img48.png b/experiment/simulation/EE4/iframes/data/img48.png new file mode 100644 index 0000000..967b67a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img48.png differ diff --git a/experiment/simulation/EE4/iframes/data/img49.png b/experiment/simulation/EE4/iframes/data/img49.png new file mode 100644 index 0000000..7f2f05d Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img49.png differ diff --git a/experiment/simulation/EE4/iframes/data/img5.png b/experiment/simulation/EE4/iframes/data/img5.png new file mode 100644 index 0000000..a6a430e Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img5.png differ diff --git a/experiment/simulation/EE4/iframes/data/img50.png b/experiment/simulation/EE4/iframes/data/img50.png new file mode 100644 index 0000000..4a9bbd2 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img50.png differ diff --git a/experiment/simulation/EE4/iframes/data/img51.png b/experiment/simulation/EE4/iframes/data/img51.png new file mode 100644 index 0000000..6d15302 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img51.png differ diff --git a/experiment/simulation/EE4/iframes/data/img52.png b/experiment/simulation/EE4/iframes/data/img52.png new file mode 100644 index 0000000..1e89e6b Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img52.png differ diff --git a/experiment/simulation/EE4/iframes/data/img53.png b/experiment/simulation/EE4/iframes/data/img53.png new file mode 100644 index 0000000..acf94ff Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img53.png differ diff --git a/experiment/simulation/EE4/iframes/data/img54.png b/experiment/simulation/EE4/iframes/data/img54.png new file mode 100644 index 0000000..d944231 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img54.png differ diff --git a/experiment/simulation/EE4/iframes/data/img55.png b/experiment/simulation/EE4/iframes/data/img55.png new file mode 100644 index 0000000..cc7551f Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img55.png differ diff --git a/experiment/simulation/EE4/iframes/data/img56.png b/experiment/simulation/EE4/iframes/data/img56.png new file mode 100644 index 0000000..3f0020d Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img56.png differ diff --git a/experiment/simulation/EE4/iframes/data/img57.png b/experiment/simulation/EE4/iframes/data/img57.png new file mode 100644 index 0000000..e499dde Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img57.png differ diff --git a/experiment/simulation/EE4/iframes/data/img58.png b/experiment/simulation/EE4/iframes/data/img58.png new file mode 100644 index 0000000..a8fdb39 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img58.png differ diff --git a/experiment/simulation/EE4/iframes/data/img59.png b/experiment/simulation/EE4/iframes/data/img59.png new file mode 100644 index 0000000..6421b8b Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img59.png differ diff --git a/experiment/simulation/EE4/iframes/data/img6.png b/experiment/simulation/EE4/iframes/data/img6.png new file mode 100644 index 0000000..ed28927 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img6.png differ diff --git a/experiment/simulation/EE4/iframes/data/img60.png b/experiment/simulation/EE4/iframes/data/img60.png new file mode 100644 index 0000000..4e5c96b Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img60.png differ diff --git a/experiment/simulation/EE4/iframes/data/img61.png b/experiment/simulation/EE4/iframes/data/img61.png new file mode 100644 index 0000000..17b0627 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img61.png differ diff --git a/experiment/simulation/EE4/iframes/data/img62.png b/experiment/simulation/EE4/iframes/data/img62.png new file mode 100644 index 0000000..9469ee9 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img62.png differ diff --git a/experiment/simulation/EE4/iframes/data/img63.png b/experiment/simulation/EE4/iframes/data/img63.png new file mode 100644 index 0000000..30db3c5 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img63.png differ diff --git a/experiment/simulation/EE4/iframes/data/img64.png b/experiment/simulation/EE4/iframes/data/img64.png new file mode 100644 index 0000000..884eeaf Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img64.png differ diff --git a/experiment/simulation/EE4/iframes/data/img65.png b/experiment/simulation/EE4/iframes/data/img65.png new file mode 100644 index 0000000..0ab8741 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img65.png differ diff --git a/experiment/simulation/EE4/iframes/data/img66.png b/experiment/simulation/EE4/iframes/data/img66.png new file mode 100644 index 0000000..b122b5e Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img66.png differ diff --git a/experiment/simulation/EE4/iframes/data/img67.png b/experiment/simulation/EE4/iframes/data/img67.png new file mode 100644 index 0000000..541af62 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img67.png differ diff --git a/experiment/simulation/EE4/iframes/data/img68.png b/experiment/simulation/EE4/iframes/data/img68.png new file mode 100644 index 0000000..959c85e Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img68.png differ diff --git a/experiment/simulation/EE4/iframes/data/img69.png b/experiment/simulation/EE4/iframes/data/img69.png new file mode 100644 index 0000000..1591f09 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img69.png differ diff --git a/experiment/simulation/EE4/iframes/data/img7.png b/experiment/simulation/EE4/iframes/data/img7.png new file mode 100644 index 0000000..8a73758 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img7.png differ diff --git a/experiment/simulation/EE4/iframes/data/img70.png b/experiment/simulation/EE4/iframes/data/img70.png new file mode 100644 index 0000000..335a097 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img70.png differ diff --git a/experiment/simulation/EE4/iframes/data/img71.png b/experiment/simulation/EE4/iframes/data/img71.png new file mode 100644 index 0000000..91ed004 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img71.png differ diff --git a/experiment/simulation/EE4/iframes/data/img72.png b/experiment/simulation/EE4/iframes/data/img72.png new file mode 100644 index 0000000..29b1b57 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img72.png differ diff --git a/experiment/simulation/EE4/iframes/data/img73.png b/experiment/simulation/EE4/iframes/data/img73.png new file mode 100644 index 0000000..fa0056f Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img73.png differ diff --git a/experiment/simulation/EE4/iframes/data/img74.png b/experiment/simulation/EE4/iframes/data/img74.png new file mode 100644 index 0000000..63f82ef Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img74.png differ diff --git a/experiment/simulation/EE4/iframes/data/img75.png b/experiment/simulation/EE4/iframes/data/img75.png new file mode 100644 index 0000000..48c94f8 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img75.png differ diff --git a/experiment/simulation/EE4/iframes/data/img76.png b/experiment/simulation/EE4/iframes/data/img76.png new file mode 100644 index 0000000..11b88cf Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img76.png differ diff --git a/experiment/simulation/EE4/iframes/data/img77.png b/experiment/simulation/EE4/iframes/data/img77.png new file mode 100644 index 0000000..47290cd Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img77.png differ diff --git a/experiment/simulation/EE4/iframes/data/img78.png b/experiment/simulation/EE4/iframes/data/img78.png new file mode 100644 index 0000000..cb6afc4 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img78.png differ diff --git a/experiment/simulation/EE4/iframes/data/img79.png b/experiment/simulation/EE4/iframes/data/img79.png new file mode 100644 index 0000000..db8cf96 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img79.png differ diff --git a/experiment/simulation/EE4/iframes/data/img8.png b/experiment/simulation/EE4/iframes/data/img8.png new file mode 100644 index 0000000..6106403 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img8.png differ diff --git a/experiment/simulation/EE4/iframes/data/img80.png b/experiment/simulation/EE4/iframes/data/img80.png new file mode 100644 index 0000000..1cf0e91 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img80.png differ diff --git a/experiment/simulation/EE4/iframes/data/img81.png b/experiment/simulation/EE4/iframes/data/img81.png new file mode 100644 index 0000000..6bf22d3 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img81.png differ diff --git a/experiment/simulation/EE4/iframes/data/img82.png b/experiment/simulation/EE4/iframes/data/img82.png new file mode 100644 index 0000000..96e5ac8 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img82.png differ diff --git a/experiment/simulation/EE4/iframes/data/img83.png b/experiment/simulation/EE4/iframes/data/img83.png new file mode 100644 index 0000000..55f81ad Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img83.png differ diff --git a/experiment/simulation/EE4/iframes/data/img84.png b/experiment/simulation/EE4/iframes/data/img84.png new file mode 100644 index 0000000..f73abca Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img84.png differ diff --git a/experiment/simulation/EE4/iframes/data/img85.png b/experiment/simulation/EE4/iframes/data/img85.png new file mode 100644 index 0000000..eb49e8d Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img85.png differ diff --git a/experiment/simulation/EE4/iframes/data/img86.png b/experiment/simulation/EE4/iframes/data/img86.png new file mode 100644 index 0000000..b9d2c11 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img86.png differ diff --git a/experiment/simulation/EE4/iframes/data/img87.png b/experiment/simulation/EE4/iframes/data/img87.png new file mode 100644 index 0000000..a284fee Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img87.png differ diff --git a/experiment/simulation/EE4/iframes/data/img88.png b/experiment/simulation/EE4/iframes/data/img88.png new file mode 100644 index 0000000..23b729b Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img88.png differ diff --git a/experiment/simulation/EE4/iframes/data/img89.png b/experiment/simulation/EE4/iframes/data/img89.png new file mode 100644 index 0000000..397ccfb Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img89.png differ diff --git a/experiment/simulation/EE4/iframes/data/img9.png b/experiment/simulation/EE4/iframes/data/img9.png new file mode 100644 index 0000000..3d70aa2 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img9.png differ diff --git a/experiment/simulation/EE4/iframes/data/img90.png b/experiment/simulation/EE4/iframes/data/img90.png new file mode 100644 index 0000000..7c74ce7 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img90.png differ diff --git a/experiment/simulation/EE4/iframes/data/img91.png b/experiment/simulation/EE4/iframes/data/img91.png new file mode 100644 index 0000000..7bb684a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img91.png differ diff --git a/experiment/simulation/EE4/iframes/data/img92.png b/experiment/simulation/EE4/iframes/data/img92.png new file mode 100644 index 0000000..f0c7c46 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img92.png differ diff --git a/experiment/simulation/EE4/iframes/data/img93.png b/experiment/simulation/EE4/iframes/data/img93.png new file mode 100644 index 0000000..225172c Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img93.png differ diff --git a/experiment/simulation/EE4/iframes/data/img94.png b/experiment/simulation/EE4/iframes/data/img94.png new file mode 100644 index 0000000..c70beeb Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img94.png differ diff --git a/experiment/simulation/EE4/iframes/data/img95.png b/experiment/simulation/EE4/iframes/data/img95.png new file mode 100644 index 0000000..20fcfc2 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img95.png differ diff --git a/experiment/simulation/EE4/iframes/data/img96.png b/experiment/simulation/EE4/iframes/data/img96.png new file mode 100644 index 0000000..785eef7 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img96.png differ diff --git a/experiment/simulation/EE4/iframes/data/img97.png b/experiment/simulation/EE4/iframes/data/img97.png new file mode 100644 index 0000000..56f5206 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img97.png differ diff --git a/experiment/simulation/EE4/iframes/data/img98.png b/experiment/simulation/EE4/iframes/data/img98.png new file mode 100644 index 0000000..e9a9679 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img98.png differ diff --git a/experiment/simulation/EE4/iframes/data/img99.png b/experiment/simulation/EE4/iframes/data/img99.png new file mode 100644 index 0000000..1155a35 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/img99.png differ diff --git a/experiment/simulation/EE4/iframes/data/lock.cur b/experiment/simulation/EE4/iframes/data/lock.cur new file mode 100644 index 0000000..e92f527 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/lock.cur differ diff --git a/experiment/simulation/EE4/iframes/data/marker.cur b/experiment/simulation/EE4/iframes/data/marker.cur new file mode 100644 index 0000000..0726e17 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/marker.cur differ diff --git a/experiment/simulation/EE4/iframes/data/player.js b/experiment/simulation/EE4/iframes/data/player.js new file mode 100644 index 0000000..fcdeb6c --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/player.js @@ -0,0 +1,1783 @@ +(function(){/* + + Copyright The Closure Library Authors. + SPDX-License-Identifier: Apache-2.0 +*/ +var k,ba="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};function ca(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b>>0),pa=0;function qa(a,b,c){return a.call.apply(a.bind,arguments)}function sa(a,b,c){if(!a)throw Error();if(2b?null:"string"===typeof a?a.charAt(b):a[b]}function Pa(a,b){return 0<=Ia(a,b)}function Ra(a,b){b=Ia(a,b);let c;(c=0<=b)&&Sa(a,b);return c}function Sa(a,b){Array.prototype.splice.call(a,b,1)}function Ta(a){return Array.prototype.concat.apply([],arguments)} +function Ua(a){const b=a.length;if(0=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)} +function Za(a){let b=0,c=0;const d={};for(;cb?1:a")&&(a=a.replace(mb,">"));-1!=a.indexOf('"')&&(a=a.replace(ob,"""));-1!=a.indexOf("'")&&(a=a.replace(pb,"'"));-1!=a.indexOf("\x00")&&(a=a.replace(qb,"�"));return a}var kb=/&/g,lb=//g,ob=/"/g,pb=/'/g,qb=/\x00/g,jb=/[\x00&<>"']/; +function rb(a,b){let c=0;a=hb(String(a)).split(".");b=hb(String(b)).split(".");const d=Math.max(a.length,b.length);for(let g=0;0==c&&gb?1:0};function ub(){var a=ia.navigator;return a&&(a=a.userAgent)?a:""}function vb(a){return-1!=ub().indexOf(a)};function wb(){return vb("Firefox")||vb("FxiOS")}function yb(){return vb("Safari")&&!(zb()||vb("Coast")||vb("Opera")||vb("Edge")||vb("Edg/")||vb("OPR")||wb()||vb("Silk")||vb("Android"))}function zb(){return(vb("Chrome")||vb("CriOS"))&&!vb("Edge")||vb("Silk")}function Ab(){return vb("Android")&&!(zb()||wb()||vb("Opera")||vb("Silk"))};function Bb(){return vb("iPhone")&&!vb("iPod")&&!vb("iPad")}function Cb(){return Bb()||vb("iPad")||vb("iPod")};function Eb(a){Eb[" "](a);return a}Eb[" "]=function(){};function Fb(a,b,c,d){d=d?d(b):b;return Object.prototype.hasOwnProperty.call(a,d)?a[d]:a[d]=c(b)};var Hb=vb("Opera"),Ib=vb("Trident")||vb("MSIE"),Jb=vb("Edge"),Kb=Jb||Ib,Lb=vb("Gecko")&&!(-1!=ub().toLowerCase().indexOf("webkit")&&!vb("Edge"))&&!(vb("Trident")||vb("MSIE"))&&!vb("Edge"),Mb=-1!=ub().toLowerCase().indexOf("webkit")&&!vb("Edge"),Nb=vb("Macintosh"),Ob=vb("Windows"),Pb=vb("Linux")||vb("CrOS"),Qb=vb("Android"),Rb=Bb(),Sb=vb("iPad"),Tb=vb("iPod");function Ub(){var a=ia.document;return a?a.documentMode:void 0}var Vb; +a:{var Wb="",Xb=function(){var a=ub();if(Lb)return/rv:([^\);]+)(\)|;)/.exec(a);if(Jb)return/Edge\/([\d\.]+)/.exec(a);if(Ib)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(Mb)return/WebKit\/(\S+)/.exec(a);if(Hb)return/(?:Version)[ \/]?(\S+)/.exec(a)}();Xb&&(Wb=Xb?Xb[1]:"");if(Ib){var Zb=Ub();if(null!=Zb&&Zb>parseFloat(Wb)){Vb=String(Zb);break a}}Vb=Wb}var $b={};function ac(a){return Fb($b,a,function(){return 0<=rb(Vb,a)})}var bc; +if(ia.document&&Ib){var cc=Ub();bc=cc?cc:parseInt(Vb,10)||void 0}else bc=void 0;var dc=bc;var ec=Ib||Mb;function fc(a,b,c){for(const d in a)b.call(c,a[d],d,a)}function hc(a,b){const c={};for(const d in a)b.call(void 0,a[d],d,a)&&(c[d]=a[d]);return c}function ic(a,b){const c={};for(const d in a)c[d]=b.call(void 0,a[d],d,a);return c}function jc(a){const b=[];let c=0;for(const d in a)b[c++]=a[d];return b}function kc(a){const b=[];let c=0;for(const d in a)b[c++]=d;return b}function lc(a,b){return null!==a&&b in a}function nc(a,b){for(const c in a)if(b.call(void 0,a[c],c,a))return c} +function oc(){var a=pc;for(const b in a)return!1;return!0}function qc(a,b,c){if(null!==a&&b in a)throw Error(`The object already contains the key "${b}"`);a[b]=c}function w(a,b,c){return null!==a&&b in a?a[b]:c}function rc(a){const b={};for(const c in a)b[c]=a[c];return b}const sc="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "); +function tc(a,b){let c,d;for(let e=1;e{Array.isArray(e)?e.forEach(d):(e=Jc(e),c.push(Hc(e).toString()))};a.forEach(d);return Kc(c.join(Hc(b).toString()))} +function Nc(a){return Lc(Array.prototype.slice.call(arguments))}class Ic{constructor(a,b){this.UQ=b===Gc?a:"";this.ux=!0}ox(){return this.UQ.toString()}toString(){return this.UQ.toString()}}var Mc=new Ic(ia.trustedTypes&&ia.trustedTypes.emptyHTML||"",Gc),Pc=Kc("
");var Qc={MATH:!0,SCRIPT:!0,STYLE:!0,SVG:!0,TEMPLATE:!0},Rc=function(a){let b=!1,c;return function(){b||(c=a(),b=!0);return c}}(function(){var a=document.createElement("div"),b=document.createElement("div");b.appendChild(document.createElement("div"));a.appendChild(b);b=a.firstChild.firstChild;a.innerHTML=Hc(Mc);return!b.parentElement}); +function Sc(a,b){if(a.tagName&&Qc[a.tagName.toUpperCase()])throw Error("goog.dom.safe.setInnerHtml cannot be used to set content of "+a.tagName+".");if(Rc())for(;a.lastChild;)a.removeChild(a.lastChild);a.innerHTML=Hc(b)}function Tc(a,b,c,d){a=a instanceof Ac?a:Ec(a);b=b||ia;c instanceof wc?c instanceof wc&&c.constructor===wc&&c.d2===yc?c=c.u1:(Ga("expected object of type Const, got '"+c+"'"),c="type_error:Const"):c=c||"";return void 0!==d?b.open(Bc(a),c,d):b.open(Bc(a),c)}var Uc=/^[\w+/_-]+[=]{0,2}$/;function Vc(a,b,c){return Math.min(Math.max(a,b),c)}function Wc(a,b,c){return a+c*(b-a)};function Xc(a,b){this.x=void 0!==a?a:0;this.y=void 0!==b?b:0}k=Xc.prototype;k.clone=function(){return new Xc(this.x,this.y)};k.Bm=function(a){return a instanceof Xc&&Yc(this,a)};function Yc(a,b){return a==b?!0:a&&b?a.x==b.x&&a.y==b.y:!1}function Zc(a,b){var c=a.x-b.x;a=a.y-b.y;return Math.sqrt(c*c+a*a)}function $c(a,b){var c=a.x-b.x;a=a.y-b.y;return c*c+a*a}function ad(a,b){return new Xc(a.x-b.x,a.y-b.y)}function bd(a,b){return new Xc(a.x+b.x,a.y+b.y)} +k.ceil=function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};k.floor=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this};k.round=function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this};k.translate=function(a,b){a instanceof Xc?(this.x+=a.x,this.y+=a.y):(this.x+=Number(a),"number"===typeof b&&(this.y+=b));return this};k.scale=function(a,b){this.x*=a;this.y*="number"===typeof b?b:a;return this};function cd(a,b){this.width=a;this.height=b}function dd(a,b){return a==b?!0:a&&b?a.width==b.width&&a.height==b.height:!1}k=cd.prototype;k.clone=function(){return new cd(this.width,this.height)};k.area=function(){return this.width*this.height};k.aspectRatio=function(){return this.width/this.height};k.ri=function(){return!this.area()};k.ceil=function(){this.width=Math.ceil(this.width);this.height=Math.ceil(this.height);return this}; +k.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};k.round=function(){this.width=Math.round(this.width);this.height=Math.round(this.height);return this};k.scale=function(a,b){this.width*=a;this.height*="number"===typeof b?b:a;return this};function ed(a){const b={"&":"&","<":"<",">":">",""":'"'};let c;c=ia.document.createElement("div");return a.replace(fd,function(d,e){let f=b[d];if(f)return f;"#"==e.charAt(0)&&(e=Number("0"+e.slice(1)),isNaN(e)||(f=String.fromCharCode(e)));f||(Sc(c,Kc(d+" ")),f=c.firstChild.nodeValue.slice(0,-1));return b[d]=f})} +function gd(a){return a.replace(/&([^;]+);/g,function(b,c){switch(c){case "amp":return"&";case "lt":return"<";case "gt":return">";case "quot":return'"';default:return"#"!=c.charAt(0)||(c=Number("0"+c.slice(1)),isNaN(c))?b:String.fromCharCode(c)}})}var fd=/&([^;\s<&]+);?/g,hd={"\x00":"\\0","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\x0B",'"':'\\"',"\\":"\\\\","<":"\\u003C"},id={"'":"\\'"},jd=String.prototype.repeat?function(a,b){return a.repeat(b)}:function(a,b){return Array(b+1).join(a)}; +function kd(a,b){if(!Number.isFinite(a))return String(a);a=String(a);let c=a.indexOf(".");-1===c&&(c=a.length);const d="-"===a[0]?"-":"";d&&(a=a.substring(1));return d+jd("0",Math.max(0,b-c))+a}function ld(){return Math.floor(2147483648*Math.random()).toString(36)+Math.abs(Math.floor(2147483648*Math.random())^wa()).toString(36)}function md(a){return String(a).replace(/\-([a-z])/g,function(b,c){return c.toUpperCase()})} +function nd(a){return a.replace(RegExp("(^|[\\s]+)([a-z])","g"),function(b,c,d){return c+d.toUpperCase()})};function od(a){return a?new pd(qd(a)):Ba||(Ba=new pd)}function rd(a,b){return"string"===typeof b?a.getElementById(b):b} +function sd(a,b,c){var d=document;c=c||d;a=a&&"*"!=a?String(a).toUpperCase():"";if(c.querySelectorAll&&c.querySelector&&(a||b))return c.querySelectorAll(a+(b?"."+b:""));if(b&&c.getElementsByClassName){c=c.getElementsByClassName(b);if(a){d={};for(var e=0,f=0,g;g=c[f];f++)a==g.nodeName&&(d[e++]=g);d.length=e;return d}return c}c=c.getElementsByTagName(a||"*");if(b){d={};for(f=e=0;g=c[f];f++)a=g.className,"function"==typeof a.split&&Pa(a.split(/\s+/),b)&&(d[e++]=g);d.length=e;return d}return c} +function td(a,b){fc(b,function(c,d){c&&"object"==typeof c&&c.ux&&(c=c.ox());"style"==d?a.style.cssText=c:"class"==d?a.className=c:"for"==d?a.htmlFor=c:ud.hasOwnProperty(d)?a.setAttribute(ud[d],c):0==d.lastIndexOf("aria-",0)||0==d.lastIndexOf("data-",0)?a.setAttribute(d,c):a[d]=c})} +var ud={cellpadding:"cellPadding",cellspacing:"cellSpacing",colspan:"colSpan",frameborder:"frameBorder",height:"height",maxlength:"maxLength",nonce:"nonce",role:"role",rowspan:"rowSpan",type:"type",usemap:"useMap",valign:"vAlign",width:"width"}; +function vd(a){var b=a.scrollingElement?a.scrollingElement:Mb||"CSS1Compat"!=a.compatMode?a.body||a.documentElement:a.documentElement;a=a.parentWindow||a.defaultView;return Ib&&ac("10")&&a.pageYOffset!=b.scrollTop?new Xc(b.scrollLeft,b.scrollTop):new Xc(a.pageXOffset||b.scrollLeft,a.pageYOffset||b.scrollTop)} +function wd(a,b,c){var d=arguments,e=document,f=d[1],g=xd(e,String(d[0]));f&&("string"===typeof f?g.className=f:Array.isArray(f)?g.className=f.join(" "):td(g,f));2{},b),ia.removeEventListener("test",()=>{},b)}catch(c){}return a}();function fe(a){return Mb?"webkit"+a:a.toLowerCase()};var ge=fe("AnimationEnd"),he=fe("TransitionEnd");function ie(a,b){ce.call(this,a?a.type:"");this.relatedTarget=this.currentTarget=this.target=null;this.button=this.screenY=this.screenX=this.clientY=this.clientX=this.offsetY=this.offsetX=0;this.key="";this.charCode=this.keyCode=0;this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.pointerId=0;this.pointerType="";this.oe=null;a&&this.$q(a,b)}t(ie,ce);var je={2:"touch",3:"pen",4:"mouse"}; +ie.prototype.$q=function(a,b){var c=this.type=a.type,d=a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:null;this.target=a.target||a.srcElement;this.currentTarget=b;if(b=a.relatedTarget){if(Lb){a:{try{Eb(b.nodeName);var e=!0;break a}catch(f){}e=!1}e||(b=null)}}else"mouseover"==c?b=a.fromElement:"mouseout"==c&&(b=a.toElement);this.relatedTarget=b;d?(this.clientX=void 0!==d.clientX?d.clientX:d.pageX,this.clientY=void 0!==d.clientY?d.clientY:d.pageY,this.screenX=d.screenX||0,this.screenY= +d.screenY||0):(this.offsetX=Mb||void 0!==a.offsetX?a.offsetX:a.layerX,this.offsetY=Mb||void 0!==a.offsetY?a.offsetY:a.layerY,this.clientX=void 0!==a.clientX?a.clientX:a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0);this.button=a.button;this.keyCode=a.keyCode||0;this.key=a.key||"";this.charCode=a.charCode||("keypress"==c?a.keyCode:0);this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=a.shiftKey;this.metaKey=a.metaKey;this.pointerId= +a.pointerId||0;this.pointerType="string"===typeof a.pointerType?a.pointerType:je[a.pointerType]||"";this.state=a.state;this.oe=a;a.defaultPrevented&&ie.Mb.preventDefault.call(this)};ie.prototype.stopPropagation=function(){ie.Mb.stopPropagation.call(this);this.oe.stopPropagation?this.oe.stopPropagation():this.oe.cancelBubble=!0};ie.prototype.preventDefault=function(){ie.Mb.preventDefault.call(this);var a=this.oe;a.preventDefault?a.preventDefault():a.returnValue=!1};var ke="closure_listenable_"+(1E6*Math.random()|0);function le(a){return!(!a||!a[ke])};var me=0;function ne(a,b,c,d,e){this.listener=a;this.proxy=null;this.src=b;this.type=c;this.capture=!!d;this.MH=e;this.key=++me;this.MC=this.wH=!1}function oe(a){a.MC=!0;a.listener=null;a.proxy=null;a.src=null;a.MH=null};function pe(a){this.src=a;this.Sg={};this.gD=0}pe.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.Sg[f];a||(a=this.Sg[f]=[],this.gD++);var g=qe(a,b,d,e);-1>>0);function xe(a){if("function"===typeof a)return a;a[Ge]||(a[Ge]=function(b){return a.handleEvent(b)});return a[Ge]};function He(){Yd.call(this);this.sl=new pe(this);this.T9=this;this.LQ=null}t(He,Yd);He.prototype[ke]=!0;k=He.prototype;k.addEventListener=function(a,b,c,d){ve(this,a,b,c,d)};k.removeEventListener=function(a,b,c,d){De(this,a,b,c,d)}; +k.dispatchEvent=function(a){var b,c=this.LQ;if(c)for(b=[];c;c=c.LQ)b.push(c);c=this.T9;var d=a.type||a;if("string"===typeof a)a=new ce(a,c);else if(a instanceof ce)a.target=a.target||c;else{var e=a;a=new ce(d,c);tc(a,e)}e=!0;if(b)for(var f=b.length-1;!a.IC&&0<=f;f--){var g=a.currentTarget=b[f];e=Ie(g,d,!0,a)&&e}a.IC||(g=a.currentTarget=c,e=Ie(g,d,!0,a)&&e,a.IC||(e=Ie(g,d,!1,a)&&e));if(b)for(f=0;!a.IC&&f{a:{var g={QP:b,jx:c,context:d,priority:void 0};for(const h in f)if(!(h in g)||f[h]!==g[h]){f=!1;break a}for(const h in g)if(!(h in f)){f=!1;break a}f=!0}return f});e&&Ke(a,e)}function Qe(a,b,c,d){const e=(...f)=>{c.apply(d,f);Pe(a,b,e,d)};z(a,b,e,d)}function Re(a,b){if(b){if(a.tj){var c=hc(a.tj,d=>d.QP.PW==b);for(const d of Object.keys(c))Ke(a,d)}if(a.Qd){const d=Le(b);c=Ka(a.Qd,e=>e.src==d);for(const e of c)Oe(a,e)}}} +function B(a,b){a.Cp=a.Cp||[];a.Cp.push(b);return b}function Se(a,...b){if(a.Cp)for(const c of b)c&&(a.Mr(c),b=Ia(a.Cp,c),0<=b&&(a.Cp.splice(b,1),Te(c)))}function Ue(a,...b){for(const c of b)c&&a.Mr(c)}class Ve{constructor(){this.Cp=this.tj=this.Qd=null}Xc(){this.rd();if(this.Cp)for(const a of this.Cp)Te(a);if(this.Qd){for(const a of this.Qd)if(Array.isArray(a))for(const b of a)Ee(b);else Ee(a);this.Qd=null}if(this.tj)for(const a of Object.keys(this.tj))Ke(this,a)}Mr(a){Re(this,a)}rd(){}};function We(a,b){return 0==b?a.Sw:a.Bt[b]}function $e(a,b){return 0==b?a.Sw||[]:b in a.Bt?We(a,b):[]}function af(a){if(!a.Bt)return a.Sw?a.Sw.slice():[];const b=[],c=a.cG;for(let d=0;d>>1);let l;l=d(b,c[h]);0d&&Wa(c,-(d+1),0,b)}We(this,b).push(a)}remove(a,b){(b=We(this,b))&&Ra(b,a)}};function cf(a){return a.Ii?af(a.Ii).length:0}function df(a,b){a.vA||(a.vA=[]);a.vA.push(b)} +class C extends Ve{constructor(a=null){super();this.vA=this.Ii=null;this.PW=a}U$(){return this.PW}addHandler(a,b,c){this.Ii=this.Ii||new bf;this.Ii.push({jx:a,context:b},c||0)}removeHandler(a,b,c){c=c||0;if(this.Ii){var d=$e(this.Ii,c),e=d.length;for(let f=0;f{b.C(...a)})}rd(){super.rd()}}C.prototype.dispatch=C.prototype.C;C.prototype.hasHandler=C.prototype.lQ;C.prototype.removeHandler=C.prototype.removeHandler;C.prototype.addHandler=C.prototype.addHandler;C.prototype.eventOwner=C.prototype.U$;function ff(a,b){return a.L()!=b.L()?a.L()-b.L():a.Aa()!=b.Aa()?a.Aa()-b.Aa():a.ib()-b.ib()}class gf{constructor(a,b,c){this.Fd=a||0;this.wB=b||0;this.Xi=c||0}L(){return this.Fd}Aa(){return this.wB}ib(){return this.Xi}}gf.prototype.timeOffset=gf.prototype.ib;gf.prototype.stepIndex=gf.prototype.Aa;gf.prototype.slideIndex=gf.prototype.L;function hf(){}q("ispring.presenter.presentation.slides.IAnimationStep",hf);hf.prototype.rl=function(){};hf.prototype.automaticAdvance=hf.prototype.rl;hf.prototype.duration=function(){};hf.prototype.duration=hf.prototype.duration;hf.prototype.startTime=function(){};hf.prototype.startTime=hf.prototype.startTime;function jf(){}q("ispring.presenter.presentation.meta.IMetaCommands",jf);jf.prototype.getMetaCommand=jf.prototype.rC;jf.prototype.count=jf.prototype.count;function kf(){}q("ispring.presenter.presentation.slides.IAnimationSteps",kf);kf.prototype.count=function(){};kf.prototype.count=kf.prototype.count;kf.prototype.pc=function(){};kf.prototype.getStep=kf.prototype.pc;kf.prototype.duration=function(){};kf.prototype.duration=kf.prototype.duration;kf.prototype.getTime=function(){};kf.prototype.getTime=kf.prototype.getTime;function lf(){}q("ispring.presenter.presentation.slides.ISlideShowTransition",lf);lf.prototype.effectType=lf.prototype.T_;lf.prototype.duration=lf.prototype.duration;class mf{constructor(a,b){this.Af=a;this.Ga=b}src(){return this.Af}type(){return this.Ga}};class nf{constructor(a,b){this.$b=a;this.rz=b}id(){return this.$b}pi(){return this.rz}hj(){return!1}sources(){const a=[],b=this.rz.match(//g);if(b)for(let d=0;da||a>=this.count())throw Error("index is out of bounds");return this.yd[a]};sf.prototype.getMetaCommand=sf.prototype.rC;sf.prototype.count=function(){return this.yd.length};sf.prototype.count=sf.prototype.count;function tf(a,b,c){this.bX=a;this.hN=null!=b?b:0;this.Hr=void 0!==c?c:!0;this.Mj=0}tf.prototype.animationDuration=function(){return this.bX};tf.prototype.rl=function(){return this.Hr};tf.prototype.automaticAdvance=tf.prototype.rl;tf.prototype.duration=function(){return this.bX+this.hN};tf.prototype.duration=tf.prototype.duration;tf.prototype.startTime=function(){return this.Mj};tf.prototype.startTime=tf.prototype.startTime;tf.prototype.uR=function(a){this.Mj=a};function uf(){this.xB=[]}uf.prototype.Ea=0;uf.prototype.add=function(a){a.uR(this.Ea);this.xB.push(a);this.Ea+=a.duration()};uf.prototype.count=function(){return this.xB.length};uf.prototype.count=uf.prototype.count;uf.prototype.pc=function(a){if(0>a||a>=this.xB.length)throw Error("stepIndex is out of range");return this.xB[a]};uf.prototype.getStep=uf.prototype.pc;uf.prototype.duration=function(){return this.Ea};uf.prototype.duration=uf.prototype.duration; +uf.prototype.getTime=function(a,b){return this.pc(a).startTime()+b};uf.prototype.getTime=uf.prototype.getTime;let vf=0;class wf{constructor(a,b){this.Th=a;this.Gd=b;this.$b=`${vf++}`}name(){return this.Th}time(){return this.Gd}id(){return this.$b}};function xf(a,b){if(0>b||b>=a.count())throw Error();return a.Jr[b]}class yf{constructor(){this.Jr=[]}count(){return this.Jr.length}add(a){this.Jr.push(a)}};class zf{constructor(a,b,c){this.Ga=a;this.il=b;this.pm=c}type(){return this.Ga}jc(){return this.il}xi(){return this.pm}};class Af{constructor(){this.yd=[]}count(){return this.yd.length}};class Bf{constructor(a,b,c){this.Z2=a;this.il=b;this.IK=c}jc(){return this.il}jf(){return this.IK}};function Cf(a){if(0>=a.count())throw Error("index is out of range");return a.Pi[0]}function Df(a,b){for(let c=0;cff(b,d.jf()))return d}return null}class Ef{constructor(a){this.Pi=a}count(){return this.Pi.length}};function Ff(a,b,c){c&&!Gf(a,b,c)&&(c=null);c||(c=Hf(a,b));a.Pi.push(new Bf(b,b.jc(),c))}function Gf(a,b,c){a=Hf(a,b);return 0<=ff(a,c)} +function Hf(a,b){const c=a.ye;var d=c.lm,e=c.Fj,f=null;if("number"===typeof d)f=c.duration(),f=f-(b.xi()||0)+f*(d-1);else switch(d){case "untilNextClick":e=-1;break;case "untilNextSlide":e=Math.max(e,0)}b=b.jc();e=0>e?new gf(b.L(),b.Aa()+1,0):new gf(b.L()+e+1,-1,0);d=null;null!==f&&(a=a.M,b=a.mi(b,!0,!1),f=Math.min(b+f,a.duration()),d=a.Io(f,!0,!1));return d&&0>ff(d,e)?d:e} +class Jf{constructor(a,b){this.ye=a;this.M=b;this.Pi=[];a=this.ye.yd;b=null;for(let e=0;ed||d>=c.count())throw Error("index is out of range");c=c.yd[d];d=c.jc();switch(c.type()){case "play":b&&Ff(this,b,d);b=c;break;case "togglePlay":b&&Gf(this,b,d)?(Ff(this,b,d),b=null):(b&&Ff(this,b),b=c);break;case "stop":b&&(Ff(this,b,d),b=null)}}b&&Ff(this,b)}HP(){return new Ef(this.Pi)}};function Kf(a,b){a.Pi||(a.Pi=(new Jf(a,b)).HP());return a.Pi}class Lf{constructor(a,b,c){this.$b=a;this.Di=b;this.Ea=c;this.Fj=-1;this.He=this.lm=1;this.Jr=new yf;this.yd=new Af;this.Pi=null}id(){return this.$b}duration(){return this.Ea}volume(){return this.He}setVolume(a){this.He=a}Sj(){return this.Jr}};class Mf extends Lf{constructor(a,b,c){super(a,b,c);this.pv=!1}};function Nf(a,b,c,d){this.Yu=a;this.Ea=b;this.zf=c||null;this.fZ=d||!1}Nf.prototype.zf=null;Nf.prototype.T_=function(){return this.Yu};Nf.prototype.effectType=Nf.prototype.T_;Nf.prototype.duration=function(){return this.Ea};Nf.prototype.duration=Nf.prototype.duration;Nf.prototype.clone=function(){return new Nf(this.Yu,this.Ea,this.zf,this.fZ)};function Of(){}Of.prototype.AV=null;Of.prototype.wX=null;Of.prototype.Oo=function(){return this.AV};function Pf(a,b){a.AV=b}Of.prototype.Gx=function(){return this.wX};function Qf(a,b){a.wX=b};function Rf(a,b){if(0>b||b>=a.ys.length)throw Error("index is out of range");return a.ys[b]}function Sf(a,b){for(let c=0;c=this.left&&a.right<=this.right&&a.top>=this.top&&a.bottom<=this.bottom:a.x>=this.left&&a.x<=this.right&&a.y>=this.top&&a.y<=this.bottom:!1}; +k.expand=function(a,b,c,d){la(a)?(this.top-=a.top,this.right+=a.right,this.bottom+=a.bottom,this.left-=a.left):(this.top-=a,this.right+=Number(b),this.bottom+=Number(c),this.left-=Number(d));return this};k.ceil=function(){this.top=Math.ceil(this.top);this.right=Math.ceil(this.right);this.bottom=Math.ceil(this.bottom);this.left=Math.ceil(this.left);return this}; +k.floor=function(){this.top=Math.floor(this.top);this.right=Math.floor(this.right);this.bottom=Math.floor(this.bottom);this.left=Math.floor(this.left);return this};k.round=function(){this.top=Math.round(this.top);this.right=Math.round(this.right);this.bottom=Math.round(this.bottom);this.left=Math.round(this.left);return this}; +k.translate=function(a,b){a instanceof Xc?(this.left+=a.x,this.right+=a.x,this.top+=a.y,this.bottom+=a.y):(this.left+=a,this.right+=a,"number"===typeof b&&(this.top+=b,this.bottom+=b));return this};k.scale=function(a,b){b="number"===typeof b?b:a;this.left*=a;this.right*=a;this.top*=b;this.bottom*=b;return this};function Wf(a,b,c,d){this.left=a;this.top=b;this.width=c;this.height=d}k=Wf.prototype;k.clone=function(){return new Wf(this.left,this.top,this.width,this.height)};k.contains=function(a){return a instanceof Xc?a.x>=this.left&&a.x<=this.left+this.width&&a.y>=this.top&&a.y<=this.top+this.height:this.left<=a.left&&this.left+this.width>=a.left+a.width&&this.top<=a.top&&this.top+this.height>=a.top+a.height}; +k.Q_=function(){var a=(void 0).xl-n);this.M=g}id(){return this.$b}Wx(){return this.X8}Xa(){return this.sf}duration(){return this.l9}slides(){return this.M}qr(){return this.P7}Nm(){return this.k8}rotation(){return this.nw}};function Zf(a,b){return Oa(a.Hi,c=>c.id()==b)}function $f(a,b){return Oa(a.Hi,c=>!!c.slides().length&&c.slides()[0]==b)}function ag(a){let b=[];for(var c of a.Hi)b=b.concat(c.slides());if(!b.length)return!0;b.sort((d,e)=>d-e);a=b[0];for(c=0;ca)throw Error("negative time not accepted");let c=0;b&&null!=this.transition()&&(b=this.transition().duration(),b=a)break;a-=d.duration()}if(c==b.count())if(.001>=a)--c,a=b.pc(c).duration();else throw Error("time out of bounds");}return new gf(this.index(),c,a)}} +dg.prototype.convertTimeToTimestamp=dg.prototype.Io;dg.prototype.zoomEffects=dg.prototype.qk;dg.prototype.navigationSettings=dg.prototype.St;dg.prototype.presenter=dg.prototype.zg;dg.prototype.metaCommands=dg.prototype.No;dg.prototype.text=dg.prototype.text;dg.prototype.nestingLevel=dg.prototype.Zc;dg.prototype.startTime=dg.prototype.startTime;dg.prototype.thumbnail=dg.prototype.ru;dg.prototype.duration=dg.prototype.duration;dg.prototype.transition=dg.prototype.transition; +dg.prototype.slideNotes=dg.prototype.pj;dg.prototype.title=dg.prototype.title;dg.prototype.isLoaded=dg.prototype.mf;dg.prototype.visible=dg.prototype.visible;dg.prototype.visibleIndex=dg.prototype.Ci;dg.prototype.index=dg.prototype.index;dg.prototype.id=dg.prototype.id;dg.prototype.type=dg.prototype.type;dg.prototype.animationSteps=dg.prototype.nb;function eg(a,b){b.zj=a.M.length;b.uR(a.duration());a.M.push(b);if(b.visible()){b.e_=a.OB.length;a.OB.push(b);const c=b.duration(),d=b.transition()?b.transition().duration():0;a.oP+=c;a.nP+=c-d}b.f_.addHandler(c=>{a.UY.C(c)},a)} +class fg{constructor(){this.M=[];this.OB=[];this.nP=this.oP=0;this.UY=new C}ja(a){if(0>a||a>=this.M.length)throw Error("slideIndex is out of range");return this.M[a]}count(){return this.M.length}duration(){if(0==this.count())return 0;const a=this.M[this.M.length-1];return a.startTime()+a.duration()}x$(a,b,c){return new gf(a,b,c)}mi(a,b,c){if(!a)throw Error("Invalid timestamp");var d=a.L();if(d>=this.count())throw Error("Slide index is out of bounds");if(0>d)return NaN;void 0===b&&(b=!0);void 0=== +c&&(c=!0);let e=0;for(var f=0;f=a.count())throw Error("stepIndex is out of bounds");a=a.pc(g);f>a.duration()&&(f=a.duration());e+=a.startTime()+f}else b&&(f>h.duration()&&(f=h.duration()),e+=f);return e}Io(a,b,c){if(isNaN(a))throw Error("NaN time not accepted");if(0>a)throw Error("negative time not accepted"); +let d=null;for(var e=0;e=a||f&&.001>=a-g)break;a-=g}if(e==this.count()&&0<=a)throw Error("time out of bounds");c=0;b&&(b=d.transition().duration(),b=a)break;a-=e.duration()}if(c==b.count())if(.001>=a)--c,a=b.pc(c).duration();else throw Error("time out of bounds"); +}return new gf(d.index(),c,a)}np(){return this.OB.length}KH(a){if(0>a||a>=this.np())throw Error("Slide index is out of range");return this.OB[a]}Nca(){return this.oP}wu(){return this.nP}}fg.prototype.visibleAnimationStepsDuration=fg.prototype.wu;fg.prototype.visibleSlidesDuration=fg.prototype.Nca;fg.prototype.getVisibleSlide=fg.prototype.KH;fg.prototype.visibleSlidesCount=fg.prototype.np;fg.prototype.convertTimeToTimestamp=fg.prototype.Io;fg.prototype.convertTimestampToTime=fg.prototype.mi; +fg.prototype.createTimestamp=fg.prototype.x$;fg.prototype.duration=fg.prototype.duration;fg.prototype.count=fg.prototype.count;fg.prototype.getSlide=fg.prototype.ja;function gg(a){0<=a.U&&--a.U;return 0<=a.U}function hg(a){for(;a.bI()&&!a.$().visible(););return!!a.$()}function ig(a){for(;gg(a)&&!a.$().visible(););return!!a.$()}class jg{constructor(a,b){this.t7=a;this.zw=b;this.VD=b.length;this.U=-1}seekTo(a){this.U=Vc(a,-1,this.VD);return!0}bI(){this.Ub||b>=a.count())throw Error("actionIndex is out of range");return a.lc[b]};function ug(){this.lc=new sg}ug.prototype.Fb=!0;ug.prototype.enabled=function(){return this.Fb};ug.prototype.ra=function(a){this.Fb=a};ug.prototype.actions=function(){return this.lc};function vg(){this.Fb=!0}vg.prototype.enabled=function(){return this.Fb};vg.prototype.enabled=vg.prototype.enabled;vg.prototype.ra=function(a){this.Fb=a};vg.prototype.Tg=function(){return this.ze};function E(a,b){const c=new C(a);B(a,c);if(b)if(Array.isArray(b))for(const d of b)df(d,c);else df(b,c);return c}class wg extends Ve{};const xg=[.75,1,1.25,1.5,2];class yg extends wg{constructor(){super();this.lN=1;this.Nw=!1;this.Rk=E(this)}playbackRate(){return this.lN}jk(a){this.lN!=a&&(this.lN=a,this.Rk.C())}mD(){return this.Nw}};function zg(){return Mb?"Webkit":Lb?"Moz":Ib?"ms":null}function Ag(a,b){if(b&&a in b)return a;var c=zg();return c?(c=c.toLowerCase(),a=c+nd(a),void 0===b||a in b?a:null):null};var Bg=class extends ce{constructor(a,b){super("visibilitychange");this.hidden=a;this.visibilityState=b}};const Cg=new WeakMap;function Dg(a){var b=Eg;const c=ma(a),d=([,...f])=>b(c,f),e=([f,...g])=>a.apply(f,g);return function(...f){const g=this||ia;let h=Cg.get(g);h||(h={},Cg.set(g,h));return Fb(h,[this,...f],e,d)}}function Eg(a,b){a=[a];for(let c=b.length-1;0<=c;--c)a.push(typeof b[c],b[c]);return a.join("\v")};function Fg(a){He.call(this);this.jC=a||od();if(this.W_=this.eaa())this.T$=ve(this.jC.ld,this.W_,ta(this.laa,this))}t(Fg,He);k=Fg.prototype;k.eaa=Dg(function(){var a=!!this.pC(),b="hidden"!=this.pC();return a?b?((zg()||"")+"visibilitychange").toLowerCase():"visibilitychange":null});k.pC=Dg(function(){return Ag("hidden",this.jC.ld)});k.haa=Dg(function(){return Ag("visibilityState",this.jC.ld)});function Gg(a){return!!a.jC.ld[a.pC()]} +k.laa=function(){var a=this.pC()?this.jC.ld[this.haa()]:null;a=new Bg(Gg(this),a);this.dispatchEvent(a)};k.hf=function(){Ee(this.T$);Fg.Mb.hf.call(this)};class Hg{constructor(){this.M=[];this.aF=1;this.Fn=this.Ee=0;this.Tf=!1}push(a){this.Tf||(this.M[this.Fn]=a,this.Fn=(this.Fn+1)%this.aF,this.Ee=Math.min(this.Ee+1,this.aF))}pop(){if(this.Tf||this.ri())return null;this.Fn=0>this.Fn-1?this.aF-1:this.Fn-1;this.Ee--;return this.M[this.Fn]}top(){return this.ri()?null:this.M[0>this.Fn-1?this.aF-1:this.Fn-1]}ri(){return!this.Ee}size(){return this.Ee}lock(){this.Tf=!0}unlock(){this.Tf=!1}};var Ig={ofa:"playingSlide",pfa:"playingTransition",kfa:"pausedTransition",jfa:"pausedSlide",e2:"suspended",XR:"buffering"};q("ispring.presenter.player.PresentationPlaybackState",Ig);q("PLAYING_SLIDE","playingSlide",Ig);q("PAUSED_SLIDE","pausedSlide",Ig);q("SUSPENDED","suspended",Ig);q("PLAYING_TRANSITION","playingTransition",Ig);q("PAUSED_TRANSITION","pausedTransition",Ig);q("BUFFERING","buffering",Ig);function Jg(a){this.Ga=a}Jg.prototype.type=function(){return this.Ga};function Kg(a){this.Ga="gotoSlide";this.Fd=a}t(Kg,Jg);Kg.prototype.L=function(){return this.Fd};function Lg(a){this.B=a}Lg.prototype.WP=function(a){switch(a.type()){case "closePlayerWindow":this.B.eE.C();return;case "gotoNextSlide":Pg(this.B,!0,!0,!0);return;case "gotoSlide":this.bL(a.L());return}throw Error("unknown action type");};Lg.prototype.bL=function(a){this.B.pe(a)};function Qg(a,b,c,d,e){this.eG=a;this.FX=b;this.dG=c;this.iS=d;this.VZ=e}Qg.prototype.quizState=function(){return this.FX};Qg.prototype.quizPassed=function(){return this.dG};Qg.prototype.allowRetakeQuiz=function(){return this.iS};Qg.prototype.eD=function(){return{type:this.eG,state:this.FX,passed:this.dG,retake:this.iS,attempts:this.VZ}}; +function Rg(a){const b=a.quiz().isGraded()?"graded":"survey";var c=a.currentSession();if(c){const d=c.evaluation();c=c.sessionMode();const e=a.usedAttemptsCount();let f=!1,g=!1;d&&(f=d.quizPassed(),g=a.allowRetakeQuiz());return new Qg(b,c,f,g,e)}return new Qg(b,null,!1,a.allowRetakeQuiz(),0)};function Sg(a){return"graded"==a.eG?a.quizPassed():Tg(a)}function Tg(a){a=a.quizState();return"completed"==a||"reviewing"==a};function Ug(a){this.Ga=a}Ug.prototype.type=function(){return this.Ga};function Vg(a){this.Ga="gotoSlide";this.Fd=a}t(Vg,Ug);Vg.prototype.L=function(){return this.Fd};function Wg(a){this.B=a}Wg.prototype.WP=function(a){switch(a.type()){case "closePlayerWindow":this.B.eE.C();return;case "gotoNextSlide":Pg(this.B,!0,!0,!0);return;case "gotoSlide":this.bL(a.L());return}throw Error("unknown action type");};Wg.prototype.bL=function(a){this.B.pe(a)};class Xg{constructor(a,b,c){this.xw=a;this.TX=b;this.B8=c}};var Yg={Jga:"started",e2:"suspended",XR:"buffering",Kga:"stopped",Wfa:"rewinding"};q("ispring.presenter.player.clock.PresentationClockState",Yg);q("STARTED","started",Yg);q("SUSPENDED","suspended",Yg);q("BUFFERING","buffering",Yg);q("STOPPED","stopped",Yg);q("REWINDING","rewinding",Yg);class Zg extends Lf{constructor(a,b,c,d){super(a,b,c);this.YW=d;this.aX=this.VX=this.fU=!1}nQ(){return this.fU}uI(){return this.VX}NQ(){return this.aX}};var $g=wb(),ah=Bb()||vb("iPod"),bh=vb("iPad"),ch=Ab(),dh=zb(),eh=yb()&&!Cb();function fh(a,b){b||(b={});var c=window;if(a instanceof Ac)var d=a;else d="undefined"!=typeof a.href?a.href:String(a),d instanceof Ac||(d="object"==typeof d&&d.ux?d.ox():String(d),Dc.test(d)?d=new Ac(d,zc):(d=String(d),d=d.replace(/(%0A|%0D)/g,""),d=d.match(Cc)?new Ac(d,zc):null)),d=d||Fc;var e=void 0!==self.crossOriginIsolated,f="strict-origin-when-cross-origin";window.Request&&(f=(new Request("/")).referrerPolicy);const g="unsafe-url"===f;f=b.noreferrer;if(e&&f){if(g)throw Error("Cannot use the noreferrer option on a page that sets a referrer-policy of `unsafe-url` in modern browsers!"); +f=!1}a=b.target||a.target;e=[];for(var h in b)switch(h){case "width":case "height":case "top":case "left":e.push(h+"="+b[h]);break;case "target":case "noopener":case "noreferrer":break;default:e.push(h+"="+(b[h]?1:0))}h=e.join(",");if(Cb()&&c.navigator&&c.navigator.standalone&&a&&"_self"!=a){b=zd("A");a:{try{var l=b&&b.ownerDocument,n=l&&(l.defaultView||l.parentWindow);n=n||ia;if(n.Element&&n.Location){var m=n;break a}}catch(r){}m=null}if(m&&"undefined"!=typeof m.HTMLAnchorElement&&(!b||!(b instanceof +m.HTMLAnchorElement)&&(b instanceof m.Location||b instanceof m.Element))){if(la(b))try{var p=b.constructor.displayName||b.constructor.name||Object.prototype.toString.call(b)}catch(r){p=""}else p=void 0===b?"undefined":null===b?"null":typeof b;Ga("Argument is not a %s (or a non-Element, non-Location mock); got: %s","HTMLAnchorElement",p)}m=d instanceof Ac?d:Ec(d);b.href=Bc(m);b.target=a;f&&(b.rel="noreferrer");m=document.createEvent("MouseEvent");m.initMouseEvent("click", +!0,!0,c,1);b.dispatchEvent(m);c={}}else f?(c=Tc("",c,a,h),b=Bc(d),c&&(Kb&&-1!=b.indexOf(";")&&(b="'"+b.replace(/'/g,"%27")+"'"),c.opener=null,""===b&&(b="javascript:''"),b=ib(b),b=Kc(''),(m=c.document)&&m.write&&(m.write(Hc(b)),m.close()))):((c=Tc(d,c,a,h))&&b.noopener&&(c.opener=null),c&&b.noreferrer&&(c.opener=null));return c};let gh;function hh(a){a instanceof ie&&(a=a.oe);gh||(gh=new WeakMap);return gh.has(a)}function ih(a){a instanceof ie&&(a=a.oe);return a.defaultPrevented?!0:hh(a)};function jh(a,b){He.call(this);this.wx=a||1;this.dD=b||ia;this.C_=ta(this.Aca,this);this.p0=wa()}t(jh,He);k=jh.prototype;k.enabled=!1;k.El=null;k.setInterval=function(a){this.wx=a;this.El&&this.enabled?(this.stop(),this.start()):this.El&&this.stop()};k.Aca=function(){if(this.enabled){var a=wa()-this.p0;0>=8);b[c++]=e}a=void 0;void 0===a&&(a=0);rh();a=lh[a];c=Array(Math.floor(b.length/3));d=a[64]||"";let n=0;for(e=0;n>2];f=a[(f&3)<<4|g>>4];g=a[(g&15)<<2|h>>6];h=a[h&63];c[e++]=""+l+f+g+h}l=0;h=d;switch(b.length-n){case 2:l=b[n+1],h=a[(l&15)<<2]||d;case 1:b=b[n],c[e]=""+a[b>>2]+a[(b&3)<<4|l>>4]+h+d}b=c.join("")}return b} +function sh(a){if(ph)return ia.atob(a);var b="";th(a,function(c){b+=String.fromCharCode(c)});return b}function uh(a){var b=[];th(a,function(c){b.push(c)});return b}function th(a,b){function c(l){for(;d>4);64!=g&&(b(f<<4&240|g>>2),64!=h&&b(g<<6&192|h))}} +function rh(){if(!mh){mh={};for(var a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""),b=["+/=","+/","-_=","-_.","-_"],c=0;5>c;c++){var d=a.concat(b[c].split(""));lh[c]=d;for(var e=0;e{Fd(b)},100)}catch(b){return!1}return!0};function gi(a){this.length=a.length||a;for(let b=0;b{a.apply(b||null,e)},c)}function Hi(){return Ii&&!Ji?"about:blank":""}function Ki(){const a=Li();return Math.max(1,Math.min(a.width,a.height)/420)} +function Li(){if(Mi)return new cd(document.documentElement.clientWidth,document.documentElement.clientHeight);if(Ii&&Ib)return new cd(screen.width,screen.height);var a=void 0!==window.devicePixelRatio?window.devicePixelRatio:1;return Ji?new cd(screen.width/a,screen.height/a):Ii?Ni&&(a=Math.max(screen.width,screen.height),document.documentElement.clientWidth>a)?new cd(Math.max(document.documentElement.clientWidth,a),Math.max(document.documentElement.clientHeight,Math.min(screen.width,screen.height))): +new cd(screen.width,screen.height):new cd(screen.width*a,screen.height*a)}function Oi(){var a=window.location.search.substr(1);if(a){var b={};a=a.split("&");for(let e=0;e{setTimeout(()=>{if(!ih(d.oe)){const e=d.currentTarget;Ri(e.href,e.target||"_blank")}})});ve(c,"click",d=>{d.preventDefault()})}}function Ri(a,b){ei?(new di("openWindow",[a])).ix():fh(a,b?{target:b}:void 0)}function Si(a){if(!a)return!1;for(;a;){if("A"==a.nodeName.toLocaleUpperCase())return!0;a=a.parentNode}return!1}function Ti(a){return a&&"VIDEO"==a.nodeName&&a.controls} +function Ui(a){const b=wd("script",{type:"text/javascript",charset:"UTF-8"});document.body.appendChild(b);b.src=a;return b}function Vi(){return 0==window.location.href.indexOf("file:")}function Wi(){const a=wd("DIV");try{Di(a,"100px")}catch(b){return!1}return!0}function Xi(){let a;try{const b=wd("CANVAS");a=b.getContext("webgl")||b.getContext("experimental-webgl")}catch(b){}return a?!0:!1};(function(){function a(b){try{return b.ISPlayer&&(window.ISPlayer=b.ISPlayer),b.ISPVideoPlayer&&(window.ISPVideoPlayer=b.ISPVideoPlayer),b.ISPQuizPlayer&&(window.ISPQuizPlayer=b.ISPQuizPlayer),b.ISPInteractionPlayerCore&&(window.ISPInteractionPlayerCore=b.ISPInteractionPlayerCore),b.ISPBookPlayer&&(window.ISPBookPlayer=b.ISPBookPlayer),b.ISPScenarioPlayer&&(window.ISPScenarioPlayer=b.ISPScenarioPlayer),b.ISPFlipPlayer&&(window.ISPFlipPlayer=b.ISPFlipPlayer),!0}catch(c){return!1}}if(function(){let b; +try{b=window.frameElement}catch(c){}return null!=b}()){let b=window,c=7;for(;b&&b.parent!=b&&0!=c--&&!a(b.parent);)b=b.parent}})();var Yi;const Zi=Oi().user_agent;Yi=Zi?Zi:ub()||"";var Ni=bh||ah,Mi="1"==Oi().small_screen,$i="1"==Oi().tablet_screen,aj;let bj;try{bj=window.top.location.href?window.frameElement:null}catch(a){}var cj=(aj=null!=bj)&&window.frameElement&&window.frameElement.parentNode&&"FRAMESET"==window.frameElement.parentNode.tagName?!0:!1,dj=ah&&aj; +function ej(){const a=Yi.toLowerCase();return-1!=a.indexOf("android")||-1!=a.indexOf("mobile")||-1!=a.indexOf("wpdesktop")||Mi||$i}var fj=-1!=Yi.toLowerCase().indexOf("chrome"),gj=Mb&&!fj,hj=-1!=Yi.indexOf("CriOS"),ij=-1==Yi.toLowerCase().indexOf("windows phone")&&-1!=Yi.toLowerCase().indexOf("android"),Ii=ej(),jj=Ii&&(ej()?"ontouchstart"in window||void 0!==window.DocumentTouch&&document instanceof window.DocumentTouch||-1!=Yi.toLowerCase().indexOf("touch"):!1);let kj=""; +if(Ni){const a=/CPU.+OS\s(\d+)_(\d+)/.exec(Yi);kj=a?a[1]+"."+a[2]:""}var lj=parseInt(kj,10),mj=Ni&&6>=lj,nj=Ni&&7<=lj,oj=Ni&&8<=lj,pj=Ni&&9<=lj,qj=Ni&&10<=lj,rj=Ni&&12<=lj,sj=Ib&&"9."==Vb.substr(0,2),tj=Ib&&"10."==Vb.substr(0,3),vj=uj&&Ib,Ji=ij&&!fj&&!$g&&!Hb,wj=-1!=Yi.toLowerCase().indexOf("micromessenger"),ei=-1!=Yi.indexOf("ismobile"),xj=ei&&ah,yj=ei&&ij,zj; +if(zj=!window._ispringFullsizeSkin){var Aj;if(!(Aj=Mi))if(window._ispringFullsizeSkin)Aj=!1;else{var Bj=Li();Aj=(ah||700>Math.min(Bj.width,Bj.height))&&!$i}zj=Aj}var uj=zj,Cj=ah&&!xj&&10>lj||vj&&uj,Dj=void 0!==window.ISPlayer,Ej=Dj&&uj,Fj=Ii&&!Dj,Gj=!1,Hj=Ni||vj||ij||jj;const Ij=document.createElement("audio"),Jj=Ij.play&&Ij.play(); +Jj&&Jj.then(()=>{Ij.pause()},a=>{if(0=HTMLMediaElement.HAVE_METADATA}function Sj(a){var b=(b=a.Xf)?b.error?"error":b.ended?"ended":Tj(a)?"paused":a.tf?"buffering":"playing":"disposed";const c=a.Pa;c!=b&&(a.Pa=b,a.zq.C(a,c))}function Tj(a){const b=a.mediaElement();return Ni||!a.hj()?!a.Wc:b.paused}function Rj(a){return!!a.Xf&&!a.Xf.error&&void 0!==a.Xf.play}function Uj(a){a.wy&&(clearInterval(a.wy),a.wy=void 0)}function Vj(a){0>a.vy&&(a.vy=setInterval(a.S2.bind(a),500))} +function Wj(a){0=HTMLMediaElement.HAVE_CURRENT_DATA)||we(a,"canplay",this.KM,!1,this);Sj(this)}mediaElement(){if(!this.Xf)throw Error("media player was disposed");return this.Xf}state(){return this.Pa}playbackRate(){return this.Xf.playbackRate}jk(a){this.Xf&&a!=this.playbackRate()&&(this.Xf.playbackRate= +a,this.Xf.defaultPlaybackRate=a,this.Rk.C())}ready(){return Rj(this)&&this.$h}xz(){const a=this.$m;var b=this.mediaElement().getAttribute("preload");b=b&&"metadata"!=b?$g?HTMLMediaElement.HAVE_CURRENT_DATA:HTMLMediaElement.HAVE_FUTURE_DATA:HTMLMediaElement.HAVE_METADATA;$g&&this.mediaElement().readyState>=HTMLMediaElement.HAVE_CURRENT_DATA&&!this.$h?this.KM():(this.$m=this.$h&&Rj(this)&&this.mediaElement().readyState>=b,!this.$m&&Ii&&1==this.mediaElement().networkState&&1==this.z4&&(this.$m=!0,this.k7.C(this)), +this.$m||this.qs?this.$m&&(clearInterval(this.qs),this.qs=void 0):this.qs=setInterval(this.xz.bind(this),2E3),!a&&this.$m&&this.vp.C(this),this.z4=this.mediaElement().networkState)}bC(){this.xz();return this.$m}yM(){this.xz()}playing(){return this.Wc}play(){if(Rj(this)){this.Wc=!0;Ni&&"VIDEO"==this.mediaElement().tagName&&this.src()&&!this.mediaElement().src&&(this.mediaElement().src=this.src());const a=this.mediaElement().play();a&&a.catch(b=>window.console.log(b));if(nj){const b=this.mediaElement().currentTime; +let c=0;clearInterval(this.wy);this.wy=setInterval(()=>{++c;this.mediaElement().currentTime=d&&e>=Math.min(this.currentTime()+5,this.duration())){c=!1;this.mediaElement().paused&&this.mediaElement().play();break}}this.tf!=c&&(this.tf=c,Sj(this))}}Jo(a){this.mediaElement().controls=a}hj(){return this.mediaElement().controls|| +ah}Ch(a){if(this.Xf&&this.Xf.play){if("string"!==typeof a)a:{Array.isArray(a)||(a=[a]);for(let c=0;c{});c.pause();d.push(c)}function b(){if(30>ek.length)for(var c=ek.length;30>c;++c){var d=dk();a(d,ek)}if(30>fk.length)for(c=fk.length;30>c;++c)d=zd("VIDEO"),d.setAttribute("preload","metadata"),qj&&d.setAttribute("playsinline",""),a(d,fk)}if(Fj){let c=!1;document.body.addEventListener("touchstart",()=>{c=!0});document.body.addEventListener("touchmove", +d=>{if(Ni||!d.defaultPrevented)c=!1});document.body.addEventListener("touchend",d=>{!1!==d.isTrusted&&c&&b()})}else Ib||Jb||document.body.addEventListener("mouseup",()=>b());window.ismediacreator=[ek,fk]}function gk(){return ek&&ek.length?ek.shift():dk()};class hk extends Xj{constructor(a){super(a);this.Nz=0;this.kL=!1}IM(){this.kL?this.kL=!1:super.IM()}LM(){super.LM();this.Nz=Date.now()}Pv(){super.Pv();if(this.ready()&&Ji){var a=100>Date.now()-this.Nz;this.playing()||a||(this.kL=!0,a=this.mediaElement(),a.play(),a.pause())}}};class ik extends ck{constructor(a){super(new hk(a))}};class jk{constructor(a,b,c){this.Yl=a;this.wB=b;this.Xi=c;0>this.Xi&&(this.Xi=0);this.Yl&&0>this.Yl.m.t&&(this.Yl.m.t=0)}Aa(){return this.wB}ib(){return this.Xi}cR(){const a={s:this.wB,t:this.Xi};this.Yl&&(a.S=rc(this.Yl));return a}clone(){return new jk(this.Yl?rc(this.Yl):null,this.wB,this.Xi)}};function kk(a,b){return a.sa.querySelector(`#${b}`)}class lk{constructor(a,b){this.sa=a;this.Cv=b}content(){return this.sa}Lx(a,b){this.sa!=a&&(this.sa=a,this.Cv=b,this.qY())}qY(){}};function mk(a,b,c){a.Ca.Ai(a.L(),b,c,!0)}function nk(a){a.gI(a.Bu.count()-1)}function ok(a){a.pause();mk(a,0,0)}function pk(a){const b=a.Ca.Z().timestamp();if(null==a.Va||b.L()!=a.L()||0>b.Aa())throw Error("playback controller not active");}function qk(a,b){b&&a.$p!=b&&(a.$p=b,a.Js())} +class rk{constructor(a,b,c){this.ya=a;this.pa=b;this.Ca=c;this.uX=this.Va=null;this.Bu=a.nb();this.Fd=a.index();this.$p=!1;this.vB=new C;this.wf=new C;this.Aq=new C}slide(){return this.ya}view(){return this.pa}activate(a){this.Va=a;this.Ca.Z().Sb().addHandler(this.wb,this)}deactivate(){this.Va=null;this.Ca.Z().Sb().removeHandler(this.wb,this)}play(){this.Ca.start()}pause(){this.Ca.stop()}L(){return this.Fd}pH(){}NP(){}gI(a){const b=this.Bu.pc(a);this.pause();mk(this,a,b.duration())}nb(){return this.Bu}AH(){pk(this); +return this.Ca.Z().timestamp().Aa()}MP(){pk(this);const a=this.nb().pc(this.AH());return Math.min(a.duration(),this.Ca.Z().timestamp().ib())}C$(){pk(this);const a=this.nb().pc(this.AH());return 0=d.time){a=d.freeze?d.fQ:d.fQ+a-d.time;break a}}throw Error("invalid clock");}return a}sk.prototype.add=function(a){const b=this.Of();b.Gd+=a;return b};sk.prototype.Of=function(){return new sk(this.SS,this.Gd)}; +function uk(a){this.yq=new sk(this);this.vD=[];this.rm=[{time:0,fQ:a,freeze:!1}]}function vk(a,b,c,d){b={time:b,fQ:c,freeze:d||!1};0==a.rm.length?a.rm.push(b):(c=a.rm[a.rm.length-1],c.time!=b.time&&wk(a,c.time,b.time)?a.rm.push(b):a.rm.splice(a.rm.length-1,1,b))}uk.prototype.persistState=function(){return{t:this.yq.time(),p:Ua(this.rm)}};function wk(a,b,c){return La(a.vD,d=>d>=b&&d<=c)};class xk{constructor(a,b){this.o$=a[ia.Symbol.iterator]();this.Kaa=b}[Symbol.iterator](){return this}next(){const a=this.o$.next();return{value:a.done?void 0:this.Kaa.call(void 0,a.value),done:a.done}}}function yk(a,b){return new xk(a,b)};function zk(){}zk.prototype.next=function(){return Ak};var Ak={done:!0,value:void 0};function Bk(a){return{value:a,done:!1}}zk.prototype.sj=function(){return this};function Ck(a){if(a instanceof zk)return a;if("function"==typeof a.sj)return a.sj(!1);if(ka(a)){let b=0;const c=new zk;c.next=function(){for(;;){if(b>=a.length)return Ak;if(b in a)return Bk(a[b++]);b++}};return c}throw Error("Not implemented");} +function Dk(a,b){if(ka(a))u(a,b);else for(a=Ck(a);;){const {done:c,value:d}=a.next();if(c)break;b.call(void 0,d,void 0,a)}}function Ek(a,b,c){let d=0,e=a,f=c||1;1=e||0>f&&d<=e)return Ak;const h=d;d+=f;return Bk(h)};return g}function Fk(a){if(ka(a))return Ua(a);a=Ck(a);const b=[];Dk(a,function(c){b.push(c)});return b};function Gk(a){if(a instanceof Hk||a instanceof Ik||a instanceof Jk)return a;if("function"==typeof a.next)return new Hk(()=>a);if("function"==typeof a[Symbol.iterator])return new Hk(()=>a[Symbol.iterator]());if("function"==typeof a.sj)return new Hk(()=>a.sj());throw Error("Not an iterator or iterable.");}class Hk{constructor(a){this.hQ=a}sj(){return new Ik(this.hQ())}[Symbol.iterator](){return new Jk(this.hQ())}SI(){return new Jk(this.hQ())}} +class Ik extends zk{constructor(a){super();this.AC=a}next(){return this.AC.next()}[Symbol.iterator](){return new Jk(this.AC)}SI(){return new Jk(this.AC)}}class Jk extends Hk{constructor(a){super(()=>a);this.AC=a}next(){return this.AC.next()}};function Kk(a,b){this.xl={};this.Yc=[];this.jD=this.size=0;var c=arguments.length;if(12*this.size&&Mk(this),!0):!1}; +function Mk(a){if(a.size!=a.Yc.length){for(var b=0,c=0;b=d.Yc.length)return Ak;var f=d.Yc[b++];return Bk(a?f:d.xl[f])};return e};function Nk(a,b){return Object.prototype.hasOwnProperty.call(a,b)};function Pk(){this.Pr=[[]]}function Qk(a){return a.Pr[a.Pr.length-1]}k=Pk.prototype;k.add=function(a){let b=Qk(this);Array.isArray(a)?(b=Ta(b,a),this.Pr[this.Pr.length-1]=b):b.push(a)};k.push=function(){this.Pr.push([])};k.pop=function(){if(1>=this.Pr.length)throw Error("");const a=this.Pr.pop();this.add(a);return a};k.clear=function(a,b){const c=Qk(this);a=void 0!==a?a:0;b=void 0!==b?b:c.length;c.splice(a,b-a)};k.apply=function(a){const b=Qk(this);for(let c=0;c=l?(e-f)/(2*l):(e-f)/(2-2*l));c=[Math.round(g+360)%360,h,l]}else c=b;d=c;"rgb"==a?(b=d[1],c=d[2],a=d[0]/360,0==b?c=d=a=255*c:(b=.5>c?c*(1+b):c+b-b*c,e=2*c-b,c=255*Vk(e,b,a+1/3),d=255*Vk(e,b,a),a=255*Vk(e,b,a-1/3)),a=[Math.round(c),Math.round(d),Math.round(a)]):a=d}return a}Bm(a){const b= +this.fe==a.fe?this.Nb:this.Sc(a.fe);return bb(b,a.Nb)}clone(){return new Tk(this.fe,Ua(this.Nb))}};class Wk extends Sk{constructor(a,b,c,d,e){super(c,d,e);this.Pf=a;this.Cr=[];this.jq=b||0}color(){return this.Pf}priority(){return this.jq}Tt(){const a=this.Of();a.Pf.multiple(-1);return a}Of(){const a=new Wk(this.Pf.clone(),this.jq,this.absolute(),this.Z(),this.completed());a.Cr=Ua(this.Cr);return a}yD(a){if(this.absolute()){this.Pf.add(a.Pf);for(let b=0;b=a)return 0;if(1<=a)return 1;const b=this.f2,c=this.t3,d=1-(b+c),e=1/(b/2+d+c/2);let f=0;0b?b:a,2)/2,a-=b);0d?d:a),a-=d);0a||a>this.duration())throw Error("invalid action's run time");return this.tt?this.tt.normalize(a,this.duration(),b):a};function Fl(){}t(Fl,El);function Gl(a){let b=0;a instanceof El&&(b=a.duration());return b}function Hl(){}Hl.prototype.se=function(a,b,c,d){a.se(b,c,d)};Hl.prototype.complete=function(a,b,c){if(a instanceof Al)a.se(b,c);else if(a instanceof El)a.complete(b,c);else throw Error("unknown action");};var Il=null;function Jl(){Il||(Il=new Hl);return Il}function Kl(){}Kl.prototype.se=function(a,b,c,d){a.gk(b,c,d)}; +Kl.prototype.complete=function(a,b,c){if(a instanceof Al)a.gk(b,c);else if(a instanceof El)a.NC(b,c);else throw Error("unknown action");};var Ll=null;function Ml(){Ll||(Ll=new Kl);return Ll};function Nl(a){this.lc=a||[];this.LN=a?a.slice().reverse():[]}t(Nl,Fl);k=Nl.prototype;k.Ea=-1;k.uh=function(a){if(0<=this.Ea)throw Error("ActionsSequence was already initialized");this.lc.push(a);this.LN.splice(0,0,a)};k.EJ=function(){let a=0;for(let b=0;bthis.Ea&&(this.Ea=this.EJ());return this.Ea};k.se=function(a,b,c){a=this.Mi(a);this.uc(this.lc,Jl(),a,b,c)};k.complete=function(a,b){this.Eh(this.lc,Jl(),a,b)}; +k.gk=function(a,b,c){a=this.Mi(a,!0);this.uc(this.LN,Ml(),a,b,c)};k.NC=function(a,b){this.Eh(this.LN,Ml(),a,b)}; +k.uc=function(a,b,c,d,e){const f=ma(this)+"",g=d.yd;g.push();var h=0;let l=0,n=d.fv.get(f);var m;if(m=n)m=n,m=tk(m.Z())==tk(e)&&m.time()<=c;m&&(h=n.j2+1,l=n.duration(),g.add(n.yd));n=null;m=!1;const p=a.length;for(let r=h;ra||a>=this.count()?null:this.Hn[a]};fm.prototype.Al=function(a){for(let b=0;bb.push(c));return b}function sm(a){if(a.Nc){var b=a.Nc.Xa,c=a.Xa,d=a.fr;c=new Wf(c.left-.5*d,c.top-.5*d,c.width+d,c.height+d);d=Math.abs(b.top-c.top);var e=Math.abs(b.width-c.width),f=Math.abs(b.height-c.height);a.ZB=1E-4>Math.abs(b.left-c.left)&&1E-4>d&&1E-4>e&&1E-4>f&&!a.B_}} +class tm{constructor(a,b,c){this.type=a;this.Xa=b;this.zIndex=c;this.Dl=[];this.Qq=[];this.Nc=null;this.B_=!1;this.text="";this.Fl=this.ul=!1;this.rotation=0;this.ne=this.mj=void 0;this.fr=0;this.ZB=!1;this.kx=new qm}};var um={Bfa:"slide",T1:"interaction",b2:"quiz",c2:"scenario"};q("ispring.presenter.presentation.slides.SlideType",um);q("PRESENTATION_SLIDE","slide",um);q("INTERACTION_SLIDE","interaction",um);q("QUIZ_SLIDE","quiz",um);q("SCENARIO_SLIDE","scenario",um);function vm(a,b,c,d,e,f,g){this.c3=a;this.th=b;this.Ua=c;this.Na=d;this.Xi=e;this.M2=void 0==f?"":f;this.m9=g;this.ml=1}k=vm.prototype;k.containerId=function(){return this.c3};k.url=function(){return this.th};k.width=function(){return this.Ua};k.height=function(){return this.Na};k.ib=function(){return this.Xi*this.ml};k.Al=function(a){this.ml=a};k.bgColor=function(){return this.M2};k.D1=function(){return this.m9};function wm(){this.$y=[]}wm.prototype.count=function(){return this.$y.length};wm.prototype.Al=function(a){for(let b=0;b{a.PB.push(e)}),c=!0);c||a.PB.push(b)} +class Am extends dg{constructor(){var a=new em;super("slide");this.GL=!0;this.yv=new bm(a);this.zU=[];this.Au=new nm;this.Sd=[];this.PB=[];this.kU=[];this.Ao=new ym;this.Xy=new fm;this.CK=new wm;this.ww=[];this.Qg=a}persistState(a){a=super.persistState(a);a.visitedHyperlinks=this.PB;return a}Eo(a,b){super.Eo(a,b);this.PB=w(a,"visitedHyperlinks",!1)}WI(){return this.PB}fD(){return this.Sd}vh(a){0>Ia(this.Sd,a)&&this.Sd.push(a)}oD(){return this.Ao}};function Bm(a,b){this.ya=a;this.ot=b}k=Bm.prototype;k.Ya=null;k.zI=function(a){this.Ya=a};function Cm(a,b){return Sf(a.ya.Md(),b)}function Dm(a,b){return Sf(a.ya.$d(),b)}k.playVideo=function(a,b,c){a=Dm(this,a);if(null!=this.ot.Va&&a){var d=this.Ya;Em(d,a,d.X.timestamp(),null!=b?b:null,c||!1)}};k.stopVideo=function(a,b){a=Dm(this,a);null!=this.ot.Va&&a&&Fm(this.Ya,a,b)}; +k.pauseVideo=function(a,b){a=Dm(this,a);if(null!=this.ot.Va&&a){var c=this.Ya;const d=Gm(c,a);d.playing()?(d.pause(),c.Ll==d&&(c.Ll=null)):Em(c,a,c.X.timestamp(),null,b||!1)}};function Hm(a,b,c,d,e){this.$b=a;this.U2=b;this.V2=c;this.c8=d;this.d8=e}k=Hm.prototype;k.id=function(){return this.$b};k.clientX=function(){return this.U2};k.clientY=function(){return this.V2};k.screenX=function(){return this.c8};k.screenY=function(){return this.d8};function Im(a,b){this.KK=a;this.e9=b}function Jm(a){const b=[];for(let c=0;cd&&(d=h,e=g)}return e?(c.Jt().defaultPrevented?e.Pq():e.tH(c),!0):!1}function Qm(a,b){a.Ak[b.mx()]=b}function Wm(a,b){b=b.mx();b in a.Ak&&delete a.Ak[b]}function Xm(a,b){return b in a.Ak?a.Ak[b]:null};function Ym(){this.zB=new C;this.nT=new C;this.CO=new C;this.BO=new C}k=Ym.prototype;k.oo=null;k.aH=!1;k.mx=function(){return"tap"};k.LH=function(a,b){if("touchEnd"==a)return this.aH?1:0;const c=new Xc(b.touches()[0].clientX(),b.touches()[0].clientY());if("touchStart"==a&&1==b.touches().length)return this.oo=c,this.aH=!0,this.CO.C(),vj||ve(window,"scroll",this.Pq,!1,this),0;if(!this.oo)return 0;50>=$c(c,this.oo)||this.aH&&this.Pq();return 0}; +k.tH=function(a){this.zB.C(this.oo.x,this.oo.y,a.Jt());let b=!1;const c=Date.now();this.OU&&1E3>c-this.OU&&50>=$c(this.B4,this.oo)&&(b=!0,this.nT.C(this.oo.x,this.oo.y,a.Jt()));this.OU=b?null:c;this.B4=this.oo};k.Pq=function(){De(window,"scroll",this.Pq,!1,this);this.aH=!1;this.BO.C()};var Zm={},$m=!1,an=-1;function bn(a){return a in Zm?Zm[a]:null}function cn(a,b,c,d,e){this.Na=a;this.L9=b;this.yZ=c;this.O2=d||!1;this.r4=e||!1}cn.prototype.height=function(){return this.Na};cn.prototype.UR=function(){return this.L9};cn.prototype.bold=function(){return this.O2};cn.prototype.italic=function(){return this.r4};function dn(a){a=a||document.styleSheets;for(var b=[],c=en(a),d=0;a=c[d];d++){var e=fn(a);if(e&&e.length)for(var f=0,g=0,h=e.length,l;gparseInt(Vb,10);let d=Ib,e;d&&(e=parseInt(Vb,10),11<=e&&(d=!1));const f=a.content();a=f.querySelectorAll("span");const g=new Ln(()=>{yn(f)});for(let v=0;vl.length)continue;h=3;if(0<=l[0].search("rgb")||0<=l[0].search("#"))h=0;var n= +l.splice(h,l.length-3).join(""),m=parseFloat(l[2]);l=parseFloat(D.top)||0;h=parseFloat(D.left)||0;let I=1,A=1;var p=0,r=D.msTransform;r&&(r=r.match(/matrix\(\s*([\d.-]+),\s*([\d.-]+),\s*([\d.-]+),\s*([\d.-]+),\s*[\d.-]+,\s*[\d.-]+\s*\)/))&&5==r.length&&(I=parseFloat(r[1]),A=parseFloat(r[4]),p=parseFloat(r[3]));if(10>e)y.style.color=n,0null!=d.onclick)&&(b=new Mn,this.vt.C(a.uu,b),b.actionPrevented()&&c.preventDefault())}};function Sn(a,b){this.M4=a;this.eV=b||null}var Tn=[];Sn.prototype.eV=null;Sn.prototype.Bx=function(){return this.M4};Sn.prototype.si=function(){return this.eV};function Un(a,b,c,d,e,f,g,h){this.qD=a;this.sD=b;this.x1=c;this.y1=d;this.x2=e;this.y2=f;this.rD=g;this.tD=h}Un.prototype.clone=function(){return new Un(this.qD,this.sD,this.x1,this.y1,this.x2,this.y2,this.rD,this.tD)};Un.prototype.Bm=function(a){return this.qD==a.qD&&this.sD==a.sD&&this.x1==a.x1&&this.y1==a.y1&&this.x2==a.x2&&this.y2==a.y2&&this.rD==a.rD&&this.tD==a.tD};function Vn(a,b){const c=zd("canvas");void 0!==a&&(c.width=a);void 0!==b&&(c.height=b);return c}function Wn(a,b){b=b instanceof gm?[b.md,b.Wd,b.Vd,b.Id,b.qe,b.re]:b;a.transform(b[0],b[1],b[2],b[3],b[4],b[5])};function Xn(a,b,c){this.Op=a;this.Cd=this.Hh(b||100,c||100);this.Wf=this.Cd.getContext("2d");this.Wf.fillStyle="rgba(255,255,255,1)";this.zv=Yn}Xn.prototype.zv="";Xn.prototype.Dz=!1;Xn.prototype.Hh=function(a,b){return Vn(a,b)};Xn.prototype.apply=function(a,b){const c=a.getContext("2d");c.save();this.Zi(this.Dz?1-b:b);b=this.Cd;c.scale(a.width/b.width,a.height/b.height);c.globalCompositeOperation=this.zv==Yn?"destination-in":"destination-out";c.drawImage(b,0,0);c.restore()}; +function Zn(a){a.Wf.clearRect(-a.Cd.width,-a.Cd.height,2*a.Cd.width,2*a.Cd.height)}function $n(a,b){const c=a.Cd.width,d=a.Cd.height;a=a.Wf;switch(b){case ao[90]:a.rotate(.5*Math.PI);a.translate(0,-d);break;case ao[180]:a.rotate(Math.PI);a.translate(-c,-d);break;case ao[270]:a.rotate(1.5*Math.PI),a.translate(-c,0)}}var Yn="maskIn",ao={0:"0",90:"90",180:"180",270:"270"};function bo(a){Xn.call(this,a);a=a.si();a&1&&$n(this,ao[90]);a&4&&(this.zv="maskOut",this.Dz=!0)}t(bo,Xn);bo.prototype.Zi=function(a){const b=this.Cd;Zn(this);a*=b.width;this.Wf.fillRect(b.width/2-a/2,0,a,b.height)};function co(a,b,c,d){Xn.call(this,a,102,102);this.Y2=d;this.T7=c;b||$n(this,ao[90]);a=Math.ceil(this.Cd.width/d);c=Math.ceil(this.Cd.height/c);this.Yy=this.Hh(a,c);this.lG=this.Hh(this.Cd.width+a,c)}t(co,Xn); +co.prototype.Zi=function(a){Zn(this);var b=this.Yy.width,c=this.Yy.height,d=this.Yy.getContext("2d");d.clearRect(0,0,b,c);d.fillStyle="rgba(255,255,255,1)";d.fillRect(0,0,b*a,c);a=this.lG.getContext("2d");a.clearRect(0,0,this.lG.width,this.lG.height);b=this.Yy;for(c=0;ca;++a)this.gN.push(mo(100)),this.fN.push(this.Hh(20,20));const b=mo(25);for(a=0;aa;++a)for(c=20*a,d=0;5>d;++d)b.drawImage(this.fN[this.j7[5*a+d]],c,20*d)};function no(a){Xn.call(this,a);a.si()&2&&$n(this,ao[90]);this.GX=Fk(Ek(0,100));db(this.GX)}t(no,Xn);no.prototype.Zi=function(a){Zn(this);const b=this.Wf,c=this.Cd.width;a=Math.floor(100*a);for(let d=0;dd;++d)c.fillRect(0,6*d,b?6*(16-d-1):6*d,6);a&32&&$n(this,ao[180])}t(oo,Xn);oo.prototype.Zi=function(a){Zn(this);this.Wf.drawImage(this.iZ,-192*(1-a),0)};function po(a){Xn.call(this,a);a.si()&16&&(this.zv="maskOut",this.Dz=!0);$n(this,ao[270])}t(po,Xn);po.prototype.Zi=function(a){Zn(this);const b=this.Wf;a*=Math.PI;const c=this.Cd.width;b.save();b.translate(c/2,c/2);b.beginPath();b.moveTo(0,0);b.arc(0,0,c,-a,a,!1);b.lineTo(0,0);b.fill();b.restore()};function qo(a,b){Xn.call(this,a);this.VS=a.si();b||(this.zv="maskOut",this.Dz=!0);$n(this,ao[270])}t(qo,Xn);qo.prototype.Zi=function(a){Zn(this);const b=this.Wf,c=this.Cd.width,d=2*Math.PI/this.VS;a*=d;b.save();b.translate(c/2,c/2);b.beginPath();for(let e=0;e=c&&0<=e&&255>=e&&0<=d&&255>=d){c=[c,e,d];break a}}c=[]}if(c.length)return b.OH=Uk(c[0],c[1],c[2]),b.type="rgb",b;if(Go&&(c=Go[a.toLowerCase()]))return b.OH=c,b.type="named",b;throw Error(a+" is not a valid color string");}var Oo=/#(.)(.)(.)/; +function Mo(a){if(!Lo.test(a))throw Error("'"+a+"' is not a valid hex color");4==a.length&&(a=a.replace(Oo,"#$1$1$2$2$3$3"));return a.toLowerCase()}function Po(a){a=Mo(a);a=parseInt(a.slice(1),16);return[a>>16,a>>8&255,a&255]}function Uk(a,b,c){a=Number(a);b=Number(b);c=Number(c);if(a!=(a&255)||b!=(b&255)||c!=(c&255))throw Error('"('+a+","+b+","+c+'") is not a valid RGB color');b=a<<16|b<<8|c;return 16>a?"#"+(16777216|b).toString(16).slice(1):"#"+b.toString(16)} +function Vk(a,b,c){0>c?c+=1:16*c?a+6*(b-a)*c:1>2*c?b:2>3*c?a+(b-a)*(2/3-c)*6:a}var Lo=/^#(?:[0-9a-f]{3}){1,2}$/i,No=/^(?:rgb)?\((0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2})\)$/i;function Qo(){}t(Qo,Do);Qo.prototype.Qm=function(a,b){Qo.Mb.Qm.call(this,a,b);Eo(this,a,b.context());var c=b.context();try{const d=Fh(a,"backgroundColor"),e=a.style.width,f=a.style.height;if(""!=d&&"transparent"!=d&&""!=e&&""!=f){const g=Ko(d);c.save();c.fillStyle=g.OH;c.fillRect(0,0,parseFloat(e),parseFloat(f));c.restore()}}catch(d){}"block"==ia.window.getComputedStyle(a,null).display&&(b.kK=0)};function Ro(){}t(Ro,Do);Ro.prototype.Qm=function(a,b){Ro.Mb.Qm.call(this,a,b);Eo(this,a,b.context());try{if(a.complete&&0{var e=d=d.clone(),f=-d.re;e.qe+=-d.qe;e.re+=f;hm(b,d)});return b} +function Vo(a,b,c,d){const e=parseFloat(c.fontSize);let f=parseFloat(c.letterSpacing);var g=parseFloat(c.lineHeight);isNaN(g)&&(g=parseFloat(c.height));var h=bn(c.fontFamily);!h||isNaN(g)?isNaN(g)?(a.textBaseline="alphabetic",g=e):(a.textBaseline="middle",g*=.5):(a.textBaseline="alphabetic",g=.5*(e*h.height()+g)-e*(h.UR()+h.yZ));if(isNaN(f))a.fillText(b,0,g),b=a.measureText(b).width;else{const l=[];let n=0;for(h=0;ha.indexOf("http://www.w3.org/2000/svg")&&(a=']*>/g,"").replace(/<\/a>/g,"")}k.X0=function(){};function $o(){this.ro={};this.wJ=this.y3.bind(this)}$o.prototype.BS=null;$o.prototype.LU=null;$o.prototype.PJ=null;$o.prototype.y3=function(){const a=this.ro,b=this.LU;let c;for(;c=b.next();){const d=a[c.nodeName.toLowerCase()],e=d.async(),f=this.BS;b.m0()?e?d.x_(f,this.wJ):d.z1(f):e?d.y_(c,f,this.wJ):d.Qm(c,f);if(e)return}c||this.PJ&&this.PJ()}; +function ap(a,b,c,d){const e=b.getContext("2d");e.clearRect(0,0,b.width,b.height);d&&(b.setAttribute("data-scale-x",d.width),e.scale(d.width,d.height));b=new $o;b.ro.div=new Qo;b.ro.a=new Qo;b.ro.img=new Ro;b.ro.span=new To;b.ro.svg=new Wo;b.ro.canvas=new Fo;b.ro.video=new Fo;b.BS=new Co(e);e.Vw=[];b.PJ=c||null;b.LU=new bp(a,b.ro,b.wJ)} +function bp(a,b,c){this.rb=[];const d=new Fn(a),e=this;setTimeout(()=>{const f=new Bo(a);for(;;){var g=f.next();if(g.done)break;g=g.value;if(g!==a){var h=g.nodeName.toLowerCase();if(h in b){var l=f.zC();h=b[h];const n=g.hasAttribute("data-draw-ignore");l&&!h.isVisible(g)||n?(g=f,l=g.xh?-1:1,g.Ah==l&&(g.Ah=-1*l,g.depth+=g.Ah*(g.xh?-1:1))):(l&&h.X0(g),e.rb.push({element:g,zC:l}))}}}Jn(d);c()},0)}bp.prototype.Ih=-1; +bp.prototype.next=function(){this.Ih{var f=b.Op;var g=ma(f)+"";g in vo?g=vo[g]:(f=wo(f),g=vo[g]=f);g.apply(e,b.progress());yi(e,"50% 50%");on(e,a.L4);yo(d,!0)}),c&&.1>b.progress()&&yo(d,!0)):(d.nq=null,d.KD&&yo(d,!1))}function mp(a,b){a=kl(a.Pa,"filter");return a instanceof hp&&b.progress()==a.progress()&&b.Op.Bx()==a.Op.Bx()&&b.Op.si()==a.Op.si()?!1:!0} +function np(a,b){const c=a.X3;if(c)if(b=b.color(),(a=km(a.Ni,"imgColor"))&&b.Bm(a))yo(c,!1);else{const d=b.Sc("rgb");c.zx()||c.pI();Ao(c,e=>{const f=e.getContext("2d");try{const g=f.getImageData(0,0,e.width,e.height),h=g.data;for(e=0;e=e&&g<=f&&c.se(b,d.add(g))}};function Op(a,b){this.Qg=a;this.Pj=b;this.ve=new Pp(Ql(b.Zs),a);this.pV=[new Jp(b),new Mp(b)];this.g3=new Kk;this.reset(0);this.Lw=new C}k=Op.prototype;k.Gd=0;k.Zx=function(){return this.Lw};k.timeline=function(){return this.Pj};k.time=function(){return this.Gd};k.resume=function(a){const b=Kp(this.ve);b&&vk(Lp(this.ve,b),this.Gd,a)}; +k.seek=function(a,b){if(aa)break}else if(l=h.pk(),l.required())break;else f=new uk(tk(f.add(g))),this.ve.vh(l,f),f=f.yq,a-=g,g=0}this.Gd=a;b=new yl(b,this.g3);for(h=0;h{a.push(c.id())},this);const b=[];u(this.JB,c=>{b.push(c.persistState())},this);return{t:a,at:b}};Pp.prototype.vh=function(a,b){b.vD=this.vD[this.JB.length];this.Sd.push(a);this.JB.push(b)}; +function Lp(a,b){b=Ia(a.Sd,b);if(0>b)throw Error("trigger wasn't activated");return a.JB[b]}function Kp(a){const b=a.Sd.length;return 0{b=b.Z();c=c.Z();return!!b!=!!c?b?1:-1:b&&c?tk(b)-tk(c):0})};function Yp(a){const b=a.ya;var c=b.yv;if(!c)throw Error("slide must contain main timeline");Zp(a);a.Uf=new Op(b.Qg,c);a.Uf.Zx().addHandler(()=>{a.Lw.C(a.Fd)});c=b.zU;a.Gk=[];for(let d=0;d{a.Lw.C(a.Fd)})}} +function Zp(a){a.ya.GL&&a.ya.Au.Sc().forEach(b=>{if(!a.tL.includes(b.id())){var c=a.pp.get(b.id());$p(a,b)&&(jl(c,"moveX",!0).add(new bl(b.Xa().left,!0)),jl(c,"moveY",!0).add(new bl(b.Xa().top,!0)));if(c=(c=rp(a.d_,b,c))?c.mv:null)c=new Tp(b.id(),c),a.ya.yv.qL.uh(c),a.ya.yv.Zs.uh(b.id(),new Up(0),0),a.tL.push(b.id())}})}function $p(a,b){return!a.ya.ww.find(c=>c.Nc&&c.Nc.id==b.id()||!!c.Dl.find(d=>d.id==b.id()))}function aq(a,b){a&&(a.reset(b),a.timeline().Zs.reset())} +function bq(a){if(!a.Uf)throw Error("animation controller isn't activated");}function cq(a){return"completed"==a.Uf.playbackState().state()?a.ya.nb().count()-1:a.Uf.ve.Sd.length-1-1}function dq(a){if(a.Gk){const b=a.kn();for(let c=0;cb.Aa()||c!=a.Fd?!1:!0} +class fq{constructor(a,b,c,d,e){this.ya=a;this.X=c;this.Ae=e;this.Lw=new C;this.Fd=a.index();this.pp=new xl;this.d_=new qp(a,b);this.T4=new sp(d);this.Gk=this.Uf=null;this.Db=!1;this.tL=[];a.ww.forEach(f=>rm(f).forEach(g=>this.pp.set(g.id,g.state)))}Zx(){return this.Lw}persistState(){const a=[];u(this.Gk,b=>{a.push(b.persistState())},this);return{m:this.Uf.persistState(),i:a}}restoreState(a){this.Uf||Yp(this);this.Uf.restoreState(a.m);this.tI(a);this.uo(0,0)}tI(a){u(a.i,(b,c)=>{this.Gk[c].restoreState(b)})}reset(a, +b){void 0===a&&(a=-1);void 0===b&&(b=0);this.Uf||Yp(this);this.bG=this.kn();this.xX=a;this.yX=b;aq(this.Uf,this.bG);0<=a&&(this.uo(0,0),this.seek(a,b));this.uo(0,0,!1)}qI(){this.ya.Au.Sc().some(a=>!this.tL.includes(a.id()))&&(this.ya.yv.qL.Ea=-1,Zp(this),this.reset(0,0))}activate(){if(this.Db)throw Error("already activated");this.Db=!0;this.X.Sb().addHandler(this.wb,this);this.X.Cl().addHandler(this.IV,this)}deactivate(){bq(this);this.Db=!1;this.X.Sb().removeHandler(this.wb,this);this.X.Cl().removeHandler(this.IV, +this)}play(){bq(this);this.Uf.resume(this.kn())}pause(){bq(this)}uo(a,b,c){var d=[];c=void 0!==c?c:this.X.Ag();a=this.Uf.Ai(a,this.pp,c);d.push(a);for(a=0;a +v.level())p=v;m=p}else if(m instanceof Xk){m=Xp(p);p=null;for(r=0;r=this.Uf.ve.Sd.length?0:this.Uf.time();if(a>d||a==d&&(void 0===b||e<=b)){for(;cq(this)!=a;)this.Uf.Tw("__step",c),e=0;void 0!== +b&&0e)){c=c.Sj();const f=[];for(let g=0;g=d&&l<=e&&f.push(h)}d=f;for(e=0;e{(e=kk(a.pa,e.YW))?(kq(d,e),b=!0):c=!0});a.iP=b&&!c}function lq(a){jq(a,b=>b.$Q())}function mq(a){jq(a,b=>{b.stop();Lj&&b.JP()})}function nq(a){jq(a,b=>oq(b));a.iP=!1}function jq(a,b){const c=a.Va.ie;a.ya.$d().Sc().forEach(d=>{if(!(0b?a.rp:a.M[b]).fl)}ju(a){Th(this.slide(),a)}width(){return this.Ua}height(){return this.Na}slide(){return this.ya}clone(){return this.Of}lv(a){Nq(this,a.tb,a.slideBackground()); +Oq(this)}nr(){this.Oc();this.ya=zd("DIV");F(this.ya,"position","absolute");this.vw=zd("DIV");F(this.vw,"position","absolute");this.ya.appendChild(this.vw);Pq(this,this.kv);this.yG=zd("DIV");F(this.yG,"position","absolute");this.ya.appendChild(this.yG);this.yG.appendChild(this.tb);this.fl.appendChild(this.ya);Oq(this)}k0(a){Pq(this,a);this.ya&&Oq(this)}RH(){return this.kv}Oc(){this.ya&&(Fd(this.ya),this.ya=null)}content(){return this.yG}background(){return this.vw}pW(a){this.lv(a)}resize(a,b){if(this.Ua!= +a||this.Na!=b)this.Ua=a,this.Na=b,this.jw(a,b)}jw(a,b){a=Math.min(a/this.OW,b/this.NW,this.gV);this.tb&&Qq(this,this.tb,a);this.no&&Qq(this,this.no,a)}};class Sq{constructor(a){this.m3=a}displayObject(){return this.m3}};class Tq{constructor({Xj:a,uD:b}){this.hh=a.concat();this.tP=b.concat()}Xj(){return this.hh.concat()}uD(){return this.tP.concat()}persistState(){const a={};a.indexes=this.hh;a.zoomStates=this.tP;return a}LP(){return new Tq({Xj:this.hh,uD:this.tP})}};function Uq(a){for(let b=a.Hi.length-1;0<=b;--b)if(a.Hi[b])return a.Hi[b];return null}function Vq(a,b=null){a.GD=b?new Sq(b):null;a.xs=null}function Wq(a,b){const c=[];for(let d=0;dd.includes(e))} +function Yq(a,b,c,d,e,f){function g(l){if(e&&!f.ja(c).visible())return l;for(;l{Jq(a.Ol,a.hi,g,c,l=>{a.VY.set(a.CG[e],l);h(l)},f.RH())})} +function fr(a,b,c,d,e,f){const g=a.Ca.Z().timestamp(),h=dr(g,b,f,d,e);if(a.WD[h])return Promise.resolve(a.aT.get(a.WD[h]));a.WD[h]={hash:h};const l=a.vc.zd[c],n=er(a,c);return new Promise(m=>{Lq(a.Ol,a.hi,n,e,d,f,p=>{a.aT.set(a.WD[h],p);p.setAttribute("id",b);m(p)},l.RH())})} +function gr(a,b,c){function d(){return new Promise(n=>{cr(l,h).then(m=>{l.Lb.jR(m);c.jR(l.Lb.wQ());n()})})}function e(){return new Promise(n=>{fr(l,g.id(),h,g.Xa(),g.rotation(),[g.Wx()]).then(m=>{l.Lb.GD=new Sq(m);n()})})}b=0<=b?a.M.ja(b):void 0;var f=b instanceof br||b instanceof sq||b instanceof Aq;if(!c||f)return Promise.resolve();const g=c.effect(),h=c.wr(),l=a;g&&g.Nm()&&(Vq(a.Lb),a.Lb.BU.C(b));b=g&&!g.Nm()&&!c.na();f=!!c.Yo();a=[];if(f&&b)b=new Promise(n=>{d().then(()=>{e().then(()=>{n()})})}), +a.push(b);else if(f||b)f&&(f=d(),a.push(f)),b&&(b=e(),a.push(b));return Promise.all(a)}function dr(a,b,c,d,e){c=c.join(",");a=[a.Aa(),a.ib(),b,c];d&&a.push(d.toString());void 0!==e&&a.push(e);return a.join("_")}function er(a,b){const c=a.vc.zd[b];b=a.M.ja(b);var d=c.PY;b.GL=!1;d=new ar({content:d,fD:b.fD()});a=new pq(b,d,a.Ca,a.Ae);a.TH();var e=a.nb();d=e.pc(e.count()-1);e=e.count()-1;d=d.duration();a.Me.activate();a.Me.reset(e,1E3*d);b.GL=!0;return c.clone()} +class hr{constructor({lca:a,Pm:b,ada:c,Ho:d,slides:e,yH:f,iI:g}){this.hi=a;this.vc=b;this.Ca=d;this.M=e;this.Va=f;this.Ae=g;this.Ol=new Mq;this.VY=new WeakMap;this.CG={};this.aT=new WeakMap;this.WD={};this.Lb=c;this.uz={}}};function ir(a){this.sa=a.content;this.e3=""==a.contentHover?a.content:a.contentHover;this.th=a.url;this.Ua=a.width;this.Na=a.height;this.n9=a.Yx;this.y4=a.language;this.p3=a.Zw;this.o3=a.Yw;this.q3=a.$w;this.r3=a.ex}k=ir.prototype;k.content=function(){return this.sa};k.contentHover=function(){return this.e3};k.url=function(){return this.th};k.width=function(){return this.Ua};k.height=function(){return this.Na};k.Yx=function(){return this.n9};k.language=function(){return this.y4};k.Zw=function(){return this.p3}; +k.Yw=function(){return this.o3};k.$w=function(){return this.q3};k.ex=function(){return this.r3};function jr(a){ir.call(this,a)}t(jr,ir);class kr{constructor(a,b,c){this.Th=a;this.I4=b;this.v9=[].concat(c)}name(){return this.Th}localName(){return this.I4}urls(){return this.v9}};class lr{constructor(){this.CA=[]}count(){return this.CA.length}d0(a){if(0>a||a>=this.count())throw Error("index is out of range");return this.CA[a]}U9(a){this.CA.push(a)}}lr.prototype.getPresenter=lr.prototype.d0;lr.prototype.count=lr.prototype.count;class mr{constructor(a,b){this.Af=a;this.Kr=b;this.nh=1;this.th=null;this.Bq="_self"}src(){return this.Af}Xa(){return this.Kr}opacity(){return this.nh}Hf(a){this.nh=a}url(){return this.th}target(){return this.Bq}};class nr{constructor(){this.Du={}}XP(a){return a in this.Du}};var or={bda:"activated",Wda:"deactivated",XR:"buffering"};q("ispring.presenter.presentation.narration.NarrationTrackPlaybackState",or);q("ACTIVATED","activated",or);q("DEACTIVATED","deactivated",or);q("BUFFERING","buffering",or);function pr(a,b){a.Yh!=b&&(a.Yh=b,a.dX.C(a))}class qr{constructor(a,b,c){this.il=a;this.IK=b;this.He=void 0!==c?c:1;this.Yh="deactivated";this.dX=new C}jc(){return this.il}jf(){return this.IK}volume(){return this.He}playbackState(){return this.Yh}playbackStateChangedEvent(){return this.dX}}qr.prototype.playbackStateChangedEvent=qr.prototype.playbackStateChangedEvent;qr.prototype.playbackState=qr.prototype.playbackState;qr.prototype.endTimestamp=qr.prototype.jf;qr.prototype.startTimestamp=qr.prototype.jc;class rr extends qr{constructor(a,b,c,d){super(b,c,d);this.v2=a}audio(){return this.v2}}rr.prototype.audio=rr.prototype.audio;class sr{constructor(){this.sm=[]}get C1(){return this.sm}count(){return this.sm.length}sC(a){if(0>a||a>=this.count())throw Error("index is out of range");return this.sm[a]}}sr.prototype.getTrack=sr.prototype.sC;sr.prototype.count=sr.prototype.count;class tr extends sr{b0(a){return this.sC(a)}q_(a){this.sm.push(a)}Sc(){const a=[];for(let b=0;ba||a>=this.count())throw Error("index is out of range");return this.hw[a]}Sc(){return this.hw}}yr.prototype.getReference=yr.prototype.e0;yr.prototype.count=yr.prototype.count;class zr{constructor(){this.hw=new yr}ti(){return this.hw}}zr.prototype.references=zr.prototype.ti;class Ar{constructor(){this.Fb=!1}enabled(){return this.Fb}ra(a){this.Fb=a}};class Br{constructor(){this.Zy=!0}fitToWindow(){return this.Zy}}Br.prototype.fitToWindow=Br.prototype.fitToWindow;var Cr={tea:"free",Qfa:"restricted",jga:"sequential"};q("ispring.presenter.presentation.settings.NavigationType",Cr);q("FREE","free",Cr);q("RESTRICTED","restricted",Cr);q("SEQUENTIAL","sequential",Cr);class Dr{constructor(){this.X4=new vg;this.Kz=new ug;this.N3=new pg;this.Bn="free"}Gm(){return this.X4}keyboard(){return this.Kz}lx(){return this.N3}navigationType(){return this.Bn}lR(a){this.Bn=a}}Dr.prototype.navigationType=Dr.prototype.navigationType;Dr.prototype.mouse=Dr.prototype.Gm;var Er={Dfa:"prompt",eda:"always",Sea:"never"};q("ispring.presenter.presentation.settings.PresentationResumeMode",Er);q("PROMPT_TO_RESUME","prompt",Er);q("ALWAYS_RESUME","always",Er);q("NEVER_RESUME","never",Er);class Fr{constructor(){this.mG=this.qp=this.bV=!1;this.kw="never"}Fm(){return this.bV}eca(a){this.bV=a}ff(){return this.qp}yI(a){this.qp=a}eu(){return this.kw}bR(){return this.mG}}Fr.prototype.resumeMode=Fr.prototype.eu;Fr.prototype.autoStart=Fr.prototype.ff;Fr.prototype.loopPlayback=Fr.prototype.Fm;var Gr={dea:["BC","AD"],cea:["Before Christ","Anno Domini"],Qea:"JFMAMJJASOND".split(""),Ega:"JFMAMJJASOND".split(""),Mea:"January February March April May June July August September October November December".split(" "),Dga:"January February March April May June July August September October November December".split(" "),nga:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),Gga:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),lha:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "), +Iga:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),pga:"Sun Mon Tue Wed Thu Fri Sat".split(" "),Hga:"Sun Mon Tue Wed Thu Fri Sat".split(" "),Rea:"SMTWTFS".split(""),Fga:"SMTWTFS".split(""),oga:["Q1","Q2","Q3","Q4"],Ifa:["1st quarter","2nd quarter","3rd quarter","4th quarter"],fda:["AM","PM"],Uda:["EEEE, MMMM d, y","MMMM d, y","MMM d, y","M/d/yy"],Vga:["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],Vda:["{1} 'at' {0}","{1} 'at' {0}","{1}, {0}","{1}, {0}"],Q1:6,mha:[5,6], +R1:5},Hr=Gr;Hr=Gr;function Ir(a,b,c,d,e,f){"string"===typeof a?(this.rj=a==Jr?b:0,this.kj=a==Kr?b:0,this.days=a==Lr?b:0,this.Wj=a==Mr?b:0,this.Yj=a==Nr?b:0,this.hk=a==Or?b:0):(this.rj=a||0,this.kj=b||0,this.days=c||0,this.Wj=d||0,this.Yj=e||0,this.hk=f||0)} +Ir.prototype.TI=function(){var a=Math.min(this.rj,this.kj,this.days,this.Wj,this.Yj,this.hk),b=Math.max(this.rj,this.kj,this.days,this.Wj,this.Yj,this.hk);if(0>a&&0a&&b.push("-");b.push("P");this.rj&&b.push(Math.abs(this.rj)+"Y");this.kj&&b.push(Math.abs(this.kj)+"M");this.days&&b.push(Math.abs(this.days)+"D");if(this.Wj||this.Yj||this.hk)b.push("T"),this.Wj&&b.push(Math.abs(this.Wj)+"H"),this.Yj&&b.push(Math.abs(this.Yj)+"M"),this.hk&&b.push(Math.abs(this.hk)+ +"S");return b.join("")};Ir.prototype.Bm=function(a){return a.rj==this.rj&&a.kj==this.kj&&a.days==this.days&&a.Wj==this.Wj&&a.Yj==this.Yj&&a.hk==this.hk};Ir.prototype.clone=function(){return new Ir(this.rj,this.kj,this.days,this.Wj,this.Yj,this.hk)};var Jr="y",Kr="m",Lr="d",Mr="h",Nr="n",Or="s";Ir.prototype.add=function(a){this.rj+=a.rj;this.kj+=a.kj;this.days+=a.days;this.Wj+=a.Wj;this.Yj+=a.Yj;this.hk+=a.hk}; +function Pr(a,b,c){"number"===typeof a?(this.hc=Qr(a,b||0,c||1),Rr(this,c||1)):la(a)?(this.hc=Qr(a.getFullYear(),a.getMonth(),a.getDate()),Rr(this,a.getDate())):(this.hc=new Date(wa()),a=this.hc.getDate(),this.hc.setHours(0),this.hc.setMinutes(0),this.hc.setSeconds(0),this.hc.setMilliseconds(0),Rr(this,a))}function Qr(a,b,c){b=new Date(a,b,c);0<=a&&100>a&&b.setFullYear(b.getFullYear()-1900);return b}k=Pr.prototype;k.Y_=Hr.Q1;k.$_=Hr.R1; +k.clone=function(){var a=new Pr(this.hc);a.Y_=this.Y_;a.$_=this.$_;return a};k.getFullYear=function(){return this.hc.getFullYear()};k.getYear=function(){return this.getFullYear()};k.getMonth=function(){return this.hc.getMonth()};k.getDate=function(){return this.hc.getDate()};k.getTime=function(){return this.hc.getTime()};k.getDay=function(){return this.hc.getDay()};k.getUTCFullYear=function(){return this.hc.getUTCFullYear()};k.getUTCMonth=function(){return this.hc.getUTCMonth()};k.getUTCDate=function(){return this.hc.getUTCDate()}; +k.getUTCDay=function(){return this.hc.getDay()};k.getUTCHours=function(){return this.hc.getUTCHours()};k.getUTCMinutes=function(){return this.hc.getUTCMinutes()};k.getTimezoneOffset=function(){return this.hc.getTimezoneOffset()};k.set=function(a){this.hc=new Date(a.getFullYear(),a.getMonth(),a.getDate())};k.setFullYear=function(a){this.hc.setFullYear(a)};k.setYear=function(a){this.setFullYear(a)};k.setMonth=function(a){this.hc.setMonth(a)};k.setDate=function(a){this.hc.setDate(a)};k.setTime=function(a){this.hc.setTime(a)}; +k.setUTCFullYear=function(a){this.hc.setUTCFullYear(a)};k.setUTCMonth=function(a){this.hc.setUTCMonth(a)};k.setUTCDate=function(a){this.hc.setUTCDate(a)}; +k.add=function(a){if(a.rj||a.kj){var b=this.getMonth()+a.kj+12*a.rj,c=this.getYear()+Math.floor(b/12);b%=12;0>b&&(b+=12);a:{switch(b){case 1:var d=0!=c%4||0==c%100&&0!=c%400?28:29;break a;case 5:case 8:case 10:case 3:d=30;break a}d=31}d=Math.min(d,this.getDate());this.setDate(1);this.setFullYear(c);this.setMonth(b);this.setDate(d)}a.days&&(c=this.getYear(),b=0<=c&&99>=c?-1900:0,a=new Date((new Date(c,this.getMonth(),this.getDate(),12)).getTime()+864E5*a.days),this.setDate(1),this.setFullYear(a.getFullYear()+ +b),this.setMonth(a.getMonth()),this.setDate(a.getDate()),Rr(this,a.getDate()))};k.TI=function(){var a=this.getFullYear();const b=0>a?"-":1E4<=a?"+":"";return[b+kd(Math.abs(a),b?6:4),kd(this.getMonth()+1,2),kd(this.getDate(),2)].join("")+""};k.Bm=function(a){return!(!a||this.getYear()!=a.getYear()||this.getMonth()!=a.getMonth()||this.getDate()!=a.getDate())};k.toString=function(){return this.TI()};function Rr(a,b){a.getDate()!=b&&a.hc.setUTCHours(a.hc.getUTCHours()+(a.getDate()=this.o1.valueOf()&&a.valueOf()<=this.lC.valueOf()};Tr.prototype.iterator=function(){return new Ur(this)};function Ur(a){this.DQ=a.getStartDate().clone();this.lC=Number(a.lC.TI())}t(Ur,zk);Ur.prototype.next=function(){if(Number(this.DQ.TI())>this.lC)return Ak;var a=this.DQ.clone();this.DQ.add(new Ir(Lr,1));return Bk(a)};function Vr(a,b){a.rZ=b}class Wr{constructor(){this.eN=void 0;this.mT=this.rZ=null}password(){return this.eN}Xx(){return this.rZ}DH(){return this.mT}};function Xr(){}Xr.prototype.MY=null;Xr.prototype.oX=null;Xr.prototype.HI=function(){return this.MY};function Yr(a,b){a.MY=b}Xr.prototype.mI=function(){return this.oX};function Zr(a,b){a.oX=b}function $r(a,b){this.th=a;this.Bq=b}$r.prototype.url=function(){return this.th};$r.prototype.target=function(){return this.Bq};$r.prototype.open=function(){fh(this.th,{target:this.Bq})};class as{constructor(){this.gM=new Dr;this.mN=new Fr;this.s2=new Br;this.I=this.CE=this.Wa=null;this.xq="";this.H9=new Xr;this.B7=new Wr;this.i2=new Ar}navigation(){return this.gM}Pc(){return this.mN}Lq(){return this.s2}NI(){return this.xq}skin(){return this.Wa}ia(){return this.I}fR(a){this.I=a}xu(){return this.H9}Hx(){return this.B7}Gt(){return this.i2}}as.prototype.i18n=as.prototype.ia;as.prototype.skin=as.prototype.skin;as.prototype.appearance=as.prototype.Lq;as.prototype.playback=as.prototype.Pc;function bs(){this.tO=[]}bs.prototype.count=function(){return this.tO.length};bs.prototype.add=function(a){this.tO.push(a)};function cs(a,b){const c=a.count();for(let d=0;d{gr(a.nH,b,n).then(()=>{a.ZT(b,c,d,e,f,g,h,l,n);m&&a.Lb.reset();a.sF&&a.sF();a.sF=null})},r=n?n.wr():b,v=a.M.ja(r);!n||v.mf()?p():(a.Ye.gl.addHandler(y=>{y.index()===r&&p()}),a.Ye.iu(r))} +function ps(a,b=!0){if(a.mG){var c=a.Z().timestamp();if(0<=c.L()&&0<=c.Aa()){var d=a.kf(c.L());d=d instanceof pq?d.persistState():null;d=new jk(d,c.Aa(),c.ib());a=a.Va.Ce;b&&(a.DB=!0);qs(a,c.L(),d);a.invalidate()}}}function rs(a){var b=a.X.timestamp(),c=b.Aa();b=b.ib();const d=a.Od.nb();c=0<=c?d.pc(c):null;return"suspended"==a.X.state()||null!==c&&b>=c.duration()}function ss(a,b){const c=ms(a)?ns(a).yw:void 0;return new gs(a.F.slides(),b.id(),b,c)} +function ts(a,b,c,d,e){c=c?d&&d.Yo()?new gf(d.wr(),0,0):e||a.X.timestamp():null;a.Bf.push(new Xg(b,c,a.Pe));b=lg(b);0>b&&(b=0);a.Pe=b}function us(a,b,c){const d=Uq(a.Lb)||void 0,e=d?!1:void 0;if(d){var f=d.effect();const g=ss(a,f),h=new gf(d.wr(),0,0);d.na()||ts(a,g,f.qr(),d,h);f=lg(g);0>f&&(f=0);a.Pe=f}os(a,{L:b,ff:c,ZC:e,pr:!0,xP:!1,hy:d})} +function vs(a){if(0a.M.ja(d).visible()&&d>ns(a).slides()[a.Pe]);if(void 0===c)for(b=a.Bf.length-2;-1<=b;--b)c=a.Bf[b],c=(c?c.xw:a.Sh).slides().find(d=>a.M.ja(d).visible()&&d>ns(a).slides()[a.Pe]);return void 0!==c?c:-1}c=ms(a)?ns(a).yw:void 0; +b=b?Yq(a.Lb,b.index(),a.U,a.$().qk(),c,a.M):-1;return b>=a.M.count()?-1:b}return-1}function As(a){if(!a.Lb.ri()){var b=a.Lb.WH();if(-1!=b)return b}var c=a.$();b=ys(a);if(!ms(a)&&a.U!=b)return ns(a).slides()[0];b=kg(ns(a));if(b.seekTo(a.Pe)){for(c=c.visible();gg(b);){const d=b.$();if(d&&d.gy()||!c||c&&d&&d.visible())break}b=b.$();return!b&&ms(a)&&ws(a)?(b=zs(a).slides().concat().reverse().find(d=>da.Bf.length)return a.Sh;const b=a.Bf[a.Bf.length-2];return b?b.xw:a.Sh}function Es(a,b,c,d,e){ts(a,b,c,d);os(a,{L:b.slides()[a.Pe],ZC:!0,hy:d,$t:e})}function Fs(a,b,c){const d=ss(a,b);c=Cs(a,b,!1,c);Es(a,d,b.qr(),c)}function Gs(a,b){a.Bf.length||a.eE.C();var c=ms(a),d=a.Bf.pop();const e=c?d.xw.n_:void 0;e&&Vq(a.Lb);(c=d.TX)?(a.Pe=d.B8,d=e?Cs(a,e,!0):void 0,os(a,{L:c.L(),pr:!1,hy:d,$t:b})):a.Pe=a.U} +function Pg(a,b,c,d){if(0>a.U)throw Error("current slide is null");var e=!!a.$().fj().Oo();const f=d?vs(a):a.Ug();0<=f?(d=()=>{a.Rs=!0;const g=Hs(a,f);g?Fs(a,g.E0,g.Yo):0=a.M.count())){if(!a.M.ja(b).visible())return xs(a,b+1);b=a.U==b?void 0:$f(a.$().qk(),b);var c=ms(a)?ns(a).yw:void 0;return b&&Xq(a.Lb,b.slides(),c)?xs(a,Math.max.apply(a,b.slides())+1):b}}function Is(a){a.VF||(a.VF=!0,a.$l.C())}function Ks(a){return"accessible"==a.vc.Gb} +function Ls(a,b){a.sF=b}function Ms(a,b,c,d,e){a.U!=b&&(c&&0<=a.U&&a.wE.push(a.M.ja(a.U)),d&&0<=a.U&&(d=ms(a)?ns(a).yw:void 0,a.Lb.push(a.M.ja(a.U),e,d)),a.Od&&(a.Od.NP(),a.Od.deactivate()),e=ns(a).slides(),d=-1,null!==a.Rs&&(d=a.Rs?e.indexOf(b,a.Pe):e.lastIndexOf(b,a.Pe)),e=0<=d?d:e.indexOf(b),0<=e&&(a.Pe=e),a.Rs=null,a.U=b,e=a.M.ja(b),e.gy()||cg(e,!0),Ks(a)&&!e.completed()&&(e.vj=!0),c&&Ns(a.Va.Ce,b),a.Od=a.kf(b),a.KY.C(b),Os(a,e),a.OY.C(b))} +function Ps(a){if(a.Od){var b=a.Od;qk(b,a.Db);b.activate(a.Va);a.Od instanceof pq&&(a.Od.TH(),a.Od.qI())}}function Os(a,b){const c=b.index(),d=a.kf(c);b=b.persistState(d);a=a.Va.Ce;a.vq[c]=b;a.ll=!0;a.invalidate()}function Qs(a){var b=a.Va.Ce.vm;if(b){var c=b.Xj();b=b.uD();for(let e=0;e{this.QO.Z().Cl().C()},this);this.X.vr().addHandler(()=>{this.QO.Z().vr().C()},this); +this.Ge.UI().addHandler(this.AW,this);this.Ge.tu().addHandler(()=>{this.DZ.C()},this);this.Ge.UI().addHandler(()=>{this.CZ.C();ls(this)},this);this.E8=[];this.wE=new Hg;this.Sh=a.ZH();this.Bf=[];a=new cd(this.F.slideWidth(),this.F.slideHeight());this.Lb=new $q(this.Va.Ce);this.Lb.jW.addHandler(()=>{this.nH.uz={};ms(this)&&(this.Bf.pop(),this.Pe=this.U);ls(this)},this);this.Lb.BU.addHandler(n=>{ls(this,n)},this);this.nH=new hr({lca:a,Pm:b,ada:this.Lb,Ho:e,slides:this.M,yH:f,iI:this.Qi});b=this.X.timestamp().L(); +0<=b&&(this.X.started()?os(this,{L:b,r_:!1,Lm:!1}):this.wb(this.X));this.NL=Date.now();this.kS=new hs;this.kS.Sb().addHandler(this.j5,this);this.kS.start();this.sJ=new C;this.Dr=new C;this.OY=new C;this.vB=new C;this.KY=new C;this.eE=new C;this.JT=new C;this.DZ=new C;this.CZ=new C;this.ET=new C;this.Rk=new C;this.cN=new Fg;this.cN.pC()&&ve(this.cN,"visibilitychange",this.Z6,!1,this);ve(window,"beforeunload",()=>{ps(this,!1)});this.ZU=new C;this.HZ=new C;this.Qi.Rk.addHandler(this.V5,this)}play(){0> +this.U?os(this,{L:this.Gf(),pr:!1}):rs(this)&&!this.X.kd()?this.Lo():this.Od.play()}pause(){this.Od&&this.Od.pause()}pe(a,b,c=!0){this.Lb.reset();os(this,{L:a,ff:b,pr:!c,$t:!0})}WH(){const a=this.wE.top();return a?a.index():-1}qx(a){this.Lb.reset();if(!this.wE.ri()){void 0===a&&(a=!0);var b=this.wE.pop();b&&os(this,{L:b.index(),ff:a,r_:!1,$t:!0})}}Gf(){const a=kg(this.Sh);return hg(a)?a.$().index():this.Sh.slides()[0]}Em(){var a=kg(this.Sh);a.U=a.zw.length;if(ig(a))return a.$().index();a=this.Sh.slides().length; +return this.Sh.slides()[a-1]}Yq(a){this.Lb.reset();os(this,{L:this.Gf(),ff:a,$t:!0})}Zq(a){this.Lb.reset();os(this,{L:this.Em(),ff:a,$t:!0})}lf(a){Pg(this,void 0!==a?a:!0,!0)}ni(a){void 0===a&&(a=!0);if(0>this.U)throw Error("current slide is null");this.aL(a,!1)}Lo(){if(0>this.U)throw Error("Slide has not been loaded");var a=this.X.timestamp(),b=a.Aa(),c=a.ib();a=this.Od;var d=a.nb();const e=0<=b?d.pc(b):null,f=e?e.duration():0;d=b==d.count()-1&&(c>=f||e&&e.rl());0>b?(Js(this.Ge),this.HB&&Pg(this, +!0,!1)):d?(nk(a),Pg(this,!0,!0)):(this.xE=f<=c,b=a.ya.nb(),c=a.Ca.Z().timestamp().Aa(),c==b.count()-1?nk(a):(b=c+1,a.play(),mk(a,b,0)),Bs(this),this.xE=!1)}Vj(a,b,c,d){void 0==d&&(d=!1);if(a>this.M.count()||0>a)throw Error("slideIndex is out of bounds");var e=this.M.ja(a);if(0>b)c=b=0;else{var f=e.nb().count();b>f-1&&(b=f-1)}"idle"!=this.Ge.state()&&Js(this.Ge);if(f=a!=this.U){ps(this);this.Ye.iu(a);if(!e.mf()){this.Hp=arguments;this.jz=this.Vj.bind(this);this.Hp.L=a;Ss(this.Ca,!0,this.Ye);return}this.Hp&& +(this.jz=this.Hp=null,Ss(this.Ca,!1,this.Ye));if(0==b&&0==c){os(this,{L:a,ff:d,ZC:!1});return}e=this.kf(a);if(e instanceof pq){e.Me.reset(b,1E3*c);var g=Ts(this.Va.Ce,a);(g=g?g.Yl:null)&&e.tI(g)}}this.Ca.Ai(a,b,c,!0);f&&this.Dr.C(a);d?this.Ca.start():this.Ca.stop();Bs(this)}aL(a,b,c=!1){void 0!==this.$K?this.tX=arguments:this.$K=setTimeout(this.WT.bind(this,a,b,c),0)}WT(a,b,c=!1){clearTimeout(this.$K);this.$K=void 0;var d=this.tX;if(d)this.tX=null,this.WT.apply(this,d);else{d=this.Vg();if(0>d){if(0> +this.U)return;d=this.U}this.Rs=!1;if(!this.Lb.ri()&&this.Lb.WH()==d){const {slide:g,P$:h}=this.Lb.pop();if(g){d=void 0;if(h){var e=h.wr()==g.index();d=void 0;var f=h.effect();h.Yo()&&(f=h.Yo(),d=h.effect());d=Cs(this,f,e,d);e&&Vq(this.Lb,Us(this.vc,g.index()).RH())}ms(this)&&ws(this)&&(this.Bf.pop(),this.Pe=this.U);d&&!ms(this)&&(e=d.effect(),f=ss(this,e),ts(this,f,e.qr(),d));os(this,{L:g.index(),ff:a,na:b,pr:c,xP:!1,hy:d});return}}os(this,{L:d,ff:a,na:b,pr:c,xP:!1})}}Vg(){if(0>this.U)return-1;const a= +this.$().fj().Gx();return a?Ds(a):As(this)}Ot(){const a=this.kf(this.U);let b=!0;var c=this.X.timestamp();const d=c.Aa();0>d?(Js(this.Ge),this.HB||(this.aL(!1,!0,!0),b=!1)):0this.U)){var b=this.X.Ag(),c=b?(this.NL-a)/1E3:0,d=this.X.timestamp();a=d.L();var e=d.Aa();d=d.ib();var f=this.Qi.playbackRate();d+=c*f;if(b&&0<=e&&(b=this.$().nb(),c=b.pc(e),d>=c.duration()))if(c.rl()){++e;if(e==b.count()){this.Ca.Ai(a,e-1,c.duration());Pg(this,!0,!1);return}d=0}else{this.Ca.Ai(a,e,c.duration());Vs(this.Ca,!0);return}this.Ca.Ai(a,e,d)}}AW(){this.Ye.ra(!0);const a=this.kf(this.U);a.pH();const b=Ts(this.Va.Ce,this.U),c= +b?b.Yl:null;this.xE=!0;b&&this.L7?(this.Ca.Ai(this.U,b.Aa(),b.ib()),this.Od instanceof pq&&c&&this.Od.restoreState(c),this.qp?a.play():a.pause()):this.qp?(a.play(),mk(a,0,0)):ok(a);this.xE=!1;(this.HB||b)&&Bs(this)}Ug(){if(0>this.U)return-1;const a=this.$().fj().Oo();return a?Ds(a):vs(this)}ZT(a,b,c,d,e,f,g,h,l){a<<=0;if(a>=this.M.count()||0>a)throw Error("Invalid slide index");void 0==b&&(b=!0);void 0==c&&(c=!0);void 0==d&&(d=!1);void 0==e&&(e=!0);void 0==f&&(f=!0);void 0==g&&(g=!0);void 0==h&&(h= +!0);if(a!=this.U){var n=~this.U?this.M.ja(this.U).type():null,m=this.M.ja(a).type(),p=Ks(this);this.sJ.C(n,m);n="quiz"==m||this.Oa();m="interaction"==m||this.fb();if(n||m||p)f=!1;"idle"!=this.Ge.state()&&Js(this.Ge);this.Ye.iu(a);if(2!=this.Ye.nx(a))this.Hp=arguments,this.Hp.L=a,this.jz=this.ZT.bind(this),Ss(this.Ca,!0,this.Ye);else{this.jz=this.Hp=null;this.Ye.ra(!1);m=l?l.effect():void 0;this.qp=p?!1:b;this.HB=l?void 0===m.duration()?null===this.Rs?!1:!this.Rs:l.na():d;this.L7=g;p=this.HB?0>this.U? +a:this.U:a;this.tg=this.M.ja(p).transition().clone();l&&(void 0===m.duration()?m=null:(m=m.duration(),m=new Nf("Zoom",m,null,!1)),this.tg=m||this.tg);this.JT.C(this.tg,this.U,a);ps(this);this.Ca.Ai(p,-1,0);p=this.kf(a);p instanceof pq&&(g||qs(this.Va.Ce,a),(m=(m=Ts(this.Va.Ce,a))?m.Yl:null)?p.restoreState(m):(dq(p.Me),p.Me.reset(0,0)));Ms(this,a,c,h,l);if(p=f&&0 +m.U;m.Kn=A?I.background():m.vc.zd[m.U];m.Fv=I.zd[r];I=[];0<=m.U&&(I=m.F.slides().ja(m.U),I=I instanceof Am?I.ww:[]);var J=m.F.slides().ja(r);J=J instanceof Am?J.ww:[];m.U=r;Ws(m);v=r=new Xs(m.pg,m.og,y,m.Fv,m.Kn,m.Rf,v,D);y=J;v.Gs=I;v.Ds=y;r.Jv=A;A=n;n=r;"RandomTransition"==A&&(A=Ys[Math.floor(Math.random()*Ys.length)],A=A[Math.floor(Math.random()*A.length)]);n=(A=Zs[A])?A(n):new $s(n);m.Yg=n;m.Yg.Rt()&&(A=m.Yg,A.X=m.X,A.X.Cl().addHandler(A.HV,A),A.X.vr().addHandler(A.GV,A),m.Yg.ge.addHandler(m.zW, +m));n.zx()?at(m):n.JA.addHandler(m.XM,m)}else bt(this.Ge,a),ls(this);Ps(this);this.Dr.C(a);this.Ca.start(d);f&&((n=this.tg.zf)?(m=this.Va.mediaController(),ct(m,n,m.X.timestamp(),0)):this.tg.fZ&&Gp(this.Va.mediaController()));p||this.AW();e&&Bs(this)}}}playbackState(){const a=this.X.state(),b=this.X.timestamp().Aa();return"stopped"==a?0>b?"pausedTransition":"pausedSlide":"suspended"==a?"suspended":"buffering"==a?"buffering":0>b?"playingTransition":"playingSlide"}wb(a){a=a.timestamp();const b=a.L(), +c=a.Aa();var d=a.ib();if(0>c){var e=d,f=0;if(this.tg&&"null"!=this.tg.Yu){var g=this.Ge.zO*this.tg.duration();isNaN(g)&&(g=0);f=Math.max(0,this.tg.duration()-g);e-=g}this.QO.Bg(0{et(a,b.pl())},1E3)}pl(){return 0this.U)throw Error("Current slide is undefined");return this.M.ja(this.U)}Ud(){if(!this.Od)throw Error("Current slide is undefined");return this.Od}kf(a,b=!0){if(!this.M.ja(a).mf())return null;const c=this.E8; +let d=c[a]||null;!d&&b&&(d=ft(this.D8,a),c[a]=d,d.stateChangedEvent().addHandler(this.C6,this),d instanceof pq?d.Zx().addHandler(e=>{this.U==e&&ps(this)}):d instanceof wq?d.Oa().quizPlayerEvent().addHandler(this.e6,this):d instanceof Bq&&d.ob().scenarioPlayerEvent().addHandler(this.m6,this));return d}e6(a){switch(a){case "gotoPreviousSlide":this.ni();break;case "skipQuizSlide":this.lf();break;case "quizFinished":a=this.$();var b=this.Ud();b=Rg(b.Oa());a=Sg(b)?a.LF:a.hE;b=this.$();const c=this.Ud().Oa(), +d=Rg(c);"graded"==d.eG&&Tg(d)&&!Sg(d)&&b.ZQ()&&c.restartQuiz();(new Lg(this)).WP(a);break;case "lockPresentationViewMode":this.ZU.C();break;case "unlockPresentationViewMode":this.HZ.C()}}m6(a){switch(a){case "gotoPreviousSlide":this.ni();break;case "gotoNextSlide":this.lf();break;case "skipScenarioSlide":this.lf();break;case "scenarioRestarted":case "scenarioRestored":this.ET.C(a);break;case "scenarioFinished":a=this.$();var b=this.Ud();a=yq(b.ob()).scenarioPassed()?a.MF:a.iE;(new Wg(this)).WP(a)}}C6(a){Os(this, +a)}Wo(){return this.Qi}Bc(){return this.OY}tu(){return this.DZ}NR(){return this.CZ}ZP(){return this.ET}Ux(){return this.vB}zR(){return this.KY}Vo(){return this.$l}pW(a){const b=this.Hp,c=this.jz;c&&b&&b.L==a.index()&&(this.jz=this.Hp=null,Ss(this.Ca,!1,this.Ye),c.apply(this,b))}Oa(){return 0>this.U||!(this.$()instanceof br)?null:this.Ud().Oa()}fb(){return 0>this.U||!(this.$()instanceof sq)?null:this.Ud().fb()}ob(){return 0>this.U||!(this.$()instanceof Aq)?null:this.Ud().ob()}$C(){return this.Ge}Qt(){return this.Va.Qt()}D5(a){var b= +this.kf(this.U);b&&(b=b.view(),b instanceof Rn&&b.vt.C(a,new Mn,!0))}Z6(){Gg(this.cN)?(this.W2=this.X.Ag(),this.pause()):this.W2&&Gi(()=>{this.play()},this,100)}V5(){this.Rk.C()}}Rs.prototype.slideTransitionController=Rs.prototype.$C;Rs.prototype.scenarioPlayer=Rs.prototype.ob;Rs.prototype.interactionPlayer=Rs.prototype.fb;Rs.prototype.quizPlayer=Rs.prototype.Oa;Rs.prototype.playbackCompleteEvent=Rs.prototype.Vo;Rs.prototype.stepChangeEvent=Rs.prototype.Ux;Rs.prototype.slideChangeEvent=Rs.prototype.Bc; +Rs.prototype.currentSlide=Rs.prototype.$;Rs.prototype.currentSlideIndex=Rs.prototype.ma;Rs.prototype.clock=Rs.prototype.Z;Rs.prototype.playbackState=Rs.prototype.playbackState;Rs.prototype.nextSlideIndex=Rs.prototype.Ug;Rs.prototype.gotoPreviousStep=Rs.prototype.Ot;Rs.prototype.previousSlideIndex=Rs.prototype.Vg;Rs.prototype.gotoTimestamp=Rs.prototype.Vj;Rs.prototype.gotoNextStep=Rs.prototype.Lo;Rs.prototype.gotoPreviousSlide=Rs.prototype.ni;Rs.prototype.gotoNextSlide=Rs.prototype.lf; +Rs.prototype.gotoLastSlide=Rs.prototype.Zq;Rs.prototype.gotoFirstSlide=Rs.prototype.Yq;Rs.prototype.lastSlideIndex=Rs.prototype.Em;Rs.prototype.firstSlideIndex=Rs.prototype.Gf;Rs.prototype.gotoLastSlideViewed=Rs.prototype.qx;Rs.prototype.gotoSlide=Rs.prototype.pe;Rs.prototype.pause=Rs.prototype.pause;Rs.prototype.play=Rs.prototype.play;let gt;function ht(a,b){b?a.setAttribute("role",b):a.removeAttribute("role")}function it(a,b,c){Array.isArray(c)&&(c=c.join(" "));var d="aria-"+b;""===c||void 0==c?(gt||(gt={atomic:!1,autocomplete:"none",dropeffect:"none",haspopup:!1,live:"off",multiline:!1,multiselectable:!1,orientation:"vertical",readonly:!1,relevant:"additions text",required:!1,sort:"none",busy:!1,disabled:!1,hidden:!1,invalid:"false"}),c=gt,b in c?a.setAttribute(d,c[b]):a.removeAttribute(d)):a.setAttribute(d,c)} +function jt(a,b){a=a.getAttribute("aria-"+b);return null==a||void 0==a?"":String(a)};class kt{constructor(a){this.fg=a}ha(a,b,c){c=this.fg.hasOwnProperty(a)?this.fg[a]:c;if(void 0!==c){if(void 0!==b){a=this.ST;for(let d in b)if(b.hasOwnProperty(d)){const e=b[d];a&&(d=a(d));c=c.replace(new RegExp(d,"g"),e)}}return c}Ga("unknown message id: "+a);return a}messages(){return this.fg}ST(a){return"%"+a.toUpperCase()+"%"}}kt.prototype.getMessage=kt.prototype.ha;class lt{constructor(a){this.pa=a;this.BV=!1;this.Ab=zd("DIV");mn(this.Ab,"framesLayer");this.ph=new C;a.Le().addHandler(this.nA,this)}nA(a,b,c,d){this.pa.UH()?Gh(this.Ab,0,0):Gh(this.Ab,c,d);F(this.Ab,"pointer-events","none");c="";this.BV||(c="rect(0px,"+a+"px,"+b+"px,0px)");F(this.Ab,"clip",c);this.ph.C()}Le(){return this.ph}position(a,b){const c=this.pa.wi();return this.gq(c.querySelector("#"+a),c,b||this.scale())}scale(){return this.pa.scale()}gq(a,b,c){let d=new Xc(0,0);if(!a)return d;a=Kh(a); +b=Kh(b);d=ad(a,b);return d=new Xc(d.x/c,d.y/c)}displayObject(){return this.Ab}};function mt(a,b){return`${a.className()}_${b}`}function nt(a,b,c){return`${mt(a,b)}_${c}`}function ot(a,b,c){b=jn(b);const d=nt(a,c,"");return Oa(b,e=>0==e.indexOf(d))}class pt{constructor(a,b){this.yJ=a;this.Ad=b}className(){return this.Ad?`${this.yJ}__${this.Ad}`:this.yJ}};var qt=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||setTimeout;function rt(a){return"string"!==typeof a.className}function st(a,b){a.className.baseVal=b}function tt(a){return rt(a)?(a=a.className.baseVal,"string"===typeof a&&a.match(/\S+/g)||[]):jn(a)}function ut(a,b){return rt(a)?Pa(tt(a),b):ln(a,b)}function vt(a,b){if(rt(a)){if(!ut(a,b)){let c=a.className.baseVal;c+=0c!=b).join(" ")):nn(a,b)};class xt extends C{constructor(a){super(a);this.mz=B(this,new C);this.cL=B(this,new C)}addHandler(a,b,c){super.addHandler(a,b,c);this.mz.C()}removeHandler(a,b,c){super.removeHandler(a,b,c);this.cL.C()}};let yt;const zt=[];if(window.MutationObserver){yt=new MutationObserver(b=>{b&&b.forEach(c=>{for(const d of c.removedNodes)for(const e of zt)"function"===typeof d.contains&&d.contains(e.displayObject())&&e.Si(!1)})});const a={subtree:!0,childList:!0};qt(()=>{yt.observe(document.body,a)})}function At(a,b){a.sy.push(b);vt(a.P,b.className())} +function Bt(a){const b=new ResizeObserver(c=>{for(const d of c)void 0!==d.target&&0{1==cf(b)&&Rm(c);x(a,a.P,"mouseover",()=>{a.enabled()&&0{a.Si(!1)})});z(a,b.cL,()=>{0==cf(b)&&Sm(c)});const d=new Ym;z(a,d.zB,(e,f,g)=>{a.Si(!1);a.enabled()&&a.Bp(g);a.iq&&g.target==a.P&&g.preventDefault()});z(a,d.BO,()=>{a.Si(!0)});z(a,d.CO,()=>{a.enabled()&&a.my()});Qm(c,d)} +function Dt(a){yt?zt.push(a):Ib?x(a,window,"DOMNodeRemoved",b=>{Md(b.target,a.P)&&a.Si(!1)}):x(a,a.P,"DOMNodeRemovedFromDocument",()=>{a.Si(!1)})}function L(a,b,c){F(a.P,b,c)}function N(a,b,c){B(a,b);null!=c?a.Ff(b,c):a.V(b)}function Et(a,b){for(const c of Object.keys(b))F(a.P,c,b[c])}function Ft(a,b){b instanceof pt||(b=new pt(b));At(a,b)}function O(a,b){return new pt(a.sy[0].yJ,b)} +function Gt(a,b,c=b){const d=a.P.scrollTop;b=Math.min(0,b-d-a.a_);c=Math.max(0,c-(d+a.P.clientHeight)+a.a_);0!=b?a.P.scrollTop+=b:0!=c&&(a.P.scrollTop+=c)}function Ht(a,b,c,d){const e=a.la.bind(a),f=()=>{var g="string"===typeof c?c:c();g=b.ha(g,d&&d());e(g)};z(a,b.jh,g=>{const h="string"===typeof c?c:c();g==h&&f()});f();a.wL=f} +class P extends wg{constructor(a){let {ga:b,G:c,U_:d,za:e,Yb:f,nI:g,v_:h,HH:l,rf:n,Wha:m=0,xI:p,tabIndex:r,V9:v}=a||{};super();e||(e=wd(f||"DIV"));this.P=e;this.sy=[];if(b||c)b=b||new pt(c,d),At(this,b);this.iq=void 0!==g?g:!0;this.nh=this.Na=this.Ua=this.Rb=this.Qb=this.Xr=void 0;this.a_=m;this.Os=1;this.wL=null;this.hZ={};this.Qa=null;n&&(this.Ws=Bt(this));(this.i8=p)&&this.yh(!1);void 0!==r&&this.Ox(r);this.ka=B(this,new xt(this));Ct(this,this.ka);l&&z(this,this.ka,()=>{});v&&Dt(this);this.ph= +E(this);if(!1===h){let y=!1;x(this,this.displayObject(),"mousedown",()=>{y=!0});x(this,this.displayObject(),"focusout",D=>{D.target==D.currentTarget&&(y=!1)});x(this,this.displayObject(),"focusin",D=>{y&&D.target==D.currentTarget&&qt(()=>{this.displayObject().blur()})})}}Le(){return this.ph}focus(){(()=>{this.P.focus()})()}getAttribute(a){return this.P.getAttribute(a)}setAttribute(a,b){(()=>{this.P.setAttribute(a,b)})()}removeAttribute(a){(()=>{this.P.removeAttribute(a)})()}Ox(a){this.Xr=a;this.$A(a)}oj(a){this.Qb= +a;(()=>{this.P.style.left=a+"px"})()}Cg(a){this.Rb=a;(()=>{this.P.style.top=a+"px"})()}move(a,b){this.oj(a);this.Cg(b)}Zb(a){this.resize(a)}Kd(a){this.resize(void 0,a)}resize(a,b){this.jw(a,b);void 0!==a&&(this.Ua=a);void 0!==b&&(this.Na=b);this.$a(this.width(),this.height());this.ph.C(this)}ra(a){void 0!==this.Xr&&this.$A(a?this.Xr:-1);(()=>{a?this.P.removeAttribute("disabled"):this.P.setAttribute("disabled","")})()}J(a){this.Qa=a;(()=>{this.Qa=null;Th(this.P,a)})()}Hf(a){(()=>{L(this,"opacity", +a)})();this.nh=a}V(a){const b=this.Ck(a);(()=>{this.P.appendChild(b)})()}Ff(a,b){const c=this.Ck(a);this.P==c.parentNode&&this.P.childNodes[b]==c||(()=>{Ed(this.P,c,b)})()}removeChild(a){const b=this.Ck(a);this.oi(b)&&(()=>{this.P.removeChild(b)})()}Zo(){(()=>{Cd(this.P)})()}la(a){(()=>{Nd(this.P,a)})()}gp(a){(()=>{this.P.innerHTML=a})()}gR(a){(()=>{this.P.id=a})()}fp(a){this.pf("label",a)}nf(a){Array.isArray(a)&&(a=a.join(" "));(()=>{ht(this.P,a)})()}ik(a){this.pf("hidden",a)}pf(a,b){(()=>{it(this.P, +a,b)})()}fa(a,b){if(this.sy.length)for(const c of this.sy)if("string"===typeof b){const d=ot(c,this.P,a);d&&(delete this.hZ[a],(()=>{wt(this.P,d)})());if(b){const e=nt(c,a,b);this.hZ[a]=e;(()=>{vt(this.P,e)})()}}else{const d=mt(c,a);(()=>{var e=this.P,f=d;b?mn(e,f):nn(e,f)})()}else(()=>{var c=this.P;b?mn(c,a):nn(c,a)})(),Ga("component has no bemInfo")}NH(a){const b=this.sy[0];a=b?mt(b,a):a;return ut(this.P,a)}yh(a){this.pf("selected",a)}selected(){return"true"==jt(this.P,"selected")}ub(){this.$a(this.width(), +this.height());this.ph.C()}oi(a){return this.Ck(a).parentNode==this.displayObject()}x(){return void 0!==this.Qb?this.Qb:Ih(this.displayObject()).x}y(){return void 0!==this.Rb?this.Rb:Ih(this.displayObject()).y}width(){return void 0!==this.Ua?this.Ua:this.XK()}height(){return void 0!==this.Na?this.Na:this.WK()}enabled(){return!this.P.hasAttribute("disabled")}visible(){return"boolean"===typeof this.Qa?this.Qa:"none"!=this.displayObject().style.display}opacity(){if(void 0!==this.nh)return this.nh;const a= +Sh(this.P);return"number"===typeof a?a:1}displayObject(){return this.P}setScale(a,b="0 0"){(()=>{wn(this.P,a,a);yi(this.P,b)})()}setParentScale(a){this.Os=a;this.jA()}contains(a){if(!a)return!1;a=this.Ck(a);return Md(this.P,a)}Mr(a){(a instanceof Node||"function"===typeof a.displayObject)&&this.removeChild(a);super.Mr(a)}Ck(a){return a instanceof Node?a:a.displayObject()}XK(){const a=this.P;return a.tagName.toUpperCase()=="SVG".toString()?a.width.baseVal.value:Vh(a).width}WK(){const a=this.P;return a.tagName.toUpperCase()== +"SVG".toString()?a.height.baseVal.value:Vh(a).height}jw(a,b){(()=>{void 0!==a&&Oh(this.P,a);void 0!==b&&Ph(this.P,b)})()}$a(){}jA(){}Bp(a){this.ka.C(this,a)}my(){this.fa("active",!0)}Si(){this.fa("active",!1)}ny(){x(this,this.P,"keydown",this.BM,this)}BM(a){document.activeElement!=this.displayObject()||a.defaultPrevented||13!=a.keyCode&&32!=a.keyCode||(a.preventDefault(),this.Bp())}$A(a){(()=>{this.setAttribute("tabindex",a+"")})()}rd(){this.Ws&&this.Ws.disconnect();const a=zt.indexOf(this);0<=a&& +zt.splice(a,1)}};function It(a){Kd(a)?this.Ir=this.P=a:(this.P=wd("DIV",Jt("component_container",a)),this.Ir=this.XS(Jt("component_base",a)),this.P.appendChild(this.Ir));this.Qd=[];this.iq=!1;if(jj){const b=new Pm(this.Vx());this.ka=new xt;this.ka.mz.addHandler(function(){1==cf(this.ka)&&Rm(b)},this);this.ka.cL.addHandler(function(){0==cf(this.ka)&&Sm(b)},this);a=new Ym;a.zB.addHandler(function(c,d,e){this.Si(!1);this.iq&&e.preventDefault();this.enabled()&&this.Bp(e)},this);a.BO.addHandler(function(){this.Si(!0)}, +this);a.CO.addHandler(function(){this.enabled()&&this.my()},this);Qm(b,a)}else this.iq=!0,this.ka=new xt,this.ka.mz.addHandler(function c(){this.ka.mz.removeHandler(c,this);var d=ve(this.Vx(),"mouseover",function(){this.enabled()&&0{for(const b of a)void 0!==b.target&&(a=b.contentRect,this.Ua=a.width,this.Na=a.height,this.$a(a.width,a.height),this.ph.C(this))});this.Ws.observe(this.P);this.$a(parseInt(this.P.style.width,10),parseInt(this.P.style.height,10));this.ph.C(this)};k.my=function(){this.fa("active",!0)};k.Si=function(){this.fa("active",!1)};k.za=function(){return this.Ir};It.prototype.baseElement=It.prototype.za;It.prototype.displayObject=function(){return this.P}; +It.prototype.displayObject=It.prototype.displayObject;k=It.prototype;k.width=function(){return void 0!==this.Ua?this.Ua:this.XK(this.za())};k.XK=function(a){return"SVG"==a.tagName.toUpperCase()?a.width.baseVal.value:Vh(a).width};k.Zb=function(a){this.resize(a)};k.height=function(){return void 0!==this.Na?this.Na:this.WK(this.za())};k.WK=function(a){return"SVG"==a.tagName.toUpperCase()?a.height.baseVal.value:Vh(a).height};k.Kd=function(a){this.resize(void 0,a)}; +k.resize=function(a,b){if(void 0!==this.Ws)throw Error("ResizeObserver is turned on");this.jw(a,b);void 0!==a&&(this.Ua=a);void 0!==b&&(this.Na=b);this.ph.C(this)};k.jw=function(a,b){void 0!==a&&(Oh(this.displayObject(),a),Oh(this.za(),a));void 0!==b&&(Ph(this.displayObject(),b),Ph(this.za(),b));void 0!==a&&void 0!==b&&this.$a(a,b)};k.$a=function(){};k.x=function(){return void 0!==this.Qb?this.Qb:Ih(this.displayObject()).x};k.oj=function(a){this.Qb=a;this.displayObject().style.left=a+"px"}; +k.y=function(){return void 0!==this.Rb?this.Rb:Ih(this.displayObject()).y};k.Cg=function(a){this.Rb=a;this.displayObject().style.top=a+"px"};k.move=function(a,b){this.oj(a);this.Cg(b)};k.enabled=function(){return!this.za().hasAttribute("disabled")};k.ra=function(a){void 0!==this.Xr&&this.$A(a?this.Xr:-1);a?this.za().removeAttribute("disabled"):this.za().setAttribute("disabled","")};k.visible=function(){return"none"!=this.displayObject().style.display};k.J=function(a){Th(this.displayObject(),a)}; +k.opacity=function(){return this.nh};k.Hf=function(a){Kt(this,"opacity",a);this.nh=a};k.V=function(a){a=this.Ck(a);this.displayObject().appendChild(a)};k.Ff=function(a,b){a=this.Ck(a);Ed(this.displayObject(),a,b)};k.removeChild=function(a){a=this.Ck(a);this.oi(a)&&this.displayObject().removeChild(a)};k.Zo=function(){const a=this.displayObject();for(;a.firstChild;)a.removeChild(a.firstChild)};k.oi=function(a){return(a instanceof It?a.displayObject():a).parentNode==this.displayObject()}; +k.la=function(a){Nd(this.za(),a)};k.gp=function(a){this.za().innerHTML=a};function Kt(a,b,c){F(a.displayObject(),b,c)}k.fp=function(a){this.pf("label",a)};k.nf=function(a){Array.isArray(a)&&(a=a.join(" "));ht(this.YG?this.Ir:this.P,a)};k.ik=function(a){this.pf("hidden",a)};k.pf=function(a,b){it(this.YG?this.Ir:this.P,a,b)};k.XS=function(a){return wd("DIV",a)};function Jt(a,b){return void 0===b?a:b instanceof Array?(b=Ua(b),b.push(a),b):[a,b]} +k.fa=function(a,b){a=this.uJ?mt(this.uJ,a):a;var c=this.P;b?mn(c,a):nn(c,a);this.P!=this.Ir&&(c=this.Ir,b?mn(c,a):nn(c,a))};k.NH=function(a){a=this.uJ?mt(this.uJ,a):a;return ln(this.P,a)};function Lt(a){a=a.displayObject();mn(a,"animation")}k.ny=function(){ve(this.displayObject(),"keydown",this.BM,!1,this)};k.BM=function(a){document.activeElement!=this.displayObject()||a.defaultPrevented||13!=a.keyCode&&32!=a.keyCode||(a.preventDefault(),this.Bp(null))}; +k.$A=function(a){this.setAttribute("tabindex",a+"")};k.Xc=function(){for(let a=0;a{d.stopPropagation();c= +this.HD.url();Ri(c)},this);F(this.displayObject(),"z-index","1000")}Xa(){return this.Kr}displayObject(){return this.Gi.displayObject()}};function Rt(){this.bE=new C;this.J2=new C;this.qT=new C;this.oT=new C}k=Rt.prototype;k.Vu=!1;k.Uu=!1;k.FG=null;k.DA=null;k.mx=function(){return"drag"};k.LH=function(a,b){if(1==b.touches().length){if("touchStart"==a)return this.Vu&&(this.Uu=this.Vu=!1),this.Uu=!1,1;if("touchMove"==a&&this.Uu)return 1}this.Vu&&(this.Uu=this.Vu=!1,this.oT.C(this.DA.x,this.DA.y));return 0}; +k.tH=function(a){a=new Xc(a.touches()[0].clientX(),a.touches()[0].clientY());this.Uu?(a=ad(a,this.FG),Yc(a,this.DA)||(this.Vu||(this.Vu=!0,this.qT.C(this.FG.x,this.FG.y)),this.DA=a,this.bE.C(a.x,a.y))):(this.Uu=!0,this.FG=a,this.DA=new Xc,this.J2.C())};k.Pq=function(){};function St(){this.V7=new C;this.ow=new C;this.gY=new C;this.bE=new C;this.Lz=null;this.RN=!1}k=St.prototype;k.Mz=-1;k.BE=0;k.mx=function(){return"scale"};k.LH=function(a,b){a=2==b.touches().length;const c=!a&&0c.x&&0>d.x||0c.y&&0>d.y||0=Math.abs(a.y-b.y)};Vt.prototype.WZ=function(a,b){const c=b.x-a.x;return 40=Math.abs(a.y-b.y)};function Wt(){this.UA=new C}t(Wt,Ut);Wt.prototype.mx=function(){return"scrollRight"};Wt.prototype.YZ=function(a,b){return a.x>=b.x};Wt.prototype.XZ=function(a,b){return a.x-b.x>=Math.abs(a.y-b.y)}; +Wt.prototype.WZ=function(a,b){const c=a.x-b.x;return 40=Math.abs(a.y-b.y)};function Xt(){He.call(this);this.Rc=Yt;this.endTime=this.startTime=null}t(Xt,He);var Yt=0;Xt.prototype.Ro=function(){this.wh("begin")};Xt.prototype.yl=function(){this.wh("end")};Xt.prototype.wh=function(a){this.dispatchEvent(a)};function Zt(a,b,c){Yd.call(this);this.uQ=a;this.wx=b||0;this.sx=c;this.m$=ta(this.M$,this)}t(Zt,Yd);k=Zt.prototype;k.uC=0;k.hf=function(){Zt.Mb.hf.call(this);this.stop();delete this.uQ;delete this.sx};k.start=function(a){this.stop();this.uC=kh(this.m$,void 0!==a?a:this.wx)};k.stop=function(){this.isActive()&&ia.clearTimeout(this.uC);this.uC=0};k.isActive=function(){return 0!=this.uC};k.M$=function(){this.uC=0;this.uQ&&this.uQ.call(this.sx)};var pc={},$t=null;function au(a){a=ma(a);delete pc[a];oc()&&$t&&$t.stop()}function bu(){$t||($t=new Zt(function(){cu()},20));var a=$t;a.isActive()||a.start()}function cu(){var a=wa();fc(pc,function(b){du(b,a)});oc()||bu()};function eu(a,b,c,d){Xt.call(this);if(!Array.isArray(a)||!Array.isArray(b))throw Error("Start and end parameters must be arrays");if(a.length!=b.length)throw Error("Start and end points must be the same length");this.bD=a;this.R$=b;this.duration=c;this.p_=d;this.coords=[];this.iD=!1;this.progress=0}t(eu,Xt);k=eu.prototype; +k.play=function(a){if(a||this.Rc==Yt)this.progress=0,this.coords=this.bD;else if(1==this.Rc)return!1;au(this);this.startTime=a=wa();-1==this.Rc&&(this.startTime-=this.duration*this.progress);this.endTime=this.startTime+this.duration;this.progress||this.Ro();this.wh("play");-1==this.Rc&&this.wh("resume");this.Rc=1;var b=ma(this);b in pc||(pc[b]=this);bu();du(this,a);return!0};k.stop=function(a){au(this);this.Rc=Yt;a&&(this.progress=1);fu(this,this.progress);this.wh("stop");this.yl()}; +k.pause=function(){1==this.Rc&&(au(this),this.Rc=-1,this.wh("pause"))};k.Bg=function(a){this.progress=a;1==this.Rc&&(this.startTime=wa()-this.duration*this.progress,this.endTime=this.startTime+this.duration)};k.hf=function(){this.Rc==Yt||this.stop(!1);this.K0();eu.Mb.hf.call(this)};k.destroy=function(){this.Xc()}; +function du(a,b){bthis.HG&&(ku(this),this.HG=this.Np);lu(this,Vc(this.HG*a,1,4))};k.W6=function(){this.HG=-1};k.U6=function(a,b){1b.$d().Sc())}function tu(a,b,c){return pu(a.Aw[b]||[],a.Aw[c]||[])}class su{constructor(a,b){this.Aw=[];for(let e=0;e{var c=a.Ue.yr();c.Be()&&c.aE(c.y8)&&c.F.settings().navigation().Gm().enabled()&&c.B.$().SB()&&wu(c)});z(a,Xm(b,"scrollRight").UA,()=>{var c=a.Ue.yr();c.Be()&&c.aE(c.z8)&&c.F.settings().navigation().Gm().enabled()&&c.B.$().SB()&&c.tc.ni()});Rm(b);if(Hj){const c=new Ym;z(a,c.zB,a.p5,a);z(a,c.nT,a.o5,a);Qm(b,c)}return b} +function xu(a){var b=Hd(a.Qe.displayObject());if(b.length)for(const c of b)ln(c,"framesLayerContent")&&(b=c,b.setAttribute("data-width",a.Ua),b.setAttribute("data-height",a.Na))}function yu(a){var b=a.B;-1!=b.ma()&&(b=b.Ud().view(),b instanceof zq&&b.ob().setParentScale(a.qa),uj||(b instanceof vq?b.Oa().resize(a.Ua,a.Na):b instanceof rq&&b.fb().resize(a.Ua,a.Na)))}function zu(a,b,c){for(let d=0;d{null!=e.id&&0{let m=16*Math.random()|0;return("x"==n?m:m&3|8).toString(16)}));let f;if(lc(a.lL,e.id)){var g=w(a.lL,e.id);f=g.transform.clone();var h=g.origin.clone();var l=g.width;g=g.height}else f=sn(e),null===f&&(f=new gm),h=tn(e),null===h&&(h=new Xc), +yi(e,h.x+"px "+h.y+"px"),l=parseFloat(e.getAttribute("width")),g=parseFloat(e.getAttribute("height")),qc(a.lL,e.id,{transform:f.clone(),origin:h.clone(),width:l,height:g});g*=a.qa;Oh(e,l*a.qa);Ph(e,g);l=1/a.qa;g=1/a.qa;h=ad(new Xc,h);h=new gm(l,0,0,g,h.x-l*h.x,h.y-g*h.y);on(e,hm(f,h))},a)}}function Gu(a){a.Mh&&(Fd(a.Mh),a.Mh=null)} +class Hu extends wg{constructor({Ba:a,uba:b,YH:c,MI:d,wi:e,Vq:f,va:g,II:h,W:l,Eca:n}){super();this.F=a;this.Ue=b;this.Fa=c;this.hl=d;this.Fe=e;this.Qe=f;this.Rf=g;this.mt=h;uu(this);this.Ua=a.slideWidth();this.Na=a.slideHeight();this.qa=1;this.Bk=vu(this);const {width:m,height:p}=this.hi();b=new iu(this.Fa,this.Bk,m,p);ju(b,!1);z(this,b.ow,this.W7,this);this.lP=b;this.nG=E(this);this.Ec=null;this.OE=!1;this.B=l;this.Ge=n;this.lL={};this.Nk=!1;this.Mh=null;a=a.slides();this.Bw=qu(a)}width(){return this.Ua}height(){return this.Na}scale(){return this.qa}resize(a, +b){this.Ua=a;this.Na=b;Nh(this.Fa,a,b);var c=this.lP;c.sc=nu(c,bd(c.sc,new Xc((a-c.gH)/2,(b-c.fH)/2)));c.gH=a;c.fH=b;c.oS=Math.min(a/c.pg,b/c.og,c.N4);lu(c,c.Np);xu(this);yu(this)}J0(a){var b=this.B,c=this.Ec?this.Ec.index():-1;const d=b.ma();this.Ec=0<=d?b.$():null;b=this.Ec instanceof br;const e=this.Ec instanceof sq,f=this.Ec instanceof Aq;this.OE=(this.Qe.BV=b)||e||f;this.hl.style.opacity=this.OE?"0":"";this.yt();a&&F(a.displayObject(),"display",f?"none":"");a=tu(this.Bw,c,d);c=tu(this.Bw,d,c); +zu(this,a,!1);zu(this,c,!0);this.Nk&&(Bu(this,a),Cu(this,c));xu(this);Du(this)}t_(a){lu(this.lP,1);Eu(this);yu(this);Fu(this);var b=this.B;-1!=b.ma()&&void 0!==a&&(b=(b=b.Ud())&&b.view(),b instanceof vq?b.Oa().setBannerView(a.displayObject()):b instanceof rq?b.fb().setBannerView(a.displayObject()):b instanceof zq&&b.ob().setBannerView(a.displayObject()))}setOverlayDisplayed(a){if(this.Nk!=a){this.Nk=a;if(this.Ec){var b=this.Ec.index();b=this.Bw.Aw[b]||[];a?Cu(this,b):Bu(this,b);(b=this.B.Oa())&&b.setOverlayDisplayed(a)}Du(this)}}PH(a){this.Fe.style.display= +"";this.hl.style.display="";Iu(a);Eu(this)}UH(){return this.OE}oU(){const a=this.Fa;a.setAttribute("role","main");a.setAttribute("aria-live","polite");a.style.overflow="hidden";Nh(a,this.hi().width,this.hi().height);ah&&(a.style["-webkit-text-size-adjust"]="none")}rU(){const a=this.hl;Ld(a)||Ed(this.Fa,this.hl,0);a.style.display="none";const {width:b,height:c}=this.hi();Nh(a,b-2,c-2);Gh(a,1,1)}sU(){const a=this.Fe;a.removeAttribute("class");a.style.overflow="hidden";a.style.position="absolute";Nh(a, +this.hi().width,this.hi().height);yi(a,"0 0")}mU(){const a=this.Qe.displayObject();F(a,"z-index","2");Ld(a)||this.Fa.appendChild(a)}nU(){Ld(this.Rf)||this.Fe.appendChild(this.Rf)}pU(){nn(this.mt,"slide-displays-parent")}o5(a,b,c){a=c.target;a instanceof HTMLVideoElement&&a.controls?c.stopPropagation():Md(this.Fe,a)&&(c.preventDefault(),c=this.Ue.yr(),c.aE(c.x8))}p5(a,b,c){Si(c.target)||(a=c.target,a instanceof HTMLVideoElement&&a.controls?c.stopPropagation():Md(this.Fe,a)&&(c.preventDefault(),qq(this.Ue.yr(), +this,c)))}W7(a,b,c){b=Math.round(b);c=Math.round(c);var d=this.F.slideWidth(),e=this.F.slideHeight();d*=a;e*=a;const f=this.qa!=a;f&&(this.qa=a,wn(this.Fe,a),Ju(this.Ue.ie,this.qa),yu(this),Fu(this),Nh(this.hl,d-2,e-2));Gh(this.Fe,b,c);Gh(this.hl,b+1,c+1);this.nG.C(d,e,b,c);f&&Ii&&yn(this.Fa)}hi(){return new cd(this.F.slideWidth(),this.F.slideHeight())}yt(){Gu(this);0<=this.B.ma()&&(this.ZO()||this.WO()||this.$O())}ZO(){if(this.B.$()instanceof br){const a=this.B.Oa();a.setOverlayDisplayed(this.Nk); +uj||(this.Mh=a.skin().displayObject(),this.Fa.appendChild(this.Mh));return!0}return!1}WO(){if(this.B.$()instanceof sq){const a=this.B.fb();a.setOverlayDisplayed(this.Nk);uj||(this.Mh=a.displayObject(),this.Fa.appendChild(this.Mh));return!0}return!1}$O(){this.B.$()instanceof Aq&&this.B.ob().setOverlayDisplayed(this.Nk)}rd(){super.rd();Sm(this.Bk);Gu(this)}};class Ku extends wg{constructor({Ba:a,W:b,YH:c,MI:d,wi:e,Vq:f,va:g,II:h}){super();this.F=a;this.B=b;this.Fa=c;this.hl=d;this.Fe=e;this.Qe=f;this.Rf=g;this.mt=h;this.nG=E(this);this.Mh=null;uu(this);z(this,this.B.ZP(),this.yt,this)}width(){return 0}height(){return 0}scale(){return 1}resize(){}J0(a){a&&F(a.displayObject(),"display","");this.yt();this.nG.C()}t_(){}setOverlayDisplayed(){}PH(){Th(this.Fe,!0)}UH(){return!1}oU(){this.Fa.removeAttribute("role");this.Fa.removeAttribute("aria-live");this.Fa.removeAttribute("style")}rU(){Fd(this.hl)}sU(){this.Fe.removeAttribute("style"); +mn(this.Fe,"slides-container")}mU(){Fd(this.Qe.displayObject())}nU(){Fd(this.Rf)}pU(){mn(this.mt,"slide-displays-parent")}yt(){Gu(this);0<=this.B.ma()&&(this.ZO()||this.WO()||this.$O())}ZO(){return this.B.$()instanceof br?(this.Mh=this.B.Oa().skin().displayObject(),this.Fa.appendChild(this.Mh),!0):!1}WO(){return this.B.$()instanceof sq?(this.Mh=this.B.fb().displayObject(),this.Fa.appendChild(this.Mh),!0):!1}$O(){this.B.$()instanceof Aq&&(this.Mh=this.B.ob().displayObject(),this.Fa.appendChild(this.Mh))}rd(){super.rd(); +Gu(this)}};class Lu{constructor(a){this.rk=a}create(a){switch(a){case "normal":return new Hu(this.rk);case "accessible":return new Ku({Ba:this.rk.Ba,W:this.rk.W,YH:this.rk.YH,MI:this.rk.MI,wi:this.rk.wi,Vq:this.rk.Vq,va:this.rk.va,II:this.rk.II});default:throw Error("unknown presentation view mode");}}};var Mu={Rga:"switchToNextSlide",Tga:"switchToPreviousSlide",gda:"arbitrarySlideSwitching",yga:"slideShowControl",Sga:"switchToNextStep",Uga:"switchToPreviousStep",qfa:"playPauseControl",zfa:"presentationSeeking",xga:"slideSeeking",Lfa:"quizSwitchToNextSlide",Mfa:"quizSwitchToNextSlideWithoutBranching",Jfa:"quizArbitrarySlideSwitching",hga:"scenarioSwitchToNextSlide",iga:"scenarioSwitchToNextSlideWithoutBranching",fga:"ScenarioArbitrarySlideSwitching"}; +q("ispring.presenter.player.restriction.NavigationActionType",Mu);function Nu(){return"switchToNextSlide switchToPreviousSlide arbitrarySlideSwitching slideShowControl switchToNextStep switchToPreviousStep playPauseControl presentationSeeking slideSeeking".split(" ")}Mu.all=Nu;q("SWITCH_TO_NEXT_SLIDE","switchToNextSlide",Mu);q("SWITCH_TO_PREVIOUS_SLIDE","switchToPreviousSlide",Mu);q("ARBITRARY_SLIDE_SWITCHING","arbitrarySlideSwitching",Mu);q("SLIDE_SHOW_CONTROL","slideShowControl",Mu); +q("SWITCH_TO_NEXT_STEP","switchToNextStep",Mu);q("SWITCH_TO_PREVIOUS_STEP","switchToPreviousStep",Mu);q("PLAY_PAUSE_CONTROL","playPauseControl",Mu);q("PRESENTATION_SEEKING","presentationSeeking",Mu);q("SLIDE_SEEKING","slideSeeking",Mu);class Ou{constructor(a,b){this.Ga=a;this.I7=b}type(){return this.Ga}Jd(){return this.I7}}Ou.prototype.relatedSlideIndex=Ou.prototype.Jd;Ou.prototype.type=Ou.prototype.type;class Pu{constructor(a,b,c,d,e,f){this.a5=a;this.O7=b;this.N7=c;this.Fd=null!=d?d:null;this.Pg=e||null;this.xw=f||null}AQ(){return this.a5}$o(){return this.O7}od(){return this.N7}Jd(){return this.Fd}Pba(){return this.Pg}Oba(){return this.xw}}Pu.prototype.relatedSlideShow=Pu.prototype.Oba;Pu.prototype.relatedTimestamp=Pu.prototype.Pba;Pu.prototype.relatedSlideIndex=Pu.prototype.Jd;Pu.prototype.restrictionReason=Pu.prototype.od;Pu.prototype.restrictionSource=Pu.prototype.$o; +Pu.prototype.navigationAction=Pu.prototype.AQ;var Qu={Pda:"currentSlideIsLocked",Qda:"currentSlideIsNotCompleted",Mda:"currentSlideIsFirstSlide",Oda:"currentSlideIsLastSlide",Nda:"currentSlideIsInteraction",jda:"backwardNavigationIsRestricted",rea:"forwardNavigationIsRestricted",Afa:"presentationSeekingDisabled",Kea:"interactionNotCompleted",tfa:"precedingQuizNotPassed",sfa:"precedingQuizNotCompleted",rfa:"precedingQuizFailed",vfa:"precedingScenarioNotCompleted",wfa:"precedingScenarioNotPassed",ufa:"precedingScenarioFailed"}; +q("ispring.presenter.player.restriction.NavigationRestrictionReasonType",Qu);q("CURRENT_SLIDE_IS_LOCKED","currentSlideIsLocked",Qu);q("CURRENT_SLIDE_IS_NOT_COMPLETED","currentSlideIsNotCompleted",Qu);q("CURRENT_SLIDE_IS_LAST_SLIDE","currentSlideIsLastSlide",Qu);q("CURRENT_SLIDE_IS_FIRST_SLIDE","currentSlideIsFirstSlide",Qu);q("BACKWARD_NAVIGATION_IS_RESTRICTED","backwardNavigationIsRestricted",Qu);q("FORWARD_NAVIGATION_IS_RESTRICTED","forwardNavigationIsRestricted",Qu); +q("PRESENTATION_SEEKING_DISABLED","presentationSeekingDisabled",Qu);q("PRECEDING_QUIZ_NOT_PASSED","precedingQuizNotPassed",Qu);q("PRECEDING_QUIZ_NOT_COMPLETED","precedingQuizNotCompleted",Qu);q("PRECEDING_QUIZ_FAILED","precedingQuizFailed",Qu);q("PRECEDING_SCENARIO_NOT_COMPLETED","precedingScenarioNotCompleted",Qu);q("PRECEDING_SCENARIO_FAILED","precedingScenarioFailed",Qu);q("PRECEDING_SCENARIO_NOT_PASSED","precedingScenarioNotPassed",Qu);var Ru={yfa:"presentationNavigationType",wga:"slideNavigationSettings",Kfa:"quizNavigationSettings",gga:"scenarioNavigationSettings",xfa:"presentationFlow"};q("ispring.presenter.player.restriction.NavigationRestrictionSource",Ru);q("PRESENTATION_NAVIGATION_TYPE","presentationNavigationType",Ru);q("SLIDE_NAVIGATION_SETTINGS","slideNavigationSettings",Ru);q("PRESENTATION_FLOW","presentationFlow",Ru);function Q(a,b){this.B=a;this.F=b;this.wV=new C}Q.prototype.kf=function(a){return this.B.kf(a)}; +Q.prototype.gf=function(a,b,c,d){const e={};var f;a:{if(Su(this,a)){if((f=-1==this.B.Ug())&&!(f=this.$().fj().Oo())&&(f=!this.F.settings().Pc().Fm())){var g=this.B,h=g.X.timestamp();f=h.Aa();h=h.ib();g=g.Od.nb();f=f==g.count()-1?g.pc(f):null;f=null!==f&&h>=f.duration()}if(f){f=new Ou("currentSlideIsLastSlide");break a}}else if(Tu(this,a)&&-1==this.B.Vg()&&(f=this.B.Z().timestamp(),0==f.Aa()&&0==f.ib()||this.$().fj().Gx())){f=new Ou("currentSlideIsFirstSlide");break a}f=null}e.presentationFlow=f;"quizSwitchToNextSlide"!= +a&&"quizSwitchToNextSlideWithoutBranching"!=a&&"scenarioSwitchToNextSlide"!=a&&"scenarioSwitchToNextSlideWithoutBranching"!=a&&(e.presentationNavigationType=Uu(this,a,b));f="quizSwitchToNextSlideWithoutBranching"==a||"scenarioSwitchToNextSlideWithoutBranching"==a?vs(this.B):this.B.Ug();e.quizNavigationSettings=Vu(this,a,b,f);e.scenarioNavigationSettings=Wu(this,a,b,f);f="playPauseControl"!=a||Su(this,a)?(f=0<=this.B.ma()?this.B.$():null)?f.St().B0(a)?null:new Ou("currentSlideIsLocked"):null:null; +e.slideNavigationSettings=f;h=f=null;for(const l in e)e.hasOwnProperty(l)&&(g=e[l])&&(f=l,h=g);return null!==f?new Pu(a,f,h,b,c,d):null};Q.prototype.checkNavigationRestriction=Q.prototype.gf; +function Uu(a,b,c){const d=a.B,e=a.F.settings().navigation().navigationType(),f=0<=d.ma()?d.$():null;if(!f)return null;{const l=a.B;var g=0<=l.ma()?l.$():null;if(g){var h=a.F.slides();switch(b){case "arbitrarySlideSwitching":g=h.ja(c);break;case "switchToNextSlide":case "switchToNextStep":case "playPauseControl":Su(a,b)&&(c=l.Ug(),0<=c?g=h.ja(c):(c=!!a.$().fj().Oo(),a.F.settings().Pc().Fm()&&!c&&(g=h.ja(a.Gf()))));break;case "switchToPreviousSlide":case "switchToPreviousStep":Tu(a,b)&&(a=l.Vg(),0<= +a&&(g=h.ja(a)));break;case "presentationSeeking":g=null}h=g}else h=null}if(h==f)return null;if(!h)return"presentationSeeking"==b&&"free"!=e?new Ou("presentationSeekingDisabled"):null;switch(e){case "restricted":if(h.gy())break;if(h.index()!=d.Ug()&&h.index()!=d.Vg())return new Ou("forwardNavigationIsRestricted");if("slide"==f.type()&&!f.completed())return new Ou("currentSlideIsNotCompleted");break;case "sequential":if(h.index()!=d.Ug()&&(0!=h.index()||"switchToNextSlide"!=b))return h.gy()?new Ou("backwardNavigationIsRestricted"): +new Ou("forwardNavigationIsRestricted");if("slide"==f.type()&&!f.completed())return new Ou("currentSlideIsNotCompleted")}return null} +function Vu(a,b,c,d){Su(a,b)?c=d:Tu(a,b)&&(c=a.Vg());if(void 0===c)return null;d=a.B.Ud().view();if((d instanceof vq||d instanceof rq)&&!d.Sx()&&c!=a.B.ma())return new Ou("interactionNotCompleted");if(!(0=a.ib()}return!1}function Zu(a,b,c,d){return(b=a.gf(b,c,d,null))?(a.wV.C(b),!1):!0}Q.prototype.play=function(){Zu(this,"playPauseControl",this.B.ma(),null)&&this.B.play()};Q.prototype.play=Q.prototype.play;Q.prototype.pause=function(){Zu(this,"playPauseControl",this.B.ma(),null)&&this.B.pause()};Q.prototype.pause=Q.prototype.pause; +Q.prototype.pe=function(a,b){Zu(this,"arbitrarySlideSwitching",a,null)&&this.B.pe(a,b)};Q.prototype.gotoSlide=Q.prototype.pe;Q.prototype.qx=function(a){const b=this.B.WH();-1!=b&&Zu(this,"arbitrarySlideSwitching",b,null)&&this.B.qx(a)};Q.prototype.gotoLastSlideViewed=Q.prototype.qx;Q.prototype.Yq=function(a){Zu(this,"arbitrarySlideSwitching",this.B.Gf(),null)&&this.B.Yq(a)};Q.prototype.gotoFirstSlide=Q.prototype.Yq;Q.prototype.Zq=function(a){Zu(this,"arbitrarySlideSwitching",this.B.Em(),null)&&this.B.Zq(a)}; +Q.prototype.gotoLastSlide=Q.prototype.Zq;Q.prototype.lf=function(a){Zu(this,"switchToNextSlide",this.B.Ug(),null)&&this.B.lf(a)};Q.prototype.gotoNextSlide=Q.prototype.lf;Q.prototype.ni=function(a){Zu(this,"switchToPreviousSlide",this.B.Vg(),null)&&this.B.ni(a)};Q.prototype.gotoPreviousSlide=Q.prototype.ni;Q.prototype.Lo=function(){Zu(this,"switchToNextStep",this.B.ma(),null)&&this.B.Lo()};Q.prototype.gotoNextStep=Q.prototype.Lo; +Q.prototype.Ot=function(){Zu(this,"switchToPreviousStep",this.B.ma(),null)&&this.B.Ot()};Q.prototype.gotoPreviousStep=Q.prototype.Ot;Q.prototype.Vj=function(a,b,c,d){Zu(this,a==this.B.ma()?"slideSeeking":"presentationSeeking",a,new gf(a,b,c))&&this.B.Vj(a,b,c,d)};Q.prototype.gotoTimestamp=Q.prototype.Vj;Q.prototype.Gf=function(){return this.B.Gf()};Q.prototype.firstSlideIndex=Q.prototype.Gf;Q.prototype.Em=function(){return this.B.Em()};Q.prototype.lastSlideIndex=Q.prototype.Em;Q.prototype.Ug=function(){return this.B.Ug()}; +Q.prototype.nextSlideIndex=Q.prototype.Ug;Q.prototype.Vg=function(){return this.B.Vg()};Q.prototype.previousSlideIndex=Q.prototype.Vg;Q.prototype.ma=function(){return this.B.ma()};Q.prototype.currentSlideIndex=Q.prototype.ma;Q.prototype.$=function(){return this.B.$()};Q.prototype.currentSlide=Q.prototype.$;Q.prototype.playbackState=function(){return this.B.playbackState()};Q.prototype.playbackState=Q.prototype.playbackState;Q.prototype.Z=function(){return this.B.Z()};Q.prototype.clock=Q.prototype.Z; +Q.prototype.Bc=function(){return this.B.Bc()};Q.prototype.slideChangeEvent=Q.prototype.Bc;Q.prototype.Ux=function(){return this.B.Ux()};Q.prototype.stepChangeEvent=Q.prototype.Ux;k=Q.prototype;k.zR=function(){return this.B.zR()};k.tu=function(){return this.B.tu()};k.ZP=function(){return this.B.ZP()};k.NR=function(){return this.B.NR()};k.Vo=function(){return this.B.Vo()};Q.prototype.playbackCompleteEvent=Q.prototype.Vo;Q.prototype.Dx=function(){return this.wV}; +Q.prototype.navigationRestrictedEvent=Q.prototype.Dx;Q.prototype.PQ=function(){return this.B.PQ()};Q.prototype.Ud=function(){return this.B.Ud()};Q.prototype.Oa=function(){return this.B.Oa()};Q.prototype.quizPlayer=Q.prototype.Oa;Q.prototype.ob=function(){return this.B.ob()};Q.prototype.scenarioPlayer=Q.prototype.ob;Q.prototype.fb=function(){return this.B.fb()};Q.prototype.$C=function(){return this.B.$C()};Q.prototype.slideTransitionController=Q.prototype.$C;k=Q.prototype;k.Qt=function(){return this.B.Qt()}; +k.ER=function(a,b){this.B.ER(a,b)};k.cD=function(a){this.B.cD(a)};k.TP=function(){this.B.TP()};k.YQ=function(){this.B.YQ()};k.Wo=function(){return this.B.Wo()};function Iu(a){a.Fu.forEach(b=>b.displayObject().style.display="")}function $u(a,b){a.Fu.push(b);b=b.displayObject();yi(b,"0 0");Ed(a.pa.displayObject(),b,0)}function av(a){a.Fu.forEach(b=>b.displayObject().style.display="none")}function bv(a,b){a.Fu.forEach(c=>Ed(b,c.displayObject(),0))}function cv(a,b){a.Fu.forEach(c=>b(c))} +class dv extends wg{constructor(a){super();this.pa=a;this.Fu=[];z(this,this.pa.Le(),this.kA,this)}kA(a,b,c,d){for(const f of this.Fu){a=f;b=c;var e=d;const g=a.displayObject(),h=this.pa.scale();wn(g,h);const [l,n]="accessible"==this.pa.Gb?[0,0]:[b+h*a.Xa().left,e+h*a.Xa().top];Gh(g,l,n)}}};class ev extends Qt{constructor(a,b){var c=a.content(),d=RegExp('',"gi");const e=[];for(var f=d.exec(c);f;)e.push(f[1]),f=d.exec(c);for(d=0;de&&a.Lu.push(c):0<=e&&a.Lu.splice(e,1);iv(a);a.kd()!=d&&a.BJ.C(a);a.CJ.C(a)} +function jv(a,b,c){const d=a.kd(),e=a.Gw.indexOf(c);b?0>e&&a.Gw.push(c):0<=e&&a.Gw.splice(e,1);iv(a);a.kd()!=d&&a.BJ.C(a);a.CJ.C(a)}gv.prototype.Sb=function(){return this.Dq};gv.prototype.tickEvent=gv.prototype.Sb;gv.prototype.Cl=function(){return this.GG};gv.prototype.startEvent=gv.prototype.Cl;gv.prototype.vr=function(){return this.IG};gv.prototype.stopEvent=gv.prototype.vr;gv.prototype.Cc=function(){return this.zq};gv.prototype.stateChangeEvent=gv.prototype.Cc;gv.prototype.vH=function(){return this.BJ}; +gv.prototype.bufferStateChangeEvent=gv.prototype.vH;gv.prototype.aC=function(){return this.CJ};gv.prototype.bufferedObjectChangeEvent=gv.prototype.aC;function hv(a,b){return a.qo||a.tf(b)||a.Wi(b)}function iv(a){let b="stopped";a.po&&(b=a.qo?"suspended":a.kd()?"buffering":a.jG?"rewinding":"started");a.Pa!=b&&(a.Pa=b,a.zq.C(a))}gv.prototype.tf=function(a){return 1{h.setViewMode(g)})}fb(){return this.Di.fb()}ju(a){this.slide().style.opacity=""+(a?1:0)}Nq(a){a?a.appendChild(this.tb):Fd(this.tb)}};class lv extends Rq{constructor(a,b,c,d,e,f,g){super(a,b,c,d,e,f);this.Di=f;this.FN=null;f.Oa()?this.aB(g):Qe(this,f.EX,()=>this.aB(g))}Oa(){return this.Di.Oa()}ju(a){this.slide().style.opacity=""+(a?1:0)}Nq(a){a?a.appendChild(this.tb):Fd(this.tb)}aB(a){const b=this.Di.Oa();b.onPresentationViewModeChanged(a);this.FN=b.skin().displayObject();this.tb.appendChild(this.FN);this.xG.innerHTML=this.tb.innerHTML;Th(this.no,"normal"==a)}rd(){super.rd();Fd(this.FN)}};class mv extends wg{constructor(a){super();this.ya=a;this.Pa=0;this.gl=E(this);this.jy=this.no=this.tb=null}slide(){return this.ya}$q(a,b,c){this.tb=a;this.no=b;this.jy=c;this.Pa=2;this.gl.C(this)}slideBackground(){return this.no}mf(){return 2==this.Pa}state(){return this.Pa}};class nv extends mv{constructor(a){super(a);this.yf=null;this.jY=E(this)}ob(){return this.yf}rR(a){this.yf=a;this.jY.C()}};class ov extends Rq{constructor(a,b,c,d,e,f,g){super(a,b,c,d,e,f);this.Di=f;f.yf?this.aB(g):Qe(this,f.jY,()=>this.aB(g))}ob(){return this.Di.ob()}ju(a){this.slide().style.opacity=""+(a?1:0)}Nq(a){a?a.appendChild(this.tb):Fd(this.tb)}aB(a){this.Di.ob().setViewMode(a);this.xG.innerHTML=this.tb.innerHTML;Th(this.no,"normal"==a)}};function ft(a,b){const c=a.M.ja(b);b=a.vc.zd[b];if(c instanceof Am){b.nr();b.ju(!1);var d=new Rn({content:b.fl,mode:a.vc.Gb,WI:c.WI(),fD:c.fD()});d=new pq(c,d,a.Ca,a.Ae)}else if(c instanceof br){if(!b.Oa())return null;d=new vq({content:b.fl,mode:a.vc.Gb,Oa:b.Oa(),VB:c.VB()});d=new wq(c,d,a.Ca)}else if(c instanceof sq){if(!b.fb())return null;d=new rq({content:b.fl,mode:a.vc.Gb,fb:b.fb(),UB:c.UB()});d=new tq(c,d,a.Ca)}else if(c instanceof Aq){if(!b.ob())return null;d=new zq({content:b.fl,mode:a.vc.Gb, +ob:b.ob(),WB:c.WB()});d=new Bq(c,d,a.Ca)}return d}class pv{constructor(a,b,c,d){this.Ca=c;this.M=b;this.vc=a;this.Ae=d}};class Xs{constructor(a,b,c,d,e,f,g,h){this.Gs=[];this.Ds=[];this.Jv=!1;this.pg=a;this.og=b;this.Ez=c;this.Kg=d;this.Mg=e||null;this.Rf=f;this.dE=g;this.P9=h}hy(){return this.P9}slideWidth(){return this.pg}slideHeight(){return this.og}na(){return this.Ez}hb(){return this.Kg}qc(){return this.Mg}va(){return this.Rf}};function qv(a,b,c,d,e,f){this.F=a;this.vc=b;this.X=c;this.pg=d;this.og=e;this.Rf=f;this.uT=new C;this.tT=new C}qv.prototype.U=-1;qv.prototype.Fca=function(){return this.X.progress()};qv.prototype.transitionProgress=qv.prototype.Fca;qv.prototype.state=function(){return this.Yg?this.X.o0()?"playing":"paused":"idle"};qv.prototype.state=qv.prototype.state;qv.prototype.tu=function(){return this.uT};qv.prototype.transitionEffectStartEvent=qv.prototype.tu;qv.prototype.UI=function(){return this.tT}; +qv.prototype.transitionEffectCompleteEvent=qv.prototype.UI;function Js(a){a.Yg&&rv(a,!1)}function bt(a,b){const c=a.vc;c.zd[b].nr();0<=a.U&&c.zd[a.U].Oc();a.U=b}function Ws(a){a.Kn.xg();a.Fv.nr();a.Kn.nr()}function at(a){a.Yg.start();a.vT=!0;Ji&&(a.H7=setInterval(a.G7,100));a.X.Sb().addHandler(a.yW,a);a.uT.C(a.U);sj&&document.body&&yn(document.body)}k=qv.prototype;k.G7=function(){if(Ji&&document.body)return yn(document.body)};k.zW=function(){rv(this)}; +k.XM=function(a){this.Yg.JA.removeHandler(this.XM,this);a&&at(this)};k.yW=function(a){isNaN(this.zO)&&(this.zO=a,a=0);this.Yg.Rt()||(1>a?this.Yg.Bg(a):rv(this))};function rv(a,b){void 0===b&&(b=oj);a.vT&&(a.X.Sb().removeHandler(a.yW,a),a.vT=!1);Ji&&clearInterval(a.H7);a.Yg.zx()||a.Yg.JA.removeHandler(a.XM,a);a.Yg.Rt()&&a.Yg.ge.removeHandler(a.zW,a);a.Yg.terminate();a.Yg=null;Ws(a);a.Kn&&(a.Kn.Oc(),a.Kn=null);a.Fv=null;b?Gi(a.KV,a):a.KV()}k.KV=function(){Cd(this.Rf);this.tT.C(this.U)};function sv(){this.Dq=new C;this.GG=new C;this.IG=new C}k=sv.prototype;k.le=0;k.JL=!1;k.progress=function(){return this.le};k.Bg=function(a){this.le=a;this.Dq.C(a)};k.o0=function(){return this.JL};k.start=function(){this.JL=!0};k.stop=function(){this.JL=!1};k.Sb=function(){return this.Dq};k.Cl=function(){return this.GG};k.vr=function(){return this.IG};k.Z=function(){return this};function R(a){this.Ez=a.na();this.Fv=a.hb();this.Kn=a.qc();this.Gz=!0;this.h7=a;this.pg=a.slideWidth();this.og=a.slideHeight();this.JA=new C;this.ge=new C;this.Rf=a.va();this.dE=a.dE;this.pg>this.og?(this.VL=Math.min(this.pg,1024),this.ws=this.VL/this.pg,this.UL=this.og*this.ws):(this.UL=Math.min(this.og,1024),this.ws=this.UL/this.og,this.VL=this.pg*this.ws);this.SN=wd("DIV");wn(this.SN,1/this.ws,1/this.ws);this.$e=Ii}k=R.prototype; +k.start=function(){this.Rf.appendChild(this.SN);var a=this.qc().slide();mn(a,"transitionSlide");a=this.hb().slide();mn(a,"transitionSlide");this.initialize();this.Bg(0)};k.terminate=function(){this.Bg(1);this.CH();this.X&&(this.X.Cl().removeHandler(this.HV,this),this.X.vr().removeHandler(this.GV,this));var a=this.qc().slide();nn(a,"transitionSlide");a=this.hb().slide();nn(a,"transitionSlide");Cd(this.Rf)}; +function tv(a,b){b?(b=a.qc().slide(),mn(b,"paused"),a=a.hb().slide(),mn(a,"paused")):(b=a.qc().slide(),nn(b,"paused"),a=a.hb().slide(),nn(a,"paused"))}k.Bg=function(a){if(this.zx()){var b=this.Ha;a=this.na()?1-a:a;b.call(this,a)}};k.zx=function(){return this.Gz};k.Jv=function(){return this.h7.Jv};k.na=function(){return this.Ez};k.initialize=function(){};k.CH=function(){};k.Ha=function(){};k.hb=function(){return this.na()?this.Kn:this.Fv};k.qc=function(){return this.na()?this.Fv:this.Kn}; +function uv(a,b){null!=a.qc()&&a.qc().ju(b)}function vv(a,b){a.hb().ju(b)} +k.Ma=function(a,b,c,d,e,f){function g(){if(!--h){var A=r,J=v,T=y,U=D,X=I;this.mb=p;this.Da=A;this.Cn=J;this.hF=U;this.Up=T;this.nF=X;this.qW();1!=this.Gz&&(this.Gz=!0,this.JA.C(!0))}}0!=this.Gz&&(this.Gz=!1,this.JA.C(!1));let h=0;for(var l=0;l>1;a|=a>>2;a|=a>>4;a|=a>>8;return(a|a>>16)+1}function yv(a,b){b=b||0;return Math.round(a*Math.pow(10,b))/Math.pow(10,b)};function zv(a){R.call(this,a)}var Av,Bv;t(zv,R);function Cv(a,b){a.ns();a.vz(b);b=a.N;a.jb=mat4.create();a.RW=mat4.create();b.viewport(0,0,b.L1,b.K1);b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT);const c=.5*a.slideHeight()/Math.tan(22.5*Math.PI/180);mat4.perspective(45,b.L1/b.K1,1,1E4,a.RW);mat4.identity(a.jb);mat4.translate(a.jb,[0,0,-c])}k=zv.prototype; +k.ns=function(){this.tq=!0;void 0===Av&&(Av=S(this.slideWidth()+3,this.slideHeight()+3),F(Av,"left","-1px"),F(Av,"top","-1px"));void 0===Bv&&(Bv=Av.getContext("webgl")||Av.getContext("experimental-webgl"));this.va().appendChild(Av);try{Bv.L1=Av.width,Bv.K1=Av.height,Bv.enable(Bv.DEPTH_TEST)}catch(b){}const a=this.N=Bv;this.TK=Dv(this,a.FRAGMENT_SHADER,this.Nh());this.gP=Dv(this,a.VERTEX_SHADER,this.Oh());null!==this.TK&&null!==this.gP&&(this.sq=a.createProgram(),a.attachShader(this.sq,this.gP),a.attachShader(this.sq, +this.TK),a.linkProgram(this.sq),a.getProgramParameter(this.sq,a.LINK_STATUS)?(a.useProgram(this.sq),this.Vh()):this.tq=!1)};k.CH=function(){this.N&&(this.Kh(),Ev(this,this.fP),Ev(this,this.EO),Ev(this,this.iX),Ev(this,this.tV),this.Lh(),this.N.deleteTexture(this.mB),this.N.deleteShader(this.TK),this.N.deleteShader(this.gP),this.N.deleteProgram(this.sq))};k.Lh=function(){alert("override _disableAttributes")};k.Kh=function(){}; +function Fv(a,b){a.N.bindBuffer(a.N.ARRAY_BUFFER,null);a.N.deleteBuffer(b.kg);a.N.deleteBuffer(b.Sf);a.N.deleteBuffer(b.rg);a.N.deleteBuffer(b.Gn)}k.vz=function(a){this.mB=Gv(this,this.N.TEXTURE0,this.yj(),0,a)}; +function Gv(a,b,c,d,e,f){const g=a.N;var h=a.slideWidth(),l=a.slideHeight();h=xv(h);l=xv(l);a=a.N.getParameter(a.N.MAX_TEXTURE_SIZE);if(Math.max(h,l)>a){var n=h/l;h>l?(h=a,l=h/n):(l=a,h=l*n)}a=new cd(h,l);h=a.width;l=a.height;a=S(h,l);n=a.getContext("2d");void 0!==f?f(n,e,h,l):n.drawImage(e,0,0,h,l);e=g.createTexture();g.activeTexture(b);g.bindTexture(g.TEXTURE_2D,e);g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,a);g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MAG_FILTER,g.LINEAR);g.texParameteri(g.TEXTURE_2D, +g.TEXTURE_MIN_FILTER,g.LINEAR_MIPMAP_LINEAR);g.generateMipmap(g.TEXTURE_2D);g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_S,g.CLAMP_TO_EDGE);g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_T,g.CLAMP_TO_EDGE);g.bindTexture(g.TEXTURE_2D,null);g.activeTexture(b);g.bindTexture(g.TEXTURE_2D,e);g.uniform1i(c,d);return e}k.Nh=function(){alert("Please override _getFragmentShaderSource");return""};k.Oh=function(){alert("Please override _getVertexShaderSource");return""};k.Vh=function(){}; +function Dv(a,b,c){const d=a.N;b=d.createShader(b);d.shaderSource(b,c);d.compileShader(b);return d.getShaderParameter(b,d.COMPILE_STATUS)?b:(a.tq=!1,null)}function Hv(a,b,c){a=a.N;const d=b.length/c,e=a.createBuffer();a.bindBuffer(a.ARRAY_BUFFER,e);a.bufferData(a.ARRAY_BUFFER,new Float32Array(b),a.DYNAMIC_DRAW);e.Ax=c;e.F0=d;return e} +function Iv(a,b){a=a.N;const c=b.length/1,d=a.createBuffer();a.bindBuffer(a.ELEMENT_ARRAY_BUFFER,d);a.bufferData(a.ELEMENT_ARRAY_BUFFER,new Uint16Array(b),a.DYNAMIC_DRAW);d.Ax=1;d.F0=c;return d}function Jv(a){if(0==a.fM.length)throw"Invalid popMatrix!";a.jb=a.fM.pop()}function Kv(a){const b=mat4.create();mat4.set(a.jb,b);a.fM.push(b)}function Lv(a,b,c,d){mat4.translate(a.jb,[-d[0],-d[1],-d[2]]);mat4.rotate(a.jb,b*Math.PI/180,c);mat4.translate(a.jb,d)} +function Mv(a,b,c,d,e){const f=a.N,g=b.kg;f.bindBuffer(f.ARRAY_BUFFER,g);void 0!==d&&d();f.vertexAttribPointer(a.fP,g.Ax,f.FLOAT,!1,0,0);b.Gn&&(d=b.Gn,f.bindBuffer(f.ARRAY_BUFFER,d),void 0!==e&&e(),f.vertexAttribPointer(a.iz(),d.Ax,f.FLOAT,!1,0,0));e=b.rg;f.bindBuffer(f.ARRAY_BUFFER,e);f.vertexAttribPointer(a.EO,e.Ax,f.FLOAT,!1,0,0);a.vJ();a=b.Sf;f.bindBuffer(f.ELEMENT_ARRAY_BUFFER,a);void 0===c&&(c=f.TRIANGLES);f.drawElements(c,a.F0,f.UNSIGNED_SHORT,0)} +k.iz=function(){alert("override _getVertexNormalAttributeLocation");return-1};k.yj=function(){alert("override _getSamplerUniform");return null};k.vJ=function(){};function Nv(a){a.fP=Ov(a,"aVertexPosition");a.EO=Ov(a,"aTextureCoord");a.iX=Pv(a,"uPMVMatrix");a.tV=Pv(a,"uNMatrix")} +function Qv(a,b){let c=0;for(let e=0;ea){var b=Y(0,0,.3,1)(a);this.Zr(b,!0);this.Zr(b,!1)}b=this.slideWidth();var c=this.slideHeight();c=Math.max(b,c);const d=this.O==lw?1:-1;Kv(this);.1<=a&&(.1=a?(a=Y(.1,0,.4,1)(a),mw(this,a),mat4.translate(this.jb,[0,0,-a*c/4]),Lv(this,-60*a,[1,0,0],[-d*b/4,0,0]),Lv(this,45*d*a,[0,0,1],[-d*b/4,0,0])):.4=a?(a=Y(.4,0,.5,1)(a),mw(this,1),mat4.translate(this.jb,[0,0,-c/4]),mat4.translate(this.jb,[d*a*c/50,-a*c/50,a*c/50]),Lv(this, +-60,[1,0,0],[-d*b/4,0,0]),Lv(this,45*d,[0,0,1],[-d*b/4,0,0])):.5a?(a=Y(.5,0,.55,1)(a),mw(this,1),mat4.translate(this.jb,[0,0,-c/4]),mat4.translate(this.jb,[d*c/50,-c/50,c/50]),Lv(this,-60,[1,0,0],[-d*b/4,0,0]),Lv(this,45*d,[0,0,1],[-d*b/4,0,0]),Lv(this,-1*a,[1,0,0],[0,0,0])):.55h;++h){var d=g,e=a,f=b;d=3*(1-3*f+3*e)*d*d+2*(3*f-6*e)*d+3*e;if(0==d)break;g-=((((1-3*b+3*a)*g+(3*b-6*a))*g+3*a)*g-c)/d}c=(-2*g+3)*g*g}return c}}var Dw=Cw(.42,.58);function Y(a,b,c,d){return function(e){return b+(d-b)/(c-a)*(e-a)}}function ow(a,b,c){if(c=b)return 1;a=(c-a)/(b-a);return-2*Math.pow(a,3)+3*Math.pow(a,2)} +function Ew(a,b,c,d){if(d>1)}const c=this.Da,d=this.mb;var e=this.slideWidth(),f=this.slideHeight();e=Math.floor(e/7);f=Math.floor(f/5);const g=c.width-6*e,h=c.height-4*f;this.fn=[];for(let l=0;5>l;++l){const n=b(5,l),m=n*f,p=4==n?h:f+1;for(let r=0;7>r;++r){const v=b(7,r),y=new Lw(c,d,v*e,m,6==v?g:e+1,p,a,this.gs,this.xc);this.Ys.appendChild(y.Dp);this.fn[7*n+v]=y}}Mw(this)}; +Jw.prototype.mL=function(){const a=this.slideWidth(),b=this.slideHeight();Nh(this.Ys,a,b);var c=(.5*a).toString()+"px "+(.5*b).toString()+"px";Di(this.Ys,this.xA.toString()+"px");Ei(this.Ys,c);Lb&&(c=zd("DIV"),this.Ys.appendChild(c),Nh(c,a,b),F(c,"position","absolute"),Ci(c,"preserve-3d"),this.Ys=c)}; +function Mw(a){var b=.7-.15,c=a.O==Kw?b/4:0,d=a.O==Nw?b/6:0;b=0;var e=1;for(var f=0;5>f;++f)for(let g=0;7>g;++g){const h=f*c+g*d+.15*Math.random();b=Math.max(h,b);e=Math.min(h,e);a.fn[g+7*f].CP=h}c=e;b=.7/(b-c);for(d=0;5>d;++d)for(e=0;7>e;++e)f=a.fn[e+7*d],f.CP=(f.CP-c)*b}Jw.prototype.Ha=function(a){const b=this.fn.length;for(let c=0;ce:1=c&&Pw(a,!0);xi(a.Dp,(a.qz?"rotateX(-":"rotateY(")+b.toString()+"deg)")}else a.NE?90<=b&&Pw(a,!1):90>=b&&Pw(a,!0),xi(a.Dp,(a.qz?"scaleY(":"scaleX(")+Math.cos(a.LD*Math.PI/180).toString()+")");H(a.qG,.5*Math.sin(a.LD*Math.PI/180))}} +function Pw(a,b){const c=b?a.QT:a.ED,d=b?a.ED:a.QT;a.NE=b;F(c,"visibility","visible");F(d,"visibility","hidden")};function Qw(a,b){R.call(this,a);this.O=b;this.$e=!1;this.Ma(!1,!0);this.O==Rw?(this.Gg=(1-Sw)/(Tw-1),this.dS=2*this.slideWidth()/Math.pow(Sw,2)):(this.Gg=.25,this.dS=2*this.slideHeight()/Math.pow(Sw,2))}t(Qw,R);function Uw(a,b,c,d,e,f){const g=S(e+1,f+1);g.getContext("2d").drawImage(a.Da,c,d,e,f,0,0,e+1,f+1);b.push(new Vw(g,c,d,e,f))} +Qw.prototype.initialize=function(){let a;a=this.O==Rw?Tw:Ww;const b=this.slideWidth(),c=this.slideHeight();this.Ju=[];this.Ku=[];const d=b/a,e=c/a;let f=0;for(let h=0;h=b?0:a.dS*Math.pow(b,2)/2}function Yw(a,b){const c=a.slideHeight();let d=0,e=a.Gg,f=0,g=1,h=e,l=1;a.na()&&(d=c,e=1-e,f=1-f,g=1-g,h=e,l=1-l);if(!a.na()){if(be)return d;return c*(f+(g-f)/(l-h)*(b-h))} +Qw.prototype.Ha=function(a){let b,c,d;const e=this.Da.getContext("2d");e.clearRect(0,0,this.slideWidth(),this.slideHeight());if(this.O==Rw){for(b=0;b1-dx?1-a:dx;var b=Math.max(this.slideWidth(),this.slideHeight());b=Y(0,0,dx,.2*-b);const c=Y(0,0,dx,10);yi(this.pa,"50% 100%");xi(this.pa,"rotateX("+c(a)+"deg) translateZ("+b(a)+"px)")}; +k.oL=function(a){const b=this.slideWidth(),c=this.slideHeight();this.Vk=this.Uk=this.Nl=this.Ml=0;switch(a){case ex:this.Nl=1;this.Uk=fx*b;this.Vk=-fx*c;break;case gx:this.Nl=-1;this.Uk=-fx*b;this.Vk=fx*c;break;case hx:this.Ml=-1;this.Uk=fx*b;this.Vk=fx*c;break;case ix:this.Ml=1;this.Uk=-fx*b;this.Vk=-fx*c;break;case jx:this.Nl=this.Ml=-1;this.Uk=-fx*b;this.Vk=fx*c;break;case kx:this.Ml=-1;this.Nl=1;this.Uk=-fx*b;this.Vk=-fx*c;break;case lx:this.Ml=1;this.Nl=-1;this.Uk=fx*b;this.Vk=fx*c;break;case mx:this.Nl= +this.Ml=1,this.Uk=fx*b,this.Vk=-fx*c}this.Re?(this.Nl*=-1,this.Vk*=-1):(this.Ml*=-1,this.Uk*=-1)}; +k.Ha=function(a){this.Re&&(a=1-a);this.eM(a);if(a>=nx&&a=ox&&(this.na()||this.Re?this.na()&&this.Re&&vv(this,!1):uv(this,!1),F(this.sw,"visibility","hidden"))};var gx=0,hx=1,ix=2,ex=3,kx=4,jx=5,mx=6,lx=7,dx=.4,nx=.1,ox=.7,px=800,qx=.5,bx=.3,ax=50,fx=1,cx=1;function rx(a,b,c){R.call(this,a);this.O=b;this.Re=c;this.$e=!1;this.oL(b)}t(rx,R);k=rx.prototype;k.initialize=function(){uv(this,!0);vv(this,!0);this.qn().xg()};k.qn=function(){return this.Re?this.qc():this.hb()};k.hz=function(){return this.Re?this.hb():this.qc()}; +k.oL=function(a){const b=this.slideWidth(),c=this.slideHeight();this.kl=this.jl=0;switch(a){case ex:this.kl=c;break;case gx:this.kl=-c;break;case hx:this.jl=b;break;case ix:this.jl=-b;break;case jx:this.jl=b;this.kl=-c;break;case kx:this.jl=b;this.kl=c;break;case lx:this.jl=-b;this.kl=-c;break;case mx:this.jl=-b,this.kl=c}this.Re&&(this.jl*=-1,this.kl*=-1)};k.Ha=function(a){a=Dw(a);this.Re&&(a=1-a);const b=Y(0,this.jl,1,0),c=Y(0,this.kl,1,0);Gh(this.qn().slide(),b(a),c(a))};function sx(a,b,c){var d=new W;this.zr=a;this.$x=b;this.ey=c;this.n=d};function tx(a){R.call(this,a);this.Ma(!1,!0)}t(tx,zv); +var ux=[0,1,2,3,2,4,5,4,6,7,6,8,9,8,10,11,10,12,13,12,14,15,14,16,17,16,18,19,18,20,21,20,22,1,23,24,2,24,25,4,25,26,6,26,27,8,27,28,10,28,29,12,29,30,14,30,31,16,31,32,18,32,33,20,33,34,23,35,36,24,36,37,25,37,38,26,38,39,27,39,40,28,40,41,29,41,42,30,42,43,31,43,44,32,44,45,33,45,46,35,47,48,36,48,49,37,49,50,38,50,51,39,51,52,40,52,53,41,53,54,42,54,55,43,55,56,44,56,57,45,57,58,47,59,60,48,60,61,49,61,62,50,62,63,51,63,64,52,64,65,53,65,66,54,66,67,55,67,68,56,68,69,57,69,70,59,71,72,60,72,73, +61,73,74,62,74,75,63,75,76,64,76,77,65,77,78,66,78,79,67,79,80,68,80,81,69,81,82,71,83,84,72,84,85,73,85,86,74,86,87,75,87,88,76,88,89,77,89,90,78,90,91,79,91,92,80,92,93,81,93,94,83,95,96,84,96,97,85,97,98,86,98,99,87,99,100,88,100,101,89,101,102,90,102,103,91,103,104,92,104,105,93,105,106,0,2,3,3,4,5,5,6,7,7,8,9,9,10,11,11,12,13,13,14,15,15,16,17,17,18,19,19,20,21,21,22,107,1,24,2,2,25,4,4,26,6,6,27,8,8,28,10,10,29,12,12,30,14,14,31,16,16,32,18,18,33,20,20,34,22,23,36,24,24,37,25,25,38,26,26,39, +27,27,40,28,28,41,29,29,42,30,30,43,31,31,44,32,32,45,33,33,46,34,35,48,36,36,49,37,37,50,38,38,51,39,39,52,40,40,53,41,41,54,42,42,55,43,43,56,44,44,57,45,45,58,46,47,60,48,48,61,49,49,62,50,50,63,51,51,64,52,52,65,53,53,66,54,54,67,55,55,68,56,56,69,57,57,70,58,59,72,60,60,73,61,61,74,62,62,75,63,63,76,64,64,77,65,65,78,66,66,79,67,67,80,68,68,81,69,69,82,70,71,84,72,72,85,73,73,86,74,74,87,75,75,88,76,76,89,77,77,90,78,78,91,79,79,92,80,80,93,81,81,94,82,83,96,84,84,97,85,85,98,86,86,99,87,87, +100,88,88,101,89,89,102,90,90,103,91,91,104,92,92,105,93,93,106,94],vx="/+8MAP/rSADoi0gA6I8MANFLSADRTwwAuitIALovDACi60gAou8MAIurSACLrwwAC6tIAAuvDAAi60gAIu8MADorSAA6LwwAUUtIAFFPDABoi0gAaI8MAH/rSAD/54QA6IeEANFHhAC6J4QAoueEAIunhAALp4QAIueEADonhABRR4QAaIeEAH/nhAD/48AA6IPAANFDwAC6I8AAouPAAIujwAALo8AAIuPAADojwABRQ8AAaIPAAH/jwAD/4AAA6IAAANFAAAC6IAAAouAAAIugAAALoAAAIuAAADogAABRQAAAaIAAAH/gAAD/88AA6JPAANFTwAC6M8AAovPAAIuzwAALs8AAIvPAADozwABRU8AAaJPAAH/zwAD/94QA6JeEANFXhAC6N4QAoveEAIu3hAALt4QAIveEADo3hABRV4QAaJeEAH/3hAD/+0gA6JtIANFbSAC6O0gAovtIAIu7SAALu0gAIvtIADo7SABRW0gAaJtIAH/7SAD//wwA6J8MANFfDAC6PwwAov8MAIu/DAALvwwAIv8MADo/DABRXwwAaJ8MAH//DAB/7wwA 8u/+EviMJALjCzwa4S7kSs1rNAHNrw4Gt0s8DLfPDAyhC0wLoa8UC4qrWAuLbyALC6tgCwrvIAsiK1gLIS8QCziLPAs3LuwNTqsQDEzOvgJkiugHYU5gLXpLHAn8aCwJ5WeUC85nZAm3p2gLoQd4C4pnjAsMJ5wLIsecCzlnhAtQB2QLZodIC31HbAv+JDQL5yPgC8/DrAu4o5wLoaOoC4rDwAsMA9ALIuPcCznD0AtQo7QLZ4OUC36DnAv+oEQL56AkC9CQBAu5cBwLonAcC4twDAsLgAQLIoAUCzmAGAtQoAALZ9AoC37QSAv+k5wL55OYC9CzuAu5s9QLotPgC4vz2AsK88QLIdOwCzjTqAtP87QLZzPoC340PAv9N3AL5pdMC8/3aAu5V4gLorecC4v3oAsKt5QLIXeACjgXdA1Ot3AGZZecC3x4PAn6WxwK5HrsB86bFAu4ezwLohtYC4ubZAsK+1wLIZtQCjf7SA9OGz4KY3tEJnh8NAD1frIJ4V5gMMz+wgO3PvANoT8UC4rfJAsLvyQLIj8YCji/DBBPHv4TYb7EY3K/+ht1TrII 4w9GCOysIArfCtim3S6MudHrDgHSzswEu8soObxO6DWk6ywqpU7sKo3rJCyOLuQsCOsYKwjO2C4gCxAuH87IHjcrCBo17oBVTEqAbUsNlBBcKKoNWcrMc3JJkhHziKAA4gc4g9DHUgO653A7pAdwKI1HZCwJZ1gsICdQKzcnTC5OR0QcYyaManbmFAf5JNAP48P0Pc6DrgG5A8A4ooPAKYwjrCwKQ5wsIMOQLDdjkCtOQ4QuZONIHXrCuED6QPAl5ABcKs1gIC+3ABQuoMAQLIqAACsL0BgsIjAoKjhQKDBOcCwtZRBgKnsxBCP58sw849NQIM0zkC22U6Arn7OsLIkzuCsNc8wtJBPUJDqTzEJP07ILZFP0S3k05Ar2tjgI4na0Y80XTB+2F1wtnzdoLIhXeCsOd4QtJVeMJTv3hEBRd2YGYhdQhHNYrADyOb4D3BjqEsvaqGi2OxgenxsoLYf7OCsO+0gsJftMJzz7QD5SuyIFXzr0pWy8LAjlnEIq2LrgccqdzA61XqRRnv7kIYf++C0PPwgsJl8MKD1/BDlTnuQAXN6ouGRffgNlrCov 1W44NeArWEHX6ij31I3c/9EqMDXSDfQ1u+pkhL0OMH+larxUpm6IWo5rFGWPTtxiCItYYAgPJGQfi4RpH49AXTYrSEYzDbi6RmkgtkSr5E1R5mgxVMj8n2eGlg3lB+Qp3WaQ4dCGcDe65pyBpGbwUY1nSGkJh5BhIGfIWjaH2I9KZug7WuS8qmoDBCHoJGAH4kL4wdBCtD66AtB1oyMoVYwDhGUK48xkIcQIZTikZEtNg/ycX+MEKm/gZIPwYToG5BC0lM1QvG63EIwxoVB0g4qQNFoMYBhPIwBMfjoApFpRIPw+ZcCQm3CRigbvMMCB3xNMJcx0XJe2lFxNn9QgZYjz6GAOM5RvJRNITDuzCH1RktQzYTMAxmfUiA/ps3Qf2dUIpcmXQDa09/SBnnfgXYe3qF4PV1xuJhcUSzx20IJR1qAyXTao4mQ38Cvm9woM0RbELcU5YLO0m4BFndukaIbbdF8QWyhpJzrcTT1alIdSemQzWLpM9l/baD3XmOon01lAn8L8IEqxnfi4nb9gXoY/PGMRHvRlKD6oVT5+WIZTPiQ0VT4FAFcelDlX6GIn x+00d9EKJG7PSWU3xSyFPMtpOHHFjOBru2jdC7yMmSipaeCPrC2knZLKzLmU7pCtBCuIoALvQKwZy6TqGm9IyjALKLUsrT0xP+iBFj5rpMFJBjh1UklElFhE1hjXJtBW1uYRI8yFbHS6BTzrpiYkhZBHCMEGh9iqHWh4mzDn6QlBZmiUV6VYyVyh4EDOo7Be3UKxB80BkIq4QZDKowJgiY1DQMEJBCSgH2TgzjXFTJ1I5Bj8VeKgYWLwdK3eQrQz3JC0ysZxGPS00bB1n9EwwYnwbJ8MAGiUISEM0jahfJpMwbCBXwBE0l4yxC7iICym0VJwYsg09Pu0NWSdnbT0xYb0JKgPkzTAJbJYjzpxzOZNEiR0WTKtGE8zxFrYMchC05UI1cC3GIevWFT6m1iEkoRX1KISdvzGKFYkhTtViPdMFdhyVRY5K1d27GLYFQoNyDbAc7041Q+uW6yrl9vY1oG7hJ8VGsDDKxngiTxZLQ9LWZRwTnm5OFD6PG/HtnAP0Pnwhby8FL+qPZkpl5+MxQAfRK0XfoC0Lh2cjT0c5SZEvSxlRBzZN0e9QG9IhZAt sGuEisDqQKa6x8lHsKrJTbYHAImvKmSDsccRV6zq0VOqJyCVq8sEgZyIrTejrEU2iCrlDI3uHUoKqw2QCM5xUB5quSIaa+2sMahtZyyLoSY4RqC1PgokqEPFNBO/ptxswyTRKLhjZIi1wzlSpkNYtJUFQSuCJ2zaEIhlPSXoLYAxpqjcR+Vk8EoCIF27gzRlziKU576wGI+0MMFCoXAQ7Y0h4SQFhBTTFKThZChl2QQ9ZL0zRIK0hFKQZMLL4mgzzhD8wrqxiSSmMhzalnHBX4ew2L8MwMi7G6FZVzEC+U8+AuClTyBQ5EvzIF3SUBiawVMMfLz1SS2nddDrknWVTYEUJNMSEekkJzA87jhQnWY7MMSaRdHJQzuzxJnFslRWxxV477OXyNajGA1lj3jQ/QZXdNYZNVkwKrO4tDXUhWY4NGCaPtUhUkcWkJ/HdeQjuXd4s7NZeWCee0kgiLrlbgta3QIgGM06LVd4lC54FVw2GASVOjihWT852KG5lhyHuZr8gKqcPReZfCWphz6BSg++QTclfHUoK1swbyf7oUMuO0yELNsxVjCcBJM4xXiO qubgL7knVJmqRcEtryjU3p7jgJeiZsBOpmVhTKvoTQSX5Eypm6e0cKIleVupSNEOjwgBQ5kK8SyCiRHTh8spWhCqEWAHaP3fIidZiBdKPVsnBmjAJQocuDZmoCipJVSmtQMFQq0A+JGxonVOn2DIz5diZY2GBVlQAsVt/hbG8a4f5gTzN4XE9j4DaFKrQrBXwCK0wrhx2LuvkOGDnbHdMYmgCXcCAxkKC0IF1BjEHVovhck9NkPIfkPgULS6wogPwRDkmrVxkVOhMpk4kJGNoIeQKNwMQJDEFwBxdyjjFZEtZBy9P2FM4znyaG3EkBxTsxL8YrMU3SCd9a0VipU9lwFTdO8RMNFZJGHtEjKQYYYvAMi0NzAlZS4TTNW7U1QiurTg4aaXKOibNs2gh1jBWApWmP4cE9VKItFIqCazjWInkfCnL1OFXz7T8LC1tuQGrldww6XXLYOSub1nAFip3RN2fYgktt0MJZSEXCjWzRgsFOxiMlbVGjEVFGCvNdiSoVm8lZn55VuKeMnmBrr5aRmZqWIgGbi3H5eUDyW5/Mkn+BAbKdng4TF4sCcpZXiK".split(" "); +k=tx.prototype;k.initialize=function(){uv(this,!1);vv(this,!0);Cv(this,this.Da);this.Bd();this.N.enable(this.N.DEPTH_TEST);const a=mat4.create();mat4.identity(a);a[0]=this.slideWidth()/921.6;a[5]=this.slideHeight()/518.4;this.jb=mat4.multiply(this.jb,a,this.jb);this.yB=mat4.create();mat4.set(this.jb,this.yB)};k.GJ=function(a){for(let b=0;b>>=0;e.push(new W(xx((0==(g>>31&1)?1:-1)*((g&2145386496)>>21),460.8,11),xx((0==(g>>20&1)?1:-1)*((g&1047552)>>10),275.3,11),xx((0==(g>>9&1)?1:-1)*(g&511),211.2,10)))}for(f=0;fvx.length-1&&(c=vx.length-1,b=0);if(0!=b||this.na()&&!this.o4){if(this.w4!=c){var d=c!=vx.length-1?vx[c+1]:null;this.x4=wx(this,vx[c],!0);this.zV=null!=d?wx(this,d,!0):null}for(d=0;da?(f=Y(0,90,45,0),f=.5*Math.sin(f(e)*Math.PI/180),H(this.sp,f)):(f=Y(45,0,90,90),f=.5*Math.sin(f(e)*Math.PI/180),H(this.tp,f)));this.xc?(a=e-n(a),0>=a?(H(this.Kc,0),H(this.sp,0)):90<=a?(H(this.Lc,0),H(this.tp,0)):(H(this.Kc,1),H(this.Lc,1)),xi(this.zp,b)):(xi(this.Lc,c),xi(this.Kc,d),xi(this.tp,c),xi(this.sp,d))}; +var Ax=0,zx=1,Bx=2,Cx=3;function Dx(a,b,c,d){d/=a-1;c/=b-1;const e=new fw,f=new W(0,0,1);for(let g=0;gg;++g)for(let h=c;h= max)\n\t\t{\n\t\t\treturn 1.0;\n\t\t}\n\n\t\tfloat value = (x - min) / (max - min);\n\t\tfloat squaredValue = value * value;\n\n\t\treturn -2.0 * squaredValue * value + 3.0 * squaredValue;\n\t}\n\n\tfloat calcAmp()\n\t{\n\t\tfloat periodKoef = linearInterpolation(uPhase, waveStartAppearTime, 1.0, waveStartAppearTime + WAVE_APPEAR_DURATION, MIN_AMP_KOEF);\n\t\tperiodKoef = clamp(periodKoef, MIN_AMP_KOEF, 1.0);\n\n\t\treturn calcAmpKoef(periodKoef) * uSlideWidth / WAVES_COUNT;\n\t}\n\n\tfloat calcX()\n\t{\n\t\tfloat forcedX = smoothStep(xTimesPart1.x, xTimesPart1.y, uPhase) * forcedXPath + smoothStep(xTimesPart1.z, xTimesPart1.w, uPhase) * 0.75;\n\t\tfloat dampAmpKoef = (uPhase <= xTimesPart2.w + 0.35) ? 1.0 : (diagonalRatio == 0.0 ? 1.0 : diagonalRatio);\n\t\tfloat stretchWidth = smoothStep(xTimesPart2.w, xTimesPart3.x, uPhase);\n\t\tfloat compressionWidth = smoothStep(xTimesPart3.x, xTimesPart3.y, uPhase);\n\t\tfloat deltaWidthKoef = (linearInterpolation(diagonalRatio, 0.0, 0.0, 1.0, compressionWidth) - linearInterpolation(diagonalRatio, 0.0, 0.0, 1.0, stretchWidth)) * STRETCH_KOEF;\n\n\t\tfloat dampX = smoothStep(xTimesPart2.x, xTimesPart2.y, uPhase);\n\t\tdampX -= smoothStep(xTimesPart2.y, xTimesPart2.z, uPhase) * 1.25;\n\t\tdampX += deltaWidthKoef;\n\n\t\treturn (forcedX + dampX * xDampAmp / dampAmpKoef) * uSlideWidth;\n\t}\n\n\tfloat calcY(vec3 vertex)\n\t{\n\t\tfloat cornerBounceAtStartKoef = linearInterpolation(uPhase, yTimesPart1.y, 0.0, yTimesPart1.z, MAX_CORNER_BOUNCE_AT_START_KOEF);\n\t\tfloat x0 = uLeftCurtain ? uSlideWidth * 0.25 : uSlideWidth * 0.5;\n\t\tfloat x1 = uLeftCurtain ? uSlideWidth * 0.5 : uSlideWidth * 0.75;\n\t\tfloat fx0 = uLeftCurtain ? cornerBounceAtStartKoef : MAX_CORNER_BOUNCE_AT_START_KOEF;\n\t\tfloat fx1 = uLeftCurtain ? MAX_CORNER_BOUNCE_AT_START_KOEF: cornerBounceAtStartKoef ;\n\t\tfloat colBounceAtStartKoef = linearInterpolation(vertex.x, x0, fx0, x1, fx1);\n\t\tcolBounceAtStartKoef = clamp(colBounceAtStartKoef, 0.0, MAX_CORNER_BOUNCE_AT_START_KOEF);\n\n\t\tfloat cornerBounceAtEndKoef = linearInterpolation(uPhase, yTimesPart2.y, 0.0, yTimesPart2.z, MAX_CORNER_BOUNCE_AT_END_KOEF);\n\t\tx0 = uLeftCurtain ? 0.0 : uSlideWidth * 0.5;\n\t\tx1 = uLeftCurtain ? uSlideWidth * 0.5 : uSlideWidth;\n\t\tfx0 = uLeftCurtain ? cornerBounceAtEndKoef : MAX_CORNER_BOUNCE_AT_END_KOEF;\n\t\tfx1 = uLeftCurtain ? MAX_CORNER_BOUNCE_AT_END_KOEF: cornerBounceAtEndKoef ;\n\t\tfloat colBounceAtEndKoef = linearInterpolation(vertex.x, x0, fx0, x1, fx1);\n\n\t\tfloat y0 = -smoothStep(yTimesPart1.x, yTimesPart1.y, uPhase) * colBounceAtStartKoef;\n\t\ty0 += smoothStep(yTimesPart1.y, yTimesPart1.z, uPhase) * MAX_CORNER_BOUNCE_AT_START_KOEF;\n\t\ty0 -= smoothStep(yTimesPart1.z, yTimesPart1.w, uPhase) * 0.25;\n\t\ty0 += smoothStep(yTimesPart1.w, yTimesPart2.x, uPhase) * 0.25;\n\t\ty0 -= smoothStep(yTimesPart2.x, yTimesPart2.y, uPhase) * colBounceAtEndKoef;\n\t\ty0 += smoothStep(yTimesPart2.y, yTimesPart2.z, uPhase) * (MAX_CORNER_BOUNCE_AT_END_KOEF + 1.0);\n\n\t\treturn (y0 * yAmp + rowRatio) * uSlideHeight;\n\t}\n\n\tvec3 getVertexPosition(vec3 vertex)\n\t{\n\t\tfloat amp = calcAmp();\n\t\tfloat z = -amp * sinX;\n\t\tfloat xKoef = uLeftCurtain ? 1.0 : -1.0;\n\n\t\treturn vec3(vertex.x - calcX() * xKoef, -calcY(vertex), z);\n\t}\n\n\tvoid initVertexParams(vec3 vertex)\n\t{\n\t\tfloat periodWidth = uSlideWidth / WAVES_COUNT;\n\t\tfloat frequency = PI * 2.0 / periodWidth;\n\t\tsinX = sin(frequency * vertex.x);\n\n\t\trowRatio = vertex.y / uSlideHeight;\n\n\t\tfloat halfRowRatio = rowRatio * 0.5;\n\t\tfloat halfSquaredRowRatio = rowRatio * halfRowRatio;\n\n\t\tfloat maxDT = 0.1;\n\t\tfloat dtAmp = 2.0 * maxDT;\n\t\tfloat dt = dtAmp * halfRowRatio;\n\n\t\tfloat distT = (0.6 - dt);\n\n\t\tfloat xT1 = dt;\n\t\tfloat xT2 = 0.4 + dt;\n\t\tfloat xT3 = xT2 + distT * 0.5;\n\t\tfloat xT4 = 1.0 + (1.0 - xT3);\n\n\t\tfloat xDampT1 = (xT1 + xT2) * 0.45;\n\t\tfloat xDampT2 = xT2;\n\t\tfloat xDampT3 = xT3;\n\t\tfloat xDampT4 = xDampT2 + (xDampT3 - xDampT2) * 0.5;\n\t\tfloat xDampT5 = xDampT3 + 0.075;\n\t\tfloat xDampT6 = 1.0;\n\n\t\tdistT = (0.7 - dt);\n\n\t\tfloat yT2 = 0.3 + dt;\n\t\tfloat yT3 = yT2 + distT * 0.5;\n\n\t\tfloat yDampT1 = 0.0;\n\t\tfloat yDampT2 = (yDampT1 * 2.0 + 0.35) * 0.5;\n\t\tfloat yDampT3 = yT2;\n\t\tfloat yDampT4 = (yT2 + yT2 + yT3) / 3.0;\n\t\tfloat yDampT5 = (yT2 + yT3 + yT3) / 3.0;\n\t\tfloat yDampT6 = yT3 + 0.1175;\n\t\tfloat yDampT7 = 1.0;\n\n\t\txTimesPart1 = vec4(xT1, xT2, xT3 - 0.125, xT4);\n\t\txTimesPart2 = vec4(xDampT1, xDampT2, xDampT3, xDampT4);\n\t\txTimesPart3 = vec2(xDampT5, xDampT6);\n\n\t\tyTimesPart1 = vec4(yDampT1 + 0.05, yDampT2, yDampT3, yDampT4);\n\t\tyTimesPart2 = vec3(yDampT5, yDampT6, yDampT7);\n\n\t\twaveStartAppearTime = linearInterpolation(vertex.y, 0.0, WAVES_START_APPEAR_PHASE, uSlideHeight, WAVES_READY_PHASE - WAVE_APPEAR_DURATION);\n\n\t\tfloat colRatio = (uLeftCurtain ? vertex.x : uSlideWidth - vertex.x) / (uSlideWidth * 0.5);\n\t\tdiagonalRatio = (colRatio + rowRatio) * 0.5;\n\n\t\tfloat x0 = uLeftCurtain ? 0.0 : uSlideWidth * 0.5;\n\t\tfloat x1 = uLeftCurtain ? uSlideWidth * 0.5 : uSlideWidth;\n\t\tfloat fx0 = uLeftCurtain ? 0.2 : 0.0;\n\t\tfloat fx1 = uLeftCurtain ? 0.0 : 0.2;\n\t\tforcedXPath = 0.2 * (colRatio + linearInterpolation(vertex.x, x0, fx0, x1, fx1));\n\n\t\tfloat mxDampAmp = 0.1 * diagonalRatio;\n\t\tfloat dampAcc = 2.0 * mxDampAmp;\n\t\txDampAmp = dampAcc * halfRowRatio;\n\n\t\tfloat maxYAmp = 0.02;\n\t\tfloat dyAmp = 2.0 * maxYAmp * diagonalRatio * rowRatio;\n\t\tyAmp = dyAmp * halfSquaredRowRatio;\n\t}\n\n\tvec3 getVertexNormal(vec3 vertex, vec3 p)\n\t{\n\t\tbool rightSideXPos = vertex.x == (uLeftCurtain ? uSlideWidth * 0.5 : uSlideWidth);\n\t\tfloat deltaWidth = rightSideXPos ? -DELTA_W : DELTA_W;\n\n\t\tvec3 rightVertex = vec3(vertex.x + deltaWidth, vertex.y, vertex.z);\n\t\tinitVertexParams(rightVertex);\n\t\tvec3 right = getVertexPosition(rightVertex);\n\n\t\tvec3 downVertex = vec3(vertex.x, vertex.y + DELTA_H, vertex.z);\n\t\tinitVertexParams(downVertex);\n\t\tvec3 down = getVertexPosition(downVertex);\n\n\t\tvec3 v1 = vec3(right.x - p.x, right.y - p.y, right.z - p.z);\n\t\tvec3 v2 = vec3(down.x - p.x, down.y - p.y, down.z - p.z);\n\n\t\tvec3 n = rightSideXPos ? cross(v1, v2) : cross(v2, v1);\n\t\tn = normalize(n);\n\n\t\treturn n;\n\t}\n\n\tvoid main(void)\n\t{\n\t\tvTextureCoord = aTextureCoord;\n\n\t\tvec3 vertex = vec3(aVertexPosition.x, -aVertexPosition.y, aVertexPosition.z);\n\t\tinitVertexParams(vertex);\n\t\tvec3 p = getVertexPosition(vertex);\n\n\t\tvec3 pNormal = getVertexNormal(vertex, p);\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\n\t\tif (vertex.y == 0.0)\n\t\t{\n\t\t\tfloat maxDY = calcAmpKoef(MIN_AMP_KOEF) * uSlideWidth / WAVES_COUNT * 0.4;\n\t\t\tp.y += max(0.0, min(maxDY, linearInterpolation(uPhase, WAVES_START_APPEAR_PHASE, 0.0, WAVES_START_APPEAR_PHASE + WAVE_APPEAR_DURATION, maxDY)));\n\t\t}\n\t\tgl_Position = uPMVMatrix * vec4(p, 1.0);\n\t}"}; +k.HR=function(){if(void 0!==this.tq)return this.tq;this.ns();return this.tq=this.tq};k.ns=function(){void 0===this.N&&Hx.Mb.ns.call(this)};k.Ha=function(a){this.N.uniform1f(this.jg,a);this.rT=!0;Mv(this,this.Oz,this.N.TRIANGLE_STRIP);this.rT=!1;Mv(this,this.PA,this.N.TRIANGLE_STRIP)}; +k.Vh=function(){Nv(this);this.We=Pv(this,"uSampler");this.jg=Pv(this,"uPhase");this.C4=Pv(this,"uLeftCurtain");const a=Pv(this,"uSlideWidth");this.N.uniform1f(Pv(this,"uSlideHeight"),this.slideHeight());this.N.uniform1f(a,this.slideWidth())};k.Kh=function(){Fv(this,this.Oz);Fv(this,this.PA)};k.Lh=function(){};k.vJ=function(){this.N.uniform1i(this.C4,this.rT?1:0)}; +k.Bd=function(){var a=this.slideWidth();const b=this.slideHeight();this.RU=Ex(a,b,0,31);this.XX=Ex(a,b,30,61);this.xe=Fx(15,31);this.Oz=new Vv;a=Hv(this,hw(this.RU),3);this.Oz.kg=a;a=Hv(this,iw(this.RU),2);this.Oz.rg=a;a=Iv(this,this.xe);this.Oz.Sf=a;this.PA=new Vv;a=Hv(this,hw(this.XX),3);this.PA.kg=a;a=Hv(this,iw(this.XX),2);this.PA.rg=a;a=Iv(this,this.xe);this.PA.Sf=a};k.yj=function(){return this.We};function Ix(a){R.call(this,a);this.hb().xg();this.$e=!1}t(Ix,R);Ix.prototype.initialize=function(){uv(this,!0);vv(this,!0)};Ix.prototype.Ha=function(a){.3>a?H(this.hb().slide(),0):H(this.hb().slide(),1)};function Jx(a){R.call(this,a);this.hb().xg();this.$e=!1}t(Jx,R);Jx.prototype.initialize=function(){uv(this,!0);vv(this,!0);this.Eg=document.createElement("div");Oh(this.Eg,this.slideWidth());Ph(this.Eg,this.slideHeight());F(this.Eg,"backgroundColor","#000000");F(this.Eg,"position","relative");this.va().appendChild(this.Eg)};Jx.prototype.Ha=function(a){.5>a?(H(this.hb().slide(),0),H(this.Eg,0)):.8>a?H(this.Eg,1):(H(this.Eg,0),H(this.hb().slide(),1))};function Kx(a){R.call(this,a);this.$e=!1;this.Ma(!1,!0);this.pM=0;a=this.slideWidth();const b=this.slideHeight(),c=Lx!=a||Mx!=b;if(!Nx||c)Nx=[],Lx=a,Mx=b,Ox(a,b)}var Nx,Lx,Mx;t(Kx,R);Kx.prototype.initialize=function(){uv(this,!1);vv(this,!0);const a=this.Da;this.va().appendChild(a);this.gA=S(this.slideWidth(),this.slideHeight());this.gA.getContext("2d").drawImage(a,0,0)}; +function Ox(a,b){var c=Nx;a/=54;const d=b/42;let e=0,f=0;for(b=0;54>b;++b){f=0;const g=Math.round((b+1)*a)-e,h=e;for(let l=0;42>l;++l){const n=Math.round((l+1)*d)-f,m=new Px(h,f,g,n);m.tr=Math.random();c.push(m);f+=n}e+=g}c.sort(function(g,h){return g.trh.tr?1:0});a=c.length;for(b=0;b time)\n\t\t{\n\t\t\treturn linearInterpolation(phase, time, ANGLE_3, 1.0, ANGLE_2);\n\t\t}\n\t\tfloat angle = linearInterpolation(phase, constAngleTime, ANGLE_2, time, ANGLE_3);\n\t\treturn angle;\n\t}\n\n\tfloat getRowAngleByPhase(vec3 pos, float phase)\n\t{\n\t\tconst float HORIZONTAL_DELAY = 0.05;\n\t\tfloat colDelay = uDirectionIsLeft\n\t\t\t? linearInterpolation(pos.x, 0.0, 0.0, uSlideWidth, HORIZONTAL_DELAY)\n\t\t\t: linearInterpolation(pos.x, 0.0, HORIZONTAL_DELAY, uSlideWidth, 0.0);\n\n\t\tphase = linearInterpolation(phase, 0.0, colDelay, 1.0, 1.0);\n\n\t\tfloat constAngleTime = linearInterpolation(pos.y, 0.0, TIME_2, uSlideHeight, TIME_1);\n\t\tif (phase > constAngleTime)\n\t\t{\n\t\t\treturn goBack(pos.y, phase, constAngleTime);\n\t\t}\n\n\t\tfloat angle = linearInterpolation(phase, 0.0, ANGLE_1, constAngleTime, ANGLE_2);\n\t\treturn angle;\n\t}\n\n\tvec3 getVertexPosition(float phase, vec3 pos)\n\t{\n\t\tfloat R_1 = uSlideHeight;\n\t\tfloat R_2 = uSlideHeight * 0.25;\n\t\tvec2 r = vec2(linearInterpolation(pos.y, 0.0, R_1, uSlideHeight, 0.0), linearInterpolation(pos.y, 0.0, R_2, uSlideHeight, 0.0));\n\n\t\tfloat angle = getRowAngleByPhase(pos, phase);\n\t\tvec3 v = ellipse(angle, pos, vec2(0.0, 0.0), r);\n\t\treturn v;\n\t}\n\tvec3 getVertexNormal(float phase, vec3 pos)\n\t{\n\t\tconst float DELTA_W = 1.0;\n\t\tconst float DELTA_H = 1.0;\n\n\t\tfloat deltaWidth = (pos.x == uSlideWidth) ? -DELTA_W : DELTA_W;\n\t\tfloat deltaHeight = (pos.y == uSlideHeight) ? -DELTA_H : DELTA_H;\n\n\t\tvec3 right = getVertexPosition(phase, vec3(pos.x + deltaWidth, pos.y, pos.z));\n\t\tvec3 down = getVertexPosition(phase, vec3(pos.x, pos.y + deltaHeight, pos.z));\n\t\tvec3 p = getVertexPosition(phase, vec3(pos.x, pos.y, pos.z));\n\n\t\tvec3 v1 = right - p;\n\t\tvec3 v2 = down - p;\n\n\t\tvec3 n = (pos.x == uSlideWidth) ? cross(v1, v2) : cross(v2, v1);\n\n\t\treturn normalize(n);\n\t}\n\n\tvoid main(void)\n\t{\n\t\tfloat phase = uPhase;\n\t\tif (phase < START_PHASE)\n\t\t{\n\t\t\tphase = 0.0;\n\t\t}\n\t\telse if (phase > END_PHASE)\n\t\t{\n\t\t\tphase = 1.0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tphase = linearInterpolation(phase, START_PHASE, 0.0, END_PHASE, 1.0);\n\t\t}\n\t\t\n\t\tvec3 vertex = vec3(aVertexPosition.x, -aVertexPosition.y, aVertexPosition.z);\n\t\tvec4 p = vec4(getVertexPosition(phase, vertex), 1.0);\n\t\tgl_Position = uPMVMatrix * p;\n\t\tvTextureCoord = aTextureCoord;\n\n\t\tvec3 pNormal = getVertexNormal(phase, vertex);\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\t}"}; +k.Ha=function(a){this.N.uniform1f(this.jg,a);Mv(this,this.Ty,this.N.TRIANGLE_STRIP)};k.Vh=function(){Nv(this);this.We=Pv(this,"uSampler");this.jg=Pv(this,"uPhase");const a=Pv(this,"uDirectionIsLeft"),b=Pv(this,"uSlideWidth");this.N.uniform1f(Pv(this,"uSlideHeight"),this.slideHeight());this.N.uniform1f(b,this.slideWidth());this.N.uniform1i(a,this.O==Ux?1:0)};k.Lh=function(){}; +k.Bd=function(){this.Zf=Dx(30,30,this.slideWidth(),this.slideHeight());this.xe=this.O==Ux?Gx(30,30):Fx(30,30);this.Ty=new Vv;var a=Hv(this,hw(this.Zf),3);this.Ty.kg=a;a=Hv(this,iw(this.Zf),2);this.Ty.rg=a;a=Iv(this,this.xe);this.Ty.Sf=a};k.vz=function(a){this.mB=Gv(this,this.N.TEXTURE0,this.yj(),0,a,this.RK.bind(this))};k.Kh=function(){Fv(this,this.Ty)};k.RK=function(a,b,c,d){a.translate(0,d);a.scale(1,-1);a.drawImage(b,0,0,c,d)};k.yj=function(){return this.We};var Ux=0;function $s(a){R.call(this,a)}t($s,R);function Vx(a){R.call(this,a);this.hb().xg();this.$e=!1}t(Vx,R);Vx.prototype.initialize=function(){};Vx.prototype.Ha=function(a){H(this.hb().slide(),a)};function Wx(a){R.call(this,a);this.hb().xg()}t(Wx,R);Wx.prototype.initialize=function(){uv(this,!0);this.$e=!1;this.Eg=document.createElement("div");Oh(this.Eg,this.slideWidth());Ph(this.Eg,this.slideHeight());F(this.Eg,"backgroundColor","#000000");F(this.Eg,"position","relative");this.va().appendChild(this.Eg)};Wx.prototype.Ha=function(a){.5>a?(H(this.Eg,1-2*(.5-a)),vv(this,!1)):(H(this.Eg,1-2*(a-.5)),vv(this,!0))};function Xx(a,b){R.call(this,a);this.O=b;this.Ma(!1,!0)}t(Xx,zv);k=Xx.prototype;k.initialize=function(){uv(this,!1);vv(this,!0);Cv(this,this.Da);this.Bd();mat4.translate(this.jb,[-this.slideWidth()/2,-this.slideHeight()/2,0]);Uv(this)};k.Nh=function(){return"precision mediump float; \n\n\tvarying vec2 vTextureCoord; \n\tvarying vec3 vNormal; \n\n\tuniform sampler2D uSampler; \n\n\tvoid main(void) \n\t{ \n\t\tvec3 n = normalize(vNormal); \n\t\tvec3 lightingDirection = vec3(0.0, 0.0, 1.0); \n\t\tfloat directionalLightWeighting = dot(n, lightingDirection); \n\t\tfloat intentsity = 0.55 + 0.45 * directionalLightWeighting; \n\t\tvec4 textureColor = texture2D(uSampler, vTextureCoord); \n\t\tgl_FragColor = vec4(textureColor.rgb * intentsity, textureColor.a); \n\t}"}; +k.Oh=function(){return"attribute vec3 aVertexPosition;\n\tattribute vec2 aTextureCoord;\n\n\tuniform mat4 uPMVMatrix;\n\tuniform mat3 uNMatrix;\n\n\tuniform float uPhase;\n\tuniform bool uDirectionIsLeft;\n\tuniform float uSlideHeight;\n\tuniform float uSlideWidth;\n\n\tvarying vec2 vTextureCoord;\n\tvarying vec3 vNormal;\n\n\tconst float DELAY_ANGLE = 5.0;\n\tconst float SLIDE_WIDTH_KOEF = 0.2;\n\tconst float PI = 3.14159265358979323846264;\n\tconst vec2 CENTER = vec2(0.0, 0.0);\n\tconst float DELTA_W = 0.5;\n\tconst float DELTA_H = 0.5;\n\n\tfloat linearInterpolation(float x, float x0, float fx0, float x1, float fx1)\n\t{\n\t\treturn mix(fx0, fx1, (x - x0) / (x1 - x0));\n\t}\n\n\tvec2 ellipse(float angle, vec2 center, vec2 radius)\n\t{\n\t\tfloat ang = radians(angle);\n\t\treturn vec2((center.x + radius.x * cos(ang)), -(center.y + radius.y * sin(ang)));\n\t}\n\n\tfloat accelerationFunc(float progress)\n\t{\n\t\tfloat a = 3.0;\n\t\tfloat b = 1.0;\n\t\tfloat c = 1.0;\n\t\tfloat d = 1.0;\n\n\t\tfloat squaredProgress = progress * progress;\n\t\treturn a * squaredProgress * progress + b * squaredProgress + c * progress + d;\n\t}\n\n\tfloat getRowAngleByPhase(vec3 vertex)\n\t{\n\t\tfloat endAngle = atan(uSlideHeight * 0.5 / max(uSlideWidth, uSlideHeight)) * 180.0 / PI + 90.0 + DELAY_ANGLE * 4.0;\n\n\t\tfloat a = -0.6;\n\t\tfloat b = 2.0 + a;\n\n\t\tfloat phase = linearInterpolation(uPhase, 0.0, a, 1.0, b);\n\t\tphase = accelerationFunc(phase);\n\n\t\tfloat angle = linearInterpolation(phase, accelerationFunc(a), 0.0, accelerationFunc(b), endAngle);\n\t\tfloat rowDelayAngle = linearInterpolation(vertex.y, 0.0, DELAY_ANGLE, uSlideHeight, 0.0);\n\t\tfloat extraAngle = linearInterpolation(uPhase, 0.5, 0.0, 0.8, DELAY_ANGLE);\n\t\tfloat maxDelayAngle = DELAY_ANGLE + max(0.0, min(DELAY_ANGLE, extraAngle));\n\t\tfloat colAngle = uDirectionIsLeft\n\t\t\t? linearInterpolation(vertex.x, 0.0, maxDelayAngle * 0.5, uSlideWidth, maxDelayAngle)\n\t\t\t: linearInterpolation(vertex.x, 0.0, maxDelayAngle, uSlideWidth, maxDelayAngle * 0.5);\n\n\t\tfloat colDelayAngle = uDirectionIsLeft\n\t\t\t? linearInterpolation(vertex.x, 0.0, 0.0, uSlideWidth, colAngle)\n\t\t\t: linearInterpolation(vertex.x, 0.0, colAngle, uSlideWidth, 0.0);\n\n\n\t\treturn max(0.0, angle - rowDelayAngle - colDelayAngle);\n\t}\n\n\tvec3 getVertexPosition(vec3 vertex)\n\t{\n\t\tfloat maxXRadius = uSlideHeight;\n\t\tfloat maxYRadius = sqrt(uSlideWidth * SLIDE_WIDTH_KOEF * uSlideWidth * SLIDE_WIDTH_KOEF + uSlideHeight * uSlideHeight);\n\n\t\tfloat xRadius = linearInterpolation(vertex.y, 0.0, maxXRadius, uSlideHeight, 0.0);\n\t\tfloat yRadius = linearInterpolation(vertex.y, 0.0, maxYRadius, uSlideHeight, 0.0);\n\n\t\treturn vec3(vertex.x, ellipse(getRowAngleByPhase(vertex), CENTER, vec2(xRadius, yRadius)));\n\t}\n\n\tvec3 getVertexNormal(vec3 pos, vec3 p)\n\t{\n\t\tbool rightSideXPos = pos.x == uSlideWidth;\n\t\tfloat deltaWidth = rightSideXPos ? -DELTA_W : DELTA_W;\n\n\t\tvec3 right = getVertexPosition(vec3(pos.x + deltaWidth, pos.y, pos.z));\n\t\tvec3 down = getVertexPosition(vec3(pos.x, pos.y + DELTA_H, pos.z));\n\n\t\tvec3 v1 = right - p;\n\t\tvec3 v2 = down - p;\n\n\t\tvec3 n = rightSideXPos ? cross(v1, v2) : cross(v2, v1);\n\t\tn = normalize(n);\n\n\t\treturn n;\n\t}\n\n\tvoid main(void)\n\t{\n\t\tvTextureCoord = aTextureCoord;\n\n\t\tvec3 vertex = vec3(aVertexPosition.x, -aVertexPosition.y, aVertexPosition.z);\n\t\tvec4 p = vec4(getVertexPosition(vertex), 1.0);\n\t\tgl_Position = uPMVMatrix * p;\n\n\t\tvec3 pNormal = getVertexNormal(vertex, vec3(p.xyz));\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\t}"}; +k.Ha=function(a){this.N.uniform1f(this.jg,a);Mv(this,this.$f,this.N.TRIANGLE_STRIP)};k.Vh=function(){Nv(this);this.We=Pv(this,"uSampler");this.jg=Pv(this,"uPhase");const a=Pv(this,"uDirectionIsLeft"),b=Pv(this,"uSlideWidth");this.N.uniform1f(Pv(this,"uSlideHeight"),this.slideHeight());this.N.uniform1f(b,this.slideWidth());this.N.uniform1i(a,0==this.O?1:0)};k.Lh=function(){};k.Kh=function(){Fv(this,this.$f)}; +k.Bd=function(){var a=this.slideWidth();const b=this.slideHeight();this.Zf=Dx(15,15,a,b);this.xe=Fx(15,15);this.$f=new Vv;a=Hv(this,hw(this.Zf),3);this.$f.kg=a;a=Hv(this,iw(this.Zf),2);this.$f.rg=a;a=Iv(this,this.xe);this.$f.Sf=a};k.yj=function(){return this.We};function Yx(a,b){R.call(this,a);this.O=b;this.Ma(!1,!1,!0,!0,!0,!0)}t(Yx,R);k=Yx.prototype; +k.initialize=function(){uv(this,!1);vv(this,!1);const a=this.slideWidth(),b=this.slideHeight();var c=S(a,b);F(c,"position","absolute");this.va().appendChild(c);c.getContext("2d").drawImage(this.hF,0,0);this.Cs=c;c=S(a,b);F(c,"position","absolute");this.va().appendChild(c);c.getContext("2d").drawImage(this.nF,0,0);this.Fs=c;this.Ne=this.nc(a,b);this.va().appendChild(this.Ne);var d=S(a,b);c=S(a,b);this.DG=this.nc(a,b);this.mh=this.nc(a,b);this.lh=this.nc(a,b);this.mh.appendChild(d);this.lh.appendChild(c); +this.Ne.appendChild(this.DG);this.DG.appendChild(this.mh);this.DG.appendChild(this.lh);d=d.getContext("2d");c=c.getContext("2d");d.drawImage(this.Up,0,0);c.drawImage(this.Cn,0,0);Di(this.Ne,Math.max(a,b)+"px");Ei(this.Ne,a/2+"px "+b/2+"px");Ci(this.DG,"preserve-3d")}; +k.Ha=function(a){const b=this.slideWidth(),c=this.slideHeight();H(this.Fs,1-a);H(this.Cs,a);a=ow(0,1,a);const d=this.O==Zx?1:-1,e=d*this.W1*b*(1-a),f=-this.X1*c*(1-a),g=-Math.max(b,c)*(1-a),h=-this.aS*(1-a),l=-d*this.bS*(1-a),n=d*this.Y1*(1-a);xi(this.mh,"translateZ("+Math.max(b,c)*a+"px) translateY("+c*a+"px) translateX("+-d*this.Z1*b*a+"px) rotateX("+this.aS*a+"deg) rotateY("+d*this.bS*a+"deg) rotateZ("+-d*this.a2*a+"deg)");xi(this.lh,"translateZ("+g+"px) translateY("+f+"px) translateX("+e+"px) rotateX("+ +h+"deg) rotateY("+l+"deg) rotateZ("+n+"deg)")};k.nc=function(a,b){const c=zd("DIV");Oh(c,a);Ph(c,b);F(c,"position","absolute");return c};k.Z1=.1;k.W1=.5;k.X1=1.75;k.Y1=30;k.a2=10;k.aS=80;k.bS=30;var Zx=1;function $x(a){R.call(this,a);this.$e=!1;this.Ma(!0,!0)}t($x,R);$x.prototype.initialize=function(){this.zG=!1;uv(this,!1);vv(this,!1);const a=this.slideWidth(),b=this.slideHeight(),c=this.mb,d=this.Da;F(c,"position","absolute");F(d,"position","absolute");var e=this.va(),f=this.na()?d:c;e.appendChild(f);e=this.va();f=this.na()?c:d;e.appendChild(f);this.gA=S(a,b);e=this.gA.getContext("2d");this.yV=S(a,b);this.yV.getContext("2d").drawImage(c,0,0);e.drawImage(d,0,0)}; +$x.prototype.Ha=function(a){const b=this.mb,c=this.Da;.2>a?(!this.zG&&this.na()&&(this.zG=!0,Fd(b)),ay(this,c,this.gA,a/.2)):(this.zG||this.na()||(this.zG=!0,Fd(c)),ay(this,b,this.yV,(1-a)/.8))};function ay(a,b,c,d){b=b.getContext("2d");const e=a.slideWidth();a=a.slideHeight();b.drawImage(c,0,0,e,a);b.save();b.globalCompositeOperation="lighter";b.fillStyle="rgba(255, 255, 255,"+zn(d)+")";b.rect(0,0,e,a);b.fill();b.restore()};function by(a,b,c){R.call(this,a);this.xc=c;this.na()?this.hb().xg():this.qc().xg();this.Ma(!0,!0);this.O=b}t(by,R);by.prototype.initialize=function(){uv(this,!1);vv(this,!1);this.vn()}; +by.prototype.Ha=function(a){a=ow(0,1,a);let b;if(this.xc){var c=-this.slideWidth()/2;.5>a?(b=Y(0,0,.5,-90),this.Py=b(a),b=Y(0,0,.5,-45),this.Yr=b(a),b=Y(0,0,.5,40),a=this.O==cy?"translateX("+-c+"px) translateZ("+this.Py+"px) rotateY("+this.Yr+"deg) rotateX("+b(a)+"deg) translateX("+c+"px)":"translateX("+c+"px) translateZ("+this.Py+"px) rotateY("+-this.Yr+"deg) rotateX("+b(a)+"deg) translateX("+-c+"px)"):.85>a?(b=Y(.5,-90,.85,0),this.Py=b(a),b=Y(.5,-45,.85,0),this.Yr=b(a),b=Y(.5,40,.85,90),a=this.O== +cy?"translateX("+-c+"px) translateZ("+this.Py+"px) rotateY("+this.Yr+"deg) rotateX("+b(a)+"deg) translateX("+c+"px)":"translateX("+c+"px) translateZ("+this.Py+"px) rotateY("+-this.Yr+"deg) rotateX("+b(a)+"deg) translateX("+-c+"px)"):(this.na()&&(this.Yr=0),b=Y(.85,90,1,180),a="translateX("+-c+"px) rotateY("+this.Yr+"deg) rotateX("+b(a)+"deg) translateX("+c+"px)");xi(this.we,a)}else.5>a?(b=Y(0,1,.5,0),a="scaleY("+b(a)+")",H(this.Lc,1),H(this.Kc,0),xi(this.Lc,a)):(b=Y(.5,0,1,1),a="scaleY("+b(a)+")", +H(this.Kc,1),H(this.Lc,0),xi(this.Kc,a))}; +by.prototype.vn=function(){this.Lc=this.Da;this.Kc=this.mb;const a=wd("DIV");this.we=wd("DIV");const b=this.slideWidth(),c=this.slideHeight();try{Di(a,b+"px"),Ei(a,b/2+"px "+c/2+"px"),Ci(this.we,"preserve-3d"),this.we.appendChild(this.Lc),this.we.appendChild(this.Kc),a.appendChild(this.we),this.va().appendChild(a)}catch(d){this.va().appendChild(this.Lc),this.va().appendChild(this.Kc)}F(this.Lc,"position","absolute");F(this.Kc,"position","absolute");Nh(this.we,b,c);Nh(this.Lc,b,c);Nh(this.Kc,b,c); +this.xc&&(xi(this.Lc,"translateZ(10px)"),xi(this.Kc,"rotateX(180deg)"))};var cy=1;function dy(a,b,c){R.call(this,a);this.xc=c;this.na()?this.hb().xg():this.qc().xg();this.Ma(!0,!0);this.Vn=b==cy}t(dy,R); +dy.prototype.initialize=function(){uv(this,!1);vv(this,!1);this.Lc=this.Da;this.Kc=this.mb;const a=wd("DIV");this.we=wd("DIV");const b=this.slideWidth(),c=this.slideHeight();try{Di(a,Math.max(b,c)+"px"),Ei(a,b/2+"px "+c/2+"px"),Ci(this.we,"preserve-3d"),Fi(this.we,"hidden"),this.Vn?(this.we.appendChild(this.Lc),this.we.appendChild(this.Kc)):(this.we.appendChild(this.Kc),this.we.appendChild(this.Lc)),a.appendChild(this.we),this.va().appendChild(a)}catch(d){this.Vn?(this.we.appendChild(this.Lc),this.we.appendChild(this.Kc)): +(this.we.appendChild(this.Kc),this.we.appendChild(this.Lc))}F(this.Lc,"position","absolute");F(this.Kc,"position","absolute");Nh(this.we,b,c);Nh(this.Lc,b,c);Nh(this.Kc,b,c);this.xc&&(this.Vn?xi(this.Lc,"rotateY(180deg)"):xi(this.Kc,"rotateY(180deg)"))};dy.prototype.Ha=function(a){this.xc?this.JN(a):this.NK(a)}; +dy.prototype.JN=function(a){a=this.Vn?1-a:a;const b=.25*(1-Math.cos(2*a*Math.PI));a=Cw(.63,.43)(a);const c=Math.max(this.slideWidth(),this.slideHeight());xi(this.we,"rotateY("+-180*a+"deg)translateZ("+b*c*-.3+"px)")};dy.prototype.NK=function(a){a=Cw(.63,.43)(a);if(.5>a){var b=Y(0,1,.5,0);a="scaleX("+b(a)+")";H(this.Lc,1);H(this.Kc,0);xi(this.Lc,a)}else b=Y(.5,0,1,1),a="scaleX("+b(a)+")",H(this.Kc,1),H(this.Lc,0),xi(this.Kc,a)};function ey(a){R.call(this,a);this.Ma(!1,!0)}t(ey,zv);k=ey.prototype;k.yj=function(){return this.We}; +k.initialize=function(){uv(this,!1);vv(this,!0);Cv(this,this.Da);this.N.disable(this.N.DEPTH_TEST);var a=[new V(.1806930693069307,0),new V(.3725247524752475,0),new V(.4603960396039604,0),new V(.6856435643564357,0),new V(.7673267326732673,0),new V(.8849009900990099,0),new V(.9987623762376238,.02103960396039604),new V(0,.027227722772277228),new V(0,.15841584158415842),new V(.47,.16955445544554457),new V(.4876237623762376,.16955445544554457),new V(.5284653465346535,.17202970297029702),new V(.41707920792079206, +.1745049504950495),new V(1,.18316831683168316),new V(0,.19554455445544555),new V(.6076732673267327,.2042079207920792),new V(.32,.21658415841584158),new V(.6485148514851485,.2202970297029703),new V(.7141089108910891,.22153465346534654),new V(0,.2623762376237624),new V(.275990099009901,.2908415841584158),new V(.2524752475247525,.33292079207920794),new V(.22153465346534654,.38242574257425743),new V(.8081683168316832,.41336633663366334),new V(0,.44183168316831684),new V(.18935643564356436,.46410891089108913), +new V(.4752475247524752,.47029702970297027),new V(.4665841584158416,.4715346534653465),new V(.4938118811881188,.4814356435643564),new V(.5024752475247525,.48267326732673266),new V(.5099009900990099,.4863861386138614),new V(.5123762376237624,.49133663366336633),new V(.801980198019802,.4938118811881188),new V(.5148514851485149,.49876237623762376),new V(.47896039603960394,.5),new V(.47,.5),new V(.5,.5),new V(.5148514851485149,.5012376237623762),new V(.4801980198019802,.5061881188118812),new V(.5136138613861386, +.5099009900990099),new V(.48267326732673266,.5123762376237624),new V(.5099009900990099,.5136138613861386),new V(.48514851485148514,.5148514851485149),new V(.504950495049505,.5160891089108911),new V(.48886138613861385,.5185643564356436),new V(.4938118811881188,.5185643564356436),new V(.4975247524752475,.5185643564356436),new V(.5334158415841584,.5334158415841584),new V(1,.5346534653465347),new V(.4962871287128713,.5371287128712872),new V(.47648514851485146,.5396039603960396),new V(.18811881188118812, +.568069306930693),new V(0,.6485148514851485),new V(.2537128712871287,.6534653465346535),new V(.7982673267326733,.6670792079207921),new V(.28589108910891087,.7066831683168316),new V(.775,.7351485148514851),new V(1,.7784653465346535),new V(.3341584158415842,.7945544554455446),new V(.7066831683168316,.8032178217821783),new V(0,.8106435643564357),new V(.38985148514851486,.8477722772277227),new V(.47,.8564356435643564),new V(.6150990099009901,.8601485148514851),new V(1,.943069306930693),new V(0,.9826732673267327), +new V(.21905940594059406,1),new V(.34034653465346537,1),new V(.4752475247524752,1),new V(.6596534653465347,1),new V(.8403465346534653,1),new V(0,0),new V(1,0),new V(1,1),new V(0,1)],b=new fw,c=new W(0,0,1);for(var d=0;d=1-this.yu&&(b=!1,xi(this.Dc,"translateZ("+this.WR*(1-a)+"px) rotateY("+(1-a)/this.yu*c*this.ZR+"deg)"),this.QE||this.na()||(this.QE=this.Ev=!0));if(b||this.Ev)b=this.slideWidth()+this.cS,a=this.Ev?this.na()?0:1:(a-this.yu)/(1-2*this.yu),this.Ev&&(this.Ev=!1),a=a*c*b,xi(this.Mg, +"translateX("+a+"px)"),this.Tn&&xi(this.Kv,"translate("+a+"px, "+(this.slideHeight()+this.iy)+"px)"),xi(this.Kg,"translateX("+(a-c*b)+"px)"),this.Tn&&xi(this.Gv,"translate("+(a-c*b)+"px, "+(this.slideHeight()+this.iy)+"px)")}};k.nc=function(a,b){const c=zd("DIV");Oh(c,a);Ph(c,b);F(c,"position","absolute");return c}; +function iy(a,b,c){b=b.getContext("2d");b.save();b.translate(0,a.slideHeight()/4);b.scale(1,-1);b.drawImage(c,0,.75*a.slideHeight(),a.slideWidth(),a.slideHeight()/4,0,0,a.slideWidth(),a.slideHeight()/4);b.restore();b.globalCompositeOperation="destination-out";c=b.createLinearGradient(a.slideWidth()/4,0,a.slideWidth()/4,a.slideHeight()/4);c.addColorStop(0,"rgba(0, 255, 0, 0)");c.addColorStop(.8,"rgba(0, 255, 0, 1)");b.fillStyle=c;b.beginPath();b.rect(0,0,a.slideWidth(),a.slideHeight()/4);b.fill()} +k.Ev=!1;k.QE=!1;k.iy=7.5;k.yu=.3;k.ZR=20;k.YR=20;k.WR=-100;k.cS=70;var jy=0,ky=1;function ly(a,b,c){R.call(this,a);this.Ga=b;this.O=c;this.Ma(!0,!0)}t(ly,R); +ly.prototype.initialize=function(){uv(this,!1);vv(this,!1);if(this.na())switch(this.O){case my:this.O=ny;break;case ny:this.O=my;break;case oy:this.O=py;break;default:this.O=oy}const a=this.na()?this.mb:this.Da,b=this.na()?this.Da:this.mb;this.Ga==qy?(this.lH=16,this.sP=8):(this.lH=16,this.sP=12);this.M9=2*this.sP+1;const c=this.slideWidth()/this.lH,d=c/2,e=this.slideHeight()/this.sP,f=e/2;this.hi=this.O==oy||this.O==py?this.slideWidth():this.slideHeight();this.qt=2*this.hi;this.fn=[];let g;const h= +-f;let l;for(let n=0;nthis.$R&&(f.DL=!0)}};function ry(a,b,c){b=S(b,c);F(b,"position","absolute");a.va().appendChild(b);return b} +function ty(a,b,c,d,e,f){b=b.getContext("2d");b.save();b.fillStyle="#FFFFFF";dh&&(yy(a,b,c,d),b.globalCompositeOperation="destination-in");b.beginPath();const g=Math.round(.5*e),h=Math.round(.5*f);e=Math.round(e);f=Math.round(f);b.moveTo(g,-1);b.lineTo(e+1,h);b.lineTo(g,f+1);b.lineTo(-1,h);b.lineTo(g,-1);b.fill();dh||(b.globalCompositeOperation="source-in",yy(a,b,c,d));b.restore()} +function uy(a,b,c,d,e,f){b=b.getContext("2d");b.save();b.fillStyle="#FFFFFF";dh&&(yy(a,b,c,d),b.globalCompositeOperation="destination-in");const g=Math.round(.5*e)+.5;e=Math.round(e)+.5;const h=Math.round(f)+.5;b.beginPath();b.moveTo(g,-1);b.lineTo(e,Math.round(.25*f)-1);b.lineTo(e,Math.round(.75*f)+1);b.lineTo(g,h);b.lineTo(-1,Math.round(.75*f)+1);b.lineTo(-1,Math.round(.25*f)-1);b.lineTo(g,1);b.fill();dh||(b.globalCompositeOperation="source-in",yy(a,b,c,d));b.restore()} +function yy(a,b,c,d){c=Math.round(c);d=Math.round(d);b.drawImage(a,-c,-d)}function xy(a,b,c){switch(a.O){case my:return b.Rb>=c?b.Rb-c:0;case ny:return b.Rb<=c?c-b.Rb:0;case oy:return b.Qb>=c?b.Qb-c:0}return b.Qb<=c?c-b.Qb:0}ly.prototype.$R=.3;ly.prototype.ZI=.7;var qy=0,my=0,ny=1,oy=2,py=3;function sy(){}k=sy.prototype;k.Qb=0;k.Rb=0;k.IU=!0;k.JU=!0;k.Mf=0;k.hv=!0;k.rB=0;k.DL=!1;k.ME=!1;k.oj=function(a){this.Qb=a;this.Dg()};k.Cg=function(a){this.Rb=a;this.Dg()}; +function vy(a,b){a.IU=b;null!=a.gB&&H(a.gB,b?1:0);b&&a.Dg()}function wy(a,b){a.JU=b;null!=a.tw&&H(a.tw,b?1:0);b&&a.Dg()}k.Dg=function(){null!=this.gB&&this.IU&&Gh(this.gB,this.Qb,this.Rb);null!=this.tw&&this.JU&&Gh(this.tw,this.Qb,this.Rb)};function zy(a){R.call(this,a);this.Ma(!0,!0)}t(zy,R);zy.prototype.initialize=function(){uv(this,!1);vv(this,!1);this.nL();this.vn()}; +zy.prototype.vn=function(){const a=this.slideWidth(),b=this.slideHeight();this.Ul=S(a,b);this.mM=this.Ul.getContext("2d");this.iU=S(a,b);this.jU=this.iU.getContext("2d");this.dV=S(a,b);this.Av=this.dV.getContext("2d");this.XY=S(a,b);this.J8=this.XY.getContext("2d");this.pF=S(a,b);this.wM=this.pF.getContext("2d");this.gU=S(a,b);this.hU=this.gU.getContext("2d");this.Jc=S(a,b);this.Vf=this.Jc.getContext("2d");this.WY=S(a,b);this.I8=this.WY.getContext("2d");this.va().appendChild(this.Ul);this.va().appendChild(this.pF); +F(this.Ul,"position","absolute");F(this.pF,"position","absolute")}; +zy.prototype.Ha=function(a){var b=this.slideWidth();const c=this.slideHeight();this.mM.clearRect(0,0,b,c);this.wM.clearRect(0,0,b,c);this.Vf.clearRect(0,0,b,c);this.hU.clearRect(0,0,b,c);this.Vf.drawImage(this.Da,0,0);this.Vf.save();this.Vf.globalCompositeOperation="destination-in";Ay(this,this.hU,this.CS,a);this.Vf.drawImage(this.gU,0,0);this.Vf.restore();By(this,this.I8,this.Da,a/Cy,!1);this.wM.drawImage(this.Jc,0,0);this.wM.drawImage(this.WY,0,0);if(a>Dy&&a<1-Dy){var d=Y(Dy,1,1-Dy,4),e=Y(Dy,0, +1-Dy,-30);xi(this.pF,"rotate("+e(a)+"deg) scale("+d(a)+", "+d(a)+")")}a>Ey&&(this.Av.clearRect(0,0,b,c),this.jU.clearRect(0,0,b,c),this.Av.drawImage(this.mb,0,0),this.Av.save(),this.Av.globalCompositeOperation="destination-in",Ay(this,this.jU,this.DS,a),this.Av.drawImage(this.iU,0,0),this.Av.restore(),this.mM.drawImage(this.dV,0,0),a=e.QI&&d<=e.QI+.05){var g=(d-e.QI)/.05;f=e.OP?1-g:g}else f=d{b.push(new Qy(e.element,e.id))},this);u(this.uw,e=>{b.push(new Qy(e.element,e.id))},this);const c=[0,.005,.01,.015,.02,.025,.03,.035,.04,.045,.05,.1,.15,.2,.25,.3,.35,.4,.45,.46,.47,.48,.49,.495,.498,.499];u(c,function(e){const f=this.wo(e);u(b,g=>{const h=f[g.id];h.Bg(e);g.ur.push(h)},this)},this);Ja(c,function(e){e=1-e;const f=this.wo(e);u(b,g=>{const h=f[g.id];h.Bg(e);g.ur.push(h)},this)},this);this.Mu=0;this.NO=b.length;let d="";u(b,function(e){d+=Ry(e); +const f=e.element;f?(f.style.animation=e.id+" "+a+"s 1 linear",f.firstElementChild&&(f.firstElementChild.style.animation=e.id+"_ "+a+"s 1 linear"),ve(f,ge,this.wk,!1,this)):this.wk()},this);this.Qf=gn(d)};k.update=function(a){this.A4!=a&&this.wo(a);this.A4=a};k.wk=function(){this.Mu++;this.Mu==this.NO&&this.ge.C()}; +function Ry(a){let b="@keyframes "+a.id+" {\n";u(a.ur,d=>{b+=d.MQ+" {transform: "+d.transform+";opacity:"+d.opacity+";z-index:"+d.zIndex+"}\n"});b+="}\n";let c="";a.ur[0].cC&&(c="@keyframes "+a.id+"_ {\n",u(a.ur,d=>{c+=d.MQ+" {transform:"+d.cC+"}\n"}),c+="}\n");return b+c} +k.wo=function(a){const b=this.lo[0];let c=this.X7*a+1;c*=b.PC;let d=this.Z7*a+1;d*=b.QC;const e=Math.round(this.O9*a)+this.N9;let f=this.R7*a;f+=b.rotation;const g=this.Y7*a+1,h=this.a8*a+1;if(this.om)var l=new Vf((this.Vy.top-this.om.top)*a+this.om.top,(this.Vy.right-this.om.right)*a+this.om.right,(this.Vy.bottom-this.om.bottom)*a+this.om.bottom,(this.Vy.left-this.om.left)*a+this.om.left);const n={};u(this.lo,function(m){if(this.sS)var p=1;else p=1-Math.pow(a,2),.425>a&&(p=a*(1-Math.pow(.425,2)- +1)/.425+1);let r=!0,v=l;this.bU&&(this.h3?(v=this.om,r=!1):v=void 0);p=Sy(m,c,d,f,g,h,this.cY*a,this.j_*a,this.k_*a,p,e,v,Ty(this,m,a,!1),r);Uy(this,p);n[m.id]=p},this);u(this.uw,function(m,p){p=Math.min(this.lo.length-1,p);p=this.lo[p];const r=Vy(-p.dx,-p.dy,f,c,d),v=Vy(-m.dx,-m.dy,f,c,d);if(this.sS)var y=a;else y=1+Math.pow(a-1,3),.425Math.PI?a-=2*Math.PI:a<-Math.PI&&(a+=2*Math.PI);return a==Math.PI||a==-Math.PI?-a:a} +function Ty(a,b,c,d){var e="13"==b.g1;if(!a.xc||e){var f=e=1;"bg"==b.type&&(c=d?2*(c-.5):2*(.5-c),a.Jp!=a.rE&&(e=c),a.Fq!=a.ZG&&(f=c));a="scaleX("+e+") scaleY("+f+")"}else e=a.Jp!=a.rE,f=a.Fq!=a.ZG,"bg"!=b.type||!e&&!f?a="":f&&!e?a="rotateX("+(a.Fq&&!a.ZG?-1:1)*c*180+"deg)"+(d?" scaleY(-1)":""):e&&!f?a="rotateY("+(a.Jp&&!a.rE?1:-1)*c*180+"deg)"+(d?" scaleX(-1)":""):a.Jp&&!a.Fq||!a.Jp&&a.Fq?(b=ow(0,1,c),a="rotateX("+-90*ow(0,1,.5>c?2*b:2*(1-b))+"deg) rotateZ("+180*(a.Jp&&!a.Fq?1:!a.Jp&&a.Fq?-1:1)* +b+"deg)"+(d?" scaleX(-1) scaleY(-1) ":"")):(b=ow(0,1,c),a="rotateX("+90*ow(0,1,.5>c?2*b:2*(1-b))+"deg) rotateZ("+180*(a.ZG&&a.rE?1:a.Fq&&a.Jp?-1:1)*b+"deg)"+(d?" scaleX(-1) scaleY(-1) ":""));return a} +function Sy(a,b,c,d,e,f,g,h,l,n,m,p,r,v){var y=new gm;y.translate(a.Xca,a.Yca);y.rotate(d,0,0);y.scale(b,c);(b=a.qj)&&(y=hm(y,b));(b=a.nk)&&(y=hm(b.clone(),y));b=new gm;b.rotate(-a.fca,0,0);b.translate(a.dx,a.dy);b=hm(b,a.qj);hm(b,im(y));c=im(b);e="rotate("+g+"rad) "+r+(" scaleX("+e+") scaleY("+f+")");h=jm(h,l);l=rn(h)+" "+rn(c)+" "+e+" "+rn(b)+" "+rn(y);h=new Ly(a.element);h.transform=l;""!=a.opacity&&(n*=a.opacity);h.opacity=n;h.zIndex=m;p?(n=(1-a.ne.right-a.ne.left)/(1-p.right-p.left),m=(1-a.ne.top- +a.ne.bottom)/(1-p.top-p.bottom),h.cC=a.SH+" translate("+-(a.ul?p.right:p.left)*a.t$*n+"px, "+-(a.Fl?p.bottom:p.top)*a.s$*m+"px) scale("+n+", "+m+")"):v&&(h.cC=a.SH);return h}function Vy(a,b,c,d,e){const f=new Dq(a,b);f.rotate(c);f.scale(d,e);f.zi(new Dq(a,b));return f}function Qy(a,b){this.element=a;this.id=b;this.ur=[]};function Wy(a,b){this.g5=a;this.h5=b;this.x3=Zc(Xf(a.Xa),Xf(b.Xa));a=a.kx;b=b.kx;let c;c=a.line!=b.line?1:0;c+=a.fill!=b.fill?1:0;c+=a.Nt!=b.Nt?1:0;c+=a.Zt!=b.Zt?1:0;c+=a.ku!=b.ku?1:0;c+=a.pu!=b.pu?1:0;this.v3=c+=a.qu!=b.qu?2:0}Wy.prototype.Q_=function(){return this.x3};Wy.prototype.JH=function(){return 1E3*this.v3+this.Q_()/1E3};function Xy(a,b){if(a instanceof Xy)this.wg=a.Sc();else{var c;if(c=ka(a))a:{for(var d=c=0;d=Math.abs(this.wg[b][c]-a.wg[b][c])))return!1;return!0};k.c0=function(){if(this.Ld.width!=this.Ld.height)throw Error("A determinant can only be take on a square matrix");return az(this)};k.tl=function(){return this.Ld};function bz(a,b,c){return 0<=b&&b=b?f+1:f])},a);return c}function dz(a,b){var c=new Xy(a.Ld.height,b.tl().width);Zy(c,function(d,e,f){for(var g=d=0;g{b.forEach(g=>{cz(e.Nu,f.index(),g.index(),c(f,g))})});iz(this)}function iz(a){const b=a.Nu.tl().width+1,c=[];for(let d=0;da.nM.size())for(f= +1;f<=a.xM.size()-a.nM.size();f++)if(d+1==f+a.nM.size()){d=-1;break}b.push(d)}return b}function kz(a,b){const c=[];for(let d=0;d>16&255,a>>8&255,a&255]};function nz(a,b,c){this.tM=a.content();this.kM=a.content();this.links=[];this.eF=[];this.dF=[];a=oz(this,this.kM,c);b=oz(this,this.tM,b);const d={},e={};u(a,g=>{const h=g.type;d[h]=!0;e[h]?e[h].push(g):e[h]=[g]});const f={};u(b,g=>{const h=g.type;d[h]=!0;f[h]?f[h].push(g):f[h]=[g]});this.D0=[];this.H0=[];this.C0=[];this.G0=[];u(kc(d),g=>{pz(this,f[g]||[],e[g]||[])},this)} +nz.prototype.O3=function(a,b){a=a.object();b=b.object();const c=new Wy(a,b),d=qz(a,b),e=c.g5.rotation!=c.h5.rotation;c.JH()||e||!d||(this.dF.push(rz(a,b,!1)),this.dF.push(rz(a,b,!0)));d||(this.eF.push(rz(a,b,!1)),this.eF.push(rz(a,b,!0)));return d?c.JH():1E13};function rz(a,b,c){return c?ma(b)+"_"+ma(a):ma(a)+"_"+ma(b)} +function pz(a,b,c){function d(m){const p=new gz;for(let r=0;r{sz(a, +a.H0,a.tM,m)},a);u(c,m=>{sz(a,a.D0,a.kM,m)},a);u(h,m=>{sz(a,a.G0,a.tM,m)},a);u(l,m=>{sz(a,a.C0,a.kM,m)},a)}function oz(a,b,c){return Ka(c,d=>{const e=d.Nc;if(e)return"none"!=b.querySelector(`#${e.id}`).style.display;d=d.Dl||[];return d.length?"none"!=b.querySelector(`#${d[0].id}`).style.display:!0},a)}function sz(a,b,c,d){const e=d.Nc;e&&tz(b,c,e.id);u(d.Dl,f=>{tz(b,c,f.id)},a)}function tz(a,b,c){(b=b.querySelector("#"+c))&&"none"!=b.style.display&&a.push(b)} +function qz(a,b){if(a.type!=b.type||a.text!=b.text)return!1;if("6"==a.type){if(a.Qq.length!=b.Qq.length)return!1;for(let c=0;cuz(d.mj,e.mj)}return!0}return a.mj&&b.mj?.0325>uz(a.mj,b.mj):!0} +function uz(a,b){const c=a.length,d=[0,0,0];for(let e=0;e{g.Nc&&b(g.Nc.id,c,g.zIndex, +this.RB);u(g.Dl,h=>{b(h.id,c,g.zIndex,this.RB)},this)},this);u(a,g=>{g.Nc&&b(g.Nc.id,d,g.zIndex,this.RB);u(g.Dl,h=>{b(h.id,d,g.zIndex,this.RB)},this)},this);this.MB=[];u(f.links,g=>{g=new My(this.dE,c,d,g[0],g[1],this.Rt(),this.slideWidth(),this.slideHeight());g.ge.addHandler(this.wk,this);this.MB.push(g)},this);this.En=this.hb().background().firstChild;this.Jv()&&F(this.En,"top",0);this.qc().background().appendChild(this.En);this.Gs=f.H0;this.vM=f.G0;this.Ds=f.D0;this.lM=f.C0;this.Mu=0;this.NO=this.MB.length+ +this.Ds.length+this.Gs.length+1;this.Rt()&&this.rL()}t(vz,R);k=vz.prototype; +k.rL=function(){const a=this.dE;this.Qf=gn("@keyframes newSlideBackground {0% {opacity:0} 100% {opacity:1}} @keyframes oldSlideObjects {0% {opacity:1} 50% {opacity:0} 100% {opacity:0}} @keyframes newSlideObjects {0% {opacity:0} 50% {opacity:0} 100% {opacity:1}}");this.En.style.animation="newSlideBackground "+a+"s 1 linear";H(this.En,1);ve(this.En,ge,this.wk,!1,this);u(this.Gs,b=>{b.style.animation="oldSlideObjects "+a+"s 1 linear";H(b,0);ve(b,ge,this.wk,!1,this)},this);u(this.Ds,b=>{b.style.animation= +"newSlideObjects "+a+"s 1 linear";H(b,1);ve(b,ge,this.wk,!1,this)},this);u(this.vM,b=>{H(b,0)},this);u(this.lM,b=>{H(b,1)},this)};k.initialize=function(){vz.Mb.initialize.call(this)};k.wk=function(){this.Mu++;this.Mu==this.NO&&this.ge.C()};k.Rt=function(){const a=Modernizr.atRule("@keyframes");return Ni?!1:Ii?a:!1}; +k.Ha=function(a){if(!this.Rt()){a=this.na()?1-a:a;u(this.MB,d=>{d.update(a)},this);var b=1-Math.min(1,2*a),c=2*Math.max(0,a-.5);u(this.Gs,d=>{d&&H(d,b)},this);u(this.Ds,d=>{d&&H(d,c)},this);u(this.vM,d=>{d&&H(d,0)},this);u(this.lM,d=>{d&&H(d,1)},this);H(this.En,a);1<=a&&this.ge.C();fj&&yn(document.body)}}; +k.CH=function(){vz.Mb.CH.call(this);u(this.Fp,a=>{this.hb().content().firstElementChild.removeChild(a);this.qc().content().firstElementChild.appendChild(a)},this);this.Fp=[];this.Qf&&Fd(this.Qf);De(this.En,ge,this.wk,!1,this);this.Mu=0;u(this.MB,a=>{a.clear()},this);this.En.style.animation="";this.Jv()&&F(this.En,"top","");u(this.Gs,a=>{a.style.animation="";H(a,1);De(a,ge,this.wk,!1,this)},this);u(this.Ds,a=>{a.style.animation="";H(a,1);De(a,ge,this.wk,!1,this)},this);u(this.vM,a=>{H(a,1)},this); +u(this.lM,a=>{H(a,1)},this);u(this.MB,a=>{a.ge.removeHandler(this.wk,this)},this);u(this.RB,a=>{a.style.zIndex=""},this)};function wz(a){R.call(this,a);this.hb().xg()}t(wz,R);wz.prototype.initialize=function(){uv(this,!0);vv(this,!0)};wz.prototype.Ha=function(a){const b=this.hb().slide();var c=this.slideWidth();const d=this.slideHeight(),e="scale("+a+") rotate("+-360*a+"deg)";c=c/2+"px "+d/2+"px";H(b,a);F(b,"MozTransform",e);F(b,"MozTransformOrigin",c);F(b,"webkitTransform",e);F(b,"webkitTransformOrigin",c);F(b,"OTransform",e);F(b,"OTransformOrigin",c);F(b,"msTransform",e);F(b,"msTransformOrigin",c)};function xz(a,b,c){this.a=a;this.b=b;this.c=c}function yz(a,b){var c=-a.b;const d=a.a,e=-c*b.x()-d*b.y();c=zz(a,new xz(c,d,e));a=2*c.x()-b.x();b=2*c.y()-b.y();return new V(a,b)}function zz(a,b){const c=a.a*b.b-b.a*a.b;return 1E-9>Math.abs(c)?null:new V((a.b*b.c-b.b)*a.c/c,(a.c*b.a-b.c*a.a)/c)}function Az(a,b){const c=a.y()-b.y(),d=b.x()-a.x();a=a.x()*b.y()-b.x()*a.y();return new xz(c,d,a)};function Bz(a,b){R.call(this,a);this.O=b;this.Ma(!0,!0)}t(Bz,zv);k=Bz.prototype; +k.initialize=function(){uv(this,!1);vv(this,!0);Cv(this,this.Da);var a=this.slideWidth(),b=-this.slideHeight()/2;a=a/2-.2*a;var c=3*b/4,d=Az(new V(-a,-b),new V(a/2,-b/2)),e=Az(new V(-a/4,-b),new V(0,0)),f=Az(new V(a/2,-b/2),new V(a,b)),g=Az(new V(0,0),new V(a,b/4)),h=zz(d,e),l=zz(f,g);const n=new V(Y(0,.5,a,.8)(l.x()),Y(0,.5,b,1)(l.y())),m=new V(Y(-a,.2,0,.5)(h.x()),Y(-b,0,0,.5)(h.y()));var p=new W(5*a/8,3*-b/8,-(10*c/16));const r=new W(-a/8,-b/2,15*-c/32),v=new W(a/2,b/8,15*-c/32);var y=new W(5* +-a/8,5*-b/16,9*-c/8),D=new W(a/2,b/4,5*-c/6),I=new W(-a/10,b/10,-c),A=new W(4*-a/8,-b/8,3*-c/16),J=new W(-a/16,5*b/8,3*-c/16),T=new W(5*a/16,5*b/8,-c),U=new W(14*-a/32,4*-b/8,0),X=new W(4*a/8,23*b/32,0),aa=new W(5*-a/16,3*-b/16,-c/4),ha=new W(3*a/16,5*b/16,0);e=new W(3*-a/4,3*b/4,0);f=new Cz(new W(a,-b,0),new W(15*a/16,9*-b/16,-c),new V(.8,0));g=new Cz(new W(7*a/8,7*-b/8,0),new W(9*a/12,-b/2,-(46*c/48)),new V(.7625,.0625));d=new Cz(new W(a/2,-b,0),new W(6*a/9,8*-b/12,47*-c/48),new V(.65,0));c=new Cz(new W(a, +-b/2,0),new W(19*a/24,4*-b/9,47*-c/48),new V(.8,.25));var ra=new Cz(new W(a/2,-b/2,0),p,new V(.65,.25));h=new Cz(new W(h.x(),h.y(),0),r,new V(m.x(),m.y()));l=new Cz(new W(l.x(),l.y(),0),v,new V(n.x(),n.y()));p=new Cz(new W(-a/4,-b,0),p,new V(.425,0));D=new Cz(new W(a,b/4,0),D,new V(.8,.625));I=new Cz(new W(0,0,0),I,new V(.5,.5));A=new Cz(new W(-a/2,-b/2,0),A,new V(.35,.25));J=new Cz(new W(a/2,b/2,0),J,new V(.65,.75));y=new Cz(new W(-a,-b,0),y,new V(.2,0));T=new Cz(new W(a,b,0),T,new V(.8,1));U=new Cz(new W(-a, +-b/2,0),U,new V(.2,.25));X=new Cz(new W(a/2,b,0),X,new V(.65,1));aa=new Cz(new W(-a/2,0,0),aa,new V(.35,.5));ha=new Cz(new W(0,b/2,0),ha,new V(.5,.75));b=new Cz(new W(-a,b,0),e,new V(.2,1));this.Ej=[f,f,g,g,d,c,g,g,d,c,ra,ra,d,c,h,l,ra,ra,d,c,h,l,p,D,ra,ra,h,l,I,I,h,l,I,I,A,J,h,l,p,D,y,T,h,l,A,J,y,T,I,I,aa,ha,A,J,A,J,y,T,U,X,A,J,U,X,aa,ha,I,I,aa,ha,b,b,aa,ha,U,X,b,b];if(this.O==Dz){b=[];a=this.slideHeight();a=Az(new V(0,-a/2),new V(0,a/2));for(f=0;f=a?Iz(this,a):.2>=a?(d=Y(.1,.1,.2,1),a=d(a),Lv(this,-60*a,[1,0,0],[0,0,0]),mat4.translate(this.jb,[0,0,20*-a]),this.Lk=Fz(a,this.Ej),Lv(this,-15*c*a,[0,0,1],[0,0,0])):.4>=a?(this.Lk=Fz(1,this.Ej),Lv(this,-60,[1,0,0],[0,0,0]),Lv(this,-15*c,[0,0,1],[0,0,0]),mat4.translate(this.jb,[0,0,-20]),d=Y(.2,0,.4,1),a=Math.pow(d(a),3),mat4.translate(this.jb,[0,0,-a*b/20])):.5>a?(this.Lk=Fz(1,this.Ej), +Lv(this,-60,[1,0,0],[0,0,0]),Lv(this,-15*c,[0,0,1],[0,0,0]),mat4.translate(this.jb,[0,0,-(20+b/20)]),d=Y(.4,0,.5,1),a=d(a),mat4.translate(this.jb,[0,0,-a*b/30]),Jz(a,this.Ej,this.Lk,8)):(this.Lk=Fz(1,this.Ej),Lv(this,-60,[1,0,0],[0,0,0]),Lv(this,-15*c,[0,0,1],[0,0,0]),mat4.translate(this.jb,[0,0,-(20+b/20+b/30)]),d=Y(.5,0,1,1),a=d(a),Jz(a,this.Ej,this.Lk,40),a=ow(0,1,a),mat4.translate(this.jb,[c*a*b,a*b/2,a*b/2]),Lv(this,-30*c*a,[0,0,1],[0,0,0]),Lv(this,-60*c*a,[0,1,0],[0,0,0]));Uv(this);Mv(this, +this.KW,this.N.TRIANGLES,this.AL.bind(this),this.yL.bind(this));Jv(this)};k.AL=function(){this.N.bufferSubData(this.N.ARRAY_BUFFER,0,new Float32Array(hw(this.Lk)))};k.yL=function(){Qv(this.Lk,this.aN);this.N.bufferSubData(this.N.ARRAY_BUFFER,0,new Float32Array(jw(this.Lk)))}; +function Iz(a,b){var c=Y(0,0,.1,.1);a.Lk=Fz(c(b),a.Ej);Lv(a,-60*c(b),[1,0,0],[0,0,0]);c=Y(0,0,.1,1);a.Pz=Fz(c(b),a.RL);a.QA=Fz(c(b),a.NN);Uv(a);Mv(a,a.SU,a.N.TRIANGLES,ta(function(){this.N.bufferSubData(this.N.ARRAY_BUFFER,0,new Float32Array(hw(this.Pz)))},a),ta(function(){Qv(this.Pz,this.QL);this.N.bufferSubData(this.N.ARRAY_BUFFER,0,new Float32Array(jw(this.Pz)))},a));Mv(a,a.YX,a.N.TRIANGLES,ta(function(){this.N.bufferSubData(this.N.ARRAY_BUFFER,0,new Float32Array(hw(this.QA)))},a),ta(function(){Qv(this.QA, +this.MN);this.N.bufferSubData(this.N.ARRAY_BUFFER,0,new Float32Array(jw(this.QA)))},a))} +function Jz(a,b,c,d){void 0===d&&(d=50);const e=[new Kz([0,1],0,0,-5),new Kz([2,3,6,7],0,0,-5),new Kz([4,8,12,18],0,0,-5),new Kz([5,9,13,19],0,0,-5),new Kz([20,14,26,30,42,36],0,0,15),new Kz([15,21,37,43,31,27],0,0,15),new Kz([44,34,52,60,54],0,0,20),new Kz([35,45,55,61,53],0,0,20),new Kz([40,46,56],0,0,30),new Kz([41,47,57],20,20,30),new Kz([58,62,74],20,20,15),new Kz([75,63,59],0,0,15),new Kz([76,70,71,77],0,0,-20)];for(let p=0;p= 0.0 && phase <= CHANGE_PHASE)\n\t\t{\n\t\t\tangle = -ANGLE * (phase + (PHASE_OFFSET_FUNC1(x) * PHASE_FUNC(phase)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tangle = -ANGLE * (phase + PHASE_OFFSET_FUNC1(x));\n\t\t}\n\t\treturn max(angle, -ANGLE);\n\t}\n\n\tvec2 getPosition(float x)\n\t{\n\t\tfloat a = uSlideWidth * 0.5 * C_FUNC1(x);\n\t\tfloat b = a * COEF_1;\n\t\tvec2 center = vec2(uSlideWidth * 0.5, 0.0);\n\t\tfloat angle = getAngleInDoubleLeft(x, uPhase);\n\n\t\tvec2 pos = ellipse(angle, center, vec2(a, b));\n\t\tpos.y = pos.y - (b * C_FUNC1(x) * PHASE_FUNC1(uPhase));\n\t\tpos.y = max(pos.y, 1.0);\n\t\treturn pos;\n\t}\n\n\tvoid main(void)\n\t{\n\t\tvec3 pNormal;\n\t\tfloat x = aVertexPosition.x;\n\t\tif (x <= uSlideWidth * 0.5)\n\t\t{\n\t\t\tgl_Position = uPMVMatrix * vec4(aVertexPosition, 1.0);\n\t\t\tpNormal = vec3(0.0, 0.0, 1.0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvec2 pos = getPosition(x);\n\t\t\tvec3 v = vec3(pos.x, aVertexPosition.y, pos.y);\n\t\t\tgl_Position = uPMVMatrix * vec4(v, 1.0);\n\n\t\t\tfloat nextX = x + uDeltaX;\n\t\t\tvec2 pr = getPosition(nextX);\n\t\t\tpNormal = getNormal(v, pr);\n\t\t}\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\t\tvTextureCoord = aTextureCoord;\n\t}";case 1:return"\n\tfloat C_FUNC2(float x)\n\t{\n\t\treturn linearInterpolation(x, 0.0, 1.0, uSlideWidth * 0.5, 0.0);\n\t}\n\tfloat PHASE_OFFSET_FUNC2(float x)\n\t{\n\t\treturn linearInterpolation(x, 0.0, 0.0, uSlideWidth * 0.5, PHASE_OFFSET);\n\t}\n\n\tfloat getAngleInDoubleRight(float x, float phase)\n\t{\n\t\tfloat angle;\n\t\tif (phase >= 0.0 && phase <= CHANGE_PHASE)\n\t\t{\n\t\t\tangle = ANGLE * (1.0 + phase + (PHASE_OFFSET_FUNC2(x) * PHASE_FUNC(phase)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tangle = ANGLE * (1.0 + phase + PHASE_OFFSET_FUNC2(x));\n\t\t}\n\t\treturn min(angle, ANGLE * 2.0);\n\t}\n\n\tvec2 getPosition(float x)\n\t{\n\t\tfloat a = uSlideWidth * 0.5 * C_FUNC2(x);\n\t\tfloat b = a * COEF_1;\n\t\tvec2 center = vec2(uSlideWidth * 0.5, 0.0);\n\t\tfloat angle = getAngleInDoubleRight(x, uPhase);\n\n\t\tvec2 pos = ellipse(angle, center, vec2(a, b));\n\t\tpos.y = pos.y - (b * C_FUNC2(x) * PHASE_FUNC1(uPhase));\n\t\tpos.y = max(pos.y, 1.0);\n\t\treturn pos;\n\t}\n\n\tvoid main(void)\n\t{\n\t\tvec3 pNormal;\n\t\tfloat x = aVertexPosition.x;\n\t\tif (x >= uSlideWidth * 0.5)\n\t\t{\n\t\t\tgl_Position = uPMVMatrix * vec4(aVertexPosition, 1.0);\n\t\t\tpNormal = vec3(0.0, 0.0, 1.0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvec2 pos = getPosition(x);\n\t\t\tvec3 v = vec3(pos.x, aVertexPosition.y, pos.y);\n\t\t\tgl_Position = uPMVMatrix * vec4(v, 1.0);\n\n\t\t\tfloat nextX = x + uDeltaX;\n\t\t\tvec2 pr = getPosition(nextX);\n\t\t\tpNormal = getNormal(v, pr);\n\t\t}\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\t\tvTextureCoord = aTextureCoord;\n\t}"; +case 2:return"\n\tfloat C_FUNC3(float x)\n\t{\n\t\treturn linearInterpolation(x, 0.0, 0.0, uSlideWidth, 1.0);\n\t}\n\n\tfloat PHASE_OFFSET_FUNC3(float x)\n\t{\n\t\treturn linearInterpolation(x, 0.0, 0.0, uSlideWidth, PHASE_OFFSET);\n\t}\n\n\tfloat getAngleInSingleLeft(float x, float phase)\n\t{\n\t\tfloat angle;\n\t\tif (phase >= 0.0 && phase <= CHANGE_PHASE)\n\t\t{\n\t\t\tangle = -ANGLE * (phase - (PHASE_OFFSET_FUNC3(x) * PHASE_FUNC(phase)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tangle = -ANGLE * (phase - PHASE_OFFSET_FUNC3(x));\n\t\t}\n\t\treturn min(angle, 0.0);\n\t}\n\n\tvec2 getPosition(float x)\n\t{\n\t\tfloat a = uSlideWidth * C_FUNC3(x);\n\t\tfloat b = a * COEF_2;\n\t\tvec2 center = vec2(0.0, 0.0);\n\t\tfloat angle = getAngleInSingleLeft(x, uPhase);\n\n\t\tvec2 pos = ellipse(angle, center, vec2(a, b));\n\t\tpos.y = pos.y - (b * C_FUNC3(x) * PHASE_FUNC2(uPhase));\n\t\tpos.y = max(pos.y, 0.0);\n\t\treturn pos;\n\t}\n\n\tvoid main(void)\n\t{\n\t\tvec2 pos = getPosition(aVertexPosition.x);\n\t\tvec3 v = vec3(pos.x, aVertexPosition.y, pos.y);\n\t\tgl_Position = uPMVMatrix * vec4(v, 1.0);\n\t\tvTextureCoord = aTextureCoord;\n\n\t\tfloat nextX = aVertexPosition.x + uDeltaX;\n\t\tvec2 pr = getPosition(nextX);\n\t\tvec3 pNormal = getNormal(v, pr);\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\t}"; +case 3:return"\n\tfloat C_FUNC4(float x)\n\t{\n\t\treturn linearInterpolation(x, 0.0, 1.0, uSlideWidth, 0.0);\n\t}\n\n\tfloat PHASE_OFFSET_FUNC4(float x)\n\t{\n\t\treturn linearInterpolation(x, 0.0, PHASE_OFFSET, uSlideWidth, 0.0);\n\t}\n\n\tfloat getAngleInSingleRight(float x, float phase)\n\t{\n\t\tfloat angle;\n\t\tif (phase >= 0.0 && phase <= CHANGE_PHASE)\n\t\t{\n\t\t\tangle = ANGLE * (1.0 + phase - (PHASE_OFFSET_FUNC4(x) * PHASE_FUNC(phase)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tangle = ANGLE * (1.0 + phase - PHASE_OFFSET_FUNC4(x));\n\t\t}\n\t\treturn max(angle, ANGLE);\n\t}\n\n\tvec2 getPosition(float x)\n\t{\n\t\tfloat a = uSlideWidth * C_FUNC4(x);\n\t\tfloat b = a * COEF_2;\n\t\tvec2 center = vec2(uSlideWidth, 0.0);\n\t\tfloat angle = getAngleInSingleRight(x, uPhase);\n\n\t\tvec2 pos = ellipse(angle, center, vec2(a, b));\n\t\tpos.y = pos.y - (b * C_FUNC4(x) * PHASE_FUNC2(uPhase));\n\t\tpos.y = max(pos.y, 0.0);\n\t\treturn pos;\n\t}\n\n\tvoid main(void)\n\t{\n\t\tvec2 pos = getPosition(aVertexPosition.x);\n\t\tvec3 v = vec3(pos.x, aVertexPosition.y, pos.y);\n\t\tgl_Position = uPMVMatrix * vec4(v, 1.0);\n\t\tvTextureCoord = aTextureCoord;\n\n\t\tfloat nextX = aVertexPosition.x + uDeltaX;\n\t\tvec2 pr = getPosition(nextX);\n\t\tvec3 pNormal = getNormal(v, pr);\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\t}"; +default:throw Error("Unknown transition page curl type");}}k.Bd=function(){var a=this.slideWidth();const b=this.slideHeight();this.Zf=Dx(2,40,a,b);this.xe=Fx(2,40);this.uA=new Vv;a=Hv(this,hw(this.Zf),3);this.uA.kg=a;a=Hv(this,iw(this.Zf),2);this.uA.rg=a;a=Iv(this,this.xe);this.uA.Sf=a};function Nz(a,b,c){R.call(this,a);this.O=b;this.AJ=c}t(Nz,R);Nz.prototype.initialize=function(){uv(this,!0);vv(this,!0);this.hb().xg();this.$e=!1;var a=this.va(),b=this.qc().content();a.appendChild(b);a=this.va();b=this.hb().content();a.appendChild(b)}; +Nz.prototype.Ha=function(a){const b=this.slideWidth(),c=this.slideHeight();var d=0,e=0;let f=0,g=0;this.O==Oz||this.O==Pz?(d=this.O==Oz?1:-1,f=this.O==Oz?-1:1):(e=this.O==Qz?1:-1,g=this.O==Qz?-1:1);const h=this.AJ?Ew(0,.7,7,a):Dw(a);d=Math.floor(h*d*b);e=Math.floor(h*e*c);Gh(this.qc().content(),d,e);Gh(this.hb().content(),f*b+d,g*c+e);H(this.hb().background(),a)};var Qz=0,Pz=1,Oz=2;function Rz(a,b){R.call(this,a);this.O=b;this.Ma(!1,!0)}t(Rz,zv);k=Rz.prototype;k.initialize=function(){uv(this,!1);vv(this,!0);Cv(this,this.Da);this.Bd();mat4.translate(this.jb,[(this.O==Sz?-1:1)*this.slideWidth()/2,this.slideHeight()/2,0]);Uv(this)};k.Nh=function(){return"precision mediump float;\n\n\tvarying vec2 vTextureCoord;\n\tvarying vec3 vNormal;\n\n\tuniform sampler2D uSampler;\n\n\tconst vec3 LIGHT_DIRECTION = vec3(0.0, 0.0, 1.0);\n\tconst float AMBIENT_INTENSITY = 0.4;\n\tconst float DIFFUSE_INTENSITY = 0.6;\n\n\tvoid main(void) \n\t{ \n\t\tfloat intentsity = AMBIENT_INTENSITY + DIFFUSE_INTENSITY * abs(dot(normalize(vNormal), LIGHT_DIRECTION));\n\t\tvec4 textureColor = texture2D(uSampler, vTextureCoord); \n\t\tgl_FragColor = vec4(textureColor.rgb * intentsity, textureColor.a); \n\t}"}; +k.Oh=function(){return"attribute vec3 aVertexPosition;\n\tattribute vec2 aTextureCoord;\n\n\tuniform mat4 uPMVMatrix;\n\tuniform mat3 uNMatrix;\n\n\tuniform float uPhase;\n\tuniform bool uDirectionIsLeft;\n\tuniform float uSlideHeight;\n\tuniform float uSlideWidth;\n\n\tvarying vec2 vTextureCoord;\n\tvarying vec3 vNormal;\n\n\tconst float ANGLE = 45.0;\n\tconst float PI = 3.14159265358979323846264;\n\n\tfloat linearInterpolation(float x, float x0, float fx0, float x1, float fx1)\n\t{\n\t\treturn mix(fx0, fx1, (x - x0) / (x1 - x0));\n\t}\n\n\tmat4 rotationZmatrix(float angle)\n\t{\n\t \tfloat ang = radians(angle);\n\t \tfloat cosA = cos(ang);\n\t \tfloat sinA = sin(ang);\n\n\t \tmat4 m = mat4(1.0);\n\t \tm[0] = vec4(cosA, sinA, 0, 0);\n\t \tm[1] = vec4(-sinA, cosA, 0, 0);\n\t \treturn m;\n\t}\n\n\tvec3 getOriginPos(vec3 pos)\n\t{\n\t\tvec3 v = vec3(pos.x, pos.y, 0.0);;\n\t\tmat4 m;\n\n\t\tvec2 p;\n\t\tif (uDirectionIsLeft)\n\t\t{\n\t\t\tm = rotationZmatrix(ANGLE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tv.x = pos.x - uSlideWidth;\n\t\t\tm = rotationZmatrix(-ANGLE);\n\t\t}\n\t\tv = (m * vec4(v.xyz, 1.0)).xyz;\n\t\treturn vec3(v.x, v.y, 0.0);\n\t}\n\n\tfloat calcX(float phase, float u, float r, float maxSide)\n\t{\n\t\tfloat coeff = (u < 0.0) ? -1.0 : 1.0;\n\t\tfloat centerX = linearInterpolation(phase, 0.0, maxSide, 1.0, 0.0);\n\t\tfloat m = PI * r;\n\n\t\tif (centerX > coeff * u)\n\t\t{\n\t\t\treturn u;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfloat a = 180.0 * (maxSide - centerX) / (PI * r);\n\t\t\tfloat b = linearInterpolation(coeff * u, centerX, -90.0, maxSide + 1.0, a - 90.0);\n\n\t\t\tif (coeff * u >= centerX + m)\n\t\t\t{\n\t\t\t\treturn coeff * (centerX - (coeff * u - centerX - m));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfloat ang = b * PI / 180.0;\n\t\t\t\treturn coeff * (centerX + r * cos(ang));\n\t\t\t}\n\t\t}\n\t}\n\n\tfloat calcY(float phase, float u, float r, float maxSide)\n\t{\n\t\tu = abs(u);\n\n\t\tfloat centerX = linearInterpolation(phase, 0.0, maxSide, 1.0, 0.0);\n\t\tfloat centerY = r;\n\n\t\tfloat m = PI * r;\n\t\tif (centerX >= u)\n\t\t{\n\t\t\treturn 0.0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (u > centerX + m)\n\t\t\t{\n\t\t\t\treturn linearInterpolation(u, centerX + m, r * 2.0, centerX + m + m, r * 2.5);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfloat a = 180.0 * (maxSide - centerX) / (PI * r);\n\t\t\t\tfloat b = linearInterpolation(u, centerX, -90.0, maxSide+1.0, a - 90.0);\n\n\t\t\t\tfloat ang = b * PI / 180.0;\n\t\t\t\treturn centerY + r * sin(ang);\n\t\t\t}\n\t\t}\n\t}\n\n\tvec3 getVertexPosition(float phase, vec3 pos)\n\t{\n\t\tvec3 originPos = getOriginPos(pos);\n\t\tfloat maxSide = sqrt(uSlideWidth * uSlideWidth + uSlideHeight * uSlideHeight);\n\n\t\tfloat r = max(uSlideWidth, uSlideHeight) / 4.0;\n\t\tvec3 v = vec3(calcX(phase, originPos.x, r, maxSide), originPos.y, calcY(phase, originPos.x, r, maxSide));\n\n\t\tmat4 m;\n\t\tif (uDirectionIsLeft)\n\t\t{\n\t\t\tm = rotationZmatrix(-ANGLE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm = rotationZmatrix(ANGLE);\n\t\t}\n\n\t\treturn (m * vec4(v.xyz, 1.0)).xyz;\n\t}\n\n\tvec3 getVertexNormal(float phase, vec3 pos)\n\t{\n\t\tconst float DELTA_W = 1.0;\n\t\tconst float DELTA_H = 1.0;\n\n\t\tvec3 right = getVertexPosition(phase, vec3(pos.x + DELTA_W, pos.y, pos.z));\n\t\tvec3 down = getVertexPosition(phase, vec3(pos.x, pos.y + DELTA_H, pos.z));\n\t\tvec3 p = getVertexPosition(phase, vec3(pos.x, pos.y, pos.z));\n\n\t\tvec3 v1 = right - p;\n\t\tvec3 v2 = down - p;\n\n\t\treturn normalize(cross(v2, v1));\n\t}\n\n\tvoid main(void)\n\t{\n\t\tfloat phase = uPhase;\n\t\tvec3 vertex = vec3(aVertexPosition.x, aVertexPosition.y, aVertexPosition.z);\n\t\tvec4 p = vec4(getVertexPosition(phase, vertex), 1.0);\n\t\tgl_Position = uPMVMatrix * p;\n\t\tvTextureCoord = aTextureCoord;\n\n\t\tvec3 pNormal = getVertexNormal(phase, vertex);\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\t}"}; +k.Ha=function(a){a=Y(0,0,1,1.2)(a);this.N.uniform1f(this.jg,a);Mv(this,this.$f,this.N.TRIANGLE_STRIP)};k.Vh=function(){Nv(this);this.We=Pv(this,"uSampler");this.jg=Pv(this,"uPhase");const a=Pv(this,"uDirectionIsLeft"),b=Pv(this,"uSlideWidth");this.N.uniform1f(Pv(this,"uSlideHeight"),this.slideHeight());this.N.uniform1f(b,this.slideWidth());this.N.uniform1i(a,this.O==Sz?1:0)};k.Lh=function(){}; +k.Bd=function(){this.Zf=Dx(30,30,this.slideWidth(),this.slideHeight());this.xe=Fx(30,30);this.$f=new Vv;var a=Hv(this,hw(this.Zf),3);this.$f.kg=a;a=Hv(this,iw(this.Zf),2);this.$f.rg=a;a=Iv(this,this.xe);this.$f.Sf=a};k.yj=function(){return this.We};k.Kh=function(){Fv(this,this.$f)};var Sz=0;function Tz(a){R.call(this,a);this.Ma(!1,!0)}t(Tz,zv);k=Tz.prototype;k.initialize=function(){uv(this,!1);vv(this,!0);Cv(this,this.Da);this.Bd();mat4.translate(this.jb,[-this.slideWidth()/2,this.slideHeight()/2,0]);Uv(this)};k.HR=function(){if(void 0!==Uz)return Uz;this.ns();return Uz=this.tq};k.ns=function(){void 0===this.N&&Tz.Mb.ns.call(this)};k.Ha=function(a){this.N.uniform1f(this.jg,a);Mv(this,this.$f,this.N.TRIANGLE_STRIP)}; +k.Bd=function(){this.Zf=Dx(10,35,this.slideWidth(),this.slideHeight());this.xe=Fx(10,35);this.$f=new Vv;var a=Hv(this,hw(this.Zf),3);this.$f.kg=a;a=Hv(this,iw(this.Zf),2);this.$f.rg=a;a=Iv(this,this.xe);this.$f.Sf=a};k.Kh=function(){Fv(this,this.$f)};k.Vh=function(){Nv(this);this.We=Pv(this,"uSampler");this.jg=Pv(this,"uPhase");const a=Pv(this,"uSlideWidth");this.N.uniform1f(Pv(this,"uSlideHeight"),this.slideHeight());this.N.uniform1f(a,this.slideWidth())};k.Lh=function(){};k.yj=function(){return this.We}; +k.Nh=function(){return"precision mediump float;\n\n\tvarying vec2 vTextureCoord;\n\tvarying vec3 vNormal;\n\n\tuniform sampler2D uSampler;\n\n\tconst vec3 LIGHT_DIRECTION = vec3(0.0, 0.0, 1.0);\n\tconst float AMBIENT_INTENSITY = 0.3;\n\tconst float DIFFUSE_INTENSITY = 0.7;\n\n\tvoid main(void)\n\t{\n\t\tfloat intentsity = AMBIENT_INTENSITY + DIFFUSE_INTENSITY * abs(dot(normalize(vNormal), LIGHT_DIRECTION));\n\t\tvec4 textureColor = texture2D(uSampler, vTextureCoord);\n\t\tgl_FragColor = vec4(textureColor.rgb * intentsity, textureColor.a);\n\t}"}; +k.Oh=function(){return"attribute vec3 aVertexPosition;\n\tattribute vec3 aVertexNormal;\n\tattribute vec2 aTextureCoord;\n\n\tuniform mat4 uPMVMatrix;\n\tuniform mat3 uNMatrix;\n\n\tuniform float uPhase;\n\tuniform float uSlideHeight;\n\tuniform float uSlideWidth;\n\n\tvarying vec2 vTextureCoord;\n\tvarying vec3 vNormal;\n\n\tconst float START_EFFECT_TIME = 0.0;\n\tconst float START_FLY_EFFECT_TIME = 0.4;\n\tconst float STOP_FLY_EFFECT_TIME = 0.8;\n\tconst float START_TOP_CENTER = 0.0;\n\tconst float START_TOP_CORNERS_TIME = 0.1;\n\tconst float START_BOTTOM_CORNERS_TIME = 0.0;\n\n\tconst float HORIZONTAL_WAVES_COUNT = 3.0;\n\tfloat HORIZONTAL_MAX_AMPLITUDE;\n\tconst float HORIZONTAL_WAVE_RUNNING_START_TIME = 0.0;\n\n\tconst float MAX_FLEX_DELAY = 0.1;\n\n\tfloat MAX_STRETCHING_Z;\n\tfloat MAX_STRETCHING_Y;\n\tfloat HORIZONTAL_TOP_STRETCHING;\n\tfloat VERTICAL_TOP_STRETCHING;\n\n\tconst float PI = 3.141592654;\n\n\tfloat linearInterpolation(float x, float x0, float fx0, float x1, float fx1)\n\t{\n\t\treturn mix(fx0, fx1, (x - x0) / (x1 - x0));\n\t}\n\tvec2 getMirrorPoint(vec2 a, vec2 b, vec2 p)\n\t{\n\t\treturn a + reflect(a - p, b - a);\n\t}\n\tfloat calcCenterWave(float x, float phase, float A, float F, float dx, float dy)\n\t{\n\t\tfloat CENTER_LINE_POS = uSlideWidth * 0.5;\n\t\tfloat startX = CENTER_LINE_POS;\n\t\tif (x < startX)\n\t\t{\n\t\t\tx = getMirrorPoint(vec2(CENTER_LINE_POS, 0), vec2(CENTER_LINE_POS , uSlideHeight), vec2(x, 0)).x;\n\t\t}\n\t\tfloat s = linearInterpolation(phase, 0.0, startX, 1.0, uSlideWidth);\n\t\tif ((x < startX) || (x < s))\n\t\t{\n\t\t\treturn 0.0;\n\t\t}\n\t\tfloat x0 = - linearInterpolation(phase, 0.0, 2.0 * PI * startX / uSlideWidth * HORIZONTAL_WAVES_COUNT, 1.0, PI * 2.0 * HORIZONTAL_WAVES_COUNT);\n\t\treturn A + A * sin(F * x +-PI / 2.0 + x0);\n\t}\n\tfloat getColWaveDelay(float phase, vec3 pos)\n\t{\n\t\tphase = linearInterpolation(phase, HORIZONTAL_WAVE_RUNNING_START_TIME, 0.0, 1.0, 1.0);\n\t\tfloat MAX_AMPLITUDE = linearInterpolation(phase, 0.0, 0.0, 1.0, HORIZONTAL_MAX_AMPLITUDE);\n\t\tfloat A = linearInterpolation(pos.y, 0.0, 0.0, uSlideHeight, MAX_AMPLITUDE);\n\t\tfloat F = (PI * 2.0 / uSlideWidth) * HORIZONTAL_WAVES_COUNT;\n\t\treturn calcCenterWave(pos.x, phase, A, F, 0.0, 0.0);\n\t}\n\tvec3 getVertexPosition(float phase, vec3 pos)\n\t{\n\t\tfloat CENTER = uSlideWidth * 0.5;\n\t\tphase = pow(phase, 4.0);\n\t\tfloat modifiedPhase = phase;\n\n\t\tfloat deltaZVertical = linearInterpolation(abs(pos.y), 0.0, 1.0, uSlideHeight / 2.0, 0.0);\n\t\tif (abs(pos.y) > uSlideHeight * 0.5)\n\t\t{\n\t\t\tdeltaZVertical = 0.0;\n\t\t}\n\t\tbool isLeft = (pos.x < CENTER);\n\t\tfloat stretch;\n\t\tfloat yDelay;\n\t\tvec3 delta = vec3(0, 0, 0);\n\t\tif (modifiedPhase > START_TOP_CENTER)\n\t\t{\n\t\t\tif (isLeft)\n\t\t\t{\n\t\t\t\tyDelay = linearInterpolation(pos.x, 0.0, MAX_FLEX_DELAY, CENTER, 0.0);\n\t\t\t\tstretch = linearInterpolation(pos.x, 0.0, 0.0, CENTER, 1.0);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tyDelay = linearInterpolation(pos.x, CENTER, 0.0, uSlideWidth, MAX_FLEX_DELAY);\n\t\t\t\tstretch = linearInterpolation(pos.x, CENTER, 1.0, uSlideWidth, 0.0);\n\t\t\t}\n\t\t\tfloat deltaZHorizontal = pow(stretch, 3.0);\n\t\t\tmodifiedPhase = linearInterpolation(modifiedPhase, START_TOP_CENTER, 0.0, 1.0, 1.0);\n\t\t\tif (modifiedPhase >= yDelay)\n\t\t\t{\n\t\t\t\tdelta.y = linearInterpolation(modifiedPhase, yDelay, 0.0, 1.0, MAX_STRETCHING_Y * deltaZHorizontal * deltaZVertical);\n\t\t\t\tdelta.z = linearInterpolation(modifiedPhase, yDelay, 0.0, 1.0, MAX_STRETCHING_Z * deltaZHorizontal * deltaZVertical);\n\t\t\t}\n\t\t\tdelta.y = -delta.y;\n\t\t}\n\t\tif (phase > HORIZONTAL_WAVE_RUNNING_START_TIME)\n\t\t{\n\t\t\tdelta.z += getColWaveDelay(phase, pos);\n\t\t}\n\t\treturn pos - delta;\n\t}\n\tfloat getPower(float h1, float h2, float v1, float v2, vec2 pos, float max2)\n\t{\n\t float a1 = min(max(linearInterpolation(pos.x, h1, 1.0, h2, 0.0), 0.0), 1.0);\n\t float a2 = linearInterpolation(pos.y, v1, 1.0, v2, max2);\n\t return a1 * a2;\n\t}\n\tvec3 updateVertex(float phase, vec3 translation)\n\t{\n\t\tfloat pPhase = phase;\n\t\tvec3 delta = vec3(0, 0, 0);\n\t\tvec3 v0 = getVertexPosition(phase, aVertexPosition);\n\n\t\tif (phase > START_TOP_CORNERS_TIME)\n\t\t{\n\t\t\tpPhase = linearInterpolation(phase, START_TOP_CORNERS_TIME, 0.0, 1.0, 1.0);\n\t\t\tpPhase = pow(pPhase, 4.0);\n\n\t\t\tfloat p1 = getPower(0.0, uSlideWidth * 0.5, 0.0, uSlideHeight, v0.xy, 2.0);\n\t\t\tfloat p2 = getPower(uSlideWidth, uSlideWidth * 0.5, 0.0, uSlideHeight, v0.xy, 2.0);\n\n\t\t\tdelta += vec3(p2 - p1, -p1 - p2, 0) * vec3(HORIZONTAL_TOP_STRETCHING, VERTICAL_TOP_STRETCHING, 0) * vec3(pPhase, pPhase, 0);\n\t\t}\n\t\tif (phase > START_BOTTOM_CORNERS_TIME)\n\t\t{\n\t\t\tpPhase = linearInterpolation(phase, START_BOTTOM_CORNERS_TIME, 0.0, 1.0, 1.0);\n\t\t\tpPhase = pow(pPhase, 4.0);\n\n\t\t\tfloat p1 = getPower(0.0, uSlideWidth * 0.25, uSlideHeight, 0.0, v0.xy, 0.0);\n\t\t\tfloat p2 = getPower(uSlideWidth, uSlideWidth * 0.75, uSlideHeight, 0.0, v0.xy, 0.0);\n\n\t\t\tdelta += vec3(0.5, 1, 0.25) * vec3(p2 - p1, p2, p2) * vec3(uSlideWidth, uSlideHeight, uSlideHeight) * vec3(pPhase, pPhase, pPhase);\n\t\t}\n\t\tdelta.y = -min(uSlideHeight * 0.75, abs(delta.y));\n\t\treturn (translation + v0 + delta);\n\t}\n\tvec3 getPosition(float phase, vec3 pos)\n\t{\n\t \tfloat maxSide = sqrt(uSlideHeight * uSlideHeight + (uSlideWidth * 0.5) * (uSlideWidth * 0.5)) * 2.0;\n\t\tvec3 translation = vec3(0.0);\n\t\tif ((phase >= START_FLY_EFFECT_TIME) && (phase <= STOP_FLY_EFFECT_TIME))\n\t\t{\n\t\t\tfloat modifiedPhase = linearInterpolation(phase, START_FLY_EFFECT_TIME, 0.0, STOP_FLY_EFFECT_TIME, 1.0);\n\t\t\tmodifiedPhase = pow(modifiedPhase, 4.0);\n\t\t\ttranslation = vec3(0.0, modifiedPhase * maxSide, 0.0);\n\t\t}\n\t\telse if (phase > STOP_FLY_EFFECT_TIME)\n\t\t{\n\t\t\ttranslation = vec3(0.0, maxSide, 0.0);\n\t\t}\n\t\tif (phase >= START_EFFECT_TIME)\n\t\t{\n\t\t\tfloat modifiedPhase = linearInterpolation(phase, START_EFFECT_TIME, 0.0, 1.0, 1.0);\n\t\t\treturn updateVertex(modifiedPhase, translation);\n\t\t}\n\t\treturn updateVertex(0.0, translation);\n\t}\n\n\tvec3 getVertexNormal(float phase, vec3 pos)\n\t{\n\t\tfloat deltaWidth = (pos.x == uSlideWidth) ? -1.0 : 1.0;\n\t\tfloat deltaHeight = 1.0;\n\n\t\tvec3 right = getVertexPosition(phase, vec3(pos.x + deltaWidth, pos.y, pos.z));\n\t\tvec3 down = getVertexPosition(phase, vec3(pos.x, pos.y + deltaHeight, pos.z));\n\t\tvec3 p = getVertexPosition(phase, vec3(pos.x, pos.y, pos.z));\n\n\t\tvec3 v1 = right - p;\n\t\tvec3 v2 = down - p;\n\n\t\tvec3 n = (pos.x == uSlideWidth) ? cross(v1, v2) : cross(v2, v1);\n\t\tn = normalize(n);\n\n\t\treturn n;\n\t}\n\tvoid main()\n\t{\n\t\tMAX_STRETCHING_Z = 0.74 * uSlideHeight;\n\t\tMAX_STRETCHING_Y = 0.74 * uSlideHeight;\n\t\tHORIZONTAL_TOP_STRETCHING = 0.42 * uSlideWidth;\n\t\tVERTICAL_TOP_STRETCHING = 0.05 * uSlideHeight;\n\t\tHORIZONTAL_MAX_AMPLITUDE = 0.93 * uSlideHeight;\n\n\t \tvTextureCoord = aTextureCoord;\n\n\t\tvec3 vertex = vec3(aVertexPosition.x, -aVertexPosition.y, aVertexPosition.z);\n\t\tvec4 p = vec4(getPosition(uPhase, vertex), 1.0);\n\t\tgl_Position = uPMVMatrix * p;\n\n\t\tvec3 transformedNormal = uNMatrix * getVertexNormal(uPhase, vertex);\n\t\tvNormal = transformedNormal;\n\t}"}; +var Uz=void 0;function Vz(a,b){R.call(this,a);this.O=b;this.Ma(!0,!0)}t(Vz,R);Vz.prototype.initialize=function(){uv(this,!1);vv(this,!1);const a=S(this.slideWidth(),this.slideHeight());F(a,"position","absolute");this.va().appendChild(a);this.wG=a}; +Vz.prototype.Ha=function(a){const b=this.slideWidth(),c=this.slideHeight(),d=b*ow(0,b,Math.floor(a*b));a=c*ow(0,c,Math.floor(a*c));const e=this.wG.getContext("2d");e.clearRect(0,0,b,c);switch(this.O){case Wz:e.drawImage(this.mb,0,a-c);e.drawImage(this.Da,0,a);break;case Xz:e.drawImage(this.mb,b-d,0);e.drawImage(this.Da,-d,0);break;case Yz:e.drawImage(this.mb,d-b,0);e.drawImage(this.Da,d,0);break;case Zz:e.drawImage(this.mb,0,c-a),e.drawImage(this.Da,0,-a)}};var Wz=0,Xz=1,Yz=2,Zz=3;function $z(a,b){R.call(this,a);this.hS=b;this.Ma(!1,!0);this.qy=[];a=this.slideWidth();switch(this.hS){case aA:a=this.slideHeight();break;case bA:a=this.slideWidth()}this.Gu=Math.floor(a/7);a=[];for(b=0;bd.vI?1:0});for(b=0;b=this.qy[c].getStartTime()+.2?b.addColorStop(g,f):d>=this.qy[c].getStartTime()?b.addColorStop(g,"rgba(255,255,255,"+h+")"):b.addColorStop(g,a)}e.fillStyle=b;e.beginPath();e.rect(0,0,this.slideWidth(),this.slideHeight());e.fill();e.restore()};var aA=0,bA=1;function cA(a,b){this.gq=a;this.Mj=b}cA.prototype.getStartTime=function(){return this.Mj};function dA(a,b){R.call(this,a);this.O=b;this.$e=!1;this.Ma(!1,!1,!0,!0,!1,!1)}t(dA,R);dA.prototype.initialize=function(){uv(this,!1);vv(this,!1);var a=this.va(),b=this.hb().background();a.appendChild(b);a=this.va();b=this.qc().background();a.appendChild(b);this.RD=S(this.slideWidth(),this.slideHeight());F(this.RD,"position","absolute");this.va().appendChild(this.RD);this.xJ=S(this.slideWidth(),this.slideHeight());F(this.xJ,"position","absolute");this.va().appendChild(this.xJ)}; +dA.prototype.Ha=function(a){var b=this.slideWidth(),c=this.slideHeight(),d=this.RD.getContext("2d");d.clearRect(0,0,b,c);var e=.5>a?this.O==eA||this.O==fA?Y(0,-b,.5,b):Y(0,b,.5,-b):this.O==eA||this.O==fA?Y(.5,b,1,-b):Y(.5,-b,1,b);e=d.createLinearGradient(e(a),0,e(a)+b,0);this.O==eA||this.O==fA?(e.addColorStop(0,"rgba(0, 0, 0, 1)"),e.addColorStop(1,"rgba(0, 0, 0, 0)")):(e.addColorStop(0,"rgba(0, 0, 0, 0)"),e.addColorStop(1,"rgba(0, 0, 0, 1)"));this.O==gA||this.O==fA?(H(this.qc().background(),1-a), +.5>a?d.drawImage(this.Up,0,0):d.drawImage(this.Cn,0,0),d.save(),d.globalCompositeOperation="destination-out",d.fillStyle=e,d.fillRect(0,0,this.slideWidth(),this.slideHeight()),d.restore()):(.5>a?(H(this.qc().background(),1),d.drawImage(this.Up,0,0)):(H(this.qc().background(),0),d.drawImage(this.Cn,0,0)),d=this.xJ.getContext("2d"),d.clearRect(0,0,b,c),d.fillStyle=e,d.fillRect(0,0,this.slideWidth(),this.slideHeight()));.5>a?(b=Y(0,0,.5,hA),c=Y(0,0,.5,iA),d=Y(0,1,.5,1+jA)):(b=Y(.5,-hA,1,0),c=Y(.5,iA, +1,0),d=Y(.5,1+jA,1,1));a="scale("+d(a)+") translate("+b(a)+"px,"+c(a)+"px)";xi(this.RD,a)};var hA=-30,iA=-20,jA=.1,gA=0,fA=1,eA=2;function kA(a,b){R.call(this,a);this.Ga=b;this.$e=!1;this.Ma(!1,!0)}t(kA,R);kA.prototype.initialize=function(){uv(this,!1);vv(this,!0);const a=this.slideWidth(),b=this.slideHeight();this.i_=Math.sqrt(a*a+b*b)*(this.Ga==lA?.5:1);this.Pw=a/2;this.Qw=b/2;switch(this.Ga){case mA:this.Pw=a;this.Qw=b;break;case nA:this.Pw=a;this.Qw=0;break;case oA:this.Pw=0;this.Qw=b;break;case pA:this.Qw=this.Pw=0}this.Jn=S(a,b);F(this.Jn,"position","relative");this.va().appendChild(this.Jn);this.sM=this.Jn.getContext("2d")}; +kA.prototype.Ha=function(a){this.sM.drawImage(this.Da,0,0);var b=this.sM,c=this.Pw,d=this.Qw,e=this.i_;b.save();b.globalCompositeOperation="destination-in";c=b.createRadialGradient(c,d,0,c,d,e);d=1.2*a;e=1;var f=d,g=0,h=d-.2;.2>d?(g=1-d/.2,h=0):1<=d&&(e=1-(d-1)/.2,f=1);c.addColorStop(h,"rgba(0,0,0,"+zn(g)+")");c.addColorStop(f,"rgba(0,0,0,"+zn(e)+")");b.fillStyle=c;b.fillRect(0,0,this.slideWidth(),this.slideHeight());b.restore();b=.8-.2;c=this.sM;e=0;for(d=[1];;){f=2*a-.03125*e;if(0>=f)break;else 1> +f&&d.push(f);++e}d.push(0);e=this.Pw;f=this.Qw;e=c.createRadialGradient(e,f,0,e,f,this.i_);f=d.length;for(--f;0<=f;--f){g=d[f];h=a;h*=2;h=1-ow(h-.2,h,g);var l=a;l*=2;h=.3*(.5*Math.cos(8*Math.PI*(g-2*a))+.5)*h*ow(l-.2-b-.2,l-.2-b,g);h*=1-.5*g;e.addColorStop(g,"rgba(0,0,0,alpha)".replace("alpha",zn(h).toString()))}c.fillStyle=e;c.fillRect(0,0,this.slideWidth(),this.slideHeight())};var lA=0,oA=1,mA=2,nA=3,pA=4;function qA(a,b){R.call(this,a);this.O=b;this.Ma(!0,!0)}t(qA,zv);k=qA.prototype;k.initialize=function(){uv(this,!1);vv(this,!1);Cv(this,this.Da);this.Bd();mat4.translate(this.jb,[-this.slideWidth()/2,this.slideHeight()/2,0]);Uv(this)};k.Bd=function(){this.Zf=Dx(50,50,this.slideWidth(),this.slideHeight());this.xe=Fx(50,50);this.$k=new Vv;var a=Hv(this,hw(this.Zf),3);this.$k.kg=a;a=Hv(this,iw(this.Zf),2);this.$k.rg=a;a=Iv(this,this.xe);this.$k.Sf=a};k.Kh=function(){Fv(this,this.$k);this.N.deleteTexture(this.nB)}; +k.Vh=function(){Nv(this);this.RA=Pv(this,"uSampler1");this.SA=Pv(this,"uSampler2");this.jg=Pv(this,"uPhase");const a=Pv(this,"uSlideSize"),b=Pv(this,"uWaveCenter"),c=Pv(this,"uWaveRadius"),d=this.slideWidth(),e=this.slideHeight();let f;switch(this.O){case lA:f=new V(d/2,e/2);break;case nA:f=new V(d,0);break;case pA:f=new V(0,0);break;case oA:f=new V(0,e);break;case mA:f=new V(d,e);break;default:throw Error("Unknown direction");}let g=Math.sqrt(d*d+e*e);this.O==lA&&(g=Math.sqrt(f.x()*f.x()+f.y()*f.y())); +this.N.uniform2fv(a,[d,e]);this.N.uniform2fv(b,[f.x(),f.y()]);this.N.uniform1f(c,g)};k.Lh=function(){};k.Ha=function(a){this.N.uniform1f(this.jg,a);Mv(this,this.$k,this.N.TRIANGLE_STRIP)};k.Oh=function(){return"precision mediump float;\n\n\tattribute vec3 aVertexPosition;\n\tattribute vec2 aTextureCoord;\n\n\tuniform mat4 uPMVMatrix;\n\tuniform mat3 uNMatrix;\n\n\tconst float FREQUENCY = 12.566371; // 4.0 * PI\n\tconst float SHADOW = 0.3;\n\n\tuniform float uPhase;\n\tuniform vec2 uSlideSize;\n\tuniform vec2 uWaveCenter;\n\tuniform float uWaveRadius;\n\n\tvarying mediump vec2 vTextureCoord;\n\tvarying mediump float vShadow;\n\tvarying mediump float vAlpha;\n\n\tvoid main(void)\n\t{\n\t\tvec2 texCoord = aTextureCoord;\n\t\tvec2 screenCoord = texCoord * uSlideSize;\n\t\tvec2 centerToPoint = screenCoord - uWaveCenter;\n\n\t\tfloat angle = atan(centerToPoint.y, centerToPoint.x);\n\t\tfloat radius = length(centerToPoint);\n\n\t\tfloat phaseOffset = radius / uWaveRadius;\n\t\tfloat phaseOffsetFixed = (uPhase + uPhase) - phaseOffset;\n\t\tfloat offset = sin(phaseOffsetFixed * FREQUENCY) * smoothstep(1.0, 0.85, phaseOffsetFixed) * smoothstep(0.0, 0.15, phaseOffsetFixed) * (phaseOffset);\n\n\t\tfloat AMPLITUDE = min(uSlideSize.x, uSlideSize.y) / 15.0;\n\t\tradius = radius + offset * AMPLITUDE;\n\t\tcenterToPoint = vec2(radius * cos(angle), radius * sin(angle));\n\n\t\ttexCoord =(uWaveCenter + centerToPoint) / uSlideSize;\n\t\tfloat alpha = smoothstep(0.0, 1.0, phaseOffsetFixed);\n\t\tfloat shadow = (1.0 - SHADOW * abs(offset));\n\n\t\tvTextureCoord = texCoord;\n\t\tvShadow = shadow;\n\t\tvAlpha = alpha;\n\n\t\tgl_Position = uPMVMatrix * vec4(aVertexPosition, 1.0);\n\t}"}; +k.Nh=function(){return"precision mediump float;\n\n\tvarying mediump vec2 vTextureCoord;\n\tvarying mediump float vShadow;\n\tvarying mediump float vAlpha;\n\n\tuniform sampler2D uSampler1;\n\tuniform sampler2D uSampler2;\n\n\tvoid main(void) \n\t{ \n\t\tif (vTextureCoord.x < 0.0 || vTextureCoord.x > 1.0 || vTextureCoord.y < 0.0 || vTextureCoord.y > 1.0) \n\t\t{ \n\t\t\tgl_FragColor = mix(vec4(0.0), vec4(0.0), 0.0);\n\t\t\treturn;\n\t\t} \n\t\tvec4 color1 = texture2D(uSampler1, vTextureCoord);\n\t\tvec4 color2 = texture2D(uSampler2, vTextureCoord);\n\t\tvec4 mixedColor = mix(color1, color2, vAlpha);\n\t\tgl_FragColor = vec4(vShadow * mixedColor.rgb, mixedColor.a);\n\t}"}; +k.vz=function(){this.mB=Gv(this,this.N.TEXTURE0,this.RA,0,this.Da);this.nB=Gv(this,this.N.TEXTURE1,this.SA,1,this.mb)};function rA(a){R.call(this,a);this.Ma(!1,!0)}t(rA,R);rA.prototype.initialize=function(){uv(this,!1);this.Jn=S(this.slideWidth(),this.slideHeight());this.va().appendChild(this.Jn);this.uj=this.Jn.getContext("2d")}; +rA.prototype.Ha=function(a){const b=this.slideWidth(),c=this.slideHeight();var d=this.Da;const e=this.uj;e.clearRect(0,0,b,c);e.drawImage(d,0,0);e.save();d=a*Math.max(b,c);e.globalCompositeOperation="destination-out";const f=e.createRadialGradient(b/2,c/2,a*d,b/2,c/2,d);f.addColorStop(0,"#FFFFFF");f.addColorStop(.15,"rgba(255,255,255,128)");f.addColorStop(1,"rgba(255,255,255,0)");e.fillStyle=f;e.beginPath();e.arc(b/2,c/2,d,0,2*Math.PI,!0);e.fill();e.restore();this.na()&&0>=a&&vv(this,!1)};function sA(a){R.call(this,a);this.Ma(!0,!1)}t(sA,R);sA.prototype.initialize=function(){vv(this,!1);uv(this,!0);this.xV=S(this.slideWidth(),this.slideHeight());this.va().appendChild(this.xV);this.c5=this.mb.getContext("2d");this.d5=this.xV.getContext("2d")}; +sA.prototype.Ha=function(a){if(0!=a||this.na()){var b=this.slideWidth(),c=this.slideHeight(),d=this.mb,e=this.d5;e.clearRect(0,0,b,c);e.drawImage(d,0,0);e.save();e.globalCompositeOperation="destination-out";d=tA(this,b/2,c/2,b/2+b*a,c/2+c*a,a,!1,!1);var f=b/2,g=c/2,h=b/2,l=c/2;e.fillStyle=d;e.beginPath();e.rect(f,g,h,l);e.fill();d=tA(this,b/2,c/2,b/2+b*a,-a*c+c/2,a,!0,!1);f=b/2;g=b/2;h=c/2;e.fillStyle=d;e.beginPath();e.rect(f,0,g,h);e.fill();d=tA(this,b/2,c/2,-a*b+b/2,c/2+c*a,a,!1,!0);f=c/2;g=b/2; +h=c/2;e.fillStyle=d;e.beginPath();e.rect(0,f,g,h);e.fill();a=tA(this,b/2,c/2,-a*b+b/2,-a*c+c/2,a,!0,!0);b/=2;c/=2;e.fillStyle=a;e.beginPath();e.rect(0,0,b,c);e.fill();e.restore()}}; +function tA(a,b,c,d,e,f,g,h){const l=a.c5;a=a.slideHeight()>a.slideWidth()?l.createLinearGradient(b,c,(h?-b:b)*f*2+d,e):l.createLinearGradient(b,c,d,(g?-c:c)*f*2+e);a.addColorStop(0,"rgba(255,255,255,0)");a.addColorStop(.2f?f+.2:1,"#FFFFFF");a.addColorStop(1,"#FFFFFF");return a};function uA(a){R.call(this,a);this.Ma(!1,!0)}t(uA,R);uA.prototype.initialize=function(){uv(this,!1);vv(this,!0);this.Jc=S(this.slideWidth(),this.slideHeight());this.va().appendChild(this.Jc)}; +uA.prototype.Ha=function(a){var b=(this.slideWidth()/2+50)*(1-a),c=b-50,d=(this.slideHeight()/2+50)*(1-a);let e=d-50;const f=this.Jc.getContext("2d");f.clearRect(0,0,this.slideWidth(),this.slideHeight());f.drawImage(this.Da,0,0);f.save();f.globalCompositeOperation="destination-out";d=f.createLinearGradient(0,d,0,e);d.addColorStop(0,"rgba(255, 255, 255, 1)");d.addColorStop(1,"rgba(255, 255, 255, 0)");b=f.createLinearGradient(b,0,c,0);b.addColorStop(0,"rgba(255, 255, 255, 1)");b.addColorStop(1,"rgba(255, 255, 255, 0)"); +c=this.slideWidth()/2+(this.slideWidth()/2+50)*a;c=f.createLinearGradient(c-50,0,c,0);c.addColorStop(0,"rgba(255, 255, 255, 1)");c.addColorStop(1,"rgba(255, 255, 255, 0)");e=this.slideHeight()/2+(this.slideHeight()/2+50)*a;a=f.createLinearGradient(0,e-50,0,e);a.addColorStop(0,"rgba(255, 255, 255, 1)");a.addColorStop(1,"rgba(255, 255, 255, 0)");f.fillStyle=d;f.fillRect(0,0,this.slideWidth()/2,this.slideHeight()/2);f.fillStyle=b;f.fillRect(0,0,this.slideWidth()/2,this.slideHeight()/2);f.fillStyle=a; +f.fillRect(0,this.slideHeight()/2,this.slideWidth()/2,this.slideHeight()/2);f.fillStyle=b;f.fillRect(0,this.slideHeight()/2,this.slideWidth()/2,this.slideHeight()/2);f.fillStyle=d;f.fillRect(this.slideWidth()/2,0,this.slideWidth()/2,this.slideHeight()/2);f.fillStyle=c;f.fillRect(this.slideWidth()/2,0,this.slideWidth()/2,this.slideHeight()/2);f.fillStyle=a;f.fillRect(this.slideWidth()/2,this.slideHeight()/2,this.slideWidth()/2,this.slideHeight()/2);f.fillStyle=c;f.fillRect(this.slideWidth()/2,this.slideHeight()/ +2,this.slideWidth()/2,this.slideHeight()/2);f.restore()};function vA(){var a=Array(2);wA(a,0,0);return a}function wA(a,b,c){a[0]=b;a[1]=c};function xA(a,b){R.call(this,a);this.Ga=b;this.Ma(!0,!0)}t(xA,R);k=xA.prototype; +k.initialize=function(){uv(this,!1);vv(this,!1);this.HJ=this.nZ=!1;this.iF=[];this.oF=[];var a=this.slideWidth(),b=this.slideHeight();this.aM=Math.max(a,b);var c=this.hn(this.va(),a,b,!0);Di(c,this.aM+"px");this.pa=this.hn(c,a,b,!0);this.uM=this.hn(this.pa,a,b,!0);this.jF=this.hn(this.pa,a,b,!0);F(this.jF,"visibility","hidden");if(this.Ga==yA||this.Ga==zA){b=Ni?4:8;c=this.na()?this.mb:this.Da;const p=this.na()?this.Da:this.mb;var d=this.slideWidth(),e=this.slideHeight(),f=b/2-1;for(a=0;aMath.random()?-1:1));this.oF[a]=this.Qu(this.uM,d,e,g,l,h);this.iF[a]=this.Qu(this.jF,d,e,g,l,h)}d/=128;e/=96;f=0;h=[];for(a=0;128>a;++a){g=0;l=Math.round((a+1)*d)-f;const r=f;for(let v=0;96>v;++v){if(0==h.length)for(var n=0;nc&&(T=c-J);if(!v&&J+T>=c)if(T>.5*g+h)T=h;else{X.Jx=void 0;y=vA();wA(y,X.Go.x,0);D=vA();wA(D,J+T,U);X.Go.kr.x+=T;X.Go.kr.y=d;continue}v?(y=vA(),wA(y,J,0),D=vA(),wA(D,J+T,U),X.Go={DC:y,kr:D}):(y=vA(),wA(y,J,U),D=vA(),wA(D,J+T,d),X.Jx={DC:y,kr:D},m.push({BC:void 0,Go:void 0,Jx:void 0}),p=m[++r],y=vA(),wA(y,J,0),D=vA(),wA(D,J+T,U),p.BC={DC:y,kr:D});p=T;v= +!v}const I=a.na()?a.mb:a.Da,A=a.na()?a.Da:a.mb;e=.5>Math.random()?-1:1;for(f=0;f=a)&&(this.HJ=!0);if(0<=a&&.4>a){var d=Y(0,0,.4,1);a=d(a)}else.6<=a&&1>a?(d=Y(.6,1,1,0),a=d(a)):a=1;d=-this.aM*a/2;let e=30*a*(this.HJ?-1:1);c&&b&&(e=-e);xi(this.pa,"translateZ("+d+"px) rotateY("+e+"deg) rotateX("+-15*a+"deg)")}; +k.Ha=function(a){if(1!=a||!this.na()){this.eM(a);const f=2*this.aM;var b=this.na();let g=this.oF;if(b&&.47>=a||!b&&.47<=a)g=this.iF,this.nZ||(this.nZ=!0,F(this.jF,"visibility","visible"),F(this.uM,"visibility","hidden"));b=g.length;for(let h=0;hc){var d=Y(0,0,.4,1);c=d(c)}else.522<=c&&.922>c?(d=Y(.522,1,.922,0),c=d(c)):c=.4<=c&&.522>c?1:0;c*=l.L$;d=a;if(.401<=d&&.461>d){var e=Y(.401,0,.461,1);d=e(d)}else.461<=d&&.521>d?(e=Y(.461,1,.521,0),d=e(d)):d=0;xi(l.canvas, +"translateZ("+(d*f*l.direction+c)+"px)")}}};function BA(a,b,c,d){this.canvas=a;this.startTime=b;this.L$=c;this.direction=d}var CA=1,yA=2,zA=3;function DA(a,b){R.call(this,a);this.Ma(!1,!0);this.O=b}t(DA,R);DA.prototype.initialize=function(){uv(this,!1);vv(this,!0);this.Jc=S(this.slideWidth(),this.slideHeight());this.va().appendChild(this.Jc)}; +DA.prototype.Ha=function(a){var b=0;let c=0,d=0,e=0;var f=0;let g=0,h=0,l=0;switch(this.O){case EA:e=(this.slideHeight()/2+200)*a;c=e-200;h=this.slideHeight()-a*(this.slideHeight()/2+200);l=h+200;break;case FA:c=(this.slideHeight()/2+200)*(1-a);e=c-200;l=this.slideHeight()-(1-a)*(this.slideHeight()/2+200);h=l+200;break;case GA:d=(this.slideWidth()/2+200)*a;b=d-200;f=this.slideWidth()-a*(this.slideWidth()/2+200);g=f+200;break;case HA:b=(this.slideWidth()/2+200)*(1-a),d=b-200,g=this.slideWidth()-(1- +a)*(this.slideWidth()/2+200),f=g+200}a=this.Jc.getContext("2d");a.clearRect(0,0,this.slideWidth(),this.slideHeight());a.drawImage(this.Da,0,0);a.save();a.globalCompositeOperation="destination-out";b=a.createLinearGradient(b,c,d,e);b.addColorStop(0,"rgba(255, 255, 255, 1)");b.addColorStop(1,"rgba(255, 255, 255, 0)");a.fillStyle=b;this.O==GA||this.O==HA?a.fillRect(0,0,this.slideWidth()/2,this.slideHeight()):a.fillRect(0,0,this.slideWidth(),this.slideHeight()/2);f=a.createLinearGradient(f,h,g,l);f.addColorStop(0, +"rgba(255, 255, 255, 0)");f.addColorStop(1,"rgba(255, 255, 255, 1)");a.fillStyle=f;this.O==GA||this.O==HA?a.fillRect(this.slideWidth()/2,0,this.slideWidth()/2,this.slideHeight()):a.fillRect(0,this.slideHeight()/2,this.slideWidth(),this.slideHeight()/2);a.restore()};var GA=0,HA=1,EA=2,FA=3;function IA(a,b){R.call(this,a);this.Ma(!1,!0);this.O=b}t(IA,R);IA.prototype.initialize=function(){uv(this,!1);vv(this,!0);this.Jc=S(this.slideWidth(),this.slideHeight());F(this.Jc,"position","relative");this.va().appendChild(this.Jc)}; +IA.prototype.Ha=function(a){var b=0;let c=0,d=0,e=0;switch(this.O){case JA:e=(this.slideHeight()+400)*a;c=e-200;b=(this.slideWidth()+400)*(1-a);d=b-200;break;case KA:c=(this.slideHeight()+400)*(1-a);e=c-200;b=(this.slideWidth()+400)*(1-a);d=b-200;break;case LA:e=(this.slideHeight()+400)*a;c=e-200;d=(this.slideWidth()+400)*a;b=d-200;break;case MA:d=(this.slideWidth()+400)*a,b=d-200,c=(this.slideHeight()+400)*(1-a),e=c-200}a=this.Jc.getContext("2d");a.clearRect(0,0,this.slideWidth(),this.slideHeight()); +a.drawImage(this.Da,0,0);a.save();a.globalCompositeOperation="destination-out";b=a.createLinearGradient(b,c,d,e);b.addColorStop(0,"rgba(255, 255, 255, 1)");b.addColorStop(1,"rgba(255, 255, 255, 0)");a.fillStyle=b;a.fillRect(0,0,this.slideWidth(),this.slideHeight());a.restore()};var JA=0,KA=1,LA=2,MA=3;function NA(a,b,c){R.call(this,a);this.O=b;this.Fz=c;this.Ma(!0,!0)}t(NA,R);k=NA.prototype; +k.initialize=function(){uv(this,!1);vv(this,!1);const a=this.slideWidth(),b=this.slideHeight();this.Ne=this.nc(a,b);this.va().appendChild(this.Ne);var c=S(a,b),d=S(a,b);this.Dc=this.nc(a,b);this.mh=this.nc(a,b);this.lh=this.nc(a,b);this.Fz||(this.Dn=S(a,b));this.mh.appendChild(c);this.lh.appendChild(d);this.Ne.appendChild(this.Dc);this.Dc.appendChild(this.lh);this.Dc.appendChild(this.mh);this.Fz||(F(this.Dn,"position","absolute"),this.Dc.appendChild(this.Dn));c=c.getContext("2d");d=d.getContext("2d"); +c.drawImage(this.Da,0,0);d.drawImage(this.mb,0,0);this.Fz||(this.Dn.getContext("2d").drawImage(this.mb,0,0),this.na()||H(this.Dn,0));this.RE=!1;this.Fz&&(Di(this.Ne,Math.max(a,b)+"px"),Ei(this.Ne,this.slideWidth()/2+"px "+this.slideHeight()/2+"px"),Ci(this.Dc,"preserve-3d"))};k.nc=function(a,b){const c=zd("DIV");Oh(c,a);Ph(c,b);F(c,"position","absolute");return c}; +k.Ha=function(a){const b=this.O==OA?-1:1;if(this.Fz){var c=.25*(1-Math.cos(2*a*Math.PI));var d=Math.max(this.slideHeight(),this.slideWidth()),e=this.U1,f=this.V1,g=this.YI,h=-b*c*this.slideWidth()/2,l=c*this.slideHeight()*1.5;xi(this.Dc,"translateZ("+d+"px) translateY("+l+"px) translateX("+h+"px) rotateX("+-e*c+"deg) rotateY("+-b*f*c+"deg) rotateZ("+b*g*c+"deg)");PA(this,a,!1);PA(this,a,!0)}else e=this.slideHeight()/2,c=.25*(1-Math.cos(2*a*Math.PI)),d=-e*c,e=(this.slideHeight()+e)*c,Gh(this.mh,0, +d),Gh(this.lh,0,e),Gh(this.Dn,0,e),e=new gm,d=new gm,e.rotate(this.YI*Math.PI/180*b*c,0,0),d.rotate(this.YI*Math.PI/180*b*c,0,0),on(this.mh,e),on(this.lh,d),on(this.Dn,d),c=Math.max(1-a,.8),e.scale(c,c),on(this.mh,e),c=this.na()?Math.max(a,.8):Math.max(.5>a?1-a:a,.8),d.scale(c,c),on(this.lh,d),on(this.Dn,d),.5<=a&&!this.RE&&!this.na()?(this.RE=!0,H(this.Dn,1)):.5>=a&&!this.RE&&this.na()&&(this.RE=!0,H(this.Dn,0))}; +function PA(a,b,c){var d=a.slideHeight()/2;const e=.25*(1-Math.cos(2*b*Math.PI));d=(c?-(d+a.Gl):a.slideHeight()+d+a.Gl)*e;b=-(c?1+b:2-b)*Math.max(a.slideWidth(),a.slideHeight());xi(c?a.mh:a.lh,"translateY("+d+"px) translateZ("+b+"px)")}k.U1=30;k.V1=20;k.YI=30;k.Gl=20;var OA=1;function QA(a,b,c){R.call(this,a);this.xc=c;this.Ma(!0,!0);this.Vn=b==OA}t(QA,R);k=QA.prototype; +k.initialize=function(){uv(this,!1);vv(this,!1);const a=this.slideWidth(),b=this.slideHeight();this.kH=this.nc(a,b);this.va().appendChild(this.kH);this.up=this.nc(a,b);this.Mg=this.nc(a,b);this.Kg=this.nc(a,b);this.Vn?(this.Mg.appendChild(this.mb),this.Kg.appendChild(this.Da)):(this.Mg.appendChild(this.Da),this.Kg.appendChild(this.mb));this.kH.appendChild(this.up);this.Vn?(this.up.appendChild(this.Mg),this.up.appendChild(this.Kg)):(this.up.appendChild(this.Kg),this.up.appendChild(this.Mg));this.mH= +!1;this.xc&&(Di(this.kH,Math.max(a,b)+"px"),Ei(this.kH,this.slideWidth()/2+"px "+this.slideHeight()/2+"px"),Ci(this.up,"preserve-3d"))};k.Ha=function(a){a=this.Vn?1-a:a;this.xc?this.JN(a):this.NK(a)}; +k.JN=function(a){function b(g){const h=g?-1:1,l=g?this.Mg:this.Kg;g="translateZ("+(g?e:f).call(this,a)*d+"px)rotateY("+-30*h*c+"deg)translateX("+h*c*this.slideWidth()*1.05+"px)";xi(l,g)}const c=.25*(1-Math.cos(2*a*Math.PI)),d=Math.max(this.slideWidth(),this.slideHeight()),e=Y(0,0,1,-.3),f=Y(0,-.3,1,0);b.call(this,!0);b.call(this,!1)}; +k.NK=function(a){function b(d){const e=d?-1:1;d=d?this.Mg:this.Kg;const f=new gm;f.scale(1-.5*c,1-.5*c);f.translate(e*c*this.slideWidth()*1.05,0);on(d,f)}this.Vn?.5>a&&!this.mH&&(this.up.appendChild(this.Mg),this.mH=!0):.5<=a&&!this.mH&&(this.up.appendChild(this.Kg),this.mH=!0);const c=.25*(1-Math.cos(2*a*Math.PI));this.slideWidth();this.slideHeight();b.call(this,!0);b.call(this,!1)};k.nc=function(a,b){const c=zd("DIV");Oh(c,a);Ph(c,b);F(c,"position","absolute");return c};function RA(a,b){R.call(this,a);this.O=b;this.Ma(!0,!0);this.$q()}var SA,TA,UA,VA,WA,XA,YA;t(RA,R); +RA.prototype.$q=function(){var a=this.slideWidth(),b=this.slideHeight(),c=XA!=a||YA!=b;if(!(SA&&TA&&UA&&VA&&WA)||c){XA=a;YA=b;SA=[];TA=[];UA=[];VA=[];WA=[];a=this.slideWidth();b=this.slideHeight();c=SA;const g=TA,h=UA;for(var d=0;d=Ma.JQ;m=Ma;var r=gc,v=p;p=ha;var y=ra,D=tb,I=Db;const Zk=this.O==hB||this.O==iB,$k=this.na();var A=this.slideWidth(), +J=this.slideHeight();const ru=this.FD.getContext("2d"),Ho=SA;var T=TA,U=UA;const Io=this.Da,Jo=this.mb;v&&(v=Ho[r],r=(Zk?T:U)[r],T=m.eQ.getContext("2d"),U=m.EP.getContext("2d"),A-=p+D,J-=y+I,T.drawImage(v,p,y,D,I,0,0,D,I),U.drawImage(r,A,J,D,I,0,0,D,I),T.save(),T.globalCompositeOperation="source-out",T.drawImage(Io,p,y,D,I,0,0,D,I),T.restore(),U.save(),U.globalCompositeOperation="source-out",U.drawImage(Jo,A,J,D,I,0,0,D,I),U.restore(),ru.clearRect($k&&Zk?A:p,$k&&!Zk?J:y,D,I),m.n0=!0)}Ma.PR(a,g,h, +aa.A$)}}};function kB(a,b,c){this.i7=a;this.q0=[];this.S7=b;this.UE=c}kB.prototype.PR=function(a){const b=this.UE;a=(a-this.S7)/fB;a=Math.min(Math.max(a,0),1);a=Math.PI*a*(b?1:-1);xi(this.i7,(b?"rotateY":"rotateX")+"("+a+"rad)");this.A$=a}; +function gB(a,b,c,d,e,f,g,h,l,n,m,p){this.eQ=b;this.EP=c;xi(c,(m?"rotateY":"rotateX")+"(180deg)");this.Ee=f;this.rc=a;this.jl=d;this.kl=e;this.gs=n;this.JQ=g;this.QW=g+(h-g)/2;this.f7=.8+this.JQ-.2;this.Q0=.8+this.QW-.2;this.w3=0>l?-1:1;this.P4=Math.abs(l);this.e5=p;this.UE=m;this.n0=!1;lB(this,!0)} +gB.prototype.PR=function(a,b,c,d){var e=this.rc,f=this.P4,g=this.Ee,h=mB(a,this.JQ,this.f7,f);a=mB(a,this.QW,this.Q0,f);f=this.UE;var l=this.e5,n=this.w3,m=l?-n:n;f&&(m=l?n:-n);l=l?Math.max(h,a):Math.min(h,a);g=Math.atan2(h-a,g)*m;h>a?yi(e,"0% 0%"):yi(e,"100% 100%");l*=n;xi(e,"translateZ("+l+"px)"+((f?"rotateY":"rotateX")+"("+g+"rad)"));f=l;e=this.jl;h=this.kl;n=this.Ee;m=this.UE;a=Array(16);a[0]=0;a[1]=0;a[2]=0;a[3]=0;a[4]=0;a[5]=0;a[6]=0;a[7]=0;a[8]=0;a[9]=0;a[10]=0;a[11]=0;a[12]=0;a[13]=0;a[14]= +0;a[15]=0;a[0]=1;a[1]=0;a[2]=0;a[3]=0;a[4]=0;a[5]=1;a[6]=0;a[7]=0;a[8]=0;a[9]=0;a[10]=1;a[11]=0;a[12]=0;a[13]=0;a[14]=0;a[15]=1;m?(b-=(e-n)/2,ti(a,b,0,0),vi(a,d),ti(a,-b,0,0),ti(a,0,0,f),vi(a,g)):(b=c-(h-n)/2,ti(a,0,b,0),ui(a,d),ti(a,0,-b,0),ti(a,0,0,f),ui(a,g));b=pi();qi(b,e,h,0,1);si(a,b,b);d=pi();qi(d,b[0],b[1],b[2],0);ri(d,this.gs,d);b=pi();qi(b,e,h,1,0);c=pi();qi(c,e,h,0,0);ri(b,c,b);si(a,b,b);d=ni(b,d);this.NE?0<=d&&lB(this,!1):0>=d&&lB(this,!0)}; +function lB(a,b){const c=b?a.eQ:a.EP,d=b?a.EP:a.eQ;a.NE=b;F(c,"visibility","visible");F(d,"visibility","hidden")}function mB(a,b,c,d){return a>=b&&a<=b+.2?d*(a-b)/.2:a>=c?Math.max(d-d*(a-c)/.2,0):a>=b?d:0}var hB=0,iB=2,jB=3;function nB(a,b){R.call(this,a);this.O=b;this.Ma(!0,!0)}t(nB,zv);k=nB.prototype;k.initialize=function(){uv(this,!1);vv(this,!1);Cv(this,this.Da);this.Bd();mat4.translate(this.jb,[-this.slideWidth()/2,this.slideHeight()/2,0]);Uv(this)}; +k.Vh=function(){Nv(this);this.hT=Ov(this,"aDelay");this.fV=Ov(this,"aMaxDistance");this.RA=Pv(this,"uSampler1");this.SA=Pv(this,"uSampler2");this.jg=Pv(this,"uPhase");const a=Pv(this,"uSlideWidth"),b=Pv(this,"uHorizontal");this.N.uniform1f(Pv(this,"uSlideHeight"),this.slideHeight());this.N.uniform1f(a,this.slideWidth());this.N.uniform1i(b,this.O==hB||this.O==iB?1:0)};k.Lh=function(){Ev(this,this.hT);Ev(this,this.fV)}; +k.vJ=function(){const a=this.N;a.bindBuffer(a.ARRAY_BUFFER,this.tK);a.vertexAttribPointer(this.hT,this.tK.Ax,a.FLOAT,!1,0,0);a.bindBuffer(a.ARRAY_BUFFER,this.xK);a.vertexAttribPointer(this.fV,this.xK.Ax,a.FLOAT,!1,0,0)}; +k.Bd=function(){var a=this.slideWidth();const b=this.slideHeight();var c=ij&&Ii,d=Ni&&Ii||c;c=d?26:50;d=d?20:45;const e=a/c,f=b/d;this.rb=new oB;for(let g=0;g endTime)\n\t\t{\n\t\t\tpPhase = 1.0;\n\t\t}\n\t\tfloat z = 4.0 * aMaxDistance * pPhase * (pPhase - 1.0);\n\t\tfloat rotation = 180.0 * pPhase;\n\n\t\tmat4 m = mat4(1.0);\n\n\t\tvec3 pivotPoint = vec3(- uSlideWidth / 2.0, uSlideHeight / 2.0, 0.0);\n\t\tm = m * translationMatrix(-pivotPoint.x, -pivotPoint.y, -pivotPoint.z);\n\t\tif (uHorizontal)\n\t\t{\n\t\t m = m * rotationYmatrix(rotation);//left right\n\t\t}\n\t\telse \n\t\t{\n\t\t\tm = m * rotationXmatrix(rotation);//top bottom\n\t\t}\n\t\tm = m * translationMatrix(pivotPoint.x, pivotPoint.y, pivotPoint.z);\n\t\tm = m * translationMatrix(0.0, 0.0, z);\n\n\t\treturn m;\n\t}\n\n\tvec3 getVertexPosition() \n\t{ \n\t\tmat4 m = positionMatrix();\n\t\tvec4 v = m * vec4(aVertexPosition, 1.0);\n\t\treturn v.xyz;\n\t} \n\tvec3 getNormal() \n\t{\n\t\tmat4 m = positionMatrix();\n\t\tvec4 v = m * vec4(0 ,0, 1, 0.0);\n\t\treturn v.xyz;\n\t}\n\tvoid main(void)\n\t{\n\t\tvTextureCoord = aTextureCoord;\n\n\t\tvec3 pos = getVertexPosition();\n\t\tvec3 n = getNormal();\n\t\tn = normalize(n);\n\t\tgl_Position = uPMVMatrix * vec4(pos, 1.0); \n\t\tvNormal = uNMatrix * n;\n\t}"}; +function oB(){this.US=0;this.tN=[];this.uK=[];this.yK=[];this.FO=[];this.hh=[]}k=oB.prototype;k.Uw=function(a){this.tN=this.tN.concat(a.TQ());this.uK=this.uK.concat(a.PP());this.yK=this.yK.concat(a.RP());this.FO=this.FO.concat(a.JR());const b=4*this.US;for(let c=0;c=1.5*Math.PI&&(d.beginPath(),d.moveTo(b,c),d.arc(b,c,this.Rg,3*Math.PI-a,a,!1),d.lineTo(b,c),d.fillStyle="#000",d.fill());d=this.tA;d.drawImage(this.mb,0,0);d.save();d.globalCompositeOperation="destination-in";d.drawImage(this.Jc,0,0);d.restore()}; +uB.prototype.cE=function(a,b,c,d,e,f,g){const h=this.Vf;h.fillStyle="rgba(0,0,0,"+g.toString()+")";h.beginPath();h.moveTo(a,b);h.lineTo(c,d);h.lineTo(e,f);h.fill()}; +uB.prototype.zK=function(a,b){const c=.5*this.slideWidth(),d=.5*this.slideHeight();let e=vB;b-=a;var f=a;f<1.5*Math.PI&&(e=(1.5*Math.PI-a)/b,f=1.5*Math.PI);let g=c+this.Rg*Math.cos(f),h=d+this.Rg*Math.sin(f),l=c+this.Rg*Math.cos(3*Math.PI-f);for(f=d+this.Rg*Math.sin(3*Math.PI-f);1>=e;){let n=a+e*b;n>2.5*Math.PI&&(n=2.5*Math.PI);const m=c+this.Rg*Math.cos(n),p=d+this.Rg*Math.sin(n);this.cE(c,d,g,h,m,p,1-e);const r=c+this.Rg*Math.cos(3*Math.PI-n),v=d+this.Rg*Math.sin(3*Math.PI-n);this.cE(c,d,l,f,r, +v,1-e);e+=vB;g=m;h=p;l=r;f=v;if(n==2.5*Math.PI)break}};function wB(a,b){R.call(this,a);this.Un=!1;0>b&&(b=-b,this.Un=!0);this.yO=b;this.Ma(!0,!1)}t(wB,R);wB.prototype.initialize=function(){var a=this.slideWidth();const b=this.slideHeight();vv(this,!1);const c=S(a,b);this.tA=c.getContext("2d");this.Jc=S(a,b);this.Vf=this.Jc.getContext("2d");this.Vf.scale(1,b/a);a*=.5;this.Rg=Math.sqrt(2*a*a);F(c,"position","absolute");this.va().appendChild(c)};var xB=1/15; +wB.prototype.Ha=function(a){var b=this.slideWidth();this.slideHeight();const c=this.Vf;let d=2/this.yO,e=.2/this.yO;this.Un&&(d=-d,e=-e);c.clearRect(0,0,b,b);for(b=0;b=f)g.beginPath(),g.moveTo(l,l),this.Un?g.arc(l,l,this.Rg,f,h,!0):g.arc(l,l,this.Rg,f,h,!1),g.lineTo(l,l),g.fillStyle="#000",g.fill()}a=this.tA;a.drawImage(this.mb,0,0);a.save(); +a.globalCompositeOperation="destination-in";a.drawImage(this.Jc,0,0);a.restore()};wB.prototype.cE=function(a,b,c,d,e,f,g){const h=this.Vf;h.fillStyle="rgba(0,0,0,"+zn(g).toString()+")";h.beginPath();h.moveTo(a,b);h.lineTo(c,d);h.lineTo(e,f);h.fill()}; +wB.prototype.zK=function(a,b,c,d){const e=.5*this.slideWidth();let f=xB;b-=a;var g=a;if(this.Un&&g>c||!this.Un&&g=f;){let h=a+f*b;if(this.Un&&hd)h=d;const l=e+this.Rg*Math.cos(h),n=e+this.Rg*Math.sin(h);this.cE(e,e,c,g,l,n,1-f);f+=xB;c=l;g=n;if(h==d)break}};function yB(a,b){R.call(this,a);this.O=b;this.Ma(!1,!0)}t(yB,zv);k=yB.prototype;k.initialize=function(){uv(this,!1);vv(this,!0);Cv(this,this.Da);this.Bd();this.N.enable(this.N.DEPTH_TEST);mat4.translate(this.jb,[-this.slideWidth()/2,this.slideHeight()/2,0]);this.yB=mat4.create();mat4.set(this.jb,this.yB)}; +k.Bd=function(){this.hg=Dx(20,20,this.slideWidth(),this.slideHeight());for(var a=0==this.O?Gx(20,20):Fx(20,20),b=[],c=0,d=a.length;c+2e)){var f=a[c++];if(!(0>f))for(var g=!0;ch)break;e!=f&&e!=h&&f!=h&&b.push(e,f,h);g?e=h:f=h;g=!g}}}this.xe=b;this.Gq=new fw;for(a=0;am;m++)v[0].push(zB(3,m,n));for(m=0;4>m;m++)v[1].push(zB(3,m,p));for(m=0;2>m;m++)v[2].push(zB(1,m,r));this.ZZ.push(v)}this.oh=[];for(c=0;4>c;c++)for(d=0;4>d;d++)for(e=0;2>e;e++)f=this.zj(c,d,e),g=a,h=b,l=d,n=e,p=[0,0,0],p[0]=g[0]+c/3*(h[0]-g[0]),p[1]=g[1]+l/3*(h[1]-g[1]),p[2]=g[2]+n/1*(h[2]-g[2]),g=p,this.oh[f]= +g[0],this.oh[f+1]=g[1],this.oh[f+2]=g[2];this.AA={}};function zB(a,b,c){let d=1;for(let e=1;e<=b;e++)d*=(a-(b-e))/e;return d*Math.pow(c,b)*Math.pow(1-c,a-b)}k.zj=function(a,b,c){return 3*(a+4*b+16*c)};k.Kh=function(){Fv(this,this.Ei)};k.Lh=function(){Ev(this,this.ol)};k.Nh=function(){return"precision mediump float;\n\n\tvarying vec2 vTextureCoord;\n\tvarying vec3 vNormal;\n\n\tuniform sampler2D uSampler;\n\n\tconst vec3 LIGHT_DIRECTION = vec3(0.0, 0.0, 1.0);\n\tconst float AMBIENT_INTENSITY = 0.4;\n\tconst float DIFFUSE_INTENSITY = 0.6;\n\n\tvoid main(void)\n\t{\n\t\tfloat diffuseFactor = dot(normalize(vNormal), LIGHT_DIRECTION);\n\t\tfloat intentsity = AMBIENT_INTENSITY + DIFFUSE_INTENSITY * diffuseFactor * diffuseFactor;\n\t\tvec4 textureColor = texture2D(uSampler, vTextureCoord);\n\t\tgl_FragColor = vec4(textureColor.rgb * intentsity, textureColor.a);\n\t}"}; +k.Oh=function(){return"attribute vec3 aVertexPosition;\n\tattribute vec3 aVertexNormal;\n\tattribute vec2 aTextureCoord;\n\n\tuniform mat4 uPMVMatrix;\n\n\tuniform mat3 uNMatrix;\n\n\tvarying vec2 vTextureCoord;\n\tvarying vec3 vNormal;\n\n\tvoid main(void)\n\t{\n\t\tgl_Position = uPMVMatrix * vec4(aVertexPosition, 1.0);\n\t\tvTextureCoord = aTextureCoord;\n\t\tvNormal = uNMatrix * normalize(aVertexNormal);\n\t}"};k.Vh=function(){Nv(this);this.ol=Ov(this,"aVertexNormal");this.We=Pv(this,"uSampler")}; +k.yj=function(){return this.We};function AB(a,b,c,d){let e=a.zj(b,c,0);const f=b.toString()+c.toString();let g;void 0===a.AA[f]?(g=[a.oh[e+0],a.oh[e+1],a.oh[e+2]],a.AA[f]=[g[0],g[1],g[2]]):g=[a.AA[f][0],a.AA[f][1],a.AA[f][2]];mat4.multiplyVec3(d,g,g);a.oh[e+0]=g[0];a.oh[e+1]=g[1];a.oh[e+2]=g[2];e=a.zj(b,c,1);a.oh[e+0]=g[0];a.oh[e+1]=g[1];a.oh[e+2]=g[2]}k.iz=function(){return this.ol}; +k.GJ=function(){for(let a=0;ab&&CB(a,e,0,.2*a.slideHeight(),b);.6<=b&&CB(a,f,.2*a.slideHeight(),-.7*a.slideHeight(),b);mat4.identity(g);mat4.translate(g,[0,0,-.3*a.slideHeight()*Math.sin(1.5*Math.PI*d)]);c=0==a.O?0:3;AB(a,c,0,g)} +function EB(a,b){for(var c=0;c.2*a.slideWidth()?BB(a,d,b):0:d.position().x()<.8*a.slideWidth()?BB(a,d,b):0;var e=a.Gq.gb[c],f=a,g=a.ZZ[c];let h;const l=new W;for(let n=0;4>n;n++){const m=new W;for(let p=0;4>p;p++){const r=new W;for(let v=0;2>v;v++){const y=f.zj(n,p,v);h=g[2][v];Wv(r,new W(f.oh[y+0]*h,f.oh[y+1]*h,f.oh[y+2]*h))}h=g[1][p];Wv(m,new W(r.x()*h,r.y()*h,r.z()*h))}h=g[0][n];Wv(l,new W(m.x()*h,m.y()*h,m.z()*h))}ew(e,l.add(new W(0, +0,d)));Tv(a.Gq.gb[c],new W)}a.GJ();for(b=0;b=parseFloat(Vb)?!1:Wi(),d=Xi();if(!Zs){const e={"null":function(h){return new $s(h)},Cut:function(h){return new Ix(h)},CutThroughBlack:function(h){return new Jx(h)}};c?(e.BlindsHorizontal=function(h){return new nw(h,1)},e.BlindsVertical=function(h){return new nw(h,pw)}):(e.BlindsHorizontal=function(h){return new uw(h,1)},e.BlindsVertical=function(h){return new uw(h,vw)});e.CheckerboardAcross=function(h){return new Jw(h,Nw)};e.CheckerboardDown=function(h){return new Jw(h, +Kw)};e.Dissolve=function(h){return new Kx(h)};e.FadeThroughBlack=function(h){return new Wx(h)};b&&2013>a&&2007!=a?(e.CoverLeft=function(h){return new Zw(h,hx,!1)},e.CoverUp=function(h){return new Zw(h,ex,!1)},e.CoverRight=function(h){return new Zw(h,ix,!1)},e.CoverDown=function(h){return new Zw(h,gx,!1)},e.CoverLeftUp=function(h){return new Zw(h,kx,!1)},e.CoverRightUp=function(h){return new Zw(h,mx,!1)},e.CoverLeftDown=function(h){return new Zw(h,jx,!1)},e.CoverRightDown=function(h){return new Zw(h, +lx,!1)},e.UncoverLeft=function(h){return new Zw(h,hx,!0)},e.UncoverUp=function(h){return new Zw(h,ex,!0)},e.UncoverRight=function(h){return new Zw(h,ix,!0)},e.UncoverDown=function(h){return new Zw(h,gx,!0)},e.UncoverLeftUp=function(h){return new Zw(h,kx,!0)},e.UncoverRightUp=function(h){return new Zw(h,mx,!0)},e.UncoverLeftDown=function(h){return new Zw(h,jx,!0)},e.UncoverRightDown=function(h){return new Zw(h,lx,!0)}):(e.CoverLeft=function(h){return new rx(h,hx,!1)},e.CoverUp=function(h){return new rx(h, +ex,!1)},e.CoverRight=function(h){return new rx(h,ix,!1)},e.CoverDown=function(h){return new rx(h,gx,!1)},e.CoverLeftUp=function(h){return new rx(h,kx,!1)},e.CoverRightUp=function(h){return new rx(h,mx,!1)},e.CoverLeftDown=function(h){return new rx(h,jx,!1)},e.CoverRightDown=function(h){return new rx(h,lx,!1)},e.UncoverLeft=function(h){return new rx(h,hx,!0)},e.UncoverUp=function(h){return new rx(h,ex,!0)},e.UncoverRight=function(h){return new rx(h,ix,!0)},e.UncoverDown=function(h){return new rx(h, +gx,!0)},e.UncoverLeftUp=function(h){return new rx(h,kx,!0)},e.UncoverRightUp=function(h){return new rx(h,mx,!0)},e.UncoverLeftDown=function(h){return new rx(h,jx,!0)},e.UncoverRightDown=function(h){return new rx(h,lx,!0)});e.RandomBarsHorizontal=function(h){return new $z(h,aA)};e.RandomBarsVertical=function(h){return new $z(h,bA)};e.StripsLeftUp=function(h){return new IA(h,KA)};e.StripsRightUp=function(h){return new IA(h,MA)};e.StripsLeftDown=function(h){return new IA(h,JA)};e.StripsRightDown=function(h){return new IA(h, +LA)};e.WipeLeft=function(h){return new GB(h,JB)};e.WipeUp=function(h){return new GB(h,IB)};e.WipeRight=function(h){return new GB(h,KB)};e.WipeDown=function(h){return new GB(h,HB)};e.BoxOut=function(h){return new yw(h,zw)};e.BoxIn=function(h){return new yw(h,Aw)};e.SplitHorizontalOut=function(h){return new DA(h,FA)};e.SplitHorizontalIn=function(h){return new DA(h,EA)};e.SplitVerticalOut=function(h){return new DA(h,HA)};e.SplitVerticalIn=function(h){return new DA(h,GA)};e.ShapeCircle=function(h){return new rA(h)}; +e.ShapeDiamond=function(h){return new sA(h)};e.CombHorizontal=function(h){return new Qw(h,Rw)};e.CombVertical=function(h){return new Qw(h,1)};e.FadeSmoothly=function(h){return new Vx(h)};e.Newsflash=function(h){return new wz(h)};e.ShapePlus=function(h){return new uA(h)};e.PushDown=function(h){return new Vz(h,Wz)};e.PushLeft=function(h){return new Vz(h,Xz)};e.PushRight=function(h){return new Vz(h,Yz)};e.PushUp=function(h){return new Vz(h,Zz)};e.Wedge=function(h){return new uB(h)};e.Wheel1Spoke=function(h){return new wB(h, +1)};e.Wheel2Spokes=function(h){return new wB(h,2)};e.Wheel3Spokes=function(h){return new wB(h,3)};e.Wheel4Spokes=function(h){return new wB(h,4)};e.Wheel8Spokes=function(h){return new wB(h,8)};e.WheelReverse1Spoke=function(h){return new wB(h,-1)};e.MorphByObject=function(h){return new vz(h)};e.MorphByWord=function(h){return new vz(h)};e.MorphByChar=function(h){return new vz(h)};b?d?(e.VortexLeft=function(h){return new nB(h,hB)},e.VortexUp=function(h){return new nB(h,1)},e.VortexRight=function(h){return new nB(h, +iB)},e.VortexDown=function(h){return new nB(h,jB)}):(e.VortexLeft=function(h){return new RA(h,hB)},e.VortexUp=function(h){return new RA(h,1)},e.VortexRight=function(h){return new RA(h,iB)},e.VortexDown=function(h){return new RA(h,jB)}):(e.VortexLeft=function(h){return new Kx(h)},e.VortexUp=function(h){return new Kx(h)},e.VortexRight=function(h){return new Kx(h)},e.VortexDown=function(h){return new Kx(h)});!d||Ni||ij?(e.RippleCenter=function(h){return new kA(h,lA)},e.RippleRightUp=function(h){return new kA(h, +oA)},e.RippleLeftUp=function(h){return new kA(h,mA)},e.RippleLeftDown=function(h){return new kA(h,nA)},e.RippleRightDown=function(h){return new kA(h,pA)}):(e.RippleCenter=function(h){return new qA(h,lA)},e.RippleRightUp=function(h){return new qA(h,oA)},e.RippleLeftUp=function(h){return new qA(h,mA)},e.RippleLeftDown=function(h){return new qA(h,nA)},e.RippleRightDown=function(h){return new qA(h,pA)});e.GlitterDiamondLeft=function(h){return new ly(h,qy,oy)};e.GlitterDiamondUp=function(h){return new ly(h, +qy,my)};e.GlitterDiamondRight=function(h){return new ly(h,qy,py)};e.GlitterDiamondDown=function(h){return new ly(h,qy,ny)};e.GlitterHexagonLeft=function(h){return new ly(h,1,oy)};e.GlitterHexagonUp=function(h){return new ly(h,1,my)};e.GlitterHexagonRight=function(h){return new ly(h,1,py)};e.GlitterHexagonDown=function(h){return new ly(h,1,ny)};b?(e.GalleryLeft=function(h){return new hy(h,jy,!1)},e.GalleryRight=function(h){return new hy(h,ky,!1)}):(e.GalleryLeft=function(h){return new Vz(h,Xz)},e.GalleryRight= +function(h){return new Vz(h,Yz)});b?(e.ConveyorLeft=function(h){return new hy(h,jy,!0)},e.ConveyorRight=function(h){return new hy(h,ky,!0)}):(e.ConveyorLeft=function(h){return new Nz(h,Pz,!0)},e.ConveyorRight=function(h){return new Nz(h,Oz,!0)});e.DoorsVertical=function(h){return new Qx(h,Rx,!1,!0)};e.DoorsHorizontal=function(h){return new Qx(h,Sx,!1,!0)};e.WindowVertical=function(h){return new Qx(h,Rx,!0,2013>a)};e.WindowHorizontal=function(h){return new Qx(h,Sx,!0,2013>a)};e.WarpIn=function(h){return new qB(h, +rB,!1,!1)};e.WarpOut=function(h){return new qB(h,1,!1,!1)};e.FlyThroughIn=function(h){return new qB(h,rB,!0,!1)};e.FlyThroughOut=function(h){return new qB(h,1,!0,!1)};e.FlyThroughInBounce=function(h){return new qB(h,rB,!0,!0)};e.FlyThroughOutBounce=function(h){return new qB(h,1,!0,!0)};e.RevealSmoothLeft=function(h){return new dA(h,gA)};e.RevealSmoothRight=function(h){return new dA(h,fA)};e.RevealBlackLeft=function(h){return new dA(h,eA)};e.RevealBlackRight=function(h){return new dA(h,3)};e.Honeycomb= +function(h){return new zy(h)};b?(e.FerrisWheelLeft=function(h){return new Yx(h,0)},e.FerrisWheelRight=function(h){return new Yx(h,Zx)}):(e.FerrisWheelLeft=function(h){return new Nz(h,Qz,!0)},e.FerrisWheelRight=function(h){return new Nz(h,Qz,!0)});const f=2013<=a?QA:NA,g=2013<=a?dy:by;e.SwitchLeft=function(h){return new f(h,0,c)};e.SwitchRight=function(h){return new f(h,OA,c)};e.FlipLeft=function(h){return new g(h,0,c)};e.FlipRight=function(h){return new g(h,cy,c)};e.Flashbulb=function(h){return new $x(h)}; +c?(e.ShredStripsIn=function(h){return new xA(h,0)},e.ShredStripsOut=function(h){return new xA(h,CA)},e.ShredRectangleIn=function(h){return new xA(h,yA)},e.ShredRectangleOut=function(h){return new xA(h,zA)}):(e.ShredStripsIn=function(h){return new Kx(h)},e.ShredStripsOut=function(h){return new Kx(h)},e.ShredRectangleIn=function(h){return new Kx(h)},e.ShredRectangleOut=function(h){return new Kx(h)});e.CubeLeft=function(h){return new yx(h,Bx,!1,c)};e.CubeUp=function(h){return new yx(h,Ax,!1,c)};e.CubeRight= +function(h){return new yx(h,Cx,!1,c)};e.CubeDown=function(h){return new yx(h,zx,!1,c)};e.RotateLeft=function(h){return new yx(h,Bx,!0,c)};e.RotateUp=function(h){return new yx(h,Ax,!0,c)};e.RotateRight=function(h){return new yx(h,Cx,!0,c)};e.RotateDown=function(h){return new yx(h,zx,!0,c)};c?(e.BoxLeft=function(h){return new Fw(h,Iw,!1)},e.BoxUp=function(h){return new Fw(h,0,!1)},e.BoxRight=function(h){return new Fw(h,Gw,!1)},e.BoxDown=function(h){return new Fw(h,Hw,!1)},e.OrbitLeft=function(h){return new Fw(h, +Iw,!0)},e.OrbitUp=function(h){return new Fw(h,0,!0)},e.OrbitRight=function(h){return new Fw(h,Gw,!0)},e.OrbitDown=function(h){return new Fw(h,Hw,!0)}):(e.BoxLeft=function(h){return new Vz(h,Xz)},e.BoxUp=function(h){return new Vz(h,Zz)},e.BoxRight=function(h){return new Vz(h,Yz)},e.BoxDown=function(h){return new Vz(h,Wz)},e.OrbitLeft=function(h){return new Nz(h,Pz,!0)},e.OrbitUp=function(h){return new Nz(h,3,!0)},e.OrbitRight=function(h){return new Nz(h,Oz,!0)},e.OrbitDown=function(h){return new Nz(h, +Qz,!0)});e.PanLeft=function(h){return new Nz(h,Pz,2013>a)};e.PanUp=function(h){return new Nz(h,3,2013>a)};e.PanRight=function(h){return new Nz(h,Oz,2013>a)};e.PanDown=function(h){return new Nz(h,Qz,2013>a)};d?(e.AirplaneLeft=function(h){return new kw(h,lw)},e.AirplaneRight=function(h){return new kw(h,1)},e.OrigamiLeft=function(h){return new Bz(h,Dz)},e.OrigamiRight=function(h){return new Bz(h,Hz)},e.DrapeLeft=function(h){return new Tx(h,Ux)},e.DrapeRight=function(h){return new Tx(h,1)},e.FallOverLeft= +function(h){return new Xx(h,0)},e.FallOverRight=function(h){return new Xx(h,1)},e.Curtains=function(h){const l=new Hx(h);return l.HR()?l:new Vx(h)},e.Fracture=function(h){return new ey(h)},e.Crush=function(h){return new tx(h)},e.WindRight=function(h){return new yB(h,0)},e.WindLeft=function(h){return new yB(h,1)},e.PeelOffLeft=function(h){return new Rz(h,Sz)},e.PeelOffRight=function(h){return new Rz(h,1)},e.Prestige=function(h){const l=new Tz(h);return l.HR()?l:new Vx(h)},e.PageCurlDoubleLeft=function(h){return new Lz(h, +0)},e.PageCurlDoubleRight=function(h){return new Lz(h,1)},e.PageCurlSingleLeft=function(h){return new Lz(h,2)},e.PageCurlSingleRight=function(h){return new Lz(h,3)}):(e.AirplaneLeft=function(h){return new Vx(h)},e.AirplaneRight=function(h){return new Vx(h)},e.OrigamiLeft=function(h){return new Vx(h)},e.OrigamiRight=function(h){return new Vx(h)},e.DrapeLeft=function(h){return new Vx(h)},e.DrapeRight=function(h){return new Vx(h)},e.FallOverLeft=function(h){return new Vx(h)},e.FallOverRight=function(h){return new Vx(h)}, +e.Curtains=function(h){return new Vx(h)},e.Fracture=function(h){return new Vx(h)},e.Crush=function(h){return new Vx(h)},e.WindRight=function(h){return new Vx(h)},e.WindLeft=function(h){return new Vx(h)},e.PeelOffLeft=function(h){return new Vx(h)},e.PeelOffRight=function(h){return new Vx(h)},e.Prestige=function(h){return new Vx(h)},e.PageCurlDoubleLeft=function(h){return new Vx(h)},e.PageCurlDoubleRight=function(h){return new Vx(h)},e.PageCurlSingleLeft=function(h){return new Vx(h)},e.PageCurlSingleRight= +function(h){return new Vx(h)});e.Zoom=function(h){return new MB(h)};Zs=e}} +var Zs,Ys=[["PushUp","PushLeft","PushRight","PushDown"],["ShapePlus","ShapeCircle","ShapeDiamond"],["BlindsVertical","BlindsHorizontal"],["BoxIn","BoxOut"],["CheckerboardAcross","CheckerboardDown"],["Flashbulb"],["WipeDown","WipeUp","WipeLeft","WipeRight"],["RandomBarsVertical","RandomBarsHorizontal"],["FadeSmoothly","FadeThroughBlack"],["null"],["Cut","CutThroughBlack"],["CombHorizontal","CombVertical"],["Dissolve"],["FlyThroughIn","FlyThroughOut","FlyThroughInBounce","FlyThroughOutBounce"],["WarpIn", +"WarpOut"],["Newsflash"],["BoxLeft","BoxUp","BoxRight","BoxDown"],["OrbitUp","OrbitDown","OrbitLeft","OrbitRight"],["WindowHorizontal","WindowVertical"],["DoorsHorizontal","DoorsVertical"],["FerrisWheelLeft","FerrisWheelRight"],["SwitchLeft","SwitchRight"],["GalleryLeft","GalleryRight"],["RippleCenter","RippleRightUp","RippleLeftUp","RippleLeftDown","RippleRightDown"],["VortexLeft","VortexRight","VortexUp","VortexDown"],["ShredStripsIn","ShredStripsOut","ShredRectangleIn","ShredRectangleOut"],["FlipLeft", +"FlipRight"],"CoverLeft CoverUp CoverRight CoverDown CoverLeftUp CoverRightUp CoverLeftDown CoverRightDown".split(" "),"UncoverDown UncoverLeft UncoverLeftDown UncoverLeftUp UncoverRight UncoverRightDown UncoverRightUp UncoverUp".split(" "),["StripsLeftDown","StripsLeftUp","StripsRightDown","StripsRightUp"],["Honeycomb"],["SplitVerticalIn","SplitVerticalOut","SplitHorizontalIn","SplitHorizontalOut"],"Wedge Wheel1Spoke Wheel2Spokes Wheel3Spokes Wheel4Spokes Wheel8Spokes WheelReverse1Spoke".split(" "), +["RevealSmoothLeft","RevealSmoothRight","RevealBlackLeft","RevealBlackRight"],["CubeLeft","CubeUp","CubeRight","CubeDown"],["RotateLeft","RotateUp","RotateRight","RotateDown"],"GlitterDiamondDown GlitterDiamondUp GlitterDiamondLeft GlitterDiamondRight GlitterHexagonDown GlitterHexagonUp GlitterHexagonLeft GlitterHexagonRight".split(" "),["ConveyorLeft","ConveyorRight"],["PanLeft","PanUp","PanRight","PanDown"],["AirplaneLeft","AirplaneRight"],["OrigamiLeft","OrigamiRight"],["DrapeLeft","DrapeRight"], +["FallOverLeft","FallOverRight"],["Curtains"],["Fracture"],["Crush"],["WindRight","WindLeft"],["PeelOffLeft","PeelOffRight"],["Prestige"],["PageCurlDoubleLeft","PageCurlDoubleRight","PageCurlSingleLeft","PageCurlSingleRight"]];function OB(){}k=OB.prototype;k.MG=null;k.NG=null;k.start=function(a,b,c,d){b=jd(b[0],8);const e={};e.family=a;e.bold=!0===c;e.italic=!0===d;this.MG=new PB(e,"arial,'URW Gothic L',sans-serif",b);this.NG=new PB(e,"Georgia,'Century Schoolbook L',serif",b)};k.finish=function(){this.MG.Xc();this.MG=null;this.NG.Xc();this.NG=null};k.check=function(){return QB(this.MG)||QB(this.NG)}; +function PB(a,b,c){var d=w(a,"family","");d=String(d);const e=['"'];for(let n=0;ng)l=f;else if(l=f,l in id)l=id[l];else if(l in hd)l=id[l]=hd[l];else{g=l.charCodeAt(0);if(31g)f=l;else{if(256>g){if(f="\\x",16>g||256g&&(f+="0");f+=g.toString(16).toUpperCase()}l=id[l]=f}e[h]=l}e.push('"');d=e.join("");this.pt=zd("span");this.pt.innerHTML=c;F(this.pt,{position:"absolute",top:"-999px", +left:"-999px",fontSize:"100px",fontFamily:b,fontWeight:w(a,"bold",!1)?"bold":"normal",fontStyle:w(a,"italic",!1)?"italic":"normal",opacity:"0"});document.body.appendChild(this.pt);this.MW=Qh(this.pt).width;F(this.pt,"fontFamily",d+","+b)}PB.prototype.Xc=function(){Fd(this.pt)};function QB(a){return!!a.MW&&Qh(a.pt).width!=a.MW};var RB={};function SB(a,b,c,d){d=d||c;let e="",f=!1,g=!1;"string"!==typeof a?(e=w(a,"family",""),f=w(a,"bold",!1),g=w(a,"italic",!1)):e=a;e=e.replace(/^"|"$/g,"");if(e in RB)(RB[e]?c:d)();else{var h=h||5E3;var l=new OB;l.start(e,b,f,g);var n=Date.now(),m=setInterval(()=>{let p=!1,r=!1;l.check()?r=p=!0:Date.now()-n>h&&(p=!0,r=!1);p&&(clearInterval(m),l.finish(),r?c():d&&(Ga(`can't preload font ${a&&a.family}`),d()))},50)}} +function TB(a,b){Array.isArray(b)||(b=[b]);const c=[];u(b,d=>{c.push(d.M8+"('"+d.src()+"')"+(d.format()?" format('"+d.format()+"')":""))});return`@font-face { + font-family: '${a}'; + src: ${c.join(",")}; + ${""} + ${""} + }`}function UB(a,b){this.M8=a;this.Af=b;this.M3=null}UB.prototype.src=function(){return this.Af};UB.prototype.format=function(){return this.M3};function VB(a,b){b=a.w7.create(b);B(a,b);z(a,b.nG,a.k6,a);return b}function WB(a){"normal"==a.Gb&&bv(a.Wm,a.Fa);cv(a.Wm,b=>{if(b instanceof fv){const c="normal"==a.Gb?"":"none";b.displayObject().style.display=c}})} +class XB extends wg{constructor(a,b,c){super();this.Ue=a;this.F=b;this.Qi=c;this.Gb="normal";this.ph=new C;this.Fa=this.nc();this.hl=this.nc("slidesBackground");this.Fe=this.nc();this.Qe=new lt(this);this.mt=this.nc();this.Rf=this.nc("frontLayers");this.Fa.appendChild(this.hl);this.Fa.appendChild(this.Fe);a=this.Qe.displayObject();this.Fa.appendChild(a);this.Fe.appendChild(this.mt);this.Fe.appendChild(this.Rf);this.Fe.style.display="none";this.vc=YB(this.Ue.Ix(),{AR:this.mt,width:this.F.slideWidth(), +height:this.F.slideHeight(),Oaa:Number.MAX_VALUE,backgroundColor:"#000000",SR:this.Gb});a=new sv;this.Ge=new qv(this.F,this.vc,a,this.F.slideWidth(),this.F.slideHeight(),this.Rf);c=new gv;var d=new pv(this.vc,this.F.slides(),c,this.Qi);this.B=new Rs(this.F,this.vc,this.Ue.Ix().Ye,d,c,this.Ue,this.Ge,a,this.Qi);z(this,this.B.Bc(),this.Dj,this);z(this,this.B.Dr,this.kJ,this);a=this.B;this.Ue.hL.vt.addHandler(a.D5,a);z(this,this.B.sJ,this.k5,this);z(this,this.B.Dr,this.i5,this);this.tc=new Q(this.B, +this.F);this.w7=new Lu({Ba:this.F,uba:this.Ue,YH:this.Fa,MI:this.hl,wi:this.Fe,Vq:this.Qe,va:this.Rf,II:this.mt,W:this.B,Eca:this.Ge,Pm:this.vc});this.Gj=VB(this,"normal");b=b.fonts();a=$g||Ib;c=[];for(d=0;d{this.UK.C(iC())},!1,this)}};function $B(a,b){a.LL!=b&&((a.LL=b)&&a.Kz.enabled()?(ve(document,"keydown",a.Nv,!1,a),ve(document,"keyup",a.TV,!1,a)):(De(document,"keydown",a.Nv,!1,a),De(document,"keyup",a.TV,!1,a)))} +function lC(a,b){const c=a.B;if(!(0>c.ma())){var d=c.Z(),e=a.M;0>a.sB&&(a.sB=Date.now(),a.Zl=d.Ag(),c.pause());a=(1+(Date.now()-a.sB)/1E3)*(b?1:-1);d=d.timestamp();b=e.mi(d,!1,!0);e=e.Io(Vc(b+a,0,e.wu()),!1,!0);a=c.Ud();e.L()>d.L()?1==a.U0()?c.lf(!1):nk(a):e.L(){let c=!1,d=!1;a.Sb().removeHandler(this.wb,this);a.Ag()||(d=(c=sC(this,a.timestamp()))&&tC(this,a.timestamp()),this.ND=a.timestamp(),a.Sb().addHandler(this.wb,this));rC(this,a,c,d,!1)};this.NJ?b():setTimeout(b,0)};k.wb=function(a){var b=a.timestamp(),c;(c=!this.ND)||(c=this.ND,c=!(c.L()==b.L()&&c.Aa()==b.Aa()&&0>=Math.abs(c.ib()-b.ib())));c&&(this.ND=b,c=(b=sC(this,a.timestamp()))&&tC(this,a.timestamp()),rC(this,a,b,c,!0))}; +function sC(a,b){a=a.F.slides().ja(b.L());if(0>b.Aa())return!1;a=a.nb().pc(b.Aa());return b.ib()>=a.duration()}function tC(a,b){a=a.F.slides().ja(b.L());return b.Aa()==a.nb().count()-1}k.JM=function(a){this.remove(a)};k.HM=function(a){Ss(this.Ca,a.kd(),a)};function uC(a){this.gI=!1;this.rba=a}var qC=new uC(!1),vC=new uC(!0),wC=new uC(!0);function xC(a,b,c,d){this.M=a;this.X=b;this.zf=c;this.D=d;this.$l=new C;this.Fg=new C}k=xC.prototype;k.Pg=null;k.Be=!1;k.nl=!1;k.playing=function(){return this.D.playing()};k.kd=function(){return this.D.kd()};k.play=function(a){this.Uo(this.X.timestamp(),a||0)}; +k.Uo=function(a,b){this.LA();this.D.Cc().addHandler(this.tF,this);this.D.Fg.addHandler(this.Vp,this);this.Pg=a;this.nl=!1;this.Be=!0;this.D.activate();var c=this.D,d=c.ir;const e=this.M;a=(e.mi(this.X.timestamp(),!0,!1)-e.mi(a,!0,!1)+b)%this.zf.duration();d.call(c,a)};k.pause=function(){this.stop()};k.stop=function(){this.Be&&(this.Wl(),this.D.stop(),this.D.deactivate())};k.LA=function(){this.D.Cc().removeHandler(this.tF,this);this.D.Fg.removeHandler(this.Vp,this)}; +k.tF=function(){if("ended"==this.D.state()){let a=!0;if("untilNextSound"==this.zf.lm){const b=this.Pg.L();this.X.timestamp().L()>=b&&(this.D.seek(0),this.D.play(),a=!1)}a&&(this.Wl(),this.D.deactivate())}};k.Vp=function(){this.Fg.C(this);!this.kd()&&this.playing()&&this.nl&&this.D.pause()};k.w1=function(){this.nl=!1;this.D.play()};k.v1=function(){this.nl=!0;this.kd()||this.D.pause()};k.Wl=function(){this.Be&&(this.Be=!1,this.LA(),this.$l.C(this))};k.Vo=function(){return this.$l};(function(){if(Ob){var a=/Windows NT ([0-9.]+)/;return(a=a.exec(ub()))?a[1]:"0"}return Nb?(a=/1[0|1][_.][0-9_.]+/,(a=a.exec(ub()))?a[0].replace(/_/g,"."):"10"):Qb?(a=/Android\s+([^\);]+)(\)|;)/,(a=a.exec(ub()))?a[1]:""):Rb||Sb||Tb?(a=/(?:iPhone|CPU)\s+OS\s+(\S+)/,(a=a.exec(ub()))?a[1].replace(/_/g,"."):""):""})();function yC(a){return(a=a.exec(ub()))?a[1]:""}(function(){if($g)return yC(/Firefox\/([0-9.]+)/);if(Ib||Jb||Hb)return Vb;if(dh){if(Cb()||vb("Macintosh")){var a=yC(/CriOS\/([0-9.]+)/);if(a)return a}return yC(/Chrome\/([0-9.]+)/)}if(eh&&!Cb())return yC(/Version\/([0-9.]+)/);if(ah||bh){if(a=/Version\/(\S+).*Mobile\/(\S+)/.exec(ub()))return a[1]+"."+a[2]}else if(ch)return(a=yC(/Android\s+([0-9.]+)/))?a:yC(/Version\/([0-9.]+)/);return""})();function zC(a,b,c,d,e){eu.call(this,b,c,d,e);this.element=a}t(zC,eu);zC.prototype.mp=function(){};zC.prototype.cI=function(){this.mp();zC.Mb.cI.call(this)};zC.prototype.yl=function(){this.mp();zC.Mb.yl.call(this)};zC.prototype.Ro=function(){this.mp();zC.Mb.Ro.call(this)};function AC(a,b,c,d,e){if(2!=b.length||2!=c.length)throw Error("Start and end points must be 2D");zC.call(this,a,b,c,d,e)}t(AC,zC); +AC.prototype.mp=function(){var a;if(a=this.iD)void 0===this.OC&&(this.OC=Uh(this.element)),a=this.OC;this.element.style[a?"right":"left"]=Math.round(this.coords[0])+"px";this.element.style.top=Math.round(this.coords[1])+"px"};function BC(a,b,c,d,e){"number"===typeof b&&(b=[b]);"number"===typeof c&&(c=[c]);zC.call(this,a,b,c,d,e);if(1!=b.length||1!=c.length)throw Error("Start and end points must be 1D");this.VH=CC}t(BC,zC);var DC=1/1024,CC=-1;k=BC.prototype; +k.mp=function(){var a=this.coords[0];Math.abs(a-this.VH)>=DC&&(H(this.element,a),this.VH=a)};k.Ro=function(){this.VH=CC;BC.Mb.Ro.call(this)};k.yl=function(){this.VH=CC;BC.Mb.yl.call(this)};k.show=function(){this.element.style.display=""};k.Oc=function(){this.element.style.display="none"};function EC(a,b,c){BC.call(this,a,1,0,b,c)}t(EC,BC);function FC(a,b,c){BC.call(this,a,0,1,b,c)}t(FC,BC);class GC extends zC{constructor(a,b,c){super(null,[b],[c],200);this.P=a}mp(){this.P.Hf(this.coords[0])}};class HC extends P{constructor({ga:a,G:b,U_:c,nI:d,v_:e,tabIndex:f,Sha:g,toggle:h,rf:l}){super({ga:a,G:b,U_:c,nI:d,v_:e,tabIndex:f,Yb:"BUTTON",V9:!0,rf:l});g&&(a=g.top,b=g.right,c=g.bottom,g=g.left,this.ki=new P,N(this,this.ki),L(this.ki,"position","absolute"),L(this.ki,"top",a?`${-a}px`:0),L(this.ki,"right",b?`${-b}px`:0),L(this.ki,"bottom",c?`${-c}px`:0),L(this.ki,"left",g?`${-g}px`:0));(this.d9=h)&&this.Ac(!1);this.ny()}Ac(a){this.pf("pressed",a)}selected(){return!1}yh(){}pressed(){return"true"== +jt(this.P,"pressed")}la(a){super.la(a);this.ki&&this.Ff(this.ki,0)}gp(a){super.gp(a);this.ki&&this.Ff(this.ki,0)}};class IC extends P{constructor(a,b){super({G:"bookmark"});this.D=a;this.uy=b;this.J(!1);a.duration()?this.nv():Qe(this,a.mV,this.nv,this);x(this,this.displayObject(),Km,this.O5,this,!1)}nv(){L(this,"left",`${this.uy.time()/this.D.duration()*100}%`);this.J(!0)}O5(a){a.stopPropagation();this.D.seek(this.uy.time());return yn(this.displayObject().parentNode)}};function JC(a,b){null!==b&&0>b&&(b=null);null!==a.gi&&a.rb[a.gi].yh(!1);a.gi=b;null!==b&&a.rb[b].yh(!0);if(null!==a.gi){var c=a.rb[a.gi];b=c.displayObject().offsetTop;c=b+c.displayObject().offsetHeight;Gt(a,b,c)}}function KC(a,b){b=a.HF.indexOf(b);JC(a,0<=b?b:null)}class LC extends P{constructor({G:a,rf:b,options:c}){super({G:a,rf:b});this.nf("listbox");L(this,"position","absolute");this.HF=c.slice();Object.freeze(this.HF);this.rb=[];this.gi=null;this.$N=E(this)}options(){return this.HF}};class MC extends LC{constructor({G:a,options:b,M_:c}){super({G:a,options:b});for(const d of b){const e=c(d);e.nf("option");e.yh(!1);Ft(e,O(this,"item"));N(this,e);this.rb.push(e);z(this,e.ka,()=>{JC(this,this.rb.indexOf(e));this.$N.C()})}}$a(a,b){super.$a(a,b);this.rb.forEach(c=>c.ub())}};const NC=[{value:.75,toString:()=>"0.75x"},{value:1,toString:()=>"1x"},{value:1.25,toString:()=>"1.25x"},{value:1.5,toString:()=>"1.5x"},{value:2,toString:()=>"2x"}];function OC(a){const b=NC.find(c=>("number"===typeof a.gi?a.HF[a.gi]:null)==c.toString());return b?b.value:null}function PC(a,b){const c=NC.find(d=>d.value==b);KC(a,c?c.toString():null)} +class QC extends MC{constructor(a){super({G:"playback-rate-menu",options:NC.map(c=>c.toString()),M_:c=>{const d=new P({xI:!0});d.la(c);return d}});const b=new P({ga:O(this,"caption")});b.la(a.ha("PB_PLAYBACK_RATE_MENU_CAPTION",{},"Rate"));N(this,b,0)}};class RC extends MC{constructor(a,b){super({G:"subtitles-list",options:[b.ha("PB_SUBTITLES_OFF",{},"Off"),...a],M_:c=>{const d=new P({xI:!0});d.la(c);return d}});a=new P({ga:O(this,"caption")});a.la(b.ha("PB_SUBTITLES_MENU_CAPTION",{},"Subtitles"));N(this,a,0)}};function SC(a,b){void 0===b&&(b=a.D.muted()?0:a.D.volume());L(a.eT,"height",`${100*(1-b)}%`);return yn(a.displayObject())} +class TC extends P{constructor(a){super({G:"volume_popup"});this.D=a;this.QB=new P({G:"volume"});N(this,this.QB);this.eT=new P({G:"back"});N(this.QB,this.eT);SC(this,this.D.volume());z(this,this.D.fF,()=>SC(this));z(this,this.D.pP,()=>SC(this));x(this,this.QB.displayObject(),Km,this.b7,this)}b7(a){x(this,document,Mm,this.EF,this);x(this,document,Lm,this.GW,this);this.EF(a);this.D.Zj(!1)}EF(a){this.visible()&&(a=Lh(a,this.QB.displayObject()).y,a=Math.min(1,a/this.QB.height()),a=Math.max(0,a),a=1-a, +this.D.setVolume(a),SC(this,a))}GW(a){Ne(this,document,Mm,this.EF,this);Ne(this,document,Lm,this.GW,this);this.EF(a)}};function UC(a){const b=new HC({G:"play",toggle:!0});b.ik(!0);z(a,b.ka,()=>a.D.playing()?a.D.pause():a.D.play());return b} +function VC(a){if(a.Nw){const b=new HC({G:"rate",toggle:!0});b.ik(!0);b.fa("subtitle-button-next",WC(a));const c=new QC(a.I);c.J(!1);c.fa("subtitle-button-next",WC(a));PC(c,a.D.playbackRate());z(a,b.ka,()=>{if(c.visible()){const d=new BC(c.displayObject(),1,0,150);d.play();Me(a,d,"finish",()=>{c.J(!1);b.Ac(!1);wt(b.displayObject(),"selected")})}else XC(a,{button:b,jr:c,N0:()=>{b.Ac(!1);wt(b.displayObject(),"selected")}}),b.Ac(!0),vt(b.displayObject(),"selected")});z(a,c.$N,()=>{a.D.jk(OC(c));c.J(!1)}); +return{V0:b,W0:c}}return{V0:null,W0:null}}function YC(a){const b=new HC({G:"mute",toggle:!0});b.ik(!0);const c=new TC(a.D);c.J(!1);z(a,b.ka,()=>{const d=!a.D.muted();a.D.Zj(d);b.Ac(d);d?vt(b.displayObject(),"selected"):wt(b.displayObject(),"selected")});z(a,a.D.fF,()=>{const d=a.D.muted();b.Ac(d);d?vt(b.displayObject(),"selected"):wt(b.displayObject(),"selected")});x(a,b.displayObject(),"mouseover",()=>{c.visible()||XC(a,{button:b,jr:c})});return{Waa:b,Oca:c}} +function ZC(a,b){var c=a.l7.displayObject(),d=a.wa.width()-2;a=Lh(b,c).x/a.KN*a.qa;d=Math.min(1,a/d);return d=Math.max(0,d)}function $C(a){function b(e){e=e.toString();1==e.length&&(e="0"+e);return e}a=Math.round(a);const c=Math.floor(a/3600);a%=3600;const d=Math.floor(a/60);a%=60;return b(c)+":"+b(d)+":"+b(a)}function WC(a){return!!a.Cf&&!!aD(a.Cf).length} +function XC(a,{button:b,jr:c,N0:d}){c.J(!0);let e=new BC(c.displayObject(),0,1,150);e.play();let f=!1;x(a,document,Mm,g=>{g=bD({button:b,jr:c,V$:g});if(g==f){const h=parseFloat(Eh(c.displayObject(),"opacity"));e.stop();g?(f=!1,e=new BC(c.displayObject(),h,1,150),e.play()):(f=!0,e=new BC(c.displayObject(),h,0,150),e.play(),Me(a,e,"finish",()=>{c.J(!1);d&&d()}))}})} +function cD(a){const b=new HC({G:"subtitles",toggle:!0});b.ik(!0);z(a,b.ka,()=>{a.Nj&&a.ji&&!a.Nj.visible()&&(XC(a,{button:a.ji,jr:a.Nj,N0:()=>{a.ji&&(a.ji.Ac(!1),wt(a.ji.displayObject(),"selected"))}}),a.ji.Ac(!0),vt(a.ji.displayObject(),"selected"))});a.ji=b;a.V(b)}function dD(a,b){b=new RC(b,a.I);b.J(!1);z(a,b.$N,()=>{if(a.Cf&&a.Nj){var c=(c=a.Nj.gi)?c-1:null;"number"===typeof c?a.Cf.select(c):a.Cf.show(!1);a.Nj.J(!1)}});a.Nj=b;a.V(b)} +function bD({button:a,jr:b,V$:c}){const d=Lh(c,b.displayObject());if(0>d.x||d.x>b.width()||0>d.y)return!1;b=Lh(c,a.displayObject());return 0>=b.y||0<=b.x&&b.x<=a.width()&&b.y<=a.height()} +class eD extends P{constructor({ic:a,uca:b,ia:c,Sj:d,mD:e}){super({G:"controls",HH:!0});this.D=a;this.Cf=b;this.I=c;this.Nw=e;this.fc=UC(this);N(this,this.fc);const {wba:f,zc:g}=this.Sr(d);this.l7=f;this.wa=g;N(this,this.wa);const {V0:h,W0:l}=VC(this);(this.WF=h)&&N(this,this.WF);(this.XF=l)&&N(this,this.XF);this.Nj=this.ji=null;this.Cf&&(this.QZ(),z(this,this.Cf.FS,this.QZ,this),z(this,this.Cf.HS,this.RZ,this));const {Waa:n,Oca:m}=YC(this);this.Y4=n;N(this,this.Y4);this.G9=m;N(this,this.G9);this.Gp= +this.XJ();N(this,this.Gp);this.wZ=new C;this.$U=new C;this.Tf=this.Zl=!1;this.KN=this.qa=1;z(this,this.D.Cc(),this.Ks,this);z(this,this.D.Rk,this.W5,this);yi(this.displayObject(),"left bottom")}locked(){return this.Tf}XJ(){const a=new HC({G:"toggle_fullscreen",toggle:!0});a.ik(!0);z(this,a.ka,()=>this.wZ.C());return a}Sr(a){const b=new P({G:"progress"}),c=new P({G:"loading"});N(b,c);const d=new P({G:"playing"});N(b,d);const e=new P({G:"tooltip"});e.J(!1);N(b,e);if(a)for(let f=0;f{L(c,"width",100*this.D.XH()+"%")});z(this,this.D.wf,()=>{L(d,"width",this.D.currentTime()/this.D.duration()*100+"%")});x(this,b,"mouseover",()=>{e.J(!0)});x(this,b,"mouseout",()=>{e.J(!1)});x(this,b,Mm,f=>{f=ZC(this,f);L(e,"left",`${100*f}%`);e.la($C(f*this.D.duration()))},this);x(this,b,Km,this.Rv,this);return{wba:d,zc:b}}QZ(){this.Nj&&(this.removeChild(this.Nj),this.Nj=null);WC(this)&&(this.ji||cD(this),dD(this,aD(this.Cf)));this.RZ()}RZ(){var a=WC(this); +this.ji&&this.ji.J(a);if(this.Nj){const b=this.Cf;a=a&&b.isVisible()?b.gt:null;JC(this.Nj,null==a?0:a+1)}}Rv(a){this.Tf=!0;x(this,document,Mm,this.Qv,this);x(this,document,Lm,this.AF,this);this.D.playing()&&(this.D.pause(),this.Zl=!0);this.Qv(a);a.preventDefault()}Qv(a){this.D.seek(ZC(this,a)*this.D.duration())}AF(a){Ne(this,document,Mm,this.Qv,this);Ne(this,document,Lm,this.AF,this);this.Qv(a);this.Zl&&(this.D.play(),this.Zl=!1);this.Tf=!1;this.$U.C()}Ks(){const a=this.D.playing();this.fc.Ac(a); +a?vt(this.fc.displayObject(),"selected"):wt(this.fc.displayObject(),"selected")}W5(){this.XF&&PC(this.XF,this.D.playbackRate())}};const fD=$g?{snapToLines:!1,line:83,lineAlign:"end"}:{snapToLines:!0,line:-4,lineAlign:"end"},gD=(a,b)=>{b?a.mode="showing":"showing"===a.mode&&(a.mode="hidden")},hD=a=>{for(let b=0;b{a.snapToLines=b.snapToLines;a.line=b.line;a.lineAlign=b.lineAlign},jD=a=>{if(a&&a.cues){const b=[];for(let c=0;c{this.select(hD(this.Yi));this.HS.C(this)};a=()=>{this.select(hD(this.Yi));this.FS.C(this)};this.Yi.onaddtrack=a;this.Yi.onremovetrack=a}select(a){this.gt=null!==a&&ac&&"SOURCE"==c.nodeName&&"video/mp4"==c.getAttribute("type"));b&&a.appendChild(b)}return new nD(a)} +function pD(a){if(!Ii){const b=a.mediaElement().getAttribute("poster");a.mediaElement().removeAttribute("poster");if(b)return a=new P({G:"poster"}),L(a,"background",`url(${b})`),L(a,"background-size","100% 100%"),a}return null}function qD(a){if(!Ii)if(a=a.mediaElement(),tj)rD(a);else if(!sj&&la(a.textTracks)&&void 0!==a.textTracks.length)return new mD(a.textTracks);return null} +function rD(a){const b=c=>c&&"TRACK"===c.nodeName&&c.hasAttribute("kind")?(c=c.getAttribute("kind"),!!c&&("captions"===c||"subtitles"===c)):!1;Pd(a,c=>c&&b(c)&&c.hasAttribute("default"))||(a=Pd(a,b))&&a.setAttribute("default","")};function kq(a,b){a.Vv=b;Bd(b,a.Za.displayObject());Ii&&sD(a,a.D.mediaElement().width,a.D.mediaElement().height);Ii&&(Fj?void 0!==window.TouchEvent&&window.event instanceof window.TouchEvent||window.event instanceof MouseEvent:1)&&(a.D.play(),a.D.pause());sj&&(a.Za.resize(a.Za.width()+1),Gi(()=>a.Za.resize(a.Za.width()-1)))} +function oq(a){a.Vv=null;if(Fd(a.Za.displayObject())&&Ii){const b=a.D,c=oD(a.A9);Cj?(a.Za.removeChild(b.mediaElement()),a.Za.V(c.mediaElement())):a.Za=new P({za:c.mediaElement()});ak(a,c);b.Xc()}}function Au(a,b){a.wj&&(b?a.EE||(a.EE=setInterval(()=>tD(a),100)):(clearInterval(a.EE),a.EE=void 0,a.Mx(!1)))} +function uD(a,b){const c=new eD({ic:a.D,uca:a.Cf,ia:a.I,Sj:b,mD:a.Nw});c.resize(a.D.mediaElement().width);c.Hf(0);c.wZ.addHandler(()=>{a.Mx(!a.Ql);return yn(c.displayObject())},a);c.$U.addHandler(()=>{a.cM||vD(a,!1)},a);ve(a.Za.displayObject(),"mouseenter",()=>{a.cM=!0;vD(a,!0)},!1,a);ve(a.Za.displayObject(),"mouseleave",()=>{a.cM=!1;c.locked()||vD(a,!1)},!1,a);return c} +function wD(a,b){if(a.Ve){const c=Vi()?"poster_frame_hide_video":"poster_frame";b?vt(a.Za.displayObject(),c):wt(a.Za.displayObject(),c);a.Ve.Hf(b?1:0);!b&&a.ZF&&(xD(a,a.ZF),a.ZF=void 0);Ib&&!Ii&&Th(a.D.mediaElement(),!b)}}function xD(a,b){a.Ve&&L(a.Ve,"background-image",`url(${b})`)} +function yD(a,b,c){a.Ve||(a.Ve=new P({G:"poster"}),L(a.Ve,"background-size","contain"),L(a.Ve,"background-position","center"),L(a.Ve,"background-repeat","no-repeat"),L(a.Ve,"position","absolute"),L(a.Ve,"top","0"),Ii?a.Za.displayObject().parentNode.appendChild(a.Ve.displayObject()):a.Za.V(a.Ve),a.Ve.resize(a.Za.width(),a.Za.height()));!c&&Ii&&a.Ve.opacity()?a.ZF=b:xD(a,b)} +function tD(a){var b=a.Za.displayObject().parentNode;if(b&&"none"!=b.style.display){var c=Qh(a.Za.displayObject());a.wj.resize(c.width);b=(b=sn(b))?b.md:1;b=tj||a.Ql?b*a.yN:b;a=a.wj;b&&(a.KN=b,b=a.width())&&(a.qa=Math.max(a.KN,240/b),c=Math.round(11/a.qa),L(a,"left",`${c}px`),L(a,"bottom",`${c}px`),b=Math.round(b*a.qa)-22,wn(a.displayObject(),1/a.qa),c=b-173,a.ji&&a.ji.visible()&&(c-=a.ji.width()),a.WF&&(c-=a.WF.width()),a.wa.resize(c),a.Zb(b))}} +function sD(a,b,c){const d=tj||a.Ql?1:a.yN,e=new gm;e.scale(1/d,1/d);on(a.Za.displayObject(),e);a.Za.resize(b*d,c*d)}function vD(a,b){var c=b?1:0;(new GC(a.wj,a.wj.opacity(),c)).play();a.Cf&&(b?(a=a.Cf,a.Eq||(a.Eq=jD(lD(a)))):kD(a.Cf))} +class zD extends ck{constructor(a,b,c,d=null){const e=oD(a);super(e);this.A9=a;this.I=new kt(d||{});this.Ve=pD(e);this.Cf=qD(e);this.wj=null;this.ZF=void 0;this.cM=this.Ql=!1;this.yN=1;this.bH=!1;this.EE=void 0;this.Vv=null;this.Nw=b;Ii?Cj?(this.Za=new P({G:"video_player"}),Ft(this.Za,"iphone"),this.Za.V(this.D.mediaElement()),this.Za.resize(this.D.mediaElement().width,this.D.mediaElement().height),c=this.D.mediaElement().getAttribute("poster"),this.D.mediaElement().removeAttribute("poster"),c&&(L(this.Za, +"background","url("+c+")"),L(this.Za,"background-size","100% 100%")),this.Jo(this.hj())):this.Za=new P({za:this.D.mediaElement()}):(a=this.hj(),super.Jo(!1),this.Za=new P({G:"video_player"}),this.wj=uD(this,c),this.Ve&&this.Za.V(this.Ve),this.Za.V(this.D.mediaElement()),this.Za.V(this.wj),this.Za.resize(this.D.mediaElement().width,this.D.mediaElement().height),this.Jo(a),ve(this.D.mediaElement(),"loadeddata",this.HE,!1,this));wD(this,!0);pj&&this.D.Cc().addHandler(f=>{"playing"==f.state()&&this.Vv&& +(f=this.Vv.style.opacity,this.Vv.style.opacity="0.99",this.Vv.style.opacity=f)},this)}Jo(a){this.wj?this.wj.J(a):Cj?a?wt(this.Za.displayObject(),"without_controls"):vt(this.Za.displayObject(),"without_controls"):this.D.Jo(a);a?this.bH||(ij?x(this,this.Za,"click",this.DF,this):z(this,this.Za.ka,this.DF,this),x(this,this.Za,"click",this.eZ,this),this.bH=!0):this.bH&&(ij?Ne(this,this.Za,"click",this.DF,this):Pe(this,this.Za.ka,this.DF,this),Ne(this,this.Za,"click",this.eZ,this),this.bH=!1)}hj(){return this.wj? +this.wj.visible():super.hj()}JP(){this.D&&this.D.JP()}$Q(){this.D&&this.D.$Q()}setScale(a){this.yN=a;sD(this,this.D.mediaElement().width,this.D.mediaElement().height)}videoWidth(){return this.D.videoWidth()}videoHeight(){return this.D.videoHeight()}resize(a,b){this.Za&&(sD(this,a,b),this.wj&&tD(this));const c=this.D.mediaElement();c.width=a;c.height=b;this.HE();this.Ve&&this.Ve.resize(this.Za.width(),this.Za.height())}Ch(a){a=super.Ch(a);this.HE();return a}HE(){if(Ib||Jb){var a=this.D.mediaElement(); +L(this.Za,"background","#000000");F(a,"width","");F(a,"height","");this.Ql||(a.videoWidth/a.videoHeight{d.Ch(e);a.Uo(b,0,!0)},0)}else a.Uo(b,0,!0)}function BD(a,b){if(a.AO){var c=a.D,d=a.M;var e=a.pm||0;var f=a.ye.duration();d=d.mi(a.X.timestamp(),!0,!1)-d.mi(a.Pg,!0,!1);d+=e;const g=Math.floor(d/f);e=g;f=d-g*f;a.UF=e;e=f-c.currentTime();c.playing()&&!b&&.01e?a.LG(f):c.seek(f)}}function CD(a){a.Db||a.D.deactivate()} +function DD(a){a.il=void 0;a.X.Sb().removeHandler(a.LS,a);a.X.Cc().removeHandler(a.KS,a);a.sz=!1;a.ML="ended";if(a.ye instanceof Zg){const b=a.D;a.ye.uI()&&b.stop();b.Mx(!1);a.ye.nQ()&&b.show(!1)}a.Fg.C(a);ED(a)}function ED(a){a.Wi&&(a.Wi=!1,jv(a.X,!1,a))} +class FD{constructor(a,b,c,d){this.M=a;this.X=b;this.ye=c;this.D=d;this.Pg=null;this.UF=0;this.pm=null;this.nl=this.Be=!1;this.$l=new C;this.Fg=new C;this.AO=!1;this.il=void 0;this.sz=this.Db=!1;this.ML="";this.Wi=!1;this.D.Cc().addHandler(this.tF,this);this.D.XA.addHandler(this.NX,this)}activate(){this.Db=!0;this.D.Db||this.D.activate()}deactivate(){this.D.playing()||this.D.deactivate();this.Db=!1}ic(){return this.D}playing(){return this.D.playing()}kd(){return this.Be&&(this.D.kd()||!this.D.bC())}play(a){this.Uo(this.X.timestamp(), +void 0!==a?a:null,!1)}Uo(a,b,c){this.LA();this.X.Sb().addHandler(this.wb,this);this.D.Fg.addHandler(this.Vp,this);this.D.vp.addHandler(this.Vp,this);this.D.Mw.addHandler(this.BW,this);this.Be=!0;this.nl=!1;this.AO=c;this.Pg=a;this.pm=null!=b?b:null;this.AO?(a=()=>{BD(this,!0);this.D.play();this.Vp()},gj&&!Ii?this.ye instanceof Zg?setTimeout(a,150):a():(ij&&this.D.Ch(this.D.src()),a())):null!=b?this.D.ir(b):this.D.play()}pause(){this.Wl();this.D.pause();CD(this)}stop(a){this.Wl();this.D.pause();const b= +this.ye instanceof Zg&&this.ye.uI();a=a||b?0:this.D.duration();this.D.seek(a);CD(this);DD(this)}LA(){this.X.Sb().removeHandler(this.wb,this);this.D.Fg.removeHandler(this.Vp,this);this.D.vp.removeHandler(this.Vp,this);this.D.Mw.removeHandler(this.BW,this)}wb(){if(this.Pg){var a=this.Pg;const d=this.X.timestamp();var b=d.L()-a.L(),c=0==b;a=c?d.Aa()-a.Aa():0;c=c&&0==a;0>b||0>a?b=!0:(a=this.ye.Fj,b=0>a?!c:b>a);b&&(this.Wl(),this.D.pause(),CD(this))}}tF(){const a=this.D.state();if("ended"==a){++this.UF; +let c=!1;const d=this.ye.lm;if("number"!==typeof d){var b=this.Pg;const e=this.X.timestamp();b=b.L()!=e.L()||b.Aa()!=e.Aa();switch(d){case "untilNextClick":c=!b;break;case "untilNextSlide":c=!0}}else c=this.UFa-this.D.currentTime()&&(this.D.wf.removeHandler(c,this),ED(this))},this))}zF(){this.il=this.X.timestamp();this.X.Sb().addHandler(this.LS,this);this.X.Cc().addHandler(this.KS,this);if(this.ye instanceof Zg){const a=this.D;a.show(!0);this.ye.NQ()&&a.Mx(!0);wD(a,!1)}}KS(){var a;if(a=this.Be)a:if(this.X.suspended()){a= +this.X.timestamp();if(0{Pa(a.wD,c)||(Fp(a,c).activate(),a.wD.push(c))},a);Gi(a.s3,a)} +function ct(a,b,c,d){if(a.vs.F_()){var e=KD(a,b);HD(a,b,e,!0);e.Uo(c,d)}}function MD(a,b){return"accessible"==a.Gb?null:a.F.slides().ja(b).ty} +class ND{constructor(a,b,c){this.Db=!1;this.F=a;this.ie=b;this.vs=c;this.X=null;this.zn=new pC(a);this.zE=this.Ll=this.Tu=this.Iu=null;this.Gb="normal";this.uO={};this.oB={};this.RO={};this.U=-1;this.Bw=qu(a.slides());this.NB=[];this.AU=new C;this.xU={};this.wD=[];a=this.ie;b=gk();b=new OD(b);z(a,b.ly,a.BF,a);this.z2=b}pR(a,b){this.X=a;this.zn.pR(a,b);a.Sb().addHandler(this.wb,this)}Mm(a){this.Gb=a;this.vs.Mm(a)}activate(){this.Db=!0;this.Ll&&AD(this.Ll,this.X.timestamp());this.Iu&&this.Iu.activate(); +const a=this.X.timestamp().L();0<=a&&LD(this,a)}wb(a){a=a.timestamp().L();a!=this.U&&this.Dj(a)}s3(){const a=this.X.timestamp().L(),b=this.F.slides().ja(a).Md().Sc();u(this.wD,c=>{Pa(b,c)||(Fp(this,c).deactivate(),Ra(this.wD,c))},this)}Dj(a){JD(this);this.Db&&LD(this,a);const b=(f,g)=>{for(let h=0;h{g.Mw.removeHandler(this.DW,this);Ra(d,g)});b(c,(f,g)=>{g.Mw.addHandler(this.DW, +this)});this.ie.IR();ZB(this,MD(this,a))}DW(a,b){var c=this.NB;Pa(c,a)||c.push(a);"play"==b&&this.AU.C(a)}};class PD{constructor(){this.Ib={};this.mS={};this.He=1}forEach(a){fc(this.Ib,a,this)}get(a){a=a.id();return this.Ib[a]}set(a,b,c){this.Ib[a.id()]=b;this.mS[a.id()]=c;b.setVolume(this.He*c)}XP(a){return a.id()in this.Ib}setVolume(a){if(this.He!=a){this.He=a;for(const b in this.Ib)this.Ib.hasOwnProperty(b)&&this.Ib[b].setVolume(this.He*this.mS[b])}}fI(){for(const a in this.Ib)this.Ib.hasOwnProperty(a)&&this.Ib[a].pause()}};class OD extends ik{constructor(a){super(a);this.gm=null}oR(a){this.gm!=a&&(a?this.Ch(a.Ht()[0].sources()):this.D.Ch(Hi()),this.gm=a)}};function Ju(a,b){a.qa=b;a.Ct.forEach(c=>{c.setScale(b)})}function QD(a){const b=a.An?0:a.He;b!=a.GN&&(a.GN=b,a.HX.C(),a.Cw.setVolume(b),a.Ct.setVolume(b))} +class RD extends wg{constructor(a){super();this.Ae=a;this.Cw=new PD;this.Ct=new PD;this.He=1;this.An=!1;this.GN=1;this.ql=E(this);this.HX=E(this);this.sV=E(this);this.WW=E(this);this.YY=E(this);this.D9=E(this);this.qa=1;this.I=null;z(this,this.Ae.Rk,this.IR,this)}jQ(a){var b=a.Di;a=a.volume();a=void 0!==a?a:1;if(this.Cw.XP(b))var c=this.Cw.get(b);else c=null,b.Mq()?c=rd(document,b.Mq()):b.pi()&&(c=Ad(Kc(b.pi()))),c=new ik(c),c.jk(this.Ae.playbackRate()),z(this,c.ly,this.BF,this),this.Cw.set(b,c,a); +return c}Dm(a){var b=a.Di,c=a.volume();a=a.Sj();c=void 0!==c?c:1;this.Ct.XP(b)?a=this.Ct.get(b):(a=new zD(b.pi(),this.Ae.mD(),a,this.I),z(this,a.ly,this.Q6,this),a.setScale(this.qa),a.jk(this.Ae.playbackRate()),this.Ct.set(b,a,c));return a}IR(){const a=this.Ae.playbackRate();this.Cw.forEach(b=>b.jk(a));this.Ct.forEach(b=>b.jk(a))}volume(){return this.He}setVolume(a){if(0>a||1new jk(d.S,d.s,d.t)),b.DB=!0;return b}function Ts(a,b){return b in a.wq?a.wq[b]:null}function qs(a,b,c){c?a.wq[b]=c:delete a.wq[b];a.ll=!0}function et(a,b){a.pl!=b&&(a.pl=b,a.ll=!0,a.EU.ix())}function Ns(a,b){a.us!=b&&(a.us=b,a.ll=!0)} +class VD{constructor(){this.us=null;this.pl=0;this.vm=null;this.vq={};this.wq={};this.ll=!1;this.EU=new TD(this.h4.bind(this));this.Aq=new C;this.DB=!1}tQ(){return this.us}nx(a){return a in this.vq?this.vq[a]:null}cR(){const a={};a.lastViewedSlide=this.us;a.viewDuration=this.pl;a.slideStates=rc(this.vq);this.vm&&(a.zoomState=this.vm.persistState());this.DB&&(a.slideTimelineStates=ic(this.wq,b=>b.cR()));return a}LP(a){this.us=a.us;this.pl=a.pl;this.vq=rc(a.vq);this.DB=a.DB;this.vm=a.vm?a.vm.LP():null; +this.wq=ic(a.wq,b=>b.clone());this.ll=!0}invalidate(){this.EU.W$()}h4(){this.ll&&(this.ll=!1,this.Aq.C())}stateChangedEvent(){return this.Aq}};function qq(a,b,c){a.Be()&&a.aE(a.LY,b,c)&&(b=a.F.settings().xu().HI(),c="quiz"==a.B.$().type(),b&&!c?b.open():a.B.$().SB()&&!uj&&wu(a))}function wu(a){const b=a.tc,c=b.Z(),d=a.F.settings().Pc().Fm(),e=b.PQ()&&0>b.Ug();c.started()||e?!d&&e?dt(a.Ya.zn):"bySlides"==a.F.settings().navigation().Gm().Tg()?b.lf():b.Lo():b.play()} +class WD{constructor(a,b){this.F=a;this.Ya=b;this.tc=this.B=null;this.LY=new C;this.y8=new C;this.z8=new C;this.x8=new C}Be(){return!!this.B&&0<=this.B.ma()}aE(a,b){const c=new Mn,d=Xa(Ua(arguments),1);a.C(...d.concat(c));return!c.actionPrevented()}};var XD=RegExp("^(?:([^:/?#.]+):)?(?://(?:([^\\\\/?#]*)@)?([^\\\\/?#]*?)(?::([0-9]+))?(?=[\\\\/?#]|$))?([^?#]+)?(?:\\?([^#]*))?(?:#([\\s\\S]*))?$");function YD(a,b,c){if(Array.isArray(b))for(var d=0;d{$D=!0;bE(a)&&a.wb(a.X)});const c=window.location.toString().match(XD)[1]||null;b.src="https"==c?"https://players.youku.com/jsapi":"http://player.youku.com/jsapi";document.body.appendChild(b)};function cE(a,b){this.$b=a;this.c_=b}k=cE.prototype;k.$b="";k.c_="";k.Ua=0;k.Na=0;k.Xi=0;k.ml=1;k.width=function(){return this.Ua};k.Zb=function(a){this.Ua=a};k.height=function(){return this.Na};k.Kd=function(a){this.Na=a};k.id=function(){return this.$b};k.Bi=function(){return this.c_};k.ib=function(){return this.Xi*this.ml};k.Al=function(a){this.ml=a};function dE(a,b,c){cE.call(this,a,b);this.PS=c}t(dE,cE);dE.prototype.PS="";dE.prototype.clientId=function(){return this.PS};function eE(a,b){this.D=null;this.tn=!1;this.Ab=a;this.fm=b;this.oq=new C;this.rc=zd("DIV");this.rc.style.position="absolute";a.displayObject().appendChild(this.rc);Th(this.rc,this.$g);this.Ef(a)}k=eE.prototype;k.tn=!1;k.$g=!1;k.GQ=function(){this.tn=!0;this.Dg(this.Ab);this.cB(this.$g);this.oq.C(this)};k.hba=function(){};k.gba=function(){};k.$h=function(){return this.tn&&null!=this.D};k.stop=function(){if(this.$h())try{this.D.pauseVideo()}catch(a){}};k.visible=function(){return this.$g}; +k.Dg=function(a){this.Ef(a);if(this.$h()){const c=this.sa;var b=a.scale();a=b*this.fm.width();b*=this.fm.height();Nh(c,a,b)}};k.Ef=function(a){a=a.position(this.fm.id(),1);Gh(this.rc,a.x,a.y)};k.FI=function(a){this.$g!=a&&(this.$g=a,this.cB(a))}; +k.cB=function(a){if(a){if(!this.D){var b=this.rc,c=this.Ab.scale();const e=this.fm,f={styleid:"0",client_id:e.clientId(),vid:e.Bi(),autoplay:!1,show_related:!1,events:{onPlayerReady:this.GQ.bind(this),onPlayStart:this.hba.bind(this),onPlayEnd:this.gba.bind(this)}},g="_"+e.id(),h=zd("DIV");h.setAttribute("id",g);var d=c*e.width();c*=e.height();Nh(h,d,c);F(h,"background","#494949");d=zd("DIV");F(d,"position","absolute");F(d,"top","50%");F(d,"left","50%");F(d,"transform","translate(-50%, -50%)");h.appendChild(d); +c=zd("DIV");mn(c,"preloader");F(c,"position","relative");d.appendChild(c);c=zd("DIV");Nd(c,"\u8bf7\u7a0d\u540e");F(c,"position","relative");F(c,"font-family",'Tahoma, Arial, Helvetica, "Microsoft YaHei New", "Microsoft Yahei", "\u5fae\u8f6f\u96c5\u9ed1", \u5b8b\u4f53, SimSun, STXihei, "\u534e\u6587\u7ec6\u9ed1", sans-serif');F(c,"font-weight","lighter");F(c,"font-size","32px");F(c,"color","white");F(c,"text-align","center");F(c,"margin-top","12px");d.appendChild(c);b.appendChild(h);this.sa=h;this.D= +new YKU.Player(g,f);this.Dg(this.Ab)}}else Cd(this.rc),this.D=null,this.tn=!1;Th(this.rc,a)};k.readyEvent=function(){return this.oq};var fE,gE=!1;q("onYouTubePlayerAPIReady",function(){gE=!0;var a=fE;bE(a)&&a.wb(a.X);fE=null});function hE(a,b){cE.call(this,a,b)}t(hE,cE);function iE(a,b){this.D=null;this.tn=!1;this.Ab=a;this.fm=b;this.oq=new C;this.rc=zd("DIV");this.rc.style.position="absolute";a.displayObject().appendChild(this.rc);Th(this.rc,this.$g);this.Ef(a)}k=iE.prototype;k.tn=!1;k.$g=!1;k.GQ=function(){this.tn=!0;this.Dg(this.Ab);this.cB(this.$g);this.oq.C(this)};k.jba=function(){};k.kba=function(){};k.iba=function(){};k.$h=function(){return this.tn&&null!=this.D};k.sa=function(){return this.$h()?this.D.getIframe():null};k.stop=function(){if(this.$h())try{this.D.stopVideo()}catch(a){}}; +k.visible=function(){return this.$g};k.Dg=function(a){this.Ef(a);const b=this.sa();if(b){var c=a.scale();a=c*this.fm.width();c*=this.fm.height();Nh(b,a,c)}};k.Ef=function(a){const b=this.fm.id();a=a.position(b,1);Gh(this.rc,a.x,a.y)};k.FI=function(a){this.$g!=a&&(this.$g=a,this.cB(a))}; +k.cB=function(a){if(a){if(!this.D){var b=this.rc,c=this.Ab.scale(),d=this.fm;c={width:c*d.width(),height:c*d.height(),videoId:d.Bi(),playerVars:{controls:1,loop:0,enablejsapi:1,autohide:2,autoplay:0,showinfo:1,rel:0},events:{onReady:this.GQ.bind(this),onPlaybackQualityChange:this.jba.bind(this),onStateChange:this.kba.bind(this),onError:this.iba.bind(this)}};d="_"+d.id();const e=zd("DIV");e.setAttribute("id",d);b.appendChild(e);this.D=new YT.Player(d,c);this.Dg(this.Ab)}}else Cd(this.rc),this.D=null, +this.tn=!1;Th(this.rc,a)};k.readyEvent=function(){return this.oq};function jE(a,b,c){this.Ib={};this.Ab=a;this.M=c;this.X=b;a.Le().addHandler(this.nA,this);b.Sb().addHandler(this.wb,this)}k=jE.prototype;k.U=-1;k.m_=!1;k.l_=!1;function kE(a,b,c){let d=0;if(0>b||b>=a.M.count())return d;a=a.M.ja(b);if(a instanceof Am)for(a=a.Xy,b=0;bb||b>=a.M.count())&&(b=a.M.ja(b),b instanceof Am)){b=b.Xy;for(let f=0;fa/tE.width||1>b)&&F(c,"backgroundSize","contain")}}; +k.Oc=function(){if(this.Qa)if(this.Qa=!1,this.KT){this.Ab.Le().removeHandler(this.VV,this);var a;null==(a=this.ev)||a.Xc();this.ev=null}else{const b=rE(this);b&&(a=sE(),nn(b,a),Cd(b))}};function qE(a){const b=a.Ab.scale(),c=a.$u;a.ev.setSize(c.width()*b,c.height()*b)}function pE(a){var b=document.getElementById(a.$u.containerId());const c=a.Ab.scale(),d=sn(b);if(d){var e=d.qe;b=d.re}else e=parseFloat(Eh(b,"left")),b=parseFloat(Eh(b,"top"));a=rd(a.ev.ld);Gh(a,e*c,b*c)}k.VV=function(){pE(this);qE(this)}; +function rE(a){if(a.lE)return a.lE;a.lE=rd(document,a.$u.containerId());return a.lE}var tE=new cd(74,89); +function sE(){if(void 0!==oE)return oE;const a="_sf"+ld();oE=a;gn("."+a+" {background: #A42222;}."+a+" div {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEoAAABZCAYAAACZkrJEAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwQAADsEBuJFr7QAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAFA0lEQVR4Xu3c21MTVxwHcP/B+iwyPimoT46WPulY6INDR3mwdhTojJeOgC1MMZHhoha85EJIMCg1CTXQJEsokJCEJJgbyc/fiW5nJ2NjCL/dPecYZ74zIYa9fPZ7zh4Y3SNHWn9aAi0BYoGZM2dhGuMd/OW/bHgW4a+RESDelVibc/T0QPDRI0hHo1CpVP43UY/n64Kabj8By9iWnUCgLkwt2lcD5er5ARIHxNFiSQ9l7/oO8ru7B2rP54ag1FBbOK/Um3cO8ndSQoVwcj4IQiOflQrKicMs+4W7VyMoUg89/+AgtqisW6Iet/jLg5AVh1oZkXRM1C04VNKP6yEdgdRtCw0Vw6tsBBLbh7BQYQOGm/YiCAm1OjRsWJOEHXoLuASolPcNT9S9INZdr5BKGo7ELoxQUBuzs6Ygxfx+eDM0JEajvN09UNnHIadj0ooCrwYGYPL0GTFQPverv0ISh5xOSO8sVpgSGUcFqw45HZDCuF1re7u47dE2ynH6rC5Itu5uOYBUrKwSQagSWfLJBEzI0iIVaflaHxmQim2XrUkMq4BXn7JNUiIF8DZNiRS0WOSak9Rhl08koFwqkSTu88mJFOgfIAFi0DkEnzguyRKgdoFJ2aa5b7vkbNOr77uxTUWSxH1v5URizcpEwiRIDFvaIUfZJt/9+/K2advlImlTLrEjLxIbdlRz01J/v7xQoYcWKBdxEj9kcjuStymPJ3hYpGa/fx2HvBD//M3DlgTFgmlZd82LAbWFB9qCaqDTZiKxfQvRqKWr10xtkzBQmXDIdChFhDnK7GHH9s891D/jD6FcwLudyVHmOb/r5eJxRMqbHmXeye/ywMsmcQ6Q2DFwDZUO4STegqq/eLJd6OIGietGbeLkyUubuIbiCYkdS4THyXy1uiQw/06nPQYuofbzOeAtYaeDr+VBcHycDGnx1i1g8WjixtfaLODXalz4Ws08vq7m5k1wYmYuX+YLiqpJKwjewC8lxPxIcPwPbNN7kvx29Ki8UPs5RCLIuoOz+YSytxt4chRIbBsTnZ1ytukJnhgVktRtSq2tQim3R5I53u5OVMPu7a/3oPQekQiSRHCq4+JqO49xyFEAqduQtk1725sIlSWJ4rDJ2abUWpAESIW2ynin2369BKU9bBJRInYJ27T92otAGdIMfSPRKtzadhy2EKmISJTx3rsrz9z09Px5yG7+C8UsIhEmg9vk6jbe7MFMdXSCYrOR4mihJ/ECNHtsXHwfa5Bie4lAad0Sxu1zcbKNHMQYTqJTHR3VOH/shcDYKA6xDd1wVPgM7qOR4+PiM8UMtsWkvOjtFQlqF6GMT/jlC3GQqv/9C5GMTvzdilhIZkE9aGsTECqNjTIwjy9dEg+p2qh0CqGMifPnG2IiGQm1eOeOuEhGQTluCNwkdRFX2E2CXklHFZi5eFHsJukNFV/xw/CxY3IgMaw8Noo67tu36wKN4rNRnPjkQzUz+NCa3/E9FvUCPsDXLFz8+PIRKoFQNIlhi0ZPnWr45BTNU54dCBfRfO0ZHgE7vscPVAqRDplYwA/TTcxFWhiGwnBUmElsmU0WqLXnz5oCUjFqG8Te/7OvD9yfwJbxIYAcNWoHG9V41j0LMHvlCskJ1DaKofw99wxUoDBPD2CvhxQL+GDt+RzYf7oOlnPnSHC0DdFCqcPsKT7MhoV9jiuosZMngWW0JtxUvnUgLQGpBD4AN9FCi/luT4wAAAAASUVORK5CYII=) no-repeat;background-position: center;}");return a} +;function uE(a,b,c,d){this.R=a;this.Ab=b;this.X=c;this.M=d;this.QK=[];c.Sb().addHandler(this.wb,this)}uE.prototype.U=-1;uE.prototype.wb=function(){var a=this.X.timestamp(),b=a.L();if(b!=this.U){if(0<=this.U){var c=this.M.ja(this.U);c instanceof Am&&vE(this,c,-1)}this.U=b}if(0<=b&&(c=this.M.ja(b),c instanceof Am)){b=c;const d=a.Aa();a=0>d?-1:b.nb().pc(d).startTime()+a.ib();vE(this,c,a)}}; +function vE(a,b,c){b=b.CK;for(let g=0;ge||e>=d.count())throw Error("index is out of range");d=d.$y[e];e=a;var f=d;const h=ma(f)+"";h in e.QK||(e.QK[h]=new nE(f,e.R,e.Ab));e=e.QK[h];c>=d.ib()?e.show():e.Oc()}};function wE(a){ei&&a.DT.addHandler(this.A5,this)}wE.prototype.A5=function(a,b){"string"!==typeof a&&(a=a.baseVal);this.$M(a)&&(b.OS=!0)};wE.prototype.$M=function(a){return(new di("openWindow",[a])).ix()};function xE(a,b,c,d){this.Qe=b;this.B=c;this.ie=d;this.eH=yE(a);this.oO=[];this.ZW={};this.SY={};this.P=zd("div");this.Qe.displayObject().appendChild(this.P);c.Z().Sb().addHandler(this.wb,this);b.Le().addHandler(this.c6,this)}k=xE.prototype;k.U=-1;k.Db=!1;k.activate=function(){this.Db=!0;const a=this.B.Z().timestamp();0<=a.L()&&0<=a.Aa()&&this.Dj(a.L())};function yE(a){return new su(a,b=>{b=b.$d();const c=[];for(let d=0;d{c.playbackStateChangedEvent().removeHandler(b.EM,b)});this.wz=[];this.Lp.audioStartedEvent().removeHandler(this.QV,this);this.Lp.videoStartedEvent().removeHandler(this.RV,this);this.DE=this.Lp=null}const a=this.B.Oa()||this.B.ob()||this.B.fb();a&&(this.Lp=a.mediaController())&&(this.Lp.audioStartedEvent().addHandler(this.QV,this),this.Lp.videoStartedEvent().addHandler(this.RV,this),this.DE=a.soundController(),this.NZ())}; +k.QV=function(a){a.ready()||a.readyEvent().addHandler(this.PV,this)};k.PV=function(a){a.readyEvent().removeHandler(this.PV,this);this.c4.C()};k.RV=function(a){Pa(this.wz,a)||(this.wz.push(a),a.playbackStateChangedEvent().addHandler(this.EM,this),this.f4.C())};k.EM=function(a){a.playing()||(a.playbackStateChangedEvent().removeHandler(this.EM,this),Ra(this.wz,a))};k.NZ=function(){this.DE&&this.DE.setVolume(this.Wb.KC())};function CE(){}CE.prototype.activate=function(){};class DE{constructor(a,b,c){const d=c.duration();b=new gf(b.index(),-1,0);const e=c.mi(b,!0,!1);a="untilNextSound"==a.lm?d:Math.min(d,e+a.duration());c=c.Io(a,!0,!1);this.Pi=new Ef([new Bf(new zf("play",b,0),b,c)])}HP(){return this.Pi}};function EE(a,b,c,d){this.M=a;this.Ya=b;this.bF=[];this.X=c;c.Cc().addHandler(this.Lv,this,1);for(b=0;b=ff(d,Cf(c.OQ).jc()),c.GR(d))}}} +EE.prototype.Lv=function(){this.X.Ag()&&this.hM&&(FE(this),this.hM=!1)};EE.prototype.qU=function(a){const b=this.M;for(var c=a.Md(),d=0;dff(c.jc(),d.jc()));return b}};function LE(a){this.pJ=new ME;this.IF={};a.YY.addHandler(this.BF,this)}t(LE,CE);LE.prototype.activate=function(){this.pJ.activate()};LE.prototype.BF=function(a,b){if(b){b=ma(a)+"";var c=a.ic();var d=this.pJ;var e=c.src();let f=null;0a;++a){const b=new hk(zd("audio"));this.Ib.push(b)}} +ME.prototype.activate=function(){u(this.Ib,a=>{a=a.mediaElement();a.play();a.pause()})};ME.prototype.release=function(a){this.Ib.push(a)};function NE(a,b){const c=OE(a,b);PE(c);c.deactivate();a.g9.C(b)}function OE(a,b){const c=ma(b)+"";c in a.PO||(a.PO[c]=a.h9.Tq(b,a.X,a.Ca));return a.PO[c]}function QE(a,b,c){if(a.Db){b=RE(a,b);for(let d=0;d=b&&c.push(e)}return c} +function TE(a,b,c){c=UE(a,c);const d=UE(a,b.jc());a=UE(a,b.jf())-d;return Vc(c-d,0,a)}function UE(a,b){return a.M.mi(b,!0,!1)} +class VE{constructor(a,b,c,d,e){this.M=a;this.X=b;this.Ca=c;this.h9=e;this.U=-1;this.fA=void 0;this.Db=this.LJ=!1;this.sm=this.EG(d);this.op=[];this.PO={};this.f9=new C;this.g9=new C;b.Sb().addHandler(this.wb,this);b.Cc().addHandler(this.Lv,this)}activate(){this.Db=!0;this.Lv(this.X)}iu(a){this.fA=a}P_(){this.op.forEach(a=>NE(this,a));this.op=[]}EG(a){const b=[];for(let c=0;cff(c.jc(),d.jc()));return b}Dj(a,b){this.LJ=!0;if(0<=this.U){const c=RE(this,this.U); +for(let d=0;d=ff(e.jf(),b)||0{c.xC()||d()},this)}Lv(a){if(this.Db){a.started()&& +QE(this,this.U,a.timestamp());var b=this.op;for(let e=0;ethis.oc.jk(f.playbackRate()))}mf(){return 1==this.oc.XH()}xC(){return this.tf||this.Wi||this.Et}LG(a){this.Wi||this.tf||(this.Wi=!0,jv(this.Ca,!0,this),this.U8=a,a=1E3*(a-this.oc.currentTime())+500,this.lZ=setTimeout(this.sY.bind(this),a),this.oc.wf.addHandler(this.MS,this))}sY(){clearTimeout(this.lZ); +this.lZ=void 0;this.oc.wf.removeHandler(this.MS,this);this.Wc||this.oc.pause();this.Wi=!1;jv(this.Ca,!1,this)}MS(){.1>this.U8-this.oc.currentTime()&&this.sY()}preload(a){const b=this.oc,c=WE(this);if(!c&&!this.vN){this.vN=!0;const d=this.q9.bind(this);setTimeout(d,300);Ji&&(this.TO=setInterval(d,1E3))}!a||b.bC()&&c||this.Et||(this.Et=!0,Ss(this.Ca,!0,this),b.vp.addHandler(this.NM,this))}q9(){XE(this);this.oc.ready()?clearInterval(this.TO):this.oc.load()}NM(){Ji&&1==this.oc.duration()?this.JS=setInterval(this.T2.bind(this), +200):PE(this)}T2(){1!=this.oc.duration()&&PE(this)}activate(){pr(this.OO,"activated");this.oc.Cc().addHandler(this.YV,this)}deactivate(){pr(this.OO,"deactivated");this.oc.Cc().removeHandler(this.YV,this);this.tf&&(this.tf=!1,Ss(this.Ca,!1,this));this.Wc=!1;this.oc.pause()}Lm(a,b,c){if(!this.tf||b){XE(this);var d=this.oc,e=a-d.currentTime(),f=b?.01:.5;e>f&&!b&&!this.tf&&!c?this.LG(a):Math.abs(e)>f&&d.dQ(a);this.Wc&&!this.oc.playing()&&this.oc.play()}}play(a){this.Wc||this.Et||(this.Lm(a,!this.oc.playing()), +this.Wc=!0,this.oc.play())}pause(){this.Wc&&(this.Wc=!1,this.tf||this.Wi||this.oc.pause())}YV(){var a=!1;"buffering"==this.oc.state()&&(a=!0);this.tf!=a&&(this.tf=a,pr(this.OO,a?"buffering":"activated"),Ss(this.Ca,a,this),a||this.Wc||this.oc.pause(),this.Fg.C())}XO(){this.oc.Ch(this.gX)}};class ZE extends YE{constructor(a,b,c,d,e){super(a,b,a.audio().sources(),c,d,e);this.Gr=b}};class $E{constructor(a,b){this.Gr=a;this.Ae=b}Tq(a,b,c){return new ZE(a,this.Gr,b,c,this.Ae)}};class aF{constructor(a){this.Ae=a}Tq(a,b,c){var d=gk();d=new ik(d);return new ZE(a,d,b,c,this.Ae)}};class bF extends VE{constructor(a,b,c,d,e,f){var g=gk();g=new ik(g);super(a,b,c,d,Ii?new $E(g,f):new aF(f));this.Gr=g;this.Wb=e;e.LC().addHandler(this.tm,this);this.tm()}activate(){if(Ii){const a=this.Gr.ic().mediaElement();a.src=Hi();a.play()}super.activate()}tm(){this.Gr.setVolume(this.Wb.KC())}ky(a){super.ky(a);Ii||(this.Gr=OE(this,a).Gr,this.tm())}};class cF extends YE{constructor({track:a,lD:b,Z:c,Ho:d,Xt:e,iI:f}){super(a,b,a.video().sources(),c,d,f);this.Hd=b;this.$v=e}lD(){return this.Hd}activate(a){super.activate(a);this.$v&&yD(this.Hd,this.$v,!0)}XO(){this.$v&&(yD(this.Hd,this.$v,!0),wD(this.Hd,!0),this.Hd.wf.addHandler(function b(){0!=this.Hd.currentTime()&&(this.Hd.wf.removeHandler(b,this),wD(this.Hd,!1))},this));super.XO()}};class dF{constructor(a){this.Ae=a}Tq(a,b,c){const d=new zD("",this.Ae.mD()),e=a.video().Xt();e&&yD(d,e,!0);return new cF({track:a,lD:d,Z:b,Ho:c,Xt:a.video().Xt(),iI:this.Ae})}};function eF(a){this.Hd=a;this.P=zd("div");kq(a,this.P)}eF.prototype.displayObject=function(){return this.P};eF.prototype.displayObject=eF.prototype.displayObject;eF.prototype.resize=function(a,b){this.Hd.resize(a,b)};eF.prototype.resize=eF.prototype.resize;eF.prototype.width=function(){return this.Hd.width()};eF.prototype.width=eF.prototype.width;eF.prototype.height=function(){return this.Hd.height()};eF.prototype.height=eF.prototype.height; +eF.prototype.QR=function(a){a.resize(this.Hd.width(),this.Hd.height());oq(this.Hd);this.Hd=a;kq(a,this.P)};eF.prototype.updatePlayer=eF.prototype.QR;class fF{constructor(a,b){this.Hd=a;this.Ae=b}Tq(a,b,c){return new cF({track:a,lD:this.Hd,Z:b,Ho:c,Xt:a.video().Xt(),iI:this.Ae})}};class gF extends VE{constructor(a,b,c,d,e,f){const g=new zD(ah&&10>lj?"":"",f.mD());super(a,b,c,d,Ii?new fF(g,f):new dF(f));this.Hd=g;this.pa=new eF(g);this.Wb=e;this.Wb.LC().addHandler(this.tm,this);this.tm();this.lX=new P;this.lX.Hf(0);document.body.appendChild(this.lX.displayObject())}activate(){if(Fj){const a=this.Hd.ic().mediaElement();a.src=Hi();a.play();a.pause()}super.activate()}view(){return this.pa}uN(a){super.uN(a);Ii&&(clearTimeout(this.p7), +a.length&&(this.p7=Gi(()=>{const b=a[0].video().Xt();b&&yD(OE(this,a[0]).lD(),b)},this,500)))}tm(){this.Hd.setVolume(this.Wb.KC())}ky(a){super.ky(a);Ii||(this.Hd=OE(this,a).lD(),this.pa.QR(this.Hd),this.tm())}}gF.prototype.view=gF.prototype.view;const hF={Rfa:"resumePlayback",Hea:"gotoSlide",Xda:"delayStartup"};class iF{constructor(a){this.Fw=a;this.Fd=0;this.Hl="gotoSlide";this.qp=!1}L(){return this.Fd}d1(a){this.Fd=a}action(){return this.Hl}fu(a){this.Hl=a}ff(){return this.qp}yI(a){this.qp=a}qca(){return this.Fw}}iF.prototype.startupController=iF.prototype.qca;iF.prototype.setAutoStart=iF.prototype.yI;iF.prototype.autoStart=iF.prototype.ff;iF.prototype.setAction=iF.prototype.fu;iF.prototype.action=iF.prototype.action;iF.prototype.setSlideIndex=iF.prototype.d1;iF.prototype.slideIndex=iF.prototype.L; +q("ispring.presenter.player.startup.PresentationStartup.Action",hF);q("RESUME_PLAYBACK","resumePlayback",hF);q("GOTO_SLIDE","gotoSlide",hF);q("DELAY_STARTUP","delayStartup",hF);function jF(a){return a.B2.some(b=>a.M7.some(c=>c(b)))} +class kF{constructor(a,b,c){this.F=a;this.B=b;b=this.slides;var d=c;c=[];do if(c.push(d),"slide"==d.type()&&d.rl()){var e=b;const f=d.fj().Oo();(d=f&&"gotoSlide"==f.type()?e.ja(f.L()):d.index()b.jc().L()<=a.index()&&b.jf().L()>=a.index())}C2(a){return!!a.ty}E2(a){return this.G8.some(b=>{a:{b:{var c=Kf(b,this.slides);if(0=b.L()&&a.index()<=c.L())){b={jc:b,jf:c};break b}b=null}if(c=b){b=c.jc;c=c.jf;if(a.index()==b.L()){if(0!!Df(Kf(c,this.slides),b))}return!1}D7(a){return a instanceof br?(a=this.W.kf(a.index()))?!a.Oa().autoStartAvailable():!0:!1}b8(a){return a instanceof Aq?(a=this.W.kf(a.index()))?!a.ob().autoStartAvailable():!0:!1}d4(a){return a instanceof sq?(a=this.W.kf(a.index()))?!a.fb().autoStartAvailable():!0:!1}};function lF(a,b,c,d,e){if(a.u7)throw Error("presentation was already started");if(e){var f=a.D;const l=f.Va.Ce;l.LP(e);et(l,0);e=f.F.slides();for(f=0;f{Ns(a.D.yH().Ce,b);a.D.pa.PH();const h=!(e instanceof Am);h&&f.Vj(b,0,0,!1);let l=!1;if(void 0===c){c=d.settings().Pc().ff();const n=new kF(d,f,e);c&&(Fj||Gj)&&jF(n)&&(c=!1,l=!0)}l&&Ls(f,()=>{pF(a.D,b,!1,l)});l&&!h&&f.Vj(b,0,0,!1);l||(us(f,b,c),pF(a.D,b,c,l))};if(e.mf())g();else{const h=f.Ho();Ss(h,!0,a);const l=a.D.yH().Ix().Ye,n=m=>{m===e&&(Ss(h,!1,a),l.gl.removeHandler(n),g())};l.gl.addHandler(n)}} +class qF{constructor(a,b){this.D=a;this.S8=b;this.cZ=this.u7=!1}start(a,b){lF(this,a,b,"gotoSlide")}resume(a,b){lF(this,a,b,"resumePlayback",this.S8)}}qF.prototype.resume=qF.prototype.resume;qF.prototype.start=qF.prototype.start;function rF(a,b,c){this.sa=null;this.zo=b;this.nN=c;b.iC()&&(this.rc=zd("DIV"),a.displayObject().appendChild(this.rc),this.rc.style.overflow="hidden",this.rc.style.position="absolute",Ni&&(this.rc.style["-webkit-overflow-scrolling"]="touch",this.rc.style.overflow="auto"),a=zd("IFRAME"),a.setAttribute("src",this.zo.url()),a.style.border=0,a.style.backgroundColor="#ffffff",a.setAttribute("webkitallowfullscreen",""),a.setAttribute("mozallowfullscreen",""),a.setAttribute("allowfullscreen",""),this.sa= +a)}k=rF.prototype;k.$g=!1;k.Dg=function(a){const b=this.zo;if(this.sa&&this.rc&&b.iC()){var c=a.scale();const d=c*b.width();c*=b.height();a=a.position(b.id(),1);Nh(this.rc,d,c);Gh(this.rc,a.x,a.y);Nh(this.sa,d,c)}};k.visible=function(){return this.$g}; +k.FI=function(a){if(this.$g!=a)if(this.$g=a,this.zo.iC()){if(a){this.rc.appendChild(this.sa);try{this.sa.contentWindow.ispringPresentationPlayer=this.nN}catch(b){}}else Cd(this.rc);Th(this.rc,a)}else if(a){if(!this.sa){a=this.zo;const b={resizable:!0,statusbar:!1,toolbar:!1,location:!1,scrollbars:!1,menubar:!1},c=this.zo.width()||this.zo.height();a.gQ()?(b.width=screen.availWidth,b.height=screen.availHeight,b.top=0,b.left=0):c&&(b.width=Math.max(this.zo.width(),100),b.height=Math.max(this.zo.height(), +100));this.sa=ei?this.$M(a.url()):fh(a.url(),b)}}else{if(this.sa)try{this.sa.close()}catch(b){}this.sa=null}};k.$M=function(a){(new di("openWindow",[a])).ix();return null};function sF(a,b,c,d){this.Ib={};this.nN=d;this.Ab=a;this.M=c;b.Sb().addHandler(this.wb,this);a.Le().addHandler(this.nA,this)}k=sF.prototype;k.U=-1;k.wb=function(a){a=a.timestamp();this.U!=a.L()&&tF(this,this.U,-1);this.U=a.L();-1!=a.Aa()&&(a=this.vO(a),tF(this,this.U,a))};k.D=function(a){const b=a.id();this.Ib[b]||(this.Ib[b]=new rF(this.Ab,a,this.nN));return this.Ib[b]};k.nA=function(){const a=this;uF(this,this.U,function(b){b.Dg(a.Ab)})}; +function tF(a,b,c){a.rO(b);uF(a,a.U,function(d){const e=d.zo.timeout()<=c;e&&(d.visible()||d.Dg(a.Ab));d.FI(e)})}k.Ao=function(a){return this.AG(a)&&(a=this.M.ja(a),a instanceof Am)?a.oD():null};k.rO=function(a){this.AG(a)&&this.M.ja(a).nb().duration()};k.vO=function(a){const b=a.Aa(),c=a.L();return this.M.ja(c).nb().pc(b).startTime()+a.ib()};k.AG=function(a){return 0<=a&&af||f>=e.count()?null:e.Ao[f])e=a.D(e),c(e)}}};var vF={S1:"gotoPreviousSlide",O1:"continuePresentation",P1:"finishAction",uga:"skipQuiz"};q("ispring.quiz.player.QuizPlayerControllerActionType",vF);q("GOTO_PREVIOUS_SLIDE","gotoPreviousSlide",vF);q("CONTINUE_PRESENTATION","continuePresentation",vF);q("FINISH_ACTION","finishAction",vF);q("SKIP_QUIZ","skipQuiz",vF);var wF={O1:"continuePresentation",P1:"finishAction",vga:"skipScenario",S1:"gotoPreviousSlide",Fea:"gotoNextSlide"};q("ispring.scenario.player.ScenarioPlayerControllerActionType",wF);q("CONTINUE_PRESENTATION","continuePresentation",wF);q("FINISH_ACTION","finishAction",wF);q("SKIP_SCENARIO","skipScenario",wF);q("GOTO_PREVIOUS_SLIDE","gotoPreviousSlide",wF);q("GOTO_NEXT_SLIDE","gotoNextSlide",wF);var xF={Jea:"initializing",ida:"authorizating",Lea:"inProgress",wda:"completed"};q("ispring.scenario.session.ScenarioState",xF);q("INITIALIZING","initializing",xF);q("IN_PROGRESS","inProgress",xF);q("COMPLETED","completed",xF);q("AUTHORIZATING","authorizating",xF);var yF=null,zF=null;function AF(a,b,c){this.F=a;var d=Oi();if("1"==d.resume||"review"==window.launchMode)a.settings().Pc().kw="always";else if("0"==d.resume||"browse"==window.launchMode)a.settings().Pc().kw="never";var e=Fj?new KE(a):new AE;d=new dC;const f=new yg,g=new RD(f);g.fR(a.settings().ia());const h=new ND(a,g,e);var l=new WD(a,h);this.Hg=new kC;const n=new mC(a.settings().navigation().keyboard(),a.slides(),g,this.Hg);var m=new VD;m.stateChangedEvent().addHandler(this.qA,this);this.Va=new uq(d,c,h,g,g,l,n,this, +m);new NB(b);this.pa=new XB(this.Va,a,f);b=this.pa.W();m=this.pa.Xd();e.$q(b.Z());h.pR(b.Z(),b.Ho());n.SC(m);l.B=b;l.tc=m;d.SC(b);d.zI(h);BF(this,d);e=this.pa.Vq();l=e.displayObject();c.Ye.Qe=l;new jE(e,b.Z(),a.slides());new sF(e,b.Z(),a.slides(),this);new uE(this.pa,e,b.Z(),a.slides());this.lV=new SD(a);this.lV.SC(b);this.dZ=new C;this.bZ=new C;this.vU=new C;this.RS=new C;this.Aq=new C;this.LX=new C;this.DD=new bF(a.slides(),b.Z(),b.Ho(),a.nd().xm(),g,f);this.cH=new gF(a.slides(),b.Z(),b.Ho(),a.nd().Lf(), +g,f);this.S4=new EE(a.slides(),h,b.Z(),c.Ye);new BE(b,g);Ii&&new wE(d);this.j3=new xE(a.slides(),e,b,g);this.R4=Fj?new LE(g):new CE(g);b.SX.addHandler(this.h6,this);b.Vo().addHandler(this.Wl,this);b.eE.addHandler(this.z5,this);b.JT.addHandler(this.I3,this);b.Bc().addHandler(this.On,this);this.ie=g;Dj&&ISPlayer.setPauseMediaCallback(this.NF.bind(this))}k=AF.prototype;k.IT=!1;k.Uj=function(){return this.Hg};k.yH=function(){return this.Va}; +function BF(a,b){const c=wd("DIV");c.getCore=function(){return b};c.setAttribute("id",a.F.settings().NI());a.pa.displayObject().appendChild(c)}function pF(a,b,c,d){const e=a.pa.W().Z(),f=!d;f&&a.Js();c&&oF(a);f&&c||e.Cc().addHandler(function h(){e.started()&&(e.Cc().removeHandler(h,this,-1),f||a.Js(),c||oF(a))},a,-1);a.vU.C(b,c,d)}k.Js=function(){this.j3.activate();this.pa.W().activate()}; +function oF(a){a.IT||(a.IT=!0,a.R4.activate(),a.DD.activate(),a.cH.activate(),a.Va.mediaController().activate())}k.Ba=function(){return this.F};AF.prototype.presentation=AF.prototype.Ba;AF.prototype.view=function(){return this.pa};AF.prototype.view=AF.prototype.view;AF.prototype.version=function(){return"8.3.0"};AF.prototype.version=AF.prototype.version;AF.prototype.persistState=function(){return this.Va.Ce.cR()};AF.prototype.persistState=AF.prototype.persistState; +AF.prototype.gaa=function(a,b){var c={width:a,height:b,D_:!1};this.LX.C(c);return c.D_?new cd(c.width,c.height):(c=Math.min(a/this.F.slideWidth(),b/this.F.slideHeight()),new cd(a*c,b*c))};AF.prototype.getOptimalPlayerSize=AF.prototype.gaa;AF.prototype.qA=function(){this.Aq.C(new Mn)}; +AF.prototype.start=function(a){var b=null;a&&(b=UD(a));a=this.F.settings().Pc();var c=this.view().W(),d=b,e=this.view().W().Gf(),f;if(f=d)a:{f=this.F.slides().count();var g=this.view().W().Gf();for(let h=0;hf||f>=this.F.slides().count();d="review"==window.launchMode;d=g&&null!=e&&0<=e&&("never"!=a.eu()||d);g&&(f=c.Gf());c=d?e:f;b=new qF(this,b);e=new iF(b); +e.yI(a.ff());e.fu(d?"resumePlayback":"gotoSlide");e.d1(c);this.dZ.C(e);switch(e.action()){case "resumePlayback":b.resume(e.L());break;case "gotoSlide":b.start(e.L());break;case "delayStartup":b.cZ=!0;break;default:throw Error("unknown startup action");}};AF.prototype.Ix=function(){return this.Va.Ix()};AF.prototype.Tx=function(){return this.dZ};AF.prototype.startupEvent=AF.prototype.Tx;AF.prototype.startupCompletedEvent=function(){return this.bZ};AF.prototype.startupCompletedEvent=AF.prototype.startupCompletedEvent; +AF.prototype.vx=function(){return this.vU};AF.prototype.initialSlideShownEvent=AF.prototype.vx;AF.prototype.h6=function(){this.DD.Lm();this.cH.Lm();this.S4.Lm()};AF.prototype.Wl=function(){const a=this.F.settings().xu().mI();a&&a.open()};AF.prototype.mC=function(){return this.lV.mC()};AF.prototype.executeMetaCommandEvent=AF.prototype.mC;AF.prototype.z_=function(){return this.DD};AF.prototype.audioNarrationController=AF.prototype.z_;AF.prototype.Ar=function(){return this.cH}; +AF.prototype.videoNarrationController=AF.prototype.Ar;AF.prototype.z5=function(){const a=new Mn;this.RS.C(a);if(!a.actionPrevented())if(ei)(new di("closeWindow")).ix();else try{Ji||(window.open("","_self",""),window.close())}catch(b){}};AF.prototype.closeWindowEvent=function(){return this.RS};AF.prototype.closeWindowEvent=AF.prototype.closeWindowEvent;AF.prototype.stateChangedEvent=function(){return this.Aq};AF.prototype.stateChangedEvent=AF.prototype.stateChangedEvent; +AF.prototype.Mm=function(a){this.pa.Gb!=a&&(this.NF(),this.pa.Mm(a))};AF.prototype.gestureNavigationEnabled=function(){return this.F.settings().navigation().Gm().enabled()};AF.prototype.gestureNavigationEnabled=AF.prototype.gestureNavigationEnabled;function CF(a,b){if(b=null==a.pa.Xd().gf(b))b=!(-1==a.pa.W().Ug()&&-1==a.pa.W().Vg());return b}function DF(a,b){return null==a.pa.Xd().gf("quizArbitrarySlideSwitching",b)}function EF(a,b){return null==a.pa.Xd().gf("ScenarioArbitrarySlideSwitching",b)} +function FF(a,b){var c=a.pa.W(),d=c.$();c=c.Ud().view();c=yq(c.ob());switch(b){case "gotoPreviousSlide":return-1!=a.pa.W().Vg();case "skipScenario":return"atAnyTime"==d.um&&CF(a,"switchToNextSlide");case "continuePresentation":return b=c.scenarioPassed()?d.MF:d.iE,d=0,b instanceof Vg&&(d=b.L()),"gotoSlide"==b.type()&&EF(a,d)||"gotoNextSlide"==b.type()&&CF(a,"scenarioSwitchToNextSlideWithoutBranching");case "finishAction":return b=c.scenarioPassed()?d.MF:d.iE,d=0,b instanceof Vg&&(d=b.L()),"closePlayerWindow"== +b.type()||"gotoSlide"==b.type()&&EF(a,d)||"gotoNextSlide"==b.type()&&CF(a,"scenarioSwitchToNextSlide")}return!1} +function GF(a,b){var c=a.pa.W();const d=c.$();c=c.Ud().view();const e=Rg(c.Oa());switch(b){case "gotoPreviousSlide":return"sequential"!=a.F.settings().navigation().navigationType()&&c.Sx()&&-1!=a.pa.W().Vg();case "skipQuiz":if(b="atAnyTime"==d.um)b=CF(a,"switchToNextSlide")&&-1!=a.pa.W().Ug();return b;case "continuePresentation":return b=Sg(e)?d.LF:d.hE,"gotoSlide"==b.type()?DF(a,b.L()):"gotoNextSlide"==b.type()&&CF(a,"quizSwitchToNextSlideWithoutBranching");case "finishAction":return b=Sg(e)?d.LF: +d.hE,"gotoSlide"==b.type()?DF(a,b.L()):"closePlayerWindow"==b.type()||"gotoNextSlide"==b.type()&&CF(a,"quizSwitchToNextSlide")}return!1}AF.prototype.actionAvailable=function(a){var b=this.pa.W().$();if(b instanceof br)a=GF(this,a);else if(b instanceof sq)a:{b=this.pa.W().Ud().view();switch(a){case "gotoNextPresentationSlide":a=CF(this,"switchToNextSlide");break a;case "gotoPreviousPresentationSlide":a=b.Sx()&&-1!=this.pa.W().Vg();break a}a=!1}else a=b instanceof Aq?FF(this,a):!1;return a}; +AF.prototype.actionAvailable=AF.prototype.actionAvailable;AF.prototype.I3=function(a,b,c){const d=this.F.slides();b=0<=b?d.ja(b):null;c=0<=c?d.ja(c):null;if(b instanceof br||c instanceof br||b instanceof sq||c instanceof sq||b instanceof Aq||c instanceof Aq)uj?(a.Yu="null",a.Ea=0):a.Yu="FadeSmoothly"};AF.prototype.On=function(){const a=this.pa.W().Ug();this.DD.iu(a);this.cH.iu(a)}; +AF.prototype.NF=function(){const a=this.pa.W();if(!(0>a.ma())){a.pause();this.ie.fI();var b=this.pa.W().Oa();b&&b.pauseMedia();(b=this.pa.W().ob())&&b.pauseMedia();b=a.$();b instanceof sq&&a.kf(b.index()).fb().pauseMedia()}};function HF(a){this.aI=a}HF.prototype.set=function(a,b){void 0===b?this.aI.remove(a):this.aI.set(a,vh(b))};HF.prototype.get=function(a){let b;try{b=this.aI.get(a)}catch(c){return}if(null!==b)try{return JSON.parse(b)}catch(c){throw"Storage: Invalid value was encountered";}};HF.prototype.remove=function(a){this.aI.remove(a)};function IF(){};function JF(){}t(JF,IF);JF.prototype.IH=function(){let a=0;for(const b of this)a++;return a};JF.prototype[Symbol.iterator]=function(){return Gk(this.sj(!0)).SI()};JF.prototype.clear=function(){const a=Array.from(this);for(const b of a)this.remove(b)};function KF(a){this.mk=a}t(KF,JF);k=KF.prototype;k.rQ=function(){if(!this.mk)return!1;try{return this.mk.setItem("__sak","1"),this.mk.removeItem("__sak"),!0}catch(a){return!1}};k.set=function(a,b){try{this.mk.setItem(a,b)}catch(c){if(0==this.mk.length)throw"Storage mechanism: Storage disabled";throw"Storage mechanism: Quota exceeded";}};k.get=function(a){a=this.mk.getItem(a);if("string"!==typeof a&&null!==a)throw"Storage mechanism: Invalid value was encountered";return a};k.remove=function(a){this.mk.removeItem(a)}; +k.IH=function(){return this.mk.length};k.sj=function(a){var b=0,c=this.mk,d=new zk;d.next=function(){if(b>=c.length)return Ak;var e=c.key(b++);if(a)return Bk(e);e=c.getItem(e);if("string"!==typeof e)throw"Storage mechanism: Invalid value was encountered";return Bk(e)};return d};k.clear=function(){this.mk.clear()};k.key=function(a){return this.mk.key(a)};function LF(){var a=null;try{a=window.localStorage||null}catch(b){}this.mk=a}t(LF,KF);function MF(a,b){this.t1=a;this.zh=null;if(Ib&&!(9<=Number(dc))){NF||(NF=new Kk);this.zh=NF.get(a);this.zh||(b?this.zh=document.getElementById(b):(this.zh=document.createElement("userdata"),this.zh.addBehavior("#default#userData"),document.body.appendChild(this.zh)),NF.set(a,this.zh));try{this.zh.load(this.t1)}catch(c){this.zh=null}}}t(MF,JF);var OF={".":".2E","!":".21","~":".7E","*":".2A","'":".27","(":".28",")":".29","%":"."},NF=null; +function PF(a){return"_"+encodeURIComponent(a).replace(/[.!~*'()%]/g,function(b){return OF[b]})}k=MF.prototype;k.rQ=function(){return!!this.zh};k.set=function(a,b){this.zh.setAttribute(PF(a),b);QF(this)};k.get=function(a){a=this.zh.getAttribute(PF(a));if("string"!==typeof a&&null!==a)throw"Storage mechanism: Invalid value was encountered";return a};k.remove=function(a){this.zh.removeAttribute(PF(a));QF(this)};k.IH=function(){return RF(this).attributes.length}; +k.sj=function(a){var b=0,c=RF(this).attributes,d=new zk;d.next=function(){if(b>=c.length)return Ak;var e=c[b++];if(a)return Bk(decodeURIComponent(e.nodeName.replace(/\./g,"%")).slice(1));e=e.nodeValue;if("string"!==typeof e)throw"Storage mechanism: Invalid value was encountered";return Bk(e)};return d};k.clear=function(){for(var a=RF(this),b=a.attributes.length;0{if(!e.actionPrevented()){e.preventAction();e=c.persistState();const f=VF();try{f.set(d,e)}catch(g){}}},null,99);c.start(b)};function YF(a,b){for(const c in a)a.hasOwnProperty(c)&&ZF(a[c],c,b)}function ZF(a,b,c){for(const d in a)a.hasOwnProperty(d)&&(d==c?b=a[c]:"toString"!=d&&ZF(a[d],d,c));a.toString=function(){return b}};function $F(){var a={A:""};a:{for(const b in a){a=b;break a}a=void 0}return a};function aG(){const a={id:{A:"i"},title:{A:"t"},courseTitle:{A:"ct"},slideWidth:{A:"w"},slideHeight:{A:"h"},L_:{A:"c"},yba:{A:"pv"},slides:{A:"s",id:{A:"I"},aD:{A:"st",slide:{A:"s"},quiz:{A:"q"},interaction:{A:"i"},scenario:{A:"S"}},title:{A:"t"},visible:{A:"v"},N_:{A:"c"},src:{A:"s"},n1:{A:"sl"},gj:{A:"o"},Po:{A:"n"},uaa:{A:"N"},R9:{A:"an"},text:{A:"x"},ru:{A:"T",vC:{A:"i"},width:{A:"w"},height:{A:"h"}},SB:{A:"a"},W9:{A:"d"},Zc:{A:"l"},Bba:{A:"p"},d$:{A:"B"},h0:{A:"hi"},yi:{A:"e",T0:{A:"p"},S0:{A:"a"}}, +timeline:{A:"i"},transition:{A:"q",type:{A:"t"},duration:{A:"d"},lk:{A:"s"}},Md:{A:"S",id:{A:"i"},Mq:{A:"a"},slides:{A:"s"},repeat:{A:"r",F1:{A:"s"},E1:{A:"c"},G1:{A:"n"}},volume:{A:"v"},effect:{A:"e"},Sj:{A:"b",name:{A:"n"},time:{A:"t"}},duration:{A:"d"}},$d:{A:"V",id:{A:"i"},Mq:{A:"a"},slides:{A:"s"},repeat:{A:"r",F1:{A:"s"},E1:{A:"c"},G1:{A:"n"}},NQ:{A:"f"},nQ:{A:"H"},uI:{A:"R"},volume:{A:"v"},pi:{A:"h"},Sj:{A:"b",name:{A:"n"},time:{A:"t"}},duration:{A:"d"}},oD:{A:"wo",containerId:{A:"c"},url:{A:"u"}, +timeout:{A:"to"},width:{A:"w"},height:{A:"h"},gQ:{A:"f"},iC:{A:"ds"}},$ca:{A:"y",containerId:{A:"c"},Bi:{A:"v"},width:{A:"w"},height:{A:"h"},ib:{A:"to"}},Zca:{A:"yk",containerId:{A:"c"},Bi:{A:"v"},width:{A:"w"},height:{A:"h"},ib:{A:"to"},clientId:{A:"cl"}},No:{A:"m",name:{A:"n"},params:{A:"p",name:{A:"n"},value:{A:"v"}}},fj:{A:"b",action:{type:{A:"t",bba:{A:"n"},pe:{A:"g"}},L:{A:"s"}},Oo:{A:"n"},Gx:{A:"p"}},St:{A:"r",lock:{A:"l"}},qk:{A:"z",id:{A:"i"},Wx:{A:"t"},qr:{A:"r"},Nm:{A:"bg"},OR:{A:"tt"}, +ym:{A:"b"},ul:{A:"hF"},Fl:{A:"vF"},rotation:{A:"R"},slides:{A:"s"}},cQ:{A:"f",containerId:{A:"c"},width:{A:"w"},height:{A:"h"},url:{A:"u"},ib:{A:"to"},bgColor:{A:"b"},D1:{A:"t"}},kca:{A:"si",CI:{A:"shapes",item:{id:{A:"id"},ym:{A:"bbox"},qj:{A:"transformBefore"},nk:{A:"transformAfter"}},Nc:{A:"bg"},Dl:{A:"textItems"},Qq:{A:"childItems"},type:{A:"type"},text:{A:"text"},ym:{A:"bbox"},ul:{A:"hFlip"},Fl:{A:"vFlip"},rotation:{A:"rotation"},fr:{A:"lineWeight"},mj:{A:"normalizedPic"},naa:{A:"hasTransparency"}, +ne:{A:"crop",left:{A:"l"},top:{A:"t"},right:{A:"r"},bottom:{A:"b"}},line:{A:"line"},fill:{A:"fill"},Nt:{A:"glow"},Zt:{A:"reflection"},ku:{A:"shadow"},pu:{A:"softEdge"},qu:{A:"threeD"}}},Iba:{A:"qb"},Jba:{A:"qB",VB:{A:"i"},ZQ:{A:"r"},AP:{A:"n",DP:{A:"t"},yP:{A:"a"},zP:{A:"p"}},aQ:{A:"f",Ut:{A:"p",type:{A:"t",KP:{A:"w"},lf:{A:"n"},pe:{A:"s"}},L:{A:"s"}},$P:{A:"f"}}},Kba:{A:"qt"},Yba:{A:"sB",WB:{A:"i"},AP:{A:"n",DP:{A:"t"},yP:{A:"a"},zP:{A:"p"}},aQ:{A:"f",Ut:{A:"p",type:{A:"t",KP:{A:"w"},lf:{A:"n"}, +pe:{A:"s"}},L:{A:"s"}},$P:{A:"f"}}},pQ:{A:"it"},Xo:{A:"pp"},xaa:{A:"ip",navigationType:{A:"nt"},UB:{A:"ai"}}},settings:{A:"e",navigation:{A:"n",Gm:{A:"m",enabled:{A:"e"},target:{A:"t",step:{A:"s"},slide:{A:"l"}}},keyboard:{A:"k",enabled:{A:"e"},actions:{A:"a",name:{A:"n",tba:{A:"pp"},bI:{A:"ns"},Cba:{A:"ps"},aba:{A:"nt"},Dba:{A:"pt"},bca:{A:"sf"},aca:{A:"sb"},Y$:{A:"fs"},Eaa:{A:"ls"},tQ:{A:"lv"},mca:{A:"ss"},jca:{A:"se"},Qca:{A:"vu"},Pca:{A:"vd"},Bca:{A:"tf"}},lu:{A:"s",key:{A:"k"},zH:{A:"c"},shift:{A:"s"}}}}, +lx:{A:"g",VR:{A:"z"}}},Pc:{A:"p",bR:{A:"s"},ff:{A:"a"},resume:{A:"r",prompt:{A:"p"},X9:{A:"a"},Yaa:{A:"n"}},Fm:{A:"l"},navigationType:{A:"n",Mha:{A:"n"},Qba:{A:"r"},cca:{A:"s"}}},Lq:{A:"a",fitToWindow:{A:"f"}},xu:{A:"w",link:{url:{A:"u"},target:{A:"t"}},HI:{A:"s"},mI:{A:"p"}},Hx:{A:"P",password:{A:"p"},Xx:{A:"t",I$:{A:"a"},J$:{A:"u"}},DH:{A:"d"}},Gt:{A:"A",enabled:{A:"e"}}},LI:{A:"S",name:{A:"n"},slides:{A:"s"}},ZH:{A:"sS"},skinSettings:{A:"k"},ia:{A:"I"},YB:{A:"b",content:{A:"c"},contentHover:{A:"ch"}, +url:{A:"u"},width:{A:"w"},height:{A:"h"},Yx:{A:"t"},language:{A:"l"},Zw:{A:"x"},Yw:{A:"d"},$w:{A:"xx"},ex:{A:"xy"}},nD:{A:"W",src:{A:"s"},left:{A:"l"},top:{A:"t"},width:{A:"w"},height:{A:"h"},opacity:{A:"o"},url:{A:"u"},target:{A:"T"}},fonts:{A:"f",name:{A:"n"},localName:{A:"l"},urls:{A:"u"},Uca:{A:"A"},UR:{A:"D"},Y9:{A:"a"},E$:{A:"d"},daa:{A:"g"},bold:{A:"b"},italic:{A:"i"}},Td:{A:"C",logo:{A:"l",vC:{A:"i"},width:{A:"w"},height:{A:"h"}},ue:{A:"w"},pD:{A:"t"}},Yt:{A:"p",name:{A:"n"},Pt:{A:"j"},Oq:{A:"b"}, +ue:{A:"w"},email:{A:"e"},phone:{A:"p"},Td:{A:"C"},Vt:{A:"P",vC:{A:"i"},width:{A:"w"},height:{A:"h"}}},Md:{A:"o",id:{A:"i"},pi:{A:"h"}},$d:{A:"v",id:{A:"i"},pi:{A:"h"},poster:{A:"p"}},nd:{A:"n",xm:{A:"a"},Lf:{A:"v"},track:{FC:{A:"i"},volume:{A:"v"},jc:{A:"st"},jf:{A:"et"},timestamp:{L:{A:"s"},Aa:{A:"t"},ib:{A:"i"}}}},ti:{A:"r",type:{A:"t",Z9:{A:"a"},Nba:{A:"r"}},title:{A:"i"},url:{A:"u"},target:{A:"a"}},Wt:{A:"P",loop:{A:"l"},Md:{A:"s"}}},b=$F();YF(a,b);return a};class fG{Uq(a,b){var c=["data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA5LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDksMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbD0iI0RENEIzOCIgZD0iTTIxLjA0MSwyOXY5Ljg0NGMwLDUuNTA4LDQuNjkxLDkuOTczLDEwLjQ3OSw5Ljk3M2M1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTczVjI5SDIxLjA0MXoiLz4NCjxwYXRoIGZpbGw9IiNERDRCMzgiIGQ9Ik0yNi41NTgsMjl2LTcuNjg5YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MlYyOWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNFYyOUgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjEuMDQxLDI4LjIwNnY5Ljg0NWMwLDUuNTA2LDQuNjkxLDkuOTcxLDEwLjQ3OSw5Ljk3MWM1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTcxdi05Ljg0NUgyMS4wNDF6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjYuNTU4LDI4LjA0VjIwLjM1YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MnY3LjY4OWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNHY4LjA1NEgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRjA4RjgyIiBkPSJNMzQsMzYuMzY1YzAtMS4yODctMS4wNDQtMi4zMzEtMi4zMzEtMi4zMzFjLTEuMjg4LDAtMi4zMzIsMS4wNDQtMi4zMzIsMi4zMzENCgljMCwwLjk3MSwwLjU5NCwxLjgwMiwxLjQzOCwyLjE1MnY0LjQ2N2gxLjkxdi00LjUyOUMzMy40NjEsMzguMDc2LDM0LDM3LjI4NywzNCwzNi4zNjV6Ii8+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA4LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDgsMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik01OS42NDYsMzFoLTMuMjkzQzU2LjE1OCwzMSw1NiwzMS40NDgsNTYsMzINCgljMCwwLjU1MywwLjE1OCwxLDAuMzU0LDFoMy4yOTNDNTkuODQyLDMzLDYwLDMyLjU1Myw2MCwzMkM2MCwzMS40NDgsNTkuODQyLDMxLDU5LjY0NiwzMXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjREQ0QjM4IiBkPSJNNi42NDcsMzFIMy4zNTNDMy4xNTgsMzEsMywzMS40NDgsMywzMmMwLDAuNTUzLDAuMTU4LDEsMC4zNTMsMQ0KCWgzLjI5NEM2Ljg0MiwzMyw3LDMyLjU1Myw3LDMyQzcsMzEuNDQ4LDYuODQyLDMxLDYuNjQ3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik0zMSw4YzAuNTUzLDAsMS0wLjE1OCwxLTAuMzUzVjQuMzUzQzMyLDQuMTU4LDMxLjU1Myw0LDMxLDQNCgljLTAuNTUyLDAtMSwwLjE1OC0xLDAuMzUzdjMuMjk0QzMwLDcuODQyLDMwLjQ0OCw4LDMxLDh6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTMxLDU2Yy0wLjU1MiwwLTEsMC4xNTgtMSwwLjM1NHYzLjI5M0MzMCw1OS44NDIsMzAuNDQ4LDYwLDMxLDYwDQoJYzAuNTUzLDAsMS0wLjE1OCwxLTAuMzU0di0zLjI5M0MzMiw1Ni4xNTgsMzEuNTUzLDU2LDMxLDU2eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik00Ny42NjgsMzFoLTEyLjgxQzM0LjQ5NiwyOS42LDMzLjQsMjguNTA1LDMyLDI4LjE0Mg0KCWMwLDAtMC4xNzItMC4xNDItMS0wLjE0MmMtMC44MjksMC0yLDAuNTU1LTIsMC41NTVjLTEuMTksMC42OTMtMiwxLjk2OS0yLDMuNDQ1YzAsMi4yMDksMS43OTEsNCw0LDRjMS40NzcsMCwyLjc1Mi0wLjgwOSwzLjQ0NS0yDQoJaDEzLjIyM0M0OC40MDQsMzQsNDksMzMuMzI4LDQ5LDMyLjVDNDksMzEuNjcyLDQ4LjQwNCwzMSw0Ny42NjgsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTI3LjAxOCwyOS43NDhjMC41OTIsMS4wMjUsMS42NTIsMS41MiwyLjM3LDEuMTA2bDAsMA0KCWMwLjcxNy0wLjQxNSwwLjgxOS0xLjU4MSwwLjIyOC0yLjYwNmwtNy44NTctMTMuNjA5Yy0wLjU5Mi0xLjAyNC0xLjY1My0xLjUyLTIuMzcxLTEuMTA2bDAsMGMtMC43MTcsMC40MTUtMC44MTgsMS41ODEtMC4yMjgsMi42MDUNCglMMjcuMDE4LDI5Ljc0OHoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMjcuMDE4LDI4LjM2MWMwLjU5MiwxLjAyNSwxLjY1MiwxLjUyLDIuMzcsMS4xMDZsMCwwDQoJYzAuNzE3LTAuNDE1LDAuODE5LTEuNTgxLDAuMjI4LTIuNjA2bC03Ljg1Ny0xMy42MDljLTAuNTkyLTEuMDI0LTEuNjUzLTEuNTItMi4zNzEtMS4xMDZsMCwwYy0wLjcxNywwLjQxNS0wLjgxOCwxLjU4MS0wLjIyOCwyLjYwNQ0KCUwyNy4wMTgsMjguMzYxeiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgY3g9IjMxIiBjeT0iMzEiIHI9IjQiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNjAsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzU0LDFoLTMuMjkzQzU2LjE1OCwzMiw1NiwzMS41NTIsNTYsMzENCglsMCwwYzAtMC41NTIsMC4xNTgtMSwwLjM1NC0xaDMuMjkzQzU5Ljg0MiwzMCw2MCwzMC40NDgsNjAsMzFMNjAsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTcsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzUzLDFIMy4zNTNDMy4xNTgsMzIsMywzMS41NTIsMywzMWwwLDANCgljMC0wLjU1MiwwLjE1OC0xLDAuMzUzLTFoMy4yOTRDNi44NDIsMzAsNywzMC40NDgsNywzMUw3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0zMSwzYzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDYuODQyLDMxLjU1Myw3LDMxLDdsMCwwDQoJYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1M1YzLjM1M0MzMCwzLjE1OCwzMC40NDgsMywzMSwzTDMxLDN6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTMxLDU1YzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDU4Ljg0MiwzMS41NTMsNTksMzEsNTkNCglsMCwwYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1NHYtMy4yOTRDMzAsNTUuMTU4LDMwLjQ0OCw1NSwzMSw1NUwzMSw1NXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNDksMzEuNDk5QzQ5LDMwLjY3Miw0OC40MDQsMzAsNDcuNjY4LDMwSDM0LjMzMw0KCUMzMy41OTYsMzAsMzMsMzAuNjcxLDMzLDMxLjVsMCwwYzAsMC44MjgsMC41OTYsMS41LDEuMzMzLDEuNWgxMy4zMzVDNDguNDA0LDMzLDQ5LDMyLjMyOCw0OSwzMS40OTlMNDksMzEuNDk5eiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YxNjE1NSIgY3g9IjMxIiBjeT0iMzEiIHI9IjIiLz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPgo8cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHJ4PSI2IiBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIwLjciLz4KPGcgb3BhY2l0eT0iMC44IiBjbGlwLXBhdGg9InVybCgjY2xpcDApIj4KPHBhdGggZD0iTTUzLjUgMjQuODk4NEg1MkM1MS42MDIyIDI0Ljg5ODQgNTEuMjIwNiAyNS4wNTYgNTAuOTM5MyAyNS4zMzY0QzUwLjY1OCAyNS42MTY5IDUwLjUgMjUuOTk3MiA1MC41IDI2LjM5MzhDNTAuNSAyNi43OTA0IDUwLjY1OCAyNy4xNzA4IDUwLjkzOTMgMjcuNDUxMkM1MS4yMjA2IDI3LjczMTYgNTEuNjAyMiAyNy44ODkyIDUyIDI3Ljg4OTJINTMuNUM1My44OTc4IDI3Ljg4OTIgNTQuMjc5NCAyOC4wNDY3IDU0LjU2MDcgMjguMzI3MkM1NC44NDIgMjguNjA3NiA1NSAyOC45ODggNTUgMjkuMzg0NlY0MS4zODQ5QzUzLjcwOTMgNDAuMzk1OCA1Mi4xMjggMzkuODU3MiA1MC41IDM5Ljg1MjJDNDkuMjcxNyAzOS44NTI4IDQ4LjA2MjQgNDAuMTU0MSA0Ni45NzgzIDQwLjcyOTdDNDUuODk0MiA0MS4zMDUzIDQ0Ljk2ODUgNDIuMTM3NSA0NC4yODI1IDQzLjE1MzJDNDMuNzI2MSA0Mi41ODIxIDQzLjA2MDMgNDIuMTI4MSA0Mi4zMjQ4IDQxLjgxOEM0MS41ODkyIDQxLjUwOCA0MC43OTg2IDQxLjM0ODMgNDAgNDEuMzQ4M0MzOS4yMDE0IDQxLjM0ODMgMzguNDEwOCA0MS41MDggMzcuNjc1MiA0MS44MThDMzYuOTM5NyA0Mi4xMjgxIDM2LjI3MzkgNDIuNTgyMSAzNS43MTc1IDQzLjE1MzJDMzUuMDMxNSA0Mi4xMzc1IDM0LjEwNTggNDEuMzA1MyAzMy4wMjE3IDQwLjcyOTdDMzEuOTM3NiA0MC4xNTQxIDMwLjcyODMgMzkuODUyOCAyOS41IDM5Ljg1MjJDMjcuODcyIDM5Ljg1NzIgMjYuMjkwNyA0MC4zOTU4IDI1IDQxLjM4NDlWMjkuMzg0NkMyNSAyOC45ODggMjUuMTU4IDI4LjYwNzYgMjUuNDM5MyAyOC4zMjcyQzI1LjcyMDYgMjguMDQ2NyAyNi4xMDIyIDI3Ljg4OTIgMjYuNSAyNy44ODkySDI4QzI4LjM5NzggMjcuODg5MiAyOC43Nzk0IDI3LjczMTYgMjkuMDYwNyAyNy40NTEyQzI5LjM0MiAyNy4xNzA4IDI5LjUgMjYuNzkwNCAyOS41IDI2LjM5MzhDMjkuNSAyNS45OTcyIDI5LjM0MiAyNS42MTY5IDI5LjA2MDcgMjUuMzM2NEMyOC43Nzk0IDI1LjA1NiAyOC4zOTc4IDI0Ljg5ODQgMjggMjQuODk4NEgyNi41QzI1LjMwNjUgMjQuODk4NCAyNC4xNjE5IDI1LjM3MTEgMjMuMzE4IDI2LjIxMjRDMjIuNDc0MSAyNy4wNTM3IDIyIDI4LjE5NDggMjIgMjkuMzg0NlY0Ny4zMjkxQzIyIDQ5LjMxMjEgMjIuNzkwMiA1MS4yMTM4IDI0LjE5NjcgNTIuNjE2QzI1LjYwMzIgNTQuMDE4MiAyNy41MTA5IDU0LjgwNTkgMjkuNSA1NC44MDU5QzMxLjQ4OTEgNTQuODA1OSAzMy4zOTY4IDU0LjAxODIgMzQuODAzMyA1Mi42MTZDMzYuMjA5OCA1MS4yMTM4IDM3IDQ5LjMxMjEgMzcgNDcuMzI5MUMzNyA0Ni41MzU5IDM3LjMxNjEgNDUuNzc1MiAzNy44Nzg3IDQ1LjIxNDNDMzguNDQxMyA0NC42NTM0IDM5LjIwNDQgNDQuMzM4MyA0MCA0NC4zMzgzQzQwLjc5NTYgNDQuMzM4MyA0MS41NTg3IDQ0LjY1MzQgNDIuMTIxMyA0NS4yMTQzQzQyLjY4MzkgNDUuNzc1MiA0MyA0Ni41MzU5IDQzIDQ3LjMyOTFDNDMgNDkuMzEyMSA0My43OTAyIDUxLjIxMzggNDUuMTk2NyA1Mi42MTZDNDYuNjAzMiA1NC4wMTgyIDQ4LjUxMDkgNTQuODA1OSA1MC41IDU0LjgwNTlDNTIuNDg5MSA1NC44MDU5IDU0LjM5NjggNTQuMDE4MiA1NS44MDMzIDUyLjYxNkM1Ny4yMDk4IDUxLjIxMzggNTggNDkuMzEyMSA1OCA0Ny4zMjkxVjI5LjM4NDZDNTggMjguMTk0OCA1Ny41MjU5IDI3LjA1MzcgNTYuNjgyIDI2LjIxMjRDNTUuODM4MSAyNS4zNzExIDU0LjY5MzUgMjQuODk4NCA1My41IDI0Ljg5ODRaTTI5LjUgNTEuODE1MkMyOC42MSA1MS44MTUyIDI3Ljc0IDUxLjU1MjEgMjYuOTk5OSA1MS4wNTkxQzI2LjI1OTkgNTAuNTY2MiAyNS42ODMxIDQ5Ljg2NTYgMjUuMzQyNSA0OS4wNDU4QzI1LjAwMTkgNDguMjI2MSAyNC45MTI4IDQ3LjMyNDEgMjUuMDg2NSA0Ni40NTM5QzI1LjI2MDEgNDUuNTgzNiAyNS42ODg3IDQ0Ljc4NDMgMjYuMzE4IDQ0LjE1NjlDMjYuOTQ3NCA0My41Mjk1IDI3Ljc0OTIgNDMuMTAyMiAyOC42MjIxIDQyLjkyOTFDMjkuNDk1IDQyLjc1NiAzMC4zOTk4IDQyLjg0NDkgMzEuMjIyMSA0My4xODQ0QzMyLjA0NDMgNDMuNTI0IDMyLjc0NzEgNDQuMDk5IDMzLjI0MTYgNDQuODM2N0MzMy43MzYxIDQ1LjU3NDQgMzQgNDYuNDQxOCAzNCA0Ny4zMjkxQzM0IDQ4LjUxODkgMzMuNTI1OSA0OS42NTk5IDMyLjY4MiA1MC41MDEyQzMxLjgzODEgNTEuMzQyNSAzMC42OTM1IDUxLjgxNTIgMjkuNSA1MS44MTUyWk01MC41IDUxLjgxNTJDNDkuNjEgNTEuODE1MiA0OC43NCA1MS41NTIxIDQ3Ljk5OTkgNTEuMDU5MUM0Ny4yNTk5IDUwLjU2NjIgNDYuNjgzMSA0OS44NjU2IDQ2LjM0MjUgNDkuMDQ1OEM0Ni4wMDE5IDQ4LjIyNjEgNDUuOTEyOCA0Ny4zMjQxIDQ2LjA4NjUgNDYuNDUzOUM0Ni4yNjAxIDQ1LjU4MzYgNDYuNjg4NyA0NC43ODQzIDQ3LjMxOCA0NC4xNTY5QzQ3Ljk0NzQgNDMuNTI5NSA0OC43NDkyIDQzLjEwMjIgNDkuNjIyMSA0Mi45MjkxQzUwLjQ5NSA0Mi43NTYgNTEuMzk5OCA0Mi44NDQ5IDUyLjIyMjEgNDMuMTg0NEM1My4wNDQzIDQzLjUyNCA1My43NDcxIDQ0LjA5OSA1NC4yNDE2IDQ0LjgzNjdDNTQuNzM2MSA0NS41NzQ0IDU1IDQ2LjQ0MTggNTUgNDcuMzI5MUM1NSA0OC41MTg5IDU0LjUyNTkgNDkuNjU5OSA1My42ODIgNTAuNTAxMkM1Mi44MzgxIDUxLjM0MjUgNTEuNjkzNSA1MS44MTUyIDUwLjUgNTEuODE1MloiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OCA1Ny45MTQxTDIyIDIxLjkxNDEiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iMyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjwvZz4KPC9nPgo8ZGVmcz4KPGZpbHRlciBpZD0iZmlsdGVyMF9kIiB4PSIwIiB5PSIwIiB3aWR0aD0iODAiIGhlaWdodD0iODAiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLz4KPGZlT2Zmc2V0Lz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIvPgo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4yNSAwIi8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93Ii8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9kcm9wU2hhZG93IiByZXN1bHQ9InNoYXBlIi8+CjwvZmlsdGVyPgo8Y2xpcFBhdGggaWQ9ImNsaXAwIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjM5Ljg3NjciIGZpbGw9IndoaXRlIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMCAxOS45MTQxKSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPgo8cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHJ4PSI2IiBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIwLjgiLz4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwKSI+CjxwYXRoIGQ9Ik01My41IDI0Ljg5ODRINTJDNTEuNjAyMiAyNC44OTg0IDUxLjIyMDYgMjUuMDU2IDUwLjkzOTMgMjUuMzM2NEM1MC42NTggMjUuNjE2OSA1MC41IDI1Ljk5NzIgNTAuNSAyNi4zOTM4QzUwLjUgMjYuNzkwNCA1MC42NTggMjcuMTcwOCA1MC45MzkzIDI3LjQ1MTJDNTEuMjIwNiAyNy43MzE2IDUxLjYwMjIgMjcuODg5MiA1MiAyNy44ODkySDUzLjVDNTMuODk3OCAyNy44ODkyIDU0LjI3OTQgMjguMDQ2NyA1NC41NjA3IDI4LjMyNzJDNTQuODQyIDI4LjYwNzYgNTUgMjguOTg4IDU1IDI5LjM4NDZWNDEuMzg0OUM1My43MDkzIDQwLjM5NTggNTIuMTI4IDM5Ljg1NzIgNTAuNSAzOS44NTIyQzQ5LjI3MTcgMzkuODUyOCA0OC4wNjI0IDQwLjE1NDEgNDYuOTc4MyA0MC43Mjk3QzQ1Ljg5NDIgNDEuMzA1MyA0NC45Njg1IDQyLjEzNzUgNDQuMjgyNSA0My4xNTMyQzQzLjcyNjEgNDIuNTgyMSA0My4wNjAzIDQyLjEyODEgNDIuMzI0OCA0MS44MThDNDEuNTg5MiA0MS41MDggNDAuNzk4NiA0MS4zNDgzIDQwIDQxLjM0ODNDMzkuMjAxNCA0MS4zNDgzIDM4LjQxMDggNDEuNTA4IDM3LjY3NTIgNDEuODE4QzM2LjkzOTcgNDIuMTI4MSAzNi4yNzM5IDQyLjU4MjEgMzUuNzE3NSA0My4xNTMyQzM1LjAzMTUgNDIuMTM3NSAzNC4xMDU4IDQxLjMwNTMgMzMuMDIxNyA0MC43Mjk3QzMxLjkzNzYgNDAuMTU0MSAzMC43MjgzIDM5Ljg1MjggMjkuNSAzOS44NTIyQzI3Ljg3MiAzOS44NTcyIDI2LjI5MDcgNDAuMzk1OCAyNSA0MS4zODQ5VjI5LjM4NDZDMjUgMjguOTg4IDI1LjE1OCAyOC42MDc2IDI1LjQzOTMgMjguMzI3MkMyNS43MjA2IDI4LjA0NjcgMjYuMTAyMiAyNy44ODkyIDI2LjUgMjcuODg5MkgyOEMyOC4zOTc4IDI3Ljg4OTIgMjguNzc5NCAyNy43MzE2IDI5LjA2MDcgMjcuNDUxMkMyOS4zNDIgMjcuMTcwOCAyOS41IDI2Ljc5MDQgMjkuNSAyNi4zOTM4QzI5LjUgMjUuOTk3MiAyOS4zNDIgMjUuNjE2OSAyOS4wNjA3IDI1LjMzNjRDMjguNzc5NCAyNS4wNTYgMjguMzk3OCAyNC44OTg0IDI4IDI0Ljg5ODRIMjYuNUMyNS4zMDY1IDI0Ljg5ODQgMjQuMTYxOSAyNS4zNzExIDIzLjMxOCAyNi4yMTI0QzIyLjQ3NDEgMjcuMDUzNyAyMiAyOC4xOTQ4IDIyIDI5LjM4NDZWNDcuMzI5MUMyMiA0OS4zMTIxIDIyLjc5MDIgNTEuMjEzOCAyNC4xOTY3IDUyLjYxNkMyNS42MDMyIDU0LjAxODIgMjcuNTEwOSA1NC44MDU5IDI5LjUgNTQuODA1OUMzMS40ODkxIDU0LjgwNTkgMzMuMzk2OCA1NC4wMTgyIDM0LjgwMzMgNTIuNjE2QzM2LjIwOTggNTEuMjEzOCAzNyA0OS4zMTIxIDM3IDQ3LjMyOTFDMzcgNDYuNTM1OSAzNy4zMTYxIDQ1Ljc3NTIgMzcuODc4NyA0NS4yMTQzQzM4LjQ0MTMgNDQuNjUzNCAzOS4yMDQ0IDQ0LjMzODMgNDAgNDQuMzM4M0M0MC43OTU2IDQ0LjMzODMgNDEuNTU4NyA0NC42NTM0IDQyLjEyMTMgNDUuMjE0M0M0Mi42ODM5IDQ1Ljc3NTIgNDMgNDYuNTM1OSA0MyA0Ny4zMjkxQzQzIDQ5LjMxMjEgNDMuNzkwMiA1MS4yMTM4IDQ1LjE5NjcgNTIuNjE2QzQ2LjYwMzIgNTQuMDE4MiA0OC41MTA5IDU0LjgwNTkgNTAuNSA1NC44MDU5QzUyLjQ4OTEgNTQuODA1OSA1NC4zOTY4IDU0LjAxODIgNTUuODAzMyA1Mi42MTZDNTcuMjA5OCA1MS4yMTM4IDU4IDQ5LjMxMjEgNTggNDcuMzI5MVYyOS4zODQ2QzU4IDI4LjE5NDggNTcuNTI1OSAyNy4wNTM3IDU2LjY4MiAyNi4yMTI0QzU1LjgzODEgMjUuMzcxMSA1NC42OTM1IDI0Ljg5ODQgNTMuNSAyNC44OTg0Wk0yOS41IDUxLjgxNTJDMjguNjEgNTEuODE1MiAyNy43NCA1MS41NTIxIDI2Ljk5OTkgNTEuMDU5MUMyNi4yNTk5IDUwLjU2NjIgMjUuNjgzMSA0OS44NjU2IDI1LjM0MjUgNDkuMDQ1OEMyNS4wMDE5IDQ4LjIyNjEgMjQuOTEyOCA0Ny4zMjQxIDI1LjA4NjUgNDYuNDUzOUMyNS4yNjAxIDQ1LjU4MzYgMjUuNjg4NyA0NC43ODQzIDI2LjMxOCA0NC4xNTY5QzI2Ljk0NzQgNDMuNTI5NSAyNy43NDkyIDQzLjEwMjIgMjguNjIyMSA0Mi45MjkxQzI5LjQ5NSA0Mi43NTYgMzAuMzk5OCA0Mi44NDQ5IDMxLjIyMjEgNDMuMTg0NEMzMi4wNDQzIDQzLjUyNCAzMi43NDcxIDQ0LjA5OSAzMy4yNDE2IDQ0LjgzNjdDMzMuNzM2MSA0NS41NzQ0IDM0IDQ2LjQ0MTggMzQgNDcuMzI5MUMzNCA0OC41MTg5IDMzLjUyNTkgNDkuNjU5OSAzMi42ODIgNTAuNTAxMkMzMS44MzgxIDUxLjM0MjUgMzAuNjkzNSA1MS44MTUyIDI5LjUgNTEuODE1MlpNNTAuNSA1MS44MTUyQzQ5LjYxIDUxLjgxNTIgNDguNzQgNTEuNTUyMSA0Ny45OTk5IDUxLjA1OTFDNDcuMjU5OSA1MC41NjYyIDQ2LjY4MzEgNDkuODY1NiA0Ni4zNDI1IDQ5LjA0NThDNDYuMDAxOSA0OC4yMjYxIDQ1LjkxMjggNDcuMzI0MSA0Ni4wODY1IDQ2LjQ1MzlDNDYuMjYwMSA0NS41ODM2IDQ2LjY4ODcgNDQuNzg0MyA0Ny4zMTggNDQuMTU2OUM0Ny45NDc0IDQzLjUyOTUgNDguNzQ5MiA0My4xMDIyIDQ5LjYyMjEgNDIuOTI5MUM1MC40OTUgNDIuNzU2IDUxLjM5OTggNDIuODQ0OSA1Mi4yMjIxIDQzLjE4NDRDNTMuMDQ0MyA0My41MjQgNTMuNzQ3MSA0NC4wOTkgNTQuMjQxNiA0NC44MzY3QzU0LjczNjEgNDUuNTc0NCA1NSA0Ni40NDE4IDU1IDQ3LjMyOTFDNTUgNDguNTE4OSA1NC41MjU5IDQ5LjY1OTkgNTMuNjgyIDUwLjUwMTJDNTIuODM4MSA1MS4zNDI1IDUxLjY5MzUgNTEuODE1MiA1MC41IDUxLjgxNTJaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNTggNTcuOTE0MUwyMiAyMS45MTQxIiBzdHJva2U9IndoaXRlIiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L2c+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZCIgeD0iMCIgeT0iMCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjgwIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIi8+CjxmZU9mZnNldC8+CjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjQiLz4KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvdyIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvdyIgcmVzdWx0PSJzaGFwZSIvPgo8L2ZpbHRlcj4KPGNsaXBQYXRoIGlkPSJjbGlwMCI+CjxyZWN0IHdpZHRoPSI0MCIgaGVpZ2h0PSIzOS44NzY3IiBmaWxsPSJ3aGl0ZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjAgMTkuOTE0MSkiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iNiIgZmlsbD0iYmxhY2siIGZpbGwtb3BhY2l0eT0iMC44Ii8+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiPgo8cGF0aCBkPSJNNDUuNSAxNi44OTg0SDQ0QzQzLjYwMjIgMTYuODk4NCA0My4yMjA2IDE3LjA1NiA0Mi45MzkzIDE3LjMzNjRDNDIuNjU4IDE3LjYxNjkgNDIuNSAxNy45OTcyIDQyLjUgMTguMzkzOEM0Mi41IDE4Ljc5MDQgNDIuNjU4IDE5LjE3MDggNDIuOTM5MyAxOS40NTEyQzQzLjIyMDYgMTkuNzMxNiA0My42MDIyIDE5Ljg4OTIgNDQgMTkuODg5Mkg0NS41QzQ1Ljg5NzggMTkuODg5MiA0Ni4yNzk0IDIwLjA0NjcgNDYuNTYwNyAyMC4zMjcyQzQ2Ljg0MiAyMC42MDc2IDQ3IDIwLjk4OCA0NyAyMS4zODQ2VjMzLjM4NDlDNDUuNzA5MyAzMi4zOTU4IDQ0LjEyOCAzMS44NTcyIDQyLjUgMzEuODUyMkM0MS4yNzE3IDMxLjg1MjggNDAuMDYyNCAzMi4xNTQxIDM4Ljk3ODMgMzIuNzI5N0MzNy44OTQyIDMzLjMwNTMgMzYuOTY4NSAzNC4xMzc1IDM2LjI4MjUgMzUuMTUzMkMzNS43MjYxIDM0LjU4MjEgMzUuMDYwMyAzNC4xMjgxIDM0LjMyNDggMzMuODE4QzMzLjU4OTIgMzMuNTA4IDMyLjc5ODYgMzMuMzQ4MyAzMiAzMy4zNDgzQzMxLjIwMTQgMzMuMzQ4MyAzMC40MTA4IDMzLjUwOCAyOS42NzUyIDMzLjgxOEMyOC45Mzk3IDM0LjEyODEgMjguMjczOSAzNC41ODIxIDI3LjcxNzUgMzUuMTUzMkMyNy4wMzE1IDM0LjEzNzUgMjYuMTA1OCAzMy4zMDUzIDI1LjAyMTcgMzIuNzI5N0MyMy45Mzc2IDMyLjE1NDEgMjIuNzI4MyAzMS44NTI4IDIxLjUgMzEuODUyMkMxOS44NzIgMzEuODU3MiAxOC4yOTA3IDMyLjM5NTggMTcgMzMuMzg0OVYyMS4zODQ2QzE3IDIwLjk4OCAxNy4xNTggMjAuNjA3NiAxNy40MzkzIDIwLjMyNzJDMTcuNzIwNiAyMC4wNDY3IDE4LjEwMjIgMTkuODg5MiAxOC41IDE5Ljg4OTJIMjBDMjAuMzk3OCAxOS44ODkyIDIwLjc3OTQgMTkuNzMxNiAyMS4wNjA3IDE5LjQ1MTJDMjEuMzQyIDE5LjE3MDggMjEuNSAxOC43OTA0IDIxLjUgMTguMzkzOEMyMS41IDE3Ljk5NzIgMjEuMzQyIDE3LjYxNjkgMjEuMDYwNyAxNy4zMzY0QzIwLjc3OTQgMTcuMDU2IDIwLjM5NzggMTYuODk4NCAyMCAxNi44OTg0SDE4LjVDMTcuMzA2NSAxNi44OTg0IDE2LjE2MTkgMTcuMzcxMSAxNS4zMTggMTguMjEyNEMxNC40NzQxIDE5LjA1MzcgMTQgMjAuMTk0OCAxNCAyMS4zODQ2VjM5LjMyOTFDMTQgNDEuMzEyMSAxNC43OTAyIDQzLjIxMzggMTYuMTk2NyA0NC42MTZDMTcuNjAzMiA0Ni4wMTgyIDE5LjUxMDkgNDYuODA1OSAyMS41IDQ2LjgwNTlDMjMuNDg5MSA0Ni44MDU5IDI1LjM5NjggNDYuMDE4MiAyNi44MDMzIDQ0LjYxNkMyOC4yMDk4IDQzLjIxMzggMjkgNDEuMzEyMSAyOSAzOS4zMjkxQzI5IDM4LjUzNTkgMjkuMzE2MSAzNy43NzUyIDI5Ljg3ODcgMzcuMjE0M0MzMC40NDEzIDM2LjY1MzQgMzEuMjA0NCAzNi4zMzgzIDMyIDM2LjMzODNDMzIuNzk1NiAzNi4zMzgzIDMzLjU1ODcgMzYuNjUzNCAzNC4xMjEzIDM3LjIxNDNDMzQuNjgzOSAzNy43NzUyIDM1IDM4LjUzNTkgMzUgMzkuMzI5MUMzNSA0MS4zMTIxIDM1Ljc5MDIgNDMuMjEzOCAzNy4xOTY3IDQ0LjYxNkMzOC42MDMyIDQ2LjAxODIgNDAuNTEwOSA0Ni44MDU5IDQyLjUgNDYuODA1OUM0NC40ODkxIDQ2LjgwNTkgNDYuMzk2OCA0Ni4wMTgyIDQ3LjgwMzMgNDQuNjE2QzQ5LjIwOTggNDMuMjEzOCA1MCA0MS4zMTIxIDUwIDM5LjMyOTFWMjEuMzg0NkM1MCAyMC4xOTQ4IDQ5LjUyNTkgMTkuMDUzNyA0OC42ODIgMTguMjEyNEM0Ny44MzgxIDE3LjM3MTEgNDYuNjkzNSAxNi44OTg0IDQ1LjUgMTYuODk4NFpNMjEuNSA0My44MTUyQzIwLjYxIDQzLjgxNTIgMTkuNzQgNDMuNTUyMSAxOC45OTk5IDQzLjA1OTFDMTguMjU5OSA0Mi41NjYyIDE3LjY4MzEgNDEuODY1NiAxNy4zNDI1IDQxLjA0NThDMTcuMDAxOSA0MC4yMjYxIDE2LjkxMjggMzkuMzI0MSAxNy4wODY1IDM4LjQ1MzlDMTcuMjYwMSAzNy41ODM2IDE3LjY4ODcgMzYuNzg0MyAxOC4zMTggMzYuMTU2OUMxOC45NDc0IDM1LjUyOTUgMTkuNzQ5MiAzNS4xMDIyIDIwLjYyMjEgMzQuOTI5MUMyMS40OTUgMzQuNzU2IDIyLjM5OTggMzQuODQ0OSAyMy4yMjIxIDM1LjE4NDRDMjQuMDQ0MyAzNS41MjQgMjQuNzQ3MSAzNi4wOTkgMjUuMjQxNiAzNi44MzY3QzI1LjczNjEgMzcuNTc0NCAyNiAzOC40NDE4IDI2IDM5LjMyOTFDMjYgNDAuNTE4OSAyNS41MjU5IDQxLjY1OTkgMjQuNjgyIDQyLjUwMTJDMjMuODM4MSA0My4zNDI1IDIyLjY5MzUgNDMuODE1MiAyMS41IDQzLjgxNTJaTTQyLjUgNDMuODE1MkM0MS42MSA0My44MTUyIDQwLjc0IDQzLjU1MjEgMzkuOTk5OSA0My4wNTkxQzM5LjI1OTkgNDIuNTY2MiAzOC42ODMxIDQxLjg2NTYgMzguMzQyNSA0MS4wNDU4QzM4LjAwMTkgNDAuMjI2MSAzNy45MTI4IDM5LjMyNDEgMzguMDg2NSAzOC40NTM5QzM4LjI2MDEgMzcuNTgzNiAzOC42ODg3IDM2Ljc4NDMgMzkuMzE4IDM2LjE1NjlDMzkuOTQ3NCAzNS41Mjk1IDQwLjc0OTIgMzUuMTAyMiA0MS42MjIxIDM0LjkyOTFDNDIuNDk1IDM0Ljc1NiA0My4zOTk4IDM0Ljg0NDkgNDQuMjIyMSAzNS4xODQ0QzQ1LjA0NDMgMzUuNTI0IDQ1Ljc0NzEgMzYuMDk5IDQ2LjI0MTYgMzYuODM2N0M0Ni43MzYxIDM3LjU3NDQgNDcgMzguNDQxOCA0NyAzOS4zMjkxQzQ3IDQwLjUxODkgNDYuNTI1OSA0MS42NTk5IDQ1LjY4MiA0Mi41MDEyQzQ0LjgzODEgNDMuMzQyNSA0My42OTM1IDQzLjgxNTIgNDIuNSA0My44MTUyWiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTUwIDQ5LjkxNDFMMTQgMTMuOTE0MSIgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMCI+CjxyZWN0IHdpZHRoPSI0MCIgaGVpZ2h0PSIzOS44NzY3IiBmaWxsPSJ3aGl0ZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIgMTEuOTE0MSkiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K"]; +c=".trial_banner {position: relative;transform: translateZ(0); } .trial_banner .banner-content, .trial_banner .banner-content_hover {position: absolute;left: 0;right: 0;top: 0;bottom: 0;width: 100%;height: 100%; } .trial_banner .banner-content {visibility: visible;z-index: 1; } .trial_banner .banner-content_hover {visibility: hidden;z-index: 0; } .trial_banner .days_remaining {position: absolute;font-family: 'Open Sans', Arial, sans-serif;font-weight: normal;font-size: 13px;left: 65px;top: 41px;color: #7C1645;z-index: 1; } .trial_banner:hover .banner-content {visibility: hidden;z-index: 0; } .trial_banner:hover .banner-content_hover {visibility: visible;z-index: 1; }body {margin: 0;overflow-y: auto;overflow-x: hidden; } body .password_form, body .info_panel {position: absolute;background: #F7F7F7;border-radius: 4px;width: 513px;height: 210px;font-family: Arial; } body .password_form *, body .info_panel * {box-sizing: border-box; } body .password_form .password_label {position: absolute;color: #3A3A3A;font-size: 15px;top: 63px;left: 55px; } body .password_form .wrong_password_label {position: absolute;color: #DD4A37;font-size: 12px;top: 131px;left: 55px; } body .password_form input {position: absolute;width: 330px;height: 32px;background: #FFFFFF;border: 1px solid #D1D2D4;padding: 1px;border-radius: 2px;font-size: 18px;color: #231F20;left: 54px;top: 94px;padding-left: 8px; } body .password_form button {border: transparent;background: transparent;color: #343434;font-family: Arial;font-size: 15px;text-shadow: 0 1px 0 rgba(255, 255, 255, 0.4); } body .password_form button::before {background: linear-gradient(to bottom, #D3D3D3, #BABABA);position: absolute;content: '';top: 0;right: 0;bottom: 0;left: 0;border-radius: 4px;z-index: -1; } body .password_form button::after {background: linear-gradient(to bottom, #DCDCDC, #D1D1D1);position: absolute;content: '';top: 1px;right: 1px;bottom: 1px;left: 1px;border-radius: 4px;z-index: -1; } body .password_form .btn_ok {position: absolute;top: 94px;right: 55px;width: 60px;height: 32px;opacity: 0.99; } body .info_panel {display: table; } body .info_panel .label {position: static;display: table-cell;vertical-align: middle;width: 100%;padding-left: 120px;padding-right: 40px;color: #3A3A3A;font-size: 15px; } body .info_panel::after {position: absolute;content: '';width: 63px;height: 63px;top: 73px;left: 46px; } body .info_panel.domain::after {background: transparent url("+ +c[0]+"); } body .info_panel.time::after {background: transparent url("+c[1]+"); }#playerView * {position: static; }#playerView {position: static; }#content {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;padding: 0 96px;background: #CED1D3; }.presentation-view-mode-switch-control {width: 64px;height: 64px;position: fixed;left: 16px;top: 16px;cursor: pointer;border: none;background: url("+c[2]+") no-repeat center; } .presentation-view-mode-switch-control:hover {background: url("+ +c[3]+") no-repeat center; } .presentation-view-mode-switch-control:active {background: url("+c[4]+") no-repeat center; } .presentation-view-mode-switch-control:focus {outline: none; }.ppt-accessible-skin {font-family: Segoe UI, sans-serif;font-size: 20px;font-weight: normal;min-width: 0;padding: 20px 64px 20px 64px;box-sizing: border-box;background: #FFFFFF; }.accessible-null-skin {font-family: Segoe UI, sans-serif;font-size: 20px;font-weight: normal;min-width: 0;padding: 20px 64px 20px 64px;box-sizing: border-box;background: #FFFFFF; }.ppt-accessible-slide {margin-bottom: 20px; } .ppt-accessible-slide img, .ppt-accessible-slide video, .ppt-accessible-slide audio {display: block;margin: 32px 0 32px 0; } .ppt-accessible-slide img {max-width: 100%;max-height: 30%; } .ppt-accessible-slide video {max-width: 100%; }.ppt-accessible-top-panel {margin-bottom: 20px; } .ppt-accessible-top-panel__slide-status {font-size: 20px;font-weight: 400; }.ppt-accessible-narration {margin: 16px 0; } .ppt-accessible-narration video {max-width: 100%; }.ppt-accessible-slide-content p {margin: 16px 0; }.ppt-accessible-slide-content h2 {font-size: 30px;margin: 0; }.ppt-accessible-skip-link-container {position: relative;height: 27px; }.ppt-accessible-skip-link {position: absolute !important;display: block;left: -10000px;width: 1px;height: 1px;overflow: hidden; } .ppt-accessible-skip-link:focus {left: auto;width: auto;height: auto; }.simple-navigation-panel {margin-top: 32px;margin-bottom: 32px;float: left;direction: rtl; } .simple-navigation-panel__button {width: 217px;height: 46px;font-family: Segoe UI, sans-serif;font-size: 20px;font-weight: normal; } .simple-navigation-panel__button:nth-child(1) {margin-left: 12px; }.ppt-accessible-slide-list-wrapper {clear: both; }.ppt-accessible-slide-list {clear: both;margin: 16px 0;margin-top: 0; } .ppt-accessible-slide-list summary {font-weight: 600;margin-bottom: 8px; } .ppt-accessible-slide-list ul {padding: 0;margin: 0; } .ppt-accessible-slide-list__item {list-style: none; } .ppt-accessible-slide-list__item {cursor: pointer; } .ppt-accessible-slide-list__item.ppt-accessible-slide-list__item_active {color: #A52A2A; }.ppt-accessible-slide-notes {clear: both;margin: 16px 0; } .ppt-accessible-slide-notes summary {font-weight: 600;margin-bottom: 8px; } .ppt-accessible-slide-notes ul {padding: 0;margin: 0; } .ppt-accessible-slide-notes__item {list-style: none; } .ppt-accessible-slide-notes p {margin: 0; }.ppt-accessible-resources {clear: both;margin: 16px 0; } .ppt-accessible-resources summary {font-weight: 600;margin-bottom: 8px; } .ppt-accessible-resources ul {padding: 0;margin: 0; } .ppt-accessible-resources__item {list-style: none; }.ppt-accessible-presenter {clear: both;margin: 16px 0; } .ppt-accessible-presenter summary {font-weight: 600;margin-bottom: 8px; } .ppt-accessible-presenter ul {padding: 0;margin: 0; } .ppt-accessible-presenter__item {list-style: none; } .ppt-accessible-presenter p {margin: 6px 0;white-space: pre-line; } .ppt-accessible-presenter a, .ppt-accessible-presenter img {display: block;margin: 6px 0; }.quiz-accessible-skin {width: 100%;position: static !important; }.quiz-accessible-top-panel {padding-left: 0 !important;padding-right: 0 !important; }.quiz-accessible-slide {padding-left: 0 !important;padding-right: 0 !important; }.quiz-accessible-hidden-link-container {padding: 0 !important; }.quiz-accessible-control-panel {padding: 0 !important;margin-top: 32px;margin-bottom: 32px; }.quiz-accessible-slide-list {padding: 0 !important;margin: 16px 0 !important; }.accessible-quiz-review {padding: 0 !important;margin-bottom: 20px; }.ppt-accessible-scenario-slide-content {padding-top: 32px; }.scenario-accessible-skin {width: 100%;padding: 0 !important; }.ppt-accessible-footer .page-controls {position: relative;margin-top: 32px;margin-bottom: 32px;left: 0;top: 0;direction: rtl;float: left; } .ppt-accessible-footer .page-controls button {margin: 0;min-width: 217px;min-height: 46px;font-family: 'Segoe UI', sans-serif;font-size: 20px; } .ppt-accessible-footer .page-controls button:first-child {margin-left: 12px; }.ppt-accessible-footer .items-list {clear: both;margin-bottom: 16px;padding: 0;font-size: 20px; } .ppt-accessible-footer .items-list summary {margin-bottom: 8px;font-weight: 600; }.ppt-accessible-footer .scenario-accessible-bottom-panel__button {width: 217px;height: 46px;font-family: Segoe UI, sans-serif;font-size: 20px;font-weight: normal; }"; +let d;for(const [f,g]of Object.entries(null!=(d=a)?d:{}))a=`__${f.replace(RegExp("\\.","g"),"_")}__`,c=c.replace(new RegExp(a,"g"),g);let e;for(const [f,g]of Object.entries(null!=(e=b)?e:{}))c=c.replace(new RegExp(f,"g"),g);c=c.replace(/__verticalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.rn);c=c.replace(/__horizontalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.pn);return gn(c)}rn(a,b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}pn(a, +b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}};class yG{Uq(a,b){const c=g=>{g=sh(g);let h;for(const [l,n]of Object.entries(null!=(h=a)?h:{}))g=g.replace(new RegExp(`{${l}}`,"g"),n);return qh(g)};let d=function(){var g=["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAADcmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmFjOGVjNDFhLTZkYWItODQ0Ni04YzkzLWU1Mjk3N2YwMmE4NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFRThCNzU3NDYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFRThCNzU3MzYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cykiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0OWFlZmI1OC00ZWFmLWQ3NDgtYTI0ZS0zNmNhNGQ2M2QwNTYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6N0MwQkFBM0M2MjAxMTFFNUI4QjBERTk4MjY5MjQwQjUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6MGSVVAAAE3klEQVR42uycW4hWVRiG15Q4eYzGQySSQlriEQ9BF2mE4iSdESRRIb0RD+mNmHgICjqQEGUe6sqgCy1i0iRinAzELrooQhHLGQURUTzMiM7omCLj+/F/czX/t/890z6s9e/3hZcZ1l6z19r7mXXca62arq4uR/mjh/gKCIQiEAKhCIRAKAIhEIpACIQiEIpACIQiEAKhCIRAKAIhEMoX9Yu62NbWxjcUobq6OpaQQpcQz/QwPBOeDU+Fx8Oj4UfhoRrnJnwDvgC3wCfgY/Bf8P0QHrImahmQB1VWLfwGvAieqy+/LxJIR+Dv4QPwf75WWb4CGQavg9fo70mqFd4F79DfCSRCA+HN8Hp4cMppdcBfwB/Bt9mo99Sr8Cl4SwYwnKYhaf2jaXMconoE/hL+CR6TQ/pPato7NS+FbtSfgH+Gp8eMfwv+HT6qpakZvqzVT/d//ePw0/BEeI72ygbFvP/f8MvwpSK2IfLSGuGxFeJ1aby98CG4s5fpDNAqaTlcL89cIf45jddcpDZknI4PKsFo0NKzQLusnX1Iq1P/doHe60CF+GM1b+OK0obIYO5XeGREnLPwfHghfDzBtOVeb+q9z0bEG6njltHVDqQ2RuP9HTwDbkoxH02axv4YjX1tNQP5LKIBl7ZiK/yWToGkLUljsaZpNaTTNc9VCeR1eHUEjHfgD3OoQiXNVRFQVmveqwrIEHh3xPXNOp2Rl77WPFiSvA+tJiCb4FHGNanHP/FggCp52Gdck7y/Wy0Dw2Hatx9s9KZmZNRmxC3JMjh8qsy1Du0St4Y+DomaKFzlEQxRu+apnOQZ1oVeZfWPeMCGlLu2/6dL3BDRwPcPGYiMjocbvaoPnL963+h1DddnChbIMiP8cMIj8KQln34be/lM3gOREW69cW2v81/fGOH1aY7e0wTyrNGYyxT6wQCAHNS8lmvcZ4UIZL4RLt8z7gQA5I7mtZyeCxHIS0b4UReOrLw+EyIQqxScDAiIldcJIQLZYTTmvwUEpMUIHxMikB/gta40PXIF/lwHVrcCAnLVCH8srQR9X7mYt2RUbq1yrOFia390N9SReugaYoR3EEg+GmGEtxNIPhpvhJ8nkHw02Qj/l0Dy0Rwj/DSBZC9ZeD3buPYHgWSv11z5RdrSw/qTQLLX20Z4o0toSxyBxJdsKrVmq79NM2ECKa/3XPltC9fgXwgkW81zpVX35fSVS3HahEB6SqZK9hjXujeJOgLJTrLG19qos1OrLALJSLL+eLFx7SL8cRaZIJCSVrrSfnVL8qHtJoFkoy3ablibQeWz849ZZaZfgUHIfg/Z97EkIs5xLR2OQNLv2u5x0Ttt5UShV1wfj91glRVP01xp8UVTBRiyuOFFheJYQpKVzNrKwQErXPyDA2SF+5k8MhsykCnwPdfzaA3ZYy6nREyCX4Cfd/EPs+nV0RoEUlqWsx1eCie9Bkc2nW5wOa87Dg3Ipy75bWXntSd1yIcHDK1RT3KzTIcOBif6AqOo3d42HX/I0tZW3zIXWgnp68chmfaQjZxyoKac0bXNRxghlpCN2m1dpj/btXEfpD0uqYaua89Luq3dx8TKN3AeE1vt4mLrAohACIQiEAKhCIRAKAIhEIpACq7IqROKJYRA+AoIhCIQAqEIhEAoAiEQikCKrQcCDABHPgH2w7NQdAAAAABJRU5ErkJggg==", +"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICB3aWR0aD0iMjhweCIgaGVpZ2h0PSIzM3B4IiB2aWV3Qm94PSIwIDAgMjguMzAyIDMzLjI0MiI+DQoJPHBhdGggZD0iTTAsMS44VjMxLjQ0MmExLjgsMS44LDAsMCwwLDIuNzI2LDEuNTQzbDI0LjctMTQuODJhMS44LDEuOCwwLDAsMCwwLTMuMDg3TDIuNzI2LjI1N0ExLjgsMS44LDAsMCwwLDAsMS44WiIgc3R5bGU9ImZpbGw6IzMzMyIvPg0KPC9zdmc+","data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyOHB4IiBoZWlnaHQ9IjMzcHgiIHZpZXdCb3g9IjAgMCAyOC4zMDIgMzMuMjQyIj4NCgk8cGF0aCBkPSJNMCwxLjhWMzEuNDQyYTEuOCwxLjgsMCwwLDAsMi43MjYsMS41NDNsMjQuNy0xNC44MmExLjgsMS44LDAsMCwwLDAtMy4wODdMMi43MjYuMjU3QTEuOCwxLjgsMCwwLDAsMCwxLjhaIiBzdHlsZT0iZmlsbDojNTI4YmRmIi8+DQo8L3N2Zz4=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA5LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDksMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbD0iI0RENEIzOCIgZD0iTTIxLjA0MSwyOXY5Ljg0NGMwLDUuNTA4LDQuNjkxLDkuOTczLDEwLjQ3OSw5Ljk3M2M1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTczVjI5SDIxLjA0MXoiLz4NCjxwYXRoIGZpbGw9IiNERDRCMzgiIGQ9Ik0yNi41NTgsMjl2LTcuNjg5YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MlYyOWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNFYyOUgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjEuMDQxLDI4LjIwNnY5Ljg0NWMwLDUuNTA2LDQuNjkxLDkuOTcxLDEwLjQ3OSw5Ljk3MWM1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTcxdi05Ljg0NUgyMS4wNDF6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjYuNTU4LDI4LjA0VjIwLjM1YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MnY3LjY4OWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNHY4LjA1NEgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRjA4RjgyIiBkPSJNMzQsMzYuMzY1YzAtMS4yODctMS4wNDQtMi4zMzEtMi4zMzEtMi4zMzFjLTEuMjg4LDAtMi4zMzIsMS4wNDQtMi4zMzIsMi4zMzENCgljMCwwLjk3MSwwLjU5NCwxLjgwMiwxLjQzOCwyLjE1MnY0LjQ2N2gxLjkxdi00LjUyOUMzMy40NjEsMzguMDc2LDM0LDM3LjI4NywzNCwzNi4zNjV6Ii8+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA4LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDgsMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik01OS42NDYsMzFoLTMuMjkzQzU2LjE1OCwzMSw1NiwzMS40NDgsNTYsMzINCgljMCwwLjU1MywwLjE1OCwxLDAuMzU0LDFoMy4yOTNDNTkuODQyLDMzLDYwLDMyLjU1Myw2MCwzMkM2MCwzMS40NDgsNTkuODQyLDMxLDU5LjY0NiwzMXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjREQ0QjM4IiBkPSJNNi42NDcsMzFIMy4zNTNDMy4xNTgsMzEsMywzMS40NDgsMywzMmMwLDAuNTUzLDAuMTU4LDEsMC4zNTMsMQ0KCWgzLjI5NEM2Ljg0MiwzMyw3LDMyLjU1Myw3LDMyQzcsMzEuNDQ4LDYuODQyLDMxLDYuNjQ3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik0zMSw4YzAuNTUzLDAsMS0wLjE1OCwxLTAuMzUzVjQuMzUzQzMyLDQuMTU4LDMxLjU1Myw0LDMxLDQNCgljLTAuNTUyLDAtMSwwLjE1OC0xLDAuMzUzdjMuMjk0QzMwLDcuODQyLDMwLjQ0OCw4LDMxLDh6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTMxLDU2Yy0wLjU1MiwwLTEsMC4xNTgtMSwwLjM1NHYzLjI5M0MzMCw1OS44NDIsMzAuNDQ4LDYwLDMxLDYwDQoJYzAuNTUzLDAsMS0wLjE1OCwxLTAuMzU0di0zLjI5M0MzMiw1Ni4xNTgsMzEuNTUzLDU2LDMxLDU2eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik00Ny42NjgsMzFoLTEyLjgxQzM0LjQ5NiwyOS42LDMzLjQsMjguNTA1LDMyLDI4LjE0Mg0KCWMwLDAtMC4xNzItMC4xNDItMS0wLjE0MmMtMC44MjksMC0yLDAuNTU1LTIsMC41NTVjLTEuMTksMC42OTMtMiwxLjk2OS0yLDMuNDQ1YzAsMi4yMDksMS43OTEsNCw0LDRjMS40NzcsMCwyLjc1Mi0wLjgwOSwzLjQ0NS0yDQoJaDEzLjIyM0M0OC40MDQsMzQsNDksMzMuMzI4LDQ5LDMyLjVDNDksMzEuNjcyLDQ4LjQwNCwzMSw0Ny42NjgsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTI3LjAxOCwyOS43NDhjMC41OTIsMS4wMjUsMS42NTIsMS41MiwyLjM3LDEuMTA2bDAsMA0KCWMwLjcxNy0wLjQxNSwwLjgxOS0xLjU4MSwwLjIyOC0yLjYwNmwtNy44NTctMTMuNjA5Yy0wLjU5Mi0xLjAyNC0xLjY1My0xLjUyLTIuMzcxLTEuMTA2bDAsMGMtMC43MTcsMC40MTUtMC44MTgsMS41ODEtMC4yMjgsMi42MDUNCglMMjcuMDE4LDI5Ljc0OHoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMjcuMDE4LDI4LjM2MWMwLjU5MiwxLjAyNSwxLjY1MiwxLjUyLDIuMzcsMS4xMDZsMCwwDQoJYzAuNzE3LTAuNDE1LDAuODE5LTEuNTgxLDAuMjI4LTIuNjA2bC03Ljg1Ny0xMy42MDljLTAuNTkyLTEuMDI0LTEuNjUzLTEuNTItMi4zNzEtMS4xMDZsMCwwYy0wLjcxNywwLjQxNS0wLjgxOCwxLjU4MS0wLjIyOCwyLjYwNQ0KCUwyNy4wMTgsMjguMzYxeiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgY3g9IjMxIiBjeT0iMzEiIHI9IjQiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNjAsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzU0LDFoLTMuMjkzQzU2LjE1OCwzMiw1NiwzMS41NTIsNTYsMzENCglsMCwwYzAtMC41NTIsMC4xNTgtMSwwLjM1NC0xaDMuMjkzQzU5Ljg0MiwzMCw2MCwzMC40NDgsNjAsMzFMNjAsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTcsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzUzLDFIMy4zNTNDMy4xNTgsMzIsMywzMS41NTIsMywzMWwwLDANCgljMC0wLjU1MiwwLjE1OC0xLDAuMzUzLTFoMy4yOTRDNi44NDIsMzAsNywzMC40NDgsNywzMUw3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0zMSwzYzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDYuODQyLDMxLjU1Myw3LDMxLDdsMCwwDQoJYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1M1YzLjM1M0MzMCwzLjE1OCwzMC40NDgsMywzMSwzTDMxLDN6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTMxLDU1YzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDU4Ljg0MiwzMS41NTMsNTksMzEsNTkNCglsMCwwYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1NHYtMy4yOTRDMzAsNTUuMTU4LDMwLjQ0OCw1NSwzMSw1NUwzMSw1NXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNDksMzEuNDk5QzQ5LDMwLjY3Miw0OC40MDQsMzAsNDcuNjY4LDMwSDM0LjMzMw0KCUMzMy41OTYsMzAsMzMsMzAuNjcxLDMzLDMxLjVsMCwwYzAsMC44MjgsMC41OTYsMS41LDEuMzMzLDEuNWgxMy4zMzVDNDguNDA0LDMzLDQ5LDMyLjMyOCw0OSwzMS40OTlMNDksMzEuNDk5eiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YxNjE1NSIgY3g9IjMxIiBjeT0iMzEiIHI9IjIiLz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjM2MzgxNDQiPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgzNjAiIGNsYXNzPSJmaWwwIiBkPSJNNi43NzM1IDMuOTc5bDAgLTMuNDQyNDVjMCwtMC4yOTUxMTkgLTAuMjQxNDMzLC0wLjUzNjU1MiAtMC41MzY1NTIsLTAuNTM2NTUybC02LjIzNjk1IDAgMCA0LjUxNTU1IDYuMjM2OTUgMGMwLjI5NTExOSwwIDAuNTM2NTUyLC0wLjI0MTQzMyAwLjUzNjU1MiwtMC41MzY1NTJ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMzYzODEyMCIgY2xhc3M9ImZpbDEiIGQ9Ik0zLjE4NzUgMS4yMzAyMWwtMC4zMzU1NTIgMC4zMzU1MTQgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAtMC4yMjM2NjQgMC4yMjM2NjQgMC40NDczNjUgMC40NDczNjUgLTAuMzM1NTE0IDAuMzM1NTUyIDAuODk0NzMgMCAwIC0wLjg5NDczem0wLjI2NTY0MSAyLjA1NTFsMC4zMzU1MTQgLTAuMzM1NTE0IDAuNDQ3MzY1IDAuNDQ3MzY1IDAuMjIzNzAxIC0wLjIyMzcwMSAtMC40NDczNjUgLTAuNDQ3MzY1IDAuMzM1NTE0IC0wLjMzNTUxNCAtMC44OTQ3MyAwIDAgMC44OTQ3M3oiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDojRkVGRUZFO2ZpbGwtb3BhY2l0eTowLjEwMTk2MX0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIzNjM4MTQ0Ij4NCiAgIDxwYXRoIGlkPSJfMTIzNjM4MzYwIiBjbGFzcz0iZmlsMCIgZD0iTTYuNzczNSAzLjk3OWwwIC0zLjQ0MjQ1YzAsLTAuMjk1MTE5IC0wLjI0MTQzMywtMC41MzY1NTIgLTAuNTM2NTUyLC0wLjUzNjU1MmwtNi4yMzY5NSAwIDAgNC41MTU1NSA2LjIzNjk1IDBjMC4yOTUxMTksMCAwLjUzNjU1MiwtMC4yNDE0MzMgMC41MzY1NTIsLTAuNTM2NTUyeiIvPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgxMjAiIGNsYXNzPSJmaWwxIiBkPSJNMy4xODc1IDEuMjMwMjFsLTAuMzM1NTUyIDAuMzM1NTE0IC0wLjQ0NzM2NSAtMC40NDczNjUgLTAuMjIzNjY0IDAuMjIzNjY0IDAuNDQ3MzY1IDAuNDQ3MzY1IC0wLjMzNTUxNCAwLjMzNTU1MiAwLjg5NDczIDAgMCAtMC44OTQ3M3ptMC4yNjU2NDEgMi4wNTUxbDAuMzM1NTE0IC0wLjMzNTUxNCAwLjQ0NzM2NSAwLjQ0NzM2NSAwLjIyMzcwMSAtMC4yMjM3MDEgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAwLjMzNTUxNCAtMC4zMzU1MTQgLTAuODk0NzMgMCAwIDAuODk0NzN6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDojRkVGRUZFO2ZpbGwtb3BhY2l0eTowLjA1MDk4MH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIzNjM4MTQ0Ij4NCiAgIDxwYXRoIGlkPSJfMTIzNjM4MzYwIiBjbGFzcz0iZmlsMCIgZD0iTTYuNzczNSAzLjk3OWwwIC0zLjQ0MjQ1YzAsLTAuMjk1MTE5IC0wLjI0MTQzMywtMC41MzY1NTIgLTAuNTM2NTUyLC0wLjUzNjU1MmwtNi4yMzY5NSAwIDAgNC41MTU1NSA2LjIzNjk1IDBjMC4yOTUxMTksMCAwLjUzNjU1MiwtMC4yNDE0MzMgMC41MzY1NTIsLTAuNTM2NTUyeiIvPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgxMjAiIGNsYXNzPSJmaWwxIiBkPSJNMy4xODc1IDEuMjMwMjFsLTAuMzM1NTUyIDAuMzM1NTE0IC0wLjQ0NzM2NSAtMC40NDczNjUgLTAuMjIzNjY0IDAuMjIzNjY0IDAuNDQ3MzY1IDAuNDQ3MzY1IC0wLjMzNTUxNCAwLjMzNTU1MiAwLjg5NDczIDAgMCAtMC44OTQ3M3ptMC4yNjU2NDEgMi4wNTUxbDAuMzM1NTE0IC0wLjMzNTUxNCAwLjQ0NzM2NSAwLjQ0NzM2NSAwLjIyMzcwMSAtMC4yMjM3MDEgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAwLjMzNTUxNCAtMC4zMzU1MTQgLTAuODk0NzMgMCAwIDAuODk0NzN6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACHDwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKNWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAASMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEoqGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAGeIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gzSZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25qbc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9CvjcM4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjKuLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqxOPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIWiAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFVSAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAyrA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYghUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7rh2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SEdJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3JaSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQtlHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJy5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hopb2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsyu21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCccNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527PYS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOwEaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6sfaznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy+rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVsS1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9UxlfeqXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/wjowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9Vt1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503rm10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7Pnl/eriQvLDwG/eE8/s6uL5TAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAAGnRFWHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS4xMDD0cqEAAABfSURBVChTY/j//z8DMZgoRSCD4ApLK6rYgLgDiJ9CMYjNBrMNWWHnvAUL/3/4+BGMQWygwk5sCp+CFMDAhw8fQAqfYlcIlCRGYeeceQv+g0wCYRAbl9XEeYZQWBIdjgCVaiC8JN1udgAAAABJRU5ErkJggg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAACuSURBVHicY/n//z8DCLh7+/sAqWIgNmGAgDNA3Ltz68YtIA4LVFELkKpmQAUOIAyUawUqrmEBMnyxKEIG1UA1J0EmFsFELC3MGfJzssDsSVOnMxw7fgImVQRSaAzjgRQJCgqA2XnZmcgKjVnwWIkCWKC+cwRxJk6eypCfm80AYyOBMyCF/TCFx0+eAmMsoJ8F6PXNoCBgwO1zUPBsBrsRFE5AxSCXFzKgBng/LMABrBM9cyiwScIAAAAASUVORK5CYII=", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAZCAYAAABtnU33AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAETSURBVHic7ZgxCsJAFAUXSaeIpScQDyCCguA5rEUQEbWzsvACKhICaquHUQu18hxi6vgebCSgwSb5C2sGhpBkIX+aZIkTBIHS1OAI1mFR2cEDHuEKnnnB0TeGcAlzZuZKjTKswA4cwzWDW8rO2ChsY+OFwVNld2wIG6cMbpqeRJAmg0umpxCk5PxeYxdZsO1kwbaTBdvOXwb7MG96ECF8Bt9gw/QkQlwZ7Kr/CXYZvIdt2DU7S+rs4CF8afXgCU5g1dhI6XCHC7jlSRjM/zwbbUGbJDPY/7HGg/OEn/vUvvn2WfpYlAADfYyL9vSaIOZ+Ykh9hxkSFy0WSyQ3Ht+iRWOJ9E4rGq2UcCwxsbWMRovGkhc6FTEV3QXLmAAAAABJRU5ErkJggg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAElJREFUSEvt0qERAEAIA0H6b5rXL1ecI5qQOcIsanB+3TC5egZOyJm9B2Zgw0EnF+AeekPC+S3tGTjhoJMLcA+9IeG89+6L04QHtFKarLFAHLUAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAFBJREFUSEvtkjEKADAIA/PpQunnWzo63nBbBDdjOGPWPpd0yPCf5YLo5TNgB52Z54AZsKDQygVwDr5A4RxLfQbsUGjlAjgHX6Bw9r394KjDAzeSX574b7LUAAAAAElFTkSuQmCC", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAyMCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik03LjE3MDI1IDMuMDkxODJDOC4wNzEzMiAyLjY5OTkyIDkuMDMyNDkgMi41IDEwIDIuNUMxMC45Njc1IDIuNSAxMS45Mjg3IDIuNjk5OTIgMTIuODI5NyAzLjA5MTgyQzEzLjczMTIgMy40ODM4NyAxNC41NTgzIDQuMDYyMDIgMTUuMjYwNyA0Ljc5OTUyQzE1Ljk2MzQgNS41MzcyOCAxNi41MjY4IDYuNDE5NjcgMTYuOTEzMiA3LjM5OTI0QzE3LjI5OTcgOC4zNzg5NyAxNy41IDkuNDMyOTUgMTcuNSAxMC41SDIwQzIwIDkuMTIxMTIgMTkuNzQxMyA3Ljc1NTc0IDE5LjIzODggNi40ODE4MkMxOC43MzYyIDUuMjA3OSAxNy45OTk2IDQuMDUwMzkgMTcuMDcxMSAzLjA3NTM4QzE2LjE0MjUgMi4xMDAzNiAxNS4wNDAxIDEuMzI2OTQgMTMuODI2OCAwLjc5OTI2NUMxMi42MTM2IDAuMjcxNTg5IDExLjMxMzIgMCAxMCAwQzguNjg2NzggMCA3LjM4NjQyIDAuMjcxNTg5IDYuMTczMTcgMC43OTkyNjVDNC45NTk5MiAxLjMyNjk0IDMuODU3NTIgMi4xMDAzNiAyLjkyODkzIDMuMDc1MzhDMi4wMDAzNSA0LjA1MDM5IDEuMjYzNzUgNS4yMDc5IDAuNzYxMjA0IDYuNDgxODJDMC4yNTg2NTggNy43NTU3NCAwIDkuMTIxMTIgMCAxMC41SDIuNUMyLjUgOS40MzI5NSAyLjcwMDMgOC4zNzg5NyAzLjA4Njc5IDcuMzk5MjRDMy40NzMyMiA2LjQxOTY3IDQuMDM2NjUgNS41MzcyOCA0LjczOTI4IDQuNzk5NTJDNS40NDE2NiA0LjA2MjAyIDYuMjY4ODUgMy40ODM4NyA3LjE3MDI1IDMuMDkxODJaTTEwLjU3MSA3LjU4MzM1QzEwLjY4NDMgNy40OTI4MyAxMC43OTY2IDcuNDA0NSAxMC45MDcxIDcuMzE4ODNDMTEuMzUxNyA2Ljk3NDAzIDExLjc2NTggNi42NzI0MyAxMi4wODY4IDYuNDQ0OTlDMTIuMTcxNyA2LjM4NDgxIDEyLjI1MDEgNi4zMjk4MSAxMi4zMjA5IDYuMjgwNThDMTIuNDkgNi4xNjI5MiAxMi43MTIgNi4yOTExIDEyLjY5NDYgNi40OTYzOEMxMi42ODc0IDYuNTgyMjYgMTIuNjc5IDYuNjc3NjggMTIuNjY5MyA2Ljc4MTM0QzEyLjYzMjkgNy4xNzMwNCAxMi41Nzg3IDcuNjgyNDcgMTIuNTAyNCA4LjIzOTg4QzEyLjQ4MzQgOC4zNzgzNyAxMi40NjMxIDguNTE5ODIgMTIuNDQxMyA4LjY2MzE2QzEyLjI0NjggOS45NDQxNSAxMS45Mzc1IDExLjM3NjIgMTEuNDY0MSAxMi4xOTYyQzExLjA3MzYgMTIuODcyNiAxMC4wMzExIDEzLjY3ODIgOC43MzIwNSAxMi45MjgyQzcuNDMzMDEgMTIuMTc4MiA3LjYwOTQ4IDEwLjg3MjYgOCAxMC4xOTYyQzguNDczMzcgOS4zNzYyNSA5LjU1ODk0IDguMzkyMzEgMTAuNTcxIDcuNTgzMzVaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NzA3MjgiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjMzNjc2NjQiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjkxNDI4IDAuNjkxNDI4LDAuNjkxNDI4IDAuNjkxNDI4LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTcwNzA0IiBjbGFzcz0iZmlsMSIgZD0iTTAuMzQ1NzM2IDAuMTU3MTg4bC0wLjEyNTcyMiAwLjA5NDI2NDkgLTAuMDk0MzAwNiAwIDAgMC4xODg1ODMgMC4wOTQzMDA2IDAgMC4xMjU3MjIgMC4wOTQyNjQ5IDAgLTAuMzc3MTEzem0wLjE1NzExNyAtMi42NzI2N2UtMDA1bDAuMDMxNDMwNiAwIDAgMC4zNzcxNCAtMC4wMzE0MzA2IDAgMCAtMC4zNzcxNHptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjI1MTQwOSAtMC4wMzE0MzA2IDAgMCAtMC4yNTE0MDl6bS0wLjA2Mjg0MzMgMC4wNjI4NjExbDAuMDMxNDMwNiAwIDAgMC4xMjU2ODcgLTAuMDMxNDMwNiAwIDAgLTAuMTI1Njg3eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NjkwMjQiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjE5NjkyNDAiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjQzNjE2IDAuNjQzNjE2LDAuNjQzNjE2IDAuNjQzNjE2LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY5MDAwIiBjbGFzcz0iZmlsMSIgZD0iTTAuMzIxODM3IDAuMTQ2MzAybC0wLjExNzAyOSAwLjA4Nzc0NjYgLTAuMDg3Nzc5NyAwIDAgMC4xNzU1NDMgMC4wODc3Nzk3IDAgMC4xMTcwMjkgMC4wODc3NDY2IDAgLTAuMzUxMDM2em0wLjI3NzkwMSAwLjI1MDcyNmwtMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjA5MzA4NzIgLTAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjAyMDY5MDYgLTAuMDIwNjkwNiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAwLjAyMDY5MDYgLTAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MnoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTggM0MxOS4xMDQ2IDMgMjAgMy44OTU0MyAyMCA1VjE1QzIwIDE2LjEwNDYgMTkuMTA0NiAxNyAxOCAxN0gyQzAuODk1NDMxIDE3IDAgMTYuMTA0NiAwIDE1VjVDMCAzLjg5NTQzIDAuODk1NDMxIDMgMiAzSDE4Wk02LjU4MDA4IDcuMDA0ODhDNS41OTgzIDcuMDA0ODggNC44MjYwMSA3LjMyMDE1IDQuMjYzMTggNy45NTA2OEMzLjcwMDM1IDguNTgxMjIgMy40MTg5NSA5LjQyNTQ1IDMuNDE4OTUgMTAuNDgzNFYxMC42MDRDMy40MTg5NSAxMS43MDQzIDMuNzAyNDcgMTIuNTY2NSA0LjI2OTUzIDEzLjE5MDdDNC44MzY1OSAxMy44MTQ5IDUuNjExIDE0LjEyNyA2LjU5Mjc3IDE0LjEyN0M3LjExNzUyIDE0LjEyNyA3LjU5Njc2IDE0LjAyMDEgOC4wMzA1MiAxMy44MDY0QzguNDY0MjggMTMuNTkyNyA4LjgwNTk5IDEzLjI5MjIgOS4wNTU2NiAxMi45MDVDOS4zMDUzNCAxMi41MTc4IDkuNDMyMjkgMTIuMDkxNSA5LjQzNjUyIDExLjYyNkg3LjcxNjMxQzcuNzA3ODQgMTEuOTM0OSA3LjU5NzgyIDEyLjE4MjUgNy4zODYyMyAxMi4zNjg3QzcuMTc0NjQgMTIuNTU0OSA2Ljg5OTU4IDEyLjY0NzkgNi41NjEwNCAxMi42NDc5QzYuMTIwOTMgMTIuNjQ3OSA1Ljc5Mjk3IDEyLjQ5MzUgNS41NzcxNSAxMi4xODQ2QzUuMzYxMzMgMTEuODc1NiA1LjI1MzQyIDExLjM2NzggNS4yNTM0MiAxMC42NjExVjEwLjQ3MDdDNS4yNTM0MiA5Ljc3MjQ2IDUuMzYyMzkgOS4yNjc4MiA1LjU4MDMyIDguOTU2NzlDNS43OTgyNiA4LjY0NTc1IDYuMTIwOTMgOC40OTAyMyA2LjU0ODM0IDguNDkwMjNDNi44OTUzNSA4LjQ5MDIzIDcuMTc0NjQgOC42MDEzMiA3LjM4NjIzIDguODIzNDlDNy41OTc4MiA5LjA0NTY2IDcuNzA3ODQgOS4zMzQ0NyA3LjcxNjMxIDkuNjg5OTRIOS40MzY1MkM5LjQyODA2IDguODc3NDQgOS4xNjQ2NCA4LjIyNjgxIDguNjQ2MjQgNy43MzgwNEM4LjEyNzg1IDcuMjQ5MjcgNy40MzkxMyA3LjAwNDg4IDYuNTgwMDggNy4wMDQ4OFpNMTMuMzU5NCA3LjAwNDg4QzEyLjM3NzYgNy4wMDQ4OCAxMS42MDUzIDcuMzIwMTUgMTEuMDQyNSA3Ljk1MDY4QzEwLjQ3OTcgOC41ODEyMiAxMC4xOTgyIDkuNDI1NDUgMTAuMTk4MiAxMC40ODM0VjEwLjYwNEMxMC4xOTgyIDExLjcwNDMgMTAuNDgxOCAxMi41NjY1IDExLjA0ODggMTMuMTkwN0MxMS42MTU5IDEzLjgxNDkgMTIuMzkwMyAxNC4xMjcgMTMuMzcyMSAxNC4xMjdDMTMuODk2OCAxNC4xMjcgMTQuMzc2MSAxNC4wMjAxIDE0LjgwOTggMTMuODA2NEMxNS4yNDM2IDEzLjU5MjcgMTUuNTg1MyAxMy4yOTIyIDE1LjgzNSAxMi45MDVDMTYuMDg0NiAxMi41MTc4IDE2LjIxMTYgMTIuMDkxNSAxNi4yMTU4IDExLjYyNkgxNC40OTU2QzE0LjQ4NzEgMTEuOTM0OSAxNC4zNzcxIDEyLjE4MjUgMTQuMTY1NSAxMi4zNjg3QzEzLjk1MzkgMTIuNTU0OSAxMy42Nzg5IDEyLjY0NzkgMTMuMzQwMyAxMi42NDc5QzEyLjkwMDIgMTIuNjQ3OSAxMi41NzIzIDEyLjQ5MzUgMTIuMzU2NCAxMi4xODQ2QzEyLjE0MDYgMTEuODc1NiAxMi4wMzI3IDExLjM2NzggMTIuMDMyNyAxMC42NjExVjEwLjQ3MDdDMTIuMDMyNyA5Ljc3MjQ2IDEyLjE0MTcgOS4yNjc4MiAxMi4zNTk2IDguOTU2NzlDMTIuNTc3NiA4LjY0NTc1IDEyLjkwMDIgOC40OTAyMyAxMy4zMjc2IDguNDkwMjNDMTMuNjc0NiA4LjQ5MDIzIDEzLjk1MzkgOC42MDEzMiAxNC4xNjU1IDguODIzNDlDMTQuMzc3MSA5LjA0NTY2IDE0LjQ4NzEgOS4zMzQ0NyAxNC40OTU2IDkuNjg5OTRIMTYuMjE1OEMxNi4yMDc0IDguODc3NDQgMTUuOTQzOSA4LjIyNjgxIDE1LjQyNTUgNy43MzgwNEMxNC45MDcxIDcuMjQ5MjcgMTQuMjE4NCA3LjAwNDg4IDEzLjM1OTQgNy4wMDQ4OFoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxwYXRoIGNsYXNzPSJmaWwwIiBkPSJNLTAgMC4yNzExMDFsMCAxLjczOTM1YzAsMC4xNDkxMTMgMC4xMjE5ODgsMC4yNzExMDEgMC4yNzExMDEsMC4yNzExMDFsMy4xNTEzMSAwIDAgLTIuMjgxNTUgLTMuMTUxMzEgMGMtMC4xNDkxMTMsMCAtMC4yNzExMDEsMC4xMjE5ODggLTAuMjcxMTAxLDAuMjcxMTAxeiIvPg0KICA8cG9seWdvbiBjbGFzcz0iZmlsMSIgcG9pbnRzPSIxLjQwOTIsMC42NzEwMzggMi4wODAyOCwxLjE0MDc3IDEuNDA5MiwxLjYxMDUxICIvPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIxOTY2NTUyIj4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NzY4IiBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMzIzOTU2bDAgMi4wNzg0NmMwLDAuMTc4MTg1IDAuMTQ1NzcxLDAuMzIzOTU2IDAuMzIzOTU2LDAuMzIzOTU2bDMuNzY1NzEgMCAwIC0yLjcyNjM4IC0zLjc2NTcxIDBjLTAuMTc4MTg1LDAgLTAuMzIzOTU2LDAuMTQ1NzcxIC0wLjMyMzk1NiwwLjMyMzk1NnoiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NTI4IiBjbGFzcz0iZmlsMSIgZD0iTTEuNjAzOCAwLjg4MjAzOGwwLjMyMDc1MSAwIDAgMC45NjIyNTQgLTAuMzIwNzUxIDAgMCAtMC45NjIyNTR6bTAuNTYxMzMyIDBsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAhCAYAAAAYucG/AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAA+SURBVHicY/H09pViYQACFi4uLgYWbm5uOAHncsG4/Pz8xKv79u0bA8vXr1/hBJz7Dcb9+PEjIXVzZs18BgAgpy6CcHz1VgAAAABJRU5ErkJggg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsLW9wYWNpdHk9IjAiIGQ9Ik01MSw0LjA0MXYyNS45MThDNTEsMzIuMTgyLDQ5LjE4MiwzNCw0Ni45NiwzNEgwVjBoNDYuOTZDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDENCgkJCUw1MSw0LjA0MXoiLz4NCgkJPHBhdGggaWQ9Il8xMjMzNzQxNDQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xOCwxNS43MzdsMi41MjYtMi41MjZsMy4zNjksMy4zNjlsMS42ODQtMS42ODVsLTMuMzY4LTMuMzY4TDI0LjczNiw5aC01LjA1M0gxOHYxLjY4NA0KCQkJVjE1LjczN3ogTTM0LDE4LjI2NGwtMi41MjcsMi41MjVsLTMuMzY4LTMuMzY4bC0xLjY4NSwxLjY4NWwzLjM2OSwzLjM2N0wyNy4yNjMsMjVoNS4wNTNIMzR2LTEuNjg1VjE4LjI2NHoiLz4NCgk8L2c+DQo8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMTAyIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjRkVGRUZFIiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMDUxIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjOTY5Njk2IiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTRweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgMTQgMTUiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDU4ICg4NDY2MykgLSBodHRwczovL3NrZXRjaC5jb20gLS0+CiAgICA8dGl0bGU+dGljay1jb21ib2JveDwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJQRC0zNzQ0LeKAlC0yIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNzkwLjAwMDAwMCwgLTQzMS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgaWQ9InRpY2stY29tYm9ib3giIHRyYW5zZm9ybT0idHJhbnNsYXRlKDc4OS4wMDAwMDAsIDQzMC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMy4zNDQ3NjY4LDEuNjU5MzMyNTIgTDUuOCwxMi41ODY3MjE4IEw1LjgsMTIuNTg2NzIxOCBMMi42MDU2MzE3Nyw4LjkzNDE5NjUyIEMyLjM1MzE1MjQxLDguNjQ1NTA0OTMgMS45MTQ0NDY2Nyw4LjYxNjE0OTExIDEuNjI1NzU1MDcsOC44Njg2Mjg0OCBDMS41NzczMDU0Miw4LjkxMTAwMDgyIDEuNTM0OTgxOTMsOC45NTk5MDMyNiAxLjUsOS4wMTM5MzE0OCBDMS4yMDYzNDk0OSw5LjQ2NzQ2MzE2IDEuMjYwMDExMDgsMTAuMDYyODI2MyAxLjYzMDAyNTk4LDEwLjQ1NjU0MDEgTDUuNDc5NzMxMTgsMTQuNTUyODEzNSBDNS42Njg4NDMyLDE0Ljc1NDAzNzkgNS45ODUyNzMzOSwxNC43NjM4NTY5IDYuMTg2NDk3NzcsMTQuNTc0NzQ0OSBDNi4yMTEyMjc0NywxNC41NTE1MDM4IDYuMjMzNTI2NzQsMTQuNTI1ODA1MyA2LjI1MzA1MDY3LDE0LjQ5ODA0NyBMMTQuNTM5MDU1MywyLjcxNzM0NDAzIEMxNC44MDE1Mjc3LDIuMzQ0MTcxNDggMTQuNzQxNjUzNywxLjgzMzM1NzAzIDE0LjQsMS41MzA5OTU4NyBDMTQuMTA2MjM3OCwxLjI3MTAxODMyIDEzLjY1NzM0MywxLjI5ODQwNjIyIDEzLjM5NzM2NTUsMS41OTIxNjg0NCBDMTMuMzc4NTAyNywxLjYxMzQ4MjQgMTMuMzYwOTM4MiwxLjYzNTkxMDg3IDEzLjM0NDc2NjgsMS42NTkzMzI1MiBaIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cG9seWxpbmUgaWQ9IlBhdGgtMiIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjIiIHBvaW50cz0iMiA5LjY1NjUyODE3IDUuODYxNjc5NzcgMTQgMTQgMiI+PC9wb2x5bGluZT4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjIsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9ItCh0LvQvtC5XzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMzVweCIgaGVpZ2h0PSIzNXB4IiB2aWV3Qm94PSIwIDAgMzUgMzUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDM1IDM1IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMTcuNSwzNUMyNy4xMzksMzUsMzUsMjcuMTM4LDM1LDE3LjVDMzUsNy44NjEsMjcuMTM5LDAsMTcuNSwwDQoJQzcuODYxLDAsMCw3Ljg2MSwwLDE3LjVDMCwyNy4xMzgsNy44NjEsMzUsMTcuNSwzNXoiLz4NCjxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTcuNTAwNSIgeTE9IjIuNjQ5OSIgeDI9IjE3LjUwMDUiIHkyPSIzMi4zNDkiPg0KCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiM1Q0IwRkYiLz4NCgk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMTI5MEZGIi8+DQo8L2xpbmVhckdyYWRpZW50Pg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9InVybCgjU1ZHSURfMV8pIiBkPSJNMTcuNSwzMy45OTljOS4wODgsMCwxNi41LTcuNDEyLDE2LjUtMTYuNDk5DQoJUzI2LjU4NywxLDE3LjUsMUM4LjQxMywxLDEuMDAxLDguNDEzLDEuMDAxLDE3LjVTOC40MTMsMzMuOTk5LDE3LjUsMzMuOTk5eiIvPg0KPHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTE4LjM2OCwyMi41aC0zYy0wLjAwOC0wLjQ2MywwLTAuODk3LDAtMWMwLTEuMDM3LDAuMDU1LTEuODgxLDAuMzk2LTIuNTUNCgljMC4zNDQtMC42NzMsMS4wMzMtMS40MjMsMi4wNjMtMi4yNjRjMS4wMjgtMC44MzUsMS42NDYtMS4zODQsMS44NDMtMS42NDZjMC4zMTMtMC40MDcsMC40NjgtMC44NjIsMC40NjgtMS4zNTQNCgljMC0wLjY4Ni0wLjI3NS0xLjI3My0wLjgyNC0xLjc2NmMtMC41NDktMC40ODktMS4yODUtMC43MzMtMi4yMTUtMC43MzNjLTAuODk2LDAtMS42NDYsMC4yNTctMi4yNTEsMC43NjcNCgljLTAuNjAxLDAuNTEtMS4wMTYsMS4yOTEtMS4yNDMsMi4zMzZsLTMuMjM2LTAuNDAzYzAuMDktMS41LDAuNzI5LTIuNzczLDEuOTEyLTMuODE5QzEzLjQ2Nyw5LjAyMiwxNS4wMTgsOC41LDE2Ljk0OCw4LjUNCgljMi4wMjMsMCwzLjYzNSwwLjUzMSw0LjgzNSwxLjU5YzEuMTk2LDEuMDU5LDEuNzk2LDIuMjg5LDEuNzk2LDMuNjk5YzAsMC43NzYtMC4yMjMsMS41MTQtMC42NiwyLjIwOA0KCWMtMC40NDEsMC42OTQtMS40NjEsMS41NS0yLjgyLDIuODM3QzE4Ljg2OCwyMCwxOC4zNjgsMjAuNSwxOC4zNjgsMjIuNUwxOC4zNjgsMjIuNXogTTE1LjM2OCwyNy40OTl2LTNoM3YzSDE1LjM2OHoiLz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjIsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9ItCh0LvQvtC5XzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMzVweCIgaGVpZ2h0PSIzNXB4IiB2aWV3Qm94PSIwIDAgMzUgMzUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDM1IDM1IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMTcuNSwzNUMyNy4xMzgsMzUsMzUsMjcuMTQsMzUsMTcuNUMzNSw3Ljg2MiwyNy4xMzgsMCwxNy41LDANCglDNy44NjEsMCwwLDcuODYyLDAsMTcuNUMwLDI3LjE0LDcuODYxLDM1LDE3LjUsMzV6Ii8+DQo8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE3LjQ5OTUiIHkxPSIyLjY1MDQiIHgyPSIxNy40OTk1IiB5Mj0iMzIuMzUwNCI+DQoJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGODI1QyIvPg0KCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRjREMTIiLz4NCjwvbGluZWFyR3JhZGllbnQ+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0idXJsKCNTVkdJRF8xXykiIGQ9Ik0xNy41LDM0YzkuMDg3LDAsMTYuNS03LjQxMiwxNi41LTE2LjUNCgljMC05LjA4OC03LjQxMi0xNi41LTE2LjUtMTYuNVMxLDguNDEzLDEsMTcuNUMxLDI2LjU4OCw4LjQxMiwzNCwxNy41LDM0eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xNS41LDkuMDAxYzAtMiwzLjk5OS0yLDMuOTk5LDBMMTguOTk5LDIxDQoJYy0wLjA2MSwxLjQ5OC0yLjkzNywxLjUtMywwTDE1LjUsOS4wMDF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTE3LjUsMjhjMS4xMDIsMCwyLTAuODk3LDItMmMwLTEuMTAyLTAuODk3LTItMi0yDQoJYy0xLjEwMiwwLTEuOTk5LDAuODk4LTEuOTk5LDJDMTUuNSwyNy4xMDMsMTYuMzk4LDI4LDE3LjUsMjh6Ii8+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkNPUlJFQ1QtSUNPTiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IgoJIHk9IjBweCIgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNCAyNDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNGRkZGRkY7fQoJLnN0MXtmaWxsOiM3Q0I5MTE7fQo8L3N0eWxlPgo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPgo8cGF0aCBpZD0iU2hhcGVfM19jb3B5IiBjbGFzcz0ic3QxIiBkPSJNMTIsMkM2LjUsMiwyLDYuNSwyLDEyczQuNSwxMCwxMCwxMHMxMC00LjUsMTAtMTBTMTcuNSwyLDEyLDJ6IE0xNy45LDguOWwtNy43LDcuNwoJYy0wLjQsMC40LTAuOSwwLjQtMS4zLDBsLTMuMi0zLjJjLTAuNC0wLjQtMC40LTAuOSwwLTEuM3MwLjktMC40LDEuMywwbDIuNSwyLjVsNy4xLTcuMWMwLjMtMC40LDAuOS0wLjQsMS4zLDAKCUMxOC4yLDcuOSwxOC4yLDguNSwxNy45LDguOUMxNy45LDguOSwxNy45LDguOSwxNy45LDguOXoiLz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIKCSB5PSIwcHgiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjQgMjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGNpcmNsZSBmaWxsPSIjRkZGRkZGIiBjeD0iMTIiIGN5PSIxMiIgcj0iMTIiLz4KPHBhdGggZmlsbD0iI2Y3YjQ0NSIgZD0iTTEyLDJDNi41LDIsMiw2LjUsMiwxMnM0LjUsMTAsMTAsMTBzMTAtNC41LDEwLTEwUzE3LjUsMiwxMiwyeiBNMTcuOSw4LjlsLTcuNyw3LjcKCWMtMC40LDAuNC0wLjksMC40LTEuMywwbC0zLjItMy4yYy0wLjQtMC40LTAuNC0wLjksMC0xLjNzMC45LTAuNCwxLjMsMGwyLjUsMi41bDcuMS03LjFjMC4zLTAuNCwwLjktMC40LDEuMywwCglDMTguMiw3LjksMTguMiw4LjUsMTcuOSw4LjlDMTcuOSw4LjksMTcuOSw4LjksMTcuOSw4Ljl6Ii8+Cjwvc3ZnPgo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IklOQ09SUkVDVC1JQ09OIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiCgkgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDI0IDI0OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6I0ZGRkZGRjt9Cgkuc3Qxe2ZpbGw6I0Y5NjAzRDt9Cjwvc3R5bGU+CjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjEyIiBjeT0iMTIiIHI9IjEyIi8+CjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0xMiwyQzYuNSwyLDIsNi41LDIsMTJzNC41LDEwLDEwLDEwczEwLTQuNSwxMC0xMFMxNy41LDIsMTIsMnogTTE2LjQsOC44TDEzLjIsMTJsMi45LDIuOQoJYzAuMywwLjMsMC4zLDAuOSwwLDEuMmMtMC4zLDAuMy0wLjksMC4zLTEuMiwwbDAsMEwxMiwxMy4ybC0zLjIsMy4yYy0wLjMsMC4zLTAuOSwwLjMtMS4yLDBzLTAuMy0wLjksMC0xLjJsMy4yLTMuMkw3LjksOS4xCgljLTAuMy0wLjMtMC4zLTAuOSwwLTEuMnMwLjktMC4zLDEuMiwwbDIuOSwyLjlsMy4yLTMuMmMwLjMtMC4zLDAuOS0wLjMsMS4yLDBDMTYuNyw3LjksMTYuOCw4LjQsMTYuNCw4LjgKCUMxNi40LDguOCwxNi40LDguOCwxNi40LDguOHoiLz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkFOU1dFUkVELUlDT04iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIKCSB5PSIwcHgiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjQgMjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbDojRkZGRkZGO30KCS5zdDF7ZmlsbDojNTI4QkRGO30KPC9zdHlsZT4KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMTIiIGN5PSIxMiIgcj0iMTIiLz4KPHBhdGggY2xhc3M9InN0MSIgZD0iTTEyLDIyQzYuNSwyMiwyLDE3LjUsMiwxMlM2LjUsMiwxMiwyczEwLDQuNSwxMCwxMFMxNy41LDIyLDEyLDIyeiBNOSwxMUg3djJoMlYxMXogTTEzLDExaC0ydjJoMlYxMXogTTE3LDExCgloLTJ2MmgyVjExeiIvPgo8L3N2Zz4K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkNPUlJFQ1QtSUNPTiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IgoJIHk9IjBweCIgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNCAyNDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNGRkZGRkY7fQoJLnN0MXtmaWxsOiM1MjhCREY7fQo8L3N0eWxlPgo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPgo8cGF0aCBpZD0iU2hhcGVfM19jb3B5IiBjbGFzcz0ic3QxIiBkPSJNMTIsMkM2LjUsMiwyLDYuNSwyLDEyczQuNSwxMCwxMCwxMHMxMC00LjUsMTAtMTBTMTcuNSwyLDEyLDJ6IE0xNy45LDguOWwtNy43LDcuNwoJYy0wLjQsMC40LTAuOSwwLjQtMS4zLDBsLTMuMi0zLjJjLTAuNC0wLjQtMC40LTAuOSwwLTEuM3MwLjktMC40LDEuMywwbDIuNSwyLjVsNy4xLTcuMWMwLjMtMC40LDAuOS0wLjQsMS4zLDAKCUMxOC4yLDcuOSwxOC4yLDguNSwxNy45LDguOUMxNy45LDguOSwxNy45LDguOSwxNy45LDguOXoiLz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,"+c("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMiAxOCIgd2lkdGg9IjEycHgiIGhlaWdodD0iMTZweCI+DQoJPGRlZnM+DQoJCTxzdHlsZT4NCgkJCS5ub3JtYWwgew0KCQkJCWZpbGw6IHt0ZXh0fTsNCgkJCQlvcGFjaXR5OiAwLjc7DQoJCQkJaXNvbGF0aW9uOmlzb2xhdGU7DQoJCQl9DQoJCTwvc3R5bGU+DQoJPC9kZWZzPg0KCTxwYXRoIGNsYXNzPSJub3JtYWwiIGQ9Ik0xMCwwSDJBMiwyLDAsMCwwLDAsMlYxOGwyLS4yMiw0LTMuNjYsNCwzLjY2TDEyLDE4VjJBMiwyLDAsMCwwLDEwLDBaTTIsMmg4VjE0LjQ5bC00LTMtNCwzWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCkiLz4NCjwvc3ZnPg=="), +"data:image/svg+xml;base64,"+c("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMiAxOCIgd2lkdGg9IjEycHgiIGhlaWdodD0iMTZweCI+DQoJPGRlZnM+DQoJCTxzdHlsZT4NCgkJCS5vdmVyIHsNCgkJCQlmaWxsOiB7bGlzdEl0ZW0ubGFiZWwub3Zlcn07DQoJCQkJb3BhY2l0eTogMC43Ow0KCQkJCWlzb2xhdGlvbjppc29sYXRlOw0KCQkJfQ0KCQk8L3N0eWxlPg0KCTwvZGVmcz4NCgk8cGF0aCBjbGFzcz0ib3ZlciIgZD0iTTEwLDBIMkEyLDIsMCwwLDAsMCwyVjE4bDItLjIyLDQtMy42Niw0LDMuNjZMMTIsMThWMkEyLDIsMCwwLDAsMTAsMFpNMiwyaDhWMTQuNDlsLTQtMy00LDNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwKSIvPg0KPC9zdmc+"), +"data:image/svg+xml;base64,"+c("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMiAxOCIgd2lkdGg9IjEycHgiIGhlaWdodD0iMTZweCI+DQoJPGRlZnM+DQoJCTxzdHlsZT4NCgkJCS5zZWxlY3RlZCB7DQoJCQkJZmlsbDoge2xpc3RJdGVtLmxhYmVsLnByZXNzZWR9Ow0KCQkJCW9wYWNpdHk6IDAuNzsNCgkJCQlpc29sYXRpb246aXNvbGF0ZTsNCgkJCX0NCgkJPC9zdHlsZT4NCgk8L2RlZnM+DQoJPHBhdGggY2xhc3M9InNlbGVjdGVkIiBkPSJNMTAsMEgyQTIsMiwwLDAsMCwwLDJWMThsMi0uMjIsNC0zLjY2LDQsMy42NkwxMiwxOFYyQTIsMiwwLDAsMCwxMCwwWk0yLDJoOFYxNC40OWwtNC0zLTQsM1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDApIi8+DQo8L3N2Zz4="), +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPgo8cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHJ4PSI2IiBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIwLjciLz4KPGcgb3BhY2l0eT0iMC44Ij4KPHBhdGggZD0iTTUzLjUgMjVINTJDNTEuNjAyMiAyNSA1MS4yMjA2IDI1LjE1OCA1MC45MzkzIDI1LjQzOTNDNTAuNjU4IDI1LjcyMDYgNTAuNSAyNi4xMDIyIDUwLjUgMjYuNUM1MC41IDI2Ljg5NzggNTAuNjU4IDI3LjI3OTQgNTAuOTM5MyAyNy41NjA3QzUxLjIyMDYgMjcuODQyIDUxLjYwMjIgMjggNTIgMjhINTMuNUM1My44OTc4IDI4IDU0LjI3OTQgMjguMTU4IDU0LjU2MDcgMjguNDM5M0M1NC44NDIgMjguNzIwNiA1NSAyOS4xMDIyIDU1IDI5LjVWNDEuNTM3NUM1My43MDkzIDQwLjU0NTMgNTIuMTI4IDQwLjAwNSA1MC41IDQwQzQ5LjI3MTcgNDAuMDAwNiA0OC4wNjI0IDQwLjMwMjkgNDYuOTc4MyA0MC44ODAzQzQ1Ljg5NDIgNDEuNDU3NiA0NC45Njg1IDQyLjI5MjQgNDQuMjgyNSA0My4zMTEzQzQzLjcyNjEgNDIuNzM4NCA0My4wNjAzIDQyLjI4MjkgNDIuMzI0OCA0MS45NzE5QzQxLjU4OTIgNDEuNjYwOSA0MC43OTg2IDQxLjUwMDcgNDAgNDEuNTAwN0MzOS4yMDE0IDQxLjUwMDcgMzguNDEwOCA0MS42NjA5IDM3LjY3NTIgNDEuOTcxOUMzNi45Mzk3IDQyLjI4MjkgMzYuMjczOSA0Mi43Mzg0IDM1LjcxNzUgNDMuMzExM0MzNS4wMzE1IDQyLjI5MjQgMzQuMTA1OCA0MS40NTc2IDMzLjAyMTcgNDAuODgwM0MzMS45Mzc2IDQwLjMwMjkgMzAuNzI4MyA0MC4wMDA2IDI5LjUgNDBDMjcuODcyIDQwLjAwNSAyNi4yOTA3IDQwLjU0NTMgMjUgNDEuNTM3NVYyOS41QzI1IDI5LjEwMjIgMjUuMTU4IDI4LjcyMDYgMjUuNDM5MyAyOC40MzkzQzI1LjcyMDYgMjguMTU4IDI2LjEwMjIgMjggMjYuNSAyOEgyOEMyOC4zOTc4IDI4IDI4Ljc3OTQgMjcuODQyIDI5LjA2MDcgMjcuNTYwN0MyOS4zNDIgMjcuMjc5NCAyOS41IDI2Ljg5NzggMjkuNSAyNi41QzI5LjUgMjYuMTAyMiAyOS4zNDIgMjUuNzIwNiAyOS4wNjA3IDI1LjQzOTNDMjguNzc5NCAyNS4xNTggMjguMzk3OCAyNSAyOCAyNUgyNi41QzI1LjMwNjUgMjUgMjQuMTYxOSAyNS40NzQxIDIzLjMxOCAyNi4zMThDMjIuNDc0MSAyNy4xNjE5IDIyIDI4LjMwNjUgMjIgMjkuNVY0Ny41QzIyIDQ5LjQ4OTEgMjIuNzkwMiA1MS4zOTY4IDI0LjE5NjcgNTIuODAzM0MyNS42MDMyIDU0LjIwOTggMjcuNTEwOSA1NSAyOS41IDU1QzMxLjQ4OTEgNTUgMzMuMzk2OCA1NC4yMDk4IDM0LjgwMzMgNTIuODAzM0MzNi4yMDk4IDUxLjM5NjggMzcgNDkuNDg5MSAzNyA0Ny41QzM3IDQ2LjcwNDQgMzcuMzE2MSA0NS45NDEzIDM3Ljg3ODcgNDUuMzc4N0MzOC40NDEzIDQ0LjgxNjEgMzkuMjA0NCA0NC41IDQwIDQ0LjVDNDAuNzk1NiA0NC41IDQxLjU1ODcgNDQuODE2MSA0Mi4xMjEzIDQ1LjM3ODdDNDIuNjgzOSA0NS45NDEzIDQzIDQ2LjcwNDQgNDMgNDcuNUM0MyA0OS40ODkxIDQzLjc5MDIgNTEuMzk2OCA0NS4xOTY3IDUyLjgwMzNDNDYuNjAzMiA1NC4yMDk4IDQ4LjUxMDkgNTUgNTAuNSA1NUM1Mi40ODkxIDU1IDU0LjM5NjggNTQuMjA5OCA1NS44MDMzIDUyLjgwMzNDNTcuMjA5OCA1MS4zOTY4IDU4IDQ5LjQ4OTEgNTggNDcuNVYyOS41QzU4IDI4LjMwNjUgNTcuNTI1OSAyNy4xNjE5IDU2LjY4MiAyNi4zMThDNTUuODM4MSAyNS40NzQxIDU0LjY5MzUgMjUgNTMuNSAyNVpNMjkuNSA1MkMyOC42MSA1MiAyNy43NCA1MS43MzYxIDI2Ljk5OTkgNTEuMjQxNkMyNi4yNTk5IDUwLjc0NzEgMjUuNjgzMSA1MC4wNDQzIDI1LjM0MjUgNDkuMjIyMUMyNS4wMDE5IDQ4LjM5OTggMjQuOTEyOCA0Ny40OTUgMjUuMDg2NSA0Ni42MjIxQzI1LjI2MDEgNDUuNzQ5MiAyNS42ODg3IDQ0Ljk0NzQgMjYuMzE4IDQ0LjMxOEMyNi45NDc0IDQzLjY4ODcgMjcuNzQ5MiA0My4yNjAxIDI4LjYyMjEgNDMuMDg2NUMyOS40OTUgNDIuOTEyOCAzMC4zOTk4IDQzLjAwMTkgMzEuMjIyMSA0My4zNDI1QzMyLjA0NDMgNDMuNjgzMSAzMi43NDcxIDQ0LjI1OTkgMzMuMjQxNiA0NC45OTk5QzMzLjczNjEgNDUuNzQgMzQgNDYuNjEgMzQgNDcuNUMzNCA0OC42OTM1IDMzLjUyNTkgNDkuODM4MSAzMi42ODIgNTAuNjgyQzMxLjgzODEgNTEuNTI1OSAzMC42OTM1IDUyIDI5LjUgNTJaTTUwLjUgNTJDNDkuNjEgNTIgNDguNzQgNTEuNzM2MSA0Ny45OTk5IDUxLjI0MTZDNDcuMjU5OSA1MC43NDcxIDQ2LjY4MzEgNTAuMDQ0MyA0Ni4zNDI1IDQ5LjIyMjFDNDYuMDAxOSA0OC4zOTk4IDQ1LjkxMjggNDcuNDk1IDQ2LjA4NjUgNDYuNjIyMUM0Ni4yNjAxIDQ1Ljc0OTIgNDYuNjg4NyA0NC45NDc0IDQ3LjMxOCA0NC4zMThDNDcuOTQ3NCA0My42ODg3IDQ4Ljc0OTIgNDMuMjYwMSA0OS42MjIxIDQzLjA4NjVDNTAuNDk1IDQyLjkxMjggNTEuMzk5OCA0My4wMDE5IDUyLjIyMjEgNDMuMzQyNUM1My4wNDQzIDQzLjY4MzEgNTMuNzQ3MSA0NC4yNTk5IDU0LjI0MTYgNDQuOTk5OUM1NC43MzYxIDQ1Ljc0IDU1IDQ2LjYxIDU1IDQ3LjVDNTUgNDguNjkzNSA1NC41MjU5IDQ5LjgzODEgNTMuNjgyIDUwLjY4MkM1Mi44MzgxIDUxLjUyNTkgNTEuNjkzNSA1MiA1MC41IDUyWiIgZmlsbD0id2hpdGUiLz4KPC9nPgo8L2c+CjxkZWZzPgo8ZmlsdGVyIGlkPSJmaWx0ZXIwX2QiIHg9IjAiIHk9IjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSI4MCIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgo8ZmVDb2xvck1hdHJpeCBpbj0iU291cmNlQWxwaGEiIHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMCIvPgo8ZmVPZmZzZXQvPgo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0Ii8+CjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwLjI1IDAiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3ciLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3ciIHJlc3VsdD0ic2hhcGUiLz4KPC9maWx0ZXI+CjwvZGVmcz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPgo8cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHJ4PSI2IiBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIwLjgiLz4KPHBhdGggZD0iTTUzLjUgMjVINTJDNTEuNjAyMiAyNSA1MS4yMjA2IDI1LjE1OCA1MC45MzkzIDI1LjQzOTNDNTAuNjU4IDI1LjcyMDYgNTAuNSAyNi4xMDIyIDUwLjUgMjYuNUM1MC41IDI2Ljg5NzggNTAuNjU4IDI3LjI3OTQgNTAuOTM5MyAyNy41NjA3QzUxLjIyMDYgMjcuODQyIDUxLjYwMjIgMjggNTIgMjhINTMuNUM1My44OTc4IDI4IDU0LjI3OTQgMjguMTU4IDU0LjU2MDcgMjguNDM5M0M1NC44NDIgMjguNzIwNiA1NSAyOS4xMDIyIDU1IDI5LjVWNDEuNTM3NUM1My43MDkzIDQwLjU0NTMgNTIuMTI4IDQwLjAwNSA1MC41IDQwQzQ5LjI3MTcgNDAuMDAwNiA0OC4wNjI0IDQwLjMwMjkgNDYuOTc4MyA0MC44ODAzQzQ1Ljg5NDIgNDEuNDU3NiA0NC45Njg1IDQyLjI5MjQgNDQuMjgyNSA0My4zMTEzQzQzLjcyNjEgNDIuNzM4NCA0My4wNjAzIDQyLjI4MjkgNDIuMzI0OCA0MS45NzE5QzQxLjU4OTIgNDEuNjYwOSA0MC43OTg2IDQxLjUwMDcgNDAgNDEuNTAwN0MzOS4yMDE0IDQxLjUwMDcgMzguNDEwOCA0MS42NjA5IDM3LjY3NTIgNDEuOTcxOUMzNi45Mzk3IDQyLjI4MjkgMzYuMjczOSA0Mi43Mzg0IDM1LjcxNzUgNDMuMzExM0MzNS4wMzE1IDQyLjI5MjQgMzQuMTA1OCA0MS40NTc2IDMzLjAyMTcgNDAuODgwM0MzMS45Mzc2IDQwLjMwMjkgMzAuNzI4MyA0MC4wMDA2IDI5LjUgNDBDMjcuODcyIDQwLjAwNSAyNi4yOTA3IDQwLjU0NTMgMjUgNDEuNTM3NVYyOS41QzI1IDI5LjEwMjIgMjUuMTU4IDI4LjcyMDYgMjUuNDM5MyAyOC40MzkzQzI1LjcyMDYgMjguMTU4IDI2LjEwMjIgMjggMjYuNSAyOEgyOEMyOC4zOTc4IDI4IDI4Ljc3OTQgMjcuODQyIDI5LjA2MDcgMjcuNTYwN0MyOS4zNDIgMjcuMjc5NCAyOS41IDI2Ljg5NzggMjkuNSAyNi41QzI5LjUgMjYuMTAyMiAyOS4zNDIgMjUuNzIwNiAyOS4wNjA3IDI1LjQzOTNDMjguNzc5NCAyNS4xNTggMjguMzk3OCAyNSAyOCAyNUgyNi41QzI1LjMwNjUgMjUgMjQuMTYxOSAyNS40NzQxIDIzLjMxOCAyNi4zMThDMjIuNDc0MSAyNy4xNjE5IDIyIDI4LjMwNjUgMjIgMjkuNVY0Ny41QzIyIDQ5LjQ4OTEgMjIuNzkwMiA1MS4zOTY4IDI0LjE5NjcgNTIuODAzM0MyNS42MDMyIDU0LjIwOTggMjcuNTEwOSA1NSAyOS41IDU1QzMxLjQ4OTEgNTUgMzMuMzk2OCA1NC4yMDk4IDM0LjgwMzMgNTIuODAzM0MzNi4yMDk4IDUxLjM5NjggMzcgNDkuNDg5MSAzNyA0Ny41QzM3IDQ2LjcwNDQgMzcuMzE2MSA0NS45NDEzIDM3Ljg3ODcgNDUuMzc4N0MzOC40NDEzIDQ0LjgxNjEgMzkuMjA0NCA0NC41IDQwIDQ0LjVDNDAuNzk1NiA0NC41IDQxLjU1ODcgNDQuODE2MSA0Mi4xMjEzIDQ1LjM3ODdDNDIuNjgzOSA0NS45NDEzIDQzIDQ2LjcwNDQgNDMgNDcuNUM0MyA0OS40ODkxIDQzLjc5MDIgNTEuMzk2OCA0NS4xOTY3IDUyLjgwMzNDNDYuNjAzMiA1NC4yMDk4IDQ4LjUxMDkgNTUgNTAuNSA1NUM1Mi40ODkxIDU1IDU0LjM5NjggNTQuMjA5OCA1NS44MDMzIDUyLjgwMzNDNTcuMjA5OCA1MS4zOTY4IDU4IDQ5LjQ4OTEgNTggNDcuNVYyOS41QzU4IDI4LjMwNjUgNTcuNTI1OSAyNy4xNjE5IDU2LjY4MiAyNi4zMThDNTUuODM4MSAyNS40NzQxIDU0LjY5MzUgMjUgNTMuNSAyNVpNMjkuNSA1MkMyOC42MSA1MiAyNy43NCA1MS43MzYxIDI2Ljk5OTkgNTEuMjQxNkMyNi4yNTk5IDUwLjc0NzEgMjUuNjgzMSA1MC4wNDQzIDI1LjM0MjUgNDkuMjIyMUMyNS4wMDE5IDQ4LjM5OTggMjQuOTEyOCA0Ny40OTUgMjUuMDg2NSA0Ni42MjIxQzI1LjI2MDEgNDUuNzQ5MiAyNS42ODg3IDQ0Ljk0NzQgMjYuMzE4IDQ0LjMxOEMyNi45NDc0IDQzLjY4ODcgMjcuNzQ5MiA0My4yNjAxIDI4LjYyMjEgNDMuMDg2NUMyOS40OTUgNDIuOTEyOCAzMC4zOTk4IDQzLjAwMTkgMzEuMjIyMSA0My4zNDI1QzMyLjA0NDMgNDMuNjgzMSAzMi43NDcxIDQ0LjI1OTkgMzMuMjQxNiA0NC45OTk5QzMzLjczNjEgNDUuNzQgMzQgNDYuNjEgMzQgNDcuNUMzNCA0OC42OTM1IDMzLjUyNTkgNDkuODM4MSAzMi42ODIgNTAuNjgyQzMxLjgzODEgNTEuNTI1OSAzMC42OTM1IDUyIDI5LjUgNTJaTTUwLjUgNTJDNDkuNjEgNTIgNDguNzQgNTEuNzM2MSA0Ny45OTk5IDUxLjI0MTZDNDcuMjU5OSA1MC43NDcxIDQ2LjY4MzEgNTAuMDQ0MyA0Ni4zNDI1IDQ5LjIyMjFDNDYuMDAxOSA0OC4zOTk4IDQ1LjkxMjggNDcuNDk1IDQ2LjA4NjUgNDYuNjIyMUM0Ni4yNjAxIDQ1Ljc0OTIgNDYuNjg4NyA0NC45NDc0IDQ3LjMxOCA0NC4zMThDNDcuOTQ3NCA0My42ODg3IDQ4Ljc0OTIgNDMuMjYwMSA0OS42MjIxIDQzLjA4NjVDNTAuNDk1IDQyLjkxMjggNTEuMzk5OCA0My4wMDE5IDUyLjIyMjEgNDMuMzQyNUM1My4wNDQzIDQzLjY4MzEgNTMuNzQ3MSA0NC4yNTk5IDU0LjI0MTYgNDQuOTk5OUM1NC43MzYxIDQ1Ljc0IDU1IDQ2LjYxIDU1IDQ3LjVDNTUgNDguNjkzNSA1NC41MjU5IDQ5LjgzODEgNTMuNjgyIDUwLjY4MkM1Mi44MzgxIDUxLjUyNTkgNTEuNjkzNSA1MiA1MC41IDUyWiIgZmlsbD0id2hpdGUiLz4KPC9nPgo8ZGVmcz4KPGZpbHRlciBpZD0iZmlsdGVyMF9kIiB4PSIwIiB5PSIwIiB3aWR0aD0iODAiIGhlaWdodD0iODAiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLz4KPGZlT2Zmc2V0Lz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIvPgo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4yNSAwIi8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93Ii8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9kcm9wU2hhZG93IiByZXN1bHQ9InNoYXBlIi8+CjwvZmlsdGVyPgo8L2RlZnM+Cjwvc3ZnPgo=", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iNiIgZmlsbD0iYmxhY2siIGZpbGwtb3BhY2l0eT0iMC44Ii8+CjxwYXRoIGQ9Ik00NS41IDE3SDQ0QzQzLjYwMjIgMTcgNDMuMjIwNiAxNy4xNTggNDIuOTM5MyAxNy40MzkzQzQyLjY1OCAxNy43MjA2IDQyLjUgMTguMTAyMiA0Mi41IDE4LjVDNDIuNSAxOC44OTc4IDQyLjY1OCAxOS4yNzk0IDQyLjkzOTMgMTkuNTYwN0M0My4yMjA2IDE5Ljg0MiA0My42MDIyIDIwIDQ0IDIwSDQ1LjVDNDUuODk3OCAyMCA0Ni4yNzk0IDIwLjE1OCA0Ni41NjA3IDIwLjQzOTNDNDYuODQyIDIwLjcyMDYgNDcgMjEuMTAyMiA0NyAyMS41VjMzLjUzNzVDNDUuNzA5MyAzMi41NDUzIDQ0LjEyOCAzMi4wMDUgNDIuNSAzMkM0MS4yNzE3IDMyLjAwMDYgNDAuMDYyNCAzMi4zMDI5IDM4Ljk3ODMgMzIuODgwM0MzNy44OTQyIDMzLjQ1NzYgMzYuOTY4NSAzNC4yOTI0IDM2LjI4MjUgMzUuMzExM0MzNS43MjYxIDM0LjczODQgMzUuMDYwMyAzNC4yODI5IDM0LjMyNDggMzMuOTcxOUMzMy41ODkyIDMzLjY2MDkgMzIuNzk4NiAzMy41MDA3IDMyIDMzLjUwMDdDMzEuMjAxNCAzMy41MDA3IDMwLjQxMDggMzMuNjYwOSAyOS42NzUyIDMzLjk3MTlDMjguOTM5NyAzNC4yODI5IDI4LjI3MzkgMzQuNzM4NCAyNy43MTc1IDM1LjMxMTNDMjcuMDMxNSAzNC4yOTI0IDI2LjEwNTggMzMuNDU3NiAyNS4wMjE3IDMyLjg4MDNDMjMuOTM3NiAzMi4zMDI5IDIyLjcyODMgMzIuMDAwNiAyMS41IDMyQzE5Ljg3MiAzMi4wMDUgMTguMjkwNyAzMi41NDUzIDE3IDMzLjUzNzVWMjEuNUMxNyAyMS4xMDIyIDE3LjE1OCAyMC43MjA2IDE3LjQzOTMgMjAuNDM5M0MxNy43MjA2IDIwLjE1OCAxOC4xMDIyIDIwIDE4LjUgMjBIMjBDMjAuMzk3OCAyMCAyMC43Nzk0IDE5Ljg0MiAyMS4wNjA3IDE5LjU2MDdDMjEuMzQyIDE5LjI3OTQgMjEuNSAxOC44OTc4IDIxLjUgMTguNUMyMS41IDE4LjEwMjIgMjEuMzQyIDE3LjcyMDYgMjEuMDYwNyAxNy40MzkzQzIwLjc3OTQgMTcuMTU4IDIwLjM5NzggMTcgMjAgMTdIMTguNUMxNy4zMDY1IDE3IDE2LjE2MTkgMTcuNDc0MSAxNS4zMTggMTguMzE4QzE0LjQ3NDEgMTkuMTYxOSAxNCAyMC4zMDY1IDE0IDIxLjVWMzkuNUMxNCA0MS40ODkxIDE0Ljc5MDIgNDMuMzk2OCAxNi4xOTY3IDQ0LjgwMzNDMTcuNjAzMiA0Ni4yMDk4IDE5LjUxMDkgNDcgMjEuNSA0N0MyMy40ODkxIDQ3IDI1LjM5NjggNDYuMjA5OCAyNi44MDMzIDQ0LjgwMzNDMjguMjA5OCA0My4zOTY4IDI5IDQxLjQ4OTEgMjkgMzkuNUMyOSAzOC43MDQ0IDI5LjMxNjEgMzcuOTQxMyAyOS44Nzg3IDM3LjM3ODdDMzAuNDQxMyAzNi44MTYxIDMxLjIwNDQgMzYuNSAzMiAzNi41QzMyLjc5NTYgMzYuNSAzMy41NTg3IDM2LjgxNjEgMzQuMTIxMyAzNy4zNzg3QzM0LjY4MzkgMzcuOTQxMyAzNSAzOC43MDQ0IDM1IDM5LjVDMzUgNDEuNDg5MSAzNS43OTAyIDQzLjM5NjggMzcuMTk2NyA0NC44MDMzQzM4LjYwMzIgNDYuMjA5OCA0MC41MTA5IDQ3IDQyLjUgNDdDNDQuNDg5MSA0NyA0Ni4zOTY4IDQ2LjIwOTggNDcuODAzMyA0NC44MDMzQzQ5LjIwOTggNDMuMzk2OCA1MCA0MS40ODkxIDUwIDM5LjVWMjEuNUM1MCAyMC4zMDY1IDQ5LjUyNTkgMTkuMTYxOSA0OC42ODIgMTguMzE4QzQ3LjgzODEgMTcuNDc0MSA0Ni42OTM1IDE3IDQ1LjUgMTdaTTIxLjUgNDRDMjAuNjEgNDQgMTkuNzQgNDMuNzM2MSAxOC45OTk5IDQzLjI0MTZDMTguMjU5OSA0Mi43NDcxIDE3LjY4MzEgNDIuMDQ0MyAxNy4zNDI1IDQxLjIyMjFDMTcuMDAxOSA0MC4zOTk4IDE2LjkxMjggMzkuNDk1IDE3LjA4NjUgMzguNjIyMUMxNy4yNjAxIDM3Ljc0OTIgMTcuNjg4NyAzNi45NDc0IDE4LjMxOCAzNi4zMThDMTguOTQ3NCAzNS42ODg3IDE5Ljc0OTIgMzUuMjYwMSAyMC42MjIxIDM1LjA4NjVDMjEuNDk1IDM0LjkxMjggMjIuMzk5OCAzNS4wMDE5IDIzLjIyMjEgMzUuMzQyNUMyNC4wNDQzIDM1LjY4MzEgMjQuNzQ3MSAzNi4yNTk5IDI1LjI0MTYgMzYuOTk5OUMyNS43MzYxIDM3Ljc0IDI2IDM4LjYxIDI2IDM5LjVDMjYgNDAuNjkzNSAyNS41MjU5IDQxLjgzODEgMjQuNjgyIDQyLjY4MkMyMy44MzgxIDQzLjUyNTkgMjIuNjkzNSA0NCAyMS41IDQ0Wk00Mi41IDQ0QzQxLjYxIDQ0IDQwLjc0IDQzLjczNjEgMzkuOTk5OSA0My4yNDE2QzM5LjI1OTkgNDIuNzQ3MSAzOC42ODMxIDQyLjA0NDMgMzguMzQyNSA0MS4yMjIxQzM4LjAwMTkgNDAuMzk5OCAzNy45MTI4IDM5LjQ5NSAzOC4wODY1IDM4LjYyMjFDMzguMjYwMSAzNy43NDkyIDM4LjY4ODcgMzYuOTQ3NCAzOS4zMTggMzYuMzE4QzM5Ljk0NzQgMzUuNjg4NyA0MC43NDkyIDM1LjI2MDEgNDEuNjIyMSAzNS4wODY1QzQyLjQ5NSAzNC45MTI4IDQzLjM5OTggMzUuMDAxOSA0NC4yMjIxIDM1LjM0MjVDNDUuMDQ0MyAzNS42ODMxIDQ1Ljc0NzEgMzYuMjU5OSA0Ni4yNDE2IDM2Ljk5OTlDNDYuNzM2MSAzNy43NCA0NyAzOC42MSA0NyAzOS41QzQ3IDQwLjY5MzUgNDYuNTI1OSA0MS44MzgxIDQ1LjY4MiA0Mi42ODJDNDQuODM4MSA0My41MjU5IDQzLjY5MzUgNDQgNDIuNSA0NFoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo="]; +return"/* reset styles */* {box-sizing: border-box;-webkit-touch-callout: none;-webkit-user-select: none;-ms-user-select: none;user-select: none; }input,textarea {-webkit-user-select: text;-ms-user-select: text;user-select: text; }html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video {margin: 0;padding: 0;border: 0; }/* HTML5 display-role reset for older browsers */article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section {display: block; }ol,ul {list-style: none; }table {border-collapse: collapse;border-spacing: 0; }div {-webkit-tap-highlight-color: rgba(0, 0, 0, 0);-webkit-user-drag: none; }input {-webkit-appearance: none;-moz-appearance: none; } input::-ms-clear {display: none; }.clear {clear: both; }*::-moz-focus-inner {border: 0; }.popup-layer {top: 0;right: 0;bottom: 0;left: 0;z-index: 1;position: absolute;border-radius: inherit; }.modal-layer {background: #000000;opacity: 0.4;position: absolute;width: 100%;height: 100%;border-radius: inherit; }.slide-transiting .quiz-uikit-primary-button {transition: none; }.slide-transiting .quiz-uikit-secondary-button {transition: none; }.slide-transiting .quiz-uikit-link-button {transition: none; }.slide-transiting .visuals-uikit-primary-button {transition: none; }.slide-transiting .visuals-uikit-secondary-button {transition: none; }.slide-transiting .visuals-uikit-link-button {transition: none; }.uikit-primary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-primary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-primary-button.uikit-primary-button_size_medium {padding: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:first-child {margin-left: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:last-child {margin-right: 10px; } .uikit-primary-button.uikit-primary-button_size_small {padding: 6px 12px; } .uikit-primary-button.uikit-primary-button_size_small .uikit-primary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-primary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__button-text {margin-right: 8px; } .uikit-primary-button__left-icon {margin-right: 8px; } .uikit-primary-button__button-text:first-child {margin-left: 0; } .uikit-primary-button__button-text:last-child {margin-right: 0; } .uikit-primary-button__left-icon:first-child {margin-left: 0; } .uikit-primary-button__left-icon:last-child {margin-right: 0; } .uikit-primary-button__right-icon:first-child {margin-left: 0; } .uikit-primary-button__right-icon:last-child {margin-right: 0; } .uikit-primary-button[disabled] {opacity: 0.4; } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-secondary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-secondary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-secondary-button.uikit-secondary-button_size_medium {padding: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:first-child {margin-left: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:last-child {margin-right: 10px; } .uikit-secondary-button.uikit-secondary-button_size_small {padding: 6px 12px; } .uikit-secondary-button.uikit-secondary-button_size_small .uikit-secondary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-secondary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__button-text {margin-right: 8px; } .uikit-secondary-button__left-icon {margin-right: 8px; } .uikit-secondary-button__button-text:first-child {margin-left: 0; } .uikit-secondary-button__button-text:last-child {margin-right: 0; } .uikit-secondary-button__left-icon:first-child {margin-left: 0; } .uikit-secondary-button__left-icon:last-child {margin-right: 0; } .uikit-secondary-button__right-icon:first-child {margin-left: 0; } .uikit-secondary-button__right-icon:last-child {margin-right: 0; } .uikit-secondary-button[disabled] {opacity: 0.4; } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-link-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-link-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-link-button.uikit-link-button_size_medium {padding: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text {font-size: 17px;line-height: 20px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:first-child {margin-left: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:last-child {margin-right: 10px; } .uikit-link-button.uikit-link-button_size_small {padding: 6px 12px; } .uikit-link-button.uikit-link-button_size_small .uikit-link-button__button-text {font-size: 14px;line-height: 20px; } .uikit-link-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__button-text {margin-right: 8px; } .uikit-link-button__left-icon {margin-right: 8px; } .uikit-link-button__button-text:first-child {margin-left: 0; } .uikit-link-button__button-text:last-child {margin-right: 0; } .uikit-link-button__left-icon:first-child {margin-left: 0; } .uikit-link-button__left-icon:last-child {margin-right: 0; } .uikit-link-button__right-icon:first-child {margin-left: 0; } .uikit-link-button__right-icon:last-child {margin-right: 0; } .uikit-link-button[disabled] {opacity: 0.4; } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-primary-button {background: var(--primary-button-background-color, var(--primary-button-background-color));color: var(--primary-button-text-color, var(--primary-button-text-color)); } .uikit-primary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--primary-button-border-color, var(--primary-button-border-color));background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-primary-button__button-text {font-family: var(--font-family-bold);font-weight: 700; } .uikit-primary-button.uikit-primary-button_active, .uikit-primary-button[aria-pressed='true'], .uikit-primary-button:focus {background: var(--primary-button-background-color-active, var(--primary-button-background-color-active));color: var(--primary-button-text-color-active, var(--primary-button-text-color-active)); } .uikit-primary-button.uikit-primary-button_active::after, .uikit-primary-button[aria-pressed='true']::after, .uikit-primary-button:focus::after {background: var(--primary-button-border-color-active, var(--primary-button-border-color-active));background-origin: border-box; }.uikit-secondary-button {background: var(--secondary-button-background-color, var(--secondary-button-background-color));color: var(--secondary-button-text-color, var(--secondary-button-text-color)); } .uikit-secondary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--secondary-button-border-color, var(--secondary-button-border-color));background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-secondary-button__button-text {font-family: var(--font-family-normal); } .uikit-secondary-button.uikit-secondary-button_active, .uikit-secondary-button[aria-pressed='true'], .uikit-secondary-button:focus {background: var(--secondary-button-background-color-active, var(--secondary-button-background-color-active));color: var(--secondary-button-text-color-active, var(--secondary-button-text-color-active)); } .uikit-secondary-button.uikit-secondary-button_active::after, .uikit-secondary-button[aria-pressed='true']::after, .uikit-secondary-button:focus::after {background: var(--secondary-button-border-color-active, var(--secondary-button-border-color-active));background-origin: border-box; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 15px; }.uikit-link-button {background: var(--link-button-background-color);color: var(--link-button-text-color);border: none; } .uikit-link-button.uikit-link-button_active, .uikit-link-button[aria-pressed='true'] {background: var(--link-button-background-color); }.uikit-collapsed-control {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;position: relative;overflow: hidden;padding: 10px;border: none;border-radius: var(--button-border-radius);background: var(--secondary-button-background-color-active);color: var(--secondary-button-text-color-active);transition-property: background, color;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-collapsed-control::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--secondary-button-border-color-active);background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-collapsed-control__collapsed-component {cursor: pointer;display: -ms-flexbox;display: flex; } .uikit-collapsed-control__expanded-component {margin-left: 8px;opacity: 1;transition-property: width, opacity;transition-duration: 300ms;transition-timing-function: ease; } .uikit-collapsed-control.uikit-collapsed-control_collapsed {background: var(--secondary-button-background-color);color: var(--secondary-button-text-color);padding-right: 2px; } .uikit-collapsed-control.uikit-collapsed-control_collapsed::after {background: var(--secondary-button-border-color);background-origin: border-box; } .uikit-collapsed-control.uikit-collapsed-control_collapsed .uikit-collapsed-control__expanded-component {width: 0;opacity: 0; } .uikit-collapsed-control[data-tooltip]::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 0; } .uikit-collapsed-control[data-tooltip]:hover::before {opacity: 1;visibility: visible; }.menu-base {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: start;align-items: start;font-family: var(--font-family-normal); }.menu-base-item {width: 100%;box-sizing: border-box;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;height: 44px;padding: 0 20px;color: var(--popup-text-color); } .menu-base-item__label {-ms-flex-positive: 1;flex-grow: 1;font-size: 15px;line-height: 20px;margin-left: 12px; } .menu-base-item__icon {width: 20px;height: 20px;-ms-flex-negative: 0;flex-shrink: 0;color: var(--popup-text-color); } .menu-base-item__value {-ms-flex-negative: 0;flex-shrink: 0;margin-left: 16px; } .menu-base-item.menu-base-item_clickable:hover {cursor: pointer;background: var(--popup-background-hover-color);color: var(--popup-text-hover-color); } .menu-base-item.menu-base-item_clickable:hover .menu-base-item__icon {color: var(--popup-text-hover-color); }.rate-menu {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;width: 100%;padding: 12px 0; } .rate-menu__caption {padding: 8px 20px;color: var(--popup-text-color);font-size: 16px;line-height: 22px;font-family: var(--font-family-bold);font-weight: 700; } .rate-menu__delimiter {width: 100%;height: 1px;background: var(--popup-text-color);opacity: 0.08;margin: 8px 0; }.presenter-info {font-family: var(--font-family-normal);box-sizing: border-box;position: relative;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;color: var(--panel-text-color); } .presenter-info__main {display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: start; } .presenter-info__info {display: inline-block;-ms-flex-positive: 1;flex-grow: 1; } .presenter-info__photo {width: 64px;height: 64px;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;overflow: hidden;border-radius: 50%;-ms-flex-negative: 0;flex-shrink: 0;background-repeat: no-repeat;background-position: center;margin-right: 20px; } .presenter-info__photo img {width: auto;height: auto; } .presenter-info__name {font-family: var(--font-family-bold);font-weight: 700;word-wrap: break-word;overflow: hidden;font-size: 16px;line-height: 22px;margin-bottom: 8px;max-height: 53px; } .presenter-info__job {word-wrap: break-word;overflow: hidden;font-size: 14px;line-height: 18px;margin-bottom: 8px; } .presenter-info__phone {word-wrap: break-word;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;font-size: 15px;line-height: 20px; } .presenter-info__links {display: -ms-flexbox;display: flex;margin-top: 8px; } .presenter-info__link {border: 1px solid var(--presenter-info-link-border-color);border-radius: 10px;width: 36px;height: 28px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;position: relative;color: var(--panel-text-color); } .presenter-info__link:not(:last-child) {margin-right: 8px; } .presenter-info__link::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 6px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .presenter-info__link:hover::before {opacity: 1;visibility: visible; } .presenter-info__link-icon {width: 20px;height: 20px; } .presenter-info .bio-container {position: relative;display: -webkit-box;white-space: normal;text-overflow: ellipsis;margin-right: -20px;margin-top: 20px;padding-right: 10px;font-size: 14px;line-height: 20px;-ms-flex-positive: 1;flex-grow: 1;height: 100%;max-height: 120px;overflow: hidden; } .presenter-info .bio-container.bio-container_collapsed {max-height: 60px; } .presenter-info .bio-container.bio-container_collapsed .scroll-area__bio {display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .presenter-info .bio-container .scroll-area {word-break: break-word;overflow: hidden; } .presenter-info .bio-container .container-top-shadow {background: __verticalGradient(var(--panel-color), transparent);background: linear-gradient(to bottom, var(--panel-color), transparent);position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; } .presenter-info .bio-container .container-bottom-shadow {background: __verticalGradient(transparent, var(--panel-color));background: linear-gradient(to bottom, transparent, var(--panel-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; } .presenter-info__show-more {font-size: 14px;line-height: 20px;height: 20px;opacity: 0.6;text-decoration: underline; } .presenter-info__show-more:hover {cursor: pointer;opacity: 0.8; } .presenter-info.presenter-info_popup {margin-bottom: 0; } .presenter-info.presenter-info_no-photo .presenter-info__info {width: 100%; }.attachments-info {font-family: var(--font-family-normal);position: relative;width: 100%;overflow: hidden;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column; } .attachments-info__scroll-area {height: 100%;overflow: hidden; } .attachments-info__delimiter {height: 1px;margin: 8px 20px 8px 62px;background: var(--popup-text-color);opacity: 0.08; } .attachments-info .container-top-shadow {background: __verticalGradient(var(--panel-color), transparent);background: linear-gradient(to bottom, var(--panel-color), transparent);position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; } .attachments-info .container-bottom-shadow {background: __verticalGradient(transparent, var(--panel-color));background: linear-gradient(to bottom, transparent, var(--panel-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; }.attach-item {padding: 8px 20px;box-sizing: border-box;display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: start;cursor: pointer; } .attach-item__icon-container {width: 36px;height: 36px;border-radius: 50%;background: var(--top-panel-icon-container-color);display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;-ms-flex-negative: 0;flex-shrink: 0;margin-right: 6px; } .attach-item__icon {width: 20px;height: 20px;color: var(--popup-text-color);opacity: 0.72; } .attach-item__info-container {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-positive: 1;flex-grow: 1;padding-left: 6px; } .attach-item__title {font-size: 15px;line-height: 20px;margin-bottom: 4px;color: var(--popup-text-color);word-break: break-word;max-height: 60px;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .attach-item__subtitle {font-size: 14px;line-height: 18px;color: var(--popup-text-color);opacity: 0.6; } .attach-item:hover {background: var(--list-item-background-hover-color); } .attach-item:hover .attach-item__title {color: var(--popup-text-hover-color); } .attach-item:hover .attach-item__subtitle {color: var(--popup-text-hover-color); } .attach-item:hover .attach-item__icon {color: var(--popup-text-hover-color); }:root {--page-background-color: __pageBackground__;--button-background-color: __primaryButtonBackground__;--button-hover-background-color: __primaryButtonBackgroundHover__;--button-hover-text-color: __primaryButtonTextHover__;--button-text-color: __primaryButtonText__;--company-logo-background-color: __asideLogoBackground__;--hyperlink-text-color: __hyperlink__;--list-item-background-hover-color: __asideElementBackgroundHover__;--list-item-border-color: __outlineItemBorder__;--list-item-background-pressed-color: __asideElementBackgroundActive__;--list-item-text-hover-color: __asideElementTextHover__;--list-item-text-pressed-color: __asideElementTextActive__;--list-item-text-visited-color: __asideElementTextVisited__;--list-item-icon-fill-color: __itemsListIconFill__;--list-item-order-color: __itemsListOrder__;--list-item-icon-stroke-color: __itemsListIconStroke__;--list-item-icon-color: __itemsListIcon__;--panel-color: __asideBackground__;--panel-text-color: __asideElementText__;--panel-video-stub-background-color: __panelVideoStubBackgroundColor__;--panel-video-stub-color: __panelVideoStubColor__;--player-background-color: __playerBackground__;--progressbar-background-color: __progressBackground__;--progressbar-playback-color: __progressPlayback__;--slide-border-color: __slideBorder__;--text-color: __playerText__;--topbar-hover-background-color: __secondaryButtonBackgroundHover__;--topbar-text-color: __secondaryButtonText__;--primary-button-text-color: __primaryButtonText__;--primary-button-text-color-active: __primaryButtonTextHover__;--primary-button-background-color-active: __primaryButtonBackgroundHover__;--primary-button-background-color: __primaryButtonBackground__;--primary-button-border-color: __primaryButtonBorder__;--primary-button-border-color-active: __primaryButtonBorderHover__;--secondary-button-background-color: __secondaryButtonBackground__;--secondary-button-background-color-active: __secondaryButtonBackgroundHover__;--secondary-button-text-color: __secondaryButtonText__;--secondary-button-text-color-active: __secondaryButtonTextHover__;--secondary-button-border-color: __secondaryButtonBorder__;--secondary-button-border-color-active: __secondaryButtonBorderHover__;--volume-control-background-color: __volumeControlBackgroundColor__;--volume-control-playback-color: __volumeControlPlaybackColor__;--volume-control-thumb-color: __volumeControlThumbColor__;--more-menu-volume-control-background-color: __moreMenuVolumeControlBackgroundColor__;--more-menu-volume-control-playbackColor: __moreMenuVolumeControlPlaybackColor__;--more-menu-volume-control-thumb-color: __moreMenuVolumeControlThumbColor__;--popup-background-color: __popupBackground__;--popup-transparent-background-color: __transparentPopupBackground__;--popup-border: __popupBorder__;--popup-background-hover-color: __popupBackgroundHover__;--popup-text-color: __popupText__;--popup-text-hover-color: __popupTextHover__;--link-button-background-color: transparent;--link-button-text-color: __linkButtonTextColor__;--player-text: __playerText__;--button-border-radius: __borderRadius__;--presenter-info-link-border-color: __presenterInfoLinkBorderColor__;--search-field-background-color: __searchFieldBackgroundColor__;--hovered-tab-background-color: __hoveredTabBackgroundColor__;--selected-tab-background-color: __selectedTabBackgroundColor__;--top-panel-icon-container-color: __topPanelIconContainerColor__;--top-panel-icon-color: __topPanelIconColor__;--mini-skin-menu-button-text: __miniSkinMenuButtonText__;--mini-skin-menu-button-background-active: __miniSkinMenuButtonBackgroundActive__;--mini-skin-top-bottom-panel-border: __miniSkinTopBottomPanelBorder__;--mini-skin-presenter-delimiter-color: __miniSkinPresenterDelimiterColor__;--top-bottom-panel-border-color: __topBottomPanelBorderColor__; }.logo-container {display: -ms-flexbox;display: flex; } .logo-container > a {display: -ms-flexbox;display: flex; }.top-panel {display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;-ms-flex-pack: justify;justify-content: space-between;height: 52px;padding: 0 16px;border-bottom: 1px solid var(--top-bottom-panel-border-color);box-sizing: border-box;will-change: transform; } .top-panel.top-panel_reversed {-ms-flex-direction: row-reverse;flex-direction: row-reverse; } .top-panel__container {display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;-ms-flex-align: center;align-items: center; } .top-panel__presenter-info {max-width: 400px;padding: 32px 28px; }.top-main-container {display: -ms-flexbox;display: flex;-ms-flex-positive: 1;flex-grow: 1;-ms-flex-pack: justify;justify-content: space-between;max-height: 100%; } .top-main-container .info-container {margin-left: auto; } .top-main-container .info-container__item:first-child {margin-right: 20px; } .top-main-container .info-container__item:last-child {margin-right: 0; } .top-main-container.top-main-container_reversed {-ms-flex-direction: row-reverse;flex-direction: row-reverse; } .top-main-container.top-main-container_reversed .info-container {margin-right: auto;margin-left: 0;-ms-flex-direction: row-reverse;flex-direction: row-reverse; } .top-main-container.top-main-container_reversed .info-container__item:first-child {margin-right: 0; } .top-main-container.top-main-container_reversed .info-container__item:last-child {margin-right: 20px; }.buttons-container {-ms-flex-negative: 0;flex-shrink: 0; } .buttons-container__button {margin-right: 8px; }.info-container {overflow: hidden; } .info-container__title {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;overflow: hidden;color: var(--text-color);max-width: 480px; } .info-container__title > div {font-family: var(--font-family-normal);font-size: 14px;line-height: 20px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; }.popups-layer {position: absolute;margin-left: 0 !important;left: 0;top: 0;width: 100%; } .popups-layer .popup {background: var(--popup-background-color);border: 1px solid var(--popup-border);box-shadow: 0 20px 32px rgba(0, 0, 0, 0.16);-webkit-backdrop-filter: blur(8px);backdrop-filter: blur(8px);border-radius: 10px;position: absolute;top: 0;left: 0; } .popups-layer .popup.popup_outline-popup {width: 280px; } .popups-layer .popup.popup_presenter .mask {width: calc(100% - 2px);left: 1px;bottom: 12px; } .popups-layer .popup.popup_attachments {width: 368px;box-sizing: border-box; }.notes-popup {position: relative;font-size: 15px;line-height: 20px;word-wrap: break-word;width: 372px;padding: 16px;border-radius: inherit; } .notes-popup__scroll-area {overflow: hidden;height: 100%; } .notes-popup .notes-text {word-wrap: break-word; } .notes-popup .notes-text p {margin-top: 0;margin-bottom: 0;white-space: pre-wrap; } .notes-popup .notes-text p, .notes-popup .notes-text span {color: var(--panel-text-color) !important; } .notes-popup .notes-text p:first-child {margin-top: 0; } .notes-popup .notes-text p:last-child {margin-bottom: 0; } .notes-popup .notes-text p, .notes-popup .notes-text p.bold span.nobold, .notes-popup .notes-text p.italic span.noitalic, .notes-popup .notes-text p.bold.italic span.nobold.noitalic {font-family: var(--font-family-normal); } .notes-popup .notes-text p span.bold, .notes-popup .notes-text p.bold, .notes-popup .notes-text p.italic span.bold.noitalic, .notes-popup .notes-text p.bold.italic span.noitalic {font-family: var(--font-family-bold); } .notes-popup .notes-text p span.italic, .notes-popup .notes-text p.bold span.nobold.italic, .notes-popup .notes-text p.italic, .notes-popup .notes-text p.bold.italic span.nobold {font-family: var(--font-family-italic); } .notes-popup .notes-text p span.bold.italic, .notes-popup .notes-text p.bold span.italic, .notes-popup .notes-text p.italic span.bold, .notes-popup .notes-text p.bold.italic {font-family: var(--font-family-bold-italic); }.attachments-popup {padding: 12px 0;border-radius: inherit; }.progress-tooltip {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;z-index: 1; } .progress-tooltip__thumbnail-tooltip {border: 2px var(--top-bottom-bar-background-color) solid;border-radius: 3px;width: 140px;height: 80px;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out; } .progress-tooltip__timing-tooltip {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: 4px; }.universal-skin-separator {position: relative;width: 100%;padding-top: 1px; } .universal-skin-separator::after {content: '';display: block;height: 1px;background: var(--top-bottom-panel-border-color); }.progressbar {position: relative;height: 2px;width: 100%; } .progressbar__progress {position: absolute;top: 0;left: 0;width: 100%;height: 100%;background-color: var(--progressbar-background-color);transition: transform 0.3s ease-in-out; } .progressbar__progress-background {position: absolute;background: var(--progressbar-playback-color);top: 0;left: 0;height: 100%;transition: transform 0.3s ease-in-out; } .progressbar__thumb {width: 12px;height: 12px;border-radius: 50%;background: var(--progressbar-playback-color);bottom: -5px;position: absolute;left: -6px;cursor: pointer; } .progressbar__progress-tooltip {position: absolute;top: -14px;-ms-transform: translateY(-100%);transform: translateY(-100%); }:root {--page-background-color: __pageBackground__;--button-background-color: __primaryButtonBackground__;--button-hover-background-color: __primaryButtonBackgroundHover__;--button-hover-text-color: __primaryButtonTextHover__;--button-text-color: __primaryButtonText__;--company-logo-background-color: __asideLogoBackground__;--hyperlink-text-color: __hyperlink__;--list-item-background-hover-color: __asideElementBackgroundHover__;--list-item-border-color: __outlineItemBorder__;--list-item-background-pressed-color: __asideElementBackgroundActive__;--list-item-text-hover-color: __asideElementTextHover__;--list-item-text-pressed-color: __asideElementTextActive__;--list-item-text-visited-color: __asideElementTextVisited__;--list-item-icon-fill-color: __itemsListIconFill__;--list-item-order-color: __itemsListOrder__;--list-item-icon-stroke-color: __itemsListIconStroke__;--list-item-icon-color: __itemsListIcon__;--panel-color: __asideBackground__;--panel-text-color: __asideElementText__;--panel-video-stub-background-color: __panelVideoStubBackgroundColor__;--panel-video-stub-color: __panelVideoStubColor__;--player-background-color: __playerBackground__;--progressbar-background-color: __progressBackground__;--progressbar-playback-color: __progressPlayback__;--slide-border-color: __slideBorder__;--text-color: __playerText__;--topbar-hover-background-color: __secondaryButtonBackgroundHover__;--topbar-text-color: __secondaryButtonText__;--primary-button-text-color: __primaryButtonText__;--primary-button-text-color-active: __primaryButtonTextHover__;--primary-button-background-color-active: __primaryButtonBackgroundHover__;--primary-button-background-color: __primaryButtonBackground__;--primary-button-border-color: __primaryButtonBorder__;--primary-button-border-color-active: __primaryButtonBorderHover__;--secondary-button-background-color: __secondaryButtonBackground__;--secondary-button-background-color-active: __secondaryButtonBackgroundHover__;--secondary-button-text-color: __secondaryButtonText__;--secondary-button-text-color-active: __secondaryButtonTextHover__;--secondary-button-border-color: __secondaryButtonBorder__;--secondary-button-border-color-active: __secondaryButtonBorderHover__;--volume-control-background-color: __volumeControlBackgroundColor__;--volume-control-playback-color: __volumeControlPlaybackColor__;--volume-control-thumb-color: __volumeControlThumbColor__;--more-menu-volume-control-background-color: __moreMenuVolumeControlBackgroundColor__;--more-menu-volume-control-playbackColor: __moreMenuVolumeControlPlaybackColor__;--more-menu-volume-control-thumb-color: __moreMenuVolumeControlThumbColor__;--popup-background-color: __popupBackground__;--popup-transparent-background-color: __transparentPopupBackground__;--popup-border: __popupBorder__;--popup-background-hover-color: __popupBackgroundHover__;--popup-text-color: __popupText__;--popup-text-hover-color: __popupTextHover__;--link-button-background-color: transparent;--link-button-text-color: __linkButtonTextColor__;--player-text: __playerText__;--button-border-radius: __borderRadius__;--presenter-info-link-border-color: __presenterInfoLinkBorderColor__;--search-field-background-color: __searchFieldBackgroundColor__;--hovered-tab-background-color: __hoveredTabBackgroundColor__;--selected-tab-background-color: __selectedTabBackgroundColor__;--top-panel-icon-container-color: __topPanelIconContainerColor__;--top-panel-icon-color: __topPanelIconColor__;--mini-skin-menu-button-text: __miniSkinMenuButtonText__;--mini-skin-menu-button-background-active: __miniSkinMenuButtonBackgroundActive__;--mini-skin-top-bottom-panel-border: __miniSkinTopBottomPanelBorder__;--mini-skin-presenter-delimiter-color: __miniSkinPresenterDelimiterColor__;--top-bottom-panel-border-color: __topBottomPanelBorderColor__; }.more-menu-popup {padding: 12px 0; } .more-menu-popup .volume-slider-wrapper {width: 86px; } .more-menu-popup .volume-slider {position: relative;width: 80px;height: 3px; } .more-menu-popup .volume-slider__enlarged-click-area {position: absolute;cursor: pointer;width: 100%;height: 40px;top: 50%;-ms-transform: translateY(-50%);transform: translateY(-50%); } .more-menu-popup .volume-slider__background {position: absolute;width: 100%;height: 100%;background: var(--more-menu-volume-control-background-color); } .more-menu-popup .volume-slider__volume {position: absolute;background: var(--more-menu-volume-control-playbackColor);bottom: 0;left: 0;height: 100%;border-radius: 4px; } .more-menu-popup .volume-slider__track {position: relative;height: 100%; } .more-menu-popup .volume-slider__thumb {position: absolute;width: 12px;height: 12px;border-radius: 50%;background: var(--more-menu-volume-control-thumb-color);bottom: -4.5px;margin-left: -6px; }.collapsable-buttons-group {vertical-align: middle;display: -ms-inline-flexbox;display: inline-flex;-ms-flex-align: center;align-items: center;overflow: hidden;-ms-flex-positive: 1;flex-grow: 1;-ms-flex-negative: 1;flex-shrink: 1; } .collapsable-buttons-group__collapsable-button {margin-right: 8px; }.navigation-controls {display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;-ms-flex-align: center;align-items: center;position: relative; } .navigation-controls__button.navigation-controls__button_next {margin-left: 8px; } .navigation-controls__button.navigation-controls__button_prev {margin-left: 20px; } .navigation-controls__button.navigation-controls__button_locked {pointer-events: auto;cursor: url(data/lock.cur), no-drop; } .navigation-controls__label {font-size: 14px;color: var(--text-color);opacity: 0.72; }.play-controls-container {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative;-ms-flex-positive: 1;flex-grow: 1;-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;margin: 14px 16px; } .play-controls-container::before {content: '';display: inline-block;height: 100%;vertical-align: middle; } .play-controls-container__play-pause-button {margin-right: 8px; } .play-controls-container__outline-button {margin-right: 8px; }.universal-control-panel {font-family: var(--font-family-normal);display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;width: 100%;position: relative;-ms-transform-origin: 0 0;transform-origin: 0 0;min-height: 66px;will-change: transform; } .universal-control-panel .volume-slider-wrapper {width: 86px; } .universal-control-panel .volume-slider {position: relative;width: 80px;height: 3px; } .universal-control-panel .volume-slider__enlarged-click-area {position: absolute;cursor: pointer;width: 100%;height: 40px;top: 50%;-ms-transform: translateY(-50%);transform: translateY(-50%); } .universal-control-panel .volume-slider__background {position: absolute;width: 100%;height: 100%;background: var(--volume-control-background-color); } .universal-control-panel .volume-slider__volume {position: absolute;background: var(--volume-control-playback-color);bottom: 0;left: 0;height: 100%;border-radius: 4px; } .universal-control-panel .volume-slider__track {position: relative;height: 100%; } .universal-control-panel .volume-slider__thumb {position: absolute;width: 12px;height: 12px;border-radius: 50%;background: var(--volume-control-thumb-color);bottom: -4.5px;margin-left: -6px; } .universal-control-panel__navigation-controls {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;margin: 14px 16px 14px auto; } .universal-control-panel.universal-control-panel_interaction-mode .universal-control-panel__play-controls-container {display: none; } .universal-control-panel.universal-control-panel_hide-controls {visibility: hidden; }.universal-side-panel {width: 280px;height: 100%;overflow: hidden;z-index: 0;position: relative;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-transform-origin: left center;transform-origin: left center;background: var(--panel-color);color: var(--panel-text-color);vertical-align: top;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel__presenter-info {padding: 24px 20px;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel__presenter-info.universal-side-panel__presenter-info_with-delimiter::after {content: '';height: 1px;width: 240px;background: var(--popup-text-color);opacity: 0.08;position: absolute;bottom: 0;left: 20px; } .universal-side-panel .logo {width: 100%;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;-ms-flex-negative: 0;flex-shrink: 0;position: relative;background: var(--company-logo-background-color); } .universal-side-panel .logo.logo_has-logo {padding: 12px 0;min-height: 75px;max-height: 180px;max-width: 280px; } .universal-side-panel .logo a {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;height: 100%; } .universal-side-panel .logo a canvas {max-height: 156px;max-width: 280px; } .universal-side-panel .logo.logo_with-delimiter::after {content: '';height: 1px;width: 240px;background: var(--popup-text-color);opacity: 0.08;position: absolute;bottom: 0;left: 20px; } .universal-side-panel .video-container {box-sizing: border-box;overflow: hidden;margin-bottom: 12px;position: relative;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel .video-container::before {content: '';box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.04);position: absolute;z-index: 1;left: 0;top: 0;width: 100%;height: 100%;pointer-events: none; } .universal-side-panel__video-stub {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;box-sizing: border-box;-ms-flex-negative: 0;flex-shrink: 0;height: 158px;margin-bottom: 12px;background: var(--panel-video-stub-background-color);color: var(--panel-video-stub-color); } .universal-side-panel .playerView {box-sizing: border-box;overflow: hidden;position: relative;margin-bottom: 12px;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel .playerView::before {content: '';box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.04);position: absolute;z-index: 1;left: 0;top: 0;width: 100%;height: 100%;pointer-events: none; } .universal-side-panel__maximized {margin: 0;position: absolute;width: 36px;height: 36px;background: rgba(69, 69, 69, 0.84);color: #FFFFFF;border-radius: 10px;-webkit-backdrop-filter: blur(8px);backdrop-filter: blur(8px);left: 8px;bottom: 5px;z-index: 3;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center; } .universal-side-panel__maximized.universal-side-panel__maximized_at-left {right: 8px;left: auto; } .universal-side-panel__maximized.universal-side-panel__maximized_active {background: #454545; } .universal-side-panel__panel-title {color: var(--text-color);padding: 5px 8px 12px 8px; }.outline-info-panel {font-family: var(--font-family-normal);-ms-flex-positive: 1;flex-grow: 1;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;border-radius: inherit;height: 100%; } .outline-info-panel .outline-panel-header {display: -ms-flexbox;display: flex;-ms-flex-negative: 0;flex-shrink: 0;-ms-flex-align: center;align-items: center;width: 100%;height: 68px;padding: 16px 16px 16px 20px; } .outline-info-panel .outline-panel-header__switcher {display: -ms-flexbox;display: flex;-ms-flex-negative: 0;flex-shrink: 0;-ms-flex-positive: 1;flex-grow: 1; } .outline-info-panel .outline-panel-header__panel-title {font-family: var(--font-family-bold);font-size: 16px;line-height: 20px;color: var(--panel-text-color);-ms-flex-negative: 0;flex-shrink: 0;-ms-flex-positive: 1;flex-grow: 1; } .outline-info-panel .search-button {width: 36px;height: 36px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;color: var(--popup-text-color);cursor: pointer; } .outline-info-panel .search-button svg {width: 20px;height: 20px; } .outline-info-panel .clear-button {width: 36px;height: 36px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;color: var(--popup-text-color);cursor: pointer; } .outline-info-panel .clear-button svg {width: 20px;height: 20px; } .outline-info-panel .search-button {opacity: 0.72; } .outline-info-panel .clear-button {position: absolute;right: 4px;top: 2px;opacity: 0.6; } .outline-info-panel .search-wrapper {-ms-flex-positive: 1;flex-grow: 1;position: relative; } .outline-info-panel .search-field {position: relative;height: 40px;width: 100%;background: var(--search-field-background-color);border-radius: 8px;padding: 10px 44px 10px 16px;font-size: 15px;line-height: 20px;color: var(--panel-text-color);border: none;outline: none; } .outline-info-panel .search-field:-ms-input-placeholder {opacity: 0.4; } .outline-info-panel .search-field::placeholder {opacity: 0.4; } .outline-info-panel .panel-tab-button {font-family: var(--font-family-bold);display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;height: 36px;padding: 0 16px;border-radius: var(--button-border-radius);color: var(--panel-text-color);background: transparent;opacity: 0.72;transition: background 0.3s ease, color 0.3s ease, opacity 0.3s ease; } .outline-info-panel .panel-tab-button.panel-tab-button_active {background: var(--hovered-tab-background-color);color: var(--list-item-text-hover-color);opacity: 1; } .outline-info-panel .panel-tab-button.panel-tab-button_chosen {background: var(--selected-tab-background-color);color: var(--list-item-text-pressed-color);opacity: 1; } .outline-info-panel .panel-tab-button:not(:last-child) {margin-right: 4px; } .outline-info-panel.outline-info-panel_mode_notes .outline-info-panel__outline-container {display: none; } .outline-info-panel__notes-container {-ms-flex-positive: 1;flex-grow: 1;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;height: 100%; } .outline-info-panel__outline-container {-ms-flex-positive: 1;flex-grow: 1;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;height: 100%; } .outline-info-panel__outline-container {border-radius: inherit;border-top-left-radius: 0;border-top-right-radius: 0;height: 100%; } .outline-info-panel__notes-container {padding-bottom: 10px; } .outline-info-panel .outline {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;border-radius: inherit;height: 100%; } .outline-info-panel .notes {height: 100%;position: relative;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;padding-left: 12px; } .outline-info-panel .notes .notes-text {word-wrap: break-word;padding-right: 10px; } .outline-info-panel .notes .notes-text p {margin-top: 0;margin-bottom: 0;white-space: pre-wrap; } .outline-info-panel .notes .notes-text p, .outline-info-panel .notes .notes-text span {color: var(--panel-text-color) !important; } .outline-info-panel .notes .notes-text p:first-child {margin-top: 0; } .outline-info-panel .notes .notes-text p:last-child {margin-bottom: 0; } .outline-info-panel .notes .notes-text p, .outline-info-panel .notes .notes-text p.bold span.nobold, .outline-info-panel .notes .notes-text p.italic span.noitalic, .outline-info-panel .notes .notes-text p.bold.italic span.nobold.noitalic {font-family: var(--font-family-normal); } .outline-info-panel .notes .notes-text p span.bold, .outline-info-panel .notes .notes-text p.bold, .outline-info-panel .notes .notes-text p.italic span.bold.noitalic, .outline-info-panel .notes .notes-text p.bold.italic span.noitalic {font-family: var(--font-family-bold); } .outline-info-panel .notes .notes-text p span.italic, .outline-info-panel .notes .notes-text p.bold span.nobold.italic, .outline-info-panel .notes .notes-text p.italic, .outline-info-panel .notes .notes-text p.bold.italic span.nobold {font-family: var(--font-family-italic); } .outline-info-panel .notes .notes-text p span.bold.italic, .outline-info-panel .notes .notes-text p.bold span.italic, .outline-info-panel .notes .notes-text p.italic span.bold, .outline-info-panel .notes .notes-text p.bold.italic {font-family: var(--font-family-bold-italic); } .outline-info-panel .notes__scroll-area {overflow: hidden; } .outline-info-panel.outline-info-panel_mode_outline .outline-info-panel__notes-container {display: none; }.video-container.video-container_force-fit-video video {position: absolute;width: 100%;height: 100%;margin: auto;top: 0;right: 0;bottom: 0;left: 0; }.video-container video {background-color: black; }.marker-panel {font-family: var(--font-family-normal);padding: 12px 0;width: 260px; } .marker-panel__separator {position: relative;background: var(--popup-text-color);opacity: 0.08;height: 1px;margin: 3px 0; }.marker-panel-button {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative;padding: 4px 20px;opacity: 1;background-color: transparent;transition: background-color 0.28s ease-in-out;width: 100%; } .marker-panel-button__text {font-size: 15px;text-align: left;color: var(--popup-text-color); } .marker-panel-button.marker-panel-button_type_eraseAll, .marker-panel-button.marker-panel-button_type_endDrawing {padding: 14px 20px 14px 24px; } .marker-panel-button:focus, .marker-panel-button:hover {background-color: var(--list-item-background-hover-color); } .marker-panel-button:focus .marker-panel-button__text, .marker-panel-button:hover .marker-panel-button__text {color: var(--popup-text-hover-color); } .marker-panel-button:focus .marker-panel-button__item-icon, .marker-panel-button:hover .marker-panel-button__item-icon {color: var(--popup-text-hover-color); } .marker-panel-button[disabled] {opacity: 0.5;color: var(--popup-text-color);pointer-events: none; } .marker-panel-button[aria-selected='true'] {background-color: var(--list-item-background-pressed-color);color: var(--list-item-text-pressed-color); }.item-icon {width: 40px;height: 40px;background-color: var(--top-panel-icon-container-color);border-radius: 50%;margin-right: 10px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;color: var(--popup-text-color); } .item-icon__item-icon-image {width: 28px;height: 28px;color: inherit; }.marker-tool-container {position: absolute;top: 0; } .marker-tool-container.marker-tool-container_tool_line {cursor: url(data/marker.cur) 3 3, crosshair; } .marker-tool-container.marker-tool-container_tool_marker {cursor: url(data/highlighter.cur) 3 10, crosshair; } .marker-tool-container.marker-tool-container_tool_eraser {cursor: url(data/eraser.cur) 5 5, crosshair; }.draw-control {position: absolute; }.closed-caption-panel {position: absolute;height: 110px;width: 100%;bottom: 0;background-color: rgba(0, 0, 0, 0.5);padding: 13px 4px 7px 14px; } .closed-caption-panel__scroll-area {height: 100%; }.closed-captions {font-family: var(--font-family-normal);color: #FFFFFF;line-height: 19px;font-size: 14px;width: 100%;padding-right: 30px;word-wrap: break-word;white-space: pre-wrap;text-shadow: -1.4px 1.4px 2px rgba(0, 0, 0, 0.48); } .closed-captions p {position: relative !important;margin: 0; }.show-side-panel-button {position: absolute;top: 6px;z-index: 1001; } .show-side-panel-button.show-side-panel-button_side_left {left: 0; } .show-side-panel-button.show-side-panel-button_side_left .show-side-panel-button__button {left: -9px;border-radius: 0 25px 25px 0; } .show-side-panel-button.show-side-panel-button_side_right {right: 0; } .show-side-panel-button.show-side-panel-button_side_right .show-side-panel-button__button {left: 9px;border-radius: 25px 0 0 25px; } .show-side-panel-button.show-side-panel-button_side_right .show-side-panel-button__button.show-side-panel-button__button_active, .show-side-panel-button.show-side-panel-button_side_right .show-side-panel-button__button[aria-pressed='true'], .show-side-panel-button.show-side-panel-button_side_left .show-side-panel-button__button.show-side-panel-button__button_active, .show-side-panel-button.show-side-panel-button_side_left .show-side-panel-button__button[aria-pressed='true'] {background: var(--player-background-color);left: 0; } .show-side-panel-button__button {background: var(--player-background-color);box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.2);transition-property: left; }:root {--font-family-bold: PFnb;--font-family-bold-italic: PFnbi;--font-family-italic: PFni;--font-family-normal: PFn;--font-family-semibold: PFnsb, PFn;--font-family-semibold-italic: PFnsbi, PFni; }@keyframes preloader_spin {0% {transform: rotate(0deg); } 100% {transform: rotate(360deg); } }.message-box {background: var(--player-background-color);position: absolute;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;border-radius: 7px;min-width: 280px;padding: 40px;box-shadow: 0 8px 16px rgba(0, 0, 0, 0.08); } .message-box::after {content: '';box-sizing: border-box;border: 1px solid var(--popup-border);width: 100%;height: 100%;position: absolute;left: 0;top: 0;border-radius: 7px;pointer-events: none; } .message-box__content {position: relative;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-direction: column;flex-direction: column; } .message-box__icon {width: 24px;height: 24px;margin-bottom: 24px;position: relative;display: inline-block;color: var(--text-color);opacity: 0.72; } .message-box .message-box-buttons {position: relative;width: 100%;height: 36px; } .message-box .message-box-buttons__buttons {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center; } .message-box .message-box-buttons__window-button {margin: 0 4px; } .message-box .vertical-scrollbar {top: 40px; } .message-box__message-container {overflow: hidden;display: inline-block;max-width: 480px;vertical-align: top;position: relative; } .message-box__message {text-align: center;font-size: 16px;color: var(--text-color);text-overflow: ellipsis;overflow: hidden;position: relative;font-family: var(--font-family-normal); } .message-box__buttons {margin-top: 28px; }body {overflow: hidden;cursor: default; }:focus {outline: none; }button {cursor: pointer;margin: 0;border: 0;background: transparent; }#content {width: 100%;height: 100%; }.universal {font-family: var(--font-family-normal);display: -ms-flexbox;display: flex;overflow: hidden;position: relative;background: var(--player-background-color);-ms-transform-origin: 0 0;transform-origin: 0 0; } .universal.universal_left-panel {-ms-flex-direction: row-reverse;flex-direction: row-reverse; } .universal.universal_side-panel-hidden .universal__main-container {width: 100%; } .universal.universal_embedded-mode::after {content: '';top: 0;bottom: 0;left: 0;right: 0;position: absolute;border: 1px solid rgba(0, 0, 0, 0.12);pointer-events: none; }.main-container {position: relative;display: inline-block;z-index: 0;-ms-flex-positive: 1;flex-grow: 1; }.content-area {margin-left: auto;margin-right: auto;left: 0;right: 0;position: relative; } .content-area > div {position: absolute !important;top: 0;bottom: 0;margin-top: auto;margin-bottom: auto; } .content-area #playerView {position: absolute; } .content-area .preloader {width: 50px;height: 50px;position: absolute;top: 0;left: 0;bottom: 0;right: 0;margin: auto;border-radius: 10px;background-color: rgba(0, 0, 0, 0.5); } .content-area .preloader::after {content: '';position: absolute;background: url("+ +g[0]+");background-size: cover;top: 0;left: 0;bottom: 0;right: 0;animation: preloader_spin 1s infinite linear; } .content-area .float-panel-overlay {width: 100%;height: 100%;position: absolute;top: 0;left: 0; }.treecontrol {position: relative;-webkit-overflow-scrolling: touch;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;border-radius: inherit; } .treecontrol .container-top-shadow {background: __verticalGradient(var(--panel-color), transparent);background: linear-gradient(to bottom, var(--panel-color), transparent);position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; } .treecontrol .container-bottom-shadow {background: __verticalGradient(transparent, var(--panel-color));background: linear-gradient(to bottom, transparent, var(--panel-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; } .treecontrol.treecontrol_locked {cursor: url(data/lock.cur), no-drop; }.launch-screen {z-index: 100;position: fixed;top: 0;right: 0;bottom: 0;left: 0;background-color: rgba(0, 0, 0, 0.48); } .launch-screen .launch-screen-button {top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 96px;height: 96px;position: absolute; } .launch-screen .launch-screen-button__play-icon {background-color: #FFFFFF;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 90px;height: 90px;box-shadow: 0 12px 50px 0 rgba(0, 0, 0, 0.2);transition: 0.3s ease-in-out; } .launch-screen .launch-screen-button__icon {background: url("+ +g[1]+") no-repeat center;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 6px;width: 90px;height: 90px; } .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__play-icon {width: 96px;height: 96px; } .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__icon {background: url("+g[2]+") no-repeat center; }body {margin: 0;padding: 0;overflow: hidden;cursor: default;-ms-touch-action: pan-y;touch-action: pan-y;-webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body .password_form, body .info_panel {position: absolute;background: #F7F7F7;border-radius: 4px;width: 513px;height: 210px;font-family: Arial; } body .password_form *, body .info_panel * {box-sizing: border-box; } body .password_form .password_label {position: absolute;color: #3A3A3A;font-size: 15px;top: 63px;left: 55px; } body .password_form .wrong_password_label {position: absolute;color: #DD4A37;font-size: 12px;top: 131px;left: 55px; } body .password_form input {position: absolute;width: 330px;height: 32px;background: #FFFFFF;border: 1px solid #D1D2D4;padding: 1px;border-radius: 2px;font-size: 18px;color: #231F20;left: 54px;top: 94px;padding-left: 8px; } body .password_form button {border: transparent;background: transparent;color: #343434;font-family: Arial;font-size: 15px;text-shadow: 0 1px 0 rgba(255, 255, 255, 0.4); } body .password_form button::before {background: linear-gradient(to bottom, #D3D3D3, #BABABA);position: absolute;content: '';top: 0;right: 0;bottom: 0;left: 0;border-radius: 4px;z-index: -1; } body .password_form button::after {background: linear-gradient(to bottom, #DCDCDC, #D1D1D1);position: absolute;content: '';top: 1px;right: 1px;bottom: 1px;left: 1px;border-radius: 4px;z-index: -1; } body .password_form .btn_ok {position: absolute;top: 94px;right: 55px;width: 60px;height: 32px;opacity: 0.99; } body .info_panel {display: table; } body .info_panel .label {position: static;display: table-cell;vertical-align: middle;width: 100%;padding-left: 120px;padding-right: 40px;color: #3A3A3A;font-size: 15px; } body .info_panel::after {position: absolute;content: '';width: 63px;height: 63px;top: 73px;left: 46px; } body .info_panel.domain::after {background: transparent url("+ +g[3]+"); } body .info_panel.time::after {background: transparent url("+g[4]+"); }.component_base,.component_container {position: absolute; }:focus {outline: none; }::-moz-focus-inner {border: 0; }input {appearance: none; }button {cursor: pointer;margin: 0;border: 0; }button[disabled] {cursor: default; }.__player_view_id__ {position: absolute; } .__player_view_id__ > * {position: absolute; } .__player_view_id__ .slide {white-space: nowrap;font-size: 0; } .__player_view_id__ .slide a {text-decoration: none;cursor: pointer; } .__player_view_id__ .slide a img {border: 0; } .__player_view_id__ .slide * {-ms-transform-origin: 0 0;transform-origin: 0 0; } .__player_view_id__ .slide.relpos, .__player_view_id__ .slide .relpos {position: relative !important;vertical-align: top; } .__player_view_id__ .slide.kern, .__player_view_id__ .slide .kern {text-rendering: optimizeLegibility;font-feature-settings: 'kern' 1, 'liga' 0; } .__player_view_id__ .slide.nokern, .__player_view_id__ .slide .nokern {text-rendering: optimizeSpeed;font-feature-settings: 'kern' 0, 'liga' 0; } .__player_view_id__ .fullscreen {-ms-transform: none !important;transform: none !important;top: 0 !important;left: 0 !important; } .__player_view_id__ .fullscreen > video, .__player_view_id__ .fullscreen .video_player {background-color: black;width: __slide_width__ !important;height: __slide_height__ !important;z-index: 100;-ms-transform: none !important;transform: none !important; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen {background: url("+ +g[5]+") no-repeat; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen:hover {background: url("+g[6]+") no-repeat; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen:active {background: url("+g[7]+") no-repeat; } .__player_view_id__ .video_player video {width: 100%;height: 100%;margin: auto;top: 0;right: 0;bottom: 0;left: 0; } .__player_view_id__ .video_player video::cue {color: #FFFFFF;background-color: rgba(8, 8, 8, 0.75);border-radius: 4px;font-family: Helvetica, Roboto, Arial, sans-serif;line-height: 1.1; } .__player_view_id__ .video_player.poster_frame_hide_video video {display: none; } .__player_view_id__ .video_player.poster_frame video {opacity: 0; } .__player_view_id__ .video_player.poster_frame_hide_video .poster, .__player_view_id__ .video_player.poster_frame .poster {position: absolute;width: 100%;height: 100%; } .__player_view_id__ .video_player .controls {height: 36px;background: rgba(45, 50, 55, 0.85098);border: 1px solid #444648;cursor: default;border-radius: 4px; } .__player_view_id__ .video_player .controls, .__player_view_id__ .video_player .controls * {backface-visibility: hidden; } .__player_view_id__ .video_player .controls .progress {background-color: #75787A;height: 14px;left: 64px;top: 0;bottom: 0;margin-top: auto;margin-bottom: auto;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark {width: 10px;height: 10px;margin-top: -5px;margin-left: -5px;top: 50%;background: url("+ +g[8]+") no-repeat;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark:hover, .__player_view_id__ .video_player .controls .progress .bookmark:active {background: url("+g[9]+") no-repeat; } .__player_view_id__ .video_player .controls .progress .loading {background-color: #B1B3B5;height: 100%; } .__player_view_id__ .video_player .controls .progress .playing {background-color: #FFFFFF;height: 100%; } .__player_view_id__ .video_player .controls .progress .tooltip {background: url("+ +g[10]+") no-repeat;width: 60px;height: 25px;top: -33px;margin-left: -30px;font-family: Arial;font-size: 12px;padding-top: 2px;text-align: center; } .__player_view_id__ .video_player .controls .volume_popup {border-radius: 3px;background: rgba(45, 50, 55, 0.85098);top: -67px;right: 65px;padding: 8px;box-sizing: border-box;width: 28px;height: 64px; } .__player_view_id__ .video_player .controls .volume_popup .volume {background: url("+g[11]+");position: relative;cursor: pointer;width: 12px;height: 48px; } .__player_view_id__ .video_player .controls .volume_popup .volume .back {background: url("+ +g[12]+");width: 100%; } .__player_view_id__ .video_player .controls button {width: 100%;height: 100%; } .__player_view_id__ .video_player .controls button.rate {background: url("+g[13]+") no-repeat center; } .__player_view_id__ .video_player .controls button.rate.selected {background-color: rgba(255, 255, 255, 0.1); } .__player_view_id__ .video_player .controls button.mute {background: url("+g[14]+"); } .__player_view_id__ .video_player .controls button.mute:hover {background: url("+ +g[15]+"); } .__player_view_id__ .video_player .controls button.mute:active {background: url("+g[16]+"); } .__player_view_id__ .video_player .controls button.mute.selected {background: url("+g[17]+"); } .__player_view_id__ .video_player .controls button.mute.selected:hover {background: url("+g[18]+"); } .__player_view_id__ .video_player .controls button.mute.selected:active {background: url("+g[19]+"); } .__player_view_id__ .video_player .controls button.subtitles {background: url("+ +g[20]+") no-repeat center; } .__player_view_id__ .video_player .controls button.subtitles.selected {background-color: rgba(255, 255, 255, 0.1); } .__player_view_id__ .video_player .controls button.play {background: url("+g[21]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:hover {background: url("+g[22]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:active {background: url("+g[23]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected {background: url("+ +g[24]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:hover {background: url("+g[25]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:active {background: url("+g[26]+") no-repeat; } .__player_view_id__ .video_player .controls button.play::after {background: url("+g[27]+");width: 1px;height: 32px;right: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls button.toggle_fullscreen {background: url("+ +g[28]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:hover {background: url("+g[29]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:active {background: url("+g[30]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen::before {background: url("+g[27]+") no-repeat;width: 1px;height: 32px;left: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls .subtitles-list {width: 195px;right: 0;border-radius: 4px;border: solid 1px #444648;background-color: rgba(45, 50, 55, 0.85);font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;font-weight: normal;font-stretch: normal;font-style: normal;line-height: normal;letter-spacing: normal;padding: 3px 0;bottom: 37px; } .__player_view_id__ .video_player .controls .subtitles-list__caption {position: relative !important;padding: 12px 0 22px 0;color: #b8b8b8;text-align: center; } .__player_view_id__ .video_player .controls .subtitles-list__caption::after {position: absolute;content: '';width: calc(100% - 20px);left: 0;right: 0;bottom: 5px;margin: auto;border-bottom: 1px solid #444648; } .__player_view_id__ .video_player .controls .subtitles-list__item {color: #b8b8b8;position: relative !important;padding: 10px 2px 10px 35px;cursor: pointer;overflow: hidden;text-overflow: ellipsis; } .__player_view_id__ .video_player .controls .subtitles-list__item.subtitles-list__item_active {background-color: rgba(255, 255, 255, 0.1);color: #FFFFFF; } .__player_view_id__ .video_player .controls .subtitles-list__item[aria-selected='true'] {background-color: rgba(0, 0, 0, 0.24);color: #FFFFFF;padding-left: 12px; } .__player_view_id__ .video_player .controls .subtitles-list__item[aria-selected='true']::before {background: url("+ +g[31]+") no-repeat;width: 14px;height: 15px;padding-right: 23px;content: ''; } .__player_view_id__ .video_player .controls .toggle_fullscreen {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .play {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .rate {width: 32px;height: 34px;right: 95px;top: 0; } .__player_view_id__ .video_player .controls .rate.rate_subtitle-button-next {right: 127px; } .__player_view_id__ .video_player .controls .playback-rate-menu {width: 120px;right: 51px;border-radius: 4px;border: solid 1px #444648;background-color: rgba(45, 50, 55, 0.85);font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;font-weight: normal;font-stretch: normal;font-style: normal;line-height: normal;letter-spacing: normal;padding: 3px 0;bottom: 37px; } .__player_view_id__ .video_player .controls .playback-rate-menu.playback-rate-menu_subtitle-button-next {right: 83px; } .__player_view_id__ .video_player .controls .playback-rate-menu__caption {position: relative !important;padding: 12px 0 22px 0;color: #b8b8b8;text-align: center; } .__player_view_id__ .video_player .controls .playback-rate-menu__caption::after {position: absolute;content: '';width: calc(100% - 20px);left: 0;right: 0;bottom: 5px;margin: auto;border-bottom: 1px solid #444648; } .__player_view_id__ .video_player .controls .playback-rate-menu__item {color: #b8b8b8;position: relative !important;padding: 10px 2px 10px 35px;cursor: pointer;overflow: hidden;text-overflow: ellipsis; } .__player_view_id__ .video_player .controls .playback-rate-menu__item.playback-rate-menu__item_active {background-color: rgba(255, 255, 255, 0.1);color: #FFFFFF; } .__player_view_id__ .video_player .controls .playback-rate-menu__item[aria-selected='true'] {background-color: rgba(0, 0, 0, 0.24);color: #FFFFFF;padding-left: 12px; } .__player_view_id__ .video_player .controls .playback-rate-menu__item[aria-selected='true']::before {background: url("+ +g[31]+") no-repeat;width: 14px;height: 15px;padding-right: 23px;content: ''; } .__player_view_id__ .video_player .controls .subtitles {width: 32px;height: 34px;right: 95px;top: 0; } .__player_view_id__ .video_player .controls .toggle_fullscreen {right: -1px; } .__player_view_id__ .video_player .controls .mute {width: 22px;height: 22px;right: 67px;top: 6px; }.popup_layer {position: absolute; } .popup_layer .modal_layer {background: #000000;opacity: 0.4;z-index: 10;width: 100%;height: 100%; } .popup_layer .message_box, .popup_layer .confirm_window {background: #FFFFFF;border-radius: 5px;border: 1px solid rgba(0, 0, 0, 0.75);width: 357px;height: 150px;position: absolute;top: 0;right: 0;bottom: 0;left: 0;margin: auto;z-index: 10; } .popup_layer .message_box::after, .popup_layer .confirm_window::after {background-color: #E6E6E6;width: 100%;height: 1px;top: 30px;position: absolute;content: ''; } .popup_layer .message_box .title, .popup_layer .message_box .message, .popup_layer .confirm_window .title, .popup_layer .confirm_window .message {font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;color: #323232; } .popup_layer .message_box .title, .popup_layer .confirm_window .title {position: absolute;left: 13px;top: 7px;font-weight: bold;background: transparent; } .popup_layer .message_box .message, .popup_layer .confirm_window .message {position: absolute;top: 47px;left: 69px;margin-right: 25px; } .popup_layer .message_box .message::before, .popup_layer .confirm_window .message::before {background-color: #E6E6E6;width: 35px;height: 35px;left: -45px;position: absolute;content: ''; } .popup_layer .message_box button, .popup_layer .confirm_window button {font-size: 14px;border-radius: 5px;color: #323232;width: 68px;height: 30px; } .popup_layer .message_box button, .popup_layer .message_box button.mobile:hover, .popup_layer .message_box button.mobile:active, .popup_layer .confirm_window button, .popup_layer .confirm_window button.mobile:hover, .popup_layer .confirm_window button.mobile:active {background: #D4D4D4; } .popup_layer .message_box button:hover, .popup_layer .message_box button:active, .popup_layer .message_box button.mobile.active, .popup_layer .confirm_window button:hover, .popup_layer .confirm_window button:active, .popup_layer .confirm_window button.mobile.active {background: #B8B8B8; } .popup_layer .confirm_window button.btn_yes {left: 101px;top: 98px; } .popup_layer .confirm_window button.btn_no {left: 181px;top: 98px; } .popup_layer .confirm_window .message::before {background: url("+ +g[32]+"); } .popup_layer .message_box button.btn_ok {left: 141px;top: 98px; } .popup_layer .message_box .message::before {background: url("+g[33]+"); }.transitionSlide.paused * {animation-play-state: paused !important; }.framesLayer .video_player {-ms-transform-origin: 0 0;transform-origin: 0 0; }.framesLayer *:not(.framesLayerContent) {pointer-events: all; }.framesLayer .framesLayerContent {position: absolute; } .framesLayer .framesLayerContent > div {pointer-events: all; }.trial_banner {position: relative;transform: translateZ(0); } .trial_banner .banner-content, .trial_banner .banner-content_hover {position: absolute;left: 0;right: 0;top: 0;bottom: 0;width: 100%;height: 100%; } .trial_banner .banner-content {visibility: visible;z-index: 1; } .trial_banner .banner-content_hover {visibility: hidden;z-index: 0; } .trial_banner .days_remaining {position: absolute;font-family: 'Open Sans', Arial, sans-serif;font-weight: normal;font-size: 13px;left: 65px;top: 41px;color: #7C1645;z-index: 1; } .trial_banner:hover .banner-content {visibility: hidden;z-index: 0; } .trial_banner:hover .banner-content_hover {visibility: visible;z-index: 1; }.outline {font-family: var(--font-family-normal);position: relative; }.search-result {font-family: var(--font-family-bold);padding: 16px 0 8px 20px;position: relative;font-size: 15px;line-height: 20px;color: var(--popup-text-color); } .search-result.search-result_no-results {font-family: var(--font-family-normal);height: 100%;text-align: center;padding: 60px 0 0;opacity: 0.6; }.slide-item-view {position: relative;overflow: hidden;display: table;width: 100%;color: var(--panel-text-color);transition: background 0.28s ease; } .slide-item-view__content {height: 100%;display: table-row; } .slide-item-view__content > * {display: table-cell;vertical-align: middle; } .slide-item-view__open-button {width: 12px;height: 12px;margin: 0 8px 0 12px;opacity: 0.6;padding: 0;color: var(--popup-text-color);transition: transform 0.3s ease;background: transparent; } .slide-item-view__open-button[aria-pressed='true'] {-ms-transform: rotate(90deg);transform: rotate(90deg); } .slide-item-view__thumb {max-width: 100px;max-height: 60px;vertical-align: middle;margin-top: 1px;border: 1px solid rgba(0, 0, 0, 0.04);border-radius: 4px;background-color: var(--player-background-color); } .slide-item-view__status {position: absolute;width: 18px;height: 18px;background-size: 18px 18px; } .slide-item-view__status.slide-item-view__status_status_correct {background-image: url("+ +g[34]+"); } .slide-item-view__status.slide-item-view__status_status_partially {background-image: url("+g[35]+"); } .slide-item-view__status.slide-item-view__status_status_incorrect {background-image: url("+g[36]+"); } .slide-item-view__status.slide-item-view__status_status_answered {background-image: url("+g[37]+"); } .slide-item-view__status.slide-item-view__status_answered {background-image: url("+g[38]+"); } .slide-item-view__mark {position: absolute;width: 12px;height: 18px;top: 0;bottom: 0;margin: auto;background-image: url("+ +g[39]+");background-size: 12px 18px;background-repeat: no-repeat;margin-left: -40px; } .slide-item-view__mark.slide-item-view__mark_with-status {left: 8px; } .slide-item-view__title-container {width: 100%; } .slide-item-view__title {padding: 0 16px;font-size: 14px;line-height: 18px;max-height: 60px;word-break: break-word;overflow: hidden;display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .slide-item-view__title.slide-item-view__title_minimized {max-height: 70px; } .slide-item-view.slide-item-view_with-thumbnail .slide-item-view__title {padding-left: 11px; } .slide-item-view.slide-item-view_with-thumbnail .slide-item-view__mark {margin-left: -20px; } .slide-item-view.slide-item-view_active {background: var(--list-item-background-hover-color);color: var(--list-item-text-hover-color); } .slide-item-view.slide-item-view_active .slide-item-view__mark {background-image: url("+ +g[40]+"); } .slide-item-view[aria-selected='true'] {background: var(--list-item-background-pressed-color);color: var(--list-item-text-pressed-color); } .slide-item-view[aria-selected='true'] .slide-item-view__mark {background-image: url("+g[41]+"); }.treecontrol.treecontrol_highlight-viewed .slide-item-view.slide-item-view_viewed {color: var(--list-item-text-visited-color); }.treecontrol.treecontrol_highlight-viewed .slide-item-view.slide-item-view_viewed.slide-item-view_active {background: var(--list-item-background-hover-color);color: var(--list-item-text-hover-color); }.treecontrol.treecontrol_highlight-viewed .slide-item-view.slide-item-view_viewed[aria-selected='true'] {background: var(--list-item-background-pressed-color);color: var(--list-item-text-pressed-color); }.highlighted {font-family: var(--font-family-bold);padding: 2px 3px;margin: -2px -3px;font-size: 14px;line-height: 18px;color: var(--popup-text-color);opacity: 1; }.search-context {font-size: 14px;line-height: 18px;color: var(--popup-text-color);opacity: 0.6; }.container-top-shadow {background: __verticalGradient(var(--popup-background-color), var(--popup-transparent-background-color));background: linear-gradient(to bottom, var(--popup-background-color), var(--popup-transparent-background-color));position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; }.container-bottom-shadow {background: __verticalGradient(var(--popup-transparent-background-color), var(--popup-background-color));background: linear-gradient(to bottom, var(--popup-transparent-background-color), var(--popup-background-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; }.vertical-scrollbar {position: absolute;right: 0;top: 4px;bottom: 4px;width: 14px;transition: opacity 0.2s ease; } .vertical-scrollbar .thumb {position: absolute;width: 8px;right: 3px;padding: 1px;border-radius: 5px; } .vertical-scrollbar .thumb__background {height: 100%;border-radius: 4px;background-color: rgba(0, 0, 0, 0.32);border: 1px solid rgba(255, 255, 255, 0.12); }.vertical-scrollbar {transition: none;opacity: 0.5 !important; }.vertical-scrollbar .thumb {padding: 0;right: 0; } .vertical-scrollbar .thumb__background {height: 100%;border-radius: 20px;background-color: rgba(0, 0, 0, 0.16);border: 1px solid rgba(255, 255, 255, 0.12); }.presentation-view-mode-switch-control {width: 64px;height: 64px;position: fixed;left: 16px;top: 16px;cursor: pointer;border: none;background: url("+ +g[42]+") no-repeat center; } .presentation-view-mode-switch-control:not([disabled]):hover {background: url("+g[43]+") no-repeat center; } .presentation-view-mode-switch-control:not([disabled]):active {background: url("+g[44]+") no-repeat center; } .presentation-view-mode-switch-control:not([disabled]):focus {outline: none; } .presentation-view-mode-switch-control:not([disabled]):focus::before {content: '';position: absolute;top: 3px;bottom: 3px;left: 3px;right: 3px;border: 1px dotted #FFFFFF;opacity: 0.6; }"}(); +var e;for(const [g,h]of Object.entries(null!=(e=a)?e:{}))e=`__${g.replace(RegExp("\\.","g"),"_")}__`,d=d.replace(new RegExp(e,"g"),h);let f;for(const [g,h]of Object.entries(null!=(f=b)?f:{}))d=d.replace(new RegExp(g,"g"),h);d=d.replace(/__verticalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.rn);d=d.replace(/__horizontalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.pn);return gn(d)}rn(a,b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}pn(a, +b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}};var zG={mb_question_icon:'', +mb_warning_icon:'', +arrows_left:'',arrows_right:'', +"attachment-doc":'', +"attachment-image":'', +"attachment-link":'',"attachment-unknown":'', +"attachment-video":'', +attachments_button_icon:'', +"btn_pause_big.svg":' \t\t', +"btn_play_big.svg":' ', +cc:'', +cc_on:'', +chevron_left:'',chevron_right:'',collapse_icon:'', +erase_search:'', +exit_fullscreen:'', +"external-link":'',fullscreen:'', +"mail-link":'', +marker_eraser:'', +marker_highlighter:'', +marker_panel_button_icon:'', +marker_pen:'', +more:'', +next_btn:'',next_btn_mobile:'', +notes_button_icon:'', +outline:'', +outline_button_icon:'', +pause:'',play:'',play_pause_btn:' ', +presenter_info_button_icon:'',prev_btn:' ', +prev_btn_mobile:'',"rate-0.75x":'', +"rate-1.25x":'', +"rate-1.5x":'', +"rate-1x":'', +"rate-2x":'', +replay:'',search:'', +"tab-left":'',"tab-right":'',tab1:'', +tab2:'',tick:'', +video_maximize:'',"video_stub.svg":'', +volume_high:'', +volume_middle:'', +volume_mute:''};var AG={mb_question_icon:'', +mb_warning_icon:'', +"attachment-doc":'', +"attachment-image":'', +"attachment-link":'',"attachment-unknown":'', +"attachment-video":'', +attachments:'', +attachment_icon:'\t', +back:'',back_to_app:'', +bio:'', +close:'', +mail:'', +next:'',notes:'', +outline:'', +outline_landscape:'', +pause:'',phone:'', +play:'',presenter_info:'', +prev:'',"rate-0.75x":'', +"rate-1.25x":'', +"rate-1.5x":'', +"rate-1x":'', +"rate-2x":'', +rate:'', +search:'', +site:'', +tick:'',url_icon:'\t'};class BG{Uq(a,b){var c="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICB3aWR0aD0iMjhweCIgaGVpZ2h0PSIzM3B4IiB2aWV3Qm94PSIwIDAgMjguMzAyIDMzLjI0MiI+DQoJPHBhdGggZD0iTTAsMS44VjMxLjQ0MmExLjgsMS44LDAsMCwwLDIuNzI2LDEuNTQzbDI0LjctMTQuODJhMS44LDEuOCwwLDAsMCwwLTMuMDg3TDIuNzI2LjI1N0ExLjgsMS44LDAsMCwwLDAsMS44WiIgc3R5bGU9ImZpbGw6IzMzMyIvPg0KPC9zdmc+ data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyOHB4IiBoZWlnaHQ9IjMzcHgiIHZpZXdCb3g9IjAgMCAyOC4zMDIgMzMuMjQyIj4NCgk8cGF0aCBkPSJNMCwxLjhWMzEuNDQyYTEuOCwxLjgsMCwwLDAsMi43MjYsMS41NDNsMjQuNy0xNC44MmExLjgsMS44LDAsMCwwLDAtMy4wODdMMi43MjYuMjU3QTEuOCwxLjgsMCwwLDAsMCwxLjhaIiBzdHlsZT0iZmlsbDojNTI4YmRmIi8+DQo8L3N2Zz4= data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAADcmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmFjOGVjNDFhLTZkYWItODQ0Ni04YzkzLWU1Mjk3N2YwMmE4NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFRThCNzU3NDYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFRThCNzU3MzYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cykiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0OWFlZmI1OC00ZWFmLWQ3NDgtYTI0ZS0zNmNhNGQ2M2QwNTYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6N0MwQkFBM0M2MjAxMTFFNUI4QjBERTk4MjY5MjQwQjUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6MGSVVAAAE3klEQVR42uycW4hWVRiG15Q4eYzGQySSQlriEQ9BF2mE4iSdESRRIb0RD+mNmHgICjqQEGUe6sqgCy1i0iRinAzELrooQhHLGQURUTzMiM7omCLj+/F/czX/t/890z6s9e/3hZcZ1l6z19r7mXXca62arq4uR/mjh/gKCIQiEAKhCIRAKAIhEIpACIQiEIpACIQiEAKhCIRAKAIhEMoX9Yu62NbWxjcUobq6OpaQQpcQz/QwPBOeDU+Fx8Oj4UfhoRrnJnwDvgC3wCfgY/Bf8P0QHrImahmQB1VWLfwGvAieqy+/LxJIR+Dv4QPwf75WWb4CGQavg9fo70mqFd4F79DfCSRCA+HN8Hp4cMppdcBfwB/Bt9mo99Sr8Cl4SwYwnKYhaf2jaXMconoE/hL+CR6TQ/pPato7NS+FbtSfgH+Gp8eMfwv+HT6qpakZvqzVT/d//ePw0/BEeI72ygbFvP/f8MvwpSK2IfLSGuGxFeJ1aby98CG4s5fpDNAqaTlcL89cIf45jddcpDZknI4PKsFo0NKzQLusnX1Iq1P/doHe60CF+GM1b+OK0obIYO5XeGREnLPwfHghfDzBtOVeb+q9z0bEG6njltHVDqQ2RuP9HTwDbkoxH02axv4YjX1tNQP5LKIBl7ZiK/yWToGkLUljsaZpNaTTNc9VCeR1eHUEjHfgD3OoQiXNVRFQVmveqwrIEHh3xPXNOp2Rl77WPFiSvA+tJiCb4FHGNanHP/FggCp52Gdck7y/Wy0Dw2Hatx9s9KZmZNRmxC3JMjh8qsy1Du0St4Y+DomaKFzlEQxRu+apnOQZ1oVeZfWPeMCGlLu2/6dL3BDRwPcPGYiMjocbvaoPnL963+h1DddnChbIMiP8cMIj8KQln34be/lM3gOREW69cW2v81/fGOH1aY7e0wTyrNGYyxT6wQCAHNS8lmvcZ4UIZL4RLt8z7gQA5I7mtZyeCxHIS0b4UReOrLw+EyIQqxScDAiIldcJIQLZYTTmvwUEpMUIHxMikB/gta40PXIF/lwHVrcCAnLVCH8srQR9X7mYt2RUbq1yrOFia390N9SReugaYoR3EEg+GmGEtxNIPhpvhJ8nkHw02Qj/l0Dy0Rwj/DSBZC9ZeD3buPYHgWSv11z5RdrSw/qTQLLX20Z4o0toSxyBxJdsKrVmq79NM2ECKa/3XPltC9fgXwgkW81zpVX35fSVS3HahEB6SqZK9hjXujeJOgLJTrLG19qos1OrLALJSLL+eLFx7SL8cRaZIJCSVrrSfnVL8qHtJoFkoy3ablibQeWz849ZZaZfgUHIfg/Z97EkIs5xLR2OQNLv2u5x0Ttt5UShV1wfj91glRVP01xp8UVTBRiyuOFFheJYQpKVzNrKwQErXPyDA2SF+5k8MhsykCnwPdfzaA3ZYy6nREyCX4Cfd/EPs+nV0RoEUlqWsx1eCie9Bkc2nW5wOa87Dg3Ipy75bWXntSd1yIcHDK1RT3KzTIcOBif6AqOo3d42HX/I0tZW3zIXWgnp68chmfaQjZxyoKac0bXNRxghlpCN2m1dpj/btXEfpD0uqYaua89Luq3dx8TKN3AeE1vt4mLrAohACIQiEAKhCIRAKAIhEIpACq7IqROKJYRA+AoIhCIQAqEIhEAoAiEQikCKrQcCDABHPgH2w7NQdAAAAABJRU5ErkJggg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA5LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDksMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbD0iI0RENEIzOCIgZD0iTTIxLjA0MSwyOXY5Ljg0NGMwLDUuNTA4LDQuNjkxLDkuOTczLDEwLjQ3OSw5Ljk3M2M1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTczVjI5SDIxLjA0MXoiLz4NCjxwYXRoIGZpbGw9IiNERDRCMzgiIGQ9Ik0yNi41NTgsMjl2LTcuNjg5YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MlYyOWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNFYyOUgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjEuMDQxLDI4LjIwNnY5Ljg0NWMwLDUuNTA2LDQuNjkxLDkuOTcxLDEwLjQ3OSw5Ljk3MWM1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTcxdi05Ljg0NUgyMS4wNDF6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjYuNTU4LDI4LjA0VjIwLjM1YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MnY3LjY4OWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNHY4LjA1NEgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRjA4RjgyIiBkPSJNMzQsMzYuMzY1YzAtMS4yODctMS4wNDQtMi4zMzEtMi4zMzEtMi4zMzFjLTEuMjg4LDAtMi4zMzIsMS4wNDQtMi4zMzIsMi4zMzENCgljMCwwLjk3MSwwLjU5NCwxLjgwMiwxLjQzOCwyLjE1MnY0LjQ2N2gxLjkxdi00LjUyOUMzMy40NjEsMzguMDc2LDM0LDM3LjI4NywzNCwzNi4zNjV6Ii8+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA4LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDgsMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik01OS42NDYsMzFoLTMuMjkzQzU2LjE1OCwzMSw1NiwzMS40NDgsNTYsMzINCgljMCwwLjU1MywwLjE1OCwxLDAuMzU0LDFoMy4yOTNDNTkuODQyLDMzLDYwLDMyLjU1Myw2MCwzMkM2MCwzMS40NDgsNTkuODQyLDMxLDU5LjY0NiwzMXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjREQ0QjM4IiBkPSJNNi42NDcsMzFIMy4zNTNDMy4xNTgsMzEsMywzMS40NDgsMywzMmMwLDAuNTUzLDAuMTU4LDEsMC4zNTMsMQ0KCWgzLjI5NEM2Ljg0MiwzMyw3LDMyLjU1Myw3LDMyQzcsMzEuNDQ4LDYuODQyLDMxLDYuNjQ3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik0zMSw4YzAuNTUzLDAsMS0wLjE1OCwxLTAuMzUzVjQuMzUzQzMyLDQuMTU4LDMxLjU1Myw0LDMxLDQNCgljLTAuNTUyLDAtMSwwLjE1OC0xLDAuMzUzdjMuMjk0QzMwLDcuODQyLDMwLjQ0OCw4LDMxLDh6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTMxLDU2Yy0wLjU1MiwwLTEsMC4xNTgtMSwwLjM1NHYzLjI5M0MzMCw1OS44NDIsMzAuNDQ4LDYwLDMxLDYwDQoJYzAuNTUzLDAsMS0wLjE1OCwxLTAuMzU0di0zLjI5M0MzMiw1Ni4xNTgsMzEuNTUzLDU2LDMxLDU2eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik00Ny42NjgsMzFoLTEyLjgxQzM0LjQ5NiwyOS42LDMzLjQsMjguNTA1LDMyLDI4LjE0Mg0KCWMwLDAtMC4xNzItMC4xNDItMS0wLjE0MmMtMC44MjksMC0yLDAuNTU1LTIsMC41NTVjLTEuMTksMC42OTMtMiwxLjk2OS0yLDMuNDQ1YzAsMi4yMDksMS43OTEsNCw0LDRjMS40NzcsMCwyLjc1Mi0wLjgwOSwzLjQ0NS0yDQoJaDEzLjIyM0M0OC40MDQsMzQsNDksMzMuMzI4LDQ5LDMyLjVDNDksMzEuNjcyLDQ4LjQwNCwzMSw0Ny42NjgsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTI3LjAxOCwyOS43NDhjMC41OTIsMS4wMjUsMS42NTIsMS41MiwyLjM3LDEuMTA2bDAsMA0KCWMwLjcxNy0wLjQxNSwwLjgxOS0xLjU4MSwwLjIyOC0yLjYwNmwtNy44NTctMTMuNjA5Yy0wLjU5Mi0xLjAyNC0xLjY1My0xLjUyLTIuMzcxLTEuMTA2bDAsMGMtMC43MTcsMC40MTUtMC44MTgsMS41ODEtMC4yMjgsMi42MDUNCglMMjcuMDE4LDI5Ljc0OHoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMjcuMDE4LDI4LjM2MWMwLjU5MiwxLjAyNSwxLjY1MiwxLjUyLDIuMzcsMS4xMDZsMCwwDQoJYzAuNzE3LTAuNDE1LDAuODE5LTEuNTgxLDAuMjI4LTIuNjA2bC03Ljg1Ny0xMy42MDljLTAuNTkyLTEuMDI0LTEuNjUzLTEuNTItMi4zNzEtMS4xMDZsMCwwYy0wLjcxNywwLjQxNS0wLjgxOCwxLjU4MS0wLjIyOCwyLjYwNQ0KCUwyNy4wMTgsMjguMzYxeiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgY3g9IjMxIiBjeT0iMzEiIHI9IjQiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNjAsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzU0LDFoLTMuMjkzQzU2LjE1OCwzMiw1NiwzMS41NTIsNTYsMzENCglsMCwwYzAtMC41NTIsMC4xNTgtMSwwLjM1NC0xaDMuMjkzQzU5Ljg0MiwzMCw2MCwzMC40NDgsNjAsMzFMNjAsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTcsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzUzLDFIMy4zNTNDMy4xNTgsMzIsMywzMS41NTIsMywzMWwwLDANCgljMC0wLjU1MiwwLjE1OC0xLDAuMzUzLTFoMy4yOTRDNi44NDIsMzAsNywzMC40NDgsNywzMUw3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0zMSwzYzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDYuODQyLDMxLjU1Myw3LDMxLDdsMCwwDQoJYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1M1YzLjM1M0MzMCwzLjE1OCwzMC40NDgsMywzMSwzTDMxLDN6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTMxLDU1YzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDU4Ljg0MiwzMS41NTMsNTksMzEsNTkNCglsMCwwYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1NHYtMy4yOTRDMzAsNTUuMTU4LDMwLjQ0OCw1NSwzMSw1NUwzMSw1NXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNDksMzEuNDk5QzQ5LDMwLjY3Miw0OC40MDQsMzAsNDcuNjY4LDMwSDM0LjMzMw0KCUMzMy41OTYsMzAsMzMsMzAuNjcxLDMzLDMxLjVsMCwwYzAsMC44MjgsMC41OTYsMS41LDEuMzMzLDEuNWgxMy4zMzVDNDguNDA0LDMzLDQ5LDMyLjMyOCw0OSwzMS40OTlMNDksMzEuNDk5eiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YxNjE1NSIgY3g9IjMxIiBjeT0iMzEiIHI9IjIiLz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjM2MzgxNDQiPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgzNjAiIGNsYXNzPSJmaWwwIiBkPSJNNi43NzM1IDMuOTc5bDAgLTMuNDQyNDVjMCwtMC4yOTUxMTkgLTAuMjQxNDMzLC0wLjUzNjU1MiAtMC41MzY1NTIsLTAuNTM2NTUybC02LjIzNjk1IDAgMCA0LjUxNTU1IDYuMjM2OTUgMGMwLjI5NTExOSwwIDAuNTM2NTUyLC0wLjI0MTQzMyAwLjUzNjU1MiwtMC41MzY1NTJ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMzYzODEyMCIgY2xhc3M9ImZpbDEiIGQ9Ik0zLjE4NzUgMS4yMzAyMWwtMC4zMzU1NTIgMC4zMzU1MTQgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAtMC4yMjM2NjQgMC4yMjM2NjQgMC40NDczNjUgMC40NDczNjUgLTAuMzM1NTE0IDAuMzM1NTUyIDAuODk0NzMgMCAwIC0wLjg5NDczem0wLjI2NTY0MSAyLjA1NTFsMC4zMzU1MTQgLTAuMzM1NTE0IDAuNDQ3MzY1IDAuNDQ3MzY1IDAuMjIzNzAxIC0wLjIyMzcwMSAtMC40NDczNjUgLTAuNDQ3MzY1IDAuMzM1NTE0IC0wLjMzNTUxNCAtMC44OTQ3MyAwIDAgMC44OTQ3M3oiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDojRkVGRUZFO2ZpbGwtb3BhY2l0eTowLjEwMTk2MX0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIzNjM4MTQ0Ij4NCiAgIDxwYXRoIGlkPSJfMTIzNjM4MzYwIiBjbGFzcz0iZmlsMCIgZD0iTTYuNzczNSAzLjk3OWwwIC0zLjQ0MjQ1YzAsLTAuMjk1MTE5IC0wLjI0MTQzMywtMC41MzY1NTIgLTAuNTM2NTUyLC0wLjUzNjU1MmwtNi4yMzY5NSAwIDAgNC41MTU1NSA2LjIzNjk1IDBjMC4yOTUxMTksMCAwLjUzNjU1MiwtMC4yNDE0MzMgMC41MzY1NTIsLTAuNTM2NTUyeiIvPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgxMjAiIGNsYXNzPSJmaWwxIiBkPSJNMy4xODc1IDEuMjMwMjFsLTAuMzM1NTUyIDAuMzM1NTE0IC0wLjQ0NzM2NSAtMC40NDczNjUgLTAuMjIzNjY0IDAuMjIzNjY0IDAuNDQ3MzY1IDAuNDQ3MzY1IC0wLjMzNTUxNCAwLjMzNTU1MiAwLjg5NDczIDAgMCAtMC44OTQ3M3ptMC4yNjU2NDEgMi4wNTUxbDAuMzM1NTE0IC0wLjMzNTUxNCAwLjQ0NzM2NSAwLjQ0NzM2NSAwLjIyMzcwMSAtMC4yMjM3MDEgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAwLjMzNTUxNCAtMC4zMzU1MTQgLTAuODk0NzMgMCAwIDAuODk0NzN6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDojRkVGRUZFO2ZpbGwtb3BhY2l0eTowLjA1MDk4MH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIzNjM4MTQ0Ij4NCiAgIDxwYXRoIGlkPSJfMTIzNjM4MzYwIiBjbGFzcz0iZmlsMCIgZD0iTTYuNzczNSAzLjk3OWwwIC0zLjQ0MjQ1YzAsLTAuMjk1MTE5IC0wLjI0MTQzMywtMC41MzY1NTIgLTAuNTM2NTUyLC0wLjUzNjU1MmwtNi4yMzY5NSAwIDAgNC41MTU1NSA2LjIzNjk1IDBjMC4yOTUxMTksMCAwLjUzNjU1MiwtMC4yNDE0MzMgMC41MzY1NTIsLTAuNTM2NTUyeiIvPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgxMjAiIGNsYXNzPSJmaWwxIiBkPSJNMy4xODc1IDEuMjMwMjFsLTAuMzM1NTUyIDAuMzM1NTE0IC0wLjQ0NzM2NSAtMC40NDczNjUgLTAuMjIzNjY0IDAuMjIzNjY0IDAuNDQ3MzY1IDAuNDQ3MzY1IC0wLjMzNTUxNCAwLjMzNTU1MiAwLjg5NDczIDAgMCAtMC44OTQ3M3ptMC4yNjU2NDEgMi4wNTUxbDAuMzM1NTE0IC0wLjMzNTUxNCAwLjQ0NzM2NSAwLjQ0NzM2NSAwLjIyMzcwMSAtMC4yMjM3MDEgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAwLjMzNTUxNCAtMC4zMzU1MTQgLTAuODk0NzMgMCAwIDAuODk0NzN6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACHDwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKNWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAASMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEoqGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAGeIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gzSZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25qbc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9CvjcM4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjKuLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqxOPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIWiAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFVSAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAyrA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYghUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7rh2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SEdJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3JaSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQtlHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJy5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hopb2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsyu21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCccNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527PYS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOwEaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6sfaznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy+rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVsS1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9UxlfeqXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/wjowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9Vt1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503rm10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7Pnl/eriQvLDwG/eE8/s6uL5TAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAAGnRFWHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS4xMDD0cqEAAABfSURBVChTY/j//z8DMZgoRSCD4ApLK6rYgLgDiJ9CMYjNBrMNWWHnvAUL/3/4+BGMQWygwk5sCp+CFMDAhw8fQAqfYlcIlCRGYeeceQv+g0wCYRAbl9XEeYZQWBIdjgCVaiC8JN1udgAAAABJRU5ErkJggg== data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAACuSURBVHicY/n//z8DCLh7+/sAqWIgNmGAgDNA3Ltz68YtIA4LVFELkKpmQAUOIAyUawUqrmEBMnyxKEIG1UA1J0EmFsFELC3MGfJzssDsSVOnMxw7fgImVQRSaAzjgRQJCgqA2XnZmcgKjVnwWIkCWKC+cwRxJk6eypCfm80AYyOBMyCF/TCFx0+eAmMsoJ8F6PXNoCBgwO1zUPBsBrsRFE5AxSCXFzKgBng/LMABrBM9cyiwScIAAAAASUVORK5CYII= data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAZCAYAAABtnU33AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAETSURBVHic7ZgxCsJAFAUXSaeIpScQDyCCguA5rEUQEbWzsvACKhICaquHUQu18hxi6vgebCSgwSb5C2sGhpBkIX+aZIkTBIHS1OAI1mFR2cEDHuEKnnnB0TeGcAlzZuZKjTKswA4cwzWDW8rO2ChsY+OFwVNld2wIG6cMbpqeRJAmg0umpxCk5PxeYxdZsO1kwbaTBdvOXwb7MG96ECF8Bt9gw/QkQlwZ7Kr/CXYZvIdt2DU7S+rs4CF8afXgCU5g1dhI6XCHC7jlSRjM/zwbbUGbJDPY/7HGg/OEn/vUvvn2WfpYlAADfYyL9vSaIOZ+Ykh9hxkSFy0WSyQ3Ht+iRWOJ9E4rGq2UcCwxsbWMRovGkhc6FTEV3QXLmAAAAABJRU5ErkJggg== data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAElJREFUSEvt0qERAEAIA0H6b5rXL1ecI5qQOcIsanB+3TC5egZOyJm9B2Zgw0EnF+AeekPC+S3tGTjhoJMLcA+9IeG89+6L04QHtFKarLFAHLUAAAAASUVORK5CYII= data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAFBJREFUSEvtkjEKADAIA/PpQunnWzo63nBbBDdjOGPWPpd0yPCf5YLo5TNgB52Z54AZsKDQygVwDr5A4RxLfQbsUGjlAjgHX6Bw9r394KjDAzeSX574b7LUAAAAAElFTkSuQmCC data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAyMCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik03LjE3MDI1IDMuMDkxODJDOC4wNzEzMiAyLjY5OTkyIDkuMDMyNDkgMi41IDEwIDIuNUMxMC45Njc1IDIuNSAxMS45Mjg3IDIuNjk5OTIgMTIuODI5NyAzLjA5MTgyQzEzLjczMTIgMy40ODM4NyAxNC41NTgzIDQuMDYyMDIgMTUuMjYwNyA0Ljc5OTUyQzE1Ljk2MzQgNS41MzcyOCAxNi41MjY4IDYuNDE5NjcgMTYuOTEzMiA3LjM5OTI0QzE3LjI5OTcgOC4zNzg5NyAxNy41IDkuNDMyOTUgMTcuNSAxMC41SDIwQzIwIDkuMTIxMTIgMTkuNzQxMyA3Ljc1NTc0IDE5LjIzODggNi40ODE4MkMxOC43MzYyIDUuMjA3OSAxNy45OTk2IDQuMDUwMzkgMTcuMDcxMSAzLjA3NTM4QzE2LjE0MjUgMi4xMDAzNiAxNS4wNDAxIDEuMzI2OTQgMTMuODI2OCAwLjc5OTI2NUMxMi42MTM2IDAuMjcxNTg5IDExLjMxMzIgMCAxMCAwQzguNjg2NzggMCA3LjM4NjQyIDAuMjcxNTg5IDYuMTczMTcgMC43OTkyNjVDNC45NTk5MiAxLjMyNjk0IDMuODU3NTIgMi4xMDAzNiAyLjkyODkzIDMuMDc1MzhDMi4wMDAzNSA0LjA1MDM5IDEuMjYzNzUgNS4yMDc5IDAuNzYxMjA0IDYuNDgxODJDMC4yNTg2NTggNy43NTU3NCAwIDkuMTIxMTIgMCAxMC41SDIuNUMyLjUgOS40MzI5NSAyLjcwMDMgOC4zNzg5NyAzLjA4Njc5IDcuMzk5MjRDMy40NzMyMiA2LjQxOTY3IDQuMDM2NjUgNS41MzcyOCA0LjczOTI4IDQuNzk5NTJDNS40NDE2NiA0LjA2MjAyIDYuMjY4ODUgMy40ODM4NyA3LjE3MDI1IDMuMDkxODJaTTEwLjU3MSA3LjU4MzM1QzEwLjY4NDMgNy40OTI4MyAxMC43OTY2IDcuNDA0NSAxMC45MDcxIDcuMzE4ODNDMTEuMzUxNyA2Ljk3NDAzIDExLjc2NTggNi42NzI0MyAxMi4wODY4IDYuNDQ0OTlDMTIuMTcxNyA2LjM4NDgxIDEyLjI1MDEgNi4zMjk4MSAxMi4zMjA5IDYuMjgwNThDMTIuNDkgNi4xNjI5MiAxMi43MTIgNi4yOTExIDEyLjY5NDYgNi40OTYzOEMxMi42ODc0IDYuNTgyMjYgMTIuNjc5IDYuNjc3NjggMTIuNjY5MyA2Ljc4MTM0QzEyLjYzMjkgNy4xNzMwNCAxMi41Nzg3IDcuNjgyNDcgMTIuNTAyNCA4LjIzOTg4QzEyLjQ4MzQgOC4zNzgzNyAxMi40NjMxIDguNTE5ODIgMTIuNDQxMyA4LjY2MzE2QzEyLjI0NjggOS45NDQxNSAxMS45Mzc1IDExLjM3NjIgMTEuNDY0MSAxMi4xOTYyQzExLjA3MzYgMTIuODcyNiAxMC4wMzExIDEzLjY3ODIgOC43MzIwNSAxMi45MjgyQzcuNDMzMDEgMTIuMTc4MiA3LjYwOTQ4IDEwLjg3MjYgOCAxMC4xOTYyQzguNDczMzcgOS4zNzYyNSA5LjU1ODk0IDguMzkyMzEgMTAuNTcxIDcuNTgzMzVaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NzA3MjgiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjMzNjc2NjQiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjkxNDI4IDAuNjkxNDI4LDAuNjkxNDI4IDAuNjkxNDI4LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTcwNzA0IiBjbGFzcz0iZmlsMSIgZD0iTTAuMzQ1NzM2IDAuMTU3MTg4bC0wLjEyNTcyMiAwLjA5NDI2NDkgLTAuMDk0MzAwNiAwIDAgMC4xODg1ODMgMC4wOTQzMDA2IDAgMC4xMjU3MjIgMC4wOTQyNjQ5IDAgLTAuMzc3MTEzem0wLjE1NzExNyAtMi42NzI2N2UtMDA1bDAuMDMxNDMwNiAwIDAgMC4zNzcxNCAtMC4wMzE0MzA2IDAgMCAtMC4zNzcxNHptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjI1MTQwOSAtMC4wMzE0MzA2IDAgMCAtMC4yNTE0MDl6bS0wLjA2Mjg0MzMgMC4wNjI4NjExbDAuMDMxNDMwNiAwIDAgMC4xMjU2ODcgLTAuMDMxNDMwNiAwIDAgLTAuMTI1Njg3eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NjkwMjQiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjE5NjkyNDAiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjQzNjE2IDAuNjQzNjE2LDAuNjQzNjE2IDAuNjQzNjE2LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY5MDAwIiBjbGFzcz0iZmlsMSIgZD0iTTAuMzIxODM3IDAuMTQ2MzAybC0wLjExNzAyOSAwLjA4Nzc0NjYgLTAuMDg3Nzc5NyAwIDAgMC4xNzU1NDMgMC4wODc3Nzk3IDAgMC4xMTcwMjkgMC4wODc3NDY2IDAgLTAuMzUxMDM2em0wLjI3NzkwMSAwLjI1MDcyNmwtMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjA5MzA4NzIgLTAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjAyMDY5MDYgLTAuMDIwNjkwNiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAwLjAyMDY5MDYgLTAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MnoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTggM0MxOS4xMDQ2IDMgMjAgMy44OTU0MyAyMCA1VjE1QzIwIDE2LjEwNDYgMTkuMTA0NiAxNyAxOCAxN0gyQzAuODk1NDMxIDE3IDAgMTYuMTA0NiAwIDE1VjVDMCAzLjg5NTQzIDAuODk1NDMxIDMgMiAzSDE4Wk02LjU4MDA4IDcuMDA0ODhDNS41OTgzIDcuMDA0ODggNC44MjYwMSA3LjMyMDE1IDQuMjYzMTggNy45NTA2OEMzLjcwMDM1IDguNTgxMjIgMy40MTg5NSA5LjQyNTQ1IDMuNDE4OTUgMTAuNDgzNFYxMC42MDRDMy40MTg5NSAxMS43MDQzIDMuNzAyNDcgMTIuNTY2NSA0LjI2OTUzIDEzLjE5MDdDNC44MzY1OSAxMy44MTQ5IDUuNjExIDE0LjEyNyA2LjU5Mjc3IDE0LjEyN0M3LjExNzUyIDE0LjEyNyA3LjU5Njc2IDE0LjAyMDEgOC4wMzA1MiAxMy44MDY0QzguNDY0MjggMTMuNTkyNyA4LjgwNTk5IDEzLjI5MjIgOS4wNTU2NiAxMi45MDVDOS4zMDUzNCAxMi41MTc4IDkuNDMyMjkgMTIuMDkxNSA5LjQzNjUyIDExLjYyNkg3LjcxNjMxQzcuNzA3ODQgMTEuOTM0OSA3LjU5NzgyIDEyLjE4MjUgNy4zODYyMyAxMi4zNjg3QzcuMTc0NjQgMTIuNTU0OSA2Ljg5OTU4IDEyLjY0NzkgNi41NjEwNCAxMi42NDc5QzYuMTIwOTMgMTIuNjQ3OSA1Ljc5Mjk3IDEyLjQ5MzUgNS41NzcxNSAxMi4xODQ2QzUuMzYxMzMgMTEuODc1NiA1LjI1MzQyIDExLjM2NzggNS4yNTM0MiAxMC42NjExVjEwLjQ3MDdDNS4yNTM0MiA5Ljc3MjQ2IDUuMzYyMzkgOS4yNjc4MiA1LjU4MDMyIDguOTU2NzlDNS43OTgyNiA4LjY0NTc1IDYuMTIwOTMgOC40OTAyMyA2LjU0ODM0IDguNDkwMjNDNi44OTUzNSA4LjQ5MDIzIDcuMTc0NjQgOC42MDEzMiA3LjM4NjIzIDguODIzNDlDNy41OTc4MiA5LjA0NTY2IDcuNzA3ODQgOS4zMzQ0NyA3LjcxNjMxIDkuNjg5OTRIOS40MzY1MkM5LjQyODA2IDguODc3NDQgOS4xNjQ2NCA4LjIyNjgxIDguNjQ2MjQgNy43MzgwNEM4LjEyNzg1IDcuMjQ5MjcgNy40MzkxMyA3LjAwNDg4IDYuNTgwMDggNy4wMDQ4OFpNMTMuMzU5NCA3LjAwNDg4QzEyLjM3NzYgNy4wMDQ4OCAxMS42MDUzIDcuMzIwMTUgMTEuMDQyNSA3Ljk1MDY4QzEwLjQ3OTcgOC41ODEyMiAxMC4xOTgyIDkuNDI1NDUgMTAuMTk4MiAxMC40ODM0VjEwLjYwNEMxMC4xOTgyIDExLjcwNDMgMTAuNDgxOCAxMi41NjY1IDExLjA0ODggMTMuMTkwN0MxMS42MTU5IDEzLjgxNDkgMTIuMzkwMyAxNC4xMjcgMTMuMzcyMSAxNC4xMjdDMTMuODk2OCAxNC4xMjcgMTQuMzc2MSAxNC4wMjAxIDE0LjgwOTggMTMuODA2NEMxNS4yNDM2IDEzLjU5MjcgMTUuNTg1MyAxMy4yOTIyIDE1LjgzNSAxMi45MDVDMTYuMDg0NiAxMi41MTc4IDE2LjIxMTYgMTIuMDkxNSAxNi4yMTU4IDExLjYyNkgxNC40OTU2QzE0LjQ4NzEgMTEuOTM0OSAxNC4zNzcxIDEyLjE4MjUgMTQuMTY1NSAxMi4zNjg3QzEzLjk1MzkgMTIuNTU0OSAxMy42Nzg5IDEyLjY0NzkgMTMuMzQwMyAxMi42NDc5QzEyLjkwMDIgMTIuNjQ3OSAxMi41NzIzIDEyLjQ5MzUgMTIuMzU2NCAxMi4xODQ2QzEyLjE0MDYgMTEuODc1NiAxMi4wMzI3IDExLjM2NzggMTIuMDMyNyAxMC42NjExVjEwLjQ3MDdDMTIuMDMyNyA5Ljc3MjQ2IDEyLjE0MTcgOS4yNjc4MiAxMi4zNTk2IDguOTU2NzlDMTIuNTc3NiA4LjY0NTc1IDEyLjkwMDIgOC40OTAyMyAxMy4zMjc2IDguNDkwMjNDMTMuNjc0NiA4LjQ5MDIzIDEzLjk1MzkgOC42MDEzMiAxNC4xNjU1IDguODIzNDlDMTQuMzc3MSA5LjA0NTY2IDE0LjQ4NzEgOS4zMzQ0NyAxNC40OTU2IDkuNjg5OTRIMTYuMjE1OEMxNi4yMDc0IDguODc3NDQgMTUuOTQzOSA4LjIyNjgxIDE1LjQyNTUgNy43MzgwNEMxNC45MDcxIDcuMjQ5MjcgMTQuMjE4NCA3LjAwNDg4IDEzLjM1OTQgNy4wMDQ4OFoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxwYXRoIGNsYXNzPSJmaWwwIiBkPSJNLTAgMC4yNzExMDFsMCAxLjczOTM1YzAsMC4xNDkxMTMgMC4xMjE5ODgsMC4yNzExMDEgMC4yNzExMDEsMC4yNzExMDFsMy4xNTEzMSAwIDAgLTIuMjgxNTUgLTMuMTUxMzEgMGMtMC4xNDkxMTMsMCAtMC4yNzExMDEsMC4xMjE5ODggLTAuMjcxMTAxLDAuMjcxMTAxeiIvPg0KICA8cG9seWdvbiBjbGFzcz0iZmlsMSIgcG9pbnRzPSIxLjQwOTIsMC42NzEwMzggMi4wODAyOCwxLjE0MDc3IDEuNDA5MiwxLjYxMDUxICIvPg0KIDwvZz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIxOTY2NTUyIj4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NzY4IiBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMzIzOTU2bDAgMi4wNzg0NmMwLDAuMTc4MTg1IDAuMTQ1NzcxLDAuMzIzOTU2IDAuMzIzOTU2LDAuMzIzOTU2bDMuNzY1NzEgMCAwIC0yLjcyNjM4IC0zLjc2NTcxIDBjLTAuMTc4MTg1LDAgLTAuMzIzOTU2LDAuMTQ1NzcxIC0wLjMyMzk1NiwwLjMyMzk1NnoiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NTI4IiBjbGFzcz0iZmlsMSIgZD0iTTEuNjAzOCAwLjg4MjAzOGwwLjMyMDc1MSAwIDAgMC45NjIyNTQgLTAuMzIwNzUxIDAgMCAtMC45NjIyNTR6bTAuNTYxMzMyIDBsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAhCAYAAAAYucG/AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAA+SURBVHicY/H09pViYQACFi4uLgYWbm5uOAHncsG4/Pz8xKv79u0bA8vXr1/hBJz7Dcb9+PEjIXVzZs18BgAgpy6CcHz1VgAAAABJRU5ErkJggg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsLW9wYWNpdHk9IjAiIGQ9Ik01MSw0LjA0MXYyNS45MThDNTEsMzIuMTgyLDQ5LjE4MiwzNCw0Ni45NiwzNEgwVjBoNDYuOTZDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDENCgkJCUw1MSw0LjA0MXoiLz4NCgkJPHBhdGggaWQ9Il8xMjMzNzQxNDQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xOCwxNS43MzdsMi41MjYtMi41MjZsMy4zNjksMy4zNjlsMS42ODQtMS42ODVsLTMuMzY4LTMuMzY4TDI0LjczNiw5aC01LjA1M0gxOHYxLjY4NA0KCQkJVjE1LjczN3ogTTM0LDE4LjI2NGwtMi41MjcsMi41MjVsLTMuMzY4LTMuMzY4bC0xLjY4NSwxLjY4NWwzLjM2OSwzLjM2N0wyNy4yNjMsMjVoNS4wNTNIMzR2LTEuNjg1VjE4LjI2NHoiLz4NCgk8L2c+DQo8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMTAyIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjRkVGRUZFIiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMDUxIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjOTY5Njk2IiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTRweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgMTQgMTUiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDU4ICg4NDY2MykgLSBodHRwczovL3NrZXRjaC5jb20gLS0+CiAgICA8dGl0bGU+dGljay1jb21ib2JveDwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJQRC0zNzQ0LeKAlC0yIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNzkwLjAwMDAwMCwgLTQzMS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgaWQ9InRpY2stY29tYm9ib3giIHRyYW5zZm9ybT0idHJhbnNsYXRlKDc4OS4wMDAwMDAsIDQzMC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMy4zNDQ3NjY4LDEuNjU5MzMyNTIgTDUuOCwxMi41ODY3MjE4IEw1LjgsMTIuNTg2NzIxOCBMMi42MDU2MzE3Nyw4LjkzNDE5NjUyIEMyLjM1MzE1MjQxLDguNjQ1NTA0OTMgMS45MTQ0NDY2Nyw4LjYxNjE0OTExIDEuNjI1NzU1MDcsOC44Njg2Mjg0OCBDMS41NzczMDU0Miw4LjkxMTAwMDgyIDEuNTM0OTgxOTMsOC45NTk5MDMyNiAxLjUsOS4wMTM5MzE0OCBDMS4yMDYzNDk0OSw5LjQ2NzQ2MzE2IDEuMjYwMDExMDgsMTAuMDYyODI2MyAxLjYzMDAyNTk4LDEwLjQ1NjU0MDEgTDUuNDc5NzMxMTgsMTQuNTUyODEzNSBDNS42Njg4NDMyLDE0Ljc1NDAzNzkgNS45ODUyNzMzOSwxNC43NjM4NTY5IDYuMTg2NDk3NzcsMTQuNTc0NzQ0OSBDNi4yMTEyMjc0NywxNC41NTE1MDM4IDYuMjMzNTI2NzQsMTQuNTI1ODA1MyA2LjI1MzA1MDY3LDE0LjQ5ODA0NyBMMTQuNTM5MDU1MywyLjcxNzM0NDAzIEMxNC44MDE1Mjc3LDIuMzQ0MTcxNDggMTQuNzQxNjUzNywxLjgzMzM1NzAzIDE0LjQsMS41MzA5OTU4NyBDMTQuMTA2MjM3OCwxLjI3MTAxODMyIDEzLjY1NzM0MywxLjI5ODQwNjIyIDEzLjM5NzM2NTUsMS41OTIxNjg0NCBDMTMuMzc4NTAyNywxLjYxMzQ4MjQgMTMuMzYwOTM4MiwxLjYzNTkxMDg3IDEzLjM0NDc2NjgsMS42NTkzMzI1MiBaIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cG9seWxpbmUgaWQ9IlBhdGgtMiIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjIiIHBvaW50cz0iMiA5LjY1NjUyODE3IDUuODYxNjc5NzcgMTQgMTQgMiI+PC9wb2x5bGluZT4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+ data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjIsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9ItCh0LvQvtC5XzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMzVweCIgaGVpZ2h0PSIzNXB4IiB2aWV3Qm94PSIwIDAgMzUgMzUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDM1IDM1IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMTcuNSwzNUMyNy4xMzksMzUsMzUsMjcuMTM4LDM1LDE3LjVDMzUsNy44NjEsMjcuMTM5LDAsMTcuNSwwDQoJQzcuODYxLDAsMCw3Ljg2MSwwLDE3LjVDMCwyNy4xMzgsNy44NjEsMzUsMTcuNSwzNXoiLz4NCjxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTcuNTAwNSIgeTE9IjIuNjQ5OSIgeDI9IjE3LjUwMDUiIHkyPSIzMi4zNDkiPg0KCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiM1Q0IwRkYiLz4NCgk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMTI5MEZGIi8+DQo8L2xpbmVhckdyYWRpZW50Pg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9InVybCgjU1ZHSURfMV8pIiBkPSJNMTcuNSwzMy45OTljOS4wODgsMCwxNi41LTcuNDEyLDE2LjUtMTYuNDk5DQoJUzI2LjU4NywxLDE3LjUsMUM4LjQxMywxLDEuMDAxLDguNDEzLDEuMDAxLDE3LjVTOC40MTMsMzMuOTk5LDE3LjUsMzMuOTk5eiIvPg0KPHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTE4LjM2OCwyMi41aC0zYy0wLjAwOC0wLjQ2MywwLTAuODk3LDAtMWMwLTEuMDM3LDAuMDU1LTEuODgxLDAuMzk2LTIuNTUNCgljMC4zNDQtMC42NzMsMS4wMzMtMS40MjMsMi4wNjMtMi4yNjRjMS4wMjgtMC44MzUsMS42NDYtMS4zODQsMS44NDMtMS42NDZjMC4zMTMtMC40MDcsMC40NjgtMC44NjIsMC40NjgtMS4zNTQNCgljMC0wLjY4Ni0wLjI3NS0xLjI3My0wLjgyNC0xLjc2NmMtMC41NDktMC40ODktMS4yODUtMC43MzMtMi4yMTUtMC43MzNjLTAuODk2LDAtMS42NDYsMC4yNTctMi4yNTEsMC43NjcNCgljLTAuNjAxLDAuNTEtMS4wMTYsMS4yOTEtMS4yNDMsMi4zMzZsLTMuMjM2LTAuNDAzYzAuMDktMS41LDAuNzI5LTIuNzczLDEuOTEyLTMuODE5QzEzLjQ2Nyw5LjAyMiwxNS4wMTgsOC41LDE2Ljk0OCw4LjUNCgljMi4wMjMsMCwzLjYzNSwwLjUzMSw0LjgzNSwxLjU5YzEuMTk2LDEuMDU5LDEuNzk2LDIuMjg5LDEuNzk2LDMuNjk5YzAsMC43NzYtMC4yMjMsMS41MTQtMC42NiwyLjIwOA0KCWMtMC40NDEsMC42OTQtMS40NjEsMS41NS0yLjgyLDIuODM3QzE4Ljg2OCwyMCwxOC4zNjgsMjAuNSwxOC4zNjgsMjIuNUwxOC4zNjgsMjIuNXogTTE1LjM2OCwyNy40OTl2LTNoM3YzSDE1LjM2OHoiLz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjIsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9ItCh0LvQvtC5XzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMzVweCIgaGVpZ2h0PSIzNXB4IiB2aWV3Qm94PSIwIDAgMzUgMzUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDM1IDM1IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMTcuNSwzNUMyNy4xMzgsMzUsMzUsMjcuMTQsMzUsMTcuNUMzNSw3Ljg2MiwyNy4xMzgsMCwxNy41LDANCglDNy44NjEsMCwwLDcuODYyLDAsMTcuNUMwLDI3LjE0LDcuODYxLDM1LDE3LjUsMzV6Ii8+DQo8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE3LjQ5OTUiIHkxPSIyLjY1MDQiIHgyPSIxNy40OTk1IiB5Mj0iMzIuMzUwNCI+DQoJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGODI1QyIvPg0KCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRjREMTIiLz4NCjwvbGluZWFyR3JhZGllbnQ+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0idXJsKCNTVkdJRF8xXykiIGQ9Ik0xNy41LDM0YzkuMDg3LDAsMTYuNS03LjQxMiwxNi41LTE2LjUNCgljMC05LjA4OC03LjQxMi0xNi41LTE2LjUtMTYuNVMxLDguNDEzLDEsMTcuNUMxLDI2LjU4OCw4LjQxMiwzNCwxNy41LDM0eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xNS41LDkuMDAxYzAtMiwzLjk5OS0yLDMuOTk5LDBMMTguOTk5LDIxDQoJYy0wLjA2MSwxLjQ5OC0yLjkzNywxLjUtMywwTDE1LjUsOS4wMDF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTE3LjUsMjhjMS4xMDIsMCwyLTAuODk3LDItMmMwLTEuMTAyLTAuODk3LTItMi0yDQoJYy0xLjEwMiwwLTEuOTk5LDAuODk4LTEuOTk5LDJDMTUuNSwyNy4xMDMsMTYuMzk4LDI4LDE3LjUsMjh6Ii8+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTNweCIgaGVpZ2h0PSIyMXB4IiB2aWV3Qm94PSIwIDAgMTMgMjEiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5CYWNrLUFycm93PC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9ImlQaG9uZS1YLUNvdXJzZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyLjAwMDAwMCwgLTU2LjAwMDAwMCkiIGZpbGw9IiMzREEwRTEiPgogICAgICAgICAgICA8cGF0aCBkPSJNMjEuOTA2MzgyOCw1Ni45ODk5NDk1IEwxMiw2Ni41IEwyMS45MDYzODI4LDc2LjAxMDA1MDUgQzIyLjQ4MjU4NSw3Ni41NjMyMDAyIDIzLjM5MjU5Miw3Ni41NjMyMDAyIDIzLjk2ODc5NDMsNzYuMDEwMDUwNSBMMjMuOTY4Nzk0Myw3Ni4wMTAwNTA1IEMyNC41MTU1MjgzLDc1LjQ4NTE5MDEgMjQuNTMzMjYwMyw3NC42MTY0OTEyIDI0LjAwODM5OTksNzQuMDY5NzU3MiBDMjMuOTk1NDY4OSw3NC4wNTYyODcyIDIzLjk4MjI2NDIsNzQuMDQzMDgyNiAyMy45Njg3OTQzLDc0LjAzMDE1MTUgTDE2LjEyNDgyMjksNjYuNSBMMjMuOTY4Nzk0Myw1OC45Njk4NDg1IEMyNC41MTU1MjgzLDU4LjQ0NDk4ODEgMjQuNTMzMjYwMyw1Ny41NzYyODkyIDI0LjAwODM5OTksNTcuMDI5NTU1MiBDMjMuOTk1NDY4OSw1Ny4wMTYwODUyIDIzLjk4MjI2NDIsNTcuMDAyODgwNiAyMy45Njg3OTQzLDU2Ljk4OTk0OTUgTDIzLjk2ODc5NDMsNTYuOTg5OTQ5NSBDMjMuMzkyNTkyLDU2LjQzNjc5OTggMjIuNDgyNTg1LDU2LjQzNjc5OTggMjEuOTA2MzgyOCw1Ni45ODk5NDk1IFoiIGlkPSJCYWNrLUFycm93Ij48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4= data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPgo8cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHJ4PSI2IiBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIwLjciLz4KPGcgb3BhY2l0eT0iMC44Ij4KPHBhdGggZD0iTTUzLjUgMjVINTJDNTEuNjAyMiAyNSA1MS4yMjA2IDI1LjE1OCA1MC45MzkzIDI1LjQzOTNDNTAuNjU4IDI1LjcyMDYgNTAuNSAyNi4xMDIyIDUwLjUgMjYuNUM1MC41IDI2Ljg5NzggNTAuNjU4IDI3LjI3OTQgNTAuOTM5MyAyNy41NjA3QzUxLjIyMDYgMjcuODQyIDUxLjYwMjIgMjggNTIgMjhINTMuNUM1My44OTc4IDI4IDU0LjI3OTQgMjguMTU4IDU0LjU2MDcgMjguNDM5M0M1NC44NDIgMjguNzIwNiA1NSAyOS4xMDIyIDU1IDI5LjVWNDEuNTM3NUM1My43MDkzIDQwLjU0NTMgNTIuMTI4IDQwLjAwNSA1MC41IDQwQzQ5LjI3MTcgNDAuMDAwNiA0OC4wNjI0IDQwLjMwMjkgNDYuOTc4MyA0MC44ODAzQzQ1Ljg5NDIgNDEuNDU3NiA0NC45Njg1IDQyLjI5MjQgNDQuMjgyNSA0My4zMTEzQzQzLjcyNjEgNDIuNzM4NCA0My4wNjAzIDQyLjI4MjkgNDIuMzI0OCA0MS45NzE5QzQxLjU4OTIgNDEuNjYwOSA0MC43OTg2IDQxLjUwMDcgNDAgNDEuNTAwN0MzOS4yMDE0IDQxLjUwMDcgMzguNDEwOCA0MS42NjA5IDM3LjY3NTIgNDEuOTcxOUMzNi45Mzk3IDQyLjI4MjkgMzYuMjczOSA0Mi43Mzg0IDM1LjcxNzUgNDMuMzExM0MzNS4wMzE1IDQyLjI5MjQgMzQuMTA1OCA0MS40NTc2IDMzLjAyMTcgNDAuODgwM0MzMS45Mzc2IDQwLjMwMjkgMzAuNzI4MyA0MC4wMDA2IDI5LjUgNDBDMjcuODcyIDQwLjAwNSAyNi4yOTA3IDQwLjU0NTMgMjUgNDEuNTM3NVYyOS41QzI1IDI5LjEwMjIgMjUuMTU4IDI4LjcyMDYgMjUuNDM5MyAyOC40MzkzQzI1LjcyMDYgMjguMTU4IDI2LjEwMjIgMjggMjYuNSAyOEgyOEMyOC4zOTc4IDI4IDI4Ljc3OTQgMjcuODQyIDI5LjA2MDcgMjcuNTYwN0MyOS4zNDIgMjcuMjc5NCAyOS41IDI2Ljg5NzggMjkuNSAyNi41QzI5LjUgMjYuMTAyMiAyOS4zNDIgMjUuNzIwNiAyOS4wNjA3IDI1LjQzOTNDMjguNzc5NCAyNS4xNTggMjguMzk3OCAyNSAyOCAyNUgyNi41QzI1LjMwNjUgMjUgMjQuMTYxOSAyNS40NzQxIDIzLjMxOCAyNi4zMThDMjIuNDc0MSAyNy4xNjE5IDIyIDI4LjMwNjUgMjIgMjkuNVY0Ny41QzIyIDQ5LjQ4OTEgMjIuNzkwMiA1MS4zOTY4IDI0LjE5NjcgNTIuODAzM0MyNS42MDMyIDU0LjIwOTggMjcuNTEwOSA1NSAyOS41IDU1QzMxLjQ4OTEgNTUgMzMuMzk2OCA1NC4yMDk4IDM0LjgwMzMgNTIuODAzM0MzNi4yMDk4IDUxLjM5NjggMzcgNDkuNDg5MSAzNyA0Ny41QzM3IDQ2LjcwNDQgMzcuMzE2MSA0NS45NDEzIDM3Ljg3ODcgNDUuMzc4N0MzOC40NDEzIDQ0LjgxNjEgMzkuMjA0NCA0NC41IDQwIDQ0LjVDNDAuNzk1NiA0NC41IDQxLjU1ODcgNDQuODE2MSA0Mi4xMjEzIDQ1LjM3ODdDNDIuNjgzOSA0NS45NDEzIDQzIDQ2LjcwNDQgNDMgNDcuNUM0MyA0OS40ODkxIDQzLjc5MDIgNTEuMzk2OCA0NS4xOTY3IDUyLjgwMzNDNDYuNjAzMiA1NC4yMDk4IDQ4LjUxMDkgNTUgNTAuNSA1NUM1Mi40ODkxIDU1IDU0LjM5NjggNTQuMjA5OCA1NS44MDMzIDUyLjgwMzNDNTcuMjA5OCA1MS4zOTY4IDU4IDQ5LjQ4OTEgNTggNDcuNVYyOS41QzU4IDI4LjMwNjUgNTcuNTI1OSAyNy4xNjE5IDU2LjY4MiAyNi4zMThDNTUuODM4MSAyNS40NzQxIDU0LjY5MzUgMjUgNTMuNSAyNVpNMjkuNSA1MkMyOC42MSA1MiAyNy43NCA1MS43MzYxIDI2Ljk5OTkgNTEuMjQxNkMyNi4yNTk5IDUwLjc0NzEgMjUuNjgzMSA1MC4wNDQzIDI1LjM0MjUgNDkuMjIyMUMyNS4wMDE5IDQ4LjM5OTggMjQuOTEyOCA0Ny40OTUgMjUuMDg2NSA0Ni42MjIxQzI1LjI2MDEgNDUuNzQ5MiAyNS42ODg3IDQ0Ljk0NzQgMjYuMzE4IDQ0LjMxOEMyNi45NDc0IDQzLjY4ODcgMjcuNzQ5MiA0My4yNjAxIDI4LjYyMjEgNDMuMDg2NUMyOS40OTUgNDIuOTEyOCAzMC4zOTk4IDQzLjAwMTkgMzEuMjIyMSA0My4zNDI1QzMyLjA0NDMgNDMuNjgzMSAzMi43NDcxIDQ0LjI1OTkgMzMuMjQxNiA0NC45OTk5QzMzLjczNjEgNDUuNzQgMzQgNDYuNjEgMzQgNDcuNUMzNCA0OC42OTM1IDMzLjUyNTkgNDkuODM4MSAzMi42ODIgNTAuNjgyQzMxLjgzODEgNTEuNTI1OSAzMC42OTM1IDUyIDI5LjUgNTJaTTUwLjUgNTJDNDkuNjEgNTIgNDguNzQgNTEuNzM2MSA0Ny45OTk5IDUxLjI0MTZDNDcuMjU5OSA1MC43NDcxIDQ2LjY4MzEgNTAuMDQ0MyA0Ni4zNDI1IDQ5LjIyMjFDNDYuMDAxOSA0OC4zOTk4IDQ1LjkxMjggNDcuNDk1IDQ2LjA4NjUgNDYuNjIyMUM0Ni4yNjAxIDQ1Ljc0OTIgNDYuNjg4NyA0NC45NDc0IDQ3LjMxOCA0NC4zMThDNDcuOTQ3NCA0My42ODg3IDQ4Ljc0OTIgNDMuMjYwMSA0OS42MjIxIDQzLjA4NjVDNTAuNDk1IDQyLjkxMjggNTEuMzk5OCA0My4wMDE5IDUyLjIyMjEgNDMuMzQyNUM1My4wNDQzIDQzLjY4MzEgNTMuNzQ3MSA0NC4yNTk5IDU0LjI0MTYgNDQuOTk5OUM1NC43MzYxIDQ1Ljc0IDU1IDQ2LjYxIDU1IDQ3LjVDNTUgNDguNjkzNSA1NC41MjU5IDQ5LjgzODEgNTMuNjgyIDUwLjY4MkM1Mi44MzgxIDUxLjUyNTkgNTEuNjkzNSA1MiA1MC41IDUyWiIgZmlsbD0id2hpdGUiLz4KPC9nPgo8L2c+CjxkZWZzPgo8ZmlsdGVyIGlkPSJmaWx0ZXIwX2QiIHg9IjAiIHk9IjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSI4MCIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgo8ZmVDb2xvck1hdHJpeCBpbj0iU291cmNlQWxwaGEiIHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMCIvPgo8ZmVPZmZzZXQvPgo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0Ii8+CjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwLjI1IDAiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3ciLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3ciIHJlc3VsdD0ic2hhcGUiLz4KPC9maWx0ZXI+CjwvZGVmcz4KPC9zdmc+Cg== data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPgo8cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHJ4PSI2IiBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIwLjgiLz4KPHBhdGggZD0iTTUzLjUgMjVINTJDNTEuNjAyMiAyNSA1MS4yMjA2IDI1LjE1OCA1MC45MzkzIDI1LjQzOTNDNTAuNjU4IDI1LjcyMDYgNTAuNSAyNi4xMDIyIDUwLjUgMjYuNUM1MC41IDI2Ljg5NzggNTAuNjU4IDI3LjI3OTQgNTAuOTM5MyAyNy41NjA3QzUxLjIyMDYgMjcuODQyIDUxLjYwMjIgMjggNTIgMjhINTMuNUM1My44OTc4IDI4IDU0LjI3OTQgMjguMTU4IDU0LjU2MDcgMjguNDM5M0M1NC44NDIgMjguNzIwNiA1NSAyOS4xMDIyIDU1IDI5LjVWNDEuNTM3NUM1My43MDkzIDQwLjU0NTMgNTIuMTI4IDQwLjAwNSA1MC41IDQwQzQ5LjI3MTcgNDAuMDAwNiA0OC4wNjI0IDQwLjMwMjkgNDYuOTc4MyA0MC44ODAzQzQ1Ljg5NDIgNDEuNDU3NiA0NC45Njg1IDQyLjI5MjQgNDQuMjgyNSA0My4zMTEzQzQzLjcyNjEgNDIuNzM4NCA0My4wNjAzIDQyLjI4MjkgNDIuMzI0OCA0MS45NzE5QzQxLjU4OTIgNDEuNjYwOSA0MC43OTg2IDQxLjUwMDcgNDAgNDEuNTAwN0MzOS4yMDE0IDQxLjUwMDcgMzguNDEwOCA0MS42NjA5IDM3LjY3NTIgNDEuOTcxOUMzNi45Mzk3IDQyLjI4MjkgMzYuMjczOSA0Mi43Mzg0IDM1LjcxNzUgNDMuMzExM0MzNS4wMzE1IDQyLjI5MjQgMzQuMTA1OCA0MS40NTc2IDMzLjAyMTcgNDAuODgwM0MzMS45Mzc2IDQwLjMwMjkgMzAuNzI4MyA0MC4wMDA2IDI5LjUgNDBDMjcuODcyIDQwLjAwNSAyNi4yOTA3IDQwLjU0NTMgMjUgNDEuNTM3NVYyOS41QzI1IDI5LjEwMjIgMjUuMTU4IDI4LjcyMDYgMjUuNDM5MyAyOC40MzkzQzI1LjcyMDYgMjguMTU4IDI2LjEwMjIgMjggMjYuNSAyOEgyOEMyOC4zOTc4IDI4IDI4Ljc3OTQgMjcuODQyIDI5LjA2MDcgMjcuNTYwN0MyOS4zNDIgMjcuMjc5NCAyOS41IDI2Ljg5NzggMjkuNSAyNi41QzI5LjUgMjYuMTAyMiAyOS4zNDIgMjUuNzIwNiAyOS4wNjA3IDI1LjQzOTNDMjguNzc5NCAyNS4xNTggMjguMzk3OCAyNSAyOCAyNUgyNi41QzI1LjMwNjUgMjUgMjQuMTYxOSAyNS40NzQxIDIzLjMxOCAyNi4zMThDMjIuNDc0MSAyNy4xNjE5IDIyIDI4LjMwNjUgMjIgMjkuNVY0Ny41QzIyIDQ5LjQ4OTEgMjIuNzkwMiA1MS4zOTY4IDI0LjE5NjcgNTIuODAzM0MyNS42MDMyIDU0LjIwOTggMjcuNTEwOSA1NSAyOS41IDU1QzMxLjQ4OTEgNTUgMzMuMzk2OCA1NC4yMDk4IDM0LjgwMzMgNTIuODAzM0MzNi4yMDk4IDUxLjM5NjggMzcgNDkuNDg5MSAzNyA0Ny41QzM3IDQ2LjcwNDQgMzcuMzE2MSA0NS45NDEzIDM3Ljg3ODcgNDUuMzc4N0MzOC40NDEzIDQ0LjgxNjEgMzkuMjA0NCA0NC41IDQwIDQ0LjVDNDAuNzk1NiA0NC41IDQxLjU1ODcgNDQuODE2MSA0Mi4xMjEzIDQ1LjM3ODdDNDIuNjgzOSA0NS45NDEzIDQzIDQ2LjcwNDQgNDMgNDcuNUM0MyA0OS40ODkxIDQzLjc5MDIgNTEuMzk2OCA0NS4xOTY3IDUyLjgwMzNDNDYuNjAzMiA1NC4yMDk4IDQ4LjUxMDkgNTUgNTAuNSA1NUM1Mi40ODkxIDU1IDU0LjM5NjggNTQuMjA5OCA1NS44MDMzIDUyLjgwMzNDNTcuMjA5OCA1MS4zOTY4IDU4IDQ5LjQ4OTEgNTggNDcuNVYyOS41QzU4IDI4LjMwNjUgNTcuNTI1OSAyNy4xNjE5IDU2LjY4MiAyNi4zMThDNTUuODM4MSAyNS40NzQxIDU0LjY5MzUgMjUgNTMuNSAyNVpNMjkuNSA1MkMyOC42MSA1MiAyNy43NCA1MS43MzYxIDI2Ljk5OTkgNTEuMjQxNkMyNi4yNTk5IDUwLjc0NzEgMjUuNjgzMSA1MC4wNDQzIDI1LjM0MjUgNDkuMjIyMUMyNS4wMDE5IDQ4LjM5OTggMjQuOTEyOCA0Ny40OTUgMjUuMDg2NSA0Ni42MjIxQzI1LjI2MDEgNDUuNzQ5MiAyNS42ODg3IDQ0Ljk0NzQgMjYuMzE4IDQ0LjMxOEMyNi45NDc0IDQzLjY4ODcgMjcuNzQ5MiA0My4yNjAxIDI4LjYyMjEgNDMuMDg2NUMyOS40OTUgNDIuOTEyOCAzMC4zOTk4IDQzLjAwMTkgMzEuMjIyMSA0My4zNDI1QzMyLjA0NDMgNDMuNjgzMSAzMi43NDcxIDQ0LjI1OTkgMzMuMjQxNiA0NC45OTk5QzMzLjczNjEgNDUuNzQgMzQgNDYuNjEgMzQgNDcuNUMzNCA0OC42OTM1IDMzLjUyNTkgNDkuODM4MSAzMi42ODIgNTAuNjgyQzMxLjgzODEgNTEuNTI1OSAzMC42OTM1IDUyIDI5LjUgNTJaTTUwLjUgNTJDNDkuNjEgNTIgNDguNzQgNTEuNzM2MSA0Ny45OTk5IDUxLjI0MTZDNDcuMjU5OSA1MC43NDcxIDQ2LjY4MzEgNTAuMDQ0MyA0Ni4zNDI1IDQ5LjIyMjFDNDYuMDAxOSA0OC4zOTk4IDQ1LjkxMjggNDcuNDk1IDQ2LjA4NjUgNDYuNjIyMUM0Ni4yNjAxIDQ1Ljc0OTIgNDYuNjg4NyA0NC45NDc0IDQ3LjMxOCA0NC4zMThDNDcuOTQ3NCA0My42ODg3IDQ4Ljc0OTIgNDMuMjYwMSA0OS42MjIxIDQzLjA4NjVDNTAuNDk1IDQyLjkxMjggNTEuMzk5OCA0My4wMDE5IDUyLjIyMjEgNDMuMzQyNUM1My4wNDQzIDQzLjY4MzEgNTMuNzQ3MSA0NC4yNTk5IDU0LjI0MTYgNDQuOTk5OUM1NC43MzYxIDQ1Ljc0IDU1IDQ2LjYxIDU1IDQ3LjVDNTUgNDguNjkzNSA1NC41MjU5IDQ5LjgzODEgNTMuNjgyIDUwLjY4MkM1Mi44MzgxIDUxLjUyNTkgNTEuNjkzNSA1MiA1MC41IDUyWiIgZmlsbD0id2hpdGUiLz4KPC9nPgo8ZGVmcz4KPGZpbHRlciBpZD0iZmlsdGVyMF9kIiB4PSIwIiB5PSIwIiB3aWR0aD0iODAiIGhlaWdodD0iODAiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLz4KPGZlT2Zmc2V0Lz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIvPgo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4yNSAwIi8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93Ii8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9kcm9wU2hhZG93IiByZXN1bHQ9InNoYXBlIi8+CjwvZmlsdGVyPgo8L2RlZnM+Cjwvc3ZnPgo= data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iNiIgZmlsbD0iYmxhY2siIGZpbGwtb3BhY2l0eT0iMC44Ii8+CjxwYXRoIGQ9Ik00NS41IDE3SDQ0QzQzLjYwMjIgMTcgNDMuMjIwNiAxNy4xNTggNDIuOTM5MyAxNy40MzkzQzQyLjY1OCAxNy43MjA2IDQyLjUgMTguMTAyMiA0Mi41IDE4LjVDNDIuNSAxOC44OTc4IDQyLjY1OCAxOS4yNzk0IDQyLjkzOTMgMTkuNTYwN0M0My4yMjA2IDE5Ljg0MiA0My42MDIyIDIwIDQ0IDIwSDQ1LjVDNDUuODk3OCAyMCA0Ni4yNzk0IDIwLjE1OCA0Ni41NjA3IDIwLjQzOTNDNDYuODQyIDIwLjcyMDYgNDcgMjEuMTAyMiA0NyAyMS41VjMzLjUzNzVDNDUuNzA5MyAzMi41NDUzIDQ0LjEyOCAzMi4wMDUgNDIuNSAzMkM0MS4yNzE3IDMyLjAwMDYgNDAuMDYyNCAzMi4zMDI5IDM4Ljk3ODMgMzIuODgwM0MzNy44OTQyIDMzLjQ1NzYgMzYuOTY4NSAzNC4yOTI0IDM2LjI4MjUgMzUuMzExM0MzNS43MjYxIDM0LjczODQgMzUuMDYwMyAzNC4yODI5IDM0LjMyNDggMzMuOTcxOUMzMy41ODkyIDMzLjY2MDkgMzIuNzk4NiAzMy41MDA3IDMyIDMzLjUwMDdDMzEuMjAxNCAzMy41MDA3IDMwLjQxMDggMzMuNjYwOSAyOS42NzUyIDMzLjk3MTlDMjguOTM5NyAzNC4yODI5IDI4LjI3MzkgMzQuNzM4NCAyNy43MTc1IDM1LjMxMTNDMjcuMDMxNSAzNC4yOTI0IDI2LjEwNTggMzMuNDU3NiAyNS4wMjE3IDMyLjg4MDNDMjMuOTM3NiAzMi4zMDI5IDIyLjcyODMgMzIuMDAwNiAyMS41IDMyQzE5Ljg3MiAzMi4wMDUgMTguMjkwNyAzMi41NDUzIDE3IDMzLjUzNzVWMjEuNUMxNyAyMS4xMDIyIDE3LjE1OCAyMC43MjA2IDE3LjQzOTMgMjAuNDM5M0MxNy43MjA2IDIwLjE1OCAxOC4xMDIyIDIwIDE4LjUgMjBIMjBDMjAuMzk3OCAyMCAyMC43Nzk0IDE5Ljg0MiAyMS4wNjA3IDE5LjU2MDdDMjEuMzQyIDE5LjI3OTQgMjEuNSAxOC44OTc4IDIxLjUgMTguNUMyMS41IDE4LjEwMjIgMjEuMzQyIDE3LjcyMDYgMjEuMDYwNyAxNy40MzkzQzIwLjc3OTQgMTcuMTU4IDIwLjM5NzggMTcgMjAgMTdIMTguNUMxNy4zMDY1IDE3IDE2LjE2MTkgMTcuNDc0MSAxNS4zMTggMTguMzE4QzE0LjQ3NDEgMTkuMTYxOSAxNCAyMC4zMDY1IDE0IDIxLjVWMzkuNUMxNCA0MS40ODkxIDE0Ljc5MDIgNDMuMzk2OCAxNi4xOTY3IDQ0LjgwMzNDMTcuNjAzMiA0Ni4yMDk4IDE5LjUxMDkgNDcgMjEuNSA0N0MyMy40ODkxIDQ3IDI1LjM5NjggNDYuMjA5OCAyNi44MDMzIDQ0LjgwMzNDMjguMjA5OCA0My4zOTY4IDI5IDQxLjQ4OTEgMjkgMzkuNUMyOSAzOC43MDQ0IDI5LjMxNjEgMzcuOTQxMyAyOS44Nzg3IDM3LjM3ODdDMzAuNDQxMyAzNi44MTYxIDMxLjIwNDQgMzYuNSAzMiAzNi41QzMyLjc5NTYgMzYuNSAzMy41NTg3IDM2LjgxNjEgMzQuMTIxMyAzNy4zNzg3QzM0LjY4MzkgMzcuOTQxMyAzNSAzOC43MDQ0IDM1IDM5LjVDMzUgNDEuNDg5MSAzNS43OTAyIDQzLjM5NjggMzcuMTk2NyA0NC44MDMzQzM4LjYwMzIgNDYuMjA5OCA0MC41MTA5IDQ3IDQyLjUgNDdDNDQuNDg5MSA0NyA0Ni4zOTY4IDQ2LjIwOTggNDcuODAzMyA0NC44MDMzQzQ5LjIwOTggNDMuMzk2OCA1MCA0MS40ODkxIDUwIDM5LjVWMjEuNUM1MCAyMC4zMDY1IDQ5LjUyNTkgMTkuMTYxOSA0OC42ODIgMTguMzE4QzQ3LjgzODEgMTcuNDc0MSA0Ni42OTM1IDE3IDQ1LjUgMTdaTTIxLjUgNDRDMjAuNjEgNDQgMTkuNzQgNDMuNzM2MSAxOC45OTk5IDQzLjI0MTZDMTguMjU5OSA0Mi43NDcxIDE3LjY4MzEgNDIuMDQ0MyAxNy4zNDI1IDQxLjIyMjFDMTcuMDAxOSA0MC4zOTk4IDE2LjkxMjggMzkuNDk1IDE3LjA4NjUgMzguNjIyMUMxNy4yNjAxIDM3Ljc0OTIgMTcuNjg4NyAzNi45NDc0IDE4LjMxOCAzNi4zMThDMTguOTQ3NCAzNS42ODg3IDE5Ljc0OTIgMzUuMjYwMSAyMC42MjIxIDM1LjA4NjVDMjEuNDk1IDM0LjkxMjggMjIuMzk5OCAzNS4wMDE5IDIzLjIyMjEgMzUuMzQyNUMyNC4wNDQzIDM1LjY4MzEgMjQuNzQ3MSAzNi4yNTk5IDI1LjI0MTYgMzYuOTk5OUMyNS43MzYxIDM3Ljc0IDI2IDM4LjYxIDI2IDM5LjVDMjYgNDAuNjkzNSAyNS41MjU5IDQxLjgzODEgMjQuNjgyIDQyLjY4MkMyMy44MzgxIDQzLjUyNTkgMjIuNjkzNSA0NCAyMS41IDQ0Wk00Mi41IDQ0QzQxLjYxIDQ0IDQwLjc0IDQzLjczNjEgMzkuOTk5OSA0My4yNDE2QzM5LjI1OTkgNDIuNzQ3MSAzOC42ODMxIDQyLjA0NDMgMzguMzQyNSA0MS4yMjIxQzM4LjAwMTkgNDAuMzk5OCAzNy45MTI4IDM5LjQ5NSAzOC4wODY1IDM4LjYyMjFDMzguMjYwMSAzNy43NDkyIDM4LjY4ODcgMzYuOTQ3NCAzOS4zMTggMzYuMzE4QzM5Ljk0NzQgMzUuNjg4NyA0MC43NDkyIDM1LjI2MDEgNDEuNjIyMSAzNS4wODY1QzQyLjQ5NSAzNC45MTI4IDQzLjM5OTggMzUuMDAxOSA0NC4yMjIxIDM1LjM0MjVDNDUuMDQ0MyAzNS42ODMxIDQ1Ljc0NzEgMzYuMjU5OSA0Ni4yNDE2IDM2Ljk5OTlDNDYuNzM2MSAzNy43NCA0NyAzOC42MSA0NyAzOS41QzQ3IDQwLjY5MzUgNDYuNTI1OSA0MS44MzgxIDQ1LjY4MiA0Mi42ODJDNDQuODM4MSA0My41MjU5IDQzLjY5MzUgNDQgNDIuNSA0NFoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo=".split(" "); +c=":root {--text-color: __playerText__;--panel-color: __asideBackground__;--button-background-color: __primaryButtonBackground__;--button-text-color: __primaryButtonText__;--button-hover-background-color: __primaryButtonBackgroundHover__;--button-hover-text-color: __primaryButtonTextHover__;--button-border-color: __primaryButtonBorder__;--button-hover-border-color: __primaryButtonBorderHover__;--page-background-color: __pageBackground__;--font-family-bold: nPFnb;--font-family-bold-italic: nPFnbi;--font-family-italic: nPFni;--font-family-normal: nPFn;--font-family-semibold: nPFnsb, nPFn;--font-family-semibold-italic: nPFnsbi, nPFni;--button-border-radius: __borderRadius__;--popup-border: __popupBorder__; }.none {position: absolute; } .none .launch-screen {z-index: 100;position: fixed;top: 0;right: 0;bottom: 0;left: 0;background-color: rgba(0, 0, 0, 0.48); } .none .launch-screen .launch-screen-button {top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 96px;height: 96px;position: absolute; } .none .launch-screen .launch-screen-button__play-icon {background-color: #FFFFFF;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 90px;height: 90px;box-shadow: 0 12px 50px 0 rgba(0, 0, 0, 0.2);transition: 0.3s ease-in-out; } .none .launch-screen .launch-screen-button__icon {background: url("+ +c[0]+") no-repeat center;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 6px;width: 90px;height: 90px; } .none .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__play-icon {width: 96px;height: 96px; } .none .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__icon {background: url("+c[1]+") no-repeat center; } .none .playerView .preloader {width: 50px;height: 50px;position: absolute;top: 0;left: 0;bottom: 0;right: 0;margin: auto;border-radius: 10px;background-color: rgba(0, 0, 0, 0.5); } .none .playerView .preloader::after {content: '';position: absolute;background: url("+ +c[2]+");background-size: cover;top: 0;left: 0;bottom: 0;right: 0;animation: preloader_spin 1s infinite linear; } .none .title-panel {width: 100%;background: var(--panel-color);position: absolute;box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);height: 46px; } .none.none_landscape .title-panel {display: none; }.android_default * {text-rendering: auto !important; }body {margin: 0;padding: 0;overflow: hidden;cursor: default;-ms-touch-action: pan-y;touch-action: pan-y;-webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body .password_form, body .info_panel {position: absolute;background: #F7F7F7;border-radius: 4px;width: 513px;height: 210px;font-family: Arial; } body .password_form *, body .info_panel * {box-sizing: border-box; } body .password_form .password_label {position: absolute;color: #3A3A3A;font-size: 15px;top: 63px;left: 55px; } body .password_form .wrong_password_label {position: absolute;color: #DD4A37;font-size: 12px;top: 131px;left: 55px; } body .password_form input {position: absolute;width: 330px;height: 32px;background: #FFFFFF;border: 1px solid #D1D2D4;padding: 1px;border-radius: 2px;font-size: 18px;color: #231F20;left: 54px;top: 94px;padding-left: 8px; } body .password_form button {border: transparent;background: transparent;color: #343434;font-family: Arial;font-size: 15px;text-shadow: 0 1px 0 rgba(255, 255, 255, 0.4); } body .password_form button::before {background: linear-gradient(to bottom, #D3D3D3, #BABABA);position: absolute;content: '';top: 0;right: 0;bottom: 0;left: 0;border-radius: 4px;z-index: -1; } body .password_form button::after {background: linear-gradient(to bottom, #DCDCDC, #D1D1D1);position: absolute;content: '';top: 1px;right: 1px;bottom: 1px;left: 1px;border-radius: 4px;z-index: -1; } body .password_form .btn_ok {position: absolute;top: 94px;right: 55px;width: 60px;height: 32px;opacity: 0.99; } body .info_panel {display: table; } body .info_panel .label {position: static;display: table-cell;vertical-align: middle;width: 100%;padding-left: 120px;padding-right: 40px;color: #3A3A3A;font-size: 15px; } body .info_panel::after {position: absolute;content: '';width: 63px;height: 63px;top: 73px;left: 46px; } body .info_panel.domain::after {background: transparent url("+ +c[3]+"); } body .info_panel.time::after {background: transparent url("+c[4]+"); }.component_base,.component_container {position: absolute; }:focus {outline: none; }::-moz-focus-inner {border: 0; }input {appearance: none; }button {cursor: pointer;margin: 0;border: 0; }button[disabled] {cursor: default; }.__player_view_id__ {position: absolute; } .__player_view_id__ > * {position: absolute; } .__player_view_id__ .slide {white-space: nowrap;font-size: 0; } .__player_view_id__ .slide a {text-decoration: none;cursor: pointer; } .__player_view_id__ .slide a img {border: 0; } .__player_view_id__ .slide * {-ms-transform-origin: 0 0;transform-origin: 0 0; } .__player_view_id__ .slide.relpos, .__player_view_id__ .slide .relpos {position: relative !important;vertical-align: top; } .__player_view_id__ .slide.kern, .__player_view_id__ .slide .kern {text-rendering: optimizeLegibility;font-feature-settings: 'kern' 1, 'liga' 0; } .__player_view_id__ .slide.nokern, .__player_view_id__ .slide .nokern {text-rendering: optimizeSpeed;font-feature-settings: 'kern' 0, 'liga' 0; } .__player_view_id__ .fullscreen {-ms-transform: none !important;transform: none !important;top: 0 !important;left: 0 !important; } .__player_view_id__ .fullscreen > video, .__player_view_id__ .fullscreen .video_player {background-color: black;width: __slide_width__ !important;height: __slide_height__ !important;z-index: 100;-ms-transform: none !important;transform: none !important; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen {background: url("+ +c[5]+") no-repeat; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen:hover {background: url("+c[6]+") no-repeat; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen:active {background: url("+c[7]+") no-repeat; } .__player_view_id__ .video_player video {width: 100%;height: 100%;margin: auto;top: 0;right: 0;bottom: 0;left: 0; } .__player_view_id__ .video_player video::cue {color: #FFFFFF;background-color: rgba(8, 8, 8, 0.75);border-radius: 4px;font-family: Helvetica, Roboto, Arial, sans-serif;line-height: 1.1; } .__player_view_id__ .video_player.poster_frame_hide_video video {display: none; } .__player_view_id__ .video_player.poster_frame video {opacity: 0; } .__player_view_id__ .video_player.poster_frame_hide_video .poster, .__player_view_id__ .video_player.poster_frame .poster {position: absolute;width: 100%;height: 100%; } .__player_view_id__ .video_player .controls {height: 36px;background: rgba(45, 50, 55, 0.85098);border: 1px solid #444648;cursor: default;border-radius: 4px; } .__player_view_id__ .video_player .controls, .__player_view_id__ .video_player .controls * {backface-visibility: hidden; } .__player_view_id__ .video_player .controls .progress {background-color: #75787A;height: 14px;left: 64px;top: 0;bottom: 0;margin-top: auto;margin-bottom: auto;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark {width: 10px;height: 10px;margin-top: -5px;margin-left: -5px;top: 50%;background: url("+ +c[8]+") no-repeat;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark:hover, .__player_view_id__ .video_player .controls .progress .bookmark:active {background: url("+c[9]+") no-repeat; } .__player_view_id__ .video_player .controls .progress .loading {background-color: #B1B3B5;height: 100%; } .__player_view_id__ .video_player .controls .progress .playing {background-color: #FFFFFF;height: 100%; } .__player_view_id__ .video_player .controls .progress .tooltip {background: url("+ +c[10]+") no-repeat;width: 60px;height: 25px;top: -33px;margin-left: -30px;font-family: Arial;font-size: 12px;padding-top: 2px;text-align: center; } .__player_view_id__ .video_player .controls .volume_popup {border-radius: 3px;background: rgba(45, 50, 55, 0.85098);top: -67px;right: 65px;padding: 8px;box-sizing: border-box;width: 28px;height: 64px; } .__player_view_id__ .video_player .controls .volume_popup .volume {background: url("+c[11]+");position: relative;cursor: pointer;width: 12px;height: 48px; } .__player_view_id__ .video_player .controls .volume_popup .volume .back {background: url("+ +c[12]+");width: 100%; } .__player_view_id__ .video_player .controls button {width: 100%;height: 100%; } .__player_view_id__ .video_player .controls button.rate {background: url("+c[13]+") no-repeat center; } .__player_view_id__ .video_player .controls button.rate.selected {background-color: rgba(255, 255, 255, 0.1); } .__player_view_id__ .video_player .controls button.mute {background: url("+c[14]+"); } .__player_view_id__ .video_player .controls button.mute:hover {background: url("+ +c[15]+"); } .__player_view_id__ .video_player .controls button.mute:active {background: url("+c[16]+"); } .__player_view_id__ .video_player .controls button.mute.selected {background: url("+c[17]+"); } .__player_view_id__ .video_player .controls button.mute.selected:hover {background: url("+c[18]+"); } .__player_view_id__ .video_player .controls button.mute.selected:active {background: url("+c[19]+"); } .__player_view_id__ .video_player .controls button.subtitles {background: url("+ +c[20]+") no-repeat center; } .__player_view_id__ .video_player .controls button.subtitles.selected {background-color: rgba(255, 255, 255, 0.1); } .__player_view_id__ .video_player .controls button.play {background: url("+c[21]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:hover {background: url("+c[22]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:active {background: url("+c[23]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected {background: url("+ +c[24]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:hover {background: url("+c[25]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:active {background: url("+c[26]+") no-repeat; } .__player_view_id__ .video_player .controls button.play::after {background: url("+c[27]+");width: 1px;height: 32px;right: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls button.toggle_fullscreen {background: url("+ +c[28]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:hover {background: url("+c[29]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:active {background: url("+c[30]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen::before {background: url("+c[27]+") no-repeat;width: 1px;height: 32px;left: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls .subtitles-list {width: 195px;right: 0;border-radius: 4px;border: solid 1px #444648;background-color: rgba(45, 50, 55, 0.85);font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;font-weight: normal;font-stretch: normal;font-style: normal;line-height: normal;letter-spacing: normal;padding: 3px 0;bottom: 37px; } .__player_view_id__ .video_player .controls .subtitles-list__caption {position: relative !important;padding: 12px 0 22px 0;color: #b8b8b8;text-align: center; } .__player_view_id__ .video_player .controls .subtitles-list__caption::after {position: absolute;content: '';width: calc(100% - 20px);left: 0;right: 0;bottom: 5px;margin: auto;border-bottom: 1px solid #444648; } .__player_view_id__ .video_player .controls .subtitles-list__item {color: #b8b8b8;position: relative !important;padding: 10px 2px 10px 35px;cursor: pointer;overflow: hidden;text-overflow: ellipsis; } .__player_view_id__ .video_player .controls .subtitles-list__item.subtitles-list__item_active {background-color: rgba(255, 255, 255, 0.1);color: #FFFFFF; } .__player_view_id__ .video_player .controls .subtitles-list__item[aria-selected='true'] {background-color: rgba(0, 0, 0, 0.24);color: #FFFFFF;padding-left: 12px; } .__player_view_id__ .video_player .controls .subtitles-list__item[aria-selected='true']::before {background: url("+ +c[31]+") no-repeat;width: 14px;height: 15px;padding-right: 23px;content: ''; } .__player_view_id__ .video_player .controls .toggle_fullscreen {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .play {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .rate {width: 32px;height: 34px;right: 95px;top: 0; } .__player_view_id__ .video_player .controls .rate.rate_subtitle-button-next {right: 127px; } .__player_view_id__ .video_player .controls .playback-rate-menu {width: 120px;right: 51px;border-radius: 4px;border: solid 1px #444648;background-color: rgba(45, 50, 55, 0.85);font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;font-weight: normal;font-stretch: normal;font-style: normal;line-height: normal;letter-spacing: normal;padding: 3px 0;bottom: 37px; } .__player_view_id__ .video_player .controls .playback-rate-menu.playback-rate-menu_subtitle-button-next {right: 83px; } .__player_view_id__ .video_player .controls .playback-rate-menu__caption {position: relative !important;padding: 12px 0 22px 0;color: #b8b8b8;text-align: center; } .__player_view_id__ .video_player .controls .playback-rate-menu__caption::after {position: absolute;content: '';width: calc(100% - 20px);left: 0;right: 0;bottom: 5px;margin: auto;border-bottom: 1px solid #444648; } .__player_view_id__ .video_player .controls .playback-rate-menu__item {color: #b8b8b8;position: relative !important;padding: 10px 2px 10px 35px;cursor: pointer;overflow: hidden;text-overflow: ellipsis; } .__player_view_id__ .video_player .controls .playback-rate-menu__item.playback-rate-menu__item_active {background-color: rgba(255, 255, 255, 0.1);color: #FFFFFF; } .__player_view_id__ .video_player .controls .playback-rate-menu__item[aria-selected='true'] {background-color: rgba(0, 0, 0, 0.24);color: #FFFFFF;padding-left: 12px; } .__player_view_id__ .video_player .controls .playback-rate-menu__item[aria-selected='true']::before {background: url("+ +c[31]+") no-repeat;width: 14px;height: 15px;padding-right: 23px;content: ''; } .__player_view_id__ .video_player .controls .subtitles {width: 32px;height: 34px;right: 95px;top: 0; } .__player_view_id__ .video_player .controls .toggle_fullscreen {right: -1px; } .__player_view_id__ .video_player .controls .mute {width: 22px;height: 22px;right: 67px;top: 6px; }.popup_layer {position: absolute; } .popup_layer .modal_layer {background: #000000;opacity: 0.4;z-index: 10;width: 100%;height: 100%; } .popup_layer .message_box, .popup_layer .confirm_window {background: #FFFFFF;border-radius: 5px;border: 1px solid rgba(0, 0, 0, 0.75);width: 357px;height: 150px;position: absolute;top: 0;right: 0;bottom: 0;left: 0;margin: auto;z-index: 10; } .popup_layer .message_box::after, .popup_layer .confirm_window::after {background-color: #E6E6E6;width: 100%;height: 1px;top: 30px;position: absolute;content: ''; } .popup_layer .message_box .title, .popup_layer .message_box .message, .popup_layer .confirm_window .title, .popup_layer .confirm_window .message {font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;color: #323232; } .popup_layer .message_box .title, .popup_layer .confirm_window .title {position: absolute;left: 13px;top: 7px;font-weight: bold;background: transparent; } .popup_layer .message_box .message, .popup_layer .confirm_window .message {position: absolute;top: 47px;left: 69px;margin-right: 25px; } .popup_layer .message_box .message::before, .popup_layer .confirm_window .message::before {background-color: #E6E6E6;width: 35px;height: 35px;left: -45px;position: absolute;content: ''; } .popup_layer .message_box button, .popup_layer .confirm_window button {font-size: 14px;border-radius: 5px;color: #323232;width: 68px;height: 30px; } .popup_layer .message_box button, .popup_layer .message_box button.mobile:hover, .popup_layer .message_box button.mobile:active, .popup_layer .confirm_window button, .popup_layer .confirm_window button.mobile:hover, .popup_layer .confirm_window button.mobile:active {background: #D4D4D4; } .popup_layer .message_box button:hover, .popup_layer .message_box button:active, .popup_layer .message_box button.mobile.active, .popup_layer .confirm_window button:hover, .popup_layer .confirm_window button:active, .popup_layer .confirm_window button.mobile.active {background: #B8B8B8; } .popup_layer .confirm_window button.btn_yes {left: 101px;top: 98px; } .popup_layer .confirm_window button.btn_no {left: 181px;top: 98px; } .popup_layer .confirm_window .message::before {background: url("+ +c[32]+"); } .popup_layer .message_box button.btn_ok {left: 141px;top: 98px; } .popup_layer .message_box .message::before {background: url("+c[33]+"); }.transitionSlide.paused * {animation-play-state: paused !important; }.framesLayer .video_player {-ms-transform-origin: 0 0;transform-origin: 0 0; }.framesLayer *:not(.framesLayerContent) {pointer-events: all; }.framesLayer .framesLayerContent {position: absolute; } .framesLayer .framesLayerContent > div {pointer-events: all; }.trial_banner {position: relative;transform: translateZ(0); } .trial_banner .banner-content, .trial_banner .banner-content_hover {position: absolute;left: 0;right: 0;top: 0;bottom: 0;width: 100%;height: 100%; } .trial_banner .banner-content {visibility: visible;z-index: 1; } .trial_banner .banner-content_hover {visibility: hidden;z-index: 0; } .trial_banner .days_remaining {position: absolute;font-family: 'Open Sans', Arial, sans-serif;font-weight: normal;font-size: 13px;left: 65px;top: 41px;color: #7C1645;z-index: 1; } .trial_banner:hover .banner-content {visibility: hidden;z-index: 0; } .trial_banner:hover .banner-content_hover {visibility: visible;z-index: 1; }.back_to_app {height: 100%;position: absolute;left: 0; } .back_to_app__text {color: #3DA0E1;font-size: 16px;font-family: Helvetica Neue, Helvetica, Roboto, Arial;text-overflow: ellipsis;overflow: hidden;position: absolute;bottom: 0;top: 0;height: 24px;line-height: 24px;margin: auto;padding-left: 25px;max-width: 80px; } .back_to_app__text::before {content: '';background: url("+ +c[34]+") no-repeat center;height: 24px;width: 14px;left: 8px;position: absolute; }.popup-layer {top: 0;right: 0;bottom: 0;left: 0;z-index: 1;position: absolute;border-radius: inherit; }.modal-layer {background: #000000;opacity: 0.4;position: absolute;width: 100%;height: 100%;border-radius: inherit; }.uikit-primary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-primary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-primary-button.uikit-primary-button_size_medium {padding: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:first-child {margin-left: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:last-child {margin-right: 10px; } .uikit-primary-button.uikit-primary-button_size_small {padding: 6px 12px; } .uikit-primary-button.uikit-primary-button_size_small .uikit-primary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-primary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__button-text {margin-right: 8px; } .uikit-primary-button__left-icon {margin-right: 8px; } .uikit-primary-button__button-text:first-child {margin-left: 0; } .uikit-primary-button__button-text:last-child {margin-right: 0; } .uikit-primary-button__left-icon:first-child {margin-left: 0; } .uikit-primary-button__left-icon:last-child {margin-right: 0; } .uikit-primary-button__right-icon:first-child {margin-left: 0; } .uikit-primary-button__right-icon:last-child {margin-right: 0; } .uikit-primary-button[disabled] {opacity: 0.4; } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-secondary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-secondary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-secondary-button.uikit-secondary-button_size_medium {padding: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:first-child {margin-left: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:last-child {margin-right: 10px; } .uikit-secondary-button.uikit-secondary-button_size_small {padding: 6px 12px; } .uikit-secondary-button.uikit-secondary-button_size_small .uikit-secondary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-secondary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__button-text {margin-right: 8px; } .uikit-secondary-button__left-icon {margin-right: 8px; } .uikit-secondary-button__button-text:first-child {margin-left: 0; } .uikit-secondary-button__button-text:last-child {margin-right: 0; } .uikit-secondary-button__left-icon:first-child {margin-left: 0; } .uikit-secondary-button__left-icon:last-child {margin-right: 0; } .uikit-secondary-button__right-icon:first-child {margin-left: 0; } .uikit-secondary-button__right-icon:last-child {margin-right: 0; } .uikit-secondary-button[disabled] {opacity: 0.4; } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-link-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-link-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-link-button.uikit-link-button_size_medium {padding: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text {font-size: 17px;line-height: 20px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:first-child {margin-left: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:last-child {margin-right: 10px; } .uikit-link-button.uikit-link-button_size_small {padding: 6px 12px; } .uikit-link-button.uikit-link-button_size_small .uikit-link-button__button-text {font-size: 14px;line-height: 20px; } .uikit-link-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__button-text {margin-right: 8px; } .uikit-link-button__left-icon {margin-right: 8px; } .uikit-link-button__button-text:first-child {margin-left: 0; } .uikit-link-button__button-text:last-child {margin-right: 0; } .uikit-link-button__left-icon:first-child {margin-left: 0; } .uikit-link-button__left-icon:last-child {margin-right: 0; } .uikit-link-button__right-icon:first-child {margin-left: 0; } .uikit-link-button__right-icon:last-child {margin-right: 0; } .uikit-link-button[disabled] {opacity: 0.4; } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-primary-button {background: var(--primary-button-background-color, var(--button-background-color));color: var(--primary-button-text-color, var(--button-text-color)); } .uikit-primary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--primary-button-border-color, var(--button-border-color));background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-primary-button__button-text {font-family: var(--font-family-normal);font-weight: 700; } .uikit-primary-button.uikit-primary-button_active, .uikit-primary-button[aria-pressed='true'], .uikit-primary-button:focus {background: var(--primary-button-background-color-active, var(--button-hover-background-color));color: var(--primary-button-text-color-active, var(--button-hover-text-color)); } .uikit-primary-button.uikit-primary-button_active::after, .uikit-primary-button[aria-pressed='true']::after, .uikit-primary-button:focus::after {background: var(--primary-button-border-color-active, var(--button-hover-border-color));background-origin: border-box; }.message-box {background: var(--panel-color);position: absolute;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;border-radius: 7px;min-width: 280px;padding: 40px;box-shadow: 0 8px 16px rgba(0, 0, 0, 0.08); } .message-box::after {content: '';box-sizing: border-box;border: 1px solid var(--popup-border);width: 100%;height: 100%;position: absolute;left: 0;top: 0;border-radius: 7px;pointer-events: none; } .message-box__content {position: relative;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-direction: column;flex-direction: column; } .message-box__icon {width: 24px;height: 24px;margin-bottom: 24px;position: relative;display: inline-block;color: var(--text-color);opacity: 0.72; } .message-box .message-box-buttons {position: relative;width: 100%;height: 36px; } .message-box .message-box-buttons__buttons {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center; } .message-box .message-box-buttons__window-button {margin: 0 4px; } .message-box .vertical-scrollbar {top: 40px; } .message-box__message-container {overflow: hidden;display: inline-block;max-width: 480px;vertical-align: top;position: relative; } .message-box__message {text-align: center;font-size: 16px;color: var(--text-color);text-overflow: ellipsis;overflow: hidden;position: relative;font-family: var(--font-family-normal); } .message-box__buttons {margin-top: 28px; }.container-top-shadow {background: __verticalGradient(#FFFFFF, rgba(255, 255, 255, 0));background: linear-gradient(to bottom, #FFFFFF, rgba(255, 255, 255, 0));position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; }.container-bottom-shadow {background: __verticalGradient(rgba(255, 255, 255, 0), #FFFFFF);background: linear-gradient(to bottom, rgba(255, 255, 255, 0), #FFFFFF);position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; }.vertical-scrollbar {position: absolute;right: 0;top: 4px;bottom: 4px;width: 14px;transition: opacity 0.2s ease; } .vertical-scrollbar .thumb {position: absolute;width: 8px;right: 3px;padding: 1px;border-radius: 5px; } .vertical-scrollbar .thumb__background {height: 100%;border-radius: 4px;background-color: rgba(0, 0, 0, 0.32);border: 1px solid rgba(255, 255, 255, 0.12); }.vertical-scrollbar {transition: none;opacity: 0.5 !important; }.presentation-view-mode-switch-control {width: 64px;height: 64px;position: fixed;left: 16px;top: 16px;cursor: pointer;border: none;background: url("+ +c[35]+") no-repeat center; } .presentation-view-mode-switch-control:not([disabled]):hover {background: url("+c[36]+") no-repeat center; } .presentation-view-mode-switch-control:not([disabled]):active {background: url("+c[37]+") no-repeat center; } .presentation-view-mode-switch-control:not([disabled]):focus {outline: none; } .presentation-view-mode-switch-control:not([disabled]):focus::before {content: '';position: absolute;top: 3px;bottom: 3px;left: 3px;right: 3px;border: 1px dotted #FFFFFF;opacity: 0.6; }"; +let d;for(const [f,g]of Object.entries(null!=(d=a)?d:{}))a=`__${f.replace(RegExp("\\.","g"),"_")}__`,c=c.replace(new RegExp(a,"g"),g);let e;for(const [f,g]of Object.entries(null!=(e=b)?e:{}))c=c.replace(new RegExp(f,"g"),g);c=c.replace(/__verticalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.rn);c=c.replace(/__horizontalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.pn);return gn(c)}rn(a,b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}pn(a, +b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}};class CG{Uq(a,b){var c=sh("PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMTA2cHgiIGhlaWdodD0iMTM0cHgiIHZpZXdCb3g9IjAgMCAxMDYgMTM0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDYgMTM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGw9Int0ZXh0fSIgZD0iTTUzLDE5Yy0xNi43MDYsMC0zMC4yNSwxNS4yMjctMzAuMjUsMzQuMDMxYzAsMTguNzk0LDEzLjU0NCwzNC4wMzEsMzAuMjUsMzQuMDMxDQoJYzE2LjcxMywwLDMwLjI1LTE1LjIzNywzMC4yNS0zNC4wMzFDODMuMjUsMzQuMjI3LDY5LjcxMywxOSw1MywxOXoiLz4NCjxwYXRoIGZpbGw9Int0ZXh0fSIgZD0iTTc0LjExOSw4OC42MjVjLTYuMjkzLDUuMDUzLTEzLjQ4Niw3Ljk2Mi0yMS4xMjIsNy45NjJjLTcuNjMsMC0xNC44MjMtMi45MDQtMjEuMTIyLTcuOTYyDQoJQzE4LjI4Niw5My45ODQsNy42MjEsMTA2LjY4OCwyLjczOSwxMzRoMTAwLjUyMUM5OC4zNzksMTA2LjY4OCw4Ny43MjMsOTMuOTcxLDc0LjExOSw4OC42MjV6Ii8+DQo8L3N2Zz4NCg=="); +let d;for(const [g,h]of Object.entries(null!=(d=a)?d:{}))c=c.replace(new RegExp(`{${g}}`,"g"),h);c=["data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICB3aWR0aD0iMjhweCIgaGVpZ2h0PSIzM3B4IiB2aWV3Qm94PSIwIDAgMjguMzAyIDMzLjI0MiI+DQoJPHBhdGggZD0iTTAsMS44VjMxLjQ0MmExLjgsMS44LDAsMCwwLDIuNzI2LDEuNTQzbDI0LjctMTQuODJhMS44LDEuOCwwLDAsMCwwLTMuMDg3TDIuNzI2LjI1N0ExLjgsMS44LDAsMCwwLDAsMS44WiIgc3R5bGU9ImZpbGw6IzMzMyIvPg0KPC9zdmc+","data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyOHB4IiBoZWlnaHQ9IjMzcHgiIHZpZXdCb3g9IjAgMCAyOC4zMDIgMzMuMjQyIj4NCgk8cGF0aCBkPSJNMCwxLjhWMzEuNDQyYTEuOCwxLjgsMCwwLDAsMi43MjYsMS41NDNsMjQuNy0xNC44MmExLjgsMS44LDAsMCwwLDAtMy4wODdMMi43MjYuMjU3QTEuOCwxLjgsMCwwLDAsMCwxLjhaIiBzdHlsZT0iZmlsbDojNTI4YmRmIi8+DQo8L3N2Zz4=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMnB4IiB2aWV3Qm94PSIwIDAgMjAgMjIiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5TV0FQLUlDT048L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iaVBob25lLTgtUGx1cy1ALUNvdXJzZS1sYW5kc2NhcGUtU1dBUCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQ2Mi4wMDAwMDAsIC0xMTAuMDAwMDAwKSIgZmlsbD0iI0ZGRkZGRiIgZmlsbC1ydWxlPSJub256ZXJvIj4KICAgICAgICAgICAgPGcgaWQ9IlNXQVAtQlVUVE9OIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0NTAuMDAwMDAwLCA5OS4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNS45MTQyMTM2LDE2IEwyNCwxNiBDMjQuNTUyMjg0NywxNiAyNSwxNi40NDc3MTUzIDI1LDE3IEMyNSwxNy41NTIyODQ3IDI0LjU1MjI4NDcsMTggMjQsMTggTDE1LjkxNDIxMzYsMTggTDE4LjcwNzEwNjgsMjAuNzkyODkzMiBDMTkuMDk3NjMxMSwyMS4xODM0MTc1IDE5LjA5NzYzMTEsMjEuODE2NTgyNSAxOC43MDcxMDY4LDIyLjIwNzEwNjggQzE4LjMxNjU4MjUsMjIuNTk3NjMxMSAxNy42ODM0MTc1LDIyLjU5NzYzMTEgMTcuMjkyODkzMiwyMi4yMDcxMDY4IEwxMi43OTI4OTMyLDE3LjcwNzEwNjggQzEyLjQwMjM2ODksMTcuMzE2NTgyNSAxMi40MDIzNjg5LDE2LjY4MzQxNzUgMTIuNzkyODkzMiwxNi4yOTI4OTMyIEwxNy4yOTI4OTMyLDExLjc5Mjg5MzIgQzE3LjY4MzQxNzUsMTEuNDAyMzY4OSAxOC4zMTY1ODI1LDExLjQwMjM2ODkgMTguNzA3MTA2OCwxMS43OTI4OTMyIEMxOS4wOTc2MzExLDEyLjE4MzQxNzUgMTkuMDk3NjMxMSwxMi44MTY1ODI1IDE4LjcwNzEwNjgsMTMuMjA3MTA2OCBMMTUuOTE0MjEzNiwxNiBaIE0yOC4wODU3ODY0LDI4IEwyMCwyOCBDMTkuNDQ3NzE1MywyOCAxOSwyNy41NTIyODQ3IDE5LDI3IEMxOSwyNi40NDc3MTUzIDE5LjQ0NzcxNTMsMjYgMjAsMjYgTDI4LjA4NTc4NjQsMjYgTDI1LjI5Mjg5MzIsMjMuMjA3MTA2OCBDMjQuOTAyMzY4OSwyMi44MTY1ODI1IDI0LjkwMjM2ODksMjIuMTgzNDE3NSAyNS4yOTI4OTMyLDIxLjc5Mjg5MzIgQzI1LjY4MzQxNzUsMjEuNDAyMzY4OSAyNi4zMTY1ODI1LDIxLjQwMjM2ODkgMjYuNzA3MTA2OCwyMS43OTI4OTMyIEwzMS4yMDcxMDY4LDI2LjI5Mjg5MzIgQzMxLjU5NzYzMTEsMjYuNjgzNDE3NSAzMS41OTc2MzExLDI3LjMxNjU4MjUgMzEuMjA3MTA2OCwyNy43MDcxMDY4IEwyNi43MDcxMDY4LDMyLjIwNzEwNjggQzI2LjMxNjU4MjUsMzIuNTk3NjMxMSAyNS42ODM0MTc1LDMyLjU5NzYzMTEgMjUuMjkyODkzMiwzMi4yMDcxMDY4IEMyNC45MDIzNjg5LDMxLjgxNjU4MjUgMjQuOTAyMzY4OSwzMS4xODM0MTc1IDI1LjI5Mjg5MzIsMzAuNzkyODkzMiBMMjguMDg1Nzg2NCwyOCBaIiBpZD0iU1dBUC1JQ09OIj48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAADcmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmFjOGVjNDFhLTZkYWItODQ0Ni04YzkzLWU1Mjk3N2YwMmE4NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFRThCNzU3NDYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFRThCNzU3MzYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cykiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0OWFlZmI1OC00ZWFmLWQ3NDgtYTI0ZS0zNmNhNGQ2M2QwNTYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6N0MwQkFBM0M2MjAxMTFFNUI4QjBERTk4MjY5MjQwQjUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6MGSVVAAAE3klEQVR42uycW4hWVRiG15Q4eYzGQySSQlriEQ9BF2mE4iSdESRRIb0RD+mNmHgICjqQEGUe6sqgCy1i0iRinAzELrooQhHLGQURUTzMiM7omCLj+/F/czX/t/890z6s9e/3hZcZ1l6z19r7mXXca62arq4uR/mjh/gKCIQiEAKhCIRAKAIhEIpACIQiEIpACIQiEAKhCIRAKAIhEMoX9Yu62NbWxjcUobq6OpaQQpcQz/QwPBOeDU+Fx8Oj4UfhoRrnJnwDvgC3wCfgY/Bf8P0QHrImahmQB1VWLfwGvAieqy+/LxJIR+Dv4QPwf75WWb4CGQavg9fo70mqFd4F79DfCSRCA+HN8Hp4cMppdcBfwB/Bt9mo99Sr8Cl4SwYwnKYhaf2jaXMconoE/hL+CR6TQ/pPato7NS+FbtSfgH+Gp8eMfwv+HT6qpakZvqzVT/d//ePw0/BEeI72ygbFvP/f8MvwpSK2IfLSGuGxFeJ1aby98CG4s5fpDNAqaTlcL89cIf45jddcpDZknI4PKsFo0NKzQLusnX1Iq1P/doHe60CF+GM1b+OK0obIYO5XeGREnLPwfHghfDzBtOVeb+q9z0bEG6njltHVDqQ2RuP9HTwDbkoxH02axv4YjX1tNQP5LKIBl7ZiK/yWToGkLUljsaZpNaTTNc9VCeR1eHUEjHfgD3OoQiXNVRFQVmveqwrIEHh3xPXNOp2Rl77WPFiSvA+tJiCb4FHGNanHP/FggCp52Gdck7y/Wy0Dw2Hatx9s9KZmZNRmxC3JMjh8qsy1Du0St4Y+DomaKFzlEQxRu+apnOQZ1oVeZfWPeMCGlLu2/6dL3BDRwPcPGYiMjocbvaoPnL963+h1DddnChbIMiP8cMIj8KQln34be/lM3gOREW69cW2v81/fGOH1aY7e0wTyrNGYyxT6wQCAHNS8lmvcZ4UIZL4RLt8z7gQA5I7mtZyeCxHIS0b4UReOrLw+EyIQqxScDAiIldcJIQLZYTTmvwUEpMUIHxMikB/gta40PXIF/lwHVrcCAnLVCH8srQR9X7mYt2RUbq1yrOFia390N9SReugaYoR3EEg+GmGEtxNIPhpvhJ8nkHw02Qj/l0Dy0Rwj/DSBZC9ZeD3buPYHgWSv11z5RdrSw/qTQLLX20Z4o0toSxyBxJdsKrVmq79NM2ECKa/3XPltC9fgXwgkW81zpVX35fSVS3HahEB6SqZK9hjXujeJOgLJTrLG19qos1OrLALJSLL+eLFx7SL8cRaZIJCSVrrSfnVL8qHtJoFkoy3ablibQeWz849ZZaZfgUHIfg/Z97EkIs5xLR2OQNLv2u5x0Ttt5UShV1wfj91glRVP01xp8UVTBRiyuOFFheJYQpKVzNrKwQErXPyDA2SF+5k8MhsykCnwPdfzaA3ZYy6nREyCX4Cfd/EPs+nV0RoEUlqWsx1eCie9Bkc2nW5wOa87Dg3Ipy75bWXntSd1yIcHDK1RT3KzTIcOBif6AqOo3d42HX/I0tZW3zIXWgnp68chmfaQjZxyoKac0bXNRxghlpCN2m1dpj/btXEfpD0uqYaua89Luq3dx8TKN3AeE1vt4mLrAohACIQiEAKhCIRAKAIhEIpACq7IqROKJYRA+AoIhCIQAqEIhEAoAiEQikCKrQcCDABHPgH2w7NQdAAAAABJRU5ErkJggg==", +"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4IDEyIiB3aWR0aD0iOCIgaGVpZ2h0PSIxMiI+DQoJPHRpdGxlPlRvLXF1aXo8L3RpdGxlPg0KCTxwYXRoIGQ9Ik0xLDEyYTEsMSwwLDAsMS0uNzA3LTEuNzA3TDQuNTg2LDYsLjI5MywxLjcwN0ExLDEsMCwwLDEsMS43MDcuMjkzTDcuNDE0LDYsMS43MDcsMTEuNzA3QTEsMSwwLDAsMSwxLDEyWiIgc3R5bGU9ImZpbGw6IzllYWViOSIvPg0KPC9zdmc+","data:image/svg+xml;base64,"+qh(c),"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA5LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDksMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbD0iI0RENEIzOCIgZD0iTTIxLjA0MSwyOXY5Ljg0NGMwLDUuNTA4LDQuNjkxLDkuOTczLDEwLjQ3OSw5Ljk3M2M1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTczVjI5SDIxLjA0MXoiLz4NCjxwYXRoIGZpbGw9IiNERDRCMzgiIGQ9Ik0yNi41NTgsMjl2LTcuNjg5YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MlYyOWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNFYyOUgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjEuMDQxLDI4LjIwNnY5Ljg0NWMwLDUuNTA2LDQuNjkxLDkuOTcxLDEwLjQ3OSw5Ljk3MWM1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTcxdi05Ljg0NUgyMS4wNDF6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjYuNTU4LDI4LjA0VjIwLjM1YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MnY3LjY4OWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNHY4LjA1NEgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRjA4RjgyIiBkPSJNMzQsMzYuMzY1YzAtMS4yODctMS4wNDQtMi4zMzEtMi4zMzEtMi4zMzFjLTEuMjg4LDAtMi4zMzIsMS4wNDQtMi4zMzIsMi4zMzENCgljMCwwLjk3MSwwLjU5NCwxLjgwMiwxLjQzOCwyLjE1MnY0LjQ2N2gxLjkxdi00LjUyOUMzMy40NjEsMzguMDc2LDM0LDM3LjI4NywzNCwzNi4zNjV6Ii8+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA4LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDgsMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik01OS42NDYsMzFoLTMuMjkzQzU2LjE1OCwzMSw1NiwzMS40NDgsNTYsMzINCgljMCwwLjU1MywwLjE1OCwxLDAuMzU0LDFoMy4yOTNDNTkuODQyLDMzLDYwLDMyLjU1Myw2MCwzMkM2MCwzMS40NDgsNTkuODQyLDMxLDU5LjY0NiwzMXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjREQ0QjM4IiBkPSJNNi42NDcsMzFIMy4zNTNDMy4xNTgsMzEsMywzMS40NDgsMywzMmMwLDAuNTUzLDAuMTU4LDEsMC4zNTMsMQ0KCWgzLjI5NEM2Ljg0MiwzMyw3LDMyLjU1Myw3LDMyQzcsMzEuNDQ4LDYuODQyLDMxLDYuNjQ3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik0zMSw4YzAuNTUzLDAsMS0wLjE1OCwxLTAuMzUzVjQuMzUzQzMyLDQuMTU4LDMxLjU1Myw0LDMxLDQNCgljLTAuNTUyLDAtMSwwLjE1OC0xLDAuMzUzdjMuMjk0QzMwLDcuODQyLDMwLjQ0OCw4LDMxLDh6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTMxLDU2Yy0wLjU1MiwwLTEsMC4xNTgtMSwwLjM1NHYzLjI5M0MzMCw1OS44NDIsMzAuNDQ4LDYwLDMxLDYwDQoJYzAuNTUzLDAsMS0wLjE1OCwxLTAuMzU0di0zLjI5M0MzMiw1Ni4xNTgsMzEuNTUzLDU2LDMxLDU2eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik00Ny42NjgsMzFoLTEyLjgxQzM0LjQ5NiwyOS42LDMzLjQsMjguNTA1LDMyLDI4LjE0Mg0KCWMwLDAtMC4xNzItMC4xNDItMS0wLjE0MmMtMC44MjksMC0yLDAuNTU1LTIsMC41NTVjLTEuMTksMC42OTMtMiwxLjk2OS0yLDMuNDQ1YzAsMi4yMDksMS43OTEsNCw0LDRjMS40NzcsMCwyLjc1Mi0wLjgwOSwzLjQ0NS0yDQoJaDEzLjIyM0M0OC40MDQsMzQsNDksMzMuMzI4LDQ5LDMyLjVDNDksMzEuNjcyLDQ4LjQwNCwzMSw0Ny42NjgsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTI3LjAxOCwyOS43NDhjMC41OTIsMS4wMjUsMS42NTIsMS41MiwyLjM3LDEuMTA2bDAsMA0KCWMwLjcxNy0wLjQxNSwwLjgxOS0xLjU4MSwwLjIyOC0yLjYwNmwtNy44NTctMTMuNjA5Yy0wLjU5Mi0xLjAyNC0xLjY1My0xLjUyLTIuMzcxLTEuMTA2bDAsMGMtMC43MTcsMC40MTUtMC44MTgsMS41ODEtMC4yMjgsMi42MDUNCglMMjcuMDE4LDI5Ljc0OHoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMjcuMDE4LDI4LjM2MWMwLjU5MiwxLjAyNSwxLjY1MiwxLjUyLDIuMzcsMS4xMDZsMCwwDQoJYzAuNzE3LTAuNDE1LDAuODE5LTEuNTgxLDAuMjI4LTIuNjA2bC03Ljg1Ny0xMy42MDljLTAuNTkyLTEuMDI0LTEuNjUzLTEuNTItMi4zNzEtMS4xMDZsMCwwYy0wLjcxNywwLjQxNS0wLjgxOCwxLjU4MS0wLjIyOCwyLjYwNQ0KCUwyNy4wMTgsMjguMzYxeiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgY3g9IjMxIiBjeT0iMzEiIHI9IjQiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNjAsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzU0LDFoLTMuMjkzQzU2LjE1OCwzMiw1NiwzMS41NTIsNTYsMzENCglsMCwwYzAtMC41NTIsMC4xNTgtMSwwLjM1NC0xaDMuMjkzQzU5Ljg0MiwzMCw2MCwzMC40NDgsNjAsMzFMNjAsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTcsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzUzLDFIMy4zNTNDMy4xNTgsMzIsMywzMS41NTIsMywzMWwwLDANCgljMC0wLjU1MiwwLjE1OC0xLDAuMzUzLTFoMy4yOTRDNi44NDIsMzAsNywzMC40NDgsNywzMUw3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0zMSwzYzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDYuODQyLDMxLjU1Myw3LDMxLDdsMCwwDQoJYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1M1YzLjM1M0MzMCwzLjE1OCwzMC40NDgsMywzMSwzTDMxLDN6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTMxLDU1YzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDU4Ljg0MiwzMS41NTMsNTksMzEsNTkNCglsMCwwYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1NHYtMy4yOTRDMzAsNTUuMTU4LDMwLjQ0OCw1NSwzMSw1NUwzMSw1NXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNDksMzEuNDk5QzQ5LDMwLjY3Miw0OC40MDQsMzAsNDcuNjY4LDMwSDM0LjMzMw0KCUMzMy41OTYsMzAsMzMsMzAuNjcxLDMzLDMxLjVsMCwwYzAsMC44MjgsMC41OTYsMS41LDEuMzMzLDEuNWgxMy4zMzVDNDguNDA0LDMzLDQ5LDMyLjMyOCw0OSwzMS40OTlMNDksMzEuNDk5eiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YxNjE1NSIgY3g9IjMxIiBjeT0iMzEiIHI9IjIiLz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRjhCNDUwIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGQ0U2RCIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA4LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDgsMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGNEE2M0MiIGQ9Ik0zMS41MTQsMTNDMjUuNzA0LDEzLDIxLDE3Ljc0NiwyMSwyMy42MTMNCgljMCw0LjY2LDIuOTc2LDguNjI5LDcuMTEzLDEwLjAzOHYxOS4yMTRMMzEuNDg2LDU2TDM0LDUzdi0xbC0xLjA5OC0xLjQzN0wzNSw0OXYtMWwtMi0ydi0xbDItMXYtMWwtMi0xbDItNHYtNA0KCWM0LjA1My0xLjQ2Nyw3LTUuNzg0LDctMTAuMzg3QzQyLDE3Ljc0NiwzNy4yOTUsMTMsMzEuNTE0LDEzeiBNMjksNTFWMzRoMXYxOEwyOSw1MXogTTMxLjUsMjNjLTEuOTIxLDAtMy41LTEuNTUyLTMuNS0zLjQ4Mw0KCUMyOCwxNy41NTIsMjkuNTc4LDE2LDMxLjUsMTZjMS45MjIsMCwzLjUsMS41NTIsMy41LDMuNTE3QzM1LDIxLjQ0OCwzMy40MjIsMjMsMzEuNSwyM3oiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMzEuNTE0LDEyQzI1LjcwNCwxMiwyMSwxNi43NDYsMjEsMjIuNjEzDQoJYzAsNC42NiwyLjk3Niw4LjYyOSw3LjExMywxMC4wMzh2MTkuMjE0TDMxLjQ4Niw1NUwzNCw1MnYtMWwtMS4wOTgtMS40MzdMMzUsNDh2LTFsLTItMnYtMWwyLTF2LTFsLTItMWwyLTR2LTQNCgljNC4wNTMtMS40NjcsNy01Ljc4NCw3LTEwLjM4N0M0MiwxNi43NDYsMzcuMjk1LDEyLDMxLjUxNCwxMnogTTI5LDUwVjMzaDF2MThMMjksNTB6IE0zMS41LDIyYy0xLjkyMSwwLTMuNS0xLjU1Mi0zLjUtMy40ODMNCglDMjgsMTYuNTUyLDI5LjU3OCwxNSwzMS41LDE1YzEuOTIyLDAsMy41LDEuNTUyLDMuNSwzLjUxN0MzNSwyMC40NDgsMzMuNDIyLDIyLDMxLjUsMjJ6Ii8+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNzJweCIgaGVpZ2h0PSI3MnB4IiB2aWV3Qm94PSIwIDAgMTQyLjIyIDE0Mi4yMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTQyLjIyIDE0Mi4yMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8Y2lyY2xlIG9wYWNpdHk9IjAuNDMiIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBjeD0iNzEuMTEiIGN5PSI3MS4xMSIgcj0iNzEuMTEiLz4NCjxwb2x5Z29uIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBwb2ludHM9IjU0LjQyMywxMDQuNTk0IDEwNS43OTgsNzAuNzc0IDU0LjQyMywzNy42MjYgIi8+DQo8L3N2Zz4=", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACHDwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKNWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAASMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEoqGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAGeIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gzSZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25qbc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9CvjcM4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjKuLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqxOPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIWiAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFVSAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAyrA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYghUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7rh2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SEdJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3JaSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQtlHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJy5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hopb2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsyu21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCccNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527PYS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOwEaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6sfaznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy+rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVsS1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9UxlfeqXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/wjowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9Vt1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503rm10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7Pnl/eriQvLDwG/eE8/s6uL5TAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAAGnRFWHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS4xMDD0cqEAAABfSURBVChTY/j//z8DMZgoRSCD4ApLK6rYgLgDiJ9CMYjNBrMNWWHnvAUL/3/4+BGMQWygwk5sCp+CFMDAhw8fQAqfYlcIlCRGYeeceQv+g0wCYRAbl9XEeYZQWBIdjgCVaiC8JN1udgAAAABJRU5ErkJggg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAACuSURBVHicY/n//z8DCLh7+/sAqWIgNmGAgDNA3Ltz68YtIA4LVFELkKpmQAUOIAyUawUqrmEBMnyxKEIG1UA1J0EmFsFELC3MGfJzssDsSVOnMxw7fgImVQRSaAzjgRQJCgqA2XnZmcgKjVnwWIkCWKC+cwRxJk6eypCfm80AYyOBMyCF/TCFx0+eAmMsoJ8F6PXNoCBgwO1zUPBsBrsRFE5AxSCXFzKgBng/LMABrBM9cyiwScIAAAAASUVORK5CYII=", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAZCAYAAABtnU33AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAETSURBVHic7ZgxCsJAFAUXSaeIpScQDyCCguA5rEUQEbWzsvACKhICaquHUQu18hxi6vgebCSgwSb5C2sGhpBkIX+aZIkTBIHS1OAI1mFR2cEDHuEKnnnB0TeGcAlzZuZKjTKswA4cwzWDW8rO2ChsY+OFwVNld2wIG6cMbpqeRJAmg0umpxCk5PxeYxdZsO1kwbaTBdvOXwb7MG96ECF8Bt9gw/QkQlwZ7Kr/CXYZvIdt2DU7S+rs4CF8afXgCU5g1dhI6XCHC7jlSRjM/zwbbUGbJDPY/7HGg/OEn/vUvvn2WfpYlAADfYyL9vSaIOZ+Ykh9hxkSFy0WSyQ3Ht+iRWOJ9E4rGq2UcCwxsbWMRovGkhc6FTEV3QXLmAAAAABJRU5ErkJggg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAElJREFUSEvt0qERAEAIA0H6b5rXL1ecI5qQOcIsanB+3TC5egZOyJm9B2Zgw0EnF+AeekPC+S3tGTjhoJMLcA+9IeG89+6L04QHtFKarLFAHLUAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAFBJREFUSEvtkjEKADAIA/PpQunnWzo63nBbBDdjOGPWPpd0yPCf5YLo5TNgB52Z54AZsKDQygVwDr5A4RxLfQbsUGjlAjgHX6Bw9r394KjDAzeSX574b7LUAAAAAElFTkSuQmCC", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NzA3MjgiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjMzNjc2NjQiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjkxNDI4IDAuNjkxNDI4LDAuNjkxNDI4IDAuNjkxNDI4LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTcwNzA0IiBjbGFzcz0iZmlsMSIgZD0iTTAuMzQ1NzM2IDAuMTU3MTg4bC0wLjEyNTcyMiAwLjA5NDI2NDkgLTAuMDk0MzAwNiAwIDAgMC4xODg1ODMgMC4wOTQzMDA2IDAgMC4xMjU3MjIgMC4wOTQyNjQ5IDAgLTAuMzc3MTEzem0wLjE1NzExNyAtMi42NzI2N2UtMDA1bDAuMDMxNDMwNiAwIDAgMC4zNzcxNCAtMC4wMzE0MzA2IDAgMCAtMC4zNzcxNHptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjI1MTQwOSAtMC4wMzE0MzA2IDAgMCAtMC4yNTE0MDl6bS0wLjA2Mjg0MzMgMC4wNjI4NjExbDAuMDMxNDMwNiAwIDAgMC4xMjU2ODcgLTAuMDMxNDMwNiAwIDAgLTAuMTI1Njg3eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NjkwMjQiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjE5NjkyNDAiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjQzNjE2IDAuNjQzNjE2LDAuNjQzNjE2IDAuNjQzNjE2LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY5MDAwIiBjbGFzcz0iZmlsMSIgZD0iTTAuMzIxODM3IDAuMTQ2MzAybC0wLjExNzAyOSAwLjA4Nzc0NjYgLTAuMDg3Nzc5NyAwIDAgMC4xNzU1NDMgMC4wODc3Nzk3IDAgMC4xMTcwMjkgMC4wODc3NDY2IDAgLTAuMzUxMDM2em0wLjI3NzkwMSAwLjI1MDcyNmwtMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjA5MzA4NzIgLTAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjAyMDY5MDYgLTAuMDIwNjkwNiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAwLjAyMDY5MDYgLTAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MnoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxwYXRoIGNsYXNzPSJmaWwwIiBkPSJNLTAgMC4yNzExMDFsMCAxLjczOTM1YzAsMC4xNDkxMTMgMC4xMjE5ODgsMC4yNzExMDEgMC4yNzExMDEsMC4yNzExMDFsMy4xNTEzMSAwIDAgLTIuMjgxNTUgLTMuMTUxMzEgMGMtMC4xNDkxMTMsMCAtMC4yNzExMDEsMC4xMjE5ODggLTAuMjcxMTAxLDAuMjcxMTAxeiIvPg0KICA8cG9seWdvbiBjbGFzcz0iZmlsMSIgcG9pbnRzPSIxLjQwOTIsMC42NzEwMzggMi4wODAyOCwxLjE0MDc3IDEuNDA5MiwxLjYxMDUxICIvPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIxOTY2NTUyIj4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NzY4IiBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMzIzOTU2bDAgMi4wNzg0NmMwLDAuMTc4MTg1IDAuMTQ1NzcxLDAuMzIzOTU2IDAuMzIzOTU2LDAuMzIzOTU2bDMuNzY1NzEgMCAwIC0yLjcyNjM4IC0zLjc2NTcxIDBjLTAuMTc4MTg1LDAgLTAuMzIzOTU2LDAuMTQ1NzcxIC0wLjMyMzk1NiwwLjMyMzk1NnoiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NTI4IiBjbGFzcz0iZmlsMSIgZD0iTTEuNjAzOCAwLjg4MjAzOGwwLjMyMDc1MSAwIDAgMC45NjIyNTQgLTAuMzIwNzUxIDAgMCAtMC45NjIyNTR6bTAuNTYxMzMyIDBsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAhCAYAAAAYucG/AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAA+SURBVHicY/H09pViYQACFi4uLgYWbm5uOAHncsG4/Pz8xKv79u0bA8vXr1/hBJz7Dcb9+PEjIXVzZs18BgAgpy6CcHz1VgAAAABJRU5ErkJggg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsLW9wYWNpdHk9IjAiIGQ9Ik01MSw0LjA0MXYyNS45MThDNTEsMzIuMTgyLDQ5LjE4MiwzNCw0Ni45NiwzNEgwVjBoNDYuOTZDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDENCgkJCUw1MSw0LjA0MXoiLz4NCgkJPHBhdGggaWQ9Il8xMjMzNzQxNDQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xOCwxNS43MzdsMi41MjYtMi41MjZsMy4zNjksMy4zNjlsMS42ODQtMS42ODVsLTMuMzY4LTMuMzY4TDI0LjczNiw5aC01LjA1M0gxOHYxLjY4NA0KCQkJVjE1LjczN3ogTTM0LDE4LjI2NGwtMi41MjcsMi41MjVsLTMuMzY4LTMuMzY4bC0xLjY4NSwxLjY4NWwzLjM2OSwzLjM2N0wyNy4yNjMsMjVoNS4wNTNIMzR2LTEuNjg1VjE4LjI2NHoiLz4NCgk8L2c+DQo8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMTAyIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjRkVGRUZFIiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMDUxIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjOTY5Njk2IiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTNweCIgaGVpZ2h0PSIyMXB4IiB2aWV3Qm94PSIwIDAgMTMgMjEiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5CYWNrLUFycm93PC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9ImlQaG9uZS1YLUNvdXJzZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyLjAwMDAwMCwgLTU2LjAwMDAwMCkiIGZpbGw9IiMzREEwRTEiPgogICAgICAgICAgICA8cGF0aCBkPSJNMjEuOTA2MzgyOCw1Ni45ODk5NDk1IEwxMiw2Ni41IEwyMS45MDYzODI4LDc2LjAxMDA1MDUgQzIyLjQ4MjU4NSw3Ni41NjMyMDAyIDIzLjM5MjU5Miw3Ni41NjMyMDAyIDIzLjk2ODc5NDMsNzYuMDEwMDUwNSBMMjMuOTY4Nzk0Myw3Ni4wMTAwNTA1IEMyNC41MTU1MjgzLDc1LjQ4NTE5MDEgMjQuNTMzMjYwMyw3NC42MTY0OTEyIDI0LjAwODM5OTksNzQuMDY5NzU3MiBDMjMuOTk1NDY4OSw3NC4wNTYyODcyIDIzLjk4MjI2NDIsNzQuMDQzMDgyNiAyMy45Njg3OTQzLDc0LjAzMDE1MTUgTDE2LjEyNDgyMjksNjYuNSBMMjMuOTY4Nzk0Myw1OC45Njk4NDg1IEMyNC41MTU1MjgzLDU4LjQ0NDk4ODEgMjQuNTMzMjYwMyw1Ny41NzYyODkyIDI0LjAwODM5OTksNTcuMDI5NTU1MiBDMjMuOTk1NDY4OSw1Ny4wMTYwODUyIDIzLjk4MjI2NDIsNTcuMDAyODgwNiAyMy45Njg3OTQzLDU2Ljk4OTk0OTUgTDIzLjk2ODc5NDMsNTYuOTg5OTQ5NSBDMjMuMzkyNTkyLDU2LjQzNjc5OTggMjIuNDgyNTg1LDU2LjQzNjc5OTggMjEuOTA2MzgyOCw1Ni45ODk5NDk1IFoiIGlkPSJCYWNrLUFycm93Ij48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4="]; +c=".popup-layer {top: 0;right: 0;bottom: 0;left: 0;z-index: 1;position: absolute;border-radius: inherit; }.modal-layer {background: #000000;opacity: 0.4;position: absolute;width: 100%;height: 100%;border-radius: inherit; }:root {--page-background-color: __pageBackground__;--button-background-color: __primaryButtonBackground__;--button-hover-background-color: __primaryButtonBackgroundHover__;--button-hover-text-color: __primaryButtonTextHover__;--button-text-color: __primaryButtonText__;--company-logo-background-color: __asideLogoBackground__;--hyperlink-text-color: __hyperlink__;--list-item-background-hover-color: __asideElementBackgroundHover__;--list-item-border-color: __outlineItemBorder__;--list-item-background-pressed-color: __asideElementBackgroundActive__;--list-item-text-hover-color: __asideElementTextHover__;--list-item-text-pressed-color: __asideElementTextActive__;--list-item-text-visited-color: __asideElementTextVisited__;--list-item-icon-fill-color: __itemsListIconFill__;--list-item-order-color: __itemsListOrder__;--list-item-icon-stroke-color: __itemsListIconStroke__;--list-item-icon-color: __itemsListIcon__;--panel-color: __asideBackground__;--panel-text-color: __asideElementText__;--panel-video-stub-background-color: __panelVideoStubBackgroundColor__;--panel-video-stub-color: __panelVideoStubColor__;--player-background-color: __playerBackground__;--progressbar-background-color: __progressBackground__;--progressbar-playback-color: __progressPlayback__;--slide-border-color: __slideBorder__;--text-color: __playerText__;--topbar-hover-background-color: __secondaryButtonBackgroundHover__;--topbar-text-color: __secondaryButtonText__;--primary-button-text-color: __primaryButtonText__;--primary-button-text-color-active: __primaryButtonTextHover__;--primary-button-background-color-active: __primaryButtonBackgroundHover__;--primary-button-background-color: __primaryButtonBackground__;--primary-button-border-color: __primaryButtonBorder__;--primary-button-border-color-active: __primaryButtonBorderHover__;--secondary-button-background-color: __secondaryButtonBackground__;--secondary-button-background-color-active: __secondaryButtonBackgroundHover__;--secondary-button-text-color: __secondaryButtonText__;--secondary-button-text-color-active: __secondaryButtonTextHover__;--secondary-button-border-color: __secondaryButtonBorder__;--secondary-button-border-color-active: __secondaryButtonBorderHover__;--volume-control-background-color: __volumeControlBackgroundColor__;--volume-control-playback-color: __volumeControlPlaybackColor__;--volume-control-thumb-color: __volumeControlThumbColor__;--more-menu-volume-control-background-color: __moreMenuVolumeControlBackgroundColor__;--more-menu-volume-control-playbackColor: __moreMenuVolumeControlPlaybackColor__;--more-menu-volume-control-thumb-color: __moreMenuVolumeControlThumbColor__;--popup-background-color: __popupBackground__;--popup-transparent-background-color: __transparentPopupBackground__;--popup-border: __popupBorder__;--popup-background-hover-color: __popupBackgroundHover__;--popup-text-color: __popupText__;--popup-text-hover-color: __popupTextHover__;--link-button-background-color: transparent;--link-button-text-color: __linkButtonTextColor__;--player-text: __playerText__;--button-border-radius: __borderRadius__;--presenter-info-link-border-color: __presenterInfoLinkBorderColor__;--search-field-background-color: __searchFieldBackgroundColor__;--hovered-tab-background-color: __hoveredTabBackgroundColor__;--selected-tab-background-color: __selectedTabBackgroundColor__;--top-panel-icon-container-color: __topPanelIconContainerColor__;--top-panel-icon-color: __topPanelIconColor__;--mini-skin-menu-button-text: __miniSkinMenuButtonText__;--mini-skin-menu-button-background-active: __miniSkinMenuButtonBackgroundActive__;--mini-skin-top-bottom-panel-border: __miniSkinTopBottomPanelBorder__;--mini-skin-presenter-delimiter-color: __miniSkinPresenterDelimiterColor__;--top-bottom-panel-border-color: __topBottomPanelBorderColor__; }:root {--page-background-color: __pageBackground__;--button-background-color: __primaryButtonBackground__;--button-hover-background-color: __primaryButtonBackgroundHover__;--button-hover-text-color: __primaryButtonTextHover__;--button-text-color: __primaryButtonText__;--company-logo-background-color: __asideLogoBackground__;--hyperlink-text-color: __hyperlink__;--list-item-background-hover-color: __asideElementBackgroundHover__;--list-item-border-color: __outlineItemBorder__;--list-item-background-pressed-color: __asideElementBackgroundActive__;--list-item-text-hover-color: __asideElementTextHover__;--list-item-text-pressed-color: __asideElementTextActive__;--list-item-text-visited-color: __asideElementTextVisited__;--list-item-icon-fill-color: __itemsListIconFill__;--list-item-order-color: __itemsListOrder__;--list-item-icon-stroke-color: __itemsListIconStroke__;--list-item-icon-color: __itemsListIcon__;--panel-color: __asideBackground__;--panel-text-color: __asideElementText__;--panel-video-stub-background-color: __panelVideoStubBackgroundColor__;--panel-video-stub-color: __panelVideoStubColor__;--player-background-color: __playerBackground__;--progressbar-background-color: __progressBackground__;--progressbar-playback-color: __progressPlayback__;--slide-border-color: __slideBorder__;--text-color: __playerText__;--topbar-hover-background-color: __secondaryButtonBackgroundHover__;--topbar-text-color: __secondaryButtonText__;--primary-button-text-color: __primaryButtonText__;--primary-button-text-color-active: __primaryButtonTextHover__;--primary-button-background-color-active: __primaryButtonBackgroundHover__;--primary-button-background-color: __primaryButtonBackground__;--primary-button-border-color: __primaryButtonBorder__;--primary-button-border-color-active: __primaryButtonBorderHover__;--secondary-button-background-color: __secondaryButtonBackground__;--secondary-button-background-color-active: __secondaryButtonBackgroundHover__;--secondary-button-text-color: __secondaryButtonText__;--secondary-button-text-color-active: __secondaryButtonTextHover__;--secondary-button-border-color: __secondaryButtonBorder__;--secondary-button-border-color-active: __secondaryButtonBorderHover__;--volume-control-background-color: __volumeControlBackgroundColor__;--volume-control-playback-color: __volumeControlPlaybackColor__;--volume-control-thumb-color: __volumeControlThumbColor__;--more-menu-volume-control-background-color: __moreMenuVolumeControlBackgroundColor__;--more-menu-volume-control-playbackColor: __moreMenuVolumeControlPlaybackColor__;--more-menu-volume-control-thumb-color: __moreMenuVolumeControlThumbColor__;--popup-background-color: __popupBackground__;--popup-transparent-background-color: __transparentPopupBackground__;--popup-border: __popupBorder__;--popup-background-hover-color: __popupBackgroundHover__;--popup-text-color: __popupText__;--popup-text-hover-color: __popupTextHover__;--link-button-background-color: transparent;--link-button-text-color: __linkButtonTextColor__;--player-text: __playerText__;--button-border-radius: __borderRadius__;--presenter-info-link-border-color: __presenterInfoLinkBorderColor__;--search-field-background-color: __searchFieldBackgroundColor__;--hovered-tab-background-color: __hoveredTabBackgroundColor__;--selected-tab-background-color: __selectedTabBackgroundColor__;--top-panel-icon-container-color: __topPanelIconContainerColor__;--top-panel-icon-color: __topPanelIconColor__;--mini-skin-menu-button-text: __miniSkinMenuButtonText__;--mini-skin-menu-button-background-active: __miniSkinMenuButtonBackgroundActive__;--mini-skin-top-bottom-panel-border: __miniSkinTopBottomPanelBorder__;--mini-skin-presenter-delimiter-color: __miniSkinPresenterDelimiterColor__;--top-bottom-panel-border-color: __topBottomPanelBorderColor__; }@keyframes preloader_spin {0% {transform: rotate(0deg); } 100% {transform: rotate(360deg); } }html,body {background-color: var(--page-background-color) !important; }.universal_mini {overflow: hidden;background: var(--player-background-color); } .universal_mini div {-webkit-tap-highlight-color: rgba(0, 0, 0, 0);-webkit-user-select: none;-ms-user-select: none;user-select: none;-webkit-touch-callout: none;-webkit-user-drag: none; } .universal_mini .launch-screen {z-index: 100;position: fixed;top: 0;right: 0;bottom: 0;left: 0;background-color: rgba(0, 0, 0, 0.48); } .universal_mini .launch-screen .launch-screen-button {top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 96px;height: 96px;position: absolute; } .universal_mini .launch-screen .launch-screen-button__play-icon {background-color: #FFFFFF;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 90px;height: 90px;box-shadow: 0 12px 50px 0 rgba(0, 0, 0, 0.2);transition: 0.3s ease-in-out; } .universal_mini .launch-screen .launch-screen-button__icon {background: url("+ +c[0]+") no-repeat center;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 6px;width: 90px;height: 90px; } .universal_mini .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__play-icon {width: 96px;height: 96px; } .universal_mini .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__icon {background: url("+c[1]+") no-repeat center; } .universal_mini .playerView {-ms-transform: translateX(0);transform: translateX(0); } .universal_mini.not_loaded .top-panel, .universal_mini.not_loaded .bottom-panel, .universal_mini.not_loaded .landscape-bottom-panel {display: none; } .universal_mini:not(.landscape) .landscape-bottom-panel {display: none; } .universal_mini.landscape > .bottom-panel {display: none; } .universal_mini.landscape > .top-panel {display: none !important; } .universal_mini.landscape.quiz_mode .top-panel, .universal_mini.landscape.quiz_mode .landscape-bottom-panel {display: initial; } .universal_mini.landscape.quiz_mode > .bottom-panel {display: none; } .universal_mini > .top-panel {width: 100%;background: var(--player-background-color);position: absolute;box-sizing: border-box;box-shadow: 0 1px 0 var(--mini-skin-top-bottom-panel-border);height: 52px;top: 0; } .universal_mini > .top-panel::before, .universal_mini > .top-panel::after {top: 100%; } .universal_mini > .top-panel .menu {cursor: pointer;position: absolute;top: 6px;right: 12px;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: center;align-items: center;padding: 8px;background: transparent;color: var(--mini-skin-menu-button-text);border-radius: var(--button-border-radius); } .universal_mini > .top-panel .menu.menu_active {background: var(--mini-skin-menu-button-background-active);color: var(--text-color); } .universal_mini > .top-panel .slide-info {font-family: var(--font-family-bold);width: 100%;position: absolute;font-size: 17px;line-height: 52px;text-align: center;color: var(--text-color);text-overflow: ellipsis;overflow: hidden;white-space: nowrap;z-index: 1;pointer-events: none; } .universal_mini > .bottom-panel {width: 100%;background: var(--player-background-color);position: absolute;box-sizing: border-box;bottom: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;padding: 0 12px;height: 56px;top: auto; } .universal_mini > .bottom-panel .navigation-controls {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .universal_mini > .bottom-panel > button:not(:first-child) {margin-left: 12px; } .universal_mini > .bottom-panel .navigation-controls {margin-left: auto; } .universal_mini > .bottom-panel .navigation-controls button:not(:first-child) {margin-left: 12px; } .universal_mini > .bottom-panel.bottom-panel_with-border {border-top: 1px solid var(--mini-skin-top-bottom-panel-border); } .universal_mini > .bottom-panel .rate-menu-popup {background: var(--popup-background-color);border: 1px solid var(--popup-border);box-shadow: 0 20px 32px rgba(0, 0, 0, 0.16);-webkit-backdrop-filter: blur(8px);backdrop-filter: blur(8px);border-radius: 10px;position: absolute; } .universal_mini > .progress {position: absolute;top: auto;left: 0;height: 2px;background: var(--progressbar-background-color); } .universal_mini > .progress > .playback-progress {position: absolute;top: 0;left: 0;width: 0;height: 100%;background: var(--progressbar-playback-color); } .universal_mini > .landscape-bottom-panel {width: 100%;background: var(--player-background-color);position: absolute;box-sizing: border-box;bottom: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;right: 0;top: 0;width: 52px;-ms-flex-direction: column;flex-direction: column;align-items: center;padding: 16px 0;border-left: 1px solid rgba(97, 104, 112, 0.1); } .universal_mini > .landscape-bottom-panel .navigation-controls {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .universal_mini > .landscape-bottom-panel > button:not(:last-child) {margin-bottom: 12px; } .universal_mini > .landscape-bottom-panel .navigation-controls {margin-top: auto;-ms-flex-direction: column;flex-direction: column; } .universal_mini > .landscape-bottom-panel .navigation-controls button:not(:first-child) {margin-top: 12px; } .universal_mini > .landscape-bottom-panel .rate-menu-popup {background: var(--popup-background-color);border: 1px solid var(--popup-border);box-shadow: 0 20px 32px rgba(0, 0, 0, 0.16);-webkit-backdrop-filter: blur(8px);backdrop-filter: blur(8px);border-radius: 10px;position: absolute; } .universal_mini #playerView {border: 1px solid rgba(0, 0, 0, 0.04); } .universal_mini.quiz_mode {overflow: visible;height: auto !important; } .universal_mini.quiz_mode #playerView, .universal_mini.quiz_mode .video-container {display: none; } .universal_mini.quiz_mode.interaction_slide .bottom-panel {box-shadow: 0 -2px 12px 0 rgba(0, 0, 0, 0.1);position: fixed;bottom: 0 !important; } .universal_mini.quiz_mode.interaction_slide .bottom-panel .play, .universal_mini.quiz_mode.interaction_slide .bottom-panel .progress-bar {display: none; } .universal_mini.quiz_mode .top-panel {position: fixed;top: -1px;height: 52px; } .universal_mini.quiz_mode .top-panel .slide-info {top: 1px; } .universal_mini.quiz_mode .top-panel .menu.component_container {top: 1px;height: 52px; } .universal_mini, .universal_mini > div {position: absolute;top: 0; } .universal_mini .launch_layer {width: 100%;height: 100%;background: url("+ +c[0]+") no-repeat center;background-color: rgba(0, 0, 0, 0.75); } .universal_mini .launch_layer:active {background-image: url("+c[1]+"); } .universal_mini .launch_layer[disabled], .universal_mini .launch_layer:active[disabled] {background-image: none; } .universal_mini .video-container video {position: absolute; } .universal_mini .change-layout-button {width: 44px;height: 44px;border-radius: 100%;background: #333333;position: absolute;left: 10px;bottom: 10px;border: 1px solid rgba(255, 255, 255, 0.3);box-sizing: border-box; } .universal_mini .change-layout-button::after {content: '';position: absolute;width: 20px;height: 20px;background: url("+ +c[2]+");background-size: cover;margin: auto;top: 0;left: 0;bottom: 0;right: 0; } .universal_mini .preloader {width: 50px;height: 50px;position: absolute;top: 0;left: 0;bottom: 0;right: 0;margin: auto;border-radius: 10px;background-color: rgba(0, 0, 0, 0.5); } .universal_mini .preloader::after {content: '';position: absolute;background: url("+c[3]+");background-size: cover;top: 0;left: 0;bottom: 0;right: 0;animation: preloader_spin 1s infinite linear; } .universal_mini .menu_layer {position: absolute;background: var(--panel-color);z-index: 10;color: var(--panel-text-color); } .universal_mini .menu_layer .menu-layer-top-panel {position: absolute;height: 52px;display: block;z-index: 1; } .universal_mini .menu_layer .menu-layer-top-panel .tab-title {font-family: var(--font-family-bold);position: absolute;left: 0;top: 0;width: 100%;height: 52px;font-size: 18px;line-height: 52px;text-align: center;text-overflow: ellipsis;overflow: hidden;white-space: nowrap;pointer-events: none;padding: 0 64px;box-sizing: border-box; } .universal_mini .menu_layer .menu-layer-top-panel .search-button, .universal_mini .menu_layer .menu-layer-top-panel .close-button, .universal_mini .menu_layer .menu-layer-top-panel .back-button {position: absolute;top: 0;cursor: pointer; } .universal_mini .menu_layer .menu-layer-top-panel > .search-button, .universal_mini .menu_layer .menu-layer-top-panel > .close-button, .universal_mini .menu_layer .menu-layer-top-panel > .back-button {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;padding: 8px 8px;color: var(--top-panel-icon-color);background: transparent; } .universal_mini .menu_layer .menu-layer-top-panel > .search-button {top: 6px;left: 12px; } .universal_mini .menu_layer .menu-layer-top-panel > .close-button {top: 6px;right: 12px; } .universal_mini .menu_layer .menu-layer-top-panel > .back-button {top: 6px;left: 12px; } .universal_mini .menu_layer .menu-layer-top-panel.with_search .back {right: 44px; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel {position: absolute;background: var(--player-background-color);top: 0;right: 0;bottom: 0;left: 0;z-index: 1;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;padding: 8px 12px;box-shadow: 0 1px 0 var(--mini-skin-top-bottom-panel-border); } .universal_mini .menu_layer .menu-layer-top-panel .search_panel__cancel-button {cursor: pointer; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel__search-icon {width: 24px;height: 24px;margin: 6px 8px;color: var(--text-color);-ms-flex-negative: 0;flex-shrink: 0; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel__cancel-button {width: 24px;height: 24px;margin: 6px 8px;color: var(--text-color);-ms-flex-negative: 0;flex-shrink: 0; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel .search_input {font-family: var(--font-family-normal);-ms-flex-positive: 1;flex-grow: 1;border: none;height: 100%;font-size: 15px;line-height: 20px;color: var(--text-color);background: transparent;min-width: 0; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel .search_input:-ms-input-placeholder {opacity: 0.4; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel .search_input::placeholder {opacity: 0.4; } .universal_mini .menu_layer.tab_control .content.component_container {bottom: 56px; } .universal_mini .menu_layer.tab_control .bottom-panel {position: absolute;bottom: 0;height: 56px;background: var(--player-background-color);box-shadow: 0 -1px 0 var(--mini-skin-top-bottom-panel-border);box-sizing: border-box;padding: 7px 12px;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .universal_mini .menu_layer.tab_control .bottom-panel .menu-tab-button {font-family: var(--font-family-normal);cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: center;align-items: center;background: transparent;color: var(--text-color);font-size: 12px;line-height: 16px;opacity: 0.4; } .universal_mini .menu_layer.tab_control .bottom-panel .menu-tab-button[aria-selected='true'] {opacity: 1; } .universal_mini .menu_layer.tab_control .bottom-panel .menu-tab-button__text {margin-top: 2px; } .universal_mini .menu_layer .content.component_container {position: absolute;top: 64px;bottom: 0;width: 100%; } .universal_mini .menu_layer .content.component_container.animation .content.component_base > div {position: absolute; } .universal_mini .menu_layer .content.component_container .content.component_base {width: 100%;position: relative; } .universal_mini .menu_layer .content.component_container .content.component_base .search-result-layout .result-label {font-family: var(--font-family-bold);margin-top: 28px;margin-left: 20px;font-size: 16px;line-height: 22px;color: var(--panel-text-color); } .universal_mini .menu_layer .content.component_container .content.component_base .search-result-layout .no-matches-label {font-family: var(--font-family-normal);font-size: 15px;line-height: 20px;color: var(--panel-text-color);opacity: 0.6;text-align: center;margin-top: 80px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .separator {background: rgba(0, 0, 0, 0.08);position: relative;width: calc(100% - 20px);height: 1px;left: 10px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .separator:first-child {position: absolute;top: -1px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .separator:last-child {position: absolute;bottom: -1px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list {position: relative; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list.slides_list_highlight-visited .item.visited:not(.active):not(.selected) {color: var(--list-item-text-visited-color); } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative;min-height: 76px;color: var(--panel-text-color);margin-bottom: 1px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.level1 {padding-left: 24px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.level2 {padding-left: 48px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.level3 {padding-left: 72px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.level4 {padding-left: 96px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item .image {float: left;margin: 10px 16px 10px 20px;border-radius: 4px;border: 1px solid rgba(0, 0, 0, 0.04);box-sizing: content-box;max-height: 56px;max-width: 100px;-ms-flex-negative: 0;flex-shrink: 0; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item .text {font-family: var(--font-family-normal);position: relative;margin: 0;padding-right: 10px;padding-bottom: 1px;font-size: 14px;line-height: 18px;word-break: break-word;max-height: 54px;overflow: hidden;text-overflow: ellipsis;flex-grow: 1;display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item .text .highlighted {font-family: var(--font-family-bold); } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item .text .search-context {opacity: 0.6; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.text_only .text {padding-left: 13px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.active, .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.selected {background: var(--list-item-background-pressed-color);color: var(--list-item-text-pressed-color); } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.parent::before {content: '';position: absolute;top: 0;bottom: 0;right: 19px;width: 8px;height: 12px;margin: auto;background: url("+ +c[4]+");background-size: contain;background-repeat: no-repeat; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.parent .text {padding-right: 25px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: center;align-items: center; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .top-container {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: center;align-items: center;background-color: transparent;padding: 8px 24px 28px;margin: 0 24px;width: 100%;box-sizing: border-box; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .top-container .name, .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .top-container .job {word-wrap: break-word;position: relative;text-align: center; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .top-container .name {font-family: var(--font-family-bold);color: var(--panel-text-color);font-size: 24px;line-height: 28px;margin-bottom: 8px;margin-top: 16px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .top-container .job {font-family: var(--font-family-normal);color: var(--panel-text-color);opacity: 0.72;font-size: 14px;line-height: 18px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bottom-container {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: center;align-items: center;padding: 28px 0;margin: 0 24px;color: var(--panel-text-color);box-sizing: border-box;width: calc(100% - 48px);border-top: 1px solid var(--mini-skin-presenter-delimiter-color); } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bottom-container a {color: var(--panel-text-color); } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bottom-container .item {font-family: var(--font-family-normal);display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: flex-start;width: 100%;color: var(--panel-text-color); } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bottom-container .item .item-icon {margin-right: 8px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bottom-container .item .bottom-container-text {font-size: 15px;line-height: 20px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bottom-container .item:not(:last-child) {margin-bottom: 16px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .photo_container {position: relative;width: 80px;height: 80px;border-radius: 100%; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .name_photo_container {width: 75px;height: 75px;background: #9EAEB9;border-radius: 100%;left: 0;right: 0;margin: auto;margin-bottom: 10px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .name_photo_container .letter {font-size: 24px;line-height: 75px;text-align: center;color: #FFFFFF;font-family: Helvetica Neue, Helvetica, Roboto, Arial; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .no_presenter_container {margin-bottom: 10px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .no_presenter_photo {width: 106px;height: 134px;background: url("+ +c[5]+"); } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .no_presenter_label {position: relative;font-family: Helvetica Neue, Helvetica, Roboto, Arial;font-size: 15px;color: var(--panel-text-color);padding: 0 40px;text-align: center; } .universal_mini .menu_layer .content.component_container .content.component_base .notes {font-family: var(--font-family-normal);padding: 12px 24px;font-size: 15px;line-height: 20px;color: var(--panel-text-color);width: auto !important;white-space: pre-wrap;word-wrap: break-word; }body {margin: 0;padding: 0;cursor: default;-ms-touch-action: pan-y;touch-action: pan-y;overflow-y: auto; } body .info_panel {position: relative;top: 0;background: #FFFFFF;font-family: Helvetica, Roboto, Arial;padding-top: 161px;padding-bottom: 50px; } body .info_panel, body .info_panel * {box-sizing: border-box; } body .info_panel.domain::before {background: transparent url("+ +c[6]+") no-repeat center; } body .info_panel.time::before {background: transparent url("+c[7]+") no-repeat center; } body .info_panel.password::before {background: transparent url("+c[8]+") no-repeat center; } body .info_panel::before {position: absolute;width: 100%;top: 55px;height: 63px;content: ''; } body .info_panel .message {position: relative;color: #414A5B;font-size: 16px;padding-left: 15px;padding-right: 15px;text-align: center; } body .password .password_field {position: relative;margin-left: 20px;margin-right: 20px;padding-top: 23px;padding-bottom: 26px; } body .password .password_field input {position: relative;width: 100%;height: 34px;border: 1px solid #D6D6D6;border-top: 1px solid #BABABA;padding-left: 8px;font-size: 20px; } body .password .wrong_password_label {position: absolute;font-size: 12px;color: #DD4A37;left: 22px;right: 22px;margin-top: -21px; } body .ok.component_container {position: fixed;bottom: 0;height: 50px;background: #434E50; } body .ok.component_container.active {background: #637375; } body .ok.component_container button {top: 0;bottom: 0;left: 0;width: 100%;position: absolute;background: transparent;border: 0;line-height: 50px;color: #E2E2E2;font-size: 16px; } body .ok.component_container button[disabled] {color: #647577; }.launch-screen {z-index: 999 !important; }.component_base,.component_container {position: absolute; }:focus {outline: none; }::-moz-focus-inner {border: 0; }input {appearance: none; }button {cursor: pointer;margin: 0;border: 0; }button[disabled] {cursor: default; }.__player_view_id__ > * {position: absolute; }.__player_view_id__ .slide {white-space: nowrap;font-size: 0; } .__player_view_id__ .slide a {text-decoration: none;cursor: pointer; } .__player_view_id__ .slide a img {border: 0; } .__player_view_id__ .slide * {-ms-transform-origin: 0 0;transform-origin: 0 0; } .__player_view_id__ .slide.relpos, .__player_view_id__ .slide .relpos {position: relative !important;vertical-align: top; } .__player_view_id__ .slide.kern, .__player_view_id__ .slide .kern {text-rendering: optimizeLegibility;font-feature-settings: 'kern' 1, 'liga' 0; } .__player_view_id__ .slide.nokern, .__player_view_id__ .slide .nokern {text-rendering: optimizeSpeed;font-feature-settings: 'kern' 0, 'liga' 0; }.__player_view_id__ .fullscreen {-ms-transform: none !important;transform: none !important;top: 0 !important;left: 0 !important; } .__player_view_id__ .fullscreen > video {background-color: black;width: __slide_width__ !important;height: __slide_height__ !important;z-index: 100; }.__player_view_id__ .video_player video {width: 100%;height: 100%; } .__player_view_id__ .video_player video::cue {color: #FFFFFF;background-color: rgba(8, 8, 8, 0.75);border-radius: 4px;font-family: Helvetica, Roboto, Arial;line-height: 1.1; }.__player_view_id__ .video_player.iphone::after {background: rgba(0, 0, 0, 0) url("+ +c[9]+") no-repeat center;position: absolute;width: 100%;height: 100%;top: 0;right: 0;content: ''; }.__player_view_id__ .video_player.iphone video {opacity: 0; }.__player_view_id__ .video_player.iphone.without_controls video {display: none; }.__player_view_id__ .video_player .controls {height: 36px;background: rgba(45, 50, 55, 0.85098);border: 1px solid #444648;cursor: default;border-radius: 4px; } .__player_view_id__ .video_player .controls .progress {background-color: #75787A;height: 14px;left: 62px;top: 0;bottom: 0;margin-top: auto;margin-bottom: auto;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark {width: 10px;height: 10px;margin-top: -5px;margin-left: -5px;top: 50%;background: url("+ +c[10]+") no-repeat;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark:hover, .__player_view_id__ .video_player .controls .progress .bookmark:active {background: url("+c[11]+") no-repeat; } .__player_view_id__ .video_player .controls .progress .loading {background-color: #B1B3B5;height: 100%; } .__player_view_id__ .video_player .controls .progress .playing {background-color: #FFFFFF;height: 100%; } .__player_view_id__ .video_player .controls .progress .tooltip {background: url("+ +c[12]+") no-repeat;width: 60px;height: 25px;top: -33px;margin-left: -30px;font-family: Helvetica, Roboto, Arial;font-size: 12px;padding-top: 2px;text-align: center; } .__player_view_id__ .video_player .controls .volume_popup {border-radius: 3px;background: rgba(45, 50, 55, 0.85098);top: -67px;right: 55px;padding: 8px; } .__player_view_id__ .video_player .controls .volume_popup .volume {background: url("+c[13]+");position: relative;cursor: pointer;width: 12px;height: 48px; } .__player_view_id__ .video_player .controls .volume_popup .volume .back {background: url("+ +c[14]+");width: 100%; } .__player_view_id__ .video_player .controls button {width: 100%;height: 100%; } .__player_view_id__ .video_player .controls button.mute {background: url("+c[15]+"); } .__player_view_id__ .video_player .controls button.mute:hover {background: url("+c[16]+"); } .__player_view_id__ .video_player .controls button.mute:active {background: url("+c[17]+"); } .__player_view_id__ .video_player .controls button.mute.selected {background: url("+c[18]+"); } .__player_view_id__ .video_player .controls button.mute.selected:hover {background: url("+ +c[19]+"); } .__player_view_id__ .video_player .controls button.mute.selected:active {background: url("+c[20]+"); } .__player_view_id__ .video_player .controls button.play {background: url("+c[21]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:hover {background: url("+c[22]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:active {background: url("+c[23]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected {background: url("+ +c[24]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:hover {background: url("+c[25]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:active {background: url("+c[26]+") no-repeat; } .__player_view_id__ .video_player .controls button.play::after {background: url("+c[27]+");width: 1px;height: 32px;right: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls button.toggle_fullscreen {background: url("+ +c[28]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:hover {background: url("+c[29]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:active {background: url("+c[30]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen::before {background: url("+c[27]+") no-repeat;width: 1px;height: 32px;left: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls .component_container.toggle_fullscreen, .__player_view_id__ .video_player .controls .component_container.play {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .component_container.toggle_fullscreen {right: -1px; } .__player_view_id__ .video_player .controls .component_container.mute {width: 22px;height: 22px;right: 58px;top: 6px; }.modal_layer {background: #000000;opacity: 0.7;z-index: 1;width: 100%;height: 100%; }.message_box,.confirm_window {border-radius: 4px;min-height: 150px;min-width: 300px;z-index: 1;background: #FFFFFF;position: absolute;width: 300px;top: 0;right: 0;bottom: 0;left: 0;margin: auto; } .message_box .title, .confirm_window .title {display: none !important; } .message_box .message, .confirm_window .message {padding: 34px 34px 24px 34px;font-size: 14px;line-height: 18px;color: #231F20;font-family: Helvetica, Roboto, Arial; }.message_box .btn_ok.component_container {padding-bottom: 24px;position: relative;text-align: center;height: 44px;width: 100%; } .message_box .btn_ok.component_container button {vertical-align: middle;line-height: 44px;height: 44px;padding-left: 20px;padding-right: 20px;min-width: 110px;margin-left: 5px;margin-right: 5px;position: static;appearance: none;border: 0;border-radius: 4px;font-size: 16px;background: #339BE0;color: #FFFFFF; } .message_box .btn_ok.component_container button.active {background: #058ACC; }.confirm_window .buttons_panel {text-align: center;position: relative;padding-bottom: 24px;height: 44px;width: 100%; } .confirm_window .buttons_panel > div {width: 50%;float: right;position: relative; } .confirm_window .buttons_panel > div button {vertical-align: middle;line-height: 44px;height: 44px;padding-left: 20px;padding-right: 20px;min-width: 110px;margin-left: 5px;margin-right: 5px;position: static;appearance: none;border: 0;border-radius: 4px;font-size: 16px;background: #339BE0;color: #FFFFFF; } .confirm_window .buttons_panel > div.active button {background: #058ACC; } .confirm_window .buttons_panel > div:only-child {width: 100%;text-align: center !important; } .confirm_window .buttons_panel > div:nth-child(1) {text-align: left; } .confirm_window .buttons_panel > div:nth-child(2) {text-align: right; }.back_to_app {height: 100%;position: absolute;left: 0; } .back_to_app__text {color: #3DA0E1;font-size: 16px;font-family: Helvetica Neue, Helvetica, Roboto, Arial;text-overflow: ellipsis;overflow: hidden;position: absolute;bottom: 0;top: 0;height: 24px;line-height: 24px;margin: auto;padding-left: 25px;max-width: 80px; } .back_to_app__text::before {content: '';background: url("+ +c[31]+") no-repeat center;height: 24px;width: 14px;left: 8px;position: absolute; }.trial_banner {position: relative;transform: translateZ(0); } .trial_banner .banner-content, .trial_banner .banner-content_hover {position: absolute;left: 0;right: 0;top: 0;bottom: 0;width: 100%;height: 100%; } .trial_banner .banner-content {visibility: visible;z-index: 1; } .trial_banner .banner-content_hover {visibility: hidden;z-index: 0; } .trial_banner .days_remaining {position: absolute;font-family: 'Open Sans', Arial, sans-serif;font-weight: normal;font-size: 13px;left: 65px;top: 41px;color: #7C1645;z-index: 1; } .trial_banner:hover .banner-content {visibility: hidden;z-index: 0; } .trial_banner:hover .banner-content_hover {visibility: visible;z-index: 1; }.popup_layer {z-index: 1; } .popup_layer .modal_layer {z-index: initial; }.framesLayer iframe {pointer-events: all; }.slide-transiting .quiz-uikit-primary-button {transition: none; }.slide-transiting .quiz-uikit-secondary-button {transition: none; }.slide-transiting .quiz-uikit-link-button {transition: none; }.slide-transiting .visuals-uikit-primary-button {transition: none; }.slide-transiting .visuals-uikit-secondary-button {transition: none; }.slide-transiting .visuals-uikit-link-button {transition: none; }.uikit-primary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-primary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-primary-button.uikit-primary-button_size_medium {padding: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:first-child {margin-left: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:last-child {margin-right: 10px; } .uikit-primary-button.uikit-primary-button_size_small {padding: 6px 12px; } .uikit-primary-button.uikit-primary-button_size_small .uikit-primary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-primary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__button-text {margin-right: 8px; } .uikit-primary-button__left-icon {margin-right: 8px; } .uikit-primary-button__button-text:first-child {margin-left: 0; } .uikit-primary-button__button-text:last-child {margin-right: 0; } .uikit-primary-button__left-icon:first-child {margin-left: 0; } .uikit-primary-button__left-icon:last-child {margin-right: 0; } .uikit-primary-button__right-icon:first-child {margin-left: 0; } .uikit-primary-button__right-icon:last-child {margin-right: 0; } .uikit-primary-button[disabled] {opacity: 0.4; } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-secondary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-secondary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-secondary-button.uikit-secondary-button_size_medium {padding: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:first-child {margin-left: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:last-child {margin-right: 10px; } .uikit-secondary-button.uikit-secondary-button_size_small {padding: 6px 12px; } .uikit-secondary-button.uikit-secondary-button_size_small .uikit-secondary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-secondary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__button-text {margin-right: 8px; } .uikit-secondary-button__left-icon {margin-right: 8px; } .uikit-secondary-button__button-text:first-child {margin-left: 0; } .uikit-secondary-button__button-text:last-child {margin-right: 0; } .uikit-secondary-button__left-icon:first-child {margin-left: 0; } .uikit-secondary-button__left-icon:last-child {margin-right: 0; } .uikit-secondary-button__right-icon:first-child {margin-left: 0; } .uikit-secondary-button__right-icon:last-child {margin-right: 0; } .uikit-secondary-button[disabled] {opacity: 0.4; } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-link-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-link-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-link-button.uikit-link-button_size_medium {padding: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text {font-size: 17px;line-height: 20px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:first-child {margin-left: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:last-child {margin-right: 10px; } .uikit-link-button.uikit-link-button_size_small {padding: 6px 12px; } .uikit-link-button.uikit-link-button_size_small .uikit-link-button__button-text {font-size: 14px;line-height: 20px; } .uikit-link-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__button-text {margin-right: 8px; } .uikit-link-button__left-icon {margin-right: 8px; } .uikit-link-button__button-text:first-child {margin-left: 0; } .uikit-link-button__button-text:last-child {margin-right: 0; } .uikit-link-button__left-icon:first-child {margin-left: 0; } .uikit-link-button__left-icon:last-child {margin-right: 0; } .uikit-link-button__right-icon:first-child {margin-left: 0; } .uikit-link-button__right-icon:last-child {margin-right: 0; } .uikit-link-button[disabled] {opacity: 0.4; } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-primary-button {background: var(--primary-button-background-color, var(--primary-button-background-color));color: var(--primary-button-text-color, var(--primary-button-text-color)); } .uikit-primary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--primary-button-border-color, var(--primary-button-border-color));background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-primary-button__button-text {font-family: var(--font-family-bold);font-weight: 700; } .uikit-primary-button.uikit-primary-button_active, .uikit-primary-button[aria-pressed='true'], .uikit-primary-button:focus {background: var(--primary-button-background-color-active, var(--primary-button-background-color-active));color: var(--primary-button-text-color-active, var(--primary-button-text-color-active)); } .uikit-primary-button.uikit-primary-button_active::after, .uikit-primary-button[aria-pressed='true']::after, .uikit-primary-button:focus::after {background: var(--primary-button-border-color-active, var(--primary-button-border-color-active));background-origin: border-box; }.uikit-secondary-button {background: var(--secondary-button-background-color, var(--secondary-button-background-color));color: var(--secondary-button-text-color, var(--secondary-button-text-color)); } .uikit-secondary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--secondary-button-border-color, var(--secondary-button-border-color));background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-secondary-button__button-text {font-family: var(--font-family-normal); } .uikit-secondary-button.uikit-secondary-button_active, .uikit-secondary-button[aria-pressed='true'], .uikit-secondary-button:focus {background: var(--secondary-button-background-color-active, var(--secondary-button-background-color-active));color: var(--secondary-button-text-color-active, var(--secondary-button-text-color-active)); } .uikit-secondary-button.uikit-secondary-button_active::after, .uikit-secondary-button[aria-pressed='true']::after, .uikit-secondary-button:focus::after {background: var(--secondary-button-border-color-active, var(--secondary-button-border-color-active));background-origin: border-box; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 15px; }.uikit-link-button {background: var(--link-button-background-color);color: var(--link-button-text-color);border: none; } .uikit-link-button.uikit-link-button_active, .uikit-link-button[aria-pressed='true'] {background: var(--link-button-background-color); }.uikit-collapsed-control {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;position: relative;overflow: hidden;padding: 10px;border: none;border-radius: var(--button-border-radius);background: var(--secondary-button-background-color-active);color: var(--secondary-button-text-color-active);transition-property: background, color;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-collapsed-control::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--secondary-button-border-color-active);background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-collapsed-control__collapsed-component {cursor: pointer;display: -ms-flexbox;display: flex; } .uikit-collapsed-control__expanded-component {margin-left: 8px;opacity: 1;transition-property: width, opacity;transition-duration: 300ms;transition-timing-function: ease; } .uikit-collapsed-control.uikit-collapsed-control_collapsed {background: var(--secondary-button-background-color);color: var(--secondary-button-text-color);padding-right: 2px; } .uikit-collapsed-control.uikit-collapsed-control_collapsed::after {background: var(--secondary-button-border-color);background-origin: border-box; } .uikit-collapsed-control.uikit-collapsed-control_collapsed .uikit-collapsed-control__expanded-component {width: 0;opacity: 0; } .uikit-collapsed-control[data-tooltip]::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 0; } .uikit-collapsed-control[data-tooltip]:hover::before {opacity: 1;visibility: visible; }.menu-base {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: start;align-items: start;font-family: var(--font-family-normal); }.menu-base-item {width: 100%;box-sizing: border-box;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;height: 44px;padding: 0 20px;color: var(--popup-text-color); } .menu-base-item__label {-ms-flex-positive: 1;flex-grow: 1;font-size: 15px;line-height: 20px;margin-left: 12px; } .menu-base-item__icon {width: 20px;height: 20px;-ms-flex-negative: 0;flex-shrink: 0;color: var(--popup-text-color); } .menu-base-item__value {-ms-flex-negative: 0;flex-shrink: 0;margin-left: 16px; } .menu-base-item.menu-base-item_clickable:hover {cursor: pointer;background: var(--popup-background-hover-color);color: var(--popup-text-hover-color); } .menu-base-item.menu-base-item_clickable:hover .menu-base-item__icon {color: var(--popup-text-hover-color); }.rate-menu {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;width: 100%;padding: 12px 0; } .rate-menu__caption {padding: 8px 20px;color: var(--popup-text-color);font-size: 16px;line-height: 22px;font-family: var(--font-family-bold);font-weight: 700; } .rate-menu__delimiter {width: 100%;height: 1px;background: var(--popup-text-color);opacity: 0.08;margin: 8px 0; }.presenter-info {font-family: var(--font-family-normal);box-sizing: border-box;position: relative;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;color: var(--panel-text-color); } .presenter-info__main {display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: start; } .presenter-info__info {display: inline-block;-ms-flex-positive: 1;flex-grow: 1; } .presenter-info__photo {width: 64px;height: 64px;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;overflow: hidden;border-radius: 50%;-ms-flex-negative: 0;flex-shrink: 0;background-repeat: no-repeat;background-position: center;margin-right: 20px; } .presenter-info__photo img {width: auto;height: auto; } .presenter-info__name {font-family: var(--font-family-bold);font-weight: 700;word-wrap: break-word;overflow: hidden;font-size: 16px;line-height: 22px;margin-bottom: 8px;max-height: 53px; } .presenter-info__job {word-wrap: break-word;overflow: hidden;font-size: 14px;line-height: 18px;margin-bottom: 8px; } .presenter-info__phone {word-wrap: break-word;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;font-size: 15px;line-height: 20px; } .presenter-info__links {display: -ms-flexbox;display: flex;margin-top: 8px; } .presenter-info__link {border: 1px solid var(--presenter-info-link-border-color);border-radius: 10px;width: 36px;height: 28px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;position: relative;color: var(--panel-text-color); } .presenter-info__link:not(:last-child) {margin-right: 8px; } .presenter-info__link::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 6px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .presenter-info__link:hover::before {opacity: 1;visibility: visible; } .presenter-info__link-icon {width: 20px;height: 20px; } .presenter-info .bio-container {position: relative;display: -webkit-box;white-space: normal;text-overflow: ellipsis;margin-right: -20px;margin-top: 20px;padding-right: 10px;font-size: 14px;line-height: 20px;-ms-flex-positive: 1;flex-grow: 1;height: 100%;max-height: 120px;overflow: hidden; } .presenter-info .bio-container.bio-container_collapsed {max-height: 60px; } .presenter-info .bio-container.bio-container_collapsed .scroll-area__bio {display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .presenter-info .bio-container .scroll-area {word-break: break-word;overflow: hidden; } .presenter-info .bio-container .container-top-shadow {background: __verticalGradient(var(--panel-color), transparent);background: linear-gradient(to bottom, var(--panel-color), transparent);position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; } .presenter-info .bio-container .container-bottom-shadow {background: __verticalGradient(transparent, var(--panel-color));background: linear-gradient(to bottom, transparent, var(--panel-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; } .presenter-info__show-more {font-size: 14px;line-height: 20px;height: 20px;opacity: 0.6;text-decoration: underline; } .presenter-info__show-more:hover {cursor: pointer;opacity: 0.8; } .presenter-info.presenter-info_popup {margin-bottom: 0; } .presenter-info.presenter-info_no-photo .presenter-info__info {width: 100%; }.attachments-info {font-family: var(--font-family-normal);position: relative;width: 100%;overflow: hidden;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column; } .attachments-info__scroll-area {height: 100%;overflow: hidden; } .attachments-info__delimiter {height: 1px;margin: 8px 20px 8px 62px;background: var(--popup-text-color);opacity: 0.08; } .attachments-info .container-top-shadow {background: __verticalGradient(var(--panel-color), transparent);background: linear-gradient(to bottom, var(--panel-color), transparent);position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; } .attachments-info .container-bottom-shadow {background: __verticalGradient(transparent, var(--panel-color));background: linear-gradient(to bottom, transparent, var(--panel-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; }.attach-item {padding: 8px 20px;box-sizing: border-box;display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: start;cursor: pointer; } .attach-item__icon-container {width: 36px;height: 36px;border-radius: 50%;background: var(--top-panel-icon-container-color);display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;-ms-flex-negative: 0;flex-shrink: 0;margin-right: 6px; } .attach-item__icon {width: 20px;height: 20px;color: var(--popup-text-color);opacity: 0.72; } .attach-item__info-container {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-positive: 1;flex-grow: 1;padding-left: 6px; } .attach-item__title {font-size: 15px;line-height: 20px;margin-bottom: 4px;color: var(--popup-text-color);word-break: break-word;max-height: 60px;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .attach-item__subtitle {font-size: 14px;line-height: 18px;color: var(--popup-text-color);opacity: 0.6; } .attach-item:hover {background: var(--list-item-background-hover-color); } .attach-item:hover .attach-item__title {color: var(--popup-text-hover-color); } .attach-item:hover .attach-item__subtitle {color: var(--popup-text-hover-color); } .attach-item:hover .attach-item__icon {color: var(--popup-text-hover-color); }.message-box {background: var(--player-background-color);position: absolute;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;border-radius: 7px;min-width: 280px;padding: 40px;box-shadow: 0 8px 16px rgba(0, 0, 0, 0.08); } .message-box::after {content: '';box-sizing: border-box;border: 1px solid var(--popup-border);width: 100%;height: 100%;position: absolute;left: 0;top: 0;border-radius: 7px;pointer-events: none; } .message-box__content {position: relative;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-direction: column;flex-direction: column; } .message-box__icon {width: 24px;height: 24px;margin-bottom: 24px;position: relative;display: inline-block;color: var(--text-color);opacity: 0.72; } .message-box .message-box-buttons {position: relative;width: 100%;height: 36px; } .message-box .message-box-buttons__buttons {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center; } .message-box .message-box-buttons__window-button {margin: 0 4px; } .message-box .vertical-scrollbar {top: 40px; } .message-box__message-container {overflow: hidden;display: inline-block;max-width: 480px;vertical-align: top;position: relative; } .message-box__message {text-align: center;font-size: 15px;color: var(--text-color);text-overflow: ellipsis;overflow: hidden;position: relative;font-family: Helvetica Neue, Helvetica, Roboto, Arial; } .message-box__buttons {margin-top: 28px; }.back-to-app-button {position: absolute;top: 6px;left: 12px;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;width: 40px;height: 40px; } .back-to-app-button svg path {fill: var(--text-color); }.quiz-tablet-skin {background: var(--player-background-color); } .quiz-tablet-skin .smartphone-top-panel.smartphone-top-panel_mode_reviewing .smartphone-top-panel__button.smartphone-top-panel__button_outline {-ms-grid-column: 1;grid-column: 1; }.smartphone-slide-list-slides * {box-sizing: border-box; }.universal_mini.mobile .playerView {background-color: var(--player-background-color); }.universal_mini.mobile:not(.landscape) .slide-list-header__awarded-points-cell {display: none; }.universal_mini.mobile:not(.landscape) .slide-list-header__max-points-cell {display: none; }.universal_mini.mobile:not(.landscape) .slide-state-list-row__awarded-points {display: none; }.universal_mini.mobile:not(.landscape) .slide-state-list-row__points {display: none; }.menu_layer .component_base.content {min-height: 100%; }.menu_layer .smartphone-slide-list-slides {height: 100%; }:root {--font-family-bold: PFnb;--font-family-bold-italic: PFnbi;--font-family-italic: PFni;--font-family-normal: PFn;--font-family-semibold: PFnsb, PFn;--font-family-semibold-italic: PFnsbi, PFni; }"; +let e;for(const [g,h]of Object.entries(null!=(e=a)?e:{}))a=`__${g.replace(RegExp("\\.","g"),"_")}__`,c=c.replace(new RegExp(a,"g"),h);let f;for(const [g,h]of Object.entries(null!=(f=b)?f:{}))c=c.replace(new RegExp(g,"g"),h);c=c.replace(/__verticalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.rn);c=c.replace(/__horizontalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.pn);return gn(c)}rn(a,b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}pn(a, +b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}};class DG{Uq(a,b){const c=g=>{g=sh(g);let h;for(const [l,n]of Object.entries(null!=(h=a)?h:{}))g=g.replace(new RegExp(`{${l}}`,"g"),n);return qh(g)};let d=function(){var g=["data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA5LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDksMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbD0iI0RENEIzOCIgZD0iTTIxLjA0MSwyOXY5Ljg0NGMwLDUuNTA4LDQuNjkxLDkuOTczLDEwLjQ3OSw5Ljk3M2M1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTczVjI5SDIxLjA0MXoiLz4NCjxwYXRoIGZpbGw9IiNERDRCMzgiIGQ9Ik0yNi41NTgsMjl2LTcuNjg5YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MlYyOWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNFYyOUgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjEuMDQxLDI4LjIwNnY5Ljg0NWMwLDUuNTA2LDQuNjkxLDkuOTcxLDEwLjQ3OSw5Ljk3MWM1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTcxdi05Ljg0NUgyMS4wNDF6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjYuNTU4LDI4LjA0VjIwLjM1YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MnY3LjY4OWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNHY4LjA1NEgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRjA4RjgyIiBkPSJNMzQsMzYuMzY1YzAtMS4yODctMS4wNDQtMi4zMzEtMi4zMzEtMi4zMzFjLTEuMjg4LDAtMi4zMzIsMS4wNDQtMi4zMzIsMi4zMzENCgljMCwwLjk3MSwwLjU5NCwxLjgwMiwxLjQzOCwyLjE1MnY0LjQ2N2gxLjkxdi00LjUyOUMzMy40NjEsMzguMDc2LDM0LDM3LjI4NywzNCwzNi4zNjV6Ii8+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA4LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDgsMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik01OS42NDYsMzFoLTMuMjkzQzU2LjE1OCwzMSw1NiwzMS40NDgsNTYsMzINCgljMCwwLjU1MywwLjE1OCwxLDAuMzU0LDFoMy4yOTNDNTkuODQyLDMzLDYwLDMyLjU1Myw2MCwzMkM2MCwzMS40NDgsNTkuODQyLDMxLDU5LjY0NiwzMXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjREQ0QjM4IiBkPSJNNi42NDcsMzFIMy4zNTNDMy4xNTgsMzEsMywzMS40NDgsMywzMmMwLDAuNTUzLDAuMTU4LDEsMC4zNTMsMQ0KCWgzLjI5NEM2Ljg0MiwzMyw3LDMyLjU1Myw3LDMyQzcsMzEuNDQ4LDYuODQyLDMxLDYuNjQ3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik0zMSw4YzAuNTUzLDAsMS0wLjE1OCwxLTAuMzUzVjQuMzUzQzMyLDQuMTU4LDMxLjU1Myw0LDMxLDQNCgljLTAuNTUyLDAtMSwwLjE1OC0xLDAuMzUzdjMuMjk0QzMwLDcuODQyLDMwLjQ0OCw4LDMxLDh6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTMxLDU2Yy0wLjU1MiwwLTEsMC4xNTgtMSwwLjM1NHYzLjI5M0MzMCw1OS44NDIsMzAuNDQ4LDYwLDMxLDYwDQoJYzAuNTUzLDAsMS0wLjE1OCwxLTAuMzU0di0zLjI5M0MzMiw1Ni4xNTgsMzEuNTUzLDU2LDMxLDU2eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik00Ny42NjgsMzFoLTEyLjgxQzM0LjQ5NiwyOS42LDMzLjQsMjguNTA1LDMyLDI4LjE0Mg0KCWMwLDAtMC4xNzItMC4xNDItMS0wLjE0MmMtMC44MjksMC0yLDAuNTU1LTIsMC41NTVjLTEuMTksMC42OTMtMiwxLjk2OS0yLDMuNDQ1YzAsMi4yMDksMS43OTEsNCw0LDRjMS40NzcsMCwyLjc1Mi0wLjgwOSwzLjQ0NS0yDQoJaDEzLjIyM0M0OC40MDQsMzQsNDksMzMuMzI4LDQ5LDMyLjVDNDksMzEuNjcyLDQ4LjQwNCwzMSw0Ny42NjgsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTI3LjAxOCwyOS43NDhjMC41OTIsMS4wMjUsMS42NTIsMS41MiwyLjM3LDEuMTA2bDAsMA0KCWMwLjcxNy0wLjQxNSwwLjgxOS0xLjU4MSwwLjIyOC0yLjYwNmwtNy44NTctMTMuNjA5Yy0wLjU5Mi0xLjAyNC0xLjY1My0xLjUyLTIuMzcxLTEuMTA2bDAsMGMtMC43MTcsMC40MTUtMC44MTgsMS41ODEtMC4yMjgsMi42MDUNCglMMjcuMDE4LDI5Ljc0OHoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMjcuMDE4LDI4LjM2MWMwLjU5MiwxLjAyNSwxLjY1MiwxLjUyLDIuMzcsMS4xMDZsMCwwDQoJYzAuNzE3LTAuNDE1LDAuODE5LTEuNTgxLDAuMjI4LTIuNjA2bC03Ljg1Ny0xMy42MDljLTAuNTkyLTEuMDI0LTEuNjUzLTEuNTItMi4zNzEtMS4xMDZsMCwwYy0wLjcxNywwLjQxNS0wLjgxOCwxLjU4MS0wLjIyOCwyLjYwNQ0KCUwyNy4wMTgsMjguMzYxeiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgY3g9IjMxIiBjeT0iMzEiIHI9IjQiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNjAsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzU0LDFoLTMuMjkzQzU2LjE1OCwzMiw1NiwzMS41NTIsNTYsMzENCglsMCwwYzAtMC41NTIsMC4xNTgtMSwwLjM1NC0xaDMuMjkzQzU5Ljg0MiwzMCw2MCwzMC40NDgsNjAsMzFMNjAsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTcsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzUzLDFIMy4zNTNDMy4xNTgsMzIsMywzMS41NTIsMywzMWwwLDANCgljMC0wLjU1MiwwLjE1OC0xLDAuMzUzLTFoMy4yOTRDNi44NDIsMzAsNywzMC40NDgsNywzMUw3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0zMSwzYzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDYuODQyLDMxLjU1Myw3LDMxLDdsMCwwDQoJYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1M1YzLjM1M0MzMCwzLjE1OCwzMC40NDgsMywzMSwzTDMxLDN6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTMxLDU1YzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDU4Ljg0MiwzMS41NTMsNTksMzEsNTkNCglsMCwwYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1NHYtMy4yOTRDMzAsNTUuMTU4LDMwLjQ0OCw1NSwzMSw1NUwzMSw1NXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNDksMzEuNDk5QzQ5LDMwLjY3Miw0OC40MDQsMzAsNDcuNjY4LDMwSDM0LjMzMw0KCUMzMy41OTYsMzAsMzMsMzAuNjcxLDMzLDMxLjVsMCwwYzAsMC44MjgsMC41OTYsMS41LDEuMzMzLDEuNWgxMy4zMzVDNDguNDA0LDMzLDQ5LDMyLjMyOCw0OSwzMS40OTlMNDksMzEuNDk5eiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YxNjE1NSIgY3g9IjMxIiBjeT0iMzEiIHI9IjIiLz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjM2MzgxNDQiPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgzNjAiIGNsYXNzPSJmaWwwIiBkPSJNNi43NzM1IDMuOTc5bDAgLTMuNDQyNDVjMCwtMC4yOTUxMTkgLTAuMjQxNDMzLC0wLjUzNjU1MiAtMC41MzY1NTIsLTAuNTM2NTUybC02LjIzNjk1IDAgMCA0LjUxNTU1IDYuMjM2OTUgMGMwLjI5NTExOSwwIDAuNTM2NTUyLC0wLjI0MTQzMyAwLjUzNjU1MiwtMC41MzY1NTJ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMzYzODEyMCIgY2xhc3M9ImZpbDEiIGQ9Ik0zLjE4NzUgMS4yMzAyMWwtMC4zMzU1NTIgMC4zMzU1MTQgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAtMC4yMjM2NjQgMC4yMjM2NjQgMC40NDczNjUgMC40NDczNjUgLTAuMzM1NTE0IDAuMzM1NTUyIDAuODk0NzMgMCAwIC0wLjg5NDczem0wLjI2NTY0MSAyLjA1NTFsMC4zMzU1MTQgLTAuMzM1NTE0IDAuNDQ3MzY1IDAuNDQ3MzY1IDAuMjIzNzAxIC0wLjIyMzcwMSAtMC40NDczNjUgLTAuNDQ3MzY1IDAuMzM1NTE0IC0wLjMzNTUxNCAtMC44OTQ3MyAwIDAgMC44OTQ3M3oiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDojRkVGRUZFO2ZpbGwtb3BhY2l0eTowLjEwMTk2MX0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIzNjM4MTQ0Ij4NCiAgIDxwYXRoIGlkPSJfMTIzNjM4MzYwIiBjbGFzcz0iZmlsMCIgZD0iTTYuNzczNSAzLjk3OWwwIC0zLjQ0MjQ1YzAsLTAuMjk1MTE5IC0wLjI0MTQzMywtMC41MzY1NTIgLTAuNTM2NTUyLC0wLjUzNjU1MmwtNi4yMzY5NSAwIDAgNC41MTU1NSA2LjIzNjk1IDBjMC4yOTUxMTksMCAwLjUzNjU1MiwtMC4yNDE0MzMgMC41MzY1NTIsLTAuNTM2NTUyeiIvPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgxMjAiIGNsYXNzPSJmaWwxIiBkPSJNMy4xODc1IDEuMjMwMjFsLTAuMzM1NTUyIDAuMzM1NTE0IC0wLjQ0NzM2NSAtMC40NDczNjUgLTAuMjIzNjY0IDAuMjIzNjY0IDAuNDQ3MzY1IDAuNDQ3MzY1IC0wLjMzNTUxNCAwLjMzNTU1MiAwLjg5NDczIDAgMCAtMC44OTQ3M3ptMC4yNjU2NDEgMi4wNTUxbDAuMzM1NTE0IC0wLjMzNTUxNCAwLjQ0NzM2NSAwLjQ0NzM2NSAwLjIyMzcwMSAtMC4yMjM3MDEgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAwLjMzNTUxNCAtMC4zMzU1MTQgLTAuODk0NzMgMCAwIDAuODk0NzN6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDojRkVGRUZFO2ZpbGwtb3BhY2l0eTowLjA1MDk4MH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIzNjM4MTQ0Ij4NCiAgIDxwYXRoIGlkPSJfMTIzNjM4MzYwIiBjbGFzcz0iZmlsMCIgZD0iTTYuNzczNSAzLjk3OWwwIC0zLjQ0MjQ1YzAsLTAuMjk1MTE5IC0wLjI0MTQzMywtMC41MzY1NTIgLTAuNTM2NTUyLC0wLjUzNjU1MmwtNi4yMzY5NSAwIDAgNC41MTU1NSA2LjIzNjk1IDBjMC4yOTUxMTksMCAwLjUzNjU1MiwtMC4yNDE0MzMgMC41MzY1NTIsLTAuNTM2NTUyeiIvPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgxMjAiIGNsYXNzPSJmaWwxIiBkPSJNMy4xODc1IDEuMjMwMjFsLTAuMzM1NTUyIDAuMzM1NTE0IC0wLjQ0NzM2NSAtMC40NDczNjUgLTAuMjIzNjY0IDAuMjIzNjY0IDAuNDQ3MzY1IDAuNDQ3MzY1IC0wLjMzNTUxNCAwLjMzNTU1MiAwLjg5NDczIDAgMCAtMC44OTQ3M3ptMC4yNjU2NDEgMi4wNTUxbDAuMzM1NTE0IC0wLjMzNTUxNCAwLjQ0NzM2NSAwLjQ0NzM2NSAwLjIyMzcwMSAtMC4yMjM3MDEgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAwLjMzNTUxNCAtMC4zMzU1MTQgLTAuODk0NzMgMCAwIDAuODk0NzN6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACHDwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKNWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAASMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEoqGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAGeIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gzSZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25qbc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9CvjcM4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjKuLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqxOPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIWiAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFVSAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAyrA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYghUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7rh2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SEdJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3JaSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQtlHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJy5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hopb2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsyu21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCccNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527PYS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOwEaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6sfaznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy+rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVsS1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9UxlfeqXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/wjowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9Vt1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503rm10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7Pnl/eriQvLDwG/eE8/s6uL5TAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAAGnRFWHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS4xMDD0cqEAAABfSURBVChTY/j//z8DMZgoRSCD4ApLK6rYgLgDiJ9CMYjNBrMNWWHnvAUL/3/4+BGMQWygwk5sCp+CFMDAhw8fQAqfYlcIlCRGYeeceQv+g0wCYRAbl9XEeYZQWBIdjgCVaiC8JN1udgAAAABJRU5ErkJggg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAACuSURBVHicY/n//z8DCLh7+/sAqWIgNmGAgDNA3Ltz68YtIA4LVFELkKpmQAUOIAyUawUqrmEBMnyxKEIG1UA1J0EmFsFELC3MGfJzssDsSVOnMxw7fgImVQRSaAzjgRQJCgqA2XnZmcgKjVnwWIkCWKC+cwRxJk6eypCfm80AYyOBMyCF/TCFx0+eAmMsoJ8F6PXNoCBgwO1zUPBsBrsRFE5AxSCXFzKgBng/LMABrBM9cyiwScIAAAAASUVORK5CYII=", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAZCAYAAABtnU33AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAETSURBVHic7ZgxCsJAFAUXSaeIpScQDyCCguA5rEUQEbWzsvACKhICaquHUQu18hxi6vgebCSgwSb5C2sGhpBkIX+aZIkTBIHS1OAI1mFR2cEDHuEKnnnB0TeGcAlzZuZKjTKswA4cwzWDW8rO2ChsY+OFwVNld2wIG6cMbpqeRJAmg0umpxCk5PxeYxdZsO1kwbaTBdvOXwb7MG96ECF8Bt9gw/QkQlwZ7Kr/CXYZvIdt2DU7S+rs4CF8afXgCU5g1dhI6XCHC7jlSRjM/zwbbUGbJDPY/7HGg/OEn/vUvvn2WfpYlAADfYyL9vSaIOZ+Ykh9hxkSFy0WSyQ3Ht+iRWOJ9E4rGq2UcCwxsbWMRovGkhc6FTEV3QXLmAAAAABJRU5ErkJggg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAElJREFUSEvt0qERAEAIA0H6b5rXL1ecI5qQOcIsanB+3TC5egZOyJm9B2Zgw0EnF+AeekPC+S3tGTjhoJMLcA+9IeG89+6L04QHtFKarLFAHLUAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAFBJREFUSEvtkjEKADAIA/PpQunnWzo63nBbBDdjOGPWPpd0yPCf5YLo5TNgB52Z54AZsKDQygVwDr5A4RxLfQbsUGjlAjgHX6Bw9r394KjDAzeSX574b7LUAAAAAElFTkSuQmCC", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAyMCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik03LjE3MDI1IDMuMDkxODJDOC4wNzEzMiAyLjY5OTkyIDkuMDMyNDkgMi41IDEwIDIuNUMxMC45Njc1IDIuNSAxMS45Mjg3IDIuNjk5OTIgMTIuODI5NyAzLjA5MTgyQzEzLjczMTIgMy40ODM4NyAxNC41NTgzIDQuMDYyMDIgMTUuMjYwNyA0Ljc5OTUyQzE1Ljk2MzQgNS41MzcyOCAxNi41MjY4IDYuNDE5NjcgMTYuOTEzMiA3LjM5OTI0QzE3LjI5OTcgOC4zNzg5NyAxNy41IDkuNDMyOTUgMTcuNSAxMC41SDIwQzIwIDkuMTIxMTIgMTkuNzQxMyA3Ljc1NTc0IDE5LjIzODggNi40ODE4MkMxOC43MzYyIDUuMjA3OSAxNy45OTk2IDQuMDUwMzkgMTcuMDcxMSAzLjA3NTM4QzE2LjE0MjUgMi4xMDAzNiAxNS4wNDAxIDEuMzI2OTQgMTMuODI2OCAwLjc5OTI2NUMxMi42MTM2IDAuMjcxNTg5IDExLjMxMzIgMCAxMCAwQzguNjg2NzggMCA3LjM4NjQyIDAuMjcxNTg5IDYuMTczMTcgMC43OTkyNjVDNC45NTk5MiAxLjMyNjk0IDMuODU3NTIgMi4xMDAzNiAyLjkyODkzIDMuMDc1MzhDMi4wMDAzNSA0LjA1MDM5IDEuMjYzNzUgNS4yMDc5IDAuNzYxMjA0IDYuNDgxODJDMC4yNTg2NTggNy43NTU3NCAwIDkuMTIxMTIgMCAxMC41SDIuNUMyLjUgOS40MzI5NSAyLjcwMDMgOC4zNzg5NyAzLjA4Njc5IDcuMzk5MjRDMy40NzMyMiA2LjQxOTY3IDQuMDM2NjUgNS41MzcyOCA0LjczOTI4IDQuNzk5NTJDNS40NDE2NiA0LjA2MjAyIDYuMjY4ODUgMy40ODM4NyA3LjE3MDI1IDMuMDkxODJaTTEwLjU3MSA3LjU4MzM1QzEwLjY4NDMgNy40OTI4MyAxMC43OTY2IDcuNDA0NSAxMC45MDcxIDcuMzE4ODNDMTEuMzUxNyA2Ljk3NDAzIDExLjc2NTggNi42NzI0MyAxMi4wODY4IDYuNDQ0OTlDMTIuMTcxNyA2LjM4NDgxIDEyLjI1MDEgNi4zMjk4MSAxMi4zMjA5IDYuMjgwNThDMTIuNDkgNi4xNjI5MiAxMi43MTIgNi4yOTExIDEyLjY5NDYgNi40OTYzOEMxMi42ODc0IDYuNTgyMjYgMTIuNjc5IDYuNjc3NjggMTIuNjY5MyA2Ljc4MTM0QzEyLjYzMjkgNy4xNzMwNCAxMi41Nzg3IDcuNjgyNDcgMTIuNTAyNCA4LjIzOTg4QzEyLjQ4MzQgOC4zNzgzNyAxMi40NjMxIDguNTE5ODIgMTIuNDQxMyA4LjY2MzE2QzEyLjI0NjggOS45NDQxNSAxMS45Mzc1IDExLjM3NjIgMTEuNDY0MSAxMi4xOTYyQzExLjA3MzYgMTIuODcyNiAxMC4wMzExIDEzLjY3ODIgOC43MzIwNSAxMi45MjgyQzcuNDMzMDEgMTIuMTc4MiA3LjYwOTQ4IDEwLjg3MjYgOCAxMC4xOTYyQzguNDczMzcgOS4zNzYyNSA5LjU1ODk0IDguMzkyMzEgMTAuNTcxIDcuNTgzMzVaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NzA3MjgiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjMzNjc2NjQiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjkxNDI4IDAuNjkxNDI4LDAuNjkxNDI4IDAuNjkxNDI4LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTcwNzA0IiBjbGFzcz0iZmlsMSIgZD0iTTAuMzQ1NzM2IDAuMTU3MTg4bC0wLjEyNTcyMiAwLjA5NDI2NDkgLTAuMDk0MzAwNiAwIDAgMC4xODg1ODMgMC4wOTQzMDA2IDAgMC4xMjU3MjIgMC4wOTQyNjQ5IDAgLTAuMzc3MTEzem0wLjE1NzExNyAtMi42NzI2N2UtMDA1bDAuMDMxNDMwNiAwIDAgMC4zNzcxNCAtMC4wMzE0MzA2IDAgMCAtMC4zNzcxNHptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjI1MTQwOSAtMC4wMzE0MzA2IDAgMCAtMC4yNTE0MDl6bS0wLjA2Mjg0MzMgMC4wNjI4NjExbDAuMDMxNDMwNiAwIDAgMC4xMjU2ODcgLTAuMDMxNDMwNiAwIDAgLTAuMTI1Njg3eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NjkwMjQiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjE5NjkyNDAiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjQzNjE2IDAuNjQzNjE2LDAuNjQzNjE2IDAuNjQzNjE2LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY5MDAwIiBjbGFzcz0iZmlsMSIgZD0iTTAuMzIxODM3IDAuMTQ2MzAybC0wLjExNzAyOSAwLjA4Nzc0NjYgLTAuMDg3Nzc5NyAwIDAgMC4xNzU1NDMgMC4wODc3Nzk3IDAgMC4xMTcwMjkgMC4wODc3NDY2IDAgLTAuMzUxMDM2em0wLjI3NzkwMSAwLjI1MDcyNmwtMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjA5MzA4NzIgLTAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjAyMDY5MDYgLTAuMDIwNjkwNiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAwLjAyMDY5MDYgLTAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MnoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTggM0MxOS4xMDQ2IDMgMjAgMy44OTU0MyAyMCA1VjE1QzIwIDE2LjEwNDYgMTkuMTA0NiAxNyAxOCAxN0gyQzAuODk1NDMxIDE3IDAgMTYuMTA0NiAwIDE1VjVDMCAzLjg5NTQzIDAuODk1NDMxIDMgMiAzSDE4Wk02LjU4MDA4IDcuMDA0ODhDNS41OTgzIDcuMDA0ODggNC44MjYwMSA3LjMyMDE1IDQuMjYzMTggNy45NTA2OEMzLjcwMDM1IDguNTgxMjIgMy40MTg5NSA5LjQyNTQ1IDMuNDE4OTUgMTAuNDgzNFYxMC42MDRDMy40MTg5NSAxMS43MDQzIDMuNzAyNDcgMTIuNTY2NSA0LjI2OTUzIDEzLjE5MDdDNC44MzY1OSAxMy44MTQ5IDUuNjExIDE0LjEyNyA2LjU5Mjc3IDE0LjEyN0M3LjExNzUyIDE0LjEyNyA3LjU5Njc2IDE0LjAyMDEgOC4wMzA1MiAxMy44MDY0QzguNDY0MjggMTMuNTkyNyA4LjgwNTk5IDEzLjI5MjIgOS4wNTU2NiAxMi45MDVDOS4zMDUzNCAxMi41MTc4IDkuNDMyMjkgMTIuMDkxNSA5LjQzNjUyIDExLjYyNkg3LjcxNjMxQzcuNzA3ODQgMTEuOTM0OSA3LjU5NzgyIDEyLjE4MjUgNy4zODYyMyAxMi4zNjg3QzcuMTc0NjQgMTIuNTU0OSA2Ljg5OTU4IDEyLjY0NzkgNi41NjEwNCAxMi42NDc5QzYuMTIwOTMgMTIuNjQ3OSA1Ljc5Mjk3IDEyLjQ5MzUgNS41NzcxNSAxMi4xODQ2QzUuMzYxMzMgMTEuODc1NiA1LjI1MzQyIDExLjM2NzggNS4yNTM0MiAxMC42NjExVjEwLjQ3MDdDNS4yNTM0MiA5Ljc3MjQ2IDUuMzYyMzkgOS4yNjc4MiA1LjU4MDMyIDguOTU2NzlDNS43OTgyNiA4LjY0NTc1IDYuMTIwOTMgOC40OTAyMyA2LjU0ODM0IDguNDkwMjNDNi44OTUzNSA4LjQ5MDIzIDcuMTc0NjQgOC42MDEzMiA3LjM4NjIzIDguODIzNDlDNy41OTc4MiA5LjA0NTY2IDcuNzA3ODQgOS4zMzQ0NyA3LjcxNjMxIDkuNjg5OTRIOS40MzY1MkM5LjQyODA2IDguODc3NDQgOS4xNjQ2NCA4LjIyNjgxIDguNjQ2MjQgNy43MzgwNEM4LjEyNzg1IDcuMjQ5MjcgNy40MzkxMyA3LjAwNDg4IDYuNTgwMDggNy4wMDQ4OFpNMTMuMzU5NCA3LjAwNDg4QzEyLjM3NzYgNy4wMDQ4OCAxMS42MDUzIDcuMzIwMTUgMTEuMDQyNSA3Ljk1MDY4QzEwLjQ3OTcgOC41ODEyMiAxMC4xOTgyIDkuNDI1NDUgMTAuMTk4MiAxMC40ODM0VjEwLjYwNEMxMC4xOTgyIDExLjcwNDMgMTAuNDgxOCAxMi41NjY1IDExLjA0ODggMTMuMTkwN0MxMS42MTU5IDEzLjgxNDkgMTIuMzkwMyAxNC4xMjcgMTMuMzcyMSAxNC4xMjdDMTMuODk2OCAxNC4xMjcgMTQuMzc2MSAxNC4wMjAxIDE0LjgwOTggMTMuODA2NEMxNS4yNDM2IDEzLjU5MjcgMTUuNTg1MyAxMy4yOTIyIDE1LjgzNSAxMi45MDVDMTYuMDg0NiAxMi41MTc4IDE2LjIxMTYgMTIuMDkxNSAxNi4yMTU4IDExLjYyNkgxNC40OTU2QzE0LjQ4NzEgMTEuOTM0OSAxNC4zNzcxIDEyLjE4MjUgMTQuMTY1NSAxMi4zNjg3QzEzLjk1MzkgMTIuNTU0OSAxMy42Nzg5IDEyLjY0NzkgMTMuMzQwMyAxMi42NDc5QzEyLjkwMDIgMTIuNjQ3OSAxMi41NzIzIDEyLjQ5MzUgMTIuMzU2NCAxMi4xODQ2QzEyLjE0MDYgMTEuODc1NiAxMi4wMzI3IDExLjM2NzggMTIuMDMyNyAxMC42NjExVjEwLjQ3MDdDMTIuMDMyNyA5Ljc3MjQ2IDEyLjE0MTcgOS4yNjc4MiAxMi4zNTk2IDguOTU2NzlDMTIuNTc3NiA4LjY0NTc1IDEyLjkwMDIgOC40OTAyMyAxMy4zMjc2IDguNDkwMjNDMTMuNjc0NiA4LjQ5MDIzIDEzLjk1MzkgOC42MDEzMiAxNC4xNjU1IDguODIzNDlDMTQuMzc3MSA5LjA0NTY2IDE0LjQ4NzEgOS4zMzQ0NyAxNC40OTU2IDkuNjg5OTRIMTYuMjE1OEMxNi4yMDc0IDguODc3NDQgMTUuOTQzOSA4LjIyNjgxIDE1LjQyNTUgNy43MzgwNEMxNC45MDcxIDcuMjQ5MjcgMTQuMjE4NCA3LjAwNDg4IDEzLjM1OTQgNy4wMDQ4OFoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxwYXRoIGNsYXNzPSJmaWwwIiBkPSJNLTAgMC4yNzExMDFsMCAxLjczOTM1YzAsMC4xNDkxMTMgMC4xMjE5ODgsMC4yNzExMDEgMC4yNzExMDEsMC4yNzExMDFsMy4xNTEzMSAwIDAgLTIuMjgxNTUgLTMuMTUxMzEgMGMtMC4xNDkxMTMsMCAtMC4yNzExMDEsMC4xMjE5ODggLTAuMjcxMTAxLDAuMjcxMTAxeiIvPg0KICA8cG9seWdvbiBjbGFzcz0iZmlsMSIgcG9pbnRzPSIxLjQwOTIsMC42NzEwMzggMi4wODAyOCwxLjE0MDc3IDEuNDA5MiwxLjYxMDUxICIvPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIxOTY2NTUyIj4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NzY4IiBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMzIzOTU2bDAgMi4wNzg0NmMwLDAuMTc4MTg1IDAuMTQ1NzcxLDAuMzIzOTU2IDAuMzIzOTU2LDAuMzIzOTU2bDMuNzY1NzEgMCAwIC0yLjcyNjM4IC0zLjc2NTcxIDBjLTAuMTc4MTg1LDAgLTAuMzIzOTU2LDAuMTQ1NzcxIC0wLjMyMzk1NiwwLjMyMzk1NnoiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NTI4IiBjbGFzcz0iZmlsMSIgZD0iTTEuNjAzOCAwLjg4MjAzOGwwLjMyMDc1MSAwIDAgMC45NjIyNTQgLTAuMzIwNzUxIDAgMCAtMC45NjIyNTR6bTAuNTYxMzMyIDBsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAhCAYAAAAYucG/AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAA+SURBVHicY/H09pViYQACFi4uLgYWbm5uOAHncsG4/Pz8xKv79u0bA8vXr1/hBJz7Dcb9+PEjIXVzZs18BgAgpy6CcHz1VgAAAABJRU5ErkJggg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsLW9wYWNpdHk9IjAiIGQ9Ik01MSw0LjA0MXYyNS45MThDNTEsMzIuMTgyLDQ5LjE4MiwzNCw0Ni45NiwzNEgwVjBoNDYuOTZDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDENCgkJCUw1MSw0LjA0MXoiLz4NCgkJPHBhdGggaWQ9Il8xMjMzNzQxNDQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xOCwxNS43MzdsMi41MjYtMi41MjZsMy4zNjksMy4zNjlsMS42ODQtMS42ODVsLTMuMzY4LTMuMzY4TDI0LjczNiw5aC01LjA1M0gxOHYxLjY4NA0KCQkJVjE1LjczN3ogTTM0LDE4LjI2NGwtMi41MjcsMi41MjVsLTMuMzY4LTMuMzY4bC0xLjY4NSwxLjY4NWwzLjM2OSwzLjM2N0wyNy4yNjMsMjVoNS4wNTNIMzR2LTEuNjg1VjE4LjI2NHoiLz4NCgk8L2c+DQo8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMTAyIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjRkVGRUZFIiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMDUxIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjOTY5Njk2IiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTRweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgMTQgMTUiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDU4ICg4NDY2MykgLSBodHRwczovL3NrZXRjaC5jb20gLS0+CiAgICA8dGl0bGU+dGljay1jb21ib2JveDwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJQRC0zNzQ0LeKAlC0yIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNzkwLjAwMDAwMCwgLTQzMS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgaWQ9InRpY2stY29tYm9ib3giIHRyYW5zZm9ybT0idHJhbnNsYXRlKDc4OS4wMDAwMDAsIDQzMC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMy4zNDQ3NjY4LDEuNjU5MzMyNTIgTDUuOCwxMi41ODY3MjE4IEw1LjgsMTIuNTg2NzIxOCBMMi42MDU2MzE3Nyw4LjkzNDE5NjUyIEMyLjM1MzE1MjQxLDguNjQ1NTA0OTMgMS45MTQ0NDY2Nyw4LjYxNjE0OTExIDEuNjI1NzU1MDcsOC44Njg2Mjg0OCBDMS41NzczMDU0Miw4LjkxMTAwMDgyIDEuNTM0OTgxOTMsOC45NTk5MDMyNiAxLjUsOS4wMTM5MzE0OCBDMS4yMDYzNDk0OSw5LjQ2NzQ2MzE2IDEuMjYwMDExMDgsMTAuMDYyODI2MyAxLjYzMDAyNTk4LDEwLjQ1NjU0MDEgTDUuNDc5NzMxMTgsMTQuNTUyODEzNSBDNS42Njg4NDMyLDE0Ljc1NDAzNzkgNS45ODUyNzMzOSwxNC43NjM4NTY5IDYuMTg2NDk3NzcsMTQuNTc0NzQ0OSBDNi4yMTEyMjc0NywxNC41NTE1MDM4IDYuMjMzNTI2NzQsMTQuNTI1ODA1MyA2LjI1MzA1MDY3LDE0LjQ5ODA0NyBMMTQuNTM5MDU1MywyLjcxNzM0NDAzIEMxNC44MDE1Mjc3LDIuMzQ0MTcxNDggMTQuNzQxNjUzNywxLjgzMzM1NzAzIDE0LjQsMS41MzA5OTU4NyBDMTQuMTA2MjM3OCwxLjI3MTAxODMyIDEzLjY1NzM0MywxLjI5ODQwNjIyIDEzLjM5NzM2NTUsMS41OTIxNjg0NCBDMTMuMzc4NTAyNywxLjYxMzQ4MjQgMTMuMzYwOTM4MiwxLjYzNTkxMDg3IDEzLjM0NDc2NjgsMS42NTkzMzI1MiBaIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cG9seWxpbmUgaWQ9IlBhdGgtMiIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjIiIHBvaW50cz0iMiA5LjY1NjUyODE3IDUuODYxNjc5NzcgMTQgMTQgMiI+PC9wb2x5bGluZT4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjIsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9ItCh0LvQvtC5XzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMzVweCIgaGVpZ2h0PSIzNXB4IiB2aWV3Qm94PSIwIDAgMzUgMzUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDM1IDM1IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMTcuNSwzNUMyNy4xMzksMzUsMzUsMjcuMTM4LDM1LDE3LjVDMzUsNy44NjEsMjcuMTM5LDAsMTcuNSwwDQoJQzcuODYxLDAsMCw3Ljg2MSwwLDE3LjVDMCwyNy4xMzgsNy44NjEsMzUsMTcuNSwzNXoiLz4NCjxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTcuNTAwNSIgeTE9IjIuNjQ5OSIgeDI9IjE3LjUwMDUiIHkyPSIzMi4zNDkiPg0KCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiM1Q0IwRkYiLz4NCgk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMTI5MEZGIi8+DQo8L2xpbmVhckdyYWRpZW50Pg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9InVybCgjU1ZHSURfMV8pIiBkPSJNMTcuNSwzMy45OTljOS4wODgsMCwxNi41LTcuNDEyLDE2LjUtMTYuNDk5DQoJUzI2LjU4NywxLDE3LjUsMUM4LjQxMywxLDEuMDAxLDguNDEzLDEuMDAxLDE3LjVTOC40MTMsMzMuOTk5LDE3LjUsMzMuOTk5eiIvPg0KPHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTE4LjM2OCwyMi41aC0zYy0wLjAwOC0wLjQ2MywwLTAuODk3LDAtMWMwLTEuMDM3LDAuMDU1LTEuODgxLDAuMzk2LTIuNTUNCgljMC4zNDQtMC42NzMsMS4wMzMtMS40MjMsMi4wNjMtMi4yNjRjMS4wMjgtMC44MzUsMS42NDYtMS4zODQsMS44NDMtMS42NDZjMC4zMTMtMC40MDcsMC40NjgtMC44NjIsMC40NjgtMS4zNTQNCgljMC0wLjY4Ni0wLjI3NS0xLjI3My0wLjgyNC0xLjc2NmMtMC41NDktMC40ODktMS4yODUtMC43MzMtMi4yMTUtMC43MzNjLTAuODk2LDAtMS42NDYsMC4yNTctMi4yNTEsMC43NjcNCgljLTAuNjAxLDAuNTEtMS4wMTYsMS4yOTEtMS4yNDMsMi4zMzZsLTMuMjM2LTAuNDAzYzAuMDktMS41LDAuNzI5LTIuNzczLDEuOTEyLTMuODE5QzEzLjQ2Nyw5LjAyMiwxNS4wMTgsOC41LDE2Ljk0OCw4LjUNCgljMi4wMjMsMCwzLjYzNSwwLjUzMSw0LjgzNSwxLjU5YzEuMTk2LDEuMDU5LDEuNzk2LDIuMjg5LDEuNzk2LDMuNjk5YzAsMC43NzYtMC4yMjMsMS41MTQtMC42NiwyLjIwOA0KCWMtMC40NDEsMC42OTQtMS40NjEsMS41NS0yLjgyLDIuODM3QzE4Ljg2OCwyMCwxOC4zNjgsMjAuNSwxOC4zNjgsMjIuNUwxOC4zNjgsMjIuNXogTTE1LjM2OCwyNy40OTl2LTNoM3YzSDE1LjM2OHoiLz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjIsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9ItCh0LvQvtC5XzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMzVweCIgaGVpZ2h0PSIzNXB4IiB2aWV3Qm94PSIwIDAgMzUgMzUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDM1IDM1IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMTcuNSwzNUMyNy4xMzgsMzUsMzUsMjcuMTQsMzUsMTcuNUMzNSw3Ljg2MiwyNy4xMzgsMCwxNy41LDANCglDNy44NjEsMCwwLDcuODYyLDAsMTcuNUMwLDI3LjE0LDcuODYxLDM1LDE3LjUsMzV6Ii8+DQo8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE3LjQ5OTUiIHkxPSIyLjY1MDQiIHgyPSIxNy40OTk1IiB5Mj0iMzIuMzUwNCI+DQoJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGODI1QyIvPg0KCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRjREMTIiLz4NCjwvbGluZWFyR3JhZGllbnQ+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0idXJsKCNTVkdJRF8xXykiIGQ9Ik0xNy41LDM0YzkuMDg3LDAsMTYuNS03LjQxMiwxNi41LTE2LjUNCgljMC05LjA4OC03LjQxMi0xNi41LTE2LjUtMTYuNVMxLDguNDEzLDEsMTcuNUMxLDI2LjU4OCw4LjQxMiwzNCwxNy41LDM0eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xNS41LDkuMDAxYzAtMiwzLjk5OS0yLDMuOTk5LDBMMTguOTk5LDIxDQoJYy0wLjA2MSwxLjQ5OC0yLjkzNywxLjUtMywwTDE1LjUsOS4wMDF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTE3LjUsMjhjMS4xMDIsMCwyLTAuODk3LDItMmMwLTEuMTAyLTAuODk3LTItMi0yDQoJYy0xLjEwMiwwLTEuOTk5LDAuODk4LTEuOTk5LDJDMTUuNSwyNy4xMDMsMTYuMzk4LDI4LDE3LjUsMjh6Ii8+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkNPUlJFQ1QtSUNPTiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IgoJIHk9IjBweCIgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNCAyNDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNGRkZGRkY7fQoJLnN0MXtmaWxsOiM3Q0I5MTE7fQo8L3N0eWxlPgo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPgo8cGF0aCBpZD0iU2hhcGVfM19jb3B5IiBjbGFzcz0ic3QxIiBkPSJNMTIsMkM2LjUsMiwyLDYuNSwyLDEyczQuNSwxMCwxMCwxMHMxMC00LjUsMTAtMTBTMTcuNSwyLDEyLDJ6IE0xNy45LDguOWwtNy43LDcuNwoJYy0wLjQsMC40LTAuOSwwLjQtMS4zLDBsLTMuMi0zLjJjLTAuNC0wLjQtMC40LTAuOSwwLTEuM3MwLjktMC40LDEuMywwbDIuNSwyLjVsNy4xLTcuMWMwLjMtMC40LDAuOS0wLjQsMS4zLDAKCUMxOC4yLDcuOSwxOC4yLDguNSwxNy45LDguOUMxNy45LDguOSwxNy45LDguOSwxNy45LDguOXoiLz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIKCSB5PSIwcHgiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjQgMjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGNpcmNsZSBmaWxsPSIjRkZGRkZGIiBjeD0iMTIiIGN5PSIxMiIgcj0iMTIiLz4KPHBhdGggZmlsbD0iI2Y3YjQ0NSIgZD0iTTEyLDJDNi41LDIsMiw2LjUsMiwxMnM0LjUsMTAsMTAsMTBzMTAtNC41LDEwLTEwUzE3LjUsMiwxMiwyeiBNMTcuOSw4LjlsLTcuNyw3LjcKCWMtMC40LDAuNC0wLjksMC40LTEuMywwbC0zLjItMy4yYy0wLjQtMC40LTAuNC0wLjksMC0xLjNzMC45LTAuNCwxLjMsMGwyLjUsMi41bDcuMS03LjFjMC4zLTAuNCwwLjktMC40LDEuMywwCglDMTguMiw3LjksMTguMiw4LjUsMTcuOSw4LjlDMTcuOSw4LjksMTcuOSw4LjksMTcuOSw4Ljl6Ii8+Cjwvc3ZnPgo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IklOQ09SUkVDVC1JQ09OIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiCgkgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDI0IDI0OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6I0ZGRkZGRjt9Cgkuc3Qxe2ZpbGw6I0Y5NjAzRDt9Cjwvc3R5bGU+CjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjEyIiBjeT0iMTIiIHI9IjEyIi8+CjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0xMiwyQzYuNSwyLDIsNi41LDIsMTJzNC41LDEwLDEwLDEwczEwLTQuNSwxMC0xMFMxNy41LDIsMTIsMnogTTE2LjQsOC44TDEzLjIsMTJsMi45LDIuOQoJYzAuMywwLjMsMC4zLDAuOSwwLDEuMmMtMC4zLDAuMy0wLjksMC4zLTEuMiwwbDAsMEwxMiwxMy4ybC0zLjIsMy4yYy0wLjMsMC4zLTAuOSwwLjMtMS4yLDBzLTAuMy0wLjksMC0xLjJsMy4yLTMuMkw3LjksOS4xCgljLTAuMy0wLjMtMC4zLTAuOSwwLTEuMnMwLjktMC4zLDEuMiwwbDIuOSwyLjlsMy4yLTMuMmMwLjMtMC4zLDAuOS0wLjMsMS4yLDBDMTYuNyw3LjksMTYuOCw4LjQsMTYuNCw4LjgKCUMxNi40LDguOCwxNi40LDguOCwxNi40LDguOHoiLz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkFOU1dFUkVELUlDT04iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIKCSB5PSIwcHgiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjQgMjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbDojRkZGRkZGO30KCS5zdDF7ZmlsbDojNTI4QkRGO30KPC9zdHlsZT4KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMTIiIGN5PSIxMiIgcj0iMTIiLz4KPHBhdGggY2xhc3M9InN0MSIgZD0iTTEyLDIyQzYuNSwyMiwyLDE3LjUsMiwxMlM2LjUsMiwxMiwyczEwLDQuNSwxMCwxMFMxNy41LDIyLDEyLDIyeiBNOSwxMUg3djJoMlYxMXogTTEzLDExaC0ydjJoMlYxMXogTTE3LDExCgloLTJ2MmgyVjExeiIvPgo8L3N2Zz4K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkNPUlJFQ1QtSUNPTiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IgoJIHk9IjBweCIgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNCAyNDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNGRkZGRkY7fQoJLnN0MXtmaWxsOiM1MjhCREY7fQo8L3N0eWxlPgo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPgo8cGF0aCBpZD0iU2hhcGVfM19jb3B5IiBjbGFzcz0ic3QxIiBkPSJNMTIsMkM2LjUsMiwyLDYuNSwyLDEyczQuNSwxMCwxMCwxMHMxMC00LjUsMTAtMTBTMTcuNSwyLDEyLDJ6IE0xNy45LDguOWwtNy43LDcuNwoJYy0wLjQsMC40LTAuOSwwLjQtMS4zLDBsLTMuMi0zLjJjLTAuNC0wLjQtMC40LTAuOSwwLTEuM3MwLjktMC40LDEuMywwbDIuNSwyLjVsNy4xLTcuMWMwLjMtMC40LDAuOS0wLjQsMS4zLDAKCUMxOC4yLDcuOSwxOC4yLDguNSwxNy45LDguOUMxNy45LDguOSwxNy45LDguOSwxNy45LDguOXoiLz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,"+c("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMiAxOCIgd2lkdGg9IjEycHgiIGhlaWdodD0iMTZweCI+DQoJPGRlZnM+DQoJCTxzdHlsZT4NCgkJCS5ub3JtYWwgew0KCQkJCWZpbGw6IHt0ZXh0fTsNCgkJCQlvcGFjaXR5OiAwLjc7DQoJCQkJaXNvbGF0aW9uOmlzb2xhdGU7DQoJCQl9DQoJCTwvc3R5bGU+DQoJPC9kZWZzPg0KCTxwYXRoIGNsYXNzPSJub3JtYWwiIGQ9Ik0xMCwwSDJBMiwyLDAsMCwwLDAsMlYxOGwyLS4yMiw0LTMuNjYsNCwzLjY2TDEyLDE4VjJBMiwyLDAsMCwwLDEwLDBaTTIsMmg4VjE0LjQ5bC00LTMtNCwzWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCkiLz4NCjwvc3ZnPg=="), +"data:image/svg+xml;base64,"+c("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMiAxOCIgd2lkdGg9IjEycHgiIGhlaWdodD0iMTZweCI+DQoJPGRlZnM+DQoJCTxzdHlsZT4NCgkJCS5vdmVyIHsNCgkJCQlmaWxsOiB7bGlzdEl0ZW0ubGFiZWwub3Zlcn07DQoJCQkJb3BhY2l0eTogMC43Ow0KCQkJCWlzb2xhdGlvbjppc29sYXRlOw0KCQkJfQ0KCQk8L3N0eWxlPg0KCTwvZGVmcz4NCgk8cGF0aCBjbGFzcz0ib3ZlciIgZD0iTTEwLDBIMkEyLDIsMCwwLDAsMCwyVjE4bDItLjIyLDQtMy42Niw0LDMuNjZMMTIsMThWMkEyLDIsMCwwLDAsMTAsMFpNMiwyaDhWMTQuNDlsLTQtMy00LDNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwKSIvPg0KPC9zdmc+"), +"data:image/svg+xml;base64,"+c("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMiAxOCIgd2lkdGg9IjEycHgiIGhlaWdodD0iMTZweCI+DQoJPGRlZnM+DQoJCTxzdHlsZT4NCgkJCS5zZWxlY3RlZCB7DQoJCQkJZmlsbDoge2xpc3RJdGVtLmxhYmVsLnByZXNzZWR9Ow0KCQkJCW9wYWNpdHk6IDAuNzsNCgkJCQlpc29sYXRpb246aXNvbGF0ZTsNCgkJCX0NCgkJPC9zdHlsZT4NCgk8L2RlZnM+DQoJPHBhdGggY2xhc3M9InNlbGVjdGVkIiBkPSJNMTAsMEgyQTIsMiwwLDAsMCwwLDJWMThsMi0uMjIsNC0zLjY2LDQsMy42NkwxMiwxOFYyQTIsMiwwLDAsMCwxMCwwWk0yLDJoOFYxNC40OWwtNC0zLTQsM1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDApIi8+DQo8L3N2Zz4="), +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAADcmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmFjOGVjNDFhLTZkYWItODQ0Ni04YzkzLWU1Mjk3N2YwMmE4NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFRThCNzU3NDYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFRThCNzU3MzYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cykiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0OWFlZmI1OC00ZWFmLWQ3NDgtYTI0ZS0zNmNhNGQ2M2QwNTYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6N0MwQkFBM0M2MjAxMTFFNUI4QjBERTk4MjY5MjQwQjUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6MGSVVAAAE3klEQVR42uycW4hWVRiG15Q4eYzGQySSQlriEQ9BF2mE4iSdESRRIb0RD+mNmHgICjqQEGUe6sqgCy1i0iRinAzELrooQhHLGQURUTzMiM7omCLj+/F/czX/t/890z6s9e/3hZcZ1l6z19r7mXXca62arq4uR/mjh/gKCIQiEAKhCIRAKAIhEIpACIQiEIpACIQiEAKhCIRAKAIhEMoX9Yu62NbWxjcUobq6OpaQQpcQz/QwPBOeDU+Fx8Oj4UfhoRrnJnwDvgC3wCfgY/Bf8P0QHrImahmQB1VWLfwGvAieqy+/LxJIR+Dv4QPwf75WWb4CGQavg9fo70mqFd4F79DfCSRCA+HN8Hp4cMppdcBfwB/Bt9mo99Sr8Cl4SwYwnKYhaf2jaXMconoE/hL+CR6TQ/pPato7NS+FbtSfgH+Gp8eMfwv+HT6qpakZvqzVT/d//ePw0/BEeI72ygbFvP/f8MvwpSK2IfLSGuGxFeJ1aby98CG4s5fpDNAqaTlcL89cIf45jddcpDZknI4PKsFo0NKzQLusnX1Iq1P/doHe60CF+GM1b+OK0obIYO5XeGREnLPwfHghfDzBtOVeb+q9z0bEG6njltHVDqQ2RuP9HTwDbkoxH02axv4YjX1tNQP5LKIBl7ZiK/yWToGkLUljsaZpNaTTNc9VCeR1eHUEjHfgD3OoQiXNVRFQVmveqwrIEHh3xPXNOp2Rl77WPFiSvA+tJiCb4FHGNanHP/FggCp52Gdck7y/Wy0Dw2Hatx9s9KZmZNRmxC3JMjh8qsy1Du0St4Y+DomaKFzlEQxRu+apnOQZ1oVeZfWPeMCGlLu2/6dL3BDRwPcPGYiMjocbvaoPnL963+h1DddnChbIMiP8cMIj8KQln34be/lM3gOREW69cW2v81/fGOH1aY7e0wTyrNGYyxT6wQCAHNS8lmvcZ4UIZL4RLt8z7gQA5I7mtZyeCxHIS0b4UReOrLw+EyIQqxScDAiIldcJIQLZYTTmvwUEpMUIHxMikB/gta40PXIF/lwHVrcCAnLVCH8srQR9X7mYt2RUbq1yrOFia390N9SReugaYoR3EEg+GmGEtxNIPhpvhJ8nkHw02Qj/l0Dy0Rwj/DSBZC9ZeD3buPYHgWSv11z5RdrSw/qTQLLX20Z4o0toSxyBxJdsKrVmq79NM2ECKa/3XPltC9fgXwgkW81zpVX35fSVS3HahEB6SqZK9hjXujeJOgLJTrLG19qos1OrLALJSLL+eLFx7SL8cRaZIJCSVrrSfnVL8qHtJoFkoy3ablibQeWz849ZZaZfgUHIfg/Z97EkIs5xLR2OQNLv2u5x0Ttt5UShV1wfj91glRVP01xp8UVTBRiyuOFFheJYQpKVzNrKwQErXPyDA2SF+5k8MhsykCnwPdfzaA3ZYy6nREyCX4Cfd/EPs+nV0RoEUlqWsx1eCie9Bkc2nW5wOa87Dg3Ipy75bWXntSd1yIcHDK1RT3KzTIcOBif6AqOo3d42HX/I0tZW3zIXWgnp68chmfaQjZxyoKac0bXNRxghlpCN2m1dpj/btXEfpD0uqYaua89Luq3dx8TKN3AeE1vt4mLrAohACIQiEAKhCIRAKAIhEIpACq7IqROKJYRA+AoIhCIQAqEIhEAoAiEQikCKrQcCDABHPgH2w7NQdAAAAABJRU5ErkJggg==", +"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxOSIgdmlld0JveD0iMCAwIDE3IDE5Ij4KICA8bWV0YWRhdGE+PD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIi8+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PjwvbWV0YWRhdGE+CjxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgICAgZmlsbC1ydWxlOiBldmVub2RkOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBpZD0iU2hhcGVfMTUwMF9jb3B5XzciIGRhdGEtbmFtZT0iU2hhcGUgMTUwMCBjb3B5IDciIGNsYXNzPSJjbHMtMSIgZD0iTTY3NDUsNjc3bC01LTUsNS01djNoMTB2NGgtMTB2M1ptNy0xLDUsNS01LDV2LTNoLTEwdi00aDEwdi0zWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTY3NDAgLTY2NykiLz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOSIgaGVpZ2h0PSIxNyIgdmlld0JveD0iMCAwIDE5IDE3Ij4KICA8bWV0YWRhdGE+PD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIi8+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PjwvbWV0YWRhdGE+CjxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgICAgZmlsbC1ydWxlOiBldmVub2RkOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBpZD0iU2hhcGVfMTUwMF9jb3B5XzciIGRhdGEtbmFtZT0iU2hhcGUgMTUwMCBjb3B5IDciIGNsYXNzPSJjbHMtMSIgZD0iTTY3NDksNjgwbC01LDUtNS01aDNWNjcwaDR2MTBoM1ptLTEtNyw1LTUsNSw1aC0zdjEwaC00VjY3M2gtM1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02NzM5IC02NjgpIi8+Cjwvc3ZnPgo=", +"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICB3aWR0aD0iMjhweCIgaGVpZ2h0PSIzM3B4IiB2aWV3Qm94PSIwIDAgMjguMzAyIDMzLjI0MiI+DQoJPHBhdGggZD0iTTAsMS44VjMxLjQ0MmExLjgsMS44LDAsMCwwLDIuNzI2LDEuNTQzbDI0LjctMTQuODJhMS44LDEuOCwwLDAsMCwwLTMuMDg3TDIuNzI2LjI1N0ExLjgsMS44LDAsMCwwLDAsMS44WiIgc3R5bGU9ImZpbGw6IzMzMyIvPg0KPC9zdmc+","data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyOHB4IiBoZWlnaHQ9IjMzcHgiIHZpZXdCb3g9IjAgMCAyOC4zMDIgMzMuMjQyIj4NCgk8cGF0aCBkPSJNMCwxLjhWMzEuNDQyYTEuOCwxLjgsMCwwLDAsMi43MjYsMS41NDNsMjQuNy0xNC44MmExLjgsMS44LDAsMCwwLDAtMy4wODdMMi43MjYuMjU3QTEuOCwxLjgsMCwwLDAsMCwxLjhaIiBzdHlsZT0iZmlsbDojNTI4YmRmIi8+DQo8L3N2Zz4="]; +return"/* reset styles */* {box-sizing: border-box;-webkit-touch-callout: none;-webkit-user-select: none;-ms-user-select: none;user-select: none; }input,textarea {-webkit-user-select: text;-ms-user-select: text;user-select: text; }html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video {margin: 0;padding: 0;border: 0; }/* HTML5 display-role reset for older browsers */article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section {display: block; }ol,ul {list-style: none; }table {border-collapse: collapse;border-spacing: 0; }div {-webkit-tap-highlight-color: rgba(0, 0, 0, 0);-webkit-user-drag: none; }input {-webkit-appearance: none;-moz-appearance: none; } input::-ms-clear {display: none; }.clear {clear: both; }*::-moz-focus-inner {border: 0; }body {margin: 0;padding: 0;overflow: hidden;cursor: default;-ms-touch-action: pan-y;touch-action: pan-y;-webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body .password_form, body .info_panel {position: absolute;background: #F7F7F7;border-radius: 4px;width: 513px;height: 210px;font-family: Arial; } body .password_form *, body .info_panel * {box-sizing: border-box; } body .password_form .password_label {position: absolute;color: #3A3A3A;font-size: 15px;top: 63px;left: 55px; } body .password_form .wrong_password_label {position: absolute;color: #DD4A37;font-size: 12px;top: 131px;left: 55px; } body .password_form input {position: absolute;width: 330px;height: 32px;background: #FFFFFF;border: 1px solid #D1D2D4;padding: 1px;border-radius: 2px;font-size: 18px;color: #231F20;left: 54px;top: 94px;padding-left: 8px; } body .password_form button {border: transparent;background: transparent;color: #343434;font-family: Arial;font-size: 15px;text-shadow: 0 1px 0 rgba(255, 255, 255, 0.4); } body .password_form button::before {background: linear-gradient(to bottom, #D3D3D3, #BABABA);position: absolute;content: '';top: 0;right: 0;bottom: 0;left: 0;border-radius: 4px;z-index: -1; } body .password_form button::after {background: linear-gradient(to bottom, #DCDCDC, #D1D1D1);position: absolute;content: '';top: 1px;right: 1px;bottom: 1px;left: 1px;border-radius: 4px;z-index: -1; } body .password_form .btn_ok {position: absolute;top: 94px;right: 55px;width: 60px;height: 32px;opacity: 0.99; } body .info_panel {display: table; } body .info_panel .label {position: static;display: table-cell;vertical-align: middle;width: 100%;padding-left: 120px;padding-right: 40px;color: #3A3A3A;font-size: 15px; } body .info_panel::after {position: absolute;content: '';width: 63px;height: 63px;top: 73px;left: 46px; } body .info_panel.domain::after {background: transparent url("+ +g[0]+"); } body .info_panel.time::after {background: transparent url("+g[1]+"); }.component_base,.component_container {position: absolute; }:focus {outline: none; }::-moz-focus-inner {border: 0; }input {appearance: none; }button {cursor: pointer;margin: 0;border: 0; }button[disabled] {cursor: default; }.__player_view_id__ {position: absolute; } .__player_view_id__ > * {position: absolute; } .__player_view_id__ .slide {white-space: nowrap;font-size: 0; } .__player_view_id__ .slide a {text-decoration: none;cursor: pointer; } .__player_view_id__ .slide a img {border: 0; } .__player_view_id__ .slide * {-ms-transform-origin: 0 0;transform-origin: 0 0; } .__player_view_id__ .slide.relpos, .__player_view_id__ .slide .relpos {position: relative !important;vertical-align: top; } .__player_view_id__ .slide.kern, .__player_view_id__ .slide .kern {text-rendering: optimizeLegibility;font-feature-settings: 'kern' 1, 'liga' 0; } .__player_view_id__ .slide.nokern, .__player_view_id__ .slide .nokern {text-rendering: optimizeSpeed;font-feature-settings: 'kern' 0, 'liga' 0; } .__player_view_id__ .fullscreen {-ms-transform: none !important;transform: none !important;top: 0 !important;left: 0 !important; } .__player_view_id__ .fullscreen > video, .__player_view_id__ .fullscreen .video_player {background-color: black;width: __slide_width__ !important;height: __slide_height__ !important;z-index: 100;-ms-transform: none !important;transform: none !important; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen {background: url("+ +g[2]+") no-repeat; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen:hover {background: url("+g[3]+") no-repeat; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen:active {background: url("+g[4]+") no-repeat; } .__player_view_id__ .video_player video {width: 100%;height: 100%;margin: auto;top: 0;right: 0;bottom: 0;left: 0; } .__player_view_id__ .video_player video::cue {color: #FFFFFF;background-color: rgba(8, 8, 8, 0.75);border-radius: 4px;font-family: Helvetica, Roboto, Arial, sans-serif;line-height: 1.1; } .__player_view_id__ .video_player.poster_frame_hide_video video {display: none; } .__player_view_id__ .video_player.poster_frame video {opacity: 0; } .__player_view_id__ .video_player.poster_frame_hide_video .poster, .__player_view_id__ .video_player.poster_frame .poster {position: absolute;width: 100%;height: 100%; } .__player_view_id__ .video_player .controls {height: 36px;background: rgba(45, 50, 55, 0.85098);border: 1px solid #444648;cursor: default;border-radius: 4px; } .__player_view_id__ .video_player .controls, .__player_view_id__ .video_player .controls * {backface-visibility: hidden; } .__player_view_id__ .video_player .controls .progress {background-color: #75787A;height: 14px;left: 64px;top: 0;bottom: 0;margin-top: auto;margin-bottom: auto;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark {width: 10px;height: 10px;margin-top: -5px;margin-left: -5px;top: 50%;background: url("+ +g[5]+") no-repeat;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark:hover, .__player_view_id__ .video_player .controls .progress .bookmark:active {background: url("+g[6]+") no-repeat; } .__player_view_id__ .video_player .controls .progress .loading {background-color: #B1B3B5;height: 100%; } .__player_view_id__ .video_player .controls .progress .playing {background-color: #FFFFFF;height: 100%; } .__player_view_id__ .video_player .controls .progress .tooltip {background: url("+ +g[7]+") no-repeat;width: 60px;height: 25px;top: -33px;margin-left: -30px;font-family: Arial;font-size: 12px;padding-top: 2px;text-align: center; } .__player_view_id__ .video_player .controls .volume_popup {border-radius: 3px;background: rgba(45, 50, 55, 0.85098);top: -67px;right: 65px;padding: 8px;box-sizing: border-box;width: 28px;height: 64px; } .__player_view_id__ .video_player .controls .volume_popup .volume {background: url("+g[8]+");position: relative;cursor: pointer;width: 12px;height: 48px; } .__player_view_id__ .video_player .controls .volume_popup .volume .back {background: url("+ +g[9]+");width: 100%; } .__player_view_id__ .video_player .controls button {width: 100%;height: 100%; } .__player_view_id__ .video_player .controls button.rate {background: url("+g[10]+") no-repeat center; } .__player_view_id__ .video_player .controls button.rate.selected {background-color: rgba(255, 255, 255, 0.1); } .__player_view_id__ .video_player .controls button.mute {background: url("+g[11]+"); } .__player_view_id__ .video_player .controls button.mute:hover {background: url("+ +g[12]+"); } .__player_view_id__ .video_player .controls button.mute:active {background: url("+g[13]+"); } .__player_view_id__ .video_player .controls button.mute.selected {background: url("+g[14]+"); } .__player_view_id__ .video_player .controls button.mute.selected:hover {background: url("+g[15]+"); } .__player_view_id__ .video_player .controls button.mute.selected:active {background: url("+g[16]+"); } .__player_view_id__ .video_player .controls button.subtitles {background: url("+ +g[17]+") no-repeat center; } .__player_view_id__ .video_player .controls button.subtitles.selected {background-color: rgba(255, 255, 255, 0.1); } .__player_view_id__ .video_player .controls button.play {background: url("+g[18]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:hover {background: url("+g[19]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:active {background: url("+g[20]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected {background: url("+ +g[21]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:hover {background: url("+g[22]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:active {background: url("+g[23]+") no-repeat; } .__player_view_id__ .video_player .controls button.play::after {background: url("+g[24]+");width: 1px;height: 32px;right: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls button.toggle_fullscreen {background: url("+ +g[25]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:hover {background: url("+g[26]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:active {background: url("+g[27]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen::before {background: url("+g[24]+") no-repeat;width: 1px;height: 32px;left: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls .subtitles-list {width: 195px;right: 0;border-radius: 4px;border: solid 1px #444648;background-color: rgba(45, 50, 55, 0.85);font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;font-weight: normal;font-stretch: normal;font-style: normal;line-height: normal;letter-spacing: normal;padding: 3px 0;bottom: 37px; } .__player_view_id__ .video_player .controls .subtitles-list__caption {position: relative !important;padding: 12px 0 22px 0;color: #b8b8b8;text-align: center; } .__player_view_id__ .video_player .controls .subtitles-list__caption::after {position: absolute;content: '';width: calc(100% - 20px);left: 0;right: 0;bottom: 5px;margin: auto;border-bottom: 1px solid #444648; } .__player_view_id__ .video_player .controls .subtitles-list__item {color: #b8b8b8;position: relative !important;padding: 10px 2px 10px 35px;cursor: pointer;overflow: hidden;text-overflow: ellipsis; } .__player_view_id__ .video_player .controls .subtitles-list__item.subtitles-list__item_active {background-color: rgba(255, 255, 255, 0.1);color: #FFFFFF; } .__player_view_id__ .video_player .controls .subtitles-list__item[aria-selected='true'] {background-color: rgba(0, 0, 0, 0.24);color: #FFFFFF;padding-left: 12px; } .__player_view_id__ .video_player .controls .subtitles-list__item[aria-selected='true']::before {background: url("+ +g[28]+") no-repeat;width: 14px;height: 15px;padding-right: 23px;content: ''; } .__player_view_id__ .video_player .controls .toggle_fullscreen {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .play {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .rate {width: 32px;height: 34px;right: 95px;top: 0; } .__player_view_id__ .video_player .controls .rate.rate_subtitle-button-next {right: 127px; } .__player_view_id__ .video_player .controls .playback-rate-menu {width: 120px;right: 51px;border-radius: 4px;border: solid 1px #444648;background-color: rgba(45, 50, 55, 0.85);font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;font-weight: normal;font-stretch: normal;font-style: normal;line-height: normal;letter-spacing: normal;padding: 3px 0;bottom: 37px; } .__player_view_id__ .video_player .controls .playback-rate-menu.playback-rate-menu_subtitle-button-next {right: 83px; } .__player_view_id__ .video_player .controls .playback-rate-menu__caption {position: relative !important;padding: 12px 0 22px 0;color: #b8b8b8;text-align: center; } .__player_view_id__ .video_player .controls .playback-rate-menu__caption::after {position: absolute;content: '';width: calc(100% - 20px);left: 0;right: 0;bottom: 5px;margin: auto;border-bottom: 1px solid #444648; } .__player_view_id__ .video_player .controls .playback-rate-menu__item {color: #b8b8b8;position: relative !important;padding: 10px 2px 10px 35px;cursor: pointer;overflow: hidden;text-overflow: ellipsis; } .__player_view_id__ .video_player .controls .playback-rate-menu__item.playback-rate-menu__item_active {background-color: rgba(255, 255, 255, 0.1);color: #FFFFFF; } .__player_view_id__ .video_player .controls .playback-rate-menu__item[aria-selected='true'] {background-color: rgba(0, 0, 0, 0.24);color: #FFFFFF;padding-left: 12px; } .__player_view_id__ .video_player .controls .playback-rate-menu__item[aria-selected='true']::before {background: url("+ +g[28]+") no-repeat;width: 14px;height: 15px;padding-right: 23px;content: ''; } .__player_view_id__ .video_player .controls .subtitles {width: 32px;height: 34px;right: 95px;top: 0; } .__player_view_id__ .video_player .controls .toggle_fullscreen {right: -1px; } .__player_view_id__ .video_player .controls .mute {width: 22px;height: 22px;right: 67px;top: 6px; }.popup_layer {position: absolute; } .popup_layer .modal_layer {background: #000000;opacity: 0.4;z-index: 10;width: 100%;height: 100%; } .popup_layer .message_box, .popup_layer .confirm_window {background: #FFFFFF;border-radius: 5px;border: 1px solid rgba(0, 0, 0, 0.75);width: 357px;height: 150px;position: absolute;top: 0;right: 0;bottom: 0;left: 0;margin: auto;z-index: 10; } .popup_layer .message_box::after, .popup_layer .confirm_window::after {background-color: #E6E6E6;width: 100%;height: 1px;top: 30px;position: absolute;content: ''; } .popup_layer .message_box .title, .popup_layer .message_box .message, .popup_layer .confirm_window .title, .popup_layer .confirm_window .message {font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;color: #323232; } .popup_layer .message_box .title, .popup_layer .confirm_window .title {position: absolute;left: 13px;top: 7px;font-weight: bold;background: transparent; } .popup_layer .message_box .message, .popup_layer .confirm_window .message {position: absolute;top: 47px;left: 69px;margin-right: 25px; } .popup_layer .message_box .message::before, .popup_layer .confirm_window .message::before {background-color: #E6E6E6;width: 35px;height: 35px;left: -45px;position: absolute;content: ''; } .popup_layer .message_box button, .popup_layer .confirm_window button {font-size: 14px;border-radius: 5px;color: #323232;width: 68px;height: 30px; } .popup_layer .message_box button, .popup_layer .message_box button.mobile:hover, .popup_layer .message_box button.mobile:active, .popup_layer .confirm_window button, .popup_layer .confirm_window button.mobile:hover, .popup_layer .confirm_window button.mobile:active {background: #D4D4D4; } .popup_layer .message_box button:hover, .popup_layer .message_box button:active, .popup_layer .message_box button.mobile.active, .popup_layer .confirm_window button:hover, .popup_layer .confirm_window button:active, .popup_layer .confirm_window button.mobile.active {background: #B8B8B8; } .popup_layer .confirm_window button.btn_yes {left: 101px;top: 98px; } .popup_layer .confirm_window button.btn_no {left: 181px;top: 98px; } .popup_layer .confirm_window .message::before {background: url("+ +g[29]+"); } .popup_layer .message_box button.btn_ok {left: 141px;top: 98px; } .popup_layer .message_box .message::before {background: url("+g[30]+"); }.transitionSlide.paused * {animation-play-state: paused !important; }.framesLayer .video_player {-ms-transform-origin: 0 0;transform-origin: 0 0; }.framesLayer *:not(.framesLayerContent) {pointer-events: all; }.framesLayer .framesLayerContent {position: absolute; } .framesLayer .framesLayerContent > div {pointer-events: all; }.trial_banner {position: relative;transform: translateZ(0); } .trial_banner .banner-content, .trial_banner .banner-content_hover {position: absolute;left: 0;right: 0;top: 0;bottom: 0;width: 100%;height: 100%; } .trial_banner .banner-content {visibility: visible;z-index: 1; } .trial_banner .banner-content_hover {visibility: hidden;z-index: 0; } .trial_banner .days_remaining {position: absolute;font-family: 'Open Sans', Arial, sans-serif;font-weight: normal;font-size: 13px;left: 65px;top: 41px;color: #7C1645;z-index: 1; } .trial_banner:hover .banner-content {visibility: hidden;z-index: 0; } .trial_banner:hover .banner-content_hover {visibility: visible;z-index: 1; }.popup-layer {top: 0;right: 0;bottom: 0;left: 0;z-index: 1;position: absolute;border-radius: inherit; }.modal-layer {background: #000000;opacity: 0.4;position: absolute;width: 100%;height: 100%;border-radius: inherit; }.slide-transiting .quiz-uikit-primary-button {transition: none; }.slide-transiting .quiz-uikit-secondary-button {transition: none; }.slide-transiting .quiz-uikit-link-button {transition: none; }.slide-transiting .visuals-uikit-primary-button {transition: none; }.slide-transiting .visuals-uikit-secondary-button {transition: none; }.slide-transiting .visuals-uikit-link-button {transition: none; }.uikit-primary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-primary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-primary-button.uikit-primary-button_size_medium {padding: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:first-child {margin-left: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:last-child {margin-right: 10px; } .uikit-primary-button.uikit-primary-button_size_small {padding: 6px 12px; } .uikit-primary-button.uikit-primary-button_size_small .uikit-primary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-primary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__button-text {margin-right: 8px; } .uikit-primary-button__left-icon {margin-right: 8px; } .uikit-primary-button__button-text:first-child {margin-left: 0; } .uikit-primary-button__button-text:last-child {margin-right: 0; } .uikit-primary-button__left-icon:first-child {margin-left: 0; } .uikit-primary-button__left-icon:last-child {margin-right: 0; } .uikit-primary-button__right-icon:first-child {margin-left: 0; } .uikit-primary-button__right-icon:last-child {margin-right: 0; } .uikit-primary-button[disabled] {opacity: 0.4; } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-secondary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-secondary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-secondary-button.uikit-secondary-button_size_medium {padding: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:first-child {margin-left: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:last-child {margin-right: 10px; } .uikit-secondary-button.uikit-secondary-button_size_small {padding: 6px 12px; } .uikit-secondary-button.uikit-secondary-button_size_small .uikit-secondary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-secondary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__button-text {margin-right: 8px; } .uikit-secondary-button__left-icon {margin-right: 8px; } .uikit-secondary-button__button-text:first-child {margin-left: 0; } .uikit-secondary-button__button-text:last-child {margin-right: 0; } .uikit-secondary-button__left-icon:first-child {margin-left: 0; } .uikit-secondary-button__left-icon:last-child {margin-right: 0; } .uikit-secondary-button__right-icon:first-child {margin-left: 0; } .uikit-secondary-button__right-icon:last-child {margin-right: 0; } .uikit-secondary-button[disabled] {opacity: 0.4; } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-link-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-link-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-link-button.uikit-link-button_size_medium {padding: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text {font-size: 17px;line-height: 20px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:first-child {margin-left: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:last-child {margin-right: 10px; } .uikit-link-button.uikit-link-button_size_small {padding: 6px 12px; } .uikit-link-button.uikit-link-button_size_small .uikit-link-button__button-text {font-size: 14px;line-height: 20px; } .uikit-link-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__button-text {margin-right: 8px; } .uikit-link-button__left-icon {margin-right: 8px; } .uikit-link-button__button-text:first-child {margin-left: 0; } .uikit-link-button__button-text:last-child {margin-right: 0; } .uikit-link-button__left-icon:first-child {margin-left: 0; } .uikit-link-button__left-icon:last-child {margin-right: 0; } .uikit-link-button__right-icon:first-child {margin-left: 0; } .uikit-link-button__right-icon:last-child {margin-right: 0; } .uikit-link-button[disabled] {opacity: 0.4; } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-primary-button {background: var(--primary-button-background-color, var(--primary-button-background-color));color: var(--primary-button-text-color, var(--primary-button-text-color)); } .uikit-primary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--primary-button-border-color, var(--primary-button-border-color));background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-primary-button__button-text {font-family: var(--font-family-bold);font-weight: 700; } .uikit-primary-button.uikit-primary-button_active, .uikit-primary-button[aria-pressed='true'], .uikit-primary-button:focus {background: var(--primary-button-background-color-active, var(--primary-button-background-color-active));color: var(--primary-button-text-color-active, var(--primary-button-text-color-active)); } .uikit-primary-button.uikit-primary-button_active::after, .uikit-primary-button[aria-pressed='true']::after, .uikit-primary-button:focus::after {background: var(--primary-button-border-color-active, var(--primary-button-border-color-active));background-origin: border-box; }.uikit-secondary-button {background: var(--secondary-button-background-color, var(--secondary-button-background-color));color: var(--secondary-button-text-color, var(--secondary-button-text-color)); } .uikit-secondary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--secondary-button-border-color, var(--secondary-button-border-color));background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-secondary-button__button-text {font-family: var(--font-family-normal); } .uikit-secondary-button.uikit-secondary-button_active, .uikit-secondary-button[aria-pressed='true'], .uikit-secondary-button:focus {background: var(--secondary-button-background-color-active, var(--secondary-button-background-color-active));color: var(--secondary-button-text-color-active, var(--secondary-button-text-color-active)); } .uikit-secondary-button.uikit-secondary-button_active::after, .uikit-secondary-button[aria-pressed='true']::after, .uikit-secondary-button:focus::after {background: var(--secondary-button-border-color-active, var(--secondary-button-border-color-active));background-origin: border-box; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 15px; }.uikit-link-button {background: var(--link-button-background-color);color: var(--link-button-text-color);border: none; } .uikit-link-button.uikit-link-button_active, .uikit-link-button[aria-pressed='true'] {background: var(--link-button-background-color); }.uikit-collapsed-control {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;position: relative;overflow: hidden;padding: 10px;border: none;border-radius: var(--button-border-radius);background: var(--secondary-button-background-color-active);color: var(--secondary-button-text-color-active);transition-property: background, color;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-collapsed-control::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--secondary-button-border-color-active);background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-collapsed-control__collapsed-component {cursor: pointer;display: -ms-flexbox;display: flex; } .uikit-collapsed-control__expanded-component {margin-left: 8px;opacity: 1;transition-property: width, opacity;transition-duration: 300ms;transition-timing-function: ease; } .uikit-collapsed-control.uikit-collapsed-control_collapsed {background: var(--secondary-button-background-color);color: var(--secondary-button-text-color);padding-right: 2px; } .uikit-collapsed-control.uikit-collapsed-control_collapsed::after {background: var(--secondary-button-border-color);background-origin: border-box; } .uikit-collapsed-control.uikit-collapsed-control_collapsed .uikit-collapsed-control__expanded-component {width: 0;opacity: 0; } .uikit-collapsed-control[data-tooltip]::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 0; } .uikit-collapsed-control[data-tooltip]:hover::before {opacity: 1;visibility: visible; }.menu-base {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: start;align-items: start;font-family: var(--font-family-normal); }.menu-base-item {width: 100%;box-sizing: border-box;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;height: 44px;padding: 0 20px;color: var(--popup-text-color); } .menu-base-item__label {-ms-flex-positive: 1;flex-grow: 1;font-size: 15px;line-height: 20px;margin-left: 12px; } .menu-base-item__icon {width: 20px;height: 20px;-ms-flex-negative: 0;flex-shrink: 0;color: var(--popup-text-color); } .menu-base-item__value {-ms-flex-negative: 0;flex-shrink: 0;margin-left: 16px; } .menu-base-item.menu-base-item_clickable:hover {cursor: pointer;background: var(--popup-background-hover-color);color: var(--popup-text-hover-color); } .menu-base-item.menu-base-item_clickable:hover .menu-base-item__icon {color: var(--popup-text-hover-color); }.rate-menu {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;width: 100%;padding: 12px 0; } .rate-menu__caption {padding: 8px 20px;color: var(--popup-text-color);font-size: 16px;line-height: 22px;font-family: var(--font-family-bold);font-weight: 700; } .rate-menu__delimiter {width: 100%;height: 1px;background: var(--popup-text-color);opacity: 0.08;margin: 8px 0; }.presenter-info {font-family: var(--font-family-normal);box-sizing: border-box;position: relative;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;color: var(--panel-text-color); } .presenter-info__main {display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: start; } .presenter-info__info {display: inline-block;-ms-flex-positive: 1;flex-grow: 1; } .presenter-info__photo {width: 64px;height: 64px;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;overflow: hidden;border-radius: 50%;-ms-flex-negative: 0;flex-shrink: 0;background-repeat: no-repeat;background-position: center;margin-right: 20px; } .presenter-info__photo img {width: auto;height: auto; } .presenter-info__name {font-family: var(--font-family-bold);font-weight: 700;word-wrap: break-word;overflow: hidden;font-size: 16px;line-height: 22px;margin-bottom: 8px;max-height: 53px; } .presenter-info__job {word-wrap: break-word;overflow: hidden;font-size: 14px;line-height: 18px;margin-bottom: 8px; } .presenter-info__phone {word-wrap: break-word;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;font-size: 15px;line-height: 20px; } .presenter-info__links {display: -ms-flexbox;display: flex;margin-top: 8px; } .presenter-info__link {border: 1px solid var(--presenter-info-link-border-color);border-radius: 10px;width: 36px;height: 28px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;position: relative;color: var(--panel-text-color); } .presenter-info__link:not(:last-child) {margin-right: 8px; } .presenter-info__link::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 6px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .presenter-info__link:hover::before {opacity: 1;visibility: visible; } .presenter-info__link-icon {width: 20px;height: 20px; } .presenter-info .bio-container {position: relative;display: -webkit-box;white-space: normal;text-overflow: ellipsis;margin-right: -20px;margin-top: 20px;padding-right: 10px;font-size: 14px;line-height: 20px;-ms-flex-positive: 1;flex-grow: 1;height: 100%;max-height: 120px;overflow: hidden; } .presenter-info .bio-container.bio-container_collapsed {max-height: 60px; } .presenter-info .bio-container.bio-container_collapsed .scroll-area__bio {display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .presenter-info .bio-container .scroll-area {word-break: break-word;overflow: hidden; } .presenter-info .bio-container .container-top-shadow {background: __verticalGradient(var(--panel-color), transparent);background: linear-gradient(to bottom, var(--panel-color), transparent);position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; } .presenter-info .bio-container .container-bottom-shadow {background: __verticalGradient(transparent, var(--panel-color));background: linear-gradient(to bottom, transparent, var(--panel-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; } .presenter-info__show-more {font-size: 14px;line-height: 20px;height: 20px;opacity: 0.6;text-decoration: underline; } .presenter-info__show-more:hover {cursor: pointer;opacity: 0.8; } .presenter-info.presenter-info_popup {margin-bottom: 0; } .presenter-info.presenter-info_no-photo .presenter-info__info {width: 100%; }.attachments-info {font-family: var(--font-family-normal);position: relative;width: 100%;overflow: hidden;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column; } .attachments-info__scroll-area {height: 100%;overflow: hidden; } .attachments-info__delimiter {height: 1px;margin: 8px 20px 8px 62px;background: var(--popup-text-color);opacity: 0.08; } .attachments-info .container-top-shadow {background: __verticalGradient(var(--panel-color), transparent);background: linear-gradient(to bottom, var(--panel-color), transparent);position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; } .attachments-info .container-bottom-shadow {background: __verticalGradient(transparent, var(--panel-color));background: linear-gradient(to bottom, transparent, var(--panel-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; }.attach-item {padding: 8px 20px;box-sizing: border-box;display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: start;cursor: pointer; } .attach-item__icon-container {width: 36px;height: 36px;border-radius: 50%;background: var(--top-panel-icon-container-color);display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;-ms-flex-negative: 0;flex-shrink: 0;margin-right: 6px; } .attach-item__icon {width: 20px;height: 20px;color: var(--popup-text-color);opacity: 0.72; } .attach-item__info-container {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-positive: 1;flex-grow: 1;padding-left: 6px; } .attach-item__title {font-size: 15px;line-height: 20px;margin-bottom: 4px;color: var(--popup-text-color);word-break: break-word;max-height: 60px;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .attach-item__subtitle {font-size: 14px;line-height: 18px;color: var(--popup-text-color);opacity: 0.6; } .attach-item:hover {background: var(--list-item-background-hover-color); } .attach-item:hover .attach-item__title {color: var(--popup-text-hover-color); } .attach-item:hover .attach-item__subtitle {color: var(--popup-text-hover-color); } .attach-item:hover .attach-item__icon {color: var(--popup-text-hover-color); }:root {--page-background-color: __pageBackground__;--button-background-color: __primaryButtonBackground__;--button-hover-background-color: __primaryButtonBackgroundHover__;--button-hover-text-color: __primaryButtonTextHover__;--button-text-color: __primaryButtonText__;--company-logo-background-color: __asideLogoBackground__;--hyperlink-text-color: __hyperlink__;--list-item-background-hover-color: __asideElementBackgroundHover__;--list-item-border-color: __outlineItemBorder__;--list-item-background-pressed-color: __asideElementBackgroundActive__;--list-item-text-hover-color: __asideElementTextHover__;--list-item-text-pressed-color: __asideElementTextActive__;--list-item-text-visited-color: __asideElementTextVisited__;--list-item-icon-fill-color: __itemsListIconFill__;--list-item-order-color: __itemsListOrder__;--list-item-icon-stroke-color: __itemsListIconStroke__;--list-item-icon-color: __itemsListIcon__;--panel-color: __asideBackground__;--panel-text-color: __asideElementText__;--panel-video-stub-background-color: __panelVideoStubBackgroundColor__;--panel-video-stub-color: __panelVideoStubColor__;--player-background-color: __playerBackground__;--progressbar-background-color: __progressBackground__;--progressbar-playback-color: __progressPlayback__;--slide-border-color: __slideBorder__;--text-color: __playerText__;--topbar-hover-background-color: __secondaryButtonBackgroundHover__;--topbar-text-color: __secondaryButtonText__;--primary-button-text-color: __primaryButtonText__;--primary-button-text-color-active: __primaryButtonTextHover__;--primary-button-background-color-active: __primaryButtonBackgroundHover__;--primary-button-background-color: __primaryButtonBackground__;--primary-button-border-color: __primaryButtonBorder__;--primary-button-border-color-active: __primaryButtonBorderHover__;--secondary-button-background-color: __secondaryButtonBackground__;--secondary-button-background-color-active: __secondaryButtonBackgroundHover__;--secondary-button-text-color: __secondaryButtonText__;--secondary-button-text-color-active: __secondaryButtonTextHover__;--secondary-button-border-color: __secondaryButtonBorder__;--secondary-button-border-color-active: __secondaryButtonBorderHover__;--volume-control-background-color: __volumeControlBackgroundColor__;--volume-control-playback-color: __volumeControlPlaybackColor__;--volume-control-thumb-color: __volumeControlThumbColor__;--more-menu-volume-control-background-color: __moreMenuVolumeControlBackgroundColor__;--more-menu-volume-control-playbackColor: __moreMenuVolumeControlPlaybackColor__;--more-menu-volume-control-thumb-color: __moreMenuVolumeControlThumbColor__;--popup-background-color: __popupBackground__;--popup-transparent-background-color: __transparentPopupBackground__;--popup-border: __popupBorder__;--popup-background-hover-color: __popupBackgroundHover__;--popup-text-color: __popupText__;--popup-text-hover-color: __popupTextHover__;--link-button-background-color: transparent;--link-button-text-color: __linkButtonTextColor__;--player-text: __playerText__;--button-border-radius: __borderRadius__;--presenter-info-link-border-color: __presenterInfoLinkBorderColor__;--search-field-background-color: __searchFieldBackgroundColor__;--hovered-tab-background-color: __hoveredTabBackgroundColor__;--selected-tab-background-color: __selectedTabBackgroundColor__;--top-panel-icon-container-color: __topPanelIconContainerColor__;--top-panel-icon-color: __topPanelIconColor__;--mini-skin-menu-button-text: __miniSkinMenuButtonText__;--mini-skin-menu-button-background-active: __miniSkinMenuButtonBackgroundActive__;--mini-skin-top-bottom-panel-border: __miniSkinTopBottomPanelBorder__;--mini-skin-presenter-delimiter-color: __miniSkinPresenterDelimiterColor__;--top-bottom-panel-border-color: __topBottomPanelBorderColor__; }.universal-side-panel {width: 280px;height: 100%;overflow: hidden;z-index: 0;position: relative;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-transform-origin: left center;transform-origin: left center;background: var(--panel-color);color: var(--panel-text-color);vertical-align: top;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel__presenter-info {padding: 24px 20px;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel__presenter-info.universal-side-panel__presenter-info_with-delimiter::after {content: '';height: 1px;width: 240px;background: var(--popup-text-color);opacity: 0.08;position: absolute;bottom: 0;left: 20px; } .universal-side-panel .logo {width: 100%;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;-ms-flex-negative: 0;flex-shrink: 0;position: relative;background: var(--company-logo-background-color); } .universal-side-panel .logo.logo_has-logo {padding: 12px 0;min-height: 75px;max-height: 180px;max-width: 280px; } .universal-side-panel .logo a {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;height: 100%; } .universal-side-panel .logo a canvas {max-height: 156px;max-width: 280px; } .universal-side-panel .logo.logo_with-delimiter::after {content: '';height: 1px;width: 240px;background: var(--popup-text-color);opacity: 0.08;position: absolute;bottom: 0;left: 20px; } .universal-side-panel .video-container {box-sizing: border-box;overflow: hidden;margin-bottom: 12px;position: relative;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel .video-container::before {content: '';box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.04);position: absolute;z-index: 1;left: 0;top: 0;width: 100%;height: 100%;pointer-events: none; } .universal-side-panel__video-stub {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;box-sizing: border-box;-ms-flex-negative: 0;flex-shrink: 0;height: 158px;margin-bottom: 12px;background: var(--panel-video-stub-background-color);color: var(--panel-video-stub-color); } .universal-side-panel .playerView {box-sizing: border-box;overflow: hidden;position: relative;margin-bottom: 12px;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel .playerView::before {content: '';box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.04);position: absolute;z-index: 1;left: 0;top: 0;width: 100%;height: 100%;pointer-events: none; } .universal-side-panel__maximized {margin: 0;position: absolute;width: 36px;height: 36px;background: rgba(69, 69, 69, 0.84);color: #FFFFFF;border-radius: 10px;-webkit-backdrop-filter: blur(8px);backdrop-filter: blur(8px);left: 8px;bottom: 5px;z-index: 3;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center; } .universal-side-panel__maximized.universal-side-panel__maximized_at-left {right: 8px;left: auto; } .universal-side-panel__maximized.universal-side-panel__maximized_active {background: #454545; } .universal-side-panel__panel-title {color: var(--text-color);padding: 5px 8px 12px 8px; }.outline-info-panel {font-family: var(--font-family-normal);-ms-flex-positive: 1;flex-grow: 1;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;border-radius: inherit;height: 100%; } .outline-info-panel .outline-panel-header {display: -ms-flexbox;display: flex;-ms-flex-negative: 0;flex-shrink: 0;-ms-flex-align: center;align-items: center;width: 100%;height: 68px;padding: 16px 16px 16px 20px; } .outline-info-panel .outline-panel-header__switcher {display: -ms-flexbox;display: flex;-ms-flex-negative: 0;flex-shrink: 0;-ms-flex-positive: 1;flex-grow: 1; } .outline-info-panel .outline-panel-header__panel-title {font-family: var(--font-family-bold);font-size: 16px;line-height: 20px;color: var(--panel-text-color);-ms-flex-negative: 0;flex-shrink: 0;-ms-flex-positive: 1;flex-grow: 1; } .outline-info-panel .search-button {width: 36px;height: 36px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;color: var(--popup-text-color);cursor: pointer; } .outline-info-panel .search-button svg {width: 20px;height: 20px; } .outline-info-panel .clear-button {width: 36px;height: 36px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;color: var(--popup-text-color);cursor: pointer; } .outline-info-panel .clear-button svg {width: 20px;height: 20px; } .outline-info-panel .search-button {opacity: 0.72; } .outline-info-panel .clear-button {position: absolute;right: 4px;top: 2px;opacity: 0.6; } .outline-info-panel .search-wrapper {-ms-flex-positive: 1;flex-grow: 1;position: relative; } .outline-info-panel .search-field {position: relative;height: 40px;width: 100%;background: var(--search-field-background-color);border-radius: 8px;padding: 10px 44px 10px 16px;font-size: 15px;line-height: 20px;color: var(--panel-text-color);border: none;outline: none; } .outline-info-panel .search-field:-ms-input-placeholder {opacity: 0.4; } .outline-info-panel .search-field::placeholder {opacity: 0.4; } .outline-info-panel .panel-tab-button {font-family: var(--font-family-bold);display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;height: 36px;padding: 0 16px;border-radius: var(--button-border-radius);color: var(--panel-text-color);background: transparent;opacity: 0.72;transition: background 0.3s ease, color 0.3s ease, opacity 0.3s ease; } .outline-info-panel .panel-tab-button.panel-tab-button_active {background: var(--hovered-tab-background-color);color: var(--list-item-text-hover-color);opacity: 1; } .outline-info-panel .panel-tab-button.panel-tab-button_chosen {background: var(--selected-tab-background-color);color: var(--list-item-text-pressed-color);opacity: 1; } .outline-info-panel .panel-tab-button:not(:last-child) {margin-right: 4px; } .outline-info-panel.outline-info-panel_mode_notes .outline-info-panel__outline-container {display: none; } .outline-info-panel__notes-container {-ms-flex-positive: 1;flex-grow: 1;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;height: 100%; } .outline-info-panel__outline-container {-ms-flex-positive: 1;flex-grow: 1;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;height: 100%; } .outline-info-panel__outline-container {border-radius: inherit;border-top-left-radius: 0;border-top-right-radius: 0;height: 100%; } .outline-info-panel__notes-container {padding-bottom: 10px; } .outline-info-panel .outline {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;border-radius: inherit;height: 100%; } .outline-info-panel .notes {height: 100%;position: relative;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;padding-left: 12px; } .outline-info-panel .notes .notes-text {word-wrap: break-word;padding-right: 10px; } .outline-info-panel .notes .notes-text p {margin-top: 0;margin-bottom: 0;white-space: pre-wrap; } .outline-info-panel .notes .notes-text p, .outline-info-panel .notes .notes-text span {color: var(--panel-text-color) !important; } .outline-info-panel .notes .notes-text p:first-child {margin-top: 0; } .outline-info-panel .notes .notes-text p:last-child {margin-bottom: 0; } .outline-info-panel .notes .notes-text p, .outline-info-panel .notes .notes-text p.bold span.nobold, .outline-info-panel .notes .notes-text p.italic span.noitalic, .outline-info-panel .notes .notes-text p.bold.italic span.nobold.noitalic {font-family: var(--font-family-normal); } .outline-info-panel .notes .notes-text p span.bold, .outline-info-panel .notes .notes-text p.bold, .outline-info-panel .notes .notes-text p.italic span.bold.noitalic, .outline-info-panel .notes .notes-text p.bold.italic span.noitalic {font-family: var(--font-family-bold); } .outline-info-panel .notes .notes-text p span.italic, .outline-info-panel .notes .notes-text p.bold span.nobold.italic, .outline-info-panel .notes .notes-text p.italic, .outline-info-panel .notes .notes-text p.bold.italic span.nobold {font-family: var(--font-family-italic); } .outline-info-panel .notes .notes-text p span.bold.italic, .outline-info-panel .notes .notes-text p.bold span.italic, .outline-info-panel .notes .notes-text p.italic span.bold, .outline-info-panel .notes .notes-text p.bold.italic {font-family: var(--font-family-bold-italic); } .outline-info-panel .notes__scroll-area {overflow: hidden; } .outline-info-panel.outline-info-panel_mode_outline .outline-info-panel__notes-container {display: none; }.logo-container {display: -ms-flexbox;display: flex; } .logo-container > a {display: -ms-flexbox;display: flex; }.top-panel {display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;-ms-flex-pack: justify;justify-content: space-between;height: 52px;padding: 0 16px;border-bottom: 1px solid var(--top-bottom-panel-border-color);box-sizing: border-box;will-change: transform; } .top-panel.top-panel_reversed {-ms-flex-direction: row-reverse;flex-direction: row-reverse; } .top-panel__container {display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;-ms-flex-align: center;align-items: center; } .top-panel__presenter-info {max-width: 400px;padding: 32px 28px; }.top-main-container {display: -ms-flexbox;display: flex;-ms-flex-positive: 1;flex-grow: 1;-ms-flex-pack: justify;justify-content: space-between;max-height: 100%; } .top-main-container .info-container {margin-left: auto; } .top-main-container .info-container__item:first-child {margin-right: 20px; } .top-main-container .info-container__item:last-child {margin-right: 0; } .top-main-container.top-main-container_reversed {-ms-flex-direction: row-reverse;flex-direction: row-reverse; } .top-main-container.top-main-container_reversed .info-container {margin-right: auto;margin-left: 0;-ms-flex-direction: row-reverse;flex-direction: row-reverse; } .top-main-container.top-main-container_reversed .info-container__item:first-child {margin-right: 0; } .top-main-container.top-main-container_reversed .info-container__item:last-child {margin-right: 20px; }.buttons-container {-ms-flex-negative: 0;flex-shrink: 0; } .buttons-container__button {margin-right: 8px; }.info-container {overflow: hidden; } .info-container__title {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;overflow: hidden;color: var(--text-color);max-width: 480px; } .info-container__title > div {font-family: var(--font-family-normal);font-size: 14px;line-height: 20px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; }:root {--page-background-color: __pageBackground__;--button-background-color: __primaryButtonBackground__;--button-hover-background-color: __primaryButtonBackgroundHover__;--button-hover-text-color: __primaryButtonTextHover__;--button-text-color: __primaryButtonText__;--company-logo-background-color: __asideLogoBackground__;--hyperlink-text-color: __hyperlink__;--list-item-background-hover-color: __asideElementBackgroundHover__;--list-item-border-color: __outlineItemBorder__;--list-item-background-pressed-color: __asideElementBackgroundActive__;--list-item-text-hover-color: __asideElementTextHover__;--list-item-text-pressed-color: __asideElementTextActive__;--list-item-text-visited-color: __asideElementTextVisited__;--list-item-icon-fill-color: __itemsListIconFill__;--list-item-order-color: __itemsListOrder__;--list-item-icon-stroke-color: __itemsListIconStroke__;--list-item-icon-color: __itemsListIcon__;--panel-color: __asideBackground__;--panel-text-color: __asideElementText__;--panel-video-stub-background-color: __panelVideoStubBackgroundColor__;--panel-video-stub-color: __panelVideoStubColor__;--player-background-color: __playerBackground__;--progressbar-background-color: __progressBackground__;--progressbar-playback-color: __progressPlayback__;--slide-border-color: __slideBorder__;--text-color: __playerText__;--topbar-hover-background-color: __secondaryButtonBackgroundHover__;--topbar-text-color: __secondaryButtonText__;--primary-button-text-color: __primaryButtonText__;--primary-button-text-color-active: __primaryButtonTextHover__;--primary-button-background-color-active: __primaryButtonBackgroundHover__;--primary-button-background-color: __primaryButtonBackground__;--primary-button-border-color: __primaryButtonBorder__;--primary-button-border-color-active: __primaryButtonBorderHover__;--secondary-button-background-color: __secondaryButtonBackground__;--secondary-button-background-color-active: __secondaryButtonBackgroundHover__;--secondary-button-text-color: __secondaryButtonText__;--secondary-button-text-color-active: __secondaryButtonTextHover__;--secondary-button-border-color: __secondaryButtonBorder__;--secondary-button-border-color-active: __secondaryButtonBorderHover__;--volume-control-background-color: __volumeControlBackgroundColor__;--volume-control-playback-color: __volumeControlPlaybackColor__;--volume-control-thumb-color: __volumeControlThumbColor__;--more-menu-volume-control-background-color: __moreMenuVolumeControlBackgroundColor__;--more-menu-volume-control-playbackColor: __moreMenuVolumeControlPlaybackColor__;--more-menu-volume-control-thumb-color: __moreMenuVolumeControlThumbColor__;--popup-background-color: __popupBackground__;--popup-transparent-background-color: __transparentPopupBackground__;--popup-border: __popupBorder__;--popup-background-hover-color: __popupBackgroundHover__;--popup-text-color: __popupText__;--popup-text-hover-color: __popupTextHover__;--link-button-background-color: transparent;--link-button-text-color: __linkButtonTextColor__;--player-text: __playerText__;--button-border-radius: __borderRadius__;--presenter-info-link-border-color: __presenterInfoLinkBorderColor__;--search-field-background-color: __searchFieldBackgroundColor__;--hovered-tab-background-color: __hoveredTabBackgroundColor__;--selected-tab-background-color: __selectedTabBackgroundColor__;--top-panel-icon-container-color: __topPanelIconContainerColor__;--top-panel-icon-color: __topPanelIconColor__;--mini-skin-menu-button-text: __miniSkinMenuButtonText__;--mini-skin-menu-button-background-active: __miniSkinMenuButtonBackgroundActive__;--mini-skin-top-bottom-panel-border: __miniSkinTopBottomPanelBorder__;--mini-skin-presenter-delimiter-color: __miniSkinPresenterDelimiterColor__;--top-bottom-panel-border-color: __topBottomPanelBorderColor__; }.more-menu-popup {padding: 12px 0; } .more-menu-popup .volume-slider-wrapper {width: 86px; } .more-menu-popup .volume-slider {position: relative;width: 80px;height: 3px; } .more-menu-popup .volume-slider__enlarged-click-area {position: absolute;cursor: pointer;width: 100%;height: 40px;top: 50%;-ms-transform: translateY(-50%);transform: translateY(-50%); } .more-menu-popup .volume-slider__background {position: absolute;width: 100%;height: 100%;background: var(--more-menu-volume-control-background-color); } .more-menu-popup .volume-slider__volume {position: absolute;background: var(--more-menu-volume-control-playbackColor);bottom: 0;left: 0;height: 100%;border-radius: 4px; } .more-menu-popup .volume-slider__track {position: relative;height: 100%; } .more-menu-popup .volume-slider__thumb {position: absolute;width: 12px;height: 12px;border-radius: 50%;background: var(--more-menu-volume-control-thumb-color);bottom: -4.5px;margin-left: -6px; }.collapsable-buttons-group {vertical-align: middle;display: -ms-inline-flexbox;display: inline-flex;-ms-flex-align: center;align-items: center;overflow: hidden;-ms-flex-positive: 1;flex-grow: 1;-ms-flex-negative: 1;flex-shrink: 1; } .collapsable-buttons-group__collapsable-button {margin-right: 8px; }.navigation-controls {display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;-ms-flex-align: center;align-items: center;position: relative; } .navigation-controls__button.navigation-controls__button_next {margin-left: 8px; } .navigation-controls__button.navigation-controls__button_prev {margin-left: 20px; } .navigation-controls__button.navigation-controls__button_locked {pointer-events: auto;cursor: url(data/lock.cur), no-drop; } .navigation-controls__label {font-size: 14px;color: var(--text-color);opacity: 0.72; }.play-controls-container {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative;-ms-flex-positive: 1;flex-grow: 1;-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;margin: 14px 16px; } .play-controls-container::before {content: '';display: inline-block;height: 100%;vertical-align: middle; } .play-controls-container__play-pause-button {margin-right: 8px; } .play-controls-container__outline-button {margin-right: 8px; }.universal-control-panel {font-family: var(--font-family-normal);display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;width: 100%;position: relative;-ms-transform-origin: 0 0;transform-origin: 0 0;min-height: 66px;will-change: transform; } .universal-control-panel .volume-slider-wrapper {width: 86px; } .universal-control-panel .volume-slider {position: relative;width: 80px;height: 3px; } .universal-control-panel .volume-slider__enlarged-click-area {position: absolute;cursor: pointer;width: 100%;height: 40px;top: 50%;-ms-transform: translateY(-50%);transform: translateY(-50%); } .universal-control-panel .volume-slider__background {position: absolute;width: 100%;height: 100%;background: var(--volume-control-background-color); } .universal-control-panel .volume-slider__volume {position: absolute;background: var(--volume-control-playback-color);bottom: 0;left: 0;height: 100%;border-radius: 4px; } .universal-control-panel .volume-slider__track {position: relative;height: 100%; } .universal-control-panel .volume-slider__thumb {position: absolute;width: 12px;height: 12px;border-radius: 50%;background: var(--volume-control-thumb-color);bottom: -4.5px;margin-left: -6px; } .universal-control-panel__navigation-controls {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;margin: 14px 16px 14px auto; } .universal-control-panel.universal-control-panel_interaction-mode .universal-control-panel__play-controls-container {display: none; } .universal-control-panel.universal-control-panel_hide-controls {visibility: hidden; }.progress-tooltip {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;z-index: 1; } .progress-tooltip__thumbnail-tooltip {border: 2px var(--top-bottom-bar-background-color) solid;border-radius: 3px;width: 140px;height: 80px;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out; } .progress-tooltip__timing-tooltip {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: 4px; }.universal-skin-separator {position: relative;width: 100%;padding-top: 1px; } .universal-skin-separator::after {content: '';display: block;height: 1px;background: var(--top-bottom-panel-border-color); }.progressbar {position: relative;height: 2px;width: 100%; } .progressbar__progress {position: absolute;top: 0;left: 0;width: 100%;height: 100%;background-color: var(--progressbar-background-color);transition: transform 0.3s ease-in-out; } .progressbar__progress-background {position: absolute;background: var(--progressbar-playback-color);top: 0;left: 0;height: 100%;transition: transform 0.3s ease-in-out; } .progressbar__thumb {width: 12px;height: 12px;border-radius: 50%;background: var(--progressbar-playback-color);bottom: -5px;position: absolute;left: -6px;cursor: pointer; } .progressbar__progress-tooltip {position: absolute;top: -14px;-ms-transform: translateY(-100%);transform: translateY(-100%); }.show-side-panel-button {position: absolute;top: 6px;z-index: 1001; } .show-side-panel-button.show-side-panel-button_side_left {left: 0; } .show-side-panel-button.show-side-panel-button_side_left .show-side-panel-button__button {left: -9px;border-radius: 0 25px 25px 0; } .show-side-panel-button.show-side-panel-button_side_right {right: 0; } .show-side-panel-button.show-side-panel-button_side_right .show-side-panel-button__button {left: 9px;border-radius: 25px 0 0 25px; } .show-side-panel-button.show-side-panel-button_side_right .show-side-panel-button__button.show-side-panel-button__button_active, .show-side-panel-button.show-side-panel-button_side_right .show-side-panel-button__button[aria-pressed='true'], .show-side-panel-button.show-side-panel-button_side_left .show-side-panel-button__button.show-side-panel-button__button_active, .show-side-panel-button.show-side-panel-button_side_left .show-side-panel-button__button[aria-pressed='true'] {background: var(--player-background-color);left: 0; } .show-side-panel-button__button {background: var(--player-background-color);box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.2);transition-property: left; }.popups-layer {position: absolute;margin-left: 0 !important;left: 0;top: 0;width: 100%; } .popups-layer .popup {background: var(--popup-background-color);border: 1px solid var(--popup-border);box-shadow: 0 20px 32px rgba(0, 0, 0, 0.16);-webkit-backdrop-filter: blur(8px);backdrop-filter: blur(8px);border-radius: 10px;position: absolute;top: 0;left: 0; } .popups-layer .popup.popup_outline-popup {width: 280px; } .popups-layer .popup.popup_presenter .mask {width: calc(100% - 2px);left: 1px;bottom: 12px; } .popups-layer .popup.popup_attachments {width: 368px;box-sizing: border-box; }.notes-popup {position: relative;font-size: 15px;line-height: 20px;word-wrap: break-word;width: 372px;padding: 16px;border-radius: inherit; } .notes-popup__scroll-area {overflow: hidden;height: 100%; } .notes-popup .notes-text {word-wrap: break-word; } .notes-popup .notes-text p {margin-top: 0;margin-bottom: 0;white-space: pre-wrap; } .notes-popup .notes-text p, .notes-popup .notes-text span {color: var(--panel-text-color) !important; } .notes-popup .notes-text p:first-child {margin-top: 0; } .notes-popup .notes-text p:last-child {margin-bottom: 0; } .notes-popup .notes-text p, .notes-popup .notes-text p.bold span.nobold, .notes-popup .notes-text p.italic span.noitalic, .notes-popup .notes-text p.bold.italic span.nobold.noitalic {font-family: var(--font-family-normal); } .notes-popup .notes-text p span.bold, .notes-popup .notes-text p.bold, .notes-popup .notes-text p.italic span.bold.noitalic, .notes-popup .notes-text p.bold.italic span.noitalic {font-family: var(--font-family-bold); } .notes-popup .notes-text p span.italic, .notes-popup .notes-text p.bold span.nobold.italic, .notes-popup .notes-text p.italic, .notes-popup .notes-text p.bold.italic span.nobold {font-family: var(--font-family-italic); } .notes-popup .notes-text p span.bold.italic, .notes-popup .notes-text p.bold span.italic, .notes-popup .notes-text p.italic span.bold, .notes-popup .notes-text p.bold.italic {font-family: var(--font-family-bold-italic); }.attachments-popup {padding: 12px 0;border-radius: inherit; }.marker-panel {font-family: var(--font-family-normal);padding: 12px 0;width: 260px; } .marker-panel__separator {position: relative;background: var(--popup-text-color);opacity: 0.08;height: 1px;margin: 3px 0; }.marker-panel-button {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative;padding: 4px 20px;opacity: 1;background-color: transparent;transition: background-color 0.28s ease-in-out;width: 100%; } .marker-panel-button__text {font-size: 15px;text-align: left;color: var(--popup-text-color); } .marker-panel-button.marker-panel-button_type_eraseAll, .marker-panel-button.marker-panel-button_type_endDrawing {padding: 14px 20px 14px 24px; } .marker-panel-button:focus, .marker-panel-button:hover {background-color: var(--list-item-background-hover-color); } .marker-panel-button:focus .marker-panel-button__text, .marker-panel-button:hover .marker-panel-button__text {color: var(--popup-text-hover-color); } .marker-panel-button:focus .marker-panel-button__item-icon, .marker-panel-button:hover .marker-panel-button__item-icon {color: var(--popup-text-hover-color); } .marker-panel-button[disabled] {opacity: 0.5;color: var(--popup-text-color);pointer-events: none; } .marker-panel-button[aria-selected='true'] {background-color: var(--list-item-background-pressed-color);color: var(--list-item-text-pressed-color); }.item-icon {width: 40px;height: 40px;background-color: var(--top-panel-icon-container-color);border-radius: 50%;margin-right: 10px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;color: var(--popup-text-color); } .item-icon__item-icon-image {width: 28px;height: 28px;color: inherit; }.outline {font-family: var(--font-family-normal);position: relative; }.search-result {font-family: var(--font-family-bold);padding: 16px 0 8px 20px;position: relative;font-size: 15px;line-height: 20px;color: var(--popup-text-color); } .search-result.search-result_no-results {font-family: var(--font-family-normal);height: 100%;text-align: center;padding: 60px 0 0;opacity: 0.6; }.slide-item-view {position: relative;overflow: hidden;display: table;width: 100%;color: var(--panel-text-color);transition: background 0.28s ease; } .slide-item-view__content {height: 100%;display: table-row; } .slide-item-view__content > * {display: table-cell;vertical-align: middle; } .slide-item-view__open-button {width: 12px;height: 12px;margin: 0 8px 0 12px;opacity: 0.6;padding: 0;color: var(--popup-text-color);transition: transform 0.3s ease;background: transparent; } .slide-item-view__open-button[aria-pressed='true'] {-ms-transform: rotate(90deg);transform: rotate(90deg); } .slide-item-view__thumb {max-width: 100px;max-height: 60px;vertical-align: middle;margin-top: 1px;border: 1px solid rgba(0, 0, 0, 0.04);border-radius: 4px;background-color: var(--player-background-color); } .slide-item-view__status {position: absolute;width: 18px;height: 18px;background-size: 18px 18px; } .slide-item-view__status.slide-item-view__status_status_correct {background-image: url("+ +g[31]+"); } .slide-item-view__status.slide-item-view__status_status_partially {background-image: url("+g[32]+"); } .slide-item-view__status.slide-item-view__status_status_incorrect {background-image: url("+g[33]+"); } .slide-item-view__status.slide-item-view__status_status_answered {background-image: url("+g[34]+"); } .slide-item-view__status.slide-item-view__status_answered {background-image: url("+g[35]+"); } .slide-item-view__mark {position: absolute;width: 12px;height: 18px;top: 0;bottom: 0;margin: auto;background-image: url("+ +g[36]+");background-size: 12px 18px;background-repeat: no-repeat;margin-left: -40px; } .slide-item-view__mark.slide-item-view__mark_with-status {left: 8px; } .slide-item-view__title-container {width: 100%; } .slide-item-view__title {padding: 0 16px;font-size: 14px;line-height: 18px;max-height: 60px;word-break: break-word;overflow: hidden;display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .slide-item-view__title.slide-item-view__title_minimized {max-height: 70px; } .slide-item-view.slide-item-view_with-thumbnail .slide-item-view__title {padding-left: 11px; } .slide-item-view.slide-item-view_with-thumbnail .slide-item-view__mark {margin-left: -20px; } .slide-item-view.slide-item-view_active {background: var(--list-item-background-hover-color);color: var(--list-item-text-hover-color); } .slide-item-view.slide-item-view_active .slide-item-view__mark {background-image: url("+ +g[37]+"); } .slide-item-view[aria-selected='true'] {background: var(--list-item-background-pressed-color);color: var(--list-item-text-pressed-color); } .slide-item-view[aria-selected='true'] .slide-item-view__mark {background-image: url("+g[38]+"); }.treecontrol.treecontrol_highlight-viewed .slide-item-view.slide-item-view_viewed {color: var(--list-item-text-visited-color); }.treecontrol.treecontrol_highlight-viewed .slide-item-view.slide-item-view_viewed.slide-item-view_active {background: var(--list-item-background-hover-color);color: var(--list-item-text-hover-color); }.treecontrol.treecontrol_highlight-viewed .slide-item-view.slide-item-view_viewed[aria-selected='true'] {background: var(--list-item-background-pressed-color);color: var(--list-item-text-pressed-color); }.highlighted {font-family: var(--font-family-bold);padding: 2px 3px;margin: -2px -3px;font-size: 14px;line-height: 18px;color: var(--popup-text-color);opacity: 1; }.search-context {font-size: 14px;line-height: 18px;color: var(--popup-text-color);opacity: 0.6; }:root {--font-family-bold: PFnb;--font-family-bold-italic: PFnbi;--font-family-italic: PFni;--font-family-normal: PFn;--font-family-semibold: PFnsb, PFn;--font-family-semibold-italic: PFnsbi, PFni; }@keyframes preloader_spin {0% {transform: rotate(0deg); } 100% {transform: rotate(360deg); } }.message-box {background: var(--player-background-color);position: absolute;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;border-radius: 7px;min-width: 280px;padding: 40px;box-shadow: 0 8px 16px rgba(0, 0, 0, 0.08); } .message-box::after {content: '';box-sizing: border-box;border: 1px solid var(--popup-border);width: 100%;height: 100%;position: absolute;left: 0;top: 0;border-radius: 7px;pointer-events: none; } .message-box__content {position: relative;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-direction: column;flex-direction: column; } .message-box__icon {width: 24px;height: 24px;margin-bottom: 24px;position: relative;display: inline-block;color: var(--text-color);opacity: 0.72; } .message-box .message-box-buttons {position: relative;width: 100%;height: 36px; } .message-box .message-box-buttons__buttons {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center; } .message-box .message-box-buttons__window-button {margin: 0 4px; } .message-box .vertical-scrollbar {top: 40px; } .message-box__message-container {overflow: hidden;display: inline-block;max-width: 480px;vertical-align: top;position: relative; } .message-box__message {text-align: center;font-size: 16px;color: var(--text-color);text-overflow: ellipsis;overflow: hidden;position: relative;font-family: var(--font-family-normal); } .message-box__buttons {margin-top: 28px; }.universal-tablet {font-family: var(--font-family-normal);position: relative;background: var(--player-background-color); } .universal-tablet__popups-layer {position: absolute;top: 0;left: 0;z-index: 1; } .universal-tablet__popup-layer {z-index: 1; }.universal-layout {width: 100%;height: 100%;display: -ms-flexbox;display: flex;overflow: hidden; } .universal-layout.universal-layout_left-panel {-ms-flex-direction: row-reverse;flex-direction: row-reverse; }.universal-content-area {position: relative;-ms-flex-positive: 1;flex-grow: 1;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden; } .universal-content-area__cc {font-family: var(--font-family-normal);width: 100%;height: 110px;margin-top: -110px;background: rgba(41, 41, 41, 0.56);z-index: 1;overflow-x: hidden;overflow-y: auto;-webkit-overflow-scrolling: touch;padding: 0 34px 0 14px;border-width: 13px 0 7px 0;border-style: solid;border-color: transparent;color: #FFFFFF;font-size: 14px;text-shadow: -1.4px 1.4px 2px rgba(0, 0, 0, 0.48);word-wrap: break-word;white-space: pre-wrap; }.video-narration-view {position: relative;top: 0;left: 0;margin-right: 12px;margin-bottom: 12px;border: 1px solid rgba(0, 0, 0, 0.14); } .video-narration-view video {background-color: #000000; } .video-narration-view.video-narration-view_draggable {position: absolute;box-shadow: 0 1px 8px 0 rgba(0, 0, 0, 0.24); } .video-narration-view.video-narration-view_maximized {margin: 12px; }.content-area {-ms-flex-positive: 1;flex-grow: 1;overflow: hidden;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative; } .content-area__items-container {display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: flex-start;-ms-grid-column-align: center;justify-items: center;overflow: hidden;margin: auto; } .content-area .playerView {z-index: 0;position: relative;margin: 0 12px;top: 0;left: 0; } .content-area .playerView.draggable {position: absolute;box-shadow: 0 1px 8px 0 rgba(0, 0, 0, 0.24); } .content-area .playerView .with-border::after {content: '';position: absolute;top: 0;bottom: 0;left: 0;right: 0;border: 1px solid var(--slide-border-color);pointer-events: none; } .content-area.content-area_portrait .content-area__items-container {flex-direction: column-reverse;align-items: flex-end;/* autoprefixer: off */ -webkit-box-orient: vertical;-webkit-box-direction: reverse;/* autoprefixer: on */ } .content-area.content-area_presentation-minimized .playerView {margin: 0 12px 12px 0; } .content-area.content-area_presentation-minimized .content-area__narration-view {margin: 0 12px; } .content-area .preloader {width: 50px;height: 50px;position: absolute;top: 0;left: 0;bottom: 0;right: 0;margin: auto;border-radius: 10px;background-color: rgba(0, 0, 0, 0.5); } .content-area .preloader::after {content: '';position: absolute;background: url("+ +g[39]+");background-size: cover;top: 0;left: 0;bottom: 0;right: 0;animation: preloader_spin 1s infinite linear; }.maximize-button {width: 38px;height: 38px;border: 1px solid #FFFFFF;border-radius: 19px;background: url("+g[40]+") no-repeat center;background-size: 13px 15px;background-color: #4D4D4D;position: absolute;top: 0;left: 0; } .maximize-button.maximize-button_portrait {background-image: url("+g[41]+");background-size: 15px 13px; }.launch-screen {z-index: 100;position: fixed;top: 0;right: 0;bottom: 0;left: 0;background-color: rgba(0, 0, 0, 0.48); } .launch-screen .launch-screen-button {top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 96px;height: 96px;position: absolute; } .launch-screen .launch-screen-button__play-icon {background-color: #FFFFFF;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 90px;height: 90px;box-shadow: 0 12px 50px 0 rgba(0, 0, 0, 0.2);transition: 0.3s ease-in-out; } .launch-screen .launch-screen-button__icon {background: url("+ +g[42]+") no-repeat center;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 6px;width: 90px;height: 90px; } .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__play-icon {width: 96px;height: 96px; } .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__icon {background: url("+g[43]+") no-repeat center; }.marker-tool-container {position: absolute;top: 0; }.draw-control {position: absolute; }.treecontrol {background-color: var(--panel-color);position: relative;overflow-y: hidden;border-radius: inherit; }.container-top-shadow {background: __verticalGradient(var(--popup-background-color), var(--popup-transparent-background-color));background: linear-gradient(to bottom, var(--popup-background-color), var(--popup-transparent-background-color));position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; }.container-bottom-shadow {background: __verticalGradient(var(--popup-transparent-background-color), var(--popup-background-color));background: linear-gradient(to bottom, var(--popup-transparent-background-color), var(--popup-background-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; }.mobile-vertical-scrollbar {position: absolute;width: 10px;top: 6px;bottom: 6px;right: 0;opacity: 0; } .mobile-vertical-scrollbar__thumb {position: absolute;width: 3px !important;right: 3px;padding: 1px;border-radius: 5px;background-color: rgba(0, 0, 0, 0.5); }"}(); +var e;for(const [g,h]of Object.entries(null!=(e=a)?e:{}))e=`__${g.replace(RegExp("\\.","g"),"_")}__`,d=d.replace(new RegExp(e,"g"),h);let f;for(const [g,h]of Object.entries(null!=(f=b)?f:{}))d=d.replace(new RegExp(g,"g"),h);d=d.replace(/__verticalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.rn);d=d.replace(/__horizontalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.pn);return gn(d)}rn(a,b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}pn(a, +b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}};class EG extends kt{constructor(a){super(a);this.jh=new C}};class FG extends P{constructor(a){super({G:a});a=this.displayObject();document.body.appendChild(a);this.Ef();x(this,window,"resize",this.Ef,this)}Ef(){var a=document.documentElement.clientWidth,b=document.documentElement.clientHeight;const c=Math.min(1,(document.documentElement.clientWidth-20)/this.width());wn(this.displayObject(),c);yi(this.displayObject(),"0 0");a=Math.max(10,Math.round((a-this.width()*c)/2));b=Math.max(0,Math.round((b-this.height()*c)/2));this.move(a,b)}rd(){super.rd();Fd(this.displayObject())}} +;class GG extends FG{constructor(a,b){super("info_panel");Ft(this,b);b=new P({G:"label"});b.la(a);b.nf("alert");b.pf("live","assertive");N(this,b)}};class HG extends Mt{constructor(a){super(a,"input");this.za().type="password"}value(){return this.za().value}};function IG(a,b,c,d=!0){a=new P({Yb:a,G:b});a.la(c);a.J(d);return a}function JG(a){x(a,a.Qn.za(),"input",()=>{a.xS.ra(!!a.Qn.value())});x(a,a.Qn.za(),"keypress",b=>{13==b.keyCode&&a.CF()})} +class KG extends FG{constructor(a,b,c,d){super("password_form");this.nf("dialog");this.setAttribute("tabindex","-1");this.CF=this.CF.bind(this,d);this.PL=IG("LABEL","password_label",a);N(this,this.PL);this.Qn=new HG("password_field");N(this,this.Qn);this.WE=IG("DIV","wrong_password_label",b,!1);N(this,this.WE);this.xS=this.Oe("btn_ok",c,this.CF);N(this,this.xS);a=ld();b=ld();this.PL.setAttribute("id",a);this.PL.setAttribute("for",b);this.Qn.setAttribute("id",b);this.Qn.pf("labelledby",a);this.Qn.pf("required", +!0);this.WE.nf("alert");this.WE.pf("live","assertive");JG(this);Ii||this.Qn.displayObject().focus()}Oe(a,b,c){a=new HC({G:a});a.la(b);a.ra(!1);z(this,a.ka,c,this);return a}CF(...a){a=a[0];const b=this.Qn.value();b&&(a(b),this.WE.J(!0))}};function LG(a,b,c){Ii&&(this.ki=wd("DIV"),mn(this.ki,"tap_area"));It.call(this,b);this.ki&&this.V(this.ki);this.YG=!0;this.q4=c?!0:!1;c&&this.Ac(!1);a&&this.ka.addHandler(this.zM,this);Ii&&(a=this.za(),mn(a,"mobile"));this.Ox(0);this.za().setAttribute("tabindex","-1");this.ny()}t(LG,It);k=LG.prototype;k.ft=!1;k.Fb=!0;k.XS=function(a){a=wd("BUTTON",a);Ib&&8>=Vb||(a.type="button");return a};k.selected=function(){return this.ft}; +k.yh=function(a){if(a){var b=this.za();mn(b,"selected")}else b=this.za(),nn(b,"selected");this.q4&&this.Ac(a);this.ft=a};k.enabled=function(){return this.Fb};k.ra=function(a){LG.Mb.ra.call(this,a);const b=this.za();b.disabled=a?"":"disabled";if(a){var c=this.displayObject();nn(c,"disabled")}else c=this.displayObject(),mn(c,"disabled");!a&&b.blur&&b.blur();this.Fb=a};k.Ac=function(a){this.za().setAttribute("aria-pressed",a)};k.zM=function(){this.yh(!this.ft)}; +k.Si=function(a){LG.Mb.Si.call(this,a);-1==this.Xr&&this.za().blur()};k.Vx=function(){return LG.Mb.Vx.call(this)};k.Bp=function(a){this.enabled()&&LG.Mb.Bp.call(this,a)};k.ik=function(a){this.YG=!1;LG.Mb.ik.call(this,a);this.YG=!0};function MG(a,b,c,d){Mt.call(this,"info_panel "+a);this.mF=c;this.qa=Ki();a=new Mt("message");a.la(b);this.V(a);b=this.displayObject();document.body.appendChild(b);this.mF&&(this.In=new LG(!1,"ok"),this.In.la(d),d=this.In.displayObject(),document.body.appendChild(d));yi(this.displayObject(),"0 0");wn(this.displayObject(),this.qa);this.mF&&(yi(this.In.displayObject(),"0 100%"),wn(this.In.displayObject(),this.qa));this.Ef();ve(window,"resize",this.Ef,!1,this)}t(MG,Mt); +MG.prototype.Xc=function(){Fd(this.displayObject());this.mF&&Fd(this.In.displayObject());De(window,"resize",this.Ef,!1,this)};MG.prototype.Ef=function(){const a=document.documentElement.clientWidth/this.qa;let b=document.documentElement.clientHeight/this.qa;this.Zb(a);this.mF&&this.In.Zb(a);ij&&(b+=2);Kt(this,"min-height",b+"px")};function NG(a,b,c,d){MG.call(this,"password",a,!0,c);a=new Mt("password_field");this.V(a);this.In.ra(!1);const e=new HG("");a.V(e);const f=new Mt("wrong_password_label");f.la(b);f.J(!1);this.V(f);const g=()=>{const h=e.value();h&&(d(h),f.J(!0))};ve(e.za(),"input",()=>{this.In.ra(!!e.value())},!1,this);ve(e.za(),"keypress",h=>{13==h.keyCode&&g()},!1,this);this.In.ka.addHandler(g,this)}t(NG,MG);class OG extends kv{nr(){super.nr();F(this.background(),"display","none");F(this.content(),"display","none")}};function PG(a){const b=Object.assign({},a),c={};for(const d in b)"object"==typeof b[d]&&(b[d]=PG(b[d]),a=b[d],a._d&&(c[a._d]=a));b.toString=()=>b._;b.Oha=d=>c[d];return b};const QG={type:"t",id:"i",url:"u",target:"g",RC:"S",JI:"s",KI:"n",DI:"r"};var RG={CI:{_:"s",text:{_:"t"},A1:{_:"f",qba:{_:"p",xi:"s",length:"l",Kt:"b",wI:{_:"r",xi:"s",length:"l",bold:"b",italic:"i",Gca:"u",tx:Object.assign({_:"h"},QG)}}},w_:{_:"a"},tx:Object.assign({_:"h"},QG),e1:{_:"b"},lk:{_:"s"},Bi:{_:"v"},Aaa:{_:"T"}}};const SG={};for(const a in RG)RG.hasOwnProperty(a)&&(SG[a]=PG(RG[a]));var TG=class{constructor(a,b,c){this.type=a;this.id=b;this.DI=this.KI=this.JI=this.target=this.url=this.RC=void 0;this.vaa=c}};const UG=new Map;function VG(a,b,c){c=new TG(a[b.type],a[b.id],c);c.RC=a[b.RC];c.url=a[b.url];c.target=a[b.target];c.JI=a[b.JI];c.KI=a[b.KI];a=a[b.DI];"boolean"===typeof a&&(c.DI=a.toString());a=UG.get(c.type);if(void 0===a)throw Error("unknown hyperlink type");return a(c)}function WG(a,b){return`${a.vaa||""}`}UG.set("u",function(a){return WG(a,"return document.getElementById('$coreSprPlaceholder').getCore().gotoLink(this);")}); +UG.set("N",function(a){return WG(a,`document.getElementById('$coreSprPlaceholder').getCore().gotoSlide(${a.JI}, this);return false;`)});UG.set("f",function(a){return WG(a,"document.getElementById('$coreSprPlaceholder').getCore().gotoFirstSlide(this);return false;")});UG.set("l",function(a){return WG(a,"document.getElementById('$coreSprPlaceholder').getCore().gotoLastSlide(this);return false;")});UG.set("v",function(a){return WG(a,"document.getElementById('$coreSprPlaceholder').getCore().gotoLastViewedSlide(this);return false;")}); +UG.set("n",function(a){return WG(a,"document.getElementById('$coreSprPlaceholder').getCore().gotoNextSlide(this);return false;")});UG.set("p",function(a){return WG(a,"document.getElementById('$coreSprPlaceholder').getCore().gotoPreviousSlide(this);return false;")});UG.set("s",function(a){return WG(a,`document.getElementById('$coreSprPlaceholder').getCore().startSlideshow(this, '${a.KI}', ${a.DI});return false;`)});UG.set("e",function(a){return WG(a,"document.getElementById('$coreSprPlaceholder').getCore().endSlideshow(this);return false;")});function XG(a,b){a:switch(b[0].Kt){case "n":var c="ol";break a;case "u":c="ul";break a;default:c="p"}"p"==c?b.forEach(d=>{a+=`

${d.R0}

`}):(a+=`<${c}>`,b.forEach(d=>{a+=`
  • ${d.R0}
  • `}),a+=``);return a}function YG(a){let b="";const c=[];a.forEach(d=>{d.Kt!=b&&(c.push([]),b=d.Kt);c[c.length-1].push(d)});return c};class ZG{constructor(a){this.qg=a}then(a){this.qg=a(this.qg);return this}result(){return this.qg}};function $G(a,b){const c=a[b.text];a=a[b.A1];if(!c||!a)return c?`${c}`:"";const d=b.A1.qba;b=a[d].map(e=>aH(c,e,d));return YG(b).reduce(XG,"")}function aH(a,b,c){const {xi:d,length:e,Kt:f,wI:g,Vba:h}={xi:b[c.xi],length:b[c.length],Kt:b[c.Kt],wI:b[c.wI],Vba:c.wI},l=a.substr(d,e);return{R0:g.map(n=>bH(l,n,h)).join(""),Kt:f}} +function bH(a,b,c){var d=b[c.xi],e=b[c.length],f=b[c.bold]||!1,g=b[c.italic]||!1,h=b[c.Gca]||!1,l=b[c.tx],n=c.tx;return(new ZG(a)).then(m=>m.substr(d,e)).then(m=>m.replace(/\u000b/g,"
    ")).then(m=>cH(m)).then(m=>{g&&(m=`<${"i"}>${m}`);return m}).then(m=>{f&&(m=`<${"b"}>${m}`);return m}).then(m=>{h&&(m=`<${"u"}>${m}`);return m}).then(m=>{l&&(m=VG(l,n,m));return m}).result()} +function cH(a){return(new ZG(a)).then(b=>b.replace(/(\r\n|\r|\n)+/g," ")).then(b=>b.replace(/\xa0|[ \t]+/g," ")).result()};function dH(a,b){return a[b.Aaa]?(new ZG($G(a,b))).then(c=>c?`

    ${c}

    `:"").result():""};function eH(a,b,c){return a.map(d=>{var e=d[b.lk]||d[b.Bi];if(!(e=e?c.get(e):""))if(d[b.e1]&&(d[b.text]||d[b.w_]||d[b.tx])){e=`${d[b.w_]||d[b.text]||`;const f=d[b.tx];e=f?VG(f,b.tx,e):e}else e="";return e||dH(d,b)||$G(d,b)}).join("")};function fH(a){a=[...a.Md().Sc(),...a.$d().Sc()];return new Map(a.map(b=>{var c=b.Di;c=c.pi()||gH(c);return[b.id(),hH(c)]}))}function gH(a){a=document.getElementById(a.id());return Od(a)}function hH(a){return(new ZG(a)).then(b=>b.includes("controls")?b:b.replace(">"," controls>")).then(b=>iH(b,"width")).then(b=>iH(b,"height")).then(b=>b.replace(RegExp('id="\\w+"'),"")).result()}function iH(a,b){return a.includes(b)?a.replace(new RegExp(`${b}="\\d*\\.*\\d+px"`),""):a};function jH(a,b){b.mf()?kH(a,b):Qe(a,b.gl,()=>kH(a,b))}function lH(a){a.ya&&(Fd(a.tb),Fd(a.qS),Fd(a.ya),a.ya=null)}function kH(a,b){var c=b.jy;b=fH(b.slide());c=JSON.parse(c);const d=SG.CI;b=eH(c[d],d,b).replace(/\$coreSprPlaceholder/g,a.xq);b=Ad(Kc(b));a.tb.appendChild(b);ht(a.tb,"main");(b=a.tb.querySelector("h2"))?(b.id=ld(),it(a.tb,"labelledby",b.id)):it(a.tb,"label",a.fg.PB_ACCESSIBLE_ARIA_LABEL_SLIDE)} +class mH extends wg{constructor(a,b,c){super();this.Di=a;this.fg=b;this.xq=c;this.QY=ld();b=zd("DIV");td(b,{"class":"ppt-accessible-slide-display"});this.fl=b;this.ya=null;b=zd("DIV");td(b,{"class":"ppt-accessible-slide-content"});b.setAttribute("tabindex","-1");b.id=this.QY;this.tb=b;b=zd("A");td(b,{"class":"ppt-accessible-skip-link"});b.innerText=this.fg.PB_ACCESSIBLE_ARIA_LABEL_BACK_TO_BEGIN;b.href=`#${this.QY}`;c=zd("DIV");td(c,{"class":"ppt-accessible-skip-link-container"});c.appendChild(b); +this.qS=c;jH(this,a)}xg(){}ju(a){Th(this.ya,a)}width(){return 0}height(){return 0}slide(){return this.ya}content(){return this.tb}background(){throw Error("no background in accessible mode");}resize(){}nr(){lH(this);this.ya=zd("DIV");td(this.ya,{"class":"ppt-accessible-slide"});this.ya.appendChild(this.tb);this.ya.appendChild(this.qS);this.fl.appendChild(this.ya)}Oc(){lH(this)}k0(){}clone(){throw Error("no clone in accessible mode");}RH(){throw Error("no background in accessible mode");}};class nH extends Rq{constructor(a,b,c,d,e,f){super(a,b,c,d,e,f);f&&f.mf()&&u((f.tb||document).getElementsByTagName("IMG"),g=>{g.style.transform=""})}};function oH(a){const b=document.createElement("div");b.style.width=`${a.width()}px`;b.style.height=`${a.height()}px`;b.style.backgroundColor=a.G2;b.style.position="relative";return b}class pH extends Rq{constructor(a,b,c,d){super(a,-1,b,c);this.G2=d||"#000000";Nq(this,oH(this),oH(this))}};function qH(a,b){a.rp=b;a.pO.appendChild(b.fl)}function rH(a){a.M.splice(0,a.M.length)}class sH{constructor(a){this.M=[];this.pO=a;this.rp=null}};class tH extends mv{constructor(a){super(a);this.ih=null;this.yU=E(this)}fb(){return this.ih}hR(a){this.ih=a;this.yU.C(this.ih)}};class uH extends mv{constructor(a){super(a);this.xb=null;this.EX=E(this)}Oa(){return this.xb}qR(a){this.xb=a;this.EX.C()}};function Us(a,b){return a.zd[b]}function vH(a){F(a.jB,"position","normal"==a.Gb?"absolute":"")}function wH(a){a.CD.forEach(b=>{b.mf()?a.fY(b):Qe(a,b.gl,a.fY,a)})} +function xH(a){Se(a,...a.zd);a.zd.splice(0,a.zd.length);Cd(a.jB);rH(a.uk);qH(a.uk,a.rp);yH(a);zH(a);a.CD.forEach(b=>{if(b instanceof uH)AH(a,new lv(a.uk,a.zd.length,a.Ua,a.Na,a.Yz,b,a.Gb));else if(b instanceof tH){a:switch(a.Gb){case "normal":b=new kv(a.uk,a.zd.length,a.Ua,a.Na,a.Yz,b,a.Gb);break a;case "accessible":b=new OG(a.uk,a.zd.length,a.Ua,a.Na,a.Yz,b,a.Gb);break a;default:throw Error("unknown presentation view mode");}AH(a,b)}else if(b instanceof nv)AH(a,new ov(a.uk,a.zd.length,a.Ua,a.Na, +a.Yz,b,a.Gb));else{a:switch(a.Gb){case "normal":b=new nH(a.uk,a.zd.length,a.Ua,a.Na,a.Yz,b);break a;case "accessible":b=new mH(b,a.fg,a.xq);break a;default:throw Error("unknown presentation view mode");}AH(a,b)}})}function yH(a){a.sK.forEach((b,c)=>{yi(c,`${b.origin.x}px ${b.origin.y}px`);on(c,b.transform)})}function zH(a){Array.from(a.sK.keys()).forEach(b=>{b.style.width="";b.style.height=""})}function AH(a,b){B(a,b);var c=a.uk;c.M.push(b);c.pO.appendChild(b.fl);a.zd.push(b)} +class BH extends wg{constructor({AR:a,Ht:b,width:c,height:d,Paa:e,NI:f,backgroundColor:g,SR:h,messages:l}){super();this.CD=b;this.Ua=c;this.Na=d;this.Yz=e;this.xq=f;this.Gb=h;this.fg=l;this.sK=new Map;this.zd=[];this.jB=zd("DIV");mn(this.jB,"slide-displays-root");a.appendChild(this.jB);vH(this);this.uk=new sH(this.jB);this.rp=new pH(this.uk,c,d,g);wH(this);xH(this)}width(){return this.Ua}height(){return this.Na}background(){return this.rp}resize(a,b){if(this.Ua!=a||this.Na!=b)this.Ua=a,this.Na=b, +this.rp.resize(a,b),this.zd.forEach(c=>c.resize(a,b))}Mm(a){this.Gb!=a&&(this.Gb=a,vH(this),xH(this))}fY(a){const b=Array.from(sd("IMG",null,a.tb));a=Array.from(sd("IMG",null,a.slideBackground()));b.concat(a).forEach(c=>{const d=sn(c)||new gm,e=tn(c)||new Xc;this.sK.set(c,{transform:d,origin:e})})}};class CH{constructor(a,b,c,d){this.ya=a;this.pg=b;this.og=c;this.Qe=d;this.yf=this.ih=this.xb=this.jy=this.tb=null}slide(){return this.ya}slideWidth(){return this.pg}slideHeight(){return this.og}Oa(){return this.xb}qR(a){this.xb=a}fb(){return this.ih}hR(a){this.ih=a}ob(){return this.yf}rR(a){this.yf=a}Vq(){return this.Qe}};class DH{constructor(a){this.le=0;this.I9=void 0!==a?a:0;this.Tz=new C;this.Vz=new C;this.DN=new C;this.Fh=null}weight(){return this.I9}progress(){return this.le}context(){return this.Fh}start(a){this.Fh=a}gr(){return this.Tz}CC(){return this.Vz}it(a){this.le!=a&&(this.le=a,this.DN.C(this))}Qh(){this.le=1;this.Tz.C(this)}Uz(){this.Vz.C(this)}};class EH extends DH{constructor(a){super();this.QJ=a}start(a){super.start(a);const b=rd(document,this.QJ);b?(a.tb=b,this.Qh()):this.Uz()}};var FH,GH,HH=[],IH=new C,JH=new C,KH=new C;q("iSpring.InteractionPlayerFactory.registerCreateQuizPlayerFunction",function(a){FH=a;IH.C()});q("iSpring.InteractionPlayerFactory.registerCreateScenarioPlayerFunction",function(a){GH=a;JH.C()});q("iSpring.InteractionPlayerFactory.registerCreateInteractionPlayerFunction",function(a,b){HH[a]=b;KH.C(a)});function LH(a,b,c,d,e,f,g,h,l,n,m,p){const r=FH;if(!r)throw Error("quiz player is not loaded");r(a,b,c,d,e,f,g,h,l,n,m,p)} +function MH(a,b,c,d,e,f,g,h,l,n,m,p){const r=HH[a];if(!r)throw Error(a+" player is not loaded");r(b,c,d,e,f,g,h,l,n,m,p)}function NH(a,b,c,d,e,f,g,h,l,n,m,p,r,v,y,D,I){const A=GH;if(!A)throw Error("scenario player is not loaded");A(a,b,c,d,e,f,g,h,l,n,m,p,r,v,y,D,I)};function OH(a,b,c){PH[b]=c;a="q_"+a;window[a]||(window[a]=function(d,e,f,g,h){(0,PH[d])(e,f,g,h);PH[d]=null})}function QH(a,b,c){PH[b]=c;a="i_"+a;window[a]||(window[a]=function(d,e,f,g){const h=PH[d];h&&(h(e,f,g),PH[d]=null)})}function RH(a,b,c){PH[b]=c;a="s_"+a;window[a]||(window[a]=function(d,e,f,g,h,l,n,m){const p=PH[d];p&&(p(e,f,g,h,l,n,m),PH[d]=null)})}function SH(a,b,c){PH[b]=c;a="sl_"+a;window[a]||(window[a]=function(d,e,f){const g=PH[d];g&&(g(e,f||null),PH[d]=null)})} +function TH(a){Fd(a.kY);a.kY=void 0}function UH(a,b,c,d){const e=a.Qr.substr(0,a.Qr.lastIndexOf("/")+1);var f=wd("div");const g=wd("div");var h=new P;const l=a.context();h.resize(l.slideWidth(),l.slideHeight());f.appendChild(h.displayObject());f.appendChild(g);l.tb=f;f=VH(a);h=l.slide();const n=h.pQ(),m=WH(a.H.CE,a.H.ia()),p=MH.bind(void 0,n,b,c,d,g,f,l.slideWidth(),l.slideHeight(),a.Z3.bind(a),e,h.index(),m);void 0!==HH[n]?p():(KH.addHandler(r=>{r==n&&p()}),Ui(h.Xo()))} +function XH(a,b,c,d,e,f,g,h){const l=a.Qr.substr(0,a.Qr.lastIndexOf("/")+1);var n=wd("div");const m=wd("div");var p=new P;const r=a.context();p.resize(r.slideWidth(),r.slideHeight());n.appendChild(p.displayObject());n.appendChild(m);r.tb=n;n=VH(a);p=r.slide();const v=YH(a.H.CE),y=NH.bind(void 0,b,c,d,e,m,n,r.slideWidth(),r.slideHeight(),a.b4.bind(a),l,p.index(),f,g,h,a.H.Gt().enabled(),v);void 0!==GH?y():(JH.addHandler(()=>{y()}),Ui(p.Xo()))} +function VH(a){const b=wd("div");a.context().Vq().appendChild(b);mn(b,"framesLayerContent");return b} +class ZH extends DH{constructor(a,b,c,d){super(70);this.$F=a;this.Fd=b;this.Qr=c;this.H=d}start(a){super.start(a);const b=a.slide()instanceof br,c=a.slide()instanceof sq;a=a.slide()instanceof Aq;b?OH(this.$F,this.Fd,this.d6.bind(this)):c?QH(this.$F,this.Fd,this.J5.bind(this)):a?RH(this.$F,this.Fd,this.l6.bind(this)):SH(this.$F,this.Fd,this.B6.bind(this));this.kY=Ui(this.Qr)}B6(a,b){a=ij&&fj&&navigator.connection&&navigator.connection.saveData?a.replace(/{this.Ur=gn(b.response());this.ge.C(this.Ur)});b.send(a,"GET",{})}};let iI=null,jI=0;function kI(a,b){if(sj)if(a=`@import "${b}";`,!iI||30<=jI)iI=gn(a).styleSheet,jI=1;else{var c=a;a=iI;b=void 0;if(void 0==b||0>b)b=fn(a).length;if(a.insertRule)a.insertRule(c,b);else if(c=/^([^\{]+)\{([^\{]+)\}/.exec(c),3==c.length)a.addRule(c[1],c[2],b);else throw Error("Your CSSRule appears to be ill-formatted.");++jI}else a.Rz=wd("link",{rel:"stylesheet",type:"text/css",href:b}),sd("head")[0].appendChild(a.Rz)} +class lI{constructor(){this.Rz=null;this.ge=new C}load(a){const b=Ib||Hb?dn:en,c=b().length;kI(this,a);const d=this,e=setInterval(()=>{try{if(null!=d.Rz&&null!=d.Rz.sheet||b().length!=c)clearInterval(e),d.ge.C(this.Rz)}catch(f){}},100)}};class mI extends DH{constructor(a){super(30);this.l3=a;this.Ur=null}get z$(){return this.Ur}start(a){super.start(a);a=Vi()||sj?new lI:new hI;a.ge.addHandler(b=>{this.Ur=b;this.Qh()},this);a.load(this.l3)}};class nI extends DH{constructor(){super();this.UD=this.TD=0;this.J9=1}weight(){return this.J9*this.TD}start(a){super.start(a);var b=a.tb;if(b){a={};b=b.querySelectorAll("span");for(var c=0;c=b.charCodeAt(c)){c=!0;break a}c=!1}SB(h,c?b.substr(0,1):"0",g,a)}this.Qj()}else this.Qh()}C5(){++this.UD;this.Qj()}B5(){++this.UD;this.Qj()}Qj(){this.UD==this.TD?this.Qh():this.it(this.UD/this.TD)}};class oI extends DH{constructor(){super();this.K9=1;this.Ou=0;this.Wz=[];this.HT={};this.kE=-1}weight(){return this.K9*this.Ou}start(a){super.start(a);if(a=a.tb){a=a.querySelectorAll("img");this.Ou=a.length;for(let b=0;b=a.xn.length)a.Qh();else{var b=a.context(),c=a.xn[a.By];pI(a,c);c.start(b)}}class vI extends rI{constructor(a){super(a)}start(a){super.start(a);uI(this)}Sv(a){super.Sv(a);uI(this)}};class wI{constructor(a){this.QJ=a}gj(){return this.QJ}};class xI{constructor(a,b){this.W3=a;this.bT=b}};const yI=Ii?[0,1,2,-1,3,4,-2,5]:[0,1,2,-1,3,4,-2,5,6,7,8,9,10]; +function zI(a,b){a.XE=b;const c=a.vG[b];c.Pa=1;const d=c.slide();var e=a.H2;const f=[],g=d.src();if(!g)throw Error("slide src can't be null");let h=null;g instanceof xI?(b=new ZH(a.F.vu(),b,e+g.W3,a.F.settings()),g.bT?(h=new mI(e+g.bT),f.push(new sI([h,b],20))):f.push(b)):(e=g.gj(),f.push(new EH(e)));"slide"==d.type()&&f.push(new tI);e=new CH(d,a.F.slideWidth(),a.F.slideHeight(),a.Qe);const l=new vI(f);z(a,l.gr(),n=>{Ue(a,l);var m=n.context();d.GU=!0;n=m.tb;const p=Hd(n);c.$q(p[1],p[0],m.jy);c instanceof +uH?(m=m.Oa(),c.qR(m)):c instanceof tH?(m=m.fb(),c.hR(m)):c instanceof nv&&(m=m.ob(),c.rR(m));d instanceof Am&&(n=a.sO.create(d,n,h?h.z$:null),AI(n.s7.ww,n.A8),n.DO&&n.VW());BI(a);a.gl.C(d)});z(a,l.CC(),()=>{Ue(a,l);BI(a);a.C8.C(d)});l.start(e)}function mF(a){kh(a.G4,100,a)}function BI(a){a.YU[a.XE]=!0;a.XE=void 0;mF(a)} +class CI extends wg{constructor(a,b){super();this.F=a;this.sO=b;this.H2="";a=a.slides();b=[];for(let d=0;d{d==b&&(c.Xc(),GI(a))})}function GI(a){var b=new DI(new CI(a.F,a.sO),a.F.settings().NI(),a.F.settings().ia()||{});b=new AF(a.F,a.o7,b);a.Yv.C(b)} +class HI extends wg{constructor(a,b,c){super();this.F=a;this.o7=b;this.sO=c;this.Yv=E(this)}Tq(){var a=this.F.settings().Hx(),b=a.DH(),c;if(c=b){a:{c=window.location.hostname;for(var d=0;dSr(b, +d),f=0>=Sr(c,b);if(0>Sr(c,d)){b=e&&f;break a}if(0>Sr(d,c)){b=e||f;break a}}b=c&&0>Sr(b,c)?!1:!(d&&0<=Sr(b,d))}b=!b}b?(a=EI(this,"PB_TIME_RESTRICTION","Sorry, the presentation's creator disabled viewing the presentation at the moment"),uj?new MG("time",a,!1):new GG(a,"time")):a.eN?FI(this,a.password()):GI(this)}}};function II(a){a=a.querySelectorAll("*");const b=[];for(const c of a)/^txt\w*/.test(c.id)&&b.push(c);return b}function JI(a,b){const c=new Map;II(a).forEach(d=>{var e=b.find(f=>!!f.selectorText.match(d.id));(e=e?e.style:null)&&c.set(d,e)});return c}function AI(a,b){a.forEach(c=>{rm(c).forEach(d=>{const e=b.querySelector("#"+d.id);Gh(e,0,0);let f=jm(d.Xa.left,d.Xa.top);f=hm(d.nk.clone(),hm(f,d.qj));on(e,f)})})};function KI(a,b){const c=[];a.xca.forEach((d,e)=>{b(d)&&c.push({element:e,O_:d})});return c}class LI{constructor(a,b,c){this.s7=a;this.A8=b;this.Ur=c;this.DO=null;if(c&&c.sheet)try{this.DO=JI(b,Array.from(c.sheet.cssRules))}catch(d){}}get styleSheet(){return this.Ur.sheet}get xca(){return this.DO}};function MI(a){return KI(a,b=>/text-decoration-line: underline/.test(b.cssText))} +class NI extends LI{VW(){for(const {element:e,O_:f}of MI(this)){var a=e,b={},c=f.cssText.match(/text-decoration-.*?(?=;)/g);if(c)for(const g of c){const [h,l]=g.split(": ");b[h]=l}a:{var d=b;c=["solid","dashed","dotted","double"];if(d.hasOwnProperty("text-decoration-style")&&(d=d["text-decoration-style"],-1!=c.indexOf(d))){c=d;break a}c="solid"}if((d=b["text-decoration-thickness"]||"")&&"double"==c){const g=2*parseFloat(d);isNaN(g)||(d=`${g}px`)}a.style.borderBottom=`${c} ${d} ${b["text-decoration-color"]|| +""}`}for(const {element:e}of this.YK())e.style.textDecoration="line-through"}YK(){return KI(this,a=>/text-decoration-line: underline line-through/.test(a.cssText))}};class OI extends LI{VW(){this.YK().forEach(({element:a,O_:b})=>{b.removeProperty("text-decoration-line");b.setProperty("text-decoration-line","underline");const c=b.getPropertyValue("text-decoration-thickness");b=b.getPropertyValue("color")||"black";this.styleSheet.insertRule(`#${a.id}::after { + position: absolute; + content: ''; + width: 100%; + height: 0; + border-top: ${c} solid ${b}; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; + }`)})}YK(){return KI(this,a=>/text-decoration-line: underline line-through/.test(a.cssText))}};class PI{create(a,b,c){return Ib?new NI(a,b,c):new OI(a,b,c)}};class QI extends wg{constructor(){super();this.uf=null;this.Rw="";this.rP="_blank";this.XL=E(this)}logo(){return this.uf}ue(){return this.Rw}xR(a){this.Rw=a}pD(){return this.rP}isEqual(a){if(a.ue()!==this.Rw||a.pD()!==this.rP)return!1;a=a.logo();return this.uf||a?!!this.uf&&!!a&&this.uf.path()===a.path():!0}}QI.prototype.webSiteTarget=QI.prototype.pD;QI.prototype.webSiteUrl=QI.prototype.ue;QI.prototype.logo=QI.prototype.logo;class RI{constructor(){this.Ps=this.Pl=this.Rw=this.uS=this.MU=this.Th="";this.XW=this.yb=null}name(){return this.Th}Pt(){return this.MU}Oq(){return this.uS}ue(){return this.Rw}xR(a){this.Rw=a}email(){return this.Pl}phone(){return this.Ps}Td(){return this.yb}gu(a){this.yb=a}Vt(){return this.XW}}RI.prototype.photo=RI.prototype.Vt;RI.prototype.company=RI.prototype.Td;RI.prototype.phone=RI.prototype.phone;RI.prototype.email=RI.prototype.email;RI.prototype.webSiteUrl=RI.prototype.ue; +RI.prototype.biography=RI.prototype.Oq;RI.prototype.jobTitle=RI.prototype.Pt;RI.prototype.name=RI.prototype.name;class SI extends wg{constructor(){super();this.wv=this.xv=!1;this.le=0;this.Tz=E(this);this.Vz=E(this);this.WU=E(this)}mf(){return this.xv}progress(){return this.le}load(){this.xv||this.wv||(this.wv=!0,this.Rh())}Rh(){}GZ(){}Hca(){if(this.xv||this.wv)this.GZ(),this.wv=this.xv=!1,this.it(0)}it(a){this.le!=a&&(this.le=a,this.WU.C(this))}gr(){return this.Tz}CC(){return this.Vz}Iaa(){return this.WU}}SI.prototype.loadProgressEvent=SI.prototype.Iaa;SI.prototype.loadFailedEvent=SI.prototype.CC; +SI.prototype.loadCompleteEvent=SI.prototype.gr;SI.prototype.unload=SI.prototype.Hca;SI.prototype.load=SI.prototype.load;SI.prototype.progress=SI.prototype.progress;SI.prototype.isLoaded=SI.prototype.mf;function TI(a){a.Ig&&(a.Ig.onload=null,a.Ig.onerror=null)}function UI(a){if(!a.mf())throw Error("asset not loaded");} +class VI extends SI{constructor(a,b,c){var d,e,f;super();this.Ig=null;var g=a.startsWith("data:")?null:void 0;this.wA=g=a;this.Ua=b;this.Na=c}Rh(){this.Ig=new Image;this.Ig.onload=this.rF.bind(this);this.Ig.onerror=this.F5.bind(this);this.Ig.src=this.wA}rF(){TI(this);this.wv=!1;this.xv=!0;this.it(1);this.Tz.C(this)}F5(){TI(this);this.wv=this.xv=!1;this.Vz.C(this);this.it(0)}GZ(){this.Ig&&(TI(this),this.Ig.src="",this.Ig=null)}path(){return this.wA}width(){if(null!=this.Ua)return this.Ua;if(!this.Ig)return 0; +UI(this);return this.Ig.width}height(){if(null!=this.Na)return this.Na;if(!this.Ig)return 0;UI(this);return this.Ig.height}gC(){UI(this);const a=zd("canvas");a.width=this.width();a.height=this.height();a.getContext("2d").drawImage(this.Ig,0,0);return a}w$(){UI(this);return this.Ig.cloneNode(!0)}}VI.prototype.createImgInstance=VI.prototype.w$;VI.prototype.createInstance=VI.prototype.gC;VI.prototype.height=VI.prototype.height;VI.prototype.width=VI.prototype.width;VI.prototype.path=VI.prototype.path;class WI extends VI{url(){return this.wA}}WI.prototype.url=WI.prototype.url;function XI(a,b){const c=a.Sa.actions,d=new rg(YI(a,b));b[c.lu].forEach(e=>{d.uY.push(new qg(e[c.lu.key],w(e,c.lu.zH,!1),w(e,c.lu.shift,!1)))});return d} +function YI(a,b){a=a.Sa.actions.name;switch(b[a]){case a.tba+"":return"playPause";case a.bI+"":return"nextSlide";case a.Cba+"":return"previousSlide";case a.aba+"":return"nextStep";case a.Dba+"":return"previousStep";case a.bca+"":return"seekForward";case a.aca+"":return"seekBackward";case a.Y$+"":return"firstSlide";case a.Eaa+"":return"lastSlide";case a.tQ+"":return"lastViewedSlide";case a.mca+"":return"slideStart";case a.jca+"":return"slideEnd";case a.Qca+"":return"volumeUp";case a.Pca+"":return"volumeDown"; +case a.Bca+"":return"toggleFullscreen"}throw Error("unknown action type");}class ZI{constructor(a){this.Sa=a}vQ(a,b){a.ra(w(b,this.Sa.enabled,!1));const c=a.actions();c.lc.length=0;a.enabled()&&b[this.Sa.actions].forEach(d=>{c.uh(XI(this,d))})}};function $I(a){this.Ea=a}t($I,El);$I.prototype.Ea=0;$I.prototype.duration=function(){return this.Ea};$I.prototype.se=function(){};$I.prototype.gk=function(){};function aJ(a){this.lc=a||[]}t(aJ,Fl);k=aJ.prototype;k.oM=null;k.Ea=-1;k.uh=function(a){if(0<=this.Ea)throw Error("ParallelActions was already initialized");this.lc.push(a)};k.EJ=function(){let a=0;for(let b=0;bthis.Ea&&(this.Ea=this.EJ());return this.Ea}; +function bJ(a){if(a.oM)return a.oM;const b=[],c=a.duration(),d=a.lc.length;for(let e=0;e=this.jK.duration()?a.complete(this.jK,c,d):a.se(this.jK,b,c,d)}};k.Eh=function(a,b,c){a.complete(this.NU,b,c)};function hJ(a){this.Hl=a}t(hJ,Fl);k=hJ.prototype;k.duration=function(){return Gl(this.Hl)};k.se=function(a,b,c){a=this.Mi(a);this.uc(Ml(),a,b,c)};k.complete=function(a,b){this.Eh(Ml(),a,b)};k.gk=function(a,b,c){a=this.Mi(a,!0);this.uc(Jl(),a,b,c)};k.NC=function(a,b){this.Eh(Jl(),a,b)};k.uc=function(a,b,c,d){if(b==this.duration())this.Eh(a,c,d);else{if(!(this.Hl instanceof El))throw Error("can't run not prolonged action");a.se(this.Hl,b,c,d)}};k.Eh=function(a,b,c){a.complete(this.Hl,b,c)};function iJ(a){this.rb=a;this.vZ=[];let b=0;for(let c=0;cthis.Ea)return!1;if(0==a&&b>=this.Ea)return!0;const c=this.rb.length;for(let d=0;dthis.Ea)return!1;if(0==a&&b>=this.Ea)return!0;const c=this.Vs,d=this.Hl.duration();var e=Math.floor(a/(d+c));const f=Math.floor(b/(d+c));if(1=g&&this.Hl.wC(Math.max(a-g,0),b-g))return!0}return!1};jJ.prototype.MR=function(){return[this.Ea]};function kJ(a,b,c,d){this.Uh="__mediaTransforms";this.Hb=a;this.GF=b;this.QN=c;this.Ph=d}kJ.prototype.Hm=function(){return this.GF};kJ.prototype.se=function(a,b){a.yd.add(new Sp(this.Uh,this.Hb,new Vp(this.GF,this.Ph,b)))};function lJ(){}k=lJ.prototype;k.Sa=null;k.FB=0;k.Gg=0;k.sZ=0;k.initialize=function(a,b,c,d){this.Sa=a;this.FB=b;this.Gg=c;this.sZ=d}; +k.load=function(a){const b=this.Sa;var c=this.Sa;if(a[c.lk]||a[c.Bi]){c=this.Sa;const e=a[c.lk]||a[c.Bi];a:{var d=this.Sa;switch(a[d.Hm]){case d.Hm.play+"":d=zp;break a;case d.Hm.pause+"":d=Ap;break a;case d.Hm.stop+"":d=Bp;break a}throw Error("unknown media operation");}c=new yp(e,d,c.xi in a?a[c.xi]:null)}else c=new Cp;return new kJ(b.Bi in a?"video":"sound",c,a[b.timing][b.timing.start]*this.FB+this.Gg,this.sZ)};function mJ(){}k=mJ.prototype;k.Sa=null;k.MO=0;k.py=null;k.Ph=0;k.initialize=function(a,b,c,d){this.Sa=a;this.MO=c;this.py=b;this.Ph=d};k.ta=function(){if(!this.Sa)throw Error("BehaviorLoader isn't initialized");return this.Sa};function nJ(a){if(!a.py)throw Error("BehaviorLoader isn't initialized");return a.py}function oJ(a){if(!a.py)throw Error("BehaviorLoader isn't initialized");return a.py.id()}k.level=function(){return this.Ph}; +k.load=function(a){const b=this.XU(a);let c=this.Rh(a,b);c=this.jJ(c,a,b);b.ui()&&(a=ma(c)+"_rewind",c=new Nl([new eJ(oJ(this),a),c,new fJ(oJ(this),a)]));return 0=a.Ea?1:b/a.Ea}qJ.prototype.se=function(a,b,c){const d=this.Mi(a);this.uc(d>=this.Ea?1:d/this.Ea,b,c,!1,a==this.Ea)};qJ.prototype.gk=function(a,b,c){const d=this.Mi(a,!0);this.uc(1-(d>=this.Ea?1:d/this.Ea),b,c,!0,a==this.Ea)};function sJ(a,b,c,d){b.yd.add(new Sp(a.Uh,c,d))} +function tJ(a,b,c,d){const e=ma(a),f=b.fv.get(e);f?d=f.value:(a=b.y7.get(a.Uh),d=d(a),b.fv.set(e,{value:d,Iha:tk(c)}));return d};function uJ(a,b,c){qJ.call(this,a,b);this.C3=c}t(uJ,qJ);uJ.prototype.uc=function(a,b,c,d,e){if(d=tJ(this,b,c,f=>(f=vl(f))?"font-size"in f.Zh?f.Zh["font-size"]:"":""))a=Yk("font-size",(this.C3-d)*a+d,c,e),sJ(this,b,"cssTextProperties",a)};function vJ(){}t(vJ,mJ);vJ.prototype.XU=function(a){const b=this.ta().timing;return new wJ(this.MO,a[b],b)};function xJ(a){return eval("("+a+")")}vJ.prototype.jJ=function(a,b,c){if(0f&&(e-=360)}return[(e-f)*c+f,(b[1]-a[1])*c+a[1],(b[2]-a[2])*c+a[2]]};function BJ(a,b,c,d){this.fe=a;this.O8=b;this.FK=c;this.jq=d}BJ.prototype.getTransform=function(a,b,c,d,e,f){return new Wk(new Tk(this.fe,AJ(this.O8,this.FK,b,this.fe)),this.jq,!0,d,f)};function CJ(a,b,c,d){this.Hb=a;this.fe=b;this.FK=c;this.jq=d}CJ.prototype.getTransform=function(a,b,c,d,e,f){const g=this.Hb;a=tJ(a,c,d,h=>{let l=null;switch(g){case "textColor":l=kl(h,"textColor");break;case "strokeColor":l=kl(h,"strokeColor");break;case "fillColor":l=kl(h,"fillColor");break;case "imgColor":l=kl(h,"imgColor")}return l?l.color():null});if(!a)return null;a=a.Sc(this.fe);return new Wk(new Tk(this.fe,AJ(a,this.FK,b,this.fe)),this.jq,!0,d,f)};function DJ(a,b,c,d){qJ.call(this,a,b);this.Hb=c;this.Ek=d}t(DJ,qJ);DJ.prototype.uc=function(a,b,c,d,e){(a=this.Ek.getTransform(this,a,b,c,d,e))&&sJ(this,b,this.Hb,a)};function EJ(){}t(EJ,vJ); +EJ.prototype.Rh=function(a,b){var c=this.ta();c=FJ(this,a[c.target]);const d=[];for(let p=0;pa||1=this.Sn&&(b=this.rX,c=this.sX);let d=null;for(;ba){d=e.lI((a-c)/(f-c));break}c=f}this.Sn=a;this.rX=b;this.sX=c;return d?d:this.end()};function OJ(a){this.Ea=a}OJ.prototype.duration=function(){return this.Ea};function KJ(a){this.Ea=0;this.gq=a}t(KJ,OJ);KJ.prototype.end=function(){return this.gq}; +function LJ(a,b,c){this.Ea=a;this.nE=b;this.TG=c}t(LJ,OJ);LJ.prototype.end=function(){return this.TG};LJ.prototype.lI=function(a){const b=this.nE,c=this.TG;return new Xc((c.x-b.x)*a+b.x,(c.y-b.y)*a+b.y)};function NJ(a,b,c,d,e){this.Ea=a;this.DK=e;this.L2=new Un(b.x,b.y,c.x,c.y,d.x,d.y,e.x,e.y)}t(NJ,OJ);NJ.prototype.end=function(){return this.DK}; +NJ.prototype.lI=function(a){var b=this.L2;if(0==a)var c=b.qD;else if(1==a)c=b.rD;else{c=Wc(b.qD,b.x1,a);var d=Wc(b.x1,b.x2,a),e=Wc(b.x2,b.rD,a);c=Wc(c,d,a);d=Wc(d,e,a);c=Wc(c,d,a)}0==a?a=b.sD:1==a?a=b.tD:(d=Wc(b.sD,b.y1,a),e=Wc(b.y1,b.y2,a),b=Wc(b.y2,b.tD,a),d=Wc(d,e,a),e=Wc(e,b,a),a=Wc(d,e,a));return new Xc(c,a)};function PJ(a,b,c){qJ.call(this,a,b);this.wA=c}t(PJ,qJ);PJ.prototype.uc=function(a,b,c,d,e){a=this.wA.lI(a);sJ(this,b,"moveX",new bl(a.x,!0,c,e));sJ(this,b,"moveY",new bl(a.y,!0,c,e))};function QJ(){}t(QJ,vJ);QJ.prototype.Rh=function(a,b){const c=this.ta();return new PJ(oJ(this),b.duration(),RJ(this,a[c.path]))}; +function RJ(a,b){function c(){return new Xc(d()+f,d()+g)}function d(){const h=b.match(/^\s*([-0-9\.]+)/);if(h)return b=b.substr(h[0].length),parseFloat(h[1]);throw Error("incorrect path");}function e(){const h=b.match(/^\s*([m|l|c])/i);return h?(b=b.substr(h[0].length),h[1].toLowerCase()):null}a=nJ(a);const f=a.Xa().left,g=a.Xa().top;b=b.replace(/,/g," ");for(a=new JJ;;){const h=e();if(!h)break;switch(h){case "m":a.moveTo(c());break;case "l":a.lineTo(d(),c());break;case "c":MJ(a,d(),c(),c(),c())}}return a} +;function SJ(a,b){this.Us=a;this.ON=b}SJ.prototype.getTransform=function(a,b,c,d,e,f){b=this.Xg(b,d,f);this.Us&&e&&this.ON&&(a=this.Xg(rJ(a),d,f),b=b.add(a.Tt()));return b};function TJ(a,b,c){SJ.call(this,b,c);this.n7=a}t(TJ,SJ);TJ.prototype.Xg=function(a,b,c){return new bl(this.n7(a),!this.Us,b,c)};function UJ(a,b){SJ.call(this,!0,b);this.n3=a}t(UJ,SJ);UJ.prototype.Xg=function(a,b,c){return new bl(this.n3*a,!1,b,c)};function VJ(a,b,c,d){SJ.call(this,c,d);this.nE=a;this.TG=b}t(VJ,SJ);VJ.prototype.Xg=function(a,b,c){return new bl((this.TG-this.nE)*a+this.nE,!this.Us,b,c)};function WJ(a,b){this.D3=a;this.Hb=b}WJ.prototype.getTransform=function(a,b,c,d,e,f){const g=this.Hb;a=tJ(a,c,d,h=>"moveX"==g?nl(h).sc:ol(h).sc);return null===a?null:new bl((this.D3-a)*b+a,!0,d,f)};function XJ(a,b,c,d){qJ.call(this,a,b);this.Hb=c;this.Ek=d}t(XJ,qJ);XJ.prototype.uc=function(a,b,c,d,e){(a=this.Ek.getTransform(this,a,b,c,d,e))&&sJ(this,b,this.Hb,a)};function YJ(a){this.Hb=a}t(YJ,vJ);YJ.prototype.Rh=function(a,b){const c=this.ta();if(c.Fo in a){var d=oJ(this),e=b.duration();b=!b.ui();a=new XJ(d,e,this.Hb,new UJ(a[c.Fo],b))}else if(c.GH in a){d=oJ(this);e=b.duration();var f=xJ(a[c.GH]);b=!b.ui();a=new XJ(d,e,this.Hb,new TJ(f,w(a,c.rI,!1),b))}else c.from in a?(d=oJ(this),e=b.duration(),b=!b.ui(),a=new XJ(d,e,this.Hb,new VJ(a[c.from],a[c.Bh],w(a,c.rI,!1),b))):(d=oJ(this),b=b.duration(),e=this.Hb,a=new XJ(d,b,e,new WJ(a[c.Bh],e)));return a}; +function ZJ(){this.Hb="moveX"}t(ZJ,YJ);function $J(){this.Hb="moveY"}t($J,YJ);function aK(a,b,c){this.ZY=a;this.EK=b;this.Ph=c}aK.prototype.getTransform=function(a,b,c,d,e,f){return new ip((this.EK-this.ZY)*b+this.ZY,this.Ph,d,f)};function bK(a,b){this.EK=a;this.Ph=b}bK.prototype.getTransform=function(a,b,c,d,e,f){a=tJ(a,c,d,g=>(g=kl(g,"filter"))&&g instanceof ip?g.alpha():1);return null===a?null:new ip((this.EK-a)*b+a,this.Ph,d,f)};function cK(a,b,c){qJ.call(this,a,b);this.Ek=c}t(cK,qJ);cK.prototype.uc=function(a,b,c,d,e){(a=this.Ek.getTransform(this,a,b,c,d,e))&&sJ(this,b,"filter",a)};function dK(){}t(dK,vJ);dK.prototype.Rh=function(a,b){const c=this.ta();if(c.Fo in a)throw oJ(this),b.duration(),this.level(),Error("not implemented");if(c.from in a){var d=oJ(this);b=b.duration();var e=this.level();a=new cK(d,b,new aK(a[c.from],a[c.Bh],e))}else d=oJ(this),b=b.duration(),e=this.level(),a=new cK(d,b,new bK(a[c.Bh],e));return a};function eK(a,b){this.Mf=a;this.PN=b}eK.prototype.Xg=function(a,b,c){return new cl(this.Mf*a,!1,b,c)};eK.prototype.getTransform=function(a,b,c,d,e,f){b=this.Xg(b,d,f);e&&this.PN&&(a=this.Xg(rJ(a),d,f),b=b.add(a.Tt()));return b};function fK(a,b){this.PT=a;this.c9=b}fK.prototype.getTransform=function(a,b,c,d,e,f){return new cl((this.c9-this.PT)*b+this.PT,!0,d,f)};function gK(a){this.Mf=a}gK.prototype.getTransform=function(a,b,c,d,e,f){a=tJ(a,c,d,g=>ll(g).angle()+ml(g).angle());return null===a?null:new cl((this.Mf-a)*b+a,!0,d,f)};function hK(a,b,c,d){qJ.call(this,a,b);this.Hb=c;this.Ek=d}t(hK,qJ);hK.prototype.uc=function(a,b,c,d,e){(a=this.Ek.getTransform(this,a,b,c,d,e))&&sJ(this,b,this.Hb,a)};function iK(){}t(iK,vJ);iK.prototype.Rh=function(a,b){const c=this.ta();if(c.Fo in a){var d=oJ(this),e=b.duration();b=!b.ui();a=new hK(d,e,"rotateBy",new eK(a[c.Fo]*Math.PI/180,b))}else c.from in a?(d=oJ(this),b=b.duration(),a=new hK(d,b,"rotateTo",new fK(a[c.from]*Math.PI/180,a[c.Bh]*Math.PI/180))):(d=oJ(this),b=b.duration(),a=new hK(d,b,"rotateTo",new gK(a[c.Bh]*Math.PI/180)));return a};function jK(a,b){this.Us=a;this.ON=b}jK.prototype.getTransform=function(a,b,c,d,e,f){b=this.Xg(b,d,f);this.Us&&e&&this.ON&&(a=this.Xg(rJ(a),d,f),b=b.add(a.Tt()));return b};function kK(a,b,c){jK.call(this,b,c);this.U7=a}t(kK,jK);kK.prototype.Xg=function(a,b,c){return new dl(this.U7(a),!this.Us,b,c)};function lK(a,b){jK.call(this,!0,b);this.qa=a}t(lK,jK);lK.prototype.Xg=function(a,b,c){return new dl((this.qa-1)*a+1,!1,b,c)};function mK(a,b,c,d){jK.call(this,c,d);this.rS=a;this.GK=b}t(mK,jK);mK.prototype.Xg=function(a,b,c){return new dl((this.GK-this.rS)*a+this.rS,!this.Us,b,c)};function nK(a,b){this.GK=a;this.Hb=b}nK.prototype.getTransform=function(a,b,c,d,e,f){const g=this.Hb;a=tJ(a,c,d,h=>{switch(g){case "scaleX":return pl(h).scale();case "scaleX2":return ql(h).scale();case "scaleY":return rl(h).scale();case "scaleY2":return sl(h).scale()}return null});return null===a?null:new dl((this.GK-a)*b+a,!0,d,f)};function oK(a,b,c,d){qJ.call(this,a,b);this.Hb=c;this.Ek=d}t(oK,qJ);oK.prototype.uc=function(a,b,c,d,e){(a=this.Ek.getTransform(this,a,b,c,d,e))&&sJ(this,b,this.Hb,a)};function pK(a){this.Hb=a}t(pK,vJ);pK.prototype.Rh=function(a,b){const c=this.ta();if(c.Fo in a){var d=oJ(this),e=b.duration();b=!b.ui();a=new oK(d,e,this.Hb,new lK(a[c.Fo],b))}else if(c.GH in a){d=oJ(this);e=b.duration();var f=xJ(a[c.GH]);b=!b.ui();a=new oK(d,e,this.Hb,new kK(f,w(a,c.rI,!1),b))}else c.from in a?(d=oJ(this),e=b.duration(),b=!b.ui(),a=new oK(d,e,this.Hb,new mK(a[c.from],a[c.Bh],w(a,c.rI,!1),b))):(d=oJ(this),b=b.duration(),e=this.Hb,a=new oK(d,b,e,new nK(a[c.Bh],e)));return a}; +function qK(){this.Hb="scaleX"}t(qK,pK);function rK(){this.Hb="scaleY"}t(rK,pK);function sK(){this.Hb="scaleX2"}t(sK,pK);function tK(){this.Hb="scaleY2"}t(tK,pK);function uK(a,b,c,d){this.Uh=a;this.z7=b;this.A7=c;this.Hb=d?"cssTextProperties":"cssProperties"}t(uK,Al);uK.prototype.se=function(a,b){b=Yk(this.z7,this.A7,b,!0);a.yd.add(new Sp(this.Uh,this.Hb,b))};uK.prototype.gk=function(){};function vK(){}t(vK,mJ);vK.prototype.Rh=function(a){const b=this.ta(),c=a[b.Gba],d=a[b.zaa];if(d){var e=nJ(this);Pa(e.mJ,c)||e.mJ.push(c)}else e=nJ(this),Pa(e.lJ,c)||e.lJ.push(c);return new uK(oJ(this),c,a[b.Bh],d)};function wK(a,b){this.$Y=a;this.HK=b}wK.prototype.getTransform=function(a,b,c,d,e,f){return new el((this.HK-this.$Y)*b+this.$Y,d,f)};function xK(a){this.HK=a}xK.prototype.getTransform=function(a,b,c,d,e,f){a=tJ(a,c,d,g=>ul(g).shift());return null===a?null:new el((this.HK-a)*b+a,d,f)};function yK(a,b,c){qJ.call(this,a,b);this.Ek=c}t(yK,qJ);yK.prototype.uc=function(a,b,c,d,e){(a=this.Ek.getTransform(this,a,b,c,d,e))&&sJ(this,b,"shiftX",a)};function zK(){}t(zK,vJ);zK.prototype.Rh=function(a,b){const c=this.ta();if(c.from in a){var d=oJ(this);b=b.duration();a=new yK(d,b,new wK(a[c.from],a[c.Bh]))}else d=oJ(this),b=b.duration(),a=new yK(d,b,new xK(a[c.Bh]));return a};function AK(a,b){this.Uh=a;this.Qa=b}t(AK,Al);AK.prototype.se=function(a,b){this.uc(this.Qa,a,b)};AK.prototype.gk=function(a,b){this.uc(!this.Qa,a,b)};AK.prototype.uc=function(a,b,c){b.yd.add(new Sp(this.Uh,"visibility",new il(a,c)))};function BK(){}t(BK,mJ);BK.prototype.Rh=function(a){const b=this.ta();return new AK(oJ(this),a[b.Bh])};function CK(a){this.Qg=a;this.ml=1;this.P8=0} +CK.prototype.load=function(a,b){var c=this.ta();c.BP in b&&DK(this,a,b[c.BP]);var d=this.ta(),e=null;d.xQ in b&&d.yi in b[d.xQ]&&(e=b[d.xQ]);var f=e?e[d.yi].length:0,g=a.nb().count(),h=!1;if(g==f+1)f=a.yv,g=a.nb().pc(0),f.vh(Tl(this.Qg,"__step",!0)),Vl(f,new $I(1E3*g.duration())),h=!0;else if(g!==f)throw Error("count of slide animation steps must be equal to steps in mainSequence");e&&EK(this,a,a.Au,a.yv,0,e[d.yi],new FK(a,this,h));if(c.qQ in b)for(b=b[c.qQ],c=0;cp?p/(D+.001):1;D>m.P8&&(m.ml=p);m=p;p=new aJ;v=!1;n=n[h.Rj];for(r=0;r{const v=new tm(p[m.type],e(p[m.ym]),r),y=m.item;p[m.Nc]&&(v.Nc=f(p[m.Nc],y),v.B_= +p[m.Nc][m.naa]);u(p[m.Dl],D=>{D=f(D,y);v.Dl.push(D)});u(p[m.Qq]||[],D=>{D=new l(D[m.type],D[m.text],D[m.mj]);v.Qq.push(D)});v.text=p[m.text];v.fr=p[m.fr]||0;v.rotation=p[m.rotation]/180*Math.PI;v.ul=p[m.ul];v.Fl=p[m.Fl];v.mj=p[m.mj];r=v.kx;r.line=p[m.line];r.fill=p[m.fill];r.Nt=p[m.Nt];r.Zt=p[m.Zt];r.ku=p[m.ku];r.pu=p[m.pu];r.qu=p[m.qu];sm(v);p[m.ne]&&(v.ne=g(p[m.ne],m.ne));b.ww.push(v)},a)}} +function WK(a,b,c){function d(f){switch(f[e.action.type]){case e.action.type.bba+"":return new KK;case e.action.type.pe+"":return new es(f[e.action.L])}throw Error("unknown branching action");}const e=a.ta().slides.fj;e.Oo in c&&Pf(b,d(c[e.Oo]));e.Gx in c&&Qf(b,d(c[e.Gx]))}function XK(a,b,c){function d(f){return new $r(f[e.link.url],f[e.link.target])}const e=a.ta().settings.xu;Yr(b,e.HI in c?d(c[e.HI]):null);Zr(b,e.mI in c?d(c[e.mI]):null)} +function YK(a,b,c){function d(e){return e?new Pr(new Date(1E3*e)):null}a=a.ta().settings.Hx;a.password in c&&(b.eN=c[a.password]);if(a.Xx in c){const e=c[a.Xx];Vr(b,new Tr(d(e[a.Xx.I$]),d(e[a.Xx.J$])))}a.DH in c&&(b.mT=c[a.DH])}function RK(a,b){if(!a)return 1;if("number"===typeof a)return a;switch(a){case b.repeat.E1+"":return"untilNextClick";case b.repeat.F1+"":return"untilNextSlide";case b.repeat.G1+"":return"untilNextSound"}return 1} +function SK(a,b,c){if(c.Sj in b){b=b[c.Sj];for(let e=0;e{d.push(a.xO.Du[e]||null)});return new pf(d,c)} +function QK(a,b,c){const d=a.ta();if(d.nd in c){const e=b.nd();c=c[d.nd];if(d.nd.xm in c){const f=b.xO,g=e.xm();ZK(a,c[d.nd.xm],(h,l,n,m)=>{g.q_(new rr(f.Du[h]||null,n,m,l))})}if(d.nd.Lf in c){const f=b.b_,g=e.Lf();ZK(a,c[d.nd.Lf],(h,l,n,m)=>{g.s_(new ur(f.Du[h]||null,n,m,l))})}}}function ZK(a,b,c){const d=a.ta().nd.track;for(let f=0;fn;++n)l.push(m),m+=1<<(n>>1);for(n=0;3>n;++n)d.push(n+16);for(n=0;7>=n;++n)d.push((8-n)%8),d.push(8+n);for(n=1;3>n;++n)e.push(n);for(n=0;28>n;++n){var p=n>>1<<16;m=n%8;p+=(l[m]<< +(n-m)/2)+1;e.push(p)}for(n=3;7>n;++n)f.push(n);m=7;for(n=0;24>n;++n)l=n>>2,p=(l<<16)+m,m+=1<n;++n)f.push(258)})();c.prototype.UP=function(l){var n=this.uH,m=n?n.length:0;if(l>l; +this.eC=n-l;this.Ww=r;return m&(1<>16;m&=65535;(0==l||l>n;this.eC=l-n;this.Ww=v;return m};c.prototype.oC=function(l){for(var n=l.length,m=0,p=0;pm&&(m=l[p]);for(var r=1<>=1;for(p=J;p< +r;p+=I)v[p]=y<<16|A;++D}return[v,m]};c.prototype.Mba=function(){function l(J,T,U,X,aa){for(J=J.Wq(U)+X;0>=1;if(0==n){var m=this.GP,p=this.Ww,r;b(r=m[p++])&&a();var v=r;b(r=m[p++])&&a();v|=r<<8;b(r=m[p++])&&a();n=r;b(r=m[p++])&&a();(n|r<<8)!=(~v&65535)&&a();this.eC=this.dC=0;r=this.$B;n=this.UP(r+v);this.$B=v=r+v;for(var y=r;y=D;++D)m[D]=8; +for(;255>=D;++D)m[D]=9;for(;279>=D;++D)m[D]=7;for(;287>=D;++D)m[D]=8;g=this.oC(m);n=Array(31);for(D=0;32>D;++D)n[D]=5;h=this.oC(n);h[0][15]=0;h[0][31]=0}p=g;r=h}else if(2==n){n=this.Wq(5)+257;r=this.Wq(5)+1;p=this.Wq(4)+4;m=Array(d.length);for(D=0;DI)y+1>=v&&(n=this.UP(y+1),v=n.length),n[y++]=I;else{if(256==I){this.$B=y;break}I-=257;I=f[I];var A=I>>16;0>16;0=v&&(n=this.UP(y+m),v=n.length);for(A=0;Ae?(c[++h]=String.fromCharCode(e),++d):191e?(f=a[d+1],c[++h]=String.fromCharCode((e&31)<<6|f&63),d+=2):(f=a[d+1],g=a[d+2],c[++h]=String.fromCharCode((e&15)<<12|(f&63)<<6|g&63),d+=3):++d;b(c.join(""))};function cL(a,b,c,d){var e=(new LK(c)).load(b);b=parseInt(w(b,c.yba,"2007"),10);c=new PI;a.nX.C(e);e=new HI(e,b,c);Qe(a,e.Yv,f=>{f.view().wi().id=d;mn(f.view().displayObject(),d);a.Yv.C(f)});e.Tq()}function dL(a,b,c,d){bL(b,e=>{e=JSON.parse(e);if(!e)throw Error("invalid presentation json!");cL(a,e,c,d)})}class eL extends wg{constructor(){super();this.Yv=E(this);this.nX=E(this)}Tq(a,b,c){la(a)?cL(this,a,b,c):dL(this,a,b,c)}};function fL(){return Ej||gL()||void 0===window.orientation?window.innerWidth>window.innerHeight:!!(window.orientation%180)}function gL(){return 0<=window.location.search.indexOf("ispringpreview=1")};function hL(a,b){z(a,b.ZU,a.TL,a);z(a,b.HZ,a.UO,a);b=b.$C();z(a,b.tu(),a.TL,a);z(a,b.UI(),a.UO,a)}function iL(a,b){z(a,b.Xk,a.TL,a);z(a,b.Dk,a.UO,a)}class jL extends wg{constructor(a){super();this.dJ=a;a=Oi();this.Gb=a.hasOwnProperty("accessibility")&&"1"==a.accessibility&&this.wm()?"accessible":"normal";this.kP=!1;this.pX=E(this);this.aV=E(this);this.IZ=E(this)}mode(){return this.Gb}wm(){return this.dJ&&!Ii&&!gL()}TL(){this.kP=!0;this.aV.C()}UO(){this.kP=!1;this.IZ.C()}};function kL(a,b,c,d){if(a.wm()){const e=new P({Yb:"SECTION"});e.nf("region");e.fp(d.PB_ACCESSIBLE_ARIA_LABEL_SETTINGS);d=rd(document,c);c=e.displayObject();d.appendChild(c);c=new HC({G:"presentation-view-mode-switch-control",tabIndex:0});N(e,c);lL(c,a);mL(c,a);nL(c,b);return c}return null} +function lL(a,b){a.ka.addHandler(()=>{if(b.kP)Ga("view mode change is locked");else{const d="normal"==b.Gb?"accessible":"normal";a:switch(d){case "normal":var c=!0;break a;case "accessible":c=b.wm();break a;default:throw Error("unknown presentation view mode");}c&&(b.Gb=d,b.pX.C(d))}})}function mL(a,b){let c=!1;b.aV.addHandler(()=>{document.activeElement==a.displayObject()&&(c=!0);a.ra(!1)});b.IZ.addHandler(()=>{a.ra(!0);c&&(a.focus(),c=!1)})} +function nL(a,b){b.un.addHandler(()=>{a.focus()});b.gS.addHandler(c=>{"normal"==c&&a.focus()})};function oL(a,b){var c=Po(a).concat(b);a=c[0];b=c[1];var d=c[2];c=c[3];if(isNaN(a)||0>a||255b||255d||255c||1oL(b.color,b.opacity)).join(", ");return`linear-gradient(${this.Oy}deg, ${a})`}kc(a){return sL({ij:this.Oy,jj:this.kz.map(b=>({color:b,opacity:b.opacity*a}))})}Am(){return sL({ij:this.Oy,jj:this.kz.map(a=>({color:a.color,opacity:a.opacity}))})}};function uL(a){const b={};Object.keys(a).forEach(c=>{const d=a[c];"SOLID"===d.type?b[c]=qL({color:d.color,opacity:d.opacity}):"GRADIENT"===d.type&&(b[c]=sL({ij:d.degree,jj:d.gradient}))});return b}function vL(a){const b={};for(const [c,d]of Object.entries(a))b[c]=d.RI();return b};class wL{constructor(){var a=new fG;this.dba=new BG;this.uP=a;this.oQ=zG}};class xL{constructor({Ba:a,RQ:b,colors:c,Km:d}){this.F=a;this.pN=b;this.Nb=c;this.Xs=d;this.Qf=null;(a=this.Nb)&&(a.popupBorder=a.playerText.kc(.08))}wP(a){Fd(this.Qf);this.Qf=null;if("normal"==a){a=this.Xs.dba;const b={__slide_width__:`${this.F.slideWidth()}px`,__slide_height__:`${this.F.slideHeight()}px`,__player_view_id__:this.pN,__borderRadius__:`${this.F.settings().skin().borderRadius}px`};this.Qf=a.Uq(this.Nb&&vL(this.Nb),b)}else if("accessible"==a)this.hJ();else throw Error("unknown presentation view mode"); +}hJ(){this.Qf=this.Xs.uP.Uq()}};function Z(a,b){if(a.Pd.hasOwnProperty(b))a=a.Pd[b];else throw Error("unknown template id: "+b);a=Ad(Kc(a));return a instanceof DocumentFragment?a.firstChild:a}class yL{constructor(a){this.Pd=a}ST(a){return"{"+a+"}"}};class zL extends yL{};function AL(a){if(a.oa&&a.oa.visible()){a.oa.focus();var b=!0}else b=!1;b||(a.kh&&a.kh.isActive()?(a.kh.focus(),b=!0):b=!1);!b&&(a=a.vc.zd[a.B.ma()].content(),a=void 0!==a.firstElementChild?a.firstElementChild:Jd(a.firstChild))&&(a.setAttribute("tabindex",0),a.focus())}function BL(a,{N1:b,Jha:c=200}){if(a.TE()||a.Hz())b?setTimeout(()=>AL(a),c):AL(a)} +class CL extends wg{constructor({W:a,Pm:b}){super();this.B=a;this.vc=b;this.kh=this.oa=null}TE(){return-1!=this.B.ma()&&this.B.$()instanceof Am}Hz(){return-1!=this.B.ma()&&this.B.$()instanceof Aq}};function DL(a){if(0GL(a,b)).map(b=>b.audio())}function HL(a){return a.kh.Lf().Sc().filter(b=>GL(a,b)).map(b=>b.video())}function GL(a,b){return a.U()>=b.jc().L()&&a.U()<=b.jf().L()}function EL(a,b){return a.I.ha(b instanceof HTMLAudioElement?"PB_ACCESSIBLE_AUDIO_NARRATION_LABEL":"PB_ACCESSIBLE_VIDEO_NARRATION_LABEL")} +class IL extends P{constructor({nd:a,W:b,ia:c}){super({Yb:"SECTION",G:"ppt-accessible-narration"});this.kh=a;this.B=b;this.I=c;this.Cj=[];this.uV=new Map;z(this,this.B.Bc(),this.s9,this)}isActive(){return 0Fd(b));this.Cj.splice(0,this.Cj.length);[...FL(this),...HL(this)].forEach(b=>{var c=this.Cj,d=c.push,e;if(!(e=this.uV.get(b.id()))){e=hH(b.pi()||gH(b));e=Ad(Kc(e));const f=EL(this,e);it(e, +"label",f);e=this.uV.set(b.id(),e).get(b.id())}d.call(c,e)});this.Cj.forEach(b=>{!a.includes(b)&&b.readyState&&(b.currentTime=0)});this.Cj.forEach(b=>this.V(b));this.J(!!this.Cj.length);DL(this)}U(){return this.B.ma()}};class JL extends P{constructor({W:a,vba:b,ia:c}){super({Yb:"NAV",G:"simple-navigation-panel"});this.nf("navigation");this.fp(c.ha("PB_ACCESSIBLE_ARIA_LABEL_NAVIGATION_BUTTONS"));this.B=a;this.mN=b;this.I=c;this.XT=E(this);this.VT=E(this);const {k$:d,i$:e}=this.Pu();N(this,e);N(this,d);z(this,this.B.Bc(),()=>{setTimeout(()=>{var f=d.ra,g=!this.B.gf("switchToPreviousSlide"),h=-1!=this.B.Vg();f.call(d,g&&h);f=e.ra;g=!this.B.gf("switchToNextSlide");h=-1!=this.B.Ug();f.call(e,g&&h||this.B.ma()==this.B.Em()&& +this.mN.Fm())},200)})}Pu(){const a=this.Oe({caption:this.I.ha("PB_ACCESSIBLE_NAVIGATION_PREV_BUTTON"),G_:()=>this.XT.C()}),b=this.Oe({caption:this.I.ha("PB_ACCESSIBLE_NAVIGATION_NEXT_BUTTON"),G_:()=>this.VT.C()});return{k$:a,i$:b}}Oe({caption:a,G_:b}){const c=new HC({ga:O(this,"button")});c.la(a);z(this,c.ka,b,this);return c}};function KL(a){a.lb.C()}class LL extends wg{constructor(){super();this.Qa=!1;this.fO=this.Fb=!0;this.Cv=ML;this.lb=E(this);this.yc=E(this)}get visible(){return this.Qa}set visible(a){this.Qa!=a&&(this.Qa=a,this.yc.C())}get enabled(){return this.Fb}set enabled(a){this.Fb!=a&&(this.Fb=a,KL(this))}get rr(){return this.fO}set rr(a){this.fO!=a&&(this.fO=a,KL(this))}get mode(){return this.Cv}set mode(a){this.Cv!=a&&(this.Cv=a,KL(this))}}var ML="presentationTimeline";class NL extends wg{constructor(){super();this.kt=this.Pb=this.Qa=!1;this.wa=new LL;this.fo=this.io=this.lO=this.lt=this.cO=this.nO=this.kO=!1;this.ze=OL;this.mO=!1;this.lb=E(this);this.yc=E(this)}get visible(){return this.Qa}set visible(a){this.Qa!=a&&(this.Qa=a,this.yc.C())}get showOutline(){return this.Pb}set showOutline(a){this.Pb!=a&&(this.Pb=a,KL(this))}get Jf(){return this.kt}set Jf(a){this.kt!=a&&(this.kt=a,KL(this))}get zc(){return this.wa}get Rx(){return this.kO}set Rx(a){this.kO!=a&&(this.kO= +a,KL(this))}get sr(){return this.nO}set sr(a){this.nO!=a&&(this.nO=a,KL(this))}get Bl(){return this.cO}set Bl(a){this.cO!=a&&(this.cO=a,KL(this))}get Zd(){return this.lt}set Zd(a){this.lt!=a&&(this.lt=a,KL(this))}get ou(){return this.lO}set ou(a){this.lO!=a&&(this.lO=a,KL(this))}get Kf(){return this.io}set Kf(a){this.io!=a&&(this.io=a,KL(this))}get qf(){return this.fo}set qf(a){this.fo!=a&&(this.fo=a,KL(this))}get Tg(){return this.ze}set Tg(a){this.ze!=a&&(this.ze=a,KL(this))}get jp(){return this.mO}set jp(a){this.mO!= +a&&(this.mO=a,KL(this))}}var OL="bySlides";function PL(a){return("presentationNavigationType"!=a.$o()||"presentationSeeking"==a.AQ())&&"quizNavigationSettings"!=a.$o()&&"scenarioNavigationSettings"!=a.$o()} +class QL extends wg{constructor(a,b){super();this.B=a;this.ze=b}Cc(){return this.B.Z().Cc()}isNextAvailable(){const a=this.B.gf(this.ze==OL?"switchToNextSlide":"switchToNextStep");return!(a&&PL(a))}isPrevAvailable(){const a=this.B.gf(this.ze?"switchToPreviousSlide":"switchToPreviousStep");return!(a&&PL(a))}prev(){this.ze==OL?this.B.ni():"bySteps"==this.ze&&this.B.Ot()}next(){this.ze==OL?this.B.lf():"bySteps"==this.ze&&this.B.Lo()}};class RL extends wg{constructor(a,b,c){super();this.B=a;this.lg=b;this.SE=c;z(this,this.lg.Cc(),()=>{this.B.invalidate()})}isNextAvailable(){return this.SE?this.lg.isNextAvailable():this.B.isNextAvailable()||this.lg.isNextAvailable()}isPrevAvailable(){return this.SE?this.lg.isPrevAvailable():this.B.isPrevAvailable()||this.lg.isPrevAvailable()}prev(){this.SE?this.lg.prev():this.B.isPrevAvailable()?this.B.prev():this.lg.prev()}next(){this.SE?this.lg.next():this.B.isNextAvailable()?this.B.next():this.lg.next()}} +;function SL(a,b,c){const d=a.od().type();var e=b.settings().navigation().navigationType();c=c.$();if(e=TL(d,e,c)){c={};b=b.slides();a=a.od().Jd();if(a=null!=a?`${b.ja(a).Ci()+1}`:"")b=c,"precedingQuizFailed precedingQuizNotPassed precedingQuizNotCompleted precedingScenarioNotPassed precedingScenarioFailed precedingScenarioNotCompleted".split(" ").includes(d)&&(b.SLIDE_INDEX=a);return{yg:e,z0:c}}return null} +function TL(a,b,c){switch(a){case "currentSlideIsNotCompleted":return"PB_CURRENT_SLIDE_IS_NOT_COMPLETED";case "backwardNavigationIsRestricted":case "forwardNavigationIsRestricted":return"sequential"==b?"PB_NAVIGATION_IS_SEQUENTIAL":"PB_NAVIGATION_IS_RESTRICTED";case "interactionNotCompleted":return c instanceof Aq?"PB_SCENARIO_SLIDE_WINDOW_TEXT":c instanceof sq?"PB_INTERACTION_SLIDE_WINDOW_TEXT":"PB_QUIZ_SLIDE_WINDOW_TEXT";case "precedingQuizFailed":return"PB_PRECEDING_QUIZ_FAILED_WINDOW_TEXT";case "precedingQuizNotPassed":return"PB_PRECEDING_QUIZ_NOT_PASSED_WINDOW_TEXT"; +case "precedingQuizNotCompleted":return"PB_PRECEDING_QUIZ_NOT_COMPLETED_WINDOW_TEXT";case "precedingScenarioNotPassed":return"PB_PRECEDING_SCENARIO_NOT_PASSED_WINDOW_TEXT";case "precedingScenarioFailed":return"PB_PRECEDING_SCENARIO_FAILED_WINDOW_TEXT";case "precedingScenarioNotCompleted":return"PB_PRECEDING_SCENARIO_NOT_COMPLETED_WINDOW_TEXT";default:return""}};function UL(a){const b=a.B;z(a,a.D.Tx(),a.Mn,a);z(a,a.R.Xd().Dx(),a.Ln,a);z(a,b.Bc(),a.ke,a);z(a,b.sJ,a.I2,a);z(a,b.Dr,a.kJ,a);Qe(a,a.D.vx(),a.I5,a);z(a,a.dA.XT,()=>{VL(a,a.B.ni.bind(a.B,!1))});z(a,a.dA.VT,()=>{VL(a,a.B.lf.bind(a.B,!1))})}function VL(a,b){const c=WL(a);c&&a.pf("busy","true");b();c&&setTimeout(()=>a.pf("busy","false"),200)}function WL(a){return a.BG?"slide"==a.BG.B$&&"slide"==a.BG.$aa:!1} +class XL extends P{constructor({G:a,ic:b,messages:c,skinSettings:d}){super({G:a});this.D=b;this.Wa=d;this.I=new EG(c);this.F=b.Ba();this.R=b.view();this.B=this.R.W();this.tc=this.R.Xd();this.Ca=this.B.Z();this.Wm=this.R.Wm;this.lg=B(this,new QL(this.tc,OL));this.ez=B(this,new CL({W:this.B,Pm:this.R.Pm()}));this.dA=new JL({W:this.tc,vba:this.F.settings().Pc(),ia:this.I});a=this.F.nd();this.kh=a.xm().count()||a.Lf().count()?new IL({nd:a,W:this.B,ia:this.I}):null;a=new P({Yb:"SECTION",G:"ppt-accessible-footer"}); +a.nf("region");a.fp(this.I.ha("PB_ACCESSIBLE_ARIA_LABEL_BOTTOM_PANEL"));this.xj=a;this.BG=null;bv(this.Wm,this.displayObject());UL(this);this.Zb(this.F.slideWidth());-1==this.B.ma()&&this.J(!1);x(this,window,"resize",this.PZ,this);this.PZ()}Mn(a){var b=a.action(),c=this.F.settings().Pc().eu();"resumePlayback"==b&&"prompt"==c&&(a.fu("delayStartup"),b=a.Fw,c=this.I.ha("PB_RESUME_PRESENTATION_WINDOW_TEXT"),confirm(c)?b.resume(a.L(),!0):b.start(this.B.Gf(),!0))}I5(){this.J(!0);BL(this.ez,{N1:!1})}ke(){if(this.Ec()instanceof +sq){var a=this.B.fb(),b=this.Ec(),c=a,d=c.setExternalNavigationController;a=new RL(a.playerController(),this.lg,2==b.Bn);d.call(c,a)}this.dA.J(this.TE()||this.Hz())}I2(a,b){this.Ec()instanceof br?this.B.Oa().skin().bottomPanel().setExternalParent(null):this.Ec()instanceof sq?this.B.fb().setExternalParentForAccessibleNavigationControls(null):this.Hz()&&this.B.ob().setExternalParentForAccessibleBottomPanel(null);this.BG={B$:a,$aa:b}}kJ(){if(this.Ec()instanceof br){var a=this.xj;this.B.Oa().skin().bottomPanel().setExternalParent(a? +a.displayObject():null)}else this.Ec()instanceof sq?(a=this.xj,this.B.fb().setExternalParentForAccessibleNavigationControls(a?a.displayObject():null)):this.Hz()&&(a=this.xj,this.B.ob().setExternalParentForAccessibleBottomPanel(a?a.displayObject():null));BL(this.ez,{N1:WL(this)})}Ec(){return-1!=this.B.ma()?this.B.$():null}TE(){return this.Ec()instanceof Am}Hz(){return this.Ec()instanceof Aq}Ln(a){(a=SL(a,this.F,this.B))&&this.$n(a)}$n({yg:a,z0:b}){const c=this.B.Z().suspended();Vs(this.Ca,!0);alert(this.I.ha(a, +b));Vs(this.Ca,c)}PZ(){L(this,"min-height",`${window.innerHeight}px`)}};class YL extends XL{constructor({ic:a,messages:b,skinSettings:c}){super({G:"accessible-null-skin",ic:a,messages:b,skinSettings:c});(a=this.kh)&&N(this,a);this.V(this.R.displayObject());(a=this.dA)&&N(this.xj,a);(a=this.xj)&&N(this,a);this.ez.kh=this.kh}};class ZL extends P{constructor(){super({G:"launch-screen"});const a=new P({G:"launch-screen-button"});Ii||z(this,a.ka,()=>this.ka.C());const b=new P({ga:O(a,"play-icon")}),c=new P({ga:O(a,"icon")});a.V(b);a.V(c);this.V(a)}};function $L(a){return a.Fc?new P({za:a.Fc.element,ga:O(a,`${a.Fc.Ie}-icon`)}):null}function aM(a){if(a.qg){const b=new P({Yb:"SPAN",ga:O(a,"button-text")});b.la(a.qg);return b}return null} +class bM extends P{constructor({icon:a,type:b,size:c="medium",text:d,prefix:e}){super({G:`${e?e:""}${b}`,Yb:"BUTTON"});this.Rn=!1;this.qg=d||null;this.Fc=a||null;this.ms=$L(this);(this.Cq=aM(this))&&N(this,this.Cq,this.Fc?"right"===this.Fc.Ie?0:1:0);this.ms&&N(this,this.ms,this.Fc?"right"===this.Fc.Ie?1:0:0);this.B3=E(this);this.fa("size",c);this.ny()}pressed(){return this.Rn}Ac(a){this.Rn=a;this.pf("pressed",a);this.fa("withTooltip",!this.Rn)}la(a){(this.qg=a)?this.Cq?this.Cq.la(a):(this.Cq=aM(this), +N(this,this.Cq,this.Fc?"right"===this.Fc.Ie?0:1:0)):(Se(this,this.Cq),this.Cq=null)}Tm(a){this.ms&&Se(this,this.ms);this.Fc={element:a,Ie:"left"};(this.ms=$L(this))&&N(this,this.ms,this.Fc?"right"===this.Fc.Ie?1:0:0)}ra(a){super.ra(a);this.B3.C(a)}};function cM(a,b){He.call(this);this.kC=a;a=Kd(this.kC)?this.kC:this.kC?this.kC.body:null;this.yaa=!!a&&Uh(a);this.t0=ve(this.kC,Lb?"DOMMouseScroll":"mousewheel",this,b)}t(cM,He); +cM.prototype.handleEvent=function(a){var b=0,c=0,d=a.oe;"mousewheel"==d.type?(a=dM(-d.wheelDelta),void 0!==d.wheelDeltaX?(b=dM(-d.wheelDeltaX),c=dM(-d.wheelDeltaY)):c=a):(a=d.detail,100a&&(a=-3),void 0!==d.axis&&d.axis===d.HORIZONTAL_AXIS?b=a:c=a);"number"===typeof this.w0&&(b=Vc(b,-this.w0,this.w0));"number"===typeof this.x0&&(c=Vc(c,-this.x0,this.x0));this.yaa&&(b=-b);b=new eM(a,d,b,c);this.dispatchEvent(b)};function dM(a){return Mb&&(Nb||Pb)&&0!=a%40?a:a/40} +cM.prototype.hf=function(){cM.Mb.hf.call(this);Ee(this.t0);this.t0=null};function eM(a,b,c,d){ie.call(this,b);this.type="mousewheel";this.detail=a;this.deltaX=c;this.deltaY=d}t(eM,ie);function fM(a){return a.Bj-a.Ki} +class gM extends P{constructor(a){super({G:a.G,rf:!0});this.cF=15;this.Bb=this.Bj=this.Ki=this.Ok=0;this.Qz=a.Je||1;this.hG=this.Ns=0;this.J7=100;this.Ze=B(this,new P({ga:O(this,"up")}));this.V(this.Ze);this.La=B(this,new P({G:"thumb"}));this.V(this.La);this.La.V(B(this,new P({ga:O(this.La,"background")})));this.fh=B(this,new P({ga:O(this,"down")}));this.V(this.fh);this.pq=this.km=null;this.Ui=E(this);this.CB=E(this);this.Ti=new jh(this.J7);x(this,this.Ti,"tick",this.QM,this);x(this,this,Km,this.Kw, +this,Om);x(this,this.Ze,Km,this.YM,this,Om);x(this,this.La,Km,this.pA,this,Om);x(this,this.fh,Km,this.CM,this,Om);x(this,document.body,Lm,this.qF,this)}If(a){this.jt(a)}Je(){return this.Qz}scale(){return this.Os}setScale(a){this.setParentScale(a)}vi(a,b,c,d=0){this.Ok=a;this.Ki=b;this.Bj=c;this.Ns=d;this.rs();this.If(this.Bb)}jt(a){a=wv(a,this.Ki,this.Bj);this.Bb!=a&&(this.Bb=a,this.Mp(),this.Ui.C())}$s(a){this.jt(this.Bb+a)}Kw(){}YM(a){a.preventDefault();this.$s(-this.Je());this.qB(this.Ze,-this.Je())}CM(a){a.preventDefault(); +this.$s(this.Je());this.qB(this.fh,this.Je())}qB(a,b){this.km=a;x(this,this.km,"mouseover",this.mA,this);x(this,this.km,"mouseout",this.lA,this);x(this,document,Lm,this.NA,this);this.Ti.stop();this.pq=function(){this.$s(this.hG)};this.hG=b;this.Ti.start()}NA(){Ne(this,this.km,"mouseover",this.mA,this);Ne(this,this.km,"mouseout",this.lA,this);Ne(this,document,Lm,this.NA,this);this.Ti.stop();this.pq=null}mA(){this.Ti.start()}lA(){this.Ti.stop()}QM(){this.pq&&this.pq()}pA(a){this.CB.C();a.preventDefault(); +x(this,document.body,Mm,this.Xl,this);this.cP(!0)}cP(a){this.La.fa("active",a)}qF(){Ne(this,document.body,Mm,this.Xl,this);this.cP(!1)}Xl(){}$a(){this.rs()}};class hM extends gM{constructor(a){super(a);this.qV=0}rs(){const a=this.height()-this.Ze.height()-this.fh.height();this.La.Kd(0==fM(this)?a:Math.max(this.cF,Math.ceil(this.Ok/(fM(this)+this.Ok)*a)));this.Mp()}Mp(){const a=this.li();0==fM(this)?this.La.Cg(a.top):this.La.Cg(a.top+Math.round((this.Bb-this.Ki)/fM(this)*a.height));this.Ze.ra(!!this.Bb);this.fh.ra(this.Bb!=this.Bj)}li(){const a=new Wf(0,0,0,0);a.top=this.Ze.height();a.height=this.height()-this.fh.height()-this.La.height()-a.top;a.left= +this.La.x();return a}GO(){return this.li()}Kw(a){var b;if(b=!a.defaultPrevented)b=this.La.displayObject().getBoundingClientRect(),b=!(a.clientY>=b.top&&a.clientY<=b.top+b.height);if(b){b=this.displayObject().getBoundingClientRect();var c=this.li(),d=0==this.Ns?this.Ok:this.Ns;a=(a.clientY-(b.top-c.top))/this.Os<=this.La.y()?-d:d;this.If(this.Bb+a)}}pA(a){super.pA(a);const b=this.La.displayObject().getBoundingClientRect();this.qV=a.clientY-Math.round(b.top);this.Xl(a)}Xl(a){const b=this.displayObject().getBoundingClientRect(), +c=this.li();this.jt((a.clientY-b.top-c.top*this.Os-this.qV)/(c.height*this.Os)*fM(this)+this.Ki)}};var iM=new ae;function jM(a){a.U3&&a.Hf(a.pZ||a.dM?.5:0)}function kM(a,b){x(a,new cM(b.displayObject(),{passive:!0}),iM,c=>{!ih(c.oe)&&c.deltaY&&(c=0{c.displayObject().scrollTop=this.Bb});x(this,c,"scroll",()=>{this.If(c.displayObject().scrollTop)},this);this.VA?kM(this,this.VA):(kM(this,this.iw),kM(this,this));d?(this.Hf(0),this.VA?(x(this,this.VA,"mouseenter",this.Xp,this),x(this,this.VA,"mouseleave",this.Vl,this)):(x(this,this.iw,"mouseover",this.Xp,this),x(this,this, +"mouseover",this.Xp,this),x(this,this.iw,"mouseout",this.Vl,this),x(this,this,"mouseout",this.Vl,this))):this.Hf(1)}vi(a,b,c,d=0){this.J(0{this.oA.C()})}scrollY(){return this.P.scrollTop}eI(){return this.oA}Nx(a){this.P.scrollTop=a}} +class pM extends wg{constructor({G:a="vertical-scrollbar",Pha:b="mobile-vertical-scrollbar",lr:c,Uha:d,FP:e,b1:f=null,Je:g=20,preventDefault:h=!0}){super();this.ua=this.sd=null;this.zZ=d||null;this.vS=e||null;this.Bj=0;if(Ii){const l=E(this);a={fadeScrollbars:!0,scrollX:!1,scrollY:!0,bounce:!1,deceleration:.006,useTransition:!1,preventDefault:h,disablePointer:!0,disableTouch:!1,disableMouse:!1,onScrollHandler:()=>{l.C()}};b=new mM(b);a.indicators={el:b.displayObject(),shrink:"scale"};this.sd=new IScroll(c.displayObject(), +a);this.fi=new nM(this.sd,l)}else this.ua=B(this,new lM({G:a,Je:g,lr:c,oaa:!0,b1:f})),this.fi=new oM(c.displayObject()),b=this.ua;z(this,this.fi.eI(),this.IX,this);this.g8=b}Tj(){return this.g8}vi(a,b){this.Bj=Math.max(0,b-a);this.sd?this.sd.setScrollHeight(b):this.ua&&this.ua.vi(a,0,Math.max(this.Bj,0));this.IX()}setParentScale(a){this.ua&&this.ua.setParentScale(a)}yx(){this.ua&&this.ua.yx()}IX(){if(this.zZ){var a=Math.min(this.fi.scrollY(),60);Ph(this.zZ,a)}this.vS&&(a=this.Bj-this.fi.scrollY(), +Ph(this.vS,Math.min(a,60)))}rd(){super.rd();this.sd&&this.sd.destroy()}};class qM extends P{constructor(){super({G:"message-box"});this.nf("alertdialog");this.ZM=E(this);this.PD=E(this);this.FF=!1}open(){this.FF=!0;this.rA();this.ZM.C(this)}close(){this.FF=!1;this.J(!1);this.PD.C(this);Ne(this,document,"keydown",this.vX,this)}J(a){super.J(a);this.Rp&&this.Rp.J(a)}Rq(){return this.PD}vX(a){const b=a.target.nodeName;"INPUT"!=b&&"TEXTAREA"!=b&&a.preventDefault()}rA(){this.J(!0);x(this,document,"keydown",this.vX,this)}};class rM extends zC{constructor(a){super(null,[0],[1],75,b=>b*b);this.u3=a}mp(){this.u3.Hf(this.coords[0])}};class sM extends qM{constructor(){super();this.rK=this.XD=void 0}rA(){Ii&&super.rA();this.XD&&this.XD.stop();this.J(!0);!Ii&&this.rK&&this.rK.focus();this.XD=new rM(this);this.XD.play()}};function tM(a){var b=a.Rp;const c=Math.floor(.5*(b.width()-a.width()));b=Math.floor(.5*(b.height()-a.height()));a.move(c,b)} +class uM extends sM{constructor({Rm:a,icon:b,buttons:c,ia:d,px:e}){super();if(this.Rp)throw Error("already modal");this.Rp=new P({G:"modal-layer"});this.I=d;this.sa=new P({ga:O(this,"content")});this.Fc=null;b&&(this.Fc=new P({za:b,ga:O(this,"icon")}),this.sa.V(this.Fc));this.Jl=new P({ga:O(this,"message-container")});this.Bv=new P({ga:O(this,"message"),tabIndex:-1});Ht(this.Bv,this.I,a,e);N(this.sa,this.Jl);this.V(this.sa);this.rK=this.Bv.displayObject();this.mY=new P({});N(this.mY,this.Bv);N(this.Jl, +this.mY);this.xd=new P({G:"message-box-buttons"});Ft(this.xd,O(this,"buttons"));N(this,this.xd);this.Pu(c);this.ua=new pM({lr:this.Jl});this.sa.V(this.ua.Tj());B(this,this.ua);this.QX=""}jA(){super.jA();this.ua.setParentScale(this.Os)}rA(){super.rA();this.ub();Gi(()=>{tM(this)},this,0)}Pu(a){const b=new P({ga:O(this.xd,"buttons")});a.forEach(({yg:c,result:d})=>{const e=new bM({type:"uikit-primary-button"});Ft(e,O(this.xd,"window-button"));Ht(e,this.I,c);N(b,e);z(this,e.ka,()=>{this.QX=d;this.close()})}); +this.xd.V(b)}$a(){var a=$h(this.sa.displayObject()),b=this.Fc?$h(this.Fc.displayObject()):null;b=this.Fc?this.Fc.width()+b.left+b.right:0;L(this.Jl,"max-width",Math.min(screen.width-b-a.right-a.left-80,480)+"px");L(this.Jl,"height","");a=this.Rp;b=$h(this.Jl.displayObject());const c=$h(this.xd.displayObject());a=.9*a.height()-b.top-b.bottom-this.xd.height()-c.top-c.bottom;b=Math.min(a,this.Bv.height());a=Vb||yi(this.Co.displayObject(),"0 0");x(this,a,"touchstart",c=>{for(let d=0;d{const g=new uM({Rm:b,icon:c,buttons:d,ia:a.I,px:e});vM(a.vg,g);g.open();z(a,g.Rq(),()=>{var h=a.vg,l=Ia(h.jH,g);0<=l&&(Sa(h.jH,l),g.FF&&g.close(),Ue(h,g),Fd(g.displayObject()),(l=g.Rp)&&Fd(l.displayObject()));h.Co.J(0{Ni&&uj?setTimeout(()=>{DM(this)},100):DM(this)})).observe(this.P);window.invalidatePlayerSize=()=> +{};window.setPlayerSize=()=>{};window.removeResizeListeners=()=>{};document.addEventListener("touchend",c=>{0==c.touches.length&&(this.UG=!1,setTimeout(()=>{DM(this,!1,!1)},100))},!0);document.addEventListener("touchstart",c=>{1==window.event.touches.length&&(this.UG=!0);1{b&&b();DM(this)};a.onorientationchange=()=>{const c=Ud();c&&Ii&&(Ni?setTimeout(()=>{c.blur();rj&&DM(this)},800):c.blur())};dj&&window.frameElement&&window.frameElement.setAttribute("scrolling", +"no")}CM.prototype.nC=function(){DM(this,!0)}; +function DM(a,b=!1,c=!0){function d(m,p){if(b||n.Ny!=m||n.lK!=p){const r=n.Ny;n.Ny=m;n.lK=p;n.pB.C(n.Ny,n.lK);r!=n.Ny&&Ni&&!n.UG&&setTimeout(()=>{e(0,0)},100)}}const e=AM;if(b||!a.UG){var f=Ni?2*a.P.clientHeight:a.P.clientHeight;if(aj||!(ij&&.7>f/screen.height||ah&&.7>window.innerHeight/f)){var g=1,h=a.P.clientWidth;c&&dj&&window.frameElement&&(h=0,g=h/window.innerWidth);var l=window.innerHeight*g,n=a;d(h,l);c&&dj&&window.frameElement&&setTimeout(()=>{h=window.frameElement.clientWidth;g=h/window.innerWidth; +l=window.innerHeight*g;d(h,l)},0)}}};function EM(a,b,c){null==a.ii&&(a.ii=new CM,a.ii.pB.addHandler(a.E6,a));a.sE=b;a.Fh=c}class FM{constructor(){this.Fh=this.sE=this.ii=null}nC(){this.ii&&this.ii.nC()}E6(a,b){this.sE&&this.sE.apply(this.Fh,[a,b])}};const GM=[{hx:Ib,G:"ie"},{hx:Ji,G:"android_default"},{hx:Mb,G:"webkit"},{hx:Hb,G:"opera"},{hx:Lb,G:"gecko"}];function HM(a){Ft(a,Ii?"mobile":"desktop");GM.find(b=>{b.hx&&Ft(a,b.G);return b.hx})};class IM{constructor(a){this.Jz=a;this.qo=!1;this.mK=void 0}suspend(){this.mK=this.Jz.LL;$B(this.Jz,!1);this.qo=!0}resume(){$B(this.Jz,this.mK);this.mK=void 0;this.qo=!1}};function JM(a,b){if(a.Nk){var c=a.qv;a=a.D.view();b=b||a.displayObject();b.appendChild(c.displayObject())}}function KM(a,b){Me(a,b,"click",a.iq,a);setTimeout(()=>{Ne(a,b,"click",a.iq,a)},500)} +class LM extends wg{constructor(a,b){super();this.D=a;this.qv=b;this.yA=E(this);this.Nk=!1;B(this,this.qv)}show(a){const b=this.qv;b.ra(!1);const c=this.D.view(),d=c.W().Z();this.Nk=!0;JM(this,a);c.setOverlayDisplayed(!0);z(this,d.Cl(),this.zF,this);b.ra(!0);z(this,b.ka,this.zF,this)}zF(){const a=this.D.view();var b=a.W().Z();this.Mr(b);this.Mr(this.qv);(Ji||yj)&&(b=Ld(this.qv.displayObject()))&&KM(this,b);Fd(this.qv.displayObject());a.setOverlayDisplayed(!1);this.Nk=!1;this.yA.C()}iq(a){a.preventDefault()}} +;class MM extends P{constructor(){super({G:"preloader"});this.aZ=0;this.ko=!1;this.J(!1)}show(){this.ko||(this.ko=!0,clearTimeout(this.pz),clearTimeout(this.fB),this.fB=Gi(this.n8,this,800))}Oc(){if(this.ko&&(this.ko=!1,clearTimeout(this.pz),clearTimeout(this.fB),this.visible())){var a=500-(this.kn()-this.aZ);0{h?(f=new ZL,f=new LM(a,f),Qe(this,f.yA,()=>{this.os();this.B.play()}),f.show()):this.os()});e?EM(e,this.Aj,this):(this.ii=new CM,z(this,this.ii.pB,this.Aj,this),Gi(this.ii.nC,this.ii));this.wn=new IM(this.B.Qt());this.Xk=E(this);this.Dk=E(this);this.un=E(this);this.os()}Hy(){const a=new MM;this.R.displayObject().appendChild(a.displayObject());return a}os(){this.LB();z(this,this.B.Z().aC(),this.LB,this)}LB(){this.B.Z().kd()? +this.xf.show():this.xf.Oc()}Aj(a,b){const c=this.F9?170:0,d=a-c,e=b-c;this.qN{this.wn.resume();this.R.setOverlayDisplayed(!1);this.Dk.C();this.un.C();"yes"==e?d.resume(c,!0):d.start(b,!0)});this.wn.suspend();this.R.setOverlayDisplayed(!0);this.Xk.C()}}Ln(a){(a=SL(a,this.F,this.B))&&this.$n(a)}$n({yg:a,z0:b}){const c=this.B.Z().suspended();this.wn.suspend(); +this.R.setOverlayDisplayed(!0);this.Xk.C();yM(this.vk,{Rm:a,icon:Z(this.K,"mb_warning_icon"),buttons:[{yg:"PB_MESSAGE_BOX_OK",result:"ok"}],px:()=>b}).then(()=>{this.wn.resume();this.R.setOverlayDisplayed(!1);this.Dk.C();this.iA(c)})}iA(a){Vs(this.Ca,a)}rd(){super.rd();it(this.R.displayObject(),"hidden",!1)}};class OM extends wg{constructor({fk:a,messages:b,gj:c}){super();this.fw=a;this.fg=b;this.ii=new FM;this.w8=rd(document,c);this.Zk=null;this.Xk=E(this);this.Dk=E(this);this.un=E(this);this.gS=E(this)}D(){return this.fw}};class PM extends P{constructor({G:a="back_to_app",label:b,vca:c}){super({G:a});b&&(a=new P({ga:O(this,"text")}),a.la(b),this.V(a));c&&this.V(c);z(this,this.ka,()=>ISPlayer.backToApp())}};class QM extends P{constructor({ia:a}){super({G:"title-panel"});this.Eu=new PM({label:a.ha("PB_BACK_TO_APP_BUTTON_LABEL")});this.V(this.Eu)}};class RM extends NM{constructor(a,b,c){super(a,b,c,!1);this.sb=new QM({ia:this.I});this.V(this.sb);ISPlayer.initWithData(vh({version:9.3}))}Aj(a,b){this.fa("landscape",a>b);super.Aj(a,b)}};function SM(a){if(Dj)return new RM(a.D(),a.K,a.fg);const b=new NM(a.D(),a.K,a.fg,a.h2,a.ii);z(a,b.Xk,()=>a.Xk.C());z(a,b.Dk,()=>a.Dk.C());z(a,b.un,()=>a.un.C());return b} +class TM extends OM{constructor({fk:a,messages:b,gj:c,Km:d,wm:e}){super({fk:a,messages:b,gj:c});this.h2=e;this.K=this.hK(d)}hK(a){return new zL(a.oQ)}$S(a){"normal"==a?this.Zk=SM(this):"accessible"==a&&(this.Zk=new YL({ic:this.fw,messages:this.fg,skinSettings:this.UJ()}));B(this,this.Zk)}UJ(){return{l1:!1,showSlideList:!1,te:!1,j1:!1,i1:!1}}};class UM{constructor({fk:a,skinSettings:b,ia:c}){this.D=a;this.Wa=b;this.I=c}fk(){return this.D}skinSettings(){return this.Wa}ia(){return this.I}};class VM{constructor(){var a=new DG,b=new CG,c=new fG;this.y$=new yG;this.wca=a;this.Raa=b;this.uP=c;this.oQ=zG;this.Saa=AG}};function WM(a){const b="SOLID"===a.type?a:null;if(!b)return a.Am();a=Po(b.color.toUpperCase());return 60Math.min(c+10,255))),opacity:.8}):qL({color:Uk(...a.map(c=>Math.max(c-10,0))),opacity:.8})};class XM{constructor({Ba:a,RQ:b,colors:c,Km:d}){this.F=a;this.pN=b;this.Nb=c;this.Xs=d;this.Qf=null;if(a=this.Nb)a.transparentPopupBackground=a.asideBackground.kc(0),a.progressBackground=a.playerText.kc(.1),c=a.playerBackground,b=a.primaryButtonBackground,b=b instanceof rL&&c instanceof rL&&b.color==c.color||c instanceof rL&&0==c.opacity?a.primaryButtonText.Am():a.primaryButtonBackground.Am(),a.progressPlayback=b,a.slideBorder=qL({color:"#000000",opacity:.06}),a.asideElementTextVisited=a.asideElementBackgroundActive.kc(.4), +a.hyperlink=a.asideElementText.kc(.6),a.itemsListOrder=a.asideElementText.kc(.6),a.popupBackground=a.asideBackground.kc(.92),a.popupBackgroundHover=a.asideElementBackgroundHover.Am(),a.popupText=a.asideElementText.Am(),a.itemsListIconFill=a.asideElementText.kc(.2),a.itemsListIconStroke=a.asideElementText.kc(.48),a.popupTextHover=a.asideElementTextHover.Am(),a.popupBorder=a.asideBackground.kc(.08),a.linkButtonTextColor=a.playerText.kc(.72),a.presenterInfoLinkBorderColor=a.asideElementText.kc(.16), +a.outlineItemBorder=a.asideElementText.kc(.1),a.searchFieldBackgroundColor=a.asideElementBackgroundActive.kc(.6),a.hoveredTabBackgroundColor=a.asideElementBackgroundHover.kc(.8),a.selectedTabBackgroundColor=a.asideElementBackgroundActive.kc(.8),a.topPanelIconContainerColor=WM(a.asideBackground),a.volumeControlBackgroundColor=a.secondaryButtonTextHover.kc(.2),a.volumeControlPlaybackColor=a.secondaryButtonTextHover.kc(.8),a.volumeControlThumbColor=a.secondaryButtonTextHover.Am(),a.moreMenuVolumeControlBackgroundColor= +a.popupText.kc(.2),a.moreMenuVolumeControlPlaybackColor=a.popupText.kc(.8),a.moreMenuVolumeControlThumbColor=a.popupText.Am(),a.moreMenuVolumeControlBackgroundColor=a.asideElementText.kc(.2),a.moreMenuVolumeControlPlaybackColor=a.asideElementText.kc(.8),a.moreMenuVolumeControlThumbColor=a.asideElementText.Am(),a.topPanelIconColor=a.asideElementText.kc(.72),a.miniSkinMenuButtonText=a.playerText.kc(.72),a.miniSkinMenuButtonBackgroundActive=a.playerText.kc(.1),a.miniSkinTopBottomPanelBorder=a.playerText.kc(.1), +a.miniSkinPresenterDelimiterColor=a.popupText.kc(.08),a.panelVideoStubColor=a.asideElementTextActive.kc(.6),a.panelVideoStubBackgroundColor=a.asideElementBackgroundActive.kc(.4),a.topBottomPanelBorderColor=a.playerText.kc(.1)}wP(a){if("normal"==a)Fd(this.Qf),this.Qf=null,a={__slide_width__:`${this.F.slideWidth()}px`,__slide_height__:`${this.F.slideHeight()}px`,__player_view_id__:this.pN,__borderRadius__:`${this.F.settings().skin().borderRadius}px`},this.Nb&&this.Nb.contentBackground&&Object.assign(a, +{__skin_background__:this.Nb.contentBackground.RI()}),this.Qf=(uj?this.Xs.Raa:Ii?this.Xs.wca:this.Xs.y$).Uq(this.Nb&&vL(this.Nb),a);else if("accessible"==a)this.hJ();else throw Error("unknown presentation view mode");}hJ(){Fd(this.Qf);this.Qf=null;this.Qf=this.Xs.uP.Uq()}};class YM extends P{constructor({G:a,title:b}){super({Yb:"DETAILS",G:a});a=new P({Yb:"SUMMARY",ga:O(this,"summary")});a.la(b);this.KG=a;N(this,this.KG);x(this,this,"toggle",this.JZ,this);this.JZ()}JZ(){const a=this.displayObject().hasAttribute("open");this.pf("expanded",a)}};class ZM extends YM{constructor(a){super({G:"ppt-accessible-slide-notes",title:a.ha("PB_TAB_NOTES_LABEL")});this.CV=new P({ga:O(this,"notes-container")});N(this,this.CV)}mR(a){this.CV.gp($G(a.g2,SG.CI))}};function $M(a){if(a){const b=new P({Yb:"P"});b.la(a);return b}return null}function aN({Haa:a="",link:b,title:c,text:d}){if(b){const e=new P({Yb:"A"});e.setAttribute("href",`${a}${b}`);e.setAttribute("title",c||b);e.la(d);return e}return null} +class bN extends YM{constructor({zg:a,ia:b}){super({G:"ppt-accessible-presenter",title:b.ha("PB_ACCESSIBLE_PRESENTER_INFO")});this.Vb=a;this.I=b;this.ZJ().forEach(c=>c&&N(this,c))}ZJ(){const a=[];var b=this.Vb.Vt();var c=this.I.ha("PB_ACCESSIBLE_SKIN_PRESENTER_PHOTO");if(b){const d=new P({Yb:"IMG"});d.setAttribute("src",b.path());d.setAttribute("alt",c);b=d}else b=null;b&&a.push(b);(b=$M(this.Vb.name()))&&a.push(b);(b=$M(this.Vb.Pt()))&&a.push(b);(b=aN({link:this.Vb.ue(),title:this.Vb.ue(),text:this.I.ha("PB_PRESENTER_WEBSITE")}))&& +a.push(b);(b=aN({Haa:"mailto:",link:this.Vb.email(),title:this.Vb.email(),text:this.I.ha("PB_PRESENTER_EMAIL")}))&&a.push(b);(b=$M(this.Vb.phone()))&&a.push(b);(b=$M(this.Vb.Oq()))&&a.push(b);return a}};const cN={image:[".jpg","jpeg",".png",".gif"],video:[".mp4"],document:[".doc",".docx",".xls",".xlsx",".pdf"]};function dN(a){let b=a.url();try{if("attachment"==a.type()){const c=b.lastIndexOf("/");b=b.substring(0,c+1)+encodeURIComponent(b.substring(c+1))}}catch(c){b=""}return b} +function eN(a){const b=a.title(),c=a.type(),d=dN(a);a=a.target();if("webLink"==c)return{type:"link",title:b,X_:null,href:d,target:a};const e=b.substring(b.lastIndexOf("."));return{type:Object.keys(cN).find(f=>cN[f].includes(e))||"file",title:b,X_:e,href:d,target:a}}function fN(a){const b=gN(a);if(!b)return null;a=new P({ga:O(a,"subtitle")});a.la(b);return a} +function hN(a){switch(a.Fr.type){case "file":return Z(a.K,"attachment-unknown");case "image":return Z(a.K,"attachment-image");case "link":return Z(a.K,"attachment-link");case "video":return Z(a.K,"attachment-video");case "document":return Z(a.K,"attachment-doc")}return null} +function gN(a){const b=a.Fr.X_;switch(a.Fr.type){case "file":return a.I.ha(a.Oj.file,{EXTENSION:b});case "document":return a.I.ha(a.Oj.document,{EXTENSION:b});case "image":return a.I.ha(a.Oj.image);case "link":return a.I.ha(a.Oj.link);case "video":return a.I.ha(a.Oj.video)}return null} +class iN extends P{constructor(a,b,c,d){super({G:"attach-item",tabIndex:0});this.K=b;this.I=c;this.Oj=d;this.Fr=eN(a);(a=this.jn())&&N(this,a);a=this.YJ();N(this,a);b=this.Ky();N(a,b);(this.JG=fN(this))&&N(a,this.JG);this.nf("row");const e=this.$J();z(this,this.ka,()=>e.click());z(this,this.I.jh,this.$i,this)}jn(){var a=hN(this);if(!a)return null;const b=new P({ga:O(this,"icon-container")});a=new P({za:a,ga:O(this,"icon")});N(b,a);return b}Ky(){const a=new P({ga:O(this,"title")});a.la(this.Fr.title); +return a}YJ(){return new P({ga:O(this,"info-container")})}$J(){const a=wd("A");a.setAttribute("title",this.Fr.href);a.setAttribute("href",this.Fr.href);a.setAttribute("target",this.Fr.target);return a}$i(a){switch(a){case this.Oj.file:case this.Oj.document:case this.Oj.image:case this.Oj.link:case this.Oj.video:(a=gN(this))&&this.JG&&this.JG.la(a)}}}function jN(a,b){b=new iN(b,a.K,a.I,a.Oj);z(a,b.ka,()=>{Gi(()=>{a.nS.C()},a,1E3)},a);return b} +function kN(a){a.ua.vi(a.Wn.height(),a.Iz.height());a.ua.yx()} +var lN=class extends P{constructor(a,b,c){super({G:"attachments-info",tabIndex:-1});this.nS=E(this);this.K=b;this.I=c;this.Oj={file:"PB_ATTACHMENT_FILE_SUBTITLE",document:"PB_ATTACHMENT_DOCUMENT_SUBTITLE",link:"PB_ATTACHMENT_LINK_SUBTITLE",video:"PB_ATTACHMENT_VIDEO_SUBTITLE",image:"PB_ATTACHMENT_IMAGE_SUBTITLE"};this.Wn=new P({ga:O(this,"scroll-area")});N(this,this.Wn);this.Iz=new P;N(this.Wn,this.Iz);b=new P({G:"container-bottom-shadow"});N(this,b);this.ua=new pM({lr:this.Wn,FP:b.displayObject()}); +B(this,this.ua);this.V(this.ua.Tj());this.aK(a);this.nf("region");this.fp("Resources")}aK(a){const b=a.count();for(let d=0;dN(this.UU,d))}aK(){return new P({Yb:"UL"})}};class pN extends oN{constructor({resources:a,ia:b}){super({G:"ppt-accessible-resources",title:b.ha("PB_ACCESSIBLE_TITLE_PANEL_ATTACHMENTS"),s0:a})}ZS(a){return a.ti().Sc().map(b=>this.bK(b))}bK(a){const b=nN(this,!1);a=this.$J(a);N(b,a);return b}$J(a){const b=new P({Yb:"A"});b.setAttribute("title",a.url());b.setAttribute("href",dN(a));b.setAttribute("target",a.target());b.la(a.title());return b}};class qN extends oN{constructor({slides:a,ia:b}){super({G:"ppt-accessible-slide-list",title:b.ha("PB_ACCESSIBLE_SLIDES"),s0:a});this.nf("navigation");this.KG.nf("heading");this.KG.setAttribute("aria-level","2");a=this.KG;a.P.id||a.gR(ld());this.pf("labelledby",a.P.id);this.nY=E(this)}ZS(a){return a.OB.map(b=>this.bK(b))}bK(a){const b=nN(this),c=a.title()?a.title():"---";b.la(`${a.index()+1}. ${c}`);z(this,b.ka,()=>{this.nY.C(a)});return b}};class rN extends P{constructor(a){super({Yb:"SECTION",G:"ppt-accessible-top-panel",tabIndex:-1});this.nf("region");this.fp(a.ha("PB_ACCESSIBLE_ARIA_LABEL_TOP_PANEL"));this.I=a;this.TY=new P({Yb:"H1",ga:O(this,"slide-status")});N(this,this.TY)}};function sN(a){a.kB&&z(a,a.kB.nY,b=>{a.tc.pe(b.index())})} +class tN extends XL{constructor({ic:a,messages:b,skinSettings:c}){super({G:"ppt-accessible-skin",ic:a,messages:b,skinSettings:c});this.oa=this.Tr();this.kB=this.Wa.showSlideList?new qN({slides:this.F.slides(),ia:this.I}):null;this.gg=this.Wa.te?new ZM(this.I):null;this.OA=this.Wa.j1&&this.F.resources().ti().count()?new pN({resources:this.F.resources(),ia:this.I}):null;this.Vb=null;this.nv()}Tr(){return this.Wa.l1?new rN(this.I):null}nv(){var a=this.dA;a&&N(this.xj,a);this.kB&&(Ib||Jb)?(a=new P({G:"ppt-accessible-slide-list-wrapper"}), +N(a,this.kB)):a=this.kB;a&&N(this.xj,a);(a=this.gg)&&N(this.xj,a);(a=this.OA)&&N(this.xj,a);(a=this.oa)&&N(this,a);(a=this.kh)&&N(this,a);this.V(this.R.displayObject());(a=this.xj)&&N(this,a);this.ez.oa=this.oa;this.ez.kh=this.kh;sN(this)}ke(){super.ke();if(this.oa)if(this.TE()){var a=-1!=this.B.ma()&&this.B.$().visible()?`${this.B.$().Ci()+1}`:"-";const c=this.F.slides().np();var b=this.oa;a=b.I.ha("PB_ACCESSIBLE_SLIDE_N_OF_COUNT",{SLIDE_NUMBER:a,TOTAL_SLIDES:c});b.TY.la(a);this.oa.J(!0)}else this.oa.J(!1); +this.Wa.te&&this.gg&&((b=(b=this.Ec())?b.pj():null)&&b.text()?(this.gg.mR(b),this.gg.J(!0)):this.gg.J(!1));this.YO()}YO(){this.Vb&&(Se(this.xj,this.Vb),this.Vb=null);const a=this.Ec().zg();this.Wa.i1&&a&&(this.Vb=new bN({zg:a,ia:this.I}),N(this.xj,this.Vb))}};function uN(a){const b=[],c=[];let d=-1;for(let f=0;fd?d+=1:e{var d=a[c];var e="SOLID"===d.type?d:null;d="GRADIENT"===d.type?d:null;if(e)d={type:"solid",value:{color:BN(e.color),alpha:e.opacity}};else if(!d||2!==d.jj.length||180!==d.ij&&90!==d.ij)d=null;else{e=d.ij;const f=d.jj[0];d=d.jj[1];d={type:"gradient",value:{firstColor:{color:BN(f.color),alpha:f.opacity},secondColor:{color:BN(d.color),alpha:d.opacity},direction:180===e?"vertical":"horizontal"}}}b[c]=d;return b},{})};function FN(a,b){var c=0-1!=b.indexOf(c))} +class LN extends wg{constructor({Ba:a,W:b,settings:c,ia:d,view:e,sidePanelController:f}){super();this.F=a;this.B=b;z(this,this.B.Bc(),this.ke,this);this.H=c;this.I=d;this.pa=e;this.Cb=f;z(this,this.pa.Le(),this.a6,this);z(this,this.pa.So(),this.Mv,this);this.xb=null}RR(a){this.Cb=a}ke(){this.xb&&(Pe(this,this.xb.showTopPanelPopupEvent(),this.nW,this),Pe(this,this.xb.showOutlineEvent(),this.mW,this),this.Mv());if(this.xb=this.B.Oa()){z(this,this.xb.showTopPanelPopupEvent(),this.nW,this);z(this,this.xb.showOutlineEvent(), +this.mW,this);var a=this.B.$(),b=this.UT(a),c=b&&this.yY()?b.logo():null;a=this.xb.skin();var d=a.setPresentationContext,e=this.Cb,f=KN(this),g=!!this.F.resources().ti().count();c=c?c.path():null;var h=b?b.ue():"";b=b?b.pD():"";var l=this.dO(),n=this.F.courseTitle(),m;m=(m=this.H.xa.Hc||null)&&m.visible&&wN(m,"outline")?!0:(m=this.H.xa.Qc||null)&&m.visible&&m.showOutline?!0:(m=this.H.xa.controlPanel||null)&&m.visible&&m.showOutline?!0:!1;d.call(a,{sidePanelController:e,buttonsOrder:f,resourcesButtonEnabled:g, +logo:c,logoUrl:h,logoTarget:b,showTitle:l,courseTitle:n,hasOutline:m})}}a6(){this.xb&&this.xb.setPanelScale(this.pa.scale())}UT(a){return(a=a.zg())&&a.Td()?a.Td():this.F.Td()}yY(){const a=this.H.xa.Hc;return a?a.visible&&a.pd:!1}dO(){const a=this.H.xa.Hc||null;return a?a.visible&&a.Sq:!1}nW(a){this.pa.m1(a)}mW(a){this.pa.YC(a)}Mv(){this.xb&&(this.xb.onTopPanelPopupClosed(),this.xb.outlinePopupClosed())}};function MN(a,b,c){return(a-2/3*c)/(b+c/3)}function NN(a){if(1>=a)return a;a=1+(a-1)/3;return Ib?yv(a,4):a};function ON(a,b){this.wc=a;this.sn=b}ON.prototype.getData=function(a){return null==this.Pd?null:this.Pd[a]};ON.prototype.setData=function(a,b){null==this.Pd&&(this.Pd={});this.Pd[a]=b};function PN(a,b){F(a.wc,"pointer-events",b)}function QN(a,b){for(const c in b)a.wc.setAttribute(c,b[c])}ON.prototype.remove=function(){var a=this.sn;const b=a.wp.indexOf(this);if(-1==b)throw Error();a.wp.splice(b,1);a.wc.removeChild(this.wc)};function RN(a){x(a,a.rh.wc,Km,a.TM,a,Nm);x(a,a.Bo,Lm,a.F6,a)} +class SN extends wg{constructor(a){super();this.rh=a;this.xD=null;this.qa=1;this.Bo=window;this.Xu=E(this);this.Wu=E(this)}setScale(a){this.qa=a}gz(a){a=Lh(a,this.rh.wc);return new Xc(a.x/this.qa,a.y/this.qa)}TM(a){this.Xu.C();a.preventDefault();a.stopPropagation();a=this.gz(a);this.xD.P0(a.x,a.y);x(this,this.Bo,Mm,this.rW,this)}rW(a){const b=this.gz(a);this.xD.dI(b.x,b.y);a.preventDefault()}F6(){Ne(this,this.Bo,Mm,this.rW,this);this.Wu.C()}};function TN(a,b,c){ON.call(this,a,b);this.wc.setAttribute("d",c)}t(TN,ON);function UN(a,b){ON.call(this,a,b);this.wp=[]}t(UN,ON);function VN(a,b){const c=document.createElementNS("http://www.w3.org/2000/svg","path");b=new TN(c,a,b);a.wc.appendChild(c);a.wp.push(b);return b}function WN(a){const b=document.createElementNS("http://www.w3.org/2000/svg","g"),c=new UN(b,a);a.wc.appendChild(b);a.wp.push(c);return c}UN.prototype.forEach=function(a){for(let b=0;b{d.wc===b&&(c=d)});return c}UN.prototype.mr=function(){this.wp=[];Cd(this.wc)};function YN(a,b,c){const d=document.createElementNS("http://www.w3.org/2000/svg","svg");d.setAttribute("width",b);d.setAttribute("height",c);d.setAttribute("version","1.1");F(d,{overflow:"hidden",position:"relative"});a.appendChild(d);UN.call(this,d,this)}t(YN,UN);function ZN(a,b){a.sn.forEach(c=>{c!==a.rh&&b(c)})}function $N(a){x(a,a.rh.wc,Km,a.UM,a,Nm);x(a,a.Bo,Lm,a.sW,a);ZN(a,b=>{PN(b,"painted");x(a,b.wc,Km,a.vF,a,Nm)})}function aO(a){Ne(a,a.rh.wc,Km,a.UM,a);Ne(a,a.Bo,Lm,a.sW,a);ZN(a,b=>{PN(b,"none");Ne(a,b.wc,Km,a.vF,a)})} +function bO(a,b){if(b&&b!==a.rh.wc&&b instanceof SVGElement&&(b=XN(a.sn,b))){var c=b.getData("drawingId");if(c){const d=[];a.sn.forEach(e=>{e.getData("drawingId")===c&&d.push(e)});for(b=0;bd?[["M",c-5,",",d-10],["L",c+5,",",d-10],["L",e+5,",",f-10],["L",e+5,",",f+10],["L",e-5,",",f+10],["L",c-5,",",d+10]]:[["M",c-5,",",d-10],["L",e-5,",",f-10],["L",e+5,",",f-10],["L",e+5,",", +f+10],["L",c+5,",",d+10],["L",c-5,",",d+10]];for(d=0;d"g"==f.nodeName);c.removeAttribute("opacity");var d=zd("div");d.appendChild(b);Fd(c);const e=d.innerHTML;Cd(b);b.appendChild(c);b={ignoreMouse:!0,ignoreAnimation:!0};canvg(a.YL,d.innerHTML,b);canvg(a.SL,e,b);if(d=a.Fi.getContext("2d"))d.clearRect(0,0,a.Fi.width,a.Fi.height),d.globalAlpha=.4,d.drawImage(a.YL,0,0),d.globalAlpha=1,d.drawImage(a.SL,0,0)} +function gO(a,b){a.aO=b;a.cA("nothing"!=b);switch(b){case "nothing":b=a.Ol;Ne(b,b.rh.wc,Km,b.TM,b);aO(a.fs);break;case "line":b=a.Ol;b.xD=a.E4;RN(b);aO(a.fs);break;case "marker":b=a.Ol;b.xD=a.K4;RN(b);aO(a.fs);break;case "eraser":b=a.Ol,Ne(b,b.rh.wc,Km,b.TM,b),$N(a.fs)}} +class hO extends P{constructor(a,b){super({G:"draw-control"});this.SL=this.YL=this.Fi=null;var c=this.Xh=new YN(this.displayObject(),a,b);const d=document.createElementNS("http://www.w3.org/2000/svg","rect"),e=new ON(d,c);QN(e,{x:0,y:0,width:a,height:b});c.wc.appendChild(d);c.wp.push(e);this.rh=e;QN(this.rh,{opacity:0});this.Ol=new SN(this.rh);this.ZL=WN(this.Xh);QN(this.ZL,{opacity:.4});this.D4=WN(this.Xh);this.E4=new dO(this.D4);this.K4=new eO(this.ZL,new Wf(0,0,a,b));this.fs=new cO({group:this.Xh, +nca:this.rh,pba:this.Xh,Vca:void 0});this.aO="nothing";if(eh||Ni)this.Fi=zd("canvas"),F(this.Fi,"position","relative"),this.Fi.width=a,this.Fi.height=b,this.YL=zd("canvas"),this.SL=zd("canvas");this.Xu=E(this,[this.Ol.Xu,this.fs.Xu]);this.Wu=E(this,[this.Ol.Wu,this.fs.Wu]);this.cA(!1)}setScale(a,b){super.setScale(a,b);this.Ol.setScale(a);this.fs.setScale(a)}cA(a){L(this,"pointer-events",a?"all":"none");if(eh||Ni){const b=null!=this.Xh.wc.parentNode;a&&!b?Gd(this.Xh.wc,this.Fi):!a&&b&&(fO(this),Gd(this.Fi, +this.Xh.wc))}}FH(){this.ZL.mr();const a=[];this.Xh.forEach(b=>{b!==this.rh&&a.push(b)});for(let b=0;b{a++});return 1==a}};class iO{constructor(a){this.Nd=a;a instanceof XB&&(this.gG=this.width()/this.height())}V(a){a=a.displayObject();(this.Nd instanceof Element?this.Nd:this.Nd.displayObject()).appendChild(a)}removeChild(a){a=a.displayObject();this.dL(a)&&this.displayObject().removeChild(a)}dL(a){return a.parentNode==this.displayObject()}displayObject(){return this.Nd instanceof Element?this.Nd:this.Nd.displayObject()}ratio(){return this.gG}width(){return this.Nd instanceof Element?this.Nd.offsetWidth:this.Nd.width()}Zb(a){const b= +Math.round(a/this.gG);this.Nd instanceof Element?Nh(this.Nd,a,b):this.Nd.resize(a,b)}height(){return this.Nd instanceof Element?this.Nd.offsetHeight:this.Nd.height()}Kd(a){const b=Math.round(a*this.gG);this.Nd instanceof Element?Nh(this.Nd,b,a):this.Nd.resize(b,a)}resize(a,b){this.Nd instanceof XB&&this.Nd.resize(a||this.Nd.width(),b||this.Nd.height())}zl(a,b){a/b>this.gG?this.resize(a,b):this.Zb(a)}};function jO(a){a.oi(a.R.displayObject())&&a.R.resize(a.width(),a.height());a.qq()}function kO(a,b){"nothing"!=b&&(a.qb||a.pL());a.Se&&a.Se.fa("tool",b);a.qb&&gO(a.qb,b)} +class lO extends P{constructor(a){super({G:"content-area"});this.qb=null;this.F=a.Ba();a=a.view();this.tc=a.Xd();this.B=a.W();z(this,this.B.Bc(),this.ke,this);this.R=new iO(a);z(this,a.Le(),this.kA,this);this.V(this.R.displayObject());B(this,this.R);this.Se=this.cK();this.Uy=[];this.qa=1;this.zN=new cd(this.R.width(),this.R.height())}setScale(a){this.qa=a;jO(this)}FH(){this.qb&&this.qb.FH()}invalidate(a,b){this.Zy=b;this.resize(a.width,a.height)}Fx(){return this.R}kA(a,b,c,d){this.xN=a/this.R.width(); +this.ew=new Xc(c,d);this.qq()}qq(){if(this.qb){this.qb.move(this.ew.x,this.ew.y);const a=this.R.width()/this.zN.width*this.xN;this.qb.setScale(a);this.qb.setParentScale(a)}}ke(){this.Se&&this.eO()}eO(){let a="nothing";this.qb&&(a=this.B.Oa()||this.B.ob()||this.B.fb()?"nothing":this.qb.aO,gO(this.qb,"nothing"));const b=this.B.ma();Cd(this.Se.displayObject());const c=d=>{-1!=d.timestamp().Aa()&&(Pe(this,d.Sb(),c,this),this.qb&&this.Se.V(this.qb),kO(this,a))};this.qb=this.Uy[b];z(this,this.B.Z().Sb(), +c,this);this.qq()}cK(){const a=new P({G:"marker-tool-container"});this.R.V(a);return a}pL(){this.qb=new hO(this.zN.width,this.zN.height);this.Se.V(this.qb);this.qb.setParentScale(this.qa);this.Uy[this.B.ma()]=this.qb;this.qq()}rd(){super.rd();this.R.removeChild(this.Se)}};function mO(a,b,c,d){eu.call(this,a,b,c,d);this.K2=new C;this.q2=new C;this.xT=new C}t(mO,eu);function nO(a,b){a.Cu=b}mO.prototype.cI=function(){this.Cu&&this.Cu.animate(this.coords);this.q2.C()};mO.prototype.K0=function(){};mO.prototype.yl=function(){this.Cu&&this.Cu.animate(this.coords);this.xT.C()};mO.prototype.Ro=function(){this.K2.C();this.Cu&&this.Cu.animate(this.coords)};function oO(a,b){const c=b.displayObject();yi(c,"0 0");a.P.V(c);a.Hq=b}function pO(a,b,c){a.jP=new cd(b,c);a.YE&&a.LE()} +class qO{constructor(a){this.w9=a||!1;this.YE=!1;this.Kk=this.Pp=this.Na=this.Ua=0;this.jP=new cd(0,0);this.Hq=null;this.Qa=!0;this.xf=new MM;this.P=new P({G:"video-container"});this.P.V(this.xf);this.P.fa("force-fit-video",Ib||Jb)}displayObject(){return this.P.displayObject()}visible(){return this.Qa}J(a){this.Qa=a;this.w9?(H(this.displayObject(),a?1:0),F(this.displayObject(),"pointer-events",a?"":"none")):Th(this.displayObject(),a)}width(){return this.Ua}height(){return this.Na}zl(a,b){this.rY(a); +this.Kk=b;this.LE();this.YE=!0}rY(a){this.Pp=a}LE(){const a=this.jP.width/this.jP.height,b=this.Pp;this.resize(Math.round(b),Math.round(this.Pp/this.Kk>a||isNaN(a)?this.Kk:b/a));this.YE=!0}resize(a,b){this.Ua=a;this.Na=b;this.Hq&&this.Hq.resize(a,b);this.P.resize(a,b);this.YE=!1}V(a){a=a.displayObject();this.displayObject().appendChild(a)}removeChild(a){a=a.displayObject();this.dL(a)&&this.displayObject().removeChild(a)}dL(a){return a.parentNode==this.displayObject()}};class rO extends P{constructor({ga:a,G:b,I1:c=!0,rf:d=!0,Ica:e=!0}){super({ga:a,G:b,rf:d});this.x9=c;this.y9=e;this.yE=this.wt=!1;this.p9=E(this)}$a(a,b){super.$a(a,b);this.yE=!0;a=this.wt;const c=this.displayObject().textContent;this.tY(c,Jb||Ib?b+1:b);this.yE=!1;a!=this.wt&&(this.x9&&this.setAttribute("title",this.wt?jt(this.P,"label"):""),this.p9.C())}tY(a,b){function c(){g=f=e)&&(this.wt=!0,this.y9)){var f=Math.floor(b/d.displayObject().scrollHeight*a.length),g="";for(c();d.displayObject().scrollHeight<=b;)f+=10,c();for(;0b;)c(),--f;c()}}}la(a){super.la(a);this.yE||(this.fp(a),this.ub())}gp(){throw Error("html text is not supported");}};function sO(a,b){const c=a instanceof It?a.za():a instanceof P?a.displayObject():a;b&&"slideNavigationSettings"==b.$o()?a instanceof P?a.fa("locked",!0):mn(c,"locked"):a instanceof P?a.fa("locked",!1):nn(c,"locked");b=b&&("presentationNavigationType"!=b.$o()||"presentationSeeking"==b.AQ())&&"quizNavigationSettings"!=b.$o()&&"scenarioNavigationSettings"!=b.$o();a instanceof It||a instanceof P?a.ra(!b):b?c.setAttribute("disabled",""):c.removeAttribute("disabled")};function tO(a){if(a.H.ou){const b=new rO({ga:O(a,"label")});Ht(b,a.I,"PB_CONTROL_PANEL_SLIDE_COUNTER",a.P3.bind(a));return b}return null}function uO(a){if(a.Lj){const b=-1!=a.B.ma()&&a.B.$().visible();a.Lj.J(b);a=a.Lj;a.wL?a.wL():Ga("bindI18nMessage is required")}} +class vO extends P{constructor({ia:a,W:b,settings:c,Ia:d,OI:e}){super({G:"navigation-controls"});this.I=a;this.K=d;this.B=b;this.H=c;this.ze=c.Tg;this.Ly=this.lg=new QL(this.B,this.ze);this.H8=e;(this.Lj=tO(this))&&N(this,this.Lj);(this.Ob=this.Iy())&&N(this,this.Ob);(this.zb=this.Ey())&&N(this,this.zb);z(this,this.B.Z().Sb(),this.wb,this);z(this,this.B.Bc(),this.On,this);z(this,this.I.jh,this.VO,this)}io(a){a&&!this.Ob&&(this.Ob=this.Iy())&&N(this,this.Ob,this.Rl("prevButton"));this.Ob&&this.Ob.J(a)}fo(a){a&& +!this.zb&&(this.zb=this.Ey())&&N(this,this.zb,this.Rl("nextButton"));this.zb&&this.zb.J(a)}$a(){var a=this.B.fb();this.io(this.H.visible&&this.H.Kf||!!a);this.fo(this.H.visible&&this.H.qf||!!a);a=this.H.visible&&this.H.ou;this.Lj?this.Lj.J(a):a&&((this.Lj=tO(this))&&N(this,this.Lj,this.Rl("slidesCounterLabel")),uO(this))}Rl(a){const b=[this.Lj,this.Ob,this.zb].filter(c=>c);switch(a){case "slidesCounterLabel":return b.indexOf(this.Lj);case "prevButton":return b.indexOf(this.Ob);case "nextButton":return b.indexOf(this.zb); +default:return-1}}Ey(){var a=this.B.fb();return this.H.qf||a?(a=new bM({type:"uikit-primary-button",icon:{element:Z(this.K,"chevron_right"),Ie:"right"},text:this.I.ha("PB_CONTROL_PANEL_NEXT")}),Ft(a,O(this,"button")),a.fa("next",!0),z(this,a.ka,this.MM,this),a):null}Iy(){var a=this.B.fb();return this.H.Kf||a?(a=new bM({type:"uikit-secondary-button",icon:{element:Z(this.K,"chevron_left"),Ie:"left"},text:this.I.ha("PB_CONTROL_PANEL_PREV")}),Ft(a,O(this,"button")),a.fa("prev",!0),z(this,a.ka,this.OM, +this),a):null}MM(){this.enabled()&&this.Ly.next()}OM(){this.enabled()&&this.Ly.prev()}On(){uO(this);const a=this.B.fb();if(a){const b=this.B.$();this.Ly=new RL(a.playerController(),this.lg,2==b.Bn);a.setExternalNavigationController(this.Ly)}else this.Ly=this.lg}wb(){if(this.Ob){var a=this.B.gf(this.ze==OL?"switchToPreviousSlide":"switchToPreviousStep");sO(this.Ob,a)}this.zb&&(a=this.B.gf(this.ze==OL?"switchToNextSlide":"switchToNextStep"),sO(this.zb,a));var b=this.B.ob();this.zb&&b&&(a=this.B.$(), +b=b.currentSession().completed(),a="atAnyTime"!=a.um,!b&&a&&this.zb.ra(!1));a=this.B.fb();(this.Ob||this.zb)&&a&&1==this.B.$().navigationType()&&(a=a.playerController(),this.Ob&&this.Ob.ra(this.Ob.enabled()||a.isPrevAvailable()),this.zb&&this.zb.ra(this.zb.enabled()||a.isNextAvailable()))}P3(){let a="-";-1!=this.B.ma()&&this.B.$().visible()&&(a=this.B.$().Ci()+1);return{SLIDE_NUMBER:a,TOTAL_SLIDES:this.H8}}VO(a){switch(a){case "PB_CONTROL_PANEL_NEXT":this.zb&&this.zb.la(this.I.ha(a));break;case "PB_CONTROL_PANEL_PREV":this.Ob&& +this.Ob.la(this.I.ha(a))}}};function wO(a){a.ua.vi(a.displayObject().offsetHeight-2*a.$Z,a.ss.height());a.ua.yx()} +class xO extends P{constructor({G:a,W:b}){super({G:a,rf:!0});this.B=b;this.$Z=0;this.Wn=new P({ga:O(this,"scroll-area")});N(this,this.Wn);this.ss=new P({G:"notes-text"});N(this.Wn,this.ss);a=new P({G:"container-bottom-shadow"});N(this,a);this.ua=new pM({lr:this.Wn,FP:a.displayObject()});B(this,this.ua);this.V(this.ua.Tj());this.gg=null;this.nf("tabpanel");z(this,this.B.Bc(),this.yF,this);-1!=this.B.ma()&&this.yF();wO(this)}$a(a,b){super.$a(a,b);a=Zh(this.displayObject());a=a.top+a.bottom;this.Wn.Kd(this.height()- +a);wO(this)}yF(){var a=this.B.$().pj();this.gg!=a&&(this.gg=a,this.ss.J(!!this.gg),this.gg&&(a=this.gg.pi().replace(//g,"
    "),this.ss.gp(a)),wO(this),this.ua.fi.Nx(0),this.ua.yx())}};class yO extends P{constructor({ga:a,G:b,prompt:c}){super({ga:a,G:b,Yb:"INPUT"});c&&this.setAttribute("placeholder",c);this.SK=!1;this.MD=E(this);x(this,this,"change",()=>{this.MD.C()});this.uL=E(this);x(this,this,"input",()=>{this.uL.C()});this.J3=E(this);x(this,this,"focus",()=>{this.SK=!0;this.J3.C()});this.N2=E(this);x(this,this,"blur",()=>{this.SK=!1;this.N2.C()});x(this,this,"keydown",this.Nv,this)}focused(){return this.SK}value(){return this.displayObject().value}Px(a){a!=this.value()&&(this.displayObject().value= +a)}Nv(a){switch(a.keyCode){case 46:this.focused()&&a.stopPropagation();break;case 13:this.focused()&&this.displayObject().blur()}}};class zO extends P{constructor({selected:a}){super({G:"panel-tab-button",Yb:"BUTTON"});this.fa("chosen",a)}selected(){return this.NH("chosen")}yh(a){this.fa("chosen",a)}}function AO(a){if(a.vd&&!a.Pb||!a.vd&&a.Pb){const b=new P({ga:O(a,"panel-title")}),c=a.Pb?"PB_TAB_OUTLINE_LABEL":"PB_TAB_NOTES_LABEL";b.la(a.I.ha(c));Ht(b,a.I,c);return b}return null} +function BO(a){a.Jj=new P({G:"search-wrapper"});N(a,a.Jj);a.ng=new yO({G:"search-field",prompt:a.I.ha("PB_SEARCH_PANEL_DEFAULT_TEXT")});N(a.Jj,a.ng);const b=new P({G:"clear-button"}),c=new P({za:Z(a.K,"erase_search")});N(b,c);z(a,b.ka,a.m5,a);a.xp=b;N(a.Jj,a.xp);a.De=a.fK();N(a,a.De);z(a,a.ng.uL,a.S3,a)}function CO(a){a.Gc&&a.Gc.J(!a.Xn);a.Pk&&a.Pk.J(!a.Xn);a.De&&a.De.J(!a.Xn);a.Jj&&a.Jj.J(a.Xn);a.ng&&a.ng.J(a.Xn);a.xp&&a.xp.J(a.Xn)} +class DO extends P{constructor({ia:a,mu:b,nu:c,$j:d,Ia:e}){super({G:"outline-panel-header"});this.K=e;this.I=a;this.Xn=!1;this.ig=d;this.bA=E(this);this.VN=E(this);this.xp=this.De=this.ng=this.Jj=null;this.Pb=c;this.vd=b;(this.Gc=this.yp())&&N(this,this.Gc);(this.Pk=AO(this))&&N(this,this.Pk);this.ig.search&&this.Pb&&BO(this);z(this,this.I.jh,this.$i,this);z(this,this.ig.lb,this.OZ,this);CO(this)}tR(a){this.Pb=a}sR(a){this.vd=a}ra(a){super.ra(a);this.ng&&this.ng.ra(a)}OZ(){!this.ig.search||!this.Pb|| +this.ng||this.De||this.xp||this.Jj||BO(this);(!this.ig.search||!this.Pb)&&this.ng&&this.De&&this.xp&&this.Jj&&(Se(this.Jj,this.ng),Se(this.Jj,this.xp),Se(this,this.Jj),Se(this,this.De),this.Jj=this.xp=this.De=this.ng=null,this.Xn=!1);CO(this)}S3(){this.VN.C(this.ng.value())}fK(){const a=new P({G:"search-button"}),b=new P({za:Z(this.K,"search")});N(a,b);z(this,a.ka,this.p6,this);return a}p6(){this.Xn=!0;this.bA.C("outline");CO(this);this.ng.displayObject().focus()}m5(){this.Xn=!1;this.ng.Px("");this.ng.displayObject().blur(); +CO(this);this.VN.C("")}yp(){if(this.Pb&&this.vd){const a=new P({ga:O(this,"switcher")}),b=new zO({selected:!0});Ht(b,this.I,"PB_TAB_OUTLINE_LABEL");N(a,b);const c=new zO({selected:!1});Ht(c,this.I,"PB_TAB_NOTES_LABEL");N(a,c);z(this,this.bA,d=>{b.yh("outline"===d);c.yh("notes"===d)});z(this,b.ka,()=>{this.bA.C("outline")});z(this,c.ka,()=>{this.bA.C("notes")});return a}return null}$i(){this.ng&&this.ng.setAttribute("placeholder",this.I.ha("PB_SEARCH_PANEL_DEFAULT_TEXT"))}};class EO extends wg{constructor(){super();this.hs="";this.OK=E(this)}};class FO extends wg{constructor(a){super();this.P=a;this.oA=E(this);x(this,this.P,"scroll",()=>{this.oA.C()})}scrollY(){return this.P.scrollTop}eI(){return this.oA}Nx(a){this.P.scrollTop=a}}function GO(a,b){Se(a,a.fi);a.fi=b;B(a,a.fi);z(a,a.fi.eI(),()=>{document.body.contains(a.displayObject())&&a.F.If(a.fi.scrollY())})} +function HO(a){const b=IO(a.F);a.Dt.forEach((c,d)=>{0>b.indexOf(d)&&(a.Dt.delete(d),a.sa.removeChild(c),Se(a,c))});for(let c=0;cthis.F.Iq);this.sa.Kd(this.F.ut);this.fi.Nx(this.F.Bb);L(this.sa,"padding-top",this.F.fL+"px");HO(this)}};function IO(a){return a.rb.slice(a.jE,a.jE+a.KU)}function LO(a){a.Bb=wv(a.Bb,0,Math.max(a.ut-a.Iq,0));a.ps()} +class MO extends wg{constructor(){super();this.Ik=this.ut=this.Iq=this.Bb=0;this.rb=[];this.KU=this.jE=this.fL=0;this.MD=E(this)}invalidate(){this.ps()}sQ(){return this.Ik}If(a){void 0!==this.Iq&&this.Bb!=a&&(this.Bb=a,LO(this))}ps(){this.jE=Math.floor(Math.max(0,this.Bb-(Ii?this.Iq:0))/this.Ik);this.fL=this.Ik*this.jE;this.KU=Math.ceil((Math.min(this.ut,this.Bb+this.Iq+(Ii?this.Iq:0))-this.fL)/this.Ik);this.MD.C()}};class NO extends P{constructor(a){super({G:"slide-item-view",xI:!0});this.s4=a}item(){return this.s4}};function OO(a){a.ru()?a=Promise.resolve(a.ru()):(a.id(),a=Promise.resolve(null));return a};function PO(a,b){const c=Math.round(a.width());let d=b.toLocaleLowerCase().indexOf(a.Fh),e=d+a.Fh.length;const f=(g,h)=>`${0{const g=f(d-1,e+1).split(" ");for(let h=0;2>h;++h){let l=c;for(;l&&g.length;){const n=7*g[0].length+4;n<=l?(l-=n,g.shift()):l=0}}return!g.length};f(d,e)!=b&&a();)--d,++e;return{oca:d,Q$:e}} +class QO extends rO{constructor({ga:a,G:b,I1:c}){super({ga:a,G:b,I1:c});this.Fh="";this.BA=0}la(a){if(this.Fh){const b=a.slice(0,this.BA)+a.slice(this.BA).replace(new RegExp(`(${this.Fh})`,"gi"),"$1");this.displayObject().innerHTML=b}else super.la(a);this.yE||(this.fp(a),this.ub())}tY(a,b){if(b){this.wt=!1;var c=this;c.la(a);var d=a.substr(0,this.BA);a=a.substr(this.BA);if(void 0!==b&&this.displayObject().parentNode&&(c.displayObject().style.height="",!(b>=c.displayObject().scrollHeight))){var {oca:e, +Q$:f}=PO(this,a),g=()=>{c.la(`${d}${0{var h=this.Pa,l=!this.Zp.pressed();h.Wy!=l&&(h.Wy=l,h.fE.C())});z(this,this.Pa.fE,this.CU,this);this.CU();this.Zp.J(a.tE&&!g.hs);a.jo&& +(this.Df=new P({ga:O(this,"thumb"),Yb:"IMG"}),WO(this,this.Df),this.Df.J(!1),OO(a.slide()).then(h=>{if(h){const l=An({width:h.width(),height:h.height(),boundingWidth:d,boundingHeight:e,TB:!1});this.Df.resize(l.width,l.height);this.Df.setAttribute("src",h.url().replace(/\\/g,"/"));this.Df.J(!0);this.fa("with-thumbnail",!0)}}));this.me=this.Ky(a);b=WO(this,this.me,"title-container");this.js=new QO({ga:O(this,"title")});this.js.fa("minimized",!a.jo);N(b,this.js);z(this,this.Pa.GS,this.EV,this);this.EV(); +z(this,this.Pa.IS,this.FV,this);this.FV();z(this,g.OK,()=>{this.Zp.J(a.tE&&!g.hs);XO(this);YO(this)});z(this,this.I.jh,this.$i,this);YO(this);XO(this);this.ra(a.enabled());qt(()=>{this.me.visible()?this.me.ub():this.js.ub()})}FV(){this.fa("viewed",this.Pa.hH)}EV(){this.yh(this.Pa.selected())}CU(){this.Zp.Ac(this.Pa.Cm())}Ky(a){const b=new rO({ga:O(this,"title"),Ica:!1});b.fa("minimized",!a.jo);b.la(this.Pd.prefix()+a.title());b.fp(a.title());return b}FJ(a,b,c,d){let e=null,f=null;b.some(g=>{if(0> +g.toLocaleLowerCase().indexOf(a))return!1;e=g;f=`${this.I.ha(d)}
    `+c;return!0});return e&&f?{text:e,Zaa:f}:null}BL(){if(this.sh)if(this.sh.fa("answered",!1),this.mg.submitted()){if(this.Hj.wK||this.Hj.HU){var a=this.mg.review();a=a?a.status():"answered";this.sh.fa("status",a)}}else"allAtOnce"==this.Hj.submitType()&&(a=this.mg.hasBeenVisited()&&(this.mg.submitted()||this.mg.initiated()),this.sh.fa("answered",a));this.yn&&this.yn.fa("with-status",this.mg.submitted())}m4(){this.mg&& +this.yn&&this.yn.J(this.mg.isMarked())}$a(a,b){super.$a(a,b);if(this.sh)if(a=this.sh.P.getBoundingClientRect().width/this.sh.width(),b=this.P.getBoundingClientRect(),this.Df){var c=this.Df.P.getBoundingClientRect(),d=(c.bottom-b.top)/a;this.sh.move((c.left-b.left)/a-this.sh.width()/2,d-this.sh.height()+2)}else{c=this.me.P.getBoundingClientRect();d=(c.top-b.top)/a;const e=c.height/a;this.sh.move((c.left-b.left)/a-this.sh.width()-7,d+(e-this.sh.height())/2)}this.yn&&this.mg&&this.yn.fa("with-status", +this.mg.submitted())}$i(a){"PB_SEARCH_RESULT_IN_TEXT_LABEL"!==a&&"PB_SEARCH_RESULT_IN_NOTES"!==a||YO(this)}};class $O{constructor(){this.L=-1;this.Po=this.text=this.title=0}}var aP={value:1E4,name:"title"},bP={value:100,name:"text"},cP={value:1,name:"notes"};function dP(a){const b=[];for(let c=0;c({id:e.id,slide:e.slide,location:e.location}))} +class gP{a3(a,b){function c(d,e){return d.L>e.L?-1:d.Lb.title?1:a.titleb.text?1:a.textb.Po?1:a.Po{a.enabled()&&!e.defaultPrevented&&(d=b.JC(),void 0!==d?a.Og.slidePoolState().activeSlideIndex()!=d&&a.Og.slidePoolState().setActiveSlideIndex(d):(a.B.pe(b.slide().index()),a.Az()))});return c}function iP(a,b){return Oa(a.Li,c=>c.slide().index()==b)} +function jP(a,b,c,d){if(!(0>c||c>=a.Li.length)){b=b||a.Li[c];var e=kP(a,b.vu());if(e){e.yh(d);if(d)for(e=Number.MAX_VALUE;0<=c;--c){const f=a.Li[c];f.Iva)){a*=b.Ik;var c=a+b.Ik;a>=b.Bb&&c<=b.Bb+b.Iq||(b.Bb=a{0==d.Zc()&&(d=oP(a,b,e,c+"."),a.MJ.push(d),++c)});a.uB.clear();u(a.Li,d=>{a.uB.set(d.vu(),d.state())});u(a.MJ,()=>{})}function pP(a,b){a.Li=[];a.MJ=[];nP(a,b);a.Li.sort((c,d)=>c.id()-d.id());a.Az();a.ps()}function kP(a,b){return a.uB.has(b)?a.uB.get(b):null} +function oP(a,b,c,d,e=!1){var f=[];const g=b[c];for(var h=c+1;hb)return b;a=a.M.ja(b);return a.visible()?a.Ci():-1} +class rP extends KO{constructor(a,b,c,d,e,f){const g=a.Qo,h=a.Mo,l=a.lp,n=a.locked,m=a.lj,p=a.sQ,r=a.Daa,v=a.Caa,y=a.LR,D=a.KR,I=new MO;a=new P;super({rf:!0,G:"treecontrol",Ba:I,u$:a});B(this,I);N(this,a);this.Tf=n;this.fa("locked",this.Tf);this.M=b;this.B=c;this.zk=d;this.Og=this.xb=null;this.Bs=m;this.jo=l;this.Kp=h;this.WG=!1;this.hO=g;this.I=e;this.K=f;this.Ik=p;this.u4=r;this.t4=v;this.a9=y;this.Z8=D;this.uB=new Map;this.qO=new Map;this.Li=[];this.MJ=[];this.gi=0;this.pG=null;z(this,this.zk.OK, +this.ps,this);this.GE();z(this,c.Bc(),this.HQ,this);z(this,b.UY,this.D6,this);this.fa("highlight-viewed",this.Kp);b=new P({G:"container-bottom-shadow"});N(this,b);this.ua=new pM({lr:a,FP:b.displayObject()});B(this,this.ua);this.V(this.ua.Tj());(b=this.ua.fi)&&GO(this,b);Et(a,{height:"inherit"})}ri(){return 0==this.F.ut}D6(a){if(a=iP(this,a))a=a.state(),1!=a.hH&&(a.hH=!0,a.IS.C())}reset(){}ps(){const a=[];if(this.zk.hs){var b=fP(this.M,this.zk.hs);for(var c of b)b=c.slide.index(),b=iP(this,b),b.state().jZ= +c.location,a.push(b)}else{c=Number.MAX_VALUE;for(b of this.Li){const d=kP(this,b.vu());b.Iv<=c&&d&&(a.push(b),c=d.Cm()?Number.MAX_VALUE:b.Iv)}}c=this.F;if(b=this.jo?this.u4:this.Ik)c.Ik=b;c.rb=a;c.ut=c.Ik*a.length;c.ps();this.KE()}lv(a){pP(this,a)}GE(){const a=this.Og&&"completed"!=this.Og.sessionMode()&&this.Og.slidePoolState().slides(),b=qP(this),c=[];for(let e=0;e{const n=h.slide().description().text(),m=this.xb.skinSettings().questionListInfo().displayQuestionStatus(),p="free"==this.xb.navigationType(),r=this.Og.settings().submitType(),v="reviewing"==this.Og.sessionMode();c.push(new SO(n,g+1,f,l,p,new RO(h,m,r,v)))})}}this.lv(c);this.Az()}HQ(){Ue(this,this.xb);(this.xb=this.B.Oa())&&z(this,this.xb.currentSessionChangedEvent(),this.lW,this);this.lW(); +this.Az()}jA(){super.jA();this.ua.setParentScale(this.Os)}lW(){const a=this.Og,b=this.B.Oa();this.Og=this.B.$().visible()&&b&&b.skinSettings().questionListInfo().showSlideList()?b.currentSession()&&b.currentSession().started()?b.currentSession():null:null;a!=this.Og&&(a&&Ue(this,a,a.slidePoolState()),this.GE(),this.Og&&(z(this,this.Og.slidePoolState().activeSlideChangedEvent(),this.Az,this),z(this,this.Og.sessionModeChangedEvent(),this.GE,this)))}Az(){const a=qP(this);if(this.Og&&"completed"!=this.Og.sessionMode()){const b= +this.Og.slidePoolState().activeSlideIndex()+1;mP(this,this.Li[a+b],a+b)}else mP(this,this.Li[a],a)}$a(a,b){super.$a(a,b);this.KE();lP(this)}KE(){const a=this.height();this.ua&&a&&this.ua.vi(a,this.F.ut)}};function sP(a){return a.H.search?(a=new P({G:"search-result"}),a.J(!1),a):null}function tP(a){if(a.Tk&&a.Tk.visible()){const b=a.vo.ri();a.Tk.la(a.I.ha(b?"PB_SEARCH_NO_RESULTS_LABEL":"PB_SEARCH_RESULTS_LABEL"));a.Tk.fa("no-results",b)}} +class uP extends P{constructor(a,b,c,d,e){super({G:"outline",rf:!0});this.nf("tabpanel");this.M=a;this.B=b;this.H=c;this.I=d;this.K=e;(this.Tk=sP(this))&&N(this,this.Tk);this.zk=new EO;this.vo=new rP({locked:this.H.locked,lj:this.H.lj,Qo:this.H.Qo,lp:this.H.lp,Mo:this.H.Mo,sQ:60,Daa:76,Caa:20,KR:56,LR:120},a,b,this.zk,this.I,this.K);N(this,this.vo);z(this,this.B.Bc(),this.yF,this);z(this,this.H.lb,this.T5,this);z(this,this.I.jh,this.$i,this)}invalidate(){Ga("deprecated");this.ub()}T5(){this.H.search&& +!this.Tk&&(this.Tk=sP(this))&&N(this,this.Tk,0);var a=this.vo,b=this.H.lp,c=this.H.Qo,d=this.H.Mo,e=this.H.lj;if(b!==a.jo||c!==a.hO||e!==a.Bs)a.jo=b,a.hO=c,a.Bs=e,a.qO.clear(),a.GE();a.Kp!==d&&(a.Kp=d,a.fa("highlight-viewed",a.Kp))}yF(){for(let f=0;fc.KA===b?(Se(a,c),!1):!0)}function FP(a,b,c,d){GP(a,b,c,d);c.Hf(0);c.O0();a.Ab.V(c);a.Zg=c;a.vY="top"===d.Om;a.jX.C()}function HP(a,b,c,d={Om:"top",align:"center"}){CP(a);b&&(b=a.YF.find(e=>e.KA===c))&&FP(a,c,b,d)} +function EP(a){if(a.qh){var b=150;1==a.qh.Rc&&(b*=a.LK.progress,a.qh.stop(!1),a.qh.Xc());var c=Sh(a.Zg.displayObject());"number"!==typeof c&&(c=1);var d=Dh(a.Zg.displayObject(),"top");d=Number(d.substr(0,d.length-2));a.qh=new zP;var e=new BC(a.Zg.displayObject(),c,0,b);a.qh.add(e);c=[a.Zv.x,d];d=[a.Zv.x,a.Zv.y+(a.vY?10:-10)];b=new AC(a.Zg.displayObject(),c,d,b);a.qh.add(b);a.qh.play();var f=a.Zg,g=()=>{e.hD("finish",g,!1,a);e.hD("stop",g,!1,a);a.Ab.removeChild(f)};e.wl("finish",g,!1,a);e.wl("stop", +g,!1,a);a.Zg=void 0;a.QS.C()}}function IP(a,b){!a.Zg||Md(a.Zg.displayObject(),b)||Md(a.Zg.KA,b)||CP(a)} +function GP(a,b,c,d){Gi(()=>{c.dR(1,a.Kk);var e="top"===d.Om?a.cJ:a.tJ,f=JP(a,b,c,d.align);const g=b.getBoundingClientRect(),h=a.Ab.displayObject().getBoundingClientRect(),{x:l,y:n}=KP(a,new Xc(f,(g.top-h.top)/e),c,{relativeElement:b,Om:d.Om||"top",eba:0});a.Zv=new Xc(l,n);e=c.displayObject();f=d.Om||"bottom";a.qh&&(a.qh.stop(!1),a.qh.Xc());a.qh=new zP;a.LK=new BC(e,0,1,150);a.qh.add(a.LK);e=new AC(e,[l,n+("top"===f?10:-10)],[l,n],150);a.qh.add(e);a.qh.play()})} +function JP(a,b,c,d="center"){if(void 0!==c.Zv)c=c.Zv;else a:{b=b.getBoundingClientRect();a=a.Ab.displayObject().getBoundingClientRect();a=b.left-a.left;const e=a+b.width;b=a+b.width/2;switch(d){case "center":c=b-c.width()/2;break a;case "left":c=a;break a;case "right":c=e-c.width();break a;default:throw Error(`unknown horizontal align: ${d}`);}}return c} +function KP(a,b,c,{relativeElement:d,Om:e,eba:f}){e="top"===e;let g=b.x;b=b.y;d=d.getBoundingClientRect();const h=e?a.cJ:a.tJ,l=Ii?Math.min(1,a.Kk/c.height()):h;c.dR(l,a.Kk);yi(c.displayObject(),"0 0");b=e?b-(c.height()+(6+f)*l):b+(d.height/h+(12+f));g+=(h-l)*c.width()/2;g=Math.round(wv(g,a.QU*h,a.WX*h-c.width()*l));b=Math.round(b*h);e&&(b+=Math.round((h-l)*c.height()));return new Xc(g,b)} +class LP extends wg{constructor(a){super();this.Ab=a;this.YF=[];this.Zg=void 0;this.tJ=this.cJ=this.Kk=this.WX=this.QU=0;this.qh=null;this.vY=!0;this.LK=this.Zv=void 0;this.QS=E(this);this.jX=E(this);x(this,document,Km,this.zM,this,Nm);x(this,document,"keydown",this.Nv,this,!0);x(this,document,"focus",this.v5,this,!0)}So(){return this.QS}zl(a,b,c){this.QU=a;this.WX=b;this.Kk=c}setScale(a,b){this.tJ=a;this.cJ=b}createPopup(a,b,c){a=new AP(a);a.Lx(b);a.fa(c,!0);BP(this,a);return a}zM(a){this.Zg&&IP(this, +a.target)}Nv(a){this.Zg&&27==a.keyCode&&(a=this.Zg.KA,CP(this),a.focus())}v5(a){Ib&&a.target==document.body||this.Zg&&IP(this,a.target)}};class MP extends bM{constructor({Ia:a,nj:b}){super({type:"uikit-primary-button",icon:{element:Z(a,"outline"),Ie:"left"}});this.KX=E(this);z(this,this.ka,this.lz,this);z(this,b.So(),this.Mv,this)}lz(){this.Ac(!this.Rn);this.KX.C(this.Rn)}Mv(){this.Ac(!1)}};class NP extends bM{constructor({Ia:a,W:b,slides:c}){super({type:"uikit-primary-button",icon:{element:Z(a,"play"),Ie:"left"}});this.K=a;this.B=b;this.M=c;this.iN=!1;z(this,this.ka,this.lz,this);-1==this.B.ma()&&(this.ra(!1),Qe(this,this.B.Bc(),()=>{this.ra(!0)}));z(this,this.B.Z().Cc(),this.yz,this);z(this,this.B.Z().Sb(),this.wb,this);this.yz()}lz(){const a=this.B.Z().state();"stopped"===a||"suspended"===a?this.B.play():this.B.pause()}wb(){if(-1!=this.B.ma()){var a=this.B.$(),b=a.startTime()+a.duration(); +const c=this.M.mi(this.B.Z().timestamp());a=a.type();"interaction"!=a&&"quiz"!=a&&"scenario"!=a||c!=b?(b=this.B.gf("playPauseControl"),sO(this,b)):this.ra(!1)}}yz(){var a=this.B.Z().state();a=!("started"==a||"buffering"==a);if(this.iN!=a){const b=Z(this.K,a?"play":"pause");this.Tm(b);this.iN=!this.iN}a||sO(this,null)}};function OP(a){a.Ac(!1);HP(a.Ja,!1,a.displayObject(),a.sT)}class PP extends bM{constructor({j$:a,N$:b,nj:c,O$:d}){super({icon:a.icon,type:a.type,size:a.size,text:a.text,toggle:!0});this.Ja=c;this.z3=b;this.sT=d;this.Ja.createPopup(this.displayObject(),this.z3,"");z(this,this.ka,this.lz,this);z(this,this.Ja.So(),()=>this.Ac(!1))}lz(){this.Ac(!this.Rn);HP(this.Ja,this.Rn,this.displayObject(),this.sT)}};function QP(a,b){return b?(Ft(b,O(a,"value")),b):null}class RP extends P{constructor({id:a,icon:b,textContent:c,value:d,H_:e=!0}){super({G:"menu-base-item"});this.$b=a;(this.Fc=this.jn(b))&&N(this,this.Fc);b=new P({ga:O(this,"label")});b.la(c);this.ss=b;N(this,this.ss);(this.At=QP(this,d))&&N(this,this.At);this.fa(a,!0);this.fa("clickable",e)}get id(){return this.$b}Px(a){this.At&&Se(this,this.At);(this.At=QP(this,a))&&N(this,this.At,2)}jn(a){return new P({za:a,ga:O(this,"icon")})}} +function SP(a,b,c){a.rb.has(b)&&c(a.rb.get(b))}function TP(a,b,c){SP(a,b,d=>d.J(c))}function UP(a,b,c){SP(a,b,d=>{Se(d,d.Fc);d.Fc=d.jn(c);N(d,d.Fc,0)})}function VP(a,b,c){SP(a,b,d=>{d.ss.la(c)})}class WP extends P{constructor(){super({G:"menu-base"});this.rb=new Map;this.jV=E(this)}GC(){return this.jV}Uw({id:a,textContent:b,icon:c,value:d,H_:e}){if(!this.rb.has(a)){const f=new RP({id:a,textContent:b,icon:c,value:d,H_:e});this.rb.set(a,f);N(this,f);z(this,f.ka,()=>this.jV.C(f.id))}}};function XP(a,b){a.YA&&UP(a,a.YA,(new P).displayObject());a.YA=b;a.YA&&UP(a,a.YA,a.b9)}function YP(a,{id:b,value:c}){a.Uw({id:b,textContent:c,icon:(new P).displayObject()})}class ZP extends WP{constructor({Ia:a}){super();this.YA=null;this.b9=Z(a,"tick")}};function $P(a,b){const c=new P({ga:O(a,"caption")});Ht(c,b,a.R2);return c}function aQ(a,b,c){const d=new ZP({Ia:b});a.F7.forEach((e,f)=>{YP(d,{id:String(e),value:f})});z(a,c.jh,e=>{e==a.gT&&(e=c.ha(e),VP(d,"1",e))});return d} +class bQ extends P{constructor(a,b){super({G:"rate-menu"});this.gT="PB_RATE_MENU_DEFAULT_RATE";this.R2="PB_RATE_MENU_CAPTION";this.F7=new Map(xg.map(d=>{const e=String(d);return 1===d?[a.ha(this.gT),e]:[e,e]}));var c=$P(this,a);N(this,c);c=new P({ga:O(this,"delimiter")});N(this,c);this.oG=aQ(this,b,a);N(this,this.oG)}GC(){return this.oG.GC()}};function cQ(a,b,c){b=b instanceof P?b:new P({za:b});Ft(b,O(a,"collapsed"===c?"collapsed-component":"expanded-component"));N(a,b)}function dQ(a){a.NH("active")||a.fa("collapsed",!0)}class eQ extends P{constructor({q$:a,X$:b}){super({G:"uikit-collapsed-control"});cQ(this,a,"collapsed");cQ(this,b,"expanded");x(this,this.displayObject(),"mouseenter",()=>{this.fa("collapsed",!1)});x(this,this.displayObject(),"mouseleave",()=>dQ(this));dQ(this)}};class fQ extends P{constructor({ga:a,volume:b}){super({ga:a,HH:!0});this.setVolume(b)}setVolume(a){this.wo(a)}wo(a){L(this,"left",`${Math.round(100*a)}%`)}};var gQ=class extends P{constructor(){super({G:"volume-slider"});this.He=1;this.ql=E(this);this.An=!1;this.Sp=E(this);this.rp=new P({ga:O(this,"background")});N(this,this.rp);this.h_=new P({ga:O(this,"volume")});N(this,this.h_);this.HO=new P({ga:O(this,"track")});N(this,this.HO);this.La=new fQ({ga:O(this,"thumb"),volume:this.He});N(this.HO,this.La);this.yT=new P({ga:O(this,"enlarged-click-area")});N(this,this.yT);this.Sy=E(this);this.Ry=E(this);x(this,this.yT.displayObject(),Km,this.G6,this,Nm);this.wo()}Um(){return this.ql}Cx(){return this.Sp}setVolume(a){this.He!== +a&&(this.He=a,this.ql.C(a),this.wo())}volume(){return this.He}hu(a){this.An!==a&&(this.An=a,this.Sp.C(a),this.wo())}muted(){return this.An}G6(a){this.Sy.C();this.DM(a);x(this,document,Mm,this.DM,this);x(this,document,Lm,this.LV,this)}DM(a){a=a.clientX-this.displayObject().getBoundingClientRect().x;const b=this.HO.width();a=parseFloat(wv(wv(a,0,b)/b,0,1).toFixed(2));isNaN(a)||(this.hu(!1),this.setVolume(a))}LV(){this.Ry.C();Ne(this,document,Mm,this.DM,this);Ne(this,document,Lm,this.LV,this)}wo(){const a= +this.An?0:this.He;L(this.h_,"width",`${Math.round(100*a)}%`);this.La.setVolume(a)}};class hQ extends P{constructor(){super({G:"volume-slider-wrapper"});this.ql=E(this);this.Sp=E(this);this.Sy=E(this);this.Ry=E(this);this.wd=new gQ;df(this.wd.Um(),this.ql);df(this.wd.Cx(),this.Sp);df(this.wd.Sy,this.Sy);df(this.wd.Ry,this.Ry);N(this,this.wd)}Um(){return this.ql}Cx(){return this.Sp}setVolume(a){this.wd.setVolume(a)}volume(){return this.wd.volume()}hu(a){this.wd.hu(a)}muted(){return this.wd.muted()}} +class iQ extends P{constructor({TR:a}){super();a=this.jn(a.high);N(this,a)}Tm(a){this.Zo();a=this.jn(a);N(this,a)}jn(a){return new P({za:a})}}function jQ(a){const b=a.ZK(a.wd.volume(),a.wd.muted());a.g_.Tm(b)} +class kQ extends eQ{constructor({TR:a}){const b=new hQ,c=new iQ({TR:a});super({q$:c,X$:b});this.qP=a;this.ql=E(this);this.Sp=E(this);this.wd=b;df(this.wd.Um(),this.ql);df(this.wd.Cx(),this.Sp);this.g_=c;z(this,this.g_.ka,this.a7,this);z(this,this.wd.Sy,this.u5,this);z(this,this.wd.Ry,this.t5,this)}setVolume(a){this.wd.setVolume(a);jQ(this)}hu(a){this.wd.hu(a);jQ(this)}Um(){return this.ql}Cx(){return this.Sp}a7(){this.hu(!this.wd.muted())}u5(){this.fa("active",!0)}t5(){this.fa("active",!1)}ZK(a,b){if(0=== +a||b)return this.qP.Zj;if(0=a)return this.qP.Qaa;if(.5=a)return this.qP.high;throw Error(`incorrect volume ${a}`);}};const lQ=["volume","fullscreen"];function mQ(a){a.P.Zo();a.Xm.filter(b=>lQ.includes(b.type)).forEach(b=>a.P.V(b.Tj));nQ(a)}function oQ(a){a.P.Zo();3a.P.V(b.Tj));nQ(a)}function nQ(a){a.yS.C(new Map(a.Xm.map(b=>[b.type,a.P.oi(b.Tj)])))}function pQ(a){var b=3;--b;for(let c=0;c=b);++c)a.P.V(a.Xm[c].Tj);a.P.V(a.Dv.Tj)} +var qQ=class extends wg{constructor(a){super();this.P=a;this.Xm=[];this.Dv=null;this.yS=E(this)}get l$(){return this.yS}vP(a){"more"==a.type?this.Dv=a:this.Xm.push(a)}Dg(a){a?mQ(this):oQ(this)}};function rQ(a,b,c,d){b.includes("replay")&&a.zs.Uw({id:"replay",textContent:c.ha("PB_CONTROL_PANEL_REPLAY"),icon:Z(d,"replay")});b.includes("fullscreen")&&a.zs.Uw({id:"fullscreen",textContent:c.ha("PB_CONTROL_PANEL_FULL_SCREEN"),icon:Z(d,"fullscreen")});b.includes("volume")&&(a.wd=sQ(a),a.zs.Uw({id:"volume",textContent:c.ha("PB_CONTROL_PANEL_VOLUME_CONTROL"),icon:Z(d,"volume_high"),value:a.wd}))}function sQ(a){const b=new gQ;z(a,b.Um(),c=>a.Wb.setVolume(c));return b} +var tQ=class extends P{constructor({Baa:a,ia:b,Ia:c,soundController:d}){super({G:"more-menu-popup"});this.zs=new WP;N(this,this.zs);this.Wb=d;this.wd=null;rQ(this,a,b,c);z(this,b.jh,()=>{VP(this.zs,"volume",b.ha("PB_CONTROL_PANEL_VOLUME_CONTROL"));VP(this.zs,"replay",b.ha("PB_CONTROL_PANEL_REPLAY"))})}get Ke(){return this.zs}};const uQ=["replay","fullscreen","volume"];function vQ(a,b,c){a.QD.vP({type:c,Tj:b})} +function wQ(a){a.Sk||(a.Sk=a.eK());if(!a.gd){if(a.H.Zd&&a.Sk){var b=a.Qi.playbackRate();b=xQ(a,Z(a.K,`rate-${b}x`),a.Sk)}else b=null;a.gd=b}a.Or||(a.Or=yQ(a));a.iG||(a.H.Rx?(b=a.Oe(Z(a.K,"replay")),z(a,b.ka,a.iW,a)):b=null,a.iG=b);a.Gp||(a.Gp=a.XJ());a.Jq||(a.Jq=zQ(a));b=a.QD;b.Xm.splice(0,b.Xm.length);a.H.Zd&&a.gd&&vQ(a,a.gd,"rate");a.H.Bl&&a.Or&&vQ(a,a.Or,"cc");a.H.Rx&&a.iG&&vQ(a,a.iG,"replay");a.H.jp&&a.Gp&&vQ(a,a.Gp,"fullscreen");a.H.sr&&a.Jq&&vQ(a,a.Jq,"volume")} +function yQ(a){if(a.H.Bl){const b=a.Oe(AQ(a));z(a,b.ka,a.n5,a);z(a,a.tk.Ay,()=>{a.Or&&a.Or.Tm(AQ(a))});return b}return null}function zQ(a){if(a.H.sr){const b=new kQ({TR:{Zj:Z(a.K,"volume_mute"),Qaa:Z(a.K,"volume_middle"),high:Z(a.K,"volume_high")}});Ft(b,O(a,"collapsable-button"));z(a,b.Um(),c=>a.Wb.setVolume(c));z(a,b.Cx(),c=>a.Wb.Zj(c));return B(a,b)}return null}function AQ(a){return a.tk.$c.visible()?Z(a.K,"cc_on"):Z(a.K,"cc")} +function xQ(a,b,c,d){b=new PP({j$:{type:"uikit-secondary-button",icon:{Ie:"left",element:b}},nj:a.Ja,N$:c,O$:{Om:"top",align:d}});Ft(b,O(a,"collapsable-button"));return B(a,b)}function BQ(a){if(a.Sk){var b=a.Qi.playbackRate();XP(a.Sk.oG,String(b))}}function CQ(a){var b=a.ZK(a.Wb.volume(),a.Wb.muted());UP(a.As.Ke,"volume",b);b=a.As;a=a.Wb.volume();b.wd&&b.wd.setVolume(a)} +function DQ(a){const b=iC()?"PB_CONTROL_PANEL_EXIT_FULL_SCREEN":"PB_CONTROL_PANEL_FULL_SCREEN";VP(a.As.Ke,"fullscreen",a.I.ha(b));UP(a.As.Ke,"fullscreen",EQ(a))}function EQ(a){return iC()?Z(a.K,"exit_fullscreen"):Z(a.K,"fullscreen")}function FQ(a){z(a,a.Wb.A0(),()=>{a.Jq&&a.Jq.hu(a.Wb.muted())});z(a,a.Wb.Um(),()=>{a.Jq&&(a.Jq.setVolume(a.Wb.volume()),CQ(a))})}function GQ(a){z(a,a.Qi.Rk,()=>{BQ(a);if(a.gd){var b=a.Qi.playbackRate();b=Z(a.K,`rate-${b}x`);a.gd.Tm(b)}})} +function HQ(a){z(a,a.Hg.UK,()=>{a.Gp&&(a.Gp.Tm(EQ(a)),DQ(a))})}function IQ(a){z(a,a.I.jh,()=>{DQ(a)})} +class JQ extends P{constructor({settings:a,nj:b,soundController:c,zba:d,ia:e,Uj:f,Xw:g,Ia:h}){super({G:"collapsable-buttons-group"});this.H=a;this.Ja=b;this.Wb=c;this.r7=d;this.I=e;this.Hg=f;this.tk=g;this.K=h;this.nV=!1;this.Qi=d.Wo();this.QD=new qQ(this);this.iG=this.Gp=this.Jq=this.Or=this.gd=this.Sk=null;a=new tQ({Baa:uQ,ia:this.I,Ia:this.K,soundController:this.Wb});z(this,a.Ke.GC(),this.N5,this);this.As=a;B(this,this.As);this.Dv=xQ(this,Z(this.K,"more"),this.As,"left");vQ(this,this.Dv,"more"); +wQ(this);FQ(this);GQ(this);HQ(this);z(this,this.QD.l$,this.l5,this);IQ(this);BQ(this);CQ(this);DQ(this)}kR(a){this.nV=a;this.$a()}xt(){!this.H.Bl&&this.tk.$c.visible()&&KQ(this.tk)}$a(){this.gd&&this.gd.Rn&&OP(this.gd);this.Dv.Rn&&OP(this.Dv);this.QD.Dg(this.nV)}XJ(){if(this.H.jp&&jC()){const a=this.Oe(Z(this.K,"fullscreen"));z(this,a.ka,this.ES,this);return a}return null}n5(){this.enabled()&&this.Or&&(this.tk.$c.visible()?KQ(this.tk):this.tk.h1())}eK(){if(this.H.Zd){const a=new bQ(this.I,this.K); +z(this,a.GC(),this.PM,this);return a}return null}PM(a){this.Qi.jk(Number(a));CP(this.Ja)}N5(a){switch(a){case "replay":CP(this.Ja);this.iW();break;case "fullscreen":this.ES()}}ZK(a,b){if(0===a||b)return Z(this.K,"volume_mute");if(0=a)return Z(this.K,"volume_middle");if(.5=a)return Z(this.K,"volume_high");throw Error(`incorrect volume ${a}`);}Oe(a){a=new bM({type:"uikit-secondary-button",icon:{Ie:"left",element:a}});Ft(a,O(this,"collapsable-button"));return B(this,a)}l5(a){(new Map(uQ.map(b=> +[b,a.has(b)?!a.get(b):!1]))).forEach((b,c)=>TP(this.As.Ke,c,b))}ES(){jC()&&(iC()?hC():gC())}iW(){this.enabled()&&this.r7.YQ()}};class LQ extends AP{dR(a,b){const c=this.content();b/=a;c&&c.Kd(b);this.Kd(b);this.ub();wn(this.displayObject(),a)}};class MQ extends LQ{constructor(a,b){super(a);this.Ub=b;this.Lx(this.Ub)}O0(){var a=this.Ub.Ls;a.vo&&lP(a.vo)}};function NQ(a){if(a.Kl.showOutline){const b=new MP({Ia:a.K,nj:a.Ja});Ft(b,O(a,"outline-button"));z(a,b.KX,a.iO,a);a.Ub=new xP({mu:!1,nu:!0,$j:a.ig,Ia:a.K,ia:a.I,W:a.B,slides:a.M});a.KF=new MQ(b.displayObject(),a.Ub);a.KF.fa("outline-popup",!0);BP(a.Ja,a.KF);return b}return null}function OQ(a){return PQ(a)?new JQ({settings:a.Kl,nj:a.Ja,soundController:a.Wb,zba:a.B,ia:a.I,Uj:a.Hg,Xw:a.tk,Ia:a.K}):null}function PQ(a){return a.Kl.Rx||a.Kl.sr||a.Kl.Bl||a.Kl.Zd||a.Kl.jp} +class QQ extends P{constructor({v$:a,$j:b,nj:c,ia:d,Ia:e,W:f,slides:g,Uj:h,soundController:l,Xw:n}){super({G:"play-controls-container"});this.Kl=a;this.B=f;this.Ja=c;this.I=d;this.K=e;this.M=g;this.Hg=h;this.Wb=l;this.tk=n;this.ig=b;this.mq=this.KF=this.Ub=null;this.Mk=NQ(this);this.fc=this.Gy();this.Dh=OQ(this);this.Mk&&N(this,this.Mk);this.fc&&N(this,this.fc);this.Dh&&N(this,this.Dh)}BI(a){this.KF&&this.Ub&&this.Ub.resize(void 0,a)}ra(a){this.Dh&&this.Dh.ra(a)}kR(a){this.fc&&this.fc.J(!a);this.Dh&& +this.Dh.kR(a)}$a(){var a=this.Kl.Jf;a&&!this.fc&&(this.fc=this.Gy())&&N(this,this.fc,this.Rl("playButton"));this.fc&&this.fc.J(a);(a=this.Kl.showOutline)&&!this.Mk&&(this.Mk=NQ(this))&&N(this,this.Mk,this.Rl("outlineButton"));this.Mk&&this.Mk.J(a);PQ(this)&&!this.Dh&&(this.Dh=OQ(this))&&N(this,this.Dh,this.Rl("collapsableButtons"));this.Dh&&(a=this.Dh,wQ(a),a.$a(),a.xt(),BQ(a),CQ(a),DQ(a))}Rl(a){const b=[this.Mk,this.fc,this.Dh].filter(c=>c);switch(a){case "outlineButton":return b.indexOf(this.Mk); +case "playButton":return b.indexOf(this.fc);case "collapsableButtons":return b.indexOf(this.Dh);default:return-1}}Gy(){if(this.Kl.Jf){const a=new NP({Ia:this.K,W:this.B,slides:this.M});Ft(a,O(this,"play-pause-button"));return a}return null}iO(a){HP(this.Ja,a,this.Mk.displayObject())}};function SQ(a){let b=!1,c=!1,d=!1;for(let e=0;e=a?"":b.I.ha("PB_CONTROL_PANEL_NEXT"),b.zb.la(a))}}Dy(){var a=this.H.visible&&(this.H.qf||this.H.Kf||this.H.ou);return this.oz||a?(a=new vO({ia:this.I,W:this.B,Ia:this.K,settings:this.H,OI:this.M.np()}),Ft(a,O(this,"navigation-controls")),a):null}$a(){rR(this);sR(this)}On(){var a=this.B.fb();const b=this.B.ob();a=!!a||!!b;sR(this);this.vf&&this.vf.kR(a);this.vf&&(a=this.vf,a.mq&&DP(a.Ja,a.mq.relativeElement),a.mq=null)}};class wR extends P{constructor({Yb:a,ga:b}){super({Yb:a,ga:b});this.vK=!1;x(this,this.displayObject(),he,()=>{this.vK&&this.J(!1)})}show(){this.J(!0);this.vK=!1;requestAnimationFrame(()=>{Et(this,{opacity:1})})}Oc(){this.vK=!0;requestAnimationFrame(()=>{Et(this,{opacity:0})})}} +class xR extends P{constructor(){super({G:"progress-tooltip"});this.uv=0;this.JO=this.PG=!1;var a=new wR({Yb:"img",ga:O(this,"thumbnail-tooltip")});a.Oc();this.Hw=a;N(this,this.Hw);a=new wR({ga:O(this,"timing-tooltip")});a.Oc();this.Iw=a;N(this,this.Iw)}show(){this.PG&&this.Hw.show();this.JO&&this.Iw.show()}Oc(){this.Hw&&this.Hw.Oc();this.Iw&&this.Iw.Oc()}};function yR(a,b,c,d,e){if(2!=b.length||2!=c.length)throw Error("Start and end points must be 2D");zC.call(this,null,b,c,d,e);this.j8=a}t(yR,zC);yR.prototype.mp=function(){this.j8(this.coords[0],this.coords[1])};function zR(a){const b=d=>1-Math.pow(1-d,2),c=d=>{a.qa=d;a.Ef()};Gi(()=>{var d=6/a.height(),e=new yR(c,[d,d],[1,1],200,b);const f=new FC(a.displayObject(),200);a.rt=new zP;a.rt.add(e);a.rt.add(f);d=new yR(c,[1,1],[d,d],400,b);e=new EC(a.displayObject(),400);a.st=new zP;a.st.add(d);a.st.add(e)},a)} +class AR extends P{constructor(a){super();this.rM=0;this.qa=1;this.to=this.st=this.rt=null;(Ii||sj)&&a||this.Hf(0);sj||(zR(this),this.to=new jh(500),this.to.wl("tick",this.I6,!1,this))}offset(){return this.rM}ra(a){Ii&&!sj?a?this.show():this.Oc():sj&&this.Hf(a?1:0)}show(){this.to&&this.st&&this.rt&&(this.to.enabled?this.to.stop():(this.st.stop(),1!=Dh(this.displayObject(),"opacity")&&this.rt.play()))}Oc(){var a;if(a=this.to)a=Sh(this.displayObject()),a=0!==("number"===typeof a?a:1);a&&this.to.start()}Ef(){const a= +new gm;a.translate(this.rM,0);a.scale(this.qa,this.qa);on(this.displayObject(),a)}I6(){this.to&&this.st&&this.rt&&(this.to.stop(),this.rt.stop(),this.st.play())}};function BR(a){a=a.toString();1==a.length&&(a="0"+a);return a};class CR extends wg{constructor(a){super();this.b3=a;this.HL=!1;this.$X=E(this);this.rV=E(this);this.ZX=E(this);a.forEach(b=>{x(this,b,"mouseover",this.Xp,this);x(this,b,Mm,this.wF,this);x(this,b,"mouseout",this.Vl,this)},this)}Xp(a){this.HL||(this.HL=!0,this.$X.C(a))}wF(a){this.rV.C(a)}Vl(a){-1==Ia(this.b3,a.relatedTarget)&&(this.HL=!1,this.ZX.C(a))}};function DR(a,b){Ii||(b?(z(a,a.kG.$X,a.j6,a),z(a,a.kG.rV,a.Q5,a),z(a,a.kG.ZX,a.i6,a)):a.Mr(a.kG))}function ER(a){L(a,"cursor",a.WA?"pointer":"default")}function FR(a){return a.B.$().nb().duration()}function GR(a,b){const c=a.displayObject().getBoundingClientRect();a=Lh(b,a.displayObject());return Vc(a.x/c.width,0,1)}function HR(a,b){b=a.M.Io(b*a.M.wu(),!1,!0);a=a.M.ja(b.L());return OO(a)} +function IR(a,b){b=b.target===a.La.displayObject()?a.La.offset():b.offsetX;var c=a.width(),d=b/c;a.H.mode===ML&&JR(a,d);if(a.H.rr){d="slideTimeline"===a.H.mode?d*FR(a):d*a.M.wu();d=Math.round(d);if(3600<=d){const e=Math.floor(d/3600);d-=3600*e;d=e+":"+BR(Math.floor(d/60))+":"+BR(d%60)}else d=Math.floor(d/60)+":"+BR(d%60);a.kq.Iw.la(d)}a=a.kq;a.uv=b-a.width()/2;d=a.PG?a.Hw.width():a.Iw.width();c-=b+d/2;b-=d/2;0>c&&(a.uv-=Math.abs(c));0>b&&(a.uv+=Math.abs(b));L(a,"left",`${a.uv}px`)} +function JR(a,b){HR(a,b).then(c=>{c=c.url();a.kq.Hw.setAttribute("src",c)})} +class KR extends P{constructor({settings:a,slides:b,W:c}){super({G:"progressbar",rf:!0});this.M=b;this.B=c;this.H=a;this.Ap=0;this.WA=this.H.enabled;this.pK=null;this.AX=E(this);this.BX=E(this);this.zX=E(this);this.le=new P({ga:O(this,"progress")});this.nK=new P({ga:O(this,"progress-background")});a=new AR(this.WA);Ft(a,O(this,"thumb"));this.La=a;a=new xR;a.PG=this.H.mode===ML;a.JO=this.H.rr;Ft(a,O(this,"progress-tooltip"));this.kq=a;this.kG=new CR([this.le.displayObject(),this.nK.displayObject(), +this.La.displayObject()]);N(this,this.le);N(this,this.La);N(this,this.kq);N(this.le,this.nK);DR(this,this.H.enabled);x(this,this.le.displayObject(),Km,this.Rv,this,Nm);x(this,this.La.displayObject(),Km,this.Rv,this,Nm);z(this,this.H.lb,this.RM,this);ER(this)}Bg(a){this.width()&&(this.Ap=wv(a,0,1),this.ub())}progress(){return this.Ap}finished(){return 1===Vc(this.Ap,0,1)}$a(a,b){super.$a(a,b);a*=this.Ap;this.nK.Zb(a);b=this.La;b.rM=a;b.Ef()}RM(){const a=(this.WA=this.H.enabled)&&this.H.rr;this.kq.PG= +this.H.enabled&&this.H.mode===ML;this.kq.JO=a;this.H.enabled||wn(this.le.displayObject(),1,1);this.H.enabled?this.La.ra(!0):this.La.Oc();ER(this);DR(this,this.WA)}Rv(a){this.WA&&this.enabled()&&(x(this,document,Mm,this.wF,this),x(this,document,Lm,this.xF,this),this.Bg(GR(this,a)),this.BX.C())}wF(a){this.Bg(GR(this,a));this.AX.C()}xF(a){Ne(this,document,Mm,this.wF,this);Ne(this,document,Lm,this.xF,this);this.Bg(GR(this,a));this.zX.C();if(Ii)return yn(this.displayObject())}j6(a){clearTimeout(this.pK); +this.H.enabled&&(IR(this,a),this.kq.show());this.La.show();a=6/this.height();wn(this.le.displayObject(),1,a)}Q5(a){this.H.enabled&&IR(this,a)}i6(){clearTimeout(this.pK);this.La.Oc();this.pK=setTimeout(()=>{this.kq.Oc();wn(this.le.displayObject(),1,1)},400)}};function LR(a,b){if(-1!==a.B.ma()){var c=b&&a.Zl;a.ZN.C(!0);var d=a.wa.progress();"slideTimeline"===a.QG?(b=a.B.$(),d*=FR(a),d=b.Io(d,!1),a.B.Vj(d.L(),d.Aa(),d.ib(),c)):(d*=a.M.wu(),d=a.M.Io(d,!1,!0),(b||"slide"===a.M.ja(d.L()).type())&&a.B.Vj(d.L(),d.Aa(),d.ib(),c));if(c=a.B.gf("presentationSeeking",d.L(),d)){c=c.od().Jd();if(null==c)return;d=a.M.ja(c).nb();b=d.count()-1;d=d.pc(b).duration();a.B.Vj(c,b,d,!1)}a.ZN.C(!1)}} +function MR(a){var b=a.B.Z().timestamp();a=a.B.$().nb();b=0<=b.Aa()?a.getTime(b.Aa(),b.ib()):0;a=a.duration();return 0{LR(this,!1)},100)}RM(){this.QG=this.Ri.mode;this.Qj()}wb(){if(!this.FA&&this.wa){const a=-1===this.B.Z().timestamp().Aa()&&!!this.wa.Ap,b=this.wa.finished()&&MR(this)*FR(this)===FR(this);a||b||this.Qj()}}Qj(){if("slideTimeline"===this.QG)-1!==this.B.ma()&&this.wa.Bg(MR(this));else{var a=this.B.Z().timestamp();a=this.M.mi(a,!1,!0);this.wa.Bg(a/this.M.wu())}}zz(){var a=this.B.gf("slideTimeline"===this.QG?"slideSeeking":"presentationSeeking"); +sO(this.wa.displayObject(),a)}};class OR{constructor(a){this.Fc=a}animate(a){this.Fc.Hf(a[0]);wn(this.Fc.displayObject(),a[1])}}function PR(a){a.kb=new qO;a.kb.J(!1);yi(a.kb.displayObject(),"left top");oO(a.kb,a.D.Ar().view());const b=a.F.nd().Lf();for(let c=0;c{a.kb.removeChild(b)},a);return c} +class RR extends wg{constructor({ic:a,Ia:b,controlPanel:c,Fba:d}){super();this.D=a;this.K=b;this.pb=c;this.jm=d;this.F=this.D.Ba();this.B=this.D.view().W();this.tc=this.D.view().Xd();this.Nr=null;this.Jh=void 0;this.Xe=!1;this.Xv=null;this.iT=!1;this.Eb=void 0;this.hP=E(this);PR(this);this.jm&&z(this,this.jm.ZN,e=>{this.iT=e})}invalidate(){const a=this.VK();void 0!==a?(this.Xe=!0,pO(this.kb,a.width(),a.height())):this.Xe=!1}EW(){const a=this.tc;a.Z().Ag()?a.pause():a.play()}JV(a){if(!this.iT){var b= +this.Nr;this.Nr=a.state();a="started"==this.Nr||"buffering"==this.Nr;if("suspended"!=b&&"suspended"!=this.Nr&&"rewinding"!=this.Nr&&(!b||("started"==b||"buffering"==b)!=a)){a=!a;this.Xv&&1==this.Xv.Rc&&this.Xv.stop(!0);b=new P;a?b.V(Z(this.K,"btn_pause_big.svg")):b.V(Z(this.K,"btn_play_big.svg"));b.resize(104,76);L(b,"position","absolute");L(b,"pointer-events","none");var c=this.kb;a=(c.width()-b.width())/2;c=(c.height()-b.height())/2;b.move(a,c);this.kb.V(b);Ue(this,this.Xv);this.Xv=QR(this,b);this.Xv.play()}}}VK(){let a= +this.Jh;const b=this.F.nd().Lf();if(!a)for(let c=0;c=this.B.ma()){a=d;break}}return a}X5(a){"activated"==a.playbackState()?this.Jh!=a&&(this.Jh=a,pO(this.kb,a.width(),a.height()),this.hP.C()):"deactivated"==a.playbackState()&&(this.Jh=void 0,this.hP.C())}video(){return this.kb}};function SR(a,b,c){const d=new P({ga:O(a,"link"),Yb:"A",HH:!0,nI:!1});d.setAttribute("target","_blank");d.setAttribute("data-tooltip",c);a=new P({ga:O(a,"link-icon"),za:b});N(d,a);return d}function TR(a){const b=a.sk.displayObject().offsetHeight;a.ua.vi(b,b)}function UR(a){const b=new P({ga:O(a,"show-more")});b.la(a.I.ha(a.so.YP));z(a,b.ka,()=>VR(a));return b}function VR(a){var b=!a.Cm();a.sk.fa("collapsed",!b);a.Cm()?a.uq.la(a.I.ha(a.so.I_)):a.uq.la(a.I.ha(a.so.YP));a.CT.C();WR(a)} +function WR(a){a.Cm()?(a.ua.vi(a.sk.height(),a.JD.height()),a.ua.yx()):TR(a)} +class YR extends P{constructor(a,b,c){super({G:"presenter-info",rf:!0});this.I=a;this.so={V_:"PB_PRESENTER_EMAIL",M1:"PB_PRESENTER_WEBSITE",I_:"PB_PRESENTER_COLLAPSE_BIO",YP:"PB_PRESENTER_EXPAND_BIO"};this.tG=c;this.fa("popup",this.tG);this.Vb=null;this.Fa=new P({ga:O(this,"main")});N(this,this.Fa);this.Ss=new P({ga:O(this,"photo")});N(this.Fa,this.Ss);c=new P({ga:O(this,"info")});N(this.Fa,c);this.Th=new rO({ga:O(this,"name")});N(c,this.Th);const d=new rO({ga:O(this,"job")});$g&&L(d,"line-height", +"20px");this.KL=d;N(c,this.KL);this.Ps=new P({ga:O(this,"phone"),Yb:Ii?"A":"DIV",HH:!0,nI:!Ii});N(c,this.Ps);this.Sz=new P({ga:O(this,"links")});N(c,this.Sz);this.Pl=SR(this,Z(b,"mail-link"),this.I.ha(this.so.V_));B(this,this.Pl);this.Ft=SR(this,Z(b,"external-link"),this.I.ha(this.so.M1));B(this,this.Ft);this.sk=new P({G:"bio-container"});N(this,this.sk);b=new P({G:"scroll-area"});N(this.sk,b);this.JD=new P({ga:O(b,"bio")});N(b,this.JD);this.ua=new pM({lr:b});this.sk.V(this.ua.Tj());TR(this);this.tG|| +this.sk.fa("collapsed",!0);this.uq=UR(this);N(this,this.uq);this.J(!1);this.CT=E(this);this.b5=E(this);this.PK=!0;z(this,this.Ss.Le(),this.b5.C,this);z(this,a.jh,this.$i,this)}Cm(){return!this.sk.NH("collapsed")}UC(a){this.Vb!=a&&((this.Vb=a)?(this.J(!0),a=this.Vb.Vt(),this.fa("no-photo",!a),this.Ss.J(!!a),this.Ss.Zo(),a&&(a.mf()?this.aU(a):(a.load(),z(this,a.gr(),this.aU,this))),a=this.Vb.name(),this.Th.J(!!a),a&&this.Th.la(a),a=this.Vb.Pt(),this.KL.J(!!a),a&&this.KL.la(a),a=this.Vb.phone(),this.Ps.J(!!a), +a&&(this.Ps.la(a),this.Ps.setAttribute("href",`tel:${a}`)),(a=this.Vb.email())?(this.Pl.setAttribute("href",`mailto:${a}`),this.Pl.setAttribute("title",a),this.Sz.V(this.Pl)):this.Sz.removeChild(this.Pl),(a=this.Vb.ue())?(this.Ft.setAttribute("href",a),this.Ft.setAttribute("title",a),this.Sz.V(this.Ft)):this.Sz.removeChild(this.Ft),a=this.Vb.Oq(),this.sk.J(!!a),a&&this.JD.la(a),this.PK=!0,this.tG?this.uq.J(!1):(this.uq.J(this.sk.visible()),!this.sk.visible()&&this.Cm()&&VR(this)),this.ua.fi.Nx(0), +WR(this)):this.J(!1))}aU(a){const b=a.width(),c=a.height();L(this.Ss,"background-image",Pi(a.path()));bc.offsetHeight);this.PK=!1}WR(this)}}$i(a){switch(a){case this.so.I_:this.Cm()&&this.uq.la(this.I.ha(a));break;case this.so.YP:this.Cm()||this.uq.la(this.I.ha(a)); +break;case this.so.V_:this.Pl&&this.Pl.setAttribute("data-tooltip",this.I.ha(a));break;case this.so.M1:this.Ft&&this.Ft.setAttribute("data-tooltip",this.I.ha(a))}}};class ZR extends P{constructor(){super({G:"logo"});this.Pp=280;this.WL=this.uf=this.yb=null;E(this)}gu(a){this.yb!=a&&(this.fa("has-logo",!1),this.yb&&Ue(this,this.yb.logo(),this.yb),(this.yb=a)?(z(this,this.yb.XL,this.KB,this),this.KB()):this.FM(null))}KB(){if(this.yb){var a=this.yb.logo();a.mf()?this.FM(a):(a.load(),z(this,a.gr(),this.FM,this))}}FM(a){a?(Cd(this.displayObject()),this.uf=new P({Yb:"A"}),this.yb&&this.yb.ue()&&""!=this.yb.ue()?(this.uf.setAttribute("href",this.yb.ue()),this.uf.setAttribute("target", +"_blank"),this.uf.setAttribute("title",this.yb.ue())):(this.uf.removeAttribute("title"),this.uf.removeAttribute("href"),this.uf.removeAttribute("target")),this.WL=a.gC(),this.V(this.uf),this.uf.V(this.WL),this.fa("has-logo",!0)):this.uf&&(this.removeChild(this.uf),this.WL=null)}};function $R(a){const b=new HC({ga:O(a,"maximized")}),c=new P({za:Z(a.K,"video_maximize")});N(b,c);b.fa("at-left",a.Ta.Yd);b.Hf(0);z(a,b.ka,()=>a.GM.C());return b}function aS(a){if(a.Ta.pd){const b=new ZR;z(a,a.F.OJ,a.pY,a);z(a,b.Le(),()=>{bS(a)});a.Ff(b,0);return b}return null} +function cS(a){if(a.Ta.Wg){const b=new YR(a.I,a.K,!1);Ft(b,O(a,"presenter-info"));b.J(!1);z(a,b.CT,()=>{if(a.Mc&&a.Mc.visible())if(a.Mc.Cm()){var c=Zh(a.displayObject());c=a.height()-a.Mc.y()-c.bottom;L(a.Mc,"max-height",`${c}px`)}else L(a.Mc,"max-height","");a.ub()});return b}return null}function dS(a){return a.Ta.showOutline||a.Ta.te?new xP({nu:a.Ta.showOutline,mu:a.Ta.te,$j:a.ig,W:a.B,slides:a.F.slides(),Ia:a.K,ia:a.I}):null} +function bS(a){if(a.Xb){var b=Zh(a.displayObject());b=a.Ub?Math.max(.2*a.height(),156)+b.bottom:0;b=a.height()-b;if(!a.qd||0>=a.qd.height())var c=0;else c=$h(a.qd.displayObject()),c=a.qd.height()+c.top+c.bottom;b-=c;a.Xb.zl(a.width(),b)}}function eS(a){let b=Sh(a.Qp.displayObject());"number"!==typeof b&&(b=0);a.GT=new BC(a.Qp.displayObject(),b,0,250,c=>Math.max(0,250*c)/250);a.GT.play()} +function fS(a){a.Mc&&(a.Xb?a.oi(a.Mc)&&a.removeChild(a.Mc):a.qd?Dd(a.Mc.displayObject(),a.qd.displayObject()):a.Ff(a.Mc,0))} +function gS(a,b){a.dH&&a.dH&&a.oi(a.dH.displayObject())&&a.removeChild(a.dH.displayObject());a.Xb&&a.Xb&&(a.oi(a.Xb.displayObject())&&a.removeChild(a.Xb.displayObject()),a.Xb.removeChild(a.Qp),a.Xb.removeChild(a.mE),Ne(a,a.Xb.displayObject(),"mouseover",a.Xp,a),Ne(a,a.Xb.displayObject(),"mouseout",a.Vl,a));a.Xb=b;a.Xb&&(a.qd?Dd(a.Xb.displayObject(),a.qd.displayObject()):a.Ff(a.Xb.displayObject(),0),x(a,a.Xb.displayObject(),"mouseover",a.Xp,a),x(a,a.Xb.displayObject(),"mouseout",a.Vl,a),a.Xb.V(a.Qp), +a.Xb.V(a.mE));bS(a);fS(a);a.ub()} +class hS extends P{constructor(a,b,c,d,e,f=!0){super({G:"universal-side-panel",Yb:"ASIDE"});this.F=b;this.B=c;this.I=d;this.K=e;this.Ta=a.xa.Qc;this.ig=a.outline;this.GT=this.FT=void 0;this.qa=1;this.Xb=void 0;this.dH=null;this.IY=f;this.Qp=$R(this);B(this,this.Qp);this.mE=new P({G:"float-panel-overlay"});B(this,this.mE);(this.qd=aS(this))&&B(this,this.qd);(this.Mc=cS(this))&&B(this,this.Mc);(this.Ub=dS(this))&&N(this,this.Ub);this.GM=E(this);this.JY=E(this);z(this,this.B.Bc(),this.ke,this);z(this, +this.Ta.lb,this.t9,this);this.ke()}show(a){this.IY=a;L(this,"transition","margin 300ms ease-in-out");Gi(()=>L(this,"transition",""),this,300);this.JY.C()}showed(){return this.IY}showedStateChanged(){return this.JY}setScale(a,b){this.qa=a;super.setScale(a,b)}J(a){this.visible()!=a&&(super.J(a),a&&this.ub())}ra(a){super.ra(a);this.Ub&&this.Ub.ra(a)}t9(){this.Ta.pd?this.qd||(this.qd=aS(this),B(this,this.qd)):this.qd&&(this.removeChild(this.qd.displayObject()),Se(this,this.qd),this.qd=null);this.Ta.Wg? +this.Mc||(this.Mc=cS(this),B(this,this.Mc)):this.Mc&&(this.removeChild(this.Mc.displayObject()),Se(this,this.Mc),this.Mc=null);var a=this.Ta.showOutline,b=this.Ta.te;if(a||b)if(this.Ub){this.Ub.tR(a);this.Ub.sR(b);a=this.Ub;if(a.Pb||a.vd)if(a.Oi){a.Oi.tR(a.Pb);a.Oi.sR(a.vd);b=a.Oi;if(b.Pb&&b.vd)b.Gc||(b.Gc=b.yp(),b.Gc&&N(b,b.Gc,0)),b.Pk&&(Se(b,b.Pk),b.Pk=null);else if(b.Pb||b.vd)b.Pk||(b.Pk=AO(b),b.Pk&&N(b,b.Pk,0)),b.Gc&&(Se(b,b.Gc),b.Gc=null);b.OZ()}else a.Oi=vP(a),a.Oi&&N(a,a.Oi);else Se(a,a.Oi), +a.Oi=null;a.vd?(a.Es||wP(a),a.fa("mode","notes"),a.kF.ub()):a.Es&&(Se(a,a.Es),a.Es=null);a.Pb?(a.Ms||a.Fy(),a.fa("mode","outline")):a.Ms&&(Se(a,a.Ms),a.Ms=null)}else(this.Ub=dS(this))&&N(this,this.Ub);else Se(this,this.Ub),this.Ub=null;this.ke()}Xp(a){a.relatedTarget&&Md(this.Xb.displayObject(),a.relatedTarget)||(a=Sh(this.Qp.displayObject()),"number"!==typeof a&&(a=0),this.FT=new BC(this.Qp.displayObject(),a,1,150),this.FT.play())}Vl(a){a.relatedTarget&&Md(this.Xb.displayObject(),a.relatedTarget)|| +eS(this)}ke(){-1!=this.B.ma()&&(fS(this),this.YO(),this.pY(),this.ub())}pY(){if(this.qd&&-1!=this.B.ma()){var a=this.B.$().zg();a?(a=a.Td())&&a.logo()?this.qd.gu(a):this.ZA():this.ZA()}}ZA(){const a=this.F.Td();a&&a.logo()?this.qd.gu(a):this.qd.gu(null)}YO(){if(this.Mc&&-1!=this.B.ma()){var a=this.B.$();this.Mc.UC(a.zg())}}$a(){if(this.visible()){var a=!!this.qd&&this.qd.visible(),b=!!this.Mc&&this.Mc.visible(),c=!!this.Ub&&this.Ub.visible(),d=!!this.Xb&&!!this.oi(this.Xb.displayObject());a&&this.qd.fa("with-delimiter", +b||!b&&!d&&c);b&&this.Mc.fa("with-delimiter",c);this.Mc&&this.Mc.ub()}}rd(){super.rd();Fd(this.mE.displayObject());Fd(this.Qp.displayObject())}};function iS({pd:a,$:b,Ba:c,zg:d}){const e=d&&d.Td(),f=e&&e.logo(),g=(c=c.Td())&&c.logo();return a&&(!!b&&!!d&&!!e&&!!f||!!c&&!!g)}function jS({W:a,kp:b,Ba:c,kD:d}){let e=null;0<=a.ma()&&(e=a.$());a=e&&e.zg();c=iS({pd:b.pd,zg:a,Ba:c,$:e});return!!(b.te||b.showOutline||c||b.Wg&&e&&a||d&&d.Xe)};function kS(a,b){a.Eb=b;b=a.ug;b.Eb=a.Eb;a=b.B.Z().Cc();const c=b.kb.displayObject();Ne(b,c,Km,b.EW,b);Pe(b,a,b.JV,b);"MaximizedVideo"==b.Eb&&(x(b,c,Km,b.EW,b),b.Nr=null,z(b,a,b.JV,b))}function lS(a,b){const c=a.F.slides().ja(b).No();let d;for(let e=0;e{this.KZ()});Ft(a,O(this,"button"));L(a,"padding","9px 10px");z(this,a.ka,()=>{this.Cb.show(!this.Cb.showed())});return a}};function tS(a){return(a=a.B.Oa())?a.skin().controlPanel().displayObject():null} +class uS extends wg{constructor({W:a,B1:b,K_:c}){super();this.B=a;this.q7=this.Ru=c;this.v7=this.Wr=b;z(this,a.Bc(),this.T8,this);this.SW=E(this)}T8(){var a,b=this.B.Oa();(a=(b=b&&b.skin().topPanel())?b.displayObject():null)&&F(a,"height",`${this.Wr.offsetHeight}px`);(b=tS(this))&&F(b,"height",`${this.Ru.offsetHeight}px`);b=!1;a=a||this.v7;a!=this.Wr&&(Gd(a,this.Wr),this.Wr=a,b=!0);a=tS(this)||this.q7;a!=this.Ru&&(Gd(a,this.Ru),this.Ru=a,b=!0);b&&this.SW.C()}};function vS(a,b){switch(b){case "pen":return Z(a.K,"marker_pen");case "highlighter":return Z(a.K,"marker_highlighter");case "eraser":return Z(a.K,"marker_eraser");default:return null}} +class wS extends P{constructor({type:a,ia:b,yg:c,Ia:d}){super({G:"marker-panel-button",tabIndex:0});this.K=d;this.fa("mobile",Ii);this.fa("type",a);a=this.jn(a);d=new P({ga:O(this,"text")});Ht(d,b,c);a&&N(this,a);N(this,d)}jn(a){var b=vS(this,a);if(!b)return null;a=new P({G:"item-icon"});Ft(a,O(this,"item-icon"));b=new P({ga:O(a,"item-icon-image"),za:b});N(a,b);return a}} +function xS(a,b,c){c=new wS({type:b,ia:a.I,yg:c,Ia:a.K});z(a,c.ka,()=>a.Wp(b),a);x(a,c.displayObject(),"keydown",d=>{if(13==d.keyCode||32==d.keyCode)a.Wp(b),d.stopPropagation(),d.preventDefault()},a);N(a,c);return c}function yS(a,b){a.wT=b;a.Nf.has("endDrawing")&&a.Nf.get("endDrawing").ra(b)} +class zS extends P{constructor(a,b){super({G:"marker-panel"});this.Nf=new Map;this.zT=this.wT=!0;this.xZ=E(this);this.AT=E(this);this.fz=[];this.I=a;this.K=b}open(){for(const a of this.Nf.values())a&&Se(this,a);this.Zo();this.ZJ();this.fz=[]}ZJ(){var a=xS(this,"pen","PB_DRAWING_TOOLS_PEN");this.Nf.set("pen",a);a=xS(this,"highlighter","PB_DRAWING_TOOLS_HIGHLIGHTER");this.Nf.set("highlighter",a);a=xS(this,"eraser","PB_DRAWING_TOOLS_ERASER");this.Nf.set("eraser",a);a=new P({ga:O(this,"separator")}); +this.V(a);a=xS(this,"eraseAll","PB_DRAWING_TOOLS_ERASE_ALL");this.Nf.set("eraseAll",a);a.ra(this.zT);a=xS(this,"endDrawing","PB_DRAWING_TOOLS_END_DRAWING");this.Nf.set("endDrawing",a);a.ra(this.wT)}Wp(a){(a={pen:"line",highlighter:"marker",eraser:"eraser",endDrawing:"nothing"}[a])?this.xZ.C(a):this.AT.C()}freeze(){this.fz=[];for(const a of this.Nf.values())a.enabled()&&(a.ra(!1),this.fz.push(a))}};class AS extends xO{constructor({G:a,W:b}){super({G:a,W:b});this.$Z=16}};class BS extends LQ{constructor(a,b){super(a);this.Tp=b;L(this.Tp,"height","100%");this.Lx(this.Tp)}};const CS={markerTools:"PB_TITLE_PANEL_MARKER_TOOLS",attachments:"PB_TITLE_PANEL_ATTACHMENTS",marker:"PB_DRAWING_TOOLS_PEN",highlighter:"PB_DRAWING_TOOLS_HIGHLIGHTER",eraser:"PB_DRAWING_TOOLS_ERASER",presenterInfo:"PB_TITLE_PANEL_PRESENTER_INFO",notes:"PB_TITLE_PANEL_NOTES",outline:"PB_TITLE_PANEL_OUTLINE"};function DS(a,b,c,d){b&&(a=d?"":a.I.ha(CS[c]),b.la(a))}function ES(a){a.buttons().forEach(b=>b.Ac(!1))} +function FS(a,{Laa:b,cba:c,Aba:d,a$:e}){var f=a.ud;f&&f.ra(b);(b=a.Kj)&&b.ra(c);(c=a.nm)&&c.ra(d);(a=a.Wk)&&a.ra(e)} +class GS extends P{constructor({settings:a,Ia:b,ia:c}){super({G:"buttons-container"});this.K=b;this.I=c;this.wY=E(this);this.zY=E(this);this.DY=E(this);this.AY=E(this);this.BY=E(this);this.Yk=this.Kj=this.nm=this.ud=this.Wk=null;this.Ym={};this.H=a;this.rw="nothing";a=Z(b,"attachments_button_icon");const d=Z(b,"marker_panel_button_icon"),e=Z(b,"presenter_info_button_icon"),f=Z(b,"notes_button_icon");b=Z(b,"outline_button_icon");this.Ym.attachments={icon:a,label:c.ha("PB_TITLE_PANEL_ATTACHMENTS")}; +this.Ym.markerTools={icon:d,label:c.ha("PB_TITLE_PANEL_MARKER_TOOLS")};this.Ym.marker={icon:d,label:c.ha("PB_DRAWING_TOOLS_PEN")};this.Ym.highlighter={icon:d,label:c.ha("PB_DRAWING_TOOLS_HIGHLIGHTER")};this.Ym.eraser={icon:d,label:c.ha("PB_DRAWING_TOOLS_ERASER")};this.Ym.presenterInfo={icon:e,label:c.ha("PB_TITLE_PANEL_PRESENTER_INFO")};this.Ym.notes={icon:f,label:c.ha("PB_TITLE_PANEL_NOTES")};this.Ym.outline={icon:b,label:c.ha("PB_TITLE_PANEL_OUTLINE")};this.Pu();z(this,this.I.jh,this.VO,this)}buttons(){return[this.Wk, +this.ud,this.nm,this.Kj,this.Yk].filter(a=>!!a)}invalidate(){Se(this,this.ud);Se(this,this.Kj);Se(this,this.nm);Se(this,this.Wk);Se(this,this.Yk);this.Pu()}Pu(){if(this.H.visible){var a=this.H.buttonsOrder;for(let b=0;bc);switch(a){case "logo":return b.indexOf(this.he);case "courseTitle":return b.indexOf(this.Gh);default:return-1}}KB(){if(this.yb){var a=this.yb.logo();a&&(a.mf()?this.XV(a):(a.load(),z(this,a.gr(),this.XV,this)))}}ZA(){const a=this.F.Td(),b=a&&a.logo();a&&b?(this.he&&this.he.J(!0),this.yb!=a&&OS(this,a)):(this.yb=null,this.he&&(this.he.J(!1),HS(this.he)))}XV(a){if(this.he){var b=this.he;b.Sl.Zo();const c=a.gC();b.Sl.V(c);const d=Ni?a.width():c.width;a=Ni?a.height():c.height; +b=Math.min(1,Math.min(b.Pp/d,b.Kk/a));Nh(c,d*b,a*b)}}};function QS(a){const b=new GS({parent:a,settings:a.Kb,Ia:a.K,ia:a.I});Ft(b,O(a,"container"));var c=0!=a.F.resources().ti().count(),d=b.Wk;d&&d.ra(c);z(a,b.DY,a.ho,a);z(a,b.wY,a.bB,a);z(a,b.BY,a.Pb,a);z(a,b.AY,a.vd,a);z(a,b.zY,a.o8,a);return b}function RS(a){return a.xd.Kj?new AS({G:"notes-popup",W:a.B}):null}function SS(a){a=new MQ(a.xd.Yk.displayObject(),a.Ub);a.fa("outline-popup",!0);return a} +function TS(a){if(a.xd.ud){const b=new zS(a.I,a.K);yS(b,!1);z(a,b.xZ,a.Wp,a);z(a,b.AT,a.y5,a);return b}return null}function US(a){a.xd.buttons().forEach(b=>{DP(a.Ja,b.displayObject())})}function VS(a){const b=!!a.B.$().zg(),c=!a.B.Oa()&&!a.B.ob()&&!a.B.fb(),d=WS(a);FS(a.xd,{cba:d,Laa:c,Aba:b,a$:!!a.F.resources().ti().count()});c||a.Wp("nothing")}function XS(a){a.Jb&&a.Jb.Tm(a.Ta.Yd?YS(a):ZS(a))} +function $S(a,b){switch(b.buttonType){case "attachments":const c=b.pressed;b=b.relativeElement;const d=aT(a,b);HP(a.Ja,c,b,{Om:"bottom"});d.focus();break;case "outline":a.iO(b)}}function ZS(a){return a.Cb.showed()?Z(a.K,"arrows_right"):Z(a.K,"arrows_left")}function YS(a){return a.Cb.showed()?Z(a.K,"arrows_left"):Z(a.K,"arrows_right")}function WS(a){return(a=a.B.$().pj())&&""!=a.text().replace(/[\s\xa0]+/g," ").replace(/^\s+|\s+$/g,"")} +function aT(a,b){b=new LQ(b);b.Lx(bT(a));b.fa("attachments",!0);BP(a.Ja,b);return b}function bT(a){const b=new lN(a.F.resources().ti(),a.K,a.I);Ft(b,"attachments-popup");z(a,b.nS,()=>{CP(a.Ja)},a);return b}function cT(a,b){HP(a.Ja,b.pressed(),b.displayObject(),{Om:"bottom",align:"left"})} +class dT extends P{constructor({su:a,$j:b,kp:c,Ba:d,W:e,nj:f,Ia:g,ia:h,sidePanelController:l}){super({G:"top-panel",rf:!0});this.Kb=a;this.ig=b;this.Ta=c;this.Cb=l;this.F=d;this.B=e;this.Ja=f;this.K=g;this.I=h;this.HA=this.BN=this.Hv=this.yb=null;this.$L=E(this);this.cV=E(this);this.JK=E(this);this.Fa=new P({G:"top-main-container"});N(this,this.Fa);this.fa("reversed",this.Ta.Yd);this.Fa.fa("reversed",!this.Kb.Lt);this.xd=QS(this);N(this.Fa,this.xd);this.AE=this.YJ();N(this.Fa,this.AE);(this.Jb=this.Jy())&& +N(this,this.Jb);this.Ub=this.Fy();this.Tp=RS(this);this.Ub&&(B(this,this.Ub),a=SS(this),BP(this.Ja,a));(this.Jg=TS(this))&&B(this,this.Jg);z(this,this.Kb.lb,this.Nn,this);z(this,this.F.OJ,()=>NS(this.AE),this);z(this,this.B.Bc(),this.On,this);z(this,this.B.tu(),this.M6,this);z(this,this.B.NR(),this.L6,this);z(this,this.Ja.So(),this.Mv,this);z(this,this.Ta.lb,this.z6,this)}Nn(){CP(this.Ja);US(this);this.AE.invalidate();this.Fa.fa("reversed",!this.Kb.Lt);this.xd.invalidate();VS(this);this.ub()}z6(){this.fa("reversed", +this.Ta.Yd);XS(this)}ip(a){this.Cb=a;this.Ta.visible&&this.Cb&&this.Cb.visible()?this.Jb||(this.Jb=this.Jy())&&N(this,this.Jb):(Se(this,this.Jb),this.Jb=null)}ra(a){super.ra(a);this.xd.ra(a)}Jy(){if(this.Cb&&this.Cb.visible()){const a=new bM({type:"uikit-link-button",size:"small",icon:{element:this.Ta.Yd?YS(this):ZS(this),Ie:"left"}});L(a,"padding","4px");z(this,this.Cb.showedStateChanged(),()=>{XS(this)});z(this,a.ka,()=>{this.Cb.show(!this.Cb.showed())});return a}return null}YJ(){const a=new PS({su:this.Kb, +Ba:this.F,W:this.B});Ft(a,O(this,"container"));a.fa("reversed",this.Ta.Yd);return a}On(){if(-1!=this.B.ma()){this.HA=null;var a=WS(this);this.Hv&&this.Hv.visible()&&!a&&CP(this.Ja);VS(this);a=this.B.$().zg();const b=!!a;this.BN&&this.BN.visible()&&(b?this.BN.content().UC(a):CP(this.Ja));NS(this.AE)}}iO(a){const b=a.pressed;a=a.relativeElement;if(!this.HA){const c=new xP({mu:!1,nu:!0,$j:this.ig,Ia:this.K,ia:this.I,W:this.B,slides:this.F.slides()});c.Ls.vo.HQ();this.HA=new MQ(a,c);this.HA.fa("outline-popup", +!0);BP(this.Ja,this.HA)}HP(this.Ja,b,a,{Om:"bottom"})}Fy(){return this.xd.Yk?new xP({mu:!1,nu:!0,$j:this.ig,Ia:this.K,ia:this.I,W:this.B,slides:this.F.slides()}):null}Pb(a){a.Ac(!a.pressed());this.Ub||(this.Ub=this.Fy())&&B(this,this.Ub);const b=a.pressed(),c=SS(this);BP(this.Ja,c);b!=a.pressed()&&a.Ac(b);cT(this,a)}bB(a){a.Ac(!a.pressed());const b=a.pressed(),c=aT(this,a.displayObject());b!=a.pressed()&&a.Ac(b);cT(this,a);c.focus()}vd(a){this.Tp||(this.Tp=RS(this))&&B(this,this.Tp);if(!this.Hv){var b= +new BS(this.xd.Kj.displayObject(),this.Tp);b.fa("notes-popup",!0);this.Hv=b;BP(this.Ja,this.Hv)}b=a.pressed();a.Ac(!b);cT(this,a)}o8(a){var b=!a.pressed();a.Ac(b);if(b){this.Jg||(this.Jg=TS(this))&&B(this,this.Jg);b&&this.Jg.open();b=a.pressed();var c=this.Ja.createPopup(a.displayObject(),this.Jg,"marker");b!=a.pressed()&&a.Ac(b);cT(this,a);this.cV.C();c.focus()}else CP(this.Ja)}ho(a){const b=this.B.$().zg();a.Ac(!a.pressed());const c=new YR(this.I,this.K,!0);Ft(c,O(this,"presenter-info"));const d= +a.pressed();this.AN=this.Ja.createPopup(a.displayObject(),c,"presenter");d!=a.pressed()&&a.Ac(d);cT(this,a);c.UC(b);c.ub();this.AN&&this.AN.focus()}Wp(a){if(this.Jg){var b=this.xd;if(b.ud)switch(b.rw=a,b.rw){case "nothing":b.ud.la(b.I.ha("PB_TITLE_PANEL_MARKER_TOOLS"));break;case "line":b.ud.la(b.I.ha("PB_DRAWING_TOOLS_PEN"));break;case "marker":b.ud.la(b.I.ha("PB_DRAWING_TOOLS_HIGHLIGHTER"));break;case "eraser":b.ud.la(b.I.ha("PB_DRAWING_TOOLS_ERASER"))}this.$L.C(a);CP(this.Ja);yS(this.Jg,"nothing"!= +a)}}y5(){this.JK.C();CP(this.Ja)}Mv(){ES(this.xd);this.AN=this.Hv=null}M6(){const a=this.xd.ud;a&&this.Jg&&(a.ra(!1),this.Jg.freeze())}L6(){var a=this.xd.ud;if(a&&this.Jg){a.ra(!0);a=this.Jg;for(const b of a.fz)b.ra(!0);a.fz=[]}}$a(a){var b=this.Jb?`calc(100% - ${this.Jb.width()}px)`:"100%";L(this.Fa,"width",b);b=this.displayObject();const c=qn().getTransform(b);b=this.xd;a=480>a*(c?c.md:1);DS(b,b.Wk,"attachments",a);DS(b,b.ud,"markerTools",a);DS(b,b.nm,"presenterInfo",a);DS(b,b.Kj,"notes",a);DS(b, +b.Yk,"outline",a)}};function eT(a,b,c,d){var e,f=d=null!=(e=d)?e:fT(a);e=a.qE();var g=new cd(a.iB()+24,gT(a)+16);var h=new cd(b,c);e.width+g.width=c?c:Math.min(MN(b.width,a.width,d.width),MN(b.height,a.height,d.height))}function jT(a){a=iT(a);return NN(a)}function hT(a){return iC()||a.L3} +function gT(a){let b=0;if(a.Gc){const c=a.Gc.Wr,d=a.Gc.Ru;c&&(b+=Vh(c).height);b+=Vh(d).height}else b+=a.sb&&a.sb.visible()?a.sb.height():0,b+=a.pb&&a.pb.visible()?a.pb.height():0;b+=a.wa&&a.wa.visible()?a.wa.height():0;return b+=a.Rd&&a.Rd.visible()?a.Rd.height():0}function fT(a){if(hT(a)||a.Zy)return!0;const b=eT(a,a.Ew,a.Dw,!1);return b.width>a.Ew||b.height>a.Dw} +class kT{constructor({Ba:a,Uj:b,oba:c,Hc:d,controlPanel:e,Qc:f,zc:g,separator:h}){this.F=a;this.Hg=b;this.Gc=c;this.sb=d;this.pb=e;this.Y=f;this.wa=g;this.Rd=h;this.Zy=this.F.settings().Lq().fitToWindow();this.L3=1==Oi().fit_content;this.Dw=this.Ew=0}WC(a,b){this.Ew=a;this.Dw=b}qE(){let a=this.F.slideWidth(),b=this.F.slideHeight(),c=Math.max(540/a,540/b);c=Math.max(c,1);return new cd(a*c,b*c)}iB(){return this.Y?280:0}};class lT extends P{constructor(){super({G:"closed-caption-panel"});x(this,this.displayObject(),"click",this.gZ,this);x(this,this.displayObject(),Km,this.gZ,this,Nm);const a=new P({ga:O(this,"scroll-area")});N(this,a);this.gg=new P({G:"closed-captions"});N(a,this.gg);this.ua=new pM({lr:a});B(this,this.ua);this.V(this.ua.Tj())}gZ(a){a.stopPropagation()}mR(a){this.gg.la(a)}$a(a,b){super.$a(a,b);a=Zh(this.displayObject());a=a.top&&a.bottom?a.top+a.bottom:0;this.ua.vi(this.height()-a,this.gg.height())}} +;function KQ(a){a.$c.visible()&&(a.$c.J(!1),a.Ay.C())}function mT(a){const b=new LP(a.kX);B(a,b);z(a,b.jX,()=>{a.ik(!0)},a);z(a,b.So(),()=>{a.ik(!1)},a);return b}function nT(a){const b=new RR({ic:a.D,Ia:a.K,controlPanel:a.pb,Fba:a.jm});B(a,b);z(a,b.hP,a.P6,a);return b}function oT(a){return new kT({Ba:a.F,Uj:a.Hg,oba:a.Gc,Hc:a.sb,controlPanel:a.pb,Qc:a.Y,zc:a.wa,separator:a.Rd})}function pT(a,b){a.sb&&a.sb.ra(b);a.pb&&a.pb.ra(b);a.Y&&a.Y.ra(b)} +function qT(a,b){var c=a.tv;c="MaximizedVideo"==c.Eb?c.ug.video().width():c.R.width();a.$c.Zb(c/b);const d=new gm;d.translate((c-c/b)/2,110*(1-b)/2);d.scale(b,b);on(a.$c.displayObject(),d);a.$c.ub()}function rT(a){a.Kb.visible||!a.Ta.visible||a.ls||a.Jb?(a.Kb.visible||!a.Ta.visible||a.ls)&&a.Jb&&a.Jb&&(a.Fa.removeChild(a.Jb),Se(a,a.Jb),a.Jb=null):a.Jy();a.Jb&&a.Fa.Ff(a.Jb,0)} +function sT(a){(a.eL||a.oz||a.Rr.visible)&&!a.pb?(a.pb=a.YS(),B(a,a.pb)):a.eL||a.oz||a.Rr.visible||!a.pb||a.JX();a.pb&&a.Fa.V(a.pb)}function tT(a){a.Rd=new P({G:"universal-skin-separator"});B(a,a.Rd)}function uT(a){a.sb=new dT({su:a.Kb,$j:a.H.outline,kp:a.Ta,sidePanelController:a.Y,Ba:a.F,W:a.tc,nj:a.Ja,Ia:a.K,ia:a.I});a.sb.fa("hide-controls",!a.Kb.visible);B(a,a.sb);z(a,a.sb.cV,a.L5,a);z(a,a.sb.JK,a.x5,a);wN(a.Kb,"markerTools")&&z(a,a.sb.$L,b=>kO(a.vb,b))} +class vT extends P{constructor({ic:a,settings:b,ia:c,Ia:d}){super({G:"universal"});Ib?(this.fa("ie",!0),sj&&this.fa("ie9",!0)):Mb?this.fa("webkit",!0):Hb?this.fa("opera",!0):Lb&&this.fa("gecko",!0);L(this,"opacity",0);this.fa("embedded-mode",Kj);this.D=a;this.H=b;this.I=c;this.K=d;this.jd=new cd(0,0);this.F=this.D.Ba();this.R=this.D.view();this.tc=this.R.Xd();this.B=this.R.W();this.Hg=this.D.Uj();this.kX=new P({G:"popups-layer"});this.Ja=mT(this);this.sv=E(this);this.AM=E(this,this.Ja.So());this.Ay= +E(this);this.LZ=E(this);a=new P({G:"main-container"});N(this,a);this.Fa=a;N(this,this.kX);this.$c=new lT;B(this,this.$c);this.$c.J(!1);const {f0:e,g0:f,mQ:g}=SQ(this.F.slides());this.eL=e;this.ls=f;this.oz=g;this.Kb=this.H.xa.Hc;this.Rr=this.H.xa.controlPanel;this.Ri=this.Rr.zc;this.Ta=this.H.xa.Qc;this.vb=this.WJ();a=new P({G:"presentation-container"});N(this.Fa,a);this.wN=a;N(this.wN,this.vb);this.jm=this.Rd=this.wa=this.Y=this.pb=this.Jb=this.sb=null;this.ug=nT(this);this.Hk();a=new pS({ic:this.D, +settings:this.H,kD:this.ug,fC:this.vb,Qc:this.Y});B(this,a);z(this,a.sv,this.hA,this);this.tv=a;this.Gc=this.yp();this.Ra=oT(this);z(this,this.D.LX,this.g6,this);z(this,this.B.Bc(),this.On,this);z(this,this.Hg.UK,this.MV,this);z(this,this.Kb.yc,this.K6,this);z(this,this.Rr.yc,this.Nn,this);z(this,this.Ri.yc,this.Nn,this);z(this,this.Ta.yc,this.Nn,this);z(this,this.Ta.lb,this.Nn,this);this.MV()}scale(){var a=this.Ra;({scale:a}=eT(a,a.Ew,a.Dw));return a}So(){return this.AM}initialize(a){lS(this.tv, +a)}resize(a,b){if(a&&b){this.jd=new cd(a,b);Mb&&Nh(document.body,`${a}px`,`${b}px`);var c=Kj||hT(this.Ra)?new Wf(0,0,a,b):new Wf(16,16,a-32,b-32);this.H.accessibilityModeEnabled&&!iC()&&(c.width-=150);this.Ra.WC(c.width,c.height);hT(this.Ra)?(super.resize(a,b),this.move(0,0)):({kI:c}=eT(this.Ra,c.width,c.height),this.move(Math.floor((a-c.width)/2),Math.floor((b-c.height)/2)),super.resize(c.width,c.height));L(this,"opacity","")}}YC(a){this.pb&&this.pb.YC(a)}m1(a){this.sb&&$S(this.sb,a)}$a(a,b){this.Ji(a, +b);this.tv.invalidate()}Ji(a){var b=iT(this.Ra);const c=jT(this.Ra);var d=this.Ra;({kI:g}=eT(d,d.Ew,d.Dw));var e=jT(d),f=gT(d)*e;e*=d.iB();d=iT(d);var g=(new cd(g.width-(e+24*d),g.height-(f+16*d))).round();f=g.height/b;d="100%";this.Y&&this.Y.showed()&&(d=`calc(100% - ${this.Y.width()*c}px)`);L(this.Fa,"width",d);this.zz(c);if(this.Gc){if(d=this.Gc.Wr)wn(d,c),yi(d,"0 0"),F(d,"width",`calc(100% / ${c})`);d=this.Gc.Ru;wn(d,c);yi(d,"0 0");F(d,"width",`calc(100% / ${c})`);F(d,"top","")}this.sb&&!this.Gc&& +(wn(this.sb.displayObject(),c),yi(this.sb.displayObject(),"0 0"),F(this.sb.displayObject(),"width",`calc(100% / ${c})`));this.vb.invalidate(g,fT(this.Ra));this.vb.setScale(b);d=this.Gc?this.Gc.Wr:this.sb&&this.sb.displayObject();e=8*b;const h=12*b;L(this.wN,"margin-top",`${-(d?Vh(d).height:0)*(1-c)}px`);L(this.wN,"padding",`${e}px ${h}px`);this.pb&&(this.pb.BI(f-20),this.pb.ub());this.Y&&this.Y.visible()&&(this.Y.setScale(c),L(this.Y,"height",`calc(100% / ${c})`),this.Y.ub(),this.Ta.Yd?this.aP(c): +this.bP(c));f=this.scale();a={left:12+(this.Y&&this.Y.showed()&&this.Ta.Yd?this.Y.width():0),right:a/f-12};const {left:l,right:n}=a;this.Ja.zl(l,n,g.height);this.Ja.setScale(b,b);CP(this.Ja);b=Kj?0:Math.round(7*c);L(this,"-webkit-border-radius",`${b}px`);L(this,"-moz-border-radius",`${b}px`);L(this,"border-radius",`${b}px`);qT(this,c)}aP(a){this.Y.showed()?L(this.Y,"margin-left",""):L(this.Y,"margin-left",`${-280*a}px`);L(this.Y,"margin-right",`${-280*(1-a)}px`)}bP(a){this.Y.showed()?L(this.Y,"margin-right", +`${-280*(1-a)}px`):L(this.Y,"margin-right","-280px");L(this.Y,"margin-left","")}zz(a){if(this.wa){const b=this.wa.displayObject();wn(b,a);yi(b,"0 0");F(b,"width",`calc(100% / ${a})`);F(b,"top","")}}P6(){this.Y&&this.Y.ub()}hA(){this.fa("side-panel-hidden",!this.Y||!this.Y.visible());this.resize(this.jd.width,this.jd.height);this.$c.visible()&&mS(this.tv).appendChild(this.$c.displayObject());qT(this,this.scale());this.sv.C()}g6(a){const {kI:b}=eT(this.Ra,a.width,a.height);a.width=b.width;a.height= +b.height;a.D_=!0}On(){var a=this.B.Oa(),b=this.B.fb();const c=this.B.ob();this.wa&&this.wa.J(!a&&!b&&!c);this.Rd&&this.Rd.J(!this.wa||!this.wa.visible());(a||b||c)&&KQ(this);CP(this.Ja);this.Bz();Se(this,this.Ra);this.Ra=oT(this);a=this.tv;b=this.Y;a.Y!==b&&(a.Y=b,a.Y&&a.Y.GM.addHandler(a.kZ,a),kS(a,a.Y?"Full":"NoSidebar"),a.Ji());this.xt();this.hA();this.sb&&this.sb.ip(this.Y);this.Jb&&this.Jb.ip(this.Y)}xt(){if(this.$c){const a=this.B.$().pj();this.$c.mR(a?a.text():"")}}MV(){document.body.style.overflow= +fT(this.Ra)?"hidden":"auto";sj||requestAnimationFrame(()=>{this.resize(this.jd.width,this.jd.height)})}WJ(){return new lO(this.D)}Hk(){this.Bz();this.CL();rT(this);this.ov();sT(this)}ov(){!this.Rd&&tT(this);this.Ri.visible?(!this.wa&&this.Sr(),this.Rd.J(!1)):(this.wa&&this.MA(),this.Rd.J(!0));this.wa&&N(this.Fa,this.wa);this.Rd&&N(this.Fa,this.Rd)}MA(){Se(this.Fa,this.wa);this.jm=this.wa=null}Sr(){this.wa=new KR({slides:this.F.slides(),settings:this.Ri,W:this.tc});this.jm=new NR({zc:this.wa,W:this.tc, +Ba:this.F,settings:this.Ri});B(this,this.wa)}CL(){this.iM()?uT(this):this.jM()&&(this.Fa.removeChild(this.sb),Se(this,this.sb),this.sb=null);this.sb&&this.Fa.Ff(this.sb,0)}iM(){return(this.ls||this.Kb.visible)&&!this.sb}jM(){return!(this.ls||this.Kb.visible)&&!!this.sb}Jy(){this.Jb=new sS({su:this.Kb,kp:this.Ta,Ia:this.K,sidePanelController:this.Y});B(this,this.Jb)}YS(){return new vR({skinSettings:this.H,Ba:this.F,W:this.tc,soundController:this.R.soundController(),nj:this.Ja,ia:this.I,Ia:this.K,Uj:this.Hg, +Xw:this})}JX(){this.Fa.removeChild(this.pb);Se(this,this.pb);this.pb=null}Bz(){!this.Y&&this.nz()&&this.Ta.visible?this.gK():!this.Y||this.nz()&&this.Ta.visible||this.HN();this.Y&&this.Ff(this.Y,1);this.LZ.C(this.Y)}nz(){return jS({Ba:this.F,W:this.B,kD:this.ug,kp:this.Ta})}gK(){this.Y=new hS(this.H,this.F,this.tc,this.I,this.K);B(this,this.Y);this.fa("left-panel",this.Ta.Yd);z(this,this.Y.showedStateChanged(),()=>this.ub())}HN(){Se(this,this.Y);this.Y=null}yp(){if(this.pb){const a=new uS({W:this.B, +B1:this.sb&&this.sb.displayObject(),K_:this.pb.displayObject()});B(this,a);z(this,a.SW,this.ub,this);return a}return null}L5(){var a=this.sb;var b=this.vb;b=b.qb?b.qb.ri():!0;a.Jg&&(a=a.Jg,b=!b,a.zT=b,a.Nf.has("eraseAll")&&a.Nf.get("eraseAll").ra(b))}x5(){this.vb.FH()}Nn(){this.Hk();Se(this,this.Gc);this.Gc=this.yp();Se(this,this.Ra);this.Ra=oT(this);Se(this,this.ug);this.ug=nT(this);this.hA();this.fa("left-panel",this.Ta.Yd);this.sb&&this.sb.ip(this.Y);this.Jb&&this.Jb.ip(this.Y)}K6(){this.Nn(); +this.sb&&(VS(this.sb),this.sb.fa("hide-controls",!this.Kb.visible))}rd(){super.rd();Fd(this.$c.displayObject())}h1(){this.$c.visible()||(this.$c.J(!0),this.xt(),mS(this.tv).appendChild(this.$c.displayObject()),this.$c.ub(),this.Ay.C())}};function wT(a,b){const c=a.R,d=b.Fw,e=b.L();a.wn.suspend();c.setOverlayDisplayed(!0);a.Xk.C();yM(a.vk,{Rm:"PB_RESUME_PRESENTATION_WINDOW_TEXT",icon:Z(a.K,"mb_question_icon"),buttons:[{yg:"PB_MESSAGE_BOX_YES",result:"yes"},{yg:"PB_MESSAGE_BOX_NO",result:"no"}]}).then(f=>{a.wn.resume();c.setOverlayDisplayed(!1);a.Dk.C();a.un.C();"yes"==f?(a.pa.initialize(e),d.resume(e,!0)):(f=a.B.Gf(),d.start(f,!0))})} +class xT extends wg{constructor(a,b,c,d,e){super();e&&EM(e,this.resize,this);a.Uj();var f=b.xa;e=f.Hc;const g=f.controlPanel;f=f.Qc;e.pd&&f.visible&&(e.pd=!1,f.pd=!0);g.visible&&!jC()&&(g.jp=!1);this.D=a;z(this,this.D.Tx(),this.Mn,this);z(this,this.D.vx(),this.H5,this);this.H=b;this.I=c;this.K=d;this.F=this.D.Ba();this.R=this.D.view();this.tc=this.R.Xd();z(this,this.tc.Dx(),this.Ln,this);this.B=this.R.W();this.xf=this.Hy();this.VE=new LM(this.D,new ZL);B(this,this.VE);a=B(this,new vT({ic:this.D,settings:this.H, +ia:this.I,Ia:this.K}));a.Fa.ik(!0);a.Y&&a.Y.ik(!0);z(this,a.Le(),this.V6,this);z(this,a.sv,this.hA,this);this.pa=a;this.vg=B(this,new xM(this.pa.displayObject()));this.vk=new zM({ia:this.I,XI:this.vg});this.gw=new LN({Ba:this.F,W:this.B,settings:this.H,ia:this.I,view:this.pa,sidePanelController:null});B(this,this.gw);this.wn=new IM(this.B.Qt());this.Xk=E(this);this.Dk=E(this);this.un=E(this);this.os(this.xf,this.D.Ar());z(this,this.pa.LZ,this.gw.RR,this.gw)}resize(a,b){this.pa.resize(a,b)}displayObject(){return this.pa.displayObject()}Hy(){const a= +new MM;this.R.displayObject().appendChild(a.displayObject());return a}V6(){const a=this.pa.scale();wn(this.xf.displayObject(),this.pa.scale(),this.pa.scale());this.vg.zl(this.pa.width()/a,this.pa.height()/a);this.vg.setScale(a)}hA(){let a;null==(a=this.VE)||JM(a)}H5(a,b,c){c?(pT(this.pa,!1),Qe(this,this.VE.yA,()=>{pT(this.pa,!0);this.os(this.xf,this.D.Ar());this.B.play()},this),this.VE.show(this.displayObject())):this.os(this.xf,this.D.Ar())}os(a,b){this.LB(a,b);z(this,this.B.Z().aC(),()=>{this.LB(a, +b)},this)}LB(a,b){const c=this.B.Z().kd();b=b.xC()&&this.pa.ug.video().visible();c&&!b?a.show():a.Oc();a=this.pa.ug.video();b?a.xf.show():a.xf.Oc()}Mn(a){if("resumePlayback"==a.action()){const b=this.B.Gf();this.pa.initialize(b);"prompt"==this.F.settings().Pc().eu()&&(a.fu("delayStartup"),wT(this,a))}else"gotoSlide"==a.action()&&this.pa.initialize(a.L())}$n(a,b){if(!(0b}).then(()=>{this.wn.resume();c.setOverlayDisplayed(!1);Vs(d,e);this.Dk.C()})}}Ln(a){const b={},c=this.F.slides(),d=f=>{f=c.ja(f).Ci();if(this.H.outline.lj){const g=uN(c);b.SLIDE_INDEX=g[f]}else b.SLIDE_INDEX=f+1};let e="";switch(a.od().type()){case "currentSlideIsNotCompleted":e="PB_CURRENT_SLIDE_IS_NOT_COMPLETED";break;case "backwardNavigationIsRestricted":case "forwardNavigationIsRestricted":e= +"sequential"==this.F.settings().navigation().navigationType()?"PB_NAVIGATION_IS_SEQUENTIAL":"PB_NAVIGATION_IS_RESTRICTED";break;case "interactionNotCompleted":e="PB_QUIZ_SLIDE_WINDOW_TEXT";a=this.B.$();a instanceof Aq?e="PB_SCENARIO_SLIDE_WINDOW_TEXT":a instanceof sq&&(e="PB_INTERACTION_SLIDE_WINDOW_TEXT");break;case "precedingQuizFailed":e="PB_PRECEDING_QUIZ_FAILED_WINDOW_TEXT";d.call(this,a.od().Jd());break;case "precedingQuizNotPassed":e="PB_PRECEDING_QUIZ_NOT_PASSED_WINDOW_TEXT";d.call(this,a.od().Jd()); +break;case "precedingQuizNotCompleted":e="PB_PRECEDING_QUIZ_NOT_COMPLETED_WINDOW_TEXT";d.call(this,a.od().Jd());break;case "precedingScenarioNotPassed":e="PB_PRECEDING_SCENARIO_NOT_PASSED_WINDOW_TEXT";d.call(this,a.od().Jd());break;case "precedingScenarioFailed":e="PB_PRECEDING_SCENARIO_FAILED_WINDOW_TEXT";d.call(this,a.od().Jd());break;case "precedingScenarioNotCompleted":e="PB_PRECEDING_SCENARIO_NOT_COMPLETED_WINDOW_TEXT";d.call(this,a.od().Jd());break;default:return}this.$n(e,b)}rd(){super.rd(); +Fd(this.xf.displayObject())}};class yT{constructor(a){this.Wa=a}create(){return{l1:this.Wa.xa.controlPanel.visible&&this.Wa.xa.controlPanel.zc.visible&&this.Wa.xa.controlPanel.zc.rr,showSlideList:this.hB()&&this.Wa.xa.Qc.showOutline||this.Wa.xa.Hc.visible&&wN(this.Wa.xa.Hc,"outline")||this.Wa.xa.controlPanel.visible&&this.Wa.xa.controlPanel.showOutline,te:this.hB()&&this.Wa.xa.Qc.te||this.Wa.xa.Hc.visible&&wN(this.Wa.xa.Hc,"notes")||this.Wa.xa.controlPanel.visible&&this.Wa.xa.controlPanel.Bl,j1:this.Wa.xa.Hc.visible&&wN(this.Wa.xa.Hc, +"attachments"),i1:this.Wa.xa.Hc.visible&&wN(this.Wa.xa.Hc,"presenterInfo")||this.hB()&&this.Wa.xa.Qc.Wg}}hB(){return this.Wa.xa.Qc.visible}};class zT extends wg{constructor(){super();this.fo=this.io=this.kt=this.Qa=!1;this.ze="";this.lt=!1;this.lb=E(this);this.yc=E(this)}set visible(a){this.Qa!==a&&(this.Qa=a,this.yc.C())}get visible(){return this.Qa}set Jf(a){this.kt!==a&&(this.kt=a,this.lb.C())}get Jf(){return this.kt}set Kf(a){this.io!==a&&(this.io=a,this.lb.C())}get Kf(){return this.io}set qf(a){this.fo!==a&&(this.fo=a,this.lb.C())}get qf(){return this.fo}set Tg(a){this.ze!==a&&(this.ze=a,this.lb.C())}get Tg(){return this.ze}set Zd(a){this.lt!== +a&&(this.lt=a,this.lb.C())}get Zd(){return this.lt}};class AT extends wg{constructor(a){super();this.d7=a;this.vd=this.Pb=this.ho=this.bB=!1;this.lb=E(this);this.yc=E(this)}get outline(){return this.d7}set EI(a){this.bB!==a&&(this.bB=a,this.lb.C())}get EI(){return this.bB}set Wg(a){this.ho!==a&&(this.ho=a,this.lb.C())}get Wg(){return this.ho}set showOutline(a){this.Pb!==a&&(this.Pb=a,this.lb.C())}get showOutline(){return this.Pb}set te(a){this.vd!==a&&(this.vd=a,this.lb.C())}get te(){return this.vd}};class BT extends wg{constructor(){super();this.CN=this.Qa=!1;this.lb=E(this);this.yc=E(this)}get visible(){return this.Qa}set visible(a){this.Qa!==a&&(this.Qa=a,this.yc.C())}get oI(){return this.CN}set oI(a){this.CN!==a&&(this.CN=a,this.lb.C())}};class CT extends wg{constructor(){super();this.gO=this.Qa=!1;this.lb=E(this);this.yc=E(this)}set visible(a){this.Qa!==a&&(this.Qa=a,this.yc.C())}get visible(){return this.Qa}set kk(a){this.gO!==a&&(this.gO=a,this.lb.C())}get kk(){return this.gO}};class DT extends wg{constructor(a,b){super();this.F=a;this.H=b;a:{for(a=0;aa.height}function FT(a){return ET(a)?a.hB()?new Vf(0,a.iB(),0,0):new Vf(0,0,0,0):new Vf(a.Wa.topPanel.visible?a.Wa.hC?52:46:0,0,a.Wa.bottomPanel.visible?a.Wa.hC?55:66:0,0)}function GT(a){const b=FT(a);return new Wf(b.left,b.top,a.jd.width-b.right-b.left,a.jd.height-b.top-b.bottom)}function HT(a,b){a=b?a.aA:GT(a);return new cd(a.width,a.height)} +class IT{constructor(a){this.Wa=a;this.aA=this.jd=null}WC(a){this.jd=a}on(a){a=a?this.aA:GT(this);return new Xc(a.left,a.top)}hB(){return this.Wa.topPanel.visible||this.Wa.bottomPanel.visible?this.Wa.topPanel.kk||this.Wa.bottomPanel.qf||this.Wa.bottomPanel.Kf||this.Wa.bottomPanel.Jf:!1}iB(){return this.Wa.hC?52:56}};function JT(){let a=Ii?"mobile":"desktop";Ib?a+=" ie":Ji?a+=" android_default":Mb?a+=" webkit":Hb?a+=" opera":Lb&&(a+=" gecko");return a} +class KT extends P{constructor({ic:a,Ia:b,ia:c,G:d,b$:e}){super({G:d});JT().split(" ").forEach(f=>Ft(this,f));this.D=a;this.R=a.view();this.F=a.Ba();this.B=a.view().W();this.Ca=this.B.Z();this.tc=a.view().Xd();this.vg=new xM(this.displayObject());this.I=c;this.K=b;this.vk=new zM({ia:this.I,XI:this.vg});if(e){const f=new CM;z(this,f.pB,(g,h)=>this.Aj(g,h));setTimeout(()=>f.nC())}z(this,a.Tx(),this.Mn,this);z(this,a.view().Xd().Dx(),this.Ln,this)}Aj(a,b){this.resize(a,b);this.vg.zl(a,b)}Mn(a){if("resumePlayback"== +a.action()&&"prompt"==this.F.settings().Pc().eu()){const b=this.B.Gf(),c=a.L();a.fu("delayStartup");const d=a.Fw;(()=>{yM(this.vk,{Rm:"PB_RESUME_PRESENTATION_WINDOW_TEXT",icon:Z(this.K,"mb_question_icon"),buttons:[{yg:"PB_MESSAGE_BOX_YES",result:"yes"},{yg:"PB_MESSAGE_BOX_NO",result:"no"}]}).then(e=>{this.R.setOverlayDisplayed(!1);"yes"==e?d.resume(c,!0):d.start(b,!0)});this.R.setOverlayDisplayed(!0)})()}}gh(a,b){return(a.ja(b).Ci()+1).toString()}Ln(a){const b={},c=this.F.slides();let d;switch(a.od().type()){case "currentSlideIsNotCompleted":d= +"PB_CURRENT_SLIDE_IS_NOT_COMPLETED";break;case "backwardNavigationIsRestricted":case "forwardNavigationIsRestricted":d="sequential"==this.F.settings().navigation().navigationType()?"PB_NAVIGATION_IS_SEQUENTIAL":"PB_NAVIGATION_IS_RESTRICTED";break;case "interactionNotCompleted":d="PB_QUIZ_SLIDE_WINDOW_TEXT";a=this.B.$();a instanceof Aq?d="PB_SCENARIO_SLIDE_WINDOW_TEXT":a instanceof sq&&(d="PB_INTERACTION_SLIDE_WINDOW_TEXT");break;case "precedingQuizFailed":d="PB_PRECEDING_QUIZ_FAILED_WINDOW_TEXT"; +b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;case "precedingQuizNotPassed":d="PB_PRECEDING_QUIZ_NOT_PASSED_WINDOW_TEXT";b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;case "precedingQuizNotCompleted":d="PB_PRECEDING_QUIZ_NOT_COMPLETED_WINDOW_TEXT";b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;case "precedingScenarioNotPassed":d="PB_PRECEDING_SCENARIO_NOT_PASSED_WINDOW_TEXT";b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;case "precedingScenarioFailed":d="PB_PRECEDING_SCENARIO_FAILED_WINDOW_TEXT";b.SLIDE_INDEX= +this.gh(c,a.od().Jd());break;case "precedingScenarioNotCompleted":d="PB_PRECEDING_SCENARIO_NOT_COMPLETED_WINDOW_TEXT";b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;default:return}this.$n(d,b)}iA(a){Vs(this.Ca,a)}$n(a,b){const c=this.B.Z().suspended(),d=this.R;Vs(this.Ca,!0);yM(this.vk,{Rm:a,icon:Z(this.K,"mb_warning_icon"),buttons:[{yg:"PB_MESSAGE_BOX_OK",result:"ok"}],px:()=>b}).then(()=>{d.setOverlayDisplayed(!1);this.iA(c)});d.setOverlayDisplayed(!0)}};function LT(a){var b=a.B.ma();-1!=b&&(b=Us(a.R.Pm(),b),b instanceof lv?b.Oa().resize(a.width(),a.height()):b instanceof kv?b.fb().resize(a.width(),a.height()):b instanceof ov&&b.ob().resize(a.width(),a.height()))}function MT(a){a.IL()?(a=a.displayObject(),mn(a,"quiz_mode")):(a=a.displayObject(),nn(a,"quiz_mode"))} +class NT extends KT{constructor(a,b,c){super({ic:a,ia:b,Ia:c,G:"universal_mini",b$:!0});this.F=a.Ba();this.qa=Ki();this.iV=new C;b=a.view();this.V(b.displayObject());z(this,this.B.Dr,this.ke,this);z(this,a.mC(),this.uF,this)}uF(){}zL(a,b){this.R.resize(a,b)}Aj(a,b){L(this,"min-height",`${b+0}px`);this.zL(a,b,0);super.Aj(a,b);LT(this)}ke(){var a=this.B.ma();const b=-1!=a?this.B.$():null;this.ZD&&(this.ZD.Nq(),this.ZD=void 0);this.YD&&(this.YD.Nq(),this.YD=void 0);this.$D&&(this.$D.Nq(),this.$D=void 0); +var c=this.displayObject();nn(c,"interaction_slide");b instanceof br?(this.lq=!0,this.fJ(Us(this.R.Pm(),a)),LT(this),MT(this)):b instanceof sq?(this.lq=!0,this.eJ(Us(this.R.Pm(),a)),LT(this),MT(this),a=this.displayObject(),mn(a,"interaction_slide")):b instanceof Aq?(this.lq=!0,this.gJ(Us(this.R.Pm(),a)),LT(this),MT(this)):(this.lq=!1,MT(this),this.J(!0));0{if((a instanceof Node||a.enabled())&&!(1{1{1{var d=a.Ra.aA;d=new Xc(d.left,d.top);a.mn||(a.hm=d.x,a.im=d.y);b=a.hm;c=a.im},L0:d=>{a.mn=!0;var e=a.Ra.jd;a.hm=wv(b+d.x,0,e.width-FT(a.Ra).right-a.Uc.width());a.im=wv(c+d.y,0,e.height-a.Uc.height());d=a.Uc.width();e=a.Uc.height();a.Ra.aA=new Wf(a.hm,a.im,d,e);vn(a.Uc.displayObject(),a.hm,a.im)},fba:()=>{}});B(a,a.xk)}}else VT(a)} +function XT(a){var b=a.Uc==a.kb;var c=a.Ra;var d=c.jd;if(ET(c)){c=Math.floor(.4*d.width);var e=Math.floor(.4*d.height);d=b?new cd(c,e):new cd(d.width,d.height)}else d=new cd(d.width,Math.floor((d.height-48)*(1-.8)));a.kb.zl(d.width,d.height);!a.mn&&b&&(b=a.Ra,d=a.Uc.width(),a=a.Uc.height(),c=FT(b),b.aA=new Wf(Math.floor(b.jd.width-c.right-d),c.top,d,a))} +class ZT extends wg{constructor({Lca:a,Fx:b,IP:c}){super();this.EL=!1;this.Ra=c;this.kb=a;this.R=b;this.Uc=a;this.Xe=!1;ST(this,!1);this.hm=1;this.im=0;this.xk=null;this.mn=!1;this.Lr=new P({G:"change-layout-button"});B(this,this.Lr);this.kb.V(this.Lr);z(this,this.Lr.ka,()=>{this.hp(this.Uc==this.kb?this.R:this.kb)},this);this.$z=E(this);TT(this,!1)}hr(){return this.Uc}hp(a){VT(this);const b=this.Uc!=a;this.Uc=a;this.$z.C(b);UT(this);WT(this)}vl(){this.JE();this.xL()}iR(a){this.EL="MaximizedVideo"== +a;this.hp(this.EL?this.R:this.kb)}JE(){var a=this.Xe?this.Uc==this.R:!1;var b=this.Ra;if(ET(b))var c=HT(b,a);else this.Xe?(c=b.jd,b=FT(b),c=new cd(c.width,Math.floor(.8*(c.height-b.bottom-b.top)))):(c=GT(b),c=new cd(c.width,c.height));b=this.Ra;var d=this.Xe;const e=FT(b);a=ET(b)?b.on(a):d?new Xc(e.left,e.top+Math.floor((b.jd.height-e.bottom-e.top)*(1-.8))-24):new Xc(e.left,e.top);this.R.resize(c.width,c.height);this.ht(this.R.displayObject(),a);!ET(this.Ra)&&this.Xe&&(b=this.R.wi().getBoundingClientRect(), +a.y+=c.height-b.height,this.R.resize(b.width,b.height),this.ht(this.R.displayObject(),a))}xL(){var a=this.Uc==this.kb;var b=this.Ra;if(ET(b))var c=HT(b,a);else c=b.jd,b=FT(b),c=new cd(c.width,Math.floor(.5*(c.height-b.bottom-b.top)));b=this.Ra;const d=FT(b);a=ET(b)?b.on(a):new Xc(d.left,d.top);this.kb.resize(c.width,c.height);this.ht(this.kb.displayObject(),a);!ET(this.Ra)&&this.Xe&&(a=FT(this.Ra),this.kb.resize(c.width,Math.floor(this.Ra.jd.height-a.bottom-a.top-this.R.height()-24)))}ht(a,b){F(a, +"transform",`translate(${b.x}px, ${b.y}px)`)}WC(a){const b=this.Ra.jd;!a||b&&b.width==a.width&&b.height==a.height||(this.Ra.WC(a),WT(this));XT(this)}};class $T extends P{constructor(){super({G:"progress"});this.Ap=0;this.qa=Ki();wn(this.displayObject(),this.qa);yi(this.displayObject(),"0 100%")}Bg(a){this.Ap=wv(a,0,1);this.ub()}Zb(a){super.Zb(a/this.qa)}};class aU extends $T{constructor(){super();this.cX=new P({G:"playback-progress"});N(this,this.cX)}$a(a,b){super.$a(a,b);this.cX.Zb(a*this.Ap)}};function bU(a){var b=a.Tc.Tg===OL;const c=a.B.gf(b?"switchToNextSlide":"switchToNextStep");b=a.B.gf(b?"switchToPreviousSlide":"switchToPreviousStep");var d=a.Ka;d.zb&&sO(d.zb.displayObject(),c);a=a.Ka;a.Ob&&sO(a.Ob.displayObject(),b)} +class cU extends wg{constructor({zm:a,Sm:b,W:c,bottomPanel:d}){super();this.Tc=a;this.Jw=b;this.B=c;this.Ka=d;this.TF=void 0;z(this,this.B.Z().Cc(),this.yz,this);z(this,this.B.Z().Sb(),this.wb,this);bU(this);this.yz();z(this,this.Ka.eW,this.U5,this);z(this,this.Ka.dW,this.MM,this);z(this,this.Ka.fW,this.OM,this);z(this,this.Ka.hW,this.PM,this)}U5(){const a=this.B.Z().state();"started"===a||"buffering"===a?this.B.pause():this.B.play()}OM(){this.Ka.enabled()&&(this.Tc.Tg===OL?this.B.ni():"bySteps"=== +this.Tc.Tg&&this.B.Ot())}MM(){this.Ka.enabled()&&(this.Tc.Tg===OL?this.B.lf():"bySteps"===this.Tc.Tg&&this.B.Lo())}PM(a){this.B.Wo().jk(a);this.Ka.tC()}wb(){if(!this.B.Z().Ag()&&-1!=this.B.ma()){const a=this.B.gf("playPauseControl");dU(this.Ka,a)}bU(this)}yz(){var a=this.B.Z().state();const b="started"===a||"buffering"===a;this.TF&&(clearTimeout(this.TF),this.TF=void 0);this.TF=setTimeout(()=>this.Ka.H1(b),50);-1!==this.B.ma()&&(a=this.B.gf("playPauseControl"),dU(this.Ka,a))}};function dU(a,b){a.fc&&sO(a.fc.displayObject(),b)} +class eU extends P{constructor({G:a,Ia:b,zm:c,Sm:d,W:e,ia:f}){super({G:a});this.Tc=c;this.Jw=d;this.B=e;this.I=f;this.K=b;this.Yf=this.Cy();this.fc=this.Gy();this.gd=this.dK();this.zb=this.Ey();this.Ob=this.Iy();this.qa=Ki();wn(this.displayObject(),this.qa);yi(this.displayObject(),"0 100%");this.eW=E(this);this.fW=E(this);this.dW=E(this);this.hW=E(this);B(this,new cU({zm:c,Sm:d,W:e,bottomPanel:this}));z(this,this.Tc.lb,this.xr,this);z(this,this.Jw.lb,this.xr,this)}rH(){return!this.Tc.qf&&!this.Tc.Kf&& +!this.Tc.Jf&&!this.Tc.Zd}xr(){this.Jw.kk&&!this.Yf&&(this.Yf=this.Cy());this.Yf&&this.Yf.J(this.Jw.kk);this.Tc.Jf&&!this.fc&&(this.fc=this.Gy());this.fc&&this.fc.J(this.Tc.Jf);this.Tc.Zd&&!this.gd&&(this.gd=this.dK());this.gd&&this.gd.J(this.Tc.Zd);this.Tc.Zd||this.tC();this.Tc.Kf&&!this.Ob&&(this.Ob=this.Iy());this.Ob&&this.Ob.J(this.Tc.Kf);this.Tc.qf&&!this.zb&&(this.zb=this.Ey());this.zb&&this.zb.J(this.Tc.qf);this.KJ()}tC(){}XC(){}H1(){}xx(){}Cy(){return null}KJ(){}};function fU(a){x(a,document,Km,b=>{a.Ij.visible()&&(b=b.target,Md(a.gd.displayObject(),b)||Md(a.Ij.displayObject(),b)||a.Ij.J(!1))})} +class gU extends eU{constructor({G:a,Sm:b,zm:c,W:d,ia:e,Ia:f}){super({G:a,zm:c,Sm:b,W:d,ia:e,Ia:f});this.fc&&N(this,this.fc);this.gd&&N(this,this.gd);this.Ed=this.Dy();this.Ij=new P({G:"rate-menu-popup"});N(this,this.Ij);this.Sk=this.eK();N(this.Ij,this.Sk);this.gd&&(fU(this),z(this,this.B.Wo().Rk,this.XG,this),this.XG())}xr(){super.xr();this.fc&&!this.oi(this.fc)&&N(this,this.fc,1);this.gd&&!this.oi(this.gd)&&N(this,this.gd,2);!this.Ob&&!this.zb||this.Ed||(this.Ed=this.Dy())&&N(this,this.Ed);this.Ed&& +(this.Ed.J(!!this.Ob||!!this.zb),this.Ob&&!this.Ed.oi(this.Ob)&&N(this.Ed,this.Ob,0),this.zb&&!this.Ed.oi(this.zb)&&N(this.Ed,this.zb,1))}tC(){this.Ij.J(!1)}H1(a){this.fc&&this.fc.Tm(Z(this.K,a?"pause":"play"))}XG(){const a=this.B.Wo().playbackRate();XP(this.Sk.oG,String(a))}gW(){const a=!this.Ij.visible();a&&this.xx();this.Ij.J(a)}Dy(){if(this.Ob||this.zb){const a=new P({G:"navigation-controls"});N(this,a);this.Ob&&N(a,this.Ob);this.zb&&N(a,this.zb);return a}return null}Gy(){if(this.Tc.Jf){const a= +new bM({type:"uikit-secondary-button",icon:{element:Z(this.K,"play"),Ie:"left"}});z(this,a.ka,()=>this.eW.C(),this);-1==this.B.ma()&&(a.ra(!1),Qe(this,this.B.Bc(),()=>a.ra(!0)));return a}return null}Iy(){if(this.Tc.Kf){const a=new bM({type:"uikit-secondary-button",icon:{element:Z(this.K,"prev"),Ie:"left"}});z(this,a.ka,()=>this.fW.C(),this);this.Tc.qf||a.fa("next-button-hidden",!0);return a}return null}Ey(){if(this.Tc.qf){const a=new bM({type:"uikit-primary-button",icon:{element:Z(this.K,"next"), +Ie:"left"}});z(this,a.ka,()=>this.dW.C(),this);return a}return null}eK(){const a=new bQ(this.I,this.K);z(this,a.GC(),b=>this.hW.C(Number(b)),this);return a}};class hU extends gU{constructor({W:a,Sm:b,slides:c,zm:d,ia:e,Ia:f}){super({G:"bottom-panel",zm:d,Sm:b,W:a,ia:e,Ia:f});this.M=c;this.rH()&&this.Kd(0);this.xx()}xr(){super.xr();this.xx()}Zb(a){super.Zb(a/this.qa)}xx(){if(this.gd){const a=this.gd.displayObject().offsetLeft;L(this.Ij,"left",`${a}px`);L(this.Ij,"bottom","56px")}}dK(){if(this.Tc.Zd){var a=Z(this.K,`rate-${this.B.Wo().playbackRate()}x`);a=new bM({type:"uikit-secondary-button",icon:{element:a,Ie:"left"}});z(this,a.ka,this.gW,this);return a}return null}XG(){const a= +this.B.Wo().playbackRate();this.gd.Tm(Z(this.K,`rate-${a}x`));super.XG()}};class iU extends gU{constructor({zm:a,Sm:b,W:c,ia:d,Ia:e}){super({G:"landscape-bottom-panel",zm:a,Sm:b,W:c,ia:d,Ia:e});this.Yf&&N(this,this.Yf,0);this.Sk&&this.Sk.fa("landscape",!0);this.KJ();this.xx();this.eB=E(this)}xr(){super.xr();this.Yf&&!this.oi(this.Yf)&&N(this,this.Yf,0)}rH(){return!this.Jw.kk&&super.rH()}XC(){return this.eB}Kd(a){super.Kd(a/this.qa)}xx(){this.gd&&(L(this.Ij,"right","56px"),L(this.Ij,"top","8px"))}KJ(){this.rH()?this.Zb(0):L(this,"width","")}Cy(){if(this.Jw.kk){const a=new bM({type:"uikit-secondary-button", +icon:{element:Z(this.K,"outline_landscape"),Ie:"left"}});z(this,a.ka,()=>this.eB.C(),this);return a}return null}dK(){if(this.Tc.Zd){const a=new bM({type:"uikit-secondary-button",icon:{element:Z(this.K,"rate"),Ie:"left"}});z(this,a.ka,this.gW,this);return a}return null}};class jU extends zC{constructor(a,b,c,d){super(null,[0],[1],300);this.Ec=a;this.xy=b;this.$G=c;this.SZ=d}mp(){const a=Math.round(this.coords[0]*this.Ec.width());this.SZ?(vn(this.Ec.displayObject(),a,0),vn(this.xy.displayObject(),a-this.Ec.width(),this.$G)):(vn(this.Ec.displayObject(),-a,0),vn(this.xy.displayObject(),this.Ec.width()-a,this.$G))}Ro(){this.SZ?vn(this.xy.displayObject(),-this.Ec.width(),this.$G):vn(this.xy.displayObject(),this.Ec.width(),this.$G);super.Ro()}yl(){super.yl();vn(this.Ec.displayObject(), +0,0);vn(this.xy.displayObject(),0,0)}};function kU(a){for(let b=0;bthis.i0)if(this.dispatchEvent(new sU("start",this,a.clientX,a.clientY,a)))this.Mt=!0;else{this.gx||this.EH(a);return}}c=vU(this,b,c);b=c.x;c=c.y;this.Mt&&this.dispatchEvent(new sU("beforedrag",this,a.clientX,a.clientY,a,b,c))&& +(wU(this,a,b,c),a.preventDefault())}};function vU(a,b,c){var d=vd(od(a.ld).ld);b+=d.x-a.KQ.x;c+=d.y-a.KQ.y;a.KQ=d;a.deltaX+=b;a.deltaY+=c;return new Xc(tU(a,a.deltaX),uU(a,a.deltaY))}k.lba=function(a){var b=vU(this,0,0);a.clientX=this.clientX;a.clientY=this.clientY;wU(this,a,b.x,b.y)};function wU(a,b,c,d){a.iD&&rU(a)?a.target.style.right=c+"px":a.target.style.left=c+"px";a.target.style.top=d+"px";a.dispatchEvent(new sU("drag",a,b.clientX,b.clientY,b,c,d))} +function tU(a,b){var c=a.r0;a=isNaN(c.left)?null:c.left;c=isNaN(c.width)?0:c.width;return Math.min(null!=a?a+c:Infinity,Math.max(null!=a?a:-Infinity,b))}function uU(a,b){var c=a.r0;a=isNaN(c.top)?null:c.top;c=isNaN(c.height)?0:c.height;return Math.min(null!=a?a+c:Infinity,Math.max(null!=a?a:-Infinity,b))}function sU(a,b,c,d,e,f,g){ce.call(this,a);this.clientX=c;this.clientY=d;this.Jt=e;this.left=void 0!==f?f:b.deltaX;this.top=void 0!==g?g:b.deltaY}t(sU,ce);function xU(a,b,c,d,e){It.call(this,a);void 0===e&&(e={});void 0!==d&&(e.snap=d);yU(this,e,b,c);this.Ui=new C}t(xU,It); +function yU(a,b,c,d){d=d||"auto";c=c||"auto";if(Ii){Kt(a,"overflow","hidden");a.sa=new It(a.za());let e=!1;b.hideScrollbar=void 0!==b.hideScrollbar?b.hideScrollbar:!0;b.onBeforeScrollEnd=function(f){e&&(f.preventDefault(),f instanceof ie&&(f=f.oe),gh||(gh=new WeakMap),gh.set(f,!0))};b.vScroll="hidden"!=d;b.hScroll="hidden"!=c;b.scrollbarClass="scrollbar";b.onBeforeScrollMove=function(f){f.preventDefault()};b.onBeforeScrollStart=function(f){e=!1;f.target&&"INPUT"!=f.target.nodeName&&"A"!=f.target.nodeName&& +f.preventDefault()};a.sd=new iScroll(a.displayObject(),b);a.sd.options.onScrollMove=function(){e=!0;a.Ui.C()};a.sd.options.onScrollEnd=function(){a.Ui.C()}}else F(a.za(),"overflow","hidden"),F(a.za(),"width","100%"),F(a.za(),"height","100%"),a.sa=new Mt,a.sa.displayObject().className=a.za().className,Bd(a.za(),a.sa.displayObject()),"hidden"!=d&&(a.ua=zU(a),a.ua.CB.addHandler(a.uW,a),a.V(a.ua)),"hidden"!=c&&(a.Ic=AU(a),a.Ic.CB.addHandler(a.uW,a),a.V(a.Ic)),b=new cM(a.displayObject()),a.f8=!0,ve(a.displayObject(), +"mouseover",a.s8,!1,a),ve(a.displayObject(),"mouseout",a.Vl,!1,a),ve(b,"mousewheel",a.P5,!1,a),ve(document,Lm,a.xF,!1,a),ve(a.za(),"scroll",a.o6,!1,a)}k=xU.prototype;k.FL=!1;k.PE=!1;k.invalidate=function(){const a=this;setTimeout(()=>{a.sd?a.sd.refresh():BU(a)},0)};k.uW=function(){this.PE=!0};k.xF=function(a){this.PE&&(a.oe.stopImmediatePropagation(),this.PE=!1,!this.FL&&this.f8&&CU(this))}; +k.P5=function(a){if(this.ua&&a.deltaY){var b=0c)throw Error("minScrollPosition must be less or equal than maxScrollPosition");this.Ok=a;this.Ki=b;this.Bj=c;this.Ns=d;this.rs();this.If(this.Bb)}; +k.rs=function(){};k.Mp=function(){};k.jt=function(a){a=wv(a,this.Ki,this.Bj);this.Bb!=a&&(this.Bb=a,this.Ui.C())};k.$s=function(a){this.If(this.Bb+a)};k.Kw=function(){};k.YM=function(a){a.stopPropagation();this.$s(-this.Je());this.qB(this.Ze,-this.Je())};k.CM=function(a){a.stopPropagation();this.$s(this.Je());this.qB(this.fh,this.Je())}; +k.qB=function(a,b){this.km=a;ve(this.km.displayObject(),"mouseover",this.mA,!1,this);ve(this.km.displayObject(),"mouseout",this.lA,!1,this);ve(document,Lm,this.NA,!1,this);this.Ti.stop();this.pq=function(){this.$s(this.hG)};this.hG=b;this.Ti.start()};k.NA=function(){De(this.km.displayObject(),"mouseover",this.mA,!1,this);De(this.km.displayObject(),"mouseout",this.lA,!1,this);De(document,Lm,this.NA,!1,this);this.Ti.stop();this.pq=null};k.mA=function(){this.Ti.start()};k.lA=function(){this.Ti.stop()}; +k.QM=function(){this.pq&&this.pq()};k.pA=function(a){this.CB.C();a.stopPropagation();const b=this.GO();this.Vr=new pU(this.La.displayObject(),null,b);this.Vr.CR(a);this.Vr.deltaY=this.La.displayObject().offsetTop-this.Ze.height();this.Vr.deltaX=this.La.displayObject().offsetLeft-this.Ze.width();ve(this.Vr,"drag",this.Xl,!1,this);a=this.La.displayObject();mn(a,"active")};k.qF=function(a){this.Vr&&(a.preventDefault(),this.Vr.Xc(),this.Vr=void 0,a=this.La.displayObject(),nn(a,"active"))};k.Xl=function(){}; +k.resize=function(a,b){KU.Mb.resize.call(this,a,b);this.rs()};k.Xc=function(){Te(this.La);Te(this.fh);Te(this.Ze)};function FU(){KU.call(this,"vscrollbar")}t(FU,KU);k=FU.prototype;k.rs=function(){const a=this.height()-this.Ze.height()-this.fh.height();0==fM(this)?this.La.Kd(a):this.La.Kd(Math.max(this.cF,Math.ceil(this.Ok/(fM(this)+this.Ok)*a)));this.Mp()};k.Mp=function(){const a=this.li();0==fM(this)?this.La.Cg(a.top):this.La.Cg(Math.round((this.Bb-this.Ki)/fM(this)*a.height))}; +k.li=function(){const a=new Wf(0,0,0,0);a.top=this.Ze.height();a.height=this.height()-this.fh.height()-this.La.height()-a.top;a.left=this.La.x();return a};k.GO=function(){const a=this.li();a.top=0;return a};k.Kw=function(a){var b=this.li();a=a.offsetY-this.Ze.height()-this.La.height()/2;a=wv(a,0,b.height);b=0!=this.Ns?this.Ns:this.Ok;b=a<=this.La.y()?-b:b;this.If(this.Bb+b);this.Xl()};k.Xl=function(){var a=this.li();a=parseFloat(this.La.displayObject().style.top)/a.height;this.jt(a*fM(this)+this.Ki)}; +function HU(){KU.call(this,"hscrollbar")}t(HU,KU);k=HU.prototype;k.rs=function(){const a=this.width()-this.Ze.width()-this.fh.width();0==fM(this)?this.La.Zb(a):this.La.Zb(Math.max(this.cF,Math.ceil(this.Ok/(fM(this)+this.Ok)*a)));this.Mp()};k.Mp=function(){const a=this.li();0==fM(this)?this.La.oj(a.left):this.La.oj(Math.round((this.Bb-this.Ki)/fM(this)*a.width))}; +k.li=function(){const a=new Wf(0,0,0,0);a.left=this.Ze.width();a.width=this.width()-this.fh.width()-this.La.width()-a.left;a.top=this.La.y();return a};k.GO=function(){const a=this.li();a.left=0;return a};k.Kw=function(a){const b=this.li();a=a.offsetX-this.Ze.width()-this.La.width()/2;a=wv(a,0,b.width);this.La.oj(a);this.Xl()};k.Xl=function(){var a=this.li();a=parseFloat(this.La.displayObject().style.left)/a.width;this.jt(a*fM(this)+this.Ki)};function LU(a){a.Tv=[a.H.showOutline&&"outline",a.H.te&&"notes",a.H.Wg&&"presenterInfo",a.H.EI&&"attachments"].filter(b=>!!b);MU(a)}function NU(a,b,c){const d=b&&a.Tv.includes(b)?b:a.Tv[0];if(c||a.Su!=b)a.Su=d,a.oa.iR(d),a.Ka&&OU(a.Ka,d),(b=PU(a,d))&&QU(a,b)} +function MU(a){var b=a.displayObject();nn(b,"tab_control");Se(a,a.Ka);a.Ka=null;if(1d||(d=f,fb.top?e=b.top:c+lb.left?f=b.left:d+h{var d=this.sa.displayObject();nn(d,"animation");this.Wh&&this.sa.content().removeChild(this.Wh);this.Wh=c;IU(this.sa,0,0);this.Uv=a;this.FE()}, +!1,this);b.play()}jT(){this.Rq().C()}q8(){this.FY(void 0,!0)}FE(){var a=this.oa;a.Uv=this.Uv;a.ub();this.sa.invalidate();this.oa.ub()}};function OU(a,b){Object.keys(a.Nf).forEach(c=>{a.Nf[c].yh(b===c)})}function UU(a,b){switch(b){case "outline":return a.I.ha("PB_TITLE_PANEL_OUTLINE");case "notes":return a.I.ha("PB_TITLE_PANEL_NOTES");case "attachments":return a.I.ha("PB_TITLE_PANEL_ATTACHMENTS");case "presenterInfo":return a.I.ha("PB_TITLE_PANEL_PRESENTER_INFO")}throw Error("unknown page type");} +function VU(a){switch(a){case "PB_TITLE_PANEL_OUTLINE":return"outline";case "PB_TITLE_PANEL_NOTES":return"notes";case "PB_TITLE_PANEL_PRESENTER_INFO":return"presenterInfo";case "PB_TITLE_PANEL_ATTACHMENTS":return"attachments"}throw Error("unexpected message id");} +class WU extends P{constructor(a){super({G:"bottom-panel"});this.I=a;this.Nf={};this.Zm=[];this.CY=new C;z(this,this.I.jh,this.g4,this)}vP(a){const b=this.Oe(a);this.V(b);z(this,b.ka,()=>this.CY.C(a));this.Nf[a]=b;this.Zm.push(a)}resize(a,b){super.resize(a,b);b=Math.floor(a);a=Math.floor(b/this.Zm.length);b-=this.Zm.length*a;for(let c=0;c{a.yC?this.xY.C(this):this.HY.C(this)})}slide(){return this.ya}l0(){}};class eV{constructor({slide:a,Zc:b,QH:c,location:d,Kx:e}){this.slide=a;this.Zc=b;this.QH=c||"";this.location=d||null;this.Kx=e||null;this.selected=this.yC=!1}};function fV(a){const b=a.Fk.QH?a.Fk.QH+". ":"";if(a.Fk.Kx&&a.Fk.location&&(-1$1"),b+(a||"---")):b+(c||"---")} +class gV extends dV{constructor(a,b,c){super({selected:a.selected,Zc:a.Zc,yC:a.yC,slide:a.slide},b);this.I=c;this.Fk=a;this.BB.gp(fV(this));z(this,this.I.jh,this.$i,this)}l0(){const a=parseFloat(Eh(this.displayObject(),"min-height"));if(this.Qk){var b=$h(this.Qk.displayObject());var c=ci(this.Qk.displayObject());b=this.Qk.height()+b.top+b.bottom+c.top+c.bottom}else b=0;c=this.BB?this.BB.height():0;this.Kd(Math.max(a,b,c))}FJ(a,b,c,d){let e=null,f=null;b.some(g=>{if(0>g.toLocaleLowerCase().indexOf(a))return!1; +e=g.replace(new RegExp(`(${a.toLocaleLowerCase()})`,"gi"),"$1");f=`${this.I.ha(d)}
    `+c;return!0});return e&&f?f+e:null}$i(a){switch(a){case "PB_SEARCH_RESULT_IN_TEXT_LABEL":case "PB_SEARCH_RESULT_IN_NOTES":this.BB.gp(fV(this))}}};class hV extends lU{constructor(a,b,c){super();a.forEach(d=>{d=new gV(d,b,c);z(this,d.HY,this.K5,this);z(this,d.xY,this.s6,this);this.V(d);this.rb.push(d)})}};class iV extends P{constructor(a,b){super({G:"search_panel"});this.I=a;this.pw=new C;this.jL=!1;this.K=b;b=new P({za:Z(this.K,"search"),ga:O(this,"search-icon")});N(this,b);this.rq=new yO({G:"search_input",prompt:a.ha("PB_SEARCH_PANEL_DEFAULT_TEXT")});N(this,this.rq);b=new P({ga:O(this,"cancel-button")});const c=new P({za:Z(this.K,"close")});N(b,c);this.AS=b;N(this,this.AS);z(this,this.rq.uL,this.H6,this);z(this,a.jh,this.$i,this)}XQ(){this.rq.displayObject().blur()}J(a){super.J(a);a||(this.jL=!0, +this.rq.Px(""),this.jL=!1)}VC(a){this.rq.Px(a)}H6(){this.jL||this.pw.C(this.rq.value())}$i(a){"PB_SEARCH_PANEL_DEFAULT_TEXT"===a&&this.rq.setAttribute("placeholder",this.I.ha("PB_SEARCH_PANEL_DEFAULT_TEXT"))}};function jV(a){let b;"outline"==a.Eb&&void 0!==a.Uv?(b=a.TW,a.Eu.J(!0),kV(a,!1)):(a.Eu.J(!1),"outline"===a.Eb&&a.H.outline.search&&kV(a,!0));void 0===b&&(b=lV(a,a.Eb));a.me.la(b)}function kV(a,b){a.De&&a.De.J(b)}function mV(a){return a.H.outline.search&&"outline"===a.Eb&&(!a.hd||!a.hd.visible())} +function lV(a,b){switch(b){case "outline":return a.I.ha("PB_TITLE_PANEL_OUTLINE");case "notes":return a.I.ha("PB_TITLE_PANEL_NOTES");case "attachments":return a.I.ha("PB_TITLE_PANEL_ATTACHMENTS");case "presenterInfo":return a.I.ha("PB_TITLE_PANEL_PRESENTER_INFO")}throw Error("unknown page type");} +class nV extends P{constructor(a,b,c){super({G:"menu-layer-top-panel"});this.I=a;this.K=b;this.H=c;this.Uv=void 0;this.TW="";this.Eb="outline";this.pw=E(this);this.pS=E(this);this.PD=E(this);this.me=this.Ky();N(this,this.me);this.OD=this.Oe(Z(this.K,"close"),"close-button");z(this,this.OD.ka,()=>this.Rq().C());N(this,this.OD);this.hd=this.De=null;this.FU();this.Eu=this.Oe(Z(this.K,"back"),"back-button");z(this,this.Eu.ka,()=>this.pS.C());N(this,this.Eu);z(this,this.H.outline.lb,this.FU,this);z(this, +this.I.jh,this.n4,this)}Rq(){return this.PD}iR(a){this.Eb=a;jV(this);"outline"==this.Eb&&this.H.outline.search?kV(this,!0):(kV(this,!1),oV(this))}XQ(){this.hd&&this.hd.XQ()}VC(a){this.hd&&(this.hd.VC(a),a&&this.EY(!1))}FU(){!this.H.outline.search||this.De||this.hd||(this.De=this.fK(),this.De.J(mV(this)),N(this,this.De),z(this,this.De.ka,this.EY,this),this.hd=new iV(this.I,this.K),this.hd.J(!1),z(this,this.hd.pw,this.q6,this),N(this,this.hd),z(this,this.hd.AS.ka,this.DV,this));this.hd&&this.hd.visible()&& +!(this.H.outline.search&&"outline"===this.Eb&&this.hd&&this.hd.visible())&&this.DV();this.De&&this.De.J(mV(this))}q6(a){this.pw.C(a)}DV(){this.pw.C("");oV(this)}$a(){jV(this);this.hd&&this.hd.visible()&&this.hd.ub()}nR(a){this.TW=a}n4(a){switch(a){case "PB_TITLE_PANEL_OUTLINE":case "PB_TITLE_PANEL_NOTES":case "PB_TITLE_PANEL_ATTACHMENTS":case "PB_TITLE_PANEL_PRESENTER_INFO":jV(this)}}};function oV(a){a.hd&&(a.hd.J(!1),a.OD.J(!0),a.me.J(!0),"outline"===a.Eb&&a.H.outline.search&&a.De.J(!0))}class pV extends nV{fK(){return this.Oe(Z(this.K,"search"),"search-button")}Ky(){return new P({G:"tab-title"})}Oe(a,b){b=new P({G:b});a=new P({za:a});N(b,a);return b}EY(a){void 0===a&&(a=!0);this.hd.J(!0);this.De.J(!1);this.OD.J(!1);this.me.J(!1);a&&this.hd.rq.focus()}};function PU(a,b){if("outline"==b){if(a.mm){a.oa.VC(a.mm);return}return void 0!==a.Ng&&a.Uv==a.Yn&&a.Ng?new P({za:a.Ng.displayObject()}):TU(a)}if("attachments"==b)return new lN(a.OA,a.K,a.I);if("presenterInfo"==b)return new bV(a.I,a.K,a.Yn.zg());if("notes"==b)return b=new P({G:"notes"}),(a=a.Yn.pj())&&a.text()&&b.la(a.text()),b;throw Error("unknown page type");} +function TU(a){const b=[];for(let d=0;dqV(a,b.slide,!0,RU(a,b.slide),b.location))} +class tV extends SU{constructor({ia:a,Ia:b,slides:c,resources:d,settings:e}){super({ia:a,Ia:b,slides:c,resources:d,settings:e})}Tr(){return new pV(this.I,this.K,this.H)}VJ(){return new ZU(this.I,this.K)}WN(a){if(this.mm=a.toLowerCase()){var b=sV(this);a=new P({G:"search-result-layout"});const c=new P({G:"result-label"});Ht(c,this.I,"PB_SEARCH_RESULTS_LABEL");a.V(c);b.length?a.V(rV(this,b)):(b=new P({G:"no-matches-label"}),Ht(b,this.I,"PB_SEARCH_NO_RESULTS_LABEL"),a.V(b));QU(this,a)}else NU(this,this.Su, +!0)}};function uV(a,b){a.RY.gp(b)}function vV(a){a.Yf&&z(a,a.Yf.ka,()=>a.eB.C(),a)} +class wV extends P{constructor(a,b,c){super({G:"top-panel"});this.K=a;this.B=b;this.H=c;this.eB=E(this);this.qa=Ki();this.RY=new P({G:"slide-info"});N(this,this.RY);this.Yf=null;this.DU();wn(this.displayObject(),this.qa);yi(this.displayObject(),"0 0");z(this,this.H.lb,this.DU,this)}XC(){return this.eB}Zb(a){super.Zb(a/this.qa)}DU(){this.H.kk&&!this.Yf&&(this.Yf=this.Cy(),vV(this),N(this,this.Yf));this.Yf&&this.Yf.J(this.H.kk)}};class xV extends wV{constructor(a,b,c){super(a,b,c);Dj&&this.V(new PM({G:"back-to-app-button",vca:Z(a,"back_to_app")}))}Cy(){const a=new P({G:"menu-button"});Ft(a,"menu");z(this,a.ka,()=>this.XC().C(),this);const b=new P({za:Z(this.K,"outline")});N(a,b);return a}};function yV(a,b){a.kb=new RT(!Mi);a.kb.J(!1);yi(a.kb.displayObject(),"left top");a.V(a.kb.displayObject());x(a,a.kb.displayObject(),"click",a.SM,a,!0);z(a,a.B.Z().Cc(),()=>{const c="buffering"==a.B.Z().state();var d=a.kb;c?d.xf.show():d.xf.Oc()});oO(a.kb,b.Ar().view());b=a.F.nd().Lf();for(let c=0;c{"activated"==e.playbackState()?(pO(a.kb,e.width(),e.height()),XT(a.fd),a.Jh!=e&&(a.Jh=e)):"deactivated"==e.playbackState()&&(a.Jh=void 0); +a.Cz()})}a.fd=new ZT({Lca:a.kb,Fx:a.R,IP:new IT(a.H)});z(a,a.fd.$z,a.WM,a)}function zV(a){if(a.wa){const b=a.Ka?a.Ka.height()*a.qa:0;L(a.wa,"bottom",`${b}px`)}}function AV(a,b){z(a,b.LY,(c,d,e)=>{BV(a)&&(e.preventAction(),a.SM())})} +function CV(a){if(a.H.topPanel.kk){var b=a.D.Ba().resources().ti();b={ia:a.I,Ia:a.K,slides:a.D.Ba().slides(),resources:b,settings:a.H.Ke};a.Dd=new tV(b);a.Dd.J(!1);B(a,a.Dd);z(a,a.Dd.Rq(),a.X2,a);z(a,a.Dd.$T,c=>{a.zy();a.R.Xd().pe(c.index(),!0)});1a.dB())}function EV(a){if(a.H.zc.oI)return!0;if(-1===a.B.ma())return!1;a=a.B.$().nb();return 1{wt(this.displayObject(),"not_loaded");zV(this);g&&(e=new ZL,e=new LM(a,e),Qe(this,e.yA,()=>this.B.play()),e.show(this.displayObject()))});b=this.Hy();this.R.displayObject().appendChild(b.displayObject());AV(this,a.view().yr());x(this,this.R.displayObject(), +"click",this.SM,this,!0);z(this,this.B.Z().Sb(),this.zz,this);z(this,this.H.topPanel.yc,this.Hk,this);z(this,this.H.topPanel.lb,this.Hk,this);z(this,this.H.bottomPanel.yc,this.Hk,this);z(this,this.H.zc.yc,this.Hk,this)}Hk(){this.H.topPanel.visible&&!this.oa?this.Tr():!this.H.topPanel.visible&&this.oa&&this.IN();this.oa&&this.V(this.oa);this.H.bottomPanel.visible&&!this.Ka?this.VJ():!this.H.bottomPanel.visible&&this.Ka&&(Se(this,this.Ka),this.Ka=null);this.Ka&&this.V(this.Ka);this.ov();!this.H.bottomPanel.visible&& +!this.H.topPanel.visible||this.td?this.H.bottomPanel.visible||this.H.topPanel.visible||!this.td||(Se(this,this.td),this.td=null):DV(this);this.td&&this.V(this.td);this.H.topPanel.kk&&!this.Dd?CV(this):!this.H.topPanel.kk&&this.Dd&&(this.Dd.visible()&&this.zy(),Se(this,this.Dd),this.Dd=null);this.Dd&&this.V(this.Dd);this.Aj(this.jd.width,this.jd.height);this.Ka&&this.Ka.fa("with-border",!this.wa)}IN(){Se(this,this.oa);this.oa=null}Tr(){this.H.topPanel.visible&&(this.oa=new xV(this.K,this.tc,this.H.topPanel), +z(this,this.oa.ka,()=>this.Ji()),z(this,this.oa.XC(),()=>this.dB()),B(this,this.oa))}VJ(){this.H.bottomPanel.visible&&(this.Ka=new hU({W:this.R.Xd(),slides:this.D.Ba().slides(),zm:this.H.bottomPanel,Sm:this.H.topPanel,ia:this.I,Ia:this.K}),B(this,this.Ka),z(this,this.Ka.ka,()=>this.Ji()))}ov(){this.H.zc.visible&&EV(this)&&!this.wa?this.Sr():this.H.zc.visible&&EV(this)||!this.wa||this.MA();this.wa&&this.V(this.wa)}MA(){Se(this,this.wa);this.wa=null}Sr(){this.H.zc.visible&&(this.wa=new aU,B(this,this.wa))}zz(){if(this.wa){var a= +this.D.Ba().slides();if(this.H.zc.oI){var b=this.B.Z().timestamp();a=a.mi(b,!1,!0)/a.wu()}else{var c=this.B;if(-1==c.ma())a=0;else{var d=c.$();b=c.Z().timestamp();b=a.mi(b,!1,!1);c=-1==c.ma()?0:c.$().nb().duration();d=new gf(d.index(),0,0);a=a.mi(d,!1,!1);a=0a.J(b.kd()));return a}dB(a,b){super.dB(a,b);this.Dd&&(this.Dd.nR(b||""),this.Dd.show(this.B.$(),a));this.oa&&this.oa.J(!1);this.Ka&& +this.Ka.J(!1);this.td&&this.td.J(!1)}zy(){this.Dd&&this.Dd.Oc();const a=this.lq;this.oa&&this.oa.J(!a);this.Ka&&this.Ka.J(!a);this.td&&this.td.J(!a);super.zy()}uF(a){"changeLayout"==a.name()&&(a=a.params().type,this.fd.iR(a),this.Ji())}Aj(a,b){this.jd=new cd(a,b);a>b?(vt(this.displayObject(),"landscape"),this.kb&&vt(this.kb.displayObject(),"landscape")):(wt(this.displayObject(),"landscape"),this.kb&&wt(this.kb.displayObject(),"landscape"));this.td&&this.td.tC();this.Ka&&this.Ka.tC();this.fd.WC(this.jd); +super.Aj(a,b)}zL(a,b,c){var d=BV(this);var e=0;if(this.oa&&!BV(this)){var f=parseFloat(Eh(this.oa.displayObject(),"height"));isNaN(f)||(e+=f)}this.lq&&(e=0);a:{if(this.Ka&&!BV(this)&&(f=parseFloat(Eh(this.Ka.displayObject(),"height")),!isNaN(f)))break a;f=0}e+=f;f=0;this.td&&d&&(d=this.td.width(),f+=d*this.qa,this.td.Kd(b),this.td.Cg(-(b/this.qa)+b),L(this.td,"right",`${-d*(1-this.qa)}px`));d=a-f;super.zL(d,b-e,c);FV(this,!0);this.Cz();zV(this);this.Dd&&(this.Dd.resize(a,b),this.Dd.visible()&&this.Dd.ub()); +this.wa&&this.wa.Zb(d);this.oa&&this.oa.Zb(a);this.Ka&&(L(this.Ka,"bottom",`${c}px`),this.Ka.Zb(a))}Cz(){ST(this.fd,this.Xe&&!!this.Jh);this.fd.vl();BV(this)||this.fd.hp(this.kb)}WM(a){this.fd.vl();a&&(this.fd.hr()==this.R?this.displayObject().insertBefore(this.kb.displayObject(),this.R.displayObject()):this.displayObject().insertBefore(this.R.displayObject(),this.kb.displayObject()))}ke(){super.ke();var a=this.Jh,b=this.F.nd().Lf();if(!a)for(var c=0;c=this.B.ma()){a=e;break}}this.Xe=!!a;ST(this.fd,this.Xe);a=-1!=this.B.ma()?this.B.$():null;this.oa&&(b="-",a&&a.visible()&&(b=this.B.$().Ci()+1),uV(this.oa,b+"/"+this.F.slides().np()));const d=this.lq;[this.oa,this.Ka,this.wa,this.td].forEach(e=>e&&e.J(!d));if(a=this.B.fb())b=this.B.$(),c=new QL(this.tc,OL),b=new RL(a.playerController(),c,2==b.Bn),a.setExternalNavigationController(b);this.Ji();FV(this);this.ov();this.Aj(this.jd.width,this.jd.height);this.fd.vl()}Ji(){yj&&this.Xe&& +yn(this.kb.displayObject())}SM(a){if(BV(this)){var b=!1,c=this.B.Ud();a&&a.target&&(b=c.view(),b=null===b.jv?!1:-1!=Ia(b.jv,Ld(a.target)));a=!1;this.oa&&(a=0==this.oa.opacity());b&&a||HV(this,a)}}showTopPanel(a){this.oa&&L(this.oa,"z-index",a?"99":"")}showBottomPanel(a){this.Ka&&L(this.Ka,"z-index",a?"99":"");this.td&&L(this.td,"z-index",a?"99":"")}}IV.prototype.showBottomPanel=IV.prototype.showBottomPanel;IV.prototype.showTopPanel=IV.prototype.showTopPanel;class JV extends P{constructor({G:a,ic:b,ia:c,Ia:d}){super({G:a,rf:!0});this.D=b;this.R=b.view();this.F=b.Ba();this.I=c;this.K=d;this.B=b.view().W();this.Ca=this.B.Z();this.tc=b.view().Xd();this.vg=new xM(this.displayObject(),"popup-layer");Ft(this.vg.Co,O(this,"popup-layer"));this.vk=new zM({ia:this.I,XI:this.vg});this.qa=1;z(this,b.Tx(),this.Mn,this);z(this,b.view().Xd().Dx(),this.Ln,this);z(this,b.vx(),(e,f,g)=>{if(g){e=new ZL;e=new LM(b,e);var h=z(this,e.yA,()=>{Ke(this,h);this.B.play()},this); +e.show(this.displayObject())}},this)}$a(a,b){a&&b&&this.vg.zl(a,b)}Mn(a){if("resumePlayback"==a.action()&&"prompt"==this.F.settings().Pc().eu()){const b=this.B.Gf();this.sL(b);const c=a.L();a.fu("delayStartup");const d=a.Fw;(()=>{yM(this.vk,{Rm:"PB_RESUME_PRESENTATION_WINDOW_TEXT",icon:Z(this.K,"mb_question_icon"),buttons:[{yg:"PB_MESSAGE_BOX_YES",result:"yes"},{yg:"PB_MESSAGE_BOX_NO",result:"no"}]}).then(e=>{this.R.setOverlayDisplayed(!1);"yes"==e?d.resume(c,!0):d.start(b,!0)});this.R.setOverlayDisplayed(!0)})()}else"gotoSlide"== +a.action()&&this.sL(a.L())}sL(){}gh(a,b){return(a.ja(b).Ci()+1).toString()}Ln(a){const b={},c=this.F.slides();let d;switch(a.od().type()){case "currentSlideIsNotCompleted":d="PB_CURRENT_SLIDE_IS_NOT_COMPLETED";break;case "backwardNavigationIsRestricted":case "forwardNavigationIsRestricted":d="sequential"==this.F.settings().navigation().navigationType()?"PB_NAVIGATION_IS_SEQUENTIAL":"PB_NAVIGATION_IS_RESTRICTED";break;case "interactionNotCompleted":d="PB_QUIZ_SLIDE_WINDOW_TEXT";a=this.B.$();a instanceof +Aq?d="PB_SCENARIO_SLIDE_WINDOW_TEXT":a instanceof sq&&(d="PB_INTERACTION_SLIDE_WINDOW_TEXT");break;case "precedingQuizFailed":d="PB_PRECEDING_QUIZ_FAILED_WINDOW_TEXT";b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;case "precedingQuizNotPassed":d="PB_PRECEDING_QUIZ_NOT_PASSED_WINDOW_TEXT";b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;case "precedingQuizNotCompleted":d="PB_PRECEDING_QUIZ_NOT_COMPLETED_WINDOW_TEXT";b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;case "precedingScenarioNotPassed":d="PB_PRECEDING_SCENARIO_NOT_PASSED_WINDOW_TEXT"; +b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;case "precedingScenarioFailed":d="PB_PRECEDING_SCENARIO_FAILED_WINDOW_TEXT";b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;case "precedingScenarioNotCompleted":d="PB_PRECEDING_SCENARIO_NOT_COMPLETED_WINDOW_TEXT";b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;default:return}this.$n(d,b)}iA(a){Vs(this.Ca,a)}$n(a,b){const c=this.B.Z().suspended();this.R.setOverlayDisplayed(!0);yM(this.vk,{Rm:a,icon:Z(this.K,"mb_warning_icon"),buttons:[{yg:"PB_MESSAGE_BOX_OK",result:"ok"}], +px:()=>b}).then(()=>{this.R.setOverlayDisplayed(!1);this.iA(c)})}};class KV extends P{constructor(){super({G:"preloader"});this.l8=800;this.V4=500;this.ko=!1;this.m8=E(this);this.T3=E(this);this.J(!1)}show(){this.ko||(this.ko=!0,clearTimeout(this.pz),clearTimeout(this.fB),this.fB=Gi(this.y6,this,this.l8))}Oc(){if(this.ko&&(this.ko=!1,clearTimeout(this.pz),clearTimeout(this.fB),this.visible())){var a=this.V4-((new Date).getTime()-this.r8);0{this.Tl.contains(g.target)||(this.Te.contains(g.target)||!this.R.displayObject().contains(g.target)? +(QV(this,!this.Tl.visible()),RV(this),g.preventDefault()):QV(this,!1))},Nm)}hr(){return this.Uc}$H(){return this.Uc==this.Te?this.R:this.Te}vl(){this.JE();this.xL();var a=this.vb;if(LV(this.Ra))a.Te.fa("draggable",!1),TV(a,!1);else{const b=a.fd.hr();a.Te.fa("draggable",b==a.Te);TV(a,b==a.R)}RV(this)}JE(){const a=this.qE(),b=this.on(this.R);this.R.resize(a.width,a.height);this.ht(this.R.displayObject(),b)}qE(){if(this.Uc==this.R){var a=this.Ra;var b=a.F.slideWidth();var c=a.F.slideHeight();a=NV(a); +const {width:d,height:e}=An({width:b,height:c,boundingWidth:a.width,boundingHeight:a.height,TB:!0});b=new cd(d,e)}else b=this.Ra,a=null,c=b.B,-1!=c.ma()&&(c.Oa()&&(a=c.Oa().quiz().quizSize(),a=new cd(a.width,a.height)),c.fb()&&(a=c.fb().currentSession().interaction().interactionSize(),a=new cd(a.width,a.height)),c.ob()),c=a||new cd(b.F.slideWidth(),b.F.slideHeight()),b=OV(b,c.width,c.height);return b}xL(){if(this.Uc==this.Te)var a=NV(this.Ra);else a=this.Ra,a=a.ln?OV(a,a.ln.width(),a.ln.height()): +new cd(0,0);this.Te.resize(a.width,a.height);const b=ci(this.Te.displayObject());this.Hq.resize(a.width-b.left-b.right,a.height-b.top-b.bottom);this.Cz()}Cz(){const a=this.on(this.Te);this.ht(this.Te.displayObject(),a)}on(a){a=this.Uc!=a;return LV(this.Ra)||a?new Xc(0,0):this.mn?new Xc(this.hm,this.im):MV(this.Ra)}ht(a,b){F(a,"transform",`translate(${b.x}px, ${b.y}px)`)}oW(){this.vl();this.xk&&Se(this,this.xk);this.mn=!1;QV(this,!1);if(fL()&&this.Cb&&this.Cb.showed()){let a=0,b=0;this.xk=new QT(this.Uc.displayObject(), +{M0:()=>{if(!this.mn){const c=MV(this.Ra);this.hm=c.x;this.im=c.y}a=this.hm;b=this.im},L0:c=>{this.mn=!0;this.hm=wv(a+c.x,0,this.vb.width()-this.Uc.width());this.im=wv(b+c.y,0,this.vb.height()-this.Uc.height());this.JE();this.Cz()},fba:()=>{}});B(this,this.xk)}}WM(){this.hp(this.$H())}hp(a){this.Uc=a;QV(this,!1);this.$z.C()}};function UV(a){const b=new P({G:"video-narration-view"});Ft(b,O(a,"narration-view"));b.J(!1);b.V(a.Hq);N(a.Gi,b);return b}function VV(a,b){return new PV({fC:a,sidePanelController:a.Cb,Ba:b.Ba(),W:b.view().W()})}function WV(a){const b=new SV({fC:a,IP:a.Ra,Xaa:a.Te,Fx:a.R,sidePanelController:a.Cb,Mca:a.Hq});B(a,b);z(a,b.$z,a.ZV,a);return b}function XV(a){const b=a.VK(),c=void 0!==b;YV(a,c);c?a.Ra.ln=b:(a.Ra.ln=null,a.fd.hp(a.Te))} +function ZV(a,b){for(let c=0;c{"activated"==e.playbackState()?a.Jh!=e&&(a.Jh=e,YV(a,!0),a.Ra.ln=e):"deactivated"==e.playbackState()&&(a.Jh=void 0,XV(a));a.fd.vl()},a)}}function $V(a,b){const c=a.F.slides().ja(b).No();let d;for(let e=0;e{var f=this.fd;f.vl();f.oW();QV(f,!1)},this);z(this,this.B.Z().aC(),this.l4,this);z(this,this.B.Bc(),()=>{XV(this);this.fd.vl()}, +this);ZV(this,d);this.ZV();this.fa("portrait",!fL())}gn(a){"MaximizedVideo"==a&&this.fd.hp(this.R)}hr(){return this.fd.hr()}$H(){return this.fd.$H()}VK(){let a=this.Jh;const b=this.F.nd().Lf();if(!a)for(let c=0;c=this.B.ma()){a=d;break}}return a}$a(a,b){super.$a(a,b);this.fd.vl();this.fa("portrait",!fL())}l4(){this.B.Z().kd()?this.xf.show():this.xf.Oc()}ZV(){this.fd.vl();const a=this.fd.hr()==this.R;this.fa("presentation-minimized", +a);a?this.Gi.Ff(this.Te,0):this.Gi.Ff(this.R,0)}};function bW(a){a=new P({ga:O(a.Fa,"cc")});a.J(!1);return a}function cW(a){const b=new LN({Ba:a.F,W:a.R.W(),settings:a.H,ia:a.I,view:a,sidePanelController:a.Y});B(a,b);return b}function dW(a){a.H.xa.Qc.Yd?a.aP():a.bP()} +class eW extends JV{constructor(a,b,c,d){super({G:"universal-tablet",ic:a,ia:c,Ia:d});this.H=b;this.Hg=a.Uj();this.Ay=E(this);this.ew=new Xc(0,0);this.xN=1;this.qb=this.Se=null;this.Uy=[];this.Rd=this.jm=this.wa=this.Jb=this.pb=this.oa=this.Y=null;const {mQ:e,f0:f,g0:g}=SQ(this.F.slides());this.eL=f;this.ls=g;this.oz=e;this.Kb=this.H.xa.Hc;this.Rr=this.H.xa.controlPanel;this.Ri=this.Rr.zc;this.Ta=this.H.xa.Qc;this.rv=new P({G:"universal-layout",rf:!0});this.rv.fa("left-panel",this.Ta.Yd);N(this,this.rv, +0);this.Fa=new P({G:"universal-content-area"});N(this.rv,this.Fa);b=new P({G:"popups-layer"});Ft(b,O(this,"popups-layer"));N(this,b);this.Ja=new LP(b);this.Ja.setScale(1,1);this.AM=E(this,this.Ja.So());a.view();this.vb=this.WJ();N(this.Fa,this.vb);this.$c=bW(this);N(this.Fa,this.$c);this.gw=cW(this);this.Hk();this.Gc=this.yp();z(this,this.R.Le(),this.kA,this);z(this,this.B.Bc(),this.ke,this);z(this,this.Ta.lb,this.Yp,this);z(this,this.Ta.yc,this.Yp,this);z(this,this.Kb.yc,this.Yp,this);z(this,this.Rr.yc, +this.Yp,this);z(this,this.Ri.yc,this.Yp,this);a=new CM;z(this,a.pB,(h,l)=>this.resize(h,l))}sL(a){$V(this.vb,a)}m1(a){this.oa&&$S(this.oa,a)}YC(a){this.pb&&this.pb.YC(a)}So(){return this.AM}scale(){return 1}Yp(){this.Hk();Se(this,this.Gc);this.Gc=this.yp();this.rv.fa("left-panel",this.Ta.Yd);this.oa&&this.oa.ip(this.Y);this.Jb&&this.Jb.ip(this.Y);this.ub()}Hk(){this.Bz();this.CL();this.ov();sT(this);rT(this)}JX(){Se(this.Fa,this.pb);this.pb=null}YS(){return new vR({skinSettings:this.H,Ba:this.F,W:this.R.Xd(), +soundController:this.R.soundController(),nj:this.Ja,ia:this.I,Ia:this.K,Uj:this.Hg,Xw:this})}nz(){return jS({Ba:this.F,W:this.B,kD:null,kp:this.Ta})}Bz(){!this.Y&&this.nz()&&this.Ta.visible?this.gK():!this.Y||this.nz()&&this.Ta.visible||this.HN();this.Y&&this.rv.Ff(this.Y,1);this.gw.RR(this.Y)}HN(){Se(this.rv,this.Y);this.Y=null}gK(){this.Y=new hS(this.H,this.F,this.tc,this.I,this.K,!1);B(this,this.Y);dW(this);z(this,this.Y.showedStateChanged(),this.ub,this);this.gw.RR(this.Y)}CL(){this.iM()?this.Tr(): +this.jM()&&this.IN();this.oa&&this.Fa.Ff(this.oa,0)}iM(){return(this.ls||this.Kb.visible)&&!this.oa}jM(){return!(this.ls||this.Kb.visible)&&!!this.oa}IN(){Se(this.Fa,this.oa);this.oa=null}Tr(){this.oa=new dT({su:this.Kb,$j:this.H.outline,kp:this.Ta,Ba:this.F,W:this.tc,nj:this.Ja,ia:this.I,Ia:this.K,sidePanelController:this.Y});B(this,this.oa);z(this,this.oa.$L,this.Wp,this);z(this,this.oa.JK,this.w5,this)}Jy(){this.Jb=new sS({su:this.Kb,kp:this.Ta,Ia:this.K,sidePanelController:this.Y});B(this,this.Jb)}WJ(){return new aW({W:this.B, +ic:this.D,sidePanelController:this.Y,Ba:this.F,Lf:this.F.nd().Lf()})}yp(){if(this.pb){const a=new uS({W:this.B,B1:this.oa&&this.oa.displayObject(),K_:this.pb.displayObject()});B(this,a);return a}return null}ov(){!this.Rd&&tT(this);this.Ri.visible?(!this.wa&&this.Sr(),this.Rd.J(!1)):(this.wa&&this.MA(),this.Rd.J(!0));this.wa&&N(this.Fa,this.wa);this.Rd&&N(this.Fa,this.Rd)}MA(){Se(this.Fa,this.wa);this.jm=this.wa=null}Sr(){this.Ri.visible&&(this.wa=new KR({slides:this.F.slides(),settings:this.Ri,W:this.tc}), +this.jm=new NR({zc:this.wa,W:this.tc,Ba:this.F,settings:this.Ri}),B(this,this.wa),B(this,this.jm))}$a(a,b){super.$a(a,b);a&&b&&(a=(a=this.H.xa.Qc)&&a.visible&&a.Yd,a=this.Y&&this.Y.showed()&&a?this.Y.width():0,this.Ja.zl(12+a,this.width()-12,this.vb.height()),CP(this.Ja),a=0+(this.oa&&this.oa.visible()?this.oa.height():12),a+=this.pb&&this.pb.visible()?this.pb.height():12,b-=a,this.oa&&this.oa.ub(),this.pb&&(this.pb.BI(b-40),this.pb.ub()),this.Y&&(dW(this),this.Y.ub()),this.vb.ub())}aP(){this.Y.showed()? +L(this.Y,"margin-left",""):L(this.Y,"margin-left","-280px");L(this.Y,"margin-right","")}bP(){this.Y.showed()?L(this.Y,"margin-right",""):L(this.Y,"margin-right","-280px");L(this.Y,"margin-left","")}yY(){const a=this.H.xa.Hc;return a?a.visible&&a.pd:!1}UT(a){return(a=a.zg())&&a.Td()?a.Td():this.F.Td()}w5(){this.qb&&this.qb.FH()}Wp(a){"nothing"!=a&&(this.Se||this.cK(),this.qb||this.pL());this.Se&&this.Se.fa("tool",a);this.qb&&gO(this.qb,a)}cK(){this.Se=new P({G:"marker-tool-container"});this.Se.Cg(0); +this.R.displayObject().appendChild(this.Se.displayObject())}pL(){this.qb=new hO(this.R.wi().offsetWidth,this.R.wi().offsetHeight);this.Se.V(this.qb);this.qb.setScale(1);this.Uy[this.B.ma()]=this.qb;this.qq()}qq(){if(this.qb){this.qb.move(this.ew.x,this.ew.y);const a=this.R.scale();this.qb.setScale(a)}}kA(a,b,c,d){this.xN=a/this.R.width();this.ew=new Xc(c,d);this.qq()}ke(){var a=this.B.Oa(),b=this.B.fb();a||b?xn(this.R.wi(),"with-border")&&(a=this.R.wi(),nn(a,"with-border")):(a=this.R.wi(),mn(a,"with-border")); +CP(this.Ja);a=this.B.Oa();b=this.B.fb();const c=this.B.ob();this.wa&&this.wa.J(!a&&!b&&!c);this.Rd&&this.Rd.J(!this.wa||!this.wa.visible());this.xt();this.Se&&this.eO();this.pb&&(a=!!this.B.fb()||!!this.B.ob(),this.pb.fa("minimize",a));this.Bz();this.oa&&this.oa.ip(this.Y);this.Jb&&this.Jb.ip(this.Y)}eO(){let a="nothing";this.qb&&(a=this.qb.aO,gO(this.qb,"nothing"));const b=this.B.ma();Cd(this.Se.displayObject());this.qb=this.Uy[b];const c=this.B.Z(),d=z(this,c.Sb(),()=>{-1!=c.timestamp().Aa()&&(Ke(this, +d),this.qb&&this.Se&&this.Se.V(this.qb),this.Wp(a))},this);this.qq()}gh(a,b){b=a.ja(b).Ci();return this.H.outline.lj?uN(a)[b]:(b+1).toString()}xt(){if(this.$c.visible()){const a=this.B.$().pj();this.$c.la(a?a.text():"")}}h1(){this.$c.visible()||(this.$c.J(!0),this.xt(),this.Ay.C())}};function fW(a){const b=new xT(a.D(),a.Wa,a.I,a.K,a.ii);z(a,b.Xk,()=>a.Xk.C());z(a,b.Dk,()=>a.Dk.C());z(a,b.un,()=>a.un.C());return b} +class gW extends OM{constructor({fk:a,skinSettings:b,messages:c,ia:d,gj:e,Km:f}){super({fk:a,messages:c,gj:e});this.Wa=b;this.I=d;this.K=this.hK(f)}hK(a){return new zL(uj?a.Saa:a.oQ)}$S(a){if("normal"==a){if(uj){a=this.D();var b=this.Wa,c=this.I,d=this.K;try{window.isLearn()}catch(e){}a=new IV(a,b,c,d)}else a=Ii?new eW(this.D(),this.Wa,this.I,this.K):fW(this);this.Zk=a}else"accessible"==a&&(this.Zk=new tN({ic:this.fw,messages:this.fg,skinSettings:this.UJ()}));B(this,this.Zk)}UJ(){return(new yT(this.Wa)).create()}} +;var hW=class{constructor(){const a={colors:{A:"colors"},controlPanel:{A:"controlPanel",visible:{A:"visible"},showOutline:{A:"showOutline"},Jf:{A:"showPlayPause"},zc:{A:"progressBar",visible:{A:"visible"},enabled:{A:"enabled"},rr:{A:"showLabels"},mode:{A:"mode"}},ica:{A:"showRewind"},sr:{A:"showVolumeControl"},Bl:{A:"showCCButton"},jp:{A:"showSlideOnlyButton"},ou:{A:"showSlideNumbers"},Kf:{A:"showPrevButton"},qf:{A:"showNextButton"},Tg:{A:"navigationMode"},Zd:{A:"showPlaybackRateButton"}},Qc:{A:"sidePanel", +visible:{A:"visible"},Yd:{A:"showAtLeft"},pd:{A:"showLogo"},Wg:{A:"showPresenterInfo"},GI:{A:"showPresenterVideo"},te:{A:"showNotes"},showOutline:{A:"showOutline"}},Hc:{A:"titlePanel",Sq:{A:"courseTitleVisible"},Lt:{A:"buttonsAtLeft"},pd:{A:"showLogo"},buttons:{A:"buttons"},visible:{A:"visible"}},IQ:{A:"outlinePanel",Qo:{A:"numberEntries"},Mo:{A:"highlightViewedEntries"},lp:{A:"thumbnails"},search:{A:"search"},lj:{A:"multilevel"}},miniskinCustomizationEnabled:{A:"miniskinCustomizationEnabled"},fontFamily:{A:"fontFamily"}, +borderRadius:{A:"borderRadius"}},b=$F();YF(a,b);this.Sa=a}vQ(a={}){const b=new JN;a[this.Sa.colors]&&(b.colors=uL(a[this.Sa.colors]));if(a[this.Sa.Hc]){var c=a[this.Sa.Hc],d=b.xa.Hc,e=this.Sa.Hc;d.pd=c[e.pd];d.Sq=c[e.Sq];d.Lt=c[e.Lt];d.buttonsOrder=c[e.buttons];d.visible=c[e.visible]}a[this.Sa.Qc]&&(c=a[this.Sa.Qc],d=b.xa.Qc,e=this.Sa.Qc,d.visible=c[e.visible],d.Yd=c[e.Yd],d.pd=c[e.pd],d.Wg=c[e.Wg],d.GI=c[e.GI],d.te=c[e.te],d.showOutline=c[e.showOutline]);if(a[this.Sa.controlPanel]){c=a[this.Sa.controlPanel]; +e=b.xa.controlPanel;const f=this.Sa.controlPanel;e.visible=c[f.visible];e.showOutline=c[f.showOutline];e.Jf=c[f.Jf];e.Bl=c[f.Bl];e.Zd=c[f.Zd];e.jp=c[f.jp];e.Rx=c[f.ica];e.Tg=c[f.Tg];if(c[f.zc]){d=c[f.zc];const g=b.xa.controlPanel.zc,h=this.Sa.controlPanel.zc;g.visible=d[h.visible];g.enabled=d[h.enabled];g.rr=d[h.rr];g.mode=d[h.mode]}e.sr=!Ii&&c[f.sr];e.ou=c[f.ou];e.Kf=c[f.Kf];e.qf=c[f.qf]}a[this.Sa.IQ]&&(c=a[this.Sa.IQ],d=b.outline,e=this.Sa.IQ,d.Qo=c[e.Qo],d.Mo=c[e.Mo],d.lp=c[e.lp],d.search=c[e.search], +d.lj=c[e.lj]);void 0!==a[this.Sa.miniskinCustomizationEnabled]&&(b.miniskinCustomizationEnabled=a[this.Sa.miniskinCustomizationEnabled]);a[this.Sa.fontFamily]&&(b.fontFamily=a[this.Sa.fontFamily]);null!==a[this.Sa.borderRadius]&&(b.borderRadius=a[this.Sa.borderRadius]);return b}};function iW(a,b,c,d,e){return new Promise(f=>{const g=new eL;e&&g.Yv.addHandler(e);let h=null,l=null,n,m=!1,p,r;g.nX.addHandler(v=>{l=v;v=new hW;const y=l.settings();p=new jL(y.Gt().enabled());h=v.vQ(y.skin());h.accessibilityModeEnabled=p.wm();l.settings().CE=h;m=FN(Ii&&!h.xa.Qc.visible&&!h.xa.Hc.visible&&!h.xa.controlPanel.visible,l);v=h.colors;m?(n=new wL,r=new xL({Ba:l,RQ:d,colors:v,Km:n})):(n=new VM,r=new XM({Ba:l,RQ:d,colors:v,Km:n}));r.wP(p.mode())});g.Yv.addHandler(v=>{const y=jW(l),D=new EG(y), +I=v.view().W();I.Wo().Nw=h.xa.controlPanel.Zd;hL(p,I);const A=kW({fk:v,skinSettings:h,messages:y,ia:D,gj:c,hca:m,Km:n,wm:p.wm()});iL(p,A);const J=kL(p,A,c,y),T=U=>{v.Mm(U);if(A.Zk){Fd(A.Zk.displayObject());var X=A.ii;X.sE=null;X.Fh=null;Se(A,A.Zk);A.Zk=null}A.$S(U);X=A.Zk.displayObject();A.w8.appendChild(X);A.ii.nC();X=A.fw.view().W();const aa=X.ma();-1!=aa&&(X.Bc().C(aa),ok(X.Ud()),A.fw.z_().P_(),A.fw.Ar().P_(),X.Dr.C());"accessible"==U&&document.body.removeAttribute("style");A.gS.C(U);J&&("accessible"== +U?(J.setAttribute("title",y.PB_ACCESSIBLE_SKIN_ENABLE_NORMAL_MODE),J.Ox(-1),J.pf("hidden",!0)):(J.setAttribute("title",y.PB_ACCESSIBLE_SKIN_ENABLE_ACCESSIBILITY_MODE),J.Ox(0),J.displayObject().removeAttribute("aria-hidden")))};T(p.mode());p.pX.addHandler(U=>{r.wP(U);T(U)});f(new UM({fk:v,skinSettings:h,ia:D}))});g.Tq(a,b,d)})} +function jW(a){a=rc(a.settings().ia());a.PB_ACCESSIBLE_SLIDES=a.PB_TAB_OUTLINE_LABEL;a.PB_ACCESSIBLE_PRESENTER_INFO=a.PB_TITLE_PANEL_PRESENTER_INFO;a.PB_ACCESSIBLE_TITLE_PANEL_ATTACHMENTS=a.PB_TITLE_PANEL_ATTACHMENTS;return a}function kW(a){const b=a.fk,c=a.skinSettings,d=a.messages,e=a.ia,f=a.gj,g=a.wm;return a.hca?new TM({fk:b,messages:d,gj:f,wm:g,Km:a.Km}):new gW({fk:b,skinSettings:c,messages:d,ia:e,gj:f,Km:a.Km,wm:g})};q("PresentationPlayer.start",function(a,b,c,d,e){iW(a,aG(),b,c,d).then(f=>{XF(f,e)})});let Pj=()=>!1;function Te(a){a&&("function"===typeof a.Xc&&a.Xc(),a.disposed=!0)}function lW(a,b){Pj()&&(b?ia.console.error(a):ia.console.warn(a))}function ef(a,b){const c=a.stack||a.toString();0>String(c).indexOf(a.message)&&lW(a.message,b);lW(c,b)}window.onerror=function(...a){const [b,,,,c]=a;c?ef(c,!0):lW(b,!0);return!0};Ea=a=>{try{throw Error(a.message);}catch(b){ef(b,!1)}}; +ia.console||(window._log="",ia.console={log:function(a){window._log+="\n"+a},warn:function(a){window._log+="\nwarn: "+a},error:function(a){window._log+="\nerror: "+a}});})(); +/*! iScroll v5.2.0-snapshot ~ (c) 2008-2018 Matteo Spinelli ~ http://cubiq.org/license */ +!function(t,i,s){function e(s,e){this.wrapper="string"==typeof s?i.querySelector(s):s,this.scroller=this.wrapper.children[0],this.scrollerStyle=this.scroller.style,this.options={resizeScrollbars:!0,mouseWheelSpeed:20,snapThreshold:.334,disablePointer:!h.hasPointer,disableTouch:h.hasPointer||!h.hasTouch,disableMouse:h.hasPointer||h.hasTouch,startX:0,startY:0,scrollY:!0,directionLockThreshold:5,momentum:!0,onScrollHandler:Function.prototype,bounce:!0,bounceTime:600,bounceEasing:"",preventDefault:!0,preventDefaultException:{tagName:/^(A|INPUT|TEXTAREA|BUTTON|SELECT)$/},HWCompositing:!0,useTransition:!0,useTransform:!0,bindToWrapper:"undefined"==typeof t.onmousedown};for(var o in e)this.options[o]=e[o];this.translateZ=this.options.HWCompositing&&h.hasPerspective?" translateZ(0)":"",this.options.useTransition=h.hasTransition&&this.options.useTransition,this.options.useTransform=h.hasTransform&&this.options.useTransform,this.options.eventPassthrough=this.options.eventPassthrough===!0?"vertical":this.options.eventPassthrough,this.options.preventDefault=!this.options.eventPassthrough&&this.options.preventDefault,this.options.scrollY="vertical"!=this.options.eventPassthrough&&this.options.scrollY,this.options.scrollX="horizontal"!=this.options.eventPassthrough&&this.options.scrollX,this.options.freeScroll=this.options.freeScroll&&!this.options.eventPassthrough,this.options.directionLockThreshold=this.options.eventPassthrough?0:this.options.directionLockThreshold,this.options.bounceEasing="string"==typeof this.options.bounceEasing?h.ease[this.options.bounceEasing]||h.ease.circular:this.options.bounceEasing,this.options.resizePolling=void 0===this.options.resizePolling?60:this.options.resizePolling,this.options.tap===!0&&(this.options.tap="tap"),this.options.useTransition||this.options.useTransform||/relative|absolute/i.test(this.scrollerStyle.position)||(this.scrollerStyle.position="relative"),"scale"==this.options.shrinkScrollbars&&(this.options.useTransition=!1),this.options.invertWheelDirection=this.options.invertWheelDirection?-1:1,this.x=0,this.y=0,this.directionX=0,this.directionY=0,this._events={},this._init(),this.refresh(),this.scrollTo(this.options.startX,this.options.startY),this.enable()}function o(t,s,e){var o=i.createElement("div"),n=i.createElement("div");return e===!0&&(o.style.cssText="position:absolute;z-index:9999",n.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:absolute;background:rgba(0,0,0,0.5);border:1px solid rgba(255,255,255,0.9);border-radius:3px"),n.className="iScrollIndicator","h"==t?(e===!0&&(o.style.cssText+=";height:7px;left:2px;right:2px;bottom:0",n.style.height="100%"),o.className="iScrollHorizontalScrollbar"):(e===!0&&(o.style.cssText+=";width:7px;bottom:2px;top:2px;right:1px",n.style.width="100%"),o.className="iScrollVerticalScrollbar"),o.style.cssText+=";overflow:hidden",s||(o.style.pointerEvents="none"),o.appendChild(n),o}function n(s,e){this.wrapper="string"==typeof e.el?i.querySelector(e.el):e.el,this.wrapperStyle=this.wrapper.style,this.indicator=this.wrapper.children[0],this.indicatorStyle=this.indicator.style,this.scroller=s,this.options={listenX:!0,listenY:!0,interactive:!1,resize:!0,defaultScrollbars:!1,shrink:!1,fade:!1,speedRatioX:0,speedRatioY:0};for(var o in e)this.options[o]=e[o];if(this.sizeRatioX=1,this.sizeRatioY=1,this.maxPosX=0,this.maxPosY=0,this.options.interactive&&(this.options.disableTouch||(h.addEvent(this.indicator,"touchstart",this),h.addEvent(t,"touchend",this)),this.options.disablePointer||(h.addEvent(this.indicator,h.prefixPointerEvent("pointerdown"),this),h.addEvent(t,h.prefixPointerEvent("pointerup"),this)),this.options.disableMouse||(h.addEvent(this.indicator,"mousedown",this),h.addEvent(t,"mouseup",this))),this.options.fade){this.wrapperStyle[h.style.transform]=this.scroller.translateZ;var n=h.style.transitionDuration;if(!n)return;this.wrapperStyle[n]=h.isBadAndroid?"0.0001ms":"0ms";var a=this;h.isBadAndroid&&r(function(){"0.0001ms"===a.wrapperStyle[n]&&(a.wrapperStyle[n]="0s")}),this.wrapperStyle.opacity="0"}}var r=t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||t.msRequestAnimationFrame||function(i){t.setTimeout(i,1e3/60)},h=function(){function e(t){return r!==!1&&(""===r?t:r+t.charAt(0).toUpperCase()+t.substr(1))}var o={},n=i.createElement("div").style,r=function(){for(var t,i=["t","webkitT","MozT","msT","OT"],s=0,e=i.length;s0&&(h=n?n/2.5*(c/8):0,l=s.abs(t)+h,a=l/c),{destination:s.round(h),duration:a}};var h=e("transform");return o.extend(o,{hasTransform:h!==!1,hasPerspective:e("perspective")in n,hasTouch:"ontouchstart"in t,hasPointer:!(!t.PointerEvent&&!t.MSPointerEvent),hasTransition:e("transition")in n}),o.isBadAndroid=function(){var i=t.navigator.appVersion;if(/Android/.test(i)&&!/Chrome\/\d/.test(i)){var s=i.match(/Safari\/(\d+.\d)/);return!(s&&"object"==typeof s&&s.length>=2)||parseFloat(s[1])<535.19}return!1}(),o.extend(o.style={},{transform:h,transitionTimingFunction:e("transitionTimingFunction"),transitionDuration:e("transitionDuration"),transitionDelay:e("transitionDelay"),transformOrigin:e("transformOrigin"),touchAction:e("touchAction")}),o.hasClass=function(t,i){var s=new RegExp("(^|\\s)"+i+"(\\s|$)");return s.test(t.className)},o.addClass=function(t,i){if(!o.hasClass(t,i)){var s=t.className.split(" ");s.push(i),t.className=s.join(" ")}},o.removeClass=function(t,i){if(o.hasClass(t,i)){var s=new RegExp("(^|\\s)"+i+"(\\s|$)","g");t.className=t.className.replace(s," ")}},o.offset=function(t){for(var i=-t.offsetLeft,s=-t.offsetTop;t=t.offsetParent;)i-=t.offsetLeft,s-=t.offsetTop;return{left:i,top:s}},o.isHyperlink=function(t){if(!t)return!1;for(;t;){if("A"==t.nodeName.toLocaleUpperCase())return!0;t=t.parentNode}return!1},o.preventDefaultException=function(t,i){if(o.isHyperlink(t))return!0;for(var s in i)if(i[s].test(t[s]))return!0;return!1},o.extend(o.eventType={},{touchstart:1,touchmove:1,touchend:1,mousedown:2,mousemove:2,mouseup:2,pointerdown:3,pointermove:3,pointerup:3,MSPointerDown:3,MSPointerMove:3,MSPointerUp:3}),o.extend(o.ease={},{quadratic:{style:"cubic-bezier(0.25, 0.46, 0.45, 0.94)",fn:function(t){return t*(2-t)}},circular:{style:"cubic-bezier(0.1, 0.57, 0.1, 1)",fn:function(t){return s.sqrt(1- --t*t)}},back:{style:"cubic-bezier(0.175, 0.885, 0.32, 1.275)",fn:function(t){var i=4;return(t-=1)*t*((i+1)*t+i)+1}},bounce:{style:"",fn:function(t){return(t/=1)<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}},elastic:{style:"",fn:function(t){var i=.22,e=.4;return 0===t?0:1==t?1:e*s.pow(2,-10*t)*s.sin((t-i/4)*(2*s.PI)/i)+1}}}),o.tap=function(t,s){var e=i.createEvent("Event");e.initEvent(s,!0,!0),e.pageX=t.pageX,e.pageY=t.pageY,t.target.dispatchEvent(e)},o.click=function(s){var e,o=s.target;/(SELECT|INPUT|TEXTAREA)/i.test(o.tagName)||(e=i.createEvent(t.MouseEvent?"MouseEvents":"Event"),e.initEvent("click",!0,!0),e.view=s.view||t,e.detail=1,e.screenX=o.screenX||0,e.screenY=o.screenY||0,e.clientX=o.clientX||0,e.clientY=o.clientY||0,e.ctrlKey=!!s.ctrlKey,e.altKey=!!s.altKey,e.shiftKey=!!s.shiftKey,e.metaKey=!!s.metaKey,e.button=0,e.relatedTarget=null,e._constructed=!0,o.dispatchEvent(e))},o.getTouchAction=function(t,i){var s="none";return"vertical"===t?s="pan-y":"horizontal"===t&&(s="pan-x"),i&&"none"!=s&&(s+=" pinch-zoom"),s},o.getRect=function(t){if(t instanceof SVGElement){var i=t.getBoundingClientRect();return{top:i.top,left:i.left,width:i.width,height:i.height}}return{top:t.offsetTop,left:t.offsetLeft,width:t.offsetWidth,height:t.offsetHeight}},o}();e.prototype={version:"5.2.0-snapshot",_init:function(){this._initEvents(),(this.options.scrollbars||this.options.indicators)&&this._initIndicators(),this.options.mouseWheel&&this._initWheel(),this.options.snap&&this._initSnap(),this.options.keyBindings&&this._initKeys()},destroy:function(){this._initEvents(!0),clearTimeout(this.resizeTimeout),this.resizeTimeout=null,this._execEvent("destroy")},setScrollHeight:function(t){this.scrollHeight=t,this.refresh()},_transitionEnd:function(t){t.target==this.scroller&&this.isInTransition&&(this._transitionTime(),this.resetPosition(this.options.bounceTime)||(this.isInTransition=!1,this._execEvent("scrollEnd")))},_start:function(t){if(1!=h.eventType[t.type]){var i;if(i=t.which?t.button:t.button<2?0:4==t.button?1:2,0!==i)return}if(this.enabled&&(!this.initiated||h.eventType[t.type]===this.initiated)){!this.options.preventDefault||h.isBadAndroid||h.preventDefaultException(t.target,this.options.preventDefaultException)||t.preventDefault();var e,o=t.touches?t.touches[0]:t;this.initiated=h.eventType[t.type],this.moved=!1,this.distX=0,this.distY=0,this.directionX=0,this.directionY=0,this.directionLocked=0,this.startTime=h.getTime(),this.options.useTransition&&this.isInTransition?(this._transitionTime(),this.isInTransition=!1,e=this.getComputedPosition(),this._translate(s.round(e.x),s.round(e.y)),this._execEvent("scrollEnd")):!this.options.useTransition&&this.isAnimating&&(this.isAnimating=!1,this._execEvent("scrollEnd")),this.startX=this.x,this.startY=this.y,this.absStartX=this.x,this.absStartY=this.y,this.pointX=o.pageX,this.pointY=o.pageY,this._execEvent("beforeScrollStart")}},_move:function(t){if(this.enabled&&h.eventType[t.type]===this.initiated){this.options.preventDefault&&!h.preventDefaultException(t.target,this.options.preventDefaultException)&&t.preventDefault();var i,e,o,n,r=t.touches?t.touches[0]:t,a=r.pageX-this.pointX,l=r.pageY-this.pointY,c=h.getTime();if(this.pointX=r.pageX,this.pointY=r.pageY,this.distX+=a,this.distY+=l,o=s.abs(this.distX),n=s.abs(this.distY),!(c-this.endTime>300&&o<10&&n<10)){if(this.directionLocked||this.options.freeScroll||(o>n+this.options.directionLockThreshold?this.directionLocked="h":n>=o+this.options.directionLockThreshold?this.directionLocked="v":this.directionLocked="n"),"h"==this.directionLocked){if("vertical"==this.options.eventPassthrough)t.preventDefault();else if("horizontal"==this.options.eventPassthrough)return void(this.initiated=!1);l=0}else if("v"==this.directionLocked){if("horizontal"==this.options.eventPassthrough)t.preventDefault();else if("vertical"==this.options.eventPassthrough)return void(this.initiated=!1);a=0}a=this.hasHorizontalScroll?a:0,l=this.hasVerticalScroll?l:0,i=this.x+a,e=this.y+l,(i>0||i0?0:this.maxScrollX),(e>0||e0?0:this.maxScrollY),this.directionX=a>0?-1:a<0?1:0,this.directionY=l>0?-1:l<0?1:0,this.moved||this._execEvent("scrollStart"),this.moved=!0,this._translate(i,e),c-this.startTime>300&&(this.startTime=c,this.startX=this.x,this.startY=this.y)}}},_end:function(t){if(this.enabled&&h.eventType[t.type]===this.initiated){this.options.preventDefault&&!h.preventDefaultException(t.target,this.options.preventDefaultException)&&t.preventDefault();var i,e,o=(t.changedTouches?t.changedTouches[0]:t,h.getTime()-this.startTime),n=s.round(this.x),r=s.round(this.y),a=s.abs(n-this.startX),l=s.abs(r-this.startY),c=0,p="";if(this.isInTransition=0,this.initiated=0,this.endTime=h.getTime(),!this.resetPosition(this.options.bounceTime)){if(this.scrollTo(n,r),!this.moved)return this.options.tap&&h.tap(t,this.options.tap),this.options.click&&h.click(t),void this._execEvent("scrollCancel");if(this._events.flick&&o<200&&a<100&&l<100)return void this._execEvent("flick");if(this.options.momentum&&o<300&&(i=this.hasHorizontalScroll?h.momentum(this.x,this.startX,o,this.maxScrollX,this.options.bounce?this.wrapperWidth:0,this.options.deceleration):{destination:n,duration:0},e=this.hasVerticalScroll?h.momentum(this.y,this.startY,o,this.maxScrollY,this.options.bounce?this.wrapperHeight:0,this.options.deceleration):{destination:r,duration:0},n=i.destination,r=e.destination,c=s.max(i.duration,e.duration),this.isInTransition=1),this.options.snap){var d=this._nearestSnap(n,r);this.currentPage=d,c=this.options.snapSpeed||s.max(s.max(s.min(s.abs(n-d.x),1e3),s.min(s.abs(r-d.y),1e3)),300),n=d.x,r=d.y,this.directionX=0,this.directionY=0,p=this.options.bounceEasing}return n!=this.x||r!=this.y?((n>0||n0||r0?i=0:this.x0?s=0:this.y-1&&this._events[t].splice(s,1)}},_execEvent:function(t){if(this._events[t]){var i=0,s=this._events[t].length;if(s)for(;i0;var o=this.options.useTransition&&e.style;!s||o?(o&&(this._transitionTimingFunction(e.style),this._transitionTime(s)),this._translate(t,i)):this._animate(t,i,s,e.fn)},scrollToElement:function(t,i,e,o,n){if(t=t.nodeType?t:this.scroller.querySelector(t)){var r=h.offset(t);r.left-=this.wrapperOffset.left,r.top-=this.wrapperOffset.top;var a=h.getRect(t),l=h.getRect(this.wrapper);e===!0&&(e=s.round(a.width/2-l.width/2)),o===!0&&(o=s.round(a.height/2-l.height/2)),r.left-=e||0,r.top-=o||0,r.left=r.left>0?0:r.left0?0:r.top0?o--:i<0&&o++,e>0?n--:e<0&&n++,void this.goToPage(o,n);o=this.x+s.round(this.hasHorizontalScroll?i:0),n=this.y+s.round(this.hasVerticalScroll?e:0),this.directionX=i>0?-1:i<0?1:0,this.directionY=e>0?-1:e<0?1:0,o>0?o=0:o0?n=0:n-this.scrollerWidth;){for(this.pages[l]=[],t=0,n=0;n>-this.scrollerHeight;)this.pages[l][t]={x:s.max(p,this.maxScrollX),y:s.max(n,this.maxScrollY),width:d,height:u,cx:p-e,cy:n-o},n-=u,t++;p-=d,l++}else for(r=this.options.snap,t=r.length,i=-1;lthis.maxScrollX&&c++;this.goToPage(this.currentPage.pageX||0,this.currentPage.pageY||0,0),this.options.snapThreshold%1===0?(this.snapThresholdX=this.options.snapThreshold,this.snapThresholdY=this.options.snapThreshold):(this.snapThresholdX=s.round(this.pages[this.currentPage.pageX][this.currentPage.pageY].width*this.options.snapThreshold),this.snapThresholdY=s.round(this.pages[this.currentPage.pageX][this.currentPage.pageY].height*this.options.snapThreshold))}}),this.on("flick",function(){var t=this.options.snapSpeed||s.max(s.max(s.min(s.abs(this.x-this.startX),1e3),s.min(s.abs(this.y-this.startY),1e3)),300);this.goToPage(this.currentPage.pageX+this.directionX,this.currentPage.pageY+this.directionY,t)})},_nearestSnap:function(t,i){if(!this.pages.length)return{x:0,y:0,pageX:0,pageY:0};var e=0,o=this.pages.length,n=0;if(s.abs(t-this.absStartX)0?t=0:t0?i=0:i=this.pages[e][0].cx){t=this.pages[e][0].x;break}for(o=this.pages[e].length;n=this.pages[0][n].cy){i=this.pages[0][n].y;break}return e==this.currentPage.pageX&&(e+=this.directionX,e<0?e=0:e>=this.pages.length&&(e=this.pages.length-1),t=this.pages[e][0].x),n==this.currentPage.pageY&&(n+=this.directionY,n<0?n=0:n>=this.pages[0].length&&(n=this.pages[0].length-1),i=this.pages[0][n].y),{x:t,y:i,pageX:e,pageY:n}},goToPage:function(t,i,e,o){o=o||this.options.bounceEasing,t>=this.pages.length?t=this.pages.length-1:t<0&&(t=0),i>=this.pages[t].length?i=this.pages[t].length-1:i<0&&(i=0);var n=this.pages[t][i].x,r=this.pages[t][i].y;e=void 0===e?this.options.snapSpeed||s.max(s.max(s.min(s.abs(n-this.x),1e3),s.min(s.abs(r-this.y),1e3)),300):e,this.currentPage={x:n,y:r,pageX:t,pageY:i},this.scrollTo(n,r,e,o)},next:function(t,i){var s=this.currentPage.pageX,e=this.currentPage.pageY;s++,s>=this.pages.length&&this.hasVerticalScroll&&(s=0,e++),this.goToPage(s,e,t,i)},prev:function(t,i){var s=this.currentPage.pageX,e=this.currentPage.pageY;s--,s<0&&this.hasVerticalScroll&&(s=0,e--),this.goToPage(s,e,t,i)},_initKeys:function(i){var s,e={pageUp:33,pageDown:34,end:35,home:36,left:37,up:38,right:39,down:40};if("object"==typeof this.options.keyBindings)for(s in this.options.keyBindings)"string"==typeof this.options.keyBindings[s]&&(this.options.keyBindings[s]=this.options.keyBindings[s].toUpperCase().charCodeAt(0));else this.options.keyBindings={};for(s in e)this.options.keyBindings[s]=this.options.keyBindings[s]||e[s];h.addEvent(t,"keydown",this),this.on("destroy",function(){h.removeEvent(t,"keydown",this)})},_key:function(t){if(this.enabled){var i,e=this.options.snap,o=e?this.currentPage.pageX:this.x,n=e?this.currentPage.pageY:this.y,r=h.getTime(),a=this.keyTime||0,l=.25;switch(this.options.useTransition&&this.isInTransition&&(i=this.getComputedPosition(),this._translate(s.round(i.x),s.round(i.y)),this.isInTransition=!1),this.keyAcceleration=r-a<200?s.min(this.keyAcceleration+l,50):0,t.keyCode){case this.options.keyBindings.pageUp:this.hasHorizontalScroll&&!this.hasVerticalScroll?o+=e?1:this.wrapperWidth:n+=e?1:this.wrapperHeight;break;case this.options.keyBindings.pageDown:this.hasHorizontalScroll&&!this.hasVerticalScroll?o-=e?1:this.wrapperWidth:n-=e?1:this.wrapperHeight;break;case this.options.keyBindings.end:o=e?this.pages.length-1:this.maxScrollX,n=e?this.pages[0].length-1:this.maxScrollY;break;case this.options.keyBindings.home:o=0,n=0;break;case this.options.keyBindings.left:o+=e?-1:5+this.keyAcceleration>>0;break;case this.options.keyBindings.up:n+=e?1:5+this.keyAcceleration>>0;break;case this.options.keyBindings.right:o-=e?-1:5+this.keyAcceleration>>0;break;case this.options.keyBindings.down:n-=e?1:5+this.keyAcceleration>>0;break;default:return}if(e)return void this.goToPage(o,n);o>0?(o=0,this.keyAcceleration=0):o0?(n=0,this.keyAcceleration=0):n=p?(n.isAnimating=!1,n._translate(t,i),void(n.resetPosition(n.options.bounceTime)||n._execEvent("scrollEnd"))):(f=(f-c)/s,m=e(f),d=(t-a)*m+a,u=(i-l)*m+l,n._translate(d,u),void(n.isAnimating&&r(o)))}var n=this,a=this.x,l=this.y,c=h.getTime(),p=c+s;this.isAnimating=!0,o()},handleEvent:function(t){switch(t.type){case"touchstart":case"pointerdown":case"MSPointerDown":case"mousedown":t.defaultPrevented||this._start(t);break;case"touchmove":case"pointermove":case"MSPointerMove":case"mousemove":t.defaultPrevented||this._move(t);break;case"touchend":case"pointerup":case"MSPointerUp":case"mouseup":case"touchcancel":case"pointercancel":case"MSPointerCancel":case"mousecancel":this._end(t);break;case"orientationchange":case"resize":this._resize();break;case"transitionend":case"webkitTransitionEnd":case"oTransitionEnd":case"MSTransitionEnd":this._transitionEnd(t);break;case"wheel":case"DOMMouseScroll":case"mousewheel":this._wheel(t);break;case"keydown":this._key(t);break;case"click":this.enabled&&!t._constructed}}},n.prototype={handleEvent:function(t){switch(t.type){case"touchstart":case"pointerdown":case"MSPointerDown":case"mousedown":this._start(t);break;case"touchmove":case"pointermove":case"MSPointerMove":case"mousemove":this._move(t);break;case"touchend":case"pointerup":case"MSPointerUp":case"mouseup":case"touchcancel":case"pointercancel":case"MSPointerCancel":case"mousecancel":this._end(t)}},destroy:function(){this.options.fadeScrollbars&&(clearTimeout(this.fadeTimeout),this.fadeTimeout=null),this.options.interactive&&(h.removeEvent(this.indicator,"touchstart",this),h.removeEvent(this.indicator,h.prefixPointerEvent("pointerdown"),this),h.removeEvent(this.indicator,"mousedown",this),h.removeEvent(t,"touchmove",this),h.removeEvent(t,h.prefixPointerEvent("pointermove"),this),h.removeEvent(t,"mousemove",this),h.removeEvent(t,"touchend",this),h.removeEvent(t,h.prefixPointerEvent("pointerup"),this),h.removeEvent(t,"mouseup",this)),this.options.defaultScrollbars&&this.wrapper.parentNode&&this.wrapper.parentNode.removeChild(this.wrapper)},_start:function(i){var s=i.touches?i.touches[0]:i;i.preventDefault(),i.stopPropagation(),this.transitionTime(),this.initiated=!0,this.moved=!1,this.lastPointX=s.pageX,this.lastPointY=s.pageY,this.startTime=h.getTime(),this.options.disableTouch||h.addEvent(t,"touchmove",this),this.options.disablePointer||h.addEvent(t,h.prefixPointerEvent("pointermove"),this),this.options.disableMouse||h.addEvent(t,"mousemove",this),this.scroller._execEvent("beforeScrollStart")},_move:function(t){var i,s,e,o,n=t.touches?t.touches[0]:t;h.getTime();this.moved||this.scroller._execEvent("scrollStart"),this.moved=!0,i=n.pageX-this.lastPointX,this.lastPointX=n.pageX,s=n.pageY-this.lastPointY,this.lastPointY=n.pageY,e=this.x+i,o=this.y+s,this._pos(e,o),t.preventDefault(),t.stopPropagation()},_end:function(i){if(this.initiated){if(this.initiated=!1,i.preventDefault(),i.stopPropagation(),h.removeEvent(t,"touchmove",this),h.removeEvent(t,h.prefixPointerEvent("pointermove"),this),h.removeEvent(t,"mousemove",this),this.scroller.options.snap){var e=this.scroller._nearestSnap(this.scroller.x,this.scroller.y),o=this.options.snapSpeed||s.max(s.max(s.min(s.abs(this.scroller.x-e.x),1e3),s.min(s.abs(this.scroller.y-e.y),1e3)),300);this.scroller.x==e.x&&this.scroller.y==e.y||(this.scroller.directionX=0,this.scroller.directionY=0,this.scroller.currentPage=e,this.scroller.scrollTo(e.x,e.y,o,this.scroller.options.bounceEasing))}this.moved&&this.scroller._execEvent("scrollEnd")}},transitionTime:function(t){t=t||0;var i=h.style.transitionDuration;if(i&&(this.indicatorStyle[i]=t+"ms",!t&&h.isBadAndroid)){this.indicatorStyle[i]="0.0001ms";var s=this;r(function(){"0.0001ms"===s.indicatorStyle[i]&&(s.indicatorStyle[i]="0s")})}},transitionTimingFunction:function(t){this.indicatorStyle[h.style.transitionTimingFunction]=t},refresh:function(){this.transitionTime(),this.options.listenX&&!this.options.listenY?this.indicatorStyle.display=this.scroller.hasHorizontalScroll?"block":"none":this.options.listenY&&!this.options.listenX?this.indicatorStyle.display=this.scroller.hasVerticalScroll?"block":"none":this.indicatorStyle.display=this.scroller.hasHorizontalScroll||this.scroller.hasVerticalScroll?"block":"none",this.scroller.hasHorizontalScroll&&this.scroller.hasVerticalScroll?(h.addClass(this.wrapper,"iScrollBothScrollbars"),h.removeClass(this.wrapper,"iScrollLoneScrollbar"),this.options.defaultScrollbars&&this.options.customStyle&&(this.options.listenX?this.wrapper.style.right="8px":this.wrapper.style.bottom="8px")):(h.removeClass(this.wrapper,"iScrollBothScrollbars"),h.addClass(this.wrapper,"iScrollLoneScrollbar"),this.options.defaultScrollbars&&this.options.customStyle&&(this.options.listenX?this.wrapper.style.right="2px":this.wrapper.style.bottom="2px")),h.getRect(this.wrapper),this.options.listenX&&(this.wrapperWidth=this.wrapper.clientWidth,this.options.resize?(this.indicatorWidth=s.max(s.round(this.wrapperWidth*this.wrapperWidth/(this.scroller.scrollerWidth||this.wrapperWidth||1)),8),this.indicatorStyle.width=this.indicatorWidth+"px"):this.indicatorWidth=this.indicator.clientWidth,this.maxPosX=this.wrapperWidth-this.indicatorWidth,"clip"==this.options.shrink?(this.minBoundaryX=-this.indicatorWidth+8,this.maxBoundaryX=this.wrapperWidth-8):(this.minBoundaryX=0,this.maxBoundaryX=this.maxPosX),this.sizeRatioX=this.options.speedRatioX||this.scroller.maxScrollX&&this.maxPosX/this.scroller.maxScrollX),this.options.listenY&&(this.wrapperHeight=this.wrapper.clientHeight,this.options.resize?(this.indicatorHeight=s.max(s.round(this.wrapperHeight*this.wrapperHeight/(this.scroller.scrollerHeight||this.wrapperHeight||1)),8),this.indicatorStyle.height=this.indicatorHeight+"px"):this.indicatorHeight=this.indicator.clientHeight,this.maxPosY=this.wrapperHeight-this.indicatorHeight,"clip"==this.options.shrink?(this.minBoundaryY=-this.indicatorHeight+8,this.maxBoundaryY=this.wrapperHeight-8):(this.minBoundaryY=0,this.maxBoundaryY=this.maxPosY), +this.maxPosY=this.wrapperHeight-this.indicatorHeight,this.sizeRatioY=this.options.speedRatioY||this.scroller.maxScrollY&&this.maxPosY/this.scroller.maxScrollY),this.updatePosition()},updatePosition:function(){var t=this.options.listenX&&s.round(this.sizeRatioX*this.scroller.x)||0,i=this.options.listenY&&s.round(this.sizeRatioY*this.scroller.y)||0;this.options.ignoreBoundaries||(tthis.maxBoundaryX?"scale"==this.options.shrink?(this.width=s.max(this.indicatorWidth-(t-this.maxPosX),8),this.indicatorStyle.width=this.width+"px",t=this.maxPosX+this.indicatorWidth-this.width):t=this.maxBoundaryX:"scale"==this.options.shrink&&this.width!=this.indicatorWidth&&(this.width=this.indicatorWidth,this.indicatorStyle.width=this.width+"px"),ithis.maxBoundaryY?"scale"==this.options.shrink?(this.height=s.max(this.indicatorHeight-3*(i-this.maxPosY),8),this.indicatorStyle.height=this.height+"px",i=this.maxPosY+this.indicatorHeight-this.height):i=this.maxBoundaryY:"scale"==this.options.shrink&&this.height!=this.indicatorHeight&&(this.height=this.indicatorHeight,this.indicatorStyle.height=this.height+"px")),this.x=t,this.y=i,this.scroller.options.useTransform?this.indicatorStyle[h.style.transform]="translate("+t+"px,"+i+"px)"+this.scroller.translateZ:(this.indicatorStyle.left=t+"px",this.indicatorStyle.top=i+"px")},_pos:function(t,i){t<0?t=0:t>this.maxPosX&&(t=this.maxPosX),i<0?i=0:i>this.maxPosY&&(i=this.maxPosY),t=this.options.listenX?s.round(t/this.sizeRatioX):this.scroller.x,i=this.options.listenY?s.round(i/this.sizeRatioY):this.scroller.y,this.scroller.scrollTo(t,i)},fade:function(t,i){if(!i||this.visible){clearTimeout(this.fadeTimeout),this.fadeTimeout=null;var s=t?250:500,e=t?0:300;t=t?"1":"0",this.wrapperStyle[h.style.transitionDuration]=s+"ms",this.fadeTimeout=setTimeout(function(t){this.wrapperStyle.opacity=t,this.visible=+t}.bind(this,t),e)}}},e.utils=h,"undefined"!=typeof module&&module.exports?module.exports=e:"function"==typeof define&&define.amd?define(function(){return e}):t.IScroll=e}(window,document,Math);(function(){var r=Math,d=function(m){return m>>0},v=(/webkit/i).test(navigator.appVersion)?"webkit":(/firefox/i).test(navigator.userAgent)?"Moz":(/trident/i).test(navigator.userAgent)?"ms":"opera" in window?"O":"",w=(/android/gi).test(navigator.appVersion),i=(/iphone|ipad/gi).test(navigator.appVersion),c=(/playbook/gi).test(navigator.appVersion),n=(/hp-tablet/gi).test(navigator.appVersion),k=false,u="ontouchstart" in window&&!n,f=v+"Transform" in document.documentElement.style,g=i||c,o=(function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(m){return setTimeout(m,1)}})(),l=(function(){return window.cancelRequestAnimationFrame||window.webkitCancelAnimationFrame||window.webkitCancelRequestAnimationFrame||window.mozCancelRequestAnimationFrame||window.oCancelRequestAnimationFrame||window.msCancelRequestAnimationFrame||clearTimeout})(),h="onorientationchange" in window?"orientationchange":"resize",b=u?"touchstart":"mousedown",p=u?"touchmove":"mousemove",e=u?"touchend":"mouseup",t=u?"touchcancel":"mouseup",q=v=="Moz"?"DOMMouseScroll":"mousewheel",a="translate"+(k?"3d(":"("),j=k?",0)":")",s=function(y,m){var z=this,A=document,x;z.wrapper=typeof y=="object"?y:A.getElementById(y);z.wrapper.style.overflow="hidden";z.scroller=z.wrapper.children[0];z.options={hScroll:true,vScroll:true,x:0,y:0,bounce:true,bounceLock:false,momentum:true,lockDirection:true,useTransform:true,useTransition:false,topOffset:0,checkDOMChanges:false,handleClick:true,ignoreEmptyScroll:false,minThumbSize:16,hScrollbar:true,vScrollbar:true,fixedScrollbar:w,hideScrollbar:i,fadeScrollbar:i&&k,scrollbarClass:"",zoom:false,zoomMin:1,zoomMax:4,doubleTapZoom:2,wheelAction:"scroll",snap:false,snapThreshold:1,onRefresh:null,onBeforeScrollStart:function(B){B.preventDefault()},onScrollStart:null,onBeforeScrollMove:null,onScrollMove:null,onBeforeScrollEnd:null,onScrollEnd:null,onTouchEnd:null,onDestroy:null,onZoomStart:null,onZoom:null,onZoomEnd:null};for(x in m){z.options[x]=m[x]}z.x=z.options.x;z.y=z.options.y;z.options.useTransform=f?z.options.useTransform:false;z.options.hScrollbar=z.options.hScroll&&z.options.hScrollbar;z.options.vScrollbar=z.options.vScroll&&z.options.vScrollbar;z.options.zoom=z.options.useTransform&&z.options.zoom;z.options.useTransition=g&&z.options.useTransition;if(z.options.zoom&&w){a="translate(";j=")"}z.scroller.style[v+"TransformOrigin"]="0 0";if(z.options.useTransition){z.scroller.style[v+"TransitionProperty"]=z.options.useTransform?"-"+v.toLowerCase()+"-transform":"top left";z.scroller.style[v+"TransitionDuration"]="0";z.scroller.style[v+"TransitionTimingFunction"]="cubic-bezier(0.33,0.66,0.66,1)"}if(z.options.useTransform){z.scroller.style[v+"Transform"]=a+z.x+"px,"+z.y+"px"+j}else{z.scroller.style.cssText+=";position:absolute;top:"+z.y+"px;left:"+z.x+"px"}if(z.options.useTransition){z.options.fixedScrollbar=true}z.refresh();z._bind(h,window);z._bind(b);if(!u){z._bind("mouseout",z.wrapper);if(z.options.wheelAction!="none"){z._bind(q)}}if(z.options.checkDOMChanges){z.checkDOMTime=setInterval(function(){z._checkDOMChanges()},500)}};s.prototype={enabled:true,x:0,y:0,steps:[],scale:1,currPageX:0,currPageY:0,pagesX:[],pagesY:[],aniTime:null,wheelZoomCount:0,handleEvent:function(x){var m=this;switch(x.type){case b:if(!u&&x.button!==0){return}m._start(x);break;case p:m._move(x);break;case e:case t:m._end(x);break;case h:m._resize();break;case q:m._wheel(x);break;case"mouseout":m._mouseout(x);break;case"webkitTransitionEnd":m._transitionEnd(x);break}},_checkDOMChanges:function(){if(this.moved||this.zoomed||this.animating||(this.scrollerW==this.scroller.offsetWidth*this.scale&&this.scrollerH==this.scroller.offsetHeight*this.scale)){return}this.refresh()},_scrollbar:function(m){var y=this,z=document,x;if(!y[m+"Scrollbar"]){if(y[m+"ScrollbarWrapper"]){if(f){y[m+"ScrollbarIndicator"].style[v+"Transform"]=""}y[m+"ScrollbarWrapper"].parentNode.removeChild(y[m+"ScrollbarWrapper"]);y[m+"ScrollbarWrapper"]=null;y[m+"ScrollbarIndicator"]=null}return}if(!y[m+"ScrollbarWrapper"]){x=z.createElement("div");if(y.options.scrollbarClass){x.className=m+y.options.scrollbarClass}else{x.style.cssText="position:absolute;z-index:100;"+(m=="h"?"height:7px;bottom:1px;left:2px;right:"+(y.vScrollbar?"7":"2")+"px":"width:7px;bottom:"+(y.hScrollbar?"7":"2")+"px;top:2px;right:1px")}x.style.cssText+=";pointer-events:none;opacity:"+(y.options.hideScrollbar?"0":"1");y.wrapper.appendChild(x);y[m+"ScrollbarWrapper"]=x;x=z.createElement("div");x.id=m+"Thumb";x.className="thumb";if(!y.options.scrollbarClass){x.style.cssText="position:absolute;z-index:100;background:rgba(0,0,0,0.5);border:1px solid rgba(255,255,255,0.5);-"+v+"-background-clip:border-box;-"+v+"-box-sizing:content-box;"+(m=="h"?"height:100%":"width:100%")+";-"+v+"-border-radius:4px;border-radius:4px;"+(m=="h"?"bottom":"right")+":2px;"}x.style.cssText+=";pointer-events:none;-"+v+"-transform:"+a+"0,0"+j;if(y.options.useTransition){x.style.cssText+=";-"+v+"-transition-timing-function:cubic-bezier(0.33,0.66,0.66,1)"}y[m+"ScrollbarWrapper"].appendChild(x);y[m+"ScrollbarIndicator"]=x}if(m=="h"){y.hScrollbarSize=y.hScrollbarWrapper.clientWidth;y.hScrollbarIndicatorSize=r.max(d(y.hScrollbarSize*y.hScrollbarSize/y.scrollerW),y.options.minThumbSize);y.hScrollbarIndicator.style.width=y.hScrollbarIndicatorSize+"px";y.hScrollbarMaxScroll=y.hScrollbarSize-y.hScrollbarIndicatorSize;y.hScrollbarProp=y.hScrollbarMaxScroll/y.maxScrollX}else{y.vScrollbarSize=y.vScrollbarWrapper.clientHeight;y.vScrollbarIndicatorSize=r.max(d(y.vScrollbarSize*y.vScrollbarSize/y.scrollerH),y.options.minThumbSize);y.vScrollbarIndicator.style.height=y.vScrollbarIndicatorSize+"px";y.vScrollbarMaxScroll=y.vScrollbarSize-y.vScrollbarIndicatorSize;y.vScrollbarProp=y.vScrollbarMaxScroll/y.maxScrollY}y._scrollbarPos(m,true)},_resize:function(){var m=this;setTimeout(function(){m.refresh()},w?200:0)},_pos:function(m,z){this._posImpl(m,z);this._scrollbarPos("h");this._scrollbarPos("v")},_posImpl:function(m,z){if(this.zoomed){return}m=this.hScroll?m:0;z=this.vScroll?z:0;if(this.options.useTransform){this.scroller.style[v+"Transform"]=a+m+"px,"+z+"px"+j+" scale("+this.scale+")"}else{m=d(m);z=d(z);this.scroller.style.left=m+"px";this.scroller.style.top=z+"px"}this.x=m;this.y=z;if(this.options.onScrollMove){this.options.onScrollMove.call(this)}},_scrollbarPos:function(m,z){var y=this,A=m=="h"?y.x:y.y,x;if(!y[m+"Scrollbar"]){return}A=y[m+"ScrollbarProp"]*A;if(A<0){if(!y.options.fixedScrollbar){x=y[m+"ScrollbarIndicatorSize"]+d(A*3);if(x<8){x=8}y[m+"ScrollbarIndicator"].style[m=="h"?"width":"height"]=x+"px"}A=0}else{if(A>y[m+"ScrollbarMaxScroll"]){if(!y.options.fixedScrollbar){x=y[m+"ScrollbarIndicatorSize"]-d((A-y[m+"ScrollbarMaxScroll"])*3);if(x<8){x=8}y[m+"ScrollbarIndicator"].style[m=="h"?"width":"height"]=x+"px";A=y[m+"ScrollbarMaxScroll"]+(y[m+"ScrollbarIndicatorSize"]-x)}else{A=y[m+"ScrollbarMaxScroll"]}}}y[m+"ScrollbarWrapper"].style.opacity=z&&y.options.hideScrollbar?"0":"1";y[m+"ScrollbarIndicator"].style[v+"Transform"]=a+(m=="h"?A+"px,0":"0,"+A+"px")+j},_start:function(E){var D=this,z=u?E.touches[0]:E,A,m,F,C,B;if(!D.enabled){return}if(D.options.onBeforeScrollStart){D.options.onBeforeScrollStart.call(D,E)}if(D.options.useTransition||D.options.zoom){D._transitionTime(0)}D.moved=false;D.animating=false;D.zoomed=false;D.distX=0;D.distY=0;D.absDistX=0;D.absDistY=0;D.dirX=0;D.dirY=0;if(D.options.zoom&&u&&E.touches.length>1){C=r.abs(E.touches[0].pageX-E.touches[1].pageX);B=r.abs(E.touches[0].pageY-E.touches[1].pageY);D.touchesDistStart=r.sqrt(C*C+B*B);D.originX=r.abs(E.touches[0].pageX+E.touches[1].pageX-D.wrapperOffsetLeft*2)/2-D.x;D.originY=r.abs(E.touches[0].pageY+E.touches[1].pageY-D.wrapperOffsetTop*2)/2-D.y;if(D.options.onZoomStart){D.options.onZoomStart.call(D,E)}}if(D.options.momentum){if(D.options.useTransform){A=getComputedStyle(D.scroller,null)[v+"Transform"].replace(/[^0-9-.,]/g,"").split(",");m=A[4]*1;F=A[5]*1}else{m=getComputedStyle(D.scroller,null).left.replace(/[^0-9-]/g,"")*1;F=getComputedStyle(D.scroller,null).top.replace(/[^0-9-]/g,"")*1}if(m!=D.x||F!=D.y){if(D.options.useTransition){D._unbind("webkitTransitionEnd")}else{l(D.aniTime)}D.steps=[];D._pos(m,F)}}D.absStartX=D.x;D.absStartY=D.y;D.startX=D.x;D.startY=D.y;D.pointX=z.pageX;D.pointY=z.pageY;D.startTime=E.timeStamp||Date.now();if(D.options.onScrollStart){D.options.onScrollStart.call(D,E)}D._bind(p);D._bind(e);D._bind(t)},_move:function(E){var C=this,F=u?E.touches[0]:E,A=F.pageX-C.pointX,y=F.pageY-C.pointY,m=C.x+A,G=C.y+y,B,z,x,D=E.timeStamp||Date.now();if(C.options.ignoreEmptyScroll){if(C.maxScrollY==C.minScrollY){y=0}if(C.maxScrollX==0){A=0}}if(C.options.onBeforeScrollMove){C.options.onBeforeScrollMove.call(C,E)}if(C.options.zoom&&u&&E.touches.length>1){B=r.abs(E.touches[0].pageX-E.touches[1].pageX);z=r.abs(E.touches[0].pageY-E.touches[1].pageY);C.touchesDist=r.sqrt(B*B+z*z);C.zoomed=true;x=1/C.touchesDistStart*C.touchesDist*this.scale;if(xC.options.zoomMax){x=2*C.options.zoomMax*Math.pow(0.5,C.options.zoomMax/x)}}C.lastScale=x/this.scale;m=this.originX-this.originX*C.lastScale+this.x,G=this.originY-this.originY*C.lastScale+this.y;this.scroller.style[v+"Transform"]=a+m+"px,"+G+"px"+j+" scale("+x+")";if(C.options.onZoom){C.options.onZoom.call(C,E)}return}C.pointX=F.pageX;C.pointY=F.pageY;if(m>0||m=0||C.maxScrollX>=0?0:C.maxScrollX}if(G>C.minScrollY||G=C.minScrollY||C.maxScrollY>=0?C.minScrollY:C.maxScrollY}C.distX+=A;C.distY+=y;C.absDistX=r.abs(C.distX);C.absDistY=r.abs(C.distY);if(C.absDistX<6&&C.absDistY<6){return}if(C.options.lockDirection){if(C.absDistX>C.absDistY+5){G=C.y;y=0}else{if(C.absDistY>C.absDistX+5){m=C.x;A=0}}}C.moved=true;C._pos(m,G);C.dirX=A>0?-1:A<0?1:0;C.dirY=y>0?-1:y<0?1:0;if(D-C.startTime>300){C.startTime=D;C.startX=C.x;C.startY=C.y}if(C.options.onScrollMove){C.options.onScrollMove.call(C,E)}},_end:function(E){if(u&&E.touches.length!=0){return}var C=this,K=u?E.changedTouches[0]:E,F,J,y={dist:0,time:0},m={dist:0,time:0},B=(E.timeStamp||Date.now())-C.startTime,G=C.x,D=C.y,I,H,x,A,z;C._unbind(p);C._unbind(e);C._unbind(t);if(C.options.onBeforeScrollEnd){C.options.onBeforeScrollEnd.call(C,E)}if(C.zoomed){z=C.scale*C.lastScale;z=Math.max(C.options.zoomMin,z);z=Math.min(C.options.zoomMax,z);C.lastScale=z/C.scale;C.scale=z;C.x=C.originX-C.originX*C.lastScale+C.x;C.y=C.originY-C.originY*C.lastScale+C.y;C.scroller.style[v+"TransitionDuration"]="200ms";C.scroller.style[v+"Transform"]=a+C.x+"px,"+C.y+"px"+j+" scale("+C.scale+")";C.zoomed=false;C.refresh();if(C.options.onZoomEnd){C.options.onZoomEnd.call(C,E)}return}if(!C.moved){if(u){if(C.doubleTapTimer&&C.options.zoom){clearTimeout(C.doubleTapTimer);C.doubleTapTimer=null;if(C.options.onZoomStart){C.options.onZoomStart.call(C,E)}C.zoom(C.pointX,C.pointY,C.scale==1?C.options.doubleTapZoom:1);if(C.options.onZoomEnd){setTimeout(function(){C.options.onZoomEnd.call(C,E)},200)}}else{if(this.options.handleClick){C.doubleTapTimer=setTimeout(function(){C.doubleTapTimer=null;F=K.target;while(F.nodeType!=1){F=F.parentNode}if(F.tagName!="SELECT"&&F.tagName!="INPUT"&&F.tagName!="TEXTAREA"){J=document.createEvent("MouseEvents");J.initMouseEvent("click",true,true,E.view,1,K.screenX,K.screenY,K.clientX,K.clientY,E.ctrlKey,E.altKey,E.shiftKey,E.metaKey,0,null);J._fake=true;F.dispatchEvent(J)}},C.options.zoom?250:0)}}}C._resetPos(200);if(C.options.onTouchEnd){C.options.onTouchEnd.call(C,E)}return}if(B<300&&C.options.momentum){y=G?C._momentum(G-C.startX,B,-C.x,C.scrollerW-C.wrapperW+C.x,C.options.bounce?C.wrapperW:0):y;m=D?C._momentum(D-C.startY,B,-C.y,(C.maxScrollY<0?C.scrollerH-C.wrapperH+C.y-C.minScrollY:0),C.options.bounce?C.wrapperH:0):m;G=C.x+y.dist;D=C.y+m.dist;if((C.x>0&&G>0)||(C.xC.minScrollY&&D>C.minScrollY)||(C.y=0?0:m.x=m.minScrollY||m.maxScrollY>0?m.minScrollY:m.yz.options.zoomMax){C=z.options.zoomMax}if(C!=z.scale){if(!z.wheelZoomCount&&z.options.onZoomStart){z.options.onZoomStart.call(z,B)}z.wheelZoomCount++;z.zoom(B.pageX,B.pageY,C,400);setTimeout(function(){z.wheelZoomCount--;if(!z.wheelZoomCount&&z.options.onZoomEnd){z.options.onZoomEnd.call(z,B)}},400)}return}x=z.x+A;m=z.y+y;if(x>0){x=0}else{if(xz.minScrollY){m=z.minScrollY}else{if(m=A+B.time){C._pos(B.x,B.y);C.animating=false;if(C.options.onAnimationEnd){C.options.onAnimationEnd.call(C)}C._startAni();return}D=(D-A)/B.time-1;z=r.sqrt(1-D*D);F=(B.x-x)*z+x;E=(B.y-m)*z+m;C._pos(F,E);if(C.animating){C.aniTime=o(y)}};y()},_transitionTime:function(m){m+="ms";this.scroller.style[v+"TransitionDuration"]=m;if(this.hScrollbar){this.hScrollbarIndicator.style[v+"TransitionDuration"]=m}if(this.vScrollbar){this.vScrollbarIndicator.style[v+"TransitionDuration"]=m}},_momentum:function(D,x,B,m,F){var C=0.0006,y=r.abs(D)/x,z=(y*y)/(2*C),E=0,A=0;if(D>0&&z>B){A=F/(6/(z/y*C));B=B+A;y=y*B/z;z=B}else{if(D<0&&z>m){A=F/(6/(z/y*C));m=m+A;y=y*m/z;z=m}}z=z*(D<0?-1:1);E=y/C;return{dist:z,time:d(E)}},_offset:function(m){var y=-m.offsetLeft,x=-m.offsetTop;while(m=m.offsetParent){y-=m.offsetLeft;x-=m.offsetTop}if(m!=this.wrapper){y*=this.scale;x*=this.scale}return{left:y,top:x}},_snap:function(G,F){var D=this,C,B,E,A,z,m;E=D.pagesX.length-1;for(C=0,B=D.pagesX.length;C=D.pagesX[C]){E=C;break}}if(E==D.currPageX&&E>0&&D.dirX<0){E--}G=D.pagesX[E];z=r.abs(G-D.pagesX[D.currPageX]);z=z?r.abs(D.x-G)/z*500:0;D.currPageX=E;E=D.pagesY.length-1;for(C=0;C=D.pagesY[C]){E=C;break}}if(E==D.currPageY&&E>0&&D.dirY<0){E--}F=D.pagesY[E];m=r.abs(F-D.pagesY[D.currPageY]);m=m?r.abs(D.y-F)/m*500:0;D.currPageY=E;A=200;return{x:G,y:F,time:A}},_bind:function(y,x,m){(x||this.scroller).addEventListener(y,this,!!m)},_unbind:function(y,x,m){(x||this.scroller).removeEventListener(y,this,!!m)},resize:function(x,m){if(x){this.wrapperWidth=x}if(m){this.wrapperHeight=m}this.refresh()},destroy:function(){var m=this;m.scroller.style[v+"Transform"]="";m.hScrollbar=false;m.vScrollbar=false;m._scrollbar("h");m._scrollbar("v");m._unbind(h,window);m._unbind(b);m._unbind(p);m._unbind(e);m._unbind(t);if(!m.options.hasTouch){m._unbind("mouseout",m.wrapper);m._unbind(q)}if(m.options.useTransition){m._unbind("webkitTransitionEnd")}if(m.options.checkDOMChanges){clearInterval(m.checkDOMTime)}if(m.options.onDestroy){m.options.onDestroy.call(m)}},refresh:function(){var B=this,y,A,x,z,D=0,C=0;if(B.scaleB.wrapperH);B.hScrollbar=B.hScroll&&B.options.hScrollbar&&B.maxScrollX<0;B.vScrollbar=B.vScroll&&B.options.vScrollbar&&B.maxScrollY<0;y=B._offset(B.wrapper);B.wrapperOffsetLeft=-y.left;B.wrapperOffsetTop=-y.top;var E=document.defaultView.getComputedStyle(B.scroller,null);B.wrapperOffsetTop+=parseInt(E["padding-top"]);if(typeof B.options.snap=="string"){B.pagesX=[];B.pagesY=[];z=B.scroller.querySelectorAll(B.options.snap);for(A=0,x=z.length;A=B.maxScrollX){B.pagesX[C]=D;D=D-B.wrapperW;C++}if(B.maxScrollX%B.wrapperW){B.pagesX[B.pagesX.length]=B.maxScrollX-B.pagesX[B.pagesX.length-1]+B.pagesX[B.pagesX.length-1]}D=0;C=0;B.pagesY=[];while(D>=B.maxScrollY){B.pagesY[C]=D;D=D-B.wrapperH;C++}if(B.maxScrollY%B.wrapperH){B.pagesY[B.pagesY.length]=B.maxScrollY-B.pagesY[B.pagesY.length-1]+B.pagesY[B.pagesY.length-1]}}}B._scrollbar("h");B._scrollbar("v");if(!B.zoomed){B._resetPos(200)}},scrollTo:function(m,F,E,D){var C=this,B=m,A,z;if(!E){C._posImpl(m,F);return}C.stop();if(!B.length){B=[{x:m,y:F,time:E,relative:D}]}for(A=0,z=B.length;A=x.y-x.wrapper.clientHeight){return}else{if(z.topx.x-x.wrapper.clientWidth){return}else{if(z.left0?0:z.leftx.minScrollY?x.minScrollY:z.topB.pagesX.length-1?B.pagesX.length-1:A;z=z<0?0:z>B.pagesY.length-1?B.pagesY.length-1:z;B.currPageX=A;B.currPageY=z;m=B.pagesX[A];D=B.pagesY[z]}else{m=-B.wrapperW*A;D=-B.wrapperH*z;if(m0?0:z.xz.minScrollY?z.minScrollY:z.yi;i++){var r=g[i],f=r.toUpperCase()+"_"+t;if(f in a)return"@-"+r.toLowerCase()+"-"+n}return!1};l.atRule=m;var g=l._config.usePrefixes?" -webkit- -moz- -o- -ms- ".split(" "):["",""];l._prefixes=g,o(),a(r),delete l.addTest,delete l.addAsyncTest;for(var v=0;v255?255:this.r,this.g=this.g<0||isNaN(this.g)?0:this.g>255?255:this.g,this.b=this.b<0||isNaN(this.b)?0:this.b>255?255:this.b,this.toRGB=function(){return"rgb("+this.r+", "+this.g+", "+this.b+")"},this.toHex=function(){var e=this.r.toString(16),t=this.g.toString(16),n=this.b.toString(16);return e.length==1&&(e="0"+e),t.length==1&&(t="0"+t),n.length==1&&(n="0"+n),"#"+e+t+n},this.getHelpXML=function(){var e=new Array;for(var r=0;r "+f.toRGB()+" -> "+f.toHex());a.appendChild(l),a.appendChild(c),u.appendChild(a)}catch(h){}return u}}canvg=function(){function t(){var e={};return e.FRAMERATE=30,e.MAX_VIRTUAL_PIXELS=3e4,e.init=function(t){e.Definitions={},e.Styles={},e.Animations=[],e.Images=[],e.ctx=t,e.ViewPort=new function(){this.viewPorts=[],this.Clear=function(){this.viewPorts=[]},this.SetCurrent=function(e,t){this.viewPorts.push({width:e,height:t})},this.RemoveCurrent=function(){this.viewPorts.pop()},this.Current=function(){return this.viewPorts[this.viewPorts.length-1]},this.width=function(){return this.Current().width},this.height=function(){return this.Current().height},this.ComputeSize=function(e){return e!=null&&typeof e=="number"?e:e=="x"?this.width():e=="y"?this.height():Math.sqrt(Math.pow(this.width(),2)+Math.pow(this.height(),2))/Math.sqrt(2)}}},e.init(),e.ImagesLoaded=function(){for(var t=0;t]*>/,"");var n=new ActiveXObject("Microsoft.XMLDOM");return n.async="false",n.loadXML(e),n},e.Property=function(t,n){this.name=t,this.value=n,this.hasValue=function(){return this.value!=null&&this.value!==""},this.numValue=function(){if(!this.hasValue())return 0;var e=parseFloat(this.value);return(this.value+"").match(/%$/)&&(e/=100),e},this.valueOrDefault=function(e){return this.hasValue()?this.value:e},this.numValueOrDefault=function(e){return this.hasValue()?this.numValue():e};var r=this;this.Color={addOpacity:function(t){var n=r.value;if(t!=null&&t!=""){var i=new RGBColor_(r.value);i.ok&&(n="rgba("+i.r+", "+i.g+", "+i.b+", "+t+")")}return new e.Property(r.name,n)}},this.Definition={getDefinition:function(){var t=r.value.replace(/^(url\()?#([^\)]+)\)?$/,"$2");return e.Definitions[t]},isUrl:function(){return r.value.indexOf("url(")==0},getFillStyle:function(t){var n=this.getDefinition();return n!=null&&n.createGradient?n.createGradient(e.ctx,t):n!=null&&n.createPattern?n.createPattern(e.ctx,t):null}},this.Length={DPI:function(e){return 96},EM:function(t){var n=12,r=new e.Property("fontSize",e.Font.Parse(e.ctx.font).fontSize);return r.hasValue()&&(n=r.Length.toPixels(t)),n},toPixels:function(t){if(!r.hasValue())return 0;var n=r.value+"";return n.match(/em$/)?r.numValue()*this.EM(t):n.match(/ex$/)?r.numValue()*this.EM(t)/2:n.match(/px$/)?r.numValue():n.match(/pt$/)?r.numValue()*1.25:n.match(/pc$/)?r.numValue()*15:n.match(/cm$/)?r.numValue()*this.DPI(t)/2.54:n.match(/mm$/)?r.numValue()*this.DPI(t)/25.4:n.match(/in$/)?r.numValue()*this.DPI(t):n.match(/%$/)?r.numValue()*e.ViewPort.ComputeSize(t):r.numValue()}},this.Time={toMilliseconds:function(){if(!r.hasValue())return 0;var e=r.value+"";return e.match(/s$/)?r.numValue()*1e3:e.match(/ms$/)?r.numValue():r.numValue()}},this.Angle={toRadians:function(){if(!r.hasValue())return 0;var e=r.value+"";return e.match(/deg$/)?r.numValue()*(Math.PI/180):e.match(/grad$/)?r.numValue()*(Math.PI/200):e.match(/rad$/)?r.numValue():r.numValue()*(Math.PI/180)}}},e.Font=new function(){this.Styles=["normal","italic","oblique","inherit"],this.Variants=["normal","small-caps","inherit"],this.Weights=["normal","bold","bolder","lighter","100","200","300","400","500","600","700","800","900","inherit"],this.CreateFont=function(t,n,r,i,s,o){var u=o!=null?this.Parse(o):this.CreateFont("","","","","",e.ctx.font);return{fontFamily:s||u.fontFamily,fontSize:i||u.fontSize,fontStyle:t||u.fontStyle,fontWeight:r||u.fontWeight,fontVariant:n||u.fontVariant,toString:function(){return[this.fontStyle,this.fontVariant,this.fontWeight,this.fontSize,this.fontFamily].join(" ")}}};var t=this;this.Parse=function(n){var r={},i=e.trim(e.compressSpaces(n||"")).split(" "),s={fontSize:!1,fontStyle:!1,fontWeight:!1,fontVariant:!1},o="";for(var u=0;uthis.x2&&(this.x2=e)}if(t!=null){if(isNaN(this.y1)||isNaN(this.y2))this.y1=t,this.y2=t;tthis.y2&&(this.y2=t)}},this.addX=function(e){this.addPoint(e,null)},this.addY=function(e){this.addPoint(null,e)},this.addBoundingBox=function(e){this.addPoint(e.x1,e.y1),this.addPoint(e.x2,e.y2)},this.addQuadraticCurve=function(e,t,n,r,i,s){var o=e+2/3*(n-e),u=t+2/3*(r-t),a=o+1/3*(i-e),f=u+1/3*(s-t);this.addBezierCurve(e,t,o,a,u,f,i,s)},this.addBezierCurve=function(e,t,n,r,i,s,o,u){var a=[e,t],f=[n,r],l=[i,s],c=[o,u];this.addPoint(a[0],a[1]),this.addPoint(c[0],c[1]);for(var h=0;h<=1;h++){var p=function(e){return Math.pow(1-e,3)*a[h]+3*Math.pow(1-e,2)*e*f[h]+3*(1-e)*Math.pow(e,2)*l[h]+Math.pow(e,3)*c[h]},d=6*a[h]-12*f[h]+6*l[h],v=-3*a[h]+9*f[h]-9*l[h]+3*c[h],m=3*f[h]-3*a[h];if(v==0){if(d==0)continue;var g=-m/d;0=this.tokens.length-1},this.isCommandOrEnd=function(){return this.isEnd()?!0:this.tokens[this.i+1].match(/^[A-Za-z]$/)!=null},this.isRelativeCommand=function(){return this.command==this.command.toLowerCase()},this.getToken=function(){return this.i=this.i+1,this.tokens[this.i]},this.getScalar=function(){return parseFloat(this.getToken())},this.nextCommand=function(){this.previousCommand=this.command,this.command=this.getToken()},this.getPoint=function(){var t=new e.Point(this.getScalar(),this.getScalar());return this.makeAbsolute(t)},this.getAsControlPoint=function(){var e=this.getPoint();return this.control=e,e},this.getAsCurrentPoint=function(){var e=this.getPoint();return this.current=e,e},this.getReflectedControlPoint=function(){if(this.previousCommand.toLowerCase()!="c"&&this.previousCommand.toLowerCase()!="s")return this.current;var t=new e.Point(2*this.current.x-this.control.x,2*this.current.y-this.control.y);return t},this.makeAbsolute=function(e){return this.isRelativeCommand()&&(e.x=this.current.x+e.x,e.y=this.current.y+e.y),e},this.addMarker=function(e,t,n){n!=null&&this.angles.length>0&&this.angles[this.angles.length-1]==null&&(this.angles[this.angles.length-1]=this.points[this.points.length-1].angleTo(n)),this.addMarkerAngle(e,t==null?null:t.angleTo(e))},this.addMarkerAngle=function(e,t){this.points.push(e),this.angles.push(t)},this.getMarkerPoints=function(){return this.points},this.getMarkerAngles=function(){for(var e=0;e1&&(c*=Math.sqrt(g),h*=Math.sqrt(g));var y=(d==v?-1:1)*Math.sqrt((Math.pow(c,2)*Math.pow(h,2)-Math.pow(c,2)*Math.pow(m.y,2)-Math.pow(h,2)*Math.pow(m.x,2))/(Math.pow(c,2)*Math.pow(m.y,2)+Math.pow(h,2)*Math.pow(m.x,2)));isNaN(y)&&(y=0);var b=new e.Point(y*c*m.y/h,y*-h*m.x/c),w=new e.Point((u.x+l.x)/2+Math.cos(p)*b.x-Math.sin(p)*b.y,(u.y+l.y)/2+Math.sin(p)*b.x+Math.cos(p)*b.y),E=function(e){return Math.sqrt(Math.pow(e[0],2)+Math.pow(e[1],2))},S=function(e,t){return(e[0]*t[0]+e[1]*t[1])/(E(e)*E(t))},x=function(e,t){return(e[0]*t[1]=1&&(k=0),v==0&&k>0&&(k-=2*Math.PI),v==1&&k<0&&(k+=2*Math.PI);var L=new e.Point(w.x-c*Math.cos((T+k)/2),w.y-h*Math.sin((T+k)/2));n.addMarkerAngle(L,(T+k)/2+(v==0?1:-1)*Math.PI/2),n.addMarkerAngle(l,k+(v==0?1:-1)*Math.PI/2),r.addPoint(l.x,l.y);if(t!=null){S=c>h?c:h;var A=c>h?1:c/h,O=c>h?h/c:1;t.translate(w.x,w.y),t.rotate(p),t.scale(A,O),t.arc(0,0,S,T,T+k,1-v),t.scale(1/A,1/O),t.rotate(-p),t.translate(-w.x,-w.y)}}break;case"Z":t!=null&&t.closePath(),n.current=n.start}}return r},this.getMarkers=function(){var e=this.PathParser.getMarkerPoints(),t=this.PathParser.getMarkerAngles(),n=[];for(var r=0;rthis.maxDuration){if(this.attribute("repeatCount").value!="indefinite")return this.attribute("fill").valueOrDefault("remove")=="remove"&&!this.removed?(this.removed=!0,this.getProperty().value=this.initialValue,!0):!1;this.duration=0}this.duration=this.duration+e;var t=!1;if(this.begin0&&t[n-1]!=" "&&n0&&t[n-1]!=" "&&(n==t.length-1||t[n+1]==" ")&&(s="initial"),typeof e.glyphs[r]!="undefined"&&(i=e.glyphs[r][s],i==null&&e.glyphs[r].type=="glyph"&&(i=e.glyphs[r]))}else i=e.glyphs[r];return i==null&&(i=e.missingGlyph),i},this.renderChildren=function(t){var n=this.parent.style("font-family").Definition.getDefinition();if(n!=null){var r=this.parent.style("font-size").numValueOrDefault(e.Font.Parse(e.ctx.font).fontSize),i=this.parent.style("font-style").valueOrDefault(e.Font.Parse(e.ctx.font).fontStyle),s=this.getText();n.isRTL&&(s=s.split("").reverse().join(""));var o=e.ToNumberArray(this.parent.attribute("dx").value);for(var u=0;u0?t.childNodes[0].value:t.text,this.getText=function(){return this.text}},e.Element.tspan.prototype=new e.Element.TextElementBase,e.Element.tspan=e.Element.tspan,e.Element.tref=function(t){this.base=e.Element.TextElementBase,this.base(t),this.getText=function(){var e=this.attribute("xlink:href").Definition.getDefinition();if(e!=null)return e.children[0].getText()}},e.Element.tref.prototype=new e.Element.TextElementBase,e.Element.tref=e.Element.tref,e.Element.a=function(t){this.base=e.Element.TextElementBase,this.base(t),this.hasText=!0;for(var n=0;n0){var y=m[g].indexOf("url"),b=m[g].indexOf(")",y),w=m[g].substr(y+5,b-y-6),E=e.parseXml(e.ajax(w)),S=E.getElementsByTagName("font");for(var x=0;x1?n-1:0),i=1;i=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var u=a,c=t["padding-"+u];r[u]=e(c)}return r}function i(t,e,n,r){return{width:t,height:e,top:n,right:t+r,bottom:e+n,left:r}}function o(t){var e=t.getBBox();return i(e.width,e.height,0,0)}function s(){var n=t(document.documentElement),r=e(n.width),o=e(n.height);return i(r,o,0,0)}function a(o){var s=o.clientWidth,a=o.clientHeight;if(!s&&!a)return O;var u=t(o),c=r(u),h=c.left+c.right,f=c.top+c.bottom,l=e(u.width),p=e(u.height);"border-box"===u.boxSizing&&(Math.round(l+h)!==s&&(l-=n(u,"left","right")+h),Math.round(p+f)!==a&&(p-=n(u,"top","bottom")+f));var d=Math.round(l+h)-s,_=Math.round(p+f)-a;return 1!==Math.abs(d)&&(l-=d),1!==Math.abs(_)&&(p-=_),i(l,p,c.top,c.left)}function u(t){return t instanceof window.SVGElement}function c(t){return t===document.documentElement}function h(t){return u(t)?o(t):c(t)?s():a(t)}function f(t,e){for(var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r={configurable:n.configurable||!1,writable:n.writable||!1,enumerable:n.enumerable||!1},i=Object.keys(e),o=Array.isArray(i),s=0,i=o?i:i[Symbol.iterator]();;){var a;if(o){if(s>=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var u=a;r.value=e[u],Object.defineProperty(t,u,r)}return t}var l=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},p=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:null,n=this.__entries__,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;t.call(e,s[1],s[0])}},p(e,[{key:"size",get:function(){return this.__entries__.length}}]),e}(v)}(),w=function(){return"function"==typeof window.requestAnimationFrame?window.requestAnimationFrame:function(t){return setTimeout(function(){return t(Date.now())},1e3/60)}}(),g=function(t){function e(){t.apply.apply(t,s),s=null,a&&(r.apply.apply(r,a),a=null)}function n(){o?w(e):e()}function r(){for(var t=arguments.length,e=Array(t),r=0;r1&&void 0!==arguments[1]?arguments[1]:0,o=arguments.length>2&&void 0!==arguments[2]&&arguments[2],s=null,a=null;return r},m="function"==typeof window.MutationObserver,E=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];l(this,t),this._isCycleContinuous=!m||e,this._listenersEnabled=!1,this._mutationsObserver=null,this._observers=[],this.refresh=g(this.refresh.bind(this),30,!0),this._continuousUpdateHandler=g(this.refresh,70)}return t.prototype.connect=function(t){this.isConnected(t)||this._observers.push(t),this._listenersEnabled||this._addListeners()},t.prototype.disconnect=function(t){var e=this._observers,n=e.indexOf(t);~n&&e.splice(n,1),!e.length&&this._listenersEnabled&&this._removeListeners()},t.prototype.isConnected=function(t){return!!~this._observers.indexOf(t)},t.prototype.refresh=function(){var t=this._updateObservers();t?this.refresh():this._isCycleContinuous&&this._listenersEnabled&&this._continuousUpdateHandler()},t.prototype._updateObservers=function(){for(var t=!1,e=this._observers,n=Array.isArray(e),r=0,e=n?e:e[Symbol.iterator]();;){var i;if(n){if(r>=e.length)break;i=e[r++]}else{if(r=e.next(),r.done)break;i=r.value}var o=i;o.gatherActive(),o.hasActive()&&(t=!0,o.broadcastActive())}return t},t.prototype._addListeners=function(){this._listenersEnabled||(window.addEventListener("resize",this.refresh),m&&(this._mutationsObserver=new MutationObserver(this.refresh),this._mutationsObserver.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})),this._listenersEnabled=!0,this._isCycleContinuous&&this.refresh())},t.prototype._removeListeners=function(){this._listenersEnabled&&(window.removeEventListener("resize",this.refresh),this._mutationsObserver&&this._mutationsObserver.disconnect(),this._mutationsObserver=null,this._listenersEnabled=!1)},p(t,[{key:"continuousUpdates",get:function(){return this._isCycleContinuous},set:function(t){m&&(this._isCycleContinuous=t,this._listenersEnabled&&t&&this.refresh())}}]),t}(),O=i(0,0,0,0),A=function(){function t(e){l(this,t),this.target=e,this._contentRect=O,this.broadcastWidth=0,this.broadcastHeight=0}return t.prototype.broadcastRect=function(){var t=this._contentRect;return this.broadcastWidth=t.width,this.broadcastHeight=t.height,t},t.prototype.isActive=function(){var t=h(this.target);return this._contentRect=t,t.width!==this.broadcastWidth||t.height!==this.broadcastHeight},t}(),ResizeObserverEntry=function ResizeObserverEntry(t,e){l(this,ResizeObserverEntry);var n=window.ClientRect||Object,r=Object.create(n.prototype);f(r,e,{configurable:!0}),f(this,{target:t,contentRect:r},{configurable:!0})},k=function(){function ResizeObserver(t,e,n){if(l(this,ResizeObserver),"function"!=typeof t)throw new TypeError("The callback provided as parameter 1 is not a function.");this._callback=t,this._targets=new y,this._activeTargets=[],this._controller=e,this._publicObserver=n}return ResizeObserver.prototype.observe=function(t){if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");if(!(t instanceof Element))throw new TypeError('parameter 1 is not of type "Element".');var e=this._targets;e.has(t)||(e.set(t,new A(t)),this._controller.isConnected(this)||this._controller.connect(this),this._controller.refresh())},ResizeObserver.prototype.unobserve=function(t){if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");if(!(t instanceof Element))throw new TypeError('parameter 1 is not of type "Element".');var e=this._targets;e.has(t)&&(e.delete(t),e.size||this.disconnect())},ResizeObserver.prototype.disconnect=function(){this.clearActive(),this._targets.clear(),this._controller.disconnect(this)},ResizeObserver.prototype.gatherActive=function(){this.clearActive();var t=this._activeTargets;this._targets.forEach(function(e){e.isActive()&&t.push(e)})},ResizeObserver.prototype.broadcastActive=function(){if(this.hasActive()){var t=this._publicObserver,e=this._activeTargets.map(function(t){return new ResizeObserverEntry(t.target,t.broadcastRect())});this.clearActive(),this._callback.call(t,e,t)}},ResizeObserver.prototype.clearActive=function(){this._activeTargets.splice(0)},ResizeObserver.prototype.hasActive=function(){return!!this._activeTargets.length},ResizeObserver}(),T=new E,C=new v,ResizeObserver=function(){function ResizeObserver(t){if(l(this,ResizeObserver),!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var e=new k(t,T,this);C.set(this,e)}return p(ResizeObserver,null,[{key:"continuousUpdates",get:function(){return T.continuousUpdates},set:function(t){if("boolean"!=typeof t)throw new TypeError('type of "continuousUpdates" value must be boolean.');T.continuousUpdates=t}}]),ResizeObserver}();["observe","unobserve","disconnect"].forEach(function(t){ResizeObserver.prototype[t]=function(){var e;return(e=C.get(this))[t].apply(e,arguments)}}),"function"!=typeof window.ResizeObserver&&Object.defineProperty(window,"ResizeObserver",{value:ResizeObserver,writable:!0,configurable:!0});var x=window.ResizeObserver;return x}); + diff --git a/experiment/simulation/EE4/iframes/data/slide1.css b/experiment/simulation/EE4/iframes/data/slide1.css new file mode 100644 index 0000000..2a8c4a3 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide1.css @@ -0,0 +1 @@ +#spr1_1b1b03c1 {clip:rect(0px,960px,540px,0px);}#txt0_1b1b03c1 {font-family:fnt4; font-size:35px; line-height:41px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt1_1b1b03c1 {font-family:fnt4; font-size:35px; line-height:41px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt2_1b1b03c1 {font-family:fnt4; font-size:35px; line-height:41px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt3_1b1b03c1 {font-family:fnt4; font-size:35px; line-height:41px; font-weight:bold; color:#ffffff;}#txt4_1b1b03c1,#txt8_1b1b03c1,#txt10_1b1b03c1,#txt16_1b1b03c1,#txt20_1b1b03c1,#txt22_1b1b03c1 {font-family:fnt5; font-size:25px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt5_1b1b03c1,#txt9_1b1b03c1,#txt11_1b1b03c1,#txt17_1b1b03c1,#txt21_1b1b03c1,#txt23_1b1b03c1 {font-family:fnt5; font-size:25px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt6_1b1b03c1,#txt12_1b1b03c1,#txt14_1b1b03c1,#txt18_1b1b03c1,#txt24_1b1b03c1,#txt26_1b1b03c1 {font-family:fnt5; font-size:25px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt7_1b1b03c1,#txt13_1b1b03c1,#txt15_1b1b03c1,#txt19_1b1b03c1,#txt25_1b1b03c1,#txt27_1b1b03c1 {font-family:fnt5; font-size:25px; line-height:29px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide1.js b/experiment/simulation/EE4/iframes/data/slide1.js new file mode 100644 index 0000000..f1536e3 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide1.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(0, '
    OVERVIEW
    OVERVIEW
    OVERVIEW
    OVERVIEW
    FUNDAMENTALS
    FUNDAMENTALS
    FUNDAMENTALS
    FUNDAMENTALS
    INSTRUMENTS
    INSTRUMENTS
    REQUIRED
    REQUIRED
    INSTRUMENTS
    INSTRUMENTS
    REQUIRED
    REQUIRED
    PROCEDURE
    PROCEDURE
    PROCEDURE
    PROCEDURE
    VIRTUAL
    VIRTUAL
    EXPERIMENT
    EXPERIMENT
    VIRTUAL
    VIRTUAL
    EXPERIMENT
    EXPERIMENT
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide10.css b/experiment/simulation/EE4/iframes/data/slide10.css new file mode 100644 index 0000000..36dde16 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide10.css @@ -0,0 +1 @@ +#spr1_1b1b2207 {clip:rect(0px,960px,540px,0px);}#spr3_1b1b2207,#spr4_1b1b2207,#spr5_1b1b2207,#spr6_1b1b2207,#spr7_1b1b2207,#svg1_1b1b2207,#spr8_1b1b2207,#spr9_1b1b2207,#spr12_1b1b2207,#spr13_1b1b2207,#spr18_1b1b2207,#spr19_1b1b2207 {display:none;}#svg0_1b1b2207 {-webkit-transform-origin:6.256px 6.256px; -moz-transform-origin:6.256px 6.256px; -o-transform-origin:6.256px 6.256px; -ms-transform-origin:6.256px 6.256px; transform-origin:6.256px 6.256px; display:none;}#txt0_1b1b2207,#txt1_1b1b2207,#txt4_1b1b2207,#txt5_1b1b2207,#txt6_1b1b2207,#txt7_1b1b2207,#txt8_1b1b2207,#txt9_1b1b2207,#txt10_1b1b2207,#txt11_1b1b2207,#txt12_1b1b2207,#txt13_1b1b2207,#txt14_1b1b2207,#txt15_1b1b2207,#txt16_1b1b2207,#txt17_1b1b2207,#txt18_1b1b2207,#txt19_1b1b2207,#txt20_1b1b2207,#txt21_1b1b2207,#txt22_1b1b2207,#txt23_1b1b2207,#txt24_1b1b2207,#txt25_1b1b2207,#txt26_1b1b2207,#txt27_1b1b2207,#txt28_1b1b2207,#txt54_1b1b2207,#txt55_1b1b2207,#txt56_1b1b2207,#txt57_1b1b2207,#txt58_1b1b2207,#txt59_1b1b2207,#txt66_1b1b2207,#txt68_1b1b2207 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt2_1b1b2207,#txt3_1b1b2207,#txt60_1b1b2207,#txt61_1b1b2207,#txt62_1b1b2207,#txt63_1b1b2207,#txt64_1b1b2207,#txt65_1b1b2207 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#ffffff;}#txt29_1b1b2207,#txt30_1b1b2207,#txt31_1b1b2207,#txt32_1b1b2207,#txt33_1b1b2207,#txt34_1b1b2207,#txt35_1b1b2207,#txt36_1b1b2207,#txt37_1b1b2207,#txt38_1b1b2207,#txt39_1b1b2207,#txt40_1b1b2207,#txt41_1b1b2207,#txt42_1b1b2207,#txt43_1b1b2207,#txt44_1b1b2207,#txt45_1b1b2207,#txt46_1b1b2207,#txt47_1b1b2207,#txt48_1b1b2207,#txt49_1b1b2207,#txt50_1b1b2207,#txt51_1b1b2207,#txt52_1b1b2207,#txt53_1b1b2207 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#9900cc;}#spr10_1b1b2207 {-webkit-transform:matrix(0.450672,-0.892689,0.892689,0.450672,0,0); -o-transform:matrix(0.450672,-0.892689,0.892689,0.450672,0,0); -ms-transform:matrix(0.450672,-0.892689,0.892689,0.450672,0,0); -moz-transform:matrix(0.450672,-0.892689,0.892689,0.450672,0,0); transform:matrix(0.450672,-0.892689,0.892689,0.450672,0,0); display:none;}#spr11_1b1b2207 {-webkit-transform:matrix(0.450672,0.89269,-0.89269,0.450672,0,0); -o-transform:matrix(0.450672,0.89269,-0.89269,0.450672,0,0); -ms-transform:matrix(0.450672,0.89269,-0.89269,0.450672,0,0); -moz-transform:matrix(0.450672,0.89269,-0.89269,0.450672,0,0); transform:matrix(0.450672,0.89269,-0.89269,0.450672,0,0);}#svg2_1b1b2207 {-webkit-transform-origin:1.201px 0.812px; -moz-transform-origin:1.201px 0.812px; -o-transform-origin:1.201px 0.812px; -ms-transform-origin:1.201px 0.812px; transform-origin:1.201px 0.812px;}#txt67_1b1b2207 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#005800;}#txt69_1b1b2207 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#254f2f;}#txt70_1b1b2207 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt71_1b1b2207 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt72_1b1b2207 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt73_1b1b2207 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide10.js b/experiment/simulation/EE4/iframes/data/slide10.js new file mode 100644 index 0000000..7865d2c --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide10.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(9, '
    1)  MOSFET
    1)  MOSFET
    It  is  switching  device  mounted
    on  heat  sink  to  extract  the
    heat  generated  within  the  device
    and  transfer  it  to  the  ambient
    environment.
    It  is  switching  device  mounted
    on  heat  sink  to  extract  the
    heat  generated  within  the  device
    and  transfer  it  to  the  ambient
    environment.
    2)  DC  source  (Adjustable  voltage  magnitude):
    2)  DC  source  (Adjustable  voltage  magnitude):
    It is able to provide a range of DC voltages.
    It is able to provide a range of DC voltages.
     Heat sink
     Heat sink
    Instruments Required
    Instruments Required
    Instruments Required
    Instruments Required
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide11.css b/experiment/simulation/EE4/iframes/data/slide11.css new file mode 100644 index 0000000..2bc6dd9 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide11.css @@ -0,0 +1 @@ +#spr1_1b1b24a7 {clip:rect(0px,960px,540px,0px);}#svg0_1b1b24a7 {-webkit-transform-origin:6.256px 6.256px; -moz-transform-origin:6.256px 6.256px; -o-transform-origin:6.256px 6.256px; -ms-transform-origin:6.256px 6.256px; transform-origin:6.256px 6.256px; display:none;}#spr3_1b1b24a7,#spr4_1b1b24a7,#spr5_1b1b24a7,#spr6_1b1b24a7,#spr8_1b1b24a7,#spr12_1b1b24a7,#spr16_1b1b24a7,#spr17_1b1b24a7,#spr18_1b1b24a7,#spr19_1b1b24a7,#spr20_1b1b24a7 {display:none;}#txt0_1b1b24a7,#txt1_1b1b24a7,#txt2_1b1b24a7,#txt6_1b1b24a7,#txt7_1b1b24a7,#txt8_1b1b24a7,#txt9_1b1b24a7,#txt10_1b1b24a7,#txt11_1b1b24a7,#txt12_1b1b24a7,#txt13_1b1b24a7,#txt14_1b1b24a7,#txt15_1b1b24a7,#txt16_1b1b24a7,#txt17_1b1b24a7,#txt18_1b1b24a7,#txt19_1b1b24a7,#txt20_1b1b24a7,#txt21_1b1b24a7,#txt22_1b1b24a7,#txt23_1b1b24a7,#txt24_1b1b24a7,#txt25_1b1b24a7,#txt26_1b1b24a7,#txt27_1b1b24a7,#txt28_1b1b24a7,#txt29_1b1b24a7,#txt54_1b1b24a7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt3_1b1b24a7,#txt4_1b1b24a7,#txt5_1b1b24a7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#ffffff;}#txt30_1b1b24a7,#txt31_1b1b24a7,#txt32_1b1b24a7,#txt33_1b1b24a7,#txt34_1b1b24a7,#txt35_1b1b24a7,#txt36_1b1b24a7,#txt37_1b1b24a7,#txt38_1b1b24a7,#txt39_1b1b24a7,#txt40_1b1b24a7,#txt41_1b1b24a7,#txt42_1b1b24a7,#txt43_1b1b24a7,#txt44_1b1b24a7,#txt45_1b1b24a7,#txt46_1b1b24a7,#txt47_1b1b24a7,#txt48_1b1b24a7,#txt49_1b1b24a7,#txt50_1b1b24a7,#txt51_1b1b24a7,#txt52_1b1b24a7,#txt53_1b1b24a7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#0000ff;}#spr7_1b1b24a7 {-webkit-transform:matrix(0.935179,-0.354175,0.354175,0.935179,0,0); -o-transform:matrix(0.935179,-0.354175,0.354175,0.935179,0,0); -ms-transform:matrix(0.935179,-0.354175,0.354175,0.935179,0,0); -moz-transform:matrix(0.935179,-0.354175,0.354175,0.935179,0,0); transform:matrix(0.935179,-0.354175,0.354175,0.935179,0,0); display:none;}#spr11_1b1b24a7 {-webkit-transform:matrix(0.89332,0.44942,-0.44942,0.89332,0,0); -o-transform:matrix(0.89332,0.44942,-0.44942,0.89332,0,0); -ms-transform:matrix(0.89332,0.44942,-0.44942,0.89332,0,0); -moz-transform:matrix(0.89332,0.44942,-0.44942,0.89332,0,0); transform:matrix(0.89332,0.44942,-0.44942,0.89332,0,0);}#spr14_1b1b24a7 {-webkit-transform:matrix(0.681674,0.731656,-0.731656,0.681674,0,0); -o-transform:matrix(0.681674,0.731656,-0.731656,0.681674,0,0); -ms-transform:matrix(0.681674,0.731656,-0.731656,0.681674,0,0); -moz-transform:matrix(0.681674,0.731656,-0.731656,0.681674,0,0); transform:matrix(0.681674,0.731656,-0.731656,0.681674,0,0);}#spr15_1b1b24a7 {-webkit-transform:matrix(0.952111,0.305752,-0.305752,0.952111,0,0); -o-transform:matrix(0.952111,0.305752,-0.305752,0.952111,0,0); -ms-transform:matrix(0.952111,0.305752,-0.305752,0.952111,0,0); -moz-transform:matrix(0.952111,0.305752,-0.305752,0.952111,0,0); transform:matrix(0.952111,0.305752,-0.305752,0.952111,0,0);}#txt55_1b1b24a7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#0000e2;}#txt56_1b1b24a7 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt57_1b1b24a7 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt58_1b1b24a7 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt59_1b1b24a7 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide11.js b/experiment/simulation/EE4/iframes/data/slide11.js new file mode 100644 index 0000000..772770f --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide11.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(10, '
    3)  LOAD-R   (Resistive)
    3)  LOAD-R   (Resistive)
    The  experiment  is  done  at  fixed  load
    or  resistance  (R).  rheostat  is
    generally  used  which  can  provide  a
    range  of  resistance  values.
    The  experiment  is  done  at  fixed  load
    or  resistance  (R).  rheostat  is
    generally  used  which  can  provide  a
    range  of  resistance  values.
    Multi-meter
    Multi-meter
    Instruments Required
    Instruments Required
    Instruments Required
    Instruments Required
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide12.css b/experiment/simulation/EE4/iframes/data/slide12.css new file mode 100644 index 0000000..d9c95ef --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide12.css @@ -0,0 +1 @@ +#spr1_1b1b27f3 {clip:rect(0px,960px,540px,0px);}#svg0_1b1b27f3 {-webkit-transform-origin:6.256px 6.256px; -moz-transform-origin:6.256px 6.256px; -o-transform-origin:6.256px 6.256px; -ms-transform-origin:6.256px 6.256px; transform-origin:6.256px 6.256px; display:none;}#spr3_1b1b27f3,#spr4_1b1b27f3,#spr5_1b1b27f3,#spr6_1b1b27f3,#spr7_1b1b27f3,#spr8_1b1b27f3,#spr9_1b1b27f3,#spr14_1b1b27f3,#spr19_1b1b27f3,#spr20_1b1b27f3 {display:none;}#txt0_1b1b27f3,#txt1_1b1b27f3,#txt2_1b1b27f3,#txt3_1b1b27f3,#txt9_1b1b27f3,#txt10_1b1b27f3,#txt11_1b1b27f3,#txt12_1b1b27f3,#txt13_1b1b27f3,#txt14_1b1b27f3,#txt15_1b1b27f3,#txt16_1b1b27f3,#txt17_1b1b27f3,#txt18_1b1b27f3,#txt19_1b1b27f3,#txt33_1b1b27f3,#txt34_1b1b27f3,#txt35_1b1b27f3,#txt36_1b1b27f3,#txt37_1b1b27f3,#txt38_1b1b27f3,#txt39_1b1b27f3,#txt40_1b1b27f3,#txt41_1b1b27f3,#txt42_1b1b27f3,#txt43_1b1b27f3,#txt44_1b1b27f3,#txt58_1b1b27f3,#txt60_1b1b27f3,#txt61_1b1b27f3,#txt62_1b1b27f3,#txt63_1b1b27f3,#txt64_1b1b27f3,#txt65_1b1b27f3,#txt66_1b1b27f3,#txt74_1b1b27f3,#txt75_1b1b27f3,#txt76_1b1b27f3,#txt77_1b1b27f3,#txt78_1b1b27f3,#txt79_1b1b27f3,#txt80_1b1b27f3,#txt81_1b1b27f3,#txt82_1b1b27f3,#txt83_1b1b27f3,#txt84_1b1b27f3 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt4_1b1b27f3,#txt5_1b1b27f3,#txt6_1b1b27f3,#txt7_1b1b27f3,#txt67_1b1b27f3,#txt68_1b1b27f3,#txt69_1b1b27f3,#txt70_1b1b27f3,#txt71_1b1b27f3,#txt72_1b1b27f3,#txt73_1b1b27f3 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#ffffff;}#txt8_1b1b27f3,#txt32_1b1b27f3 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt20_1b1b27f3 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#0000ff;}#txt21_1b1b27f3,#txt22_1b1b27f3,#txt23_1b1b27f3,#txt24_1b1b27f3,#txt25_1b1b27f3,#txt26_1b1b27f3,#txt27_1b1b27f3,#txt28_1b1b27f3,#txt29_1b1b27f3,#txt30_1b1b27f3,#txt31_1b1b27f3 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#0000ff;}#txt45_1b1b27f3 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#9900cc;}#txt46_1b1b27f3,#txt47_1b1b27f3,#txt48_1b1b27f3,#txt49_1b1b27f3,#txt50_1b1b27f3,#txt51_1b1b27f3,#txt52_1b1b27f3,#txt53_1b1b27f3,#txt54_1b1b27f3,#txt55_1b1b27f3,#txt56_1b1b27f3,#txt57_1b1b27f3 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#9900cc;}#txt59_1b1b27f3 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#3333ff;}#svg1_1b1b27f3 {-webkit-transform-origin:11.172px 11.172px; -moz-transform-origin:11.172px 11.172px; -o-transform-origin:11.172px 11.172px; -ms-transform-origin:11.172px 11.172px; transform-origin:11.172px 11.172px; display:none;}#txt85_1b1b27f3,#txt86_1b1b27f3,#txt87_1b1b27f3,#txt88_1b1b27f3,#txt89_1b1b27f3,#txt90_1b1b27f3,#txt91_1b1b27f3,#txt92_1b1b27f3,#txt93_1b1b27f3,#txt94_1b1b27f3,#txt95_1b1b27f3 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#9a0000;}#svg2_1b1b27f3,#svg3_1b1b27f3 {pointer-events:none;}#txt96_1b1b27f3,#txt97_1b1b27f3 {font-family:fnt5; font-size:25px; line-height:29px; font-weight:bold; color:#0000ff;}#txt98_1b1b27f3 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt99_1b1b27f3 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt100_1b1b27f3 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt101_1b1b27f3 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide12.js b/experiment/simulation/EE4/iframes/data/slide12.js new file mode 100644 index 0000000..52d43b4 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide12.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(11, '
    4)  VOLTMETER  and  AMMETER
    4)  VOLTMETER  and  AMMETER
    I. Analog  “Voltmeter”  displayed  here
    measures  the  voltage  appearing
    across  two  terminals.
    I. Analog  “Voltmeter”  displayed  here
    measures  the  voltage  appearing
    across  two  terminals.
    II. Analog  “Ammeter”  displayed  here
    measures  the  current  flowing  through
    the  component,  closed-circuit.
    II. Analog  “Ammeter”  displayed  here
    measures  the  current  flowing  through
    the  component,  closed-circuit.
     
     
    5)  DIGITAL  STORAGE  OSCILLOSCOPE  (DSO)
    with  PROBES
    5)  DIGITAL  STORAGE  OSCILLOSCOPE  (DSO)
    with  PROBES
    “DSO”  is  used  to  observe  the
    instantaneous  current  and
    voltage  waveforms.
    “DSO”  is  used  to  observe  the
    instantaneous  current  and
    voltage  waveforms.
    v
    A
    Instruments Required
    Instruments Required
    Instruments Required
    Instruments Required
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide13.css b/experiment/simulation/EE4/iframes/data/slide13.css new file mode 100644 index 0000000..959351f --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide13.css @@ -0,0 +1 @@ +#spr1_1b1b2b8d {clip:rect(0px,960px,540px,0px);}#svg0_1b1b2b8d,#svg1_1b1b2b8d {-webkit-transform-origin:6.256px 6.256px; -moz-transform-origin:6.256px 6.256px; -o-transform-origin:6.256px 6.256px; -ms-transform-origin:6.256px 6.256px; transform-origin:6.256px 6.256px; display:none;}#spr3_1b1b2b8d,#spr4_1b1b2b8d,#spr5_1b1b2b8d,#spr6_1b1b2b8d,#spr10_1b1b2b8d,#spr11_1b1b2b8d {display:none;}#txt0_1b1b2b8d,#txt1_1b1b2b8d,#txt2_1b1b2b8d,#txt6_1b1b2b8d,#txt7_1b1b2b8d,#txt8_1b1b2b8d,#txt16_1b1b2b8d,#txt17_1b1b2b8d,#txt18_1b1b2b8d,#txt19_1b1b2b8d,#txt20_1b1b2b8d,#txt21_1b1b2b8d,#txt22_1b1b2b8d,#txt23_1b1b2b8d,#txt24_1b1b2b8d,#txt25_1b1b2b8d,#txt26_1b1b2b8d,#txt27_1b1b2b8d,#txt28_1b1b2b8d,#txt29_1b1b2b8d,#txt30_1b1b2b8d,#txt46_1b1b2b8d,#txt47_1b1b2b8d,#txt48_1b1b2b8d,#txt49_1b1b2b8d,#txt50_1b1b2b8d,#txt51_1b1b2b8d,#txt52_1b1b2b8d,#txt53_1b1b2b8d,#txt54_1b1b2b8d,#txt55_1b1b2b8d,#txt56_1b1b2b8d,#txt57_1b1b2b8d,#txt58_1b1b2b8d,#txt59_1b1b2b8d,#txt60_1b1b2b8d,#txt61_1b1b2b8d {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt3_1b1b2b8d,#txt4_1b1b2b8d,#txt5_1b1b2b8d,#txt9_1b1b2b8d,#txt10_1b1b2b8d,#txt11_1b1b2b8d {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#ffffff;}#txt12_1b1b2b8d {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt13_1b1b2b8d {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt14_1b1b2b8d {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt15_1b1b2b8d {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#txt31_1b1b2b8d,#txt32_1b1b2b8d,#txt33_1b1b2b8d,#txt34_1b1b2b8d,#txt35_1b1b2b8d,#txt36_1b1b2b8d,#txt37_1b1b2b8d,#txt38_1b1b2b8d,#txt39_1b1b2b8d,#txt40_1b1b2b8d,#txt41_1b1b2b8d,#txt42_1b1b2b8d,#txt43_1b1b2b8d,#txt44_1b1b2b8d,#txt45_1b1b2b8d {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#9a0000;}#txt62_1b1b2b8d,#txt63_1b1b2b8d,#txt64_1b1b2b8d,#txt65_1b1b2b8d,#txt66_1b1b2b8d,#txt67_1b1b2b8d,#txt68_1b1b2b8d,#txt69_1b1b2b8d,#txt70_1b1b2b8d,#txt71_1b1b2b8d,#txt72_1b1b2b8d,#txt73_1b1b2b8d,#txt74_1b1b2b8d,#txt75_1b1b2b8d,#txt76_1b1b2b8d,#txt77_1b1b2b8d {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#0000e2;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide13.js b/experiment/simulation/EE4/iframes/data/slide13.js new file mode 100644 index 0000000..d4c02a1 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide13.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(12, '
    6)  DIFFERENTIAL  PROBE
    6)  DIFFERENTIAL  PROBE
    7)  CURRENT  PROBE
    7)  CURRENT  PROBE
    Instruments Required
    Instruments Required
    Instruments Required
    Instruments Required
    “Differential  voltage  probe”  is  used  to
    observe  (in  DSO)  the  instantaneous
    voltage  across  two  terminals.
    “Differential  voltage  probe”  is  used  to
    observe  (in  DSO)  the  instantaneous
    voltage  across  two  terminals.
    “Current  probe”  is  used  to  observe  (in
    DSO)  the  instantaneous  current  flowing
    in  the  component/closed  circuit.
    “Current  probe”  is  used  to  observe  (in
    DSO)  the  instantaneous  current  flowing
    in  the  component/closed  circuit.
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide14.css b/experiment/simulation/EE4/iframes/data/slide14.css new file mode 100644 index 0000000..77b23b6 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide14.css @@ -0,0 +1 @@ +#spr1_1b1b2d42 {clip:rect(0px,960px,540px,0px);} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide14.js b/experiment/simulation/EE4/iframes/data/slide14.js new file mode 100644 index 0000000..c8f5909 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide14.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(13, '
    Procedure
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide15.css b/experiment/simulation/EE4/iframes/data/slide15.css new file mode 100644 index 0000000..c6c79af --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide15.css @@ -0,0 +1 @@ +#spr1_1b1b2e1d {clip:rect(0px,960px,540px,0px);}#txt0_1b1b2e1d,#txt1_1b1b2e1d,#txt2_1b1b2e1d,#txt3_1b1b2e1d,#txt4_1b1b2e1d {font-family:fnt11; font-size:32px; line-height:45px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide15.js b/experiment/simulation/EE4/iframes/data/slide15.js new file mode 100644 index 0000000..ff738f6 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide15.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(14, '
    Formulation of
    Circuit set-up
    and procedure for
    Output Characteristics
    generation
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide16.css b/experiment/simulation/EE4/iframes/data/slide16.css new file mode 100644 index 0000000..17066d5 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide16.css @@ -0,0 +1 @@ +#spr1_1b1b2f84 {clip:rect(0px,960px,540px,0px);}#spr3_1b1b2f84,#spr4_1b1b2f84,#spr5_1b1b2f84,#spr6_1b1b2f84,#spr7_1b1b2f84,#spr8_1b1b2f84,#spr9_1b1b2f84,#spr10_1b1b2f84,#spr11_1b1b2f84,#spr12_1b1b2f84,#spr17_1b1b2f84,#spr22_1b1b2f84,#spr27_1b1b2f84,#spr28_1b1b2f84,#spr33_1b1b2f84,#spr34_1b1b2f84,#spr38_1b1b2f84,#spr39_1b1b2f84,#spr40_1b1b2f84,#spr41_1b1b2f84,#spr42_1b1b2f84,#spr43_1b1b2f84,#spr44_1b1b2f84,#spr45_1b1b2f84,#spr46_1b1b2f84,#spr47_1b1b2f84,#spr48_1b1b2f84,#spr49_1b1b2f84 {display:none;}#txt0_1b1b2f84,#txt26_1b1b2f84,#txt40_1b1b2f84,#txt58_1b1b2f84,#txt80_1b1b2f84,#txt106_1b1b2f84 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt1_1b1b2f84,#txt2_1b1b2f84,#txt3_1b1b2f84,#txt4_1b1b2f84,#txt5_1b1b2f84,#txt6_1b1b2f84,#txt7_1b1b2f84,#txt8_1b1b2f84,#txt9_1b1b2f84,#txt10_1b1b2f84,#txt11_1b1b2f84,#txt12_1b1b2f84,#txt27_1b1b2f84,#txt28_1b1b2f84,#txt29_1b1b2f84,#txt30_1b1b2f84,#txt31_1b1b2f84,#txt32_1b1b2f84,#txt41_1b1b2f84,#txt42_1b1b2f84,#txt43_1b1b2f84,#txt44_1b1b2f84,#txt45_1b1b2f84,#txt46_1b1b2f84,#txt47_1b1b2f84,#txt48_1b1b2f84,#txt59_1b1b2f84,#txt60_1b1b2f84,#txt61_1b1b2f84,#txt62_1b1b2f84,#txt63_1b1b2f84,#txt64_1b1b2f84,#txt65_1b1b2f84,#txt67_1b1b2f84,#txt68_1b1b2f84,#txt81_1b1b2f84,#txt82_1b1b2f84,#txt83_1b1b2f84,#txt84_1b1b2f84,#txt85_1b1b2f84,#txt86_1b1b2f84,#txt87_1b1b2f84,#txt88_1b1b2f84,#txt89_1b1b2f84,#txt90_1b1b2f84,#txt92_1b1b2f84,#txt107_1b1b2f84,#txt108_1b1b2f84,#txt109_1b1b2f84,#txt110_1b1b2f84,#txt111_1b1b2f84,#txt112_1b1b2f84,#txt113_1b1b2f84,#txt114_1b1b2f84,#txt116_1b1b2f84,#txt130_1b1b2f84,#txt131_1b1b2f84,#txt132_1b1b2f84,#txt133_1b1b2f84,#txt134_1b1b2f84,#txt135_1b1b2f84,#txt136_1b1b2f84,#txt137_1b1b2f84,#txt138_1b1b2f84,#txt139_1b1b2f84,#txt140_1b1b2f84,#txt141_1b1b2f84,#txt142_1b1b2f84,#txt143_1b1b2f84 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt13_1b1b2f84 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#3333ff;}#txt14_1b1b2f84,#txt15_1b1b2f84,#txt16_1b1b2f84,#txt17_1b1b2f84,#txt18_1b1b2f84,#txt19_1b1b2f84,#txt20_1b1b2f84,#txt21_1b1b2f84,#txt22_1b1b2f84,#txt23_1b1b2f84,#txt24_1b1b2f84,#txt25_1b1b2f84 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#3333ff;}#txt33_1b1b2f84 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#c00000;}#txt34_1b1b2f84,#txt35_1b1b2f84,#txt36_1b1b2f84,#txt37_1b1b2f84,#txt38_1b1b2f84,#txt39_1b1b2f84 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#c00000;}#txt49_1b1b2f84 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#008000;}#txt50_1b1b2f84,#txt51_1b1b2f84,#txt52_1b1b2f84,#txt53_1b1b2f84,#txt54_1b1b2f84,#txt55_1b1b2f84,#txt56_1b1b2f84,#txt57_1b1b2f84 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#008000;}#txt66_1b1b2f84,#txt91_1b1b2f84,#txt115_1b1b2f84 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt69_1b1b2f84 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#000000;}#txt70_1b1b2f84,#txt71_1b1b2f84,#txt72_1b1b2f84,#txt73_1b1b2f84,#txt74_1b1b2f84,#txt75_1b1b2f84,#txt76_1b1b2f84,#txt78_1b1b2f84,#txt79_1b1b2f84 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#000000;}#txt77_1b1b2f84 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:#000000;}#txt93_1b1b2f84 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#ff0066;}#txt94_1b1b2f84,#txt95_1b1b2f84,#txt96_1b1b2f84,#txt97_1b1b2f84,#txt98_1b1b2f84,#txt99_1b1b2f84,#txt100_1b1b2f84,#txt101_1b1b2f84,#txt102_1b1b2f84,#txt103_1b1b2f84,#txt105_1b1b2f84 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#ff0066;}#txt104_1b1b2f84 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:#ff0066;}#txt117_1b1b2f84 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#843c0c;}#txt118_1b1b2f84,#txt119_1b1b2f84,#txt120_1b1b2f84,#txt121_1b1b2f84,#txt122_1b1b2f84,#txt123_1b1b2f84,#txt124_1b1b2f84,#txt125_1b1b2f84,#txt127_1b1b2f84 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#843c0c;}#txt126_1b1b2f84 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:#843c0c;}#svg0_1b1b2f84 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#svg1_1b1b2f84,#svg2_1b1b2f84 {pointer-events:none;}#txt128_1b1b2f84 {font-family:fnt5; font-size:40px; line-height:46px; font-weight:bold; color:#0000ff;}#txt129_1b1b2f84 {font-family:fnt5; font-size:30px; line-height:34px; font-weight:bold; color:#0000ff;}#txt144_1b1b2f84,#txt145_1b1b2f84,#txt146_1b1b2f84,#txt147_1b1b2f84,#txt148_1b1b2f84,#txt149_1b1b2f84,#txt150_1b1b2f84,#txt151_1b1b2f84,#txt152_1b1b2f84,#txt153_1b1b2f84,#txt154_1b1b2f84,#txt155_1b1b2f84,#txt156_1b1b2f84,#txt157_1b1b2f84 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#512373;}#txt158_1b1b2f84 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt159_1b1b2f84 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt160_1b1b2f84 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt161_1b1b2f84 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide16.js b/experiment/simulation/EE4/iframes/data/slide16.js new file mode 100644 index 0000000..6b9b6de --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide16.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(15, '
    1. variable  DC  source  as  main
    supply  to  the  circuit  is  taken.
    1. variable  DC  source  as  main
    supply  to  the  circuit  is  taken.
    2. MOSFET  mounted  on  heat  sink.
    2. MOSFET  mounted  on  heat  sink.
    3. load  (variable  resister  or
    rheostat)  is  attached.
    3. load  (variable  resister  or
    rheostat)  is  attached.
    4. low  power  DC  source  for  “V gs
    setting.
    4. low  power  DC  source  for  “V gs
    setting.
    5. An  ammeter  is  attached  in  series
    with  the  MOSFET  (I D ).
    5. An  ammeter  is  attached  in  series
    with  the  MOSFET  (I D ).
    6. voltmeter  is  attached  across  the
    MOSFET  (V DS ).
    6. voltmeter  is  attached  across  the
    MOSFET  (V DS ).
    v
    A
    Observe:  This  is  series  circuit.  The  current  flowing  throughout  the  circuit  is  same.
    Observe:  This  is  series  circuit.  The  current  flowing  throughout  the  circuit  is  same.
    Circuit Diagram To Plot Output Characteristics (Method-1: Using Meters)
    Circuit Diagram To Plot Output Characteristics (Method-1: Using Meters)
    Circuit Diagram To Plot Output Characteristics (Method-1: Using Meters)
    Circuit Diagram To Plot Output Characteristics (Method-1: Using Meters)
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide17.css b/experiment/simulation/EE4/iframes/data/slide17.css new file mode 100644 index 0000000..1b61a7d --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide17.css @@ -0,0 +1 @@ +#spr1_1b1b39a6 {clip:rect(0px,960px,540px,0px);}#spr4_1b1b39a6,#spr8_1b1b39a6,#spr9_1b1b39a6,#spr10_1b1b39a6,#spr14_1b1b39a6,#spr15_1b1b39a6,#spr16_1b1b39a6,#spr17_1b1b39a6 {display:none;}#svg10_1b1b39a6,#svg21_1b1b39a6,#svg32_1b1b39a6 {-webkit-transform-origin:12px 9px; -moz-transform-origin:12px 9px; -o-transform-origin:12px 9px; -ms-transform-origin:12px 9px; transform-origin:12px 9px;}#svg33_1b1b39a6,#svg34_1b1b39a6 {pointer-events:none;}#txt0_1b1b39a6,#txt4_1b1b39a6,#txt67_1b1b39a6,#txt69_1b1b39a6,#txt81_1b1b39a6,#txt83_1b1b39a6 {font-family:fnt10; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt1_1b1b39a6,#txt5_1b1b39a6,#txt68_1b1b39a6,#txt82_1b1b39a6 {font-family:fnt10; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt2_1b1b39a6,#txt6_1b1b39a6,#txt116_1b1b39a6,#txt118_1b1b39a6,#txt130_1b1b39a6,#txt132_1b1b39a6 {font-family:fnt10; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:#000000;}#txt3_1b1b39a6,#txt7_1b1b39a6,#txt117_1b1b39a6,#txt131_1b1b39a6 {font-family:fnt10; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:#000000;}#txt8_1b1b39a6,#txt14_1b1b39a6,#txt18_1b1b39a6,#txt24_1b1b39a6,#txt30_1b1b39a6,#txt36_1b1b39a6 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt9_1b1b39a6,#txt10_1b1b39a6,#txt15_1b1b39a6,#txt19_1b1b39a6,#txt20_1b1b39a6,#txt25_1b1b39a6,#txt26_1b1b39a6,#txt31_1b1b39a6,#txt32_1b1b39a6,#txt37_1b1b39a6,#txt38_1b1b39a6,#txt42_1b1b39a6,#txt43_1b1b39a6,#txt44_1b1b39a6,#txt45_1b1b39a6,#txt46_1b1b39a6,#txt47_1b1b39a6,#txt48_1b1b39a6,#txt49_1b1b39a6,#txt50_1b1b39a6,#txt51_1b1b39a6,#txt52_1b1b39a6,#txt53_1b1b39a6,#txt54_1b1b39a6,#txt55_1b1b39a6,#txt56_1b1b39a6,#txt57_1b1b39a6,#txt58_1b1b39a6,#txt59_1b1b39a6,#txt60_1b1b39a6,#txt61_1b1b39a6,#txt62_1b1b39a6,#txt63_1b1b39a6,#txt64_1b1b39a6,#txt65_1b1b39a6,#txt66_1b1b39a6,#txt70_1b1b39a6,#txt71_1b1b39a6,#txt72_1b1b39a6,#txt73_1b1b39a6,#txt74_1b1b39a6,#txt75_1b1b39a6,#txt76_1b1b39a6,#txt77_1b1b39a6,#txt78_1b1b39a6,#txt79_1b1b39a6,#txt80_1b1b39a6,#txt84_1b1b39a6,#txt85_1b1b39a6,#txt86_1b1b39a6,#txt87_1b1b39a6,#txt88_1b1b39a6,#txt89_1b1b39a6,#txt90_1b1b39a6,#txt144_1b1b39a6,#txt148_1b1b39a6,#txt152_1b1b39a6,#txt154_1b1b39a6,#txt156_1b1b39a6 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt11_1b1b39a6,#txt16_1b1b39a6,#txt21_1b1b39a6,#txt27_1b1b39a6,#txt33_1b1b39a6,#txt39_1b1b39a6 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#254f2f;}#txt12_1b1b39a6,#txt13_1b1b39a6,#txt17_1b1b39a6,#txt22_1b1b39a6,#txt23_1b1b39a6,#txt28_1b1b39a6,#txt29_1b1b39a6,#txt34_1b1b39a6,#txt35_1b1b39a6,#txt40_1b1b39a6,#txt41_1b1b39a6 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#254f2f;}#svg35_1b1b39a6 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px;}#txt91_1b1b39a6,#txt92_1b1b39a6,#txt93_1b1b39a6,#txt94_1b1b39a6,#txt95_1b1b39a6,#txt96_1b1b39a6,#txt97_1b1b39a6,#txt98_1b1b39a6,#txt99_1b1b39a6,#txt100_1b1b39a6,#txt101_1b1b39a6,#txt102_1b1b39a6,#txt103_1b1b39a6,#txt104_1b1b39a6,#txt105_1b1b39a6,#txt106_1b1b39a6,#txt107_1b1b39a6,#txt108_1b1b39a6,#txt109_1b1b39a6,#txt110_1b1b39a6,#txt111_1b1b39a6,#txt112_1b1b39a6,#txt113_1b1b39a6,#txt114_1b1b39a6,#txt115_1b1b39a6,#txt119_1b1b39a6,#txt120_1b1b39a6,#txt121_1b1b39a6,#txt122_1b1b39a6,#txt123_1b1b39a6,#txt124_1b1b39a6,#txt125_1b1b39a6,#txt126_1b1b39a6,#txt127_1b1b39a6,#txt128_1b1b39a6,#txt129_1b1b39a6,#txt133_1b1b39a6,#txt134_1b1b39a6,#txt135_1b1b39a6,#txt136_1b1b39a6,#txt137_1b1b39a6,#txt138_1b1b39a6,#txt139_1b1b39a6 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#000000;}#txt140_1b1b39a6 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt141_1b1b39a6 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt142_1b1b39a6 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt143_1b1b39a6 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#txt145_1b1b39a6,#txt149_1b1b39a6,#txt153_1b1b39a6,#txt155_1b1b39a6 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt146_1b1b39a6,#txt150_1b1b39a6,#txt157_1b1b39a6,#txt159_1b1b39a6,#txt161_1b1b39a6 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#000066;}#txt147_1b1b39a6,#txt151_1b1b39a6,#txt158_1b1b39a6,#txt160_1b1b39a6 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:#000066;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide17.js b/experiment/simulation/EE4/iframes/data/slide17.js new file mode 100644 index 0000000..e3ae7c2 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide17.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(16, '
    V in_1
    V in_1
    V in_n
    V in_n
    1. A variable DC source as main
    supply to the circuit is taken.
    1. A variable DC source as main
    supply to the circuit is taken.
    2. A MOSFET mounted on heat sink.
    2. A MOSFET mounted on heat sink.
    3. A load (variable resister or
    rheostat) is attached.
    3. A load (variable resister or
    rheostat) is attached.
    4. A DC source for the gate of the
    MOSFET is connected.
    4. A DC source for the gate of the
    MOSFET is connected.
    5. An ammeter is attached in series
    with the MOSFET.
    5. An ammeter is attached in series
    with the MOSFET.
    6. A voltmeter is attached across the
    MOSFET.
    6. A voltmeter is attached across the
    MOSFET.
    The  graph  is  plotted  on
    graph  paper  by
    collecting  data  points
    individually.  The  supply
    voltage  is  changed  in
    steps  and  the  Drain-
    to-Source  voltage  (V DS
    )   is  recorded  using  a
    DC  voltage  while  the
    Drain  current  ( I D is
    recorded  using  DC
    ammeter
    simultaneously.
    The  graph  is  plotted  on
    graph  paper  by
    collecting  data  points
    individually.  The  supply
    voltage  is  changed  in
    steps  and  the  Drain-
    to-Source  voltage  (V DS
    )   is  recorded  using  a
    DC  voltage  while  the
    Drain  current  ( I D is
    recorded  using  DC
    ammeter
    simultaneously.
    Circuit Diagram To Plot Output Characteristics (Method-1: Using Meters)
    Circuit Diagram To Plot Output Characteristics (Method-1: Using Meters)
    Circuit Diagram To Plot Output Characteristics (Method-1: Using Meters)
    Circuit Diagram To Plot Output Characteristics (Method-1: Using Meters)
    V DS
    V DS
    I D
    I D
    V GS  -   fixed
    V GS  -   fixed
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide18.css b/experiment/simulation/EE4/iframes/data/slide18.css new file mode 100644 index 0000000..f399729 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide18.css @@ -0,0 +1 @@ +#spr1_1b1b3cf2 {clip:rect(0px,960px,540px,0px);}#spr3_1b1b3cf2,#spr4_1b1b3cf2,#spr5_1b1b3cf2,#spr6_1b1b3cf2,#spr7_1b1b3cf2,#spr8_1b1b3cf2,#spr12_1b1b3cf2,#spr16_1b1b3cf2,#spr21_1b1b3cf2,#spr27_1b1b3cf2,#spr28_1b1b3cf2,#spr33_1b1b3cf2,#spr38_1b1b3cf2,#spr39_1b1b3cf2,#spr40_1b1b3cf2,#spr41_1b1b3cf2,#spr42_1b1b3cf2,#spr43_1b1b3cf2,#spr44_1b1b3cf2,#spr45_1b1b3cf2,#spr50_1b1b3cf2,#spr56_1b1b3cf2,#spr61_1b1b3cf2,#spr66_1b1b3cf2,#spr67_1b1b3cf2,#spr68_1b1b3cf2,#spr69_1b1b3cf2,#spr70_1b1b3cf2,#spr71_1b1b3cf2,#spr73_1b1b3cf2,#spr74_1b1b3cf2,#spr75_1b1b3cf2,#spr76_1b1b3cf2,#spr77_1b1b3cf2,#spr78_1b1b3cf2,#spr79_1b1b3cf2,#spr80_1b1b3cf2,#spr81_1b1b3cf2,#spr85_1b1b3cf2,#spr86_1b1b3cf2 {display:none;}#spr10_1b1b3cf2,#spr14_1b1b3cf2 {-webkit-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); -o-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); -ms-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); -moz-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0);}#svg0_1b1b3cf2 {-webkit-transform-origin:1.215px 0.806px; -moz-transform-origin:1.215px 0.806px; -o-transform-origin:1.215px 0.806px; -ms-transform-origin:1.215px 0.806px; transform-origin:1.215px 0.806px;}#spr11_1b1b3cf2,#spr15_1b1b3cf2 {-webkit-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -o-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -ms-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -moz-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0);}#svg8_1b1b3cf2 {-webkit-transform-origin:1.212px 0.808px; -moz-transform-origin:1.212px 0.808px; -o-transform-origin:1.212px 0.808px; -ms-transform-origin:1.212px 0.808px; transform-origin:1.212px 0.808px;}#svg16_1b1b3cf2 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#svg17_1b1b3cf2,#svg18_1b1b3cf2,#svg19_1b1b3cf2,#svg20_1b1b3cf2 {pointer-events:none;}#txt0_1b1b3cf2 {font-family:fnt5; font-size:30px; line-height:34px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt1_1b1b3cf2 {font-family:fnt5; font-size:30px; line-height:34px; font-weight:bold; color:#0000ff;}#txt2_1b1b3cf2 {font-family:fnt5; font-size:20px; line-height:23px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt3_1b1b3cf2 {font-family:fnt5; font-size:20px; line-height:23px; font-weight:bold; color:#0000ff;}#spr26_1b1b3cf2,#spr55_1b1b3cf2,#spr72_1b1b3cf2 {-webkit-transform:matrix(-0,1,-1,-0,0,0); -o-transform:matrix(-0,1,-1,-0,0,0); -ms-transform:matrix(-0,1,-1,-0,0,0); -moz-transform:matrix(-0,1,-1,-0,0,0); transform:matrix(-0,1,-1,-0,0,0); display:none;}#txt4_1b1b3cf2,#txt5_1b1b3cf2,#txt6_1b1b3cf2,#txt7_1b1b3cf2,#txt8_1b1b3cf2,#txt9_1b1b3cf2,#txt10_1b1b3cf2,#txt11_1b1b3cf2,#txt20_1b1b3cf2,#txt21_1b1b3cf2,#txt22_1b1b3cf2,#txt23_1b1b3cf2,#txt24_1b1b3cf2,#txt25_1b1b3cf2,#txt26_1b1b3cf2,#txt27_1b1b3cf2,#txt28_1b1b3cf2,#txt38_1b1b3cf2,#txt39_1b1b3cf2,#txt40_1b1b3cf2,#txt41_1b1b3cf2,#txt42_1b1b3cf2,#txt43_1b1b3cf2,#txt44_1b1b3cf2,#txt45_1b1b3cf2,#txt46_1b1b3cf2,#txt47_1b1b3cf2,#txt48_1b1b3cf2,#txt49_1b1b3cf2,#txt62_1b1b3cf2,#txt63_1b1b3cf2,#txt64_1b1b3cf2,#txt65_1b1b3cf2,#txt66_1b1b3cf2,#txt67_1b1b3cf2,#txt68_1b1b3cf2,#txt69_1b1b3cf2,#txt70_1b1b3cf2,#txt71_1b1b3cf2,#txt72_1b1b3cf2,#txt73_1b1b3cf2,#txt74_1b1b3cf2,#txt88_1b1b3cf2,#txt89_1b1b3cf2,#txt90_1b1b3cf2,#txt91_1b1b3cf2,#txt92_1b1b3cf2,#txt93_1b1b3cf2,#txt94_1b1b3cf2,#txt95_1b1b3cf2,#txt96_1b1b3cf2,#txt97_1b1b3cf2,#txt98_1b1b3cf2,#txt99_1b1b3cf2,#txt100_1b1b3cf2,#txt114_1b1b3cf2,#txt115_1b1b3cf2,#txt116_1b1b3cf2,#txt117_1b1b3cf2,#txt118_1b1b3cf2,#txt119_1b1b3cf2,#txt120_1b1b3cf2,#txt121_1b1b3cf2,#txt122_1b1b3cf2,#txt123_1b1b3cf2,#txt124_1b1b3cf2,#txt125_1b1b3cf2 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt12_1b1b3cf2,#txt13_1b1b3cf2,#txt14_1b1b3cf2,#txt15_1b1b3cf2,#txt16_1b1b3cf2,#txt17_1b1b3cf2,#txt18_1b1b3cf2,#txt19_1b1b3cf2,#txt29_1b1b3cf2,#txt30_1b1b3cf2,#txt31_1b1b3cf2,#txt32_1b1b3cf2,#txt33_1b1b3cf2,#txt34_1b1b3cf2,#txt35_1b1b3cf2,#txt36_1b1b3cf2,#txt37_1b1b3cf2,#txt50_1b1b3cf2,#txt51_1b1b3cf2,#txt52_1b1b3cf2,#txt53_1b1b3cf2,#txt54_1b1b3cf2,#txt55_1b1b3cf2,#txt56_1b1b3cf2,#txt57_1b1b3cf2,#txt58_1b1b3cf2,#txt59_1b1b3cf2,#txt60_1b1b3cf2,#txt61_1b1b3cf2,#txt75_1b1b3cf2,#txt76_1b1b3cf2,#txt77_1b1b3cf2,#txt78_1b1b3cf2,#txt79_1b1b3cf2,#txt80_1b1b3cf2,#txt81_1b1b3cf2,#txt82_1b1b3cf2,#txt83_1b1b3cf2,#txt84_1b1b3cf2,#txt85_1b1b3cf2,#txt86_1b1b3cf2,#txt87_1b1b3cf2,#txt101_1b1b3cf2,#txt102_1b1b3cf2,#txt103_1b1b3cf2,#txt104_1b1b3cf2,#txt105_1b1b3cf2,#txt106_1b1b3cf2,#txt107_1b1b3cf2,#txt108_1b1b3cf2,#txt109_1b1b3cf2,#txt110_1b1b3cf2,#txt111_1b1b3cf2,#txt112_1b1b3cf2,#txt113_1b1b3cf2,#txt126_1b1b3cf2,#txt127_1b1b3cf2,#txt128_1b1b3cf2,#txt129_1b1b3cf2,#txt130_1b1b3cf2,#txt131_1b1b3cf2,#txt132_1b1b3cf2,#txt133_1b1b3cf2,#txt134_1b1b3cf2,#txt135_1b1b3cf2,#txt136_1b1b3cf2,#txt137_1b1b3cf2 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#512373;}#txt138_1b1b3cf2 {font-family:fnt5; font-size:23px; line-height:26px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt139_1b1b3cf2 {font-family:fnt5; font-size:23px; line-height:26px; font-weight:bold; color:#0000ff;}#txt140_1b1b3cf2 {font-family:fnt5; font-size:17px; line-height:20px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt141_1b1b3cf2 {font-family:fnt5; font-size:17px; line-height:20px; font-weight:bold; color:#0000ff;}#txt142_1b1b3cf2 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt143_1b1b3cf2 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt144_1b1b3cf2 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt145_1b1b3cf2 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide18.js b/experiment/simulation/EE4/iframes/data/slide18.js new file mode 100644 index 0000000..e3f1c33 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide18.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(17, '
    v
    v
    A
    A
    DC   supply  connected  to  the  drain  of  MOSFET.
    DC   supply  connected  to  the  drain  of  MOSFET.
    Source  terminal  is  connected  to   the  positive  of  Ammeter.
    Source  terminal  is  connected  to   the  positive  of  Ammeter.
    Negative  of  the  Ammeter  is  connected  to  one  end  of  the  rheostat
    Negative  of  the  Ammeter  is  connected  to  one  end  of  the  rheostat
    The  other  end  of  the  rheostat  is  connected  to  the  main  DC  source
    The  other  end  of  the  rheostat  is  connected  to  the  main  DC  source
    The  gate  supply  is  given  across  the  gate  and  source  of  the  MOSFET
    The  gate  supply  is  given  across  the  gate  and  source  of  the  MOSFET
    The  voltmeter  is  finally  connected  across  the  MOSFET  drain  and  source  terminals
    The  voltmeter  is  finally  connected  across  the  MOSFET  drain  and  source  terminals
    v
    v
    A
    A
    Test Circuit Connection Diagram (Method-1: Using Meters)
    Test Circuit Connection Diagram (Method-1: Using Meters)
    Test Circuit Connection Diagram (Method-1: Using Meters)
    Test Circuit Connection Diagram (Method-1: Using Meters)
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide19.css b/experiment/simulation/EE4/iframes/data/slide19.css new file mode 100644 index 0000000..deef9ff --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide19.css @@ -0,0 +1 @@ +#spr1_1b1b4ba7 {clip:rect(0px,960px,540px,0px);}#spr3_1b1b4ba7,#spr8_1b1b4ba7,#spr9_1b1b4ba7,#spr10_1b1b4ba7,#spr11_1b1b4ba7,#spr12_1b1b4ba7,#spr13_1b1b4ba7,#spr18_1b1b4ba7,#spr19_1b1b4ba7,#spr20_1b1b4ba7,#spr21_1b1b4ba7,#spr22_1b1b4ba7,#spr23_1b1b4ba7,#spr24_1b1b4ba7,#spr25_1b1b4ba7,#spr26_1b1b4ba7,#spr27_1b1b4ba7,#spr28_1b1b4ba7,#spr29_1b1b4ba7,#spr30_1b1b4ba7,#spr31_1b1b4ba7,#spr36_1b1b4ba7,#spr37_1b1b4ba7,#spr38_1b1b4ba7,#spr42_1b1b4ba7,#spr46_1b1b4ba7,#spr47_1b1b4ba7,#spr48_1b1b4ba7 {display:none;}#txt0_1b1b4ba7,#txt1_1b1b4ba7,#txt2_1b1b4ba7,#txt3_1b1b4ba7,#txt4_1b1b4ba7,#txt5_1b1b4ba7,#txt6_1b1b4ba7,#txt7_1b1b4ba7,#txt8_1b1b4ba7,#txt9_1b1b4ba7,#txt10_1b1b4ba7,#txt11_1b1b4ba7,#txt12_1b1b4ba7,#txt13_1b1b4ba7,#txt14_1b1b4ba7,#txt15_1b1b4ba7,#txt16_1b1b4ba7,#txt17_1b1b4ba7,#txt39_1b1b4ba7,#txt40_1b1b4ba7,#txt41_1b1b4ba7,#txt42_1b1b4ba7,#txt43_1b1b4ba7,#txt44_1b1b4ba7,#txt46_1b1b4ba7,#txt57_1b1b4ba7,#txt58_1b1b4ba7,#txt59_1b1b4ba7,#txt60_1b1b4ba7,#txt61_1b1b4ba7,#txt62_1b1b4ba7,#txt71_1b1b4ba7,#txt72_1b1b4ba7,#txt73_1b1b4ba7,#txt74_1b1b4ba7,#txt75_1b1b4ba7,#txt76_1b1b4ba7,#txt77_1b1b4ba7,#txt78_1b1b4ba7,#txt89_1b1b4ba7,#txt90_1b1b4ba7,#txt91_1b1b4ba7,#txt92_1b1b4ba7,#txt93_1b1b4ba7,#txt94_1b1b4ba7,#txt95_1b1b4ba7,#txt97_1b1b4ba7,#txt98_1b1b4ba7,#txt111_1b1b4ba7,#txt112_1b1b4ba7,#txt113_1b1b4ba7,#txt114_1b1b4ba7,#txt115_1b1b4ba7,#txt116_1b1b4ba7,#txt117_1b1b4ba7,#txt118_1b1b4ba7,#txt119_1b1b4ba7,#txt120_1b1b4ba7,#txt121_1b1b4ba7,#txt123_1b1b4ba7,#txt139_1b1b4ba7,#txt140_1b1b4ba7,#txt141_1b1b4ba7,#txt142_1b1b4ba7,#txt143_1b1b4ba7,#txt144_1b1b4ba7,#txt145_1b1b4ba7,#txt146_1b1b4ba7,#txt147_1b1b4ba7,#txt148_1b1b4ba7,#txt149_1b1b4ba7,#txt151_1b1b4ba7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt18_1b1b4ba7,#txt19_1b1b4ba7,#txt20_1b1b4ba7,#txt21_1b1b4ba7,#txt22_1b1b4ba7,#txt23_1b1b4ba7,#txt24_1b1b4ba7,#txt25_1b1b4ba7,#txt26_1b1b4ba7,#txt27_1b1b4ba7,#txt28_1b1b4ba7,#txt29_1b1b4ba7,#txt30_1b1b4ba7,#txt31_1b1b4ba7,#txt32_1b1b4ba7,#txt33_1b1b4ba7,#txt34_1b1b4ba7,#txt35_1b1b4ba7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#512373;}#svg0_1b1b4ba7 {pointer-events:none;}#txt36_1b1b4ba7,#txt37_1b1b4ba7 {font-family:fnt5; font-size:18px; line-height:21px; font-weight:bold; color:#0000ff;}#txt38_1b1b4ba7,#txt56_1b1b4ba7,#txt70_1b1b4ba7,#txt88_1b1b4ba7,#txt110_1b1b4ba7,#txt138_1b1b4ba7 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt45_1b1b4ba7,#txt96_1b1b4ba7,#txt122_1b1b4ba7,#txt150_1b1b4ba7 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt47_1b1b4ba7 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#843c0c;}#txt48_1b1b4ba7,#txt49_1b1b4ba7,#txt50_1b1b4ba7,#txt51_1b1b4ba7,#txt52_1b1b4ba7,#txt53_1b1b4ba7,#txt55_1b1b4ba7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#843c0c;}#txt54_1b1b4ba7 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:#843c0c;}#txt63_1b1b4ba7 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#3333ff;}#txt64_1b1b4ba7,#txt65_1b1b4ba7,#txt66_1b1b4ba7,#txt67_1b1b4ba7,#txt68_1b1b4ba7,#txt69_1b1b4ba7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#3333ff;}#txt79_1b1b4ba7 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#6a064d;}#txt80_1b1b4ba7,#txt81_1b1b4ba7,#txt82_1b1b4ba7,#txt83_1b1b4ba7,#txt84_1b1b4ba7,#txt85_1b1b4ba7,#txt86_1b1b4ba7,#txt87_1b1b4ba7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#6a064d;}#txt99_1b1b4ba7 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#000000;}#txt100_1b1b4ba7,#txt101_1b1b4ba7,#txt102_1b1b4ba7,#txt103_1b1b4ba7,#txt104_1b1b4ba7,#txt105_1b1b4ba7,#txt106_1b1b4ba7,#txt108_1b1b4ba7,#txt109_1b1b4ba7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#000000;}#txt107_1b1b4ba7 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:#000000;}#txt124_1b1b4ba7 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#c00000;}#txt125_1b1b4ba7,#txt126_1b1b4ba7,#txt127_1b1b4ba7,#txt128_1b1b4ba7,#txt129_1b1b4ba7,#txt130_1b1b4ba7,#txt131_1b1b4ba7,#txt132_1b1b4ba7,#txt133_1b1b4ba7,#txt134_1b1b4ba7,#txt135_1b1b4ba7,#txt137_1b1b4ba7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#c00000;}#txt136_1b1b4ba7 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:#c00000;}#txt152_1b1b4ba7 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#008000;}#txt153_1b1b4ba7,#txt154_1b1b4ba7,#txt155_1b1b4ba7,#txt156_1b1b4ba7,#txt157_1b1b4ba7,#txt158_1b1b4ba7,#txt159_1b1b4ba7,#txt160_1b1b4ba7,#txt161_1b1b4ba7,#txt162_1b1b4ba7,#txt163_1b1b4ba7,#txt165_1b1b4ba7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#008000;}#txt164_1b1b4ba7 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:#008000;}#svg1_1b1b4ba7 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#txt166_1b1b4ba7,#txt167_1b1b4ba7 {font-family:fnt5; font-size:18px; line-height:21px; font-weight:bold; color:#203864;}#txt168_1b1b4ba7 {font-family:fnt4; font-size:23.5px; line-height:27px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt169_1b1b4ba7 {font-family:fnt4; font-size:23.5px; line-height:27px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt170_1b1b4ba7 {font-family:fnt4; font-size:23.5px; line-height:27px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt171_1b1b4ba7 {font-family:fnt4; font-size:23.5px; line-height:27px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide19.js b/experiment/simulation/EE4/iframes/data/slide19.js new file mode 100644 index 0000000..1a62f48 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide19.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(18, '
    Both  the  voltage  and  current  probes  are  then  attached  to  two  channels  of  DSO  and  the
    characteristics  drawn.
    Both  the  voltage  and  current  probes  are  then  attached  to  two  channels  of  DSO  and  the
    characteristics  drawn.
    Volt
    Probe
    1. DC  source  for  setting  the  “V in ”.
    1. DC  source  for  setting  the  “V in ”.
    2. MOSFET  mounted  on  heat  sink.
    2. MOSFET  mounted  on  heat  sink.
    3. load  (variable  resister  or
    rheostat)  is  attached.
    3. load  (variable  resister  or
    rheostat)  is  attached.
    4. low  power  DC  source  for  “V gs
    setting.
    4. low  power  DC  source  for  “V gs
    setting.
    5. Differential  probe  to  measure
    voltage  is  attached  across  the
    MOSFET  (V DS ).
    5. Differential  probe  to  measure
    voltage  is  attached  across  the
    MOSFET  (V DS ).
    6. Current  probe  is  inserted  to
    measure  the  current  through
    MOSFET  (I D ).
    6. Current  probe  is  inserted  to
    measure  the  current  through
    MOSFET  (I D ).
    Current
    Probe
    Circuit Diagram To Plot Output Characteristics (Method-2: Using Oscilloscope)
    Circuit Diagram To Plot Output Characteristics (Method-2: Using Oscilloscope)
    Circuit Diagram To Plot Output Characteristics (Method-2: Using Oscilloscope)
    Circuit Diagram To Plot Output Characteristics (Method-2: Using Oscilloscope)
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide2.css b/experiment/simulation/EE4/iframes/data/slide2.css new file mode 100644 index 0000000..cede413 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide2.css @@ -0,0 +1 @@ +#spr1_1b1b0586 {clip:rect(0px,960px,540px,0px);} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide2.js b/experiment/simulation/EE4/iframes/data/slide2.js new file mode 100644 index 0000000..08c1853 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide2.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(1, '
    Fundamentals
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide20.css b/experiment/simulation/EE4/iframes/data/slide20.css new file mode 100644 index 0000000..62cae9a --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide20.css @@ -0,0 +1 @@ +#spr1_1b1b5443 {clip:rect(0px,960px,540px,0px);}#txt0_1b1b5443,#txt1_1b1b5443,#txt2_1b1b5443,#txt3_1b1b5443,#txt4_1b1b5443,#txt5_1b1b5443,#txt6_1b1b5443,#txt7_1b1b5443,#txt8_1b1b5443,#txt9_1b1b5443,#txt10_1b1b5443,#txt11_1b1b5443,#txt12_1b1b5443,#txt13_1b1b5443,#txt14_1b1b5443,#txt15_1b1b5443,#txt16_1b1b5443,#txt17_1b1b5443,#txt37_1b1b5443,#txt38_1b1b5443,#txt39_1b1b5443,#txt40_1b1b5443,#txt41_1b1b5443,#txt42_1b1b5443,#txt43_1b1b5443,#txt44_1b1b5443,#txt45_1b1b5443,#txt46_1b1b5443,#txt47_1b1b5443,#txt48_1b1b5443,#txt63_1b1b5443,#txt64_1b1b5443,#txt65_1b1b5443,#txt66_1b1b5443,#txt67_1b1b5443,#txt68_1b1b5443,#txt77_1b1b5443,#txt78_1b1b5443,#txt79_1b1b5443,#txt80_1b1b5443,#txt81_1b1b5443,#txt82_1b1b5443,#txt83_1b1b5443,#txt84_1b1b5443,#txt95_1b1b5443,#txt96_1b1b5443,#txt97_1b1b5443,#txt98_1b1b5443,#txt99_1b1b5443,#txt100_1b1b5443,#txt101_1b1b5443,#txt102_1b1b5443,#txt103_1b1b5443,#txt104_1b1b5443,#txt105_1b1b5443,#txt119_1b1b5443,#txt120_1b1b5443,#txt121_1b1b5443,#txt122_1b1b5443,#txt123_1b1b5443,#txt124_1b1b5443,#txt125_1b1b5443,#txt126_1b1b5443,#txt127_1b1b5443,#txt128_1b1b5443,#txt141_1b1b5443,#txt142_1b1b5443,#txt143_1b1b5443,#txt144_1b1b5443,#txt145_1b1b5443,#txt146_1b1b5443,#txt147_1b1b5443,#txt148_1b1b5443 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt18_1b1b5443,#txt19_1b1b5443,#txt20_1b1b5443,#txt21_1b1b5443,#txt22_1b1b5443,#txt23_1b1b5443,#txt24_1b1b5443,#txt25_1b1b5443,#txt26_1b1b5443,#txt27_1b1b5443,#txt28_1b1b5443,#txt29_1b1b5443,#txt30_1b1b5443,#txt31_1b1b5443,#txt32_1b1b5443,#txt33_1b1b5443,#txt34_1b1b5443,#txt35_1b1b5443 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#512373;}#txt36_1b1b5443,#txt62_1b1b5443,#txt76_1b1b5443,#txt94_1b1b5443,#txt118_1b1b5443,#txt140_1b1b5443 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt49_1b1b5443,#txt69_1b1b5443,#txt85_1b1b5443,#txt106_1b1b5443,#txt129_1b1b5443,#txt149_1b1b5443 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#254f2f;}#txt50_1b1b5443,#txt51_1b1b5443,#txt52_1b1b5443,#txt53_1b1b5443,#txt54_1b1b5443,#txt55_1b1b5443,#txt56_1b1b5443,#txt57_1b1b5443,#txt58_1b1b5443,#txt59_1b1b5443,#txt60_1b1b5443,#txt61_1b1b5443,#txt70_1b1b5443,#txt71_1b1b5443,#txt72_1b1b5443,#txt73_1b1b5443,#txt74_1b1b5443,#txt75_1b1b5443,#txt86_1b1b5443,#txt87_1b1b5443,#txt88_1b1b5443,#txt89_1b1b5443,#txt90_1b1b5443,#txt91_1b1b5443,#txt92_1b1b5443,#txt93_1b1b5443,#txt107_1b1b5443,#txt108_1b1b5443,#txt109_1b1b5443,#txt110_1b1b5443,#txt111_1b1b5443,#txt112_1b1b5443,#txt113_1b1b5443,#txt114_1b1b5443,#txt115_1b1b5443,#txt116_1b1b5443,#txt117_1b1b5443,#txt130_1b1b5443,#txt131_1b1b5443,#txt132_1b1b5443,#txt133_1b1b5443,#txt134_1b1b5443,#txt135_1b1b5443,#txt136_1b1b5443,#txt137_1b1b5443,#txt138_1b1b5443,#txt139_1b1b5443,#txt150_1b1b5443,#txt151_1b1b5443,#txt152_1b1b5443,#txt153_1b1b5443,#txt154_1b1b5443,#txt155_1b1b5443,#txt156_1b1b5443,#txt157_1b1b5443 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#254f2f;}#svg0_1b1b5443 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px;}#txt158_1b1b5443 {font-family:fnt4; font-size:23.5px; line-height:27px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt159_1b1b5443 {font-family:fnt4; font-size:23.5px; line-height:27px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt160_1b1b5443 {font-family:fnt4; font-size:23.5px; line-height:27px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt161_1b1b5443 {font-family:fnt4; font-size:23.5px; line-height:27px; font-weight:bold; color:#ffffff;}#spr8_1b1b5443,#spr10_1b1b5443,#spr11_1b1b5443,#spr12_1b1b5443,#spr15_1b1b5443,#spr16_1b1b5443,#spr17_1b1b5443,#spr18_1b1b5443 {display:none;}#txt162_1b1b5443,#txt186_1b1b5443,#txt248_1b1b5443 {font-family:PFn; font-size:18px; line-height:21px; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt163_1b1b5443,#txt164_1b1b5443,#txt165_1b1b5443,#txt166_1b1b5443,#txt167_1b1b5443,#txt168_1b1b5443,#txt169_1b1b5443,#txt170_1b1b5443,#txt171_1b1b5443,#txt172_1b1b5443,#txt184_1b1b5443,#txt187_1b1b5443,#txt188_1b1b5443,#txt189_1b1b5443,#txt190_1b1b5443,#txt191_1b1b5443,#txt192_1b1b5443,#txt193_1b1b5443,#txt194_1b1b5443,#txt195_1b1b5443,#txt196_1b1b5443,#txt197_1b1b5443,#txt198_1b1b5443,#txt199_1b1b5443,#txt202_1b1b5443,#txt203_1b1b5443,#txt204_1b1b5443,#txt205_1b1b5443,#txt206_1b1b5443,#txt207_1b1b5443,#txt208_1b1b5443,#txt209_1b1b5443,#txt212_1b1b5443,#txt213_1b1b5443,#txt214_1b1b5443,#txt215_1b1b5443,#txt216_1b1b5443,#txt249_1b1b5443,#txt250_1b1b5443,#txt252_1b1b5443,#txt253_1b1b5443,#txt254_1b1b5443,#txt255_1b1b5443,#txt256_1b1b5443,#txt257_1b1b5443,#txt258_1b1b5443,#txt259_1b1b5443,#txt260_1b1b5443,#txt261_1b1b5443,#txt262_1b1b5443,#txt263_1b1b5443,#txt264_1b1b5443,#txt265_1b1b5443,#txt266_1b1b5443,#txt267_1b1b5443,#txt268_1b1b5443 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt173_1b1b5443 {font-family:PFn; font-size:18px; line-height:21px; color:#0000ff;}#txt174_1b1b5443,#txt175_1b1b5443,#txt176_1b1b5443,#txt177_1b1b5443,#txt178_1b1b5443,#txt179_1b1b5443,#txt180_1b1b5443,#txt181_1b1b5443,#txt182_1b1b5443,#txt183_1b1b5443 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:#0000ff;}#txt185_1b1b5443 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:#000000;}#txt200_1b1b5443,#txt210_1b1b5443 {font-family:fnt10; font-size:18px; line-height:24px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt201_1b1b5443,#txt211_1b1b5443 {font-family:fnt10; font-size:12px; line-height:16px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt217_1b1b5443 {font-family:PFn; font-size:18px; line-height:21px; color:#9a0000;}#txt218_1b1b5443,#txt219_1b1b5443,#txt220_1b1b5443,#txt221_1b1b5443,#txt222_1b1b5443,#txt223_1b1b5443,#txt224_1b1b5443,#txt225_1b1b5443,#txt226_1b1b5443,#txt227_1b1b5443,#txt228_1b1b5443,#txt229_1b1b5443,#txt230_1b1b5443,#txt233_1b1b5443,#txt234_1b1b5443,#txt235_1b1b5443,#txt236_1b1b5443,#txt237_1b1b5443,#txt238_1b1b5443,#txt239_1b1b5443,#txt240_1b1b5443,#txt243_1b1b5443,#txt244_1b1b5443,#txt245_1b1b5443,#txt246_1b1b5443,#txt247_1b1b5443 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:#9a0000;}#txt231_1b1b5443,#txt241_1b1b5443 {font-family:fnt10; font-size:18px; line-height:24px; font-weight:bold; font-style:italic; color:#9a0000;}#txt232_1b1b5443,#txt242_1b1b5443 {font-family:fnt10; font-size:12px; line-height:16px; font-weight:bold; font-style:italic; color:#9a0000;}#txt251_1b1b5443 {font-family:fnt9; font-size:12px; line-height:16px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt269_1b1b5443 {font-family:PFn; font-size:18px; line-height:21px; color:#9900cc;}#txt270_1b1b5443,#txt271_1b1b5443,#txt273_1b1b5443,#txt274_1b1b5443,#txt275_1b1b5443,#txt276_1b1b5443,#txt277_1b1b5443,#txt278_1b1b5443,#txt279_1b1b5443,#txt280_1b1b5443,#txt281_1b1b5443,#txt282_1b1b5443,#txt283_1b1b5443,#txt284_1b1b5443,#txt285_1b1b5443,#txt286_1b1b5443,#txt287_1b1b5443,#txt288_1b1b5443,#txt289_1b1b5443 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:#9900cc;}#txt272_1b1b5443 {font-family:fnt9; font-size:12px; line-height:16px; font-weight:bold; color:#9900cc;}#svg11_1b1b5443,#svg22_1b1b5443,#svg33_1b1b5443 {-webkit-transform-origin:12px 9px; -moz-transform-origin:12px 9px; -o-transform-origin:12px 9px; -ms-transform-origin:12px 9px; transform-origin:12px 9px;}#svg34_1b1b5443 {-webkit-transform-origin:3.824px 3.935px; -moz-transform-origin:3.824px 3.935px; -o-transform-origin:3.824px 3.935px; -ms-transform-origin:3.824px 3.935px; transform-origin:3.824px 3.935px;}#svg40_1b1b5443,#svg41_1b1b5443 {pointer-events:none;}#txt290_1b1b5443,#txt294_1b1b5443 {font-family:fnt12; font-size:18px; line-height:21px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt291_1b1b5443,#txt295_1b1b5443 {font-family:fnt12; font-size:12px; line-height:14px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt292_1b1b5443,#txt296_1b1b5443 {font-family:fnt12; font-size:18px; line-height:21px; font-weight:bold; font-style:italic; color:#000000;}#txt293_1b1b5443,#txt297_1b1b5443 {font-family:fnt12; font-size:12px; line-height:14px; font-weight:bold; font-style:italic; color:#000000;}#txt298_1b1b5443,#txt302_1b1b5443 {font-family:fnt5; font-size:25px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt299_1b1b5443,#txt303_1b1b5443 {font-family:fnt5; font-size:16.667px; line-height:19px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt300_1b1b5443,#txt304_1b1b5443 {font-family:fnt5; font-size:25px; line-height:29px; font-weight:bold; color:#000066;}#txt301_1b1b5443,#txt305_1b1b5443 {font-family:fnt5; font-size:16.667px; line-height:19px; font-weight:bold; color:#000066;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide20.js b/experiment/simulation/EE4/iframes/data/slide20.js new file mode 100644 index 0000000..3256fb6 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide20.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(19, '
    Both  the  voltage  and  current  probes  are  then  attached  to  two  channels  of  DSO  and  the
    characteristics  drawn.
    Both  the  voltage  and  current  probes  are  then  attached  to  two  channels  of  DSO  and  the
    characteristics  drawn.
    1. variable  DC  source  as  main
    supply  to  the  circuit  is  taken.
    1. variable  DC  source  as  main
    supply  to  the  circuit  is  taken.
    2. MOSFET  mounted  on  heat  sink.
    2. MOSFET  mounted  on  heat  sink.
    3. load  (variable  resister  or
    rheostat)  is  attached.
    3. load  (variable  resister  or
    rheostat)  is  attached.
    4. DC  source  for  the  gate  of  the
    MOSFET  is  connected.
    4. DC  source  for  the  gate  of  the
    MOSFET  is  connected.
    5. Differential  probe  to  measure
    voltage  is  attached  across  the
    MOSFET.
    5. Differential  probe  to  measure
    voltage  is  attached  across  the
    MOSFET.
    6. Current  probe  is  attached  to
    measure  the  current.
    6. Current  probe  is  attached  to
    measure  the  current.
    Circuit Diagram To Plot Output Characteristics (Method-2: Using Oscilloscope)
    Circuit Diagram To Plot Output Characteristics (Method-2: Using Oscilloscope)
    Circuit Diagram To Plot Output Characteristics (Method-2: Using Oscilloscope)
    Circuit Diagram To Plot Output Characteristics (Method-2: Using Oscilloscope)
    The  graph  is  plotted
    directly  on  digital
    oscilloscope  (DSO).
    The  graph  is  plotted
    directly  on  digital
    oscilloscope  (DSO).
     
     
    The  DSO  should  be   set
    to  “X-Y  mode”.  Connect
    the  voltage  probe  ( V DS )
    to  Ch-1  (X-axis)  and
    current  probe  ( I D to  Ch-
    (Y-axis).
    The  DSO  should  be   set
    to  “X-Y  mode”.  Connect
    the  voltage  probe  ( V DS )
    to  Ch-1  (X-axis)  and
    current  probe  ( I D to  Ch-
    (Y-axis).
    Set  “V gs ”  and  change  the
    input  DC  supply  voltage
    gradually.  “v-i”
    characteristics  gets
    displayed  on  the  DSO
    screen.
    Set  “V gs ”  and  change  the
    input  DC  supply  voltage
    gradually.  “v-i”
    characteristics  gets
    displayed  on  the  DSO
    screen.
    V in_1
    V in_1
    V in_n
    V in_n
    V DS
    V DS
    I D
    I D
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide21.css b/experiment/simulation/EE4/iframes/data/slide21.css new file mode 100644 index 0000000..6481462 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide21.css @@ -0,0 +1 @@ +#spr1_1b1b57fc {clip:rect(0px,960px,540px,0px);}#spr3_1b1b57fc,#spr4_1b1b57fc,#spr5_1b1b57fc,#spr6_1b1b57fc,#spr10_1b1b57fc,#spr14_1b1b57fc,#spr15_1b1b57fc,#spr20_1b1b57fc,#spr25_1b1b57fc,#spr30_1b1b57fc,#spr33_1b1b57fc,#spr34_1b1b57fc,#spr35_1b1b57fc,#spr36_1b1b57fc,#spr37_1b1b57fc,#spr38_1b1b57fc,#spr39_1b1b57fc,#spr40_1b1b57fc,#spr41_1b1b57fc,#spr42_1b1b57fc,#spr43_1b1b57fc,#spr45_1b1b57fc,#spr46_1b1b57fc,#spr47_1b1b57fc,#spr48_1b1b57fc,#spr49_1b1b57fc,#spr50_1b1b57fc,#spr52_1b1b57fc,#spr53_1b1b57fc,#spr54_1b1b57fc,#spr55_1b1b57fc,#spr57_1b1b57fc,#spr58_1b1b57fc,#spr59_1b1b57fc,#spr60_1b1b57fc,#spr61_1b1b57fc {display:none;}#spr8_1b1b57fc,#spr12_1b1b57fc {-webkit-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); -o-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); -ms-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); -moz-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0);}#svg0_1b1b57fc {-webkit-transform-origin:1.215px 0.806px; -moz-transform-origin:1.215px 0.806px; -o-transform-origin:1.215px 0.806px; -ms-transform-origin:1.215px 0.806px; transform-origin:1.215px 0.806px;}#spr9_1b1b57fc,#spr13_1b1b57fc {-webkit-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -o-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -ms-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -moz-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0);}#svg8_1b1b57fc {-webkit-transform-origin:1.212px 0.808px; -moz-transform-origin:1.212px 0.808px; -o-transform-origin:1.212px 0.808px; -ms-transform-origin:1.212px 0.808px; transform-origin:1.212px 0.808px;}#svg16_1b1b57fc {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#svg17_1b1b57fc {pointer-events:none;}#txt0_1b1b57fc,#txt1_1b1b57fc {font-family:fnt5; font-size:15px; line-height:17px; font-weight:bold; color:#0000ff;}#svg18_1b1b57fc {-webkit-transform-origin:9px 9px; -moz-transform-origin:9px 9px; -o-transform-origin:9px 9px; -ms-transform-origin:9px 9px; transform-origin:9px 9px;}#txt2_1b1b57fc,#txt3_1b1b57fc,#txt4_1b1b57fc {font-family:fnt5; font-size:16px; line-height:18px; font-weight:bold; color:#203864;}#svg19_1b1b57fc {-webkit-transform-origin:9px 9px; -moz-transform-origin:9px 9px; -o-transform-origin:9px 9px; -ms-transform-origin:9px 9px; transform-origin:9px 9px; display:none;}#spr44_1b1b57fc {-webkit-transform:matrix(-0,1,-1,-0,0,0); -o-transform:matrix(-0,1,-1,-0,0,0); -ms-transform:matrix(-0,1,-1,-0,0,0); -moz-transform:matrix(-0,1,-1,-0,0,0); transform:matrix(-0,1,-1,-0,0,0); display:none;}#spr51_1b1b57fc {-webkit-transform:matrix(0.901641,-0.432485,0.432485,0.901641,0,0); -o-transform:matrix(0.901641,-0.432485,0.432485,0.901641,0,0); -ms-transform:matrix(0.901641,-0.432485,0.432485,0.901641,0,0); -moz-transform:matrix(0.901641,-0.432485,0.432485,0.901641,0,0); transform:matrix(0.901641,-0.432485,0.432485,0.901641,0,0); display:none;}#spr56_1b1b57fc {-webkit-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); -o-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); -ms-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); -moz-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); display:none;}#txt5_1b1b57fc {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt6_1b1b57fc {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt7_1b1b57fc {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt8_1b1b57fc {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide21.js b/experiment/simulation/EE4/iframes/data/slide21.js new file mode 100644 index 0000000..9c44754 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide21.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(20, '
    Volt
    Probe
    Amp
    Probe
    DSO
    Test Circuit Connection Diagram (Using Oscilloscope)
    Test Circuit Connection Diagram (Using Oscilloscope)
    Test Circuit Connection Diagram (Using Oscilloscope)
    Test Circuit Connection Diagram (Using Oscilloscope)
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide22.css b/experiment/simulation/EE4/iframes/data/slide22.css new file mode 100644 index 0000000..d184b09 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide22.css @@ -0,0 +1 @@ +#spr1_1b1b6049 {clip:rect(0px,960px,540px,0px);}#txt0_1b1b6049,#txt1_1b1b6049,#txt2_1b1b6049,#txt3_1b1b6049,#txt4_1b1b6049 {font-family:fnt11; font-size:32px; line-height:45px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide22.js b/experiment/simulation/EE4/iframes/data/slide22.js new file mode 100644 index 0000000..8d3293c --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide22.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(21, '
    Formulation of
    Circuit set-up
    and procedure for
    Transfer  Characteristics
    generation
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide23.css b/experiment/simulation/EE4/iframes/data/slide23.css new file mode 100644 index 0000000..8322eaf --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide23.css @@ -0,0 +1 @@ +#spr1_1b1b6162 {clip:rect(0px,960px,540px,0px);}#spr3_1b1b6162,#spr4_1b1b6162,#spr5_1b1b6162,#spr6_1b1b6162,#spr7_1b1b6162,#spr8_1b1b6162,#spr9_1b1b6162,#spr10_1b1b6162,#spr11_1b1b6162,#spr12_1b1b6162,#spr17_1b1b6162,#spr22_1b1b6162,#spr23_1b1b6162,#spr24_1b1b6162,#spr28_1b1b6162,#spr29_1b1b6162,#spr30_1b1b6162,#spr31_1b1b6162,#spr32_1b1b6162,#spr33_1b1b6162,#spr34_1b1b6162,#spr35_1b1b6162,#spr36_1b1b6162,#spr37_1b1b6162,#spr42_1b1b6162,#spr48_1b1b6162,#spr49_1b1b6162 {display:none;}#txt0_1b1b6162,#txt6_1b1b6162,#txt10_1b1b6162,#txt16_1b1b6162,#txt26_1b1b6162,#txt32_1b1b6162,#txt40_1b1b6162,#txt41_1b1b6162,#txt42_1b1b6162,#txt43_1b1b6162,#txt44_1b1b6162,#txt45_1b1b6162,#txt46_1b1b6162,#txt47_1b1b6162,#txt48_1b1b6162,#txt49_1b1b6162,#txt50_1b1b6162,#txt51_1b1b6162,#txt52_1b1b6162,#txt53_1b1b6162 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt1_1b1b6162,#txt2_1b1b6162,#txt7_1b1b6162,#txt11_1b1b6162,#txt12_1b1b6162,#txt17_1b1b6162,#txt19_1b1b6162,#txt20_1b1b6162,#txt27_1b1b6162,#txt28_1b1b6162,#txt33_1b1b6162,#txt34_1b1b6162 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt3_1b1b6162 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#254f2f;}#txt4_1b1b6162,#txt5_1b1b6162 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#254f2f;}#txt8_1b1b6162 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#c00000;}#txt9_1b1b6162 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#c00000;}#txt13_1b1b6162 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#0070c0;}#txt14_1b1b6162,#txt15_1b1b6162 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#0070c0;}#txt18_1b1b6162 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt21_1b1b6162 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#7030a0;}#txt22_1b1b6162,#txt24_1b1b6162,#txt25_1b1b6162 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#7030a0;}#txt23_1b1b6162 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:#7030a0;}#txt29_1b1b6162 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#0d0d0d;}#txt30_1b1b6162,#txt31_1b1b6162 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#0d0d0d;}#txt35_1b1b6162 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#ff0066;}#txt36_1b1b6162,#txt37_1b1b6162 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#ff0066;}#svg0_1b1b6162 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#svg1_1b1b6162,#svg2_1b1b6162 {pointer-events:none;}#txt38_1b1b6162 {font-family:fnt5; font-size:40px; line-height:46px; font-weight:bold; color:#0000ff;}#txt39_1b1b6162 {font-family:fnt5; font-size:30px; line-height:34px; font-weight:bold; color:#0000ff;}#txt54_1b1b6162,#txt55_1b1b6162,#txt56_1b1b6162,#txt57_1b1b6162,#txt58_1b1b6162,#txt59_1b1b6162,#txt60_1b1b6162,#txt61_1b1b6162,#txt62_1b1b6162,#txt63_1b1b6162,#txt64_1b1b6162,#txt65_1b1b6162,#txt66_1b1b6162,#txt67_1b1b6162 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#0000e2;}#txt68_1b1b6162 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt69_1b1b6162 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt70_1b1b6162 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt71_1b1b6162 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide23.js b/experiment/simulation/EE4/iframes/data/slide23.js new file mode 100644 index 0000000..5a54a90 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide23.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(22, '
    1. A DC source as main supply to
    the circuit is taken.
    1. A DC source as main supply to
    the circuit is taken.
    2. A MOSFET mounted on heat sink.
    2. A MOSFET mounted on heat sink.
    3. A load (variable resister or
    rheostat) is attached.
    3. A load (variable resister or
    rheostat) is attached.
    4. A low power DC source for “V gs
    setting.
    4. A low power DC source for “V gs
    setting.
    5. An ammeter is attached in series
    with the MOSFET.
    5. An ammeter is attached in series
    with the MOSFET.
    6. A voltmeter is attached across
    the MOSFET.
    6. A voltmeter is attached across
    the MOSFET.
    v
    A
    Observe:  This  is  series  circuit.  The  current  flowing  throughout  the  circuit  is  same.
    Observe:  This  is  series  circuit.  The  current  flowing  throughout  the  circuit  is  same.
    Circuit Diagram To Plot Transfer Characteristics
    Circuit Diagram To Plot Transfer Characteristics
    Circuit Diagram To Plot Transfer Characteristics
    Circuit Diagram To Plot Transfer Characteristics
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide24.css b/experiment/simulation/EE4/iframes/data/slide24.css new file mode 100644 index 0000000..5325187 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide24.css @@ -0,0 +1 @@ +#spr1_1b1b68d4 {clip:rect(0px,960px,540px,0px);}#txt0_1b1b68d4,#txt6_1b1b68d4,#txt10_1b1b68d4,#txt16_1b1b68d4,#txt22_1b1b68d4,#txt28_1b1b68d4 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt1_1b1b68d4,#txt2_1b1b68d4,#txt7_1b1b68d4,#txt11_1b1b68d4,#txt12_1b1b68d4,#txt17_1b1b68d4,#txt18_1b1b68d4,#txt23_1b1b68d4,#txt24_1b1b68d4,#txt29_1b1b68d4,#txt30_1b1b68d4,#txt34_1b1b68d4,#txt35_1b1b68d4,#txt36_1b1b68d4,#txt37_1b1b68d4,#txt38_1b1b68d4,#txt39_1b1b68d4,#txt40_1b1b68d4,#txt41_1b1b68d4,#txt42_1b1b68d4,#txt43_1b1b68d4,#txt44_1b1b68d4,#txt45_1b1b68d4,#txt46_1b1b68d4,#txt47_1b1b68d4,#txt70_1b1b68d4,#txt71_1b1b68d4,#txt72_1b1b68d4,#txt73_1b1b68d4,#txt74_1b1b68d4,#txt75_1b1b68d4,#txt76_1b1b68d4,#txt77_1b1b68d4,#txt78_1b1b68d4,#txt79_1b1b68d4,#txt80_1b1b68d4,#txt83_1b1b68d4,#txt98_1b1b68d4,#txt99_1b1b68d4,#txt100_1b1b68d4,#txt101_1b1b68d4,#txt104_1b1b68d4,#txt105_1b1b68d4,#txt106_1b1b68d4,#txt116_1b1b68d4,#txt117_1b1b68d4,#txt118_1b1b68d4,#txt119_1b1b68d4,#txt120_1b1b68d4,#txt121_1b1b68d4,#txt122_1b1b68d4,#txt123_1b1b68d4,#txt124_1b1b68d4,#txt128_1b1b68d4,#txt129_1b1b68d4,#txt130_1b1b68d4,#txt133_1b1b68d4,#txt152_1b1b68d4,#txt153_1b1b68d4,#txt154_1b1b68d4,#txt155_1b1b68d4,#txt156_1b1b68d4,#txt157_1b1b68d4,#txt158_1b1b68d4,#txt159_1b1b68d4,#txt160_1b1b68d4,#txt161_1b1b68d4,#txt162_1b1b68d4,#txt163_1b1b68d4 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt3_1b1b68d4,#txt8_1b1b68d4,#txt13_1b1b68d4,#txt19_1b1b68d4,#txt25_1b1b68d4,#txt31_1b1b68d4 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#254f2f;}#txt4_1b1b68d4,#txt5_1b1b68d4,#txt9_1b1b68d4,#txt14_1b1b68d4,#txt15_1b1b68d4,#txt20_1b1b68d4,#txt21_1b1b68d4,#txt26_1b1b68d4,#txt27_1b1b68d4,#txt32_1b1b68d4,#txt33_1b1b68d4 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#254f2f;}#svg0_1b1b68d4 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px;}#txt48_1b1b68d4,#txt49_1b1b68d4,#txt50_1b1b68d4,#txt51_1b1b68d4,#txt52_1b1b68d4,#txt53_1b1b68d4,#txt54_1b1b68d4,#txt55_1b1b68d4,#txt56_1b1b68d4,#txt57_1b1b68d4,#txt58_1b1b68d4,#txt59_1b1b68d4,#txt60_1b1b68d4,#txt61_1b1b68d4 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#512373;}#txt62_1b1b68d4 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt63_1b1b68d4 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#spr9_1b1b68d4,#spr12_1b1b68d4,#spr13_1b1b68d4,#spr14_1b1b68d4,#spr15_1b1b68d4 {display:none;}#svg11_1b1b68d4,#svg22_1b1b68d4,#svg33_1b1b68d4 {-webkit-transform-origin:12px 9px; -moz-transform-origin:12px 9px; -o-transform-origin:12px 9px; -ms-transform-origin:12px 9px; transform-origin:12px 9px;}#svg34_1b1b68d4,#svg35_1b1b68d4 {pointer-events:none;}#txt64_1b1b68d4,#txt67_1b1b68d4 {font-family:fnt12; font-size:18px; line-height:21px; font-weight:bold; font-style:italic; color:#000000;}#txt65_1b1b68d4,#txt66_1b1b68d4,#txt68_1b1b68d4,#txt69_1b1b68d4 {font-family:fnt12; font-size:12px; line-height:14px; font-weight:bold; font-style:italic; color:#000000;}#txt81_1b1b68d4,#txt102_1b1b68d4,#txt125_1b1b68d4,#txt127_1b1b68d4,#txt131_1b1b68d4 {font-family:fnt10; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt82_1b1b68d4,#txt103_1b1b68d4,#txt126_1b1b68d4,#txt132_1b1b68d4 {font-family:fnt10; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt84_1b1b68d4,#txt85_1b1b68d4,#txt86_1b1b68d4,#txt87_1b1b68d4,#txt88_1b1b68d4,#txt89_1b1b68d4,#txt90_1b1b68d4,#txt91_1b1b68d4,#txt92_1b1b68d4,#txt93_1b1b68d4,#txt94_1b1b68d4,#txt97_1b1b68d4 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#c00000;}#txt95_1b1b68d4 {font-family:fnt10; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:#c00000;}#txt96_1b1b68d4 {font-family:fnt10; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:#c00000;}#txt107_1b1b68d4,#txt108_1b1b68d4,#txt109_1b1b68d4,#txt110_1b1b68d4,#txt113_1b1b68d4,#txt114_1b1b68d4,#txt115_1b1b68d4 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#003300;}#txt111_1b1b68d4 {font-family:fnt10; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:#003300;}#txt112_1b1b68d4 {font-family:fnt10; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:#003300;}#txt134_1b1b68d4,#txt135_1b1b68d4,#txt136_1b1b68d4,#txt137_1b1b68d4,#txt138_1b1b68d4,#txt139_1b1b68d4,#txt140_1b1b68d4,#txt141_1b1b68d4,#txt142_1b1b68d4,#txt146_1b1b68d4,#txt147_1b1b68d4,#txt148_1b1b68d4,#txt151_1b1b68d4 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#0000e2;}#txt143_1b1b68d4,#txt145_1b1b68d4,#txt149_1b1b68d4 {font-family:fnt10; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:#0000e2;}#txt144_1b1b68d4,#txt150_1b1b68d4 {font-family:fnt10; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:#0000e2;}#txt164_1b1b68d4,#txt165_1b1b68d4,#txt166_1b1b68d4,#txt167_1b1b68d4,#txt168_1b1b68d4,#txt169_1b1b68d4,#txt170_1b1b68d4,#txt171_1b1b68d4,#txt172_1b1b68d4,#txt173_1b1b68d4,#txt174_1b1b68d4,#txt175_1b1b68d4 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#9900cc;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide24.js b/experiment/simulation/EE4/iframes/data/slide24.js new file mode 100644 index 0000000..331cd31 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide24.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(23, '
    1. A DC source as main supply to
    the circuit is taken.
    1. A DC source as main supply to
    the circuit is taken.
    2. A MOSFET mounted on heat sink.
    2. A MOSFET mounted on heat sink.
    3. A load (variable resister or
    rheostat) is attached.
    3. A load (variable resister or
    rheostat) is attached.
    4. A variable DC source for the gate
    of the MOSFET is connected.
    4. A variable DC source for the gate
    of the MOSFET is connected.
    5. An ammeter is attached in series
    with the MOSFET.
    5. An ammeter is attached in series
    with the MOSFET.
    6. A voltmeter is attached across
    the MOSFET.
    6. A voltmeter is attached across
    the MOSFET.
    Observe:  This  is  series  circuit.  The  current  flowing  throughout  the  circuit  is  same.
    Observe:  This  is  series  circuit.  The  current  flowing  throughout  the  circuit  is  same.
    Circuit Diagram To Plot Transfer Characteristics
    Circuit Diagram To Plot Transfer Characteristics
    V g _1
    V g _n
    Set  input  DC  supply  voltage  i.e.
    maintain  constant  Drain-to-Source
    voltage  ( V DS  ).
    Set  input  DC  supply  voltage  i.e.
    maintain  constant  Drain-to-Source
    voltage  ( V DS  ).
    Change  gate-to-source  voltage  ( V GS )
    in  steps.
    Change  gate-to-source  voltage  ( V GS )
    in  steps.
    Ammeter  and  Voltmeter  show  the
    corresponding  Drain  current  ( I D and
    the  voltage  V GS .
    Ammeter  and  Voltmeter  show  the
    corresponding  Drain  current  ( I D and
    the  voltage  V GS .
    Plot  these  data  points  on  graph  to
    observe  the  “Transfer  Characteristic”.
    Plot  these  data  points  on  graph  to
    observe  the  “Transfer  Characteristic”.
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide25.css b/experiment/simulation/EE4/iframes/data/slide25.css new file mode 100644 index 0000000..6765040 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide25.css @@ -0,0 +1 @@ +#spr1_1b1b6b55 {clip:rect(0px,960px,540px,0px);}#spr3_1b1b6b55,#spr4_1b1b6b55,#spr5_1b1b6b55,#spr6_1b1b6b55,#spr7_1b1b6b55,#spr8_1b1b6b55,#spr12_1b1b6b55,#spr16_1b1b6b55,#spr21_1b1b6b55,#spr27_1b1b6b55,#spr28_1b1b6b55,#spr33_1b1b6b55,#spr38_1b1b6b55,#spr39_1b1b6b55,#spr44_1b1b6b55,#spr50_1b1b6b55,#spr55_1b1b6b55,#spr60_1b1b6b55,#spr61_1b1b6b55,#spr62_1b1b6b55,#spr63_1b1b6b55,#spr64_1b1b6b55,#spr65_1b1b6b55,#spr66_1b1b6b55,#spr67_1b1b6b55,#spr68_1b1b6b55,#spr69_1b1b6b55,#spr70_1b1b6b55,#spr71_1b1b6b55,#spr72_1b1b6b55,#spr73_1b1b6b55,#spr74_1b1b6b55,#spr75_1b1b6b55,#spr76_1b1b6b55,#spr77_1b1b6b55 {display:none;}#spr10_1b1b6b55,#spr14_1b1b6b55 {-webkit-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); -o-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); -ms-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); -moz-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0);}#svg0_1b1b6b55 {-webkit-transform-origin:1.215px 0.806px; -moz-transform-origin:1.215px 0.806px; -o-transform-origin:1.215px 0.806px; -ms-transform-origin:1.215px 0.806px; transform-origin:1.215px 0.806px;}#spr11_1b1b6b55,#spr15_1b1b6b55 {-webkit-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -o-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -ms-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -moz-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0);}#svg8_1b1b6b55 {-webkit-transform-origin:1.212px 0.808px; -moz-transform-origin:1.212px 0.808px; -o-transform-origin:1.212px 0.808px; -ms-transform-origin:1.212px 0.808px; transform-origin:1.212px 0.808px;}#svg16_1b1b6b55 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#svg17_1b1b6b55,#svg18_1b1b6b55,#svg19_1b1b6b55,#svg20_1b1b6b55 {pointer-events:none;}#txt0_1b1b6b55 {font-family:fnt5; font-size:30px; line-height:34px; font-weight:bold; color:#0000ff;}#txt1_1b1b6b55 {font-family:fnt5; font-size:20px; line-height:23px; font-weight:bold; color:#0000ff;}#spr26_1b1b6b55,#spr49_1b1b6b55 {-webkit-transform:matrix(-0,1,-1,-0,0,0); -o-transform:matrix(-0,1,-1,-0,0,0); -ms-transform:matrix(-0,1,-1,-0,0,0); -moz-transform:matrix(-0,1,-1,-0,0,0); transform:matrix(-0,1,-1,-0,0,0); display:none;}#txt2_1b1b6b55 {font-family:fnt5; font-size:23px; line-height:26px; font-weight:bold; color:#0000ff;}#txt3_1b1b6b55 {font-family:fnt5; font-size:17px; line-height:20px; font-weight:bold; color:#0000ff;}#txt4_1b1b6b55 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt5_1b1b6b55 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt6_1b1b6b55 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt7_1b1b6b55 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide25.js b/experiment/simulation/EE4/iframes/data/slide25.js new file mode 100644 index 0000000..410a0f5 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide25.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(24, '
    v
    A
    v
    A
    Test Circuit Connection Diagram for Transfer Characteristics
    Test Circuit Connection Diagram for Transfer Characteristics
    Test Circuit Connection Diagram for Transfer Characteristics
    Test Circuit Connection Diagram for Transfer Characteristics
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide26.css b/experiment/simulation/EE4/iframes/data/slide26.css new file mode 100644 index 0000000..bb25a09 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide26.css @@ -0,0 +1 @@ +#spr1_1b1b77b9 {clip:rect(0px,960px,540px,0px);}#txt0_1b1b77b9,#txt1_1b1b77b9,#txt2_1b1b77b9,#txt3_1b1b77b9,#txt4_1b1b77b9 {font-family:fnt11; font-size:32px; line-height:45px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide26.js b/experiment/simulation/EE4/iframes/data/slide26.js new file mode 100644 index 0000000..0414fbb --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide26.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(25, '
    Formulation of
    Circuit set-up
    and procedure for
    Switching Characteristics
    generation
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide27.css b/experiment/simulation/EE4/iframes/data/slide27.css new file mode 100644 index 0000000..5782184 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide27.css @@ -0,0 +1 @@ +#spr1_1b1b78f1 {clip:rect(0px,960px,540px,0px);}#svg0_1b1b78f1 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#spr3_1b1b78f1,#spr8_1b1b78f1,#spr13_1b1b78f1,#spr14_1b1b78f1,#spr15_1b1b78f1,#spr16_1b1b78f1,#spr30_1b1b78f1,#spr35_1b1b78f1,#spr40_1b1b78f1,#spr41_1b1b78f1,#spr42_1b1b78f1,#spr43_1b1b78f1,#spr44_1b1b78f1,#spr45_1b1b78f1,#spr46_1b1b78f1,#spr47_1b1b78f1,#spr48_1b1b78f1,#spr49_1b1b78f1,#spr50_1b1b78f1,#spr51_1b1b78f1,#spr52_1b1b78f1,#spr53_1b1b78f1,#spr54_1b1b78f1,#spr55_1b1b78f1,#spr56_1b1b78f1,#spr57_1b1b78f1,#spr64_1b1b78f1 {display:none;}#svg1_1b1b78f1,#svg2_1b1b78f1 {pointer-events:none;}#txt0_1b1b78f1 {font-family:fnt5; font-size:40px; line-height:46px; font-weight:bold; color:#0000ff;}#txt1_1b1b78f1 {font-family:fnt5; font-size:30px; line-height:34px; font-weight:bold; color:#0000ff;}#txt2_1b1b78f1,#txt3_1b1b78f1 {font-family:fnt5; font-size:18px; line-height:21px; font-weight:bold; color:#203864;}#txt4_1b1b78f1 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt5_1b1b78f1 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt6_1b1b78f1 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt7_1b1b78f1 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#txt8_1b1b78f1,#txt9_1b1b78f1,#txt10_1b1b78f1,#txt11_1b1b78f1,#txt12_1b1b78f1,#txt13_1b1b78f1,#txt14_1b1b78f1,#txt15_1b1b78f1,#txt16_1b1b78f1,#txt17_1b1b78f1,#txt18_1b1b78f1,#txt30_1b1b78f1,#txt31_1b1b78f1,#txt32_1b1b78f1,#txt33_1b1b78f1,#txt34_1b1b78f1,#txt35_1b1b78f1,#txt36_1b1b78f1,#txt37_1b1b78f1,#txt38_1b1b78f1,#txt39_1b1b78f1,#txt40_1b1b78f1,#txt41_1b1b78f1,#txt42_1b1b78f1,#txt43_1b1b78f1,#txt44_1b1b78f1,#txt45_1b1b78f1,#txt46_1b1b78f1,#txt47_1b1b78f1,#txt48_1b1b78f1 {font-family:fnt13; font-size:22px; line-height:29px; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt19_1b1b78f1,#txt20_1b1b78f1,#txt21_1b1b78f1,#txt22_1b1b78f1,#txt23_1b1b78f1,#txt24_1b1b78f1,#txt25_1b1b78f1,#txt26_1b1b78f1,#txt27_1b1b78f1,#txt28_1b1b78f1,#txt29_1b1b78f1 {font-family:fnt13; font-size:22px; line-height:29px; color:#c00000;}#txt49_1b1b78f1,#txt50_1b1b78f1,#txt51_1b1b78f1,#txt52_1b1b78f1,#txt53_1b1b78f1,#txt54_1b1b78f1,#txt55_1b1b78f1,#txt56_1b1b78f1,#txt57_1b1b78f1,#txt58_1b1b78f1,#txt59_1b1b78f1,#txt60_1b1b78f1,#txt61_1b1b78f1,#txt62_1b1b78f1,#txt63_1b1b78f1,#txt64_1b1b78f1,#txt65_1b1b78f1,#txt66_1b1b78f1,#txt67_1b1b78f1 {font-family:fnt13; font-size:22px; line-height:29px; color:#003300;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide27.js b/experiment/simulation/EE4/iframes/data/slide27.js new file mode 100644 index 0000000..22ff154 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide27.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(26, '
    v
    A
    Gate
    Pulses
    MOSFET Switching Characteristics Using Buck Converter (Circuit Diagram)
    MOSFET Switching Characteristics Using Buck Converter (Circuit Diagram)
    MOSFET Switching Characteristics Using Buck Converter (Circuit Diagram)
    MOSFET Switching Characteristics Using Buck Converter (Circuit Diagram)
    To  study  the  switching
    characteristics  of
    MOSFET,  Buck  converter
    is  taken.
    To  study  the  switching
    characteristics  of
    MOSFET,  Buck  converter
    is  taken.
    The  MOSFET  acts  as  a
    switch.  It  is  turned  ON
    and  OFF  via  the  Pulses
    given  across  the  Gate.
    The  MOSFET  acts  as  a
    switch.  It  is  turned  ON
    and  OFF  via  the  Pulses
    given  across  the  Gate.
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide28.css b/experiment/simulation/EE4/iframes/data/slide28.css new file mode 100644 index 0000000..5e44bf5 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide28.css @@ -0,0 +1 @@ +#spr1_1b1b868e {clip:rect(0px,960px,540px,0px);}#spr3_1b1b868e,#spr4_1b1b868e,#spr5_1b1b868e,#spr7_1b1b868e,#spr8_1b1b868e,#spr9_1b1b868e,#spr10_1b1b868e,#spr11_1b1b868e,#spr12_1b1b868e,#spr13_1b1b868e,#spr14_1b1b868e,#spr15_1b1b868e,#spr29_1b1b868e,#spr34_1b1b868e,#spr39_1b1b868e,#spr43_1b1b868e,#spr44_1b1b868e,#spr45_1b1b868e,#spr50_1b1b868e,#spr54_1b1b868e,#spr55_1b1b868e,#spr56_1b1b868e,#spr57_1b1b868e,#spr58_1b1b868e,#spr59_1b1b868e,#spr60_1b1b868e,#spr62_1b1b868e,#spr63_1b1b868e,#spr64_1b1b868e,#spr65_1b1b868e,#spr66_1b1b868e,#spr67_1b1b868e,#spr69_1b1b868e,#spr73_1b1b868e,#spr74_1b1b868e,#spr75_1b1b868e,#spr76_1b1b868e,#spr77_1b1b868e,#spr81_1b1b868e,#spr85_1b1b868e,#spr86_1b1b868e,#spr87_1b1b868e,#spr88_1b1b868e,#spr90_1b1b868e {display:none;}#spr6_1b1b868e,#spr68_1b1b868e {-webkit-transform:matrix(0.997793,-0.066406,0.066406,0.997793,0,0); -o-transform:matrix(0.997793,-0.066406,0.066406,0.997793,0,0); -ms-transform:matrix(0.997793,-0.066406,0.066406,0.997793,0,0); -moz-transform:matrix(0.997793,-0.066406,0.066406,0.997793,0,0); transform:matrix(0.997793,-0.066406,0.066406,0.997793,0,0); display:none;}#svg0_1b1b868e {-webkit-transform-origin:4.5px 4.5px; -moz-transform-origin:4.5px 4.5px; -o-transform-origin:4.5px 4.5px; -ms-transform-origin:4.5px 4.5px; transform-origin:4.5px 4.5px; display:none;}#txt0_1b1b868e,#txt1_1b1b868e {font-family:fnt5; font-size:15px; line-height:17px; font-weight:bold; color:#203864;}#svg1_1b1b868e {pointer-events:none;}#txt2_1b1b868e,#txt3_1b1b868e {font-family:fnt5; font-size:13px; line-height:15px; font-weight:bold; color:#0000ff;}#txt4_1b1b868e,#txt5_1b1b868e {font-family:fnt5; font-size:14px; line-height:16px; font-weight:bold; color:#203864;}#svg2_1b1b868e {-webkit-transform-origin:9px 9px; -moz-transform-origin:9px 9px; -o-transform-origin:9px 9px; -ms-transform-origin:9px 9px; transform-origin:9px 9px; display:none;}#txt6_1b1b868e {font-family:fnt5; font-size:16px; line-height:18px; font-weight:bold; color:#203864;}#spr61_1b1b868e {-webkit-transform:matrix(-0,1,-1,-0,0,0); -o-transform:matrix(-0,1,-1,-0,0,0); -ms-transform:matrix(-0,1,-1,-0,0,0); -moz-transform:matrix(-0,1,-1,-0,0,0); transform:matrix(-0,1,-1,-0,0,0); display:none;}#txt7_1b1b868e {font-family:fnt14; font-size:18px; line-height:26px; color:#ffffff;}#txt8_1b1b868e {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt9_1b1b868e {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt10_1b1b868e {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt11_1b1b868e {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#spr80_1b1b868e {-webkit-transform:matrix(0.997124,-0.075794,0.075794,0.997124,0,0); -o-transform:matrix(0.997124,-0.075794,0.075794,0.997124,0,0); -ms-transform:matrix(0.997124,-0.075794,0.075794,0.997124,0,0); -moz-transform:matrix(0.997124,-0.075794,0.075794,0.997124,0,0); transform:matrix(0.997124,-0.075794,0.075794,0.997124,0,0); display:none;}#spr84_1b1b868e {-webkit-transform:matrix(0.936959,-0.34944,0.34944,0.936959,0,0); -o-transform:matrix(0.936959,-0.34944,0.34944,0.936959,0,0); -ms-transform:matrix(0.936959,-0.34944,0.34944,0.936959,0,0); -moz-transform:matrix(0.936959,-0.34944,0.34944,0.936959,0,0); transform:matrix(0.936959,-0.34944,0.34944,0.936959,0,0); display:none;}#spr89_1b1b868e {-webkit-transform:matrix(0.648236,0.76144,-0.76144,0.648236,0,0); -o-transform:matrix(0.648236,0.76144,-0.76144,0.648236,0,0); -ms-transform:matrix(0.648236,0.76144,-0.76144,0.648236,0,0); -moz-transform:matrix(0.648236,0.76144,-0.76144,0.648236,0,0); transform:matrix(0.648236,0.76144,-0.76144,0.648236,0,0); display:none;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide28.js b/experiment/simulation/EE4/iframes/data/slide28.js new file mode 100644 index 0000000..55502f5 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide28.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(27, '
    Gate
    Pulses
    Volt
    Probe
    Amp
    Probe
    DSO
     
    MOSFET Switching Characteristics Using Buck Converter (Circuit Diagram)
    MOSFET Switching Characteristics Using Buck Converter (Circuit Diagram)
    MOSFET Switching Characteristics Using Buck Converter (Circuit Diagram)
    MOSFET Switching Characteristics Using Buck Converter (Circuit Diagram)
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide29.css b/experiment/simulation/EE4/iframes/data/slide29.css new file mode 100644 index 0000000..efe9be6 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide29.css @@ -0,0 +1 @@ +#spr1_1b1b98ae {clip:rect(0px,960px,540px,0px);}#txt0_1b1b98ae,#txt1_1b1b98ae {font-family:fnt11; font-size:40px; line-height:56px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide29.js b/experiment/simulation/EE4/iframes/data/slide29.js new file mode 100644 index 0000000..c2fd8d4 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide29.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(28, '
    MOSFET as:
    Current limiter
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide3.css b/experiment/simulation/EE4/iframes/data/slide3.css new file mode 100644 index 0000000..77ba15a --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide3.css @@ -0,0 +1 @@ +#spr1_1b1b06bf {clip:rect(0px,960px,540px,0px);}#spr3_1b1b06bf,#spr4_1b1b06bf,#spr5_1b1b06bf,#spr6_1b1b06bf,#spr7_1b1b06bf,#spr8_1b1b06bf,#spr12_1b1b06bf,#spr13_1b1b06bf,#spr14_1b1b06bf,#spr15_1b1b06bf,#spr16_1b1b06bf {display:none;}#txt0_1b1b06bf,#txt1_1b1b06bf,#txt2_1b1b06bf {font-family:fnt6; font-size:18px; line-height:26px; font-weight:bold; color:#0d0d0d;}#txt3_1b1b06bf,#txt4_1b1b06bf,#txt5_1b1b06bf,#txt6_1b1b06bf,#txt7_1b1b06bf,#txt8_1b1b06bf,#txt9_1b1b06bf,#txt10_1b1b06bf,#txt11_1b1b06bf,#txt12_1b1b06bf,#txt13_1b1b06bf,#txt14_1b1b06bf,#txt15_1b1b06bf,#txt16_1b1b06bf,#txt17_1b1b06bf,#txt18_1b1b06bf,#txt19_1b1b06bf,#txt20_1b1b06bf,#txt21_1b1b06bf,#txt22_1b1b06bf,#txt23_1b1b06bf,#txt24_1b1b06bf,#txt25_1b1b06bf,#txt26_1b1b06bf,#txt27_1b1b06bf,#txt28_1b1b06bf,#txt29_1b1b06bf,#txt30_1b1b06bf,#txt31_1b1b06bf,#txt32_1b1b06bf,#txt33_1b1b06bf,#txt34_1b1b06bf,#txt35_1b1b06bf,#txt36_1b1b06bf,#txt37_1b1b06bf,#txt38_1b1b06bf,#txt39_1b1b06bf,#txt40_1b1b06bf,#txt41_1b1b06bf,#txt42_1b1b06bf,#txt43_1b1b06bf,#txt44_1b1b06bf,#txt45_1b1b06bf,#txt46_1b1b06bf,#txt47_1b1b06bf,#txt48_1b1b06bf,#txt49_1b1b06bf,#txt50_1b1b06bf,#txt51_1b1b06bf,#txt52_1b1b06bf,#txt53_1b1b06bf,#txt54_1b1b06bf,#txt55_1b1b06bf,#txt56_1b1b06bf,#txt57_1b1b06bf,#txt58_1b1b06bf,#txt59_1b1b06bf,#txt60_1b1b06bf,#txt61_1b1b06bf,#txt62_1b1b06bf,#txt63_1b1b06bf,#txt64_1b1b06bf,#txt65_1b1b06bf,#txt66_1b1b06bf,#txt67_1b1b06bf,#txt68_1b1b06bf,#txt69_1b1b06bf,#txt70_1b1b06bf,#txt81_1b1b06bf,#txt82_1b1b06bf,#txt83_1b1b06bf,#txt84_1b1b06bf,#txt85_1b1b06bf,#txt86_1b1b06bf,#txt87_1b1b06bf,#txt88_1b1b06bf,#txt89_1b1b06bf,#txt90_1b1b06bf,#txt91_1b1b06bf,#txt92_1b1b06bf,#txt93_1b1b06bf,#txt94_1b1b06bf,#txt95_1b1b06bf,#txt96_1b1b06bf,#txt97_1b1b06bf,#txt98_1b1b06bf {font-family:fnt6; font-size:22px; line-height:32px; font-weight:bold; color:#ffffff;}#svg0_1b1b06bf {-webkit-transform-origin:46.066px 0.13px; -moz-transform-origin:46.066px 0.13px; -o-transform-origin:46.066px 0.13px; -ms-transform-origin:46.066px 0.13px; transform-origin:46.066px 0.13px; display:none;}#txt71_1b1b06bf {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt72_1b1b06bf {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt73_1b1b06bf {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt74_1b1b06bf {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#txt75_1b1b06bf,#txt77_1b1b06bf {font-family:fnt6; font-size:16px; line-height:23px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt76_1b1b06bf {font-family:fnt7; font-size:16px; line-height:23px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt78_1b1b06bf,#txt80_1b1b06bf {font-family:fnt6; font-size:16px; line-height:23px; font-weight:bold; color:#0000ff;}#txt79_1b1b06bf {font-family:fnt7; font-size:16px; line-height:23px; font-weight:bold; font-style:italic; color:#0000ff;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide3.js b/experiment/simulation/EE4/iframes/data/slide3.js new file mode 100644 index 0000000..b377d05 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide3.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(2, '
    But why do we plot
    these characteristics?
    How are they useful?
    To  use  device  in  any  power  conversion  applications,  its  behavior  under
    prevailing  conditions  in  the  circuit  (forward  and  reverse  biased)  should
    be  known  in  advance.  Manufacturer’s  datasheet  provides  all  the
    relevant  parameters  and  characteristics.
    To  study  the  performance  characteristics  of  MOSFET  :
    1. Output  Characteristics  (Drain  current-vs-Drain-to-source  voltage)
    2. Transfer  Characteristics  (Drain  current-vs-Gate-to-source  voltage)
    3. Switching  Characteristics  (Switch  Current  and  Switch  Voltage  pattern  during  turn-
    ON/OFF  transitions)
    AIM
    AIM
    AIM
    AIM
    What is meant by “ v-i
    characteristics”?
    What is meant by “ v-i
    characteristics”?
    Characteristics  of  any  device  is  the  tracing  of  current
    flowing  through  it  against  the  voltage  appearing  across
    it.
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide30.css b/experiment/simulation/EE4/iframes/data/slide30.css new file mode 100644 index 0000000..5d011a5 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide30.css @@ -0,0 +1 @@ +#spr1_1b1b99b8 {clip:rect(0px,960px,540px,0px);}#spr3_1b1b99b8,#spr4_1b1b99b8,#spr5_1b1b99b8,#spr6_1b1b99b8,#spr11_1b1b99b8,#spr12_1b1b99b8,#spr13_1b1b99b8,#spr14_1b1b99b8,#spr15_1b1b99b8,#spr20_1b1b99b8,#spr21_1b1b99b8,#spr22_1b1b99b8,#spr23_1b1b99b8,#spr24_1b1b99b8,#spr29_1b1b99b8,#spr30_1b1b99b8,#spr31_1b1b99b8,#spr35_1b1b99b8,#spr36_1b1b99b8,#spr37_1b1b99b8,#spr38_1b1b99b8,#spr39_1b1b99b8,#spr40_1b1b99b8,#spr44_1b1b99b8,#spr45_1b1b99b8 {display:none;}#svg0_1b1b99b8 {pointer-events:none;}#txt0_1b1b99b8,#txt1_1b1b99b8 {font-family:fnt5; font-size:18px; line-height:21px; font-weight:bold; color:#0000ff;}#svg1_1b1b99b8 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#txt2_1b1b99b8,#txt3_1b1b99b8 {font-family:fnt5; font-size:18px; line-height:21px; font-weight:bold; color:#203864;}#txt4_1b1b99b8,#txt32_1b1b99b8,#txt48_1b1b99b8,#txt76_1b1b99b8 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt5_1b1b99b8,#txt6_1b1b99b8,#txt7_1b1b99b8,#txt8_1b1b99b8,#txt9_1b1b99b8,#txt10_1b1b99b8,#txt11_1b1b99b8,#txt12_1b1b99b8,#txt13_1b1b99b8,#txt14_1b1b99b8,#txt15_1b1b99b8,#txt16_1b1b99b8,#txt17_1b1b99b8,#txt33_1b1b99b8,#txt34_1b1b99b8,#txt35_1b1b99b8,#txt36_1b1b99b8,#txt37_1b1b99b8,#txt38_1b1b99b8,#txt39_1b1b99b8,#txt49_1b1b99b8,#txt50_1b1b99b8,#txt51_1b1b99b8,#txt52_1b1b99b8,#txt53_1b1b99b8,#txt54_1b1b99b8,#txt55_1b1b99b8,#txt56_1b1b99b8,#txt57_1b1b99b8,#txt58_1b1b99b8,#txt59_1b1b99b8,#txt60_1b1b99b8,#txt61_1b1b99b8,#txt77_1b1b99b8,#txt78_1b1b99b8,#txt79_1b1b99b8,#txt80_1b1b99b8,#txt81_1b1b99b8,#txt82_1b1b99b8,#txt83_1b1b99b8,#txt84_1b1b99b8,#txt85_1b1b99b8,#txt86_1b1b99b8,#txt99_1b1b99b8,#txt100_1b1b99b8,#txt101_1b1b99b8,#txt102_1b1b99b8,#txt103_1b1b99b8,#txt104_1b1b99b8,#txt105_1b1b99b8,#txt106_1b1b99b8,#txt107_1b1b99b8,#txt108_1b1b99b8,#txt109_1b1b99b8,#txt110_1b1b99b8,#txt111_1b1b99b8 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt18_1b1b99b8 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#c00000;}#txt19_1b1b99b8,#txt20_1b1b99b8,#txt21_1b1b99b8,#txt22_1b1b99b8,#txt23_1b1b99b8,#txt24_1b1b99b8,#txt25_1b1b99b8,#txt26_1b1b99b8,#txt27_1b1b99b8,#txt28_1b1b99b8,#txt29_1b1b99b8,#txt30_1b1b99b8,#txt31_1b1b99b8 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#c00000;}#txt40_1b1b99b8 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#7030a0;}#txt41_1b1b99b8,#txt42_1b1b99b8,#txt43_1b1b99b8,#txt44_1b1b99b8,#txt45_1b1b99b8,#txt46_1b1b99b8,#txt47_1b1b99b8 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#7030a0;}#txt62_1b1b99b8 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#3333ff;}#txt63_1b1b99b8,#txt64_1b1b99b8,#txt65_1b1b99b8,#txt66_1b1b99b8,#txt67_1b1b99b8,#txt68_1b1b99b8,#txt69_1b1b99b8,#txt70_1b1b99b8,#txt71_1b1b99b8,#txt72_1b1b99b8,#txt73_1b1b99b8,#txt74_1b1b99b8,#txt75_1b1b99b8 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#3333ff;}#txt87_1b1b99b8 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#548235;}#txt88_1b1b99b8,#txt89_1b1b99b8,#txt90_1b1b99b8,#txt91_1b1b99b8,#txt92_1b1b99b8,#txt93_1b1b99b8,#txt94_1b1b99b8,#txt95_1b1b99b8,#txt96_1b1b99b8,#txt97_1b1b99b8 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#548235;}#txt98_1b1b99b8 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; text-decoration-line:underline; text-decoration-skip:none; text-decoration-skip-ink:none; text-decoration-thickness:1.467px; text-decoration-style:solid; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt112_1b1b99b8 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; text-decoration-line:underline; text-decoration-skip:none; text-decoration-skip-ink:none; text-decoration-thickness:1.467px; text-decoration-style:solid; color:#0d0d0d;}#txt113_1b1b99b8,#txt114_1b1b99b8,#txt115_1b1b99b8,#txt116_1b1b99b8,#txt117_1b1b99b8,#txt118_1b1b99b8,#txt119_1b1b99b8,#txt120_1b1b99b8,#txt121_1b1b99b8,#txt122_1b1b99b8,#txt123_1b1b99b8,#txt124_1b1b99b8,#txt125_1b1b99b8 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#0d0d0d;}#txt126_1b1b99b8 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt127_1b1b99b8 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt128_1b1b99b8 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt129_1b1b99b8 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide30.js b/experiment/simulation/EE4/iframes/data/slide30.js new file mode 100644 index 0000000..75ecf5a --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide30.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(29, '
    Volt
    Probe
    Amp
    Probe
    1. circuit  similar  to  the  one  used  to
    plot  the  characteristics  is  taken.
    1. circuit  similar  to  the  one  used  to
    plot  the  characteristics  is  taken.
    2. Fixed  source  and  gate  voltage  are
    taken.
    2. Fixed  source  and  gate  voltage  are
    taken.
    3. The  load  resistance  is  now  varied
    to  vary  the  current  across  the
    circuit.
    3. The  load  resistance  is  now  varied
    to  vary  the  current  across  the
    circuit.
    4. The  current  variation  versus  the
    voltage  variation  is  now  plotted.
    4. The  current  variation  versus  the
    voltage  variation  is  now  plotted.
    Observe This  is  series  circuit.
    Current  is  the  same  throughout  the
    circuit.
    Observe This  is  series  circuit.
    Current  is  the  same  throughout  the
    circuit.
    MOSFET As Current Limiter
    MOSFET As Current Limiter
    MOSFET As Current Limiter
    MOSFET As Current Limiter
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide31.css b/experiment/simulation/EE4/iframes/data/slide31.css new file mode 100644 index 0000000..bb3f4d4 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide31.css @@ -0,0 +1 @@ +#spr1_1b1ba178 {clip:rect(0px,960px,540px,0px);}#spr3_1b1ba178,#spr4_1b1ba178,#spr5_1b1ba178,#spr6_1b1ba178,#spr9_1b1ba178,#spr12_1b1ba178,#spr13_1b1ba178,#spr14_1b1ba178,#spr15_1b1ba178,#spr16_1b1ba178,#spr18_1b1ba178,#spr20_1b1ba178,#spr21_1b1ba178,#spr22_1b1ba178,#spr23_1b1ba178,#spr24_1b1ba178,#spr25_1b1ba178,#spr26_1b1ba178,#spr28_1b1ba178,#spr29_1b1ba178,#spr30_1b1ba178,#spr31_1b1ba178,#spr32_1b1ba178,#spr33_1b1ba178,#spr34_1b1ba178,#spr36_1b1ba178,#spr37_1b1ba178 {display:none;}#spr7_1b1ba178,#spr10_1b1ba178 {-webkit-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -o-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -ms-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -moz-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); display:none;}#spr8_1b1ba178,#spr11_1b1ba178 {-webkit-transform:matrix(0.450673,0.892689,-0.892689,0.450673,0,0); -o-transform:matrix(0.450673,0.892689,-0.892689,0.450673,0,0); -ms-transform:matrix(0.450673,0.892689,-0.892689,0.450673,0,0); -moz-transform:matrix(0.450673,0.892689,-0.892689,0.450673,0,0); transform:matrix(0.450673,0.892689,-0.892689,0.450673,0,0);}#svg11_1b1ba178 {-webkit-transform-origin:1.214px 0.807px; -moz-transform-origin:1.214px 0.807px; -o-transform-origin:1.214px 0.807px; -ms-transform-origin:1.214px 0.807px; transform-origin:1.214px 0.807px;}#svg19_1b1ba178 {-webkit-transform-origin:1.211px 0.808px; -moz-transform-origin:1.211px 0.808px; -o-transform-origin:1.211px 0.808px; -ms-transform-origin:1.211px 0.808px; transform-origin:1.211px 0.808px;}#spr17_1b1ba178 {-webkit-transform:matrix(0.953953,-0.299956,0.299956,0.953953,0,0); -o-transform:matrix(0.953953,-0.299956,0.299956,0.953953,0,0); -ms-transform:matrix(0.953953,-0.299956,0.299956,0.953953,0,0); -moz-transform:matrix(0.953953,-0.299956,0.299956,0.953953,0,0); transform:matrix(0.953953,-0.299956,0.299956,0.953953,0,0); display:none;}#spr19_1b1ba178 {-webkit-transform:matrix(0.990979,-0.134018,0.134018,0.990979,0,0); -o-transform:matrix(0.990979,-0.134018,0.134018,0.990979,0,0); -ms-transform:matrix(0.990979,-0.134018,0.134018,0.990979,0,0); -moz-transform:matrix(0.990979,-0.134018,0.134018,0.990979,0,0); transform:matrix(0.990979,-0.134018,0.134018,0.990979,0,0); display:none;}#spr27_1b1ba178 {-webkit-transform:matrix(-0,1,-1,-0,0,0); -o-transform:matrix(-0,1,-1,-0,0,0); -ms-transform:matrix(-0,1,-1,-0,0,0); -moz-transform:matrix(-0,1,-1,-0,0,0); transform:matrix(-0,1,-1,-0,0,0); display:none;}#spr35_1b1ba178 {-webkit-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); -o-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); -ms-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); -moz-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); display:none;}#svg10_1b1ba178 {-webkit-transform-origin:21.621px 21px; -moz-transform-origin:21.621px 21px; -o-transform-origin:21.621px 21px; -ms-transform-origin:21.621px 21px; transform-origin:21.621px 21px; display:none;}#txt0_1b1ba178 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt1_1b1ba178 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt2_1b1ba178 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt3_1b1ba178 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide31.js b/experiment/simulation/EE4/iframes/data/slide31.js new file mode 100644 index 0000000..ffab6c2 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide31.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(30, '
    MOSFET As Current Limiter (Test Circuit)
    MOSFET As Current Limiter (Test Circuit)
    MOSFET As Current Limiter (Test Circuit)
    MOSFET As Current Limiter (Test Circuit)
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide32.css b/experiment/simulation/EE4/iframes/data/slide32.css new file mode 100644 index 0000000..9281448 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide32.css @@ -0,0 +1 @@ +#spr1_1b1ba745 {clip:rect(0px,960px,540px,0px);}#spr7_1b1ba745 {-webkit-transform:matrix(0.997932,0.064275,-0.064275,0.997932,0,0); -o-transform:matrix(0.997932,0.064275,-0.064275,0.997932,0,0); -ms-transform:matrix(0.997932,0.064275,-0.064275,0.997932,0,0); -moz-transform:matrix(0.997932,0.064275,-0.064275,0.997932,0,0); transform:matrix(0.997932,0.064275,-0.064275,0.997932,0,0);}#spr8_1b1ba745 {-webkit-transform:matrix(0.450672,0.892689,-0.892689,0.450672,0,0); -o-transform:matrix(0.450672,0.892689,-0.892689,0.450672,0,0); -ms-transform:matrix(0.450672,0.892689,-0.892689,0.450672,0,0); -moz-transform:matrix(0.450672,0.892689,-0.892689,0.450672,0,0); transform:matrix(0.450672,0.892689,-0.892689,0.450672,0,0);}#svg33_1b1ba745 {-webkit-transform-origin:1.214px 0.807px; -moz-transform-origin:1.214px 0.807px; -o-transform-origin:1.214px 0.807px; -ms-transform-origin:1.214px 0.807px; transform-origin:1.214px 0.807px;}#spr10_1b1ba745 {-webkit-transform:matrix(0.757836,-0.652445,0.652445,0.757836,0,0); -o-transform:matrix(0.757836,-0.652445,0.652445,0.757836,0,0); -ms-transform:matrix(0.757836,-0.652445,0.652445,0.757836,0,0); -moz-transform:matrix(0.757836,-0.652445,0.652445,0.757836,0,0); transform:matrix(0.757836,-0.652445,0.652445,0.757836,0,0);}#spr11_1b1ba745 {-webkit-transform:matrix(0.450672,0.89269,-0.89269,0.450672,0,0); -o-transform:matrix(0.450672,0.89269,-0.89269,0.450672,0,0); -ms-transform:matrix(0.450672,0.89269,-0.89269,0.450672,0,0); -moz-transform:matrix(0.450672,0.89269,-0.89269,0.450672,0,0); transform:matrix(0.450672,0.89269,-0.89269,0.450672,0,0);}#svg41_1b1ba745 {-webkit-transform-origin:1.211px 0.808px; -moz-transform-origin:1.211px 0.808px; -o-transform-origin:1.211px 0.808px; -ms-transform-origin:1.211px 0.808px; transform-origin:1.211px 0.808px;}#spr16_1b1ba745,#spr35_1b1ba745 {-webkit-transform:matrix(0.953953,-0.299956,0.299956,0.953953,0,0); -o-transform:matrix(0.953953,-0.299956,0.299956,0.953953,0,0); -ms-transform:matrix(0.953953,-0.299956,0.299956,0.953953,0,0); -moz-transform:matrix(0.953953,-0.299956,0.299956,0.953953,0,0); transform:matrix(0.953953,-0.299956,0.299956,0.953953,0,0);}#spr18_1b1ba745,#spr37_1b1ba745 {-webkit-transform:matrix(0.990979,-0.134018,0.134018,0.990979,0,0); -o-transform:matrix(0.990979,-0.134018,0.134018,0.990979,0,0); -ms-transform:matrix(0.990979,-0.134018,0.134018,0.990979,0,0); -moz-transform:matrix(0.990979,-0.134018,0.134018,0.990979,0,0); transform:matrix(0.990979,-0.134018,0.134018,0.990979,0,0);}#spr24_1b1ba745 {-webkit-transform:matrix(-0,1,-1,-0,0,0); -o-transform:matrix(-0,1,-1,-0,0,0); -ms-transform:matrix(-0,1,-1,-0,0,0); -moz-transform:matrix(-0,1,-1,-0,0,0); transform:matrix(-0,1,-1,-0,0,0);}#spr32_1b1ba745 {-webkit-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); -o-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); -ms-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); -moz-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0);}#svg10_1b1ba745 {-webkit-transform-origin:21.621px 21.372px; -moz-transform-origin:21.621px 21.372px; -o-transform-origin:21.621px 21.372px; -ms-transform-origin:21.621px 21.372px; transform-origin:21.621px 21.372px;}#svg21_1b1ba745 {-webkit-transform-origin:4.5px 2.25px; -moz-transform-origin:4.5px 2.25px; -o-transform-origin:4.5px 2.25px; -ms-transform-origin:4.5px 2.25px; transform-origin:4.5px 2.25px; display:none;}#svg32_1b1ba745 {-webkit-transform-origin:2.25px 2.25px; -moz-transform-origin:2.25px 2.25px; -o-transform-origin:2.25px 2.25px; -ms-transform-origin:2.25px 2.25px; transform-origin:2.25px 2.25px; display:none;}#txt0_1b1ba745 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt1_1b1ba745 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt2_1b1ba745 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt3_1b1ba745 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#spr46_1b1ba745,#spr47_1b1ba745,#spr48_1b1ba745,#spr49_1b1ba745,#spr50_1b1ba745 {display:none;}#txt4_1b1ba745,#txt28_1b1ba745,#txt54_1b1ba745 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt5_1b1ba745,#txt6_1b1ba745,#txt7_1b1ba745,#txt8_1b1ba745,#txt9_1b1ba745,#txt10_1b1ba745,#txt11_1b1ba745,#txt12_1b1ba745,#txt13_1b1ba745,#txt14_1b1ba745,#txt15_1b1ba745,#txt29_1b1ba745,#txt30_1b1ba745,#txt31_1b1ba745,#txt32_1b1ba745,#txt33_1b1ba745,#txt34_1b1ba745,#txt35_1b1ba745,#txt36_1b1ba745,#txt37_1b1ba745,#txt38_1b1ba745,#txt39_1b1ba745,#txt40_1b1ba745,#txt55_1b1ba745,#txt56_1b1ba745,#txt57_1b1ba745,#txt58_1b1ba745,#txt59_1b1ba745,#txt60_1b1ba745,#txt61_1b1ba745,#txt62_1b1ba745,#txt63_1b1ba745,#txt64_1b1ba745,#txt76_1b1ba745,#txt77_1b1ba745,#txt78_1b1ba745,#txt79_1b1ba745,#txt80_1b1ba745,#txt81_1b1ba745,#txt82_1b1ba745,#txt83_1b1ba745,#txt84_1b1ba745,#txt85_1b1ba745,#txt86_1b1ba745,#txt87_1b1ba745,#txt88_1b1ba745,#txt89_1b1ba745,#txt90_1b1ba745,#txt91_1b1ba745,#txt92_1b1ba745,#txt93_1b1ba745,#txt94_1b1ba745,#txt95_1b1ba745,#txt96_1b1ba745,#txt97_1b1ba745,#txt98_1b1ba745 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt16_1b1ba745 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#0000ff;}#txt17_1b1ba745,#txt18_1b1ba745,#txt19_1b1ba745,#txt20_1b1ba745,#txt21_1b1ba745,#txt22_1b1ba745,#txt23_1b1ba745,#txt24_1b1ba745,#txt25_1b1ba745,#txt26_1b1ba745,#txt27_1b1ba745 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#0000ff;}#txt41_1b1ba745 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#c00000;}#txt42_1b1ba745,#txt43_1b1ba745,#txt44_1b1ba745,#txt45_1b1ba745,#txt46_1b1ba745,#txt47_1b1ba745,#txt48_1b1ba745,#txt49_1b1ba745,#txt50_1b1ba745,#txt51_1b1ba745,#txt52_1b1ba745,#txt53_1b1ba745 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#c00000;}#txt65_1b1ba745 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#000000;}#txt66_1b1ba745,#txt67_1b1ba745,#txt68_1b1ba745,#txt69_1b1ba745,#txt70_1b1ba745,#txt71_1b1ba745,#txt72_1b1ba745,#txt73_1b1ba745,#txt74_1b1ba745,#txt75_1b1ba745 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#000000;}#txt99_1b1ba745,#txt100_1b1ba745,#txt101_1b1ba745,#txt102_1b1ba745,#txt103_1b1ba745,#txt104_1b1ba745,#txt105_1b1ba745,#txt106_1b1ba745,#txt107_1b1ba745,#txt108_1b1ba745,#txt109_1b1ba745,#txt110_1b1ba745,#txt111_1b1ba745,#txt112_1b1ba745,#txt113_1b1ba745,#txt114_1b1ba745,#txt115_1b1ba745,#txt116_1b1ba745,#txt117_1b1ba745,#txt118_1b1ba745,#txt119_1b1ba745,#txt120_1b1ba745,#txt121_1b1ba745 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide32.js b/experiment/simulation/EE4/iframes/data/slide32.js new file mode 100644 index 0000000..392e607 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide32.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(31, '
    MOSFET As Current Limiter (Test Circuit)
    MOSFET As Current Limiter (Test Circuit)
    MOSFET As Current Limiter (Test Circuit)
    MOSFET As Current Limiter (Test Circuit)
    1. The  load  resistance  is  now  been
    decreased.  The  current,  consequently,
    increases.
    1. The  load  resistance  is  now  been
    decreased.  The  current,  consequently,
    increases.
    2. From  this  point  onwards,  the
    increment  in  the  drain  current  is  low.
    2. From  this  point  onwards,  the
    increment  in  the  drain  current  is  low.
    3. Decreasing  the  load  resistance  further
    doesn’t  change  the  current  rapidly.
    3. Decreasing  the  load  resistance  further
    doesn’t  change  the  current  rapidly.
    Current  limiting  feature:  Even  with  the
    decreasing  load  resistance,  the  current  in
    the  circuit  doesn’t  increase  rapidly  as  the
    MOSFET-switch  enters  into  saturation.
    Current  limiting  feature:  Even  with  the
    decreasing  load  resistance,  the  current  in
    the  circuit  doesn’t  increase  rapidly  as  the
    MOSFET-switch  enters  into  saturation.
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide4.css b/experiment/simulation/EE4/iframes/data/slide4.css new file mode 100644 index 0000000..5fa3905 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide4.css @@ -0,0 +1 @@ +#spr1_1b1b0a88 {clip:rect(0px,960px,540px,0px);}#spr3_1b1b0a88,#spr4_1b1b0a88,#spr5_1b1b0a88,#spr6_1b1b0a88,#spr7_1b1b0a88,#spr8_1b1b0a88,#spr12_1b1b0a88,#spr13_1b1b0a88,#spr14_1b1b0a88,#spr15_1b1b0a88,#spr16_1b1b0a88,#spr17_1b1b0a88,#spr18_1b1b0a88 {display:none;}#txt0_1b1b0a88,#txt2_1b1b0a88,#txt4_1b1b0a88,#txt6_1b1b0a88,#txt8_1b1b0a88,#txt10_1b1b0a88,#txt16_1b1b0a88 {font-family:fnt8; font-size:32px; line-height:37px; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt1_1b1b0a88 {font-family:fnt8; font-size:32px; line-height:37px; color:#254f2f;}#txt3_1b1b0a88,#txt5_1b1b0a88,#txt7_1b1b0a88,#txt9_1b1b0a88,#txt11_1b1b0a88,#txt17_1b1b0a88 {font-family:fnt8; font-size:32px; line-height:37px; color:#c00000;}#txt12_1b1b0a88 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt13_1b1b0a88 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt14_1b1b0a88 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt15_1b1b0a88 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide4.js b/experiment/simulation/EE4/iframes/data/slide4.js new file mode 100644 index 0000000..c1c0c39 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide4.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(3, '
    Metal-Oxide-Semiconductor-Field-Effect-Transistor
    Metal-Oxide-Semiconductor-Field-Effect-Transistor
    O
    O
    S
    S
    F
    F
    E
    E
    T
    T
    What is ‘MOSFET’
    What is ‘MOSFET’
    What is ‘MOSFET’
    What is ‘MOSFET’
    M
    M
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide5.css b/experiment/simulation/EE4/iframes/data/slide5.css new file mode 100644 index 0000000..34df306 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide5.css @@ -0,0 +1 @@ +#spr1_1b1b0d95 {clip:rect(0px,960px,540px,0px);}#spr4_1b1b0d95,#spr5_1b1b0d95,#spr6_1b1b0d95,#spr7_1b1b0d95,#spr8_1b1b0d95,#spr9_1b1b0d95,#spr10_1b1b0d95,#spr11_1b1b0d95,#spr12_1b1b0d95,#spr13_1b1b0d95,#spr14_1b1b0d95,#spr15_1b1b0d95,#spr16_1b1b0d95,#spr17_1b1b0d95,#spr18_1b1b0d95,#spr19_1b1b0d95,#spr20_1b1b0d95,#spr21_1b1b0d95,#spr22_1b1b0d95,#spr23_1b1b0d95,#spr24_1b1b0d95,#spr25_1b1b0d95,#spr26_1b1b0d95,#spr27_1b1b0d95,#spr28_1b1b0d95,#spr29_1b1b0d95,#spr30_1b1b0d95,#spr31_1b1b0d95,#spr35_1b1b0d95,#spr36_1b1b0d95,#spr37_1b1b0d95,#spr38_1b1b0d95 {display:none;}#txt0_1b1b0d95,#txt2_1b1b0d95,#txt4_1b1b0d95,#txt6_1b1b0d95,#txt8_1b1b0d95,#txt9_1b1b0d95,#txt12_1b1b0d95,#txt14_1b1b0d95,#txt16_1b1b0d95,#txt18_1b1b0d95,#txt20_1b1b0d95,#txt22_1b1b0d95,#txt24_1b1b0d95,#txt26_1b1b0d95 {font-family:fnt9; font-size:25px; line-height:33px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt1_1b1b0d95,#txt3_1b1b0d95,#txt5_1b1b0d95,#txt7_1b1b0d95,#txt10_1b1b0d95,#txt11_1b1b0d95,#txt13_1b1b0d95,#txt15_1b1b0d95,#txt17_1b1b0d95,#txt19_1b1b0d95,#txt21_1b1b0d95,#txt23_1b1b0d95,#txt25_1b1b0d95,#txt27_1b1b0d95 {font-family:fnt9; font-size:25px; line-height:33px; font-weight:bold; color:#ffffff;}#svg0_1b1b0d95,#svg1_1b1b0d95 {-webkit-transform-origin:6.256px 6.256px; -moz-transform-origin:6.256px 6.256px; -o-transform-origin:6.256px 6.256px; -ms-transform-origin:6.256px 6.256px; transform-origin:6.256px 6.256px; display:none;}#txt28_1b1b0d95,#txt29_1b1b0d95,#txt32_1b1b0d95 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt30_1b1b0d95,#txt31_1b1b0d95,#txt33_1b1b0d95 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#ffffff;}#txt34_1b1b0d95 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt35_1b1b0d95 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt36_1b1b0d95 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt37_1b1b0d95 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide5.js b/experiment/simulation/EE4/iframes/data/slide5.js new file mode 100644 index 0000000..e803b03 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide5.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(4, '
    Drain
    Drain
    (D)
    (D)
    Source
    Source
    (S)
    (S)
    Body
    Diode
    Body
    Diode
    Gate
    Gate
    (G)
    (G)
    Gate
    Gate
    (G)
    (G)
    Drain
    Drain
    (D)
    (D)
    Source
    Source
    (S)
    (S)
    Symbolic 
    representation
    Symbolic 
    representation
    A typical MOSFET (TO220 Package)
    A typical MOSFET (TO220 Package)
    Representation
    Representation
    Representation
    Representation
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide6.css b/experiment/simulation/EE4/iframes/data/slide6.css new file mode 100644 index 0000000..94062a9 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide6.css @@ -0,0 +1 @@ +#spr1_1b1b14e8 {clip:rect(0px,960px,540px,0px);}#txt0_1b1b14e8 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt1_1b1b14e8 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt2_1b1b14e8 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt3_1b1b14e8 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#spr6_1b1b14e8,#spr7_1b1b14e8,#spr8_1b1b14e8,#spr20_1b1b14e8,#spr21_1b1b14e8,#spr22_1b1b14e8,#spr23_1b1b14e8,#spr24_1b1b14e8,#spr25_1b1b14e8,#spr26_1b1b14e8,#spr27_1b1b14e8,#spr28_1b1b14e8,#spr29_1b1b14e8,#spr30_1b1b14e8,#spr31_1b1b14e8,#spr32_1b1b14e8,#spr33_1b1b14e8,#spr34_1b1b14e8,#spr35_1b1b14e8 {display:none;}#txt4_1b1b14e8,#txt5_1b1b14e8,#txt44_1b1b14e8,#txt45_1b1b14e8,#txt46_1b1b14e8,#txt48_1b1b14e8,#txt54_1b1b14e8,#txt56_1b1b14e8,#txt60_1b1b14e8,#txt61_1b1b14e8,#txt63_1b1b14e8,#txt72_1b1b14e8,#txt73_1b1b14e8,#txt74_1b1b14e8,#txt75_1b1b14e8,#txt76_1b1b14e8,#txt77_1b1b14e8,#txt80_1b1b14e8,#txt81_1b1b14e8,#txt82_1b1b14e8,#txt83_1b1b14e8,#txt84_1b1b14e8,#txt85_1b1b14e8,#txt86_1b1b14e8,#txt87_1b1b14e8,#txt88_1b1b14e8,#txt89_1b1b14e8,#txt90_1b1b14e8,#txt91_1b1b14e8,#txt114_1b1b14e8,#txt117_1b1b14e8,#txt118_1b1b14e8,#txt119_1b1b14e8,#txt120_1b1b14e8,#txt122_1b1b14e8,#txt123_1b1b14e8,#txt124_1b1b14e8,#txt137_1b1b14e8,#txt138_1b1b14e8,#txt139_1b1b14e8,#txt140_1b1b14e8,#txt141_1b1b14e8,#txt142_1b1b14e8,#txt145_1b1b14e8,#txt146_1b1b14e8,#txt147_1b1b14e8,#txt148_1b1b14e8,#txt149_1b1b14e8,#txt150_1b1b14e8,#txt151_1b1b14e8,#txt152_1b1b14e8,#txt153_1b1b14e8,#txt154_1b1b14e8,#txt157_1b1b14e8,#txt158_1b1b14e8,#txt159_1b1b14e8,#txt160_1b1b14e8,#txt161_1b1b14e8,#txt162_1b1b14e8,#txt163_1b1b14e8,#txt164_1b1b14e8,#txt165_1b1b14e8,#txt166_1b1b14e8,#txt167_1b1b14e8,#txt168_1b1b14e8,#txt169_1b1b14e8,#txt204_1b1b14e8,#txt207_1b1b14e8,#txt208_1b1b14e8,#txt209_1b1b14e8,#txt212_1b1b14e8,#txt213_1b1b14e8,#txt214_1b1b14e8,#txt217_1b1b14e8,#txt233_1b1b14e8,#txt234_1b1b14e8,#txt235_1b1b14e8,#txt236_1b1b14e8,#txt237_1b1b14e8,#txt238_1b1b14e8,#txt241_1b1b14e8,#txt242_1b1b14e8,#txt243_1b1b14e8,#txt244_1b1b14e8,#txt245_1b1b14e8,#txt246_1b1b14e8,#txt247_1b1b14e8,#txt248_1b1b14e8,#txt251_1b1b14e8,#txt252_1b1b14e8,#txt253_1b1b14e8,#txt254_1b1b14e8,#txt255_1b1b14e8,#txt256_1b1b14e8,#txt257_1b1b14e8,#txt258_1b1b14e8,#txt259_1b1b14e8,#txt260_1b1b14e8,#txt261_1b1b14e8,#txt292_1b1b14e8,#txt295_1b1b14e8,#txt296_1b1b14e8,#txt297_1b1b14e8,#txt300_1b1b14e8,#txt301_1b1b14e8,#txt302_1b1b14e8,#txt305_1b1b14e8,#txt320_1b1b14e8,#txt322_1b1b14e8,#txt323_1b1b14e8,#txt324_1b1b14e8,#txt330_1b1b14e8,#txt331_1b1b14e8 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt6_1b1b14e8,#txt7_1b1b14e8,#txt65_1b1b14e8,#txt66_1b1b14e8,#txt68_1b1b14e8,#txt94_1b1b14e8,#txt95_1b1b14e8,#txt96_1b1b14e8,#txt97_1b1b14e8,#txt98_1b1b14e8,#txt99_1b1b14e8,#txt102_1b1b14e8,#txt103_1b1b14e8,#txt104_1b1b14e8,#txt105_1b1b14e8,#txt106_1b1b14e8,#txt107_1b1b14e8,#txt108_1b1b14e8,#txt109_1b1b14e8,#txt110_1b1b14e8,#txt111_1b1b14e8,#txt112_1b1b14e8,#txt113_1b1b14e8,#txt125_1b1b14e8,#txt128_1b1b14e8,#txt129_1b1b14e8,#txt130_1b1b14e8,#txt131_1b1b14e8,#txt133_1b1b14e8,#txt134_1b1b14e8,#txt135_1b1b14e8,#txt171_1b1b14e8,#txt172_1b1b14e8,#txt173_1b1b14e8,#txt174_1b1b14e8,#txt175_1b1b14e8,#txt176_1b1b14e8,#txt179_1b1b14e8,#txt180_1b1b14e8,#txt181_1b1b14e8,#txt182_1b1b14e8,#txt183_1b1b14e8,#txt184_1b1b14e8,#txt185_1b1b14e8,#txt186_1b1b14e8,#txt187_1b1b14e8,#txt188_1b1b14e8,#txt191_1b1b14e8,#txt192_1b1b14e8,#txt193_1b1b14e8,#txt194_1b1b14e8,#txt195_1b1b14e8,#txt196_1b1b14e8,#txt197_1b1b14e8,#txt198_1b1b14e8,#txt199_1b1b14e8,#txt200_1b1b14e8,#txt201_1b1b14e8,#txt202_1b1b14e8,#txt203_1b1b14e8,#txt218_1b1b14e8,#txt221_1b1b14e8,#txt222_1b1b14e8,#txt223_1b1b14e8,#txt226_1b1b14e8,#txt227_1b1b14e8,#txt228_1b1b14e8,#txt231_1b1b14e8,#txt263_1b1b14e8,#txt264_1b1b14e8,#txt265_1b1b14e8,#txt266_1b1b14e8,#txt267_1b1b14e8,#txt268_1b1b14e8,#txt271_1b1b14e8,#txt272_1b1b14e8,#txt273_1b1b14e8,#txt274_1b1b14e8,#txt275_1b1b14e8,#txt276_1b1b14e8,#txt277_1b1b14e8,#txt278_1b1b14e8,#txt281_1b1b14e8,#txt282_1b1b14e8,#txt283_1b1b14e8,#txt284_1b1b14e8,#txt285_1b1b14e8,#txt286_1b1b14e8,#txt287_1b1b14e8,#txt288_1b1b14e8,#txt289_1b1b14e8,#txt290_1b1b14e8,#txt291_1b1b14e8,#txt306_1b1b14e8,#txt309_1b1b14e8,#txt310_1b1b14e8,#txt311_1b1b14e8,#txt314_1b1b14e8,#txt315_1b1b14e8,#txt316_1b1b14e8,#txt319_1b1b14e8,#txt325_1b1b14e8,#txt327_1b1b14e8,#txt328_1b1b14e8,#txt329_1b1b14e8,#txt332_1b1b14e8,#txt333_1b1b14e8 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:#ffffff;}#svg0_1b1b14e8,#svg1_1b1b14e8,#svg2_1b1b14e8,#svg3_1b1b14e8,#svg4_1b1b14e8,#svg5_1b1b14e8,#svg6_1b1b14e8,#svg7_1b1b14e8,#svg8_1b1b14e8,#svg9_1b1b14e8 {pointer-events:none;}#txt8_1b1b14e8,#txt9_1b1b14e8,#txt12_1b1b14e8,#txt13_1b1b14e8,#txt16_1b1b14e8,#txt17_1b1b14e8,#txt28_1b1b14e8,#txt32_1b1b14e8,#txt36_1b1b14e8,#txt38_1b1b14e8,#txt40_1b1b14e8 {font-family:fnt4; font-size:20px; line-height:23px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt10_1b1b14e8,#txt11_1b1b14e8 {font-family:fnt4; font-size:20px; line-height:23px; font-weight:bold; color:#006600;}#txt14_1b1b14e8,#txt15_1b1b14e8 {font-family:fnt4; font-size:20px; line-height:23px; font-weight:bold; color:#660066;}#txt18_1b1b14e8,#txt19_1b1b14e8 {font-family:fnt4; font-size:20px; line-height:23px; font-weight:bold; color:#a40000;}#txt20_1b1b14e8 {font-family:fnt4; font-size:13px; line-height:15px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt21_1b1b14e8 {font-family:fnt4; font-size:8.667px; line-height:10px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt22_1b1b14e8 {font-family:fnt4; font-size:13px; line-height:15px; font-weight:bold; color:#000000;}#txt23_1b1b14e8 {font-family:fnt4; font-size:8.667px; line-height:10px; font-weight:bold; color:#000000;}#txt24_1b1b14e8 {font-family:fnt4; font-size:25px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt25_1b1b14e8 {font-family:fnt4; font-size:16.667px; line-height:19px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt26_1b1b14e8 {font-family:fnt4; font-size:25px; line-height:29px; font-weight:bold; color:#000000;}#txt27_1b1b14e8 {font-family:fnt4; font-size:16.667px; line-height:19px; font-weight:bold; color:#000000;}#txt29_1b1b14e8,#txt33_1b1b14e8,#txt41_1b1b14e8 {font-family:fnt4; font-size:13.333px; line-height:15px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt30_1b1b14e8,#txt34_1b1b14e8,#txt37_1b1b14e8,#txt39_1b1b14e8,#txt42_1b1b14e8 {font-family:fnt4; font-size:20px; line-height:23px; font-weight:bold; color:#ffffff;}#txt31_1b1b14e8,#txt35_1b1b14e8,#txt43_1b1b14e8 {font-family:fnt4; font-size:13.333px; line-height:15px; font-weight:bold; color:#ffffff;}#txt47_1b1b14e8,#txt55_1b1b14e8,#txt62_1b1b14e8,#txt64_1b1b14e8,#txt121_1b1b14e8,#txt321_1b1b14e8 {font-family:fnt9; font-size:12px; line-height:16px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt49_1b1b14e8,#txt50_1b1b14e8,#txt51_1b1b14e8,#txt53_1b1b14e8,#txt57_1b1b14e8,#txt59_1b1b14e8 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:#000000;}#txt52_1b1b14e8,#txt58_1b1b14e8 {font-family:fnt9; font-size:12px; line-height:16px; font-weight:bold; color:#000000;}#txt67_1b1b14e8,#txt69_1b1b14e8,#txt132_1b1b14e8,#txt326_1b1b14e8 {font-family:fnt9; font-size:12px; line-height:16px; font-weight:bold; color:#ffffff;}#txt70_1b1b14e8,#txt71_1b1b14e8,#txt136_1b1b14e8,#txt232_1b1b14e8 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; text-decoration-line:underline; text-decoration-skip:none; text-decoration-skip-ink:none; text-decoration-thickness:1.200px; text-decoration-style:solid; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt78_1b1b14e8,#txt115_1b1b14e8,#txt143_1b1b14e8,#txt155_1b1b14e8,#txt205_1b1b14e8,#txt210_1b1b14e8,#txt215_1b1b14e8,#txt239_1b1b14e8,#txt249_1b1b14e8,#txt293_1b1b14e8,#txt298_1b1b14e8,#txt303_1b1b14e8 {font-family:fnt10; font-size:18px; line-height:24px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt79_1b1b14e8,#txt116_1b1b14e8,#txt144_1b1b14e8,#txt156_1b1b14e8,#txt206_1b1b14e8,#txt211_1b1b14e8,#txt216_1b1b14e8,#txt240_1b1b14e8,#txt250_1b1b14e8,#txt294_1b1b14e8,#txt299_1b1b14e8,#txt304_1b1b14e8 {font-family:fnt10; font-size:12px; line-height:16px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt92_1b1b14e8,#txt93_1b1b14e8,#txt170_1b1b14e8,#txt262_1b1b14e8 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; text-decoration-line:underline; text-decoration-skip:none; text-decoration-skip-ink:none; text-decoration-thickness:1.200px; text-decoration-style:solid; color:#ffffff;}#txt100_1b1b14e8,#txt126_1b1b14e8,#txt177_1b1b14e8,#txt189_1b1b14e8,#txt219_1b1b14e8,#txt224_1b1b14e8,#txt229_1b1b14e8,#txt269_1b1b14e8,#txt279_1b1b14e8,#txt307_1b1b14e8,#txt312_1b1b14e8,#txt317_1b1b14e8 {font-family:fnt10; font-size:18px; line-height:24px; font-weight:bold; font-style:italic; color:#ffffff;}#txt101_1b1b14e8,#txt127_1b1b14e8,#txt178_1b1b14e8,#txt190_1b1b14e8,#txt220_1b1b14e8,#txt225_1b1b14e8,#txt230_1b1b14e8,#txt270_1b1b14e8,#txt280_1b1b14e8,#txt308_1b1b14e8,#txt313_1b1b14e8,#txt318_1b1b14e8 {font-family:fnt10; font-size:12px; line-height:16px; font-weight:bold; font-style:italic; color:#ffffff;}#svg10_1b1b14e8,#svg11_1b1b14e8,#svg12_1b1b14e8 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#svg14_1b1b14e8 {-webkit-transform-origin:3.375px 3.375px; -moz-transform-origin:3.375px 3.375px; -o-transform-origin:3.375px 3.375px; -ms-transform-origin:3.375px 3.375px; transform-origin:3.375px 3.375px; -webkit-transform:matrix(0.808076,-0.589078,0.589078,0.808076,0,0); -o-transform:matrix(0.808076,-0.589078,0.589078,0.808076,0,0); -ms-transform:matrix(0.808076,-0.589078,0.589078,0.808076,0,0); -moz-transform:matrix(0.808076,-0.589078,0.589078,0.808076,0,0); transform:matrix(0.808076,-0.589078,0.589078,0.808076,0,0); display:none;}#svg22_1b1b14e8 {-webkit-transform-origin:1.727px 1.57px; -moz-transform-origin:1.727px 1.57px; -o-transform-origin:1.727px 1.57px; -ms-transform-origin:1.727px 1.57px; transform-origin:1.727px 1.57px;}#svg23_1b1b14e8,#svg37_1b1b14e8 {-webkit-transform-origin:3px 1.5px; -moz-transform-origin:3px 1.5px; -o-transform-origin:3px 1.5px; -ms-transform-origin:3px 1.5px; transform-origin:3px 1.5px;}#svg36_1b1b14e8 {-webkit-transform-origin:1.594px 1.031px; -moz-transform-origin:1.594px 1.031px; -o-transform-origin:1.594px 1.031px; -ms-transform-origin:1.594px 1.031px; transform-origin:1.594px 1.031px;}#svg44_1b1b14e8,#svg53_1b1b14e8 {-webkit-transform-origin:3.375px 3.375px; -moz-transform-origin:3.375px 3.375px; -o-transform-origin:3.375px 3.375px; -ms-transform-origin:3.375px 3.375px; transform-origin:3.375px 3.375px; display:none;}#svg46_1b1b14e8 {-webkit-transform-origin:3.375px 3.375px; -moz-transform-origin:3.375px 3.375px; -o-transform-origin:3.375px 3.375px; -ms-transform-origin:3.375px 3.375px; transform-origin:3.375px 3.375px; -webkit-transform:matrix(-1,-0,0,-1,0,0); -o-transform:matrix(-1,-0,0,-1,0,0); -ms-transform:matrix(-1,-0,0,-1,0,0); -moz-transform:matrix(-1,-0,0,-1,0,0); transform:matrix(-1,-0,0,-1,0,0); display:none;}#svg47_1b1b14e8,#svg48_1b1b14e8,#svg49_1b1b14e8,#svg50_1b1b14e8,#svg51_1b1b14e8,#svg54_1b1b14e8 {-webkit-transform-origin:4.5px 4.5px; -moz-transform-origin:4.5px 4.5px; -o-transform-origin:4.5px 4.5px; -ms-transform-origin:4.5px 4.5px; transform-origin:4.5px 4.5px; display:none;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide6.js b/experiment/simulation/EE4/iframes/data/slide6.js new file mode 100644 index 0000000..b9353e9 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide6.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(5, '
    Brief Description of MOSFET
    Brief Description of MOSFET
    Brief Description of MOSFET
    Brief Description of MOSFET
    MOSFET has three terminals:
    Drain (D), Source (S), Gate (G)
    MOSFET has three terminals:
    Drain (D), Source (S), Gate (G)
    Source
    (S)
    Source
    (S)
    Gate
    (G)
    Gate
    (G)
    Drain
    (D)
    Drain
    (D)
    SiO 2
    SiO 2
    n -
    n -
    n +
    n +
    n +
    n +
    p
    p
    p
    p
    n +
    n +
    It has three layers: N-
    type doped (heavy doped
    (n + ) and lightly doped
    It has three layers: N-
    type doped (heavy doped
    (n + ) and lightly doped
    (n - )), P-type doped (p)
    (n - )), P-type doped (p)
    There are two junctions:
    p-n +  and p-n -
    There are two junctions:
    p-n +  and p-n -
    Forward     Blocking When  Drain-to-
    Source  voltage  ( v DS  is  given,  both  the
    junctions  remain  reverse  biased.
    MOSFET  doesn’t  conduct.
    Forward     Blocking When  Drain-to-
    Source  voltage  ( v DS  is  given,  both  the
    junctions  remain  reverse  biased.
    MOSFET  doesn’t  conduct.
    ( v DS   0,  v GS   0)
    ( v DS   0,  v GS   0)
    ON-state Now  again,  Drain-to-Source
    voltage  ( v DS  is  given,  with  sufficiently
    high  positive  Gate-to-Source  voltage
    ( v GS ).  MOSFET  channel  starts
    conducting  and  hence,  current  flows
    from 
    drain  to  source.
    ON-state Now  again,  Drain-to-Source
    voltage  ( v DS  is  given,  with  sufficiently
    high  positive  Gate-to-Source  voltage
    ( v GS ).  MOSFET  channel  starts
    conducting  and  hence,  current  flows
    from 
    drain  to  source.
    ( v DS   0,  v GS     V )
    ( v DS   0,  v GS     V )
    OFF-state When  the  Gate-to-Source
    voltage  ( v GS is  withdrawn  or  is  below
    threshold  ( V T ),  the  junctions  become
    reverse  biased  again  and  MOSFET
    stops  conducting.
    OFF-state When  the  Gate-to-Source
    voltage  ( v GS is  withdrawn  or  is  below
    threshold  ( V T ),  the  junctions  become
    reverse  biased  again  and  MOSFET
    stops  conducting.
    ( v DS   0,  v GS     V )
    ( v DS   0,  v GS     V )
    Silicon oxide (SiO 2 )
    provides insulation to
    the Gate
    Silicon oxide (SiO 2 )
    provides insulation to
    the Gate
    Metal
    Contacts
    Metal
    Contacts
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide7.css b/experiment/simulation/EE4/iframes/data/slide7.css new file mode 100644 index 0000000..873ffb0 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide7.css @@ -0,0 +1 @@ +#spr1_1b1b1c1c {clip:rect(0px,960px,540px,0px);}#svg18_1b1b1c1c {-webkit-transform-origin:1.5px 3px; -moz-transform-origin:1.5px 3px; -o-transform-origin:1.5px 3px; -ms-transform-origin:1.5px 3px; transform-origin:1.5px 3px;}#spr3_1b1b1c1c,#spr4_1b1b1c1c,#spr5_1b1b1c1c,#spr6_1b1b1c1c,#spr7_1b1b1c1c,#spr8_1b1b1c1c,#spr9_1b1b1c1c,#svg24_1b1b1c1c,#spr10_1b1b1c1c,#spr11_1b1b1c1c,#spr12_1b1b1c1c,#spr13_1b1b1c1c,#spr14_1b1b1c1c,#spr15_1b1b1c1c,#spr16_1b1b1c1c,#spr17_1b1b1c1c,#spr18_1b1b1c1c,#spr19_1b1b1c1c,#spr20_1b1b1c1c,#svg36_1b1b1c1c,#spr21_1b1b1c1c,#spr22_1b1b1c1c,#spr23_1b1b1c1c {display:none;}#txt0_1b1b1c1c,#txt1_1b1b1c1c,#txt2_1b1b1c1c,#txt3_1b1b1c1c,#txt4_1b1b1c1c,#txt5_1b1b1c1c,#txt6_1b1b1c1c,#txt7_1b1b1c1c,#txt10_1b1b1c1c,#txt11_1b1b1c1c,#txt12_1b1b1c1c,#txt13_1b1b1c1c,#txt14_1b1b1c1c,#txt15_1b1b1c1c,#txt18_1b1b1c1c,#txt19_1b1b1c1c,#txt20_1b1b1c1c,#txt21_1b1b1c1c,#txt22_1b1b1c1c,#txt23_1b1b1c1c,#txt24_1b1b1c1c,#txt27_1b1b1c1c,#txt56_1b1b1c1c,#txt57_1b1b1c1c,#txt58_1b1b1c1c,#txt59_1b1b1c1c,#txt60_1b1b1c1c,#txt61_1b1b1c1c,#txt62_1b1b1c1c,#txt63_1b1b1c1c,#txt66_1b1b1c1c,#txt67_1b1b1c1c,#txt68_1b1b1c1c,#txt69_1b1b1c1c,#txt70_1b1b1c1c,#txt71_1b1b1c1c,#txt74_1b1b1c1c,#txt75_1b1b1c1c,#txt76_1b1b1c1c,#txt77_1b1b1c1c,#txt78_1b1b1c1c,#txt79_1b1b1c1c,#txt80_1b1b1c1c,#txt83_1b1b1c1c,#txt112_1b1b1c1c,#txt113_1b1b1c1c,#txt114_1b1b1c1c,#txt115_1b1b1c1c,#txt146_1b1b1c1c,#txt147_1b1b1c1c,#txt148_1b1b1c1c,#txt172_1b1b1c1c,#txt173_1b1b1c1c,#txt174_1b1b1c1c,#txt175_1b1b1c1c {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt8_1b1b1c1c,#txt16_1b1b1c1c,#txt25_1b1b1c1c,#txt64_1b1b1c1c,#txt72_1b1b1c1c,#txt81_1b1b1c1c,#txt116_1b1b1c1c,#txt118_1b1b1c1c,#txt126_1b1b1c1c,#txt128_1b1b1c1c,#txt129_1b1b1c1c,#txt130_1b1b1c1c,#txt149_1b1b1c1c,#txt151_1b1b1c1c,#txt158_1b1b1c1c,#txt162_1b1b1c1c,#txt176_1b1b1c1c,#txt178_1b1b1c1c {font-family:fnt10; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt9_1b1b1c1c,#txt17_1b1b1c1c,#txt26_1b1b1c1c,#txt65_1b1b1c1c,#txt73_1b1b1c1c,#txt82_1b1b1c1c,#txt117_1b1b1c1c,#txt127_1b1b1c1c,#txt131_1b1b1c1c,#txt150_1b1b1c1c,#txt159_1b1b1c1c,#txt163_1b1b1c1c,#txt177_1b1b1c1c {font-family:fnt10; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt28_1b1b1c1c,#txt29_1b1b1c1c,#txt30_1b1b1c1c,#txt31_1b1b1c1c,#txt32_1b1b1c1c,#txt33_1b1b1c1c,#txt34_1b1b1c1c,#txt35_1b1b1c1c,#txt38_1b1b1c1c,#txt39_1b1b1c1c,#txt40_1b1b1c1c,#txt41_1b1b1c1c,#txt42_1b1b1c1c,#txt43_1b1b1c1c,#txt46_1b1b1c1c,#txt47_1b1b1c1c,#txt48_1b1b1c1c,#txt49_1b1b1c1c,#txt50_1b1b1c1c,#txt51_1b1b1c1c,#txt52_1b1b1c1c,#txt55_1b1b1c1c,#txt119_1b1b1c1c,#txt120_1b1b1c1c,#txt121_1b1b1c1c,#txt122_1b1b1c1c,#txt152_1b1b1c1c,#txt153_1b1b1c1c,#txt154_1b1b1c1c,#txt179_1b1b1c1c,#txt180_1b1b1c1c,#txt181_1b1b1c1c,#txt182_1b1b1c1c {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#0d0d0d;}#txt36_1b1b1c1c,#txt44_1b1b1c1c,#txt53_1b1b1c1c,#txt123_1b1b1c1c,#txt125_1b1b1c1c,#txt135_1b1b1c1c,#txt155_1b1b1c1c,#txt157_1b1b1c1c,#txt183_1b1b1c1c,#txt185_1b1b1c1c {font-family:fnt10; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:#0d0d0d;}#txt37_1b1b1c1c,#txt45_1b1b1c1c,#txt54_1b1b1c1c,#txt124_1b1b1c1c,#txt156_1b1b1c1c,#txt184_1b1b1c1c {font-family:fnt10; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:#0d0d0d;}#txt84_1b1b1c1c,#txt85_1b1b1c1c,#txt86_1b1b1c1c,#txt87_1b1b1c1c,#txt88_1b1b1c1c,#txt89_1b1b1c1c,#txt90_1b1b1c1c,#txt91_1b1b1c1c,#txt94_1b1b1c1c,#txt95_1b1b1c1c,#txt96_1b1b1c1c,#txt97_1b1b1c1c,#txt98_1b1b1c1c,#txt99_1b1b1c1c,#txt102_1b1b1c1c,#txt103_1b1b1c1c,#txt104_1b1b1c1c,#txt105_1b1b1c1c,#txt106_1b1b1c1c,#txt107_1b1b1c1c,#txt108_1b1b1c1c,#txt111_1b1b1c1c {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#008000;}#txt92_1b1b1c1c,#txt100_1b1b1c1c,#txt109_1b1b1c1c {font-family:fnt10; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:#008000;}#txt93_1b1b1c1c,#txt101_1b1b1c1c,#txt110_1b1b1c1c {font-family:fnt10; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:#008000;}#svg21_1b1b1c1c,#svg33_1b1b1c1c {-webkit-transform-origin:3px -0px; -moz-transform-origin:3px -0px; -o-transform-origin:3px -0px; -ms-transform-origin:3px -0px; transform-origin:3px -0px; display:none;}#svg27_1b1b1c1c,#svg28_1b1b1c1c,#svg29_1b1b1c1c,#svg39_1b1b1c1c {-webkit-transform-origin:0.375px 0.375px; -moz-transform-origin:0.375px 0.375px; -o-transform-origin:0.375px 0.375px; -ms-transform-origin:0.375px 0.375px; transform-origin:0.375px 0.375px; display:none; pointer-events:none;}#txt132_1b1b1c1c,#txt134_1b1b1c1c,#txt136_1b1b1c1c,#txt160_1b1b1c1c,#txt164_1b1b1c1c {font-family:fnt10; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:#ff0000;}#txt133_1b1b1c1c,#txt137_1b1b1c1c,#txt161_1b1b1c1c,#txt165_1b1b1c1c {font-family:fnt10; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:#ff0000;}#txt138_1b1b1c1c,#txt142_1b1b1c1c,#txt166_1b1b1c1c {font-family:fnt10; font-size:25px; line-height:33px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt139_1b1b1c1c,#txt143_1b1b1c1c,#txt167_1b1b1c1c {font-family:fnt10; font-size:16.667px; line-height:22px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt140_1b1b1c1c,#txt144_1b1b1c1c,#txt168_1b1b1c1c,#txt170_1b1b1c1c {font-family:fnt10; font-size:25px; line-height:33px; font-weight:bold; font-style:italic; color:#203864;}#txt141_1b1b1c1c,#txt145_1b1b1c1c,#txt169_1b1b1c1c,#txt171_1b1b1c1c {font-family:fnt10; font-size:16.667px; line-height:22px; font-weight:bold; font-style:italic; color:#203864;}#svg30_1b1b1c1c {-webkit-transform-origin:3px 1.5px; -moz-transform-origin:3px 1.5px; -o-transform-origin:3px 1.5px; -ms-transform-origin:3px 1.5px; transform-origin:3px 1.5px;}#txt186_1b1b1c1c {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt187_1b1b1c1c {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt188_1b1b1c1c {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt189_1b1b1c1c {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide7.js b/experiment/simulation/EE4/iframes/data/slide7.js new file mode 100644 index 0000000..957dc26 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide7.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(6, '
    1. Output Characteristics
    2. Transfer Characteristics
    It  is  the  tracing  of  drain  current  ( I profile
    against  drain-to-source  voltage  ( V DS  for  a
    fixed  gate-to-source  voltage  ( V GS  ).
    It  is  the  tracing  of  drain  current  ( I profile
    against  drain-to-source  voltage  ( V DS  for  a
    fixed  gate-to-source  voltage  ( V GS  ).
    It  is  the  tracing  of  drain  current  ( I profile
    against  gate-to-source  voltage  ( V GS  for  a
    fixed  drain-to-source  voltage  ( V DS  ).
    It  is  the  tracing  of  drain  current  ( I profile
    against  gate-to-source  voltage  ( V GS  for  a
    fixed  drain-to-source  voltage  ( V DS  ).
    For  particular  V GS
    For  particular  V GS
    V GS_2   >  V GS_1
    V GS_2   >  V GS_1
    V DS
    V DS
    I D
    I D
    For  another  V GS
    For  another  V GS
    V GS_2
    V GS_2
    V GS_1
    V GS_1
    V GS
    V GS
    I D
    For  given  V DS
    For  given  V DS
    Characteristics Of MOSFET
    Characteristics Of MOSFET
    Characteristics Of MOSFET
    Characteristics Of MOSFET
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide8.css b/experiment/simulation/EE4/iframes/data/slide8.css new file mode 100644 index 0000000..9e7e0da --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide8.css @@ -0,0 +1 @@ +#spr1_1b1b1f19 {clip:rect(0px,960px,540px,0px);}#spr4_1b1b1f19,#spr5_1b1b1f19,#spr9_1b1b1f19 {display:none;}#txt0_1b1b1f19,#txt1_1b1b1f19,#txt2_1b1b1f19,#txt3_1b1b1f19,#txt4_1b1b1f19,#txt5_1b1b1f19,#txt6_1b1b1f19,#txt7_1b1b1f19,#txt8_1b1b1f19,#txt9_1b1b1f19,#txt20_1b1b1f19,#txt21_1b1b1f19,#txt22_1b1b1f19,#txt23_1b1b1f19,#txt24_1b1b1f19,#txt25_1b1b1f19,#txt26_1b1b1f19,#txt27_1b1b1f19,#txt28_1b1b1f19,#txt29_1b1b1f19,#txt30_1b1b1f19,#txt31_1b1b1f19,#txt32_1b1b1f19,#txt33_1b1b1f19,#txt34_1b1b1f19,#txt35_1b1b1f19,#txt36_1b1b1f19,#txt37_1b1b1f19,#txt38_1b1b1f19,#txt39_1b1b1f19,#txt40_1b1b1f19,#txt41_1b1b1f19 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt10_1b1b1f19,#txt11_1b1b1f19,#txt12_1b1b1f19,#txt13_1b1b1f19,#txt14_1b1b1f19,#txt15_1b1b1f19,#txt16_1b1b1f19,#txt17_1b1b1f19,#txt18_1b1b1f19,#txt19_1b1b1f19 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#003300;}#txt42_1b1b1f19,#txt43_1b1b1f19,#txt44_1b1b1f19,#txt45_1b1b1f19,#txt46_1b1b1f19,#txt47_1b1b1f19,#txt48_1b1b1f19,#txt49_1b1b1f19,#txt50_1b1b1f19,#txt51_1b1b1f19,#txt52_1b1b1f19,#txt53_1b1b1f19,#txt54_1b1b1f19,#txt55_1b1b1f19,#txt56_1b1b1f19,#txt57_1b1b1f19,#txt58_1b1b1f19,#txt59_1b1b1f19,#txt60_1b1b1f19,#txt61_1b1b1f19,#txt62_1b1b1f19,#txt63_1b1b1f19 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#ff0066;}#txt64_1b1b1f19 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt65_1b1b1f19 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt66_1b1b1f19 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt67_1b1b1f19 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#svg0_1b1b1f19,#svg1_1b1b1f19 {-webkit-transform-origin:0.375px 0.375px; -moz-transform-origin:0.375px 0.375px; -o-transform-origin:0.375px 0.375px; -ms-transform-origin:0.375px 0.375px; transform-origin:0.375px 0.375px;}#svg2_1b1b1f19 {-webkit-transform-origin:1.15px 2.3px; -moz-transform-origin:1.15px 2.3px; -o-transform-origin:1.15px 2.3px; -ms-transform-origin:1.15px 2.3px; transform-origin:1.15px 2.3px;}#svg8_1b1b1f19 {-webkit-transform-origin:4.5px 2.25px; -moz-transform-origin:4.5px 2.25px; -o-transform-origin:4.5px 2.25px; -ms-transform-origin:4.5px 2.25px; transform-origin:4.5px 2.25px;}#svg14_1b1b1f19 {-webkit-transform-origin:2.793px 3.825px; -moz-transform-origin:2.793px 3.825px; -o-transform-origin:2.793px 3.825px; -ms-transform-origin:2.793px 3.825px; transform-origin:2.793px 3.825px;}#svg20_1b1b1f19,#svg68_1b1b1f19,#svg69_1b1b1f19,#svg70_1b1b1f19,#svg71_1b1b1f19,#svg72_1b1b1f19 {pointer-events:none;}#svg21_1b1b1f19 {-webkit-transform-origin:4.97px 2.5px; -moz-transform-origin:4.97px 2.5px; -o-transform-origin:4.97px 2.5px; -ms-transform-origin:4.97px 2.5px; transform-origin:4.97px 2.5px;}#svg27_1b1b1f19 {-webkit-transform-origin:2.55px 4.502px; -moz-transform-origin:2.55px 4.502px; -o-transform-origin:2.55px 4.502px; -ms-transform-origin:2.55px 4.502px; transform-origin:2.55px 4.502px;}#svg33_1b1b1f19 {-webkit-transform-origin:5px 2.5px; -moz-transform-origin:5px 2.5px; -o-transform-origin:5px 2.5px; -ms-transform-origin:5px 2.5px; transform-origin:5px 2.5px;}#svg49_1b1b1f19 {-webkit-transform-origin:2.313px 4.653px; -moz-transform-origin:2.313px 4.653px; -o-transform-origin:2.313px 4.653px; -ms-transform-origin:2.313px 4.653px; transform-origin:2.313px 4.653px;}#svg50_1b1b1f19 {-webkit-transform-origin:4.625px 2.312px; -moz-transform-origin:4.625px 2.312px; -o-transform-origin:4.625px 2.312px; -ms-transform-origin:4.625px 2.312px; transform-origin:4.625px 2.312px;}#svg56_1b1b1f19 {-webkit-transform-origin:2.745px 3.921px; -moz-transform-origin:2.745px 3.921px; -o-transform-origin:2.745px 3.921px; -ms-transform-origin:2.745px 3.921px; transform-origin:2.745px 3.921px;}#svg62_1b1b1f19 {-webkit-transform-origin:4.992px 2.5px; -moz-transform-origin:4.992px 2.5px; -o-transform-origin:4.992px 2.5px; -ms-transform-origin:4.992px 2.5px; transform-origin:4.992px 2.5px;}#txt68_1b1b1f19,#txt69_1b1b1f19,#txt72_1b1b1f19,#txt73_1b1b1f19,#txt75_1b1b1f19,#txt80_1b1b1f19,#txt81_1b1b1f19,#txt83_1b1b1f19 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt70_1b1b1f19,#txt71_1b1b1f19 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:#2a421a;}#txt74_1b1b1f19,#txt82_1b1b1f19 {font-family:fnt9; font-size:12px; line-height:16px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt76_1b1b1f19,#txt77_1b1b1f19,#txt79_1b1b1f19 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:#ff0000;}#txt78_1b1b1f19 {font-family:fnt9; font-size:12px; line-height:16px; font-weight:bold; color:#ff0000;}#txt84_1b1b1f19,#txt85_1b1b1f19,#txt87_1b1b1f19 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:#a40000;}#txt86_1b1b1f19 {font-family:fnt9; font-size:12px; line-height:16px; font-weight:bold; color:#a40000;}#txt88_1b1b1f19,#txt89_1b1b1f19,#txt92_1b1b1f19,#txt93_1b1b1f19 {font-family:fnt9; font-size:20px; line-height:27px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt90_1b1b1f19,#txt91_1b1b1f19 {font-family:fnt9; font-size:20px; line-height:27px; font-weight:bold; color:#a40000;}#txt94_1b1b1f19,#txt95_1b1b1f19 {font-family:fnt9; font-size:20px; line-height:27px; font-weight:bold; color:#0000ff;}#svg73_1b1b1f19 {-webkit-transform-origin:11.783px 11.783px; -moz-transform-origin:11.783px 11.783px; -o-transform-origin:11.783px 11.783px; -ms-transform-origin:11.783px 11.783px; transform-origin:11.783px 11.783px; display:none;}#svg74_1b1b1f19 {-webkit-transform-origin:12.626px 12.626px; -moz-transform-origin:12.626px 12.626px; -o-transform-origin:12.626px 12.626px; -ms-transform-origin:12.626px 12.626px; transform-origin:12.626px 12.626px; display:none;}#txt96_1b1b1f19 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:#000000;} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide8.js b/experiment/simulation/EE4/iframes/data/slide8.js new file mode 100644 index 0000000..5dfcda7 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide8.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(7, '
    3. Switching Characteristics
    MOSFETs  are  generally  used  as
    switching  devices  in  power  converters.
    MOSFETs  are  generally  used  as
    switching  devices  in  power  converters.
    Switching  characteristics  of  MOSFET
    refers  to  its  current  and  voltage
    profiles  when  they  are  turned-  ON-to-
    OFF  and  OFF-to-ON  (during  transition).
    Switching  characteristics  of  MOSFET
    refers  to  its  current  and  voltage
    profiles  when  they  are  turned-  ON-to-
    OFF  and  OFF-to-ON  (during  transition).
    Characteristics Of MOSFET
    Characteristics Of MOSFET
    Characteristics Of MOSFET
    Characteristics Of MOSFET
    Gate
    Pulses
    Gate
    Pulses
    Switch
    Current (I SW )
    Switch
    Current (I SW )
    Switch
    Voltage (V SW )
    Switch
    Voltage (V SW )
    OFF-to-ON
    Characteristics
    OFF-to-ON
    Characteristics
    ON-to-OFF
    Characteristics
    ON-to-OFF
    Characteristics
    t
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide9.css b/experiment/simulation/EE4/iframes/data/slide9.css new file mode 100644 index 0000000..a66424e --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide9.css @@ -0,0 +1 @@ +#spr1_1b1b20fe {clip:rect(0px,960px,540px,0px);} \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/slide9.js b/experiment/simulation/EE4/iframes/data/slide9.js new file mode 100644 index 0000000..cba0815 --- /dev/null +++ b/experiment/simulation/EE4/iframes/data/slide9.js @@ -0,0 +1,2 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(8, '
    Instruments\
+Required
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/data/thmb1.png b/experiment/simulation/EE4/iframes/data/thmb1.png new file mode 100644 index 0000000..66cc779 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb1.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb10.png b/experiment/simulation/EE4/iframes/data/thmb10.png new file mode 100644 index 0000000..b11bba4 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb10.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb11.png b/experiment/simulation/EE4/iframes/data/thmb11.png new file mode 100644 index 0000000..57f516a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb11.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb12.png b/experiment/simulation/EE4/iframes/data/thmb12.png new file mode 100644 index 0000000..1601b6c Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb12.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb13.png b/experiment/simulation/EE4/iframes/data/thmb13.png new file mode 100644 index 0000000..3367c3c Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb13.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb14.png b/experiment/simulation/EE4/iframes/data/thmb14.png new file mode 100644 index 0000000..974a777 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb14.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb15.png b/experiment/simulation/EE4/iframes/data/thmb15.png new file mode 100644 index 0000000..a24cebb Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb15.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb16.png b/experiment/simulation/EE4/iframes/data/thmb16.png new file mode 100644 index 0000000..bd48ea9 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb16.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb17.png b/experiment/simulation/EE4/iframes/data/thmb17.png new file mode 100644 index 0000000..ce07cf8 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb17.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb18.png b/experiment/simulation/EE4/iframes/data/thmb18.png new file mode 100644 index 0000000..1a40ff9 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb18.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb19.png b/experiment/simulation/EE4/iframes/data/thmb19.png new file mode 100644 index 0000000..15702c6 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb19.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb2.png b/experiment/simulation/EE4/iframes/data/thmb2.png new file mode 100644 index 0000000..640666f Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb2.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb20.png b/experiment/simulation/EE4/iframes/data/thmb20.png new file mode 100644 index 0000000..b00412c Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb20.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb21.png b/experiment/simulation/EE4/iframes/data/thmb21.png new file mode 100644 index 0000000..9817ed4 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb21.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb22.png b/experiment/simulation/EE4/iframes/data/thmb22.png new file mode 100644 index 0000000..c57bfb9 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb22.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb23.png b/experiment/simulation/EE4/iframes/data/thmb23.png new file mode 100644 index 0000000..3c7a170 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb23.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb24.png b/experiment/simulation/EE4/iframes/data/thmb24.png new file mode 100644 index 0000000..e810073 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb24.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb25.png b/experiment/simulation/EE4/iframes/data/thmb25.png new file mode 100644 index 0000000..b001762 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb25.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb26.png b/experiment/simulation/EE4/iframes/data/thmb26.png new file mode 100644 index 0000000..3f19a35 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb26.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb27.png b/experiment/simulation/EE4/iframes/data/thmb27.png new file mode 100644 index 0000000..1e5c02f Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb27.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb28.png b/experiment/simulation/EE4/iframes/data/thmb28.png new file mode 100644 index 0000000..ccf3365 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb28.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb29.png b/experiment/simulation/EE4/iframes/data/thmb29.png new file mode 100644 index 0000000..593e4cb Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb29.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb3.png b/experiment/simulation/EE4/iframes/data/thmb3.png new file mode 100644 index 0000000..bcf790b Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb3.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb30.png b/experiment/simulation/EE4/iframes/data/thmb30.png new file mode 100644 index 0000000..14e4df6 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb30.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb31.png b/experiment/simulation/EE4/iframes/data/thmb31.png new file mode 100644 index 0000000..e0554f1 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb31.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb32.png b/experiment/simulation/EE4/iframes/data/thmb32.png new file mode 100644 index 0000000..9ec9fad Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb32.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb4.png b/experiment/simulation/EE4/iframes/data/thmb4.png new file mode 100644 index 0000000..c3257cc Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb4.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb5.png b/experiment/simulation/EE4/iframes/data/thmb5.png new file mode 100644 index 0000000..b487ede Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb5.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb6.png b/experiment/simulation/EE4/iframes/data/thmb6.png new file mode 100644 index 0000000..0598c25 Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb6.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb7.png b/experiment/simulation/EE4/iframes/data/thmb7.png new file mode 100644 index 0000000..adbc15c Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb7.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb8.png b/experiment/simulation/EE4/iframes/data/thmb8.png new file mode 100644 index 0000000..4420f8a Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb8.png differ diff --git a/experiment/simulation/EE4/iframes/data/thmb9.png b/experiment/simulation/EE4/iframes/data/thmb9.png new file mode 100644 index 0000000..64338be Binary files /dev/null and b/experiment/simulation/EE4/iframes/data/thmb9.png differ diff --git a/experiment/simulation/EE4/iframes/index.html b/experiment/simulation/EE4/iframes/index.html new file mode 100644 index 0000000..0042f38 --- /dev/null +++ b/experiment/simulation/EE4/iframes/index.html @@ -0,0 +1,80 @@ + + + + + MOSFET_chac_feb_24 + + + + + +
    + + +
    +
    + + + + + \ No newline at end of file diff --git a/experiment/simulation/EE4/iframes/overplayer.js b/experiment/simulation/EE4/iframes/overplayer.js new file mode 100644 index 0000000..7826fe8 --- /dev/null +++ b/experiment/simulation/EE4/iframes/overplayer.js @@ -0,0 +1,138 @@ +const overPlayer = { + trial_banner: null, + playBtn: null, + playerNextBtn: null, + headTitle: null, + sliderIsPlaying: false, + + init() { + this.trial_banner = document.querySelector(".trial_banner") + this.playBtn = document.querySelector(".play-controls-container__play-pause-button") + this.playerNextBtn = document.querySelector(".navigation-controls__button_next") + this.headTitle = document.querySelector(".info-container__title div") + + this.hideTrialBanner(); + this.updateTitle(); + + // * Hide player next btn + this.playerNextBtn.style.opacity = 0 + + // * slide is running state + localStorage.setItem("isSlideEnded",false) + + + // remove wher do you left + for(let key in localStorage){ + if(key.indexOf("ispring")!=-1){ + localStorage.removeItem(key) + break + } + } + }, + + slidePlay() { + const touchStartOn = function (el, x, y) { + var e, err; + if (x == null) { + x = 0; + } + if (y == null) { + y = 0; + } + try { + e = document.createEvent("TouchEvent"); + e.initTouchEvent("touchstart", true, true); + } catch (error) { + err = error; + try { + e = document.createEvent("UIEvent"); + e.initUIEvent("touchstart", true, true); + } catch (error) { + err = error; + e = document.createEvent("Event"); + e.initEvent("touchstart", true, true); + } + } + e.targetTouches = [ + { + pageX: x, + pageY: y, + }, + ]; + console.log(e) + return el.dispatchEvent(e); + }; + + let btn = $(this.playBtn) + let btnOffset = btn.offset() + + touchStartOn(this.playBtn, btnOffset.left + 5, btnOffset.top + 5) + }, + slidePause() {}, + hideTrialBanner() { + this.trial_banner.style.opacity = 0; + }, + updateTitle() { + this.headTitle.innerHTML = "Buck Converter"; + }, + isSlidePlaying() { + let playBtnPath = document.querySelector( + ".play-controls-container__play-pause-button svg path" + ); + // if playing then the path.d[1] == 5 else == 7 pause + // ! playing + if (playBtnPath.attributes.d.value[1] == 5) { + return true; + } + // ! pause + return false; + }, + addClassNameListener(elemId, callback) { + var elem = document.getElementById(elemId); + var lastClassName = elem.className; + window.setInterval( function() { + var className = elem.className; + if (className !== lastClassName) { + callback(); + lastClassName = className; + } + },10) + }, + onPlayBtn(){ + window.setInterval(()=>{ + let pauseBtnName = 7 + let playBtnName = 5 + let btnName = this.playBtn.firstChild.firstChild.attributes.d.value[1] + if(btnName == pauseBtnName){ + // capturing pause + console.log(btnName,"pause") + }else{ + // capturing play + console.log(btnName,"Play") + } + },1000) + }, + onSlidesEnd(){ + // * Capture the slides end + + var interval = window.setInterval(()=>{ + let isSlideEnded = localStorage.getItem("isSlideEnded") + if(isSlideEnded=="false"){ + if(this.playerNextBtn.disabled == true){ + localStorage.setItem("isSlideEnded",true) + } + }else{ + window.clearInterval(interval) + } + + },1000) + }, +}; + +overPlayer.init() +window.setTimeout(()=>{ + overPlayer.onSlidesEnd() + console.log("work") +},2000) +// overPlayer.onPlayBtn() + diff --git a/experiment/simulation/EE4/index.html b/experiment/simulation/EE4/index.html new file mode 100644 index 0000000..58f7832 --- /dev/null +++ b/experiment/simulation/EE4/index.html @@ -0,0 +1,1237 @@ + + + + + + +Document + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +

    For Better User Experience, reset zoom to 100%
    (by pressing 'Ctrl + 0')
    and refresh the page (by pressing 'Ctrl + R')

    +
    + + + + +
    + + +
    +
    + +
    +
    +
    +
    +
    + + + + + + +
    +
    +
    + +
    +
    +

    Output Characteristics of Mosfet

    + + +
    + +
    +Objective: +

    To Set the Beam and Slab using Flex System.

    +Apparatus Materials: +

    + Tripod Stand, CT prop, fourway head, Aluminium Beam, Timber Beam, Plywood Sheathing, Beam Forming support. +

    +
    + +
    +

    Step 1

    +

    + Calculation of cross-sectional area: +

    +
    + +
      + +
    + + +
    + + +
    + +
    +Welcome to +Foundation in Beam Formwork Experiment +of Formwork Technology in Civil Engineering Virtual + Lab +developed by Prof. K. N. Jha, Department of Civil + Engineering, IIT Delhi. +
    +
    +Prof. K. N. Jha Image +Prof. K. N. Jha +IIT Delhi +
    +
    + +
    +

    Enter your name:

    + +

    Please enter your name before start

    + +
    + + + + + + + + + + + + + + + + + + + +
    Calculations:
    Total Length(m)
    Weight(kg)
    + Cross-sectional area (mm2) +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    S.No.Vin(V)R(Ω)DV0(V)MIin(A)I0(A)P0(W)
    1
    2
    3
    4
    5
    6
    7
    8
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    VGS = 4VVGS = 6VVGS = 8VVGS = 10VVGS = 15V
    VDS(V)ID(A)ID(A)ID(A)ID(A)ID(A)
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    VDS = 50 V
    VGS(V)ID(A)
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FromP1SA2R2P2N2V1V2
    ToDA1R1N1GSDS
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FromP1SR1P2N2DVPCPA1V1v2
    ToDR2N1GSCH1CH2WireDS
    + + +
    + +
    +From +To +
    + + + + + + + + +
    + +
    + +
    +From +To +
    + + + + + + + + + + +
    + +
    + +
    +From +To +
    + + + + + + + + + + +
    + + + + + +
    + +
    + +
    + +

    + +
    + +
    + +
    +
    +
    +

    Question text

    + +
    +
      +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • +

      India

      +
    • +
    +
    + +
    + +
    +
    + +Certificate of Completion +
    +
    +
    +Utkarsh Sharma +
    +
    +has succesfully performed Virtaul Lab Experiment on + +Foundation in foamwork +
    +
    + +Date 10-10-2023 +
    +
    +which is developed by + VIRTUAL LABS - IIT Delhi + +
    +
    +
    + + + + + + + + + +
    + Record +
    +
    + Reset +
    +
    + Delete +
    +
    + Check Connections +
    +
    + Circuit Diagram +
    + +
    + Check +
    +
    + Reset +
    +
    + Hint +
    + + + + + + + + +arrow + +laerrow +laerrow2 +logo +man +measurearrow +measurearrow2 +redsize +speech_off_btn +speech_on_btn +talk_cloud +iit-delhi-logo + + +btn_connections.png +btn_connectons_completed.png +btn_instructions.png +btn_nomenclature.png +btn_plot.png +btn_procedure.png +btn_reset.png +btn_start_experiment.png +method_1_cable_black_bottom.png +method_1_cable_black_top.png +method_1_cable_blue.png +method_1_cable_green.png +method_1_cable_pink.png +method_1_cable_purple.png +method_1_cable_red.png +method_1_cable_yellow.png +method_2_cable_green.png +method_2_cable_red.png +method_2_cable_yellow.png +part_1_instructions_box.png +part_1_procedure_box.png +part_1_select_option_1_1.png +part_1_select_option_1_2.png +part_1_select_option_2.png +part_1_select_option_3.png +part_1_select_option_full.png +part_1_slide_1.png +part_1_slide_2.png +part_1_slide_3.png +part_1_slide_3_compo_1_off.png +part_1_slide_3_compo_1_on.png +part_1_slide_3_compo_1_text.png +part_1_slide_3_compo_2_off.png +part_1_slide_3_compo_2_on.png +part_1_slide_3_compo_2_text.png +part_1_procedure_box_2.png +part_1_slide_4.png +part_1_incomplete_connection.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +Title + +
    +
    + +
    ?
    +
    ?
    +
    ?
    +
    ?
    +
    ?
    +
    ?
    + +
    + +

    Image Box

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    +
    + +
    +
    + + +
    + +
    +
    + + + + + + + + + + + diff --git a/experiment/simulation/EE4/js/Anime.js b/experiment/simulation/EE4/js/Anime.js new file mode 100644 index 0000000..2f0eeaa --- /dev/null +++ b/experiment/simulation/EE4/js/Anime.js @@ -0,0 +1,62 @@ +const Anime = { + // time in second + fade(target,duration=1,endDelay=10,complete=null,begin=null){ + duration = duration * 1000 + endDelay = endDelay * 1000 + anime({ + targets: target, + duration: duration, + easing: "linear", + delay: 2000, + opacity: [0,1], + complete(){ + if(complete) + complete() + if(begin) + begin() + + setTimeout(()=>{ + anime({ + targets: target, + duration: duration, + easing: "linear", + opacity: 0, + }) + },endDelay) + } + }) + }, + fadeIn(target,duration=1,endDelay=10,complete=null,begin=null){ + duration = duration * 1000 + endDelay = endDelay * 1000 + anime({ + targets: target, + duration: duration, + easing: "linear", + delay: 2000, + opacity: [0,1], + complete(){ + if(complete) + complete() + if(begin) + begin() + } + }) + }, + moveLeft(target,leftPixel,duration=1,complete=null,begin=null){ + anime({ + targets: target, + easing: "easeInOutExpo", + left: leftPixel, + duration: duration*1000, + begin(){ + if(begin) + begin() + }, + complete(){ + if(complete) + complete() + } + }) + }, +} \ No newline at end of file diff --git a/experiment/simulation/EE4/js/Dom.js b/experiment/simulation/EE4/js/Dom.js new file mode 100644 index 0000000..5e34599 --- /dev/null +++ b/experiment/simulation/EE4/js/Dom.js @@ -0,0 +1,238 @@ + +// global for document object +const get = (query) => { + return document.querySelector(query); +}; + +const getAll = (query) => { + return document.querySelectorAll(query); +}; + +class Dom { + constructor(selector) { + this.item = null; + if (selector[0] == "." || selector[0] == "#") { + this.item = get(selector); + } else if (selector instanceof HTMLElement) { + this.item = selector; + } else { + this.item = src.get(selector); + } + this.selector = selector; + // push + } + getValue(){ + return this.item.attributes['value'].value + } + setValue(val){ + this.item.attributes['value'].value = val; + } + hidden(isHidden) { + if (isHidden == false) this.item.style.visibility = "visible"; + else this.item.style.visibility = "hidden"; + } + setContent(text) { + this.item.innerHTML = text; + return this; + } + zIndex(idx) { + this.item.style.zIndex = idx; + return this; + } + opacity(val = 1) { + this.item.style.opacity = val; + return this; + } + rotate(deg) { + this.item.style.transform = `rotate(${deg}deg)`; + return this; + } + addClass(className) { + this.item.classList.add(className); + return this; + } + removeClass(className) { + this.item.classList.remove(className); + return this; + } + borderRadius(amount) { + amount += "px"; + this.styles({ + borderRadius: amount, + }); + } + scale(val = 1) { + this.item.style.scale = val; + return this; + } + get() { + return this.item; + } + left(leftPixel){ + this.item.left = leftPixel + "px" + return this + } + set( + left = null, + top = null, + height = null, + width = null, + bottom = null, + right = null, + disp = "block" + ) { + // coordinates + this.left = left; + this.top = top; + this.bottom = bottom; + this.right = right; + this.height = height; + this.width = width; + this.item.style.opacity = 1; + this.item.style.transform = "translateX(0) translateY(0)"; + + if (this.left !== null) this.item.style.left = String(this.left) + "px"; + if (this.top !== null) this.item.style.top = String(this.top) + "px"; + if (this.bottom !== null) + this.item.style.bottom = String(this.bottom) + "px"; + if (this.right !== null) this.item.style.right = String(this.right) + "px"; + if (this.height !== null) + this.item.style.height = String(this.height) + "px"; + if (this.width !== null) this.item.style.width = String(this.width) + "px"; + this.show(disp); + return this; + } + show(disp = "block") { + //! push for every element + this.push(); + + this.item.style.display = disp; + // this.opacity(); + return this; + } + hide() { + this.item.style.display = "none"; + return this; + } + play(speed = 1) { + this.item.play(); + this.item.playbackRate = speed; + return this; + } + // for setting styles + styles(props) { + for (let property in props) { + this.item.style[property] = props[property]; + } + return this; + } + // * static elements/objects of anime + static arrayOfAnimes = []; + static arrayOfItems = []; + static animePush(animeObj) { + Dom.arrayOfAnimes.push(animeObj); + } + static resetAnimeItems() { + Dom.arrayOfAnimes = []; + } + static hideAll() { + //to empty the setCC + setCC(""); + // to delete all content of content adder menu + Scenes.items.contentAdderBox.setContent(""); + for (let i of Dom.arrayOfItems) { + i.hide(); + i.opacity(); + } + // * reset animes + for (let i of Dom.arrayOfAnimes) { + // to reset each anime after back btn pressed + i.reset(); + } + Dom.resetItems(); + } + static resetItems() { + Dom.arrayOfItems = []; + } + static setBlinkArrowRed( + isX = true, + left = null, + top = null, + height = 30, + width = null, + rotate = 0 + ) { + let blinkArrow = new Dom(".blinkArrowRed") + .set(left, top, height, width) + .rotate(rotate) + .zIndex(10000); + if (isX === -1) { + blinkArrow.hide(); + return; + } + let x = 0, + y = 0; + if (isX) { + x = 20; + } else { + y = 20; + } + var blink = anime({ + targets: blinkArrow.item, + easing: "easeInOutQuad", + opacity: 1, + translateX: x, + translateY: y, + direction: "alternate", + loop: true, + autoplay: false, + duration: 300, + }); + + return blink; + } + static setBlinkArrow( + isX = true, + left = null, + top = null, + height = 60, + width = 60, + rotate = 0 + ) { + // because we added the blinkArrow image out of the anime-main + top += 130; + let blinkArrow = new Dom(".blinkArrow") + .set(left, top, height, width) + .rotate(rotate) + .zIndex(10000); + if (isX === -1) { + blinkArrow.hide(); + return; + } + let x = 0, + y = 0; + if (isX) { + x = 20; + } else { + y = 20; + } + var blink = anime({ + targets: blinkArrow.item, + easing: "easeInOutQuad", + opacity: 1, + translateX: x, + translateY: y, + direction: "alternate", + loop: true, + autoplay: false, + duration: 300, + }); + + return blink; + } + push() { + if (this.selector != ".anime-header") Dom.arrayOfItems.push(this); + return this; + } + forMathematicalExpressionBtn = 0; + } \ No newline at end of file diff --git a/experiment/simulation/EE4/js/cables.js b/experiment/simulation/EE4/js/cables.js new file mode 100644 index 0000000..a9e77d2 --- /dev/null +++ b/experiment/simulation/EE4/js/cables.js @@ -0,0 +1,262 @@ +(function () { + // todo change this check with yours + // var yy = document.getElementById("check"); + // yy.onclick = checkk; + + // ! check + function checkk() { + if (connections.length == 0) { + alert("Please make the connections first"); + return false; + } + + if (connections.length < 6) { + alert("Wrong Connections\nPlease go through the instructions once"); + return false; + } + let isConnectionRight = false + if (connections.length >= 6) { + let matrixForCheckGraph = [ + // 0 1 2 3 4 5 6 7 8 9 10 + [0,0,0,0,0,0,0,0,0,0,0], // 0 + [0,0,0,1,0,0,0,0,0,0,0], // 1 + [0,0,0,0,0,0,1,0,1,0,0], // 2 + [0,1,0,0,0,0,0,0,0,0,0], // 3 + [0,0,0,0,0,0,0,1,0,1,0], // 4 + [0,0,0,0,0,0,0,0,0,0,1], // 5 + [0,0,1,0,0,0,0,0,1,0,0], // 6 + [0,0,0,0,1,0,0,0,0,1,0], // 7 + [0,0,1,0,0,0,1,0,0,0,0], // 8 + [0,0,0,0,1,0,0,1,0,0,0], // 9 + [0,0,0,0,0,1,0,0,0,0,0], // 10 + ] + var listDiv = []; + for (var j = 0; j < connections.length; j++) { + let pos = [connections[j].targetId,connections[j].sourceId] + listDiv.push(pos) + } + for(let i=0;i 0) { + var listDiv = []; + for (var j = 0; j < connections.length; j++) { + let pos = [connections[j].targetId,connections[j].sourceId] + listDiv.push(pos) + } + showConnectionInfo(listDiv); + } + }); + + jsPlumb.ready(function () { + var instance = jsPlumb.getInstance(); + + // suspend drawing and initialise. + instance.batch(function () { + // bind to connection/connectionDetached events, and update the list of connections on screen. + instance.bind("connection", function (info, originalEvent) { + updateConnections(info.connection); + }); + instance.bind("connectionDetached", function (info, originalEvent) { + updateConnections(info.connection, true); + }); + + instance.bind("connectionMoved", function (info, originalEvent) { + // only remove here, because a 'connection' event is also fired. + // in a future release of jsplumb this extra connection event will not + // be fired. + updateConnections(info.connection, true); + }); + + // configure some drop options for use by all endpoints. + var exampleDropOptions = { + tolerance: "touch", + hoverClass: "dropHover", + activeClass: "dragActive", + }; + let radius = 14 + var exampleEndpoint1 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "pink" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "pink", strokeWidth: 6 }, + connector: ["Bezier", { curviness: 10 }], + maxConnections: 1, + isTarget: true, + dropOptions: exampleDropOptions, + }; + var exampleEndpoint2 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "black" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "black", strokeWidth: 6 }, + connector: ["Bezier", { curviness: -50 }], + maxConnections: 3, + isTarget: true, + dropOptions: exampleDropOptions, + }; + var exampleEndpoint3 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "red" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "red", strokeWidth: 6 }, + connector: ["Bezier", { curviness: -30 }], + maxConnections: 3, + isTarget: true, + dropOptions: exampleDropOptions, + }; + var exampleEndpoint4 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "green" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "green", strokeWidth: 6 }, + connector: ["Bezier", { curviness: -50 }], + maxConnections: 1, + isTarget: true, + dropOptions: exampleDropOptions, + }; + // conn 1 + instance.addEndpoint( + "vertex1", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint1 + ); + instance.addEndpoint( + "vertex3", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint1 + ); + + // conn 2 + instance.addEndpoint( + "vertex4", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint2 + ); + instance.addEndpoint( + "vertex7", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint2 + ); + instance.addEndpoint( + "vertex9", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint2 + ); + + // conn 3 + instance.addEndpoint( + "vertex8", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint3 + ); + instance.addEndpoint( + "vertex6", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint3 + ); + instance.addEndpoint( + "vertex2", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint3 + ); + + // conn 4 + instance.addEndpoint( + "vertex10", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint4 + ); + instance.addEndpoint( + "vertex5", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint4 + ); + /*instance.addEndpoint("vertex9", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint4); + instance.addEndpoint("vertex10", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint4); + instance.addEndpoint("vertex11", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint3); + instance.addEndpoint("vertex12", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint3);*/ + + instance.draggable(jsPlumb.getSelector(".drag-drop-demo .window")); + + var hideLinks = jsPlumb.getSelector(".drag-drop-demo .hide"); + instance.on(hideLinks, "click", function (e) { + instance.toggleVisible(this.getAttribute("rel")); + jsPlumbUtil.consume(e); + }); + + var dragLinks = jsPlumb.getSelector(".drag-drop-demo .drag"); + instance.on(dragLinks, "click", function (e) { + var s = instance.toggleDraggable(this.getAttribute("rel")); + this.innerHTML = s ? "disable dragging" : "enable dragging"; + jsPlumbUtil.consume(e); + }); + + var detachLinks = jsPlumb.getSelector(".drag-drop-demo .detach"); + instance.on(detachLinks, "click", function (e) { + instance.deleteConnectionsForElement(this.getAttribute("rel")); + jsPlumbUtil.consume(e); + }); + + // ! reset + instance.on(document.getElementById("reset"), "click", function (e) { + // instance.detachEveryConnection(); + instance.deleteEveryConnection() + showConnectionInfo(""); + jsPlumbUtil.consume(e); + }); + }); + + jsPlumb.fire("jsPlumbDemoLoaded", instance); + }); + +})(); diff --git a/experiment/simulation/EE4/js/formulas.js b/experiment/simulation/EE4/js/formulas.js new file mode 100644 index 0000000..ab9d604 --- /dev/null +++ b/experiment/simulation/EE4/js/formulas.js @@ -0,0 +1,111 @@ +const Formulas = { + usingMeters:{ + iD(values,colIdx,vDS_idx){ + + const + Kn_values = [3,0.64,0.425,0.3188,0.2119], + lambda_values = [0.0138,0.25,0.1765,0.0858,0.0259], + Mn_values = [3,1.0827,0.7111,0.3607,0.1681], + gama_values = [0.0138,0.0087,0.025,0.0592,0.0543] + + colIdx = colIdx - 1 + let Kn = Kn_values[colIdx], + lambda = lambda_values[colIdx], + Mn = Mn_values[colIdx], + gama = gama_values[colIdx], + vT = 3, + vGS = values.vGS, + vDS = this.vDS(vDS_idx) + + let ans = 0 + if(0 <= vDS && vDS <= (vGS - vT)){ + let a = Kn * ( 2*(vGS - vT) * vDS - Math.pow(vDS,2)) + let b = (1 + lambda * vDS) + ans = a * b + }else + if( vDS >= (vGS - vT)){ + let a = Mn * Math.pow((vGS - vT),2) + let b = (1 + gama * vDS) + ans = a * b + } + return Number(ans.toFixed(2)) + }, + vDS(vDS_idx){ + const vDS_values = [0,10,20,30,40,50] + return vDS_values[vDS_idx] + }, + }, + usingOscilloscope:{ + iD(values,colIdx,vDS_idx){ + const + Kn_values = [3,0.64,0.425,0.3188,0.2119], + lambda_values = [0.0138,0.25,0.1765,0.0858,0.0259], + Mn_values = [3,1.0827,0.7111,0.3607,0.1681], + gama_values = [0.0138,0.0087,0.025,0.0592,0.0543] + + colIdx = colIdx - 1 + let Kn = Kn_values[colIdx], + lambda = lambda_values[colIdx], + Mn = Mn_values[colIdx], + gama = gama_values[colIdx], + vT = 3, + vGS = values.vGS, + vDS = this.vDS(vDS_idx) + + let ans = 0 + if(0 <= vDS && vDS <= (vGS - vT)){ + let a = Kn * ( 2*(vGS - vT) * vDS - Math.pow(vDS,2)) + let b = (1 + lambda * vDS) + ans = a * b + }else + if( vDS >= (vGS - vT)){ + let a = Mn * Math.pow((vGS - vT),2) + let b = (1 + gama * vDS) + ans = a * b + } + console.log("ID: ",colIdx,vDS_idx,ans) + return Number(ans.toFixed(2)) + }, + vDS(vDS_idx){ + const vDS_values = [0,10,20,30,40,50,60] + return vDS_values[vDS_idx] + }, + }, + transferCharacteristics:{ + iD(values,vDS_idx){ + + let vT = 3, + vGS = values.vGS, + vDS = this.vDS(vDS_idx) + + let ans = 0 + if(0 <= vDS && vDS <= 3){ + ans = 0 + }else + if(3 <= vDS && vDS <= 4){ + ans = 0.7 * Math.pow((vGS - vT),2) + }else{ + ans = 3.3 * ( Math.pow((vGS-vT), 2) - 0.79) + } + return Number(ans.toFixed(2)) + }, + vDS(vDS_idx){ + const vDS_values = [0,2,4,6,8,10] + return vDS_values[vDS_idx] + }, + } +} + +let values = { + vIn:0, + vGS:0, + R:0, +} + +function updateValues(vIn,vGS,R){ + values = { + vIn:vIn, + vGS:vGS, + R:R, + } +} \ No newline at end of file diff --git a/experiment/simulation/EE4/js/graph.js b/experiment/simulation/EE4/js/graph.js new file mode 100644 index 0000000..e69de29 diff --git a/experiment/simulation/EE4/js/jsplumb.js b/experiment/simulation/EE4/js/jsplumb.js new file mode 100644 index 0000000..5c66789 --- /dev/null +++ b/experiment/simulation/EE4/js/jsplumb.js @@ -0,0 +1,15949 @@ +/** + * jsBezier + * + * Copyright (c) 2010 - 2017 jsPlumb (hello@jsplumbtoolkit.com) + * + * licensed under the MIT license. + * + * a set of Bezier curve functions that deal with Beziers, used by jsPlumb, and perhaps useful for other people. These functions work with Bezier + * curves of arbitrary degree. + * + * - functions are all in the 'jsBezier' namespace. + * + * - all input points should be in the format {x:.., y:..}. all output points are in this format too. + * + * - all input curves should be in the format [ {x:.., y:..}, {x:.., y:..}, {x:.., y:..}, {x:.., y:..} ] + * + * - 'location' as used as an input here refers to a decimal in the range 0-1 inclusive, which indicates a point some proportion along the length + * of the curve. location as output has the same format and meaning. + * + * + * Function List: + * -------------- + * + * distanceFromCurve(point, curve) + * + * Calculates the distance that the given point lies from the given Bezier. Note that it is computed relative to the center of the Bezier, + * so if you have stroked the curve with a wide pen you may wish to take that into account! The distance returned is relative to the values + * of the curve and the point - it will most likely be pixels. + * + * gradientAtPoint(curve, location) + * + * Calculates the gradient to the curve at the given location, as a decimal between 0 and 1 inclusive. + * + * gradientAtPointAlongCurveFrom (curve, location) + * + * Calculates the gradient at the point on the given curve that is 'distance' units from location. + * + * nearestPointOnCurve(point, curve) + * + * Calculates the nearest point to the given point on the given curve. The return value of this is a JS object literal, containing both the + *point's coordinates and also the 'location' of the point (see above), for example: { point:{x:551,y:150}, location:0.263365 }. + * + * pointOnCurve(curve, location) + * + * Calculates the coordinates of the point on the given Bezier curve at the given location. + * + * pointAlongCurveFrom(curve, location, distance) + * + * Calculates the coordinates of the point on the given curve that is 'distance' units from location. 'distance' should be in the same coordinate + * space as that used to construct the Bezier curve. For an HTML Canvas usage, for example, distance would be a measure of pixels. + * + * locationAlongCurveFrom(curve, location, distance) + * + * Calculates the location on the given curve that is 'distance' units from location. 'distance' should be in the same coordinate + * space as that used to construct the Bezier curve. For an HTML Canvas usage, for example, distance would be a measure of pixels. + * + * perpendicularToCurveAt(curve, location, length, distance) + * + * Calculates the perpendicular to the given curve at the given location. length is the length of the line you wish for (it will be centered + * on the point at 'location'). distance is optional, and allows you to specify a point along the path from the given location as the center of + * the perpendicular returned. The return value of this is an array of two points: [ {x:...,y:...}, {x:...,y:...} ]. + * + * + */ + + (function() { + + var root = this; + + if(typeof Math.sgn == "undefined") { + Math.sgn = function(x) { return x == 0 ? 0 : x > 0 ? 1 :-1; }; + } + + var Vectors = { + subtract : function(v1, v2) { return {x:v1.x - v2.x, y:v1.y - v2.y }; }, + dotProduct : function(v1, v2) { return (v1.x * v2.x) + (v1.y * v2.y); }, + square : function(v) { return Math.sqrt((v.x * v.x) + (v.y * v.y)); }, + scale : function(v, s) { return {x:v.x * s, y:v.y * s }; } + }, + + maxRecursion = 64, + flatnessTolerance = Math.pow(2.0,-maxRecursion-1); + + /** + * Calculates the distance that the point lies from the curve. + * + * @param point a point in the form {x:567, y:3342} + * @param curve a Bezier curve in the form [{x:..., y:...}, {x:..., y:...}, {x:..., y:...}, {x:..., y:...}]. note that this is currently + * hardcoded to assume cubiz beziers, but would be better off supporting any degree. + * @return a JS object literal containing location and distance, for example: {location:0.35, distance:10}. Location is analogous to the location + * argument you pass to the pointOnPath function: it is a ratio of distance travelled along the curve. Distance is the distance in pixels from + * the point to the curve. + */ + var _distanceFromCurve = function(point, curve) { + var candidates = [], + w = _convertToBezier(point, curve), + degree = curve.length - 1, higherDegree = (2 * degree) - 1, + numSolutions = _findRoots(w, higherDegree, candidates, 0), + v = Vectors.subtract(point, curve[0]), dist = Vectors.square(v), t = 0.0; + + for (var i = 0; i < numSolutions; i++) { + v = Vectors.subtract(point, _bezier(curve, degree, candidates[i], null, null)); + var newDist = Vectors.square(v); + if (newDist < dist) { + dist = newDist; + t = candidates[i]; + } + } + v = Vectors.subtract(point, curve[degree]); + newDist = Vectors.square(v); + if (newDist < dist) { + dist = newDist; + t = 1.0; + } + return {location:t, distance:dist}; + }; + /** + * finds the nearest point on the curve to the given point. + */ + var _nearestPointOnCurve = function(point, curve) { + var td = _distanceFromCurve(point, curve); + return {point:_bezier(curve, curve.length - 1, td.location, null, null), location:td.location}; + }; + var _convertToBezier = function(point, curve) { + var degree = curve.length - 1, higherDegree = (2 * degree) - 1, + c = [], d = [], cdTable = [], w = [], + z = [ [1.0, 0.6, 0.3, 0.1], [0.4, 0.6, 0.6, 0.4], [0.1, 0.3, 0.6, 1.0] ]; + + for (var i = 0; i <= degree; i++) c[i] = Vectors.subtract(curve[i], point); + for (var i = 0; i <= degree - 1; i++) { + d[i] = Vectors.subtract(curve[i+1], curve[i]); + d[i] = Vectors.scale(d[i], 3.0); + } + for (var row = 0; row <= degree - 1; row++) { + for (var column = 0; column <= degree; column++) { + if (!cdTable[row]) cdTable[row] = []; + cdTable[row][column] = Vectors.dotProduct(d[row], c[column]); + } + } + for (i = 0; i <= higherDegree; i++) { + if (!w[i]) w[i] = []; + w[i].y = 0.0; + w[i].x = parseFloat(i) / higherDegree; + } + var n = degree, m = degree-1; + for (var k = 0; k <= n + m; k++) { + var lb = Math.max(0, k - m), + ub = Math.min(k, n); + for (i = lb; i <= ub; i++) { + var j = k - i; + w[i+j].y += cdTable[j][i] * z[j][i]; + } + } + return w; + }; + /** + * counts how many roots there are. + */ + var _findRoots = function(w, degree, t, depth) { + var left = [], right = [], + left_count, right_count, + left_t = [], right_t = []; + + switch (_getCrossingCount(w, degree)) { + case 0 : { + return 0; + } + case 1 : { + if (depth >= maxRecursion) { + t[0] = (w[0].x + w[degree].x) / 2.0; + return 1; + } + if (_isFlatEnough(w, degree)) { + t[0] = _computeXIntercept(w, degree); + return 1; + } + break; + } + } + _bezier(w, degree, 0.5, left, right); + left_count = _findRoots(left, degree, left_t, depth+1); + right_count = _findRoots(right, degree, right_t, depth+1); + for (var i = 0; i < left_count; i++) t[i] = left_t[i]; + for (var i = 0; i < right_count; i++) t[i+left_count] = right_t[i]; + return (left_count+right_count); + }; + var _getCrossingCount = function(curve, degree) { + var n_crossings = 0, sign, old_sign; + sign = old_sign = Math.sgn(curve[0].y); + for (var i = 1; i <= degree; i++) { + sign = Math.sgn(curve[i].y); + if (sign != old_sign) n_crossings++; + old_sign = sign; + } + return n_crossings; + }; + var _isFlatEnough = function(curve, degree) { + var error, + intercept_1, intercept_2, left_intercept, right_intercept, + a, b, c, det, dInv, a1, b1, c1, a2, b2, c2; + a = curve[0].y - curve[degree].y; + b = curve[degree].x - curve[0].x; + c = curve[0].x * curve[degree].y - curve[degree].x * curve[0].y; + + var max_distance_above, max_distance_below; + max_distance_above = max_distance_below = 0.0; + + for (var i = 1; i < degree; i++) { + var value = a * curve[i].x + b * curve[i].y + c; + if (value > max_distance_above) + max_distance_above = value; + else if (value < max_distance_below) + max_distance_below = value; + } + + a1 = 0.0; b1 = 1.0; c1 = 0.0; a2 = a; b2 = b; + c2 = c - max_distance_above; + det = a1 * b2 - a2 * b1; + dInv = 1.0/det; + intercept_1 = (b1 * c2 - b2 * c1) * dInv; + a2 = a; b2 = b; c2 = c - max_distance_below; + det = a1 * b2 - a2 * b1; + dInv = 1.0/det; + intercept_2 = (b1 * c2 - b2 * c1) * dInv; + left_intercept = Math.min(intercept_1, intercept_2); + right_intercept = Math.max(intercept_1, intercept_2); + error = right_intercept - left_intercept; + return (error < flatnessTolerance)? 1 : 0; + }; + var _computeXIntercept = function(curve, degree) { + var XLK = 1.0, YLK = 0.0, + XNM = curve[degree].x - curve[0].x, YNM = curve[degree].y - curve[0].y, + XMK = curve[0].x - 0.0, YMK = curve[0].y - 0.0, + det = XNM*YLK - YNM*XLK, detInv = 1.0/det, + S = (XNM*YMK - YNM*XMK) * detInv; + return 0.0 + XLK * S; + }; + var _bezier = function(curve, degree, t, left, right) { + var temp = [[]]; + for (var j =0; j <= degree; j++) temp[0][j] = curve[j]; + for (var i = 1; i <= degree; i++) { + for (var j =0 ; j <= degree - i; j++) { + if (!temp[i]) temp[i] = []; + if (!temp[i][j]) temp[i][j] = {}; + temp[i][j].x = (1.0 - t) * temp[i-1][j].x + t * temp[i-1][j+1].x; + temp[i][j].y = (1.0 - t) * temp[i-1][j].y + t * temp[i-1][j+1].y; + } + } + if (left != null) + for (j = 0; j <= degree; j++) left[j] = temp[j][0]; + if (right != null) + for (j = 0; j <= degree; j++) right[j] = temp[degree-j][j]; + + return (temp[degree][0]); + }; + + var _curveFunctionCache = {}; + var _getCurveFunctions = function(order) { + var fns = _curveFunctionCache[order]; + if (!fns) { + fns = []; + var f_term = function() { return function(t) { return Math.pow(t, order); }; }, + l_term = function() { return function(t) { return Math.pow((1-t), order); }; }, + c_term = function(c) { return function(t) { return c; }; }, + t_term = function() { return function(t) { return t; }; }, + one_minus_t_term = function() { return function(t) { return 1-t; }; }, + _termFunc = function(terms) { + return function(t) { + var p = 1; + for (var i = 0; i < terms.length; i++) p = p * terms[i](t); + return p; + }; + }; + + fns.push(new f_term()); // first is t to the power of the curve order + for (var i = 1; i < order; i++) { + var terms = [new c_term(order)]; + for (var j = 0 ; j < (order - i); j++) terms.push(new t_term()); + for (var j = 0 ; j < i; j++) terms.push(new one_minus_t_term()); + fns.push(new _termFunc(terms)); + } + fns.push(new l_term()); // last is (1-t) to the power of the curve order + + _curveFunctionCache[order] = fns; + } + + return fns; + }; + + + /** + * calculates a point on the curve, for a Bezier of arbitrary order. + * @param curve an array of control points, eg [{x:10,y:20}, {x:50,y:50}, {x:100,y:100}, {x:120,y:100}]. For a cubic bezier this should have four points. + * @param location a decimal indicating the distance along the curve the point should be located at. this is the distance along the curve as it travels, taking the way it bends into account. should be a number from 0 to 1, inclusive. + */ + var _pointOnPath = function(curve, location) { + var cc = _getCurveFunctions(curve.length - 1), + _x = 0, _y = 0; + for (var i = 0; i < curve.length ; i++) { + _x = _x + (curve[i].x * cc[i](location)); + _y = _y + (curve[i].y * cc[i](location)); + } + + return {x:_x, y:_y}; + }; + + var _dist = function(p1,p2) { + return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2)); + }; + + var _isPoint = function(curve) { + return curve[0].x === curve[1].x && curve[0].y === curve[1].y; + }; + + /** + * finds the point that is 'distance' along the path from 'location'. this method returns both the x,y location of the point and also + * its 'location' (proportion of travel along the path); the method below - _pointAlongPathFrom - calls this method and just returns the + * point. + */ + var _pointAlongPath = function(curve, location, distance) { + + if (_isPoint(curve)) { + return { + point:curve[0], + location:location + }; + } + + var prev = _pointOnPath(curve, location), + tally = 0, + curLoc = location, + direction = distance > 0 ? 1 : -1, + cur = null; + + while (tally < Math.abs(distance)) { + curLoc += (0.005 * direction); + cur = _pointOnPath(curve, curLoc); + tally += _dist(cur, prev); + prev = cur; + } + + return {point:cur, location:curLoc}; + }; + + var _length = function(curve) { + + var d = new Date().getTime(); + + if (_isPoint(curve)) return 0; + + var prev = _pointOnPath(curve, 0), + tally = 0, + curLoc = 0, + direction = 1, + cur = null; + + while (curLoc < 1) { + curLoc += (0.005 * direction); + cur = _pointOnPath(curve, curLoc); + tally += _dist(cur, prev); + prev = cur; + } + console.log("length", new Date().getTime() - d); + + return tally; + }; + + /** + * finds the point that is 'distance' along the path from 'location'. + */ + var _pointAlongPathFrom = function(curve, location, distance) { + return _pointAlongPath(curve, location, distance).point; + }; + + /** + * finds the location that is 'distance' along the path from 'location'. + */ + var _locationAlongPathFrom = function(curve, location, distance) { + return _pointAlongPath(curve, location, distance).location; + }; + + /** + * returns the gradient of the curve at the given location, which is a decimal between 0 and 1 inclusive. + * + * thanks // http://bimixual.org/AnimationLibrary/beziertangents.html + */ + var _gradientAtPoint = function(curve, location) { + + var p1 = _pointOnPath(curve, location), + p2 = _pointOnPath(curve.slice(0, curve.length - 1), location), + dy = p2.y - p1.y, dx = p2.x - p1.x; + + return dy === 0 ? Infinity : Math.atan(dy / dx); + }; + + /** + returns the gradient of the curve at the point which is 'distance' from the given location. + if this point is greater than location 1, the gradient at location 1 is returned. + if this point is less than location 0, the gradient at location 0 is returned. + */ + var _gradientAtPointAlongPathFrom = function(curve, location, distance) { + var p = _pointAlongPath(curve, location, distance); + if (p.location > 1) p.location = 1; + if (p.location < 0) p.location = 0; + return _gradientAtPoint(curve, p.location); + }; + + /** + * calculates a line that is 'length' pixels long, perpendicular to, and centered on, the path at 'distance' pixels from the given location. + * if distance is not supplied, the perpendicular for the given location is computed (ie. we set distance to zero). + */ + var _perpendicularToPathAt = function(curve, location, length, distance) { + distance = distance == null ? 0 : distance; + var p = _pointAlongPath(curve, location, distance), + m = _gradientAtPoint(curve, p.location), + _theta2 = Math.atan(-1 / m), + y = length / 2 * Math.sin(_theta2), + x = length / 2 * Math.cos(_theta2); + return [{x:p.point.x + x, y:p.point.y + y}, {x:p.point.x - x, y:p.point.y - y}]; + }; + + /** + * Calculates all intersections of the given line with the given curve. + * @param x1 + * @param y1 + * @param x2 + * @param y2 + * @param curve + * @returns {Array} + */ + var _lineIntersection = function(x1, y1, x2, y2, curve) { + var a = y2 - y1, + b = x1 - x2, + c = (x1 * (y1 - y2)) + (y1 * (x2-x1)), + coeffs = _computeCoefficients(curve), + p = [ + (a*coeffs[0][0]) + (b * coeffs[1][0]), + (a*coeffs[0][1])+(b*coeffs[1][1]), + (a*coeffs[0][2])+(b*coeffs[1][2]), + (a*coeffs[0][3])+(b*coeffs[1][3]) + c + ], + r = _cubicRoots.apply(null, p), + intersections = []; + + if (r != null) { + + for (var i = 0; i < 3; i++) { + var t = r[i], + t2 = Math.pow(t, 2), + t3 = Math.pow(t, 3), + x = [ + (coeffs[0][0] * t3) + (coeffs[0][1] * t2) + (coeffs[0][2] * t) + coeffs[0][3], + (coeffs[1][0] * t3) + (coeffs[1][1] * t2) + (coeffs[1][2] * t) + coeffs[1][3] + ]; + + // check bounds of the line + var s; + if ((x2 - x1) !== 0) { + s = (x[0] - x1) / (x2 - x1); + } + else { + s = (x[1] - y1) / (y2 - y1); + } + + if (t >= 0 && t <= 1.0 && s >= 0 && s <= 1.0) { + intersections.push(x); + } + } + } + + return intersections; + }; + + /** + * Calculates all intersections of the given box with the given curve. + * @param x X position of top left corner of box + * @param y Y position of top left corner of box + * @param w width of box + * @param h height of box + * @param curve + * @returns {Array} + */ + var _boxIntersection = function(x, y, w, h, curve) { + var i = []; + i.push.apply(i, _lineIntersection(x, y, x + w, y, curve)); + i.push.apply(i, _lineIntersection(x + w, y, x + w, y + h, curve)); + i.push.apply(i, _lineIntersection(x + w, y + h, x, y + h, curve)); + i.push.apply(i, _lineIntersection(x, y + h, x, y, curve)); + return i; + }; + + /** + * Calculates all intersections of the given bounding box with the given curve. + * @param boundingBox Bounding box, in { x:.., y:..., w:..., h:... } format. + * @param curve + * @returns {Array} + */ + var _boundingBoxIntersection = function(boundingBox, curve) { + var i = []; + i.push.apply(i, _lineIntersection(boundingBox.x, boundingBox.y, boundingBox.x + boundingBox.w, boundingBox.y, curve)); + i.push.apply(i, _lineIntersection(boundingBox.x + boundingBox.w, boundingBox.y, boundingBox.x + boundingBox.w, boundingBox.y + boundingBox.h, curve)); + i.push.apply(i, _lineIntersection(boundingBox.x + boundingBox.w, boundingBox.y + boundingBox.h, boundingBox.x, boundingBox.y + boundingBox.h, curve)); + i.push.apply(i, _lineIntersection(boundingBox.x, boundingBox.y + boundingBox.h, boundingBox.x, boundingBox.y, curve)); + return i; + }; + + + function _computeCoefficientsForAxis(curve, axis) { + return [ + -(curve[0][axis]) + (3*curve[1][axis]) + (-3 * curve[2][axis]) + curve[3][axis], + (3*(curve[0][axis])) - (6*(curve[1][axis])) + (3*(curve[2][axis])), + -3*curve[0][axis] + 3*curve[1][axis], + curve[0][axis] + ]; + } + + function _computeCoefficients(curve) + { + return [ + _computeCoefficientsForAxis(curve, "x"), + _computeCoefficientsForAxis(curve, "y") + ]; + } + + function sgn(x) { + return x < 0 ? -1 : x > 0 ? 1 : 0; + } + + function _cubicRoots(a, b, c, d) { + var A = b / a, + B = c / a, + C = d / a, + Q = (3*B - Math.pow(A, 2))/9, + R = (9*A*B - 27*C - 2*Math.pow(A, 3))/54, + D = Math.pow(Q, 3) + Math.pow(R, 2), + S, + T, + t = []; + + if (D >= 0) // complex or duplicate roots + { + S = sgn(R + Math.sqrt(D))*Math.pow(Math.abs(R + Math.sqrt(D)),(1/3)); + T = sgn(R - Math.sqrt(D))*Math.pow(Math.abs(R - Math.sqrt(D)),(1/3)); + + t[0] = -A/3 + (S + T); + t[1] = -A/3 - (S + T)/2; + t[2] = -A/3 - (S + T)/2; + + /*discard complex roots*/ + if (Math.abs(Math.sqrt(3)*(S - T)/2) !== 0) { + t[1] = -1; + t[2] = -1; + } + } + else // distinct real roots + { + var th = Math.acos(R/Math.sqrt(-Math.pow(Q, 3))); + t[0] = 2*Math.sqrt(-Q)*Math.cos(th/3) - A/3; + t[1] = 2*Math.sqrt(-Q)*Math.cos((th + 2*Math.PI)/3) - A/3; + t[2] = 2*Math.sqrt(-Q)*Math.cos((th + 4*Math.PI)/3) - A/3; + } + + // discard out of spec roots + for (var i = 0; i < 3; i++) { + if (t[i] < 0 || t[i] > 1.0) { + t[i] = -1; + } + } + + return t; + } + + var jsBezier = this.jsBezier = { + distanceFromCurve : _distanceFromCurve, + gradientAtPoint : _gradientAtPoint, + gradientAtPointAlongCurveFrom : _gradientAtPointAlongPathFrom, + nearestPointOnCurve : _nearestPointOnCurve, + pointOnCurve : _pointOnPath, + pointAlongCurveFrom : _pointAlongPathFrom, + perpendicularToCurveAt : _perpendicularToPathAt, + locationAlongCurveFrom:_locationAlongPathFrom, + getLength:_length, + lineIntersection:_lineIntersection, + boxIntersection:_boxIntersection, + boundingBoxIntersection:_boundingBoxIntersection, + version:"0.9.0" + }; + + if (typeof exports !== "undefined") { + exports.jsBezier = jsBezier; + } + +}).call(typeof window !== 'undefined' ? window : this); + +/** + * Biltong v0.4.0 + * + * Various geometry functions written as part of jsPlumb and perhaps useful for others. + * + * Copyright (c) 2017 jsPlumb + * https://jsplumbtoolkit.com + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +;(function() { + + "use strict"; + var root = this; + + var Biltong = root.Biltong = { + version:"0.4.0" + }; + + if (typeof exports !== "undefined") { + exports.Biltong = Biltong; + } + + var _isa = function(a) { return Object.prototype.toString.call(a) === "[object Array]"; }, + _pointHelper = function(p1, p2, fn) { + p1 = _isa(p1) ? p1 : [p1.x, p1.y]; + p2 = _isa(p2) ? p2 : [p2.x, p2.y]; + return fn(p1, p2); + }, + /** + * @name Biltong.gradient + * @function + * @desc Calculates the gradient of a line between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The gradient of a line between the two points. + */ + _gradient = Biltong.gradient = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + if (_p2[0] == _p1[0]) + return _p2[1] > _p1[1] ? Infinity : -Infinity; + else if (_p2[1] == _p1[1]) + return _p2[0] > _p1[0] ? 0 : -0; + else + return (_p2[1] - _p1[1]) / (_p2[0] - _p1[0]); + }); + }, + /** + * @name Biltong.normal + * @function + * @desc Calculates the gradient of a normal to a line between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The gradient of a normal to a line between the two points. + */ + _normal = Biltong.normal = function(p1, p2) { + return -1 / _gradient(p1, p2); + }, + /** + * @name Biltong.lineLength + * @function + * @desc Calculates the length of a line between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The length of a line between the two points. + */ + _lineLength = Biltong.lineLength = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + return Math.sqrt(Math.pow(_p2[1] - _p1[1], 2) + Math.pow(_p2[0] - _p1[0], 2)); + }); + }, + /** + * @name Biltong.quadrant + * @function + * @desc Calculates the quadrant in which the angle between the two points lies. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Integer} The quadrant - 1 for upper right, 2 for lower right, 3 for lower left, 4 for upper left. + */ + _quadrant = Biltong.quadrant = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + if (_p2[0] > _p1[0]) { + return (_p2[1] > _p1[1]) ? 2 : 1; + } + else if (_p2[0] == _p1[0]) { + return _p2[1] > _p1[1] ? 2 : 1; + } + else { + return (_p2[1] > _p1[1]) ? 3 : 4; + } + }); + }, + /** + * @name Biltong.theta + * @function + * @desc Calculates the angle between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The angle between the two points. + */ + _theta = Biltong.theta = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + var m = _gradient(_p1, _p2), + t = Math.atan(m), + s = _quadrant(_p1, _p2); + if ((s == 4 || s== 3)) t += Math.PI; + if (t < 0) t += (2 * Math.PI); + + return t; + }); + }, + /** + * @name Biltong.intersects + * @function + * @desc Calculates whether or not the two rectangles intersect. + * @param {Rectangle} r1 First rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @param {Rectangle} r2 Second rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @return {Boolean} True if the rectangles intersect, false otherwise. + */ + _intersects = Biltong.intersects = function(r1, r2) { + var x1 = r1.x, x2 = r1.x + r1.w, y1 = r1.y, y2 = r1.y + r1.h, + a1 = r2.x, a2 = r2.x + r2.w, b1 = r2.y, b2 = r2.y + r2.h; + + return ( (x1 <= a1 && a1 <= x2) && (y1 <= b1 && b1 <= y2) ) || + ( (x1 <= a2 && a2 <= x2) && (y1 <= b1 && b1 <= y2) ) || + ( (x1 <= a1 && a1 <= x2) && (y1 <= b2 && b2 <= y2) ) || + ( (x1 <= a2 && a1 <= x2) && (y1 <= b2 && b2 <= y2) ) || + ( (a1 <= x1 && x1 <= a2) && (b1 <= y1 && y1 <= b2) ) || + ( (a1 <= x2 && x2 <= a2) && (b1 <= y1 && y1 <= b2) ) || + ( (a1 <= x1 && x1 <= a2) && (b1 <= y2 && y2 <= b2) ) || + ( (a1 <= x2 && x1 <= a2) && (b1 <= y2 && y2 <= b2) ); + }, + /** + * @name Biltong.encloses + * @function + * @desc Calculates whether or not r2 is completely enclosed by r1. + * @param {Rectangle} r1 First rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @param {Rectangle} r2 Second rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @param {Boolean} [allowSharedEdges=false] If true, the concept of enclosure allows for one or more edges to be shared by the two rectangles. + * @return {Boolean} True if r1 encloses r2, false otherwise. + */ + _encloses = Biltong.encloses = function(r1, r2, allowSharedEdges) { + var x1 = r1.x, x2 = r1.x + r1.w, y1 = r1.y, y2 = r1.y + r1.h, + a1 = r2.x, a2 = r2.x + r2.w, b1 = r2.y, b2 = r2.y + r2.h, + c = function(v1, v2, v3, v4) { return allowSharedEdges ? v1 <= v2 && v3>= v4 : v1 < v2 && v3 > v4; }; + + return c(x1,a1,x2,a2) && c(y1,b1,y2,b2); + }, + _segmentMultipliers = [null, [1, -1], [1, 1], [-1, 1], [-1, -1] ], + _inverseSegmentMultipliers = [null, [-1, -1], [-1, 1], [1, 1], [1, -1] ], + /** + * @name Biltong.pointOnLine + * @function + * @desc Calculates a point on the line from `fromPoint` to `toPoint` that is `distance` units along the length of the line. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Point} Point on the line, in the form `{ x:..., y:... }`. + */ + _pointOnLine = Biltong.pointOnLine = function(fromPoint, toPoint, distance) { + var m = _gradient(fromPoint, toPoint), + s = _quadrant(fromPoint, toPoint), + segmentMultiplier = distance > 0 ? _segmentMultipliers[s] : _inverseSegmentMultipliers[s], + theta = Math.atan(m), + y = Math.abs(distance * Math.sin(theta)) * segmentMultiplier[1], + x = Math.abs(distance * Math.cos(theta)) * segmentMultiplier[0]; + return { x:fromPoint.x + x, y:fromPoint.y + y }; + }, + /** + * @name Biltong.perpendicularLineTo + * @function + * @desc Calculates a line of length `length` that is perpendicular to the line from `fromPoint` to `toPoint` and passes through `toPoint`. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Line} Perpendicular line, in the form `[ { x:..., y:... }, { x:..., y:... } ]`. + */ + _perpendicularLineTo = Biltong.perpendicularLineTo = function(fromPoint, toPoint, length) { + var m = _gradient(fromPoint, toPoint), + theta2 = Math.atan(-1 / m), + y = length / 2 * Math.sin(theta2), + x = length / 2 * Math.cos(theta2); + return [{x:toPoint.x + x, y:toPoint.y + y}, {x:toPoint.x - x, y:toPoint.y - y}]; + }; +}).call(typeof window !== 'undefined' ? window : this); +; +(function () { + + "use strict"; + + /** + * Creates a Touch object. + * @param view + * @param target + * @param pageX + * @param pageY + * @param screenX + * @param screenY + * @param clientX + * @param clientY + * @returns {Touch} + * @private + */ + function _touch(view, target, pageX, pageY, screenX, screenY, clientX, clientY) { + + return new Touch({ + target:target, + identifier:_uuid(), + pageX: pageX, + pageY: pageY, + screenX: screenX, + screenY: screenY, + clientX: clientX || screenX, + clientY: clientY || screenY + }); + } + + /** + * Create a synthetic touch list from the given list of Touch objects. + * @returns {Array} + * @private + */ + function _touchList() { + var list = []; + Array.prototype.push.apply(list, arguments); + list.item = function(index) { return this[index]; }; + return list; + } + + /** + * Create a Touch object and then insert it into a synthetic touch list, returning the list.s + * @param view + * @param target + * @param pageX + * @param pageY + * @param screenX + * @param screenY + * @param clientX + * @param clientY + * @returns {Array} + * @private + */ + function _touchAndList(view, target, pageX, pageY, screenX, screenY, clientX, clientY) { + return _touchList(_touch.apply(null, arguments)); + } + + var root = this, + matchesSelector = function (el, selector, ctx) { + ctx = ctx || el.parentNode; + var possibles = ctx.querySelectorAll(selector); + for (var i = 0; i < possibles.length; i++) { + if (possibles[i] === el) { + return true; + } + } + return false; + }, + _gel = function (el) { + return (typeof el == "string" || el.constructor === String) ? document.getElementById(el) : el; + }, + _t = function (e) { + return e.srcElement || e.target; + }, + // + // gets path info for the given event - the path from target to obj, in the event's bubble chain. if doCompute + // is false we just return target for the path. + // + _pi = function(e, target, obj, doCompute) { + if (!doCompute) return { path:[target], end:1 }; + else if (typeof e.path !== "undefined" && e.path.indexOf) { + return { path: e.path, end: e.path.indexOf(obj) }; + } else { + var out = { path:[], end:-1 }, _one = function(el) { + out.path.push(el); + if (el === obj) { + out.end = out.path.length - 1; + } + else if (el.parentNode != null) { + _one(el.parentNode) + } + }; + _one(target); + return out; + } + }, + _d = function (l, fn) { + for (var i = 0, j = l.length; i < j; i++) { + if (l[i] == fn) break; + } + if (i < l.length) l.splice(i, 1); + }, + guid = 1, + // + // this function generates a guid for every handler, sets it on the handler, then adds + // it to the associated object's map of handlers for the given event. this is what enables us + // to unbind all events of some type, or all events (the second of which can be requested by the user, + // but it also used by Mottle when an element is removed.) + _store = function (obj, event, fn) { + var g = guid++; + obj.__ta = obj.__ta || {}; + obj.__ta[event] = obj.__ta[event] || {}; + // store each handler with a unique guid. + obj.__ta[event][g] = fn; + // set the guid on the handler. + fn.__tauid = g; + return g; + }, + _unstore = function (obj, event, fn) { + obj.__ta && obj.__ta[event] && delete obj.__ta[event][fn.__tauid]; + // a handler might have attached extra functions, so we unbind those too. + if (fn.__taExtra) { + for (var i = 0; i < fn.__taExtra.length; i++) { + _unbind(obj, fn.__taExtra[i][0], fn.__taExtra[i][1]); + } + fn.__taExtra.length = 0; + } + // a handler might have attached an unstore callback + fn.__taUnstore && fn.__taUnstore(); + }, + _curryChildFilter = function (children, obj, fn, evt) { + if (children == null) return fn; + else { + var c = children.split(","), + _fn = function (e) { + _fn.__tauid = fn.__tauid; + var t = _t(e), target = t; // t is the target element on which the event occurred. it is the + // element we will wish to pass to any callbacks. + var pathInfo = _pi(e, t, obj, children != null) + if (pathInfo.end != -1) { + for (var p = 0; p < pathInfo.end; p++) { + target = pathInfo.path[p]; + for (var i = 0; i < c.length; i++) { + if (matchesSelector(target, c[i], obj)) { + fn.apply(target, arguments); + } + } + } + } + }; + registerExtraFunction(fn, evt, _fn); + return _fn; + } + }, + // + // registers an 'extra' function on some event listener function we were given - a function that we + // created and bound to the element as part of our housekeeping, and which we want to unbind and remove + // whenever the given function is unbound. + registerExtraFunction = function (fn, evt, newFn) { + fn.__taExtra = fn.__taExtra || []; + fn.__taExtra.push([evt, newFn]); + }, + DefaultHandler = function (obj, evt, fn, children) { + if (isTouchDevice && touchMap[evt]) { + var tfn = _curryChildFilter(children, obj, fn, touchMap[evt]); + _bind(obj, touchMap[evt], tfn , fn); + } + if (evt === "focus" && obj.getAttribute("tabindex") == null) { + obj.setAttribute("tabindex", "1"); + } + _bind(obj, evt, _curryChildFilter(children, obj, fn, evt), fn); + }, + SmartClickHandler = function (obj, evt, fn, children) { + if (obj.__taSmartClicks == null) { + var down = function (e) { + obj.__tad = _pageLocation(e); + }, + up = function (e) { + obj.__tau = _pageLocation(e); + }, + click = function (e) { + if (obj.__tad && obj.__tau && obj.__tad[0] === obj.__tau[0] && obj.__tad[1] === obj.__tau[1]) { + for (var i = 0; i < obj.__taSmartClicks.length; i++) + obj.__taSmartClicks[i].apply(_t(e), [ e ]); + } + }; + DefaultHandler(obj, "mousedown", down, children); + DefaultHandler(obj, "mouseup", up, children); + DefaultHandler(obj, "click", click, children); + obj.__taSmartClicks = []; + } + + // store in the list of callbacks + obj.__taSmartClicks.push(fn); + // the unstore function removes this function from the object's listener list for this type. + fn.__taUnstore = function () { + _d(obj.__taSmartClicks, fn); + }; + }, + _tapProfiles = { + "tap": {touches: 1, taps: 1}, + "dbltap": {touches: 1, taps: 2}, + "contextmenu": {touches: 2, taps: 1} + }, + TapHandler = function (clickThreshold, dblClickThreshold) { + return function (obj, evt, fn, children) { + // if event is contextmenu, for devices which are mouse only, we want to + // use the default bind. + if (evt == "contextmenu" && isMouseDevice) + DefaultHandler(obj, evt, fn, children); + else { + // the issue here is that this down handler gets registered only for the + // child nodes in the first registration. in fact it should be registered with + // no child selector and then on down we should cycle through the registered + // functions to see if one of them matches. on mouseup we should execute ALL of + // the functions whose children are either null or match the element. + if (obj.__taTapHandler == null) { + var tt = obj.__taTapHandler = { + tap: [], + dbltap: [], + contextmenu: [], + down: false, + taps: 0, + downSelectors: [] + }; + var down = function (e) { + var target = _t(e), pathInfo = _pi(e, target, obj, children != null), finished = false; + for (var p = 0; p < pathInfo.end; p++) { + if (finished) return; + target = pathInfo.path[p]; + for (var i = 0; i < tt.downSelectors.length; i++) { + if (tt.downSelectors[i] == null || matchesSelector(target, tt.downSelectors[i], obj)) { + tt.down = true; + setTimeout(clearSingle, clickThreshold); + setTimeout(clearDouble, dblClickThreshold); + finished = true; + break; // we only need one match on mousedown + } + } + } + }, + up = function (e) { + if (tt.down) { + var target = _t(e), currentTarget, pathInfo; + tt.taps++; + var tc = _touchCount(e); + for (var eventId in _tapProfiles) { + if (_tapProfiles.hasOwnProperty(eventId)) { + var p = _tapProfiles[eventId]; + if (p.touches === tc && (p.taps === 1 || p.taps === tt.taps)) { + for (var i = 0; i < tt[eventId].length; i++) { + pathInfo = _pi(e, target, obj, tt[eventId][i][1] != null); + for (var pLoop = 0; pLoop < pathInfo.end; pLoop++) { + currentTarget = pathInfo.path[pLoop]; + // this is a single event registration handler. + if (tt[eventId][i][1] == null || matchesSelector(currentTarget, tt[eventId][i][1], obj)) { + tt[eventId][i][0].apply(currentTarget, [ e ]); + break; + } + } + } + } + } + } + } + }, + clearSingle = function () { + tt.down = false; + }, + clearDouble = function () { + tt.taps = 0; + }; + + DefaultHandler(obj, "mousedown", down); + DefaultHandler(obj, "mouseup", up); + } + // add this child selector (it can be null, that's fine). + obj.__taTapHandler.downSelectors.push(children); + + obj.__taTapHandler[evt].push([fn, children]); + // the unstore function removes this function from the object's listener list for this type. + fn.__taUnstore = function () { + _d(obj.__taTapHandler[evt], fn); + }; + } + }; + }, + meeHelper = function (type, evt, obj, target) { + for (var i in obj.__tamee[type]) { + if (obj.__tamee[type].hasOwnProperty(i)) { + obj.__tamee[type][i].apply(target, [ evt ]); + } + } + }, + MouseEnterExitHandler = function () { + var activeElements = []; + return function (obj, evt, fn, children) { + if (!obj.__tamee) { + // __tamee holds a flag saying whether the mouse is currently "in" the element, and a list of + // both mouseenter and mouseexit functions. + obj.__tamee = { over: false, mouseenter: [], mouseexit: [] }; + // register over and out functions + var over = function (e) { + var t = _t(e); + if ((children == null && (t == obj && !obj.__tamee.over)) || (matchesSelector(t, children, obj) && (t.__tamee == null || !t.__tamee.over))) { + meeHelper("mouseenter", e, obj, t); + t.__tamee = t.__tamee || {}; + t.__tamee.over = true; + activeElements.push(t); + } + }, + out = function (e) { + var t = _t(e); + // is the current target one of the activeElements? and is the + // related target NOT a descendant of it? + for (var i = 0; i < activeElements.length; i++) { + if (t == activeElements[i] && !matchesSelector((e.relatedTarget || e.toElement), "*", t)) { + t.__tamee.over = false; + activeElements.splice(i, 1); + meeHelper("mouseexit", e, obj, t); + } + } + }; + + _bind(obj, "mouseover", _curryChildFilter(children, obj, over, "mouseover"), over); + _bind(obj, "mouseout", _curryChildFilter(children, obj, out, "mouseout"), out); + } + + fn.__taUnstore = function () { + delete obj.__tamee[evt][fn.__tauid]; + }; + + _store(obj, evt, fn); + obj.__tamee[evt][fn.__tauid] = fn; + }; + }, + isTouchDevice = "ontouchstart" in document.documentElement || navigator.maxTouchPoints, + isMouseDevice = "onmousedown" in document.documentElement, + touchMap = { "mousedown": "touchstart", "mouseup": "touchend", "mousemove": "touchmove" }, + touchstart = "touchstart", touchend = "touchend", touchmove = "touchmove", + iev = (function () { + var rv = -1; + if (navigator.appName == 'Microsoft Internet Explorer') { + var ua = navigator.userAgent, + re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); + if (re.exec(ua) != null) + rv = parseFloat(RegExp.$1); + } + return rv; + })(), + isIELT9 = iev > -1 && iev < 9, + _genLoc = function (e, prefix) { + if (e == null) return [ 0, 0 ]; + var ts = _touches(e), t = _getTouch(ts, 0); + return [t[prefix + "X"], t[prefix + "Y"]]; + }, + _pageLocation = function (e) { + if (e == null) return [ 0, 0 ]; + if (isIELT9) { + return [ e.clientX + document.documentElement.scrollLeft, e.clientY + document.documentElement.scrollTop ]; + } + else { + return _genLoc(e, "page"); + } + }, + _screenLocation = function (e) { + return _genLoc(e, "screen"); + }, + _clientLocation = function (e) { + return _genLoc(e, "client"); + }, + _getTouch = function (touches, idx) { + return touches.item ? touches.item(idx) : touches[idx]; + }, + _touches = function (e) { + return e.touches && e.touches.length > 0 ? e.touches : + e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches : + e.targetTouches && e.targetTouches.length > 0 ? e.targetTouches : + [ e ]; + }, + _touchCount = function (e) { + return _touches(e).length; + }, + //http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html + _bind = function (obj, type, fn, originalFn) { + _store(obj, type, fn); + originalFn.__tauid = fn.__tauid; + if (obj.addEventListener) + obj.addEventListener(type, fn, false); + else if (obj.attachEvent) { + var key = type + fn.__tauid; + obj["e" + key] = fn; + // TODO look at replacing with .call(..) + obj[key] = function () { + obj["e" + key] && obj["e" + key](window.event); + }; + obj.attachEvent("on" + type, obj[key]); + } + }, + _unbind = function (obj, type, fn) { + if (fn == null) return; + _each(obj, function () { + var _el = _gel(this); + _unstore(_el, type, fn); + // it has been bound if there is a tauid. otherwise it was not bound and we can ignore it. + if (fn.__tauid != null) { + if (_el.removeEventListener) { + _el.removeEventListener(type, fn, false); + if (isTouchDevice && touchMap[type]) _el.removeEventListener(touchMap[type], fn, false); + } + else if (this.detachEvent) { + var key = type + fn.__tauid; + _el[key] && _el.detachEvent("on" + type, _el[key]); + _el[key] = null; + _el["e" + key] = null; + } + } + + // if a touch event was also registered, deregister now. + if (fn.__taTouchProxy) { + _unbind(obj, fn.__taTouchProxy[1], fn.__taTouchProxy[0]); + } + }); + }, + _each = function (obj, fn) { + if (obj == null) return; + // if a list (or list-like), use it. if a string, get a list + // by running the string through querySelectorAll. else, assume + // it's an Element. + // obj.top is "unknown" in IE8. + obj = (typeof Window !== "undefined" && (typeof obj.top !== "unknown" && obj == obj.top)) ? [ obj ] : + (typeof obj !== "string") && (obj.tagName == null && obj.length != null) ? obj : + typeof obj === "string" ? document.querySelectorAll(obj) + : [ obj ]; + + for (var i = 0; i < obj.length; i++) + fn.apply(obj[i]); + }, + _uuid = function () { + return ('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + })); + }; + + /** + * Mottle offers support for abstracting out the differences + * between touch and mouse devices, plus "smart click" functionality + * (don't fire click if the mouse has moved between mousedown and mouseup), + * and synthesized click/tap events. + * @class Mottle + * @constructor + * @param {Object} params Constructor params + * @param {Number} [params.clickThreshold=250] Threshold, in milliseconds beyond which a touchstart followed by a touchend is not considered to be a click. + * @param {Number} [params.dblClickThreshold=450] Threshold, in milliseconds beyond which two successive tap events are not considered to be a click. + * @param {Boolean} [params.smartClicks=false] If true, won't fire click events if the mouse has moved between mousedown and mouseup. Note that this functionality + * requires that Mottle consume the mousedown event, and so may not be viable in all use cases. + */ + root.Mottle = function (params) { + params = params || {}; + var clickThreshold = params.clickThreshold || 250, + dblClickThreshold = params.dblClickThreshold || 450, + mouseEnterExitHandler = new MouseEnterExitHandler(), + tapHandler = new TapHandler(clickThreshold, dblClickThreshold), + _smartClicks = params.smartClicks, + _doBind = function (obj, evt, fn, children) { + if (fn == null) return; + _each(obj, function () { + var _el = _gel(this); + if (_smartClicks && evt === "click") + SmartClickHandler(_el, evt, fn, children); + else if (evt === "tap" || evt === "dbltap" || evt === "contextmenu") { + tapHandler(_el, evt, fn, children); + } + else if (evt === "mouseenter" || evt == "mouseexit") + mouseEnterExitHandler(_el, evt, fn, children); + else + DefaultHandler(_el, evt, fn, children); + }); + }; + + /** + * Removes an element from the DOM, and deregisters all event handlers for it. You should use this + * to ensure you don't leak memory. + * @method remove + * @param {String|Element} el Element, or id of the element, to remove. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.remove = function (el) { + _each(el, function () { + var _el = _gel(this); + if (_el.__ta) { + for (var evt in _el.__ta) { + if (_el.__ta.hasOwnProperty(evt)) { + for (var h in _el.__ta[evt]) { + if (_el.__ta[evt].hasOwnProperty(h)) + _unbind(_el, evt, _el.__ta[evt][h]); + } + } + } + } + _el.parentNode && _el.parentNode.removeChild(_el); + }); + return this; + }; + + /** + * Register an event handler, optionally as a delegate for some set of descendant elements. Note + * that this method takes either 3 or 4 arguments - if you supply 3 arguments it is assumed you have + * omitted the `children` parameter, and that the event handler should be bound directly to the given element. + * @method on + * @param {Element[]|Element|String} el Either an Element, or a CSS spec for a list of elements, or an array of Elements. + * @param {String} [children] Comma-delimited list of selectors identifying allowed children. + * @param {String} event Event ID. + * @param {Function} fn Event handler function. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.on = function (el, event, children, fn) { + var _el = arguments[0], + _c = arguments.length == 4 ? arguments[2] : null, + _e = arguments[1], + _f = arguments[arguments.length - 1]; + + _doBind(_el, _e, _f, _c); + return this; + }; + + /** + * Cancel delegate event handling for the given function. Note that unlike with 'on' you do not supply + * a list of child selectors here: it removes event delegation from all of the child selectors for which the + * given function was registered (if any). + * @method off + * @param {Element[]|Element|String} el Element - or ID of element - from which to remove event listener. + * @param {String} event Event ID. + * @param {Function} fn Event handler function. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.off = function (el, event, fn) { + _unbind(el, event, fn); + return this; + }; + + /** + * Triggers some event for a given element. + * @method trigger + * @param {Element} el Element for which to trigger the event. + * @param {String} event Event ID. + * @param {Event} originalEvent The original event. Should be optional of course, but currently is not, due + * to the jsPlumb use case that caused this method to be added. + * @param {Object} [payload] Optional object to set as `payload` on the generated event; useful for message passing. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.trigger = function (el, event, originalEvent, payload) { + // MouseEvent undefined in old IE; that's how we know it's a mouse event. A fine Microsoft paradox. + var originalIsMouse = isMouseDevice && (typeof MouseEvent === "undefined" || originalEvent == null || originalEvent.constructor === MouseEvent); + + var eventToBind = (isTouchDevice && !isMouseDevice && touchMap[event]) ? touchMap[event] : event, + bindingAMouseEvent = !(isTouchDevice && !isMouseDevice && touchMap[event]); + + var pl = _pageLocation(originalEvent), sl = _screenLocation(originalEvent), cl = _clientLocation(originalEvent); + _each(el, function () { + var _el = _gel(this), evt; + originalEvent = originalEvent || { + screenX: sl[0], + screenY: sl[1], + clientX: cl[0], + clientY: cl[1] + }; + + var _decorate = function (_evt) { + if (payload) _evt.payload = payload; + }; + + var eventGenerators = { + "TouchEvent": function (evt) { + + var touchList = _touchAndList(window, _el, 0, pl[0], pl[1], sl[0], sl[1], cl[0], cl[1]), + init = evt.initTouchEvent || evt.initEvent; + + init(eventToBind, true, true, window, null, sl[0], sl[1], + cl[0], cl[1], false, false, false, false, + touchList, touchList, touchList, 1, 0); + }, + "MouseEvents": function (evt) { + evt.initMouseEvent(eventToBind, true, true, window, 0, + sl[0], sl[1], + cl[0], cl[1], + false, false, false, false, 1, _el); + } + }; + + if (document.createEvent) { + + var ite = !bindingAMouseEvent && !originalIsMouse && (isTouchDevice && touchMap[event]), + evtName = ite ? "TouchEvent" : "MouseEvents"; + + evt = document.createEvent(evtName); + eventGenerators[evtName](evt); + _decorate(evt); + _el.dispatchEvent(evt); + } + else if (document.createEventObject) { + evt = document.createEventObject(); + evt.eventType = evt.eventName = eventToBind; + evt.screenX = sl[0]; + evt.screenY = sl[1]; + evt.clientX = cl[0]; + evt.clientY = cl[1]; + _decorate(evt); + _el.fireEvent('on' + eventToBind, evt); + } + }); + return this; + } + }; + + /** + * Static method to assist in 'consuming' an element: uses `stopPropagation` where available, or sets + * `e.returnValue=false` where it is not. + * @method Mottle.consume + * @param {Event} e Event to consume + * @param {Boolean} [doNotPreventDefault=false] If true, does not call `preventDefault()` on the event. + */ + root.Mottle.consume = function (e, doNotPreventDefault) { + if (e.stopPropagation) + e.stopPropagation(); + else + e.returnValue = false; + + if (!doNotPreventDefault && e.preventDefault) + e.preventDefault(); + }; + + /** + * Gets the page location corresponding to the given event. For touch events this means get the page location of the first touch. + * @method Mottle.pageLocation + * @param {Event} e Event to get page location for. + * @return {Number[]} [left, top] for the given event. + */ + root.Mottle.pageLocation = _pageLocation; + + /** + * Forces touch events to be turned "on". Useful for testing: even if you don't have a touch device, you can still + * trigger a touch event when this is switched on and it will be captured and acted on. + * @method setForceTouchEvents + * @param {Boolean} value If true, force touch events to be on. + */ + root.Mottle.setForceTouchEvents = function (value) { + isTouchDevice = value; + }; + + /** + * Forces mouse events to be turned "on". Useful for testing: even if you don't have a mouse, you can still + * trigger a mouse event when this is switched on and it will be captured and acted on. + * @method setForceMouseEvents + * @param {Boolean} value If true, force mouse events to be on. + */ + root.Mottle.setForceMouseEvents = function (value) { + isMouseDevice = value; + }; + + root.Mottle.version = "0.8.0"; + + if (typeof exports !== "undefined") { + exports.Mottle = root.Mottle; + } + +}).call(typeof window === "undefined" ? this : window); + +/** + drag/drop functionality for use with jsPlumb but with + no knowledge of jsPlumb. supports multiple scopes (separated by whitespace), dragging + multiple elements, constrain to parent, drop filters, drag start filters, custom + css classes. + + a lot of the functionality of this script is expected to be plugged in: + + addClass + removeClass + + addEvent + removeEvent + + getPosition + setPosition + getSize + + indexOf + intersects + + the name came from here: + + http://mrsharpoblunto.github.io/foswig.js/ + + copyright 2016 jsPlumb + */ + +;(function() { + + "use strict"; + var root = this; + + var _suggest = function(list, item, head) { + if (list.indexOf(item) === -1) { + head ? list.unshift(item) : list.push(item); + return true; + } + return false; + }; + + var _vanquish = function(list, item) { + var idx = list.indexOf(item); + if (idx !== -1) list.splice(idx, 1); + }; + + var _difference = function(l1, l2) { + var d = []; + for (var i = 0; i < l1.length; i++) { + if (l2.indexOf(l1[i]) === -1) + d.push(l1[i]); + } + return d; + }; + + var _isString = function(f) { + return f == null ? false : (typeof f === "string" || f.constructor === String); + }; + + var getOffsetRect = function (elem) { + // (1) + var box = elem.getBoundingClientRect(), + body = document.body, + docElem = document.documentElement, + // (2) + scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop, + scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft, + // (3) + clientTop = docElem.clientTop || body.clientTop || 0, + clientLeft = docElem.clientLeft || body.clientLeft || 0, + // (4) + top = box.top + scrollTop - clientTop, + left = box.left + scrollLeft - clientLeft; + + return { top: Math.round(top), left: Math.round(left) }; + }; + + var matchesSelector = function(el, selector, ctx) { + ctx = ctx || el.parentNode; + var possibles = ctx.querySelectorAll(selector); + for (var i = 0; i < possibles.length; i++) { + if (possibles[i] === el) + return true; + } + return false; + }; + + var findDelegateElement = function(parentElement, childElement, selector) { + if (matchesSelector(childElement, selector, parentElement)) { + return childElement; + } else { + var currentParent = childElement.parentNode; + while (currentParent != null && currentParent !== parentElement) { + if (matchesSelector(currentParent, selector, parentElement)) { + return currentParent; + } else { + currentParent = currentParent.parentNode; + } + } + } + }; + + /** + * Finds all elements matching the given selector, for the given parent. In order to support "scoped root" selectors, + * ie. things like "> .someClass", that is .someClass elements that are direct children of `parentElement`, we have to + * jump through a small hoop here: when a delegate draggable is registered, we write a `katavorio-draggable` attribute + * on the element on which the draggable is registered. Then when this method runs, we grab the value of that attribute and + * prepend it as part of the selector we're looking for. So "> .someClass" ends up being written as + * "[katavorio-draggable='...' > .someClass]", which works with querySelectorAll. + * + * @param availableSelectors + * @param parentElement + * @param childElement + * @returns {*} + */ + var findMatchingSelector = function(availableSelectors, parentElement, childElement) { + var el = null; + var draggableId = parentElement.getAttribute("katavorio-draggable"), + prefix = draggableId != null ? "[katavorio-draggable='" + draggableId + "'] " : ""; + + for (var i = 0; i < availableSelectors.length; i++) { + el = findDelegateElement(parentElement, childElement, prefix + availableSelectors[i].selector); + if (el != null) { + if (availableSelectors[i].filter) { + var matches = matchesSelector(childElement, availableSelectors[i].filter, el), + exclude = availableSelectors[i].filterExclude === true; + + if ( (exclude && !matches) || matches) { + return null; + } + + } + return [ availableSelectors[i], el ]; + } + } + return null; + }; + + var iev = (function() { + var rv = -1; + if (navigator.appName === 'Microsoft Internet Explorer') { + var ua = navigator.userAgent, + re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); + if (re.exec(ua) != null) + rv = parseFloat(RegExp.$1); + } + return rv; + })(), + DEFAULT_GRID_X = 10, + DEFAULT_GRID_Y = 10, + isIELT9 = iev > -1 && iev < 9, + isIE9 = iev === 9, + _pl = function(e) { + if (isIELT9) { + return [ e.clientX + document.documentElement.scrollLeft, e.clientY + document.documentElement.scrollTop ]; + } + else { + var ts = _touches(e), t = _getTouch(ts, 0); + // for IE9 pageX might be null if the event was synthesized. We try for pageX/pageY first, + // falling back to clientX/clientY if necessary. In every other browser we want to use pageX/pageY. + return isIE9 ? [t.pageX || t.clientX, t.pageY || t.clientY] : [t.pageX, t.pageY]; + } + }, + _getTouch = function(touches, idx) { return touches.item ? touches.item(idx) : touches[idx]; }, + _touches = function(e) { + return e.touches && e.touches.length > 0 ? e.touches : + e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches : + e.targetTouches && e.targetTouches.length > 0 ? e.targetTouches : + [ e ]; + }, + _classes = { + delegatedDraggable:"katavorio-delegated-draggable", // elements that are the delegated drag handler for a bunch of other elements + draggable:"katavorio-draggable", // draggable elements + droppable:"katavorio-droppable", // droppable elements + drag : "katavorio-drag", // elements currently being dragged + selected:"katavorio-drag-selected", // elements in current drag selection + active : "katavorio-drag-active", // droppables that are targets of a currently dragged element + hover : "katavorio-drag-hover", // droppables over which a matching drag element is hovering + noSelect : "katavorio-drag-no-select", // added to the body to provide a hook to suppress text selection + ghostProxy:"katavorio-ghost-proxy", // added to a ghost proxy element in use when a drag has exited the bounds of its parent. + clonedDrag:"katavorio-clone-drag" // added to a node that is a clone of an element created at the start of a drag + }, + _defaultScope = "katavorio-drag-scope", + _events = [ "stop", "start", "drag", "drop", "over", "out", "beforeStart" ], + _devNull = function() {}, + _true = function() { return true; }, + _foreach = function(l, fn, from) { + for (var i = 0; i < l.length; i++) { + if (l[i] != from) + fn(l[i]); + } + }, + _setDroppablesActive = function(dd, val, andHover, drag) { + _foreach(dd, function(e) { + e.setActive(val); + if (val) e.updatePosition(); + if (andHover) e.setHover(drag, val); + }); + }, + _each = function(obj, fn) { + if (obj == null) return; + obj = !_isString(obj) && (obj.tagName == null && obj.length != null) ? obj : [ obj ]; + for (var i = 0; i < obj.length; i++) + fn.apply(obj[i], [ obj[i] ]); + }, + _consume = function(e) { + if (e.stopPropagation) { + e.stopPropagation(); + e.preventDefault(); + } + else { + e.returnValue = false; + } + }, + _defaultInputFilterSelector = "input,textarea,select,button,option", + // + // filters out events on all input elements, like textarea, checkbox, input, select. + _inputFilter = function(e, el, _katavorio) { + var t = e.srcElement || e.target; + return !matchesSelector(t, _katavorio.getInputFilterSelector(), el); + }; + + var Super = function(el, params, css, scope) { + this.params = params || {}; + this.el = el; + this.params.addClass(this.el, this._class); + this.uuid = _uuid(); + var enabled = true; + this.setEnabled = function(e) { enabled = e; }; + this.isEnabled = function() { return enabled; }; + this.toggleEnabled = function() { enabled = !enabled; }; + this.setScope = function(scopes) { + this.scopes = scopes ? scopes.split(/\s+/) : [ scope ]; + }; + this.addScope = function(scopes) { + var m = {}; + _each(this.scopes, function(s) { m[s] = true;}); + _each(scopes ? scopes.split(/\s+/) : [], function(s) { m[s] = true;}); + this.scopes = []; + for (var i in m) this.scopes.push(i); + }; + this.removeScope = function(scopes) { + var m = {}; + _each(this.scopes, function(s) { m[s] = true;}); + _each(scopes ? scopes.split(/\s+/) : [], function(s) { delete m[s];}); + this.scopes = []; + for (var i in m) this.scopes.push(i); + }; + this.toggleScope = function(scopes) { + var m = {}; + _each(this.scopes, function(s) { m[s] = true;}); + _each(scopes ? scopes.split(/\s+/) : [], function(s) { + if (m[s]) delete m[s]; + else m[s] = true; + }); + this.scopes = []; + for (var i in m) this.scopes.push(i); + }; + this.setScope(params.scope); + this.k = params.katavorio; + return params.katavorio; + }; + + var TRUE = function() { return true; }; + var FALSE = function() { return false; }; + + var Drag = function(el, params, css, scope) { + this._class = css.draggable; + var k = Super.apply(this, arguments); + this.rightButtonCanDrag = this.params.rightButtonCanDrag; + var downAt = [0,0], posAtDown = null, pagePosAtDown = null, pageDelta = [0,0], moving = false, initialScroll = [0,0], + consumeStartEvent = this.params.consumeStartEvent !== false, + dragEl = this.el, + clone = this.params.clone, + scroll = this.params.scroll, + _multipleDrop = params.multipleDrop !== false, + isConstrained = false, + useGhostProxy = params.ghostProxy === true ? TRUE : params.ghostProxy && typeof params.ghostProxy === "function" ? params.ghostProxy : FALSE, + ghostProxy = function(el) { return el.cloneNode(true); }, + elementToDrag = null, + availableSelectors = [], + activeSelectorParams = null, // which, if any, selector config is currently active. + ghostProxyParent = params.ghostProxyParent, + currentParentPosition, + ghostParentPosition, + ghostDx, + ghostDy; + + // if an initial selector was provided, push the entire set of params as a selector config. + if (params.selector) { + var draggableId = el.getAttribute("katavorio-draggable"); + if (draggableId == null) { + draggableId = "" + new Date().getTime(); + el.setAttribute("katavorio-draggable", draggableId); + } + + availableSelectors.push(params); + } + + var snapThreshold = params.snapThreshold, + _snap = function(pos, gridX, gridY, thresholdX, thresholdY) { + var _dx = Math.floor(pos[0] / gridX), + _dxl = gridX * _dx, + _dxt = _dxl + gridX, + _x = Math.abs(pos[0] - _dxl) <= thresholdX ? _dxl : Math.abs(_dxt - pos[0]) <= thresholdX ? _dxt : pos[0]; + + var _dy = Math.floor(pos[1] / gridY), + _dyl = gridY * _dy, + _dyt = _dyl + gridY, + _y = Math.abs(pos[1] - _dyl) <= thresholdY ? _dyl : Math.abs(_dyt - pos[1]) <= thresholdY ? _dyt : pos[1]; + + return [ _x, _y]; + }; + + this.posses = []; + this.posseRoles = {}; + + this.toGrid = function(pos) { + if (this.params.grid == null) { + return pos; + } + else { + var tx = this.params.grid ? this.params.grid[0] / 2 : snapThreshold ? snapThreshold : DEFAULT_GRID_X / 2, + ty = this.params.grid ? this.params.grid[1] / 2 : snapThreshold ? snapThreshold : DEFAULT_GRID_Y / 2; + + return _snap(pos, this.params.grid[0], this.params.grid[1], tx, ty); + } + }; + + this.snap = function(x, y) { + if (dragEl == null) return; + x = x || (this.params.grid ? this.params.grid[0] : DEFAULT_GRID_X); + y = y || (this.params.grid ? this.params.grid[1] : DEFAULT_GRID_Y); + var p = this.params.getPosition(dragEl), + tx = this.params.grid ? this.params.grid[0] / 2 : snapThreshold, + ty = this.params.grid ? this.params.grid[1] / 2 : snapThreshold, + snapped = _snap(p, x, y, tx, ty); + + this.params.setPosition(dragEl, snapped); + return snapped; + }; + + this.setUseGhostProxy = function(val) { + useGhostProxy = val ? TRUE : FALSE; + }; + + var constrain; + var negativeFilter = function(pos) { + return (params.allowNegative === false) ? [ Math.max (0, pos[0]), Math.max(0, pos[1]) ] : pos; + }; + + var _setConstrain = function(value) { + constrain = typeof value === "function" ? value : value ? function(pos, dragEl, _constrainRect, _size) { + return negativeFilter([ + Math.max(0, Math.min(_constrainRect.w - _size[0], pos[0])), + Math.max(0, Math.min(_constrainRect.h - _size[1], pos[1])) + ]); + }.bind(this) : function(pos) { return negativeFilter(pos); }; + }.bind(this); + + _setConstrain(typeof this.params.constrain === "function" ? this.params.constrain : (this.params.constrain || this.params.containment)); + + + /** + * Sets whether or not the Drag is constrained. A value of 'true' means constrain to parent bounds; a function + * will be executed and returns true if the position is allowed. + * @param value + */ + this.setConstrain = function(value) { + _setConstrain(value); + }; + + var revertFunction; + /** + * Sets a function to call on drag stop, which, if it returns true, indicates that the given element should + * revert to its position before the previous drag. + * @param fn + */ + this.setRevert = function(fn) { + revertFunction = fn; + }; + + if (this.params.revert) { + revertFunction = this.params.revert; + } + + var _assignId = function(obj) { + if (typeof obj === "function") { + obj._katavorioId = _uuid(); + return obj._katavorioId; + } else { + return obj; + } + }, + // a map of { spec -> [ fn, exclusion ] } entries. + _filters = {}, + _testFilter = function(e) { + for (var key in _filters) { + var f = _filters[key]; + var rv = f[0](e); + if (f[1]) rv = !rv; + if (!rv) return false; + } + return true; + }, + _setFilter = this.setFilter = function(f, _exclude) { + if (f) { + var key = _assignId(f); + _filters[key] = [ + function(e) { + var t = e.srcElement || e.target, m; + if (_isString(f)) { + m = matchesSelector(t, f, el); + } + else if (typeof f === "function") { + m = f(e, el); + } + return m; + }, + _exclude !== false + ]; + + } + }, + _addFilter = this.addFilter = _setFilter, + _removeFilter = this.removeFilter = function(f) { + var key = typeof f === "function" ? f._katavorioId : f; + delete _filters[key]; + }; + + this.clearAllFilters = function() { + _filters = {}; + }; + + this.canDrag = this.params.canDrag || _true; + + var constrainRect, + matchingDroppables = [], + intersectingDroppables = []; + + this.addSelector = function(params) { + if (params.selector) { + availableSelectors.push(params); + } + }; + + this.downListener = function(e) { + if (e.defaultPrevented) { return; } + var isNotRightClick = this.rightButtonCanDrag || (e.which !== 3 && e.button !== 2); + if (isNotRightClick && this.isEnabled() && this.canDrag()) { + + var _f = _testFilter(e) && _inputFilter(e, this.el, this.k); + if (_f) { + + activeSelectorParams = null; + elementToDrag = null; + + // if (selector) { + // elementToDrag = findDelegateElement(this.el, e.target || e.srcElement, selector); + // if(elementToDrag == null) { + // return; + // } + // } + if (availableSelectors.length > 0) { + var match = findMatchingSelector(availableSelectors, this.el, e.target || e.srcElement); + if (match != null) { + activeSelectorParams = match[0]; + elementToDrag = match[1]; + } + // elementToDrag = findDelegateElement(this.el, e.target || e.srcElement, selector); + if(elementToDrag == null) { + return; + } + } + else { + elementToDrag = this.el; + } + + if (clone) { + dragEl = elementToDrag.cloneNode(true); + this.params.addClass(dragEl, _classes.clonedDrag); + + dragEl.setAttribute("id", null); + dragEl.style.position = "absolute"; + + if (this.params.parent != null) { + var p = this.params.getPosition(this.el); + dragEl.style.left = p[0] + "px"; + dragEl.style.top = p[1] + "px"; + this.params.parent.appendChild(dragEl); + } else { + // the clone node is added to the body; getOffsetRect gives us a value + // relative to the body. + var b = getOffsetRect(elementToDrag); + dragEl.style.left = b.left + "px"; + dragEl.style.top = b.top + "px"; + + document.body.appendChild(dragEl); + } + + } else { + dragEl = elementToDrag; + } + + consumeStartEvent && _consume(e); + downAt = _pl(e); + if (dragEl && dragEl.parentNode) + { + initialScroll = [dragEl.parentNode.scrollLeft, dragEl.parentNode.scrollTop]; + } + // + this.params.bind(document, "mousemove", this.moveListener); + this.params.bind(document, "mouseup", this.upListener); + k.markSelection(this); + k.markPosses(this); + this.params.addClass(document.body, css.noSelect); + _dispatch("beforeStart", {el:this.el, pos:posAtDown, e:e, drag:this}); + } + else if (this.params.consumeFilteredEvents) { + _consume(e); + } + } + }.bind(this); + + this.moveListener = function(e) { + if (downAt) { + if (!moving) { + var _continue = _dispatch("start", {el:this.el, pos:posAtDown, e:e, drag:this}); + if (_continue !== false) { + if (!downAt) { + return; + } + this.mark(true); + moving = true; + } else { + this.abort(); + } + } + + // it is possible that the start event caused the drag to be aborted. So we check + // again that we are currently dragging. + if (downAt) { + intersectingDroppables.length = 0; + var pos = _pl(e), dx = pos[0] - downAt[0], dy = pos[1] - downAt[1], + z = this.params.ignoreZoom ? 1 : k.getZoom(); + if (dragEl && dragEl.parentNode) + { + dx += dragEl.parentNode.scrollLeft - initialScroll[0]; + dy += dragEl.parentNode.scrollTop - initialScroll[1]; + } + dx /= z; + dy /= z; + this.moveBy(dx, dy, e); + k.updateSelection(dx, dy, this); + k.updatePosses(dx, dy, this); + } + } + }.bind(this); + + this.upListener = function(e) { + if (downAt) { + downAt = null; + this.params.unbind(document, "mousemove", this.moveListener); + this.params.unbind(document, "mouseup", this.upListener); + this.params.removeClass(document.body, css.noSelect); + this.unmark(e); + k.unmarkSelection(this, e); + k.unmarkPosses(this, e); + this.stop(e); + + k.notifyPosseDragStop(this, e); + moving = false; + intersectingDroppables.length = 0; + + if (clone) { + dragEl && dragEl.parentNode && dragEl.parentNode.removeChild(dragEl); + dragEl = null; + } else { + if (revertFunction && revertFunction(dragEl, this.params.getPosition(dragEl)) === true) { + this.params.setPosition(dragEl, posAtDown); + _dispatch("revert", dragEl); + } + } + + } + }.bind(this); + + this.getFilters = function() { return _filters; }; + + this.abort = function() { + if (downAt != null) { + this.upListener(); + } + }; + + /** + * Returns the element that was last dragged. This may be some original element from the DOM, or if `clone` is + * set, then its actually a copy of some original DOM element. In some client calls to this method, it is the + * actual element that was dragged that is desired. In others, it is the original DOM element that the user + * wishes to get - in which case, pass true for `retrieveOriginalElement`. + * + * @returns {*} + */ + this.getDragElement = function(retrieveOriginalElement) { + return retrieveOriginalElement ? elementToDrag || this.el : dragEl || this.el; + }; + + var listeners = {"start":[], "drag":[], "stop":[], "over":[], "out":[], "beforeStart":[], "revert":[] }; + if (params.events.start) listeners.start.push(params.events.start); + if (params.events.beforeStart) listeners.beforeStart.push(params.events.beforeStart); + if (params.events.stop) listeners.stop.push(params.events.stop); + if (params.events.drag) listeners.drag.push(params.events.drag); + if (params.events.revert) listeners.revert.push(params.events.revert); + + this.on = function(evt, fn) { + if (listeners[evt]) listeners[evt].push(fn); + }; + + this.off = function(evt, fn) { + if (listeners[evt]) { + var l = []; + for (var i = 0; i < listeners[evt].length; i++) { + if (listeners[evt][i] !== fn) l.push(listeners[evt][i]); + } + listeners[evt] = l; + } + }; + + var _dispatch = function(evt, value) { + var result = null; + if (activeSelectorParams && activeSelectorParams[evt]) { + result = activeSelectorParams[evt](value); + } else if (listeners[evt]) { + for (var i = 0; i < listeners[evt].length; i++) { + try { + var v = listeners[evt][i](value); + if (v != null) { + result = v; + } + } + catch (e) { } + } + } + return result; + }; + + this.notifyStart = function(e) { + _dispatch("start", {el:this.el, pos:this.params.getPosition(dragEl), e:e, drag:this}); + }; + + this.stop = function(e, force) { + if (force || moving) { + var positions = [], + sel = k.getSelection(), + dPos = this.params.getPosition(dragEl); + + if (sel.length > 0) { + for (var i = 0; i < sel.length; i++) { + var p = this.params.getPosition(sel[i].el); + positions.push([ sel[i].el, { left: p[0], top: p[1] }, sel[i] ]); + } + } + else { + positions.push([ dragEl, {left:dPos[0], top:dPos[1]}, this ]); + } + + _dispatch("stop", { + el: dragEl, + pos: ghostProxyOffsets || dPos, + finalPos:dPos, + e: e, + drag: this, + selection:positions + }); + } + }; + + this.mark = function(andNotify) { + posAtDown = this.params.getPosition(dragEl); + pagePosAtDown = this.params.getPosition(dragEl, true); + pageDelta = [pagePosAtDown[0] - posAtDown[0], pagePosAtDown[1] - posAtDown[1]]; + this.size = this.params.getSize(dragEl); + matchingDroppables = k.getMatchingDroppables(this); + _setDroppablesActive(matchingDroppables, true, false, this); + this.params.addClass(dragEl, this.params.dragClass || css.drag); + + var cs; + if (this.params.getConstrainingRectangle) { + cs = this.params.getConstrainingRectangle(dragEl) + } else { + cs = this.params.getSize(dragEl.parentNode); + } + constrainRect = {w: cs[0], h: cs[1]}; + + ghostDx = 0; + ghostDy = 0; + + if (andNotify) { + k.notifySelectionDragStart(this); + } + }; + var ghostProxyOffsets; + this.unmark = function(e, doNotCheckDroppables) { + _setDroppablesActive(matchingDroppables, false, true, this); + + if (isConstrained && useGhostProxy(elementToDrag, dragEl)) { + ghostProxyOffsets = [dragEl.offsetLeft - ghostDx, dragEl.offsetTop - ghostDy]; + dragEl.parentNode.removeChild(dragEl); + dragEl = elementToDrag; + } + else { + ghostProxyOffsets = null; + } + + this.params.removeClass(dragEl, this.params.dragClass || css.drag); + matchingDroppables.length = 0; + isConstrained = false; + if (!doNotCheckDroppables) { + if (intersectingDroppables.length > 0 && ghostProxyOffsets) { + params.setPosition(elementToDrag, ghostProxyOffsets); + } + intersectingDroppables.sort(_rankSort); + for (var i = 0; i < intersectingDroppables.length; i++) { + var retVal = intersectingDroppables[i].drop(this, e); + if (retVal === true) break; + } + } + }; + this.moveBy = function(dx, dy, e) { + intersectingDroppables.length = 0; + + var desiredLoc = this.toGrid([posAtDown[0] + dx, posAtDown[1] + dy]), + cPos = constrain(desiredLoc, dragEl, constrainRect, this.size); + + // if we should use a ghost proxy... + if (useGhostProxy(this.el, dragEl)) { + // and the element has been dragged outside of its parent bounds + if (desiredLoc[0] !== cPos[0] || desiredLoc[1] !== cPos[1]) { + + // ...if ghost proxy not yet created + if (!isConstrained) { + // create it + var gp = ghostProxy(elementToDrag); + params.addClass(gp, _classes.ghostProxy); + + if (ghostProxyParent) { + ghostProxyParent.appendChild(gp); + // find offset between drag el's parent the ghost parent + currentParentPosition = params.getPosition(elementToDrag.parentNode, true); + ghostParentPosition = params.getPosition(params.ghostProxyParent, true); + ghostDx = currentParentPosition[0] - ghostParentPosition[0]; + ghostDy = currentParentPosition[1] - ghostParentPosition[1]; + + } else { + elementToDrag.parentNode.appendChild(gp); + } + + // the ghost proxy is the drag element + dragEl = gp; + // set this flag so we dont recreate the ghost proxy + isConstrained = true; + } + // now the drag position can be the desired position, as the ghost proxy can support it. + cPos = desiredLoc; + } + else { + // if the element is not outside of its parent bounds, and ghost proxy is in place, + if (isConstrained) { + // remove the ghost proxy from the dom + dragEl.parentNode.removeChild(dragEl); + // reset the drag element to the original element + dragEl = elementToDrag; + // clear this flag. + isConstrained = false; + currentParentPosition = null; + ghostParentPosition = null; + ghostDx = 0; + ghostDy = 0; + } + } + } + + var rect = { x:cPos[0], y:cPos[1], w:this.size[0], h:this.size[1]}, + pageRect = { x:rect.x + pageDelta[0], y:rect.y + pageDelta[1], w:rect.w, h:rect.h}, + focusDropElement = null; + + this.params.setPosition(dragEl, [cPos[0] + ghostDx, cPos[1] + ghostDy]); + + for (var i = 0; i < matchingDroppables.length; i++) { + var r2 = { x:matchingDroppables[i].pagePosition[0], y:matchingDroppables[i].pagePosition[1], w:matchingDroppables[i].size[0], h:matchingDroppables[i].size[1]}; + if (this.params.intersects(pageRect, r2) && (_multipleDrop || focusDropElement == null || focusDropElement === matchingDroppables[i].el) && matchingDroppables[i].canDrop(this)) { + if (!focusDropElement) focusDropElement = matchingDroppables[i].el; + intersectingDroppables.push(matchingDroppables[i]); + matchingDroppables[i].setHover(this, true, e); + } + else if (matchingDroppables[i].isHover()) { + matchingDroppables[i].setHover(this, false, e); + } + } + + _dispatch("drag", {el:this.el, pos:cPos, e:e, drag:this}); + + /* test to see if the parent needs to be scrolled (future) + if (scroll) { + var pnsl = dragEl.parentNode.scrollLeft, pnst = dragEl.parentNode.scrollTop; + console.log("scroll!", pnsl, pnst); + }*/ + }; + this.destroy = function() { + this.params.unbind(this.el, "mousedown", this.downListener); + this.params.unbind(document, "mousemove", this.moveListener); + this.params.unbind(document, "mouseup", this.upListener); + this.downListener = null; + this.upListener = null; + this.moveListener = null; + }; + + // init:register mousedown, and perhaps set a filter + this.params.bind(this.el, "mousedown", this.downListener); + + // if handle provided, use that. otherwise, try to set a filter. + // note that a `handle` selector always results in filterExclude being set to false, ie. + // the selector defines the handle element(s). + if (this.params.handle) + _setFilter(this.params.handle, false); + else + _setFilter(this.params.filter, this.params.filterExclude); + }; + + var Drop = function(el, params, css, scope) { + this._class = css.droppable; + this.params = params || {}; + this.rank = params.rank || 0; + this._activeClass = this.params.activeClass || css.active; + this._hoverClass = this.params.hoverClass || css.hover; + Super.apply(this, arguments); + var hover = false; + this.allowLoopback = this.params.allowLoopback !== false; + + this.setActive = function(val) { + this.params[val ? "addClass" : "removeClass"](this.el, this._activeClass); + }; + + this.updatePosition = function() { + this.position = this.params.getPosition(this.el); + this.pagePosition = this.params.getPosition(this.el, true); + this.size = this.params.getSize(this.el); + }; + + this.canDrop = this.params.canDrop || function(drag) { + return true; + }; + + this.isHover = function() { return hover; }; + + this.setHover = function(drag, val, e) { + // if turning off hover but this was not the drag that caused the hover, ignore. + if (val || this.el._katavorioDragHover == null || this.el._katavorioDragHover === drag.el._katavorio) { + this.params[val ? "addClass" : "removeClass"](this.el, this._hoverClass); + this.el._katavorioDragHover = val ? drag.el._katavorio : null; + if (hover !== val) { + this.params.events[val ? "over" : "out"]({el: this.el, e: e, drag: drag, drop: this}); + } + hover = val; + } + }; + + /** + * A drop event. `drag` is the corresponding Drag object, which may be a Drag for some specific element, or it + * may be a Drag on some element acting as a delegate for elements contained within it. + * @param drag + * @param event + * @returns {*} + */ + this.drop = function(drag, event) { + return this.params.events["drop"]({ drag:drag, e:event, drop:this }); + }; + + this.destroy = function() { + this._class = null; + this._activeClass = null; + this._hoverClass = null; + hover = null; + }; + }; + + var _uuid = function() { + return ('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = Math.random()*16|0, v = c === 'x' ? r : (r&0x3|0x8); + return v.toString(16); + })); + }; + + var _rankSort = function(a,b) { + return a.rank < b.rank ? 1 : a.rank > b.rank ? -1 : 0; + }; + + var _gel = function(el) { + if (el == null) return null; + el = (typeof el === "string" || el.constructor === String) ? document.getElementById(el) : el; + if (el == null) return null; + el._katavorio = el._katavorio || _uuid(); + return el; + }; + + root.Katavorio = function(katavorioParams) { + + var _selection = [], + _selectionMap = {}; + + this._dragsByScope = {}; + this._dropsByScope = {}; + var _zoom = 1, + _reg = function(obj, map) { + _each(obj, function(_obj) { + for(var i = 0; i < _obj.scopes.length; i++) { + map[_obj.scopes[i]] = map[_obj.scopes[i]] || []; + map[_obj.scopes[i]].push(_obj); + } + }); + }, + _unreg = function(obj, map) { + var c = 0; + _each(obj, function(_obj) { + for(var i = 0; i < _obj.scopes.length; i++) { + if (map[_obj.scopes[i]]) { + var idx = katavorioParams.indexOf(map[_obj.scopes[i]], _obj); + if (idx !== -1) { + map[_obj.scopes[i]].splice(idx, 1); + c++; + } + } + } + }); + + return c > 0 ; + }, + _getMatchingDroppables = this.getMatchingDroppables = function(drag) { + var dd = [], _m = {}; + for (var i = 0; i < drag.scopes.length; i++) { + var _dd = this._dropsByScope[drag.scopes[i]]; + if (_dd) { + for (var j = 0; j < _dd.length; j++) { + if (_dd[j].canDrop(drag) && !_m[_dd[j].uuid] && (_dd[j].allowLoopback || _dd[j].el !== drag.el)) { + _m[_dd[j].uuid] = true; + dd.push(_dd[j]); + } + } + } + } + dd.sort(_rankSort); + return dd; + }, + _prepareParams = function(p) { + p = p || {}; + var _p = { + events:{} + }, i; + for (i in katavorioParams) _p[i] = katavorioParams[i]; + for (i in p) _p[i] = p[i]; + // events + + for (i = 0; i < _events.length; i++) { + _p.events[_events[i]] = p[_events[i]] || _devNull; + } + _p.katavorio = this; + return _p; + }.bind(this), + _mistletoe = function(existingDrag, params) { + for (var i = 0; i < _events.length; i++) { + if (params[_events[i]]) { + existingDrag.on(_events[i], params[_events[i]]); + } + } + }.bind(this), + _css = {}, + overrideCss = katavorioParams.css || {}, + _scope = katavorioParams.scope || _defaultScope; + + // prepare map of css classes based on defaults frst, then optional overrides + for (var i in _classes) _css[i] = _classes[i]; + for (var i in overrideCss) _css[i] = overrideCss[i]; + + var inputFilterSelector = katavorioParams.inputFilterSelector || _defaultInputFilterSelector; + /** + * Gets the selector identifying which input elements to filter from drag events. + * @method getInputFilterSelector + * @return {String} Current input filter selector. + */ + this.getInputFilterSelector = function() { return inputFilterSelector; }; + + /** + * Sets the selector identifying which input elements to filter from drag events. + * @method setInputFilterSelector + * @param {String} selector Input filter selector to set. + * @return {Katavorio} Current instance; method may be chained. + */ + this.setInputFilterSelector = function(selector) { + inputFilterSelector = selector; + return this; + }; + + /** + * Either makes the given element draggable, or identifies it as an element inside which some identified list + * of elements may be draggable. + * @param el + * @param params + * @returns {Array} + */ + this.draggable = function(el, params) { + var o = []; + _each(el, function (_el) { + _el = _gel(_el); + if (_el != null) { + if (_el._katavorioDrag == null) { + var p = _prepareParams(params); + _el._katavorioDrag = new Drag(_el, p, _css, _scope); + _reg(_el._katavorioDrag, this._dragsByScope); + o.push(_el._katavorioDrag); + katavorioParams.addClass(_el, p.selector ? _css.delegatedDraggable : _css.draggable); + } + else { + _mistletoe(_el._katavorioDrag, params); + } + } + }.bind(this)); + return o; + }; + + this.droppable = function(el, params) { + var o = []; + _each(el, function(_el) { + _el = _gel(_el); + if (_el != null) { + var drop = new Drop(_el, _prepareParams(params), _css, _scope); + _el._katavorioDrop = _el._katavorioDrop || []; + _el._katavorioDrop.push(drop); + _reg(drop, this._dropsByScope); + o.push(drop); + katavorioParams.addClass(_el, _css.droppable); + } + }.bind(this)); + return o; + }; + + /** + * @name Katavorio#select + * @function + * @desc Adds an element to the current selection (for multiple node drag) + * @param {Element|String} DOM element - or id of the element - to add. + */ + this.select = function(el) { + _each(el, function() { + var _el = _gel(this); + if (_el && _el._katavorioDrag) { + if (!_selectionMap[_el._katavorio]) { + _selection.push(_el._katavorioDrag); + _selectionMap[_el._katavorio] = [ _el, _selection.length - 1 ]; + katavorioParams.addClass(_el, _css.selected); + } + } + }); + return this; + }; + + /** + * @name Katavorio#deselect + * @function + * @desc Removes an element from the current selection (for multiple node drag) + * @param {Element|String} DOM element - or id of the element - to remove. + */ + this.deselect = function(el) { + _each(el, function() { + var _el = _gel(this); + if (_el && _el._katavorio) { + var e = _selectionMap[_el._katavorio]; + if (e) { + var _s = []; + for (var i = 0; i < _selection.length; i++) + if (_selection[i].el !== _el) _s.push(_selection[i]); + _selection = _s; + delete _selectionMap[_el._katavorio]; + katavorioParams.removeClass(_el, _css.selected); + } + } + }); + return this; + }; + + this.deselectAll = function() { + for (var i in _selectionMap) { + var d = _selectionMap[i]; + katavorioParams.removeClass(d[0], _css.selected); + } + + _selection.length = 0; + _selectionMap = {}; + }; + + this.markSelection = function(drag) { + _foreach(_selection, function(e) { e.mark(); }, drag); + }; + + this.markPosses = function(drag) { + if (drag.posses) { + _each(drag.posses, function(p) { + if (drag.posseRoles[p] && _posses[p]) { + _foreach(_posses[p].members, function (d) { + d.mark(); + }, drag); + } + }) + } + }; + + this.unmarkSelection = function(drag, event) { + _foreach(_selection, function(e) { e.unmark(event); }, drag); + }; + + this.unmarkPosses = function(drag, event) { + if (drag.posses) { + _each(drag.posses, function(p) { + if (drag.posseRoles[p] && _posses[p]) { + _foreach(_posses[p].members, function (d) { + d.unmark(event, true); + }, drag); + } + }); + } + }; + + this.getSelection = function() { return _selection.slice(0); }; + + this.updateSelection = function(dx, dy, drag) { + _foreach(_selection, function(e) { e.moveBy(dx, dy); }, drag); + }; + + var _posseAction = function(fn, drag) { + if (drag.posses) { + _each(drag.posses, function(p) { + if (drag.posseRoles[p] && _posses[p]) { + _foreach(_posses[p].members, function (e) { + fn(e); + }, drag); + } + }); + } + }; + + this.updatePosses = function(dx, dy, drag) { + _posseAction(function(e) { e.moveBy(dx, dy); }, drag); + }; + + this.notifyPosseDragStop = function(drag, evt) { + _posseAction(function(e) { e.stop(evt, true); }, drag); + }; + + this.notifySelectionDragStop = function(drag, evt) { + _foreach(_selection, function(e) { e.stop(evt, true); }, drag); + }; + + this.notifySelectionDragStart = function(drag, evt) { + _foreach(_selection, function(e) { e.notifyStart(evt);}, drag); + }; + + this.setZoom = function(z) { _zoom = z; }; + this.getZoom = function() { return _zoom; }; + + // does the work of changing scopes + var _scopeManip = function(kObj, scopes, map, fn) { + _each(kObj, function(_kObj) { + _unreg(_kObj, map); // deregister existing scopes + _kObj[fn](scopes); // set scopes + _reg(_kObj, map); // register new ones + }); + }; + + _each([ "set", "add", "remove", "toggle"], function(v) { + this[v + "Scope"] = function(el, scopes) { + _scopeManip(el._katavorioDrag, scopes, this._dragsByScope, v + "Scope"); + _scopeManip(el._katavorioDrop, scopes, this._dropsByScope, v + "Scope"); + }.bind(this); + this[v + "DragScope"] = function(el, scopes) { + _scopeManip(el.constructor === Drag ? el : el._katavorioDrag, scopes, this._dragsByScope, v + "Scope"); + }.bind(this); + this[v + "DropScope"] = function(el, scopes) { + _scopeManip(el.constructor === Drop ? el : el._katavorioDrop, scopes, this._dropsByScope, v + "Scope"); + }.bind(this); + }.bind(this)); + + this.snapToGrid = function(x, y) { + for (var s in this._dragsByScope) { + _foreach(this._dragsByScope[s], function(d) { d.snap(x, y); }); + } + }; + + this.getDragsForScope = function(s) { return this._dragsByScope[s]; }; + this.getDropsForScope = function(s) { return this._dropsByScope[s]; }; + + var _destroy = function(el, type, map) { + el = _gel(el); + if (el[type]) { + + // remove from selection, if present. + var selIdx = _selection.indexOf(el[type]); + if (selIdx >= 0) { + _selection.splice(selIdx, 1); + } + + if (_unreg(el[type], map)) { + _each(el[type], function(kObj) { kObj.destroy() }); + } + + delete el[type]; + } + }; + + var _removeListener = function(el, type, evt, fn) { + el = _gel(el); + if (el[type]) { + el[type].off(evt, fn); + } + }; + + this.elementRemoved = function(el) { + this.destroyDraggable(el); + this.destroyDroppable(el); + }; + + /** + * Either completely remove drag functionality from the given element, or remove a specific event handler. If you + * call this method with a single argument - the element - all drag functionality is removed from it. Otherwise, if + * you provide an event name and listener function, this function is de-registered (if found). + * @param el Element to update + * @param {string} [evt] Optional event name to unsubscribe + * @param {Function} [fn] Optional function to unsubscribe + */ + this.destroyDraggable = function(el, evt, fn) { + if (arguments.length === 1) { + _destroy(el, "_katavorioDrag", this._dragsByScope); + } else { + _removeListener(el, "_katavorioDrag", evt, fn); + } + }; + + /** + * Either completely remove drop functionality from the given element, or remove a specific event handler. If you + * call this method with a single argument - the element - all drop functionality is removed from it. Otherwise, if + * you provide an event name and listener function, this function is de-registered (if found). + * @param el Element to update + * @param {string} [evt] Optional event name to unsubscribe + * @param {Function} [fn] Optional function to unsubscribe + */ + this.destroyDroppable = function(el, evt, fn) { + if (arguments.length === 1) { + _destroy(el, "_katavorioDrop", this._dropsByScope); + } else { + _removeListener(el, "_katavorioDrop", evt, fn); + } + }; + + this.reset = function() { + this._dragsByScope = {}; + this._dropsByScope = {}; + _selection = []; + _selectionMap = {}; + _posses = {}; + }; + + // ----- groups + var _posses = {}; + + var _processOneSpec = function(el, _spec, dontAddExisting) { + var posseId = _isString(_spec) ? _spec : _spec.id; + var active = _isString(_spec) ? true : _spec.active !== false; + var posse = _posses[posseId] || (function() { + var g = {name:posseId, members:[]}; + _posses[posseId] = g; + return g; + })(); + _each(el, function(_el) { + if (_el._katavorioDrag) { + + if (dontAddExisting && _el._katavorioDrag.posseRoles[posse.name] != null) return; + + _suggest(posse.members, _el._katavorioDrag); + _suggest(_el._katavorioDrag.posses, posse.name); + _el._katavorioDrag.posseRoles[posse.name] = active; + } + }); + return posse; + }; + + /** + * Add the given element to the posse with the given id, creating the group if it at first does not exist. + * @method addToPosse + * @param {Element} el Element to add. + * @param {String...|Object...} spec Variable args parameters. Each argument can be a either a String, indicating + * the ID of a Posse to which the element should be added as an active participant, or an Object containing + * `{ id:"posseId", active:false/true}`. In the latter case, if `active` is not provided it is assumed to be + * true. + * @returns {Posse|Posse[]} The Posse(s) to which the element(s) was/were added. + */ + this.addToPosse = function(el, spec) { + + var posses = []; + + for (var i = 1; i < arguments.length; i++) { + posses.push(_processOneSpec(el, arguments[i])); + } + + return posses.length === 1 ? posses[0] : posses; + }; + + /** + * Sets the posse(s) for the element with the given id, creating those that do not yet exist, and removing from + * the element any current Posses that are not specified by this method call. This method will not change the + * active/passive state if it is given a posse in which the element is already a member. + * @method setPosse + * @param {Element} el Element to set posse(s) on. + * @param {String...|Object...} spec Variable args parameters. Each argument can be a either a String, indicating + * the ID of a Posse to which the element should be added as an active participant, or an Object containing + * `{ id:"posseId", active:false/true}`. In the latter case, if `active` is not provided it is assumed to be + * true. + * @returns {Posse|Posse[]} The Posse(s) to which the element(s) now belongs. + */ + this.setPosse = function(el, spec) { + + var posses = []; + + for (var i = 1; i < arguments.length; i++) { + posses.push(_processOneSpec(el, arguments[i], true).name); + } + + _each(el, function(_el) { + if (_el._katavorioDrag) { + var diff = _difference(_el._katavorioDrag.posses, posses); + var p = []; + Array.prototype.push.apply(p, _el._katavorioDrag.posses); + for (var i = 0; i < diff.length; i++) { + this.removeFromPosse(_el, diff[i]); + } + } + }.bind(this)); + + return posses.length === 1 ? posses[0] : posses; + }; + + /** + * Remove the given element from the given posse(s). + * @method removeFromPosse + * @param {Element} el Element to remove. + * @param {String...} posseId Varargs parameter: one value for each posse to remove the element from. + */ + this.removeFromPosse = function(el, posseId) { + if (arguments.length < 2) throw new TypeError("No posse id provided for remove operation"); + for(var i = 1; i < arguments.length; i++) { + posseId = arguments[i]; + _each(el, function (_el) { + if (_el._katavorioDrag && _el._katavorioDrag.posses) { + var d = _el._katavorioDrag; + _each(posseId, function (p) { + _vanquish(_posses[p].members, d); + _vanquish(d.posses, p); + delete d.posseRoles[p]; + }); + } + }); + } + }; + + /** + * Remove the given element from all Posses to which it belongs. + * @method removeFromAllPosses + * @param {Element|Element[]} el Element to remove from Posses. + */ + this.removeFromAllPosses = function(el) { + _each(el, function(_el) { + if (_el._katavorioDrag && _el._katavorioDrag.posses) { + var d = _el._katavorioDrag; + _each(d.posses, function(p) { + _vanquish(_posses[p].members, d); + }); + d.posses.length = 0; + d.posseRoles = {}; + } + }); + }; + + /** + * Changes the participation state for the element in the Posse with the given ID. + * @param {Element|Element[]} el Element(s) to change state for. + * @param {String} posseId ID of the Posse to change element state for. + * @param {Boolean} state True to make active, false to make passive. + */ + this.setPosseState = function(el, posseId, state) { + var posse = _posses[posseId]; + if (posse) { + _each(el, function(_el) { + if (_el._katavorioDrag && _el._katavorioDrag.posses) { + _el._katavorioDrag.posseRoles[posse.name] = state; + } + }); + } + }; + + }; + + root.Katavorio.version = "1.0.0"; + + if (typeof exports !== "undefined") { + exports.Katavorio = root.Katavorio; + } + +}).call(typeof window !== 'undefined' ? window : this); + + +(function() { + + var root = this; + root.jsPlumbUtil = root.jsPlumbUtil || {}; + var jsPlumbUtil = root.jsPlumbUtil; + + if (typeof exports !=='undefined') { exports.jsPlumbUtil = jsPlumbUtil;} + + + /** + * Tests if the given object is an Array. + * @param a + */ + function isArray(a) { + return Object.prototype.toString.call(a) === "[object Array]"; + } + jsPlumbUtil.isArray = isArray; + /** + * Tests if the given object is a Number. + * @param n + */ + function isNumber(n) { + return Object.prototype.toString.call(n) === "[object Number]"; + } + jsPlumbUtil.isNumber = isNumber; + function isString(s) { + return typeof s === "string"; + } + jsPlumbUtil.isString = isString; + function isBoolean(s) { + return typeof s === "boolean"; + } + jsPlumbUtil.isBoolean = isBoolean; + function isNull(s) { + return s == null; + } + jsPlumbUtil.isNull = isNull; + function isObject(o) { + return o == null ? false : Object.prototype.toString.call(o) === "[object Object]"; + } + jsPlumbUtil.isObject = isObject; + function isDate(o) { + return Object.prototype.toString.call(o) === "[object Date]"; + } + jsPlumbUtil.isDate = isDate; + function isFunction(o) { + return Object.prototype.toString.call(o) === "[object Function]"; + } + jsPlumbUtil.isFunction = isFunction; + function isNamedFunction(o) { + return isFunction(o) && o.name != null && o.name.length > 0; + } + jsPlumbUtil.isNamedFunction = isNamedFunction; + function isEmpty(o) { + for (var i in o) { + if (o.hasOwnProperty(i)) { + return false; + } + } + return true; + } + jsPlumbUtil.isEmpty = isEmpty; + function clone(a) { + if (isString(a)) { + return "" + a; + } + else if (isBoolean(a)) { + return !!a; + } + else if (isDate(a)) { + return new Date(a.getTime()); + } + else if (isFunction(a)) { + return a; + } + else if (isArray(a)) { + var b = []; + for (var i = 0; i < a.length; i++) { + b.push(clone(a[i])); + } + return b; + } + else if (isObject(a)) { + var c = {}; + for (var j in a) { + c[j] = clone(a[j]); + } + return c; + } + else { + return a; + } + } + jsPlumbUtil.clone = clone; + function merge(a, b, collations, overwrites) { + // first change the collations array - if present - into a lookup table, because its faster. + var cMap = {}, ar, i, oMap = {}; + collations = collations || []; + overwrites = overwrites || []; + for (i = 0; i < collations.length; i++) { + cMap[collations[i]] = true; + } + for (i = 0; i < overwrites.length; i++) { + oMap[overwrites[i]] = true; + } + var c = clone(a); + for (i in b) { + if (c[i] == null || oMap[i]) { + c[i] = b[i]; + } + else if (isString(b[i]) || isBoolean(b[i])) { + if (!cMap[i]) { + c[i] = b[i]; // if we dont want to collate, just copy it in. + } + else { + ar = []; + // if c's object is also an array we can keep its values. + ar.push.apply(ar, isArray(c[i]) ? c[i] : [c[i]]); + ar.push.apply(ar, isBoolean(b[i]) ? b[i] : [b[i]]); + c[i] = ar; + } + } + else { + if (isArray(b[i])) { + ar = []; + // if c's object is also an array we can keep its values. + if (isArray(c[i])) { + ar.push.apply(ar, c[i]); + } + ar.push.apply(ar, b[i]); + c[i] = ar; + } + else if (isObject(b[i])) { + // overwrite c's value with an object if it is not already one. + if (!isObject(c[i])) { + c[i] = {}; + } + for (var j in b[i]) { + c[i][j] = b[i][j]; + } + } + } + } + return c; + } + jsPlumbUtil.merge = merge; + function replace(inObj, path, value) { + if (inObj == null) { + return; + } + var q = inObj, t = q; + path.replace(/([^\.])+/g, function (term, lc, pos, str) { + var array = term.match(/([^\[0-9]+){1}(\[)([0-9+])/), last = pos + term.length >= str.length, _getArray = function () { + return t[array[1]] || (function () { + t[array[1]] = []; + return t[array[1]]; + })(); + }; + if (last) { + // set term = value on current t, creating term as array if necessary. + if (array) { + _getArray()[array[3]] = value; + } + else { + t[term] = value; + } + } + else { + // set to current t[term], creating t[term] if necessary. + if (array) { + var a_1 = _getArray(); + t = a_1[array[3]] || (function () { + a_1[array[3]] = {}; + return a_1[array[3]]; + })(); + } + else { + t = t[term] || (function () { + t[term] = {}; + return t[term]; + })(); + } + } + return ""; + }); + return inObj; + } + jsPlumbUtil.replace = replace; + // + // chain a list of functions, supplied by [ object, method name, args ], and return on the first + // one that returns the failValue. if none return the failValue, return the successValue. + // + function functionChain(successValue, failValue, fns) { + for (var i = 0; i < fns.length; i++) { + var o = fns[i][0][fns[i][1]].apply(fns[i][0], fns[i][2]); + if (o === failValue) { + return o; + } + } + return successValue; + } + jsPlumbUtil.functionChain = functionChain; + /** + * + * Take the given model and expand out any parameters. 'functionPrefix' is optional, and if present, helps jsplumb figure out what to do if a value is a Function. + * if you do not provide it (and doNotExpandFunctions is null, or false), jsplumb will run the given values through any functions it finds, and use the function's + * output as the value in the result. if you do provide the prefix, only functions that are named and have this prefix + * will be executed; other functions will be passed as values to the output. + * + * @param model + * @param values + * @param functionPrefix + * @param doNotExpandFunctions + * @returns {any} + */ + function populate(model, values, functionPrefix, doNotExpandFunctions) { + // for a string, see if it has parameter matches, and if so, try to make the substitutions. + var getValue = function (fromString) { + var matches = fromString.match(/(\${.*?})/g); + if (matches != null) { + for (var i = 0; i < matches.length; i++) { + var val = values[matches[i].substring(2, matches[i].length - 1)] || ""; + if (val != null) { + fromString = fromString.replace(matches[i], val); + } + } + } + return fromString; + }; + // process one entry. + var _one = function (d) { + if (d != null) { + if (isString(d)) { + return getValue(d); + } + else if (isFunction(d) && !doNotExpandFunctions && (functionPrefix == null || (d.name || "").indexOf(functionPrefix) === 0)) { + return d(values); + } + else if (isArray(d)) { + var r = []; + for (var i = 0; i < d.length; i++) { + r.push(_one(d[i])); + } + return r; + } + else if (isObject(d)) { + var s = {}; + for (var j in d) { + s[j] = _one(d[j]); + } + return s; + } + else { + return d; + } + } + }; + return _one(model); + } + jsPlumbUtil.populate = populate; + /** + * Find the index of a given object in an array. + * @param a The array to search + * @param f The function to run on each element. Return true if the element matches. + * @returns {number} -1 if not found, otherwise the index in the array. + */ + function findWithFunction(a, f) { + if (a) { + for (var i = 0; i < a.length; i++) { + if (f(a[i])) { + return i; + } + } + } + return -1; + } + jsPlumbUtil.findWithFunction = findWithFunction; + /** + * Remove some element from an array by matching each element in the array against some predicate function. Note that this + * is an in-place removal; the array is altered. + * @param a The array to search + * @param f The function to run on each element. Return true if the element matches. + * @returns {boolean} true if removed, false otherwise. + */ + function removeWithFunction(a, f) { + var idx = findWithFunction(a, f); + if (idx > -1) { + a.splice(idx, 1); + } + return idx !== -1; + } + jsPlumbUtil.removeWithFunction = removeWithFunction; + /** + * Remove some element from an array by simple lookup in the array for the given element. Note that this + * is an in-place removal; the array is altered. + * @param l The array to search + * @param v The value to remove. + * @returns {boolean} true if removed, false otherwise. + */ + function remove(l, v) { + var idx = l.indexOf(v); + if (idx > -1) { + l.splice(idx, 1); + } + return idx !== -1; + } + jsPlumbUtil.remove = remove; + /** + * Add some element to the given array, unless it is determined that it is already in the array. + * @param list The array to add the element to. + * @param item The item to add. + * @param hashFunction A function to use to determine if the given item already exists in the array. + */ + function addWithFunction(list, item, hashFunction) { + if (findWithFunction(list, hashFunction) === -1) { + list.push(item); + } + } + jsPlumbUtil.addWithFunction = addWithFunction; + /** + * Add some element to a list that is contained in a map of lists. + * @param map The map of [ key -> list ] entries + * @param key The name of the list to insert into + * @param value The value to insert + * @param insertAtStart Whether or not to insert at the start; defaults to false. + */ + function addToList(map, key, value, insertAtStart) { + var l = map[key]; + if (l == null) { + l = []; + map[key] = l; + } + l[insertAtStart ? "unshift" : "push"](value); + return l; + } + jsPlumbUtil.addToList = addToList; + /** + * Add an item to a list, unless it is already in the list. The test for pre-existence is a simple list lookup. + * If you want to do something more complex, perhaps #addWithFunction might help. + * @param list List to add the item to + * @param item Item to add + * @param insertAtHead Whether or not to insert at the start; defaults to false. + */ + function suggest(list, item, insertAtHead) { + if (list.indexOf(item) === -1) { + if (insertAtHead) { + list.unshift(item); + } + else { + list.push(item); + } + return true; + } + return false; + } + jsPlumbUtil.suggest = suggest; + /** + * Extends the given obj (which can be an array) with the given constructor function, prototype functions, and class members, any of which may be null. + * @param child + * @param parent + * @param _protoFn + */ + function extend(child, parent, _protoFn) { + var i; + parent = isArray(parent) ? parent : [parent]; + var _copyProtoChain = function (focus) { + var proto = focus.__proto__; + while (proto != null) { + if (proto.prototype != null) { + for (var j in proto.prototype) { + if (proto.prototype.hasOwnProperty(j) && !child.prototype.hasOwnProperty(j)) { + child.prototype[j] = proto.prototype[j]; + } + } + proto = proto.prototype.__proto__; + } + else { + proto = null; + } + } + }; + for (i = 0; i < parent.length; i++) { + for (var j in parent[i].prototype) { + if (parent[i].prototype.hasOwnProperty(j) && !child.prototype.hasOwnProperty(j)) { + child.prototype[j] = parent[i].prototype[j]; + } + } + _copyProtoChain(parent[i]); + } + var _makeFn = function (name, protoFn) { + return function () { + for (i = 0; i < parent.length; i++) { + if (parent[i].prototype[name]) { + parent[i].prototype[name].apply(this, arguments); + } + } + return protoFn.apply(this, arguments); + }; + }; + var _oneSet = function (fns) { + for (var k in fns) { + child.prototype[k] = _makeFn(k, fns[k]); + } + }; + if (arguments.length > 2) { + for (i = 2; i < arguments.length; i++) { + _oneSet(arguments[i]); + } + } + return child; + } + jsPlumbUtil.extend = extend; + /** + * Generate a UUID. + */ + // export function uuid(): string { + // return ('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + // let r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8); + // return v.toString(16); + // })); + // } + var lut = []; + for (var i = 0; i < 256; i++) { + lut[i] = (i < 16 ? '0' : '') + (i).toString(16); + } + function uuid() { + var d0 = Math.random() * 0xffffffff | 0; + var d1 = Math.random() * 0xffffffff | 0; + var d2 = Math.random() * 0xffffffff | 0; + var d3 = Math.random() * 0xffffffff | 0; + return lut[d0 & 0xff] + lut[d0 >> 8 & 0xff] + lut[d0 >> 16 & 0xff] + lut[d0 >> 24 & 0xff] + '-' + + lut[d1 & 0xff] + lut[d1 >> 8 & 0xff] + '-' + lut[d1 >> 16 & 0x0f | 0x40] + lut[d1 >> 24 & 0xff] + '-' + + lut[d2 & 0x3f | 0x80] + lut[d2 >> 8 & 0xff] + '-' + lut[d2 >> 16 & 0xff] + lut[d2 >> 24 & 0xff] + + lut[d3 & 0xff] + lut[d3 >> 8 & 0xff] + lut[d3 >> 16 & 0xff] + lut[d3 >> 24 & 0xff]; + } + jsPlumbUtil.uuid = uuid; + /** + * Trim a string. + * @param s String to trim + * @returns the String with leading and trailing whitespace removed. + */ + function fastTrim(s) { + if (s == null) { + return null; + } + var str = s.replace(/^\s\s*/, ''), ws = /\s/, i = str.length; + while (ws.test(str.charAt(--i))) { + } + return str.slice(0, i + 1); + } + jsPlumbUtil.fastTrim = fastTrim; + function each(obj, fn) { + obj = obj.length == null || typeof obj === "string" ? [obj] : obj; + for (var i = 0; i < obj.length; i++) { + fn(obj[i]); + } + } + jsPlumbUtil.each = each; + function map(obj, fn) { + var o = []; + for (var i = 0; i < obj.length; i++) { + o.push(fn(obj[i])); + } + return o; + } + jsPlumbUtil.map = map; + function mergeWithParents(type, map, parentAttribute) { + parentAttribute = parentAttribute || "parent"; + var _def = function (id) { + return id ? map[id] : null; + }; + var _parent = function (def) { + return def ? _def(def[parentAttribute]) : null; + }; + var _one = function (parent, def) { + if (parent == null) { + return def; + } + else { + var overrides = ["anchor", "anchors", "cssClass", "connector", "paintStyle", "hoverPaintStyle", "endpoint", "endpoints"]; + if (def.mergeStrategy === "override") { + Array.prototype.push.apply(overrides, ["events", "overlays"]); + } + var d_1 = merge(parent, def, [], overrides); + return _one(_parent(parent), d_1); + } + }; + var _getDef = function (t) { + if (t == null) { + return {}; + } + if (typeof t === "string") { + return _def(t); + } + else if (t.length) { + var done = false, i = 0, _dd = void 0; + while (!done && i < t.length) { + _dd = _getDef(t[i]); + if (_dd) { + done = true; + } + else { + i++; + } + } + return _dd; + } + }; + var d = _getDef(type); + if (d) { + return _one(_parent(d), d); + } + else { + return {}; + } + } + jsPlumbUtil.mergeWithParents = mergeWithParents; + jsPlumbUtil.logEnabled = true; + function log() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (jsPlumbUtil.logEnabled && typeof console !== "undefined") { + try { + var msg = arguments[arguments.length - 1]; + console.log(msg); + } + catch (e) { + } + } + } + jsPlumbUtil.log = log; + /** + * Wraps one function with another, creating a placeholder for the + * wrapped function if it was null. this is used to wrap the various + * drag/drop event functions - to allow jsPlumb to be notified of + * important lifecycle events without imposing itself on the user's + * drag/drop functionality. + * @method jsPlumbUtil.wrap + * @param {Function} wrappedFunction original function to wrap; may be null. + * @param {Function} newFunction function to wrap the original with. + * @param {Object} [returnOnThisValue] Optional. Indicates that the wrappedFunction should + * not be executed if the newFunction returns a value matching 'returnOnThisValue'. + * note that this is a simple comparison and only works for primitives right now. + */ + function wrap(wrappedFunction, newFunction, returnOnThisValue) { + return function () { + var r = null; + try { + if (newFunction != null) { + r = newFunction.apply(this, arguments); + } + } + catch (e) { + log("jsPlumb function failed : " + e); + } + if ((wrappedFunction != null) && (returnOnThisValue == null || (r !== returnOnThisValue))) { + try { + r = wrappedFunction.apply(this, arguments); + } + catch (e) { + log("wrapped function failed : " + e); + } + } + return r; + }; + } + jsPlumbUtil.wrap = wrap; + var EventGenerator = /** @class */ (function () { + function EventGenerator() { + var _this = this; + this._listeners = {}; + this.eventsSuspended = false; + this.tick = false; + // this is a list of events that should re-throw any errors that occur during their dispatch. + this.eventsToDieOn = { "ready": true }; + this.queue = []; + this.bind = function (event, listener, insertAtStart) { + var _one = function (evt) { + addToList(_this._listeners, evt, listener, insertAtStart); + listener.__jsPlumb = listener.__jsPlumb || {}; + listener.__jsPlumb[uuid()] = evt; + }; + if (typeof event === "string") { + _one(event); + } + else if (event.length != null) { + for (var i = 0; i < event.length; i++) { + _one(event[i]); + } + } + return _this; + }; + this.fire = function (event, value, originalEvent) { + if (!this.tick) { + this.tick = true; + if (!this.eventsSuspended && this._listeners[event]) { + var l = this._listeners[event].length, i = 0, _gone = false, ret = null; + if (!this.shouldFireEvent || this.shouldFireEvent(event, value, originalEvent)) { + while (!_gone && i < l && ret !== false) { + // doing it this way rather than catching and then possibly re-throwing means that an error propagated by this + // method will have the whole call stack available in the debugger. + if (this.eventsToDieOn[event]) { + this._listeners[event][i].apply(this, [value, originalEvent]); + } + else { + try { + ret = this._listeners[event][i].apply(this, [value, originalEvent]); + } + catch (e) { + log("jsPlumb: fire failed for event " + event + " : " + e); + } + } + i++; + if (this._listeners == null || this._listeners[event] == null) { + _gone = true; + } + } + } + } + this.tick = false; + this._drain(); + } + else { + this.queue.unshift(arguments); + } + return this; + }; + this._drain = function () { + var n = _this.queue.pop(); + if (n) { + _this.fire.apply(_this, n); + } + }; + this.unbind = function (eventOrListener, listener) { + if (arguments.length === 0) { + this._listeners = {}; + } + else if (arguments.length === 1) { + if (typeof eventOrListener === "string") { + delete this._listeners[eventOrListener]; + } + else if (eventOrListener.__jsPlumb) { + var evt = void 0; + for (var i in eventOrListener.__jsPlumb) { + evt = eventOrListener.__jsPlumb[i]; + remove(this._listeners[evt] || [], eventOrListener); + } + } + } + else if (arguments.length === 2) { + remove(this._listeners[eventOrListener] || [], listener); + } + return this; + }; + this.getListener = function (forEvent) { + return _this._listeners[forEvent]; + }; + this.setSuspendEvents = function (val) { + _this.eventsSuspended = val; + }; + this.isSuspendEvents = function () { + return _this.eventsSuspended; + }; + this.silently = function (fn) { + _this.setSuspendEvents(true); + try { + fn(); + } + catch (e) { + log("Cannot execute silent function " + e); + } + _this.setSuspendEvents(false); + }; + this.cleanupListeners = function () { + for (var i in _this._listeners) { + _this._listeners[i] = null; + } + }; + } + return EventGenerator; + }()); + jsPlumbUtil.EventGenerator = EventGenerator; + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains utility functions that run in browsers only. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ + ;(function() { + + "use strict"; + + var root = this; + + root.jsPlumbUtil.matchesSelector = function(el, selector, ctx) { + ctx = ctx || el.parentNode; + var possibles = ctx.querySelectorAll(selector); + for (var i = 0; i < possibles.length; i++) { + if (possibles[i] === el) { + return true; + } + } + return false; + }; + + root.jsPlumbUtil.consume = function(e, doNotPreventDefault) { + if (e.stopPropagation) { + e.stopPropagation(); + } + else { + e.returnValue = false; + } + + if (!doNotPreventDefault && e.preventDefault){ + e.preventDefault(); + } + }; + + /* + * Function: sizeElement + * Helper to size and position an element. You would typically use + * this when writing your own Connector or Endpoint implementation. + * + * Parameters: + * x - [int] x position for the element origin + * y - [int] y position for the element origin + * w - [int] width of the element + * h - [int] height of the element + * + */ + root.jsPlumbUtil.sizeElement = function(el, x, y, w, h) { + if (el) { + el.style.height = h + "px"; + el.height = h; + el.style.width = w + "px"; + el.width = w; + el.style.left = x + "px"; + el.style.top = y + "px"; + } + }; + + }).call(typeof window !== 'undefined' ? window : this); + +;(function() { + + var DEFAULT_OPTIONS = { + deriveAnchor:function(edge, index, ep, conn) { + return { + top:["TopRight", "TopLeft"], + bottom:["BottomRight", "BottomLeft"] + }[edge][index]; + } + }; + + var root = this; + + var ListManager = function(jsPlumbInstance, params) { + + this.count = 0; + this.instance = jsPlumbInstance; + this.lists = {}; + this.options = params || {}; + + this.instance.addList = function(el, options) { + return this.listManager.addList(el, options); + }; + + this.instance.removeList = function(el) { + this.listManager.removeList(el); + }; + + this.instance.bind("manageElement", function(p) { + + //look for [jtk-scrollable-list] elements and attach scroll listeners if necessary + var scrollableLists = this.instance.getSelector(p.el, "[jtk-scrollable-list]"); + for (var i = 0; i < scrollableLists.length; i++) { + this.addList(scrollableLists[i]); + } + + }.bind(this)); + + this.instance.bind("unmanageElement", function(p) { + this.removeList(p.el); + }); + + + this.instance.bind("connection", function(c, evt) { + if (evt == null) { + // not added by mouse. look for an ancestor of the source and/or target element that is a scrollable list, and run + // its scroll method. + this._maybeUpdateParentList(c.source); + this._maybeUpdateParentList(c.target); + } + }.bind(this)); + }; + + root.jsPlumbListManager = ListManager; + + ListManager.prototype = { + + addList : function(el, options) { + var dp = this.instance.extend({}, DEFAULT_OPTIONS); + this.instance.extend(dp, this.options); + options = this.instance.extend(dp, options || {}); + var id = [this.instance.getInstanceIndex(), this.count++].join("_"); + this.lists[id] = new List(this.instance, el, options, id); + }, + + removeList:function(el) { + var list = this.lists[el._jsPlumbList]; + if (list) { + list.destroy(); + delete this.lists[el._jsPlumbList]; + } + }, + + _maybeUpdateParentList:function (el) { + var parent = el.parentNode, container = this.instance.getContainer(); + while(parent != null && parent !== container) { + if (parent._jsPlumbList != null && this.lists[parent._jsPlumbList] != null) { + parent._jsPlumbScrollHandler(); + return + } + parent = parent.parentNode; + } + } + + + }; + + var List = function(instance, el, options, id) { + + el["_jsPlumbList"] = id; + + // + // Derive an anchor to use for the current situation. In contrast to the way we derive an endpoint, here we use `anchor` from the options, if present, as + // our first choice, and then `deriveAnchor` as our next choice. There is a default `deriveAnchor` implementation that uses TopRight/TopLeft for top and + // BottomRight/BottomLeft for bottom. + // + // edge - "top" or "bottom" + // index - 0 when endpoint is connection source, 1 when endpoint is connection target + // ep - the endpoint that is being proxied + // conn - the connection that is being proxied + // + function deriveAnchor(edge, index, ep, conn) { + return options.anchor ? options.anchor : options.deriveAnchor(edge, index, ep, conn); + } + + // + // Derive an endpoint to use for the current situation. We'll use a `deriveEndpoint` function passed in to the options as our first choice, + // followed by `endpoint` (an endpoint spec) from the options, and failing either of those we just use the `type` of the endpoint that is being proxied. + // + // edge - "top" or "bottom" + // index - 0 when endpoint is connection source, 1 when endpoint is connection target + // endpoint - the endpoint that is being proxied + // connection - the connection that is being proxied + // + function deriveEndpoint(edge, index, ep, conn) { + return options.deriveEndpoint ? options.deriveEndpoint(edge, index, ep, conn) : options.endpoint ? options.endpoint : ep.type; + } + + // + // look for a parent of the given scrollable list that is draggable, and then update the child offsets for it. this should not + // be necessary in the delegated drag stuff from the upcoming 3.0.0 release. + // + function _maybeUpdateDraggable(el) { + var parent = el.parentNode, container = instance.getContainer(); + while(parent != null && parent !== container) { + if (instance.hasClass(parent, "jtk-managed")) { + instance.recalculateOffsets(parent); + return + } + parent = parent.parentNode; + } + } + + var scrollHandler = function(e) { + + var children = instance.getSelector(el, ".jtk-managed"); + var elId = instance.getId(el); + + for (var i = 0; i < children.length; i++) { + + if (children[i].offsetTop < el.scrollTop) { + if (!children[i]._jsPlumbProxies) { + children[i]._jsPlumbProxies = children[i]._jsPlumbProxies || []; + instance.select({source: children[i]}).each(function (c) { + + + instance.proxyConnection(c, 0, el, elId, function () { + return deriveEndpoint("top", 0, c.endpoints[0], c); + }, function () { + return deriveAnchor("top", 0, c.endpoints[0], c); + }); + children[i]._jsPlumbProxies.push([c, 0]); + }); + + instance.select({target: children[i]}).each(function (c) { + instance.proxyConnection(c, 1, el, elId, function () { + return deriveEndpoint("top", 1, c.endpoints[1], c); + }, function () { + return deriveAnchor("top", 1, c.endpoints[1], c); + }); + children[i]._jsPlumbProxies.push([c, 1]); + }); + } + } + // + else if (children[i].offsetTop + children[i].offsetHeight > el.scrollTop + el.offsetHeight) { + if (!children[i]._jsPlumbProxies) { + children[i]._jsPlumbProxies = children[i]._jsPlumbProxies || []; + + instance.select({source: children[i]}).each(function (c) { + instance.proxyConnection(c, 0, el, elId, function () { + return deriveEndpoint("bottom", 0, c.endpoints[0], c); + }, function () { + return deriveAnchor("bottom", 0, c.endpoints[0], c); + }); + children[i]._jsPlumbProxies.push([c, 0]); + }); + + instance.select({target: children[i]}).each(function (c) { + instance.proxyConnection(c, 1, el, elId, function () { + return deriveEndpoint("bottom", 1, c.endpoints[1], c); + }, function () { + return deriveAnchor("bottom", 1, c.endpoints[1], c); + }); + children[i]._jsPlumbProxies.push([c, 1]); + }); + } + } else if (children[i]._jsPlumbProxies) { + for (var j = 0; j < children[i]._jsPlumbProxies.length; j++) { + instance.unproxyConnection(children[i]._jsPlumbProxies[j][0], children[i]._jsPlumbProxies[j][1], elId); + } + + delete children[i]._jsPlumbProxies; + } + + instance.revalidate(children[i]); + } + + _maybeUpdateDraggable(el); + }; + + instance.setAttribute(el, "jtk-scrollable-list", "true"); + el._jsPlumbScrollHandler = scrollHandler; + instance.on(el, "scroll", scrollHandler); + scrollHandler(); // run it once; there may be connections already. + + this.destroy = function() { + instance.off(el, "scroll", scrollHandler); + delete el._jsPlumbScrollHandler; + + var children = instance.getSelector(el, ".jtk-managed"); + var elId = instance.getId(el); + + for (var i = 0; i < children.length; i++) { + if (children[i]._jsPlumbProxies) { + for (var j = 0; j < children[i]._jsPlumbProxies.length; j++) { + instance.unproxyConnection(children[i]._jsPlumbProxies[j][0], children[i]._jsPlumbProxies[j][1], elId); + } + + delete children[i]._jsPlumbProxies; + } + } + }; + }; + + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the core code. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function () { + + "use strict"; + + var root = this; + + var _ju = root.jsPlumbUtil, + + /** + * creates a timestamp, using milliseconds since 1970, but as a string. + */ + _timestamp = function () { + return "" + (new Date()).getTime(); + }, + + // helper method to update the hover style whenever it, or paintStyle, changes. + // we use paintStyle as the foundation and merge hoverPaintStyle over the + // top. + _updateHoverStyle = function (component) { + if (component._jsPlumb.paintStyle && component._jsPlumb.hoverPaintStyle) { + var mergedHoverStyle = {}; + jsPlumb.extend(mergedHoverStyle, component._jsPlumb.paintStyle); + jsPlumb.extend(mergedHoverStyle, component._jsPlumb.hoverPaintStyle); + delete component._jsPlumb.hoverPaintStyle; + // we want the fill of paintStyle to override a gradient, if possible. + if (mergedHoverStyle.gradient && component._jsPlumb.paintStyle.fill) { + delete mergedHoverStyle.gradient; + } + component._jsPlumb.hoverPaintStyle = mergedHoverStyle; + } + }, + events = ["tap", "dbltap", "click", "dblclick", "mouseover", "mouseout", "mousemove", "mousedown", "mouseup", "contextmenu" ], + eventFilters = { "mouseout": "mouseleave", "mouseexit": "mouseleave" }, + _updateAttachedElements = function (component, state, timestamp, sourceElement) { + var affectedElements = component.getAttachedElements(); + if (affectedElements) { + for (var i = 0, j = affectedElements.length; i < j; i++) { + if (!sourceElement || sourceElement !== affectedElements[i]) { + affectedElements[i].setHover(state, true, timestamp); // tell the attached elements not to inform their own attached elements. + } + } + } + }, + _splitType = function (t) { + return t == null ? null : t.split(" "); + }, + _mapType = function(map, obj, typeId) { + for (var i in obj) { + map[i] = typeId; + } + }, + _each = function(fn, obj) { + obj = _ju.isArray(obj) || (obj.length != null && !_ju.isString(obj)) ? obj : [ obj ]; + for (var i = 0; i < obj.length; i++) { + try { + fn.apply(obj[i], [ obj[i] ]); + } + catch (e) { + _ju.log(".each iteration failed : " + e); + } + } + }, + _applyTypes = function (component, params, doNotRepaint) { + if (component.getDefaultType) { + var td = component.getTypeDescriptor(), map = {}; + var defType = component.getDefaultType(); + var o = _ju.merge({}, defType); + _mapType(map, defType, "__default"); + for (var i = 0, j = component._jsPlumb.types.length; i < j; i++) { + var tid = component._jsPlumb.types[i]; + if (tid !== "__default") { + var _t = component._jsPlumb.instance.getType(tid, td); + if (_t != null) { + + var overrides = ["anchor", "anchors", "connector", "paintStyle", "hoverPaintStyle", "endpoint", "endpoints", "connectorOverlays", "connectorStyle", "connectorHoverStyle", "endpointStyle", "endpointHoverStyle"]; + var collations = [ ]; + + if (_t.mergeStrategy === "override") { + Array.prototype.push.apply(overrides, ["events", "overlays", "cssClass"]); + } else { + collations.push("cssClass"); + } + + o = _ju.merge(o, _t, collations, overrides); + _mapType(map, _t, tid); + } + } + } + + if (params) { + o = _ju.populate(o, params, "_"); + } + + component.applyType(o, doNotRepaint, map); + if (!doNotRepaint) { + component.repaint(); + } + } + }, + +// ------------------------------ BEGIN jsPlumbUIComponent -------------------------------------------- + + jsPlumbUIComponent = root.jsPlumbUIComponent = function (params) { + + _ju.EventGenerator.apply(this, arguments); + + var self = this, + a = arguments, + idPrefix = self.idPrefix, + id = idPrefix + (new Date()).getTime(); + + this._jsPlumb = { + instance: params._jsPlumb, + parameters: params.parameters || {}, + paintStyle: null, + hoverPaintStyle: null, + paintStyleInUse: null, + hover: false, + beforeDetach: params.beforeDetach, + beforeDrop: params.beforeDrop, + overlayPlacements: [], + hoverClass: params.hoverClass || params._jsPlumb.Defaults.HoverClass, + types: [], + typeCache:{} + }; + + this.cacheTypeItem = function(key, item, typeId) { + this._jsPlumb.typeCache[typeId] = this._jsPlumb.typeCache[typeId] || {}; + this._jsPlumb.typeCache[typeId][key] = item; + }; + this.getCachedTypeItem = function(key, typeId) { + return this._jsPlumb.typeCache[typeId] ? this._jsPlumb.typeCache[typeId][key] : null; + }; + + this.getId = function () { + return id; + }; + +// ----------------------------- default type -------------------------------------------- + + + var o = params.overlays || [], oo = {}; + if (this.defaultOverlayKeys) { + for (var i = 0; i < this.defaultOverlayKeys.length; i++) { + Array.prototype.push.apply(o, this._jsPlumb.instance.Defaults[this.defaultOverlayKeys[i]] || []); + } + + for (i = 0; i < o.length; i++) { + // if a string, convert to object representation so that we can store the typeid on it. + // also assign an id. + var fo = jsPlumb.convertToFullOverlaySpec(o[i]); + oo[fo[1].id] = fo; + } + } + + var _defaultType = { + overlays:oo, + parameters: params.parameters || {}, + scope: params.scope || this._jsPlumb.instance.getDefaultScope() + }; + this.getDefaultType = function() { + return _defaultType; + }; + this.appendToDefaultType = function(obj) { + for (var i in obj) { + _defaultType[i] = obj[i]; + } + }; + +// ----------------------------- end default type -------------------------------------------- + + // all components can generate events + + if (params.events) { + for (var evtName in params.events) { + self.bind(evtName, params.events[evtName]); + } + } + + // all components get this clone function. + // TODO issue 116 showed a problem with this - it seems 'a' that is in + // the clone function's scope is shared by all invocations of it, the classic + // JS closure problem. for now, jsPlumb does a version of this inline where + // it used to call clone. but it would be nice to find some time to look + // further at this. + this.clone = function () { + var o = Object.create(this.constructor.prototype); + this.constructor.apply(o, a); + return o; + }.bind(this); + + // user can supply a beforeDetach callback, which will be executed before a detach + // is performed; returning false prevents the detach. + this.isDetachAllowed = function (connection) { + var r = true; + if (this._jsPlumb.beforeDetach) { + try { + r = this._jsPlumb.beforeDetach(connection); + } + catch (e) { + _ju.log("jsPlumb: beforeDetach callback failed", e); + } + } + return r; + }; + + // user can supply a beforeDrop callback, which will be executed before a dropped + // connection is confirmed. user can return false to reject connection. + this.isDropAllowed = function (sourceId, targetId, scope, connection, dropEndpoint, source, target) { + var r = this._jsPlumb.instance.checkCondition("beforeDrop", { + sourceId: sourceId, + targetId: targetId, + scope: scope, + connection: connection, + dropEndpoint: dropEndpoint, + source: source, target: target + }); + if (this._jsPlumb.beforeDrop) { + try { + r = this._jsPlumb.beforeDrop({ + sourceId: sourceId, + targetId: targetId, + scope: scope, + connection: connection, + dropEndpoint: dropEndpoint, + source: source, target: target + }); + } + catch (e) { + _ju.log("jsPlumb: beforeDrop callback failed", e); + } + } + return r; + }; + + var domListeners = []; + + // sets the component associated with listener events. for instance, an overlay delegates + // its events back to a connector. but if the connector is swapped on the underlying connection, + // then this component must be changed. This is called by setConnector in the Connection class. + this.setListenerComponent = function (c) { + for (var i = 0; i < domListeners.length; i++) { + domListeners[i][3] = c; + } + }; + + + }; + + var _removeTypeCssHelper = function (component, typeIndex) { + var typeId = component._jsPlumb.types[typeIndex], + type = component._jsPlumb.instance.getType(typeId, component.getTypeDescriptor()); + + if (type != null && type.cssClass && component.canvas) { + component._jsPlumb.instance.removeClass(component.canvas, type.cssClass); + } + }; + + _ju.extend(root.jsPlumbUIComponent, _ju.EventGenerator, { + + getParameter: function (name) { + return this._jsPlumb.parameters[name]; + }, + + setParameter: function (name, value) { + this._jsPlumb.parameters[name] = value; + }, + + getParameters: function () { + return this._jsPlumb.parameters; + }, + + setParameters: function (p) { + this._jsPlumb.parameters = p; + }, + + getClass:function() { + return jsPlumb.getClass(this.canvas); + }, + + hasClass:function(clazz) { + return jsPlumb.hasClass(this.canvas, clazz); + }, + + addClass: function (clazz) { + jsPlumb.addClass(this.canvas, clazz); + }, + + removeClass: function (clazz) { + jsPlumb.removeClass(this.canvas, clazz); + }, + + updateClasses: function (classesToAdd, classesToRemove) { + jsPlumb.updateClasses(this.canvas, classesToAdd, classesToRemove); + }, + + setType: function (typeId, params, doNotRepaint) { + this.clearTypes(); + this._jsPlumb.types = _splitType(typeId) || []; + _applyTypes(this, params, doNotRepaint); + }, + + getType: function () { + return this._jsPlumb.types; + }, + + reapplyTypes: function (params, doNotRepaint) { + _applyTypes(this, params, doNotRepaint); + }, + + hasType: function (typeId) { + return this._jsPlumb.types.indexOf(typeId) !== -1; + }, + + addType: function (typeId, params, doNotRepaint) { + var t = _splitType(typeId), _cont = false; + if (t != null) { + for (var i = 0, j = t.length; i < j; i++) { + if (!this.hasType(t[i])) { + this._jsPlumb.types.push(t[i]); + _cont = true; + } + } + if (_cont) { + _applyTypes(this, params, doNotRepaint); + } + } + }, + + removeType: function (typeId, params, doNotRepaint) { + var t = _splitType(typeId), _cont = false, _one = function (tt) { + var idx = this._jsPlumb.types.indexOf(tt); + if (idx !== -1) { + // remove css class if necessary + _removeTypeCssHelper(this, idx); + this._jsPlumb.types.splice(idx, 1); + return true; + } + return false; + }.bind(this); + + if (t != null) { + for (var i = 0, j = t.length; i < j; i++) { + _cont = _one(t[i]) || _cont; + } + if (_cont) { + _applyTypes(this, params, doNotRepaint); + } + } + }, + clearTypes: function (params, doNotRepaint) { + var i = this._jsPlumb.types.length; + for (var j = 0; j < i; j++) { + _removeTypeCssHelper(this, 0); + this._jsPlumb.types.splice(0, 1); + } + _applyTypes(this, params, doNotRepaint); + }, + + toggleType: function (typeId, params, doNotRepaint) { + var t = _splitType(typeId); + if (t != null) { + for (var i = 0, j = t.length; i < j; i++) { + var idx = this._jsPlumb.types.indexOf(t[i]); + if (idx !== -1) { + _removeTypeCssHelper(this, idx); + this._jsPlumb.types.splice(idx, 1); + } + else { + this._jsPlumb.types.push(t[i]); + } + } + + _applyTypes(this, params, doNotRepaint); + } + }, + applyType: function (t, doNotRepaint) { + this.setPaintStyle(t.paintStyle, doNotRepaint); + this.setHoverPaintStyle(t.hoverPaintStyle, doNotRepaint); + if (t.parameters) { + for (var i in t.parameters) { + this.setParameter(i, t.parameters[i]); + } + } + this._jsPlumb.paintStyleInUse = this.getPaintStyle(); + }, + setPaintStyle: function (style, doNotRepaint) { + // this._jsPlumb.paintStyle = jsPlumb.extend({}, style); + // TODO figure out if we want components to clone paintStyle so as not to share it. + this._jsPlumb.paintStyle = style; + this._jsPlumb.paintStyleInUse = this._jsPlumb.paintStyle; + _updateHoverStyle(this); + if (!doNotRepaint) { + this.repaint(); + } + }, + getPaintStyle: function () { + return this._jsPlumb.paintStyle; + }, + setHoverPaintStyle: function (style, doNotRepaint) { + //this._jsPlumb.hoverPaintStyle = jsPlumb.extend({}, style); + // TODO figure out if we want components to clone paintStyle so as not to share it. + this._jsPlumb.hoverPaintStyle = style; + _updateHoverStyle(this); + if (!doNotRepaint) { + this.repaint(); + } + }, + getHoverPaintStyle: function () { + return this._jsPlumb.hoverPaintStyle; + }, + destroy: function (force) { + if (force || this.typeId == null) { + this.cleanupListeners(); // this is on EventGenerator + this.clone = null; + this._jsPlumb = null; + } + }, + + isHover: function () { + return this._jsPlumb.hover; + }, + + setHover: function (hover, ignoreAttachedElements, timestamp) { + // while dragging, we ignore these events. this keeps the UI from flashing and + // swishing and whatevering. + if (this._jsPlumb && !this._jsPlumb.instance.currentlyDragging && !this._jsPlumb.instance.isHoverSuspended()) { + + this._jsPlumb.hover = hover; + var method = hover ? "addClass" : "removeClass"; + + if (this.canvas != null) { + if (this._jsPlumb.instance.hoverClass != null) { + this._jsPlumb.instance[method](this.canvas, this._jsPlumb.instance.hoverClass); + } + if (this._jsPlumb.hoverClass != null) { + this._jsPlumb.instance[method](this.canvas, this._jsPlumb.hoverClass); + } + } + if (this._jsPlumb.hoverPaintStyle != null) { + this._jsPlumb.paintStyleInUse = hover ? this._jsPlumb.hoverPaintStyle : this._jsPlumb.paintStyle; + if (!this._jsPlumb.instance.isSuspendDrawing()) { + timestamp = timestamp || _timestamp(); + this.repaint({timestamp: timestamp, recalc: false}); + } + } + // get the list of other affected elements, if supported by this component. + // for a connection, its the endpoints. for an endpoint, its the connections! surprise. + if (this.getAttachedElements && !ignoreAttachedElements) { + _updateAttachedElements(this, hover, _timestamp(), this); + } + } + } + }); + +// ------------------------------ END jsPlumbUIComponent -------------------------------------------- + + var _jsPlumbInstanceIndex = 0, + getInstanceIndex = function () { + var i = _jsPlumbInstanceIndex + 1; + _jsPlumbInstanceIndex++; + return i; + }; + + var jsPlumbInstance = root.jsPlumbInstance = function (_defaults) { + + this.version = "2.13.2"; + + this.Defaults = { + Anchor: "Bottom", + Anchors: [ null, null ], + ConnectionsDetachable: true, + ConnectionOverlays: [ ], + Connector: "Bezier", + Container: null, + DoNotThrowErrors: false, + DragOptions: { }, + DropOptions: { }, + Endpoint: "Dot", + EndpointOverlays: [ ], + Endpoints: [ null, null ], + EndpointStyle: { fill: "#456" }, + EndpointStyles: [ null, null ], + EndpointHoverStyle: null, + EndpointHoverStyles: [ null, null ], + HoverPaintStyle: null, + LabelStyle: { color: "black" }, + ListStyle: { }, + LogEnabled: false, + Overlays: [ ], + MaxConnections: 1, + PaintStyle: { "stroke-width": 4, stroke: "#456" }, + ReattachConnections: false, + RenderMode: "svg", + Scope: "jsPlumb_DefaultScope" + }; + + if (_defaults) { + jsPlumb.extend(this.Defaults, _defaults); + } + + this.logEnabled = this.Defaults.LogEnabled; + this._connectionTypes = {}; + this._endpointTypes = {}; + + _ju.EventGenerator.apply(this); + + var _currentInstance = this, + _instanceIndex = getInstanceIndex(), + _bb = _currentInstance.bind, + _initialDefaults = {}, + _zoom = 1, + _info = function (el) { + if (el == null) { + return null; + } + else if (el.nodeType === 3 || el.nodeType === 8) { + return { el:el, text:true }; + } + else { + var _el = _currentInstance.getElement(el); + return { el: _el, id: (_ju.isString(el) && _el == null) ? el : _getId(_el) }; + } + }; + + this.getInstanceIndex = function () { + return _instanceIndex; + }; + + // CONVERTED + this.setZoom = function (z, repaintEverything) { + _zoom = z; + _currentInstance.fire("zoom", _zoom); + if (repaintEverything) { + _currentInstance.repaintEverything(); + } + return true; + }; + // CONVERTED + this.getZoom = function () { + return _zoom; + }; + + for (var i in this.Defaults) { + _initialDefaults[i] = this.Defaults[i]; + } + + var _container, _containerDelegations = []; + this.unbindContainer = function() { + if (_container != null && _containerDelegations.length > 0) { + for (var i = 0; i < _containerDelegations.length; i++) { + _currentInstance.off(_container, _containerDelegations[i][0], _containerDelegations[i][1]); + } + } + }; + this.setContainer = function (c) { + + this.unbindContainer(); + + // get container as dom element. + c = this.getElement(c); + // move existing connections and endpoints, if any. + this.select().each(function (conn) { + conn.moveParent(c); + }); + this.selectEndpoints().each(function (ep) { + ep.moveParent(c); + }); + + // set container. + var previousContainer = _container; + _container = c; + _containerDelegations.length = 0; + var eventAliases = { + "endpointclick":"endpointClick", + "endpointdblclick":"endpointDblClick" + }; + + var _oneDelegateHandler = function (id, e, componentType) { + var t = e.srcElement || e.target, + jp = (t && t.parentNode ? t.parentNode._jsPlumb : null) || (t ? t._jsPlumb : null) || (t && t.parentNode && t.parentNode.parentNode ? t.parentNode.parentNode._jsPlumb : null); + if (jp) { + jp.fire(id, jp, e); + var alias = componentType ? eventAliases[componentType + id] || id : id; + // jsplumb also fires every event coming from components/overlays. That's what the test for `jp.component` is for. + _currentInstance.fire(alias, jp.component || jp, e); + } + }; + + var _addOneDelegate = function(eventId, selector, fn) { + _containerDelegations.push([eventId, fn]); + _currentInstance.on(_container, eventId, selector, fn); + }; + + // delegate one event on the container to jsplumb elements. it might be possible to + // abstract this out: each of endpoint, connection and overlay could register themselves with + // jsplumb as "component types" or whatever, and provide a suitable selector. this would be + // done by the renderer (although admittedly from 2.0 onwards we're not supporting vml anymore) + var _oneDelegate = function (id) { + // connections. + _addOneDelegate(id, ".jtk-connector", function (e) { + _oneDelegateHandler(id, e); + }); + // endpoints. note they can have an enclosing div, or not. + _addOneDelegate(id, ".jtk-endpoint", function (e) { + _oneDelegateHandler(id, e, "endpoint"); + }); + // overlays + _addOneDelegate(id, ".jtk-overlay", function (e) { + _oneDelegateHandler(id, e); + }); + }; + + for (var i = 0; i < events.length; i++) { + _oneDelegate(events[i]); + } + + // managed elements + for (var elId in managedElements) { + var el = managedElements[elId].el; + if (el.parentNode === previousContainer) { + previousContainer.removeChild(el); + _container.appendChild(el); + } + } + + }; + this.getContainer = function () { + return _container; + }; + + this.bind = function (event, fn) { + if ("ready" === event && initialized) { + fn(); + } + else { + _bb.apply(_currentInstance, [event, fn]); + } + }; + + _currentInstance.importDefaults = function (d) { + for (var i in d) { + _currentInstance.Defaults[i] = d[i]; + } + if (d.Container) { + _currentInstance.setContainer(d.Container); + } + + return _currentInstance; + }; + + _currentInstance.restoreDefaults = function () { + _currentInstance.Defaults = jsPlumb.extend({}, _initialDefaults); + return _currentInstance; + }; + + var log = null, + initialized = false, + // TODO remove from window scope + connections = [], + // map of element id -> endpoint lists. an element can have an arbitrary + // number of endpoints on it, and not all of them have to be connected + // to anything. + endpointsByElement = {}, + endpointsByUUID = {}, + managedElements = {}, + offsets = {}, + offsetTimestamps = {}, + draggableStates = {}, + connectionBeingDragged = false, + sizes = [], + _suspendDrawing = false, + _suspendedAt = null, + DEFAULT_SCOPE = this.Defaults.Scope, + _curIdStamp = 1, + _idstamp = function () { + return "" + _curIdStamp++; + }, + + // + // appends an element to some other element, which is calculated as follows: + // + // 1. if Container exists, use that element. + // 2. if the 'parent' parameter exists, use that. + // 3. otherwise just use the root element. + // + // + _appendElement = function (el, parent) { + if (_container) { + _container.appendChild(el); + } + else if (!parent) { + this.appendToRoot(el); + } + else { + this.getElement(parent).appendChild(el); + } + }.bind(this), + + // + // Draws an endpoint and its connections. this is the main entry point into drawing connections as well + // as endpoints, since jsPlumb is endpoint-centric under the hood. + // + // @param element element to draw (of type library specific element object) + // @param ui UI object from current library's event system. optional. + // @param timestamp timestamp for this paint cycle. used to speed things up a little by cutting down the amount of offset calculations we do. + // @param clearEdits defaults to false; indicates that mouse edits for connectors should be cleared + /// + _draw = function (element, ui, timestamp, clearEdits) { + + if (!_suspendDrawing) { + + element = _currentInstance.getElement(element); + + if (element != null) { + + var id = _getId(element), + repaintEls = element.querySelectorAll(".jtk-managed"); + + if (timestamp == null) { + timestamp = _timestamp(); + } + + // update the offset of everything _before_ we try to draw anything. + var o = _updateOffset({elId: id, offset: ui, recalc: false, timestamp: timestamp}); + + for (var i = 0; i < repaintEls.length; i++) { + _updateOffset({ + elId: repaintEls[i].getAttribute("id"), + // offset: { + // left: o.o.left + repaintEls[i].offset.left, + // top: o.o.top + repaintEls[i].offset.top + // }, + recalc: true, + timestamp: timestamp + }); + } + + _currentInstance.anchorManager.redraw(id, ui, timestamp, null, clearEdits); + + if (repaintEls) { + for (var j = 0; j < repaintEls.length; j++) { + _currentInstance.anchorManager.redraw(repaintEls[j].getAttribute("id"), null, timestamp, null, clearEdits, true); + } + } + } + } + }, + + // + // gets an Endpoint by uuid. + // + _getEndpoint = function (uuid) { + return endpointsByUUID[uuid]; + }, + + /** + * inits a draggable if it's not already initialised. + * TODO: somehow abstract this to the adapter, because the concept of "draggable" has no + * place on the server. + */ + + + _scopeMatch = function (e1, e2) { + var s1 = e1.scope.split(/\s/), s2 = e2.scope.split(/\s/); + for (var i = 0; i < s1.length; i++) { + for (var j = 0; j < s2.length; j++) { + if (s2[j] === s1[i]) { + return true; + } + } + } + + return false; + }, + + _mergeOverrides = function (def, values) { + var m = jsPlumb.extend({}, def); + for (var i in values) { + if (values[i]) { + m[i] = values[i]; + } + } + return m; + }, + + /* + * prepares a final params object that can be passed to _newConnection, taking into account defaults, events, etc. + */ + _prepareConnectionParams = function (params, referenceParams) { + var _p = jsPlumb.extend({ }, params); + if (referenceParams) { + jsPlumb.extend(_p, referenceParams); + } + + // hotwire endpoints passed as source or target to sourceEndpoint/targetEndpoint, respectively. + if (_p.source) { + if (_p.source.endpoint) { + _p.sourceEndpoint = _p.source; + } + else { + _p.source = _currentInstance.getElement(_p.source); + } + } + if (_p.target) { + if (_p.target.endpoint) { + _p.targetEndpoint = _p.target; + } + else { + _p.target = _currentInstance.getElement(_p.target); + } + } + + // test for endpoint uuids to connect + if (params.uuids) { + _p.sourceEndpoint = _getEndpoint(params.uuids[0]); + _p.targetEndpoint = _getEndpoint(params.uuids[1]); + } + + // now ensure that if we do have Endpoints already, they're not full. + // source: + if (_p.sourceEndpoint && _p.sourceEndpoint.isFull()) { + _ju.log(_currentInstance, "could not add connection; source endpoint is full"); + return; + } + + // target: + if (_p.targetEndpoint && _p.targetEndpoint.isFull()) { + _ju.log(_currentInstance, "could not add connection; target endpoint is full"); + return; + } + + // if source endpoint mandates connection type and nothing specified in our params, use it. + if (!_p.type && _p.sourceEndpoint) { + _p.type = _p.sourceEndpoint.connectionType; + } + + // copy in any connectorOverlays that were specified on the source endpoint. + // it doesnt copy target endpoint overlays. i'm not sure if we want it to or not. + if (_p.sourceEndpoint && _p.sourceEndpoint.connectorOverlays) { + _p.overlays = _p.overlays || []; + for (var i = 0, j = _p.sourceEndpoint.connectorOverlays.length; i < j; i++) { + _p.overlays.push(_p.sourceEndpoint.connectorOverlays[i]); + } + } + + // scope + if (_p.sourceEndpoint && _p.sourceEndpoint.scope) { + _p.scope = _p.sourceEndpoint.scope; + } + + // pointer events + if (!_p["pointer-events"] && _p.sourceEndpoint && _p.sourceEndpoint.connectorPointerEvents) { + _p["pointer-events"] = _p.sourceEndpoint.connectorPointerEvents; + } + + + var _addEndpoint = function (el, def, idx) { + var params = _mergeOverrides(def, { + anchor: _p.anchors ? _p.anchors[idx] : _p.anchor, + endpoint: _p.endpoints ? _p.endpoints[idx] : _p.endpoint, + paintStyle: _p.endpointStyles ? _p.endpointStyles[idx] : _p.endpointStyle, + hoverPaintStyle: _p.endpointHoverStyles ? _p.endpointHoverStyles[idx] : _p.endpointHoverStyle + }); + return _currentInstance.addEndpoint(el, params); + }; + + // check for makeSource/makeTarget specs. + + var _oneElementDef = function (type, idx, defs, matchType) { + if (_p[type] && !_p[type].endpoint && !_p[type + "Endpoint"] && !_p.newConnection) { + var tid = _getId(_p[type]), tep = defs[tid]; + + tep = tep ? tep[matchType] : null; + + if (tep) { + // if not enabled, return. + if (!tep.enabled) { + return false; + } + + var epDef = jsPlumb.extend({}, tep.def); + delete epDef.label; + + var newEndpoint = tep.endpoint != null && tep.endpoint._jsPlumb ? tep.endpoint : _addEndpoint(_p[type], epDef, idx); + if (newEndpoint.isFull()) { + return false; + } + _p[type + "Endpoint"] = newEndpoint; + if (!_p.scope && epDef.scope) { + _p.scope = epDef.scope; + } // provide scope if not already provided and endpoint def has one. + if (tep.uniqueEndpoint) { + if (!tep.endpoint) { + tep.endpoint = newEndpoint; + newEndpoint.setDeleteOnEmpty(false); + } + else { + newEndpoint.finalEndpoint = tep.endpoint; + } + } else { + newEndpoint.setDeleteOnEmpty(true); + } + + // + // copy in connector overlays if present on the source definition. + // + if (idx === 0 && tep.def.connectorOverlays) { + _p.overlays = _p.overlays || []; + Array.prototype.push.apply(_p.overlays, tep.def.connectorOverlays); + } + } + } + }; + + if (_oneElementDef("source", 0, this.sourceEndpointDefinitions, _p.type || "default") === false) { + return; + } + if (_oneElementDef("target", 1, this.targetEndpointDefinitions, _p.type || "default") === false) { + return; + } + + // last, ensure scopes match + if (_p.sourceEndpoint && _p.targetEndpoint) { + if (!_scopeMatch(_p.sourceEndpoint, _p.targetEndpoint)) { + _p = null; + } + } + + return _p; + }.bind(_currentInstance), + + _newConnection = function (params) { + var connectionFunc = _currentInstance.Defaults.ConnectionType || _currentInstance.getDefaultConnectionType(); + + params._jsPlumb = _currentInstance; + params.newConnection = _newConnection; + params.newEndpoint = _newEndpoint; + params.endpointsByUUID = endpointsByUUID; + params.endpointsByElement = endpointsByElement; + params.finaliseConnection = _finaliseConnection; + params.id = "con_" + _idstamp(); + var con = new connectionFunc(params); + + // if the connection is draggable, then maybe we need to tell the target endpoint to init the + // dragging code. it won't run again if it already configured to be draggable. + if (con.isDetachable()) { + con.endpoints[0].initDraggable("_jsPlumbSource"); + con.endpoints[1].initDraggable("_jsPlumbTarget"); + } + + return con; + }, + + // + // adds the connection to the backing model, fires an event if necessary and then redraws + // + _finaliseConnection = _currentInstance.finaliseConnection = function (jpc, params, originalEvent, doInformAnchorManager) { + params = params || {}; + // add to list of connections (by scope). + if (!jpc.suspendedEndpoint) { + connections.push(jpc); + } + + jpc.pending = null; + + // turn off isTemporarySource on the source endpoint (only viable on first draw) + jpc.endpoints[0].isTemporarySource = false; + + // always inform the anchor manager + // except that if jpc has a suspended endpoint it's not true to say the + // connection is new; it has just (possibly) moved. the question is whether + // to make that call here or in the anchor manager. i think perhaps here. + if (doInformAnchorManager !== false) { + _currentInstance.anchorManager.newConnection(jpc); + } + + // force a paint + _draw(jpc.source); + + // fire an event + if (!params.doNotFireConnectionEvent && params.fireEvent !== false) { + + var eventArgs = { + connection: jpc, + source: jpc.source, target: jpc.target, + sourceId: jpc.sourceId, targetId: jpc.targetId, + sourceEndpoint: jpc.endpoints[0], targetEndpoint: jpc.endpoints[1] + }; + + _currentInstance.fire("connection", eventArgs, originalEvent); + } + }, + + /* + factory method to prepare a new endpoint. this should always be used instead of creating Endpoints + manually, since this method attaches event listeners and an id. + */ + _newEndpoint = function (params, id) { + var endpointFunc = _currentInstance.Defaults.EndpointType || jsPlumb.Endpoint; + var _p = jsPlumb.extend({}, params); + //delete _p.label; // not supported by endpoint. + _p._jsPlumb = _currentInstance; + _p.newConnection = _newConnection; + _p.newEndpoint = _newEndpoint; + _p.endpointsByUUID = endpointsByUUID; + _p.endpointsByElement = endpointsByElement; + _p.fireDetachEvent = fireDetachEvent; + _p.elementId = id || _getId(_p.source); + var ep = new endpointFunc(_p); + ep.id = "ep_" + _idstamp(); + _manage(_p.elementId, _p.source); + + if (!jsPlumb.headless) { + _currentInstance.getDragManager().endpointAdded(_p.source, id); + } + + return ep; + }, + + /* + * performs the given function operation on all the connections found + * for the given element id; this means we find all the endpoints for + * the given element, and then for each endpoint find the connectors + * connected to it. then we pass each connection in to the given + * function. + */ + _operation = function (elId, func, endpointFunc) { + var endpoints = endpointsByElement[elId]; + if (endpoints && endpoints.length) { + for (var i = 0, ii = endpoints.length; i < ii; i++) { + for (var j = 0, jj = endpoints[i].connections.length; j < jj; j++) { + var retVal = func(endpoints[i].connections[j]); + // if the function passed in returns true, we exit. + // most functions return false. + if (retVal) { + return; + } + } + if (endpointFunc) { + endpointFunc(endpoints[i]); + } + } + } + }, + + _setDraggable = function (element, draggable) { + return jsPlumb.each(element, function (el) { + if (_currentInstance.isDragSupported(el)) { + draggableStates[_currentInstance.getAttribute(el, "id")] = draggable; + _currentInstance.setElementDraggable(el, draggable); + } + }); + }, + /* + * private method to do the business of hiding/showing. + * + * @param el + * either Id of the element in question or a library specific + * object for the element. + * @param state + * String specifying a value for the css 'display' property + * ('block' or 'none'). + */ + _setVisible = function (el, state, alsoChangeEndpoints) { + state = state === "block"; + var endpointFunc = null; + if (alsoChangeEndpoints) { + endpointFunc = function (ep) { + ep.setVisible(state, true, true); + }; + } + var info = _info(el); + _operation(info.id, function (jpc) { + if (state && alsoChangeEndpoints) { + // this test is necessary because this functionality is new, and i wanted to maintain backwards compatibility. + // this block will only set a connection to be visible if the other endpoint in the connection is also visible. + var oidx = jpc.sourceId === info.id ? 1 : 0; + if (jpc.endpoints[oidx].isVisible()) { + jpc.setVisible(true); + } + } + else { // the default behaviour for show, and what always happens for hide, is to just set the visibility without getting clever. + jpc.setVisible(state); + } + }, endpointFunc); + }, + /** + * private method to do the business of toggling hiding/showing. + */ + _toggleVisible = function (elId, changeEndpoints) { + var endpointFunc = null; + if (changeEndpoints) { + endpointFunc = function (ep) { + var state = ep.isVisible(); + ep.setVisible(!state); + }; + } + _operation(elId, function (jpc) { + var state = jpc.isVisible(); + jpc.setVisible(!state); + }, endpointFunc); + }, + + // TODO comparison performance + _getCachedData = function (elId) { + var o = offsets[elId]; + if (!o) { + return _updateOffset({elId: elId}); + } + else { + return {o: o, s: sizes[elId]}; + } + }, + + /** + * gets an id for the given element, creating and setting one if + * necessary. the id is of the form + * + * jsPlumb__ + * + * where "index in instance" is a monotonically increasing integer that starts at 0, + * for each instance. this method is used not only to assign ids to elements that do not + * have them but also to connections and endpoints. + */ + _getId = function (element, uuid, doNotCreateIfNotFound) { + if (_ju.isString(element)) { + return element; + } + if (element == null) { + return null; + } + var id = _currentInstance.getAttribute(element, "id"); + if (!id || id === "undefined") { + // check if fixed uuid parameter is given + if (arguments.length === 2 && arguments[1] !== undefined) { + id = uuid; + } + else if (arguments.length === 1 || (arguments.length === 3 && !arguments[2])) { + id = "jsPlumb_" + _instanceIndex + "_" + _idstamp(); + } + + if (!doNotCreateIfNotFound) { + _currentInstance.setAttribute(element, "id", id); + } + } + return id; + }; + + this.setConnectionBeingDragged = function (v) { + connectionBeingDragged = v; + }; + this.isConnectionBeingDragged = function () { + return connectionBeingDragged; + }; + + /** + * Returns a map of all the elements this jsPlumbInstance is currently managing. + * @returns {Object} Map of [id-> {el, endpoint[], connection, position}] information. + */ + this.getManagedElements = function() { + return managedElements; + }; + + this.connectorClass = "jtk-connector"; + this.connectorOutlineClass = "jtk-connector-outline"; + this.connectedClass = "jtk-connected"; + this.hoverClass = "jtk-hover"; + this.endpointClass = "jtk-endpoint"; + this.endpointConnectedClass = "jtk-endpoint-connected"; + this.endpointFullClass = "jtk-endpoint-full"; + this.endpointDropAllowedClass = "jtk-endpoint-drop-allowed"; + this.endpointDropForbiddenClass = "jtk-endpoint-drop-forbidden"; + this.overlayClass = "jtk-overlay"; + this.draggingClass = "jtk-dragging";// CONVERTED + this.elementDraggingClass = "jtk-element-dragging";// CONVERTED + this.sourceElementDraggingClass = "jtk-source-element-dragging"; // CONVERTED + this.targetElementDraggingClass = "jtk-target-element-dragging";// CONVERTED + this.endpointAnchorClassPrefix = "jtk-endpoint-anchor"; + this.hoverSourceClass = "jtk-source-hover"; + this.hoverTargetClass = "jtk-target-hover"; + this.dragSelectClass = "jtk-drag-select"; + + this.Anchors = {}; + this.Connectors = { "svg": {} }; + this.Endpoints = { "svg": {} }; + this.Overlays = { "svg": {} } ; + this.ConnectorRenderers = {}; + this.SVG = "svg"; + +// --------------------------- jsPlumbInstance public API --------------------------------------------------------- + + + this.addEndpoint = function (el, params, referenceParams) { + referenceParams = referenceParams || {}; + var p = jsPlumb.extend({}, referenceParams); + jsPlumb.extend(p, params); + p.endpoint = p.endpoint || _currentInstance.Defaults.Endpoint; + p.paintStyle = p.paintStyle || _currentInstance.Defaults.EndpointStyle; + + var results = [], + inputs = (_ju.isArray(el) || (el.length != null && !_ju.isString(el))) ? el : [ el ]; + + for (var i = 0, j = inputs.length; i < j; i++) { + p.source = _currentInstance.getElement(inputs[i]); + _ensureContainer(p.source); + + var id = _getId(p.source), e = _newEndpoint(p, id); + + // ensure element is managed. force a recalc if drawing not suspended, to ensure the cached value is fresh + var myOffset = _manage(id, p.source, null, !_suspendDrawing).info.o; + _ju.addToList(endpointsByElement, id, e); + + if (!_suspendDrawing) { + e.paint({ + anchorLoc: e.anchor.compute({ xy: [ myOffset.left, myOffset.top ], wh: sizes[id], element: e, timestamp: _suspendedAt }), + timestamp: _suspendedAt + }); + } + + results.push(e); + } + + return results.length === 1 ? results[0] : results; + }; + + this.addEndpoints = function (el, endpoints, referenceParams) { + var results = []; + for (var i = 0, j = endpoints.length; i < j; i++) { + var e = _currentInstance.addEndpoint(el, endpoints[i], referenceParams); + if (_ju.isArray(e)) { + Array.prototype.push.apply(results, e); + } + else { + results.push(e); + } + } + return results; + }; + + this.animate = function (el, properties, options) { + if (!this.animationSupported) { + return false; + } + + options = options || {}; + var del = _currentInstance.getElement(el), + id = _getId(del), + stepFunction = jsPlumb.animEvents.step, + completeFunction = jsPlumb.animEvents.complete; + + options[stepFunction] = _ju.wrap(options[stepFunction], function () { + _currentInstance.revalidate(id); + }); + + // onComplete repaints, just to make sure everything looks good at the end of the animation. + options[completeFunction] = _ju.wrap(options[completeFunction], function () { + _currentInstance.revalidate(id); + }); + + _currentInstance.doAnimate(del, properties, options); + }; + + /** + * checks for a listener for the given condition, executing it if found, passing in the given value. + * condition listeners would have been attached using "bind" (which is, you could argue, now overloaded, since + * firing click events etc is a bit different to what this does). i thought about adding a "bindCondition" + * or something, but decided against it, for the sake of simplicity. jsPlumb will never fire one of these + * condition events anyway. + */ + this.checkCondition = function (conditionName, args) { + var l = _currentInstance.getListener(conditionName), + r = true; + + if (l && l.length > 0) { + var values = Array.prototype.slice.call(arguments, 1); + try { + for (var i = 0, j = l.length; i < j; i++) { + r = r && l[i].apply(l[i], values); + } + } + catch (e) { + _ju.log(_currentInstance, "cannot check condition [" + conditionName + "]" + e); + } + } + return r; + }; + + this.connect = function (params, referenceParams) { + // prepare a final set of parameters to create connection with + var _p = _prepareConnectionParams(params, referenceParams), jpc; + // TODO probably a nicer return value if the connection was not made. _prepareConnectionParams + // will return null (and log something) if either endpoint was full. what would be nicer is to + // create a dedicated 'error' object. + if (_p) { + if (_p.source == null && _p.sourceEndpoint == null) { + _ju.log("Cannot establish connection - source does not exist"); + return; + } + if (_p.target == null && _p.targetEndpoint == null) { + _ju.log("Cannot establish connection - target does not exist"); + return; + } + _ensureContainer(_p.source); + // create the connection. it is not yet registered + jpc = _newConnection(_p); + // now add it the model, fire an event, and redraw + _finaliseConnection(jpc, _p); + } + return jpc; + }; + + var stTypes = [ + { el: "source", elId: "sourceId", epDefs: "sourceEndpointDefinitions" }, + { el: "target", elId: "targetId", epDefs: "targetEndpointDefinitions" } + ]; + + var _set = function (c, el, idx, doNotRepaint) { + var ep, _st = stTypes[idx], cId = c[_st.elId], cEl = c[_st.el], sid, sep, + oldEndpoint = c.endpoints[idx]; + + var evtParams = { + index: idx, + originalSourceId: idx === 0 ? cId : c.sourceId, + newSourceId: c.sourceId, + originalTargetId: idx === 1 ? cId : c.targetId, + newTargetId: c.targetId, + connection: c + }; + + if (el.constructor === jsPlumb.Endpoint) { + ep = el; + ep.addConnection(c); + el = ep.element; + } + else { + sid = _getId(el); + sep = this[_st.epDefs][sid]; + + if (sid === c[_st.elId]) { + ep = null; // dont change source/target if the element is already the one given. + } + else if (sep) { + for (var t in sep) { + if (!sep[t].enabled) { + return; + } + ep = sep[t].endpoint != null && sep[t].endpoint._jsPlumb ? sep[t].endpoint : this.addEndpoint(el, sep[t].def); + if (sep[t].uniqueEndpoint) { + sep[t].endpoint = ep; + } + ep.addConnection(c); + } + } + else { + ep = c.makeEndpoint(idx === 0, el, sid); + } + } + + if (ep != null) { + oldEndpoint.detachFromConnection(c); + c.endpoints[idx] = ep; + c[_st.el] = ep.element; + c[_st.elId] = ep.elementId; + evtParams[idx === 0 ? "newSourceId" : "newTargetId"] = ep.elementId; + + fireMoveEvent(evtParams); + + if (!doNotRepaint) { + c.repaint(); + } + } + + evtParams.element = el; + return evtParams; + + }.bind(this); + + this.setSource = function (connection, el, doNotRepaint) { + var p = _set(connection, el, 0, doNotRepaint); + this.anchorManager.sourceChanged(p.originalSourceId, p.newSourceId, connection, p.el); + }; + this.setTarget = function (connection, el, doNotRepaint) { + var p = _set(connection, el, 1, doNotRepaint); + this.anchorManager.updateOtherEndpoint(p.originalSourceId, p.originalTargetId, p.newTargetId, connection); + }; + + this.deleteEndpoint = function (object, dontUpdateHover, deleteAttachedObjects) { + var endpoint = (typeof object === "string") ? endpointsByUUID[object] : object; + if (endpoint) { + _currentInstance.deleteObject({ endpoint: endpoint, dontUpdateHover: dontUpdateHover, deleteAttachedObjects:deleteAttachedObjects }); + } + return _currentInstance; + }; + + this.deleteEveryEndpoint = function () { + var _is = _currentInstance.setSuspendDrawing(true); + for (var id in endpointsByElement) { + var endpoints = endpointsByElement[id]; + if (endpoints && endpoints.length) { + for (var i = 0, j = endpoints.length; i < j; i++) { + _currentInstance.deleteEndpoint(endpoints[i], true); + } + } + } + endpointsByElement = {}; + managedElements = {}; + endpointsByUUID = {}; + offsets = {}; + offsetTimestamps = {}; + _currentInstance.anchorManager.reset(); + var dm = _currentInstance.getDragManager(); + if (dm) { + dm.reset(); + } + if (!_is) { + _currentInstance.setSuspendDrawing(false); + } + return _currentInstance; + }; + + var fireDetachEvent = function (jpc, doFireEvent, originalEvent) { + // may have been given a connection, or in special cases, an object + var connType = _currentInstance.Defaults.ConnectionType || _currentInstance.getDefaultConnectionType(), + argIsConnection = jpc.constructor === connType, + params = argIsConnection ? { + connection: jpc, + source: jpc.source, target: jpc.target, + sourceId: jpc.sourceId, targetId: jpc.targetId, + sourceEndpoint: jpc.endpoints[0], targetEndpoint: jpc.endpoints[1] + } : jpc; + + if (doFireEvent) { + _currentInstance.fire("connectionDetached", params, originalEvent); + } + + // always fire this. used by internal jsplumb stuff. + _currentInstance.fire("internal.connectionDetached", params, originalEvent); + + _currentInstance.anchorManager.connectionDetached(params); + }; + + var fireMoveEvent = _currentInstance.fireMoveEvent = function (params, evt) { + _currentInstance.fire("connectionMoved", params, evt); + }; + + this.unregisterEndpoint = function (endpoint) { + if (endpoint._jsPlumb.uuid) { + endpointsByUUID[endpoint._jsPlumb.uuid] = null; + } + _currentInstance.anchorManager.deleteEndpoint(endpoint); + // TODO at least replace this with a removeWithFunction call. + for (var e in endpointsByElement) { + var endpoints = endpointsByElement[e]; + if (endpoints) { + var newEndpoints = []; + for (var i = 0, j = endpoints.length; i < j; i++) { + if (endpoints[i] !== endpoint) { + newEndpoints.push(endpoints[i]); + } + } + + endpointsByElement[e] = newEndpoints; + } + if (endpointsByElement[e].length < 1) { + delete endpointsByElement[e]; + } + } + }; + + var IS_DETACH_ALLOWED = "isDetachAllowed"; + var BEFORE_DETACH = "beforeDetach"; + var CHECK_CONDITION = "checkCondition"; + + /** + * Deletes a Connection. + * @method deleteConnection + * @param connection Connection to delete + * @param {Object} [params] Optional delete parameters + * @param {Boolean} [params.doNotFireEvent=false] If true, a connection detached event will not be fired. Otherwise one will. + * @param {Boolean} [params.force=false] If true, the connection will be deleted even if a beforeDetach interceptor tries to stop the deletion. + * @returns {Boolean} True if the connection was deleted, false otherwise. + */ + this.deleteConnection = function(connection, params) { + + if (connection != null) { + params = params || {}; + + if (params.force || _ju.functionChain(true, false, [ + [ connection.endpoints[0], IS_DETACH_ALLOWED, [ connection ] ], + [ connection.endpoints[1], IS_DETACH_ALLOWED, [ connection ] ], + [ connection, IS_DETACH_ALLOWED, [ connection ] ], + [ _currentInstance, CHECK_CONDITION, [ BEFORE_DETACH, connection ] ] + ])) { + + connection.setHover(false); + fireDetachEvent(connection, !connection.pending && params.fireEvent !== false, params.originalEvent); + + connection.endpoints[0].detachFromConnection(connection); + connection.endpoints[1].detachFromConnection(connection); + _ju.removeWithFunction(connections, function (_c) { + return connection.id === _c.id; + }); + + connection.cleanup(); + connection.destroy(); + return true; + } + } + return false; + }; + + /** + * Remove all Connections from all elements, but leaves Endpoints in place ((unless a connection is set to auto delete its Endpoints). + * @method deleteEveryConnection + * @param {Object} [params] optional params object for the call + * @param {Boolean} [params.fireEvent=true] Whether or not to fire detach events + * @param {Boolean} [params.forceDetach=false] If true, this call will ignore any `beforeDetach` interceptors. + * @returns {Number} The number of connections that were deleted. + */ + this.deleteEveryConnection = function (params) { + params = params || {}; + var count = connections.length, deletedCount = 0; + _currentInstance.batch(function () { + for (var i = 0; i < count; i++) { + deletedCount += _currentInstance.deleteConnection(connections[0], params) ? 1 : 0; + } + }); + return deletedCount; + }; + + /** + * Removes all an element's Connections. + * @method deleteConnectionsForElement + * @param {Object} el Either the id of the element, or a selector for the element. + * @param {Object} [params] Optional parameters. + * @param {Boolean} [params.fireEvent=true] Whether or not to fire the detach event. + * @param {Boolean} [params.forceDetach=false] If true, this call will ignore any `beforeDetach` interceptors. + * @return {jsPlumbInstance} The current jsPlumb instance. + */ + this.deleteConnectionsForElement = function (el, params) { + params = params || {}; + el = _currentInstance.getElement(el); + var id = _getId(el), endpoints = endpointsByElement[id]; + if (endpoints && endpoints.length) { + for (var i = 0, j = endpoints.length; i < j; i++) { + endpoints[i].deleteEveryConnection(params); + } + } + return _currentInstance; + }; + + /// not public. but of course its exposed. how to change this. + this.deleteObject = function (params) { + var result = { + endpoints: {}, + connections: {}, + endpointCount: 0, + connectionCount: 0 + }, + deleteAttachedObjects = params.deleteAttachedObjects !== false; + + var unravelConnection = function (connection) { + if (connection != null && result.connections[connection.id] == null) { + if (!params.dontUpdateHover && connection._jsPlumb != null) { + connection.setHover(false); + } + result.connections[connection.id] = connection; + result.connectionCount++; + } + }; + var unravelEndpoint = function (endpoint) { + if (endpoint != null && result.endpoints[endpoint.id] == null) { + if (!params.dontUpdateHover && endpoint._jsPlumb != null) { + endpoint.setHover(false); + } + result.endpoints[endpoint.id] = endpoint; + result.endpointCount++; + + if (deleteAttachedObjects) { + for (var i = 0; i < endpoint.connections.length; i++) { + var c = endpoint.connections[i]; + unravelConnection(c); + } + } + } + }; + + if (params.connection) { + unravelConnection(params.connection); + } + else { + unravelEndpoint(params.endpoint); + } + + // loop through connections + for (var i in result.connections) { + var c = result.connections[i]; + if (c._jsPlumb) { + _ju.removeWithFunction(connections, function (_c) { + return c.id === _c.id; + }); + + fireDetachEvent(c, params.fireEvent === false ? false : !c.pending, params.originalEvent); + var doNotCleanup = params.deleteAttachedObjects == null ? null : !params.deleteAttachedObjects; + + c.endpoints[0].detachFromConnection(c, null, doNotCleanup); + c.endpoints[1].detachFromConnection(c, null, doNotCleanup); + + c.cleanup(true); + c.destroy(true); + } + } + + // loop through endpoints + for (var j in result.endpoints) { + var e = result.endpoints[j]; + if (e._jsPlumb) { + _currentInstance.unregisterEndpoint(e); + // FIRE some endpoint deleted event? + e.cleanup(true); + e.destroy(true); + } + } + + return result; + }; + + + // helpers for select/selectEndpoints + var _setOperation = function (list, func, args, selector) { + for (var i = 0, j = list.length; i < j; i++) { + list[i][func].apply(list[i], args); + } + return selector(list); + }, + _getOperation = function (list, func, args) { + var out = []; + for (var i = 0, j = list.length; i < j; i++) { + out.push([ list[i][func].apply(list[i], args), list[i] ]); + } + return out; + }, + setter = function (list, func, selector) { + return function () { + return _setOperation(list, func, arguments, selector); + }; + }, + getter = function (list, func) { + return function () { + return _getOperation(list, func, arguments); + }; + }, + prepareList = function (input, doNotGetIds) { + var r = []; + if (input) { + if (typeof input === 'string') { + if (input === "*") { + return input; + } + r.push(input); + } + else { + if (doNotGetIds) { + r = input; + } + else { + if (input.length) { + for (var i = 0, j = input.length; i < j; i++) { + r.push(_info(input[i]).id); + } + } + else { + r.push(_info(input).id); + } + } + } + } + return r; + }, + filterList = function (list, value, missingIsFalse) { + if (list === "*") { + return true; + } + return list.length > 0 ? list.indexOf(value) !== -1 : !missingIsFalse; + }; + + // get some connections, specifying source/target/scope + this.getConnections = function (options, flat) { + if (!options) { + options = {}; + } else if (options.constructor === String) { + options = { "scope": options }; + } + var scope = options.scope || _currentInstance.getDefaultScope(), + scopes = prepareList(scope, true), + sources = prepareList(options.source), + targets = prepareList(options.target), + results = (!flat && scopes.length > 1) ? {} : [], + _addOne = function (scope, obj) { + if (!flat && scopes.length > 1) { + var ss = results[scope]; + if (ss == null) { + ss = results[scope] = []; + } + ss.push(obj); + } else { + results.push(obj); + } + }; + + for (var j = 0, jj = connections.length; j < jj; j++) { + var c = connections[j], + sourceId = c.proxies && c.proxies[0] ? c.proxies[0].originalEp.elementId : c.sourceId, + targetId = c.proxies && c.proxies[1] ? c.proxies[1].originalEp.elementId : c.targetId; + + if (filterList(scopes, c.scope) && filterList(sources, sourceId) && filterList(targets, targetId)) { + _addOne(c.scope, c); + } + } + + return results; + }; + + var _curryEach = function (list, executor) { + return function (f) { + for (var i = 0, ii = list.length; i < ii; i++) { + f(list[i]); + } + return executor(list); + }; + }, + _curryGet = function (list) { + return function (idx) { + return list[idx]; + }; + }; + + var _makeCommonSelectHandler = function (list, executor) { + var out = { + length: list.length, + each: _curryEach(list, executor), + get: _curryGet(list) + }, + setters = ["setHover", "removeAllOverlays", "setLabel", "addClass", "addOverlay", "removeOverlay", + "removeOverlays", "showOverlay", "hideOverlay", "showOverlays", "hideOverlays", "setPaintStyle", + "setHoverPaintStyle", "setSuspendEvents", "setParameter", "setParameters", "setVisible", + "repaint", "addType", "toggleType", "removeType", "removeClass", "setType", "bind", "unbind" ], + + getters = ["getLabel", "getOverlay", "isHover", "getParameter", "getParameters", "getPaintStyle", + "getHoverPaintStyle", "isVisible", "hasType", "getType", "isSuspendEvents" ], + i, ii; + + for (i = 0, ii = setters.length; i < ii; i++) { + out[setters[i]] = setter(list, setters[i], executor); + } + + for (i = 0, ii = getters.length; i < ii; i++) { + out[getters[i]] = getter(list, getters[i]); + } + + return out; + }; + + var _makeConnectionSelectHandler = function (list) { + var common = _makeCommonSelectHandler(list, _makeConnectionSelectHandler); + return jsPlumb.extend(common, { + // setters + setDetachable: setter(list, "setDetachable", _makeConnectionSelectHandler), + setReattach: setter(list, "setReattach", _makeConnectionSelectHandler), + setConnector: setter(list, "setConnector", _makeConnectionSelectHandler), + delete: function () { + for (var i = 0, ii = list.length; i < ii; i++) { + _currentInstance.deleteConnection(list[i]); + } + }, + // getters + isDetachable: getter(list, "isDetachable"), + isReattach: getter(list, "isReattach") + }); + }; + + var _makeEndpointSelectHandler = function (list) { + var common = _makeCommonSelectHandler(list, _makeEndpointSelectHandler); + return jsPlumb.extend(common, { + setEnabled: setter(list, "setEnabled", _makeEndpointSelectHandler), + setAnchor: setter(list, "setAnchor", _makeEndpointSelectHandler), + isEnabled: getter(list, "isEnabled"), + deleteEveryConnection: function () { + for (var i = 0, ii = list.length; i < ii; i++) { + list[i].deleteEveryConnection(); + } + }, + "delete": function () { + for (var i = 0, ii = list.length; i < ii; i++) { + _currentInstance.deleteEndpoint(list[i]); + } + } + }); + }; + + this.select = function (params) { + params = params || {}; + params.scope = params.scope || "*"; + return _makeConnectionSelectHandler(params.connections || _currentInstance.getConnections(params, true)); + }; + + this.selectEndpoints = function (params) { + params = params || {}; + params.scope = params.scope || "*"; + var noElementFilters = !params.element && !params.source && !params.target, + elements = noElementFilters ? "*" : prepareList(params.element), + sources = noElementFilters ? "*" : prepareList(params.source), + targets = noElementFilters ? "*" : prepareList(params.target), + scopes = prepareList(params.scope, true); + + var ep = []; + + for (var el in endpointsByElement) { + var either = filterList(elements, el, true), + source = filterList(sources, el, true), + sourceMatchExact = sources !== "*", + target = filterList(targets, el, true), + targetMatchExact = targets !== "*"; + + // if they requested 'either' then just match scope. otherwise if they requested 'source' (not as a wildcard) then we have to match only endpoints that have isSource set to to true, and the same thing with isTarget. + if (either || source || target) { + inner: + for (var i = 0, ii = endpointsByElement[el].length; i < ii; i++) { + var _ep = endpointsByElement[el][i]; + if (filterList(scopes, _ep.scope, true)) { + + var noMatchSource = (sourceMatchExact && sources.length > 0 && !_ep.isSource), + noMatchTarget = (targetMatchExact && targets.length > 0 && !_ep.isTarget); + + if (noMatchSource || noMatchTarget) { + continue inner; + } + + ep.push(_ep); + } + } + } + } + + return _makeEndpointSelectHandler(ep); + }; + + // get all connections managed by the instance of jsplumb. + this.getAllConnections = function () { + return connections; + }; + this.getDefaultScope = function () { + return DEFAULT_SCOPE; + }; + // get an endpoint by uuid. + this.getEndpoint = _getEndpoint; + /** + * Gets the list of Endpoints for a given element. + * @method getEndpoints + * @param {String|Element|Selector} el The element to get endpoints for. + * @return {Endpoint[]} An array of Endpoints for the specified element. + */ + this.getEndpoints = function (el) { + return endpointsByElement[_info(el).id] || []; + }; + // gets the default endpoint type. used when subclassing. see wiki. + this.getDefaultEndpointType = function () { + return jsPlumb.Endpoint; + }; + // gets the default connection type. used when subclassing. see wiki. + this.getDefaultConnectionType = function () { + return jsPlumb.Connection; + }; + /* + * Gets an element's id, creating one if necessary. really only exposed + * for the lib-specific functionality to access; would be better to pass + * the current instance into the lib-specific code (even though this is + * a static call. i just don't want to expose it to the public API). + */ + this.getId = _getId; + this.draw = _draw; + this.info = _info; + + this.appendElement = _appendElement; + + var _hoverSuspended = false; + this.isHoverSuspended = function () { + return _hoverSuspended; + }; + this.setHoverSuspended = function (s) { + _hoverSuspended = s; + }; + + // set an element's connections to be hidden + this.hide = function (el, changeEndpoints) { + _setVisible(el, "none", changeEndpoints); + return _currentInstance; + }; + + // exposed for other objects to use to get a unique id. + this.idstamp = _idstamp; + + // ensure that, if the current container exists, it is a DOM element and not a selector. + // if it does not exist and `candidate` is supplied, the offset parent of that element will be set as the Container. + // this is used to do a better default behaviour for the case that the user has not set a container: + // addEndpoint, makeSource, makeTarget and connect all call this method with the offsetParent of the + // element in question (for connect it is the source element). So if no container is set, it is inferred + // to be the offsetParent of the first element the user tries to connect. + var _ensureContainer = function (candidate) { + if (!_container && candidate) { + var can = _currentInstance.getElement(candidate); + if (can.offsetParent) { + _currentInstance.setContainer(can.offsetParent); + } + } + }; + + var _getContainerFromDefaults = function () { + if (_currentInstance.Defaults.Container) { + _currentInstance.setContainer(_currentInstance.Defaults.Container); + } + }; + + // check if a given element is managed or not. if not, add to our map. if drawing is not suspended then + // we'll also stash its dimensions; otherwise we'll do this in a lazy way through updateOffset. + var _manage = _currentInstance.manage = function (id, element, _transient, _recalc) { + if (!managedElements[id]) { + managedElements[id] = { + el: element, + endpoints: [], + connections: [] + }; + + managedElements[id].info = _updateOffset({ elId: id, timestamp: _suspendedAt }); + _currentInstance.addClass(element, "jtk-managed"); + + if (!_transient) { + _currentInstance.fire("manageElement", { id:id, info:managedElements[id].info, el:element }); + } + } else { + if (_recalc) { + managedElements[id].info = _updateOffset({ elId: id, timestamp: _suspendedAt, recalc:true }); + } + } + + return managedElements[id]; + }; + + var _unmanage = _currentInstance.unmanage = function(id) { + if (managedElements[id]) { + var el = managedElements[id].el; + _currentInstance.removeClass(el, "jtk-managed"); + delete managedElements[id]; + _currentInstance.fire("unmanageElement", {id:id, el:el}); + } + }; + + /** + * updates the offset and size for a given element, and stores the + * values. if 'offset' is not null we use that (it would have been + * passed in from a drag call) because it's faster; but if it is null, + * or if 'recalc' is true in order to force a recalculation, we get the current values. + * @method updateOffset + */ + var _updateOffset = function (params) { + + var timestamp = params.timestamp, recalc = params.recalc, offset = params.offset, elId = params.elId, s; + if (_suspendDrawing && !timestamp) { + timestamp = _suspendedAt; + } + if (!recalc) { + if (timestamp && timestamp === offsetTimestamps[elId]) { + return {o: params.offset || offsets[elId], s: sizes[elId]}; + } + } + if (recalc || (!offset && offsets[elId] == null)) { // if forced repaint or no offset available, we recalculate. + + // get the current size and offset, and store them + s = managedElements[elId] ? managedElements[elId].el : null; + if (s != null) { + sizes[elId] = _currentInstance.getSize(s); + offsets[elId] = _currentInstance.getOffset(s); + offsetTimestamps[elId] = timestamp; + } + } else { + offsets[elId] = offset || offsets[elId]; + if (sizes[elId] == null) { + s = managedElements[elId].el; + if (s != null) { + sizes[elId] = _currentInstance.getSize(s); + } + } + offsetTimestamps[elId] = timestamp; + } + + if (offsets[elId] && !offsets[elId].right) { + offsets[elId].right = offsets[elId].left + sizes[elId][0]; + offsets[elId].bottom = offsets[elId].top + sizes[elId][1]; + offsets[elId].width = sizes[elId][0]; + offsets[elId].height = sizes[elId][1]; + offsets[elId].centerx = offsets[elId].left + (offsets[elId].width / 2); + offsets[elId].centery = offsets[elId].top + (offsets[elId].height / 2); + } + + return {o: offsets[elId], s: sizes[elId]}; + }; + + this.updateOffset = _updateOffset; + + /** + * callback from the current library to tell us to prepare ourselves (attach + * mouse listeners etc; can't do that until the library has provided a bind method) + */ + this.init = function () { + if (!initialized) { + _getContainerFromDefaults(); + _currentInstance.anchorManager = new root.jsPlumb.AnchorManager({jsPlumbInstance: _currentInstance}); + initialized = true; + _currentInstance.fire("ready", _currentInstance); + } + }.bind(this); + + this.log = log; + this.jsPlumbUIComponent = jsPlumbUIComponent; + + /* + * Creates an anchor with the given params. + * + * + * Returns: The newly created Anchor. + * Throws: an error if a named anchor was not found. + */ + this.makeAnchor = function () { + var pp, _a = function (t, p) { + if (root.jsPlumb.Anchors[t]) { + return new root.jsPlumb.Anchors[t](p); + } + if (!_currentInstance.Defaults.DoNotThrowErrors) { + throw { msg: "jsPlumb: unknown anchor type '" + t + "'" }; + } + }; + if (arguments.length === 0) { + return null; + } + var specimen = arguments[0], elementId = arguments[1], jsPlumbInstance = arguments[2], newAnchor = null; + // if it appears to be an anchor already... + if (specimen.compute && specimen.getOrientation) { + return specimen; + } //TODO hazy here about whether it should be added or is already added somehow. + // is it the name of an anchor type? + else if (typeof specimen === "string") { + newAnchor = _a(arguments[0], {elementId: elementId, jsPlumbInstance: _currentInstance}); + } + // is it an array? it will be one of: + // an array of [spec, params] - this defines a single anchor, which may be dynamic, but has parameters. + // an array of arrays - this defines some dynamic anchors + // an array of numbers - this defines a single anchor. + else if (_ju.isArray(specimen)) { + if (_ju.isArray(specimen[0]) || _ju.isString(specimen[0])) { + // if [spec, params] format + if (specimen.length === 2 && _ju.isObject(specimen[1])) { + // if first arg is a string, its a named anchor with params + if (_ju.isString(specimen[0])) { + pp = root.jsPlumb.extend({elementId: elementId, jsPlumbInstance: _currentInstance}, specimen[1]); + newAnchor = _a(specimen[0], pp); + } + // otherwise first arg is array, second is params. we treat as a dynamic anchor, which is fine + // even if the first arg has only one entry. you could argue all anchors should be implicitly dynamic in fact. + else { + pp = root.jsPlumb.extend({elementId: elementId, jsPlumbInstance: _currentInstance, anchors: specimen[0]}, specimen[1]); + newAnchor = new root.jsPlumb.DynamicAnchor(pp); + } + } + else { + newAnchor = new jsPlumb.DynamicAnchor({anchors: specimen, selector: null, elementId: elementId, jsPlumbInstance: _currentInstance}); + } + + } + else { + var anchorParams = { + x: specimen[0], y: specimen[1], + orientation: (specimen.length >= 4) ? [ specimen[2], specimen[3] ] : [0, 0], + offsets: (specimen.length >= 6) ? [ specimen[4], specimen[5] ] : [ 0, 0 ], + elementId: elementId, + jsPlumbInstance: _currentInstance, + cssClass: specimen.length === 7 ? specimen[6] : null + }; + newAnchor = new root.jsPlumb.Anchor(anchorParams); + newAnchor.clone = function () { + return new root.jsPlumb.Anchor(anchorParams); + }; + } + } + + if (!newAnchor.id) { + newAnchor.id = "anchor_" + _idstamp(); + } + return newAnchor; + }; + + /** + * makes a list of anchors from the given list of types or coords, eg + * ["TopCenter", "RightMiddle", "BottomCenter", [0, 1, -1, -1] ] + */ + this.makeAnchors = function (types, elementId, jsPlumbInstance) { + var r = []; + for (var i = 0, ii = types.length; i < ii; i++) { + if (typeof types[i] === "string") { + r.push(root.jsPlumb.Anchors[types[i]]({elementId: elementId, jsPlumbInstance: jsPlumbInstance})); + } + else if (_ju.isArray(types[i])) { + r.push(_currentInstance.makeAnchor(types[i], elementId, jsPlumbInstance)); + } + } + return r; + }; + + /** + * Makes a dynamic anchor from the given list of anchors (which may be in shorthand notation as strings or dimension arrays, or Anchor + * objects themselves) and the given, optional, anchorSelector function (jsPlumb uses a default if this is not provided; most people will + * not need to provide this - i think). + */ + this.makeDynamicAnchor = function (anchors, anchorSelector) { + return new root.jsPlumb.DynamicAnchor({anchors: anchors, selector: anchorSelector, elementId: null, jsPlumbInstance: _currentInstance}); + }; + +// --------------------- makeSource/makeTarget ---------------------------------------------- + + this.targetEndpointDefinitions = {}; + this.sourceEndpointDefinitions = {}; + + var selectorFilter = function (evt, _el, selector, _instance, negate) { + var t = evt.target || evt.srcElement, ok = false, + sel = _instance.getSelector(_el, selector); + for (var j = 0; j < sel.length; j++) { + if (sel[j] === t) { + ok = true; + break; + } + } + return negate ? !ok : ok; + }; + + var _makeElementDropHandler = function (elInfo, p, dropOptions, isSource, isTarget) { + var proxyComponent = new jsPlumbUIComponent(p); + var _drop = p._jsPlumb.EndpointDropHandler({ + jsPlumb: _currentInstance, + enabled: function () { + return elInfo.def.enabled; + }, + isFull: function () { + var targetCount = _currentInstance.select({target: elInfo.id}).length; + return elInfo.def.maxConnections > 0 && targetCount >= elInfo.def.maxConnections; + }, + element: elInfo.el, + elementId: elInfo.id, + isSource: isSource, + isTarget: isTarget, + addClass: function (clazz) { + _currentInstance.addClass(elInfo.el, clazz); + }, + removeClass: function (clazz) { + _currentInstance.removeClass(elInfo.el, clazz); + }, + onDrop: function (jpc) { + var source = jpc.endpoints[0]; + source.anchor.unlock(); + }, + isDropAllowed: function () { + return proxyComponent.isDropAllowed.apply(proxyComponent, arguments); + }, + isRedrop:function(jpc) { + return (jpc.suspendedElement != null && jpc.suspendedEndpoint != null && jpc.suspendedEndpoint.element === elInfo.el); + }, + getEndpoint: function (jpc) { + + // make a new Endpoint for the target, or get it from the cache if uniqueEndpoint + // is set. if its a redrop the new endpoint will be immediately cleaned up. + + var newEndpoint = elInfo.def.endpoint; + + // if no cached endpoint, or there was one but it has been cleaned up + // (ie. detached), create a new one + if (newEndpoint == null || newEndpoint._jsPlumb == null) { + var eps = _currentInstance.deriveEndpointAndAnchorSpec(jpc.getType().join(" "), true); + var pp = eps.endpoints ? root.jsPlumb.extend(p, { + endpoint:elInfo.def.def.endpoint || eps.endpoints[1] + }) :p; + if (eps.anchors) { + pp = root.jsPlumb.extend(pp, { + anchor:elInfo.def.def.anchor || eps.anchors[1] + }); + } + newEndpoint = _currentInstance.addEndpoint(elInfo.el, pp); + newEndpoint._mtNew = true; + } + + if (p.uniqueEndpoint) { + elInfo.def.endpoint = newEndpoint; + } + + newEndpoint.setDeleteOnEmpty(true); + + // if connection is detachable, init the new endpoint to be draggable, to support that happening. + if (jpc.isDetachable()) { + newEndpoint.initDraggable(); + } + + // if the anchor has a 'positionFinder' set, then delegate to that function to find + // out where to locate the anchor. + if (newEndpoint.anchor.positionFinder != null) { + var dropPosition = _currentInstance.getUIPosition(arguments, _currentInstance.getZoom()), + elPosition = _currentInstance.getOffset(elInfo.el), + elSize = _currentInstance.getSize(elInfo.el), + ap = dropPosition == null ? [0,0] : newEndpoint.anchor.positionFinder(dropPosition, elPosition, elSize, newEndpoint.anchor.constructorParams); + + newEndpoint.anchor.x = ap[0]; + newEndpoint.anchor.y = ap[1]; + // now figure an orientation for it..kind of hard to know what to do actually. probably the best thing i can do is to + // support specifying an orientation in the anchor's spec. if one is not supplied then i will make the orientation + // be what will cause the most natural link to the source: it will be pointing at the source, but it needs to be + // specified in one axis only, and so how to make that choice? i think i will use whichever axis is the one in which + // the target is furthest away from the source. + } + + return newEndpoint; + }, + maybeCleanup: function (ep) { + if (ep._mtNew && ep.connections.length === 0) { + _currentInstance.deleteObject({endpoint: ep}); + } + else { + delete ep._mtNew; + } + } + }); + + // wrap drop events as needed and initialise droppable + var dropEvent = root.jsPlumb.dragEvents.drop; + dropOptions.scope = dropOptions.scope || (p.scope || _currentInstance.Defaults.Scope); + dropOptions[dropEvent] = _ju.wrap(dropOptions[dropEvent], _drop, true); + dropOptions.rank = p.rank || 0; + + // if target, return true from the over event. this will cause katavorio to stop setting drops to hover + // if multipleDrop is set to false. + if (isTarget) { + dropOptions[root.jsPlumb.dragEvents.over] = function () { return true; }; + } + + // vanilla jsplumb only + if (p.allowLoopback === false) { + dropOptions.canDrop = function (_drag) { + var de = _drag.getDragElement()._jsPlumbRelatedElement; + return de !== elInfo.el; + }; + } + _currentInstance.initDroppable(elInfo.el, dropOptions, "internal"); + + return _drop; + + }; + + // see API docs + this.makeTarget = function (el, params, referenceParams) { + + // put jsplumb ref into params without altering the params passed in + var p = root.jsPlumb.extend({_jsPlumb: this}, referenceParams); + root.jsPlumb.extend(p, params); + + var maxConnections = p.maxConnections || -1, + + _doOne = function (el) { + + // get the element's id and store the endpoint definition for it. jsPlumb.connect calls will look for one of these, + // and use the endpoint definition if found. + // decode the info for this element (id and element) + var elInfo = _info(el), + elid = elInfo.id, + dropOptions = root.jsPlumb.extend({}, p.dropOptions || {}), + type = p.connectionType || "default"; + + this.targetEndpointDefinitions[elid] = this.targetEndpointDefinitions[elid] || {}; + + _ensureContainer(elid); + + // if this is a group and the user has not mandated a rank, set to -1 so that Nodes takes + // precedence. + if (elInfo.el._isJsPlumbGroup && dropOptions.rank == null) { + dropOptions.rank = -1; + } + + // store the definition + var _def = { + def: root.jsPlumb.extend({}, p), + uniqueEndpoint: p.uniqueEndpoint, + maxConnections: maxConnections, + enabled: true + }; + + if (p.createEndpoint) { + _def.uniqueEndpoint = true; + _def.endpoint = _currentInstance.addEndpoint(el, _def.def); + _def.endpoint.setDeleteOnEmpty(false); + } + + elInfo.def = _def; + this.targetEndpointDefinitions[elid][type] = _def; + _makeElementDropHandler(elInfo, p, dropOptions, p.isSource === true, true); + // stash the definition on the drop + elInfo.el._katavorioDrop[elInfo.el._katavorioDrop.length - 1].targetDef = _def; + + }.bind(this); + + // make an array if only given one element + var inputs = el.length && el.constructor !== String ? el : [ el ]; + + // register each one in the list. + for (var i = 0, ii = inputs.length; i < ii; i++) { + _doOne(inputs[i]); + } + + return this; + }; + + // see api docs + this.unmakeTarget = function (el, doNotClearArrays) { + var info = _info(el); + _currentInstance.destroyDroppable(info.el, "internal"); + if (!doNotClearArrays) { + delete this.targetEndpointDefinitions[info.id]; + } + + return this; + }; + + // see api docs + this.makeSource = function (el, params, referenceParams) { + var p = root.jsPlumb.extend({_jsPlumb: this}, referenceParams); + root.jsPlumb.extend(p, params); + var type = p.connectionType || "default"; + var aae = _currentInstance.deriveEndpointAndAnchorSpec(type); + p.endpoint = p.endpoint || aae.endpoints[0]; + p.anchor = p.anchor || aae.anchors[0]; + var maxConnections = p.maxConnections || -1, + onMaxConnections = p.onMaxConnections, + _doOne = function (elInfo) { + // get the element's id and store the endpoint definition for it. jsPlumb.connect calls will look for one of these, + // and use the endpoint definition if found. + var elid = elInfo.id, + _del = this.getElement(elInfo.el); + + this.sourceEndpointDefinitions[elid] = this.sourceEndpointDefinitions[elid] || {}; + _ensureContainer(elid); + + var _def = { + def:root.jsPlumb.extend({}, p), + uniqueEndpoint: p.uniqueEndpoint, + maxConnections: maxConnections, + enabled: true + }; + + if (p.createEndpoint) { + _def.uniqueEndpoint = true; + _def.endpoint = _currentInstance.addEndpoint(el, _def.def); + _def.endpoint.setDeleteOnEmpty(false); + } + + this.sourceEndpointDefinitions[elid][type] = _def; + elInfo.def = _def; + + var stopEvent = root.jsPlumb.dragEvents.stop, + dragEvent = root.jsPlumb.dragEvents.drag, + dragOptions = root.jsPlumb.extend({ }, p.dragOptions || {}), + existingDrag = dragOptions.drag, + existingStop = dragOptions.stop, + ep = null, + endpointAddedButNoDragYet = false; + + // set scope if its not set in dragOptions but was passed in in params + dragOptions.scope = dragOptions.scope || p.scope; + + dragOptions[dragEvent] = _ju.wrap(dragOptions[dragEvent], function () { + if (existingDrag) { + existingDrag.apply(this, arguments); + } + endpointAddedButNoDragYet = false; + }); + + dragOptions[stopEvent] = _ju.wrap(dragOptions[stopEvent], function () { + + if (existingStop) { + existingStop.apply(this, arguments); + } + this.currentlyDragging = false; + if (ep._jsPlumb != null) { // if not cleaned up... + + // reset the anchor to the anchor that was initially provided. the one we were using to drag + // the connection was just a placeholder that was located at the place the user pressed the + // mouse button to initiate the drag. + var anchorDef = p.anchor || this.Defaults.Anchor, + oldAnchor = ep.anchor, + oldConnection = ep.connections[0]; + + var newAnchor = this.makeAnchor(anchorDef, elid, this), + _el = ep.element; + + // if the anchor has a 'positionFinder' set, then delegate to that function to find + // out where to locate the anchor. issue 117. + if (newAnchor.positionFinder != null) { + var elPosition = _currentInstance.getOffset(_el), + elSize = this.getSize(_el), + dropPosition = { left: elPosition.left + (oldAnchor.x * elSize[0]), top: elPosition.top + (oldAnchor.y * elSize[1]) }, + ap = newAnchor.positionFinder(dropPosition, elPosition, elSize, newAnchor.constructorParams); + + newAnchor.x = ap[0]; + newAnchor.y = ap[1]; + } + + ep.setAnchor(newAnchor, true); + ep.repaint(); + this.repaint(ep.elementId); + if (oldConnection != null) { + this.repaint(oldConnection.targetId); + } + } + }.bind(this)); + + // when the user presses the mouse, add an Endpoint, if we are enabled. + var mouseDownListener = function (e) { + // on right mouse button, abort. + if (e.which === 3 || e.button === 2) { + return; + } + + elid = this.getId(this.getElement(elInfo.el)); // elid might have changed since this method was called to configure the element. + + // TODO store def on element. + var def = this.sourceEndpointDefinitions[elid][type]; + + // if disabled, return. + if (!def.enabled) { + return; + } + + // if a filter was given, run it, and return if it says no. + if (p.filter) { + var r = _ju.isString(p.filter) ? selectorFilter(e, elInfo.el, p.filter, this, p.filterExclude) : p.filter(e, elInfo.el); + if (r === false) { + return; + } + } + + // if maxConnections reached + var sourceCount = this.select({source: elid}).length; + if (def.maxConnections >= 0 && (sourceCount >= def.maxConnections)) { + if (onMaxConnections) { + onMaxConnections({ + element: elInfo.el, + maxConnections: maxConnections + }, e); + } + return false; + } + + // find the position on the element at which the mouse was pressed; this is where the endpoint + // will be located. + var elxy = root.jsPlumb.getPositionOnElement(e, _del, _zoom); + + // we need to override the anchor in here, and force 'isSource', but we don't want to mess with + // the params passed in, because after a connection is established we're going to reset the endpoint + // to have the anchor we were given. + var tempEndpointParams = {}; + root.jsPlumb.extend(tempEndpointParams, def.def); + tempEndpointParams.isTemporarySource = true; + tempEndpointParams.anchor = [ elxy[0], elxy[1] , 0, 0]; + tempEndpointParams.dragOptions = dragOptions; + + if (def.def.scope) { + tempEndpointParams.scope = def.def.scope; + } + + ep = this.addEndpoint(elid, tempEndpointParams); + endpointAddedButNoDragYet = true; + ep.setDeleteOnEmpty(true); + + // if unique endpoint and it's already been created, push it onto the endpoint we create. at the end + // of a successful connection we'll switch to that endpoint. + // TODO this is the same code as the programmatic endpoints create on line 1050 ish + if (def.uniqueEndpoint) { + if (!def.endpoint) { + def.endpoint = ep; + ep.setDeleteOnEmpty(false); + } + else { + ep.finalEndpoint = def.endpoint; + } + } + + var _delTempEndpoint = function () { + // this mouseup event is fired only if no dragging occurred, by jquery and yui, but for mootools + // it is fired even if dragging has occurred, in which case we would blow away a perfectly + // legitimate endpoint, were it not for this check. the flag is set after adding an + // endpoint and cleared in a drag listener we set in the dragOptions above. + _currentInstance.off(ep.canvas, "mouseup", _delTempEndpoint); + _currentInstance.off(elInfo.el, "mouseup", _delTempEndpoint); + if (endpointAddedButNoDragYet) { + endpointAddedButNoDragYet = false; + _currentInstance.deleteEndpoint(ep); + } + }; + + _currentInstance.on(ep.canvas, "mouseup", _delTempEndpoint); + _currentInstance.on(elInfo.el, "mouseup", _delTempEndpoint); + + // optionally check for attributes to extract from the source element + var payload = {}; + if (def.def.extract) { + for (var att in def.def.extract) { + var v = (e.srcElement || e.target).getAttribute(att); + if (v) { + payload[def.def.extract[att]] = v; + } + } + } + + // and then trigger its mousedown event, which will kick off a drag, which will start dragging + // a new connection from this endpoint. + _currentInstance.trigger(ep.canvas, "mousedown", e, payload); + + _ju.consume(e); + + }.bind(this); + + this.on(elInfo.el, "mousedown", mouseDownListener); + _def.trigger = mouseDownListener; + + // if a filter was provided, set it as a dragFilter on the element, + // to prevent the element drag function from kicking in when we want to + // drag a new connection + if (p.filter && (_ju.isString(p.filter) || _ju.isFunction(p.filter))) { + _currentInstance.setDragFilter(elInfo.el, p.filter); + } + + var dropOptions = root.jsPlumb.extend({}, p.dropOptions || {}); + + _makeElementDropHandler(elInfo, p, dropOptions, true, p.isTarget === true); + + }.bind(this); + + var inputs = el.length && el.constructor !== String ? el : [ el ]; + for (var i = 0, ii = inputs.length; i < ii; i++) { + _doOne(_info(inputs[i])); + } + + return this; + }; + + // see api docs + this.unmakeSource = function (el, connectionType, doNotClearArrays) { + var info = _info(el); + _currentInstance.destroyDroppable(info.el, "internal"); + var eldefs = this.sourceEndpointDefinitions[info.id]; + if (eldefs) { + for (var def in eldefs) { + if (connectionType == null || connectionType === def) { + var mouseDownListener = eldefs[def].trigger; + if (mouseDownListener) { + _currentInstance.off(info.el, "mousedown", mouseDownListener); + } + if (!doNotClearArrays) { + delete this.sourceEndpointDefinitions[info.id][def]; + } + } + } + } + + return this; + }; + + // see api docs + this.unmakeEverySource = function () { + for (var i in this.sourceEndpointDefinitions) { + _currentInstance.unmakeSource(i, null, true); + } + + this.sourceEndpointDefinitions = {}; + return this; + }; + + var _getScope = function (el, types, connectionType) { + types = _ju.isArray(types) ? types : [ types ]; + var id = _getId(el); + connectionType = connectionType || "default"; + for (var i = 0; i < types.length; i++) { + var eldefs = this[types[i]][id]; + if (eldefs && eldefs[connectionType]) { + return eldefs[connectionType].def.scope || this.Defaults.Scope; + } + } + }.bind(this); + + var _setScope = function (el, scope, types, connectionType) { + types = _ju.isArray(types) ? types : [ types ]; + var id = _getId(el); + connectionType = connectionType || "default"; + for (var i = 0; i < types.length; i++) { + var eldefs = this[types[i]][id]; + if (eldefs && eldefs[connectionType]) { + eldefs[connectionType].def.scope = scope; + } + } + + }.bind(this); + + this.getScope = function (el, scope) { + return _getScope(el, [ "sourceEndpointDefinitions", "targetEndpointDefinitions" ]); + }; + this.getSourceScope = function (el) { + return _getScope(el, "sourceEndpointDefinitions"); + }; + this.getTargetScope = function (el) { + return _getScope(el, "targetEndpointDefinitions"); + }; + this.setScope = function (el, scope, connectionType) { + this.setSourceScope(el, scope, connectionType); + this.setTargetScope(el, scope, connectionType); + }; + this.setSourceScope = function (el, scope, connectionType) { + _setScope(el, scope, "sourceEndpointDefinitions", connectionType); + // we get the source scope during the mousedown event, but we also want to set this. + this.setDragScope(el, scope); + }; + this.setTargetScope = function (el, scope, connectionType) { + _setScope(el, scope, "targetEndpointDefinitions", connectionType); + this.setDropScope(el, scope); + }; + + // see api docs + this.unmakeEveryTarget = function () { + for (var i in this.targetEndpointDefinitions) { + _currentInstance.unmakeTarget(i, true); + } + + this.targetEndpointDefinitions = {}; + return this; + }; + + // does the work of setting a source enabled or disabled. + var _setEnabled = function (type, el, state, toggle, connectionType) { + var a = type === "source" ? this.sourceEndpointDefinitions : this.targetEndpointDefinitions, + originalState, info, newState; + + connectionType = connectionType || "default"; + + // a selector or an array + if (el.length && !_ju.isString(el)) { + originalState = []; + for (var i = 0, ii = el.length; i < ii; i++) { + info = _info(el[i]); + if (a[info.id] && a[info.id][connectionType]) { + originalState[i] = a[info.id][connectionType].enabled; + newState = toggle ? !originalState[i] : state; + a[info.id][connectionType].enabled = newState; + _currentInstance[newState ? "removeClass" : "addClass"](info.el, "jtk-" + type + "-disabled"); + } + } + } + // otherwise a DOM element or a String ID. + else { + info = _info(el); + var id = info.id; + if (a[id] && a[id][connectionType]) { + originalState = a[id][connectionType].enabled; + newState = toggle ? !originalState : state; + a[id][connectionType].enabled = newState; + _currentInstance[newState ? "removeClass" : "addClass"](info.el, "jtk-" + type + "-disabled"); + } + } + return originalState; + }.bind(this); + + var _first = function (el, fn) { + if (_ju.isString(el) || !el.length) { + return fn.apply(this, [ el ]); + } + else if (el.length) { + return fn.apply(this, [ el[0] ]); + } + + }.bind(this); + + this.toggleSourceEnabled = function (el, connectionType) { + _setEnabled("source", el, null, true, connectionType); + return this.isSourceEnabled(el, connectionType); + }; + + this.setSourceEnabled = function (el, state, connectionType) { + return _setEnabled("source", el, state, null, connectionType); + }; + this.isSource = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var eldefs = this.sourceEndpointDefinitions[_info(_el).id]; + return eldefs != null && eldefs[connectionType] != null; + }.bind(this)); + }; + this.isSourceEnabled = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var sep = this.sourceEndpointDefinitions[_info(_el).id]; + return sep && sep[connectionType] && sep[connectionType].enabled === true; + }.bind(this)); + }; + + this.toggleTargetEnabled = function (el, connectionType) { + _setEnabled("target", el, null, true, connectionType); + return this.isTargetEnabled(el, connectionType); + }; + + this.isTarget = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var eldefs = this.targetEndpointDefinitions[_info(_el).id]; + return eldefs != null && eldefs[connectionType] != null; + }.bind(this)); + }; + this.isTargetEnabled = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var tep = this.targetEndpointDefinitions[_info(_el).id]; + return tep && tep[connectionType] && tep[connectionType].enabled === true; + }.bind(this)); + }; + this.setTargetEnabled = function (el, state, connectionType) { + return _setEnabled("target", el, state, null, connectionType); + }; + +// --------------------- end makeSource/makeTarget ---------------------------------------------- + + this.ready = function (fn) { + _currentInstance.bind("ready", fn); + }; + + var _elEach = function(el, fn) { + // support both lists... + if (typeof el === 'object' && el.length) { + for (var i = 0, ii = el.length; i < ii; i++) { + fn(el[i]); + } + } + else {// ...and single strings or elements. + fn(el); + } + + return _currentInstance; + }; + + // repaint some element's endpoints and connections + this.repaint = function (el, ui, timestamp) { + return _elEach(el, function(_el) { + _draw(_el, ui, timestamp); + }); + }; + + this.revalidate = function (el, timestamp, isIdAlready) { + return _elEach(el, function(_el) { + var elId = isIdAlready ? _el : _currentInstance.getId(_el); + _currentInstance.updateOffset({ elId: elId, recalc: true, timestamp:timestamp }); + var dm = _currentInstance.getDragManager(); + if (dm) { + dm.updateOffsets(elId); + } + _currentInstance.repaint(_el); + }); + }; + + // repaint every endpoint and connection. + this.repaintEverything = function () { + // TODO this timestamp causes continuous anchors to not repaint properly. + // fix this. do not just take out the timestamp. it runs a lot faster with + // the timestamp included. + var timestamp = _timestamp(), elId; + + for (elId in endpointsByElement) { + _currentInstance.updateOffset({ elId: elId, recalc: true, timestamp: timestamp }); + } + + for (elId in endpointsByElement) { + _draw(elId, null, timestamp); + } + + return this; + }; + + this.removeAllEndpoints = function (el, recurse, affectedElements) { + affectedElements = affectedElements || []; + var _one = function (_el) { + var info = _info(_el), + ebe = endpointsByElement[info.id], + i, ii; + + if (ebe) { + affectedElements.push(info); + for (i = 0, ii = ebe.length; i < ii; i++) { + _currentInstance.deleteEndpoint(ebe[i], false); + } + } + delete endpointsByElement[info.id]; + + if (recurse) { + if (info.el && info.el.nodeType !== 3 && info.el.nodeType !== 8) { + for (i = 0, ii = info.el.childNodes.length; i < ii; i++) { + _one(info.el.childNodes[i]); + } + } + } + + }; + _one(el); + return this; + }; + + var _doRemove = function(info, affectedElements) { + _currentInstance.removeAllEndpoints(info.id, true, affectedElements); + var dm = _currentInstance.getDragManager(); + var _one = function(_info) { + + if (dm) { + dm.elementRemoved(_info.id); + } + _currentInstance.anchorManager.clearFor(_info.id); + _currentInstance.anchorManager.removeFloatingConnection(_info.id); + + if (_currentInstance.isSource(_info.el)) { + _currentInstance.unmakeSource(_info.el); + } + if (_currentInstance.isTarget(_info.el)) { + _currentInstance.unmakeTarget(_info.el); + } + _currentInstance.destroyDraggable(_info.el); + _currentInstance.destroyDroppable(_info.el); + + + delete _currentInstance.floatingConnections[_info.id]; + delete managedElements[_info.id]; + delete offsets[_info.id]; + if (_info.el) { + _currentInstance.removeElement(_info.el); + _info.el._jsPlumb = null; + } + }; + + // remove all affected child elements + for (var ae = 1; ae < affectedElements.length; ae++) { + _one(affectedElements[ae]); + } + // and always remove the requested one from the dom. + _one(info); + }; + + /** + * Remove the given element, including cleaning up all endpoints registered for it. + * This is exposed in the public API but also used internally by jsPlumb when removing the + * element associated with a connection drag. + */ + this.remove = function (el, doNotRepaint) { + var info = _info(el), affectedElements = []; + if (info.text && info.el.parentNode) { + info.el.parentNode.removeChild(info.el); + } + else if (info.id) { + _currentInstance.batch(function () { + _doRemove(info, affectedElements); + }, doNotRepaint === true); + } + return _currentInstance; + }; + + this.empty = function (el, doNotRepaint) { + var affectedElements = []; + var _one = function(el, dontRemoveFocus) { + var info = _info(el); + if (info.text) { + info.el.parentNode.removeChild(info.el); + } + else if (info.el) { + while(info.el.childNodes.length > 0) { + _one(info.el.childNodes[0]); + } + if (!dontRemoveFocus) { + _doRemove(info, affectedElements); + } + } + }; + + _currentInstance.batch(function() { + _one(el, true); + }, doNotRepaint === false); + + return _currentInstance; + }; + + this.reset = function (doNotUnbindInstanceEventListeners) { + _currentInstance.silently(function() { + _hoverSuspended = false; + _currentInstance.removeAllGroups(); + _currentInstance.removeGroupManager(); + _currentInstance.deleteEveryEndpoint(); + if (!doNotUnbindInstanceEventListeners) { + _currentInstance.unbind(); + } + this.targetEndpointDefinitions = {}; + this.sourceEndpointDefinitions = {}; + connections.length = 0; + if (this.doReset) { + this.doReset(); + } + }.bind(this)); + }; + + var _clearObject = function (obj) { + if (obj.canvas && obj.canvas.parentNode) { + obj.canvas.parentNode.removeChild(obj.canvas); + } + obj.cleanup(); + obj.destroy(); + }; + + this.clear = function () { + _currentInstance.select().each(_clearObject); + _currentInstance.selectEndpoints().each(_clearObject); + + endpointsByElement = {}; + endpointsByUUID = {}; + }; + + this.setDefaultScope = function (scope) { + DEFAULT_SCOPE = scope; + return _currentInstance; + }; + + this.deriveEndpointAndAnchorSpec = function(type, dontPrependDefault) { + var bits = ((dontPrependDefault ? "" : "default ") + type).split(/[\s]/), eps = null, ep = null, a = null, as = null; + for (var i = 0; i < bits.length; i++) { + var _t = _currentInstance.getType(bits[i], "connection"); + if (_t) { + if (_t.endpoints) { + eps = _t.endpoints; + } + if (_t.endpoint) { + ep = _t.endpoint; + } + if (_t.anchors) { + as = _t.anchors; + } + if (_t.anchor) { + a = _t.anchor; + } + } + } + return { endpoints: eps ? eps : [ ep, ep ], anchors: as ? as : [a, a ]}; + }; + + // sets the id of some element, changing whatever we need to to keep track. + this.setId = function (el, newId, doNotSetAttribute) { + // + var id; + + if (_ju.isString(el)) { + id = el; + } + else { + el = this.getElement(el); + id = this.getId(el); + } + + var sConns = this.getConnections({source: id, scope: '*'}, true), + tConns = this.getConnections({target: id, scope: '*'}, true); + + newId = "" + newId; + + if (!doNotSetAttribute) { + el = this.getElement(id); + this.setAttribute(el, "id", newId); + } + else { + el = this.getElement(newId); + } + + endpointsByElement[newId] = endpointsByElement[id] || []; + for (var i = 0, ii = endpointsByElement[newId].length; i < ii; i++) { + endpointsByElement[newId][i].setElementId(newId); + endpointsByElement[newId][i].setReferenceElement(el); + } + delete endpointsByElement[id]; + + this.sourceEndpointDefinitions[newId] = this.sourceEndpointDefinitions[id]; + delete this.sourceEndpointDefinitions[id]; + this.targetEndpointDefinitions[newId] = this.targetEndpointDefinitions[id]; + delete this.targetEndpointDefinitions[id]; + + this.anchorManager.changeId(id, newId); + var dm = this.getDragManager(); + if (dm) { + dm.changeId(id, newId); + } + managedElements[newId] = managedElements[id]; + delete managedElements[id]; + + var _conns = function (list, epIdx, type) { + for (var i = 0, ii = list.length; i < ii; i++) { + list[i].endpoints[epIdx].setElementId(newId); + list[i].endpoints[epIdx].setReferenceElement(el); + list[i][type + "Id"] = newId; + list[i][type] = el; + } + }; + _conns(sConns, 0, "source"); + _conns(tConns, 1, "target"); + + this.repaint(newId); + }; + + this.setDebugLog = function (debugLog) { + log = debugLog; + }; + + this.setSuspendDrawing = function (val, repaintAfterwards) { + var curVal = _suspendDrawing; + _suspendDrawing = val; + if (val) { + _suspendedAt = new Date().getTime(); + } else { + _suspendedAt = null; + } + if (repaintAfterwards) { + this.repaintEverything(); + } + return curVal; + }; + + // returns whether or not drawing is currently suspended. + this.isSuspendDrawing = function () { + return _suspendDrawing; + }; + + // return timestamp for when drawing was suspended. + this.getSuspendedAt = function () { + return _suspendedAt; + }; + + this.batch = function (fn, doNotRepaintAfterwards) { + var _wasSuspended = this.isSuspendDrawing(); + if (!_wasSuspended) { + this.setSuspendDrawing(true); + } + try { + fn(); + } + catch (e) { + _ju.log("Function run while suspended failed", e); + } + if (!_wasSuspended) { + this.setSuspendDrawing(false, !doNotRepaintAfterwards); + } + }; + + this.doWhileSuspended = this.batch; + + this.getCachedData = _getCachedData; + this.timestamp = _timestamp; + this.show = function (el, changeEndpoints) { + _setVisible(el, "block", changeEndpoints); + return _currentInstance; + }; + + // TODO: update this method to return the current state. + this.toggleVisible = _toggleVisible; + this.addListener = this.bind; + + var floatingConnections = []; + this.registerFloatingConnection = function(info, conn, ep) { + floatingConnections[info.id] = conn; + // only register for the target endpoint; we will not be dragging the source at any time + // before this connection is either discarded or made into a permanent connection. + _ju.addToList(endpointsByElement, info.id, ep); + }; + this.getFloatingConnectionFor = function(id) { + return floatingConnections[id]; + }; + + this.listManager = new root.jsPlumbListManager(this, this.Defaults.ListStyle); + }; + + _ju.extend(root.jsPlumbInstance, _ju.EventGenerator, { + setAttribute: function (el, a, v) { + this.setAttribute(el, a, v); + }, + getAttribute: function (el, a) { + return this.getAttribute(root.jsPlumb.getElement(el), a); + }, + convertToFullOverlaySpec: function(spec) { + if (_ju.isString(spec)) { + spec = [ spec, { } ]; + } + spec[1].id = spec[1].id || _ju.uuid(); + return spec; + }, + registerConnectionType: function (id, type) { + this._connectionTypes[id] = root.jsPlumb.extend({}, type); + if (type.overlays) { + var to = {}; + for (var i = 0; i < type.overlays.length; i++) { + // if a string, convert to object representation so that we can store the typeid on it. + // also assign an id. + var fo = this.convertToFullOverlaySpec(type.overlays[i]); + to[fo[1].id] = fo; + } + this._connectionTypes[id].overlays = to; + } + }, + registerConnectionTypes: function (types) { + for (var i in types) { + this.registerConnectionType(i, types[i]); + } + }, + registerEndpointType: function (id, type) { + this._endpointTypes[id] = root.jsPlumb.extend({}, type); + if (type.overlays) { + var to = {}; + for (var i = 0; i < type.overlays.length; i++) { + // if a string, convert to object representation so that we can store the typeid on it. + // also assign an id. + var fo = this.convertToFullOverlaySpec(type.overlays[i]); + to[fo[1].id] = fo; + } + this._endpointTypes[id].overlays = to; + } + }, + registerEndpointTypes: function (types) { + for (var i in types) { + this.registerEndpointType(i, types[i]); + } + }, + getType: function (id, typeDescriptor) { + return typeDescriptor === "connection" ? this._connectionTypes[id] : this._endpointTypes[id]; + }, + setIdChanged: function (oldId, newId) { + this.setId(oldId, newId, true); + }, + // set parent: change the parent for some node and update all the registrations we need to. + setParent: function (el, newParent) { + var _dom = this.getElement(el), + _id = this.getId(_dom), + _pdom = this.getElement(newParent), + _pid = this.getId(_pdom), + dm = this.getDragManager(); + + _dom.parentNode.removeChild(_dom); + _pdom.appendChild(_dom); + if (dm) { + dm.setParent(_dom, _id, _pdom, _pid); + } + }, + extend: function (o1, o2, names) { + var i; + if (names) { + for (i = 0; i < names.length; i++) { + o1[names[i]] = o2[names[i]]; + } + } + else { + for (i in o2) { + o1[i] = o2[i]; + } + } + + return o1; + }, + floatingConnections: {}, + getFloatingAnchorIndex: function (jpc) { + return jpc.endpoints[0].isFloating() ? 0 : jpc.endpoints[1].isFloating() ? 1 : -1; + }, + proxyConnection :function(connection, index, proxyEl, proxyElId, endpointGenerator, anchorGenerator) { + var proxyEp, + originalElementId = connection.endpoints[index].elementId, + originalEndpoint = connection.endpoints[index]; + + connection.proxies = connection.proxies || []; + if(connection.proxies[index]) { + proxyEp = connection.proxies[index].ep; + }else { + proxyEp = this.addEndpoint(proxyEl, { + endpoint:endpointGenerator(connection, index), + anchor:anchorGenerator(connection, index), + parameters:{ + isProxyEndpoint:true + } + }); + } + proxyEp.setDeleteOnEmpty(true); + + // for this index, stash proxy info: the new EP, the original EP. + connection.proxies[index] = { ep:proxyEp, originalEp: originalEndpoint }; + + // and advise the anchor manager + if (index === 0) { + // TODO why are there two differently named methods? Why is there not one method that says "some end of this + // connection changed (you give the index), and here's the new element and element id." + this.anchorManager.sourceChanged(originalElementId, proxyElId, connection, proxyEl); + } + else { + this.anchorManager.updateOtherEndpoint(connection.endpoints[0].elementId, originalElementId, proxyElId, connection); + connection.target = proxyEl; + connection.targetId = proxyElId; + } + + // detach the original EP from the connection. + originalEndpoint.detachFromConnection(connection, null, true); + + // set the proxy as the new ep + proxyEp.connections = [ connection ]; + connection.endpoints[index] = proxyEp; + + originalEndpoint.setVisible(false); + + connection.setVisible(true); + + this.revalidate(proxyEl); + }, + unproxyConnection : function(connection, index, proxyElId) { + // if connection cleaned up, no proxies, or none for this end of the connection, abort. + if (connection._jsPlumb == null || connection.proxies == null || connection.proxies[index] == null) { + return; + } + + var originalElement = connection.proxies[index].originalEp.element, + originalElementId = connection.proxies[index].originalEp.elementId; + + connection.endpoints[index] = connection.proxies[index].originalEp; + // and advise the anchor manager + if (index === 0) { + // TODO why are there two differently named methods? Why is there not one method that says "some end of this + // connection changed (you give the index), and here's the new element and element id." + this.anchorManager.sourceChanged(proxyElId, originalElementId, connection, originalElement); + } + else { + this.anchorManager.updateOtherEndpoint(connection.endpoints[0].elementId, proxyElId, originalElementId, connection); + connection.target = originalElement; + connection.targetId = originalElementId; + } + + // detach the proxy EP from the connection (which will cause it to be removed as we no longer need it) + connection.proxies[index].ep.detachFromConnection(connection, null); + + connection.proxies[index].originalEp.addConnection(connection); + if(connection.isVisible()) { + connection.proxies[index].originalEp.setVisible(true); + } + + // cleanup + delete connection.proxies[index]; + } + }); + +// --------------------- static instance + module registration ------------------------------------------- + +// create static instance and assign to window if window exists. + var jsPlumb = new jsPlumbInstance(); + // register on 'root' (lets us run on server or browser) + root.jsPlumb = jsPlumb; + // add 'getInstance' method to static instance + jsPlumb.getInstance = function (_defaults, overrideFns) { + var j = new jsPlumbInstance(_defaults); + if (overrideFns) { + for (var ovf in overrideFns) { + j[ovf] = overrideFns[ovf]; + } + } + j.init(); + return j; + }; + jsPlumb.each = function (spec, fn) { + if (spec == null) { + return; + } + if (typeof spec === "string") { + fn(jsPlumb.getElement(spec)); + } + else if (spec.length != null) { + for (var i = 0; i < spec.length; i++) { + fn(jsPlumb.getElement(spec[i])); + } + } + else { + fn(spec); + } // assume it's an element. + }; + + // CommonJS + if (typeof exports !== 'undefined') { + exports.jsPlumb = jsPlumb; + } + +// --------------------- end static instance + AMD registration ------------------------------------------- + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function() { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + // ------------------------------ BEGIN OverlayCapablejsPlumbUIComponent -------------------------------------------- + + var _internalLabelOverlayId = "__label", + // this is a shortcut helper method to let people add a label as + // overlay. + _makeLabelOverlay = function (component, params) { + + var _params = { + cssClass: params.cssClass, + labelStyle: component.labelStyle, + id: _internalLabelOverlayId, + component: component, + _jsPlumb: component._jsPlumb.instance // TODO not necessary, since the instance can be accessed through the component. + }, + mergedParams = _jp.extend(_params, params); + + return new _jp.Overlays[component._jsPlumb.instance.getRenderMode()].Label(mergedParams); + }, + _processOverlay = function (component, o) { + var _newOverlay = null; + if (_ju.isArray(o)) { // this is for the shorthand ["Arrow", { width:50 }] syntax + // there's also a three arg version: + // ["Arrow", { width:50 }, {location:0.7}] + // which merges the 3rd arg into the 2nd. + var type = o[0], + // make a copy of the object so as not to mess up anyone else's reference... + p = _jp.extend({component: component, _jsPlumb: component._jsPlumb.instance}, o[1]); + if (o.length === 3) { + _jp.extend(p, o[2]); + } + _newOverlay = new _jp.Overlays[component._jsPlumb.instance.getRenderMode()][type](p); + } else if (o.constructor === String) { + _newOverlay = new _jp.Overlays[component._jsPlumb.instance.getRenderMode()][o]({component: component, _jsPlumb: component._jsPlumb.instance}); + } else { + _newOverlay = o; + } + + _newOverlay.id = _newOverlay.id || _ju.uuid(); + component.cacheTypeItem("overlay", _newOverlay, _newOverlay.id); + component._jsPlumb.overlays[_newOverlay.id] = _newOverlay; + + return _newOverlay; + }; + + _jp.OverlayCapableJsPlumbUIComponent = function (params) { + + root.jsPlumbUIComponent.apply(this, arguments); + this._jsPlumb.overlays = {}; + this._jsPlumb.overlayPositions = {}; + + if (params.label) { + this.getDefaultType().overlays[_internalLabelOverlayId] = ["Label", { + label: params.label, + location: params.labelLocation || this.defaultLabelLocation || 0.5, + labelStyle: params.labelStyle || this._jsPlumb.instance.Defaults.LabelStyle, + id:_internalLabelOverlayId + }]; + } + + this.setListenerComponent = function (c) { + if (this._jsPlumb) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].setListenerComponent(c); + } + } + }; + }; + + _jp.OverlayCapableJsPlumbUIComponent.applyType = function (component, t) { + if (t.overlays) { + // loop through the ones in the type. if already present on the component, + // dont remove or re-add. + var keep = {}, i; + + for (i in t.overlays) { + + var existing = component._jsPlumb.overlays[t.overlays[i][1].id]; + if (existing) { + // maybe update from data, if there were parameterised values for instance. + existing.updateFrom(t.overlays[i][1]); + keep[t.overlays[i][1].id] = true; + + existing.reattach(component._jsPlumb.instance, component); + } + else { + var c = component.getCachedTypeItem("overlay", t.overlays[i][1].id); + if (c != null) { + c.reattach(component._jsPlumb.instance, component); + c.setVisible(true); + // maybe update from data, if there were parameterised values for instance. + c.updateFrom(t.overlays[i][1]); + component._jsPlumb.overlays[c.id] = c; + } + else { + c = component.addOverlay(t.overlays[i], true); + } + keep[c.id] = true; + } + } + + // now loop through the full overlays and remove those that we dont want to keep + for (i in component._jsPlumb.overlays) { + if (keep[component._jsPlumb.overlays[i].id] == null) { + component.removeOverlay(component._jsPlumb.overlays[i].id, true); // remove overlay but dont clean it up. + // that would remove event listeners etc; overlays are never discarded by the types stuff, they are + // just detached/reattached. + } + } + } + }; + + _ju.extend(_jp.OverlayCapableJsPlumbUIComponent, root.jsPlumbUIComponent, { + + setHover: function (hover, ignoreAttachedElements) { + if (this._jsPlumb && !this._jsPlumb.instance.isConnectionBeingDragged()) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i][hover ? "addClass" : "removeClass"](this._jsPlumb.instance.hoverClass); + } + } + }, + addOverlay: function (overlay, doNotRepaint) { + var o = _processOverlay(this, overlay); + + if (this.getData && o.type === "Label" && _ju.isArray(overlay)) { + // + // component data might contain label location - look for it here. + var d = this.getData(), p = overlay[1]; + if (d) { + var locationAttribute = p.labelLocationAttribute || "labelLocation"; + var loc = d ? d[locationAttribute] : null; + + if (loc) { + o.loc = loc; + } + } + } + + if (!doNotRepaint) { + this.repaint(); + } + return o; + }, + getOverlay: function (id) { + return this._jsPlumb.overlays[id]; + }, + getOverlays: function () { + return this._jsPlumb.overlays; + }, + hideOverlay: function (id) { + var o = this.getOverlay(id); + if (o) { + o.hide(); + } + }, + hideOverlays: function () { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].hide(); + } + }, + showOverlay: function (id) { + var o = this.getOverlay(id); + if (o) { + o.show(); + } + }, + showOverlays: function () { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].show(); + } + }, + removeAllOverlays: function (doNotRepaint) { + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays[i].cleanup) { + this._jsPlumb.overlays[i].cleanup(); + } + } + + this._jsPlumb.overlays = {}; + this._jsPlumb.overlayPositions = null; + this._jsPlumb.overlayPlacements= {}; + if (!doNotRepaint) { + this.repaint(); + } + }, + removeOverlay: function (overlayId, dontCleanup) { + var o = this._jsPlumb.overlays[overlayId]; + if (o) { + o.setVisible(false); + if (!dontCleanup && o.cleanup) { + o.cleanup(); + } + delete this._jsPlumb.overlays[overlayId]; + if (this._jsPlumb.overlayPositions) { + delete this._jsPlumb.overlayPositions[overlayId]; + } + + if (this._jsPlumb.overlayPlacements) { + delete this._jsPlumb.overlayPlacements[overlayId]; + } + } + }, + removeOverlays: function () { + for (var i = 0, j = arguments.length; i < j; i++) { + this.removeOverlay(arguments[i]); + } + }, + moveParent: function (newParent) { + if (this.bgCanvas) { + this.bgCanvas.parentNode.removeChild(this.bgCanvas); + newParent.appendChild(this.bgCanvas); + } + + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + newParent.appendChild(this.canvas); + + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays[i].isAppendedAtTopLevel) { + var el = this._jsPlumb.overlays[i].getElement(); + el.parentNode.removeChild(el); + newParent.appendChild(el); + } + } + } + }, + getLabel: function () { + var lo = this.getOverlay(_internalLabelOverlayId); + return lo != null ? lo.getLabel() : null; + }, + getLabelOverlay: function () { + return this.getOverlay(_internalLabelOverlayId); + }, + setLabel: function (l) { + var lo = this.getOverlay(_internalLabelOverlayId); + if (!lo) { + var params = l.constructor === String || l.constructor === Function ? { label: l } : l; + lo = _makeLabelOverlay(this, params); + this._jsPlumb.overlays[_internalLabelOverlayId] = lo; + } + else { + if (l.constructor === String || l.constructor === Function) { + lo.setLabel(l); + } + else { + if (l.label) { + lo.setLabel(l.label); + } + if (l.location) { + lo.setLocation(l.location); + } + } + } + + if (!this._jsPlumb.instance.isSuspendDrawing()) { + this.repaint(); + } + }, + cleanup: function (force) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].cleanup(force); + this._jsPlumb.overlays[i].destroy(force); + } + if (force) { + this._jsPlumb.overlays = {}; + this._jsPlumb.overlayPositions = null; + } + }, + setVisible: function (v) { + this[v ? "showOverlays" : "hideOverlays"](); + }, + setAbsoluteOverlayPosition: function (overlay, xy) { + this._jsPlumb.overlayPositions[overlay.id] = xy; + }, + getAbsoluteOverlayPosition: function (overlay) { + return this._jsPlumb.overlayPositions ? this._jsPlumb.overlayPositions[overlay.id] : null; + }, + _clazzManip:function(action, clazz, dontUpdateOverlays) { + if (!dontUpdateOverlays) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i][action + "Class"](clazz); + } + } + }, + addClass:function(clazz, dontUpdateOverlays) { + this._clazzManip("add", clazz, dontUpdateOverlays); + }, + removeClass:function(clazz, dontUpdateOverlays) { + this._clazzManip("remove", clazz, dontUpdateOverlays); + } + }); + +// ------------------------------ END OverlayCapablejsPlumbUIComponent -------------------------------------------- + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the code for Endpoints. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + // create the drag handler for a connection + var _makeConnectionDragHandler = function (endpoint, placeholder, _jsPlumb) { + var stopped = false; + return { + drag: function () { + if (stopped) { + stopped = false; + return true; + } + + if (placeholder.element) { + var _ui = _jsPlumb.getUIPosition(arguments, _jsPlumb.getZoom()); + if (_ui != null) { + _jsPlumb.setPosition(placeholder.element, _ui); + } + _jsPlumb.repaint(placeholder.element, _ui); + // always repaint the source endpoint, because only continuous/dynamic anchors cause the endpoint + // to be repainted, so static anchors need to be told (or the endpoint gets dragged around) + endpoint.paint({anchorPoint:endpoint.anchor.getCurrentLocation({element:endpoint})}); + } + }, + stopDrag: function () { + stopped = true; + } + }; + }; + + // creates a placeholder div for dragging purposes, adds it, and pre-computes its offset. + var _makeDraggablePlaceholder = function (placeholder, _jsPlumb, ipco, ips) { + var n = _jsPlumb.createElement("div", { position : "absolute" }); + _jsPlumb.appendElement(n); + var id = _jsPlumb.getId(n); + _jsPlumb.setPosition(n, ipco); + n.style.width = ips[0] + "px"; + n.style.height = ips[1] + "px"; + _jsPlumb.manage(id, n, true); // TRANSIENT MANAGE + // create and assign an id, and initialize the offset. + placeholder.id = id; + placeholder.element = n; + }; + + // create a floating endpoint (for drag connections) + var _makeFloatingEndpoint = function (paintStyle, referenceAnchor, endpoint, referenceCanvas, sourceElement, _jsPlumb, _newEndpoint, scope) { + var floatingAnchor = new _jp.FloatingAnchor({ reference: referenceAnchor, referenceCanvas: referenceCanvas, jsPlumbInstance: _jsPlumb }); + //setting the scope here should not be the way to fix that mootools issue. it should be fixed by not + // adding the floating endpoint as a droppable. that makes more sense anyway! + // TRANSIENT MANAGE + return _newEndpoint({ + paintStyle: paintStyle, + endpoint: endpoint, + anchor: floatingAnchor, + source: sourceElement, + scope: scope + }); + }; + + var typeParameters = [ "connectorStyle", "connectorHoverStyle", "connectorOverlays", + "connector", "connectionType", "connectorClass", "connectorHoverClass" ]; + + // a helper function that tries to find a connection to the given element, and returns it if so. if elementWithPrecedence is null, + // or no connection to it is found, we return the first connection in our list. + var findConnectionToUseForDynamicAnchor = function (ep, elementWithPrecedence) { + var idx = 0; + if (elementWithPrecedence != null) { + for (var i = 0; i < ep.connections.length; i++) { + if (ep.connections[i].sourceId === elementWithPrecedence || ep.connections[i].targetId === elementWithPrecedence) { + idx = i; + break; + } + } + } + + return ep.connections[idx]; + }; + + _jp.Endpoint = function (params) { + var _jsPlumb = params._jsPlumb, + _newConnection = params.newConnection, + _newEndpoint = params.newEndpoint; + + this.idPrefix = "_jsplumb_e_"; + this.defaultLabelLocation = [ 0.5, 0.5 ]; + this.defaultOverlayKeys = ["Overlays", "EndpointOverlays"]; + _jp.OverlayCapableJsPlumbUIComponent.apply(this, arguments); + +// TYPE + + this.appendToDefaultType({ + connectionType:params.connectionType, + maxConnections: params.maxConnections == null ? this._jsPlumb.instance.Defaults.MaxConnections : params.maxConnections, // maximum number of connections this endpoint can be the source of., + paintStyle: params.endpointStyle || params.paintStyle || params.style || this._jsPlumb.instance.Defaults.EndpointStyle || _jp.Defaults.EndpointStyle, + hoverPaintStyle: params.endpointHoverStyle || params.hoverPaintStyle || this._jsPlumb.instance.Defaults.EndpointHoverStyle || _jp.Defaults.EndpointHoverStyle, + connectorStyle: params.connectorStyle, + connectorHoverStyle: params.connectorHoverStyle, + connectorClass: params.connectorClass, + connectorHoverClass: params.connectorHoverClass, + connectorOverlays: params.connectorOverlays, + connector: params.connector, + connectorTooltip: params.connectorTooltip + }); + +// END TYPE + + this._jsPlumb.enabled = !(params.enabled === false); + this._jsPlumb.visible = true; + this.element = _jp.getElement(params.source); + this._jsPlumb.uuid = params.uuid; + this._jsPlumb.floatingEndpoint = null; + var inPlaceCopy = null; + if (this._jsPlumb.uuid) { + params.endpointsByUUID[this._jsPlumb.uuid] = this; + } + this.elementId = params.elementId; + this.dragProxy = params.dragProxy; + + this._jsPlumb.connectionCost = params.connectionCost; + this._jsPlumb.connectionsDirected = params.connectionsDirected; + this._jsPlumb.currentAnchorClass = ""; + this._jsPlumb.events = {}; + + var deleteOnEmpty = params.deleteOnEmpty === true; + this.setDeleteOnEmpty = function(d) { + deleteOnEmpty = d; + }; + + var _updateAnchorClass = function () { + // stash old, get new + var oldAnchorClass = _jsPlumb.endpointAnchorClassPrefix + "-" + this._jsPlumb.currentAnchorClass; + this._jsPlumb.currentAnchorClass = this.anchor.getCssClass(); + var anchorClass = _jsPlumb.endpointAnchorClassPrefix + (this._jsPlumb.currentAnchorClass ? "-" + this._jsPlumb.currentAnchorClass : ""); + + this.removeClass(oldAnchorClass); + this.addClass(anchorClass); + // add and remove at the same time to reduce the number of reflows. + _jp.updateClasses(this.element, anchorClass, oldAnchorClass); + }.bind(this); + + this.prepareAnchor = function(anchorParams) { + var a = this._jsPlumb.instance.makeAnchor(anchorParams, this.elementId, _jsPlumb); + a.bind("anchorChanged", function (currentAnchor) { + this.fire("anchorChanged", {endpoint: this, anchor: currentAnchor}); + _updateAnchorClass(); + }.bind(this)); + return a; + }; + + this.setPreparedAnchor = function(anchor, doNotRepaint) { + this._jsPlumb.instance.continuousAnchorFactory.clear(this.elementId); + this.anchor = anchor; + _updateAnchorClass(); + + if (!doNotRepaint) { + this._jsPlumb.instance.repaint(this.elementId); + } + + return this; + }; + + this.setAnchor = function (anchorParams, doNotRepaint) { + var a = this.prepareAnchor(anchorParams); + this.setPreparedAnchor(a, doNotRepaint); + return this; + }; + + var internalHover = function (state) { + if (this.connections.length > 0) { + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].setHover(state, false); + } + } + else { + this.setHover(state); + } + }.bind(this); + + this.bind("mouseover", function () { + internalHover(true); + }); + this.bind("mouseout", function () { + internalHover(false); + }); + + // ANCHOR MANAGER + if (!params._transient) { // in place copies, for example, are transient. they will never need to be retrieved during a paint cycle, because they dont move, and then they are deleted. + this._jsPlumb.instance.anchorManager.add(this, this.elementId); + } + + this.prepareEndpoint = function(ep, typeId) { + var _e = function (t, p) { + var rm = _jsPlumb.getRenderMode(); + if (_jp.Endpoints[rm][t]) { + return new _jp.Endpoints[rm][t](p); + } + if (!_jsPlumb.Defaults.DoNotThrowErrors) { + throw { msg: "jsPlumb: unknown endpoint type '" + t + "'" }; + } + }; + + var endpointArgs = { + _jsPlumb: this._jsPlumb.instance, + cssClass: params.cssClass, + container: params.container, + tooltip: params.tooltip, + connectorTooltip: params.connectorTooltip, + endpoint: this + }; + + var endpoint; + + if (_ju.isString(ep)) { + endpoint = _e(ep, endpointArgs); + } + else if (_ju.isArray(ep)) { + endpointArgs = _ju.merge(ep[1], endpointArgs); + endpoint = _e(ep[0], endpointArgs); + } + else { + endpoint = ep.clone(); + } + + // assign a clone function using a copy of endpointArgs. this is used when a drag starts: the endpoint that was dragged is cloned, + // and the clone is left in its place while the original one goes off on a magical journey. + // the copy is to get around a closure problem, in which endpointArgs ends up getting shared by + // the whole world. + //var argsForClone = jsPlumb.extend({}, endpointArgs); + endpoint.clone = function () { + // TODO this, and the code above, can be refactored to be more dry. + if (_ju.isString(ep)) { + return _e(ep, endpointArgs); + } + else if (_ju.isArray(ep)) { + endpointArgs = _ju.merge(ep[1], endpointArgs); + return _e(ep[0], endpointArgs); + } + }.bind(this); + + endpoint.typeId = typeId; + return endpoint; + }; + + this.setEndpoint = function(ep, doNotRepaint) { + var _ep = this.prepareEndpoint(ep); + this.setPreparedEndpoint(_ep, true); + }; + + this.setPreparedEndpoint = function (ep, doNotRepaint) { + if (this.endpoint != null) { + this.endpoint.cleanup(); + this.endpoint.destroy(); + } + this.endpoint = ep; + this.type = this.endpoint.type; + this.canvas = this.endpoint.canvas; + }; + + _jp.extend(this, params, typeParameters); + + this.isSource = params.isSource || false; + this.isTemporarySource = params.isTemporarySource || false; + this.isTarget = params.isTarget || false; + + this.connections = params.connections || []; + this.connectorPointerEvents = params["connector-pointer-events"]; + + this.scope = params.scope || _jsPlumb.getDefaultScope(); + this.timestamp = null; + this.reattachConnections = params.reattach || _jsPlumb.Defaults.ReattachConnections; + this.connectionsDetachable = _jsPlumb.Defaults.ConnectionsDetachable; + if (params.connectionsDetachable === false || params.detachable === false) { + this.connectionsDetachable = false; + } + this.dragAllowedWhenFull = params.dragAllowedWhenFull !== false; + + if (params.onMaxConnections) { + this.bind("maxConnections", params.onMaxConnections); + } + + // + // add a connection. not part of public API. + // + this.addConnection = function (connection) { + this.connections.push(connection); + this[(this.connections.length > 0 ? "add" : "remove") + "Class"](_jsPlumb.endpointConnectedClass); + this[(this.isFull() ? "add" : "remove") + "Class"](_jsPlumb.endpointFullClass); + }; + + this.detachFromConnection = function (connection, idx, doNotCleanup) { + idx = idx == null ? this.connections.indexOf(connection) : idx; + if (idx >= 0) { + this.connections.splice(idx, 1); + this[(this.connections.length > 0 ? "add" : "remove") + "Class"](_jsPlumb.endpointConnectedClass); + this[(this.isFull() ? "add" : "remove") + "Class"](_jsPlumb.endpointFullClass); + } + + if (!doNotCleanup && deleteOnEmpty && this.connections.length === 0) { + _jsPlumb.deleteObject({ + endpoint: this, + fireEvent: false, + deleteAttachedObjects: doNotCleanup !== true + }); + } + }; + + this.deleteEveryConnection = function(params) { + var c = this.connections.length; + for (var i = 0; i < c; i++) { + _jsPlumb.deleteConnection(this.connections[0], params); + } + }; + + this.detachFrom = function (targetEndpoint, fireEvent, originalEvent) { + var c = []; + for (var i = 0; i < this.connections.length; i++) { + if (this.connections[i].endpoints[1] === targetEndpoint || this.connections[i].endpoints[0] === targetEndpoint) { + c.push(this.connections[i]); + } + } + for (var j = 0, count = c.length; j < count; j++) { + _jsPlumb.deleteConnection(c[0]); + } + return this; + }; + + this.getElement = function () { + return this.element; + }; + + this.setElement = function (el) { + var parentId = this._jsPlumb.instance.getId(el), + curId = this.elementId; + // remove the endpoint from the list for the current endpoint's element + _ju.removeWithFunction(params.endpointsByElement[this.elementId], function (e) { + return e.id === this.id; + }.bind(this)); + this.element = _jp.getElement(el); + this.elementId = _jsPlumb.getId(this.element); + _jsPlumb.anchorManager.rehomeEndpoint(this, curId, this.element); + _jsPlumb.dragManager.endpointAdded(this.element); + _ju.addToList(params.endpointsByElement, parentId, this); + return this; + }; + + /** + * private but must be exposed. + */ + this.makeInPlaceCopy = function () { + var loc = this.anchor.getCurrentLocation({element: this}), + o = this.anchor.getOrientation(this), + acc = this.anchor.getCssClass(), + inPlaceAnchor = { + bind: function () { + }, + compute: function () { + return [ loc[0], loc[1] ]; + }, + getCurrentLocation: function () { + return [ loc[0], loc[1] ]; + }, + getOrientation: function () { + return o; + }, + getCssClass: function () { + return acc; + } + }; + + return _newEndpoint({ + dropOptions: params.dropOptions, + anchor: inPlaceAnchor, + source: this.element, + paintStyle: this.getPaintStyle(), + endpoint: params.hideOnDrag ? "Blank" : this.endpoint, + _transient: true, + scope: this.scope, + reference:this + }); + }; + + /** + * returns a connection from the pool; used when dragging starts. just gets the head of the array if it can. + */ + this.connectorSelector = function () { + return this.connections[0]; + }; + + this.setStyle = this.setPaintStyle; + + this.paint = function (params) { + params = params || {}; + var timestamp = params.timestamp, recalc = !(params.recalc === false); + if (!timestamp || this.timestamp !== timestamp) { + + var info = _jsPlumb.updateOffset({ elId: this.elementId, timestamp: timestamp }); + + var xy = params.offset ? params.offset.o : info.o; + if (xy != null) { + var ap = params.anchorPoint, connectorPaintStyle = params.connectorPaintStyle; + if (ap == null) { + var wh = params.dimensions || info.s, + anchorParams = { xy: [ xy.left, xy.top ], wh: wh, element: this, timestamp: timestamp }; + if (recalc && this.anchor.isDynamic && this.connections.length > 0) { + var c = findConnectionToUseForDynamicAnchor(this, params.elementWithPrecedence), + oIdx = c.endpoints[0] === this ? 1 : 0, + oId = oIdx === 0 ? c.sourceId : c.targetId, + oInfo = _jsPlumb.getCachedData(oId), + oOffset = oInfo.o, oWH = oInfo.s; + + anchorParams.index = oIdx === 0 ? 1 : 0; + anchorParams.connection = c; + anchorParams.txy = [ oOffset.left, oOffset.top ]; + anchorParams.twh = oWH; + anchorParams.tElement = c.endpoints[oIdx]; + } else if (this.connections.length > 0) { + anchorParams.connection = this.connections[0]; + } + ap = this.anchor.compute(anchorParams); + } + + this.endpoint.compute(ap, this.anchor.getOrientation(this), this._jsPlumb.paintStyleInUse, connectorPaintStyle || this.paintStyleInUse); + this.endpoint.paint(this._jsPlumb.paintStyleInUse, this.anchor); + this.timestamp = timestamp; + + // paint overlays + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays.hasOwnProperty(i)) { + var o = this._jsPlumb.overlays[i]; + if (o.isVisible()) { + this._jsPlumb.overlayPlacements[i] = o.draw(this.endpoint, this._jsPlumb.paintStyleInUse); + o.paint(this._jsPlumb.overlayPlacements[i]); + } + } + } + } + } + }; + + this.getTypeDescriptor = function () { + return "endpoint"; + }; + this.isVisible = function () { + return this._jsPlumb.visible; + }; + + this.repaint = this.paint; + + var draggingInitialised = false; + this.initDraggable = function () { + + // is this a connection source? we make it draggable and have the + // drag listener maintain a connection with a floating endpoint. + if (!draggingInitialised && _jp.isDragSupported(this.element)) { + var placeholderInfo = { id: null, element: null }, + jpc = null, + existingJpc = false, + existingJpcParams = null, + _dragHandler = _makeConnectionDragHandler(this, placeholderInfo, _jsPlumb), + dragOptions = params.dragOptions || {}, + defaultOpts = {}, + startEvent = _jp.dragEvents.start, + stopEvent = _jp.dragEvents.stop, + dragEvent = _jp.dragEvents.drag, + beforeStartEvent = _jp.dragEvents.beforeStart, + payload; + + // respond to beforeStart from katavorio; this will have, optionally, a payload of attribute values + // that were placed there by the makeSource mousedown listener. + var beforeStart = function(beforeStartParams) { + payload = beforeStartParams.e.payload || {}; + }; + + var start = function (startParams) { + +// ------------- first, get a connection to drag. this may be null, in which case we are dragging a new one. + + jpc = this.connectorSelector(); + +// -------------------------------- now a bunch of tests about whether or not to proceed ------------------------- + + var _continue = true; + // if not enabled, return + if (!this.isEnabled()) { + _continue = false; + } + // if no connection and we're not a source - or temporarily a source, as is the case with makeSource - return. + if (jpc == null && !this.isSource && !this.isTemporarySource) { + _continue = false; + } + // otherwise if we're full and not allowed to drag, also return false. + if (this.isSource && this.isFull() && !(jpc != null && this.dragAllowedWhenFull)) { + _continue = false; + } + // if the connection was setup as not detachable or one of its endpoints + // was setup as connectionsDetachable = false, or Defaults.ConnectionsDetachable + // is set to false... + if (jpc != null && !jpc.isDetachable(this)) { + // .. and the endpoint is full + if (this.isFull()) { + _continue = false; + } else { + // otherwise, if not full, set the connection to null, and we will now proceed + // to drag a new connection. + jpc = null; + } + } + + var beforeDrag = _jsPlumb.checkCondition(jpc == null ? "beforeDrag" : "beforeStartDetach", { + endpoint:this, + source:this.element, + sourceId:this.elementId, + connection:jpc + }); + if (beforeDrag === false) { + _continue = false; + } + // else we might have been given some data. we'll pass it in to a new connection as 'data'. + // here we also merge in the optional payload we were given on mousedown. + else if (typeof beforeDrag === "object") { + _jp.extend(beforeDrag, payload || {}); + } + else { + // or if no beforeDrag data, maybe use the payload on its own. + beforeDrag = payload || {}; + } + + if (_continue === false) { + // this is for mootools and yui. returning false from this causes jquery to stop drag. + // the events are wrapped in both mootools and yui anyway, but i don't think returning + // false from the start callback would stop a drag. + if (_jsPlumb.stopDrag) { + _jsPlumb.stopDrag(this.canvas); + } + _dragHandler.stopDrag(); + return false; + } + +// --------------------------------------------------------------------------------------------------------------------- + + // ok to proceed. + + // clear hover for all connections for this endpoint before continuing. + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].setHover(false); + } + + this.addClass("endpointDrag"); + _jsPlumb.setConnectionBeingDragged(true); + + // if we're not full but there was a connection, make it null. we'll create a new one. + if (jpc && !this.isFull() && this.isSource) { + jpc = null; + } + + _jsPlumb.updateOffset({ elId: this.elementId }); + +// ---------------- make the element we will drag around, and position it ----------------------------- + + var ipco = this._jsPlumb.instance.getOffset(this.canvas), + canvasElement = this.canvas, + ips = this._jsPlumb.instance.getSize(this.canvas); + + _makeDraggablePlaceholder(placeholderInfo, _jsPlumb, ipco, ips); + + // store the id of the dragging div and the source element. the drop function will pick these up. + _jsPlumb.setAttributes(this.canvas, { + "dragId": placeholderInfo.id, + "elId": this.elementId + }); + +// ------------------- create an endpoint that will be our floating endpoint ------------------------------------ + + var endpointToFloat = this.dragProxy || this.endpoint; + if (this.dragProxy == null && this.connectionType != null) { + var aae = this._jsPlumb.instance.deriveEndpointAndAnchorSpec(this.connectionType); + if (aae.endpoints[1]) { + endpointToFloat = aae.endpoints[1]; + } + } + var centerAnchor = this._jsPlumb.instance.makeAnchor("Center"); + centerAnchor.isFloating = true; + this._jsPlumb.floatingEndpoint = _makeFloatingEndpoint(this.getPaintStyle(), centerAnchor, endpointToFloat, this.canvas, placeholderInfo.element, _jsPlumb, _newEndpoint, this.scope); + var _savedAnchor = this._jsPlumb.floatingEndpoint.anchor; + + + if (jpc == null) { + + this.setHover(false, false); + // create a connection. one end is this endpoint, the other is a floating endpoint. + jpc = _newConnection({ + sourceEndpoint: this, + targetEndpoint: this._jsPlumb.floatingEndpoint, + source: this.element, // for makeSource with parent option. ensure source element is represented correctly. + target: placeholderInfo.element, + anchors: [ this.anchor, this._jsPlumb.floatingEndpoint.anchor ], + paintStyle: params.connectorStyle, // this can be null. Connection will use the default. + hoverPaintStyle: params.connectorHoverStyle, + connector: params.connector, // this can also be null. Connection will use the default. + overlays: params.connectorOverlays, + type: this.connectionType, + cssClass: this.connectorClass, + hoverClass: this.connectorHoverClass, + scope:params.scope, + data:beforeDrag + }); + jpc.pending = true; + jpc.addClass(_jsPlumb.draggingClass); + this._jsPlumb.floatingEndpoint.addClass(_jsPlumb.draggingClass); + this._jsPlumb.floatingEndpoint.anchor = _savedAnchor; + // fire an event that informs that a connection is being dragged + _jsPlumb.fire("connectionDrag", jpc); + + // register the new connection on the drag manager. This connection, at this point, is 'pending', + // and has as its target a temporary element (the 'placeholder'). If the connection subsequently + // becomes established, the anchor manager is informed that the target of the connection has + // changed. + + _jsPlumb.anchorManager.newConnection(jpc); + + } else { + existingJpc = true; + jpc.setHover(false); + // new anchor idx + var anchorIdx = jpc.endpoints[0].id === this.id ? 0 : 1; + this.detachFromConnection(jpc, null, true); // detach from the connection while dragging is occurring. but dont cleanup automatically. + + // store the original scope (issue 57) + var dragScope = _jsPlumb.getDragScope(canvasElement); + _jsPlumb.setAttribute(this.canvas, "originalScope", dragScope); + + // fire an event that informs that a connection is being dragged. we do this before + // replacing the original target with the floating element info. + _jsPlumb.fire("connectionDrag", jpc); + + // now we replace ourselves with the temporary div we created above: + if (anchorIdx === 0) { + existingJpcParams = [ jpc.source, jpc.sourceId, canvasElement, dragScope ]; + _jsPlumb.anchorManager.sourceChanged(jpc.endpoints[anchorIdx].elementId, placeholderInfo.id, jpc, placeholderInfo.element); + + } else { + existingJpcParams = [ jpc.target, jpc.targetId, canvasElement, dragScope ]; + jpc.target = placeholderInfo.element; + jpc.targetId = placeholderInfo.id; + + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.endpoints[anchorIdx].elementId, jpc.targetId, jpc); + } + + // store the original endpoint and assign the new floating endpoint for the drag. + jpc.suspendedEndpoint = jpc.endpoints[anchorIdx]; + + // PROVIDE THE SUSPENDED ELEMENT, BE IT A SOURCE OR TARGET (ISSUE 39) + jpc.suspendedElement = jpc.endpoints[anchorIdx].getElement(); + jpc.suspendedElementId = jpc.endpoints[anchorIdx].elementId; + jpc.suspendedElementType = anchorIdx === 0 ? "source" : "target"; + + jpc.suspendedEndpoint.setHover(false); + this._jsPlumb.floatingEndpoint.referenceEndpoint = jpc.suspendedEndpoint; + jpc.endpoints[anchorIdx] = this._jsPlumb.floatingEndpoint; + + jpc.addClass(_jsPlumb.draggingClass); + this._jsPlumb.floatingEndpoint.addClass(_jsPlumb.draggingClass); + } + + _jsPlumb.registerFloatingConnection(placeholderInfo, jpc, this._jsPlumb.floatingEndpoint); + + // // register it and register connection on it. + // _jsPlumb.floatingConnections[placeholderInfo.id] = jpc; + // + // // only register for the target endpoint; we will not be dragging the source at any time + // // before this connection is either discarded or made into a permanent connection. + // _ju.addToList(params.endpointsByElement, placeholderInfo.id, this._jsPlumb.floatingEndpoint); + + + // tell jsplumb about it + _jsPlumb.currentlyDragging = true; + }.bind(this); + + var stop = function () { + _jsPlumb.setConnectionBeingDragged(false); + + if (jpc && jpc.endpoints != null) { + // get the actual drop event (decode from library args to stop function) + var originalEvent = _jsPlumb.getDropEvent(arguments); + // unlock the other endpoint (if it is dynamic, it would have been locked at drag start) + var idx = _jsPlumb.getFloatingAnchorIndex(jpc); + jpc.endpoints[idx === 0 ? 1 : 0].anchor.unlock(); + // TODO: Dont want to know about css classes inside jsplumb, ideally. + jpc.removeClass(_jsPlumb.draggingClass); + + // if we have the floating endpoint then the connection has not been dropped + // on another endpoint. If it is a new connection we throw it away. If it is an + // existing connection we check to see if we should reattach it, throwing it away + // if not. + if (this._jsPlumb && (jpc.deleteConnectionNow || jpc.endpoints[idx] === this._jsPlumb.floatingEndpoint)) { + // 6a. if the connection was an existing one... + if (existingJpc && jpc.suspendedEndpoint) { + // fix for issue35, thanks Sylvain Gizard: when firing the detach event make sure the + // floating endpoint has been replaced. + if (idx === 0) { + jpc.floatingElement = jpc.source; + jpc.floatingId = jpc.sourceId; + jpc.floatingEndpoint = jpc.endpoints[0]; + jpc.floatingIndex = 0; + jpc.source = existingJpcParams[0]; + jpc.sourceId = existingJpcParams[1]; + } else { + // keep a copy of the floating element; the anchor manager will want to clean up. + jpc.floatingElement = jpc.target; + jpc.floatingId = jpc.targetId; + jpc.floatingEndpoint = jpc.endpoints[1]; + jpc.floatingIndex = 1; + jpc.target = existingJpcParams[0]; + jpc.targetId = existingJpcParams[1]; + } + + var fe = this._jsPlumb.floatingEndpoint; // store for later removal. + // restore the original scope (issue 57) + _jsPlumb.setDragScope(existingJpcParams[2], existingJpcParams[3]); + jpc.endpoints[idx] = jpc.suspendedEndpoint; + // if the connection should be reattached, or the other endpoint refuses detach, then + // reset the connection to its original state + if (jpc.isReattach() || jpc._forceReattach || jpc._forceDetach || !_jsPlumb.deleteConnection(jpc, {originalEvent: originalEvent})) { + + jpc.setHover(false); + jpc._forceDetach = null; + jpc._forceReattach = null; + this._jsPlumb.floatingEndpoint.detachFromConnection(jpc); + jpc.suspendedEndpoint.addConnection(jpc); + + // TODO this code is duplicated in lots of places...and there is nothing external + // in the code; it all refers to the connection itself. we could add a + // `checkSanity(connection)` method to anchorManager that did this. + if (idx === 1) { + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.floatingId, jpc.targetId, jpc); + } + else { + _jsPlumb.anchorManager.sourceChanged(jpc.floatingId, jpc.sourceId, jpc, jpc.source); + } + + _jsPlumb.repaint(existingJpcParams[1]); + } + else { + _jsPlumb.deleteObject({endpoint: fe}); + } + } + } + + // makeTargets sets this flag, to tell us we have been replaced and should delete this object. + if (this.deleteAfterDragStop) { + _jsPlumb.deleteObject({endpoint: this}); + } + else { + if (this._jsPlumb) { + this.paint({recalc: false}); + } + } + + // although the connection is no longer valid, there are use cases where this is useful. + _jsPlumb.fire("connectionDragStop", jpc, originalEvent); + // fire this event to give people more fine-grained control (connectionDragStop fires a lot) + if (jpc.pending) { + _jsPlumb.fire("connectionAborted", jpc, originalEvent); + } + // tell jsplumb that dragging is finished. + _jsPlumb.currentlyDragging = false; + jpc.suspendedElement = null; + jpc.suspendedEndpoint = null; + jpc = null; + } + + // if no endpoints, jpc already cleaned up. but still we want to ensure we're reset properly. + // remove the element associated with the floating endpoint + // (and its associated floating endpoint and visual artefacts) + if (placeholderInfo && placeholderInfo.element) { + _jsPlumb.remove(placeholderInfo.element, false, false); + } + // remove the inplace copy + if (inPlaceCopy) { + _jsPlumb.deleteObject({endpoint: inPlaceCopy}); + } + + if (this._jsPlumb) { + // make our canvas visible (TODO: hand off to library; we should not know about DOM) + this.canvas.style.visibility = "visible"; + // unlock our anchor + this.anchor.unlock(); + // clear floating anchor. + this._jsPlumb.floatingEndpoint = null; + } + + }.bind(this); + + dragOptions = _jp.extend(defaultOpts, dragOptions); + dragOptions.scope = this.scope || dragOptions.scope; + dragOptions[beforeStartEvent] = _ju.wrap(dragOptions[beforeStartEvent], beforeStart, false); + dragOptions[startEvent] = _ju.wrap(dragOptions[startEvent], start, false); + // extracted drag handler function so can be used by makeSource + dragOptions[dragEvent] = _ju.wrap(dragOptions[dragEvent], _dragHandler.drag); + dragOptions[stopEvent] = _ju.wrap(dragOptions[stopEvent], stop); + dragOptions.multipleDrop = false; + + dragOptions.canDrag = function () { + return this.isSource || this.isTemporarySource || (this.connections.length > 0 && this.connectionsDetachable !== false); + }.bind(this); + + _jsPlumb.initDraggable(this.canvas, dragOptions, "internal"); + + this.canvas._jsPlumbRelatedElement = this.element; + + draggingInitialised = true; + } + }; + + var ep = params.endpoint || this._jsPlumb.instance.Defaults.Endpoint || _jp.Defaults.Endpoint; + this.setEndpoint(ep, true); + var anchorParamsToUse = params.anchor ? params.anchor : params.anchors ? params.anchors : (_jsPlumb.Defaults.Anchor || "Top"); + this.setAnchor(anchorParamsToUse, true); + + // finally, set type if it was provided + var type = [ "default", (params.type || "")].join(" "); + this.addType(type, params.data, true); + this.canvas = this.endpoint.canvas; + this.canvas._jsPlumb = this; + + this.initDraggable(); + + // pulled this out into a function so we can reuse it for the inPlaceCopy canvas; you can now drop detached connections + // back onto the endpoint you detached it from. + var _initDropTarget = function (canvas, isTransient, endpoint, referenceEndpoint) { + + if (_jp.isDropSupported(this.element)) { + var dropOptions = params.dropOptions || _jsPlumb.Defaults.DropOptions || _jp.Defaults.DropOptions; + dropOptions = _jp.extend({}, dropOptions); + dropOptions.scope = dropOptions.scope || this.scope; + var dropEvent = _jp.dragEvents.drop, + overEvent = _jp.dragEvents.over, + outEvent = _jp.dragEvents.out, + _ep = this, + drop = _jsPlumb.EndpointDropHandler({ + getEndpoint: function () { + return _ep; + }, + jsPlumb: _jsPlumb, + enabled: function () { + return endpoint != null ? endpoint.isEnabled() : true; + }, + isFull: function () { + return endpoint.isFull(); + }, + element: this.element, + elementId: this.elementId, + isSource: this.isSource, + isTarget: this.isTarget, + addClass: function (clazz) { + _ep.addClass(clazz); + }, + removeClass: function (clazz) { + _ep.removeClass(clazz); + }, + isDropAllowed: function () { + return _ep.isDropAllowed.apply(_ep, arguments); + }, + reference:referenceEndpoint, + isRedrop:function(jpc, dhParams) { + return jpc.suspendedEndpoint && dhParams.reference && (jpc.suspendedEndpoint.id === dhParams.reference.id); + } + }); + + dropOptions[dropEvent] = _ju.wrap(dropOptions[dropEvent], drop, true); + dropOptions[overEvent] = _ju.wrap(dropOptions[overEvent], function () { + var draggable = _jp.getDragObject(arguments), + id = _jsPlumb.getAttribute(_jp.getElement(draggable), "dragId"), + _jpc = _jsPlumb.getFloatingConnectionFor(id);//_jsPlumb.floatingConnections[id]; + + if (_jpc != null) { + var idx = _jsPlumb.getFloatingAnchorIndex(_jpc); + // here we should fire the 'over' event if we are a target and this is a new connection, + // or we are the same as the floating endpoint. + var _cont = (this.isTarget && idx !== 0) || (_jpc.suspendedEndpoint && this.referenceEndpoint && this.referenceEndpoint.id === _jpc.suspendedEndpoint.id); + if (_cont) { + var bb = _jsPlumb.checkCondition("checkDropAllowed", { + sourceEndpoint: _jpc.endpoints[idx], + targetEndpoint: this, + connection: _jpc + }); + this[(bb ? "add" : "remove") + "Class"](_jsPlumb.endpointDropAllowedClass); + this[(bb ? "remove" : "add") + "Class"](_jsPlumb.endpointDropForbiddenClass); + _jpc.endpoints[idx].anchor.over(this.anchor, this); + } + } + }.bind(this)); + + dropOptions[outEvent] = _ju.wrap(dropOptions[outEvent], function () { + var draggable = _jp.getDragObject(arguments), + id = draggable == null ? null : _jsPlumb.getAttribute(_jp.getElement(draggable), "dragId"), + _jpc = id ? _jsPlumb.getFloatingConnectionFor(id) : null; + + if (_jpc != null) { + var idx = _jsPlumb.getFloatingAnchorIndex(_jpc); + var _cont = (this.isTarget && idx !== 0) || (_jpc.suspendedEndpoint && this.referenceEndpoint && this.referenceEndpoint.id === _jpc.suspendedEndpoint.id); + if (_cont) { + this.removeClass(_jsPlumb.endpointDropAllowedClass); + this.removeClass(_jsPlumb.endpointDropForbiddenClass); + _jpc.endpoints[idx].anchor.out(); + } + } + }.bind(this)); + + _jsPlumb.initDroppable(canvas, dropOptions, "internal", isTransient); + } + }.bind(this); + + // Initialise the endpoint's canvas as a drop target. The drop handler will take care of the logic of whether + // something can actually be dropped. + if (!this.anchor.isFloating) { + _initDropTarget(this.canvas, !(params._transient || this.anchor.isFloating), this, params.reference); + } + + return this; + }; + + _ju.extend(_jp.Endpoint, _jp.OverlayCapableJsPlumbUIComponent, { + + setVisible: function (v, doNotChangeConnections, doNotNotifyOtherEndpoint) { + this._jsPlumb.visible = v; + if (this.canvas) { + this.canvas.style.display = v ? "block" : "none"; + } + this[v ? "showOverlays" : "hideOverlays"](); + if (!doNotChangeConnections) { + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].setVisible(v); + if (!doNotNotifyOtherEndpoint) { + var oIdx = this === this.connections[i].endpoints[0] ? 1 : 0; + // only change the other endpoint if this is its only connection. + if (this.connections[i].endpoints[oIdx].connections.length === 1) { + this.connections[i].endpoints[oIdx].setVisible(v, true, true); + } + } + } + } + }, + getAttachedElements: function () { + return this.connections; + }, + applyType: function (t, doNotRepaint) { + this.setPaintStyle(t.endpointStyle || t.paintStyle, doNotRepaint); + this.setHoverPaintStyle(t.endpointHoverStyle || t.hoverPaintStyle, doNotRepaint); + if (t.maxConnections != null) { + this._jsPlumb.maxConnections = t.maxConnections; + } + if (t.scope) { + this.scope = t.scope; + } + _jp.extend(this, t, typeParameters); + if (t.cssClass != null && this.canvas) { + this._jsPlumb.instance.addClass(this.canvas, t.cssClass); + } + _jp.OverlayCapableJsPlumbUIComponent.applyType(this, t); + }, + isEnabled: function () { + return this._jsPlumb.enabled; + }, + setEnabled: function (e) { + this._jsPlumb.enabled = e; + }, + cleanup: function () { + var anchorClass = this._jsPlumb.instance.endpointAnchorClassPrefix + (this._jsPlumb.currentAnchorClass ? "-" + this._jsPlumb.currentAnchorClass : ""); + _jp.removeClass(this.element, anchorClass); + this.anchor = null; + this.endpoint.cleanup(true); + this.endpoint.destroy(); + this.endpoint = null; + // drag/drop + this._jsPlumb.instance.destroyDraggable(this.canvas, "internal"); + this._jsPlumb.instance.destroyDroppable(this.canvas, "internal"); + }, + setHover: function (h) { + if (this.endpoint && this._jsPlumb && !this._jsPlumb.instance.isConnectionBeingDragged()) { + this.endpoint.setHover(h); + } + }, + isFull: function () { + return this._jsPlumb.maxConnections === 0 ? true : !(this.isFloating() || this._jsPlumb.maxConnections < 0 || this.connections.length < this._jsPlumb.maxConnections); + }, + /** + * private but needs to be exposed. + */ + isFloating: function () { + return this.anchor != null && this.anchor.isFloating; + }, + isConnectedTo: function (endpoint) { + var found = false; + if (endpoint) { + for (var i = 0; i < this.connections.length; i++) { + if (this.connections[i].endpoints[1] === endpoint || this.connections[i].endpoints[0] === endpoint) { + found = true; + break; + } + } + } + return found; + }, + getConnectionCost: function () { + return this._jsPlumb.connectionCost; + }, + setConnectionCost: function (c) { + this._jsPlumb.connectionCost = c; + }, + areConnectionsDirected: function () { + return this._jsPlumb.connectionsDirected; + }, + setConnectionsDirected: function (b) { + this._jsPlumb.connectionsDirected = b; + }, + setElementId: function (_elId) { + this.elementId = _elId; + this.anchor.elementId = _elId; + }, + setReferenceElement: function (_el) { + this.element = _jp.getElement(_el); + }, + setDragAllowedWhenFull: function (allowed) { + this.dragAllowedWhenFull = allowed; + }, + equals: function (endpoint) { + return this.anchor.equals(endpoint.anchor); + }, + getUuid: function () { + return this._jsPlumb.uuid; + }, + computeAnchor: function (params) { + return this.anchor.compute(params); + } + }); + + root.jsPlumbInstance.prototype.EndpointDropHandler = function (dhParams) { + return function (e) { + + var _jsPlumb = dhParams.jsPlumb; + + // remove the classes that are added dynamically. drop is neither forbidden nor allowed now that + // the drop is finishing. + dhParams.removeClass(_jsPlumb.endpointDropAllowedClass); + dhParams.removeClass(_jsPlumb.endpointDropForbiddenClass); + + var originalEvent = _jsPlumb.getDropEvent(arguments), + draggable = _jsPlumb.getDragObject(arguments), + id = _jsPlumb.getAttribute(draggable, "dragId"), + elId = _jsPlumb.getAttribute(draggable, "elId"), + scope = _jsPlumb.getAttribute(draggable, "originalScope"), + jpc = _jsPlumb.getFloatingConnectionFor(id); + + // if no active connection, bail. + if (jpc == null) { + return; + } + + // calculate if this is an existing connection. + var existingConnection = jpc.suspendedEndpoint != null; + + // if suspended endpoint exists but has been cleaned up, bail. This means it's an existing connection + // that has been detached and will shortly be discarded. + if (existingConnection && jpc.suspendedEndpoint._jsPlumb == null) { + return; + } + + // get the drop endpoint. for a normal connection this is just the one that would replace the currently + // floating endpoint. for a makeTarget this is a new endpoint that is created on drop. But we leave that to + // the handler to figure out. + var _ep = dhParams.getEndpoint(jpc); + + // If we're not given an endpoint to use, bail. + if (_ep == null) { + return; + } + + // if this is a drop back where the connection came from, mark it force reattach and + // return; the stop handler will reattach. without firing an event. + if (dhParams.isRedrop(jpc, dhParams)) { + jpc._forceReattach = true; + jpc.setHover(false); + if (dhParams.maybeCleanup) { + dhParams.maybeCleanup(_ep); + } + return; + } + + // ensure we dont bother trying to drop sources on non-source eps, and same for target. + var idx = _jsPlumb.getFloatingAnchorIndex(jpc); + if ((idx === 0 && !dhParams.isSource)|| (idx === 1 && !dhParams.isTarget)){ + if (dhParams.maybeCleanup) { + dhParams.maybeCleanup(_ep); + } + return; + } + + if (dhParams.onDrop) { + dhParams.onDrop(jpc); + } + + // restore the original scope if necessary (issue 57) + if (scope) { + _jsPlumb.setDragScope(draggable, scope); + } + + // if the target of the drop is full, fire an event (we abort below) + // makeTarget: keep. + var isFull = dhParams.isFull(e); + if (isFull) { + _ep.fire("maxConnections", { + endpoint: this, + connection: jpc, + maxConnections: _ep._jsPlumb.maxConnections + }, originalEvent); + } + // + // if endpoint enabled, not full, and matches the index of the floating endpoint... + if (!isFull && dhParams.enabled()) { + var _doContinue = true; + + // before testing for beforeDrop, reset the connection's source/target to be the actual DOM elements + // involved (that is, stash any temporary stuff used for dragging. but we need to keep it around in + // order that the anchor manager can clean things up properly). + if (idx === 0) { + jpc.floatingElement = jpc.source; + jpc.floatingId = jpc.sourceId; + jpc.floatingEndpoint = jpc.endpoints[0]; + jpc.floatingIndex = 0; + jpc.source = dhParams.element; + jpc.sourceId = _jsPlumb.getId(dhParams.element); + } else { + jpc.floatingElement = jpc.target; + jpc.floatingId = jpc.targetId; + jpc.floatingEndpoint = jpc.endpoints[1]; + jpc.floatingIndex = 1; + jpc.target = dhParams.element; + jpc.targetId = _jsPlumb.getId(dhParams.element); + } + + // if this is an existing connection and detach is not allowed we won't continue. The connection's + // endpoints have been reinstated; everything is back to how it was. + if (existingConnection && jpc.suspendedEndpoint.id !== _ep.id) { + if (!jpc.isDetachAllowed(jpc) || !jpc.endpoints[idx].isDetachAllowed(jpc) || !jpc.suspendedEndpoint.isDetachAllowed(jpc) || !_jsPlumb.checkCondition("beforeDetach", jpc)) { + _doContinue = false; + } + } + +// ------------ wrap the execution path in a function so we can support asynchronous beforeDrop + + var continueFunction = function (optionalData) { + // remove this jpc from the current endpoint, which is a floating endpoint that we will + // subsequently discard. + jpc.endpoints[idx].detachFromConnection(jpc); + + // if there's a suspended endpoint, detach it from the connection. + if (jpc.suspendedEndpoint) { + jpc.suspendedEndpoint.detachFromConnection(jpc); + } + + jpc.endpoints[idx] = _ep; + _ep.addConnection(jpc); + + // copy our parameters in to the connection: + var params = _ep.getParameters(); + for (var aParam in params) { + jpc.setParameter(aParam, params[aParam]); + } + + if (!existingConnection) { + // if not an existing connection and + if (params.draggable) { + _jsPlumb.initDraggable(this.element, dhParams.dragOptions, "internal", _jsPlumb); + } + } + else { + var suspendedElementId = jpc.suspendedEndpoint.elementId; + _jsPlumb.fireMoveEvent({ + index: idx, + originalSourceId: idx === 0 ? suspendedElementId : jpc.sourceId, + newSourceId: idx === 0 ? _ep.elementId : jpc.sourceId, + originalTargetId: idx === 1 ? suspendedElementId : jpc.targetId, + newTargetId: idx === 1 ? _ep.elementId : jpc.targetId, + originalSourceEndpoint: idx === 0 ? jpc.suspendedEndpoint : jpc.endpoints[0], + newSourceEndpoint: idx === 0 ? _ep : jpc.endpoints[0], + originalTargetEndpoint: idx === 1 ? jpc.suspendedEndpoint : jpc.endpoints[1], + newTargetEndpoint: idx === 1 ? _ep : jpc.endpoints[1], + connection: jpc + }, originalEvent); + } + + if (idx === 1) { + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.floatingId, jpc.targetId, jpc); + } + else { + _jsPlumb.anchorManager.sourceChanged(jpc.floatingId, jpc.sourceId, jpc, jpc.source); + } + + // when makeSource has uniqueEndpoint:true, we want to create connections with new endpoints + // that are subsequently deleted. So makeSource sets `finalEndpoint`, which is the Endpoint to + // which the connection should be attached. The `detachFromConnection` call below results in the + // temporary endpoint being cleaned up. + if (jpc.endpoints[0].finalEndpoint) { + var _toDelete = jpc.endpoints[0]; + _toDelete.detachFromConnection(jpc); + jpc.endpoints[0] = jpc.endpoints[0].finalEndpoint; + jpc.endpoints[0].addConnection(jpc); + } + + // if optionalData was given, merge it onto the connection's data. + if (_ju.isObject(optionalData)) { + jpc.mergeData(optionalData); + } + // finalise will inform the anchor manager and also add to + // connectionsByScope if necessary. + _jsPlumb.finaliseConnection(jpc, null, originalEvent, false); + jpc.setHover(false); + + // SP continuous anchor flush + _jsPlumb.revalidate(jpc.endpoints[0].element); + + }.bind(this); + + var dontContinueFunction = function () { + // otherwise just put it back on the endpoint it was on before the drag. + if (jpc.suspendedEndpoint) { + jpc.endpoints[idx] = jpc.suspendedEndpoint; + jpc.setHover(false); + jpc._forceDetach = true; + if (idx === 0) { + jpc.source = jpc.suspendedEndpoint.element; + jpc.sourceId = jpc.suspendedEndpoint.elementId; + } else { + jpc.target = jpc.suspendedEndpoint.element; + jpc.targetId = jpc.suspendedEndpoint.elementId; + } + jpc.suspendedEndpoint.addConnection(jpc); + + // TODO checkSanity + if (idx === 1) { + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.floatingId, jpc.targetId, jpc); + } + else { + _jsPlumb.anchorManager.sourceChanged(jpc.floatingId, jpc.sourceId, jpc, jpc.source); + } + + _jsPlumb.repaint(jpc.sourceId); + jpc._forceDetach = false; + } + }; + +// -------------------------------------- + // now check beforeDrop. this will be available only on Endpoints that are setup to + // have a beforeDrop condition (although, secretly, under the hood all Endpoints and + // the Connection have them, because they are on jsPlumbUIComponent. shhh!), because + // it only makes sense to have it on a target endpoint. + _doContinue = _doContinue && dhParams.isDropAllowed(jpc.sourceId, jpc.targetId, jpc.scope, jpc, _ep);// && jpc.pending; + + if (_doContinue) { + continueFunction(_doContinue); + return true; + } + else { + dontContinueFunction(); + } + } + + if (dhParams.maybeCleanup) { + dhParams.maybeCleanup(_ep); + } + + _jsPlumb.currentlyDragging = false; + }; + }; +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the code for Connections. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, + _jp = root.jsPlumb, + _ju = root.jsPlumbUtil; + + var makeConnector = function (_jsPlumb, renderMode, connectorName, connectorArgs, forComponent) { + // first make sure we have a cache for the specified renderer + _jp.Connectors[renderMode] = _jp.Connectors[renderMode] || {}; + + // now see if the one we want exists; if not we will try to make it + if (_jp.Connectors[renderMode][connectorName] == null) { + + if (_jp.Connectors[connectorName] == null) { + if (!_jsPlumb.Defaults.DoNotThrowErrors) { + throw new TypeError("jsPlumb: unknown connector type '" + connectorName + "'"); + } else { + return null; + } + } + + _jp.Connectors[renderMode][connectorName] = function() { + _jp.Connectors[connectorName].apply(this, arguments); + _jp.ConnectorRenderers[renderMode].apply(this, arguments); + }; + + _ju.extend(_jp.Connectors[renderMode][connectorName], [ _jp.Connectors[connectorName], _jp.ConnectorRenderers[renderMode]]); + + } + + return new _jp.Connectors[renderMode][connectorName](connectorArgs, forComponent); + }, + _makeAnchor = function (anchorParams, elementId, _jsPlumb) { + return (anchorParams) ? _jsPlumb.makeAnchor(anchorParams, elementId, _jsPlumb) : null; + }, + _updateConnectedClass = function (conn, element, _jsPlumb, remove) { + if (element != null) { + element._jsPlumbConnections = element._jsPlumbConnections || {}; + if (remove) { + delete element._jsPlumbConnections[conn.id]; + } + else { + element._jsPlumbConnections[conn.id] = true; + } + + if (_ju.isEmpty(element._jsPlumbConnections)) { + _jsPlumb.removeClass(element, _jsPlumb.connectedClass); + } + else { + _jsPlumb.addClass(element, _jsPlumb.connectedClass); + } + } + }; + + _jp.Connection = function (params) { + var _newEndpoint = params.newEndpoint; + + this.id = params.id; + this.connector = null; + this.idPrefix = "_jsplumb_c_"; + this.defaultLabelLocation = 0.5; + this.defaultOverlayKeys = ["Overlays", "ConnectionOverlays"]; + // if a new connection is the result of moving some existing connection, params.previousConnection + // will have that Connection in it. listeners for the jsPlumbConnection event can look for that + // member and take action if they need to. + this.previousConnection = params.previousConnection; + this.source = _jp.getElement(params.source); + this.target = _jp.getElement(params.target); + + + _jp.OverlayCapableJsPlumbUIComponent.apply(this, arguments); + + // sourceEndpoint and targetEndpoint override source/target, if they are present. but + // source is not overridden if the Endpoint has declared it is not the final target of a connection; + // instead we use the source that the Endpoint declares will be the final source element. + if (params.sourceEndpoint) { + this.source = params.sourceEndpoint.getElement(); + this.sourceId = params.sourceEndpoint.elementId; + } else { + this.sourceId = this._jsPlumb.instance.getId(this.source); + } + + if (params.targetEndpoint) { + this.target = params.targetEndpoint.getElement(); + this.targetId = params.targetEndpoint.elementId; + } else { + this.targetId = this._jsPlumb.instance.getId(this.target); + } + + + this.scope = params.scope; // scope may have been passed in to the connect call. if it wasn't, we will pull it from the source endpoint, after having initialised the endpoints. + this.endpoints = []; + this.endpointStyles = []; + + var _jsPlumb = this._jsPlumb.instance; + + _jsPlumb.manage(this.sourceId, this.source); + _jsPlumb.manage(this.targetId, this.target); + + this._jsPlumb.visible = true; + + this._jsPlumb.params = { + cssClass: params.cssClass, + container: params.container, + "pointer-events": params["pointer-events"], + editorParams: params.editorParams, + overlays: params.overlays + }; + this._jsPlumb.lastPaintedAt = null; + + // listen to mouseover and mouseout events passed from the container delegate. + this.bind("mouseover", function () { + this.setHover(true); + }.bind(this)); + this.bind("mouseout", function () { + this.setHover(false); + }.bind(this)); + + +// INITIALISATION CODE + + this.makeEndpoint = function (isSource, el, elId, ep, definition) { + elId = elId || this._jsPlumb.instance.getId(el); + return this.prepareEndpoint(_jsPlumb, _newEndpoint, this, ep, isSource ? 0 : 1, params, el, elId, definition); + }; + + // if type given, get the endpoint definitions mapping to that type from the jsplumb instance, and use those. + // we apply types at the end of this constructor but endpoints are only honoured in a type definition at + // create time. + if (params.type) { + params.endpoints = params.endpoints || this._jsPlumb.instance.deriveEndpointAndAnchorSpec(params.type).endpoints; + } + + var eS = this.makeEndpoint(true, this.source, this.sourceId, params.sourceEndpoint), + eT = this.makeEndpoint(false, this.target, this.targetId, params.targetEndpoint); + + if (eS) { + _ju.addToList(params.endpointsByElement, this.sourceId, eS); + } + if (eT) { + _ju.addToList(params.endpointsByElement, this.targetId, eT); + } + // if scope not set, set it to be the scope for the source endpoint. + if (!this.scope) { + this.scope = this.endpoints[0].scope; + } + + // if explicitly told to (or not to) delete endpoints when empty, override endpoint's preferences + if (params.deleteEndpointsOnEmpty != null) { + this.endpoints[0].setDeleteOnEmpty(params.deleteEndpointsOnEmpty); + this.endpoints[1].setDeleteOnEmpty(params.deleteEndpointsOnEmpty); + } + +// -------------------------- DEFAULT TYPE --------------------------------------------- + + // DETACHABLE + var _detachable = _jsPlumb.Defaults.ConnectionsDetachable; + if (params.detachable === false) { + _detachable = false; + } + if (this.endpoints[0].connectionsDetachable === false) { + _detachable = false; + } + if (this.endpoints[1].connectionsDetachable === false) { + _detachable = false; + } + // REATTACH + var _reattach = params.reattach || this.endpoints[0].reattachConnections || this.endpoints[1].reattachConnections || _jsPlumb.Defaults.ReattachConnections; + + this.appendToDefaultType({ + detachable: _detachable, + reattach: _reattach, + paintStyle:this.endpoints[0].connectorStyle || this.endpoints[1].connectorStyle || params.paintStyle || _jsPlumb.Defaults.PaintStyle || _jp.Defaults.PaintStyle, + hoverPaintStyle:this.endpoints[0].connectorHoverStyle || this.endpoints[1].connectorHoverStyle || params.hoverPaintStyle || _jsPlumb.Defaults.HoverPaintStyle || _jp.Defaults.HoverPaintStyle + }); + + var _suspendedAt = _jsPlumb.getSuspendedAt(); + if (!_jsPlumb.isSuspendDrawing()) { + // paint the endpoints + var myInfo = _jsPlumb.getCachedData(this.sourceId), + myOffset = myInfo.o, myWH = myInfo.s, + otherInfo = _jsPlumb.getCachedData(this.targetId), + otherOffset = otherInfo.o, + otherWH = otherInfo.s, + initialTimestamp = _suspendedAt || _jsPlumb.timestamp(), + anchorLoc = this.endpoints[0].anchor.compute({ + xy: [ myOffset.left, myOffset.top ], wh: myWH, element: this.endpoints[0], + elementId: this.endpoints[0].elementId, + txy: [ otherOffset.left, otherOffset.top ], twh: otherWH, tElement: this.endpoints[1], + timestamp: initialTimestamp + }); + + this.endpoints[0].paint({ anchorLoc: anchorLoc, timestamp: initialTimestamp }); + + anchorLoc = this.endpoints[1].anchor.compute({ + xy: [ otherOffset.left, otherOffset.top ], wh: otherWH, element: this.endpoints[1], + elementId: this.endpoints[1].elementId, + txy: [ myOffset.left, myOffset.top ], twh: myWH, tElement: this.endpoints[0], + timestamp: initialTimestamp + }); + this.endpoints[1].paint({ anchorLoc: anchorLoc, timestamp: initialTimestamp }); + } + + this.getTypeDescriptor = function () { + return "connection"; + }; + this.getAttachedElements = function () { + return this.endpoints; + }; + + this.isDetachable = function (ep) { + return this._jsPlumb.detachable === false ? false : ep != null ? ep.connectionsDetachable === true : this._jsPlumb.detachable === true; + }; + this.setDetachable = function (detachable) { + this._jsPlumb.detachable = detachable === true; + }; + this.isReattach = function () { + return this._jsPlumb.reattach === true || this.endpoints[0].reattachConnections === true || this.endpoints[1].reattachConnections === true; + }; + this.setReattach = function (reattach) { + this._jsPlumb.reattach = reattach === true; + }; + +// END INITIALISATION CODE + + +// COST + DIRECTIONALITY + // if cost not supplied, try to inherit from source endpoint + this._jsPlumb.cost = params.cost || this.endpoints[0].getConnectionCost(); + this._jsPlumb.directed = params.directed; + // inherit directed flag if set no source endpoint + if (params.directed == null) { + this._jsPlumb.directed = this.endpoints[0].areConnectionsDirected(); + } +// END COST + DIRECTIONALITY + +// PARAMETERS + // merge all the parameters objects into the connection. parameters set + // on the connection take precedence; then source endpoint params, then + // finally target endpoint params. + var _p = _jp.extend({}, this.endpoints[1].getParameters()); + _jp.extend(_p, this.endpoints[0].getParameters()); + _jp.extend(_p, this.getParameters()); + this.setParameters(_p); +// END PARAMETERS + +// PAINTING + + this.setConnector(this.endpoints[0].connector || this.endpoints[1].connector || params.connector || _jsPlumb.Defaults.Connector || _jp.Defaults.Connector, true); + var data = params.data == null || !_ju.isObject(params.data) ? {} : params.data; + this.getData = function() { return data; }; + this.setData = function(d) { data = d || {}; }; + this.mergeData = function(d) { data = _jp.extend(data, d); }; + + // the very last thing we do is apply types, if there are any. + var _types = [ "default", this.endpoints[0].connectionType, this.endpoints[1].connectionType, params.type ].join(" "); + if (/[^\s]/.test(_types)) { + this.addType(_types, params.data, true); + } + + this.updateConnectedClass(); + +// END PAINTING + }; + + _ju.extend(_jp.Connection, _jp.OverlayCapableJsPlumbUIComponent, { + applyType: function (t, doNotRepaint, typeMap) { + + var _connector = null; + if (t.connector != null) { + _connector = this.getCachedTypeItem("connector", typeMap.connector); + if (_connector == null) { + _connector = this.prepareConnector(t.connector, typeMap.connector); + this.cacheTypeItem("connector", _connector, typeMap.connector); + } + this.setPreparedConnector(_connector); + } + + // none of these things result in the creation of objects so can be ignored. + if (t.detachable != null) { + this.setDetachable(t.detachable); + } + if (t.reattach != null) { + this.setReattach(t.reattach); + } + if (t.scope) { + this.scope = t.scope; + } + + if (t.cssClass != null && this.canvas) { + this._jsPlumb.instance.addClass(this.canvas, t.cssClass); + } + + var _anchors = null; + // this also results in the creation of objects. + if (t.anchor) { + // note that even if the param was anchor, we store `anchors`. + _anchors = this.getCachedTypeItem("anchors", typeMap.anchor); + if (_anchors == null) { + _anchors = [ this._jsPlumb.instance.makeAnchor(t.anchor), this._jsPlumb.instance.makeAnchor(t.anchor) ]; + this.cacheTypeItem("anchors", _anchors, typeMap.anchor); + } + } + else if (t.anchors) { + _anchors = this.getCachedTypeItem("anchors", typeMap.anchors); + if (_anchors == null) { + _anchors = [ + this._jsPlumb.instance.makeAnchor(t.anchors[0]), + this._jsPlumb.instance.makeAnchor(t.anchors[1]) + ]; + this.cacheTypeItem("anchors", _anchors, typeMap.anchors); + } + } + if (_anchors != null) { + this.endpoints[0].anchor = _anchors[0]; + this.endpoints[1].anchor = _anchors[1]; + if (this.endpoints[1].anchor.isDynamic) { + this._jsPlumb.instance.repaint(this.endpoints[1].elementId); + } + } + + _jp.OverlayCapableJsPlumbUIComponent.applyType(this, t); + }, + addClass: function (c, informEndpoints) { + if (informEndpoints) { + this.endpoints[0].addClass(c); + this.endpoints[1].addClass(c); + if (this.suspendedEndpoint) { + this.suspendedEndpoint.addClass(c); + } + } + if (this.connector) { + this.connector.addClass(c); + } + }, + removeClass: function (c, informEndpoints) { + if (informEndpoints) { + this.endpoints[0].removeClass(c); + this.endpoints[1].removeClass(c); + if (this.suspendedEndpoint) { + this.suspendedEndpoint.removeClass(c); + } + } + if (this.connector) { + this.connector.removeClass(c); + } + }, + isVisible: function () { + return this._jsPlumb.visible; + }, + setVisible: function (v) { + this._jsPlumb.visible = v; + if (this.connector) { + this.connector.setVisible(v); + } + this.repaint(); + }, + cleanup: function () { + this.updateConnectedClass(true); + this.endpoints = null; + this.source = null; + this.target = null; + if (this.connector != null) { + this.connector.cleanup(true); + this.connector.destroy(true); + } + this.connector = null; + }, + updateConnectedClass:function(remove) { + if (this._jsPlumb) { + _updateConnectedClass(this, this.source, this._jsPlumb.instance, remove); + _updateConnectedClass(this, this.target, this._jsPlumb.instance, remove); + } + }, + setHover: function (state) { + if (this.connector && this._jsPlumb && !this._jsPlumb.instance.isConnectionBeingDragged()) { + this.connector.setHover(state); + root.jsPlumb[state ? "addClass" : "removeClass"](this.source, this._jsPlumb.instance.hoverSourceClass); + root.jsPlumb[state ? "addClass" : "removeClass"](this.target, this._jsPlumb.instance.hoverTargetClass); + } + }, + getUuids:function() { + return [ this.endpoints[0].getUuid(), this.endpoints[1].getUuid() ]; + }, + getCost: function () { + return this._jsPlumb ? this._jsPlumb.cost : -Infinity; + }, + setCost: function (c) { + this._jsPlumb.cost = c; + }, + isDirected: function () { + return this._jsPlumb.directed; + }, + getConnector: function () { + return this.connector; + }, + prepareConnector:function(connectorSpec, typeId) { + var connectorArgs = { + _jsPlumb: this._jsPlumb.instance, + cssClass: this._jsPlumb.params.cssClass, + container: this._jsPlumb.params.container, + "pointer-events": this._jsPlumb.params["pointer-events"] + }, + renderMode = this._jsPlumb.instance.getRenderMode(), + connector; + + if (_ju.isString(connectorSpec)) { + connector = makeConnector(this._jsPlumb.instance, renderMode, connectorSpec, connectorArgs, this); + } // lets you use a string as shorthand. + else if (_ju.isArray(connectorSpec)) { + if (connectorSpec.length === 1) { + connector = makeConnector(this._jsPlumb.instance, renderMode, connectorSpec[0], connectorArgs, this); + } + else { + connector = makeConnector(this._jsPlumb.instance, renderMode, connectorSpec[0], _ju.merge(connectorSpec[1], connectorArgs), this); + } + } + if (typeId != null) { + connector.typeId = typeId; + } + return connector; + }, + setPreparedConnector: function(connector, doNotRepaint, doNotChangeListenerComponent, typeId) { + + if (this.connector !== connector) { + + var previous, previousClasses = ""; + // the connector will not be cleaned up if it was set as part of a type, because `typeId` will be set on it + // and we havent passed in `true` for "force" here. + if (this.connector != null) { + previous = this.connector; + previousClasses = previous.getClass(); + this.connector.cleanup(); + this.connector.destroy(); + } + + this.connector = connector; + if (typeId) { + this.cacheTypeItem("connector", connector, typeId); + } + + this.canvas = this.connector.canvas; + this.bgCanvas = this.connector.bgCanvas; + + this.connector.reattach(this._jsPlumb.instance); + + // put classes from prior connector onto the canvas + this.addClass(previousClasses); + + // new: instead of binding listeners per connector, we now just have one delegate on the container. + // so for that handler we set the connection as the '_jsPlumb' member of the canvas element, and + // bgCanvas, if it exists, which it does right now in the VML renderer, so it won't from v 2.0.0 onwards. + if (this.canvas) { + this.canvas._jsPlumb = this; + } + if (this.bgCanvas) { + this.bgCanvas._jsPlumb = this; + } + + if (previous != null) { + var o = this.getOverlays(); + for (var i = 0; i < o.length; i++) { + if (o[i].transfer) { + o[i].transfer(this.connector); + } + } + } + + if (!doNotChangeListenerComponent) { + this.setListenerComponent(this.connector); + } + if (!doNotRepaint) { + this.repaint(); + } + } + }, + setConnector: function (connectorSpec, doNotRepaint, doNotChangeListenerComponent, typeId) { + var connector = this.prepareConnector(connectorSpec, typeId); + this.setPreparedConnector(connector, doNotRepaint, doNotChangeListenerComponent, typeId); + }, + paint: function (params) { + + if (!this._jsPlumb.instance.isSuspendDrawing() && this._jsPlumb.visible) { + params = params || {}; + var timestamp = params.timestamp, + // if the moving object is not the source we must transpose the two references. + swap = false, + tId = swap ? this.sourceId : this.targetId, sId = swap ? this.targetId : this.sourceId, + tIdx = swap ? 0 : 1, sIdx = swap ? 1 : 0; + + if (timestamp == null || timestamp !== this._jsPlumb.lastPaintedAt) { + var sourceInfo = this._jsPlumb.instance.updateOffset({elId:sId}).o, + targetInfo = this._jsPlumb.instance.updateOffset({elId:tId}).o, + sE = this.endpoints[sIdx], tE = this.endpoints[tIdx]; + + var sAnchorP = sE.anchor.getCurrentLocation({xy: [sourceInfo.left, sourceInfo.top], wh: [sourceInfo.width, sourceInfo.height], element: sE, timestamp: timestamp}), + tAnchorP = tE.anchor.getCurrentLocation({xy: [targetInfo.left, targetInfo.top], wh: [targetInfo.width, targetInfo.height], element: tE, timestamp: timestamp}); + + this.connector.resetBounds(); + + this.connector.compute({ + sourcePos: sAnchorP, + targetPos: tAnchorP, + sourceOrientation:sE.anchor.getOrientation(sE), + targetOrientation:tE.anchor.getOrientation(tE), + sourceEndpoint: this.endpoints[sIdx], + targetEndpoint: this.endpoints[tIdx], + "stroke-width": this._jsPlumb.paintStyleInUse.strokeWidth, + sourceInfo: sourceInfo, + targetInfo: targetInfo + }); + + var overlayExtents = { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity }; + + // compute overlays. we do this first so we can get their placements, and adjust the + // container if needs be (if an overlay would be clipped) + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays.hasOwnProperty(i)) { + var o = this._jsPlumb.overlays[i]; + if (o.isVisible()) { + this._jsPlumb.overlayPlacements[i] = o.draw(this.connector, this._jsPlumb.paintStyleInUse, this.getAbsoluteOverlayPosition(o)); + overlayExtents.minX = Math.min(overlayExtents.minX, this._jsPlumb.overlayPlacements[i].minX); + overlayExtents.maxX = Math.max(overlayExtents.maxX, this._jsPlumb.overlayPlacements[i].maxX); + overlayExtents.minY = Math.min(overlayExtents.minY, this._jsPlumb.overlayPlacements[i].minY); + overlayExtents.maxY = Math.max(overlayExtents.maxY, this._jsPlumb.overlayPlacements[i].maxY); + } + } + } + + var lineWidth = parseFloat(this._jsPlumb.paintStyleInUse.strokeWidth || 1) / 2, + outlineWidth = parseFloat(this._jsPlumb.paintStyleInUse.strokeWidth || 0), + extents = { + xmin: Math.min(this.connector.bounds.minX - (lineWidth + outlineWidth), overlayExtents.minX), + ymin: Math.min(this.connector.bounds.minY - (lineWidth + outlineWidth), overlayExtents.minY), + xmax: Math.max(this.connector.bounds.maxX + (lineWidth + outlineWidth), overlayExtents.maxX), + ymax: Math.max(this.connector.bounds.maxY + (lineWidth + outlineWidth), overlayExtents.maxY) + }; + // paint the connector. + this.connector.paintExtents = extents; + this.connector.paint(this._jsPlumb.paintStyleInUse, null, extents); + // and then the overlays + for (var j in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays.hasOwnProperty(j)) { + var p = this._jsPlumb.overlays[j]; + if (p.isVisible()) { + p.paint(this._jsPlumb.overlayPlacements[j], extents); + } + } + } + } + this._jsPlumb.lastPaintedAt = timestamp; + } + }, + repaint: function (params) { + var p = jsPlumb.extend(params || {}, {}); + p.elId = this.sourceId; + this.paint(p); + }, + prepareEndpoint: function (_jsPlumb, _newEndpoint, conn, existing, index, params, element, elementId, definition) { + var e; + if (existing) { + conn.endpoints[index] = existing; + existing.addConnection(conn); + } else { + if (!params.endpoints) { + params.endpoints = [ null, null ]; + } + var ep = definition || params.endpoints[index] || params.endpoint || _jsPlumb.Defaults.Endpoints[index] || _jp.Defaults.Endpoints[index] || _jsPlumb.Defaults.Endpoint || _jp.Defaults.Endpoint; + if (!params.endpointStyles) { + params.endpointStyles = [ null, null ]; + } + if (!params.endpointHoverStyles) { + params.endpointHoverStyles = [ null, null ]; + } + var es = params.endpointStyles[index] || params.endpointStyle || _jsPlumb.Defaults.EndpointStyles[index] || _jp.Defaults.EndpointStyles[index] || _jsPlumb.Defaults.EndpointStyle || _jp.Defaults.EndpointStyle; + // Endpoints derive their fill from the connector's stroke, if no fill was specified. + if (es.fill == null && params.paintStyle != null) { + es.fill = params.paintStyle.stroke; + } + + if (es.outlineStroke == null && params.paintStyle != null) { + es.outlineStroke = params.paintStyle.outlineStroke; + } + if (es.outlineWidth == null && params.paintStyle != null) { + es.outlineWidth = params.paintStyle.outlineWidth; + } + + var ehs = params.endpointHoverStyles[index] || params.endpointHoverStyle || _jsPlumb.Defaults.EndpointHoverStyles[index] || _jp.Defaults.EndpointHoverStyles[index] || _jsPlumb.Defaults.EndpointHoverStyle || _jp.Defaults.EndpointHoverStyle; + // endpoint hover fill style is derived from connector's hover stroke style + if (params.hoverPaintStyle != null) { + if (ehs == null) { + ehs = {}; + } + if (ehs.fill == null) { + ehs.fill = params.hoverPaintStyle.stroke; + } + } + var a = params.anchors ? params.anchors[index] : + params.anchor ? params.anchor : + _makeAnchor(_jsPlumb.Defaults.Anchors[index], elementId, _jsPlumb) || + _makeAnchor(_jp.Defaults.Anchors[index], elementId, _jsPlumb) || + _makeAnchor(_jsPlumb.Defaults.Anchor, elementId, _jsPlumb) || + _makeAnchor(_jp.Defaults.Anchor, elementId, _jsPlumb), + u = params.uuids ? params.uuids[index] : null; + + e = _newEndpoint({ + paintStyle: es, hoverPaintStyle: ehs, endpoint: ep, connections: [ conn ], + uuid: u, anchor: a, source: element, scope: params.scope, + reattach: params.reattach || _jsPlumb.Defaults.ReattachConnections, + detachable: params.detachable || _jsPlumb.Defaults.ConnectionsDetachable + }); + if (existing == null) { + e.setDeleteOnEmpty(true); + } + conn.endpoints[index] = e; + + if (params.drawEndpoints === false) { + e.setVisible(false, true, true); + } + + } + return e; + }, + replaceEndpoint:function(idx, endpointDef) { + + var current = this.endpoints[idx], + elId = current.elementId, + ebe = this._jsPlumb.instance.getEndpoints(elId), + _idx = ebe.indexOf(current), + _new = this.makeEndpoint(idx === 0, current.element, elId, null, endpointDef); + + this.endpoints[idx] = _new; + + ebe.splice(_idx, 1, _new); + this._jsPlumb.instance.deleteObject({endpoint:current, deleteAttachedObjects:false}); + this._jsPlumb.instance.fire("endpointReplaced", {previous:current, current:_new}); + + this._jsPlumb.instance.anchorManager.updateOtherEndpoint(this.endpoints[0].elementId, this.endpoints[1].elementId, this.endpoints[1].elementId, this); + + } + + }); // END Connection class +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the code for creating and manipulating anchors. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + + var root = this, + _ju = root.jsPlumbUtil, + _jp = root.jsPlumb; + + // + // manages anchors for all elements. + // + _jp.AnchorManager = function (params) { + var _amEndpoints = {}, + continuousAnchorLocations = {}, + continuousAnchorOrientations = {}, + connectionsByElementId = {}, + self = this, + anchorLists = {}, + jsPlumbInstance = params.jsPlumbInstance, + floatingConnections = {}, + // used by placeAnchors function + placeAnchorsOnLine = function (desc, elementDimensions, elementPosition, connections, horizontal, otherMultiplier, reverse) { + var a = [], step = elementDimensions[horizontal ? 0 : 1] / (connections.length + 1); + + for (var i = 0; i < connections.length; i++) { + var val = (i + 1) * step, other = otherMultiplier * elementDimensions[horizontal ? 1 : 0]; + if (reverse) { + val = elementDimensions[horizontal ? 0 : 1] - val; + } + + var dx = (horizontal ? val : other), x = elementPosition[0] + dx, xp = dx / elementDimensions[0], + dy = (horizontal ? other : val), y = elementPosition[1] + dy, yp = dy / elementDimensions[1]; + + a.push([ x, y, xp, yp, connections[i][1], connections[i][2] ]); + } + + return a; + }, + rightAndBottomSort = function(a, b) { + return b[0][0] - a[0][0]; + }, + // used by edgeSortFunctions + leftAndTopSort = function (a, b) { + var p1 = a[0][0] < 0 ? -Math.PI - a[0][0] : Math.PI - a[0][0], + p2 = b[0][0] < 0 ? -Math.PI - b[0][0] : Math.PI - b[0][0]; + + return p1 - p2; + }, + // used by placeAnchors + edgeSortFunctions = { + "top":leftAndTopSort, + "right": rightAndBottomSort, + "bottom": rightAndBottomSort, + "left": leftAndTopSort + }, + // used by placeAnchors + _sortHelper = function (_array, _fn) { + return _array.sort(_fn); + }, + // used by AnchorManager.redraw + placeAnchors = function (elementId, _anchorLists) { + var cd = jsPlumbInstance.getCachedData(elementId), sS = cd.s, sO = cd.o, + placeSomeAnchors = function (desc, elementDimensions, elementPosition, unsortedConnections, isHorizontal, otherMultiplier, orientation) { + if (unsortedConnections.length > 0) { + var sc = _sortHelper(unsortedConnections, edgeSortFunctions[desc]), // puts them in order based on the target element's pos on screen + reverse = desc === "right" || desc === "top", + anchors = placeAnchorsOnLine(desc, elementDimensions, + elementPosition, sc, + isHorizontal, otherMultiplier, reverse); + + // takes a computed anchor position and adjusts it for parent offset and scroll, then stores it. + var _setAnchorLocation = function (endpoint, anchorPos) { + continuousAnchorLocations[endpoint.id] = [ anchorPos[0], anchorPos[1], anchorPos[2], anchorPos[3] ]; + continuousAnchorOrientations[endpoint.id] = orientation; + }; + + for (var i = 0; i < anchors.length; i++) { + var c = anchors[i][4], weAreSource = c.endpoints[0].elementId === elementId, weAreTarget = c.endpoints[1].elementId === elementId; + if (weAreSource) { + _setAnchorLocation(c.endpoints[0], anchors[i]); + } + if (weAreTarget) { + _setAnchorLocation(c.endpoints[1], anchors[i]); + } + } + } + }; + + placeSomeAnchors("bottom", sS, [sO.left, sO.top], _anchorLists.bottom, true, 1, [0, 1]); + placeSomeAnchors("top", sS, [sO.left, sO.top], _anchorLists.top, true, 0, [0, -1]); + placeSomeAnchors("left", sS, [sO.left, sO.top], _anchorLists.left, false, 0, [-1, 0]); + placeSomeAnchors("right", sS, [sO.left, sO.top], _anchorLists.right, false, 1, [1, 0]); + }; + + this.reset = function () { + _amEndpoints = {}; + connectionsByElementId = {}; + anchorLists = {}; + }; + this.addFloatingConnection = function (key, conn) { + floatingConnections[key] = conn; + }; + this.removeFloatingConnection = function (key) { + delete floatingConnections[key]; + }; + this.newConnection = function (conn) { + var sourceId = conn.sourceId, targetId = conn.targetId, + ep = conn.endpoints, + doRegisterTarget = true, + registerConnection = function (otherIndex, otherEndpoint, otherAnchor, elId, c) { + if ((sourceId === targetId) && otherAnchor.isContinuous) { + // remove the target endpoint's canvas. we dont need it. + conn._jsPlumb.instance.removeElement(ep[1].canvas); + doRegisterTarget = false; + } + _ju.addToList(connectionsByElementId, elId, [c, otherEndpoint, otherAnchor.constructor === _jp.DynamicAnchor]); + }; + + registerConnection(0, ep[0], ep[0].anchor, targetId, conn); + if (doRegisterTarget) { + registerConnection(1, ep[1], ep[1].anchor, sourceId, conn); + } + }; + var removeEndpointFromAnchorLists = function (endpoint) { + (function (list, eId) { + if (list) { // transient anchors dont get entries in this list. + var f = function (e) { + return e[4] === eId; + }; + _ju.removeWithFunction(list.top, f); + _ju.removeWithFunction(list.left, f); + _ju.removeWithFunction(list.bottom, f); + _ju.removeWithFunction(list.right, f); + } + })(anchorLists[endpoint.elementId], endpoint.id); + }; + this.connectionDetached = function (connInfo, doNotRedraw) { + var connection = connInfo.connection || connInfo, + sourceId = connInfo.sourceId, + targetId = connInfo.targetId, + ep = connection.endpoints, + removeConnection = function (otherIndex, otherEndpoint, otherAnchor, elId, c) { + _ju.removeWithFunction(connectionsByElementId[elId], function (_c) { + return _c[0].id === c.id; + }); + }; + + removeConnection(1, ep[1], ep[1].anchor, sourceId, connection); + removeConnection(0, ep[0], ep[0].anchor, targetId, connection); + if (connection.floatingId) { + removeConnection(connection.floatingIndex, connection.floatingEndpoint, connection.floatingEndpoint.anchor, connection.floatingId, connection); + removeEndpointFromAnchorLists(connection.floatingEndpoint); + } + + // remove from anchorLists + removeEndpointFromAnchorLists(connection.endpoints[0]); + removeEndpointFromAnchorLists(connection.endpoints[1]); + + if (!doNotRedraw) { + self.redraw(connection.sourceId); + if (connection.targetId !== connection.sourceId) { + self.redraw(connection.targetId); + } + } + }; + this.add = function (endpoint, elementId) { + _ju.addToList(_amEndpoints, elementId, endpoint); + }; + this.changeId = function (oldId, newId) { + connectionsByElementId[newId] = connectionsByElementId[oldId]; + _amEndpoints[newId] = _amEndpoints[oldId]; + delete connectionsByElementId[oldId]; + delete _amEndpoints[oldId]; + }; + this.getConnectionsFor = function (elementId) { + return connectionsByElementId[elementId] || []; + }; + this.getEndpointsFor = function (elementId) { + return _amEndpoints[elementId] || []; + }; + this.deleteEndpoint = function (endpoint) { + _ju.removeWithFunction(_amEndpoints[endpoint.elementId], function (e) { + return e.id === endpoint.id; + }); + removeEndpointFromAnchorLists(endpoint); + }; + this.clearFor = function (elementId) { + delete _amEndpoints[elementId]; + _amEndpoints[elementId] = []; + }; + // updates the given anchor list by either updating an existing anchor's info, or adding it. this function + // also removes the anchor from its previous list, if the edge it is on has changed. + // all connections found along the way (those that are connected to one of the faces this function + // operates on) are added to the connsToPaint list, as are their endpoints. in this way we know to repaint + // them wthout having to calculate anything else about them. + var _updateAnchorList = function (lists, theta, order, conn, aBoolean, otherElId, idx, reverse, edgeId, elId, connsToPaint, endpointsToPaint) { + // first try to find the exact match, but keep track of the first index of a matching element id along the way.s + var exactIdx = -1, + firstMatchingElIdx = -1, + endpoint = conn.endpoints[idx], + endpointId = endpoint.id, + oIdx = [1, 0][idx], + values = [ + [ theta, order ], + conn, + aBoolean, + otherElId, + endpointId + ], + listToAddTo = lists[edgeId], + listToRemoveFrom = endpoint._continuousAnchorEdge ? lists[endpoint._continuousAnchorEdge] : null, + i, + candidate; + + if (listToRemoveFrom) { + var rIdx = _ju.findWithFunction(listToRemoveFrom, function (e) { + return e[4] === endpointId; + }); + if (rIdx !== -1) { + listToRemoveFrom.splice(rIdx, 1); + // get all connections from this list + for (i = 0; i < listToRemoveFrom.length; i++) { + candidate = listToRemoveFrom[i][1]; + _ju.addWithFunction(connsToPaint, candidate, function (c) { + return c.id === candidate.id; + }); + _ju.addWithFunction(endpointsToPaint, listToRemoveFrom[i][1].endpoints[idx], function (e) { + return e.id === candidate.endpoints[idx].id; + }); + _ju.addWithFunction(endpointsToPaint, listToRemoveFrom[i][1].endpoints[oIdx], function (e) { + return e.id === candidate.endpoints[oIdx].id; + }); + } + } + } + + for (i = 0; i < listToAddTo.length; i++) { + candidate = listToAddTo[i][1]; + if (params.idx === 1 && listToAddTo[i][3] === otherElId && firstMatchingElIdx === -1) { + firstMatchingElIdx = i; + } + _ju.addWithFunction(connsToPaint, candidate, function (c) { + return c.id === candidate.id; + }); + _ju.addWithFunction(endpointsToPaint, listToAddTo[i][1].endpoints[idx], function (e) { + return e.id === candidate.endpoints[idx].id; + }); + _ju.addWithFunction(endpointsToPaint, listToAddTo[i][1].endpoints[oIdx], function (e) { + return e.id === candidate.endpoints[oIdx].id; + }); + } + if (exactIdx !== -1) { + listToAddTo[exactIdx] = values; + } + else { + var insertIdx = reverse ? firstMatchingElIdx !== -1 ? firstMatchingElIdx : 0 : listToAddTo.length; // of course we will get this from having looked through the array shortly. + listToAddTo.splice(insertIdx, 0, values); + } + + // store this for next time. + endpoint._continuousAnchorEdge = edgeId; + }; + + // + // find the entry in an endpoint's list for this connection and update its target endpoint + // with the current target in the connection. + // This method and sourceChanged need to be folder into one. + // + this.updateOtherEndpoint = function (sourceElId, oldTargetId, newTargetId, connection) { + var sIndex = _ju.findWithFunction(connectionsByElementId[sourceElId], function (i) { + return i[0].id === connection.id; + }), + tIndex = _ju.findWithFunction(connectionsByElementId[oldTargetId], function (i) { + return i[0].id === connection.id; + }); + + // update or add data for source + if (sIndex !== -1) { + connectionsByElementId[sourceElId][sIndex][0] = connection; + connectionsByElementId[sourceElId][sIndex][1] = connection.endpoints[1]; + connectionsByElementId[sourceElId][sIndex][2] = connection.endpoints[1].anchor.constructor === _jp.DynamicAnchor; + } + + // remove entry for previous target (if there) + if (tIndex > -1) { + connectionsByElementId[oldTargetId].splice(tIndex, 1); + // add entry for new target + _ju.addToList(connectionsByElementId, newTargetId, [connection, connection.endpoints[0], connection.endpoints[0].anchor.constructor === _jp.DynamicAnchor]); + } + + connection.updateConnectedClass(); + }; + + // + // notification that the connection given has changed source from the originalId to the newId. + // This involves: + // 1. removing the connection from the list of connections stored for the originalId + // 2. updating the source information for the target of the connection + // 3. re-registering the connection in connectionsByElementId with the newId + // + this.sourceChanged = function (originalId, newId, connection, newElement) { + if (originalId !== newId) { + + connection.sourceId = newId; + connection.source = newElement; + + // remove the entry that points from the old source to the target + _ju.removeWithFunction(connectionsByElementId[originalId], function (info) { + return info[0].id === connection.id; + }); + // find entry for target and update it + var tIdx = _ju.findWithFunction(connectionsByElementId[connection.targetId], function (i) { + return i[0].id === connection.id; + }); + if (tIdx > -1) { + connectionsByElementId[connection.targetId][tIdx][0] = connection; + connectionsByElementId[connection.targetId][tIdx][1] = connection.endpoints[0]; + connectionsByElementId[connection.targetId][tIdx][2] = connection.endpoints[0].anchor.constructor === _jp.DynamicAnchor; + } + // add entry for new source + _ju.addToList(connectionsByElementId, newId, [connection, connection.endpoints[1], connection.endpoints[1].anchor.constructor === _jp.DynamicAnchor]); + + // TODO SP not final on this yet. when a user drags an existing connection and it turns into a self + // loop, then this code hides the target endpoint (by removing it from the DOM) But I think this should + // occur only if the anchor is Continuous + if (connection.endpoints[1].anchor.isContinuous) { + if (connection.source === connection.target) { + connection._jsPlumb.instance.removeElement(connection.endpoints[1].canvas); + } + else { + if (connection.endpoints[1].canvas.parentNode == null) { + connection._jsPlumb.instance.appendElement(connection.endpoints[1].canvas); + } + } + } + + connection.updateConnectedClass(); + } + }; + + // + // moves the given endpoint from `currentId` to `element`. + // This involves: + // + // 1. changing the key in _amEndpoints under which the endpoint is stored + // 2. changing the source or target values in all of the endpoint's connections + // 3. changing the array in connectionsByElementId in which the endpoint's connections + // are stored (done by either sourceChanged or updateOtherEndpoint) + // + this.rehomeEndpoint = function (ep, currentId, element) { + var eps = _amEndpoints[currentId] || [], + elementId = jsPlumbInstance.getId(element); + + if (elementId !== currentId) { + var idx = eps.indexOf(ep); + if (idx > -1) { + var _ep = eps.splice(idx, 1)[0]; + self.add(_ep, elementId); + } + } + + for (var i = 0; i < ep.connections.length; i++) { + if (ep.connections[i].sourceId === currentId) { + self.sourceChanged(currentId, ep.elementId, ep.connections[i], ep.element); + } + else if (ep.connections[i].targetId === currentId) { + ep.connections[i].targetId = ep.elementId; + ep.connections[i].target = ep.element; + self.updateOtherEndpoint(ep.connections[i].sourceId, currentId, ep.elementId, ep.connections[i]); + } + } + }; + + this.redraw = function (elementId, ui, timestamp, offsetToUI, clearEdits, doNotRecalcEndpoint) { + + if (!jsPlumbInstance.isSuspendDrawing()) { + // get all the endpoints for this element + var ep = _amEndpoints[elementId] || [], + endpointConnections = connectionsByElementId[elementId] || [], + connectionsToPaint = [], + endpointsToPaint = [], + anchorsToUpdate = []; + + timestamp = timestamp || jsPlumbInstance.timestamp(); + // offsetToUI are values that would have been calculated in the dragManager when registering + // an endpoint for an element that had a parent (somewhere in the hierarchy) that had been + // registered as draggable. + offsetToUI = offsetToUI || {left: 0, top: 0}; + if (ui) { + ui = { + left: ui.left + offsetToUI.left, + top: ui.top + offsetToUI.top + }; + } + + // valid for one paint cycle. + var myOffset = jsPlumbInstance.updateOffset({ elId: elementId, offset: ui, recalc: false, timestamp: timestamp }), + orientationCache = {}; + + // actually, first we should compute the orientation of this element to all other elements to which + // this element is connected with a continuous anchor (whether both ends of the connection have + // a continuous anchor or just one) + + for (var i = 0; i < endpointConnections.length; i++) { + var conn = endpointConnections[i][0], + sourceId = conn.sourceId, + targetId = conn.targetId, + sourceContinuous = conn.endpoints[0].anchor.isContinuous, + targetContinuous = conn.endpoints[1].anchor.isContinuous; + + if (sourceContinuous || targetContinuous) { + var oKey = sourceId + "_" + targetId, + o = orientationCache[oKey], + oIdx = conn.sourceId === elementId ? 1 : 0; + + if (sourceContinuous && !anchorLists[sourceId]) { + anchorLists[sourceId] = { top: [], right: [], bottom: [], left: [] }; + } + if (targetContinuous && !anchorLists[targetId]) { + anchorLists[targetId] = { top: [], right: [], bottom: [], left: [] }; + } + + if (elementId !== targetId) { + jsPlumbInstance.updateOffset({ elId: targetId, timestamp: timestamp }); + } + if (elementId !== sourceId) { + jsPlumbInstance.updateOffset({ elId: sourceId, timestamp: timestamp }); + } + + var td = jsPlumbInstance.getCachedData(targetId), + sd = jsPlumbInstance.getCachedData(sourceId); + + if (targetId === sourceId && (sourceContinuous || targetContinuous)) { + // here we may want to improve this by somehow determining the face we'd like + // to put the connector on. ideally, when drawing, the face should be calculated + // by determining which face is closest to the point at which the mouse button + // was released. for now, we're putting it on the top face. + _updateAnchorList( anchorLists[sourceId], -Math.PI / 2, 0, conn, false, targetId, 0, false, "top", sourceId, connectionsToPaint, endpointsToPaint); + _updateAnchorList( anchorLists[targetId], -Math.PI / 2, 0, conn, false, sourceId, 1, false, "top", targetId, connectionsToPaint, endpointsToPaint); + } + else { + if (!o) { + o = this.calculateOrientation(sourceId, targetId, sd.o, td.o, conn.endpoints[0].anchor, conn.endpoints[1].anchor, conn); + orientationCache[oKey] = o; + // this would be a performance enhancement, but the computed angles need to be clamped to + //the (-PI/2 -> PI/2) range in order for the sorting to work properly. + /* orientationCache[oKey2] = { + orientation:o.orientation, + a:[o.a[1], o.a[0]], + theta:o.theta + Math.PI, + theta2:o.theta2 + Math.PI + };*/ + } + if (sourceContinuous) { + _updateAnchorList(anchorLists[sourceId], o.theta, 0, conn, false, targetId, 0, false, o.a[0], sourceId, connectionsToPaint, endpointsToPaint); + } + if (targetContinuous) { + _updateAnchorList(anchorLists[targetId], o.theta2, -1, conn, true, sourceId, 1, true, o.a[1], targetId, connectionsToPaint, endpointsToPaint); + } + } + + if (sourceContinuous) { + _ju.addWithFunction(anchorsToUpdate, sourceId, function (a) { + return a === sourceId; + }); + } + if (targetContinuous) { + _ju.addWithFunction(anchorsToUpdate, targetId, function (a) { + return a === targetId; + }); + } + _ju.addWithFunction(connectionsToPaint, conn, function (c) { + return c.id === conn.id; + }); + if ((sourceContinuous && oIdx === 0) || (targetContinuous && oIdx === 1)) { + _ju.addWithFunction(endpointsToPaint, conn.endpoints[oIdx], function (e) { + return e.id === conn.endpoints[oIdx].id; + }); + } + } + } + + // place Endpoints whose anchors are continuous but have no Connections + for (i = 0; i < ep.length; i++) { + if (ep[i].connections.length === 0 && ep[i].anchor.isContinuous) { + if (!anchorLists[elementId]) { + anchorLists[elementId] = { top: [], right: [], bottom: [], left: [] }; + } + _updateAnchorList(anchorLists[elementId], -Math.PI / 2, 0, {endpoints: [ep[i], ep[i]], paint: function () { + }}, false, elementId, 0, false, ep[i].anchor.getDefaultFace(), elementId, connectionsToPaint, endpointsToPaint); + _ju.addWithFunction(anchorsToUpdate, elementId, function (a) { + return a === elementId; + }); + } + } + + // now place all the continuous anchors we need to; + for (i = 0; i < anchorsToUpdate.length; i++) { + placeAnchors(anchorsToUpdate[i], anchorLists[anchorsToUpdate[i]]); + } + + // now that continuous anchors have been placed, paint all the endpoints for this element + for (i = 0; i < ep.length; i++) { + ep[i].paint({ timestamp: timestamp, offset: myOffset, dimensions: myOffset.s, recalc: doNotRecalcEndpoint !== true }); + } + + // ... and any other endpoints we came across as a result of the continuous anchors. + for (i = 0; i < endpointsToPaint.length; i++) { + var cd = jsPlumbInstance.getCachedData(endpointsToPaint[i].elementId); + //endpointsToPaint[i].paint({ timestamp: timestamp, offset: cd, dimensions: cd.s }); + endpointsToPaint[i].paint({ timestamp: null, offset: cd, dimensions: cd.s }); + } + + // paint all the standard and "dynamic connections", which are connections whose other anchor is + // static and therefore does need to be recomputed; we make sure that happens only one time. + + // TODO we could have compiled a list of these in the first pass through connections; might save some time. + for (i = 0; i < endpointConnections.length; i++) { + var otherEndpoint = endpointConnections[i][1]; + if (otherEndpoint.anchor.constructor === _jp.DynamicAnchor) { + otherEndpoint.paint({ elementWithPrecedence: elementId, timestamp: timestamp }); + _ju.addWithFunction(connectionsToPaint, endpointConnections[i][0], function (c) { + return c.id === endpointConnections[i][0].id; + }); + // all the connections for the other endpoint now need to be repainted + for (var k = 0; k < otherEndpoint.connections.length; k++) { + if (otherEndpoint.connections[k] !== endpointConnections[i][0]) { + _ju.addWithFunction(connectionsToPaint, otherEndpoint.connections[k], function (c) { + return c.id === otherEndpoint.connections[k].id; + }); + } + } + } else { + _ju.addWithFunction(connectionsToPaint, endpointConnections[i][0], function (c) { + return c.id === endpointConnections[i][0].id; + }); + } + } + + // paint current floating connection for this element, if there is one. + var fc = floatingConnections[elementId]; + if (fc) { + fc.paint({timestamp: timestamp, recalc: false, elId: elementId}); + } + + // paint all the connections + for (i = 0; i < connectionsToPaint.length; i++) { + connectionsToPaint[i].paint({elId: elementId, timestamp: null, recalc: false, clearEdits: clearEdits}); + } + } + }; + + var ContinuousAnchor = function (anchorParams) { + _ju.EventGenerator.apply(this); + this.type = "Continuous"; + this.isDynamic = true; + this.isContinuous = true; + var faces = anchorParams.faces || ["top", "right", "bottom", "left"], + clockwise = !(anchorParams.clockwise === false), + availableFaces = { }, + opposites = { "top": "bottom", "right": "left", "left": "right", "bottom": "top" }, + clockwiseOptions = { "top": "right", "right": "bottom", "left": "top", "bottom": "left" }, + antiClockwiseOptions = { "top": "left", "right": "top", "left": "bottom", "bottom": "right" }, + secondBest = clockwise ? clockwiseOptions : antiClockwiseOptions, + lastChoice = clockwise ? antiClockwiseOptions : clockwiseOptions, + cssClass = anchorParams.cssClass || "", + _currentFace = null, _lockedFace = null, X_AXIS_FACES = ["left", "right"], Y_AXIS_FACES = ["top", "bottom"], + _lockedAxis = null; + + for (var i = 0; i < faces.length; i++) { + availableFaces[faces[i]] = true; + } + + this.getDefaultFace = function () { + return faces.length === 0 ? "top" : faces[0]; + }; + + this.isRelocatable = function() { return true; }; + this.isSnapOnRelocate = function() { return true; }; + + // if the given edge is supported, returns it. otherwise looks for a substitute that _is_ + // supported. if none supported we also return the request edge. + this.verifyEdge = function (edge) { + if (availableFaces[edge]) { + return edge; + } + else if (availableFaces[opposites[edge]]) { + return opposites[edge]; + } + else if (availableFaces[secondBest[edge]]) { + return secondBest[edge]; + } + else if (availableFaces[lastChoice[edge]]) { + return lastChoice[edge]; + } + return edge; // we have to give them something. + }; + + this.isEdgeSupported = function (edge) { + return _lockedAxis == null ? + + (_lockedFace == null ? availableFaces[edge] === true : _lockedFace === edge) + + : _lockedAxis.indexOf(edge) !== -1; + }; + + this.setCurrentFace = function(face, overrideLock) { + _currentFace = face; + // if currently locked, and the user wants to override, do that. + if (overrideLock && _lockedFace != null) { + _lockedFace = _currentFace; + } + }; + + this.getCurrentFace = function() { return _currentFace; }; + this.getSupportedFaces = function() { + var af = []; + for (var k in availableFaces) { + if (availableFaces[k]) { + af.push(k); + } + } + return af; + }; + + this.lock = function() { + _lockedFace = _currentFace; + }; + this.unlock = function() { + _lockedFace = null; + }; + this.isLocked = function() { + return _lockedFace != null; + }; + + this.lockCurrentAxis = function() { + if (_currentFace != null) { + _lockedAxis = (_currentFace === "left" || _currentFace === "right") ? X_AXIS_FACES : Y_AXIS_FACES; + } + }; + + this.unlockCurrentAxis = function() { + _lockedAxis = null; + }; + + this.compute = function (params) { + return continuousAnchorLocations[params.element.id] || [0, 0]; + }; + this.getCurrentLocation = function (params) { + return continuousAnchorLocations[params.element.id] || [0, 0]; + }; + this.getOrientation = function (endpoint) { + return continuousAnchorOrientations[endpoint.id] || [0, 0]; + }; + this.getCssClass = function () { + return cssClass; + }; + }; + + // continuous anchors + jsPlumbInstance.continuousAnchorFactory = { + get: function (params) { + return new ContinuousAnchor(params); + }, + clear: function (elementId) { + delete continuousAnchorLocations[elementId]; + } + }; + }; + + _jp.AnchorManager.prototype.calculateOrientation = function (sourceId, targetId, sd, td, sourceAnchor, targetAnchor) { + + var Orientation = { HORIZONTAL: "horizontal", VERTICAL: "vertical", DIAGONAL: "diagonal", IDENTITY: "identity" }, + axes = ["left", "top", "right", "bottom"]; + + if (sourceId === targetId) { + return { + orientation: Orientation.IDENTITY, + a: ["top", "top"] + }; + } + + var theta = Math.atan2((td.centery - sd.centery), (td.centerx - sd.centerx)), + theta2 = Math.atan2((sd.centery - td.centery), (sd.centerx - td.centerx)); + +// -------------------------------------------------------------------------------------- + + // improved face calculation. get midpoints of each face for source and target, then put in an array with all combinations of + // source/target faces. sort this array by distance between midpoints. the entry at index 0 is our preferred option. we can + // go through the array one by one until we find an entry in which each requested face is supported. + var candidates = [], midpoints = { }; + (function (types, dim) { + for (var i = 0; i < types.length; i++) { + midpoints[types[i]] = { + "left": [ dim[i].left, dim[i].centery ], + "right": [ dim[i].right, dim[i].centery ], + "top": [ dim[i].centerx, dim[i].top ], + "bottom": [ dim[i].centerx , dim[i].bottom] + }; + } + })([ "source", "target" ], [ sd, td ]); + + for (var sf = 0; sf < axes.length; sf++) { + for (var tf = 0; tf < axes.length; tf++) { + candidates.push({ + source: axes[sf], + target: axes[tf], + dist: Biltong.lineLength(midpoints.source[axes[sf]], midpoints.target[axes[tf]]) + }); + } + } + + candidates.sort(function (a, b) { + return a.dist < b.dist ? -1 : a.dist > b.dist ? 1 : 0; + }); + + // now go through this list and try to get an entry that satisfies both (there will be one, unless one of the anchors + // declares no available faces) + var sourceEdge = candidates[0].source, targetEdge = candidates[0].target; + for (var i = 0; i < candidates.length; i++) { + + if (!sourceAnchor.isContinuous || sourceAnchor.isEdgeSupported(candidates[i].source)) { + sourceEdge = candidates[i].source; + } + else { + sourceEdge = null; + } + + if (!targetAnchor.isContinuous || targetAnchor.isEdgeSupported(candidates[i].target)) { + targetEdge = candidates[i].target; + } + else { + targetEdge = null; + } + + if (sourceEdge != null && targetEdge != null) { + break; + } + } + + if (sourceAnchor.isContinuous) { + sourceAnchor.setCurrentFace(sourceEdge); + } + + if (targetAnchor.isContinuous) { + targetAnchor.setCurrentFace(targetEdge); + } + +// -------------------------------------------------------------------------------------- + + return { + a: [ sourceEdge, targetEdge ], + theta: theta, + theta2: theta2 + }; + }; + + /** + * Anchors model a position on some element at which an Endpoint may be located. They began as a first class citizen of jsPlumb, ie. a user + * was required to create these themselves, but over time this has been replaced by the concept of referring to them either by name (eg. "TopMiddle"), + * or by an array describing their coordinates (eg. [ 0, 0.5, 0, -1 ], which is the same as "TopMiddle"). jsPlumb now handles all of the + * creation of Anchors without user intervention. + */ + _jp.Anchor = function (params) { + this.x = params.x || 0; + this.y = params.y || 0; + this.elementId = params.elementId; + this.cssClass = params.cssClass || ""; + this.userDefinedLocation = null; + this.orientation = params.orientation || [ 0, 0 ]; + this.lastReturnValue = null; + this.offsets = params.offsets || [ 0, 0 ]; + this.timestamp = null; + + var relocatable = params.relocatable !== false; + this.isRelocatable = function() { return relocatable; }; + this.setRelocatable = function(_relocatable) { relocatable = _relocatable; }; + var snapOnRelocate = params.snapOnRelocate !== false; + this.isSnapOnRelocate = function() { return snapOnRelocate; }; + + var locked = false; + this.lock = function() { locked = true; }; + this.unlock = function() { locked = false; }; + this.isLocked = function() { return locked; }; + + _ju.EventGenerator.apply(this); + + this.compute = function (params) { + + var xy = params.xy, wh = params.wh, timestamp = params.timestamp; + + if (params.clearUserDefinedLocation) { + this.userDefinedLocation = null; + } + + if (timestamp && timestamp === this.timestamp) { + return this.lastReturnValue; + } + + if (this.userDefinedLocation != null) { + this.lastReturnValue = this.userDefinedLocation; + } + else { + this.lastReturnValue = [ xy[0] + (this.x * wh[0]) + this.offsets[0], xy[1] + (this.y * wh[1]) + this.offsets[1], this.x, this.y ]; + } + + this.timestamp = timestamp; + return this.lastReturnValue; + }; + + this.getCurrentLocation = function (params) { + params = params || {}; + return (this.lastReturnValue == null || (params.timestamp != null && this.timestamp !== params.timestamp)) ? this.compute(params) : this.lastReturnValue; + }; + + this.setPosition = function(x, y, ox, oy, overrideLock) { + if (!locked || overrideLock) { + this.x = x; + this.y = y; + this.orientation = [ ox, oy ]; + this.lastReturnValue = null; + } + }; + }; + _ju.extend(_jp.Anchor, _ju.EventGenerator, { + equals: function (anchor) { + if (!anchor) { + return false; + } + var ao = anchor.getOrientation(), + o = this.getOrientation(); + return this.x === anchor.x && this.y === anchor.y && this.offsets[0] === anchor.offsets[0] && this.offsets[1] === anchor.offsets[1] && o[0] === ao[0] && o[1] === ao[1]; + }, + getUserDefinedLocation: function () { + return this.userDefinedLocation; + }, + setUserDefinedLocation: function (l) { + this.userDefinedLocation = l; + }, + clearUserDefinedLocation: function () { + this.userDefinedLocation = null; + }, + getOrientation: function () { + return this.orientation; + }, + getCssClass: function () { + return this.cssClass; + } + }); + + /** + * An Anchor that floats. its orientation is computed dynamically from + * its position relative to the anchor it is floating relative to. It is used when creating + * a connection through drag and drop. + * + * TODO FloatingAnchor could totally be refactored to extend Anchor just slightly. + */ + _jp.FloatingAnchor = function (params) { + + _jp.Anchor.apply(this, arguments); + + // this is the anchor that this floating anchor is referenced to for + // purposes of calculating the orientation. + var ref = params.reference, + // the canvas this refers to. + refCanvas = params.referenceCanvas, + size = _jp.getSize(refCanvas), + // these are used to store the current relative position of our + // anchor wrt the reference anchor. they only indicate + // direction, so have a value of 1 or -1 (or, very rarely, 0). these + // values are written by the compute method, and read + // by the getOrientation method. + xDir = 0, yDir = 0, + // temporary member used to store an orientation when the floating + // anchor is hovering over another anchor. + orientation = null, + _lastResult = null; + + // clear from parent. we want floating anchor orientation to always be computed. + this.orientation = null; + + // set these to 0 each; they are used by certain types of connectors in the loopback case, + // when the connector is trying to clear the element it is on. but for floating anchor it's not + // very important. + this.x = 0; + this.y = 0; + + this.isFloating = true; + + this.compute = function (params) { + var xy = params.xy, + result = [ xy[0] + (size[0] / 2), xy[1] + (size[1] / 2) ]; // return origin of the element. we may wish to improve this so that any object can be the drag proxy. + _lastResult = result; + return result; + }; + + this.getOrientation = function (_endpoint) { + if (orientation) { + return orientation; + } + else { + var o = ref.getOrientation(_endpoint); + // here we take into account the orientation of the other + // anchor: if it declares zero for some direction, we declare zero too. this might not be the most awesome. perhaps we can come + // up with a better way. it's just so that the line we draw looks like it makes sense. maybe this wont make sense. + return [ Math.abs(o[0]) * xDir * -1, + Math.abs(o[1]) * yDir * -1 ]; + } + }; + + /** + * notification the endpoint associated with this anchor is hovering + * over another anchor; we want to assume that anchor's orientation + * for the duration of the hover. + */ + this.over = function (anchor, endpoint) { + orientation = anchor.getOrientation(endpoint); + }; + + /** + * notification the endpoint associated with this anchor is no + * longer hovering over another anchor; we should resume calculating + * orientation as we normally do. + */ + this.out = function () { + orientation = null; + }; + + this.getCurrentLocation = function (params) { + return _lastResult == null ? this.compute(params) : _lastResult; + }; + }; + _ju.extend(_jp.FloatingAnchor, _jp.Anchor); + + var _convertAnchor = function (anchor, jsPlumbInstance, elementId) { + return anchor.constructor === _jp.Anchor ? anchor : jsPlumbInstance.makeAnchor(anchor, elementId, jsPlumbInstance); + }; + + /* + * A DynamicAnchor is an Anchor that contains a list of other Anchors, which it cycles + * through at compute time to find the one that is located closest to + * the center of the target element, and returns that Anchor's compute + * method result. this causes endpoints to follow each other with + * respect to the orientation of their target elements, which is a useful + * feature for some applications. + * + */ + _jp.DynamicAnchor = function (params) { + _jp.Anchor.apply(this, arguments); + + this.isDynamic = true; + this.anchors = []; + this.elementId = params.elementId; + this.jsPlumbInstance = params.jsPlumbInstance; + + for (var i = 0; i < params.anchors.length; i++) { + this.anchors[i] = _convertAnchor(params.anchors[i], this.jsPlumbInstance, this.elementId); + } + + this.getAnchors = function () { + return this.anchors; + }; + + var _curAnchor = this.anchors.length > 0 ? this.anchors[0] : null, + _lastAnchor = _curAnchor, + self = this, + + // helper method to calculate the distance between the centers of the two elements. + _distance = function (anchor, cx, cy, xy, wh) { + var ax = xy[0] + (anchor.x * wh[0]), ay = xy[1] + (anchor.y * wh[1]), + acx = xy[0] + (wh[0] / 2), acy = xy[1] + (wh[1] / 2); + return (Math.sqrt(Math.pow(cx - ax, 2) + Math.pow(cy - ay, 2)) + + Math.sqrt(Math.pow(acx - ax, 2) + Math.pow(acy - ay, 2))); + }, + // default method uses distance between element centers. you can provide your own method in the dynamic anchor + // constructor (and also to jsPlumb.makeDynamicAnchor). the arguments to it are four arrays: + // xy - xy loc of the anchor's element + // wh - anchor's element's dimensions + // txy - xy loc of the element of the other anchor in the connection + // twh - dimensions of the element of the other anchor in the connection. + // anchors - the list of selectable anchors + _anchorSelector = params.selector || function (xy, wh, txy, twh, anchors) { + var cx = txy[0] + (twh[0] / 2), cy = txy[1] + (twh[1] / 2); + var minIdx = -1, minDist = Infinity; + for (var i = 0; i < anchors.length; i++) { + var d = _distance(anchors[i], cx, cy, xy, wh); + if (d < minDist) { + minIdx = i + 0; + minDist = d; + } + } + return anchors[minIdx]; + }; + + this.compute = function (params) { + var xy = params.xy, wh = params.wh, txy = params.txy, twh = params.twh; + + this.timestamp = params.timestamp; + + var udl = self.getUserDefinedLocation(); + if (udl != null) { + return udl; + } + + // if anchor is locked or an opposite element was not given, we + // maintain our state. anchor will be locked + // if it is the source of a drag and drop. + if (this.isLocked() || txy == null || twh == null) { + return _curAnchor.compute(params); + } + else { + params.timestamp = null; // otherwise clear this, i think. we want the anchor to compute. + } + + _curAnchor = _anchorSelector(xy, wh, txy, twh, this.anchors); + this.x = _curAnchor.x; + this.y = _curAnchor.y; + + if (_curAnchor !== _lastAnchor) { + this.fire("anchorChanged", _curAnchor); + } + + _lastAnchor = _curAnchor; + + return _curAnchor.compute(params); + }; + + this.getCurrentLocation = function (params) { + return this.getUserDefinedLocation() || (_curAnchor != null ? _curAnchor.getCurrentLocation(params) : null); + }; + + this.getOrientation = function (_endpoint) { + return _curAnchor != null ? _curAnchor.getOrientation(_endpoint) : [ 0, 0 ]; + }; + this.over = function (anchor, endpoint) { + if (_curAnchor != null) { + _curAnchor.over(anchor, endpoint); + } + }; + this.out = function () { + if (_curAnchor != null) { + _curAnchor.out(); + } + }; + + this.setAnchor = function(a) { + _curAnchor = a; + }; + + this.getCssClass = function () { + return (_curAnchor && _curAnchor.getCssClass()) || ""; + }; + + /** + * Attempt to match an anchor with the given coordinates and then set it. + * @param coords + * @returns true if matching anchor found, false otherwise. + */ + this.setAnchorCoordinates = function(coords) { + var idx = jsPlumbUtil.findWithFunction(this.anchors, function(a) { + return a.x === coords[0] && a.y === coords[1]; + }); + if (idx !== -1) { + this.setAnchor(this.anchors[idx]); + return true; + } else { + return false; + } + }; + }; + _ju.extend(_jp.DynamicAnchor, _jp.Anchor); + +// -------- basic anchors ------------------ + var _curryAnchor = function (x, y, ox, oy, type, fnInit) { + _jp.Anchors[type] = function (params) { + var a = params.jsPlumbInstance.makeAnchor([ x, y, ox, oy, 0, 0 ], params.elementId, params.jsPlumbInstance); + a.type = type; + if (fnInit) { + fnInit(a, params); + } + return a; + }; + }; + + _curryAnchor(0.5, 0, 0, -1, "TopCenter"); + _curryAnchor(0.5, 1, 0, 1, "BottomCenter"); + _curryAnchor(0, 0.5, -1, 0, "LeftMiddle"); + _curryAnchor(1, 0.5, 1, 0, "RightMiddle"); + + _curryAnchor(0.5, 0, 0, -1, "Top"); + _curryAnchor(0.5, 1, 0, 1, "Bottom"); + _curryAnchor(0, 0.5, -1, 0, "Left"); + _curryAnchor(1, 0.5, 1, 0, "Right"); + _curryAnchor(0.5, 0.5, 0, 0, "Center"); + _curryAnchor(1, 0, 0, -1, "TopRight"); + _curryAnchor(1, 1, 0, 1, "BottomRight"); + _curryAnchor(0, 0, 0, -1, "TopLeft"); + _curryAnchor(0, 1, 0, 1, "BottomLeft"); + +// ------- dynamic anchors ------------------- + + // default dynamic anchors chooses from Top, Right, Bottom, Left + _jp.Defaults.DynamicAnchors = function (params) { + return params.jsPlumbInstance.makeAnchors(["TopCenter", "RightMiddle", "BottomCenter", "LeftMiddle"], params.elementId, params.jsPlumbInstance); + }; + + // default dynamic anchors bound to name 'AutoDefault' + _jp.Anchors.AutoDefault = function (params) { + var a = params.jsPlumbInstance.makeDynamicAnchor(_jp.Defaults.DynamicAnchors(params)); + a.type = "AutoDefault"; + return a; + }; + +// ------- continuous anchors ------------------- + + var _curryContinuousAnchor = function (type, faces) { + _jp.Anchors[type] = function (params) { + var a = params.jsPlumbInstance.makeAnchor(["Continuous", { faces: faces }], params.elementId, params.jsPlumbInstance); + a.type = type; + return a; + }; + }; + + _jp.Anchors.Continuous = function (params) { + return params.jsPlumbInstance.continuousAnchorFactory.get(params); + }; + + _curryContinuousAnchor("ContinuousLeft", ["left"]); + _curryContinuousAnchor("ContinuousTop", ["top"]); + _curryContinuousAnchor("ContinuousBottom", ["bottom"]); + _curryContinuousAnchor("ContinuousRight", ["right"]); + +// ------- position assign anchors ------------------- + + // this anchor type lets you assign the position at connection time. + _curryAnchor(0, 0, 0, 0, "Assign", function (anchor, params) { + // find what to use as the "position finder". the user may have supplied a String which represents + // the id of a position finder in jsPlumb.AnchorPositionFinders, or the user may have supplied the + // position finder as a function. we find out what to use and then set it on the anchor. + var pf = params.position || "Fixed"; + anchor.positionFinder = pf.constructor === String ? params.jsPlumbInstance.AnchorPositionFinders[pf] : pf; + // always set the constructor params; the position finder might need them later (the Grid one does, + // for example) + anchor.constructorParams = params; + }); + + // these are the default anchor positions finders, which are used by the makeTarget function. supplying + // a position finder argument to that function allows you to specify where the resulting anchor will + // be located + root.jsPlumbInstance.prototype.AnchorPositionFinders = { + "Fixed": function (dp, ep, es) { + return [ (dp.left - ep.left) / es[0], (dp.top - ep.top) / es[1] ]; + }, + "Grid": function (dp, ep, es, params) { + var dx = dp.left - ep.left, dy = dp.top - ep.top, + gx = es[0] / (params.grid[0]), gy = es[1] / (params.grid[1]), + mx = Math.floor(dx / gx), my = Math.floor(dy / gy); + return [ ((mx * gx) + (gx / 2)) / es[0], ((my * gy) + (gy / 2)) / es[1] ]; + } + }; + +// ------- perimeter anchors ------------------- + + _jp.Anchors.Perimeter = function (params) { + params = params || {}; + var anchorCount = params.anchorCount || 60, + shape = params.shape; + + if (!shape) { + throw new Error("no shape supplied to Perimeter Anchor type"); + } + + var _circle = function () { + var r = 0.5, step = Math.PI * 2 / anchorCount, current = 0, a = []; + for (var i = 0; i < anchorCount; i++) { + var x = r + (r * Math.sin(current)), + y = r + (r * Math.cos(current)); + a.push([ x, y, 0, 0 ]); + current += step; + } + return a; + }, + _path = function (segments) { + var anchorsPerFace = anchorCount / segments.length, a = [], + _computeFace = function (x1, y1, x2, y2, fractionalLength, ox, oy) { + anchorsPerFace = anchorCount * fractionalLength; + var dx = (x2 - x1) / anchorsPerFace, dy = (y2 - y1) / anchorsPerFace; + for (var i = 0; i < anchorsPerFace; i++) { + a.push([ + x1 + (dx * i), + y1 + (dy * i), + ox == null ? 0 : ox, + oy == null ? 0 : oy + ]); + } + }; + + for (var i = 0; i < segments.length; i++) { + _computeFace.apply(null, segments[i]); + } + + return a; + }, + _shape = function (faces) { + var s = []; + for (var i = 0; i < faces.length; i++) { + s.push([faces[i][0], faces[i][1], faces[i][2], faces[i][3], 1 / faces.length, faces[i][4], faces[i][5]]); + } + return _path(s); + }, + _rectangle = function () { + return _shape([ + [ 0, 0, 1, 0, 0, -1 ], + [ 1, 0, 1, 1, 1, 0 ], + [ 1, 1, 0, 1, 0, 1 ], + [ 0, 1, 0, 0, -1, 0 ] + ]); + }; + + var _shapes = { + "Circle": _circle, + "Ellipse": _circle, + "Diamond": function () { + return _shape([ + [ 0.5, 0, 1, 0.5 ], + [ 1, 0.5, 0.5, 1 ], + [ 0.5, 1, 0, 0.5 ], + [ 0, 0.5, 0.5, 0 ] + ]); + }, + "Rectangle": _rectangle, + "Square": _rectangle, + "Triangle": function () { + return _shape([ + [ 0.5, 0, 1, 1 ], + [ 1, 1, 0, 1 ], + [ 0, 1, 0.5, 0] + ]); + }, + "Path": function (params) { + var points = params.points, p = [], tl = 0; + for (var i = 0; i < points.length - 1; i++) { + var l = Math.sqrt(Math.pow(points[i][2] - points[i][0]) + Math.pow(points[i][3] - points[i][1])); + tl += l; + p.push([points[i][0], points[i][1], points[i + 1][0], points[i + 1][1], l]); + } + for (var j = 0; j < p.length; j++) { + p[j][4] = p[j][4] / tl; + } + return _path(p); + } + }, + _rotate = function (points, amountInDegrees) { + var o = [], theta = amountInDegrees / 180 * Math.PI; + for (var i = 0; i < points.length; i++) { + var _x = points[i][0] - 0.5, + _y = points[i][1] - 0.5; + + o.push([ + 0.5 + ((_x * Math.cos(theta)) - (_y * Math.sin(theta))), + 0.5 + ((_x * Math.sin(theta)) + (_y * Math.cos(theta))), + points[i][2], + points[i][3] + ]); + } + return o; + }; + + if (!_shapes[shape]) { + throw new Error("Shape [" + shape + "] is unknown by Perimeter Anchor type"); + } + + var da = _shapes[shape](params); + if (params.rotation) { + da = _rotate(da, params.rotation); + } + var a = params.jsPlumbInstance.makeDynamicAnchor(da); + a.type = "Perimeter"; + return a; + }; +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the default Connectors, Endpoint and Overlay definitions. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil, _jg = root.Biltong; + + _jp.Segments = { + + /* + * Class: AbstractSegment + * A Connector is made up of 1..N Segments, each of which has a Type, such as 'Straight', 'Arc', + * 'Bezier'. This is new from 1.4.2, and gives us a lot more flexibility when drawing connections: things such + * as rounded corners for flowchart connectors, for example, or a straight line stub for Bezier connections, are + * much easier to do now. + * + * A Segment is responsible for providing coordinates for painting it, and also must be able to report its length. + * + */ + AbstractSegment: function (params) { + this.params = params; + + /** + * Function: findClosestPointOnPath + * Finds the closest point on this segment to the given [x, y], + * returning both the x and y of the point plus its distance from + * the supplied point, and its location along the length of the + * path inscribed by the segment. This implementation returns + * Infinity for distance and null values for everything else; + * subclasses are expected to override. + */ + this.findClosestPointOnPath = function (x, y) { + return { + d: Infinity, + x: null, + y: null, + l: null + }; + }; + + this.getBounds = function () { + return { + minX: Math.min(params.x1, params.x2), + minY: Math.min(params.y1, params.y2), + maxX: Math.max(params.x1, params.x2), + maxY: Math.max(params.y1, params.y2) + }; + }; + + /** + * Computes the list of points on the segment that intersect the given line. + * @method lineIntersection + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @returns {Array<[number, number]>} + */ + this.lineIntersection = function(x1, y1, x2, y2) { + return []; + }; + + /** + * Computes the list of points on the segment that intersect the box with the given origin and size. + * @method boxIntersection + * @param {number} x1 + * @param {number} y1 + * @param {number} w + * @param {number} h + * @returns {Array<[number, number]>} + */ + this.boxIntersection = function(x, y, w, h) { + var a = []; + a.push.apply(a, this.lineIntersection(x, y, x + w, y)); + a.push.apply(a, this.lineIntersection(x + w, y, x + w, y + h)); + a.push.apply(a, this.lineIntersection(x + w, y + h, x, y + h)); + a.push.apply(a, this.lineIntersection(x, y + h, x, y)); + return a; + }; + + /** + * Computes the list of points on the segment that intersect the given bounding box, which is an object of the form { x:.., y:.., w:.., h:.. }. + * @method lineIntersection + * @param {BoundingRectangle} box + * @returns {Array<[number, number]>} + */ + this.boundingBoxIntersection = function(box) { + return this.boxIntersection(box.x, box.y, box.w, box.y); + }; + }, + Straight: function (params) { + var _super = _jp.Segments.AbstractSegment.apply(this, arguments), + length, m, m2, x1, x2, y1, y2, + _recalc = function () { + length = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); + m = _jg.gradient({x: x1, y: y1}, {x: x2, y: y2}); + m2 = -1 / m; + }; + + this.type = "Straight"; + + this.getLength = function () { + return length; + }; + this.getGradient = function () { + return m; + }; + + this.getCoordinates = function () { + return { x1: x1, y1: y1, x2: x2, y2: y2 }; + }; + this.setCoordinates = function (coords) { + x1 = coords.x1; + y1 = coords.y1; + x2 = coords.x2; + y2 = coords.y2; + _recalc(); + }; + this.setCoordinates({x1: params.x1, y1: params.y1, x2: params.x2, y2: params.y2}); + + this.getBounds = function () { + return { + minX: Math.min(x1, x2), + minY: Math.min(y1, y2), + maxX: Math.max(x1, x2), + maxY: Math.max(y1, y2) + }; + }; + + /** + * returns the point on the segment's path that is 'location' along the length of the path, where 'location' is a decimal from + * 0 to 1 inclusive. for the straight line segment this is simple maths. + */ + this.pointOnPath = function (location, absolute) { + if (location === 0 && !absolute) { + return { x: x1, y: y1 }; + } + else if (location === 1 && !absolute) { + return { x: x2, y: y2 }; + } + else { + var l = absolute ? location > 0 ? location : length + location : location * length; + return _jg.pointOnLine({x: x1, y: y1}, {x: x2, y: y2}, l); + } + }; + + /** + * returns the gradient of the segment at the given point - which for us is constant. + */ + this.gradientAtPoint = function (_) { + return m; + }; + + /** + * returns the point on the segment's path that is 'distance' along the length of the path from 'location', where + * 'location' is a decimal from 0 to 1 inclusive, and 'distance' is a number of pixels. + * this hands off to jsPlumbUtil to do the maths, supplying two points and the distance. + */ + this.pointAlongPathFrom = function (location, distance, absolute) { + var p = this.pointOnPath(location, absolute), + farAwayPoint = distance <= 0 ? {x: x1, y: y1} : {x: x2, y: y2 }; + + /* + location == 1 ? { + x:x1 + ((x2 - x1) * 10), + y:y1 + ((y1 - y2) * 10) + } : + */ + + if (distance <= 0 && Math.abs(distance) > 1) { + distance *= -1; + } + + return _jg.pointOnLine(p, farAwayPoint, distance); + }; + + // is c between a and b? + var within = function (a, b, c) { + return c >= Math.min(a, b) && c <= Math.max(a, b); + }; + // find which of a and b is closest to c + var closest = function (a, b, c) { + return Math.abs(c - a) < Math.abs(c - b) ? a : b; + }; + + /** + Function: findClosestPointOnPath + Finds the closest point on this segment to [x,y]. See + notes on this method in AbstractSegment. + */ + this.findClosestPointOnPath = function (x, y) { + var out = { + d: Infinity, + x: null, + y: null, + l: null, + x1: x1, + x2: x2, + y1: y1, + y2: y2 + }; + + if (m === 0) { + out.y = y1; + out.x = within(x1, x2, x) ? x : closest(x1, x2, x); + } + else if (m === Infinity || m === -Infinity) { + out.x = x1; + out.y = within(y1, y2, y) ? y : closest(y1, y2, y); + } + else { + // closest point lies on normal from given point to this line. + var b = y1 - (m * x1), + b2 = y - (m2 * x), + // y1 = m.x1 + b and y1 = m2.x1 + b2 + // so m.x1 + b = m2.x1 + b2 + // x1(m - m2) = b2 - b + // x1 = (b2 - b) / (m - m2) + _x1 = (b2 - b) / (m - m2), + _y1 = (m * _x1) + b; + + out.x = within(x1, x2, _x1) ? _x1 : closest(x1, x2, _x1);//_x1; + out.y = within(y1, y2, _y1) ? _y1 : closest(y1, y2, _y1);//_y1; + } + + var fractionInSegment = _jg.lineLength([ out.x, out.y ], [ x1, y1 ]); + out.d = _jg.lineLength([x, y], [out.x, out.y]); + out.l = fractionInSegment / length; + return out; + }; + + var _pointLiesBetween = function(q, p1, p2) { + return (p2 > p1) ? (p1 <= q && q <= p2) : (p1 >= q && q >= p2); + }, _plb = _pointLiesBetween; + + /** + * Calculates all intersections of the given line with this segment. + * @param _x1 + * @param _y1 + * @param _x2 + * @param _y2 + * @returns {Array} + */ + this.lineIntersection = function(_x1, _y1, _x2, _y2) { + var m2 = Math.abs(_jg.gradient({x: _x1, y: _y1}, {x: _x2, y: _y2})), + m1 = Math.abs(m), + b = m1 === Infinity ? x1 : y1 - (m1 * x1), + out = [], + b2 = m2 === Infinity ? _x1 : _y1 - (m2 * _x1); + + // if lines parallel, no intersection + if (m2 !== m1) { + // perpendicular, segment horizontal + if(m2 === Infinity && m1 === 0) { + if (_plb(_x1, x1, x2) && _plb(y1, _y1, _y2)) { + out = [ _x1, y1 ]; // we return X on the incident line and Y from the segment + } + } else if(m2 === 0 && m1 === Infinity) { + // perpendicular, segment vertical + if(_plb(_y1, y1, y2) && _plb(x1, _x1, _x2)) { + out = [x1, _y1]; // we return X on the segment and Y from the incident line + } + } else { + var X, Y; + if (m2 === Infinity) { + // test line is a vertical line. where does it cross the segment? + X = _x1; + if (_plb(X, x1, x2)) { + Y = (m1 * _x1) + b; + if (_plb(Y, _y1, _y2)) { + out = [ X, Y ]; + } + } + } else if (m2 === 0) { + Y = _y1; + // test line is a horizontal line. where does it cross the segment? + if (_plb(Y, y1, y2)) { + X = (_y1 - b) / m1; + if (_plb(X, _x1, _x2)) { + out = [ X, Y ]; + } + } + } else { + // mX + b = m2X + b2 + // mX - m2X = b2 - b + // X(m - m2) = b2 - b + // X = (b2 - b) / (m - m2) + // Y = mX + b + X = (b2 - b) / (m1 - m2); + Y = (m1 * X) + b; + if(_plb(X, x1, x2) && _plb(Y, y1, y2)) { + out = [ X, Y]; + } + } + } + } + + return out; + }; + + /** + * Calculates all intersections of the given box with this segment. By default this method simply calls `lineIntersection` with each of the four + * faces of the box; subclasses can override this if they think there's a faster way to compute the entire box at once. + * @param x X position of top left corner of box + * @param y Y position of top left corner of box + * @param w width of box + * @param h height of box + * @returns {Array} + */ + this.boxIntersection = function(x, y, w, h) { + var a = []; + a.push.apply(a, this.lineIntersection(x, y, x + w, y)); + a.push.apply(a, this.lineIntersection(x + w, y, x + w, y + h)); + a.push.apply(a, this.lineIntersection(x + w, y + h, x, y + h)); + a.push.apply(a, this.lineIntersection(x, y + h, x, y)); + return a; + }; + + /** + * Calculates all intersections of the given bounding box with this segment. By default this method simply calls `lineIntersection` with each of the four + * faces of the box; subclasses can override this if they think there's a faster way to compute the entire box at once. + * @param box Bounding box, in { x:.., y:..., w:..., h:... } format. + * @returns {Array} + */ + this.boundingBoxIntersection = function(box) { + return this.boxIntersection(box.x, box.y, box.w, box.h); + }; + }, + + /* + Arc Segment. You need to supply: + + r - radius + cx - center x for the arc + cy - center y for the arc + ac - whether the arc is anticlockwise or not. default is clockwise. + + and then either: + + startAngle - startAngle for the arc. + endAngle - endAngle for the arc. + + or: + + x1 - x for start point + y1 - y for start point + x2 - x for end point + y2 - y for end point + + */ + Arc: function (params) { + var _super = _jp.Segments.AbstractSegment.apply(this, arguments), + _calcAngle = function (_x, _y) { + return _jg.theta([params.cx, params.cy], [_x, _y]); + }, + _calcAngleForLocation = function (segment, location) { + if (segment.anticlockwise) { + var sa = segment.startAngle < segment.endAngle ? segment.startAngle + TWO_PI : segment.startAngle, + s = Math.abs(sa - segment.endAngle); + return sa - (s * location); + } + else { + var ea = segment.endAngle < segment.startAngle ? segment.endAngle + TWO_PI : segment.endAngle, + ss = Math.abs(ea - segment.startAngle); + + return segment.startAngle + (ss * location); + } + }, + TWO_PI = 2 * Math.PI; + + this.radius = params.r; + this.anticlockwise = params.ac; + this.type = "Arc"; + + if (params.startAngle && params.endAngle) { + this.startAngle = params.startAngle; + this.endAngle = params.endAngle; + this.x1 = params.cx + (this.radius * Math.cos(params.startAngle)); + this.y1 = params.cy + (this.radius * Math.sin(params.startAngle)); + this.x2 = params.cx + (this.radius * Math.cos(params.endAngle)); + this.y2 = params.cy + (this.radius * Math.sin(params.endAngle)); + } + else { + this.startAngle = _calcAngle(params.x1, params.y1); + this.endAngle = _calcAngle(params.x2, params.y2); + this.x1 = params.x1; + this.y1 = params.y1; + this.x2 = params.x2; + this.y2 = params.y2; + } + + if (this.endAngle < 0) { + this.endAngle += TWO_PI; + } + if (this.startAngle < 0) { + this.startAngle += TWO_PI; + } + + // segment is used by vml + //this.segment = _jg.quadrant([this.x1, this.y1], [this.x2, this.y2]); + + // we now have startAngle and endAngle as positive numbers, meaning the + // absolute difference (|d|) between them is the sweep (s) of this arc, unless the + // arc is 'anticlockwise' in which case 's' is given by 2PI - |d|. + + var ea = this.endAngle < this.startAngle ? this.endAngle + TWO_PI : this.endAngle; + this.sweep = Math.abs(ea - this.startAngle); + if (this.anticlockwise) { + this.sweep = TWO_PI - this.sweep; + } + var circumference = 2 * Math.PI * this.radius, + frac = this.sweep / TWO_PI, + length = circumference * frac; + + this.getLength = function () { + return length; + }; + + this.getBounds = function () { + return { + minX: params.cx - params.r, + maxX: params.cx + params.r, + minY: params.cy - params.r, + maxY: params.cy + params.r + }; + }; + + var VERY_SMALL_VALUE = 0.0000000001, + gentleRound = function (n) { + var f = Math.floor(n), r = Math.ceil(n); + if (n - f < VERY_SMALL_VALUE) { + return f; + } + else if (r - n < VERY_SMALL_VALUE) { + return r; + } + return n; + }; + + /** + * returns the point on the segment's path that is 'location' along the length of the path, where 'location' is a decimal from + * 0 to 1 inclusive. + */ + this.pointOnPath = function (location, absolute) { + + if (location === 0) { + return { x: this.x1, y: this.y1, theta: this.startAngle }; + } + else if (location === 1) { + return { x: this.x2, y: this.y2, theta: this.endAngle }; + } + + if (absolute) { + location = location / length; + } + + var angle = _calcAngleForLocation(this, location), + _x = params.cx + (params.r * Math.cos(angle)), + _y = params.cy + (params.r * Math.sin(angle)); + + return { x: gentleRound(_x), y: gentleRound(_y), theta: angle }; + }; + + /** + * returns the gradient of the segment at the given point. + */ + this.gradientAtPoint = function (location, absolute) { + var p = this.pointOnPath(location, absolute); + var m = _jg.normal([ params.cx, params.cy ], [p.x, p.y ]); + if (!this.anticlockwise && (m === Infinity || m === -Infinity)) { + m *= -1; + } + return m; + }; + + this.pointAlongPathFrom = function (location, distance, absolute) { + var p = this.pointOnPath(location, absolute), + arcSpan = distance / circumference * 2 * Math.PI, + dir = this.anticlockwise ? -1 : 1, + startAngle = p.theta + (dir * arcSpan), + startX = params.cx + (this.radius * Math.cos(startAngle)), + startY = params.cy + (this.radius * Math.sin(startAngle)); + + return {x: startX, y: startY}; + }; + + // TODO: lineIntersection + }, + + Bezier: function (params) { + this.curve = [ + { x: params.x1, y: params.y1}, + { x: params.cp1x, y: params.cp1y }, + { x: params.cp2x, y: params.cp2y }, + { x: params.x2, y: params.y2 } + ]; + + var _isPoint = function(c) { + return c[0].x === c[1].x && c[0].y === c[1].y; + }; + + var _dist = function(p1, p2 ) { + return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2)); + }; + + var _compute = function(loc) { + + var EMPTY_POINT = {x:0, y:0}; + + if (loc === 0) { + return this.curve[0]; + } + + var degree = this.curve.length - 1; + + if (loc === 1) { + return this.curve[degree]; + } + + var o = this.curve; + var s = 1 - loc; + + if (degree === 0) { + return this.curve[0]; + } + + if (degree === 1) { + return { + x: s * o[0].x + loc * o[1].x, + y: s * o[0].y + loc * o[1].y + }; + } + + if (degree < 4) { + + var l = s * s, h = loc * loc, u = 0, m, g, f; + + if (degree === 2) { + o = [o[0], o[1], o[2], EMPTY_POINT]; + m = l; + g = 2 * (s * loc); + f = h; + } else if (degree === 3) { + m = l * s; + g = 3 * (l * loc); + f = 3 * (s * h); + u = loc * h; + } + + return { + x: m * o[0].x + g * o[1].x + f * o[2].x + u * o[3].x, + y: m * o[0].y + g * o[1].y + f * o[2].y + u * o[3].y + }; + } else { + return EMPTY_POINT; // not supported. + } + }.bind(this); + + var _getLUT = function(steps) { + var out = []; + steps--; + for (var n = 0; n <= steps; n++) { + out.push(_compute(n / steps)); + } + return out; + }; + + var _computeLength = function() { + + if (_isPoint(this.curve)) { + this.length = 0; + } + + var steps = 16; + var lut = _getLUT(steps); + this.length = 0; + + for (var i = 0; i < steps - 1; i++) { + var a = lut[i], b = lut[i + 1]; + this.length += _dist(a, b); + } + }.bind(this); + + var _super = _jp.Segments.AbstractSegment.apply(this, arguments); + // although this is not a strictly rigorous determination of bounds + // of a bezier curve, it works for the types of curves that this segment + // type produces. + this.bounds = { + minX: Math.min(params.x1, params.x2, params.cp1x, params.cp2x), + minY: Math.min(params.y1, params.y2, params.cp1y, params.cp2y), + maxX: Math.max(params.x1, params.x2, params.cp1x, params.cp2x), + maxY: Math.max(params.y1, params.y2, params.cp1y, params.cp2y) + }; + + this.type = "Bezier"; + + _computeLength(); + + var _translateLocation = function (_curve, location, absolute) { + if (absolute) { + location = root.jsBezier.locationAlongCurveFrom(_curve, location > 0 ? 0 : 1, location); + } + + return location; + }; + + /** + * returns the point on the segment's path that is 'location' along the length of the path, where 'location' is a decimal from + * 0 to 1 inclusive. + */ + this.pointOnPath = function (location, absolute) { + location = _translateLocation(this.curve, location, absolute); + return root.jsBezier.pointOnCurve(this.curve, location); + }; + + /** + * returns the gradient of the segment at the given point. + */ + this.gradientAtPoint = function (location, absolute) { + location = _translateLocation(this.curve, location, absolute); + return root.jsBezier.gradientAtPoint(this.curve, location); + }; + + this.pointAlongPathFrom = function (location, distance, absolute) { + location = _translateLocation(this.curve, location, absolute); + return root.jsBezier.pointAlongCurveFrom(this.curve, location, distance); + }; + + this.getLength = function () { + return this.length; + }; + + this.getBounds = function () { + return this.bounds; + }; + + this.findClosestPointOnPath = function (x, y) { + var p = root.jsBezier.nearestPointOnCurve({x:x,y:y}, this.curve); + return { + d:Math.sqrt(Math.pow(p.point.x - x, 2) + Math.pow(p.point.y - y, 2)), + x:p.point.x, + y:p.point.y, + l:1 - p.location, + s:this + }; + }; + + this.lineIntersection = function(x1, y1, x2, y2) { + return root.jsBezier.lineIntersection(x1, y1, x2, y2, this.curve); + }; + } + }; + + _jp.SegmentRenderer = { + getPath: function (segment, isFirstSegment) { + return ({ + "Straight": function (isFirstSegment) { + var d = segment.getCoordinates(); + return (isFirstSegment ? "M " + d.x1 + " " + d.y1 + " " : "") + "L " + d.x2 + " " + d.y2; + }, + "Bezier": function (isFirstSegment) { + var d = segment.params; + return (isFirstSegment ? "M " + d.x2 + " " + d.y2 + " " : "") + + "C " + d.cp2x + " " + d.cp2y + " " + d.cp1x + " " + d.cp1y + " " + d.x1 + " " + d.y1; + }, + "Arc": function (isFirstSegment) { + var d = segment.params, + laf = segment.sweep > Math.PI ? 1 : 0, + sf = segment.anticlockwise ? 0 : 1; + + return (isFirstSegment ? "M" + segment.x1 + " " + segment.y1 + " " : "") + "A " + segment.radius + " " + d.r + " 0 " + laf + "," + sf + " " + segment.x2 + " " + segment.y2; + } + })[segment.type](isFirstSegment); + } + }; + + /* + Class: UIComponent + Superclass for Connector and AbstractEndpoint. + */ + var AbstractComponent = function () { + this.resetBounds = function () { + this.bounds = { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity }; + }; + this.resetBounds(); + }; + + /* + * Class: Connector + * Superclass for all Connectors; here is where Segments are managed. This is exposed on jsPlumb just so it + * can be accessed from other files. You should not try to instantiate one of these directly. + * + * When this class is asked for a pointOnPath, or gradient etc, it must first figure out which segment to dispatch + * that request to. This is done by keeping track of the total connector length as segments are added, and also + * their cumulative ratios to the total length. Then when the right segment is found it is a simple case of dispatching + * the request to it (and adjusting 'location' so that it is relative to the beginning of that segment.) + */ + _jp.Connectors.AbstractConnector = function (params) { + + AbstractComponent.apply(this, arguments); + + var segments = [], + totalLength = 0, + segmentProportions = [], + segmentProportionalLengths = [], + stub = params.stub || 0, + sourceStub = _ju.isArray(stub) ? stub[0] : stub, + targetStub = _ju.isArray(stub) ? stub[1] : stub, + gap = params.gap || 0, + sourceGap = _ju.isArray(gap) ? gap[0] : gap, + targetGap = _ju.isArray(gap) ? gap[1] : gap, + userProvidedSegments = null, + paintInfo = null; + + this.getPathData = function() { + var p = ""; + for (var i = 0; i < segments.length; i++) { + p += _jp.SegmentRenderer.getPath(segments[i], i === 0); + p += " "; + } + return p; + }; + + /** + * Function: findSegmentForPoint + * Returns the segment that is closest to the given [x,y], + * null if nothing found. This function returns a JS + * object with: + * + * d - distance from segment + * l - proportional location in segment + * x - x point on the segment + * y - y point on the segment + * s - the segment itself. + * connectorLocation - the location on the connector of the point, expressed as a decimal between 0 and 1 inclusive. + */ + this.findSegmentForPoint = function (x, y) { + var out = { d: Infinity, s: null, x: null, y: null, l: null }; + for (var i = 0; i < segments.length; i++) { + var _s = segments[i].findClosestPointOnPath(x, y); + if (_s.d < out.d) { + out.d = _s.d; + out.l = _s.l; + out.x = _s.x; + out.y = _s.y; + out.s = segments[i]; + out.x1 = _s.x1; + out.x2 = _s.x2; + out.y1 = _s.y1; + out.y2 = _s.y2; + out.index = i; + out.connectorLocation = segmentProportions[i][0] + (_s.l * (segmentProportions[i][1] - segmentProportions[i][0])); + } + } + + return out; + }; + + this.lineIntersection = function(x1, y1, x2, y2) { + var out = []; + for (var i = 0; i < segments.length; i++) { + out.push.apply(out, segments[i].lineIntersection(x1, y1, x2, y2)); + } + return out; + }; + + this.boxIntersection = function(x, y, w, h) { + var out = []; + for (var i = 0; i < segments.length; i++) { + out.push.apply(out, segments[i].boxIntersection(x, y, w, h)); + } + return out; + }; + + this.boundingBoxIntersection = function(box) { + var out = []; + for (var i = 0; i < segments.length; i++) { + out.push.apply(out, segments[i].boundingBoxIntersection(box)); + } + return out; + }; + + var _updateSegmentProportions = function () { + var curLoc = 0; + for (var i = 0; i < segments.length; i++) { + var sl = segments[i].getLength(); + segmentProportionalLengths[i] = sl / totalLength; + segmentProportions[i] = [curLoc, (curLoc += (sl / totalLength)) ]; + } + }, + + /** + * returns [segment, proportion of travel in segment, segment index] for the segment + * that contains the point which is 'location' distance along the entire path, where + * 'location' is a decimal between 0 and 1 inclusive. in this connector type, paths + * are made up of a list of segments, each of which contributes some fraction to + * the total length. + * From 1.3.10 this also supports the 'absolute' property, which lets us specify a location + * as the absolute distance in pixels, rather than a proportion of the total path. + */ + _findSegmentForLocation = function (location, absolute) { + + var idx, i, inSegmentProportion; + + if (absolute) { + location = location > 0 ? location / totalLength : (totalLength + location) / totalLength; + } + + // if location 1 we know its the last segment + if (location === 1) { + idx = segments.length - 1; + inSegmentProportion = 1; + } else if (location === 0) { + // if location 0 we know its the first segment + inSegmentProportion = 0; + idx = 0; + } else { + + // if location >= 0.5, traverse backwards (of course not exact, who knows the segment proportions. but + // an educated guess at least) + if (location >= 0.5) { + + idx = 0; + inSegmentProportion = 0; + for (i = segmentProportions.length - 1; i > -1; i--) { + if (segmentProportions[i][1] >= location && segmentProportions[i][0] <= location) { + idx = i; + inSegmentProportion = (location - segmentProportions[i][0]) / segmentProportionalLengths[i]; + break; + } + } + + } else { + idx = segmentProportions.length - 1; + inSegmentProportion = 1; + for (i = 0; i < segmentProportions.length; i++) { + if (segmentProportions[i][1] >= location) { + idx = i; + inSegmentProportion = (location - segmentProportions[i][0]) / segmentProportionalLengths[i]; + break; + } + } + } + } + + return { segment: segments[idx], proportion: inSegmentProportion, index: idx }; + }, + _addSegment = function (conn, type, params) { + if (params.x1 === params.x2 && params.y1 === params.y2) { + return; + } + var s = new _jp.Segments[type](params); + segments.push(s); + totalLength += s.getLength(); + conn.updateBounds(s); + }, + _clearSegments = function () { + totalLength = segments.length = segmentProportions.length = segmentProportionalLengths.length = 0; + }; + + this.setSegments = function (_segs) { + userProvidedSegments = []; + totalLength = 0; + for (var i = 0; i < _segs.length; i++) { + userProvidedSegments.push(_segs[i]); + totalLength += _segs[i].getLength(); + } + }; + + this.getLength = function() { + return totalLength; + }; + + var _prepareCompute = function (params) { + this.strokeWidth = params.strokeWidth; + var segment = _jg.quadrant(params.sourcePos, params.targetPos), + swapX = params.targetPos[0] < params.sourcePos[0], + swapY = params.targetPos[1] < params.sourcePos[1], + lw = params.strokeWidth || 1, + so = params.sourceEndpoint.anchor.getOrientation(params.sourceEndpoint), + to = params.targetEndpoint.anchor.getOrientation(params.targetEndpoint), + x = swapX ? params.targetPos[0] : params.sourcePos[0], + y = swapY ? params.targetPos[1] : params.sourcePos[1], + w = Math.abs(params.targetPos[0] - params.sourcePos[0]), + h = Math.abs(params.targetPos[1] - params.sourcePos[1]); + + // if either anchor does not have an orientation set, we derive one from their relative + // positions. we fix the axis to be the one in which the two elements are further apart, and + // point each anchor at the other element. this is also used when dragging a new connection. + if (so[0] === 0 && so[1] === 0 || to[0] === 0 && to[1] === 0) { + var index = w > h ? 0 : 1, oIndex = [1, 0][index]; + so = []; + to = []; + so[index] = params.sourcePos[index] > params.targetPos[index] ? -1 : 1; + to[index] = params.sourcePos[index] > params.targetPos[index] ? 1 : -1; + so[oIndex] = 0; + to[oIndex] = 0; + } + + var sx = swapX ? w + (sourceGap * so[0]) : sourceGap * so[0], + sy = swapY ? h + (sourceGap * so[1]) : sourceGap * so[1], + tx = swapX ? targetGap * to[0] : w + (targetGap * to[0]), + ty = swapY ? targetGap * to[1] : h + (targetGap * to[1]), + oProduct = ((so[0] * to[0]) + (so[1] * to[1])); + + var result = { + sx: sx, sy: sy, tx: tx, ty: ty, lw: lw, + xSpan: Math.abs(tx - sx), + ySpan: Math.abs(ty - sy), + mx: (sx + tx) / 2, + my: (sy + ty) / 2, + so: so, to: to, x: x, y: y, w: w, h: h, + segment: segment, + startStubX: sx + (so[0] * sourceStub), + startStubY: sy + (so[1] * sourceStub), + endStubX: tx + (to[0] * targetStub), + endStubY: ty + (to[1] * targetStub), + isXGreaterThanStubTimes2: Math.abs(sx - tx) > (sourceStub + targetStub), + isYGreaterThanStubTimes2: Math.abs(sy - ty) > (sourceStub + targetStub), + opposite: oProduct === -1, + perpendicular: oProduct === 0, + orthogonal: oProduct === 1, + sourceAxis: so[0] === 0 ? "y" : "x", + points: [x, y, w, h, sx, sy, tx, ty ], + stubs:[sourceStub, targetStub] + }; + result.anchorOrientation = result.opposite ? "opposite" : result.orthogonal ? "orthogonal" : "perpendicular"; + return result; + }; + + this.getSegments = function () { + return segments; + }; + + this.updateBounds = function (segment) { + var segBounds = segment.getBounds(); + this.bounds.minX = Math.min(this.bounds.minX, segBounds.minX); + this.bounds.maxX = Math.max(this.bounds.maxX, segBounds.maxX); + this.bounds.minY = Math.min(this.bounds.minY, segBounds.minY); + this.bounds.maxY = Math.max(this.bounds.maxY, segBounds.maxY); + }; + + var dumpSegmentsToConsole = function () { + console.log("SEGMENTS:"); + for (var i = 0; i < segments.length; i++) { + console.log(segments[i].type, segments[i].getLength(), segmentProportions[i]); + } + }; + + this.pointOnPath = function (location, absolute) { + var seg = _findSegmentForLocation(location, absolute); + return seg.segment && seg.segment.pointOnPath(seg.proportion, false) || [0, 0]; + }; + + this.gradientAtPoint = function (location, absolute) { + var seg = _findSegmentForLocation(location, absolute); + return seg.segment && seg.segment.gradientAtPoint(seg.proportion, false) || 0; + }; + + this.pointAlongPathFrom = function (location, distance, absolute) { + var seg = _findSegmentForLocation(location, absolute); + // TODO what happens if this crosses to the next segment? + return seg.segment && seg.segment.pointAlongPathFrom(seg.proportion, distance, false) || [0, 0]; + }; + + this.compute = function (params) { + paintInfo = _prepareCompute.call(this, params); + + _clearSegments(); + this._compute(paintInfo, params); + this.x = paintInfo.points[0]; + this.y = paintInfo.points[1]; + this.w = paintInfo.points[2]; + this.h = paintInfo.points[3]; + this.segment = paintInfo.segment; + _updateSegmentProportions(); + }; + + return { + addSegment: _addSegment, + prepareCompute: _prepareCompute, + sourceStub: sourceStub, + targetStub: targetStub, + maxStub: Math.max(sourceStub, targetStub), + sourceGap: sourceGap, + targetGap: targetGap, + maxGap: Math.max(sourceGap, targetGap) + }; + }; + _ju.extend(_jp.Connectors.AbstractConnector, AbstractComponent); + + + // ********************************* END OF CONNECTOR TYPES ******************************************************************* + + // ********************************* ENDPOINT TYPES ******************************************************************* + + _jp.Endpoints.AbstractEndpoint = function (params) { + AbstractComponent.apply(this, arguments); + var compute = this.compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + var out = this._compute.apply(this, arguments); + this.x = out[0]; + this.y = out[1]; + this.w = out[2]; + this.h = out[3]; + this.bounds.minX = this.x; + this.bounds.minY = this.y; + this.bounds.maxX = this.x + this.w; + this.bounds.maxY = this.y + this.h; + return out; + }; + return { + compute: compute, + cssClass: params.cssClass + }; + }; + _ju.extend(_jp.Endpoints.AbstractEndpoint, AbstractComponent); + + /** + * Class: Endpoints.Dot + * A round endpoint, with default radius 10 pixels. + */ + + /** + * Function: Constructor + * + * Parameters: + * + * radius - radius of the endpoint. defaults to 10 pixels. + */ + _jp.Endpoints.Dot = function (params) { + this.type = "Dot"; + var _super = _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + params = params || {}; + this.radius = params.radius || 10; + this.defaultOffset = 0.5 * this.radius; + this.defaultInnerRadius = this.radius / 3; + + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + this.radius = endpointStyle.radius || this.radius; + var x = anchorPoint[0] - this.radius, + y = anchorPoint[1] - this.radius, + w = this.radius * 2, + h = this.radius * 2; + + if (endpointStyle.stroke) { + var lw = endpointStyle.strokeWidth || 1; + x -= lw; + y -= lw; + w += (lw * 2); + h += (lw * 2); + } + return [ x, y, w, h, this.radius ]; + }; + }; + _ju.extend(_jp.Endpoints.Dot, _jp.Endpoints.AbstractEndpoint); + + _jp.Endpoints.Rectangle = function (params) { + this.type = "Rectangle"; + var _super = _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + params = params || {}; + this.width = params.width || 20; + this.height = params.height || 20; + + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + var width = endpointStyle.width || this.width, + height = endpointStyle.height || this.height, + x = anchorPoint[0] - (width / 2), + y = anchorPoint[1] - (height / 2); + + return [ x, y, width, height]; + }; + }; + _ju.extend(_jp.Endpoints.Rectangle, _jp.Endpoints.AbstractEndpoint); + + var DOMElementEndpoint = function (params) { + _jp.jsPlumbUIComponent.apply(this, arguments); + this._jsPlumb.displayElements = []; + }; + _ju.extend(DOMElementEndpoint, _jp.jsPlumbUIComponent, { + getDisplayElements: function () { + return this._jsPlumb.displayElements; + }, + appendDisplayElement: function (el) { + this._jsPlumb.displayElements.push(el); + } + }); + + /** + * Class: Endpoints.Image + * Draws an image as the Endpoint. + */ + /** + * Function: Constructor + * + * Parameters: + * + * src - location of the image to use. + + TODO: multiple references to self. not sure quite how to get rid of them entirely. perhaps self = null in the cleanup + function will suffice + + TODO this class still might leak memory. + + */ + _jp.Endpoints.Image = function (params) { + + this.type = "Image"; + DOMElementEndpoint.apply(this, arguments); + _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + + var _onload = params.onload, + src = params.src || params.url, + clazz = params.cssClass ? " " + params.cssClass : ""; + + this._jsPlumb.img = new Image(); + this._jsPlumb.ready = false; + this._jsPlumb.initialized = false; + this._jsPlumb.deleted = false; + this._jsPlumb.widthToUse = params.width; + this._jsPlumb.heightToUse = params.height; + this._jsPlumb.endpoint = params.endpoint; + + this._jsPlumb.img.onload = function () { + if (this._jsPlumb != null) { + this._jsPlumb.ready = true; + this._jsPlumb.widthToUse = this._jsPlumb.widthToUse || this._jsPlumb.img.width; + this._jsPlumb.heightToUse = this._jsPlumb.heightToUse || this._jsPlumb.img.height; + if (_onload) { + _onload(this); + } + } + }.bind(this); + + /* + Function: setImage + Sets the Image to use in this Endpoint. + + Parameters: + img - may be a URL or an Image object + onload - optional; a callback to execute once the image has loaded. + */ + this._jsPlumb.endpoint.setImage = function (_img, onload) { + var s = _img.constructor === String ? _img : _img.src; + _onload = onload; + this._jsPlumb.img.src = s; + + if (this.canvas != null) { + this.canvas.setAttribute("src", this._jsPlumb.img.src); + } + }.bind(this); + + this._jsPlumb.endpoint.setImage(src, _onload); + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + this.anchorPoint = anchorPoint; + if (this._jsPlumb.ready) { + return [anchorPoint[0] - this._jsPlumb.widthToUse / 2, anchorPoint[1] - this._jsPlumb.heightToUse / 2, + this._jsPlumb.widthToUse, this._jsPlumb.heightToUse]; + } + else { + return [0, 0, 0, 0]; + } + }; + + this.canvas = _jp.createElement("img", { + position:"absolute", + margin:0, + padding:0, + outline:0 + }, this._jsPlumb.instance.endpointClass + clazz); + + if (this._jsPlumb.widthToUse) { + this.canvas.setAttribute("width", this._jsPlumb.widthToUse); + } + if (this._jsPlumb.heightToUse) { + this.canvas.setAttribute("height", this._jsPlumb.heightToUse); + } + this._jsPlumb.instance.appendElement(this.canvas); + + this.actuallyPaint = function (d, style, anchor) { + if (!this._jsPlumb.deleted) { + if (!this._jsPlumb.initialized) { + this.canvas.setAttribute("src", this._jsPlumb.img.src); + this.appendDisplayElement(this.canvas); + this._jsPlumb.initialized = true; + } + var x = this.anchorPoint[0] - (this._jsPlumb.widthToUse / 2), + y = this.anchorPoint[1] - (this._jsPlumb.heightToUse / 2); + _ju.sizeElement(this.canvas, x, y, this._jsPlumb.widthToUse, this._jsPlumb.heightToUse); + } + }; + + this.paint = function (style, anchor) { + if (this._jsPlumb != null) { // may have been deleted + if (this._jsPlumb.ready) { + this.actuallyPaint(style, anchor); + } + else { + root.setTimeout(function () { + this.paint(style, anchor); + }.bind(this), 200); + } + } + }; + }; + _ju.extend(_jp.Endpoints.Image, [ DOMElementEndpoint, _jp.Endpoints.AbstractEndpoint ], { + cleanup: function (force) { + if (force) { + this._jsPlumb.deleted = true; + if (this.canvas) { + this.canvas.parentNode.removeChild(this.canvas); + } + this.canvas = null; + } + } + }); + + /* + * Class: Endpoints.Blank + * An Endpoint that paints nothing (visible) on the screen. Supports cssClass and hoverClass parameters like all Endpoints. + */ + _jp.Endpoints.Blank = function (params) { + var _super = _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + this.type = "Blank"; + DOMElementEndpoint.apply(this, arguments); + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + return [anchorPoint[0], anchorPoint[1], 10, 0]; + }; + + var clazz = params.cssClass ? " " + params.cssClass : ""; + + this.canvas = _jp.createElement("div", { + display: "block", + width: "1px", + height: "1px", + background: "transparent", + position: "absolute" + }, this._jsPlumb.instance.endpointClass + clazz); + + this._jsPlumb.instance.appendElement(this.canvas); + + this.paint = function (style, anchor) { + _ju.sizeElement(this.canvas, this.x, this.y, this.w, this.h); + }; + }; + _ju.extend(_jp.Endpoints.Blank, [_jp.Endpoints.AbstractEndpoint, DOMElementEndpoint], { + cleanup: function () { + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + } + }); + + /* + * Class: Endpoints.Triangle + * A triangular Endpoint. + */ + /* + * Function: Constructor + * + * Parameters: + * + * width width of the triangle's base. defaults to 55 pixels. + * height height of the triangle from base to apex. defaults to 55 pixels. + */ + _jp.Endpoints.Triangle = function (params) { + this.type = "Triangle"; + _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + var self = this; + params = params || { }; + params.width = params.width || 55; + params.height = params.height || 55; + this.width = params.width; + this.height = params.height; + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + var width = endpointStyle.width || self.width, + height = endpointStyle.height || self.height, + x = anchorPoint[0] - (width / 2), + y = anchorPoint[1] - (height / 2); + return [ x, y, width, height ]; + }; + }; +// ********************************* END OF ENDPOINT TYPES ******************************************************************* + + +// ********************************* OVERLAY DEFINITIONS *********************************************************************** + + var AbstractOverlay = _jp.Overlays.AbstractOverlay = function (params) { + this.visible = true; + this.isAppendedAtTopLevel = true; + this.component = params.component; + this.loc = params.location == null ? 0.5 : params.location; + this.endpointLoc = params.endpointLocation == null ? [ 0.5, 0.5] : params.endpointLocation; + this.visible = params.visible !== false; + }; + AbstractOverlay.prototype = { + cleanup: function (force) { + if (force) { + this.component = null; + this.canvas = null; + this.endpointLoc = null; + } + }, + reattach:function(instance, component) { }, + setVisible: function (val) { + this.visible = val; + this.component.repaint(); + }, + isVisible: function () { + return this.visible; + }, + hide: function () { + this.setVisible(false); + }, + show: function () { + this.setVisible(true); + }, + incrementLocation: function (amount) { + this.loc += amount; + this.component.repaint(); + }, + setLocation: function (l) { + this.loc = l; + this.component.repaint(); + }, + getLocation: function () { + return this.loc; + }, + updateFrom:function() { } + }; + + + /* + * Class: Overlays.Arrow + * + * An arrow overlay, defined by four points: the head, the two sides of the tail, and a 'foldback' point at some distance along the length + * of the arrow that lines from each tail point converge into. The foldback point is defined using a decimal that indicates some fraction + * of the length of the arrow and has a default value of 0.623. A foldback point value of 1 would mean that the arrow had a straight line + * across the tail. + */ + /* + * @constructor + * + * @param {Object} params Constructor params. + * @param {Number} [params.length] Distance in pixels from head to tail baseline. default 20. + * @param {Number} [params.width] Width in pixels of the tail baseline. default 20. + * @param {String} [params.fill] Style to use when filling the arrow. defaults to "black". + * @param {String} [params.stroke] Style to use when stroking the arrow. defaults to null, which means the arrow is not stroked. + * @param {Number} [params.stroke-width] Line width to use when stroking the arrow. defaults to 1, but only used if stroke is not null. + * @param {Number} [params.foldback] Distance (as a decimal from 0 to 1 inclusive) along the length of the arrow marking the point the tail points should fold back to. defaults to 0.623. + * @param {Number} [params.location] Distance (as a decimal from 0 to 1 inclusive) marking where the arrow should sit on the connector. defaults to 0.5. + * @param {NUmber} [params.direction] Indicates the direction the arrow points in. valid values are -1 and 1; 1 is default. + */ + _jp.Overlays.Arrow = function (params) { + this.type = "Arrow"; + AbstractOverlay.apply(this, arguments); + this.isAppendedAtTopLevel = false; + params = params || {}; + var self = this; + + this.length = params.length || 20; + this.width = params.width || 20; + this.id = params.id; + this.direction = (params.direction || 1) < 0 ? -1 : 1; + var paintStyle = params.paintStyle || { "stroke-width": 1 }, + // how far along the arrow the lines folding back in come to. default is 62.3%. + foldback = params.foldback || 0.623; + + this.computeMaxSize = function () { + return self.width * 1.5; + }; + + this.elementCreated = function(p, component) { + this.path = p; + if (params.events) { + for (var i in params.events) { + _jp.on(p, i, params.events[i]); + } + } + }; + + this.draw = function (component, currentConnectionPaintStyle) { + + var hxy, mid, txy, tail, cxy; + if (component.pointAlongPathFrom) { + + if (_ju.isString(this.loc) || this.loc > 1 || this.loc < 0) { + var l = parseInt(this.loc, 10), + fromLoc = this.loc < 0 ? 1 : 0; + hxy = component.pointAlongPathFrom(fromLoc, l, false); + mid = component.pointAlongPathFrom(fromLoc, l - (this.direction * this.length / 2), false); + txy = _jg.pointOnLine(hxy, mid, this.length); + } + else if (this.loc === 1) { + hxy = component.pointOnPath(this.loc); + mid = component.pointAlongPathFrom(this.loc, -(this.length)); + txy = _jg.pointOnLine(hxy, mid, this.length); + + if (this.direction === -1) { + var _ = txy; + txy = hxy; + hxy = _; + } + } + else if (this.loc === 0) { + txy = component.pointOnPath(this.loc); + mid = component.pointAlongPathFrom(this.loc, this.length); + hxy = _jg.pointOnLine(txy, mid, this.length); + if (this.direction === -1) { + var __ = txy; + txy = hxy; + hxy = __; + } + } + else { + hxy = component.pointAlongPathFrom(this.loc, this.direction * this.length / 2); + mid = component.pointOnPath(this.loc); + txy = _jg.pointOnLine(hxy, mid, this.length); + } + + tail = _jg.perpendicularLineTo(hxy, txy, this.width); + cxy = _jg.pointOnLine(hxy, txy, foldback * this.length); + + var d = { hxy: hxy, tail: tail, cxy: cxy }, + stroke = paintStyle.stroke || currentConnectionPaintStyle.stroke, + fill = paintStyle.fill || currentConnectionPaintStyle.stroke, + lineWidth = paintStyle.strokeWidth || currentConnectionPaintStyle.strokeWidth; + + return { + component: component, + d: d, + "stroke-width": lineWidth, + stroke: stroke, + fill: fill, + minX: Math.min(hxy.x, tail[0].x, tail[1].x), + maxX: Math.max(hxy.x, tail[0].x, tail[1].x), + minY: Math.min(hxy.y, tail[0].y, tail[1].y), + maxY: Math.max(hxy.y, tail[0].y, tail[1].y) + }; + } + else { + return {component: component, minX: 0, maxX: 0, minY: 0, maxY: 0}; + } + }; + }; + _ju.extend(_jp.Overlays.Arrow, AbstractOverlay, { + updateFrom:function(d) { + this.length = d.length || this.length; + this.width = d.width|| this.width; + this.direction = d.direction != null ? d.direction : this.direction; + this.foldback = d.foldback|| this.foldback; + }, + cleanup:function() { + if (this.path && this.path.parentNode) { + this.path.parentNode.removeChild(this.path); + } + } + }); + + /* + * Class: Overlays.PlainArrow + * + * A basic arrow. This is in fact just one instance of the more generic case in which the tail folds back on itself to some + * point along the length of the arrow: in this case, that foldback point is the full length of the arrow. so it just does + * a 'call' to Arrow with foldback set appropriately. + */ + /* + * Function: Constructor + * See for allowed parameters for this overlay. + */ + _jp.Overlays.PlainArrow = function (params) { + params = params || {}; + var p = _jp.extend(params, {foldback: 1}); + _jp.Overlays.Arrow.call(this, p); + this.type = "PlainArrow"; + }; + _ju.extend(_jp.Overlays.PlainArrow, _jp.Overlays.Arrow); + + /* + * Class: Overlays.Diamond + * + * A diamond. Like PlainArrow, this is a concrete case of the more generic case of the tail points converging on some point...it just + * happens that in this case, that point is greater than the length of the the arrow. + * + * this could probably do with some help with positioning...due to the way it reuses the Arrow paint code, what Arrow thinks is the + * center is actually 1/4 of the way along for this guy. but we don't have any knowledge of pixels at this point, so we're kind of + * stuck when it comes to helping out the Arrow class. possibly we could pass in a 'transpose' parameter or something. the value + * would be -l/4 in this case - move along one quarter of the total length. + */ + /* + * Function: Constructor + * See for allowed parameters for this overlay. + */ + _jp.Overlays.Diamond = function (params) { + params = params || {}; + var l = params.length || 40, + p = _jp.extend(params, {length: l / 2, foldback: 2}); + _jp.Overlays.Arrow.call(this, p); + this.type = "Diamond"; + }; + _ju.extend(_jp.Overlays.Diamond, _jp.Overlays.Arrow); + + var _getDimensions = function (component, forceRefresh) { + if (component._jsPlumb.cachedDimensions == null || forceRefresh) { + component._jsPlumb.cachedDimensions = component.getDimensions(); + } + return component._jsPlumb.cachedDimensions; + }; + + // abstract superclass for overlays that add an element to the DOM. + var AbstractDOMOverlay = function (params) { + _jp.jsPlumbUIComponent.apply(this, arguments); + AbstractOverlay.apply(this, arguments); + + // hand off fired events to associated component. + var _f = this.fire; + this.fire = function () { + _f.apply(this, arguments); + if (this.component) { + this.component.fire.apply(this.component, arguments); + } + }; + + this.detached=false; + this.id = params.id; + this._jsPlumb.div = null; + this._jsPlumb.initialised = false; + this._jsPlumb.component = params.component; + this._jsPlumb.cachedDimensions = null; + this._jsPlumb.create = params.create; + this._jsPlumb.initiallyInvisible = params.visible === false; + + this.getElement = function () { + if (this._jsPlumb.div == null) { + var div = this._jsPlumb.div = _jp.getElement(this._jsPlumb.create(this._jsPlumb.component)); + div.style.position = "absolute"; + jsPlumb.addClass(div, this._jsPlumb.instance.overlayClass + " " + + (this.cssClass ? this.cssClass : + params.cssClass ? params.cssClass : "")); + this._jsPlumb.instance.appendElement(div); + this._jsPlumb.instance.getId(div); + this.canvas = div; + + // in IE the top left corner is what it placed at the desired location. This will not + // be fixed. IE8 is not going to be supported for much longer. + var ts = "translate(-50%, -50%)"; + div.style.webkitTransform = ts; + div.style.mozTransform = ts; + div.style.msTransform = ts; + div.style.oTransform = ts; + div.style.transform = ts; + + // write the related component into the created element + div._jsPlumb = this; + + if (params.visible === false) { + div.style.display = "none"; + } + } + return this._jsPlumb.div; + }; + + this.draw = function (component, currentConnectionPaintStyle, absolutePosition) { + var td = _getDimensions(this); + if (td != null && td.length === 2) { + var cxy = { x: 0, y: 0 }; + + // absolutePosition would have been set by a call to connection.setAbsoluteOverlayPosition. + if (absolutePosition) { + cxy = { x: absolutePosition[0], y: absolutePosition[1] }; + } + else if (component.pointOnPath) { + var loc = this.loc, absolute = false; + if (_ju.isString(this.loc) || this.loc < 0 || this.loc > 1) { + loc = parseInt(this.loc, 10); + absolute = true; + } + cxy = component.pointOnPath(loc, absolute); // a connection + } + else { + var locToUse = this.loc.constructor === Array ? this.loc : this.endpointLoc; + cxy = { x: locToUse[0] * component.w, + y: locToUse[1] * component.h }; + } + + var minx = cxy.x - (td[0] / 2), + miny = cxy.y - (td[1] / 2); + + return { + component: component, + d: { minx: minx, miny: miny, td: td, cxy: cxy }, + minX: minx, + maxX: minx + td[0], + minY: miny, + maxY: miny + td[1] + }; + } + else { + return {minX: 0, maxX: 0, minY: 0, maxY: 0}; + } + }; + }; + _ju.extend(AbstractDOMOverlay, [_jp.jsPlumbUIComponent, AbstractOverlay], { + getDimensions: function () { + return [1,1]; + }, + setVisible: function (state) { + if (this._jsPlumb.div) { + this._jsPlumb.div.style.display = state ? "block" : "none"; + // if initially invisible, dimensions are 0,0 and never get updated + if (state && this._jsPlumb.initiallyInvisible) { + _getDimensions(this, true); + this.component.repaint(); + this._jsPlumb.initiallyInvisible = false; + } + } + }, + /* + * Function: clearCachedDimensions + * Clears the cached dimensions for the label. As a performance enhancement, label dimensions are + * cached from 1.3.12 onwards. The cache is cleared when you change the label text, of course, but + * there are other reasons why the text dimensions might change - if you make a change through CSS, for + * example, you might change the font size. in that case you should explicitly call this method. + */ + clearCachedDimensions: function () { + this._jsPlumb.cachedDimensions = null; + }, + cleanup: function (force) { + if (force) { + if (this._jsPlumb.div != null) { + this._jsPlumb.div._jsPlumb = null; + this._jsPlumb.instance.removeElement(this._jsPlumb.div); + } + } + else { + // if not a forced cleanup, just detach child from parent for now. + if (this._jsPlumb && this._jsPlumb.div && this._jsPlumb.div.parentNode) { + this._jsPlumb.div.parentNode.removeChild(this._jsPlumb.div); + } + this.detached = true; + } + + }, + reattach:function(instance, component) { + if (this._jsPlumb.div != null) { + instance.getContainer().appendChild(this._jsPlumb.div); + } + this.detached = false; + }, + computeMaxSize: function () { + var td = _getDimensions(this); + return Math.max(td[0], td[1]); + }, + paint: function (p, containerExtents) { + if (!this._jsPlumb.initialised) { + this.getElement(); + p.component.appendDisplayElement(this._jsPlumb.div); + this._jsPlumb.initialised = true; + if (this.detached) { + this._jsPlumb.div.parentNode.removeChild(this._jsPlumb.div); + } + } + this._jsPlumb.div.style.left = (p.component.x + p.d.minx) + "px"; + this._jsPlumb.div.style.top = (p.component.y + p.d.miny) + "px"; + } + }); + + /* + * Class: Overlays.Custom + * A Custom overlay. You supply a 'create' function which returns some DOM element, and jsPlumb positions it. + * The 'create' function is passed a Connection or Endpoint. + */ + /* + * Function: Constructor + * + * Parameters: + * create - function for jsPlumb to call that returns a DOM element. + * location - distance (as a decimal from 0 to 1 inclusive) marking where the label should sit on the connector. defaults to 0.5. + * id - optional id to use for later retrieval of this overlay. + * + */ + _jp.Overlays.Custom = function (params) { + this.type = "Custom"; + AbstractDOMOverlay.apply(this, arguments); + }; + _ju.extend(_jp.Overlays.Custom, AbstractDOMOverlay); + + _jp.Overlays.GuideLines = function () { + var self = this; + self.length = 50; + self.strokeWidth = 5; + this.type = "GuideLines"; + AbstractOverlay.apply(this, arguments); + _jp.jsPlumbUIComponent.apply(this, arguments); + this.draw = function (connector, currentConnectionPaintStyle) { + + var head = connector.pointAlongPathFrom(self.loc, self.length / 2), + mid = connector.pointOnPath(self.loc), + tail = _jg.pointOnLine(head, mid, self.length), + tailLine = _jg.perpendicularLineTo(head, tail, 40), + headLine = _jg.perpendicularLineTo(tail, head, 20); + + return { + connector: connector, + head: head, + tail: tail, + headLine: headLine, + tailLine: tailLine, + minX: Math.min(head.x, tail.x, headLine[0].x, headLine[1].x), + minY: Math.min(head.y, tail.y, headLine[0].y, headLine[1].y), + maxX: Math.max(head.x, tail.x, headLine[0].x, headLine[1].x), + maxY: Math.max(head.y, tail.y, headLine[0].y, headLine[1].y) + }; + }; + + // this.cleanup = function() { }; // nothing to clean up for GuideLines + }; + + /* + * Class: Overlays.Label + + */ + /* + * Function: Constructor + * + * Parameters: + * cssClass - optional css class string to append to css class. This string is appended "as-is", so you can of course have multiple classes + * defined. This parameter is preferred to using labelStyle, borderWidth and borderStyle. + * label - the label to paint. May be a string or a function that returns a string. Nothing will be painted if your label is null or your + * label function returns null. empty strings _will_ be painted. + * location - distance (as a decimal from 0 to 1 inclusive) marking where the label should sit on the connector. defaults to 0.5. + * id - optional id to use for later retrieval of this overlay. + * + * + */ + _jp.Overlays.Label = function (params) { + this.labelStyle = params.labelStyle; + + var labelWidth = null, labelHeight = null, labelText = null, labelPadding = null; + this.cssClass = this.labelStyle != null ? this.labelStyle.cssClass : null; + var p = _jp.extend({ + create: function () { + return _jp.createElement("div"); + }}, params); + _jp.Overlays.Custom.call(this, p); + this.type = "Label"; + this.label = params.label || ""; + this.labelText = null; + if (this.labelStyle) { + var el = this.getElement(); + this.labelStyle.font = this.labelStyle.font || "12px sans-serif"; + el.style.font = this.labelStyle.font; + el.style.color = this.labelStyle.color || "black"; + if (this.labelStyle.fill) { + el.style.background = this.labelStyle.fill; + } + if (this.labelStyle.borderWidth > 0) { + var dStyle = this.labelStyle.borderStyle ? this.labelStyle.borderStyle : "black"; + el.style.border = this.labelStyle.borderWidth + "px solid " + dStyle; + } + if (this.labelStyle.padding) { + el.style.padding = this.labelStyle.padding; + } + } + + }; + _ju.extend(_jp.Overlays.Label, _jp.Overlays.Custom, { + cleanup: function (force) { + if (force) { + this.div = null; + this.label = null; + this.labelText = null; + this.cssClass = null; + this.labelStyle = null; + } + }, + getLabel: function () { + return this.label; + }, + /* + * Function: setLabel + * sets the label's, um, label. you would think i'd call this function + * 'setText', but you can pass either a Function or a String to this, so + * it makes more sense as 'setLabel'. This uses innerHTML on the label div, so keep + * that in mind if you need escaped HTML. + */ + setLabel: function (l) { + this.label = l; + this.labelText = null; + this.clearCachedDimensions(); + this.update(); + this.component.repaint(); + }, + getDimensions: function () { + this.update(); + return AbstractDOMOverlay.prototype.getDimensions.apply(this, arguments); + }, + update: function () { + if (typeof this.label === "function") { + var lt = this.label(this); + this.getElement().innerHTML = lt.replace(/\r\n/g, "
    "); + } + else { + if (this.labelText == null) { + this.labelText = this.label; + this.getElement().innerHTML = this.labelText.replace(/\r\n/g, "
    "); + } + } + }, + updateFrom:function(d) { + if(d.label != null){ + this.setLabel(d.label); + } + } + }); + + // ********************************* END OF OVERLAY DEFINITIONS *********************************************************************** + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * Copyright (c) 2010 - 2020 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function() { + "use strict"; + + var root = this, + _ju = root.jsPlumbUtil, + _jpi = root.jsPlumbInstance; + + var GROUP_COLLAPSED_CLASS = "jtk-group-collapsed"; + var GROUP_EXPANDED_CLASS = "jtk-group-expanded"; + var GROUP_CONTAINER_SELECTOR = "[jtk-group-content]"; + var ELEMENT_DRAGGABLE_EVENT = "elementDraggable"; + var STOP = "stop"; + var REVERT = "revert"; + var GROUP_MANAGER = "_groupManager"; + var GROUP = "_jsPlumbGroup"; + var GROUP_DRAG_SCOPE = "_jsPlumbGroupDrag"; + var EVT_CHILD_ADDED = "group:addMember"; + var EVT_CHILD_REMOVED = "group:removeMember"; + var EVT_GROUP_ADDED = "group:add"; + var EVT_GROUP_REMOVED = "group:remove"; + var EVT_EXPAND = "group:expand"; + var EVT_COLLAPSE = "group:collapse"; + var EVT_GROUP_DRAG_STOP = "groupDragStop"; + var EVT_CONNECTION_MOVED = "connectionMoved"; + var EVT_INTERNAL_CONNECTION_DETACHED = "internal.connectionDetached"; + + var CMD_REMOVE_ALL = "removeAll"; + var CMD_ORPHAN_ALL = "orphanAll"; + var CMD_SHOW = "show"; + var CMD_HIDE = "hide"; + + var GroupManager = function(_jsPlumb) { + var _managedGroups = {}, _connectionSourceMap = {}, _connectionTargetMap = {}, self = this; + + // function findGroupFor(el) { + // var c = _jsPlumb.getContainer(); + // var abort = false, g = null, child = null; + // while (!abort) { + // if (el == null || el === c) { + // abort = true; + // } else { + // if (el[GROUP]) { + // g = el[GROUP]; + // child = el; + // abort = true; + // } else { + // el = el.parentNode; + // } + // } + // } + // return g; + // } + + function isDescendant(el, parentEl) { + var c = _jsPlumb.getContainer(); + var abort = false, g = null, child = null; + while (!abort) { + if (el == null || el === c) { + return false; + } else { + if (el === parentEl) { + return true; + } else { + el = el.parentNode; + } + } + } + } + + _jsPlumb.bind("connection", function(p) { + + var sourceGroup = _jsPlumb.getGroupFor(p.source); + var targetGroup = _jsPlumb.getGroupFor(p.target); + + if (sourceGroup != null && targetGroup != null && sourceGroup === targetGroup) { + _connectionSourceMap[p.connection.id] = sourceGroup; + _connectionTargetMap[p.connection.id] = sourceGroup; + } + else { + if (sourceGroup != null) { + _ju.suggest(sourceGroup.connections.source, p.connection); + _connectionSourceMap[p.connection.id] = sourceGroup; + } + if (targetGroup != null) { + _ju.suggest(targetGroup.connections.target, p.connection); + _connectionTargetMap[p.connection.id] = targetGroup; + } + } + }); + + function _cleanupDetachedConnection(conn) { + delete conn.proxies; + var group = _connectionSourceMap[conn.id], f; + if (group != null) { + f = function(c) { return c.id === conn.id; }; + _ju.removeWithFunction(group.connections.source, f); + _ju.removeWithFunction(group.connections.target, f); + delete _connectionSourceMap[conn.id]; + } + + group = _connectionTargetMap[conn.id]; + if (group != null) { + f = function(c) { return c.id === conn.id; }; + _ju.removeWithFunction(group.connections.source, f); + _ju.removeWithFunction(group.connections.target, f); + delete _connectionTargetMap[conn.id]; + } + } + + _jsPlumb.bind(EVT_INTERNAL_CONNECTION_DETACHED, function(p) { + _cleanupDetachedConnection(p.connection); + }); + + _jsPlumb.bind(EVT_CONNECTION_MOVED, function(p) { + var connMap = p.index === 0 ? _connectionSourceMap : _connectionTargetMap; + var group = connMap[p.connection.id]; + if (group) { + var list = group.connections[p.index === 0 ? "source" : "target"]; + var idx = list.indexOf(p.connection); + if (idx !== -1) { + list.splice(idx, 1); + } + } + }); + + this.addGroup = function(group) { + _jsPlumb.addClass(group.getEl(), GROUP_EXPANDED_CLASS); + _managedGroups[group.id] = group; + group.manager = this; + _updateConnectionsForGroup(group); + _jsPlumb.fire(EVT_GROUP_ADDED, { group:group }); + }; + + this.addToGroup = function(group, el, doNotFireEvent) { + group = this.getGroup(group); + if (group) { + var groupEl = group.getEl(); + + if (el._isJsPlumbGroup) { + return; + } + var currentGroup = el._jsPlumbGroup; + // if already a member of this group, do nothing + if (currentGroup !== group) { + + _jsPlumb.removeFromDragSelection(el); + + var elpos = _jsPlumb.getOffset(el, true); + var cpos = group.collapsed ? _jsPlumb.getOffset(groupEl, true) : _jsPlumb.getOffset(group.getDragArea(), true); + + // otherwise, transfer to this group. + if (currentGroup != null) { + currentGroup.remove(el, false, doNotFireEvent, false, group); + self.updateConnectionsForGroup(currentGroup); + } + group.add(el, doNotFireEvent/*, currentGroup*/); + + var handleDroppedConnections = function (list, index) { + var oidx = index === 0 ? 1 : 0; + list.each(function (c) { + c.setVisible(false); + if (c.endpoints[oidx].element._jsPlumbGroup === group) { + c.endpoints[oidx].setVisible(false); + _expandConnection(c, oidx, group); + } + else { + c.endpoints[index].setVisible(false); + _collapseConnection(c, index, group); + } + }); + }; + + if (group.collapsed) { + handleDroppedConnections(_jsPlumb.select({source: el}), 0); + handleDroppedConnections(_jsPlumb.select({target: el}), 1); + } + + var elId = _jsPlumb.getId(el); + _jsPlumb.dragManager.setParent(el, elId, groupEl, _jsPlumb.getId(groupEl), elpos); + + var newPosition = { left: elpos.left - cpos.left, top: elpos.top - cpos.top }; + + _jsPlumb.setPosition(el, newPosition); + + _jsPlumb.dragManager.revalidateParent(el, elId, elpos); + + self.updateConnectionsForGroup(group); + + _jsPlumb.revalidate(elId); + + if (!doNotFireEvent) { + var p = {group: group, el: el, pos:newPosition}; + if (currentGroup) { + p.sourceGroup = currentGroup; + } + _jsPlumb.fire(EVT_CHILD_ADDED, p); + } + } + } + }; + + this.removeFromGroup = function(group, el, doNotFireEvent) { + group = this.getGroup(group); + if (group) { + + // if this group is currently collapsed then any proxied connections for the given el (or its descendants) need + // to be put back on their original element, and unproxied + if (group.collapsed) { + var _expandSet = function (conns, index) { + for (var i = 0; i < conns.length; i++) { + var c = conns[i]; + if (c.proxies) { + for(var j = 0; j < c.proxies.length; j++) { + if (c.proxies[j] != null) { + var proxiedElement = c.proxies[j].originalEp.element; + if (proxiedElement === el || isDescendant(proxiedElement, el)) { + _expandConnection(c, index, group); + } + } + + } + } + } + }; + + // setup proxies for sources and targets + _expandSet(group.connections.source.slice(), 0); + _expandSet(group.connections.target.slice(), 1); + } + + group.remove(el, null, doNotFireEvent); + } + }; + + this.getGroup = function(groupId) { + var group = groupId; + if (_ju.isString(groupId)) { + group = _managedGroups[groupId]; + if (group == null) { + throw new TypeError("No such group [" + groupId + "]"); + } + } + return group; + }; + + this.getGroups = function() { + var o = []; + for (var g in _managedGroups) { + o.push(_managedGroups[g]); + } + return o; + }; + + this.removeGroup = function(group, deleteMembers, manipulateDOM, doNotFireEvent) { + group = this.getGroup(group); + this.expandGroup(group, true); // this reinstates any original connections and removes all proxies, but does not fire an event. + var newPositions = group[deleteMembers ? CMD_REMOVE_ALL : CMD_ORPHAN_ALL](manipulateDOM, doNotFireEvent); + _jsPlumb.remove(group.getEl()); + delete _managedGroups[group.id]; + delete _jsPlumb._groups[group.id]; + _jsPlumb.fire(EVT_GROUP_REMOVED, { group:group }); + return newPositions; // this will be null in the case or remove, but be a map of {id->[x,y]} in the case of orphan + }; + + this.removeAllGroups = function(deleteMembers, manipulateDOM, doNotFireEvent) { + for (var g in _managedGroups) { + this.removeGroup(_managedGroups[g], deleteMembers, manipulateDOM, doNotFireEvent); + } + }; + + function _setVisible(group, state) { + + // TODO discovering the list of elements would ideally be a pluggable function. + var m = group.getEl().querySelectorAll(".jtk-managed"); + for (var i = 0; i < m.length; i++) { + _jsPlumb[state ? CMD_SHOW : CMD_HIDE](m[i], true); + } + } + + var _collapseConnection = function(c, index, group) { + + var otherEl = c.endpoints[index === 0 ? 1 : 0].element; + if (otherEl[GROUP] && (!otherEl[GROUP].shouldProxy() && otherEl[GROUP].collapsed)) { + return; + } + + var groupEl = group.getEl(), groupElId = _jsPlumb.getId(groupEl); + + _jsPlumb.proxyConnection(c, index, groupEl, groupElId, function(c, index) { return group.getEndpoint(c, index); }, function(c, index) { return group.getAnchor(c, index); }); + }; + + this.collapseGroup = function(group) { + group = this.getGroup(group); + if (group == null || group.collapsed) { + return; + } + var groupEl = group.getEl(); + + // todo remove old proxy endpoints first, just in case? + //group.proxies.length = 0; + + // hide all connections + _setVisible(group, false); + + if (group.shouldProxy()) { + // collapses all connections in a group. + var _collapseSet = function (conns, index) { + for (var i = 0; i < conns.length; i++) { + var c = conns[i]; + _collapseConnection(c, index, group); + } + }; + + // setup proxies for sources and targets + _collapseSet(group.connections.source, 0); + _collapseSet(group.connections.target, 1); + } + + group.collapsed = true; + _jsPlumb.removeClass(groupEl, GROUP_EXPANDED_CLASS); + _jsPlumb.addClass(groupEl, GROUP_COLLAPSED_CLASS); + _jsPlumb.revalidate(groupEl); + _jsPlumb.fire(EVT_COLLAPSE, { group:group }); + }; + + var _expandConnection = function(c, index, group) { + _jsPlumb.unproxyConnection(c, index, _jsPlumb.getId(group.getEl())); + }; + + this.expandGroup = function(group, doNotFireEvent) { + + group = this.getGroup(group); + + if (group == null || !group.collapsed) { + return; + } + var groupEl = group.getEl(); + + _setVisible(group, true); + + if (group.shouldProxy()) { + // expands all connections in a group. + var _expandSet = function (conns, index) { + for (var i = 0; i < conns.length; i++) { + var c = conns[i]; + _expandConnection(c, index, group); + } + }; + + // setup proxies for sources and targets + _expandSet(group.connections.source, 0); + _expandSet(group.connections.target, 1); + } + + group.collapsed = false; + _jsPlumb.addClass(groupEl, GROUP_EXPANDED_CLASS); + _jsPlumb.removeClass(groupEl, GROUP_COLLAPSED_CLASS); + _jsPlumb.revalidate(groupEl); + this.repaintGroup(group); + if (!doNotFireEvent) { + _jsPlumb.fire(EVT_EXPAND, { group: group}); + } + }; + + this.repaintGroup = function(group) { + group = this.getGroup(group); + var m = group.getMembers(); + for (var i = 0; i < m.length; i++) { + _jsPlumb.revalidate(m[i]); + } + }; + + // TODO refactor this with the code that responds to `connection` events. + function _updateConnectionsForGroup(group) { + var members = group.getMembers().slice(); + + var childMembers = []; + for (var i = 0; i < members.length; i++) { + Array.prototype.push.apply(childMembers, members[i].querySelectorAll(".jtk-managed")); + } + Array.prototype.push.apply(members, childMembers); + + var c1 = _jsPlumb.getConnections({source:members, scope:"*"}, true); + var c2 = _jsPlumb.getConnections({target:members, scope:"*"}, true); + + var processed = {}; + group.connections.source.length = 0; + group.connections.target.length = 0; + var oneSet = function(c) { + for (var i = 0; i < c.length; i++) { + if (processed[c[i].id]) { + continue; + } + processed[c[i].id] = true; + var gs = _jsPlumb.getGroupFor(c[i].source), + gt = _jsPlumb.getGroupFor(c[i].target); + + if (gs === group) { + if (gt !== group) { + group.connections.source.push(c[i]); + } + _connectionSourceMap[c[i].id] = group; + } + else if (gt === group) { + group.connections.target.push(c[i]); + _connectionTargetMap[c[i].id] = group; + } + } + }; + oneSet(c1); oneSet(c2); + } + + this.updateConnectionsForGroup = _updateConnectionsForGroup; + this.refreshAllGroups = function() { + for (var g in _managedGroups) { + _updateConnectionsForGroup(_managedGroups[g]); + _jsPlumb.dragManager.updateOffsets(_jsPlumb.getId(_managedGroups[g].getEl())); + } + }; + }; + + /** + * + * @param {jsPlumbInstance} _jsPlumb Associated jsPlumb instance. + * @param {Object} params + * @param {Element} params.el The DOM element representing the Group. + * @param {String} [params.id] Optional ID for the Group. A UUID will be assigned as the Group's ID if you do not provide one. + * @param {Boolean} [params.constrain=false] If true, child elements will not be able to be dragged outside of the Group container. + * @param {Boolean} [params.revert=true] By default, child elements revert to the container if dragged outside. You can change this by setting `revert:false`. This behaviour is also overridden if you set `orphan` or `prune`. + * @param {Boolean} [params.orphan=false] If true, child elements dropped outside of the Group container will be removed from the Group (but not from the DOM). + * @param {Boolean} [params.prune=false] If true, child elements dropped outside of the Group container will be removed from the Group and also from the DOM. + * @param {Boolean} [params.dropOverride=false] If true, a child element that has been dropped onto some other Group will not be subject to the controls imposed by `prune`, `revert` or `orphan`. + * @constructor + */ + var Group = function(_jsPlumb, params) { + var self = this; + var el = params.el; + this.getEl = function() { return el; }; + this.id = params.id || _ju.uuid(); + el._isJsPlumbGroup = true; + + var getDragArea = this.getDragArea = function() { + var da = _jsPlumb.getSelector(el, GROUP_CONTAINER_SELECTOR); + return da && da.length > 0 ? da[0] : el; + }; + + var ghost = params.ghost === true; + var constrain = ghost || (params.constrain === true); + var revert = params.revert !== false; + var orphan = params.orphan === true; + var prune = params.prune === true; + var dropOverride = params.dropOverride === true; + var proxied = params.proxied !== false; + var elements = []; + this.connections = { source:[], target:[], internal:[] }; + + // this function, and getEndpoint below, are stubs for a future setup in which we can choose endpoint + // and anchor based upon the connection and the index (source/target) of the endpoint to be proxied. + this.getAnchor = function(conn, endpointIndex) { + return params.anchor || "Continuous"; + }; + + this.getEndpoint = function(conn, endpointIndex) { + return params.endpoint || [ "Dot", { radius:10 }]; + }; + + this.collapsed = false; + if (params.draggable !== false) { + var opts = { + drag:function() { + for (var i = 0; i < elements.length; i++) { + _jsPlumb.draw(elements[i]); + } + }, + stop:function(params) { + _jsPlumb.fire(EVT_GROUP_DRAG_STOP, jsPlumb.extend(params, {group:self})); + }, + scope:GROUP_DRAG_SCOPE + }; + if (params.dragOptions) { + root.jsPlumb.extend(opts, params.dragOptions); + } + _jsPlumb.draggable(params.el, opts); + } + if (params.droppable !== false) { + _jsPlumb.droppable(params.el, { + drop:function(p) { + var el = p.drag.el; + if (el._isJsPlumbGroup) { + return; + } + var currentGroup = el._jsPlumbGroup; + if (currentGroup !== self) { + if (currentGroup != null) { + if (currentGroup.overrideDrop(el, self)) { + return; + } + } + _jsPlumb.getGroupManager().addToGroup(self, el, false); + } + + } + }); + } + var _each = function(_el, fn) { + var els = _el.nodeType == null ? _el : [ _el ]; + for (var i = 0; i < els.length; i++) { + fn(els[i]); + } + }; + + this.overrideDrop = function(_el, targetGroup) { + return dropOverride && (revert || prune || orphan); + }; + + this.add = function(_el, doNotFireEvent/*, sourceGroup*/) { + var dragArea = getDragArea(); + _each(_el, function(__el) { + + if (__el._jsPlumbGroup != null) { + if (__el._jsPlumbGroup === self) { + return; + } else { + __el._jsPlumbGroup.remove(__el, true, doNotFireEvent, false); + } + } + + __el._jsPlumbGroup = self; + elements.push(__el); + // test if draggable and add handlers if so. + if (_jsPlumb.isAlreadyDraggable(__el)) { + _bindDragHandlers(__el); + } + + if (__el.parentNode !== dragArea) { + dragArea.appendChild(__el); + } + + // if (!doNotFireEvent) { + // var p = {group: self, el: __el}; + // if (sourceGroup) { + // p.sourceGroup = sourceGroup; + // } + // //_jsPlumb.fire(EVT_CHILD_ADDED, p); + // } + }); + + _jsPlumb.getGroupManager().updateConnectionsForGroup(self); + }; + + this.remove = function(el, manipulateDOM, doNotFireEvent, doNotUpdateConnections, targetGroup) { + + _each(el, function(__el) { + if (__el._jsPlumbGroup === self) { + delete __el._jsPlumbGroup; + _ju.removeWithFunction(elements, function (e) { + return e === __el; + }); + + + if (manipulateDOM) { + try { + self.getDragArea().removeChild(__el); + } catch (e) { + jsPlumbUtil.log("Could not remove element from Group " + e); + } + } + _unbindDragHandlers(__el); + + if (!doNotFireEvent) { + var p = {group: self, el: __el}; + if (targetGroup) { + p.targetGroup = targetGroup; + } + _jsPlumb.fire(EVT_CHILD_REMOVED, p); + } + } + }); + if (!doNotUpdateConnections) { + _jsPlumb.getGroupManager().updateConnectionsForGroup(self); + } + }; + this.removeAll = function(manipulateDOM, doNotFireEvent) { + for (var i = 0, l = elements.length; i < l; i++) { + var el = elements[0]; + self.remove(el, manipulateDOM, doNotFireEvent, true); + _jsPlumb.remove(el, true); + } + elements.length = 0; + _jsPlumb.getGroupManager().updateConnectionsForGroup(self); + }; + this.orphanAll = function() { + var orphanedPositions = {}; + for (var i = 0; i < elements.length; i++) { + var newPosition = _orphan(elements[i]); + orphanedPositions[newPosition[0]] = newPosition[1]; + } + elements.length = 0; + + return orphanedPositions; + }; + this.getMembers = function() { return elements; }; + + el[GROUP] = this; + + _jsPlumb.bind(ELEMENT_DRAGGABLE_EVENT, function(dragParams) { + // if its for the current group, + if (dragParams.el._jsPlumbGroup === this) { + _bindDragHandlers(dragParams.el); + } + }.bind(this)); + + function _findParent(_el) { + return _el.offsetParent; + } + + function _isInsideParent(_el, pos) { + var p = _findParent(_el), + s = _jsPlumb.getSize(p), + ss = _jsPlumb.getSize(_el), + leftEdge = pos[0], + rightEdge = leftEdge + ss[0], + topEdge = pos[1], + bottomEdge = topEdge + ss[1]; + + return rightEdge > 0 && leftEdge < s[0] && bottomEdge > 0 && topEdge < s[1]; + } + + // + // orphaning an element means taking it out of the group and adding it to the main jsplumb container. + // we return the new calculated position from this method and the element's id. + // + function _orphan(_el) { + var id = _jsPlumb.getId(_el); + var pos = _jsPlumb.getOffset(_el); + _el.parentNode.removeChild(_el); + _jsPlumb.getContainer().appendChild(_el); + _jsPlumb.setPosition(_el, pos); + _unbindDragHandlers(_el); + _jsPlumb.dragManager.clearParent(_el, id); + return [id, pos]; + } + + // + // remove an element from the group, then either prune it from the jsplumb instance, or just orphan it. + // + function _pruneOrOrphan(p) { + + var out = []; + + function _one(el, left, top) { + var orphanedPosition = null; + if (!_isInsideParent(el, [left, top])) { + var group = el._jsPlumbGroup; + if (prune) { + _jsPlumb.remove(el); + } else { + orphanedPosition = _orphan(el); + } + + group.remove(el); + } + + return orphanedPosition; + } + + for (var i = 0; i < p.selection.length; i++) { + out.push(_one(p.selection[i][0], p.selection[i][1].left, p.selection[i][1].top)); + } + + return out.length === 1 ? out[0] : out; + + } + + // + // redraws the element + // + function _revalidate(_el) { + var id = _jsPlumb.getId(_el); + _jsPlumb.revalidate(_el); + _jsPlumb.dragManager.revalidateParent(_el, id); + } + + // + // unbind the group specific drag/revert handlers. + // + function _unbindDragHandlers(_el) { + if (!_el._katavorioDrag) { + return; + } + if (prune || orphan) { + _el._katavorioDrag.off(STOP, _pruneOrOrphan); + } + if (!prune && !orphan && revert) { + _el._katavorioDrag.off(REVERT, _revalidate); + _el._katavorioDrag.setRevert(null); + } + } + + function _bindDragHandlers(_el) { + if (!_el._katavorioDrag) { + return; + } + if (prune || orphan) { + _el._katavorioDrag.on(STOP, _pruneOrOrphan); + } + + if (constrain) { + _el._katavorioDrag.setConstrain(true); + } + + if (ghost) { + _el._katavorioDrag.setUseGhostProxy(true); + } + + if (!prune && !orphan && revert) { + _el._katavorioDrag.on(REVERT, _revalidate); + _el._katavorioDrag.setRevert(function(__el, pos) { + return !_isInsideParent(__el, pos); + }); + } + } + + this.shouldProxy = function() { + return proxied; + }; + + _jsPlumb.getGroupManager().addGroup(this); + }; + + /** + * Adds a group to the jsPlumb instance. + * @method addGroup + * @param {Object} params + * @return {Group} The newly created Group. + */ + _jpi.prototype.addGroup = function(params) { + var j = this; + j._groups = j._groups || {}; + if (j._groups[params.id] != null) { + throw new TypeError("cannot create Group [" + params.id + "]; a Group with that ID exists"); + } + if (params.el[GROUP] != null) { + throw new TypeError("cannot create Group [" + params.id + "]; the given element is already a Group"); + } + var group = new Group(j, params); + j._groups[group.id] = group; + if (params.collapsed) { + this.collapseGroup(group); + } + return group; + }; + + /** + * Add an element to a group. + * @method addToGroup + * @param {String} group Group, or ID of the group, to add the element to. + * @param {Element} el Element to add to the group. + */ + _jpi.prototype.addToGroup = function(group, el, doNotFireEvent) { + + var _one = function(_el) { + var id = this.getId(_el); + this.manage(id, _el); + this.getGroupManager().addToGroup(group, _el, doNotFireEvent); + }.bind(this); + + if (Array.isArray(el)) { + for (var i = 0; i < el.length; i++) { + _one(el[i]); + } + } else { + _one(el); + } + }; + + /** + * Remove an element from a group, and sets its DOM element to be a child of the container again. ?? + * @method removeFromGroup + * @param {String} group Group, or ID of the group, to remove the element from. + * @param {Element} el Element to add to the group. + */ + _jpi.prototype.removeFromGroup = function(group, el, doNotFireEvent) { + this.getGroupManager().removeFromGroup(group, el, doNotFireEvent); + this.getContainer().appendChild(el); + }; + + /** + * Remove a group, and optionally remove its members from the jsPlumb instance. + * @method removeGroup + * @param {String|Group} group Group to delete, or ID of Group to delete. + * @param {Boolean} [deleteMembers=false] If true, group members will be removed along with the group. Otherwise they will + * just be 'orphaned' (returned to the main container). + * @returns {Map[String, Position}} When deleteMembers is false, this method returns a map of {id->position} + */ + _jpi.prototype.removeGroup = function(group, deleteMembers, manipulateDOM, doNotFireEvent) { + return this.getGroupManager().removeGroup(group, deleteMembers, manipulateDOM, doNotFireEvent); + }; + + /** + * Remove all groups, and optionally remove their members from the jsPlumb instance. + * @method removeAllGroup + * @param {Boolean} [deleteMembers=false] If true, group members will be removed along with the groups. Otherwise they will + * just be 'orphaned' (returned to the main container). + */ + _jpi.prototype.removeAllGroups = function(deleteMembers, manipulateDOM, doNotFireEvent) { + this.getGroupManager().removeAllGroups(deleteMembers, manipulateDOM, doNotFireEvent); + }; + + /** + * Get a Group + * @method getGroup + * @param {String} groupId ID of the group to get + * @return {Group} Group with the given ID, null if not found. + */ + _jpi.prototype.getGroup = function(groupId) { + return this.getGroupManager().getGroup(groupId); + }; + + /** + * Gets all the Groups managed by the jsPlumb instance. + * @returns {Group[]} List of Groups. Empty if none. + */ + _jpi.prototype.getGroups = function() { + return this.getGroupManager().getGroups(); + }; + + /** + * Expands a group element. jsPlumb doesn't do "everything" for you here, because what it means to expand a Group + * will vary from application to application. jsPlumb does these things: + * + * - Hides any connections that are internal to the group (connections between members, and connections from member of + * the group to the group itself) + * - Proxies all connections for which the source or target is a member of the group. + * - Hides the proxied connections. + * - Adds the jtk-group-expanded class to the group's element + * - Removes the jtk-group-collapsed class from the group's element. + * + * @method expandGroup + * @param {String|Group} group Group to expand, or ID of Group to expand. + */ + _jpi.prototype.expandGroup = function(group) { + this.getGroupManager().expandGroup(group); + }; + + /** + * Collapses a group element. jsPlumb doesn't do "everything" for you here, because what it means to collapse a Group + * will vary from application to application. jsPlumb does these things: + * + * - Shows any connections that are internal to the group (connections between members, and connections from member of + * the group to the group itself) + * - Removes proxies for all connections for which the source or target is a member of the group. + * - Shows the previously proxied connections. + * - Adds the jtk-group-collapsed class to the group's element + * - Removes the jtk-group-expanded class from the group's element. + * + * @method expandGroup + * @param {String|Group} group Group to expand, or ID of Group to expand. + */ + _jpi.prototype.collapseGroup = function(groupId) { + this.getGroupManager().collapseGroup(groupId); + }; + + + _jpi.prototype.repaintGroup = function(group) { + this.getGroupManager().repaintGroup(group); + }; + + /** + * Collapses or expands a group element depending on its current state. See notes in the collapseGroup and expandGroup method. + * + * @method toggleGroup + * @param {String|Group} group Group to expand/collapse, or ID of Group to expand/collapse. + */ + _jpi.prototype.toggleGroup = function(group) { + group = this.getGroupManager().getGroup(group); + if (group != null) { + this.getGroupManager()[group.collapsed ? "expandGroup" : "collapseGroup"](group); + } + }; + + // + // lazy init a group manager for the given jsplumb instance. + // + _jpi.prototype.getGroupManager = function() { + var mgr = this[GROUP_MANAGER]; + if (mgr == null) { + mgr = this[GROUP_MANAGER] = new GroupManager(this); + } + return mgr; + }; + + _jpi.prototype.removeGroupManager = function() { + delete this[GROUP_MANAGER]; + }; + + /** + * Gets the Group that the given element belongs to, null if none. + * @method getGroupFor + * @param {String|Element} el Element, or element ID. + * @returns {Group} A Group, if found, or null. + */ + _jpi.prototype.getGroupFor = function(el) { + el = this.getElement(el); + if (el) { + var c = this.getContainer(); + var abort = false, g = null, child = null; + while (!abort) { + if (el == null || el === c) { + abort = true; + } else { + if (el[GROUP]) { + g = el[GROUP]; + child = el; + abort = true; + } else { + el = el.parentNode; + } + } + } + return g; + } + }; + +}).call(typeof window !== 'undefined' ? window : this); + + +/* + * This file contains the 'flowchart' connectors, consisting of vertical and horizontal line segments. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + var STRAIGHT = "Straight"; + var ARC = "Arc"; + + var Flowchart = function (params) { + this.type = "Flowchart"; + params = params || {}; + params.stub = params.stub == null ? 30 : params.stub; + var segments, + _super = _jp.Connectors.AbstractConnector.apply(this, arguments), + midpoint = params.midpoint == null ? 0.5 : params.midpoint, + alwaysRespectStubs = params.alwaysRespectStubs === true, + lastx = null, lasty = null, lastOrientation, + cornerRadius = params.cornerRadius != null ? params.cornerRadius : 0, + + // TODO now common between this and AbstractBezierEditor; refactor into superclass? + loopbackRadius = params.loopbackRadius || 25, + isLoopbackCurrently = false, + + sgn = function (n) { + return n < 0 ? -1 : n === 0 ? 0 : 1; + }, + segmentDirections = function(segment) { + return [ + sgn( segment[2] - segment[0] ), + sgn( segment[3] - segment[1] ) + ]; + }, + /** + * helper method to add a segment. + */ + addSegment = function (segments, x, y, paintInfo) { + if (lastx === x && lasty === y) { + return; + } + var lx = lastx == null ? paintInfo.sx : lastx, + ly = lasty == null ? paintInfo.sy : lasty, + o = lx === x ? "v" : "h"; + + lastx = x; + lasty = y; + segments.push([ lx, ly, x, y, o ]); + }, + segLength = function (s) { + return Math.sqrt(Math.pow(s[0] - s[2], 2) + Math.pow(s[1] - s[3], 2)); + }, + _cloneArray = function (a) { + var _a = []; + _a.push.apply(_a, a); + return _a; + }, + writeSegments = function (conn, segments, paintInfo) { + var current = null, next, currentDirection, nextDirection; + for (var i = 0; i < segments.length - 1; i++) { + + current = current || _cloneArray(segments[i]); + next = _cloneArray(segments[i + 1]); + + currentDirection = segmentDirections(current); + nextDirection = segmentDirections(next); + + if (cornerRadius > 0 && current[4] !== next[4]) { + + var minSegLength = Math.min(segLength(current), segLength(next)); + var radiusToUse = Math.min(cornerRadius, minSegLength / 2); + + current[2] -= currentDirection[0] * radiusToUse; + current[3] -= currentDirection[1] * radiusToUse; + next[0] += nextDirection[0] * radiusToUse; + next[1] += nextDirection[1] * radiusToUse; + + var ac = (currentDirection[1] === nextDirection[0] && nextDirection[0] === 1) || + ((currentDirection[1] === nextDirection[0] && nextDirection[0] === 0) && currentDirection[0] !== nextDirection[1]) || + (currentDirection[1] === nextDirection[0] && nextDirection[0] === -1), + sgny = next[1] > current[3] ? 1 : -1, + sgnx = next[0] > current[2] ? 1 : -1, + sgnEqual = sgny === sgnx, + cx = (sgnEqual && ac || (!sgnEqual && !ac)) ? next[0] : current[2], + cy = (sgnEqual && ac || (!sgnEqual && !ac)) ? current[3] : next[1]; + + _super.addSegment(conn, STRAIGHT, { + x1: current[0], y1: current[1], x2: current[2], y2: current[3] + }); + + _super.addSegment(conn, ARC, { + r: radiusToUse, + x1: current[2], + y1: current[3], + x2: next[0], + y2: next[1], + cx: cx, + cy: cy, + ac: ac + }); + } + else { + // dx + dy are used to adjust for line width. + var dx = (current[2] === current[0]) ? 0 : (current[2] > current[0]) ? (paintInfo.lw / 2) : -(paintInfo.lw / 2), + dy = (current[3] === current[1]) ? 0 : (current[3] > current[1]) ? (paintInfo.lw / 2) : -(paintInfo.lw / 2); + + _super.addSegment(conn, STRAIGHT, { + x1: current[0] - dx, y1: current[1] - dy, x2: current[2] + dx, y2: current[3] + dy + }); + } + current = next; + } + if (next != null) { + // last segment + _super.addSegment(conn, STRAIGHT, { + x1: next[0], y1: next[1], x2: next[2], y2: next[3] + }); + } + }; + + this._compute = function (paintInfo, params) { + + segments = []; + lastx = null; + lasty = null; + lastOrientation = null; + + var commonStubCalculator = function () { + return [paintInfo.startStubX, paintInfo.startStubY, paintInfo.endStubX, paintInfo.endStubY]; + }, + stubCalculators = { + perpendicular: commonStubCalculator, + orthogonal: commonStubCalculator, + opposite: function (axis) { + var pi = paintInfo, + idx = axis === "x" ? 0 : 1, + areInProximity = { + "x": function () { + return ( (pi.so[idx] === 1 && ( + ( (pi.startStubX > pi.endStubX) && (pi.tx > pi.startStubX) ) || + ( (pi.sx > pi.endStubX) && (pi.tx > pi.sx))))) || + + ( (pi.so[idx] === -1 && ( + ( (pi.startStubX < pi.endStubX) && (pi.tx < pi.startStubX) ) || + ( (pi.sx < pi.endStubX) && (pi.tx < pi.sx))))); + }, + "y": function () { + return ( (pi.so[idx] === 1 && ( + ( (pi.startStubY > pi.endStubY) && (pi.ty > pi.startStubY) ) || + ( (pi.sy > pi.endStubY) && (pi.ty > pi.sy))))) || + + ( (pi.so[idx] === -1 && ( + ( (pi.startStubY < pi.endStubY) && (pi.ty < pi.startStubY) ) || + ( (pi.sy < pi.endStubY) && (pi.ty < pi.sy))))); + } + }; + + if (!alwaysRespectStubs && areInProximity[axis]()) { + return { + "x": [(paintInfo.sx + paintInfo.tx) / 2, paintInfo.startStubY, (paintInfo.sx + paintInfo.tx) / 2, paintInfo.endStubY], + "y": [paintInfo.startStubX, (paintInfo.sy + paintInfo.ty) / 2, paintInfo.endStubX, (paintInfo.sy + paintInfo.ty) / 2] + }[axis]; + } + else { + return [paintInfo.startStubX, paintInfo.startStubY, paintInfo.endStubX, paintInfo.endStubY]; + } + } + }; + + // calculate Stubs. + var stubs = stubCalculators[paintInfo.anchorOrientation](paintInfo.sourceAxis), + idx = paintInfo.sourceAxis === "x" ? 0 : 1, + oidx = paintInfo.sourceAxis === "x" ? 1 : 0, + ss = stubs[idx], + oss = stubs[oidx], + es = stubs[idx + 2], + oes = stubs[oidx + 2]; + + // add the start stub segment. use stubs for loopback as it will look better, with the loop spaced + // away from the element. + addSegment(segments, stubs[0], stubs[1], paintInfo); + + // if its a loopback and we should treat it differently. + // if (false && params.sourcePos[0] === params.targetPos[0] && params.sourcePos[1] === params.targetPos[1]) { + // + // // we use loopbackRadius here, as statemachine connectors do. + // // so we go radius to the left from stubs[0], then upwards by 2*radius, to the right by 2*radius, + // // down by 2*radius, left by radius. + // addSegment(segments, stubs[0] - loopbackRadius, stubs[1], paintInfo); + // addSegment(segments, stubs[0] - loopbackRadius, stubs[1] - (2 * loopbackRadius), paintInfo); + // addSegment(segments, stubs[0] + loopbackRadius, stubs[1] - (2 * loopbackRadius), paintInfo); + // addSegment(segments, stubs[0] + loopbackRadius, stubs[1], paintInfo); + // addSegment(segments, stubs[0], stubs[1], paintInfo); + // + // } + // else { + + + var midx = paintInfo.startStubX + ((paintInfo.endStubX - paintInfo.startStubX) * midpoint), + midy = paintInfo.startStubY + ((paintInfo.endStubY - paintInfo.startStubY) * midpoint); + + var orientations = {x: [0, 1], y: [1, 0]}, + lineCalculators = { + perpendicular: function (axis) { + var pi = paintInfo, + sis = { + x: [ + [[1, 2, 3, 4], null, [2, 1, 4, 3]], + null, + [[4, 3, 2, 1], null, [3, 4, 1, 2]] + ], + y: [ + [[3, 2, 1, 4], null, [2, 3, 4, 1]], + null, + [[4, 1, 2, 3], null, [1, 4, 3, 2]] + ] + }, + stubs = { + x: [[pi.startStubX, pi.endStubX], null, [pi.endStubX, pi.startStubX]], + y: [[pi.startStubY, pi.endStubY], null, [pi.endStubY, pi.startStubY]] + }, + midLines = { + x: [[midx, pi.startStubY], [midx, pi.endStubY]], + y: [[pi.startStubX, midy], [pi.endStubX, midy]] + }, + linesToEnd = { + x: [[pi.endStubX, pi.startStubY]], + y: [[pi.startStubX, pi.endStubY]] + }, + startToEnd = { + x: [[pi.startStubX, pi.endStubY], [pi.endStubX, pi.endStubY]], + y: [[pi.endStubX, pi.startStubY], [pi.endStubX, pi.endStubY]] + }, + startToMidToEnd = { + x: [[pi.startStubX, midy], [pi.endStubX, midy], [pi.endStubX, pi.endStubY]], + y: [[midx, pi.startStubY], [midx, pi.endStubY], [pi.endStubX, pi.endStubY]] + }, + otherStubs = { + x: [pi.startStubY, pi.endStubY], + y: [pi.startStubX, pi.endStubX] + }, + soIdx = orientations[axis][0], toIdx = orientations[axis][1], + _so = pi.so[soIdx] + 1, + _to = pi.to[toIdx] + 1, + otherFlipped = (pi.to[toIdx] === -1 && (otherStubs[axis][1] < otherStubs[axis][0])) || (pi.to[toIdx] === 1 && (otherStubs[axis][1] > otherStubs[axis][0])), + stub1 = stubs[axis][_so][0], + stub2 = stubs[axis][_so][1], + segmentIndexes = sis[axis][_so][_to]; + + if (pi.segment === segmentIndexes[3] || (pi.segment === segmentIndexes[2] && otherFlipped)) { + return midLines[axis]; + } + else if (pi.segment === segmentIndexes[2] && stub2 < stub1) { + return linesToEnd[axis]; + } + else if ((pi.segment === segmentIndexes[2] && stub2 >= stub1) || (pi.segment === segmentIndexes[1] && !otherFlipped)) { + return startToMidToEnd[axis]; + } + else if (pi.segment === segmentIndexes[0] || (pi.segment === segmentIndexes[1] && otherFlipped)) { + return startToEnd[axis]; + } + }, + orthogonal: function (axis, startStub, otherStartStub, endStub, otherEndStub) { + var pi = paintInfo, + extent = { + "x": pi.so[0] === -1 ? Math.min(startStub, endStub) : Math.max(startStub, endStub), + "y": pi.so[1] === -1 ? Math.min(startStub, endStub) : Math.max(startStub, endStub) + }[axis]; + + return { + "x": [ + [extent, otherStartStub], + [extent, otherEndStub], + [endStub, otherEndStub] + ], + "y": [ + [otherStartStub, extent], + [otherEndStub, extent], + [otherEndStub, endStub] + ] + }[axis]; + }, + opposite: function (axis, ss, oss, es) { + var pi = paintInfo, + otherAxis = {"x": "y", "y": "x"}[axis], + dim = {"x": "height", "y": "width"}[axis], + comparator = pi["is" + axis.toUpperCase() + "GreaterThanStubTimes2"]; + + if (params.sourceEndpoint.elementId === params.targetEndpoint.elementId) { + var _val = oss + ((1 - params.sourceEndpoint.anchor[otherAxis]) * params.sourceInfo[dim]) + _super.maxStub; + return { + "x": [ + [ss, _val], + [es, _val] + ], + "y": [ + [_val, ss], + [_val, es] + ] + }[axis]; + + } + else if (!comparator || (pi.so[idx] === 1 && ss > es) || (pi.so[idx] === -1 && ss < es)) { + return { + "x": [ + [ss, midy], + [es, midy] + ], + "y": [ + [midx, ss], + [midx, es] + ] + }[axis]; + } + else if ((pi.so[idx] === 1 && ss < es) || (pi.so[idx] === -1 && ss > es)) { + return { + "x": [ + [midx, pi.sy], + [midx, pi.ty] + ], + "y": [ + [pi.sx, midy], + [pi.tx, midy] + ] + }[axis]; + } + } + }; + + // compute the rest of the line + var p = lineCalculators[paintInfo.anchorOrientation](paintInfo.sourceAxis, ss, oss, es, oes); + if (p) { + for (var i = 0; i < p.length; i++) { + addSegment(segments, p[i][0], p[i][1], paintInfo); + } + } + + // line to end stub + addSegment(segments, stubs[2], stubs[3], paintInfo); + + //} + + // end stub to end (common) + addSegment(segments, paintInfo.tx, paintInfo.ty, paintInfo); + + + + // write out the segments. + writeSegments(this, segments, paintInfo); + + }; + }; + + _jp.Connectors.Flowchart = Flowchart; + _ju.extend(_jp.Connectors.Flowchart, _jp.Connectors.AbstractConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the code for the Bezier connector type. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + _jp.Connectors.AbstractBezierConnector = function(params) { + params = params || {}; + var showLoopback = params.showLoopback !== false, + curviness = params.curviness || 10, + margin = params.margin || 5, + proximityLimit = params.proximityLimit || 80, + clockwise = params.orientation && params.orientation === "clockwise", + loopbackRadius = params.loopbackRadius || 25, + isLoopbackCurrently = false, + _super; + + this._compute = function (paintInfo, p) { + + var sp = p.sourcePos, + tp = p.targetPos, + _w = Math.abs(sp[0] - tp[0]), + _h = Math.abs(sp[1] - tp[1]); + + if (!showLoopback || (p.sourceEndpoint.elementId !== p.targetEndpoint.elementId)) { + isLoopbackCurrently = false; + this._computeBezier(paintInfo, p, sp, tp, _w, _h); + } else { + isLoopbackCurrently = true; + // a loopback connector. draw an arc from one anchor to the other. + var x1 = p.sourcePos[0], y1 = p.sourcePos[1] - margin, + cx = x1, cy = y1 - loopbackRadius, + // canvas sizing stuff, to ensure the whole painted area is visible. + _x = cx - loopbackRadius, + _y = cy - loopbackRadius; + + _w = 2 * loopbackRadius; + _h = 2 * loopbackRadius; + + paintInfo.points[0] = _x; + paintInfo.points[1] = _y; + paintInfo.points[2] = _w; + paintInfo.points[3] = _h; + + // ADD AN ARC SEGMENT. + _super.addSegment(this, "Arc", { + loopback: true, + x1: (x1 - _x) + 4, + y1: y1 - _y, + startAngle: 0, + endAngle: 2 * Math.PI, + r: loopbackRadius, + ac: !clockwise, + x2: (x1 - _x) - 4, + y2: y1 - _y, + cx: cx - _x, + cy: cy - _y + }); + } + }; + + _super = _jp.Connectors.AbstractConnector.apply(this, arguments); + return _super; + }; + _ju.extend(_jp.Connectors.AbstractBezierConnector, _jp.Connectors.AbstractConnector); + + var Bezier = function (params) { + params = params || {}; + this.type = "Bezier"; + + var _super = _jp.Connectors.AbstractBezierConnector.apply(this, arguments), + majorAnchor = params.curviness || 150, + minorAnchor = 10; + + this.getCurviness = function () { + return majorAnchor; + }; + + this._findControlPoint = function (point, sourceAnchorPosition, targetAnchorPosition, sourceEndpoint, targetEndpoint, soo, too) { + // determine if the two anchors are perpendicular to each other in their orientation. we swap the control + // points around if so (code could be tightened up) + var perpendicular = soo[0] !== too[0] || soo[1] === too[1], + p = []; + + if (!perpendicular) { + if (soo[0] === 0) { + p.push(sourceAnchorPosition[0] < targetAnchorPosition[0] ? point[0] + minorAnchor : point[0] - minorAnchor); + } + else { + p.push(point[0] - (majorAnchor * soo[0])); + } + + if (soo[1] === 0) { + p.push(sourceAnchorPosition[1] < targetAnchorPosition[1] ? point[1] + minorAnchor : point[1] - minorAnchor); + } + else { + p.push(point[1] + (majorAnchor * too[1])); + } + } + else { + if (too[0] === 0) { + p.push(targetAnchorPosition[0] < sourceAnchorPosition[0] ? point[0] + minorAnchor : point[0] - minorAnchor); + } + else { + p.push(point[0] + (majorAnchor * too[0])); + } + + if (too[1] === 0) { + p.push(targetAnchorPosition[1] < sourceAnchorPosition[1] ? point[1] + minorAnchor : point[1] - minorAnchor); + } + else { + p.push(point[1] + (majorAnchor * soo[1])); + } + } + + return p; + }; + + this._computeBezier = function (paintInfo, p, sp, tp, _w, _h) { + + var _CP, _CP2, + _sx = sp[0] < tp[0] ? _w : 0, + _sy = sp[1] < tp[1] ? _h : 0, + _tx = sp[0] < tp[0] ? 0 : _w, + _ty = sp[1] < tp[1] ? 0 : _h; + + _CP = this._findControlPoint([_sx, _sy], sp, tp, p.sourceEndpoint, p.targetEndpoint, paintInfo.so, paintInfo.to); + _CP2 = this._findControlPoint([_tx, _ty], tp, sp, p.targetEndpoint, p.sourceEndpoint, paintInfo.to, paintInfo.so); + + + _super.addSegment(this, "Bezier", { + x1: _sx, y1: _sy, x2: _tx, y2: _ty, + cp1x: _CP[0], cp1y: _CP[1], cp2x: _CP2[0], cp2y: _CP2[1] + }); + }; + + + }; + + _jp.Connectors.Bezier = Bezier; + _ju.extend(Bezier, _jp.Connectors.AbstractBezierConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the state machine connectors, which extend AbstractBezierConnector. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + var _segment = function (x1, y1, x2, y2) { + if (x1 <= x2 && y2 <= y1) { + return 1; + } + else if (x1 <= x2 && y1 <= y2) { + return 2; + } + else if (x2 <= x1 && y2 >= y1) { + return 3; + } + return 4; + }, + + // the control point we will use depends on the faces to which each end of the connection is assigned, specifically whether or not the + // two faces are parallel or perpendicular. if they are parallel then the control point lies on the midpoint of the axis in which they + // are parellel and varies only in the other axis; this variation is proportional to the distance that the anchor points lie from the + // center of that face. if the two faces are perpendicular then the control point is at some distance from both the midpoints; the amount and + // direction are dependent on the orientation of the two elements. 'seg', passed in to this method, tells you which segment the target element + // lies in with respect to the source: 1 is top right, 2 is bottom right, 3 is bottom left, 4 is top left. + // + // sourcePos and targetPos are arrays of info about where on the source and target each anchor is located. their contents are: + // + // 0 - absolute x + // 1 - absolute y + // 2 - proportional x in element (0 is left edge, 1 is right edge) + // 3 - proportional y in element (0 is top edge, 1 is bottom edge) + // + _findControlPoint = function (midx, midy, segment, sourceEdge, targetEdge, dx, dy, distance, proximityLimit) { + // TODO (maybe) + // - if anchor pos is 0.5, make the control point take into account the relative position of the elements. + if (distance <= proximityLimit) { + return [midx, midy]; + } + + if (segment === 1) { + if (sourceEdge[3] <= 0 && targetEdge[3] >= 1) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] >= 1 && targetEdge[2] <= 0) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + (-1 * dx) , midy + (-1 * dy) ]; + } + } + else if (segment === 2) { + if (sourceEdge[3] >= 1 && targetEdge[3] <= 0) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] >= 1 && targetEdge[2] <= 0) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + dx, midy + (-1 * dy) ]; + } + } + else if (segment === 3) { + if (sourceEdge[3] >= 1 && targetEdge[3] <= 0) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] <= 0 && targetEdge[2] >= 1) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + (-1 * dx) , midy + (-1 * dy) ]; + } + } + else if (segment === 4) { + if (sourceEdge[3] <= 0 && targetEdge[3] >= 1) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] <= 0 && targetEdge[2] >= 1) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + dx , midy + (-1 * dy) ]; + } + } + + }; + + var StateMachine = function (params) { + params = params || {}; + this.type = "StateMachine"; + + var _super = _jp.Connectors.AbstractBezierConnector.apply(this, arguments), + curviness = params.curviness || 10, + margin = params.margin || 5, + proximityLimit = params.proximityLimit || 80, + clockwise = params.orientation && params.orientation === "clockwise", + _controlPoint; + + this._computeBezier = function(paintInfo, params, sp, tp, w, h) { + var _sx = params.sourcePos[0] < params.targetPos[0] ? 0 : w, + _sy = params.sourcePos[1] < params.targetPos[1] ? 0 : h, + _tx = params.sourcePos[0] < params.targetPos[0] ? w : 0, + _ty = params.sourcePos[1] < params.targetPos[1] ? h : 0; + + // now adjust for the margin + if (params.sourcePos[2] === 0) { + _sx -= margin; + } + if (params.sourcePos[2] === 1) { + _sx += margin; + } + if (params.sourcePos[3] === 0) { + _sy -= margin; + } + if (params.sourcePos[3] === 1) { + _sy += margin; + } + if (params.targetPos[2] === 0) { + _tx -= margin; + } + if (params.targetPos[2] === 1) { + _tx += margin; + } + if (params.targetPos[3] === 0) { + _ty -= margin; + } + if (params.targetPos[3] === 1) { + _ty += margin; + } + + // + // these connectors are quadratic bezier curves, having a single control point. if both anchors + // are located at 0.5 on their respective faces, the control point is set to the midpoint and you + // get a straight line. this is also the case if the two anchors are within 'proximityLimit', since + // it seems to make good aesthetic sense to do that. outside of that, the control point is positioned + // at 'curviness' pixels away along the normal to the straight line connecting the two anchors. + // + // there may be two improvements to this. firstly, we might actually support the notion of avoiding nodes + // in the UI, or at least making a good effort at doing so. if a connection would pass underneath some node, + // for example, we might increase the distance the control point is away from the midpoint in a bid to + // steer it around that node. this will work within limits, but i think those limits would also be the likely + // limits for, once again, aesthetic good sense in the layout of a chart using these connectors. + // + // the second possible change is actually two possible changes: firstly, it is possible we should gradually + // decrease the 'curviness' as the distance between the anchors decreases; start tailing it off to 0 at some + // point (which should be configurable). secondly, we might slightly increase the 'curviness' for connectors + // with respect to how far their anchor is from the center of its respective face. this could either look cool, + // or stupid, and may indeed work only in a way that is so subtle as to have been a waste of time. + // + + var _midx = (_sx + _tx) / 2, + _midy = (_sy + _ty) / 2, + segment = _segment(_sx, _sy, _tx, _ty), + distance = Math.sqrt(Math.pow(_tx - _sx, 2) + Math.pow(_ty - _sy, 2)), + cp1x, cp2x, cp1y, cp2y; + + + // calculate the control point. this code will be where we'll put in a rudimentary element avoidance scheme; it + // will work by extending the control point to force the curve to be, um, curvier. + _controlPoint = _findControlPoint(_midx, + _midy, + segment, + params.sourcePos, + params.targetPos, + curviness, curviness, + distance, + proximityLimit); + + cp1x = _controlPoint[0]; + cp2x = _controlPoint[0]; + cp1y = _controlPoint[1]; + cp2y = _controlPoint[1]; + + _super.addSegment(this, "Bezier", { + x1: _tx, y1: _ty, x2: _sx, y2: _sy, + cp1x: cp1x, cp1y: cp1y, + cp2x: cp2x, cp2y: cp2y + }); + }; + }; + + _jp.Connectors.StateMachine = StateMachine; + _ju.extend(StateMachine, _jp.Connectors.AbstractBezierConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the 'flowchart' connectors, consisting of vertical and horizontal line segments. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + var STRAIGHT = "Straight"; + + var Straight = function (params) { + this.type = STRAIGHT; + var _super = _jp.Connectors.AbstractConnector.apply(this, arguments); + + this._compute = function (paintInfo, _) { + _super.addSegment(this, STRAIGHT, {x1: paintInfo.sx, y1: paintInfo.sy, x2: paintInfo.startStubX, y2: paintInfo.startStubY}); + _super.addSegment(this, STRAIGHT, {x1: paintInfo.startStubX, y1: paintInfo.startStubY, x2: paintInfo.endStubX, y2: paintInfo.endStubY}); + _super.addSegment(this, STRAIGHT, {x1: paintInfo.endStubX, y1: paintInfo.endStubY, x2: paintInfo.tx, y2: paintInfo.ty}); + }; + }; + + _jp.Connectors.Straight = Straight; + _ju.extend(Straight, _jp.Connectors.AbstractConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the SVG renderers. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + +// ************************** SVG utility methods ******************************************** + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + var svgAttributeMap = { + "stroke-linejoin": "stroke-linejoin", + "stroke-dashoffset": "stroke-dashoffset", + "stroke-linecap": "stroke-linecap" + }, + STROKE_DASHARRAY = "stroke-dasharray", + DASHSTYLE = "dashstyle", + LINEAR_GRADIENT = "linearGradient", + RADIAL_GRADIENT = "radialGradient", + DEFS = "defs", + FILL = "fill", + STOP = "stop", + STROKE = "stroke", + STROKE_WIDTH = "stroke-width", + STYLE = "style", + NONE = "none", + JSPLUMB_GRADIENT = "jsplumb_gradient_", + LINE_WIDTH = "strokeWidth", + ns = { + svg: "http://www.w3.org/2000/svg" + }, + _attr = function (node, attributes) { + for (var i in attributes) { + node.setAttribute(i, "" + attributes[i]); + } + }, + _node = function (name, attributes) { + attributes = attributes || {}; + attributes.version = "1.1"; + attributes.xmlns = ns.svg; + return _jp.createElementNS(ns.svg, name, null, null, attributes); + }, + _pos = function (d) { + return "position:absolute;left:" + d[0] + "px;top:" + d[1] + "px"; + }, + _clearGradient = function (parent) { + var els = parent.querySelectorAll(" defs,linearGradient,radialGradient"); + for (var i = 0; i < els.length; i++) { + els[i].parentNode.removeChild(els[i]); + } + }, + _updateGradient = function (parent, node, style, dimensions, uiComponent) { + var id = JSPLUMB_GRADIENT + uiComponent._jsPlumb.instance.idstamp(); + // first clear out any existing gradient + _clearGradient(parent); + // this checks for an 'offset' property in the gradient, and in the absence of it, assumes + // we want a linear gradient. if it's there, we create a radial gradient. + // it is possible that a more explicit means of defining the gradient type would be + // better. relying on 'offset' means that we can never have a radial gradient that uses + // some default offset, for instance. + // issue 244 suggested the 'gradientUnits' attribute; without this, straight/flowchart connectors with gradients would + // not show gradients when the line was perfectly horizontal or vertical. + var g; + if (!style.gradient.offset) { + g = _node(LINEAR_GRADIENT, {id: id, gradientUnits: "userSpaceOnUse"}); + } + else { + g = _node(RADIAL_GRADIENT, { id: id }); + } + + var defs = _node(DEFS); + parent.appendChild(defs); + defs.appendChild(g); + + // the svg radial gradient seems to treat stops in the reverse + // order to how canvas does it. so we want to keep all the maths the same, but + // iterate the actual style declarations in reverse order, if the x indexes are not in order. + for (var i = 0; i < style.gradient.stops.length; i++) { + var styleToUse = uiComponent.segment === 1 || uiComponent.segment === 2 ? i : style.gradient.stops.length - 1 - i, + stopColor = style.gradient.stops[styleToUse][1], + s = _node(STOP, {"offset": Math.floor(style.gradient.stops[i][0] * 100) + "%", "stop-color": stopColor}); + + g.appendChild(s); + } + var applyGradientTo = style.stroke ? STROKE : FILL; + node.setAttribute(applyGradientTo, "url(#" + id + ")"); + }, + _applyStyles = function (parent, node, style, dimensions, uiComponent) { + + node.setAttribute(FILL, style.fill ? style.fill : NONE); + node.setAttribute(STROKE, style.stroke ? style.stroke : NONE); + + if (style.gradient) { + _updateGradient(parent, node, style, dimensions, uiComponent); + } + else { + // make sure we clear any existing gradient + _clearGradient(parent); + node.setAttribute(STYLE, ""); + } + + if (style.strokeWidth) { + node.setAttribute(STROKE_WIDTH, style.strokeWidth); + } + + // in SVG there is a stroke-dasharray attribute we can set, and its syntax looks like + // the syntax in VML but is actually kind of nasty: values are given in the pixel + // coordinate space, whereas in VML they are multiples of the width of the stroked + // line, which makes a lot more sense. for that reason, jsPlumb is supporting both + // the native svg 'stroke-dasharray' attribute, and also the 'dashstyle' concept from + // VML, which will be the preferred method. the code below this converts a dashstyle + // attribute given in terms of stroke width into a pixel representation, by using the + // stroke's lineWidth. + if (style[DASHSTYLE] && style[LINE_WIDTH] && !style[STROKE_DASHARRAY]) { + var sep = style[DASHSTYLE].indexOf(",") === -1 ? " " : ",", + parts = style[DASHSTYLE].split(sep), + styleToUse = ""; + parts.forEach(function (p) { + styleToUse += (Math.floor(p * style.strokeWidth) + sep); + }); + node.setAttribute(STROKE_DASHARRAY, styleToUse); + } + else if (style[STROKE_DASHARRAY]) { + node.setAttribute(STROKE_DASHARRAY, style[STROKE_DASHARRAY]); + } + + // extra attributes such as join type, dash offset. + for (var i in svgAttributeMap) { + if (style[i]) { + node.setAttribute(svgAttributeMap[i], style[i]); + } + } + }, + _appendAtIndex = function (svg, path, idx) { + if (svg.childNodes.length > idx) { + svg.insertBefore(path, svg.childNodes[idx]); + } + else { + svg.appendChild(path); + } + }; + + /** + utility methods for other objects to use. + */ + _ju.svg = { + node: _node, + attr: _attr, + pos: _pos + }; + + // ************************** / SVG utility methods ******************************************** + + /* + * Base class for SVG components. + */ + var SvgComponent = function (params) { + var pointerEventsSpec = params.pointerEventsSpec || "all", renderer = {}; + + _jp.jsPlumbUIComponent.apply(this, params.originalArgs); + this.canvas = null; + this.path = null; + this.svg = null; + this.bgCanvas = null; + + var clazz = params.cssClass + " " + (params.originalArgs[0].cssClass || ""), + svgParams = { + "style": "", + "width": 0, + "height": 0, + "pointer-events": pointerEventsSpec, + "position": "absolute" + }; + + this.svg = _node("svg", svgParams); + + if (params.useDivWrapper) { + this.canvas = _jp.createElement("div", { position : "absolute" }); + _ju.sizeElement(this.canvas, 0, 0, 1, 1); + this.canvas.className = clazz; + } + else { + _attr(this.svg, { "class": clazz }); + this.canvas = this.svg; + } + + params._jsPlumb.appendElement(this.canvas, params.originalArgs[0].parent); + if (params.useDivWrapper) { + this.canvas.appendChild(this.svg); + } + + var displayElements = [ this.canvas ]; + this.getDisplayElements = function () { + return displayElements; + }; + + this.appendDisplayElement = function (el) { + displayElements.push(el); + }; + + this.paint = function (style, anchor, extents) { + if (style != null) { + + var xy = [ this.x, this.y ], wh = [ this.w, this.h ], p; + if (extents != null) { + if (extents.xmin < 0) { + xy[0] += extents.xmin; + } + if (extents.ymin < 0) { + xy[1] += extents.ymin; + } + wh[0] = extents.xmax + ((extents.xmin < 0) ? -extents.xmin : 0); + wh[1] = extents.ymax + ((extents.ymin < 0) ? -extents.ymin : 0); + } + + if (params.useDivWrapper) { + _ju.sizeElement(this.canvas, xy[0], xy[1], wh[0], wh[1]); + xy[0] = 0; + xy[1] = 0; + p = _pos([ 0, 0 ]); + } + else { + p = _pos([ xy[0], xy[1] ]); + } + + renderer.paint.apply(this, arguments); + + _attr(this.svg, { + "style": p, + "width": wh[0] || 0, + "height": wh[1] || 0 + }); + } + }; + + return { + renderer: renderer + }; + }; + + _ju.extend(SvgComponent, _jp.jsPlumbUIComponent, { + cleanup: function (force) { + if (force || this.typeId == null) { + if (this.canvas) { + this.canvas._jsPlumb = null; + } + if (this.svg) { + this.svg._jsPlumb = null; + } + if (this.bgCanvas) { + this.bgCanvas._jsPlumb = null; + } + + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + if (this.bgCanvas && this.bgCanvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + + this.svg = null; + this.canvas = null; + this.path = null; + this.group = null; + } + else { + // if not a forced cleanup, just detach from DOM for now. + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + if (this.bgCanvas && this.bgCanvas.parentNode) { + this.bgCanvas.parentNode.removeChild(this.bgCanvas); + } + } + }, + reattach:function(instance) { + var c = instance.getContainer(); + if (this.canvas && this.canvas.parentNode == null) { + c.appendChild(this.canvas); + } + if (this.bgCanvas && this.bgCanvas.parentNode == null) { + c.appendChild(this.bgCanvas); + } + }, + setVisible: function (v) { + if (this.canvas) { + this.canvas.style.display = v ? "block" : "none"; + } + } + }); + + /* + * Base class for SVG connectors. + */ + _jp.ConnectorRenderers.svg = function (params) { + var self = this, + _super = SvgComponent.apply(this, [ + { + cssClass: params._jsPlumb.connectorClass, + originalArgs: arguments, + pointerEventsSpec: "none", + _jsPlumb: params._jsPlumb + } + ]); + + _super.renderer.paint = function (style, anchor, extents) { + + var segments = self.getSegments(), p = "", offset = [0, 0]; + if (extents.xmin < 0) { + offset[0] = -extents.xmin; + } + if (extents.ymin < 0) { + offset[1] = -extents.ymin; + } + + if (segments.length > 0) { + + p = self.getPathData(); + + var a = { + d: p, + transform: "translate(" + offset[0] + "," + offset[1] + ")", + "pointer-events": params["pointer-events"] || "visibleStroke" + }, + outlineStyle = null, + d = [self.x, self.y, self.w, self.h]; + + // outline style. actually means drawing an svg object underneath the main one. + if (style.outlineStroke) { + var outlineWidth = style.outlineWidth || 1, + outlineStrokeWidth = style.strokeWidth + (2 * outlineWidth); + outlineStyle = _jp.extend({}, style); + delete outlineStyle.gradient; + outlineStyle.stroke = style.outlineStroke; + outlineStyle.strokeWidth = outlineStrokeWidth; + + if (self.bgPath == null) { + self.bgPath = _node("path", a); + _jp.addClass(self.bgPath, _jp.connectorOutlineClass); + _appendAtIndex(self.svg, self.bgPath, 0); + } + else { + _attr(self.bgPath, a); + } + + _applyStyles(self.svg, self.bgPath, outlineStyle, d, self); + } + + if (self.path == null) { + self.path = _node("path", a); + _appendAtIndex(self.svg, self.path, style.outlineStroke ? 1 : 0); + } + else { + _attr(self.path, a); + } + + _applyStyles(self.svg, self.path, style, d, self); + } + }; + }; + _ju.extend(_jp.ConnectorRenderers.svg, SvgComponent); + +// ******************************* svg segment renderer ***************************************************** + + +// ******************************* /svg segments ***************************************************** + + /* + * Base class for SVG endpoints. + */ + var SvgEndpoint = _jp.SvgEndpoint = function (params) { + var _super = SvgComponent.apply(this, [ + { + cssClass: params._jsPlumb.endpointClass, + originalArgs: arguments, + pointerEventsSpec: "all", + useDivWrapper: true, + _jsPlumb: params._jsPlumb + } + ]); + + _super.renderer.paint = function (style) { + var s = _jp.extend({}, style); + if (s.outlineStroke) { + s.stroke = s.outlineStroke; + } + + if (this.node == null) { + this.node = this.makeNode(s); + this.svg.appendChild(this.node); + } + else if (this.updateNode != null) { + this.updateNode(this.node); + } + _applyStyles(this.svg, this.node, s, [ this.x, this.y, this.w, this.h ], this); + _pos(this.node, [ this.x, this.y ]); + }.bind(this); + + }; + _ju.extend(SvgEndpoint, SvgComponent); + + /* + * SVG Dot Endpoint + */ + _jp.Endpoints.svg.Dot = function () { + _jp.Endpoints.Dot.apply(this, arguments); + SvgEndpoint.apply(this, arguments); + this.makeNode = function (style) { + return _node("circle", { + "cx": this.w / 2, + "cy": this.h / 2, + "r": this.radius + }); + }; + this.updateNode = function (node) { + _attr(node, { + "cx": this.w / 2, + "cy": this.h / 2, + "r": this.radius + }); + }; + }; + _ju.extend(_jp.Endpoints.svg.Dot, [_jp.Endpoints.Dot, SvgEndpoint]); + + /* + * SVG Rectangle Endpoint + */ + _jp.Endpoints.svg.Rectangle = function () { + _jp.Endpoints.Rectangle.apply(this, arguments); + SvgEndpoint.apply(this, arguments); + this.makeNode = function (style) { + return _node("rect", { + "width": this.w, + "height": this.h + }); + }; + this.updateNode = function (node) { + _attr(node, { + "width": this.w, + "height": this.h + }); + }; + }; + _ju.extend(_jp.Endpoints.svg.Rectangle, [_jp.Endpoints.Rectangle, SvgEndpoint]); + + /* + * SVG Image Endpoint is the default image endpoint. + */ + _jp.Endpoints.svg.Image = _jp.Endpoints.Image; + /* + * Blank endpoint in svg renderer is the default Blank endpoint. + */ + _jp.Endpoints.svg.Blank = _jp.Endpoints.Blank; + /* + * Label overlay in svg renderer is the default Label overlay. + */ + _jp.Overlays.svg.Label = _jp.Overlays.Label; + /* + * Custom overlay in svg renderer is the default Custom overlay. + */ + _jp.Overlays.svg.Custom = _jp.Overlays.Custom; + + var AbstractSvgArrowOverlay = function (superclass, originalArgs) { + superclass.apply(this, originalArgs); + _jp.jsPlumbUIComponent.apply(this, originalArgs); + this.isAppendedAtTopLevel = false; + var self = this; + this.path = null; + this.paint = function (params, containerExtents) { + // only draws on connections, not endpoints. + if (params.component.svg && containerExtents) { + if (this.path == null) { + this.path = _node("path", { + "pointer-events": "all" + }); + params.component.svg.appendChild(this.path); + if (this.elementCreated) { + this.elementCreated(this.path, params.component); + } + + this.canvas = params.component.svg; // for the sake of completeness; this behaves the same as other overlays + } + var clazz = originalArgs && (originalArgs.length === 1) ? (originalArgs[0].cssClass || "") : "", + offset = [0, 0]; + + if (containerExtents.xmin < 0) { + offset[0] = -containerExtents.xmin; + } + if (containerExtents.ymin < 0) { + offset[1] = -containerExtents.ymin; + } + + _attr(this.path, { + "d": makePath(params.d), + "class": clazz, + stroke: params.stroke ? params.stroke : null, + fill: params.fill ? params.fill : null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + } + }; + var makePath = function (d) { + return (isNaN(d.cxy.x) || isNaN(d.cxy.y)) ? "" : "M" + d.hxy.x + "," + d.hxy.y + + " L" + d.tail[0].x + "," + d.tail[0].y + + " L" + d.cxy.x + "," + d.cxy.y + + " L" + d.tail[1].x + "," + d.tail[1].y + + " L" + d.hxy.x + "," + d.hxy.y; + }; + this.transfer = function(target) { + if (target.canvas && this.path && this.path.parentNode) { + this.path.parentNode.removeChild(this.path); + target.canvas.appendChild(this.path); + } + }; + }; + + var svgProtoFunctions = { + cleanup : function (force) { + if (this.path != null) { + if (force) { + this._jsPlumb.instance.removeElement(this.path); + } + else { + if (this.path.parentNode) { + this.path.parentNode.removeChild(this.path); + } + } + } + }, reattach :function(instance, component) { + if (this.path && component.canvas) { + component.canvas.appendChild(this.path); + } + }, + setVisible : function (v) { + if (this.path != null) { + (this.path.style.display = (v ? "block" : "none")); + } + } + }; + + _ju.extend(AbstractSvgArrowOverlay, [_jp.jsPlumbUIComponent, _jp.Overlays.AbstractOverlay]); + + _jp.Overlays.svg.Arrow = function () { + AbstractSvgArrowOverlay.apply(this, [_jp.Overlays.Arrow, arguments]); + }; + _ju.extend(_jp.Overlays.svg.Arrow, [ _jp.Overlays.Arrow, AbstractSvgArrowOverlay ], svgProtoFunctions); + + _jp.Overlays.svg.PlainArrow = function () { + AbstractSvgArrowOverlay.apply(this, [_jp.Overlays.PlainArrow, arguments]); + }; + _ju.extend(_jp.Overlays.svg.PlainArrow, [ _jp.Overlays.PlainArrow, AbstractSvgArrowOverlay ], svgProtoFunctions); + + _jp.Overlays.svg.Diamond = function () { + AbstractSvgArrowOverlay.apply(this, [_jp.Overlays.Diamond, arguments]); + }; + _ju.extend(_jp.Overlays.svg.Diamond, [ _jp.Overlays.Diamond, AbstractSvgArrowOverlay ], svgProtoFunctions); + + // a test + _jp.Overlays.svg.GuideLines = function () { + var path = null, self = this, p1_1, p1_2; + _jp.Overlays.GuideLines.apply(this, arguments); + this.paint = function (params, containerExtents) { + if (path == null) { + path = _node("path"); + params.connector.svg.appendChild(path); + self.attachListeners(path, params.connector); + self.attachListeners(path, self); + + p1_1 = _node("path"); + params.connector.svg.appendChild(p1_1); + self.attachListeners(p1_1, params.connector); + self.attachListeners(p1_1, self); + + p1_2 = _node("path"); + params.connector.svg.appendChild(p1_2); + self.attachListeners(p1_2, params.connector); + self.attachListeners(p1_2, self); + } + + var offset = [0, 0]; + if (containerExtents.xmin < 0) { + offset[0] = -containerExtents.xmin; + } + if (containerExtents.ymin < 0) { + offset[1] = -containerExtents.ymin; + } + + _attr(path, { + "d": makePath(params.head, params.tail), + stroke: "red", + fill: null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + + _attr(p1_1, { + "d": makePath(params.tailLine[0], params.tailLine[1]), + stroke: "blue", + fill: null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + + _attr(p1_2, { + "d": makePath(params.headLine[0], params.headLine[1]), + stroke: "green", + fill: null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + }; + + var makePath = function (d1, d2) { + return "M " + d1.x + "," + d1.y + + " L" + d2.x + "," + d2.y; + }; + }; + _ju.extend(_jp.Overlays.svg.GuideLines, _jp.Overlays.GuideLines); +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains code used when jsPlumb is being rendered in a DOM. + * + * Copyright (c) 2010 - 2019 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil, + _jk = root.Katavorio, _jg = root.Biltong; + + var _getEventManager = function(instance) { + var e = instance._mottle; + if (!e) { + e = instance._mottle = new root.Mottle(); + } + return e; + }; + + var _getDragManager = function (instance, category) { + + category = category || "main"; + var key = "_katavorio_" + category; + var k = instance[key], + e = instance.getEventManager(); + + if (!k) { + k = new _jk({ + bind: e.on, + unbind: e.off, + getSize: _jp.getSize, + getConstrainingRectangle:function(el) { + return [ el.parentNode.scrollWidth, el.parentNode.scrollHeight ]; + }, + getPosition: function (el, relativeToRoot) { + // if this is a nested draggable then compute the offset against its own offsetParent, otherwise + // compute against the Container's origin. see also the getUIPosition method below. + var o = instance.getOffset(el, relativeToRoot, el._katavorioDrag ? el.offsetParent : null); + return [o.left, o.top]; + }, + setPosition: function (el, xy) { + el.style.left = xy[0] + "px"; + el.style.top = xy[1] + "px"; + }, + addClass: _jp.addClass, + removeClass: _jp.removeClass, + intersects: _jg.intersects, + indexOf: function(l, i) { return l.indexOf(i); }, + scope:instance.getDefaultScope(), + css: { + noSelect: instance.dragSelectClass, + droppable: "jtk-droppable", + draggable: "jtk-draggable", + drag: "jtk-drag", + selected: "jtk-drag-selected", + active: "jtk-drag-active", + hover: "jtk-drag-hover", + ghostProxy:"jtk-ghost-proxy" + } + }); + k.setZoom(instance.getZoom()); + instance[key] = k; + instance.bind("zoom", k.setZoom); + } + return k; + }; + + var _dragStart=function(params) { + var options = params.el._jsPlumbDragOptions; + var cont = true; + if (options.canDrag) { + cont = options.canDrag(); + } + if (cont) { + this.setHoverSuspended(true); + this.select({source: params.el}).addClass(this.elementDraggingClass + " " + this.sourceElementDraggingClass, true); + this.select({target: params.el}).addClass(this.elementDraggingClass + " " + this.targetElementDraggingClass, true); + this.setConnectionBeingDragged(true); + } + return cont; + }; + var _dragMove=function(params) { + var ui = this.getUIPosition(arguments, this.getZoom()); + if (ui != null) { + var o = params.el._jsPlumbDragOptions; + this.draw(params.el, ui, null, true); + if (o._dragging) { + this.addClass(params.el, "jtk-dragged"); + } + o._dragging = true; + } + }; + var _dragStop=function(params) { + var elements = params.selection, uip; + + var _one = function (_e) { + if (_e[1] != null) { + // run the reported offset through the code that takes parent containers + // into account, to adjust if necessary (issue 554) + uip = this.getUIPosition([{ + el:_e[2].el, + pos:[_e[1].left, _e[1].top] + }]); + this.draw(_e[2].el, uip); + } + + if (_e[0]._jsPlumbDragOptions != null) { + delete _e[0]._jsPlumbDragOptions._dragging; + } + + this.removeClass(_e[0], "jtk-dragged"); + this.select({source: _e[2].el}).removeClass(this.elementDraggingClass + " " + this.sourceElementDraggingClass, true); + this.select({target: _e[2].el}).removeClass(this.elementDraggingClass + " " + this.targetElementDraggingClass, true); + this.getDragManager().dragEnded(_e[2].el); + }.bind(this); + + for (var i = 0; i < elements.length; i++) { + _one(elements[i]); + } + + this.setHoverSuspended(false); + this.setConnectionBeingDragged(false); + }; + + var _animProps = function (o, p) { + var _one = function (pName) { + if (p[pName] != null) { + if (_ju.isString(p[pName])) { + var m = p[pName].match(/-=/) ? -1 : 1, + v = p[pName].substring(2); + return o[pName] + (m * v); + } + else { + return p[pName]; + } + } + else { + return o[pName]; + } + }; + return [ _one("left"), _one("top") ]; + }; + + var _genLoc = function (prefix, e) { + if (e == null) { + return [ 0, 0 ]; + } + var ts = _touches(e), t = _getTouch(ts, 0); + return [t[prefix + "X"], t[prefix + "Y"]]; + }, + _pageLocation = _genLoc.bind(this, "page"), + _screenLocation = _genLoc.bind(this, "screen"), + _clientLocation = _genLoc.bind(this, "client"), + _getTouch = function (touches, idx) { + return touches.item ? touches.item(idx) : touches[idx]; + }, + _touches = function (e) { + return e.touches && e.touches.length > 0 ? e.touches : + e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches : + e.targetTouches && e.targetTouches.length > 0 ? e.targetTouches : + [ e ]; + }; + + /** + Manages dragging for some instance of jsPlumb. + + TODO instead of this being accessed directly, it should subscribe to events on the jsPlumb instance: every method + in here is called directly by jsPlumb. But what should happen is that we have unpublished events that this listens + to. The only trick is getting one of these instantiated with every jsPlumb instance: it needs to have a hook somehow. + Basically the general idea is to pull ALL the drag code out (prototype method registrations plus this) into a + dedicated drag script), that does not necessarily need to be included. + + + */ + var DragManager = function (_currentInstance) { + var _draggables = {}, _dlist = [], _delements = {}, _elementsWithEndpoints = {}, + // elementids mapped to the draggable to which they belong. + _draggablesForElements = {}; + + /** + register some element as draggable. right now the drag init stuff is done elsewhere, and it is + possible that will continue to be the case. + */ + this.register = function (el) { + var id = _currentInstance.getId(el), + parentOffset; + + if (!_draggables[id]) { + _draggables[id] = el; + _dlist.push(el); + _delements[id] = {}; + } + + // look for child elements that have endpoints and register them against this draggable. + var _oneLevel = function (p) { + if (p) { + for (var i = 0; i < p.childNodes.length; i++) { + if (p.childNodes[i].nodeType !== 3 && p.childNodes[i].nodeType !== 8) { + var cEl = jsPlumb.getElement(p.childNodes[i]), + cid = _currentInstance.getId(p.childNodes[i], null, true); + if (cid && _elementsWithEndpoints[cid] && _elementsWithEndpoints[cid] > 0) { + if (!parentOffset) { + parentOffset = _currentInstance.getOffset(el); + } + var cOff = _currentInstance.getOffset(cEl); + _delements[id][cid] = { + id: cid, + offset: { + left: cOff.left - parentOffset.left, + top: cOff.top - parentOffset.top + } + }; + _draggablesForElements[cid] = id; + } + _oneLevel(p.childNodes[i]); + } + } + } + }; + + _oneLevel(el); + }; + + // refresh the offsets for child elements of this element. + this.updateOffsets = function (elId, childOffsetOverrides) { + if (elId != null) { + childOffsetOverrides = childOffsetOverrides || {}; + var domEl = jsPlumb.getElement(elId), + id = _currentInstance.getId(domEl), + children = _delements[id], + parentOffset; + + if (children) { + for (var i in children) { + if (children.hasOwnProperty(i)) { + var cel = jsPlumb.getElement(i), + cOff = childOffsetOverrides[i] || _currentInstance.getOffset(cel); + + // do not update if we have a value already and we'd just be writing 0,0 + if (cel.offsetParent == null && _delements[id][i] != null) { + continue; + } + + if (!parentOffset) { + parentOffset = _currentInstance.getOffset(domEl); + } + + _delements[id][i] = { + id: i, + offset: { + left: cOff.left - parentOffset.left, + top: cOff.top - parentOffset.top + } + }; + _draggablesForElements[i] = id; + } + } + } + } + }; + + /** + notification that an endpoint was added to the given el. we go up from that el's parent + node, looking for a parent that has been registered as a draggable. if we find one, we add this + el to that parent's list of elements to update on drag (if it is not there already) + */ + this.endpointAdded = function (el, id) { + + id = id || _currentInstance.getId(el); + + var b = document.body, + p = el.parentNode; + + _elementsWithEndpoints[id] = _elementsWithEndpoints[id] ? _elementsWithEndpoints[id] + 1 : 1; + + while (p != null && p !== b) { + var pid = _currentInstance.getId(p, null, true); + if (pid && _draggables[pid]) { + var pLoc = _currentInstance.getOffset(p); + + if (_delements[pid][id] == null) { + var cLoc = _currentInstance.getOffset(el); + _delements[pid][id] = { + id: id, + offset: { + left: cLoc.left - pLoc.left, + top: cLoc.top - pLoc.top + } + }; + _draggablesForElements[id] = pid; + } + break; + } + p = p.parentNode; + } + }; + + this.endpointDeleted = function (endpoint) { + if (_elementsWithEndpoints[endpoint.elementId]) { + _elementsWithEndpoints[endpoint.elementId]--; + if (_elementsWithEndpoints[endpoint.elementId] <= 0) { + for (var i in _delements) { + if (_delements.hasOwnProperty(i) && _delements[i]) { + delete _delements[i][endpoint.elementId]; + delete _draggablesForElements[endpoint.elementId]; + } + } + } + } + }; + + this.changeId = function (oldId, newId) { + _delements[newId] = _delements[oldId]; + _delements[oldId] = {}; + _draggablesForElements[newId] = _draggablesForElements[oldId]; + _draggablesForElements[oldId] = null; + }; + + this.getElementsForDraggable = function (id) { + return _delements[id]; + }; + + this.elementRemoved = function (elementId) { + var elId = _draggablesForElements[elementId]; + if (elId) { + delete _delements[elId][elementId]; + delete _draggablesForElements[elementId]; + } + }; + + this.reset = function () { + _draggables = {}; + _dlist = []; + _delements = {}; + _elementsWithEndpoints = {}; + }; + + // + // notification drag ended. We check automatically if need to update some + // ancestor's offsets. + // + this.dragEnded = function (el) { + if (el.offsetParent != null) { + var id = _currentInstance.getId(el), + ancestor = _draggablesForElements[id]; + + if (ancestor) { + this.updateOffsets(ancestor); + } + } + }; + + this.setParent = function (el, elId, p, pId, currentChildLocation) { + var current = _draggablesForElements[elId]; + if (!_delements[pId]) { + _delements[pId] = {}; + } + var pLoc = _currentInstance.getOffset(p), + cLoc = currentChildLocation || _currentInstance.getOffset(el); + + if (current && _delements[current]) { + delete _delements[current][elId]; + } + + _delements[pId][elId] = { + id:elId, + offset : { + left: cLoc.left - pLoc.left, + top: cLoc.top - pLoc.top + } + }; + _draggablesForElements[elId] = pId; + }; + + this.clearParent = function(el, elId) { + var current = _draggablesForElements[elId]; + if (current) { + delete _delements[current][elId]; + delete _draggablesForElements[elId]; + } + }; + + this.revalidateParent = function(el, elId, childOffset) { + var current = _draggablesForElements[elId]; + if (current) { + var co = {}; + co[elId] = childOffset; + this.updateOffsets(current, co); + _currentInstance.revalidate(current); + } + }; + + this.getDragAncestor = function (el) { + var de = jsPlumb.getElement(el), + id = _currentInstance.getId(de), + aid = _draggablesForElements[id]; + + if (aid) { + return jsPlumb.getElement(aid); + } + else { + return null; + } + }; + + }; + + var _setClassName = function (el, cn, classList) { + cn = _ju.fastTrim(cn); + if (typeof el.className.baseVal !== "undefined") { + el.className.baseVal = cn; + } + else { + el.className = cn; + } + + // recent (i currently have 61.0.3163.100) version of chrome do not update classList when you set the base val + // of an svg element's className. in the long run we'd like to move to just using classList anyway + try { + var cl = el.classList; + if (cl != null) { + while (cl.length > 0) { + cl.remove(cl.item(0)); + } + for (var i = 0; i < classList.length; i++) { + if (classList[i]) { + cl.add(classList[i]); + } + } + } + } + catch(e) { + // not fatal + _ju.log("JSPLUMB: cannot set class list", e); + } + }, + _getClassName = function (el) { + return (typeof el.className.baseVal === "undefined") ? el.className : el.className.baseVal; + }, + _classManip = function (el, classesToAdd, classesToRemove) { + classesToAdd = classesToAdd == null ? [] : _ju.isArray(classesToAdd) ? classesToAdd : classesToAdd.split(/\s+/); + classesToRemove = classesToRemove == null ? [] : _ju.isArray(classesToRemove) ? classesToRemove : classesToRemove.split(/\s+/); + + var className = _getClassName(el), + curClasses = className.split(/\s+/); + + var _oneSet = function (add, classes) { + for (var i = 0; i < classes.length; i++) { + if (add) { + if (curClasses.indexOf(classes[i]) === -1) { + curClasses.push(classes[i]); + } + } + else { + var idx = curClasses.indexOf(classes[i]); + if (idx !== -1) { + curClasses.splice(idx, 1); + } + } + } + }; + + _oneSet(true, classesToAdd); + _oneSet(false, classesToRemove); + + _setClassName(el, curClasses.join(" "), curClasses); + }; + + root.jsPlumb.extend(root.jsPlumbInstance.prototype, { + + headless: false, + + pageLocation: _pageLocation, + screenLocation: _screenLocation, + clientLocation: _clientLocation, + + getDragManager:function() { + if (this.dragManager == null) { + this.dragManager = new DragManager(this); + } + + return this.dragManager; + }, + + recalculateOffsets:function(elId) { + this.getDragManager().updateOffsets(elId); + }, + + createElement:function(tag, style, clazz, atts) { + return this.createElementNS(null, tag, style, clazz, atts); + }, + + createElementNS:function(ns, tag, style, clazz, atts) { + var e = ns == null ? document.createElement(tag) : document.createElementNS(ns, tag); + var i; + style = style || {}; + for (i in style) { + e.style[i] = style[i]; + } + + if (clazz) { + e.className = clazz; + } + + atts = atts || {}; + for (i in atts) { + e.setAttribute(i, "" + atts[i]); + } + + return e; + }, + + getAttribute: function (el, attName) { + return el.getAttribute != null ? el.getAttribute(attName) : null; + }, + + setAttribute: function (el, a, v) { + if (el.setAttribute != null) { + el.setAttribute(a, v); + } + }, + + setAttributes: function (el, atts) { + for (var i in atts) { + if (atts.hasOwnProperty(i)) { + el.setAttribute(i, atts[i]); + } + } + }, + appendToRoot: function (node) { + document.body.appendChild(node); + }, + getRenderModes: function () { + return [ "svg" ]; + }, + getClass:_getClassName, + addClass: function (el, clazz) { + jsPlumb.each(el, function (e) { + _classManip(e, clazz); + }); + }, + hasClass: function (el, clazz) { + el = jsPlumb.getElement(el); + if (el.classList) { + return el.classList.contains(clazz); + } + else { + return _getClassName(el).indexOf(clazz) !== -1; + } + }, + removeClass: function (el, clazz) { + jsPlumb.each(el, function (e) { + _classManip(e, null, clazz); + }); + }, + toggleClass:function(el, clazz) { + if (jsPlumb.hasClass(el, clazz)) { + jsPlumb.removeClass(el, clazz); + } else { + jsPlumb.addClass(el, clazz); + } + }, + updateClasses: function (el, toAdd, toRemove) { + jsPlumb.each(el, function (e) { + _classManip(e, toAdd, toRemove); + }); + }, + setClass: function (el, clazz) { + if (clazz != null) { + jsPlumb.each(el, function (e) { + _setClassName(e, clazz, clazz.split(/\s+/)); + }); + } + }, + setPosition: function (el, p) { + el.style.left = p.left + "px"; + el.style.top = p.top + "px"; + }, + getPosition: function (el) { + var _one = function (prop) { + var v = el.style[prop]; + return v ? v.substring(0, v.length - 2) : 0; + }; + return { + left: _one("left"), + top: _one("top") + }; + }, + getStyle:function(el, prop) { + if (typeof window.getComputedStyle !== 'undefined') { + return getComputedStyle(el, null).getPropertyValue(prop); + } else { + return el.currentStyle[prop]; + } + }, + getSelector: function (ctx, spec) { + var sel = null; + if (arguments.length === 1) { + sel = ctx.nodeType != null ? ctx : document.querySelectorAll(ctx); + } + else { + sel = ctx.querySelectorAll(spec); + } + + return sel; + }, + getOffset:function(el, relativeToRoot, container) { + el = jsPlumb.getElement(el); + container = container || this.getContainer(); + var out = { + left: el.offsetLeft, + top: el.offsetTop + }, + op = (relativeToRoot || (container != null && (el !== container && el.offsetParent !== container))) ? el.offsetParent : null, + _maybeAdjustScroll = function(offsetParent) { + if (offsetParent != null && offsetParent !== document.body && (offsetParent.scrollTop > 0 || offsetParent.scrollLeft > 0)) { + out.left -= offsetParent.scrollLeft; + out.top -= offsetParent.scrollTop; + } + }.bind(this); + + while (op != null) { + out.left += op.offsetLeft; + out.top += op.offsetTop; + _maybeAdjustScroll(op); + op = relativeToRoot ? op.offsetParent : + op.offsetParent === container ? null : op.offsetParent; + } + + // if container is scrolled and the element (or its offset parent) is not absolute or fixed, adjust accordingly. + if (container != null && !relativeToRoot && (container.scrollTop > 0 || container.scrollLeft > 0)) { + var pp = el.offsetParent != null ? this.getStyle(el.offsetParent, "position") : "static", + p = this.getStyle(el, "position"); + if (p !== "absolute" && p !== "fixed" && pp !== "absolute" && pp !== "fixed") { + out.left -= container.scrollLeft; + out.top -= container.scrollTop; + } + } + return out; + }, + // + // return x+y proportion of the given element's size corresponding to the location of the given event. + // + getPositionOnElement: function (evt, el, zoom) { + var box = typeof el.getBoundingClientRect !== "undefined" ? el.getBoundingClientRect() : { left: 0, top: 0, width: 0, height: 0 }, + body = document.body, + docElem = document.documentElement, + scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop, + scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft, + clientTop = docElem.clientTop || body.clientTop || 0, + clientLeft = docElem.clientLeft || body.clientLeft || 0, + pst = 0, + psl = 0, + top = box.top + scrollTop - clientTop + (pst * zoom), + left = box.left + scrollLeft - clientLeft + (psl * zoom), + cl = jsPlumb.pageLocation(evt), + w = box.width || (el.offsetWidth * zoom), + h = box.height || (el.offsetHeight * zoom), + x = (cl[0] - left) / w, + y = (cl[1] - top) / h; + + return [ x, y ]; + }, + + /** + * Gets the absolute position of some element as read from the left/top properties in its style. + * @method getAbsolutePosition + * @param {Element} el The element to retrieve the absolute coordinates from. **Note** this is a DOM element, not a selector from the underlying library. + * @return {Number[]} [left, top] pixel values. + */ + getAbsolutePosition: function (el) { + var _one = function (s) { + var ss = el.style[s]; + if (ss) { + return parseFloat(ss.substring(0, ss.length - 2)); + } + }; + return [ _one("left"), _one("top") ]; + }, + + /** + * Sets the absolute position of some element by setting the left/top properties in its style. + * @method setAbsolutePosition + * @param {Element} el The element to set the absolute coordinates on. **Note** this is a DOM element, not a selector from the underlying library. + * @param {Number[]} xy x and y coordinates + * @param {Number[]} [animateFrom] Optional previous xy to animate from. + * @param {Object} [animateOptions] Options for the animation. + */ + setAbsolutePosition: function (el, xy, animateFrom, animateOptions) { + if (animateFrom) { + this.animate(el, { + left: "+=" + (xy[0] - animateFrom[0]), + top: "+=" + (xy[1] - animateFrom[1]) + }, animateOptions); + } + else { + el.style.left = xy[0] + "px"; + el.style.top = xy[1] + "px"; + } + }, + /** + * gets the size for the element, in an array : [ width, height ]. + */ + getSize: function (el) { + return [ el.offsetWidth, el.offsetHeight ]; + }, + getWidth: function (el) { + return el.offsetWidth; + }, + getHeight: function (el) { + return el.offsetHeight; + }, + getRenderMode : function() { return "svg"; }, + draggable : function (el, options) { + var info; + el = _ju.isArray(el) || (el.length != null && !_ju.isString(el)) ? el: [ el ]; + Array.prototype.slice.call(el).forEach(function(_el) { + info = this.info(_el); + if (info.el) { + this._initDraggableIfNecessary(info.el, true, options, info.id, true); + } + }.bind(this)); + return this; + }, + snapToGrid : function(el, x, y) { + var out = []; + var _oneEl = function(_el) { + var info = this.info(_el); + if (info.el != null && info.el._katavorioDrag) { + var snapped = info.el._katavorioDrag.snap(x, y); + this.revalidate(info.el); + out.push([info.el, snapped]); + } + }.bind(this); + + // if you call this method with 0 arguments or 2 arguments it is assumed you want to snap all managed elements to + // a grid. if you supply one argument or 3, then you are assumed to be specifying one element. + if(arguments.length === 1 || arguments.length === 3) { + _oneEl(el, x, y); + } else { + var _me = this.getManagedElements(); + for (var mel in _me) { + _oneEl(mel, arguments[0], arguments[1]); + } + } + + return out; + }, + initDraggable: function (el, options, category) { + _getDragManager(this, category).draggable(el, options); + el._jsPlumbDragOptions = options; + }, + destroyDraggable: function (el, category) { + _getDragManager(this, category).destroyDraggable(el); + delete el._jsPlumbDragOptions; + }, + unbindDraggable: function (el, evt, fn, category) { + _getDragManager(this, category).destroyDraggable(el, evt, fn); + }, + setDraggable : function (element, draggable) { + return jsPlumb.each(element, function (el) { + if (this.isDragSupported(el)) { + this._draggableStates[this.getAttribute(el, "id")] = draggable; + this.setElementDraggable(el, draggable); + } + }.bind(this)); + }, + _draggableStates : {}, + /* + * toggles the draggable state of the given element(s). + * el is either an id, or an element object, or a list of ids/element objects. + */ + toggleDraggable : function (el) { + var state; + jsPlumb.each(el, function (el) { + var elId = this.getAttribute(el, "id"); + state = this._draggableStates[elId] == null ? false : this._draggableStates[elId]; + state = !state; + this._draggableStates[elId] = state; + this.setDraggable(el, state); + return state; + }.bind(this)); + return state; + }, + _initDraggableIfNecessary : function (element, isDraggable, dragOptions, id, fireEvent) { + // TODO FIRST: move to DragManager. including as much of the decision to init dragging as possible. + if (!jsPlumb.headless) { + var _draggable = isDraggable == null ? false : isDraggable; + if (_draggable) { + if (jsPlumb.isDragSupported(element, this)) { + var options = dragOptions || this.Defaults.DragOptions; + options = jsPlumb.extend({}, options); // make a copy. + if (!jsPlumb.isAlreadyDraggable(element, this)) { + var dragEvent = jsPlumb.dragEvents.drag, + stopEvent = jsPlumb.dragEvents.stop, + startEvent = jsPlumb.dragEvents.start; + + this.manage(id, element); + + options[startEvent] = _ju.wrap(options[startEvent], _dragStart.bind(this)); + + options[dragEvent] = _ju.wrap(options[dragEvent], _dragMove.bind(this)); + + options[stopEvent] = _ju.wrap(options[stopEvent], _dragStop.bind(this)); + + var elId = this.getId(element); // need ID + + this._draggableStates[elId] = true; + var draggable = this._draggableStates[elId]; + + options.disabled = draggable == null ? false : !draggable; + this.initDraggable(element, options); + this.getDragManager().register(element); + if (fireEvent) { + this.fire("elementDraggable", {el:element, options:options}); + } + } + else { + // already draggable. attach any start, drag or stop listeners to the current Drag. + if (dragOptions.force) { + this.initDraggable(element, options); + } + } + } + } + } + }, + animationSupported:true, + getElement: function (el) { + if (el == null) { + return null; + } + // here we pluck the first entry if el was a list of entries. + // this is not my favourite thing to do, but previous versions of + // jsplumb supported jquery selectors, and it is possible a selector + // will be passed in here. + el = typeof el === "string" ? el : el.length != null && el.enctype == null ? el[0] : el; + return typeof el === "string" ? document.getElementById(el) : el; + }, + removeElement: function (element) { + _getDragManager(this).elementRemoved(element); + this.getEventManager().remove(element); + }, + // + // this adapter supports a rudimentary animation function. no easing is supported. only + // left/top properties are supported. property delta args are expected to be in the form + // + // +=x.xxxx + // + // or + // + // -=x.xxxx + // + doAnimate: function (el, properties, options) { + options = options || {}; + var o = this.getOffset(el), + ap = _animProps(o, properties), + ldist = ap[0] - o.left, + tdist = ap[1] - o.top, + d = options.duration || 250, + step = 15, steps = d / step, + linc = (step / d) * ldist, + tinc = (step / d) * tdist, + idx = 0, + _int = setInterval(function () { + _jp.setPosition(el, { + left: o.left + (linc * (idx + 1)), + top: o.top + (tinc * (idx + 1)) + }); + if (options.step != null) { + options.step(idx, Math.ceil(steps)); + } + idx++; + if (idx >= steps) { + window.clearInterval(_int); + if (options.complete != null) { + options.complete(); + } + } + }, step); + }, + // DRAG/DROP + + + destroyDroppable: function (el, category) { + _getDragManager(this, category).destroyDroppable(el); + }, + unbindDroppable: function (el, evt, fn, category) { + _getDragManager(this, category).destroyDroppable(el, evt, fn); + }, + + droppable :function(el, options) { + el = _ju.isArray(el) || (el.length != null && !_ju.isString(el)) ? el: [ el ]; + var info; + options = options || {}; + options.allowLoopback = false; + Array.prototype.slice.call(el).forEach(function(_el) { + info = this.info(_el); + if (info.el) { + this.initDroppable(info.el, options); + } + }.bind(this)); + return this; + }, + + initDroppable: function (el, options, category) { + _getDragManager(this, category).droppable(el, options); + }, + isAlreadyDraggable: function (el) { + return el._katavorioDrag != null; + }, + isDragSupported: function (el, options) { + return true; + }, + isDropSupported: function (el, options) { + return true; + }, + isElementDraggable: function (el) { + el = _jp.getElement(el); + return el._katavorioDrag && el._katavorioDrag.isEnabled(); + }, + getDragObject: function (eventArgs) { + return eventArgs[0].drag.getDragElement(); + }, + getDragScope: function (el) { + return el._katavorioDrag && el._katavorioDrag.scopes.join(" ") || ""; + }, + getDropEvent: function (args) { + return args[0].e; + }, + getUIPosition: function (eventArgs, zoom) { + // here the position reported to us by Katavorio is relative to the element's offsetParent. For top + // level nodes that is fine, but if we have a nested draggable then its offsetParent is actually + // not going to be the jsplumb container; it's going to be some child of that element. In that case + // we want to adjust the UI position to account for the offsetParent's position relative to the Container + // origin. + var el = eventArgs[0].el; + if (el.offsetParent == null) { + return null; + } + var finalPos = eventArgs[0].finalPos || eventArgs[0].pos; + var p = { left:finalPos[0], top:finalPos[1] }; + if (el._katavorioDrag && el.offsetParent !== this.getContainer()) { + var oc = this.getOffset(el.offsetParent); + p.left += oc.left; + p.top += oc.top; + } + return p; + }, + setDragFilter: function (el, filter, _exclude) { + if (el._katavorioDrag) { + el._katavorioDrag.setFilter(filter, _exclude); + } + }, + setElementDraggable: function (el, draggable) { + el = _jp.getElement(el); + if (el._katavorioDrag) { + el._katavorioDrag.setEnabled(draggable); + } + }, + setDragScope: function (el, scope) { + if (el._katavorioDrag) { + el._katavorioDrag.k.setDragScope(el, scope); + } + }, + setDropScope:function(el, scope) { + if (el._katavorioDrop && el._katavorioDrop.length > 0) { + el._katavorioDrop[0].k.setDropScope(el, scope); + } + }, + addToPosse:function(el, spec) { + var specs = Array.prototype.slice.call(arguments, 1); + var dm = _getDragManager(this); + _jp.each(el, function(_el) { + _el = [ _jp.getElement(_el) ]; + _el.push.apply(_el, specs ); + dm.addToPosse.apply(dm, _el); + }); + }, + setPosse:function(el, spec) { + var specs = Array.prototype.slice.call(arguments, 1); + var dm = _getDragManager(this); + _jp.each(el, function(_el) { + _el = [ _jp.getElement(_el) ]; + _el.push.apply(_el, specs ); + dm.setPosse.apply(dm, _el); + }); + }, + removeFromPosse:function(el, posseId) { + var specs = Array.prototype.slice.call(arguments, 1); + var dm = _getDragManager(this); + _jp.each(el, function(_el) { + _el = [ _jp.getElement(_el) ]; + _el.push.apply(_el, specs ); + dm.removeFromPosse.apply(dm, _el); + }); + }, + removeFromAllPosses:function(el) { + var dm = _getDragManager(this); + _jp.each(el, function(_el) { dm.removeFromAllPosses(_jp.getElement(_el)); }); + }, + setPosseState:function(el, posseId, state) { + var dm = _getDragManager(this); + _jp.each(el, function(_el) { dm.setPosseState(_jp.getElement(_el), posseId, state); }); + }, + dragEvents: { + 'start': 'start', 'stop': 'stop', 'drag': 'drag', 'step': 'step', + 'over': 'over', 'out': 'out', 'drop': 'drop', 'complete': 'complete', + 'beforeStart':'beforeStart' + }, + animEvents: { + 'step': "step", 'complete': 'complete' + }, + stopDrag: function (el) { + if (el._katavorioDrag) { + el._katavorioDrag.abort(); + } + }, + addToDragSelection: function (spec) { + var el = this.getElement(spec); + if (el != null && (el._isJsPlumbGroup || el._jsPlumbGroup == null)) { + _getDragManager(this).select(spec); + } + }, + removeFromDragSelection: function (spec) { + _getDragManager(this).deselect(spec); + }, + getDragSelection:function() { + return _getDragManager(this).getSelection(); + }, + clearDragSelection: function () { + _getDragManager(this).deselectAll(); + }, + trigger: function (el, event, originalEvent, payload) { + this.getEventManager().trigger(el, event, originalEvent, payload); + }, + doReset:function() { + // look for katavorio instances and reset each one if found. + for (var key in this) { + if (key.indexOf("_katavorio_") === 0) { + this[key].reset(); + } + } + }, + getEventManager:function() { + return _getEventManager(this); + }, + on : function(el, event, callback) { + // TODO: here we would like to map the tap event if we know its + // an internal bind to a click. we have to know its internal because only + // then can we be sure that the UP event wont be consumed (tap is a synthesized + // event from a mousedown followed by a mouseup). + //event = { "click":"tap", "dblclick":"dbltap"}[event] || event; + this.getEventManager().on.apply(this, arguments); + return this; + }, + off : function(el, event, callback) { + this.getEventManager().off.apply(this, arguments); + return this; + } + + }); + + var ready = function (f) { + var _do = function () { + if (/complete|loaded|interactive/.test(document.readyState) && typeof(document.body) !== "undefined" && document.body != null) { + f(); + } + else { + setTimeout(_do, 9); + } + }; + + _do(); + }; + ready(_jp.init); + +}).call(typeof window !== 'undefined' ? window : this); diff --git a/experiment/simulation/EE4/js/layout.js b/experiment/simulation/EE4/js/layout.js new file mode 100644 index 0000000..d52e4ff --- /dev/null +++ b/experiment/simulation/EE4/js/layout.js @@ -0,0 +1,30 @@ +let listItems = document.querySelectorAll(".steps ol li"); +let activeIdx = 0; +// handle list items click +// for (const item of listItems) { +// item.addEventListener("click", (event) => { +// event. +// }); +// } +function nextDrawerItem() { + if (activeIdx < listItems.length) { + listItems[activeIdx].classList.add("active"); + if (activeIdx > 0) { + listItems[activeIdx - 1].classList.add("completed"); + listItems[activeIdx - 1].classList.remove("active"); + } + } + activeIdx = activeIdx < listItems.length ? activeIdx + 1 : activeIdx; +} + +function backDrawerItem() { + if (activeIdx <= 1) return; + activeIdx--; + listItems[activeIdx].classList.remove("active"); + listItems[activeIdx].classList.add("completed"); + if (activeIdx > 0) { + listItems[activeIdx - 1].classList.add("active"); + } +} + + diff --git a/experiment/simulation/EE4/js/main.js b/experiment/simulation/EE4/js/main.js new file mode 100644 index 0000000..799e54f --- /dev/null +++ b/experiment/simulation/EE4/js/main.js @@ -0,0 +1,2168 @@ +// * Audio Mute +let isMute = false; + +// * Current Date +let cd = new Date(); +var currentDateGlobal = `${cd.getDate()} - ${ + cd.getMonth() + 1 +} - ${cd.getFullYear()}`; +console.log(currentDateGlobal); + +// * Quiz object +const Quiz = { + quizData: [ + { + question: + "Which of the following machine is used to measure compressive strength?", + a: "Universal testing machine", + b: "Impact testing machine", + c: "Fatigue testing machine", + d: "Erichsen machine", + correct: "a", + }, + { + question: + "Which one of the following, is not a unit of ultimate tensile strength?", + a: "MPa", + b: "N/m2", + c: "Kg/m3", + d: "PSI", + correct: "c", + }, + { + question: "The extensometer can be attached anywhere to the specimen _", + a: "Yes", + b: "No", + c: "No but sometime yes", + d: "None of the above", + correct: "b", + }, + + { + question: + "What is the smallest measurement that is possible by vernier calliper?", + a: "Least count", + b: "Actual reading", + c: "Main scale division", + d: "Vernier scale division", + correct: "a", + }, + { + question: "What is the least count of a standard metric vernier caliper", + a: "0.002mm", + b: "0.02mm", + c: "0.1mm", + d: "0.2mm", + correct: "b", + }, + ], + quiz_contianer: document.querySelector(".quiz-container"), + quiz: document.getElementById("quiz"), + answerEls: document.querySelectorAll(".answer"), + questionEl: document.getElementById("question"), + a_text: document.getElementById("a_text"), + b_text: document.getElementById("b_text"), + c_text: document.getElementById("c_text"), + d_text: document.getElementById("d_text"), + ansDom: document.getElementById("quizAns"), + opsDom: [this.a_text, this.b_text, this.c_text, this.d_text], + loadQuizCallCount: 0, + currentQuiz: 0, + score: 0, + loadQuiz() { + if (this.currentQuiz >= this.quizData.length) { + return; + } + document.querySelector(".transparent-box").style.display = "block"; + this.loadQuizCallCount++; + window.speechSynthesis.cancel(); + setCC("Choose the correct answer."); + this.deselectAnswers(); + this.quiz_contianer.style.display = "block"; + const currentQuizData = this.quizData[this.currentQuiz]; + + this.questionEl.innerText = currentQuizData.question; + this.a_text.innerText = currentQuizData.a; + this.b_text.innerText = currentQuizData.b; + this.c_text.innerText = currentQuizData.c; + this.d_text.innerText = currentQuizData.d; + }, + + getSelected() { + let answer = undefined; + this.answerEls.forEach((answerEl) => { + if (answerEl.checked) { + answer = answerEl.id; + } + }); + this.answerEls.forEach((answerEl) => { + if (answer != undefined) { + answerEl.disabled = true; + } + }); + + return answer; + }, + + deselectAnswers() { + this.answerEls.forEach((answerEl) => { + answerEl.checked = false; + answerEl.disabled = false; + }); + }, + close() { + this.quiz_contianer.style.display = "none"; + for (let od of this.opsDom) { + od.style.color = ""; + } + document.querySelector(".transparent-box").style.display = "none"; + + // this.ansDom.style.display = "none"; + }, + init() { + let okBtn = document.getElementById("quizSubmit"); + okBtn.textContent = "Submit"; + // onclick for quiz close btn + // document.querySelector("#closeQuiz").onclick = () => { + // this.close(); + // }; + // onclick for quiz submit btn + document.getElementById("quizSubmit").onclick = () => { + // for disable multiple submit + if (this.loadQuizCallCount - 1 !== this.currentQuiz) { + return; + } + // subtitle for quiz + const answer = this.getSelected(); + if (answer) { + // this.ansDom.style.display = "block"; + // this.ansDom.innerHTML = "✔ "+ this.quizData[this.currentQuiz][this.quizData[this.currentQuiz].correct]; + + // updating options with the right and wrong emoji + let ops = "abcd"; + for (let o in ops) { + if (ops[o] == this.quizData[this.currentQuiz].correct) { + this.opsDom[o].innerHTML += " ✔️"; + this.opsDom[o].style.color = "green"; + } else { + this.opsDom[o].innerHTML += " ❌"; + this.opsDom[o].style.color = "red"; + } + } + + if (answer === this.quizData[this.currentQuiz].correct) { + this.score++; + } + this.currentQuiz++; + + //for ok button + + okBtn.textContent = "Ok"; + okBtn.onclick = function () { + Quiz.close(); + Quiz.init(); + }; + + // to stop the next question + // if (this.currentQuiz < this.quizData.length) { + // this.loadQuiz(); + // } else { + // this.quiz.innerHTML = `

    You answered correctly at ${this.score}/${this.quizData.length} questions.

    + // + // `; + // todo show above string to certificate + // } + } + // this.close(); + }; + }, +}; + +// * ChartJs +const ChartGraph = { + ctx: document.getElementById("myChart"), + ctxBox: document.querySelector(".chart"), + graphs: [ + (Graph1 = { + labels: [0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07], + datapoints: [0, 100, 185, 260, 360, 435, 452], + }), + (Graph2 = { + labels: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6], + datapoints: [0, 470, 488, 512, 515, 570], + }), + (Graph3 = { + labels: [0, 0.02, 0.04, 0.06, 0.08, 1, 1.2], + datapoints: [0, 480, 520, 560, 602, 535], + }), + (Graph4 = { + labels: [0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07], + datapoints: [0, 100, 185, 260, 360, 435, 452], + }), + ], + currGr: null, + delete: function () { + this.ctxBox.style.display = "none"; + this.currGr.destroy(); + }, + view: function (num, left, top, height = null, width = null) { + if (height != null) this.ctxBox.style.height = height + "px!important"; + if (width != null) this.ctxBox.style.width = width + "px!important"; + this.ctxBox.style.left = left + "px"; + this.ctxBox.style.top = top + "px"; + this.ctxBox.style.display = "block"; + this.currGr = new Chart(this.ctx, { + type: "line", + data: { + labels: this.graphs[num].labels, + datasets: [ + { + label: "Engineering Stress-Strain Curve", + data: this.graphs[num].datapoints, + borderWidth: 1, + tension: 0.4, + }, + // { + // label: "_", + // data: [0, 470], + // borderWidth: 1, + // }, + ], + }, + options: { + borderWidth: 3, + scales: { + y: { + beginAtZero: true, + }, + }, + }, + }); + return this; + }, +}; + +Quiz.init(); + +// for restriction on next button ; +let isPerformNext = false; + +// animation is running +let isRunning = false; +// to set isProcessRunning and also sync the progressbar + drawer +// ! and toggle the next btn active / deactive +function toggleNextBtn() { + let nextBtn = document.querySelector(".btn-next"); + nextBtn.classList.toggle("btn-deactive"); +} +const cancelSpeech = ()=>{ + window.speechSynthesis.cancel() + ccQueue = [] +} + +const setIsProcessRunning = (value) => { + // calling toggle the next + if(value != isRunning){ + toggleNextBtn() + } + + isRunning = value; + if(value){ + cancelSpeech() + Dom.hideAll() + } +}; + +const show = (ele, disp = "block", opa = 1) => { + ele.style.display = disp; + ele.style.opacity = opa; +}; +const opacity = (ele, val = 1) => { + ele.style.opacity = val; +}; +const hide = (ele, disp = "none") => { + ele.style.display = disp; +}; +const hideAll = (elesName, disp = "none") => { + let eles = getAll(elesName); + for (let ele of eles) { + hide(ele); + } +}; +const showAll = (elesName, disp = "none", opa = 1) => { + let eles = getAll(elesName); + for (let ele of eles) { + show(ele, "block", opa); + } +}; + +const set = (ele, l = null, t = null) => { + if (l !== null) { + ele.style.left = l + "px"; + } + if (t !== null) { + ele.style.top = t + "px"; + } + show(ele); +}; + +let student_name = ""; +// let currentDateGlobal = ""; + +// ! text to audio + +const textToSpeach = (text,speak=true) => { + // for filter + text = text.replaceAll(""," ").replaceAll(""," ") + let utterance = new SpeechSynthesisUtterance(); + utterance.text = text; + utterance.voice = window.speechSynthesis.getVoices()[0]; + if(isMute || !speak){ + utterance.volume = 0 + utterance.rate = 10 + } + window.speechSynthesis.speak(utterance); + return utterance; +}; + +//queue for +let ccQueue = []; +// for subtitile +let ccObj = null; +function setCC(text = null, speed = 25, speak = true) { + if (ccObj != null) { + ccObj.destroy(); + } + + let ccDom = get(".steps-subtitle .subtitle"); + ccQueue.push(text); + ccObj = new Typed(ccDom, { + strings: ["", ...ccQueue], + typeSpeed: speed, + onStringTyped(){ + ccQueue.shift() + // if(ccQueue.length != 0){ + // setCC(ccQueue.shift())` + // } + } + }); + let utterance = textToSpeach(text,speak) + return utterance +} +// ! class Dom{} is send to seperate file +// * for cursor pointer +function cursorPointer(ele) { + ele.style.cursor = "pointer"; +} + +// Img.setBlinkArrow(true,790,444).play(); + +const Scenes = { + items: { + anime_main_dom: new Dom(".anime-main"), + arrowRound: new Dom("arrowRound"), + blinkArrow: new Dom("blinkArrow"), + larrow: new Dom("laerrow"), + larrow2: new Dom("laerrow2"), + logo: new Dom("logo"), + man: new Dom("man"), + arrow: new Dom("measurearrow"), + arrow2: new Dom("measurearrow2"), + redsize: new Dom("redsize"), + speech_off_btn: new Dom("speech_off_btn"), + speech_on_btn: new Dom("speech_on_btn"), + talk_cloud: new Dom("talk_cloud"), + projectIntro: new Dom(".project-intro"), + header: new Dom(".anime-header"), + stepHeading: new Dom(".step-heading"), + stepTitle: new Dom(".step-title"), + stepDescription: new Dom(".step-description"), + tableCalc: new Dom(".measurements"), + tempText: new Dom(".temp-text"), + tempText2: new Dom(".temp-text2"), + tempInputBox: new Dom(".temp-input"), + tempInputBoxInput: new Dom(".temp-input #ipnum"), + tempInputT1: new Dom(".temp-input .text1"), + tempInputT2: new Dom(".temp-input .text2"), + tempInputError: new Dom(".temp-input .error"), + tempInputBtn: new Dom(".temp-input .submit-btn"), + utmBtn: new Dom(".utm-button"), + inputWindow: new Dom(".user-input"), + resultTable: new Dom(".result-table"), + certificate: new Dom(".certificate"), + welcomeBox: new Dom(".welcome-box"), + videoBox: new Dom(".video-box"), + videoBoxSrc: new Dom(".video-box .video"), + videoBoxTitle: new Dom(".video-box .title"), + videoBoxRestartBtn: new Dom(".video-box .controls .restart"), + imageBox: new Dom(".image-box"), + imageBoxSrc: new Dom(".image-box .image"), + imageBoxTitle: new Dom(".image-box .title"), + tempTitle1: new Dom(".temp-title1"), + tempTitle2: new Dom(".temp-title2"), + tempTitle3: new Dom(".temp-title3"), + tempTitle4: new Dom(".temp-title4"), + tempTitle5: new Dom(".temp-title5"), + tempTitle6: new Dom(".temp-title6"), + tempTitle7: new Dom(".temp-title7"), + tempTitle8: new Dom(".temp-title8"), + tempTitle9: new Dom(".temp-title9"), + tempTitle10: new Dom(".temp-title10"), + tempTitle11: new Dom(".temp-title11"), + tempTitle12: new Dom(".temp-title12"), + tempTitle13: new Dom(".temp-title13"), + tempTitle14: new Dom(".temp-title14"), + tempTitle15: new Dom(".temp-title15"), + tempTitle16: new Dom(".temp-title16"), + tempTitle17: new Dom(".temp-title17"), + tempTitle18: new Dom(".temp-title18"), + tempTitle19: new Dom(".temp-title19"), + tempTitle20: new Dom(".temp-title20"), + tempTitle21: new Dom(".temp-title21"), + tempTitle22: new Dom(".temp-title22"), + tempTitle23: new Dom(".temp-title23"), + tempTitle24: new Dom(".temp-title24"), + tempTitle25: new Dom(".temp-title25"), + tempTitle26: new Dom(".temp-title26"), + tempTitle27: new Dom(".temp-title27"), + tempTitle28: new Dom(".temp-title28"), + tempTitle29: new Dom(".temp-title29"), + tempTitle30: new Dom(".temp-title30"), + tempTitle31: new Dom(".temp-title31"), + tempTitle32: new Dom(".temp-title32"), + tempTitle33: new Dom(".temp-title33"), + tempTitle34: new Dom(".temp-title34"), + tempTitle35: new Dom(".temp-title35"), + tempTitle36: new Dom(".temp-title36"), + tempTitle37: new Dom(".temp-title37"), + tempTitle38: new Dom(".temp-title38"), + tempTitle39: new Dom(".temp-title39"), + tempTitle40: new Dom(".temp-title40"), + tempTitle41: new Dom(".temp-title41"), + tempTitle42: new Dom(".temp-title42"), + tempTitle43: new Dom(".temp-title43"), + tempTitle44: new Dom(".temp-title44"), + tempTitle45: new Dom(".temp-title45"), + tempTitle46: new Dom(".temp-title46"), + tempTitle47: new Dom(".temp-title47"), + tempTitle48: new Dom(".temp-title48"), + tempTitle49: new Dom(".temp-title49"), + tempTitle50: new Dom(".temp-title50"), + tempTitle51: new Dom(".temp-title51"), + tempTitle52: new Dom(".temp-title52"), + tempTitle53: new Dom(".temp-title53"), + tempTitle54: new Dom(".temp-title54"), + tempTitle55: new Dom(".temp-title55"), + tempTitle56: new Dom(".temp-title56"), + tempTitle57: new Dom(".temp-title57"), + tempTitle58: new Dom(".temp-title58"), + tempTitle59: new Dom(".temp-title59"), + tempTitle60: new Dom(".temp-title60"), + + concept_development: new Dom(".concept_development"), + + contentAdderBox: new Dom(".content-adder-box"), + btn_save: new Dom(".btn-save"), + btn_next: new Dom(".btn-next"), + graph1: new Dom(".graph1"), + graph2: new Dom(".graph2"), + graph3: new Dom(".graph3"), + graph4: new Dom(".graph4"), + graph5: new Dom(".graph5"), + graph_box_1: new Dom(".graph_box1"), + graph_box_2: new Dom(".graph_box2"), + graph_box_3: new Dom(".graph_box3"), + graph_box_4: new Dom(".graph_box4"), + graph_box_5: new Dom(".graph_box5"), + xLabel: new Dom(".xLabel"), + yLabel: new Dom(".yLabel"), + + part3_table_one: new Dom(".part3_table_one"), + part3_table_two: new Dom(".part3_table_two"), + part3_table_three: new Dom(".part3_table_three"), + part3_table_four: new Dom(".part3_table_four"), + part3_table_four_2: new Dom(".part3_table_four_2"), + + slider_vIn: new Dom(".slider_vIn"), + slider_vGs: new Dom(".slider_vGs"), + slider_R: new Dom(".slider_R"), + + btn_delete: new Dom(".btn-delete"), + btn_reset: new Dom(".btn-reset"), + btn_record: new Dom(".btn-record"), + btn_check_connections: new Dom(".btn-check-connections"), + btn_circuit_diagram: new Dom(".btn-circuit-diagram"), + + btn_transparent: new Dom(".btn-transparent"), + + formulas_component_stress: new Dom("formulas_component_stress"), + formulas_efficiency: new Dom("formulas_efficiency"), + formulas_ideal: new Dom("formulas_ideal"), + formulas_nomenclautre: new Dom("formulas_nomenclautre"), + formulas_non_ideal: new Dom("formulas_non_ideal"), + formulas_procedure: new Dom("formulas_procedure"), + formulas_universal: new Dom("formulas_universal"), + part_3_option_select: new Dom("part_3_option_select"), + part_1_text_for_crrct: new Dom("part_1_text_for_crrct"), + part_1_text_for_wrong: new Dom("part_1_text_for_wrong"), + + + // !EE4 images added + + btn_connections: new Dom("btn_connections"), + btn_connectons_completed: new Dom("btn_connectons_completed"), + btn_instructions: new Dom("btn_instructions"), + btn_nomenclature: new Dom("btn_nomenclature"), + btn_plot: new Dom("btn_plot"), + btn_procedure: new Dom("btn_procedure"), + btn_reset: new Dom("btn_reset"), + btn_start_experiment: new Dom("btn_start_experiment"), + method_1_cable_black_bottom: new Dom("method_1_cable_black_bottom"), + method_1_cable_black_top: new Dom("method_1_cable_black_top"), + method_1_cable_blue: new Dom("method_1_cable_blue"), + method_1_cable_green: new Dom("method_1_cable_green"), + method_1_cable_pink: new Dom("method_1_cable_pink"), + method_1_cable_purple: new Dom("method_1_cable_purple"), + method_1_cable_red: new Dom("method_1_cable_red"), + method_1_cable_yellow: new Dom("method_1_cable_yellow"), + method_2_cable_green: new Dom("method_2_cable_green"), + method_2_cable_red: new Dom("method_2_cable_red"), + method_2_cable_yellow: new Dom("method_2_cable_yellow"), + part_1_instructions_box: new Dom("part_1_instructions_box"), + part_1_procedure_box: new Dom("part_1_procedure_box"), + part_1_select_option_1_1: new Dom("part_1_select_option_1_1"), + part_1_select_option_1_2: new Dom("part_1_select_option_1_2"), + part_1_select_option_2: new Dom("part_1_select_option_2"), + part_1_select_option_3: new Dom("part_1_select_option_3"), + part_1_select_option_full: new Dom("part_1_select_option_full"), + part_1_slide_1: new Dom("part_1_slide_1"), + part_1_slide_2: new Dom("part_1_slide_2"), + part_1_slide_3: new Dom("part_1_slide_3"), + part_1_slide_3_compo_1_off: new Dom("part_1_slide_3_compo_1_off"), + part_1_slide_3_compo_1_on: new Dom("part_1_slide_3_compo_1_on"), + part_1_slide_3_compo_1_text: new Dom("part_1_slide_3_compo_1_text"), + part_1_slide_3_compo_2_off: new Dom("part_1_slide_3_compo_2_off"), + part_1_slide_3_compo_2_on: new Dom("part_1_slide_3_compo_2_on"), + part_1_slide_3_compo_2_text: new Dom("part_1_slide_3_compo_2_text"), + part_1_procedure_box_2: new Dom("part_1_procedure_box_2"), + part_1_slide_4: new Dom("part_1_slide_4"), + part_1_incomplete_connection: new Dom("part_1_incomplete_connection"), + + //! EE4 tables added + part_1_table_1: new Dom(".part_1_table_1"), + part_1_table_2: new Dom(".part_1_table_2"), + + part_1_table_1_col_1: new Dom(".part_1_table_1_col_1"), + part_1_table_1_col_2: new Dom(".part_1_table_1_col_2"), + part_1_table_1_col_3: new Dom(".part_1_table_1_col_3"), + part_1_table_1_col_4: new Dom(".part_1_table_1_col_4"), + part_1_table_1_col_5: new Dom(".part_1_table_1_col_5"), + part_1_table_1_col_6: new Dom(".part_1_table_1_col_6"), + part_1_table_1_col_7: new Dom(".part_1_table_1_col_7"), + part_1_table_1_col_8: new Dom(".part_1_table_1_col_8"), + + part_1_table_2_col_1: new Dom(".part_1_table_2_col_1"), + part_1_table_2_col_2: new Dom(".part_1_table_2_col_2"), + part_1_table_2_col_3: new Dom(".part_1_table_2_col_3"), + part_1_table_2_col_4: new Dom(".part_1_table_2_col_4"), + part_1_table_2_col_5: new Dom(".part_1_table_2_col_5"), + part_1_table_2_col_7: new Dom(".part_1_table_2_col_7"), + part_1_table_2_col_8: new Dom(".part_1_table_2_col_8"), + part_1_table_2_col_9: new Dom(".part_1_table_2_col_9"), + part_1_table_2_col_10: new Dom(".part_1_table_2_col_10"), + // ! new items dom + + // part2 + part_2_conncection_cable_a2 : new Dom("part_2_conncection_cable_a2"), + part_2_conncection_cable_n2 : new Dom("part_2_conncection_cable_n2"), + part_2_conncection_cable_p1 : new Dom("part_2_conncection_cable_p1"), + part_2_conncection_cable_p2 : new Dom("part_2_conncection_cable_p2"), + part_2_conncection_cable_r2 : new Dom("part_2_conncection_cable_r2"), + part_2_conncection_cable_s : new Dom("part_2_conncection_cable_s"), + part_2_conncection_cable_v1 : new Dom("part_2_conncection_cable_v1"), + part_2_conncection_cable_v2 : new Dom("part_2_conncection_cable_v2"), + part_2_conncection_cable_vg1 : new Dom("part_2_conncection_cable_vg1"), + part_2_conncection_cable_vg2 : new Dom("part_2_conncection_cable_vg2"), + part_2_conncection_supply_1_red_button : new Dom("part_2_conncection_supply_1_red_button"), + part_2_conncection_supply_2_red_button : new Dom("part_2_conncection_supply_2_red_button"), + part_2_connections_components : new Dom("part_2_connections_components"), + // connection box + part_2_connections_box: new Dom(".part_2_connections_box"), + part_1_1_connections_box: new Dom(".part_1_1_connections_box"), + part_1_2_connections_box: new Dom(".part_1_2_connections_box"), + + //new images added for part1 + part_1_1_cable_a2 : new Dom("part_1_1_cable_a2"), + part_1_1_cable_n2 : new Dom("part_1_1_cable_n2"), + part_1_1_cable_p1 : new Dom("part_1_1_cable_p1"), + part_1_1_cable_p2 : new Dom("part_1_1_cable_p2"), + part_1_1_cable_r2 : new Dom("part_1_1_cable_r2"), + part_1_1_cable_s : new Dom("part_1_1_cable_s"), + part_1_1_cable_v1 : new Dom("part_1_1_cable_v1"), + part_1_1_cable_v2 : new Dom("part_1_1_cable_v2"), + part_1_2_cable_a1 : new Dom("part_1_2_cable_a1"), + part_1_2_cable_cp : new Dom("part_1_2_cable_cp"), + part_1_2_cable_dvp : new Dom("part_1_2_cable_dvp"), + part_1_2_cable_n2 : new Dom("part_1_2_cable_n2"), + part_1_2_cable_p1 : new Dom("part_1_2_cable_p1"), + part_1_2_cable_p2 : new Dom("part_1_2_cable_p2"), + part_1_2_cable_r1 : new Dom("part_1_2_cable_r1"), + part_1_2_cable_s : new Dom("part_1_2_cable_s"), + part_1_2_cable_v1 : new Dom("part_1_2_cable_v1"), + part_1_2_cable_v2 : new Dom("part_1_2_cable_v2"), + part_1_components_1 : new Dom("part_1_components_1"), + part_1_components_2 : new Dom("part_1_components_2"), + + // part2 calculation + part_2_calculation_components : new Dom("part_2_calculation_components"), + + + //* 29 feb new imgs + + part_1_1_calculations : new Dom("part_1_1_calculations"), + part_1_2_calculations : new Dom("part_1_2_calculations"), + + //* part3 images added + part_3_components : new Dom("part_3_components"), + part_3_graph : new Dom("part_3_graph"), + part_3_off_button : new Dom("part_3_off_button"), + part_3_table_1 : new Dom("part_3_table_1"), + part_3_table_2 : new Dom("part_3_table_2"), + part_3_table_3 : new Dom("part_3_table_3"), + part_3_text : new Dom("part_3_text"), + + niddle_vGs: new Dom("niddle_vGs"), + niddle_vIn: new Dom("niddle_vIn"), + + // * for PROCEDURE and instruction NOMENCLATURE + + part_1_1_instruction : new Dom("part_1_1_instruction"), + part_1_1_nomenclature : new Dom("part_1_1_nomenclature"), + part_1_1_procedure : new Dom("part_1_1_procedure"), + part_1_2_instruction : new Dom("part_1_2_instruction"), + part_1_2_nomenclature : new Dom("part_1_2_nomenclature"), + part_1_2_procedure : new Dom("part_1_2_procedure"), + part_2_instruction : new Dom("part_2_instruction"), + part_2_nomenclature : new Dom("part_2_nomenclature"), + part_2_procedure : new Dom("part_2_procedure"), + part_3_nomenclature : new Dom("part_3_nomenclature"), + part_3_procedure : new Dom("part_3_procedure"), + compo_left : new Dom("compo_left"), + + + // Experimental section images added here + btn_1: new Dom("btn_1"), + btn_2: new Dom("btn_2"), + btn_click: new Dom("btn_click"), + circle: new Dom("circle"), + frame_1: new Dom("frame_1"), + frame_2: new Dom("frame_2"), + frame_3: new Dom("frame_3"), + menu_page: new Dom("menu_page"), + val_vgs: new Dom("val_vgs"), + val_vin: new Dom("val_vin"), + + domQs1: new Dom("domQs1"), + domQs2: new Dom("domQs2"), + domQs3: new Dom("domQs3"), + domQs4: new Dom("domQs4"), + domQs5: new Dom("domQs5"), + domQs6: new Dom("domQs6"), + + chart: [ + (graph1 = null), + (graph2 = null), + (graph3 = null), + (graph4 = null), + (graph5 = null), + (graph6 = null), + (graph7 = null), + ], + + chart: { + label1: { + x: "Label 2", + y: "Label 1", + }, + label2: { + x: "Label 2", + y: "Label 1", + }, + label3: { + x: "Label 2", + y: "Label 1", + }, + label4: { + x: "Label 2", + y: "Label 1", + }, + label5: { + x: "Label 2", + y: "Label 1", + }, + label6: { + x: "Label 2", + y: "Label 1", + }, + label7: { + x: "Label 2", + y: "Label 1", + }, + }, + }, + // ! To Plot graph + plotGraph( + ctx, + graphIdx, + data, + dataLabel, + xLabel = null, + yLabel = null, + beginAtZero = false, + startEmpty = false, + ) { + // for label + Scenes.items.yLabel.set(504, 263).setContent(yLabel).styles({ + backgroundColor: "transperant", + textAlign: "center", + color: "black", + width: "170px", + rotate: "-90deg", + zIndex: 10, + }); + Scenes.items.xLabel.set(664, 375).setContent(xLabel).styles({ + backgroundColor: "transperant", + color: "black", + width: "fit-content", + zIndex: 10, + }); + + // ! Destroy old graph + let graphRef = Scenes.items.chart[graphIdx]; + if (graphRef != null) { + graphRef.destroy(); + } + + // temprory dataset + let datasets = [ + { + label: dataLabel, + fill: false, + borderColor: "red", + backgroundColor: "red", + data: data, + display: false, + }, + ] + + if(startEmpty){ + datasets=[] + } + + graphRef = new Chart(ctx, { + type: "scatter", + plugins: [ + { + // afterDraw: chart => { + // var ctx = chart.chart.ctx; + // ctx.save(); + // ctx.textAlign = 'center'; + // ctx.font = '18px Arial'; + // ctx.fillStyle = 'black'; + // ctx.fillText('Output Power (P )', chart.chart.width / 2, chart.chart.height - 24); + // ctx.textAlign = 'left'; + // ctx.font = '10px Arial'; + // ctx.fillText('0', chart.chart.width - 119, chart.chart.height - 12); + // ctx.restore(); + // }, + }, + ], + data: { + datasets: datasets + }, + options: { + responsive: true, + maintainAspectRatio: false, + scales: { + yAxes: [ + { + scaleLabel: { + display: false, + labelString: yLabel, + fontColor: "black", + fontSize: 17, + }, + ticks: { + beginAtZero: beginAtZero, + fontColor: "black", + fontSize: 14, + }, + }, + ], + xAxes: [ + { + scaleLabel: { + display: false, + labelString: xLabel, + fontColor: "black", + fontSize: 17, + }, + ticks: { + beginAtZero: beginAtZero, + fontColor: "black", + fontSize: 14, + }, + }, + ], + }, + }, + }); + + Scenes.items.chart[graphIdx] = graphRef; + return graphRef + }, + + // for adding new datasets to graph + graphFeatures: { + addDataset(chart, label, bgColor, data) { + chart.data.datasets.push({ + label: label, + fill: false, + borderColor: bgColor, + backgroundColor: bgColor, + data: data, + }); + chart.update(); + }, + addData(chart, index, data) { + console.log(data); + if (data.length > 0) { + chart.data.datasets[index].data = data; + } else { + chart.data.datasets[index].data.push(data); + } + chart.update(); + }, + getSizeOfDatasets(chart){ + return chart.data.datasets.length + } + }, + deleteAll() { + for (i in this.img) { + Scenes.img[i].hide(); + } + for (i in this.items) { + if (i == "header" || i == "stepTitle" || i == "stepDescription") { + continue; + } + hide(Scenes.items[i]); + } + }, + // for content adder btn box + contentAdderAddBtn(text) { + Scenes.items.contentAdderBox.item.innerHTML += `
  • ${text}
  • `; + }, + currentStep: 0, + subCurrentStep: 0, + resetSubStep() { + this.subCurrentStep = 0; + }, + incCurrentSubStep() { + this.subCurrentStep++; + }, + setStepHeading(step, description,hide) { + Scenes.items.stepTitle.setContent(step); + Scenes.items.stepDescription.setContent(description); + Scenes.items.stepHeading.show("flex").push(); + if(hide){ + let st={ + visibility: "hidden" + } + Scenes.items.stepTitle.styles(st) + Scenes.items.stepDescription.styles(st) + } + }, + + //* for hover on instuction , procedure and nomenclature + + // not done yet + showPopup(step){ + + let instructionBtn = Scenes.items.btn_instructions.zIndex(1000) + let procedureBtn = Scenes.items.btn_procedure.zIndex(1000) + let nomenclatureBtn = Scenes.items.btn_nomenclature.zIndex(1000) + let instructionImg, procedureImg, nomenclatureImg; + + let btn = [ + instructionBtn, + procedureBtn, + nomenclatureBtn, + ] + + switch(step){ + case "1_1" : + instructionImg = Scenes.items.part_1_1_instruction; + procedureImg = Scenes.items.part_1_1_procedure.set(-150).hide(); + nomenclatureImg = Scenes.items.part_1_1_nomenclature; + + console.log("case3") + + break; + + case "1_2" : instructionImg = Scenes.items.part_1_2_instruction; + procedureImg = Scenes.items.part_1_2_procedure.set(-80,null,320).hide(); + nomenclatureImg = Scenes.items.part_1_2_nomenclature.set(-100).hide(); + console.log("case4") + break; + + case "2" : instructionImg = Scenes.items.part_2_instruction; + procedureImg = Scenes.items.part_2_procedure.set(null,-80).hide(); + nomenclatureImg = Scenes.items.part_2_nomenclature.set(null,-80).hide(); + + break; + + case "3" : + procedureImg = Scenes.items.part_3_procedure; + nomenclatureImg = Scenes.items.part_3_nomenclature; + + break; + } + + let showInstructionImg = function(){ + instructionImg.show().zIndex(40) + } + + let showProcedureImg = function(){ + procedureImg.show().zIndex(40) + + } + + let showNomenclatureImg = function(){ + nomenclatureImg.show().zIndex(40) + + } + + let hideInstructionImg = function(){ + instructionImg.hide() + } + + let hideProcedureImg = function(){ + procedureImg.hide() + + } + + let hideNomenclatureImg = function(){ + nomenclatureImg.hide() + + } + + + btn[0].item.onmouseover = showInstructionImg + btn[0].item.onmouseout = hideInstructionImg + + btn[1].item.onmouseover = showProcedureImg + btn[1].item.onmouseout = hideProcedureImg + + btn[2].item.onmouseover = showNomenclatureImg + btn[2].item.onmouseout = hideNomenclatureImg + + + + + + }, + // for typing hello text + intru: null, + intruVoice: null, + optionsDone: [0, 0, 0, 0], + steps: [ + (intro = () => { + // remove all dom element for back and setProcessRunning + setIsProcessRunning(true); + + // starting elements + + // subtitle + setTimeout(() => { + setCC("Enter your name and click on 'Start' to start the experiment"); + }, 500); + Scenes.items.header.set(0, 120).show("flex"); + let inputWindow = get(".user-input"); + show(inputWindow, "flex"); + let man = new Dom("man").set(650, 80).push(); + + let submitBtn = get("#nameSubmitBtn"); + submitBtn.onclick = () => { + student_name = get("#stuName").value; + let error = get(".user-input .error"); + // todo remove comment + if (student_name.trim() == "") { + show(error); + return; + } + // take only first space + let fName = student_name.slice(0, student_name.indexOf(" ")); + hide(error); + let tl = anime.timeline({ + easing: "easeOutExpo", + duration: 1000, + }); + tl.add({ + targets: ".anime-header", + top: 0, + }) + .add({ + targets: ".user-input", + opacity: 0, + }) + .add({ + targets: man.item, + translateX: -280, + }) + .add({ + targets: Scenes.items.talk_cloud.item, + begin() { + // Scenes.items.tempText.innerHTML = `👋 Hey!
    ${fName}`; + Scenes.items.tempText.item.style.fontWeight = "bold"; + // show(Scenes.items.tempText); + intru = new Typed(Scenes.items.tempText.item, { + strings: ["", `Hey!👋
    ${fName}`], + typeSpeed: 25, + }); + Scenes.items.tempText.set(482, 1); + textToSpeach(`Hey! ${fName}`); + textToSpeach( + "Welcome to Foundation Wall in Foamwork Experiment of Foamwork Technology in Civil Engineering Virtual Lab developed by Prof. K. N. Jha, Department of Civil Engineering, IIT Delhi." + ); + Scenes.items.talk_cloud.set(450, -40, 180).push(); + setCC(""); + }, + endDelay: 2000, + opacity: [0, 1], + }) + .add({ + begin() { + // to hide previous step images + intru.destroy(); + Dom.hideAll(); + Scenes.items.welcomeBox.show("flex"); + }, + }) + .add({ + duration: 12000, + complete() { + setCC("Click 'Next' to go to next step"); + Dom.setBlinkArrow(true, 790, 444).play(); + setIsProcessRunning(false); + }, + }); + }; + return true; + }), + (objective = function () { + setIsProcessRunning(true); + Dom.hideAll(); + + // require + let btn_transparent = Scenes.items.btn_transparent.set().zIndex(6000).item; + + Scenes.items.concept_development.set().styles({ + zIndex: "5000", + scale: "1 0.914", + top: "-143px", + position: "absolute", + }) + + // ! Slide ended enable the button next button + function checkIsSlideEnded(){ + let isSlideEnded = localStorage.getItem("isSlideEnded") + if(isSlideEnded=="true"){ + btn_transparent.disabled = false + setIsProcessRunning(false) + btn_transparent.classList.remove("btn-disabled") + // setCC("Click next to goto next slide.") + Dom.setBlinkArrowRed(true, 866, 420,30,null,-90).play(); + btn_transparent.onclick = ()=>{ + Scenes.next() + localStorage.setItem("isSlideEnded",false) + window.clearInterval(interval) + } + } + } + var interval = window.setInterval(checkIsSlideEnded, 1000) + + return true; + }), + //! EE4 step 1 + (step1 = function () { + setIsProcessRunning(true); + Scenes.items.btn_next.show(); + + // todo all previous elements hide + Dom.hideAll(); + Scenes.items.contentAdderBox.item.innerHTML = ""; + + Scenes.setStepHeading("Step-1", "To Plot Different Characteristics."); + // setCC("Click on the 'ICON' to plot the performance characteristics.") + + // * remove all previous restrictions + + //! * Required Elements + + Scenes.items.part_1_select_option_full.set(0, 0, 404); + Scenes.items.part_1_select_option_1_1.set(600, 8, 60, 270).zIndex(1); + Scenes.items.part_1_select_option_1_2.set(600, 85, 60, 270).zIndex(1); + + // ! onclicks for all options + let options = [ + Scenes.items.part_1_select_option_1_1, + Scenes.items.part_1_select_option_1_2, + ]; + + // ! Destroy Graphs + function destroyGraphs() { + for (let i = 0; i < 7; i++) { + if (Scenes.items.chart[i] != null) { + Scenes.items.chart[i].destroy(); + } + } + } + // destroyGraphs() + + Scenes.forMathematicalExpressionBtn = 0; + + const opOne = () => { + Scenes.optionsDone[0] = 1; + Scenes.forMathematicalExpressionBtn = 1; + Scenes.steps[0 + 3](); + }; + const opTwo = () => { + Scenes.optionsDone[1] = 1; + Scenes.forMathematicalExpressionBtn = 2; + Scenes.steps[1 + 3](); + }; + + options[0].item.onclick = opOne; + options[1].item.onclick = opTwo; + + // ! if all options done then exit + let exit = true; + for (let i of Scenes.optionsDone) { + if (i == 0) { + exit = false; + break; + } + } + + if (exit) { + // after complete + // Dom.setBlinkArrow(true, 790, 408).play(); + setCC("Simulation Done"); + setIsProcessRunning(false); + } + + return true; + }), + + (step2 = function () { + setIsProcessRunning(true); + + Scenes.setStepHeading("", "using meteres",true); + Scenes.items.btn_next.show(); + // ! Step Connection + + // required elements + let btns = [ + Scenes.items.btn_instructions.set(750 + 40, 190, 50).zIndex(10), + Scenes.items.btn_connections.set(750 + 40, 190 + 55, 50).zIndex(10), + Scenes.items.btn_connectons_completed + .set(750 + 40, 190 + 110, 50, 147) + .zIndex(10), + Scenes.items.btn_start_experiment + .set(750 + 40, 190 + 165, 50, 147) + .zIndex(10), + Scenes.items.btn_reset.set(660, 190 + 165, 40).zIndex(10) + ] + + + // required images + let images = [ + Scenes.items.part_1_components_1.set(0,-70,495,975).zIndex(1), + Scenes.items.part_2_conncection_supply_1_red_button.set(171,76,28,25).zIndex(10), + Scenes.items.part_2_conncection_supply_2_red_button.set(178,312,29,25).zIndex(10), + Scenes.items.part_1_1_connections_box, + ] + + let cables = [ + Scenes.items.part_1_1_cable_p1.set(0,0).zIndex(2).hide(), + Scenes.items.part_1_1_cable_s.set(0,0).zIndex(3).hide(), + Scenes.items.part_1_1_cable_a2.set(0,0).zIndex(4).hide(), + Scenes.items.part_1_1_cable_r2.set(0,0).zIndex(5).hide(), + Scenes.items.part_1_1_cable_p2.set(0,0).zIndex(6).hide(), + Scenes.items.part_1_1_cable_n2.set(0,0).zIndex(7).hide(), + Scenes.items.part_1_1_cable_v1.set(0,0).zIndex(8).hide(), + Scenes.items.part_1_1_cable_v2.set(0,0).zIndex(9).hide(), + ] + + // ! for increasing the size + let l = 0,t = -70, h = 495, w = 975 + Scenes.items.part_1_components_1.set(l,t,h,w).zIndex(1) + cables.forEach(ele=>{ + ele.set(l,t,h,w).hide() + }) + + let cables_color = [ + "#970101", + "#1a2f55", + "#186a3b", + "#181818", + "#ffd90e", + "#181818", + "#cf426d", + "#560056", + ] + + + function hideConnectionStepImgs(){ + let allImages = [ + ...btns,...images,...cables + ] + allImages.forEach(ele=>{ + ele.hide() + }) + Dom.setBlinkArrowRed(-1) + } + + + //! Connection Part + // to enable startExp Button + let partConnectionsIsComplete = false + function partConnections(){ + // Connection Logic + Scenes.items.part_1_1_connections_box.set(514,-70).hide() + + // ! btn_reset onclick + Scenes.items.btn_reset.item.onclick = ()=>{ + let box_buttons_reset = document.querySelectorAll(".part_1_1_connections_box button") + let temps = { + textShadow: "none", + color: "black", + backgroundColor: "transparent" + } + box_buttons_reset.forEach(ele=>{ + let ele_Dom = new Dom(ele) + ele_Dom.styles(temps) + }) + Scenes.steps[3]() + } + + //! connection box onclick + Scenes.items.btn_connections.item.onclick = ()=>{ + Scenes.items.part_1_1_connections_box.show("flex") + // ! connection table arrow move + Dom.setBlinkArrowRed(true,580,5,35,null,90).play() + setCC("") + } + let box_buttons = document.querySelectorAll(".part_1_1_connections_box button") + + //! connection box onclick + let btnClickedCount = 0 + let connectionBtnArrow = 580 + let arrowLeftGap = 46 + box_buttons.forEach((ele,i)=>{ + ele.onclick = ()=>{ + // increasing count of complete connection + if(ele.style.color!="white"){ + btnClickedCount++ + //! move arrow + connectionBtnArrow += arrowLeftGap + Dom.setBlinkArrowRed(true,connectionBtnArrow,5,35,null,90).play() + + if(btnClickedCount==8){ + Dom.setBlinkArrowRed(true,745,305,35,null,180).play() + setCC("Click on Connections Completed") + + Scenes.items.btn_connections.item.onclick = ()=>{} + } + } + + cables[i].show() + ele.style.backgroundColor = cables_color[i] + ele.style.color = "white" + ele.style.textShadow = "1px 1px black" + } + }) + + Dom.setBlinkArrowRed(true,745,250,35,null,180).play() + setCC("Click on Connections") + + //! Onclick for check connections + Scenes.items.btn_connectons_completed.item.onclick = ()=>{ + + if(btnClickedCount==8){ + + //! First red button click + Scenes.items.part_1_slide_3_compo_1_text.set(208,114,50).zIndex(10) + Dom.setBlinkArrowRed(true,206,73).play() + setCC("Switch on Main Supply") + Scenes.items.part_2_conncection_supply_1_red_button.item.onclick = ()=>{ + + Scenes.items.part_2_conncection_supply_1_red_button.hide() + Scenes.items.part_1_slide_3_compo_1_text.hide() + //! Second red button click + + Scenes.items.part_1_slide_3_compo_2_text.set(212,348,56).zIndex(10) + Dom.setBlinkArrowRed(true,206,308).play() + setCC("Switch on Gate Supply") + + Scenes.items.part_2_conncection_supply_2_red_button.item.onclick = ()=>{ + Scenes.items.part_2_conncection_supply_2_red_button.hide() + Scenes.items.part_1_slide_3_compo_2_text.hide() + + Dom.setBlinkArrowRed(true,748,360,35,null,180).play() + setCC("Click on Start Experiment") + partConnectionsIsComplete = true + } + } + + } + else{ + Scenes.items.part_1_incomplete_connection.set(570,300,50).zIndex(10) + anime({ + targets: Scenes.items.part_1_incomplete_connection.item, + delay: 2000, + complete(){ + Scenes.items.part_1_incomplete_connection.hide() + } + }) + } + } + } + partConnections() + + //! Graph Part + function partCalculation(){ + // for recrod btn + let recordBtnIdx = 0 + Scenes.items.part_1_1_calculations.set(-15,-70,480,983) + Scenes.items.btn_procedure.set(790,132,37).zIndex(10) + Scenes.items.btn_nomenclature.set(610,132,37,160).zIndex(10) + Scenes.items.btn_plot.set(512,129,43,80).zIndex(10) + // * Calling slider + sliders.showSliderFor("1_1") + + // * Graph section + Scenes.items.graph_box_1.set(514,174,null,428).zIndex(10) + let ctx = Scenes.items.graph1.item + let graphIdx = 0 + let xLabel = "Gate to source voltage (VGS)" + let yLabel = "Drain Current (ID)" + let dataLabel = "" + // for setting xy label of graph in position + function setXYLabel(){ + Scenes.items.xLabel.set(633,387) + Scenes.items.yLabel.set(443,277) + } + // ploting empty graph + let graphRef = Scenes.plotGraph(ctx,graphIdx,[],dataLabel,xLabel,yLabel,true,true) + setXYLabel() + + // let table = new Dom(".part_2_table").set(600,-76).item + + let table = new Dom(".part3_table_two").set(513,-76).zIndex(10).item + + // * assume tempTitle10 as a btn record + let btn_record = sliders.btn_record.item + + // * StepTutorial + // show arrow for R + Dom.setBlinkArrowRed(true,254,320,35,null,-90).play() + setCC("Select R") + // and other blink arrow is on sliders.js + + // ! btn_record onclick + recordBtnIdx = 0 + btn_record.onclick = ()=>{ + let rows = table.tBodies[0].rows + if(recordBtnIdx > rows.length){ + return + } + + // * Filling Table + let colIdx = { + 4:1, + 6:2, + 8:3, + 10:4, + 15:5, + } + let first_vGs_value = 4 + let last_vGs_value = 15 + let vGs_value = sliders.slider_vGs.getValue() + let vIn_value = sliders.slider_vIn.getValue() + let R_value = sliders.slider_R.getValue() + + updateValues(vIn_value,vGs_value,R_value) + + // seting column index for filling the table + if(vGs_value == first_vGs_value){ + // vds value + rows[recordBtnIdx+1].cells[0].innerHTML = Formulas.usingMeters.vDS(recordBtnIdx) + } + rows[recordBtnIdx+1].cells[colIdx[vGs_value]].innerHTML = Formulas.usingMeters.iD(values,colIdx[vGs_value],recordBtnIdx) + recordBtnIdx++ + // to plot the data + if(recordBtnIdx == rows.length - 1){ + + + // ! btn Plot onclick + Scenes.items.btn_plot.item.onclick = ()=>{ + // shwo arrwo for vGs + Dom.setBlinkArrowRed(true,0,320,35,null,-90).play() + setCC("Select VGS") + + // goto default position for vIn value and recordBtnIdx = 0 + function resetFun(){ + recordBtnIdx=0 + let defaultLeftPos = 24 + Anime.moveLeft(sliders.slider_vIn.item,defaultLeftPos) + } + // for adding data to graph + function addDataToGraph(){ + let data = [] + for(let row of rows){ + let x = row.cells[0].innerHTML + let y = row.cells[colIdx[vGs_value]].innerHTML + data.push({x,y}) + } + let bgColors = [ + "-", + "#da120f", + "#0607c2", + "#e413e6", + "#25de22", + "#000000" + ] + let bgColor = bgColors[colIdx[vGs_value]] + let labelForDataSet = `Vgs = ${vGs_value}V` + + // add data set + Scenes.graphFeatures.addDataset(graphRef,labelForDataSet,bgColor,data) + } + + if(vGs_value!=last_vGs_value){ + resetFun() + } + let totalDatasets = 5 + if(Scenes.graphFeatures.getSizeOfDatasets(graphRef) < totalDatasets){ + addDataToGraph() + } + + // end the slide + if(vGs_value==last_vGs_value){ + Dom.setBlinkArrowRed(-1) + Dom.setBlinkArrow(true, 790, 544).play(); + setCC("Click 'Next' to go to next step"); + setIsProcessRunning(false); + // for going to the second step + Scenes.currentStep = 2 + } + } + } + } + + } + + + //to show btn popup + Scenes.showPopup("1_1") + + //! onclick start btn + Scenes.items.btn_start_experiment.item.onclick = ()=>{ + // to enable the button + if(partConnectionsIsComplete){ + // * Hide preivous + hideConnectionStepImgs() + // * calculation part + partCalculation() + //to show btn popup + Scenes.showPopup("1_1") + } + } + + return true + }), + + (step3 = function () { + setIsProcessRunning(true); + Scenes.setStepHeading("", "using oscilloscope",true) + Scenes.items.btn_next.show(); + // ! Step Connection + + // required elements + let temp = 16 + let btns = [ + Scenes.items.btn_instructions.set(750 + 75, 10-temp, 40).zIndex(20), + Scenes.items.btn_connections.set(750 + 75, 55-temp, 40).zIndex(20), + Scenes.items.btn_connectons_completed + .set(750 + 75, 100-temp, 50, 120) + .zIndex(20), + Scenes.items.btn_start_experiment + .set(750 + 75, 153-temp, 50, 120) + .zIndex(20), + Scenes.items.btn_reset.set(730, 175-temp, 30).zIndex(20), + ] + + // required images + let images = [ + Scenes.items.part_1_components_2.set(0,0).zIndex(1), + Scenes.items.part_2_conncection_supply_1_red_button.set(144,68,24,22).zIndex(20), + Scenes.items.part_2_conncection_supply_2_red_button.set(140,306,27,23).zIndex(20), + Scenes.items.part_1_2_connections_box, + Scenes.items.compo_left.set(352, 137, 267), + ] + + let cables = [ + Scenes.items.part_1_2_cable_p1.set(0,0).zIndex(10).hide(), + Scenes.items.part_1_2_cable_s.set(0,0).zIndex(11).hide(), + Scenes.items.part_1_2_cable_r1.set(0,0).zIndex(12).hide(), + Scenes.items.part_1_2_cable_p2.set(0,0).zIndex(13).hide(), + Scenes.items.part_1_2_cable_n2.set(0,0).zIndex(14).hide(), + Scenes.items.part_1_2_cable_dvp.set(0,0).zIndex(15).hide(), + Scenes.items.part_1_2_cable_cp.set(0,0).zIndex(16).hide(), + Scenes.items.part_1_2_cable_a1.set(0,0).zIndex(17).hide(), + Scenes.items.part_1_2_cable_v1.set(0,0).zIndex(18).hide(), + Scenes.items.part_1_2_cable_v2.set(0,0).zIndex(19).hide(), + ] + + // ! for increasing the size + let l = 0,t = -70, h = 485, w = 945 + Scenes.items.part_1_components_2.set(l,t,h,w).zIndex(1) + cables.forEach(ele=>{ + ele.set(l,t,h,w).hide() + }) + + let cables_color = [ + "#e40d0d", + "#162848", + "#037c3a", + "#020202", + "#ffe714", + "#555252", + "#9d9d9d", + "#0f1f3b", + "#974f1e", + "#670202", + ] + + function hideConnectionStepImgs(){ + let allImages = [ + ...btns,...images,...cables + ] + allImages.forEach(ele=>{ + ele.hide() + }) + Dom.setBlinkArrowRed(-1) + } + + //! Connection Part + // to enable startExp Button + let partConnectionsIsComplete = false + function partConnections(){ + // Connection Logic + Scenes.items.part_1_2_connections_box.set(442,-78).hide() + + // ! btn_reset onclick + Scenes.items.btn_reset.item.onclick = ()=>{ + let box_buttons_reset = document.querySelectorAll(".part_1_2_connections_box button") + let temps = { + textShadow: "none", + color: "black", + backgroundColor: "transparent" + } + box_buttons_reset.forEach(ele=>{ + let ele_Dom = new Dom(ele) + ele_Dom.styles(temps) + }) + Scenes.steps[4]() + } + + //! connection box onclick + Scenes.items.btn_connections.item.onclick = ()=>{ + Scenes.items.part_1_2_connections_box.show("flex") + // ! connection table arrow move + Dom.setBlinkArrowRed(true,513,-4,35,null,90).play() + setCC("") + } + let box_buttons = document.querySelectorAll(".part_1_2_connections_box button") + + //! connection box onclick + let btnClickedCount = 0 + let connectionBtnArrow = 513 + let arrowLeftGap = 43 + box_buttons.forEach((ele,i)=>{ + ele.onclick = ()=>{ + // increasing count of complete connection + if(ele.style.color!="white"){ + btnClickedCount++ + //! move arrow + connectionBtnArrow += arrowLeftGap + Dom.setBlinkArrowRed(true,connectionBtnArrow,-4,35,null,90).play() + + if(btnClickedCount==10){ + Dom.setBlinkArrowRed(true,778,105-temp,35,null,180).play() + setCC("Click on Connections Completed") + + Scenes.items.btn_connections.item.onclick = ()=>{} + } + } + + cables[i].show() + ele.style.backgroundColor = cables_color[i] + ele.style.color = "white" + ele.style.textShadow = "1px 1px black" + } + }) + + Dom.setBlinkArrowRed(true,778,55-temp,35,null,180).play() + setCC("Click on Connections") + + //! Onclick for check connections + Scenes.items.btn_connectons_completed.item.onclick = ()=>{ + + if(btnClickedCount==10){ + + //! First red button click + Scenes.items.part_1_slide_3_compo_1_text.set(178,96,50).zIndex(20) + Dom.setBlinkArrowRed(true,170,65).play() + setCC("Switch on Main Supply") + Scenes.items.part_2_conncection_supply_1_red_button.item.onclick = ()=>{ + + Scenes.items.part_2_conncection_supply_1_red_button.hide() + Scenes.items.part_1_slide_3_compo_1_text.hide() + //! Second red button click + + Scenes.items.part_1_slide_3_compo_2_text.set(168,338,56).zIndex(20) + Dom.setBlinkArrowRed(true,166,306).play() + setCC("Switch on Gate Supply") + + Scenes.items.part_2_conncection_supply_2_red_button.item.onclick = ()=>{ + Scenes.items.part_2_conncection_supply_2_red_button.hide() + Scenes.items.part_1_slide_3_compo_2_text.hide() + + Dom.setBlinkArrowRed(true,778,165-temp,35,null,180).play() + setCC("Click on Start Experiment") + partConnectionsIsComplete = true + } + } + + } + else{ + Scenes.items.part_1_incomplete_connection.set(660,100,50).zIndex(10) + anime({ + targets: Scenes.items.part_1_incomplete_connection.item, + delay: 2000, + complete(){ + Scenes.items.part_1_incomplete_connection.hide() + } + }) + } + } + } + partConnections() + + //! Graph Part + function partCalculation(){ + // show arrow for R + Dom.setBlinkArrowRed(true,254,310,35,null,-90).play() + setCC("Select R") + + Scenes.items.part_1_2_calculations.set(3,-70,480,963) + Scenes.items.btn_procedure.set(790-10,90,37).zIndex(10) + Scenes.items.btn_nomenclature.set(610-10,90,37,160).zIndex(10) + // Scenes.items.btn_plot.set(512-10,88,43,80).zIndex(10) + + // neddle vGs rotate (-1,multipoint) deg + Scenes.items.niddle_vGs.set(536,29,74).rotate(-1).zIndex(10) + // neddle vIn rotate (-1,126) deg + Scenes.items.niddle_vIn.set(755,29,74).rotate(-1).zIndex(10) + + // * Calling slider + sliders.showSliderFor("1_2") + + // * Graph section + Scenes.items.graph_box_2.set(499,138,270,440).zIndex(10) + let ctx = Scenes.items.graph2.item + let graphIdx = 1 + let xLabel = "Dra to source voltage (VDS)" + let yLabel = "Drain Current (ID)" + let dataLabel = "" + // for setting xy label of graph in position + function setXYLabel(){ + Scenes.items.xLabel.set(615,377) + Scenes.items.yLabel.set(428,257) + } + // ploting empty graph + let graphRef = Scenes.plotGraph(ctx,graphIdx,[],dataLabel,xLabel,yLabel,true,true) + setXYLabel() + + // let table = new Dom(".part_2_table").set(600,-76).item + + let table = null + + // * assume tempTitle10 as a btn record + let btn_record = sliders.btn_record.item + + // ! btn_record onclick + let recordBtnIdx = 0 + // ! calculation value object + let calculationValues = { + vDs: [0,10,20,30,40,50,60], + iD: [ + [],[],[],[],[] + ], + } + btn_record.onclick = ()=>{ + let vGs_value = sliders.slider_vGs.getValue() + let vIn_value = Math.round(sliders.slider_vIn.getValue()) + let R_value = sliders.slider_R.getValue() + let firstValue = 0 + + updateValues(vIn_value,vGs_value,R_value) + + let vGs_idx = { + 4:1, + 6:2, + 8:3, + 10:4, + 15:5, + } + let first_vGs_value = 4 + let last_vGs_value = 15 + + // vIn values + let vIn_accept_range = [0,40,80,120,160,200,240] + let acceptedValueIndex = vIn_accept_range.indexOf(vIn_value) + let datasetIndex = vGs_idx[vGs_value] - 1 // which value perform for vgs + + // for the first value add data set + if(vIn_value == firstValue){ + // add datasets to graph + let bgColors = [ + "_", + "#da120f", + "#0607c2", + "#e413e6", + "#25de22", + "#000000" + ] + let bgColor = bgColors[vGs_idx[vGs_value]] + let labelForDataSet = `Vgs = ${vGs_value}V` + + // add data set + Scenes.graphFeatures.addDataset(graphRef,labelForDataSet,bgColor,[]) + + // * add first value also + let x = Formulas.usingOscilloscope.vDS(acceptedValueIndex) + let y = Formulas.usingOscilloscope.iD(values,vGs_idx[vGs_value],x) + Scenes.graphFeatures.addData(graphRef,datasetIndex,{x,y}) + } + else{ + // adding data to graph + // datasetIndex = vGs_idx[vGs_value] - 1 + + //! add formula value here + let x = Formulas.usingOscilloscope.vDS(acceptedValueIndex) + let y = Formulas.usingOscilloscope.iD(values,vGs_idx[vGs_value],acceptedValueIndex) + let data = {x,y} + console.log("S: ",vGs_value,vGs_idx[vGs_value]) + + Scenes.graphFeatures.addData(graphRef,datasetIndex,data) + } + } + + } + + //to show btn popup + Scenes.showPopup("1_2") + + //! onclick start btn + Scenes.items.btn_start_experiment.item.onclick = ()=>{ + // to enable the button + if(partConnectionsIsComplete){ + // * Hide preivous + hideConnectionStepImgs() + + Scenes.realCurrentStep = 4 + console.log(`RealCurrentStep: ${Scenes.realCurrentStep}`) + + // * calculation part + partCalculation() + + //to show btn popup + Scenes.showPopup("1_2") + } + } + + return true + }), + + // !Experimental result section + //! R LOAD Waveforms section + (step6 = function () { + setIsProcessRunning(true); + // to hide previous step + Dom.hideAll() + Scenes.items.btn_transparent.hide() + //! Required Items + Scenes.items.btn_next.show(); + setCC("") + + //r load click + let arrowIdx = 0; + let arrows = [ + // () => { + // Dom.setBlinkArrowRed(true, 669, 73, 30, null, 180).play(); + // arrowIdx++; + // }, + () => { + Dom.setBlinkArrowRed(true, 518, 177, 30, null, 180).play(); + arrowIdx++; + }, + () => { + Dom.setBlinkArrowRed(true, 518, 177+85, 30, null, 180).play(); + arrowIdx++; + }, + () => { + Dom.setBlinkArrowRed(-1); + }, + ]; + + arrows[arrowIdx](); + // setCC( + // "To View the experimental waveforms select the parameters and proceed further." + // ); + Scenes.items.menu_page.set(25, -10, 435); + // Scenes.items.circle.set(426, 362, 76).hide(); + + let btns = [ + // Scenes.items.btn_input_voltage.set(719, 159 - 92, 47).zIndex(1), + Scenes.items.btn_1.set(558, 166, 52).zIndex(1), + Scenes.items.btn_2.set(558, 166+84, 60).zIndex(1), + ]; + + let vals = [ + // Scenes.items.val_v + // .set(719, 35 + 159 - 92, 47) + // .zIndex(1) + // .hide(), + Scenes.items.val_vin + .set(763, 169, 47) + .zIndex(1) + .hide(), + Scenes.items.val_vgs + .set(767, 255, 47) + .zIndex(1) + .hide(), + ]; + + let optionsClick = [0, 0]; + let btn_see_waveforms = Scenes.items.btn_click + .set(442, 374, 51) + .zIndex(1); + + btns.forEach((btn, idx) => { + btn.item.onclick = () => { + arrows[arrowIdx](); + vals[idx].show(); + optionsClick[idx] = 1; + if (optionsClick.indexOf(0) == -1) { + Scenes.items.circle.set(426, 362, 76); + btn_see_waveforms.item.classList.add("btn-img"); + let scaleBtn = anime({ + targets: Scenes.items.circle.item, + scale: [1, 1.1], + duration: 1000, + easing: "linear", + loop: true, + }); + btn_see_waveforms.item.onclick = () => { + scaleBtn.reset(); + waveformShow(); + }; + } + }; + }); + + let scenes = [ + Scenes.items.frame_1.set(0, 9, 420).hide(), + Scenes.items.frame_2.set(0, 9, 420).hide(), + Scenes.items.frame_3.set(0, 9, 420).hide(), + ]; + + let waveformShow = () => { + vals.forEach((_, idx) => { + btns[idx].hide(); + vals[idx].hide(); + }); + Scenes.items.circle.set(580, 346, 93).hide(); + Scenes.items.btn_click.hide(); + Scenes.items.menu_page.hide(); + + // Dom.setBlinkArrowRed(true, 555, 162, 30, null, 0).play(); + Dom.setBlinkArrowRed(-1); + + scenes[0].show(); + setCC("The purple curves on the DSO screen are the output characteristics plots for different Gate-to-Source voltages."); + setCC(" Here, x-axis is Drain-to-Source voltage while y-axis is Drain current.") + + + setTimeout(() => { + // setCC("Click 'Next' to go to next step"); + Dom.setBlinkArrow(true, 790, 415).play(); + setIsProcessRunning(false); + }, 9000); + }; + + return true; + }), + //! R LOAD CLICK 2 + (step7 = function () { + setIsProcessRunning(true); + + //! Required Items + Scenes.items.btn_next.show(); + // to hide previous step + Scenes.items.frame_2.set(0, 9, 420); + Dom.setBlinkArrowRed(true, 532, 280, 30, null, 0).play(); + + setCC( + "Mosfet starts conducting at threshold Gate-to-Source voltage value of 3.5 V. Below this value, it is in cutoff region." + ); + + setTimeout(() => { + // setCC("Click 'Next' to go to next step"); + Dom.setBlinkArrow(true, 790, 415).play(); + setIsProcessRunning(false); + }, 7000); + + //! Required Items + + return true; + }), + //! R LOAD CLICK 3 + (step8 = function () { + setIsProcessRunning(true); + + //! Required Items + Scenes.items.btn_next.show(); + // Scenes.items.slider_box.hide(); + + // to hide previous step + Scenes.items.frame_3.set(0, 9, 420); + // Dom.setBlinkArrowRed(true, 555, 317, 30, null, 0).play(); + // Dom.setBlinkArrowRed(-1) + + setCC( + "There are three distinct regions: Cutoff, Linear and Saturation region." + ); + + setTimeout(() => { + // setCC("Click 'Next' to go to next step"); + // Dom.setBlinkArrow(true, 790, 415).play(); + setCC("MOSFET Done ✅"); + setIsProcessRunning(false); + nextBtn.addEventListener("click", () => { + Scenes.mergeProcessHelper() + }); + }, 6000); + + //! Required Items + + return true; + }), + + ], + // ! For adding realcurrentstep in every step + // ! For tracking the current step accuratly + realCurrentStep: null, + setRealCurrentStep(){ + let count = 0 + this.steps.forEach((step,idx) => { + const constCount = count + let newStep = () => { + this.realCurrentStep = constCount; + console.log(`RealCurrentStep: ${this.realCurrentStep}`) + return step(); + }; + + count++; + let ignoreStepsForAdding = [4] + if(ignoreStepsForAdding.indexOf(idx) != -1) return + + this.steps[idx] = newStep + }); + }, + back() { + //! animation isRunning + // if (isRunning) { + // return; + // } + if (this.currentStep > 1) { + Scenes.items.btn_next.setContent("Next"); + Scenes.items.btn_next.item.onclick = () => {}; + this.currentStep -= 2; + this.steps[this.currentStep](); + this.currentStep++; + backDrawerItem(); + backProgressBar(); + } + }, + next() { + if(!this.realCurrentStep){ + Scenes.setRealCurrentStep() + } + //! animation isRunning + if (isRunning) { + return; + } + if (this.currentStep < this.steps.length) { + if (this.steps[this.currentStep]()) { + nextDrawerItem(); + nextProgressBar(); + this.currentStep++; + } + } else { + } + }, + // ! For Merge Process Helper + mergeProcessHelper(goto="menu",done=true){ + let StepDone = JSON.parse(localStorage.getItem("StepDone")) + StepDone.MOSFET = done + StepDone.goto = goto + localStorage.setItem("StepDone",JSON.stringify(StepDone)) + } +}; + +// * slider +// var rangeSlider = function () { +// var slider = $(".range-slider"), +// range = $(".range-slider__range"), +// value = $(".range-slider__value"); + +// slider.each(function () { +// value.each(function () { +// var value = $(this).prev().attr("value"); +// $(this).html(value); +// }); + +// range.on("input", function () { +// $(this).next(value).html(this.value); +// $(this).next(value).val(this.value); +// }); +// }); +// }; +// $(".resistance-input").on("keyup", () => { +// let slider = $(".slider_R .range-slider__range"); +// let input = document.querySelector(".resistance-input"); + +// let min = 1; +// let max = Number(slider.attr("max")); +// // if (input.value < min) { +// // input.value = min; +// // } +// if (input.value > max) { +// input.value = max; +// } +// slider.val(input.value); +// }); +// rangeSlider(); + +// stepcalling +Scenes.currentStep = 4 + +Scenes.next() +// Scenes.steps[3]() +// Scenes.next() +// Scenes.next() + +const nextBtn = get(".btn-next"); + +const backBtn = get(".btn-back"); +nextBtn.addEventListener("click", () => { + Scenes.next(); +}); +backBtn.addEventListener("click", () => { + Scenes.back(); +}); + +// print certificate +get(".btn-save").addEventListener("click", () => { + window.print(); +}); + +let muteBtn = get(".btn-mute"); +muteBtn.addEventListener("click", () => { + if (isMute) { + isMute = false; + muteBtn.src = "./src/images/template_imgs/speech_off_btn.png"; + muteBtn.title = "Click to Mute"; + } else { + isMute = true; + muteBtn.src = "./src/images/template_imgs/speech_on_btn.png"; + muteBtn.title = "Click to Unmute"; + } +}); + +// ! Anime Header Hover Buttons +function btnPopupBox() { + let popupBtns = document.querySelectorAll(".btn-popup"); + let popupWindow = document.querySelector(".btn-popup-window"); + + popupBtns[0].onmouseover = () => { + popupWindow.src = Scenes.items.formulas_procedure.item.src; + }; + popupBtns[1].onmouseover = () => { + popupWindow.src = Scenes.items.formulas_nomenclautre.item.src; + }; + popupBtns[2].onmouseover = () => { + switch (Scenes.forMathematicalExpressionBtn) { + case 1: + popupWindow.src = Scenes.items.formulas_ideal.item.src; + break; + + case 2: + popupWindow.src = Scenes.items.formulas_non_ideal.item.src; + break; + + case 3: + popupWindow.src = Scenes.items.formulas_efficiency.item.src; + break; + + case 4: + popupWindow.src = Scenes.items.formulas_component_stress.item.src; + break; + + default: + popupWindow.src = Scenes.items.formulas_universal.item.src; + break; + } + }; +} +// btnPopupBox(); + +// i really enjoyed the voice of keybord +// its amazing + +// mouse position +// function getCursor(event) { +// let x = event.clientX; +// let y = event.clientY; +// let _position = `X: ${x - 419}
    Y: ${y - 169}`; + +// const infoElement = document.getElementById("info"); +// infoElement.innerHTML = _position; +// infoElement.style.top = y + "px"; +// infoElement.style.left = x + 20 + "px"; +// } + diff --git a/experiment/simulation/EE4/js/progressBar.js b/experiment/simulation/EE4/js/progressBar.js new file mode 100644 index 0000000..3bd0277 --- /dev/null +++ b/experiment/simulation/EE4/js/progressBar.js @@ -0,0 +1,39 @@ +// * progress bar +const prevBtns = document.querySelector(".btn-prev"); +const nextBtns = document.querySelector(".btn-next"); +const progress = document.getElementById("progress"); +const progressSteps = document.querySelectorAll(".progress-step"); + + +let currProgressStep = -1; +// total steps from the number of drawer items +let totalProgressSteps = document.querySelectorAll(".step").length; + +const nextProgressBar = () => { + if(currProgressStep < totalProgressSteps - 1){ + currProgressStep++; + updateProgressbar(); + } +}; + +const backProgressBar = () => { + if(currProgressStep > 0){ + currProgressStep--; + updateProgressbar(); + } +}; + +function updateProgressbar() { + progressSteps.forEach((progressStep, idx) => { + if (idx < currProgressStep + 1) { + progressStep.classList.add("progress-step-active"); + } else { + progressStep.classList.remove("progress-step-active"); + } + }); + + const progressActive = document.querySelectorAll(".progress-step-active"); + + progress.style.width = + ((progressActive.length - 1) / (progressSteps.length - 1)) * 100 + "%"; +} diff --git a/experiment/simulation/EE4/js/sliders.js b/experiment/simulation/EE4/js/sliders.js new file mode 100644 index 0000000..1c2fff1 --- /dev/null +++ b/experiment/simulation/EE4/js/sliders.js @@ -0,0 +1,389 @@ +const sliders = { + slider_vIn: new Dom(".slider_vIn"), + slider_vGs: new Dom(".slider_vGs"), + slider_R: new Dom(".slider_R"), + + slider_vIn_label: new Dom(".temp-title5"), + slider_vGs_label: new Dom(".temp-title6"), + slider_R_label: new Dom(".temp-title7"), + + //! we using temptitle10 as a record btn + // show we can update the table according to the button click + btn_record: new Dom(".temp-title10"), + + + init(){ + this.updateLabels() + let styles = { + fontSize: "small", + padding: "0 5px", + textAlign: "center", + width: "fit-content", + color: "black", + border: "2px solid black", + backgroundColor: "white", + } + this.slider_vIn_label.styles(styles) + this.slider_vGs_label.styles(styles) + this.slider_R_label.styles(styles) + }, + + // part: 1_1, 1_2, 2 + showSliderFor(part){ + switch(part){ + case "1_1": + var temp2 = -10 + var temp1 = -62 + this.slider_vIn.set(34+temp2,33+temp1,23).zIndex(10) + this.slider_vIn_label.set(185+temp2,65+temp1) + + this.slider_vGs.set(10,369,23).zIndex(10) + this.slider_vGs_label.set(168,325) + + this.slider_R.set(266,365,23).zIndex(10) + this.slider_R_label.set(446,360) + + + // ! vGs onclick + var differences_vGs = [65, 89, 113, 138, 187]; + var vals_vGs = [4,6,8,10,15] + var currentDifferenceIndex_vGs = 0; + // for the slider vgs + var value_vGs = 0 + this.slider_vGs.item.onclick = ( )=>{ + if (currentDifferenceIndex_vGs < differences_vGs.length) { + // Get the current difference + var currentDifference = differences_vGs[currentDifferenceIndex_vGs]; + + // setting the value of label + value_vGs = vals_vGs[currentDifferenceIndex_vGs] + + // Animate the translation on each click + this.sliderAnime(this.slider_vGs,null,value_vGs,currentDifference) + currentDifferenceIndex_vGs++; + + // !we using temptitle10 as a record btn + // this.btn_record.item.click() + + // * show arrow for vIn + Dom.setBlinkArrowRed(true,13,-72,35,null,-90).play() + setCC("Select Vin") + } + } + + // ! vIn onclick + var defaultLeftPos = 24 + var differences_vIn = [53,76,101,126,152,175]; + var vals_vIn = [40,80,120,160,200,240] + var currentDifferenceIndex_vIn = 0; + // for slider vIn + this.slider_vIn.item.onclick = ()=>{ + if (currentDifferenceIndex_vIn < differences_vIn.length) { + // Get the current difference + var currentDifference = differences_vIn[currentDifferenceIndex_vIn]; + + // setting the value of label + var value = vals_vIn[currentDifferenceIndex_vIn] + + // Animate the translation on each click + this.sliderAnime(this.slider_vIn,null,value,currentDifference) + currentDifferenceIndex_vIn++; + + // !we using temptitle10 as a record btn + this.btn_record.item.click() + + // * show arrow for vIn + Dom.setBlinkArrowRed(true,13,-72,35,null,-90).play() + setCC("Select Vin") + + if(currentDifferenceIndex_vIn == differences_vIn.length){ + // * show arrow for plot + Dom.setBlinkArrowRed(true,529,87,35,null,-90).play() + setCC("Click on 'Plot'") + } + }else{ + // reset this value because of behaviour of slide + currentDifferenceIndex_vIn = 0 + } + } + + // ! R onclick + this.slider_R.item.onclick = ()=>{ + let value_R = 50 + var left = 317 + this.sliderAnime(this.slider_R,0,value_R,left) + + // * show arrow for vGs + Dom.setBlinkArrowRed(true,0,320,35,null,-90).play() + setCC("Select VGS") + + } + break + + case "1_2": + var temp2 = -23 + var temp1 = -80 + this.slider_vIn.set(34+temp2,33+temp1,23).zIndex(10) + this.slider_vIn_label.set(210,-53) + + this.slider_vGs.set(10,374,23).zIndex(10) + this.slider_vGs_label.set(161,329) + + this.slider_R.set(255,357,23).zIndex(10) + this.slider_R_label.set(434,352) + + + // ! vGs onclick + var differences_vGs = [63, 86, 110, 133, 180]; + var vals_vGs = [4,6,8,10,15] + var niddle_vGs_deg = [40, 61, 82.5, 104,125] + var currentDifferenceIndex_vGs = 0; + // for the slider vgs + var value_vGs = 0 + this.slider_vGs.item.onclick = ( )=>{ + Dom.setBlinkArrowRed(-1) + if (currentDifferenceIndex_vGs < differences_vGs.length) { + // Get the current difference + var currentDifference = differences_vGs[currentDifferenceIndex_vGs]; + + // setting the value of label + value_vGs = vals_vGs[currentDifferenceIndex_vGs] + + // Animate the translation on each click + this.sliderAnime(this.slider_vGs,null,value_vGs,currentDifference) + + // ! we using temptitle10 as a record btn + // this.btn_record.item.click() + // * rotate neddle + anime({ + targets: Scenes.items.niddle_vGs.item, + easing: "linear", + duration: 1000, + rotate: niddle_vGs_deg[currentDifferenceIndex_vGs], + complete(){ + // * show arrow for vIn + Dom.setBlinkArrowRed(true,13,-89,35,null,-90).play() + setCC("Select Vin") + } + }) + + currentDifferenceIndex_vGs++; + + } + } + + // ! vIn onclick + // neddle vIn rotate (-1,126) deg + var defaultRotatePos = -1 + // slider (11, 160) + var defaultLeftPos = 11 + // for slider vIn + var leftPixel = 160 + // 11, 160 + // label value 0 to 240 + let currentLabelValue = 0 + // vIn values + let vIn_accept_range = [0,40,80,120,160,200,240] + // onclick accept range for vgs + let vGs_accept_range = vals_vGs + this.slider_vIn.item.onclick = ()=>{ + Dom.setBlinkArrowRed(-1) + // vIn + if(currentDifferenceIndex_vGs > differences_vGs.length){ + return + } + // rotate slider with neddle + anime.timeline({ + easing: "linear", + duration: 8000, + }) + .add({ + targets: this.slider_vIn.item, + left: [defaultLeftPos, leftPixel,leftPixel, defaultLeftPos], + value: [0,240,240, 0], + update: ()=>{ + let labelValue = this.slider_vIn.getValue() + labelValue = Math.round(labelValue) + this.slider_vIn_label.setContent( + `${labelValue}
    volts` + ) + + // ! click the recrod btn + let acceptedValueIndex = vIn_accept_range.indexOf(labelValue) + if(acceptedValueIndex!=-1){ + this.btn_record.item.click() + // for disabling for old value + vIn_accept_range[acceptedValueIndex] = -1 + return + } + }, + complete:()=>{ + if(currentDifferenceIndex_vGs < differences_vGs.length){ + vIn_accept_range = [0,40,80,120,160,200,240] + + // * show arrow for vGs + Dom.setBlinkArrowRed(true,0,328,35,null,-90).play() + setCC("Select VGS") + } + else{ + currentDifferenceIndex_vGs++ + Dom.setBlinkArrowRed(-1) + + // setCC("MOSFET Done ✅"); + // setIsProcessRunning(false); + + setCC("Click 'Next' to go to next step"); + setIsProcessRunning(false); + + // ! Merge Helper + // nextBtn.addEventListener("click", () => { + // Scenes.mergeProcessHelper() + // }); + // // for going to the second step + // Scenes.currentStep = 2 + } + } + },0) + .add({ + targets: Scenes.items.niddle_vIn.item, + rotate: [-1,126,126, -1] + },0) + } + + // ! R onclick + this.slider_R.item.onclick = ()=>{ + let value_R = 50 + var left = 304 + this.sliderAnime(this.slider_R,0,value_R,left) + + // * show arrow for vGs + Dom.setBlinkArrowRed(true,0,328,35,null,-90).play() + setCC("Select VGS") + } + break + + case "2": + this.slider_vIn.set(34,-44,23).zIndex(10) + this.slider_vIn_label.set(185,-10) + + this.slider_vGs.set(4,364-18,23).zIndex(10) + this.slider_vGs_label.set(242,364-18) + + this.slider_R.set(329,362-18,23).zIndex(10) + this.slider_R_label.set(502,364-18) + + + // ! vGs onclick + var differences = [4,20,73,127,179,222]; + var vals_vGs = [0,2,4,6,8,10] + var currentDifferenceIndex = 0; + // for the slider vgs + var value_vGs = 0 + this.slider_vGs.item.onclick = ( )=>{ + if (currentDifferenceIndex < differences.length) { + // Get the current difference + var currentDifference = differences[currentDifferenceIndex]; + // vals + value_vGs = vals_vGs[currentDifferenceIndex] + + // Animate the translation on each click + this.sliderAnime(this.slider_vGs,null,value_vGs, currentDifference) + + if(currentDifferenceIndex==0){ + // * show arrow for vIn + Dom.setBlinkArrowRed(true,22,-90,35,null,-90).play() + setCC("Select Vin") + } + else if(currentDifferenceIndex == differences.length - 1){ + // * show arrow for plot + Dom.setBlinkArrowRed(true,802,30,35,null,-90).play() + setCC("Click on 'Plot'") + } + else{ + // * show arrow for vGs + Dom.setBlinkArrowRed(true,0,302,35,null,-90).play() + setCC("Select VGS") + } + + currentDifferenceIndex++; + + // !we using temptitle10 as a record btn + this.btn_record.item.click() + } + } + + // ! vIn onclick + this.slider_vIn.item.onclick = ()=>{ + let value_vIn = 200 + this.sliderAnime(this.slider_vIn,0,value_vIn,159) + + // * show arrow for vGs + Dom.setBlinkArrowRed(true,0,302,35,null,-90).play() + setCC("Select VGS") + } + + // ! R onclick + this.slider_R.item.onclick = ()=>{ + let value_R = 50 + this.sliderAnime(this.slider_R,0,value_R,376) + + // * show arrow for vGs + Dom.setBlinkArrowRed(true,0,302,35,null,-90).play() + setCC("Select VGS") + } + break + } + }, + sliderAnime(target,translateX,value,left="",complete=null){ + anime({ + targets: target.item, + translateX: `+=${translateX}`, + left: left, + easing: 'easeInOutQuad', + duration: 600, + complete: ()=> { + this.updateLabels() + if(complete!=null){ + complete() + } + } + }); + // set value of slider + target.item.attributes['value'].value = value + }, + updateLabels(){ + this.slider_vIn_label.setContent( + `${this.getVal(this.slider_vIn)}
    volts` + ) + this.slider_vGs_label.setContent( + `${this.getVal(this.slider_vGs)}
    volts` + ) + this.slider_R_label.setContent( + `${this.getVal(this.slider_R)}
    ohms` + ) + }, + labelAnime(target,value){ + // let currentValue = Number(target.item.innerHTML.slice(0,target.item.innerHTML.indexOf("<"))) + + // anime({ + // targets: target.item, + // duration: 600, + // easing: "linear", + // innerHTML: [currentValue,] + // }) + }, + getVal(dom){ + return dom.item.attributes['value'].value + }, + showSlider(part){ + setTimeout(() => { + sliders.init() + // Change this for your step + sliders.showSliderFor(part) + }, 1000); + } +} + +sliders.init() + + diff --git a/experiment/simulation/EE4/js/src.js b/experiment/simulation/EE4/js/src.js new file mode 100644 index 0000000..ba23c05 --- /dev/null +++ b/experiment/simulation/EE4/js/src.js @@ -0,0 +1,189 @@ +const src = { + // pick imgs from the dom + + allImgs: [], + allImgsDom: document.querySelectorAll(".main-window-imgs"), + allVideosDom: document.querySelectorAll(".main-window-videos"), + + // ! new added + allQsDom: document.querySelectorAll(".qs"), + + set() { + let index = 0 + this.allItems = { + + // * Tempalte Buttons + arrowRound: this.allImgsDom[index++], + blinkArrow: this.allImgsDom[index++], + laerrow: this.allImgsDom[index++], + laerrow2: this.allImgsDom[index++], + logo: this.allImgsDom[index++], + man: this.allImgsDom[index++], + measurearrow: this.allImgsDom[index++], + measurearrow2: this.allImgsDom[index++], + redsize: this.allImgsDom[index++], + speech_off_btn: this.allImgsDom[index++], + speech_on_btn: this.allImgsDom[index++], + talk_cloud: this.allImgsDom[index++], + iit_delhi_logo: this.allImgsDom[index++], + // * --xx Tempalte Buttons Ended xx-- + + + // !EE 4 images added + btn_connections:this.allImgsDom[index++], + btn_connectons_completed:this.allImgsDom[index++], + btn_instructions:this.allImgsDom[index++], + btn_nomenclature:this.allImgsDom[index++], + btn_plot:this.allImgsDom[index++], + btn_procedure:this.allImgsDom[index++], + btn_reset:this.allImgsDom[index++], + btn_start_experiment:this.allImgsDom[index++], + method_1_cable_black_bottom:this.allImgsDom[index++], + method_1_cable_black_top:this.allImgsDom[index++], + method_1_cable_blue:this.allImgsDom[index++], + method_1_cable_green:this.allImgsDom[index++], + method_1_cable_pink:this.allImgsDom[index++], + method_1_cable_purple:this.allImgsDom[index++], + method_1_cable_red:this.allImgsDom[index++], + method_1_cable_yellow:this.allImgsDom[index++], + method_2_cable_green:this.allImgsDom[index++], + method_2_cable_red:this.allImgsDom[index++], + method_2_cable_yellow:this.allImgsDom[index++], + part_1_instructions_box:this.allImgsDom[index++], + part_1_procedure_box:this.allImgsDom[index++], + part_1_select_option_1_1:this.allImgsDom[index++], + part_1_select_option_1_2:this.allImgsDom[index++], + part_1_select_option_2:this.allImgsDom[index++], + part_1_select_option_3:this.allImgsDom[index++], + part_1_select_option_full:this.allImgsDom[index++], + part_1_slide_1:this.allImgsDom[index++], + part_1_slide_2:this.allImgsDom[index++], + part_1_slide_3:this.allImgsDom[index++], + part_1_slide_3_compo_1_off:this.allImgsDom[index++], + part_1_slide_3_compo_1_on:this.allImgsDom[index++], + part_1_slide_3_compo_1_text:this.allImgsDom[index++], + part_1_slide_3_compo_2_off:this.allImgsDom[index++], + part_1_slide_3_compo_2_on:this.allImgsDom[index++], + part_1_slide_3_compo_2_text:this.allImgsDom[index++], + part_1_procedure_box_2:this.allImgsDom[index++], + part_1_slide_4:this.allImgsDom[index++], + part_1_incomplete_connection:this.allImgsDom[index++], + + // part2 + part_2_conncection_cable_a2:this.allImgsDom[index++], + part_2_conncection_cable_n2:this.allImgsDom[index++], + part_2_conncection_cable_p1:this.allImgsDom[index++], + part_2_conncection_cable_p2:this.allImgsDom[index++], + part_2_conncection_cable_r2:this.allImgsDom[index++], + part_2_conncection_cable_s:this.allImgsDom[index++], + part_2_conncection_cable_v1:this.allImgsDom[index++], + part_2_conncection_cable_v2:this.allImgsDom[index++], + part_2_conncection_cable_vg1:this.allImgsDom[index++], + part_2_conncection_cable_vg2:this.allImgsDom[index++], + part_2_conncection_supply_1_red_button:this.allImgsDom[index++], + part_2_conncection_supply_2_red_button:this.allImgsDom[index++], + part_2_connections_components:this.allImgsDom[index++], + + //* new images added + + + part_1_1_cable_a2:this.allImgsDom[index++], + part_1_1_cable_n2:this.allImgsDom[index++], + part_1_1_cable_p1:this.allImgsDom[index++], + part_1_1_cable_p2:this.allImgsDom[index++], + part_1_1_cable_r2:this.allImgsDom[index++], + part_1_1_cable_s:this.allImgsDom[index++], + part_1_1_cable_v1:this.allImgsDom[index++], + part_1_1_cable_v2:this.allImgsDom[index++], + part_1_2_cable_a1:this.allImgsDom[index++], + part_1_2_cable_cp:this.allImgsDom[index++], + part_1_2_cable_dvp:this.allImgsDom[index++], + part_1_2_cable_n2:this.allImgsDom[index++], + part_1_2_cable_p1:this.allImgsDom[index++], + part_1_2_cable_p2:this.allImgsDom[index++], + part_1_2_cable_r1:this.allImgsDom[index++], + part_1_2_cable_s:this.allImgsDom[index++], + part_1_2_cable_v1:this.allImgsDom[index++], + part_1_2_cable_v2:this.allImgsDom[index++], + part_1_components_1:this.allImgsDom[index++], + part_1_components_2:this.allImgsDom[index++], + + // part2 calculation + part_2_calculation_components:this.allImgsDom[index++], + + + part_1_1_calculations:this.allImgsDom[index++], + part_1_2_calculations:this.allImgsDom[index++], + + + //part3 images added + part_3_components:this.allImgsDom[index++], + part_3_graph:this.allImgsDom[index++], + part_3_off_button:this.allImgsDom[index++], + part_3_table_1:this.allImgsDom[index++], + part_3_table_2:this.allImgsDom[index++], + part_3_table_3:this.allImgsDom[index++], + part_3_text:this.allImgsDom[index++], + + slider_vGs: this.allImgsDom[index++], + slider_vIn: this.allImgsDom[index++], + slider_R: this.allImgsDom[index++], + + + niddle_vGs: this.allImgsDom[index++], + niddle_vIn: this.allImgsDom[index++], + + + // * for PROCEDURE and instruction NOMENCLATURE + + part_1_1_instruction:this.allImgsDom[index++], + part_1_1_nomenclature:this.allImgsDom[index++], + part_1_1_procedure:this.allImgsDom[index++], + part_1_2_instruction:this.allImgsDom[index++], + part_1_2_nomenclature:this.allImgsDom[index++], + part_1_2_procedure:this.allImgsDom[index++], + part_2_instruction:this.allImgsDom[index++], + part_2_nomenclature:this.allImgsDom[index++], + part_2_procedure:this.allImgsDom[index++], + part_3_nomenclature:this.allImgsDom[index++], + part_3_procedure:this.allImgsDom[index++], + compo_left:this.allImgsDom[index++], + + // Experimental section images added here + + btn_1: this.allImgsDom[index++], + btn_2: this.allImgsDom[index++], + btn_click: this.allImgsDom[index++], + circle: this.allImgsDom[index++], + frame_1: this.allImgsDom[index++], + frame_2: this.allImgsDom[index++], + frame_3: this.allImgsDom[index++], + menu_page: this.allImgsDom[index++], + val_vgs: this.allImgsDom[index++], + val_vin: this.allImgsDom[index++], + + // * Question Mark + domQs1: this.allQsDom[0], + domQs2: this.allQsDom[1], + domQs3: this.allQsDom[2], + domQs4: this.allQsDom[3], + domQs5: this.allQsDom[4], + domQs6: this.allQsDom[5], + + + // * Videos + // yoke_front_to_back: this.allVideosDom[0], + // yoke_front_to_side: this.allVideosDom[1], + // panel1: this.allVideosDom[2], + // panel2: this.allVideosDom[3], + + bfs_video: this.allVideosDom[0], + }; + }, + allImgsInitialAxis: [], + get(itemName) { + return this.allItems[itemName]; + }, +}; +// setting src +src.set(); diff --git a/experiment/simulation/EE4/js/typed.js b/experiment/simulation/EE4/js/typed.js new file mode 100644 index 0000000..faaac4d --- /dev/null +++ b/experiment/simulation/EE4/js/typed.js @@ -0,0 +1,1045 @@ +/*! + * + * typed.js - A JavaScript Typing Animation Library + * Author: Matt Boldt + * Version: v2.0.9 + * Url: https://github.com/mattboldt/typed.js + * License(s): MIT + * + */ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["Typed"] = factory(); + else + root["Typed"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + var _initializerJs = __webpack_require__(1); + + var _htmlParserJs = __webpack_require__(3); + + /** + * Welcome to Typed.js! + * @param {string} elementId HTML element ID _OR_ HTML element + * @param {object} options options object + * @returns {object} a new Typed object + */ + + var Typed = (function () { + function Typed(elementId, options) { + _classCallCheck(this, Typed); + + // Initialize it up + _initializerJs.initializer.load(this, options, elementId); + // All systems go! + this.begin(); + } + + /** + * Toggle start() and stop() of the Typed instance + * @public + */ + + _createClass(Typed, [{ + key: 'toggle', + value: function toggle() { + this.pause.status ? this.start() : this.stop(); + } + + /** + * Stop typing / backspacing and enable cursor blinking + * @public + */ + }, { + key: 'stop', + value: function stop() { + if (this.typingComplete) return; + if (this.pause.status) return; + this.toggleBlinking(true); + this.pause.status = true; + this.options.onStop(this.arrayPos, this); + } + + /** + * Start typing / backspacing after being stopped + * @public + */ + }, { + key: 'start', + value: function start() { + if (this.typingComplete) return; + if (!this.pause.status) return; + this.pause.status = false; + if (this.pause.typewrite) { + this.typewrite(this.pause.curString, this.pause.curStrPos); + } else { + this.backspace(this.pause.curString, this.pause.curStrPos); + } + this.options.onStart(this.arrayPos, this); + } + + /** + * Destroy this instance of Typed + * @public + */ + }, { + key: 'destroy', + value: function destroy() { + this.reset(false); + this.options.onDestroy(this); + } + + /** + * Reset Typed and optionally restarts + * @param {boolean} restart + * @public + */ + }, { + key: 'reset', + value: function reset() { + var restart = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0]; + + clearInterval(this.timeout); + this.replaceText(''); + if (this.cursor && this.cursor.parentNode) { + this.cursor.parentNode.removeChild(this.cursor); + this.cursor = null; + } + this.strPos = 0; + this.arrayPos = 0; + this.curLoop = 0; + if (restart) { + this.insertCursor(); + this.options.onReset(this); + this.begin(); + } + } + + /** + * Begins the typing animation + * @private + */ + }, { + key: 'begin', + value: function begin() { + var _this = this; + + this.typingComplete = false; + this.shuffleStringsIfNeeded(this); + this.insertCursor(); + if (this.bindInputFocusEvents) this.bindFocusEvents(); + this.timeout = setTimeout(function () { + // Check if there is some text in the element, if yes start by backspacing the default message + if (!_this.currentElContent || _this.currentElContent.length === 0) { + _this.typewrite(_this.strings[_this.sequence[_this.arrayPos]], _this.strPos); + } else { + // Start typing + _this.backspace(_this.currentElContent, _this.currentElContent.length); + } + }, this.startDelay); + } + + /** + * Called for each character typed + * @param {string} curString the current string in the strings array + * @param {number} curStrPos the current position in the curString + * @private + */ + }, { + key: 'typewrite', + value: function typewrite(curString, curStrPos) { + var _this2 = this; + + if (this.fadeOut && this.el.classList.contains(this.fadeOutClass)) { + this.el.classList.remove(this.fadeOutClass); + if (this.cursor) this.cursor.classList.remove(this.fadeOutClass); + } + + var humanize = this.humanizer(this.typeSpeed); + var numChars = 1; + + if (this.pause.status === true) { + this.setPauseStatus(curString, curStrPos, true); + return; + } + + // contain typing function in a timeout humanize'd delay + this.timeout = setTimeout(function () { + // skip over any HTML chars + curStrPos = _htmlParserJs.htmlParser.typeHtmlChars(curString, curStrPos, _this2); + + var pauseTime = 0; + var substr = curString.substr(curStrPos); + // check for an escape character before a pause value + // format: \^\d+ .. eg: ^1000 .. should be able to print the ^ too using ^^ + // single ^ are removed from string + if (substr.charAt(0) === '^') { + if (/^\^\d+/.test(substr)) { + var skip = 1; // skip at least 1 + substr = /\d+/.exec(substr)[0]; + skip += substr.length; + pauseTime = parseInt(substr); + _this2.temporaryPause = true; + _this2.options.onTypingPaused(_this2.arrayPos, _this2); + // strip out the escape character and pause value so they're not printed + curString = curString.substring(0, curStrPos) + curString.substring(curStrPos + skip); + _this2.toggleBlinking(true); + } + } + + // check for skip characters formatted as + // "this is a `string to print NOW` ..." + if (substr.charAt(0) === '`') { + while (curString.substr(curStrPos + numChars).charAt(0) !== '`') { + numChars++; + if (curStrPos + numChars > curString.length) break; + } + // strip out the escape characters and append all the string in between + var stringBeforeSkip = curString.substring(0, curStrPos); + var stringSkipped = curString.substring(stringBeforeSkip.length + 1, curStrPos + numChars); + var stringAfterSkip = curString.substring(curStrPos + numChars + 1); + curString = stringBeforeSkip + stringSkipped + stringAfterSkip; + numChars--; + } + + // timeout for any pause after a character + _this2.timeout = setTimeout(function () { + // Accounts for blinking while paused + _this2.toggleBlinking(false); + + // We're done with this sentence! + if (curStrPos >= curString.length) { + _this2.doneTyping(curString, curStrPos); + } else { + _this2.keepTyping(curString, curStrPos, numChars); + } + // end of character pause + if (_this2.temporaryPause) { + _this2.temporaryPause = false; + _this2.options.onTypingResumed(_this2.arrayPos, _this2); + } + }, pauseTime); + + // humanized value for typing + }, humanize); + } + + /** + * Continue to the next string & begin typing + * @param {string} curString the current string in the strings array + * @param {number} curStrPos the current position in the curString + * @private + */ + }, { + key: 'keepTyping', + value: function keepTyping(curString, curStrPos, numChars) { + // call before functions if applicable + if (curStrPos === 0) { + this.toggleBlinking(false); + this.options.preStringTyped(this.arrayPos, this); + } + // start typing each new char into existing string + // curString: arg, this.el.html: original text inside element + curStrPos += numChars; + var nextString = curString.substr(0, curStrPos); + this.replaceText(nextString); + // loop the function + this.typewrite(curString, curStrPos); + } + + /** + * We're done typing all strings + * @param {string} curString the current string in the strings array + * @param {number} curStrPos the current position in the curString + * @private + */ + }, { + key: 'doneTyping', + value: function doneTyping(curString, curStrPos) { + var _this3 = this; + + // fires callback function + this.options.onStringTyped(this.arrayPos, this); + this.toggleBlinking(true); + // is this the final string + if (this.arrayPos === this.strings.length - 1) { + // callback that occurs on the last typed string + this.complete(); + // quit if we wont loop back + if (this.loop === false || this.curLoop === this.loopCount) { + return; + } + } + this.timeout = setTimeout(function () { + _this3.backspace(curString, curStrPos); + }, this.backDelay); + } + + /** + * Backspaces 1 character at a time + * @param {string} curString the current string in the strings array + * @param {number} curStrPos the current position in the curString + * @private + */ + }, { + key: 'backspace', + value: function backspace(curString, curStrPos) { + var _this4 = this; + + if (this.pause.status === true) { + this.setPauseStatus(curString, curStrPos, true); + return; + } + if (this.fadeOut) return this.initFadeOut(); + + this.toggleBlinking(false); + var humanize = this.humanizer(this.backSpeed); + + this.timeout = setTimeout(function () { + curStrPos = _htmlParserJs.htmlParser.backSpaceHtmlChars(curString, curStrPos, _this4); + // replace text with base text + typed characters + var curStringAtPosition = curString.substr(0, curStrPos); + _this4.replaceText(curStringAtPosition); + + // if smartBack is enabled + if (_this4.smartBackspace) { + // the remaining part of the current string is equal of the same part of the new string + var nextString = _this4.strings[_this4.arrayPos + 1]; + if (nextString && curStringAtPosition === nextString.substr(0, curStrPos)) { + _this4.stopNum = curStrPos; + } else { + _this4.stopNum = 0; + } + } + + // if the number (id of character in current string) is + // less than the stop number, keep going + if (curStrPos > _this4.stopNum) { + // subtract characters one by one + curStrPos--; + // loop the function + _this4.backspace(curString, curStrPos); + } else if (curStrPos <= _this4.stopNum) { + // if the stop number has been reached, increase + // array position to next string + _this4.arrayPos++; + // When looping, begin at the beginning after backspace complete + if (_this4.arrayPos === _this4.strings.length) { + _this4.arrayPos = 0; + _this4.options.onLastStringBackspaced(); + _this4.shuffleStringsIfNeeded(); + _this4.begin(); + } else { + _this4.typewrite(_this4.strings[_this4.sequence[_this4.arrayPos]], curStrPos); + } + } + // humanized value for typing + }, humanize); + } + + /** + * Full animation is complete + * @private + */ + }, { + key: 'complete', + value: function complete() { + this.options.onComplete(this); + if (this.loop) { + this.curLoop++; + } else { + this.typingComplete = true; + } + } + + /** + * Has the typing been stopped + * @param {string} curString the current string in the strings array + * @param {number} curStrPos the current position in the curString + * @param {boolean} isTyping + * @private + */ + }, { + key: 'setPauseStatus', + value: function setPauseStatus(curString, curStrPos, isTyping) { + this.pause.typewrite = isTyping; + this.pause.curString = curString; + this.pause.curStrPos = curStrPos; + } + + /** + * Toggle the blinking cursor + * @param {boolean} isBlinking + * @private + */ + }, { + key: 'toggleBlinking', + value: function toggleBlinking(isBlinking) { + if (!this.cursor) return; + // if in paused state, don't toggle blinking a 2nd time + if (this.pause.status) return; + if (this.cursorBlinking === isBlinking) return; + this.cursorBlinking = isBlinking; + if (isBlinking) { + this.cursor.classList.add('typed-cursor--blink'); + } else { + this.cursor.classList.remove('typed-cursor--blink'); + } + } + + /** + * Speed in MS to type + * @param {number} speed + * @private + */ + }, { + key: 'humanizer', + value: function humanizer(speed) { + return Math.round(Math.random() * speed / 2) + speed; + } + + /** + * Shuffle the sequence of the strings array + * @private + */ + }, { + key: 'shuffleStringsIfNeeded', + value: function shuffleStringsIfNeeded() { + if (!this.shuffle) return; + this.sequence = this.sequence.sort(function () { + return Math.random() - 0.5; + }); + } + + /** + * Adds a CSS class to fade out current string + * @private + */ + }, { + key: 'initFadeOut', + value: function initFadeOut() { + var _this5 = this; + + this.el.className += ' ' + this.fadeOutClass; + if (this.cursor) this.cursor.className += ' ' + this.fadeOutClass; + return setTimeout(function () { + _this5.arrayPos++; + _this5.replaceText(''); + + // Resets current string if end of loop reached + if (_this5.strings.length > _this5.arrayPos) { + _this5.typewrite(_this5.strings[_this5.sequence[_this5.arrayPos]], 0); + } else { + _this5.typewrite(_this5.strings[0], 0); + _this5.arrayPos = 0; + } + }, this.fadeOutDelay); + } + + /** + * Replaces current text in the HTML element + * depending on element type + * @param {string} str + * @private + */ + }, { + key: 'replaceText', + value: function replaceText(str) { + if (this.attr) { + this.el.setAttribute(this.attr, str); + } else { + if (this.isInput) { + this.el.value = str; + } else if (this.contentType === 'html') { + this.el.innerHTML = str; + } else { + this.el.textContent = str; + } + } + } + + /** + * If using input elements, bind focus in order to + * start and stop the animation + * @private + */ + }, { + key: 'bindFocusEvents', + value: function bindFocusEvents() { + var _this6 = this; + + if (!this.isInput) return; + this.el.addEventListener('focus', function (e) { + _this6.stop(); + }); + this.el.addEventListener('blur', function (e) { + if (_this6.el.value && _this6.el.value.length !== 0) { + return; + } + _this6.start(); + }); + } + + /** + * On init, insert the cursor element + * @private + */ + }, { + key: 'insertCursor', + value: function insertCursor() { + if (!this.showCursor) return; + if (this.cursor) return; + this.cursor = document.createElement('span'); + this.cursor.className = 'typed-cursor'; + this.cursor.innerHTML = this.cursorChar; + this.el.parentNode && this.el.parentNode.insertBefore(this.cursor, this.el.nextSibling); + } + }]); + + return Typed; + })(); + + exports['default'] = Typed; + module.exports = exports['default']; + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + var _defaultsJs = __webpack_require__(2); + + var _defaultsJs2 = _interopRequireDefault(_defaultsJs); + + /** + * Initialize the Typed object + */ + + var Initializer = (function () { + function Initializer() { + _classCallCheck(this, Initializer); + } + + _createClass(Initializer, [{ + key: 'load', + + /** + * Load up defaults & options on the Typed instance + * @param {Typed} self instance of Typed + * @param {object} options options object + * @param {string} elementId HTML element ID _OR_ instance of HTML element + * @private + */ + + value: function load(self, options, elementId) { + // chosen element to manipulate text + if (typeof elementId === 'string') { + self.el = document.querySelector(elementId); + } else { + self.el = elementId; + } + + self.options = _extends({}, _defaultsJs2['default'], options); + + // attribute to type into + self.isInput = self.el.tagName.toLowerCase() === 'input'; + self.attr = self.options.attr; + self.bindInputFocusEvents = self.options.bindInputFocusEvents; + + // show cursor + self.showCursor = self.isInput ? false : self.options.showCursor; + + // custom cursor + self.cursorChar = self.options.cursorChar; + + // Is the cursor blinking + self.cursorBlinking = true; + + // text content of element + self.elContent = self.attr ? self.el.getAttribute(self.attr) : self.el.textContent; + + // html or plain text + self.contentType = self.options.contentType; + + // typing speed + self.typeSpeed = self.options.typeSpeed; + + // add a delay before typing starts + self.startDelay = self.options.startDelay; + + // backspacing speed + self.backSpeed = self.options.backSpeed; + + // only backspace what doesn't match the previous string + self.smartBackspace = self.options.smartBackspace; + + // amount of time to wait before backspacing + self.backDelay = self.options.backDelay; + + // Fade out instead of backspace + self.fadeOut = self.options.fadeOut; + self.fadeOutClass = self.options.fadeOutClass; + self.fadeOutDelay = self.options.fadeOutDelay; + + // variable to check whether typing is currently paused + self.isPaused = false; + + // input strings of text + self.strings = self.options.strings.map(function (s) { + return s.trim(); + }); + + // div containing strings + if (typeof self.options.stringsElement === 'string') { + self.stringsElement = document.querySelector(self.options.stringsElement); + } else { + self.stringsElement = self.options.stringsElement; + } + + if (self.stringsElement) { + self.strings = []; + self.stringsElement.style.display = 'none'; + var strings = Array.prototype.slice.apply(self.stringsElement.children); + var stringsLength = strings.length; + + if (stringsLength) { + for (var i = 0; i < stringsLength; i += 1) { + var stringEl = strings[i]; + self.strings.push(stringEl.innerHTML.trim()); + } + } + } + + // character number position of current string + self.strPos = 0; + + // current array position + self.arrayPos = 0; + + // index of string to stop backspacing on + self.stopNum = 0; + + // Looping logic + self.loop = self.options.loop; + self.loopCount = self.options.loopCount; + self.curLoop = 0; + + // shuffle the strings + self.shuffle = self.options.shuffle; + // the order of strings + self.sequence = []; + + self.pause = { + status: false, + typewrite: true, + curString: '', + curStrPos: 0 + }; + + // When the typing is complete (when not looped) + self.typingComplete = false; + + // Set the order in which the strings are typed + for (var i in self.strings) { + self.sequence[i] = i; + } + + // If there is some text in the element + self.currentElContent = this.getCurrentElContent(self); + + self.autoInsertCss = self.options.autoInsertCss; + + this.appendAnimationCss(self); + } + }, { + key: 'getCurrentElContent', + value: function getCurrentElContent(self) { + var elContent = ''; + if (self.attr) { + elContent = self.el.getAttribute(self.attr); + } else if (self.isInput) { + elContent = self.el.value; + } else if (self.contentType === 'html') { + elContent = self.el.innerHTML; + } else { + elContent = self.el.textContent; + } + return elContent; + } + }, { + key: 'appendAnimationCss', + value: function appendAnimationCss(self) { + var cssDataName = 'data-typed-js-css'; + if (!self.autoInsertCss) { + return; + } + if (!self.showCursor && !self.fadeOut) { + return; + } + if (document.querySelector('[' + cssDataName + ']')) { + return; + } + + var css = document.createElement('style'); + css.type = 'text/css'; + css.setAttribute(cssDataName, true); + + var innerCss = ''; + if (self.showCursor) { + innerCss += '\n .typed-cursor{\n opacity: 1;\n }\n .typed-cursor.typed-cursor--blink{\n animation: typedjsBlink 0.7s infinite;\n -webkit-animation: typedjsBlink 0.7s infinite;\n animation: typedjsBlink 0.7s infinite;\n }\n @keyframes typedjsBlink{\n 50% { opacity: 0.0; }\n }\n @-webkit-keyframes typedjsBlink{\n 0% { opacity: 1; }\n 50% { opacity: 0.0; }\n 100% { opacity: 1; }\n }\n '; + } + if (self.fadeOut) { + innerCss += '\n .typed-fade-out{\n opacity: 0;\n transition: opacity .25s;\n }\n .typed-cursor.typed-cursor--blink.typed-fade-out{\n -webkit-animation: 0;\n animation: 0;\n }\n '; + } + if (css.length === 0) { + return; + } + css.innerHTML = innerCss; + document.body.appendChild(css); + } + }]); + + return Initializer; + })(); + + exports['default'] = Initializer; + var initializer = new Initializer(); + exports.initializer = initializer; + +/***/ }), +/* 2 */ +/***/ (function(module, exports) { + + /** + * Defaults & options + * @returns {object} Typed defaults & options + * @public + */ + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + var defaults = { + /** + * @property {array} strings strings to be typed + * @property {string} stringsElement ID of element containing string children + */ + strings: ['These are the default values...', 'You know what you should do?', 'Use your own!', 'Have a great day!'], + stringsElement: null, + + /** + * @property {number} typeSpeed type speed in milliseconds + */ + typeSpeed: 0, + + /** + * @property {number} startDelay time before typing starts in milliseconds + */ + startDelay: 0, + + /** + * @property {number} backSpeed backspacing speed in milliseconds + */ + backSpeed: 0, + + /** + * @property {boolean} smartBackspace only backspace what doesn't match the previous string + */ + smartBackspace: true, + + /** + * @property {boolean} shuffle shuffle the strings + */ + shuffle: false, + + /** + * @property {number} backDelay time before backspacing in milliseconds + */ + backDelay: 700, + + /** + * @property {boolean} fadeOut Fade out instead of backspace + * @property {string} fadeOutClass css class for fade animation + * @property {boolean} fadeOutDelay Fade out delay in milliseconds + */ + fadeOut: false, + fadeOutClass: 'typed-fade-out', + fadeOutDelay: 500, + + /** + * @property {boolean} loop loop strings + * @property {number} loopCount amount of loops + */ + loop: false, + loopCount: Infinity, + + /** + * @property {boolean} showCursor show cursor + * @property {string} cursorChar character for cursor + * @property {boolean} autoInsertCss insert CSS for cursor and fadeOut into HTML + */ + showCursor: true, + cursorChar: '|', + autoInsertCss: true, + + /** + * @property {string} attr attribute for typing + * Ex: input placeholder, value, or just HTML text + */ + attr: null, + + /** + * @property {boolean} bindInputFocusEvents bind to focus and blur if el is text input + */ + bindInputFocusEvents: false, + + /** + * @property {string} contentType 'html' or 'null' for plaintext + */ + contentType: 'html', + + /** + * All typing is complete + * @param {Typed} self + */ + onComplete: function onComplete(self) {}, + + /** + * Before each string is typed + * @param {number} arrayPos + * @param {Typed} self + */ + preStringTyped: function preStringTyped(arrayPos, self) {}, + + /** + * After each string is typed + * @param {number} arrayPos + * @param {Typed} self + */ + onStringTyped: function onStringTyped(arrayPos, self) {}, + + /** + * During looping, after last string is typed + * @param {Typed} self + */ + onLastStringBackspaced: function onLastStringBackspaced(self) {}, + + /** + * Typing has been stopped + * @param {number} arrayPos + * @param {Typed} self + */ + onTypingPaused: function onTypingPaused(arrayPos, self) {}, + + /** + * Typing has been started after being stopped + * @param {number} arrayPos + * @param {Typed} self + */ + onTypingResumed: function onTypingResumed(arrayPos, self) {}, + + /** + * After reset + * @param {Typed} self + */ + onReset: function onReset(self) {}, + + /** + * After stop + * @param {number} arrayPos + * @param {Typed} self + */ + onStop: function onStop(arrayPos, self) {}, + + /** + * After start + * @param {number} arrayPos + * @param {Typed} self + */ + onStart: function onStart(arrayPos, self) {}, + + /** + * After destroy + * @param {Typed} self + */ + onDestroy: function onDestroy(self) {} + }; + + exports['default'] = defaults; + module.exports = exports['default']; + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + + + /** + * TODO: These methods can probably be combined somehow + * Parse HTML tags & HTML Characters + */ + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + var HTMLParser = (function () { + function HTMLParser() { + _classCallCheck(this, HTMLParser); + } + + _createClass(HTMLParser, [{ + key: 'typeHtmlChars', + + /** + * Type HTML tags & HTML Characters + * @param {string} curString Current string + * @param {number} curStrPos Position in current string + * @param {Typed} self instance of Typed + * @returns {number} a new string position + * @private + */ + + value: function typeHtmlChars(curString, curStrPos, self) { + if (self.contentType !== 'html') return curStrPos; + var curChar = curString.substr(curStrPos).charAt(0); + if (curChar === '<' || curChar === '&') { + var endTag = ''; + if (curChar === '<') { + endTag = '>'; + } else { + endTag = ';'; + } + while (curString.substr(curStrPos + 1).charAt(0) !== endTag) { + curStrPos++; + if (curStrPos + 1 > curString.length) { + break; + } + } + curStrPos++; + } + return curStrPos; + } + + /** + * Backspace HTML tags and HTML Characters + * @param {string} curString Current string + * @param {number} curStrPos Position in current string + * @param {Typed} self instance of Typed + * @returns {number} a new string position + * @private + */ + }, { + key: 'backSpaceHtmlChars', + value: function backSpaceHtmlChars(curString, curStrPos, self) { + if (self.contentType !== 'html') return curStrPos; + var curChar = curString.substr(curStrPos).charAt(0); + if (curChar === '>' || curChar === ';') { + var endTag = ''; + if (curChar === '>') { + endTag = '<'; + } else { + endTag = '&'; + } + while (curString.substr(curStrPos - 1).charAt(0) !== endTag) { + curStrPos--; + if (curStrPos < 0) { + break; + } + } + curStrPos--; + } + return curStrPos; + } + }]); + + return HTMLParser; + })(); + + exports['default'] = HTMLParser; + var htmlParser = new HTMLParser(); + exports.htmlParser = htmlParser; + +/***/ }) +/******/ ]) +}); +; \ No newline at end of file diff --git a/experiment/simulation/EE4/src/images/29 feb/part_1_select_option_full.png b/experiment/simulation/EE4/src/images/29 feb/part_1_select_option_full.png new file mode 100644 index 0000000..2113bf3 Binary files /dev/null and b/experiment/simulation/EE4/src/images/29 feb/part_1_select_option_full.png differ diff --git a/experiment/simulation/EE4/src/images/29 feb/part_3_components.png b/experiment/simulation/EE4/src/images/29 feb/part_3_components.png new file mode 100644 index 0000000..f1f098d Binary files /dev/null and b/experiment/simulation/EE4/src/images/29 feb/part_3_components.png differ diff --git a/experiment/simulation/EE4/src/images/29 feb/part_3_graph.png b/experiment/simulation/EE4/src/images/29 feb/part_3_graph.png new file mode 100644 index 0000000..5f8faca Binary files /dev/null and b/experiment/simulation/EE4/src/images/29 feb/part_3_graph.png differ diff --git a/experiment/simulation/EE4/src/images/29 feb/part_3_off_button.png b/experiment/simulation/EE4/src/images/29 feb/part_3_off_button.png new file mode 100644 index 0000000..b84e493 Binary files /dev/null and b/experiment/simulation/EE4/src/images/29 feb/part_3_off_button.png differ diff --git a/experiment/simulation/EE4/src/images/29 feb/part_3_table_1.png b/experiment/simulation/EE4/src/images/29 feb/part_3_table_1.png new file mode 100644 index 0000000..62fa932 Binary files /dev/null and b/experiment/simulation/EE4/src/images/29 feb/part_3_table_1.png differ diff --git a/experiment/simulation/EE4/src/images/29 feb/part_3_table_2.png b/experiment/simulation/EE4/src/images/29 feb/part_3_table_2.png new file mode 100644 index 0000000..946562c Binary files /dev/null and b/experiment/simulation/EE4/src/images/29 feb/part_3_table_2.png differ diff --git a/experiment/simulation/EE4/src/images/29 feb/part_3_table_3.png b/experiment/simulation/EE4/src/images/29 feb/part_3_table_3.png new file mode 100644 index 0000000..fcd4a72 Binary files /dev/null and b/experiment/simulation/EE4/src/images/29 feb/part_3_table_3.png differ diff --git a/experiment/simulation/EE4/src/images/29 feb/part_3_text.png b/experiment/simulation/EE4/src/images/29 feb/part_3_text.png new file mode 100644 index 0000000..4b7ea1e Binary files /dev/null and b/experiment/simulation/EE4/src/images/29 feb/part_3_text.png differ diff --git a/experiment/simulation/EE4/src/images/Boost Converter/box_img.png b/experiment/simulation/EE4/src/images/Boost Converter/box_img.png new file mode 100644 index 0000000..4fa944a Binary files /dev/null and b/experiment/simulation/EE4/src/images/Boost Converter/box_img.png differ diff --git a/experiment/simulation/EE4/src/images/Boost Converter/component_battery.png b/experiment/simulation/EE4/src/images/Boost Converter/component_battery.png new file mode 100644 index 0000000..dae5d82 Binary files /dev/null and b/experiment/simulation/EE4/src/images/Boost Converter/component_battery.png differ diff --git a/experiment/simulation/EE4/src/images/Boost Converter/component_capacitor.png b/experiment/simulation/EE4/src/images/Boost Converter/component_capacitor.png new file mode 100644 index 0000000..94a85fd Binary files /dev/null and b/experiment/simulation/EE4/src/images/Boost Converter/component_capacitor.png differ diff --git a/experiment/simulation/EE4/src/images/Boost Converter/component_diode.png b/experiment/simulation/EE4/src/images/Boost Converter/component_diode.png new file mode 100644 index 0000000..dd8134a Binary files /dev/null and b/experiment/simulation/EE4/src/images/Boost Converter/component_diode.png differ diff --git a/experiment/simulation/EE4/src/images/Boost Converter/component_inductor.png b/experiment/simulation/EE4/src/images/Boost Converter/component_inductor.png new file mode 100644 index 0000000..76c4344 Binary files /dev/null and b/experiment/simulation/EE4/src/images/Boost Converter/component_inductor.png differ diff --git a/experiment/simulation/EE4/src/images/Boost Converter/component_mosfet.png b/experiment/simulation/EE4/src/images/Boost Converter/component_mosfet.png new file mode 100644 index 0000000..71b43ae Binary files /dev/null and b/experiment/simulation/EE4/src/images/Boost Converter/component_mosfet.png differ diff --git a/experiment/simulation/EE4/src/images/Boost Converter/component_register.png b/experiment/simulation/EE4/src/images/Boost Converter/component_register.png new file mode 100644 index 0000000..cce7f7e Binary files /dev/null and b/experiment/simulation/EE4/src/images/Boost Converter/component_register.png differ diff --git a/experiment/simulation/EE4/src/images/Boost Converter/full_circuit.png b/experiment/simulation/EE4/src/images/Boost Converter/full_circuit.png new file mode 100644 index 0000000..4661f8b Binary files /dev/null and b/experiment/simulation/EE4/src/images/Boost Converter/full_circuit.png differ diff --git a/experiment/simulation/EE4/src/images/Boost Converter/full_circuit2.png b/experiment/simulation/EE4/src/images/Boost Converter/full_circuit2.png new file mode 100644 index 0000000..e546fb1 Binary files /dev/null and b/experiment/simulation/EE4/src/images/Boost Converter/full_circuit2.png differ diff --git a/experiment/simulation/EE4/src/images/Boost Converter/full_circuit_back.png b/experiment/simulation/EE4/src/images/Boost Converter/full_circuit_back.png new file mode 100644 index 0000000..5d75642 Binary files /dev/null and b/experiment/simulation/EE4/src/images/Boost Converter/full_circuit_back.png differ diff --git a/experiment/simulation/EE4/src/images/box1.png b/experiment/simulation/EE4/src/images/box1.png new file mode 100644 index 0000000..9d11802 Binary files /dev/null and b/experiment/simulation/EE4/src/images/box1.png differ diff --git a/experiment/simulation/EE4/src/images/box2.png b/experiment/simulation/EE4/src/images/box2.png new file mode 100644 index 0000000..66d9f3d Binary files /dev/null and b/experiment/simulation/EE4/src/images/box2.png differ diff --git a/experiment/simulation/EE4/src/images/box3.png b/experiment/simulation/EE4/src/images/box3.png new file mode 100644 index 0000000..38c94c3 Binary files /dev/null and b/experiment/simulation/EE4/src/images/box3.png differ diff --git a/experiment/simulation/EE4/src/images/box4.png b/experiment/simulation/EE4/src/images/box4.png new file mode 100644 index 0000000..fb0d391 Binary files /dev/null and b/experiment/simulation/EE4/src/images/box4.png differ diff --git a/experiment/simulation/EE4/src/images/box5.png b/experiment/simulation/EE4/src/images/box5.png new file mode 100644 index 0000000..7dbbb83 Binary files /dev/null and b/experiment/simulation/EE4/src/images/box5.png differ diff --git a/experiment/simulation/EE4/src/images/box6.png b/experiment/simulation/EE4/src/images/box6.png new file mode 100644 index 0000000..ea92b72 Binary files /dev/null and b/experiment/simulation/EE4/src/images/box6.png differ diff --git a/experiment/simulation/EE4/src/images/box_img.png b/experiment/simulation/EE4/src/images/box_img.png new file mode 100644 index 0000000..4fa944a Binary files /dev/null and b/experiment/simulation/EE4/src/images/box_img.png differ diff --git a/experiment/simulation/EE4/src/images/btn_connections.png b/experiment/simulation/EE4/src/images/btn_connections.png new file mode 100644 index 0000000..cadcf8e Binary files /dev/null and b/experiment/simulation/EE4/src/images/btn_connections.png differ diff --git a/experiment/simulation/EE4/src/images/btn_connectons_completed.png b/experiment/simulation/EE4/src/images/btn_connectons_completed.png new file mode 100644 index 0000000..abecdff Binary files /dev/null and b/experiment/simulation/EE4/src/images/btn_connectons_completed.png differ diff --git a/experiment/simulation/EE4/src/images/btn_instructions.png b/experiment/simulation/EE4/src/images/btn_instructions.png new file mode 100644 index 0000000..fbf93e9 Binary files /dev/null and b/experiment/simulation/EE4/src/images/btn_instructions.png differ diff --git a/experiment/simulation/EE4/src/images/btn_nomenclature.png b/experiment/simulation/EE4/src/images/btn_nomenclature.png new file mode 100644 index 0000000..91422ca Binary files /dev/null and b/experiment/simulation/EE4/src/images/btn_nomenclature.png differ diff --git a/experiment/simulation/EE4/src/images/btn_plot.png b/experiment/simulation/EE4/src/images/btn_plot.png new file mode 100644 index 0000000..cf77ae7 Binary files /dev/null and b/experiment/simulation/EE4/src/images/btn_plot.png differ diff --git a/experiment/simulation/EE4/src/images/btn_procedure.png b/experiment/simulation/EE4/src/images/btn_procedure.png new file mode 100644 index 0000000..315de4d Binary files /dev/null and b/experiment/simulation/EE4/src/images/btn_procedure.png differ diff --git a/experiment/simulation/EE4/src/images/btn_reset.png b/experiment/simulation/EE4/src/images/btn_reset.png new file mode 100644 index 0000000..45dc15f Binary files /dev/null and b/experiment/simulation/EE4/src/images/btn_reset.png differ diff --git a/experiment/simulation/EE4/src/images/btn_start_experiment.png b/experiment/simulation/EE4/src/images/btn_start_experiment.png new file mode 100644 index 0000000..be6d519 Binary files /dev/null and b/experiment/simulation/EE4/src/images/btn_start_experiment.png differ diff --git a/experiment/simulation/EE4/src/images/circuit_full_2.png b/experiment/simulation/EE4/src/images/circuit_full_2.png new file mode 100644 index 0000000..cd461b3 Binary files /dev/null and b/experiment/simulation/EE4/src/images/circuit_full_2.png differ diff --git a/experiment/simulation/EE4/src/images/circuit_full_3.png b/experiment/simulation/EE4/src/images/circuit_full_3.png new file mode 100644 index 0000000..03005d0 Binary files /dev/null and b/experiment/simulation/EE4/src/images/circuit_full_3.png differ diff --git a/experiment/simulation/EE4/src/images/compo_left.png b/experiment/simulation/EE4/src/images/compo_left.png new file mode 100644 index 0000000..538c242 Binary files /dev/null and b/experiment/simulation/EE4/src/images/compo_left.png differ diff --git a/experiment/simulation/EE4/src/images/component_battery.png b/experiment/simulation/EE4/src/images/component_battery.png new file mode 100644 index 0000000..6fe4cee Binary files /dev/null and b/experiment/simulation/EE4/src/images/component_battery.png differ diff --git a/experiment/simulation/EE4/src/images/component_capacitor.png b/experiment/simulation/EE4/src/images/component_capacitor.png new file mode 100644 index 0000000..5509553 Binary files /dev/null and b/experiment/simulation/EE4/src/images/component_capacitor.png differ diff --git a/experiment/simulation/EE4/src/images/component_diode.png b/experiment/simulation/EE4/src/images/component_diode.png new file mode 100644 index 0000000..903cb79 Binary files /dev/null and b/experiment/simulation/EE4/src/images/component_diode.png differ diff --git a/experiment/simulation/EE4/src/images/component_inductor.png b/experiment/simulation/EE4/src/images/component_inductor.png new file mode 100644 index 0000000..197d4fb Binary files /dev/null and b/experiment/simulation/EE4/src/images/component_inductor.png differ diff --git a/experiment/simulation/EE4/src/images/component_mosfet.png b/experiment/simulation/EE4/src/images/component_mosfet.png new file mode 100644 index 0000000..44ab6bb Binary files /dev/null and b/experiment/simulation/EE4/src/images/component_mosfet.png differ diff --git a/experiment/simulation/EE4/src/images/component_register.png b/experiment/simulation/EE4/src/images/component_register.png new file mode 100644 index 0000000..abfc8c2 Binary files /dev/null and b/experiment/simulation/EE4/src/images/component_register.png differ diff --git a/experiment/simulation/EE4/src/images/formulas_component_stress.png b/experiment/simulation/EE4/src/images/formulas_component_stress.png new file mode 100644 index 0000000..5a1d148 Binary files /dev/null and b/experiment/simulation/EE4/src/images/formulas_component_stress.png differ diff --git a/experiment/simulation/EE4/src/images/formulas_efficiency.png b/experiment/simulation/EE4/src/images/formulas_efficiency.png new file mode 100644 index 0000000..c776c78 Binary files /dev/null and b/experiment/simulation/EE4/src/images/formulas_efficiency.png differ diff --git a/experiment/simulation/EE4/src/images/formulas_ideal.png b/experiment/simulation/EE4/src/images/formulas_ideal.png new file mode 100644 index 0000000..adbd8bc Binary files /dev/null and b/experiment/simulation/EE4/src/images/formulas_ideal.png differ diff --git a/experiment/simulation/EE4/src/images/formulas_nomenclautre.png b/experiment/simulation/EE4/src/images/formulas_nomenclautre.png new file mode 100644 index 0000000..affb964 Binary files /dev/null and b/experiment/simulation/EE4/src/images/formulas_nomenclautre.png differ diff --git a/experiment/simulation/EE4/src/images/formulas_non_ideal.png b/experiment/simulation/EE4/src/images/formulas_non_ideal.png new file mode 100644 index 0000000..a984e3d Binary files /dev/null and b/experiment/simulation/EE4/src/images/formulas_non_ideal.png differ diff --git a/experiment/simulation/EE4/src/images/formulas_procedure.png b/experiment/simulation/EE4/src/images/formulas_procedure.png new file mode 100644 index 0000000..62e92eb Binary files /dev/null and b/experiment/simulation/EE4/src/images/formulas_procedure.png differ diff --git a/experiment/simulation/EE4/src/images/formulas_universal.png b/experiment/simulation/EE4/src/images/formulas_universal.png new file mode 100644 index 0000000..40c4aec Binary files /dev/null and b/experiment/simulation/EE4/src/images/formulas_universal.png differ diff --git a/experiment/simulation/EE4/src/images/full_circuit.png b/experiment/simulation/EE4/src/images/full_circuit.png new file mode 100644 index 0000000..82a7322 Binary files /dev/null and b/experiment/simulation/EE4/src/images/full_circuit.png differ diff --git a/experiment/simulation/EE4/src/images/full_circuit2.png b/experiment/simulation/EE4/src/images/full_circuit2.png new file mode 100644 index 0000000..e546fb1 Binary files /dev/null and b/experiment/simulation/EE4/src/images/full_circuit2.png differ diff --git a/experiment/simulation/EE4/src/images/graph2_arrow.png b/experiment/simulation/EE4/src/images/graph2_arrow.png new file mode 100644 index 0000000..841a8b7 Binary files /dev/null and b/experiment/simulation/EE4/src/images/graph2_arrow.png differ diff --git a/experiment/simulation/EE4/src/images/method_1_cable_black_bottom.png b/experiment/simulation/EE4/src/images/method_1_cable_black_bottom.png new file mode 100644 index 0000000..f520a74 Binary files /dev/null and b/experiment/simulation/EE4/src/images/method_1_cable_black_bottom.png differ diff --git a/experiment/simulation/EE4/src/images/method_1_cable_black_top.png b/experiment/simulation/EE4/src/images/method_1_cable_black_top.png new file mode 100644 index 0000000..878ae2e Binary files /dev/null and b/experiment/simulation/EE4/src/images/method_1_cable_black_top.png differ diff --git a/experiment/simulation/EE4/src/images/method_1_cable_blue.png b/experiment/simulation/EE4/src/images/method_1_cable_blue.png new file mode 100644 index 0000000..892e6e4 Binary files /dev/null and b/experiment/simulation/EE4/src/images/method_1_cable_blue.png differ diff --git a/experiment/simulation/EE4/src/images/method_1_cable_green.png b/experiment/simulation/EE4/src/images/method_1_cable_green.png new file mode 100644 index 0000000..5f10fc9 Binary files /dev/null and b/experiment/simulation/EE4/src/images/method_1_cable_green.png differ diff --git a/experiment/simulation/EE4/src/images/method_1_cable_pink.png b/experiment/simulation/EE4/src/images/method_1_cable_pink.png new file mode 100644 index 0000000..4216909 Binary files /dev/null and b/experiment/simulation/EE4/src/images/method_1_cable_pink.png differ diff --git a/experiment/simulation/EE4/src/images/method_1_cable_purple.png b/experiment/simulation/EE4/src/images/method_1_cable_purple.png new file mode 100644 index 0000000..bdfefb4 Binary files /dev/null and b/experiment/simulation/EE4/src/images/method_1_cable_purple.png differ diff --git a/experiment/simulation/EE4/src/images/method_1_cable_red.png b/experiment/simulation/EE4/src/images/method_1_cable_red.png new file mode 100644 index 0000000..20ab6a0 Binary files /dev/null and b/experiment/simulation/EE4/src/images/method_1_cable_red.png differ diff --git a/experiment/simulation/EE4/src/images/method_1_cable_yellow.png b/experiment/simulation/EE4/src/images/method_1_cable_yellow.png new file mode 100644 index 0000000..0447460 Binary files /dev/null and b/experiment/simulation/EE4/src/images/method_1_cable_yellow.png differ diff --git a/experiment/simulation/EE4/src/images/method_2_cable_green.png b/experiment/simulation/EE4/src/images/method_2_cable_green.png new file mode 100644 index 0000000..fa3a8d2 Binary files /dev/null and b/experiment/simulation/EE4/src/images/method_2_cable_green.png differ diff --git a/experiment/simulation/EE4/src/images/method_2_cable_red.png b/experiment/simulation/EE4/src/images/method_2_cable_red.png new file mode 100644 index 0000000..ba1a5cb Binary files /dev/null and b/experiment/simulation/EE4/src/images/method_2_cable_red.png differ diff --git a/experiment/simulation/EE4/src/images/method_2_cable_yellow.png b/experiment/simulation/EE4/src/images/method_2_cable_yellow.png new file mode 100644 index 0000000..fcca8c1 Binary files /dev/null and b/experiment/simulation/EE4/src/images/method_2_cable_yellow.png differ diff --git a/experiment/simulation/EE4/src/images/new imgs/part_1_1_instruction.png b/experiment/simulation/EE4/src/images/new imgs/part_1_1_instruction.png new file mode 100644 index 0000000..3928c2b Binary files /dev/null and b/experiment/simulation/EE4/src/images/new imgs/part_1_1_instruction.png differ diff --git a/experiment/simulation/EE4/src/images/new imgs/part_1_1_nomenclature.png b/experiment/simulation/EE4/src/images/new imgs/part_1_1_nomenclature.png new file mode 100644 index 0000000..dd2ca16 Binary files /dev/null and b/experiment/simulation/EE4/src/images/new imgs/part_1_1_nomenclature.png differ diff --git a/experiment/simulation/EE4/src/images/new imgs/part_1_1_procedure.png b/experiment/simulation/EE4/src/images/new imgs/part_1_1_procedure.png new file mode 100644 index 0000000..dbc15cd Binary files /dev/null and b/experiment/simulation/EE4/src/images/new imgs/part_1_1_procedure.png differ diff --git a/experiment/simulation/EE4/src/images/new imgs/part_1_2_instruction.png b/experiment/simulation/EE4/src/images/new imgs/part_1_2_instruction.png new file mode 100644 index 0000000..55a1372 Binary files /dev/null and b/experiment/simulation/EE4/src/images/new imgs/part_1_2_instruction.png differ diff --git a/experiment/simulation/EE4/src/images/new imgs/part_1_2_nomenclature.png b/experiment/simulation/EE4/src/images/new imgs/part_1_2_nomenclature.png new file mode 100644 index 0000000..fc37fe2 Binary files /dev/null and b/experiment/simulation/EE4/src/images/new imgs/part_1_2_nomenclature.png differ diff --git a/experiment/simulation/EE4/src/images/new imgs/part_1_2_procedure.png b/experiment/simulation/EE4/src/images/new imgs/part_1_2_procedure.png new file mode 100644 index 0000000..7771bbc Binary files /dev/null and b/experiment/simulation/EE4/src/images/new imgs/part_1_2_procedure.png differ diff --git a/experiment/simulation/EE4/src/images/new imgs/part_2_instruction.png b/experiment/simulation/EE4/src/images/new imgs/part_2_instruction.png new file mode 100644 index 0000000..02dbfcc Binary files /dev/null and b/experiment/simulation/EE4/src/images/new imgs/part_2_instruction.png differ diff --git a/experiment/simulation/EE4/src/images/new imgs/part_2_nomenclature.png b/experiment/simulation/EE4/src/images/new imgs/part_2_nomenclature.png new file mode 100644 index 0000000..6d4a2b1 Binary files /dev/null and b/experiment/simulation/EE4/src/images/new imgs/part_2_nomenclature.png differ diff --git a/experiment/simulation/EE4/src/images/new imgs/part_2_procedure.png b/experiment/simulation/EE4/src/images/new imgs/part_2_procedure.png new file mode 100644 index 0000000..26a8219 Binary files /dev/null and b/experiment/simulation/EE4/src/images/new imgs/part_2_procedure.png differ diff --git a/experiment/simulation/EE4/src/images/new imgs/part_3_nomenclature.png b/experiment/simulation/EE4/src/images/new imgs/part_3_nomenclature.png new file mode 100644 index 0000000..d14f579 Binary files /dev/null and b/experiment/simulation/EE4/src/images/new imgs/part_3_nomenclature.png differ diff --git a/experiment/simulation/EE4/src/images/new imgs/part_3_procedure.png b/experiment/simulation/EE4/src/images/new imgs/part_3_procedure.png new file mode 100644 index 0000000..3a12839 Binary files /dev/null and b/experiment/simulation/EE4/src/images/new imgs/part_3_procedure.png differ diff --git a/experiment/simulation/EE4/src/images/new/btn_1.png b/experiment/simulation/EE4/src/images/new/btn_1.png new file mode 100644 index 0000000..427b2ff Binary files /dev/null and b/experiment/simulation/EE4/src/images/new/btn_1.png differ diff --git a/experiment/simulation/EE4/src/images/new/btn_2.png b/experiment/simulation/EE4/src/images/new/btn_2.png new file mode 100644 index 0000000..fa82db1 Binary files /dev/null and b/experiment/simulation/EE4/src/images/new/btn_2.png differ diff --git a/experiment/simulation/EE4/src/images/new/btn_click.png b/experiment/simulation/EE4/src/images/new/btn_click.png new file mode 100644 index 0000000..21dabb4 Binary files /dev/null and b/experiment/simulation/EE4/src/images/new/btn_click.png differ diff --git a/experiment/simulation/EE4/src/images/new/circle.png b/experiment/simulation/EE4/src/images/new/circle.png new file mode 100644 index 0000000..b6ca4fa Binary files /dev/null and b/experiment/simulation/EE4/src/images/new/circle.png differ diff --git a/experiment/simulation/EE4/src/images/new/frame_1.png b/experiment/simulation/EE4/src/images/new/frame_1.png new file mode 100644 index 0000000..e7bac71 Binary files /dev/null and b/experiment/simulation/EE4/src/images/new/frame_1.png differ diff --git a/experiment/simulation/EE4/src/images/new/frame_2.png b/experiment/simulation/EE4/src/images/new/frame_2.png new file mode 100644 index 0000000..fdbf254 Binary files /dev/null and b/experiment/simulation/EE4/src/images/new/frame_2.png differ diff --git a/experiment/simulation/EE4/src/images/new/frame_3.png b/experiment/simulation/EE4/src/images/new/frame_3.png new file mode 100644 index 0000000..f631ea5 Binary files /dev/null and b/experiment/simulation/EE4/src/images/new/frame_3.png differ diff --git a/experiment/simulation/EE4/src/images/new/menu_page.png b/experiment/simulation/EE4/src/images/new/menu_page.png new file mode 100644 index 0000000..b4d036b Binary files /dev/null and b/experiment/simulation/EE4/src/images/new/menu_page.png differ diff --git a/experiment/simulation/EE4/src/images/new/val_vgs.png b/experiment/simulation/EE4/src/images/new/val_vgs.png new file mode 100644 index 0000000..5bdc813 Binary files /dev/null and b/experiment/simulation/EE4/src/images/new/val_vgs.png differ diff --git a/experiment/simulation/EE4/src/images/new/val_vin.png b/experiment/simulation/EE4/src/images/new/val_vin.png new file mode 100644 index 0000000..f48093c Binary files /dev/null and b/experiment/simulation/EE4/src/images/new/val_vin.png differ diff --git a/experiment/simulation/EE4/src/images/niddle.png b/experiment/simulation/EE4/src/images/niddle.png new file mode 100644 index 0000000..ee0612b Binary files /dev/null and b/experiment/simulation/EE4/src/images/niddle.png differ diff --git a/experiment/simulation/EE4/src/images/part1_circuit.png b/experiment/simulation/EE4/src/images/part1_circuit.png new file mode 100644 index 0000000..13ebad3 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part1_circuit.png differ diff --git a/experiment/simulation/EE4/src/images/part1_circuit_ new.png b/experiment/simulation/EE4/src/images/part1_circuit_ new.png new file mode 100644 index 0000000..9c61499 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part1_circuit_ new.png differ diff --git a/experiment/simulation/EE4/src/images/part1_component_capacitor.png b/experiment/simulation/EE4/src/images/part1_component_capacitor.png new file mode 100644 index 0000000..499f8e4 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part1_component_capacitor.png differ diff --git a/experiment/simulation/EE4/src/images/part1_component_diode.png b/experiment/simulation/EE4/src/images/part1_component_diode.png new file mode 100644 index 0000000..e0cda66 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part1_component_diode.png differ diff --git a/experiment/simulation/EE4/src/images/part1_component_inductor.png b/experiment/simulation/EE4/src/images/part1_component_inductor.png new file mode 100644 index 0000000..3d2d353 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part1_component_inductor.png differ diff --git a/experiment/simulation/EE4/src/images/part1_component_mosfet.png b/experiment/simulation/EE4/src/images/part1_component_mosfet.png new file mode 100644 index 0000000..38a55b7 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part1_component_mosfet.png differ diff --git a/experiment/simulation/EE4/src/images/part1_component_resistance.png b/experiment/simulation/EE4/src/images/part1_component_resistance.png new file mode 100644 index 0000000..6ac2f0f Binary files /dev/null and b/experiment/simulation/EE4/src/images/part1_component_resistance.png differ diff --git a/experiment/simulation/EE4/src/images/part1_component_voltage.png b/experiment/simulation/EE4/src/images/part1_component_voltage.png new file mode 100644 index 0000000..010b1c9 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part1_component_voltage.png differ diff --git a/experiment/simulation/EE4/src/images/part1_crrct_circuit.png b/experiment/simulation/EE4/src/images/part1_crrct_circuit.png new file mode 100644 index 0000000..5322909 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part1_crrct_circuit.png differ diff --git a/experiment/simulation/EE4/src/images/part1_crrct_text.png b/experiment/simulation/EE4/src/images/part1_crrct_text.png new file mode 100644 index 0000000..b4c5049 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part1_crrct_text.png differ diff --git a/experiment/simulation/EE4/src/images/part1_incrrct_text.png b/experiment/simulation/EE4/src/images/part1_incrrct_text.png new file mode 100644 index 0000000..ac12e2c Binary files /dev/null and b/experiment/simulation/EE4/src/images/part1_incrrct_text.png differ diff --git a/experiment/simulation/EE4/src/images/part4_table_graph.png b/experiment/simulation/EE4/src/images/part4_table_graph.png new file mode 100644 index 0000000..17f73b9 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part4_table_graph.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_1_cable_a2.png b/experiment/simulation/EE4/src/images/part_1_1_cable_a2.png new file mode 100644 index 0000000..163a93c Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_1_cable_a2.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_1_cable_n2.png b/experiment/simulation/EE4/src/images/part_1_1_cable_n2.png new file mode 100644 index 0000000..35416b0 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_1_cable_n2.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_1_cable_p1.png b/experiment/simulation/EE4/src/images/part_1_1_cable_p1.png new file mode 100644 index 0000000..d8a2031 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_1_cable_p1.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_1_cable_p2.png b/experiment/simulation/EE4/src/images/part_1_1_cable_p2.png new file mode 100644 index 0000000..bac9408 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_1_cable_p2.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_1_cable_r2.png b/experiment/simulation/EE4/src/images/part_1_1_cable_r2.png new file mode 100644 index 0000000..3c52cf1 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_1_cable_r2.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_1_cable_s.png b/experiment/simulation/EE4/src/images/part_1_1_cable_s.png new file mode 100644 index 0000000..52954de Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_1_cable_s.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_1_cable_v1.png b/experiment/simulation/EE4/src/images/part_1_1_cable_v1.png new file mode 100644 index 0000000..7073894 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_1_cable_v1.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_1_cable_v2.png b/experiment/simulation/EE4/src/images/part_1_1_cable_v2.png new file mode 100644 index 0000000..b96745b Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_1_cable_v2.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_1_calculations.png b/experiment/simulation/EE4/src/images/part_1_1_calculations.png new file mode 100644 index 0000000..3b6b98b Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_1_calculations.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_1_instruction.png b/experiment/simulation/EE4/src/images/part_1_1_instruction.png new file mode 100644 index 0000000..3928c2b Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_1_instruction.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_1_nomenclature.png b/experiment/simulation/EE4/src/images/part_1_1_nomenclature.png new file mode 100644 index 0000000..dd2ca16 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_1_nomenclature.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_1_procedure.png b/experiment/simulation/EE4/src/images/part_1_1_procedure.png new file mode 100644 index 0000000..dbc15cd Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_1_procedure.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_2_cable_a1.png b/experiment/simulation/EE4/src/images/part_1_2_cable_a1.png new file mode 100644 index 0000000..5f06e85 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_2_cable_a1.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_2_cable_cp.png b/experiment/simulation/EE4/src/images/part_1_2_cable_cp.png new file mode 100644 index 0000000..3a2e2cb Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_2_cable_cp.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_2_cable_dvp.png b/experiment/simulation/EE4/src/images/part_1_2_cable_dvp.png new file mode 100644 index 0000000..b9f9bad Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_2_cable_dvp.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_2_cable_n2.png b/experiment/simulation/EE4/src/images/part_1_2_cable_n2.png new file mode 100644 index 0000000..a25ba69 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_2_cable_n2.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_2_cable_p1.png b/experiment/simulation/EE4/src/images/part_1_2_cable_p1.png new file mode 100644 index 0000000..dc90d3c Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_2_cable_p1.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_2_cable_p2.png b/experiment/simulation/EE4/src/images/part_1_2_cable_p2.png new file mode 100644 index 0000000..0d71b32 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_2_cable_p2.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_2_cable_r1.png b/experiment/simulation/EE4/src/images/part_1_2_cable_r1.png new file mode 100644 index 0000000..0e580c4 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_2_cable_r1.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_2_cable_s.png b/experiment/simulation/EE4/src/images/part_1_2_cable_s.png new file mode 100644 index 0000000..9d42133 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_2_cable_s.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_2_cable_v1.png b/experiment/simulation/EE4/src/images/part_1_2_cable_v1.png new file mode 100644 index 0000000..5eee81c Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_2_cable_v1.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_2_cable_v2.png b/experiment/simulation/EE4/src/images/part_1_2_cable_v2.png new file mode 100644 index 0000000..e2d0f7f Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_2_cable_v2.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_2_calculations.png b/experiment/simulation/EE4/src/images/part_1_2_calculations.png new file mode 100644 index 0000000..f72f2b5 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_2_calculations.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_2_instruction.png b/experiment/simulation/EE4/src/images/part_1_2_instruction.png new file mode 100644 index 0000000..55a1372 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_2_instruction.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_2_nomenclature.png b/experiment/simulation/EE4/src/images/part_1_2_nomenclature.png new file mode 100644 index 0000000..fc37fe2 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_2_nomenclature.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_2_procedure.png b/experiment/simulation/EE4/src/images/part_1_2_procedure.png new file mode 100644 index 0000000..d4905f4 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_2_procedure.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_components_1.png b/experiment/simulation/EE4/src/images/part_1_components_1.png new file mode 100644 index 0000000..b9321c3 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_components_1.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_components_2.png b/experiment/simulation/EE4/src/images/part_1_components_2.png new file mode 100644 index 0000000..a798154 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_components_2.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_incomplete_connection.png b/experiment/simulation/EE4/src/images/part_1_incomplete_connection.png new file mode 100644 index 0000000..168284a Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_incomplete_connection.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_instructions_box.png b/experiment/simulation/EE4/src/images/part_1_instructions_box.png new file mode 100644 index 0000000..7475c89 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_instructions_box.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_procedure_box.png b/experiment/simulation/EE4/src/images/part_1_procedure_box.png new file mode 100644 index 0000000..49e5e3c Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_procedure_box.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_procedure_box_2.png b/experiment/simulation/EE4/src/images/part_1_procedure_box_2.png new file mode 100644 index 0000000..529d6ca Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_procedure_box_2.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_select_option_1_1.png b/experiment/simulation/EE4/src/images/part_1_select_option_1_1.png new file mode 100644 index 0000000..9547f34 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_select_option_1_1.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_select_option_1_2.png b/experiment/simulation/EE4/src/images/part_1_select_option_1_2.png new file mode 100644 index 0000000..7b9c5ad Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_select_option_1_2.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_select_option_2.png b/experiment/simulation/EE4/src/images/part_1_select_option_2.png new file mode 100644 index 0000000..ea2d340 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_select_option_2.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_select_option_3.png b/experiment/simulation/EE4/src/images/part_1_select_option_3.png new file mode 100644 index 0000000..284755c Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_select_option_3.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_select_option_full.png b/experiment/simulation/EE4/src/images/part_1_select_option_full.png new file mode 100644 index 0000000..2113bf3 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_select_option_full.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_slide_1.png b/experiment/simulation/EE4/src/images/part_1_slide_1.png new file mode 100644 index 0000000..75c48bf Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_slide_1.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_slide_2.png b/experiment/simulation/EE4/src/images/part_1_slide_2.png new file mode 100644 index 0000000..09312e2 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_slide_2.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_slide_3.png b/experiment/simulation/EE4/src/images/part_1_slide_3.png new file mode 100644 index 0000000..9500a5a Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_slide_3.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_slide_3_compo_1_off.png b/experiment/simulation/EE4/src/images/part_1_slide_3_compo_1_off.png new file mode 100644 index 0000000..2720f35 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_slide_3_compo_1_off.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_slide_3_compo_1_on.png b/experiment/simulation/EE4/src/images/part_1_slide_3_compo_1_on.png new file mode 100644 index 0000000..58021b9 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_slide_3_compo_1_on.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_slide_3_compo_1_text.png b/experiment/simulation/EE4/src/images/part_1_slide_3_compo_1_text.png new file mode 100644 index 0000000..214e894 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_slide_3_compo_1_text.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_slide_3_compo_2_off.png b/experiment/simulation/EE4/src/images/part_1_slide_3_compo_2_off.png new file mode 100644 index 0000000..6d4ae66 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_slide_3_compo_2_off.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_slide_3_compo_2_on.png b/experiment/simulation/EE4/src/images/part_1_slide_3_compo_2_on.png new file mode 100644 index 0000000..4b2c012 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_slide_3_compo_2_on.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_slide_3_compo_2_text.png b/experiment/simulation/EE4/src/images/part_1_slide_3_compo_2_text.png new file mode 100644 index 0000000..4ae8cd1 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_slide_3_compo_2_text.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_slide_4.png b/experiment/simulation/EE4/src/images/part_1_slide_4.png new file mode 100644 index 0000000..e858a54 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_slide_4.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_text_for_crrct.png b/experiment/simulation/EE4/src/images/part_1_text_for_crrct.png new file mode 100644 index 0000000..5c48952 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_text_for_crrct.png differ diff --git a/experiment/simulation/EE4/src/images/part_1_text_for_wrong.png b/experiment/simulation/EE4/src/images/part_1_text_for_wrong.png new file mode 100644 index 0000000..5731168 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_1_text_for_wrong.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_calculation_components.png b/experiment/simulation/EE4/src/images/part_2_calculation_components.png new file mode 100644 index 0000000..9b69e8a Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_calculation_components.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_circuit.png b/experiment/simulation/EE4/src/images/part_2_circuit.png new file mode 100644 index 0000000..22dab95 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_circuit.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_conncection_cable_a2.png b/experiment/simulation/EE4/src/images/part_2_conncection_cable_a2.png new file mode 100644 index 0000000..0daaeaf Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_conncection_cable_a2.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_conncection_cable_n2.png b/experiment/simulation/EE4/src/images/part_2_conncection_cable_n2.png new file mode 100644 index 0000000..2a2b942 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_conncection_cable_n2.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_conncection_cable_p1.png b/experiment/simulation/EE4/src/images/part_2_conncection_cable_p1.png new file mode 100644 index 0000000..7abde0a Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_conncection_cable_p1.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_conncection_cable_p2.png b/experiment/simulation/EE4/src/images/part_2_conncection_cable_p2.png new file mode 100644 index 0000000..0167ddf Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_conncection_cable_p2.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_conncection_cable_r2.png b/experiment/simulation/EE4/src/images/part_2_conncection_cable_r2.png new file mode 100644 index 0000000..5340155 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_conncection_cable_r2.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_conncection_cable_s.png b/experiment/simulation/EE4/src/images/part_2_conncection_cable_s.png new file mode 100644 index 0000000..f43f54e Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_conncection_cable_s.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_conncection_cable_v1.png b/experiment/simulation/EE4/src/images/part_2_conncection_cable_v1.png new file mode 100644 index 0000000..26f9d6d Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_conncection_cable_v1.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_conncection_cable_v2.png b/experiment/simulation/EE4/src/images/part_2_conncection_cable_v2.png new file mode 100644 index 0000000..adb945f Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_conncection_cable_v2.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_conncection_cable_vg1.png b/experiment/simulation/EE4/src/images/part_2_conncection_cable_vg1.png new file mode 100644 index 0000000..94675f8 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_conncection_cable_vg1.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_conncection_cable_vg2.png b/experiment/simulation/EE4/src/images/part_2_conncection_cable_vg2.png new file mode 100644 index 0000000..ebfa0a8 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_conncection_cable_vg2.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_conncection_supply_1_green_button.png b/experiment/simulation/EE4/src/images/part_2_conncection_supply_1_green_button.png new file mode 100644 index 0000000..b7e9b04 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_conncection_supply_1_green_button.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_conncection_supply_1_red_button.png b/experiment/simulation/EE4/src/images/part_2_conncection_supply_1_red_button.png new file mode 100644 index 0000000..7667726 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_conncection_supply_1_red_button.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_conncection_supply_2_green_button.png b/experiment/simulation/EE4/src/images/part_2_conncection_supply_2_green_button.png new file mode 100644 index 0000000..607ee36 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_conncection_supply_2_green_button.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_conncection_supply_2_red_button.png b/experiment/simulation/EE4/src/images/part_2_conncection_supply_2_red_button.png new file mode 100644 index 0000000..7667726 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_conncection_supply_2_red_button.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_connections_components.png b/experiment/simulation/EE4/src/images/part_2_connections_components.png new file mode 100644 index 0000000..b6436e3 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_connections_components.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_graph_1.png b/experiment/simulation/EE4/src/images/part_2_graph_1.png new file mode 100644 index 0000000..182163e Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_graph_1.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_graph_2.png b/experiment/simulation/EE4/src/images/part_2_graph_2.png new file mode 100644 index 0000000..1ee0caa Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_graph_2.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_graph_3.png b/experiment/simulation/EE4/src/images/part_2_graph_3.png new file mode 100644 index 0000000..845d580 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_graph_3.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_graph_empty.png b/experiment/simulation/EE4/src/images/part_2_graph_empty.png new file mode 100644 index 0000000..a5f0d6c Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_graph_empty.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_instruction.png b/experiment/simulation/EE4/src/images/part_2_instruction.png new file mode 100644 index 0000000..02dbfcc Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_instruction.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_nomenclature.png b/experiment/simulation/EE4/src/images/part_2_nomenclature.png new file mode 100644 index 0000000..6d4a2b1 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_nomenclature.png differ diff --git a/experiment/simulation/EE4/src/images/part_2_procedure.png b/experiment/simulation/EE4/src/images/part_2_procedure.png new file mode 100644 index 0000000..26a8219 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_2_procedure.png differ diff --git a/experiment/simulation/EE4/src/images/part_3_components.png b/experiment/simulation/EE4/src/images/part_3_components.png new file mode 100644 index 0000000..f1f098d Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_3_components.png differ diff --git a/experiment/simulation/EE4/src/images/part_3_graph.png b/experiment/simulation/EE4/src/images/part_3_graph.png new file mode 100644 index 0000000..1409ef6 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_3_graph.png differ diff --git a/experiment/simulation/EE4/src/images/part_3_graph_arrow.png b/experiment/simulation/EE4/src/images/part_3_graph_arrow.png new file mode 100644 index 0000000..d56101d Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_3_graph_arrow.png differ diff --git a/experiment/simulation/EE4/src/images/part_3_nomenclature.png b/experiment/simulation/EE4/src/images/part_3_nomenclature.png new file mode 100644 index 0000000..d14f579 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_3_nomenclature.png differ diff --git a/experiment/simulation/EE4/src/images/part_3_off_button.png b/experiment/simulation/EE4/src/images/part_3_off_button.png new file mode 100644 index 0000000..b84e493 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_3_off_button.png differ diff --git a/experiment/simulation/EE4/src/images/part_3_option_1.png b/experiment/simulation/EE4/src/images/part_3_option_1.png new file mode 100644 index 0000000..99191c8 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_3_option_1.png differ diff --git a/experiment/simulation/EE4/src/images/part_3_option_2.png b/experiment/simulation/EE4/src/images/part_3_option_2.png new file mode 100644 index 0000000..51034f1 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_3_option_2.png differ diff --git a/experiment/simulation/EE4/src/images/part_3_option_3.png b/experiment/simulation/EE4/src/images/part_3_option_3.png new file mode 100644 index 0000000..8812c14 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_3_option_3.png differ diff --git a/experiment/simulation/EE4/src/images/part_3_option_4.png b/experiment/simulation/EE4/src/images/part_3_option_4.png new file mode 100644 index 0000000..a057dc6 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_3_option_4.png differ diff --git a/experiment/simulation/EE4/src/images/part_3_option_4_graph.png b/experiment/simulation/EE4/src/images/part_3_option_4_graph.png new file mode 100644 index 0000000..d9feb3c Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_3_option_4_graph.png differ diff --git a/experiment/simulation/EE4/src/images/part_3_option_5.png b/experiment/simulation/EE4/src/images/part_3_option_5.png new file mode 100644 index 0000000..864c1d8 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_3_option_5.png differ diff --git a/experiment/simulation/EE4/src/images/part_3_option_select.png b/experiment/simulation/EE4/src/images/part_3_option_select.png new file mode 100644 index 0000000..d9feb3c Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_3_option_select.png differ diff --git a/experiment/simulation/EE4/src/images/part_3_option_select_dummy.png b/experiment/simulation/EE4/src/images/part_3_option_select_dummy.png new file mode 100644 index 0000000..e661a61 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_3_option_select_dummy.png differ diff --git a/experiment/simulation/EE4/src/images/part_3_procedure.png b/experiment/simulation/EE4/src/images/part_3_procedure.png new file mode 100644 index 0000000..3a12839 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_3_procedure.png differ diff --git a/experiment/simulation/EE4/src/images/part_3_table_1.png b/experiment/simulation/EE4/src/images/part_3_table_1.png new file mode 100644 index 0000000..62fa932 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_3_table_1.png differ diff --git a/experiment/simulation/EE4/src/images/part_3_table_2.png b/experiment/simulation/EE4/src/images/part_3_table_2.png new file mode 100644 index 0000000..946562c Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_3_table_2.png differ diff --git a/experiment/simulation/EE4/src/images/part_3_table_3.png b/experiment/simulation/EE4/src/images/part_3_table_3.png new file mode 100644 index 0000000..fcd4a72 Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_3_table_3.png differ diff --git a/experiment/simulation/EE4/src/images/part_3_text.png b/experiment/simulation/EE4/src/images/part_3_text.png new file mode 100644 index 0000000..4b7ea1e Binary files /dev/null and b/experiment/simulation/EE4/src/images/part_3_text.png differ diff --git a/experiment/simulation/EE4/src/images/photoscape/exp-4 part1.psxprj b/experiment/simulation/EE4/src/images/photoscape/exp-4 part1.psxprj new file mode 100644 index 0000000..e11112d Binary files /dev/null and b/experiment/simulation/EE4/src/images/photoscape/exp-4 part1.psxprj differ diff --git a/experiment/simulation/EE4/src/images/photoscape/exp-4 part1_cmplt.psxprj b/experiment/simulation/EE4/src/images/photoscape/exp-4 part1_cmplt.psxprj new file mode 100644 index 0000000..b69baf2 Binary files /dev/null and b/experiment/simulation/EE4/src/images/photoscape/exp-4 part1_cmplt.psxprj differ diff --git a/experiment/simulation/EE4/src/images/photoscape/part1_2.psxprj b/experiment/simulation/EE4/src/images/photoscape/part1_2.psxprj new file mode 100644 index 0000000..777ae96 Binary files /dev/null and b/experiment/simulation/EE4/src/images/photoscape/part1_2.psxprj differ diff --git a/experiment/simulation/EE4/src/images/photoscape/part_2_calculation_components.psxprj b/experiment/simulation/EE4/src/images/photoscape/part_2_calculation_components.psxprj new file mode 100644 index 0000000..c8a3634 Binary files /dev/null and b/experiment/simulation/EE4/src/images/photoscape/part_2_calculation_components.psxprj differ diff --git a/experiment/simulation/EE4/src/images/photoscape/part_2_connections.psxprj b/experiment/simulation/EE4/src/images/photoscape/part_2_connections.psxprj new file mode 100644 index 0000000..050c00a Binary files /dev/null and b/experiment/simulation/EE4/src/images/photoscape/part_2_connections.psxprj differ diff --git a/experiment/simulation/EE4/src/images/popup_imgs/nomenclature.png b/experiment/simulation/EE4/src/images/popup_imgs/nomenclature.png new file mode 100644 index 0000000..8306ca7 Binary files /dev/null and b/experiment/simulation/EE4/src/images/popup_imgs/nomenclature.png differ diff --git a/experiment/simulation/EE4/src/images/record_btn.png b/experiment/simulation/EE4/src/images/record_btn.png new file mode 100644 index 0000000..4d621f0 Binary files /dev/null and b/experiment/simulation/EE4/src/images/record_btn.png differ diff --git a/experiment/simulation/EE4/src/images/right_tick.png b/experiment/simulation/EE4/src/images/right_tick.png new file mode 100644 index 0000000..9d81e00 Binary files /dev/null and b/experiment/simulation/EE4/src/images/right_tick.png differ diff --git a/experiment/simulation/EE4/src/images/run_btn.png b/experiment/simulation/EE4/src/images/run_btn.png new file mode 100644 index 0000000..5a52c7a Binary files /dev/null and b/experiment/simulation/EE4/src/images/run_btn.png differ diff --git a/experiment/simulation/EE4/src/images/slider_thumb.png b/experiment/simulation/EE4/src/images/slider_thumb.png new file mode 100644 index 0000000..d0ac3ee Binary files /dev/null and b/experiment/simulation/EE4/src/images/slider_thumb.png differ diff --git a/experiment/simulation/EE4/src/images/symbol_C.png b/experiment/simulation/EE4/src/images/symbol_C.png new file mode 100644 index 0000000..1d7b61d Binary files /dev/null and b/experiment/simulation/EE4/src/images/symbol_C.png differ diff --git a/experiment/simulation/EE4/src/images/symbol_D.png b/experiment/simulation/EE4/src/images/symbol_D.png new file mode 100644 index 0000000..1a487e6 Binary files /dev/null and b/experiment/simulation/EE4/src/images/symbol_D.png differ diff --git a/experiment/simulation/EE4/src/images/symbol_L.png b/experiment/simulation/EE4/src/images/symbol_L.png new file mode 100644 index 0000000..42554b8 Binary files /dev/null and b/experiment/simulation/EE4/src/images/symbol_L.png differ diff --git a/experiment/simulation/EE4/src/images/symbol_R.png b/experiment/simulation/EE4/src/images/symbol_R.png new file mode 100644 index 0000000..58ed73f Binary files /dev/null and b/experiment/simulation/EE4/src/images/symbol_R.png differ diff --git a/experiment/simulation/EE4/src/images/symbol_S.png b/experiment/simulation/EE4/src/images/symbol_S.png new file mode 100644 index 0000000..b2a72fa Binary files /dev/null and b/experiment/simulation/EE4/src/images/symbol_S.png differ diff --git a/experiment/simulation/EE4/src/images/symbol_vIn.png b/experiment/simulation/EE4/src/images/symbol_vIn.png new file mode 100644 index 0000000..267db56 Binary files /dev/null and b/experiment/simulation/EE4/src/images/symbol_vIn.png differ diff --git a/experiment/simulation/EE4/src/images/temp/box_img.png b/experiment/simulation/EE4/src/images/temp/box_img.png new file mode 100644 index 0000000..4fa944a Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/box_img.png differ diff --git a/experiment/simulation/EE4/src/images/temp/changed/part_2_graph_1.png b/experiment/simulation/EE4/src/images/temp/changed/part_2_graph_1.png new file mode 100644 index 0000000..fd17b41 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/changed/part_2_graph_1.png differ diff --git a/experiment/simulation/EE4/src/images/temp/changed/part_2_graph_2.png b/experiment/simulation/EE4/src/images/temp/changed/part_2_graph_2.png new file mode 100644 index 0000000..eb5ab51 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/changed/part_2_graph_2.png differ diff --git a/experiment/simulation/EE4/src/images/temp/changed/part_2_graph_3.png b/experiment/simulation/EE4/src/images/temp/changed/part_2_graph_3.png new file mode 100644 index 0000000..b460f09 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/changed/part_2_graph_3.png differ diff --git a/experiment/simulation/EE4/src/images/temp/changed/part_2_graph_empty.png b/experiment/simulation/EE4/src/images/temp/changed/part_2_graph_empty.png new file mode 100644 index 0000000..279a753 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/changed/part_2_graph_empty.png differ diff --git a/experiment/simulation/EE4/src/images/temp/circuit_full_2.png b/experiment/simulation/EE4/src/images/temp/circuit_full_2.png new file mode 100644 index 0000000..2cc1ed6 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/circuit_full_2.png differ diff --git a/experiment/simulation/EE4/src/images/temp/circuit_full_3.png b/experiment/simulation/EE4/src/images/temp/circuit_full_3.png new file mode 100644 index 0000000..91b7394 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/circuit_full_3.png differ diff --git a/experiment/simulation/EE4/src/images/temp/component_battery.png b/experiment/simulation/EE4/src/images/temp/component_battery.png new file mode 100644 index 0000000..4d20651 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/component_battery.png differ diff --git a/experiment/simulation/EE4/src/images/temp/component_capacitor.png b/experiment/simulation/EE4/src/images/temp/component_capacitor.png new file mode 100644 index 0000000..afdf5f9 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/component_capacitor.png differ diff --git a/experiment/simulation/EE4/src/images/temp/component_diode.png b/experiment/simulation/EE4/src/images/temp/component_diode.png new file mode 100644 index 0000000..856b82d Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/component_diode.png differ diff --git a/experiment/simulation/EE4/src/images/temp/component_inductor.png b/experiment/simulation/EE4/src/images/temp/component_inductor.png new file mode 100644 index 0000000..703bd4a Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/component_inductor.png differ diff --git a/experiment/simulation/EE4/src/images/temp/component_mosfet.png b/experiment/simulation/EE4/src/images/temp/component_mosfet.png new file mode 100644 index 0000000..920b733 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/component_mosfet.png differ diff --git a/experiment/simulation/EE4/src/images/temp/component_register.png b/experiment/simulation/EE4/src/images/temp/component_register.png new file mode 100644 index 0000000..abfc8c2 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/component_register.png differ diff --git a/experiment/simulation/EE4/src/images/temp/full_circuit.png b/experiment/simulation/EE4/src/images/temp/full_circuit.png new file mode 100644 index 0000000..82a7322 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/full_circuit.png differ diff --git a/experiment/simulation/EE4/src/images/temp/full_circuit2.png b/experiment/simulation/EE4/src/images/temp/full_circuit2.png new file mode 100644 index 0000000..e546fb1 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/full_circuit2.png differ diff --git a/experiment/simulation/EE4/src/images/temp/graph2_arrow.png b/experiment/simulation/EE4/src/images/temp/graph2_arrow.png new file mode 100644 index 0000000..841a8b7 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/graph2_arrow.png differ diff --git a/experiment/simulation/EE4/src/images/temp/part_2_circuit.png b/experiment/simulation/EE4/src/images/temp/part_2_circuit.png new file mode 100644 index 0000000..6095e94 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/part_2_circuit.png differ diff --git a/experiment/simulation/EE4/src/images/temp/part_2_graph_1.png b/experiment/simulation/EE4/src/images/temp/part_2_graph_1.png new file mode 100644 index 0000000..c9cc17a Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/part_2_graph_1.png differ diff --git a/experiment/simulation/EE4/src/images/temp/part_2_graph_2.png b/experiment/simulation/EE4/src/images/temp/part_2_graph_2.png new file mode 100644 index 0000000..1e83ca9 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/part_2_graph_2.png differ diff --git a/experiment/simulation/EE4/src/images/temp/part_2_graph_3.png b/experiment/simulation/EE4/src/images/temp/part_2_graph_3.png new file mode 100644 index 0000000..a4ec0bf Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/part_2_graph_3.png differ diff --git a/experiment/simulation/EE4/src/images/temp/part_2_graph_empty.png b/experiment/simulation/EE4/src/images/temp/part_2_graph_empty.png new file mode 100644 index 0000000..1540f5b Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/part_2_graph_empty.png differ diff --git a/experiment/simulation/EE4/src/images/temp/part_3_graph_arrow.png b/experiment/simulation/EE4/src/images/temp/part_3_graph_arrow.png new file mode 100644 index 0000000..d56101d Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/part_3_graph_arrow.png differ diff --git a/experiment/simulation/EE4/src/images/temp/part_3_option_1.png b/experiment/simulation/EE4/src/images/temp/part_3_option_1.png new file mode 100644 index 0000000..c5377ac Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/part_3_option_1.png differ diff --git a/experiment/simulation/EE4/src/images/temp/part_3_option_2.png b/experiment/simulation/EE4/src/images/temp/part_3_option_2.png new file mode 100644 index 0000000..506a3d7 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/part_3_option_2.png differ diff --git a/experiment/simulation/EE4/src/images/temp/part_3_option_3.png b/experiment/simulation/EE4/src/images/temp/part_3_option_3.png new file mode 100644 index 0000000..7477cf2 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/part_3_option_3.png differ diff --git a/experiment/simulation/EE4/src/images/temp/part_3_option_4.png b/experiment/simulation/EE4/src/images/temp/part_3_option_4.png new file mode 100644 index 0000000..d196120 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/part_3_option_4.png differ diff --git a/experiment/simulation/EE4/src/images/temp/part_3_option_4_graph.png b/experiment/simulation/EE4/src/images/temp/part_3_option_4_graph.png new file mode 100644 index 0000000..1a9c6b4 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/part_3_option_4_graph.png differ diff --git a/experiment/simulation/EE4/src/images/temp/record_btn.png b/experiment/simulation/EE4/src/images/temp/record_btn.png new file mode 100644 index 0000000..4d621f0 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/record_btn.png differ diff --git a/experiment/simulation/EE4/src/images/temp/right_tick.png b/experiment/simulation/EE4/src/images/temp/right_tick.png new file mode 100644 index 0000000..9d81e00 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/right_tick.png differ diff --git a/experiment/simulation/EE4/src/images/temp/run_btn.png b/experiment/simulation/EE4/src/images/temp/run_btn.png new file mode 100644 index 0000000..5a52c7a Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/run_btn.png differ diff --git a/experiment/simulation/EE4/src/images/temp/temp23/formulas_component_stress.png b/experiment/simulation/EE4/src/images/temp/temp23/formulas_component_stress.png new file mode 100644 index 0000000..5a1d148 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/temp23/formulas_component_stress.png differ diff --git a/experiment/simulation/EE4/src/images/temp/temp23/formulas_efficiency.png b/experiment/simulation/EE4/src/images/temp/temp23/formulas_efficiency.png new file mode 100644 index 0000000..c776c78 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/temp23/formulas_efficiency.png differ diff --git a/experiment/simulation/EE4/src/images/temp/temp23/formulas_ideal.png b/experiment/simulation/EE4/src/images/temp/temp23/formulas_ideal.png new file mode 100644 index 0000000..adbd8bc Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/temp23/formulas_ideal.png differ diff --git a/experiment/simulation/EE4/src/images/temp/temp23/formulas_nomenclautre.png b/experiment/simulation/EE4/src/images/temp/temp23/formulas_nomenclautre.png new file mode 100644 index 0000000..affb964 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/temp23/formulas_nomenclautre.png differ diff --git a/experiment/simulation/EE4/src/images/temp/temp23/formulas_non_ideal.png b/experiment/simulation/EE4/src/images/temp/temp23/formulas_non_ideal.png new file mode 100644 index 0000000..a984e3d Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/temp23/formulas_non_ideal.png differ diff --git a/experiment/simulation/EE4/src/images/temp/temp23/formulas_procedure.png b/experiment/simulation/EE4/src/images/temp/temp23/formulas_procedure.png new file mode 100644 index 0000000..62e92eb Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/temp23/formulas_procedure.png differ diff --git a/experiment/simulation/EE4/src/images/temp/temp23/formulas_universal.png b/experiment/simulation/EE4/src/images/temp/temp23/formulas_universal.png new file mode 100644 index 0000000..40c4aec Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/temp23/formulas_universal.png differ diff --git a/experiment/simulation/EE4/src/images/temp/temp23/graph2_arrow.png b/experiment/simulation/EE4/src/images/temp/temp23/graph2_arrow.png new file mode 100644 index 0000000..841a8b7 Binary files /dev/null and b/experiment/simulation/EE4/src/images/temp/temp23/graph2_arrow.png differ diff --git a/experiment/simulation/EE4/src/images/template_imgs/arrow.png b/experiment/simulation/EE4/src/images/template_imgs/arrow.png new file mode 100644 index 0000000..6b13356 Binary files /dev/null and b/experiment/simulation/EE4/src/images/template_imgs/arrow.png differ diff --git a/experiment/simulation/EE4/src/images/template_imgs/blinkArrow.webp b/experiment/simulation/EE4/src/images/template_imgs/blinkArrow.webp new file mode 100644 index 0000000..db974c1 Binary files /dev/null and b/experiment/simulation/EE4/src/images/template_imgs/blinkArrow.webp differ diff --git a/experiment/simulation/EE4/src/images/template_imgs/blinkArrowRed.png b/experiment/simulation/EE4/src/images/template_imgs/blinkArrowRed.png new file mode 100644 index 0000000..afb6427 Binary files /dev/null and b/experiment/simulation/EE4/src/images/template_imgs/blinkArrowRed.png differ diff --git a/experiment/simulation/EE4/src/images/template_imgs/iit-delhi-logo.png b/experiment/simulation/EE4/src/images/template_imgs/iit-delhi-logo.png new file mode 100644 index 0000000..0806e3e Binary files /dev/null and b/experiment/simulation/EE4/src/images/template_imgs/iit-delhi-logo.png differ diff --git a/experiment/simulation/EE4/src/images/template_imgs/laerrow.png b/experiment/simulation/EE4/src/images/template_imgs/laerrow.png new file mode 100644 index 0000000..9bd9bea Binary files /dev/null and b/experiment/simulation/EE4/src/images/template_imgs/laerrow.png differ diff --git a/experiment/simulation/EE4/src/images/template_imgs/laerrow2.png b/experiment/simulation/EE4/src/images/template_imgs/laerrow2.png new file mode 100644 index 0000000..d69fb87 Binary files /dev/null and b/experiment/simulation/EE4/src/images/template_imgs/laerrow2.png differ diff --git a/experiment/simulation/EE4/src/images/template_imgs/logo.png b/experiment/simulation/EE4/src/images/template_imgs/logo.png new file mode 100644 index 0000000..ec94212 Binary files /dev/null and b/experiment/simulation/EE4/src/images/template_imgs/logo.png differ diff --git a/experiment/simulation/EE4/src/images/template_imgs/man.png b/experiment/simulation/EE4/src/images/template_imgs/man.png new file mode 100644 index 0000000..e2b1673 Binary files /dev/null and b/experiment/simulation/EE4/src/images/template_imgs/man.png differ diff --git a/experiment/simulation/EE4/src/images/template_imgs/measurearrow.png b/experiment/simulation/EE4/src/images/template_imgs/measurearrow.png new file mode 100644 index 0000000..cbd8709 Binary files /dev/null and b/experiment/simulation/EE4/src/images/template_imgs/measurearrow.png differ diff --git a/experiment/simulation/EE4/src/images/template_imgs/measurearrow2.png b/experiment/simulation/EE4/src/images/template_imgs/measurearrow2.png new file mode 100644 index 0000000..cbd8709 Binary files /dev/null and b/experiment/simulation/EE4/src/images/template_imgs/measurearrow2.png differ diff --git a/experiment/simulation/EE4/src/images/template_imgs/prof_image_kn_jha.jpeg b/experiment/simulation/EE4/src/images/template_imgs/prof_image_kn_jha.jpeg new file mode 100644 index 0000000..a4c5860 Binary files /dev/null and b/experiment/simulation/EE4/src/images/template_imgs/prof_image_kn_jha.jpeg differ diff --git a/experiment/simulation/EE4/src/images/template_imgs/redsize.png b/experiment/simulation/EE4/src/images/template_imgs/redsize.png new file mode 100644 index 0000000..f6c8d4b Binary files /dev/null and b/experiment/simulation/EE4/src/images/template_imgs/redsize.png differ diff --git a/experiment/simulation/EE4/src/images/template_imgs/restart_btn.png b/experiment/simulation/EE4/src/images/template_imgs/restart_btn.png new file mode 100644 index 0000000..ed885ad Binary files /dev/null and b/experiment/simulation/EE4/src/images/template_imgs/restart_btn.png differ diff --git a/experiment/simulation/EE4/src/images/template_imgs/speech_off_btn.png b/experiment/simulation/EE4/src/images/template_imgs/speech_off_btn.png new file mode 100644 index 0000000..3605745 Binary files /dev/null and b/experiment/simulation/EE4/src/images/template_imgs/speech_off_btn.png differ diff --git a/experiment/simulation/EE4/src/images/template_imgs/speech_on_btn.png b/experiment/simulation/EE4/src/images/template_imgs/speech_on_btn.png new file mode 100644 index 0000000..de93bb3 Binary files /dev/null and b/experiment/simulation/EE4/src/images/template_imgs/speech_on_btn.png differ diff --git a/experiment/simulation/EE4/src/images/template_imgs/talk_cloud.png b/experiment/simulation/EE4/src/images/template_imgs/talk_cloud.png new file mode 100644 index 0000000..15a36cd Binary files /dev/null and b/experiment/simulation/EE4/src/images/template_imgs/talk_cloud.png differ diff --git a/experiment/simulation/EE4/temp2.txt b/experiment/simulation/EE4/temp2.txt new file mode 100644 index 0000000..9734d3e --- /dev/null +++ b/experiment/simulation/EE4/temp2.txt @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + +part_1_1_instruction:this.allImgsDom[index++], +part_1_1_nomenclature:this.allImgsDom[index++], +part_1_1_procedure:this.allImgsDom[index++], +part_1_2_instruction:this.allImgsDom[index++], +part_1_2_nomenclature:this.allImgsDom[index++], +part_1_2_procedure:this.allImgsDom[index++], +part_2_instruction:this.allImgsDom[index++], +part_2_nomenclature:this.allImgsDom[index++], +part_2_procedure:this.allImgsDom[index++], +part_3_nomenclature:this.allImgsDom[index++], +part_3_procedure:this.allImgsDom[index++], + + +part_1_1_instruction : new Dom("part_1_1_instruction"), +part_1_1_nomenclature : new Dom("part_1_1_nomenclature"), +part_1_1_procedure : new Dom("part_1_1_procedure"), +part_1_2_instruction : new Dom("part_1_2_instruction"), +part_1_2_nomenclature : new Dom("part_1_2_nomenclature"), +part_1_2_procedure : new Dom("part_1_2_procedure"), +part_2_instruction : new Dom("part_2_instruction"), +part_2_nomenclature : new Dom("part_2_nomenclature"), +part_2_procedure : new Dom("part_2_procedure"), +part_3_nomenclature : new Dom("part_3_nomenclature"), +part_3_procedure : new Dom("part_3_procedure"), diff --git a/experiment/simulation/EE4/toolkit/btn_download.png b/experiment/simulation/EE4/toolkit/btn_download.png new file mode 100644 index 0000000..6873ade Binary files /dev/null and b/experiment/simulation/EE4/toolkit/btn_download.png differ diff --git a/experiment/simulation/EE4/toolkit/fix_styling.css b/experiment/simulation/EE4/toolkit/fix_styling.css new file mode 100644 index 0000000..b3dc4a7 --- /dev/null +++ b/experiment/simulation/EE4/toolkit/fix_styling.css @@ -0,0 +1,15 @@ +body{ + justify-content: unset; +} + +.right-box{ + margin-left: 0; +} + +.main-container{ + margin: auto; +} + +.right-container{ + width: unset; +} diff --git a/experiment/simulation/EE4/toolkit/main_spinner.css b/experiment/simulation/EE4/toolkit/main_spinner.css new file mode 100644 index 0000000..645e96e --- /dev/null +++ b/experiment/simulation/EE4/toolkit/main_spinner.css @@ -0,0 +1,173 @@ +:root { + --light-color: #c9bafc; + --mid-color: #9f91cc; + --dark-color: #3d246c; + --size: 30; + --trans: ease; + } + + .main-spinner { + display: none; + top: 50%; + left: 50%; + transform: translate(-50%,-63%); + width: calc(var(--size) * 1vmin); + height: calc(var(--size) * 1vmin); + position: fixed; + } + + .main-spinner:before { + content: ""; + background: var(--mid-color); + width: 50%; + height: 50%; + position: absolute; + left: 0%; + top: 0%; + transform-origin: right bottom; + animation: shadow 4s var(--trans) 0s infinite; + } + + .main-spinner:after { + content: ""; + background: var(--mid-color); + width: 33.33%; + height: 33.33%; + position: absolute; + left: 50%; + top: 16.66%; + transform-origin: left bottom; + animation: shadow 4s var(--trans) 1s infinite; + transform: scale(0); + z-index: -1; + } + + .main-spinner .loader { + width: calc(var(--size) * 0.5vmin); + height: calc(var(--size) * 0.5vmin); + background: var(--dark-color); + transform-origin: right bottom; + animation: outer 4s var(--trans) 0s infinite; + position: relative; + } + + .main-spinner .loader span { + width: 50%; + height: 50%; + display: block; + background: var(--light-color); + transform-origin: right bottom; + animation: inner 1s ease-in-out 0.5s infinite; + top: 50%; + left: 50%; + position: absolute; + } + + .main-spinner a { + position: absolute; + font-size: 1.5vmin; + text-shadow: 0 0px 0 #000; + bottom: 5vmin; + font-family: Arial, Helvetica, serif; + text-decoration: none; + background: #111; + color: #fff; + padding: 1.25vmin 1.5vmin; + text-transform: uppercase; + } + + .main-spinner a:hover { + background: #999; + color: #222; + text-shadow: -1px 0px 0 #fff8; + } + + .main-spinner a span { + color: #454545; + } + + .main-spinner .text{ + display: none; + left: 50%; + top: 50%; + transform: translate(-50%, -66%); + padding: 7px; + width: 700px; + position: relative; + text-align: center; + z-index: 10; + font-size: 18px; + } + + .main-spinner .text span{ + line-height: 1.4; + color: #500051; + padding: 0 5px; + border-radius: 6px; + background-color: #6b6b6b42; + /* font-style: italic; */ + font-weight: bold; + } + + @keyframes outer { + 0% { + transform: rotate(0deg) scale(1); + } + 12.5% { + transform: rotate(90deg) scale(1); + } + 25% { + transform: rotate(90deg) scale(0.75); + } + 37.5% { + transform: rotate(180deg) scale(0.75); + } + 50% { + transform: rotate(180deg) scale(0.5); + } + 62.5% { + transform: rotate(270deg) scale(0.5); + } + 75% { + transform: rotate(270deg) scale(0.25); + } + 87.5% { + transform: rotate(360deg) scale(0.25); + } + 100% { + transform: rotate(360deg) scale(1); + } + } + + @keyframes inner { + 50%, + 100% { + transform: rotate(360deg); + } + } + + @keyframes shadow { + 0%, + 8.25% { + transform: scale(0); + } + 16.5% { + transform: scale(1); + } + 49.5% { + transform: scale(0); + } + 50% { + transform: scale(0) rotate(180deg); + } + 50.5%, + 58.25% { + transform: scale(0) rotate(180deg); + } + 66.5% { + transform: scale(0.5) rotate(180deg); + } + 100% { + transform: scale(0) rotate(180deg); + } + } \ No newline at end of file diff --git a/experiment/simulation/EE4/toolkit/msg_download.png b/experiment/simulation/EE4/toolkit/msg_download.png new file mode 100644 index 0000000..fec5de6 Binary files /dev/null and b/experiment/simulation/EE4/toolkit/msg_download.png differ diff --git a/experiment/simulation/EE4/toolkit/setBlinkArrowYellow.png b/experiment/simulation/EE4/toolkit/setBlinkArrowYellow.png new file mode 100644 index 0000000..3715942 Binary files /dev/null and b/experiment/simulation/EE4/toolkit/setBlinkArrowYellow.png differ diff --git a/experiment/simulation/EE4/toolkit/toolkit.css b/experiment/simulation/EE4/toolkit/toolkit.css new file mode 100644 index 0000000..b70be09 --- /dev/null +++ b/experiment/simulation/EE4/toolkit/toolkit.css @@ -0,0 +1,150 @@ +/* ! Download Button CSS */ +/* print css */ +@media print { + * { + -webkit-print-color-adjust: exact !important; /* Chrome, Safari 6 – 15.3, Edge */ + color-adjust: exact !important; /* Firefox 48 – 96 */ + print-color-adjust: exact !important; /* Firefox 97+, Safari 15.4+ */ + } + body{ + background-color: white!important; + } + .main-container{ + scale: 1!important; + transform: none!important; + } + + #drawer, + .toolkit, + .progressbar, + .blinkArrow + .blinkArrowRed{ + display: none!important; + visibility: hidden; + } + .anime-header, .anime-footer{ + display: flex!important; + } + .main-window{ + border-radius: 10px; + } + @page { + size: landscape; + } +} + +body{ + /* height: 100vh; */ +} +/* ! Toolkit */ +.toolkit{ + width: 60px; + position: relative; + top: 34px; + background-color: #3d246c; + height: 604px; + /* border-right: 2px solid black; + border-top: 2px solid black; */ + border-top-right-radius: 10px; + border-bottom-right-radius: 10px; +} +.toolkit .btn-group{ + margin: 1px; + padding: 10px; + display: flex; + flex-direction: column; + justify-content: flex-end; + height: 100%; + gap: 10px; +} +.toolkit .btn{ + display: flex; + justify-content: center; + align-items: center; + width: 40px; + height: 40px; + padding: 7px; + margin: 0; +} +.toolkit .btn .title{ + position: absolute; + visibility: hidden; +} +.toolkit .btn-logo{ + height: 20px; + width: 20px; +} +.toolkit +/* for only mute btn */ +.toolkit .mute { + padding: 0; +} +.toolkit .mute img{ + width: 40px; + height: 40px; + padding: 10px; +} +.toolkit .msg-download{ + +} +/* .toolkit .btn:hover .title{ + visibility: visible; + position: relative; +} */ + +/* ! Adding border to containers */ +.main-window{ + border: none; + /* border-left: 2px solid black; + border-top: 2px solid black; + border-bottom: 2px solid black; */ + border-top-left-radius: 10px; + border-bottom-left-radius: 10px; + z-index: 10000; +} + +.anime-footer{ + background-color: #3d246c!important; +} +.toolkit{ + z-index: 9000; +} +.toolkit, .main-window{ + box-shadow: 0px 0px 20px -1px black; +} + +.border-right-radius{ + border-top-right-radius: 10px; + border-bottom-right-radius: 10px; +} +.toolkit .blinkArrowYellow{ + display: none; + height: 30px; + position: absolute; + bottom: 60px; + left: 12px; + rotate: 90deg; +} + +/* ! Universal CSS */ +*{ + user-select: none; +} + +img{ + user-drag: none; + -webkit-user-drag: none; + user-select: none; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; +} + +body{ + background-color: #f8f9fa; +} + +#drawer{ + background-color: #ffffff; +} + diff --git a/experiment/simulation/EE4/toolkit/toolkit.js b/experiment/simulation/EE4/toolkit/toolkit.js new file mode 100644 index 0000000..4998f69 --- /dev/null +++ b/experiment/simulation/EE4/toolkit/toolkit.js @@ -0,0 +1,282 @@ +// Define the function +// to screenshot the div + +const Download = { + btnDownload: null, + btnMute: null, + isMobileUser: false, + isSpinnerVisible: false, + btnDownloadBlinkAnime: null, + isBtnDownloadClicked: false, + mainContainerHeight: 638, + spinnerTimeoutSeconds: 2000, + checkForStepEndIntervalId: null, + previousRealCurrentStep: null, + // 1 step aage + // removeDownloadFromTheseSteps: [], + addDownloadToTheseSteps: [4], + init() { + this.setOnClicks(); + this.showTookitForCurrentStep(); + this.setBtnDownloadBlink(); + this.checkForStepEnd(); + this.stopImageDrag(); + this.disableRightClick(); + this.setBtnMuteOnClick(); + this.detectMobileUser(); + this.detectZoomLevel() + // TODO UNCOMMENT + this.setHeightOfMainContainerAuto(); + }, + setOnClicks() { + this.btnDownload = document.querySelector(".btn-download-pdf"); + this.btnMute = document.querySelector(".btn-mute"); + + this.btnDownload.onclick = this.capture; + }, + capture() { + window.print(); + Download.setBlinkArrowYellow(-1) + }, + showTookitForCurrentStep() { + $(".toolkit").hide(); + + let intervalForCheck = null; + const checkForCurrentStepChange = () => { + // ! don't try to understand (this is working) + // * add download to these + if (this.addDownloadToTheseSteps.indexOf(Scenes.realCurrentStep) != -1) { + // clearInterval(intervalForCheck) + $(".toolkit").show("slow"); + $(".main-window").removeClass("border-right-radius"); + } else { + $(".toolkit").hide("slow"); + $(".main-window").addClass("border-right-radius"); + } + }; + + intervalForCheck = setInterval(() => { + checkForCurrentStepChange(); + }, 1000); + }, + checkForStepEnd() { + if(this.checkForStepEndIntervalId != null){ + return + } + + this.checkForStepEndIntervalId = setInterval(() => { + if(this.previousRealCurrentStep == Scenes.realCurrentStep){ + return + } + if ( + this.addDownloadToTheseSteps.indexOf(Scenes.realCurrentStep) != -1 && + !isRunning + ) { + // * For running it only one time + this.setBlinkArrowYellow(true, 12, 495).play(); + this.btnDownloadBlinkAnime.play(); + this.previousRealCurrentStep = Scenes.realCurrentStep + } + + }, 1000); + }, + playDownloadButtonAnime(){ + // ! for remoging check for step end + if(!this.checkForStepEndIntervalId){ + clearInterval(this.checkForStepEndIntervalId) + } + + // * For running it only one time + this.setBlinkArrowYellow(true, 12, 495).play(); + this.btnDownloadBlinkAnime.play(); + setTimeout(() => { + this.setBlinkArrowYellow(-1) + }, 4000); + }, + setBlinkArrowYellow( + isX = true, + left = null, + top = null, + height = 30, + width = null, + rotate = 0 + ) { + let blinkArrow = new Dom(".blinkArrowYellow") + .set(left, top, height, width) + .rotate(rotate) + .zIndex(10000); + if (isX === -1) { + blinkArrow.hide(); + return; + } + let x = 0, + y = 0; + if (isX) { + x = 20; + } else { + y = 20; + } + var blink = anime({ + targets: blinkArrow.item, + easing: "easeInOutQuad", + opacity: 1, + translateX: x, + translateY: y, + direction: "alternate", + loop: true, + autoplay: false, + duration: 300, + }); + + return blink; + }, + setBtnDownloadBlink() { + this.btnDownloadBlinkAnime = anime({ + targets: this.btnDownload, + autoplay: false, + scale: [1, 1.2], + backgroundColor: ["#ffdbc3", "#fff000"], + loop: 4, + duration: 1000, + direction: 'alternate', + complete(anim) { + anim.reset(); + }, + }); + }, + stopImageDrag() { + $("img").on("dragstart", function (event) { + event.preventDefault(); + }); + }, + disableRightClick() { + document.addEventListener("contextmenu", (event) => event.preventDefault()); + }, + setBtnMuteOnClick() { + const btn_mute_old_functionality = () => { + this.btnMute.onclick; + }; + this.btnMute.onclick = () => { + btn_mute_old_functionality(); + window.speechSynthesis.cancel(); + }; + }, + detectMobileUser() { + let ratio = window.innerWidth / window.innerHeight; + if (ratio <= 1) { + this.isMobileUser = true; + } + // alert(`h: ${window.innerHeight}\nw: ${window.innerWidth}`) + }, + // ! set main-container height according to display + setHeightOfMainContainerAuto() { + // ! for mobile resising using width + if (this.isMobileUser) { + return; + } + const windowInnerHeight = parseFloat(window.innerHeight); + const mainContainerHeight = this.mainContainerHeight + let scalePercent = windowInnerHeight / mainContainerHeight; + let translateYValue = + (windowInnerHeight - mainContainerHeight) / 2 / scalePercent; + + // ! scale maxed up to 2x + if(scalePercent > 2){ + scalePercent = 2 + translateYValue = 160.4 + } + + // alert(scalePercent) + document.querySelector( + ".main-container" + ).style.transform = `scale(${scalePercent}) translateY(${translateYValue}px)`; + }, + toggleSpinner() { + $(".main-spinner").show(); + $(".main-container").hide(); + + setTimeout(() => { + $(".main-container").show("slow"); + $(".main-spinner").hide("slow"); + }, this.spinnerTimeoutSeconds); + }, + detectZoomLevel() { + var screenCssPixelRatio = (window.outerWidth - 8) / window.innerWidth; + let zoomLevel = "" + if (screenCssPixelRatio >= 0.46 && screenCssPixelRatio <= 0.54) { + zoomLevel = "-4"; + } else if (screenCssPixelRatio <= 0.64) { + zoomLevel = "-3"; + } else if (screenCssPixelRatio <= 0.76) { + zoomLevel = "-2"; + } else if (screenCssPixelRatio <= 0.92) { + zoomLevel = "-1"; + } else if (screenCssPixelRatio <= 1.1) { + zoomLevel = "0"; + } else if (screenCssPixelRatio <= 1.32) { + zoomLevel = "1"; + } else if (screenCssPixelRatio <= 1.58) { + zoomLevel = "2"; + } else if (screenCssPixelRatio <= 1.9) { + zoomLevel = "3"; + } else if (screenCssPixelRatio <= 2.28) { + zoomLevel = "4"; + } else if (screenCssPixelRatio <= 2.7) { + zoomLevel = "5"; + } else { + zoomLevel = "unknown"; + } + //! if zoom not 100% just show message warning + if(zoomLevel != "0" && !this.isMobileUser){ + $(".main-spinner .text").show(); + this.spinnerTimeoutSeconds = 5000 + } + if(this.isMobileUser){ + $(".main-spinner .text").show(); + $(".main-spinner .text").html("For better user experience use
    🖥️ Desktop Site and"); + this.spinnerTimeoutSeconds = 5000 + } + // alert(zoomLevel) + }, +}; + +setTimeout(() => { + // $(".main-container").hide(); +}, 100); + +$(document).ready(function () { + // TODO uncomment + Download.init(); + // Download.toggleSpinner() + + window.onbeforeprint = () => { + Dom.setBlinkArrowRed(-1); + Dom.setBlinkArrow(-1); + }; +}); + +// * image converter +// capture() { +// let div = document.querySelector(".main-container"); + +// // Use the html2canvas +// // function to take a screenshot +// // and append it +// // to the output div +// html2canvas(div).then(function (canvas) { +// // document.getElementById("output").appendChild(canvas); + +// let image = canvas +// .toDataURL("image/png") +// .replace("image/png", "image/octet-stream"); +// console.log(canvas.toDataURL("image/png")) + +// // location.href = image + +// var a = document.createElement('a') +// a.href = image +// a.download = "Experiment.jpeg" + +// a.click() +// }); +// }, diff --git a/experiment/simulation/EE5/.vscode/settings.json b/experiment/simulation/EE5/.vscode/settings.json new file mode 100644 index 0000000..586f57c --- /dev/null +++ b/experiment/simulation/EE5/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "liveServer.settings.port": 5507 +} \ No newline at end of file diff --git a/experiment/simulation/EE5/css/EE4_styling.css b/experiment/simulation/EE5/css/EE4_styling.css new file mode 100644 index 0000000..f4136c0 --- /dev/null +++ b/experiment/simulation/EE5/css/EE4_styling.css @@ -0,0 +1,88 @@ +.connections-box{ + border: solid 1px black; + display: flex; + width: 504px; + position: absolute; + z-index: 100; + } + .connections-box .btn-box span{ + padding: 5px 10px; + font-weight: bold; + font-size: 16px; + } + .connections-box .head{ + background-color: #ffc000; + width: 70px!important; + } + .connections-box .btn-box{ + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + padding: 0; + width: 44px; + border-radius: none; + cursor: pointer; + } + .connections-box .middle-border{ + border-bottom: 2px solid; + width: 525px; + top: 30px; + position: absolute; + } + + .part_2_connections_box{ + display: none; + } + + .part_1_1_connections_box{ + display: none; + width: auto; + } + .part_1_1_connections_box .middle-border{ + width: 505px; + } + + .part_1_2_connections_box{ + display: none; + } + + +/* Table style */ +.table{ + display: none; + position: absolute; + border: 1px solid black; + border-collapse: collapse; +} + +.table td, .table th { + height: 25px; + padding: 0 20px; + font-weight: bold; + text-align: center; + border: 1px solid black; +} + +.part_2_table th{ + background-color: #002060; + color: white; +} + +/* part3 table */ +.part3_table_two{ + width: 430px; +} + +.part3_table_two th, +.part3_table_two td +{ + width: 73px!important; + font-size: 13px; + padding: 0!important; +} + +.part3_table_two th{ + font-size: 15px!important; + height: 15px!important; +} diff --git a/experiment/simulation/EE5/css/certificate.css b/experiment/simulation/EE5/css/certificate.css new file mode 100644 index 0000000..6fbf347 --- /dev/null +++ b/experiment/simulation/EE5/css/certificate.css @@ -0,0 +1,72 @@ +@import url("https://fonts.googleapis.com/css?family=Open+Sans|Pinyon+Script|Rochester|Homemade+Apple"); + +.certificate { + position: absolute; + box-shadow: inset 0px 0px 20px 12px #3d246c; + min-width: 800px; + min-height: 400px; + border: 14px solid #3d246c; + flex-direction: column; + display: none; + padding-top: 35px; +} + +.certificate .header { + transform: translateY(-25px); + display: flex; + align-items: center; + flex-direction: column; +} + +.certificate .student-detail { + display: flex; + flex-direction: column; + gap: 5px; + align-items: center; +} + +.cursive { + font-size: 1.8rem; + font-family: "Pinyon Script", cursive !important; + font-family: "Rochester", cursive !important; + font-style: italic; + /* font-family: "Homemade Apple", cursive !important; */ +} + +.certificate hr { + width: 90%; +} + +.sans { + font-family: "Open Sans", sans-serif; + text-align: center; +} + +.title {} + +.bold { + font-weight: bold; +} + +.red{ + color: red; +} + +.certificate .logo { + height: 80px; + /* transform: translateY(-25px); */ +} + +.certificate .row { + display: flex; + flex-direction: column; +} + +.btn-save{ + display: none; +} + +.certificate #certificateStuName{ + font-size: 1.8rem; + border-bottom: 2px solid black; +} \ No newline at end of file diff --git a/experiment/simulation/EE5/css/chart.css b/experiment/simulation/EE5/css/chart.css new file mode 100644 index 0000000..2fab3e3 --- /dev/null +++ b/experiment/simulation/EE5/css/chart.css @@ -0,0 +1,15 @@ +.chart { + display: none; + position: absolute; + padding: 10px; + width: fit-content; + border-radius: 20px; + box-shadow: 3px 3px 12px 0px; + height: 220px !important; + width: 364px !important; +} + +.chart #myChart { + height: 100%!important; + width: 100%!important; +} \ No newline at end of file diff --git a/experiment/simulation/EE5/css/component_styling.css b/experiment/simulation/EE5/css/component_styling.css new file mode 100644 index 0000000..20fd843 --- /dev/null +++ b/experiment/simulation/EE5/css/component_styling.css @@ -0,0 +1,637 @@ +@font-face { + font-family: "Cosmic Sans MS"; + src: url(../fonts/ComicSansMS3.ttf); +} + +.qs{ + cursor: pointer; + display: none; + position: absolute; + /* display: flex; */ + text-align: center; + box-shadow: 1px 1px 5px lime; + border-radius: 10px; + font-size: 3.5em; + font-weight: bolder; + color: white; + height: 70px; + width: 70px; + background-color: #05bc57; + justify-content: center; + align-items: center; + align-content: center; +} + +/* * Slider */ +.slider-box{ + /* display: none; */ + position: absolute; + /* user-select: none; */ + } + + +/* table styling */ + +/* part3 table one */ +.part3_table_one{ + display: none; + bottom: 0px; + position: absolute; + right: 10px; + text-align: center; + gap: 20px; + border-collapse: collapse; +} +.part3_table_one td,tr,th{ + border: 1px solid black; +} +.part3_table_one thead{ + background-color: #0000cc; + color: white; +} +.part3_table_one thead tr th{ + width: 64px; +} +.part3_table_one tbody tr{ + height: 29px; +} +.part3_table_one td{ + text-align: center; + font-weight: bold; + width: 100px; + font-size: 1.2em; + padding: 0; + margin: 0; +} +.part3_table_one th{ + font-size: 1.2em; +} +.part3_table_one tbody tr:nth-child(2n){ + background-color: #eaeff7; +} +.part3_table_one tbody tr:nth-child(2n+1){ + background-color: #d2deef; +} +/* +.part3_table_one td:nth-child(2){ + background-color: rgb(194, 194, 194); +} +.part3_table_one td:nth-child(3){ + background-color: rgb(194, 194, 194); +} +.part3_table_one td:nth-child(4){ + background-color: rgb(194, 194, 194); */ +/* } */ +/* .part3_table_one td:nth-child(10){ + background-color: #ffff00; +} +.part3_table_one td:nth-child(11){ + background-color: #ffc000; +} */ + +/* part table two */ +.part3_table_two{ + display: none; + position: absolute; + right: 10px; + width: 500px; + text-align: center; + border-collapse: collapse; +} +.part3_table_two td,tr,th{ + border: 1px solid black; +} +.part3_table_two thead{ + /* background-color: #0000cc; */ + background-color: #660066; + color: white; +} +.part3_table_two thead tr th{ + width: 10px; + font-size: 16px; + padding: 0; + height: 60px; +} + +.part3_table_two tbody tr{ + height: 20px; +} +.part3_table_two td{ + text-align: center; + font-weight: bold; + width: 10px; + font-size: 16px; + padding: 0 14px!important; + margin: 0; +} +/* .part3_table_two tbody tr:nth-child(2n){ + background-color: #eaeff7; +} +.part3_table_two tbody tr:nth-child(2n+1){ + background-color: #d2deef; +} */ +.part3_table_two.v0-bg td:nth-child(5){ + background-color: rgb(194, 194, 194); +} +.part3_table_two.v0-bg td:nth-child(6){ + background-color: rgb(194, 194, 194); +} +.part3_table_two.m-bg td:nth-child(7){ + background-color: rgb(194, 194, 194); +} +.part3_table_two.m-bg td:nth-child(8){ + background-color: rgb(194, 194, 194); +} +.part3_table_two.iIn-bg td:nth-child(9){ + background-color: rgb(194, 194, 194); +} +.part3_table_two.iIn-bg td:nth-child(10){ + background-color: rgb(194, 194, 194); +} + + +/* part3 table three */ +.part3_table_three{ + width: 1000px; + display: none; + bottom: 0px; + position: absolute; + right: 10px; + text-align: center; + gap: 20px; + border-collapse: collapse; +} +.part3_table_three td,tr,th{ + border: 1px solid black; +} +.part3_table_three thead{ + background-color: #0000cc; + color: white; +} +.part3_table_three thead tr th{ + width: 426px; +} +.part3_table_three tbody tr{ + height: 29px; +} +.part3_table_three td{ + text-align: center; + font-weight: bold; + width: 426px; + font-size: 1.2em; + padding: 0; + margin: 0; +} +.part3_table_three th{ + font-size: 1.2em; +} +.part3_table_three tbody tr:nth-child(2n){ + background-color: #eaeff7; +} +.part3_table_three tbody tr:nth-child(2n+1){ + background-color: #d2deef; +} +/* +.part3_table_three td:nth-child(2){ + background-color: rgb(194, 194, 194); +} +.part3_table_three td:nth-child(3){ + background-color: rgb(194, 194, 194); +} +.part3_table_three td:nth-child(4){ + background-color: rgb(194, 194, 194); */ +/* } */ +/* .part3_table_three td:nth-child(10){ + background-color: #ffff00; +} +.part3_table_three td:nth-child(11){ + background-color: #ffc000; +} */ +/* table four */ + +.deactive{ + pointer-events: none; + cursor:not-allowed; + user-select: none; + opacity: 0.9; + box-shadow: none!important; +} +.disabled{ + pointer-events: none; + cursor:not-allowed; + user-select: none; + opacity: 0.9; + box-shadow: none!important; +} + +.graph_box{ + display: none; + padding: 0 0 22px 22px; + width: 377px; + height: 242px; + position: absolute; + right: 10px; + top: -75px; + box-sizing: border-box; + background-color: white; + border-radius: 20px; + box-shadow: 2px 2px 4px; +} + +.graph{ + /* background-color: white; */ + padding: 5px; + /* background-color: #202020; */ + display: none; +} + +/* ! Next Btn Deactive class */ +.btn-deactive{ + transition: 1s; + opacity: 0.7; + cursor: not-allowed; + background-color: rgb(97, 97, 97)!important ; + box-shadow: none!important; + color: black; + pointer-events: none; +} + +.btn-deactive:hover { + box-shadow: none!important; +} + +.btn-deactive:active{ + opacity: none!important; + transform: none!important; +} + +/* * Part 3 table two btns */ +.btn-box1 button{ + background-color: #0000ff; +} + +.btn-box2 button{ + background-color: #d26315; +} +.btn-box3 button{ + background-color: #5d8c3b; +} + +.table-btn{ + color: white; + position: relative; + width: 31.5%; + padding: 5px; + font-size: 1.2em; + font-weight: bold; + z-index: 1000; + border-radius: 10px; + cursor: pointer; + border: 2px solid black +} +.table-btn:hover{ + border-color: white; + transition: 0.2s; +} +.table-btn:active{ + transition: 0s; + border-color: black; + background-color: black; +} + +/* ! Delte reset */ +.btn-delete{ + background-color: #05056f; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; + border-radius: 20px; + font-size: 1.25em; + padding: 12px 7px; + width: 90px; + /* top: 360px; + left: 10px; */ + +} + +.btn-reset{ + background-color: #5d8c3b; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; + border-radius: 20px; + font-size: 1.25em; + padding: 12px 7px; + width: 90px; + /* top: 360px; + left: 120px; */ + +} +.btn-record{ + background-color: #975f52; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; + border-radius: 20px; + font-size: 1.25em; + padding: 12px 0px; + width: 90px; + /* top: 360px; + left: 120px; */ + +} + +/* ! check connection and circuit diagram btn */ +.btn-check-connections{ + background-color: #d26315!important; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; +} + +.btn-circuit-diagram{ + background-color: #7937aa!important; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; +} + +/* ! check reset hint btn for ee3 */ + +.ee3-btn-check{ + background-color: #814141; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; + border-radius: 20px; +} +.ee3-btn-reset{ + background-color: #055794; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; + border-radius: 20px; + +} +.ee3-btn-hint{ + background-color: #385238; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; + border-radius: 20px; +} + + + +.bg-black{ + background-color: black!important; +} + +.theory{ + height: 495px; + width: 950px; + top: -46px; + left: 0; + z-index: 1001; +} + + +.btn-transparent{ + display: none; + position: absolute; + width: 64px; + height: 44px; + bottom: -95px; + right: 3px; + /* background-color: red; */ + z-index: 2001; +} +.btn-transparent { + display: none; + position: absolute; + /* width: 64px; */ + /* height: 48px; */ + bottom: -95px; + right: 1px; + /* background-color: red; */ + font-size: 1.2em; + z-index: 2001; + } + + + .btn-transparent:active { + box-shadow: #422800 2px 2px 0 0; + transform: translate(4px, 4px); + } + + /* Pop window */ + .btn-popup-box{ + display: flex; + position: relative; + left: 23px; + justify-content: center; + align-items: center; + /* background-color: rgba(0, 0, 0, 0.619); */ + padding: 0 2px; + height: 40px; + border-radius: 10px; + z-index: 5000; + } + + .btn-popup{ + padding: 8px 10px; + margin: 0 2px; + font-size: 17px; + font-weight: bold; + cursor:help; + transition: 0.1s; + border-radius: 20px; + box-shadow: 1px 1px 5px white; + } + + .btn-popup:nth-child(1){ + background-color: #8e4311; + } + .btn-popup:nth-child(2){ + background-color: #0505a4; + } + .btn-popup:nth-child(3){ + background-color: #3f5f29; + } + + .btn-popup:hover ~ .btn-popup-window{ + display: block!important; + } + .btn-popup:hover{ + scale: 0.94; + background-color: transparent; + } + + .btn-popup-window{ + display: none; + position: absolute; + left: -422px; + top: 39px; + width: 950px; + height: 495px; + z-index: 5001; + } + + .blur{ + display: none; + top: 45px; + z-index: 5000; + background-color: rgba(0, 0, 0, 0.389); + filter: blur(7px); + -webkit-filter: blur(7px); + } + + /* vertex */ + .vertex-box{ + display: none; + } + .vertex-box .vertex{ + /* display: none; */ + position: absolute; + /* background-color: black; + width: 20px; + height: 20px; + z-index: 2000; + color: white; + border-radius: 100vh; */ + /* left: 10px; + top: 20px; */ + } + + #vertex1{ + left: 124px; + top: 23px; +} + #vertex2{ + left: 124px; + top: 162px; +} +#vertex3{ + left: 205px; + top: 309px; +} +#vertex4{ + left: 341px; + top: 308px; +} +#vertex5{ + left: 684px; + top: 31px; +} + +#vertex6 { + left: 682px; + top: 181px; +} +#vertex7 { + left: 427px; + top: -16px; +} +#vertex8 { + left: 573px; + top: -16px; +} +#vertex9 { + left: 387px; + top: 307px; +} +#vertex10 { + left: 497px; + top: 307px; +} + +/* ! Added Font */ +.main-window{ + font-family: "Cosmic Sans MS"; +} + +/* !added cursor pointer to imgs */ +.ee3-imgs{ + cursor: pointer; +} + +/*! part1 boxes of ee3 exp */ + +.part1_box1{ + height: 90px; + width: 90px; + border-radius: 20px; + background-color: #f5f29e; + position: relative; + top: 75px; + left: -330px; + border: 1px solid #f5f29e; +} + +/* * concept dev */ + +.concept_development{ + display: none; +} + +/*! EE4 images */ +.ee4_imgs { + cursor: pointer; +} + +.exp-4 th{ + background-color: #ffc000; + color: #203864 ; +} + +.exp-4 { + border: 2px solid black; + /* width: fit-content; */ + /* gap: 20px; */ +} + +.exp-4 td{ + border-right: 2px solid black; + border-bottom: 2px solid black; +} +.part_1_table_1{ + position: absolute; + display: none; +} +.part_1_table_2{ + position: absolute; + display: none; +} + +.btn-disabled{ + color: gray; + box-shadow: none; + background-color: #f1f2f4; + user-select: none; + cursor: not-allowed; + /* pointer-events: none; */ + } + .btn-disabled:active{ + opacity: none!important; + transform: none!important; + } + .btn-disabled:hover{ + border: none; + box-shadow: none; + } \ No newline at end of file diff --git a/experiment/simulation/EE5/css/imgs.css b/experiment/simulation/EE5/css/imgs.css new file mode 100644 index 0000000..b0f5aae --- /dev/null +++ b/experiment/simulation/EE5/css/imgs.css @@ -0,0 +1,63 @@ +.anime-main{ + position: relative; + height: 404px; + width: 946px; + /* overflow: hidden!important; */ +} + +.markings{ + /* display: none; */ + opacity: 0; + height: 4.8px; + width: 38px; + height: 10px; + top: -30px; + left: 212px; + z-index: 5; + position: relative; + /* position: absolute; */ + /* visibility: hidden; */ + filter: brightness(0); +} + +.markings2{ + height: 25px; + z-index: 5; + position: relative; + left: -410px; + top: -57px; + opacity: 0; + display: none; +} +.markings3{ + height: 10px; + z-index: 9; + position: absolute; + left: 59px; + filter: brightness(0); + top: 120px; + opacity: 0; + display: none; +} +.main-window-imgs{ + display: none; + position: absolute; + +} +.blinkArrow{ + display: none; + filter:brightness(200); + position: absolute; + z-index: 2000; + +} +.blinkArrowRed{ + display: none; + position: absolute; + z-index: 2000; +} + +.main-window-videos{ + display: none; + position: absolute; +} diff --git a/experiment/simulation/EE5/css/layout.css b/experiment/simulation/EE5/css/layout.css new file mode 100644 index 0000000..ddcdb9b --- /dev/null +++ b/experiment/simulation/EE5/css/layout.css @@ -0,0 +1,399 @@ +/* #drawer */ +@import url('https://fonts.googleapis.com/css?family=Roboto&display=swap'); +body{ + margin: 0; + display: flex; + justify-content: center; + /* padding-top: 70px; */ + font-family: Roboto; +} +#drawer{ + font-family: Roboto,Noto,sans-serif; + min-width: 230px; + max-width: 230px; + padding: 10px; + background-color: #f8f9fa; + height: 638px; + overflow-y: auto; + grid-area: drawer; + grid-column-start: 1; +} + +#drawer ol{ + list-style: none; + margin: 0px auto !important; + padding: 0; +} + +#drawer ol li{ + display: flex; + justify-content: start; + align-items: center; + margin: 6px 0; + padding: 3px 10px; + min-height: 48px; + border-radius: 5px; + border: 1px solid rgb(218, 220, 224); + counter-increment: li-count; + opacity: 0.7; + line-height: 20px; + font-stretch: 100%; +} + +#drawer ol li a .step{ + display: flex; + justify-content: center; + align-items: center; +} +#drawer ol li a .step::before{ + content: counter(li-count); + display: flex; + justify-content: center; + align-items: center; + height: 26px; + min-width: 26px; + border-radius: 50%; + background-color: gray; + margin-right: 8px; + font-size: 14px; + font-weight: bold; + color: white; +} + +.right-container{ + /* overflow: hidden; */ + width: 100%; + display: flex; +} + +.active{ + box-shadow: 2px 2px 4px rgba(0,0,0,.15); + font-weight: bold!important; + opacity: 1!important; +} + +.active .step::before{ + background-color: #2b80ee!important; +} + +.completed{ + opacity: 1!important; + font-weight: 400; +} + +.completed .step::before{ + background-color: #2b80ee!important; +} + +/* Other */ +.main-container{ + display: flex; + /* gap: 25px; */ + /* display: grid; */ + /* grid-template-areas: "drawer progressBar" */ + /* "drawer mainWindow"; */ +} + +.main-window{ + background-color: #f1ece3; + position: relative; + grid-area: mainWindow; + display: flex; + flex-direction: column; + justify-content: space-between; + /* height: calc(100vh - 78px - 60px); */ + min-height: calc(404px + 200px); + width: 950px; + border: 2px solid; + overflow: hidden; +} + +.main-window .anime-header{ + display: flex; + justify-content: center; + align-items: center; + font-size: 2rem; + font-weight: bold; + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + height: 50px; + color: white; + background-color: #3D246C; +} +.main-window .anime-footer{ + display: flex; + align-items: center; + justify-content: space-between; + /* height: 70px; */ + height: 55px; + color: white; + background-color: #5C4B99; +} + +.right-box{ + display: flex; + margin-left: 1%; + flex-direction: column; + overflow: hiddenw1; +} + +.anime-footer .steps-subtitle{ + display: flex; + align-items: center; + gap: 10px; +} +.anime-footer .steps-subtitle .user-name{ + font-size: 1.05rem; + font-weight: bold; + background-color: #fff; + padding: 10px; + border-radius: 10px; +} +.anime-footer .steps-subtitle .subtitle{ + font-size: 1.1rem; + font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif; + font-weight: bold; +} + +/* Steps Title description */ +.step-heading{ + display: none; + gap: 10px; + margin-left: 20px; + align-items: center; +} +.step-heading .step-title{ + background-color: #9F91CC; + border-radius: 20px; + font-weight: bold; + padding: 10px 15px; +} + +.step-heading .step-description{ + font-weight: bold; +} + +.anime-main .measurements{ + position: absolute; + z-index: 300; + /* border: 1px solid; */ + display: none; +} +.anime-main .measurements .cell{ + border: 1px solid; +} + +/* temp text */ +.anime-main .temp-text, .temp-text2{ + position: absolute; + background-color: white; + padding: 5px 10px; + display: none; +} + +/* Project Welcome */ +.welcome-box{ + display: none; + flex-direction: column; + align-items: center; + position: absolute; + } + .welcome-box .title{ + display: flex; + flex-direction: column; + align-items: center; + margin-top: 25px; + gap: 4px; + } + .welcome-box .iit-logo{ + height: 140px; + width: 200px; + } + .welcome-box .prof-img{ + /* margin-top: 20px; */ + height: 120px; + width: 100px; + } + .welcome-box .title span{ + font-size: 1.5rem; + } + .welcome-box .title span:nth-child(2n - 1){ + color: red + } + .welcome-box .title span:nth-child(2n){ + font-weight: bold; + color: black; + font-family: Roboto; + } + .welcome-box .prof-description{ + font-size: 0.8rem; + transform: translate(40px,15px); + display: flex; + flex-direction: column; + align-items: end; + padding: 5px; + font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif; + border: 2px solid; + border-radius: 5px; + align-self: end; + } + + /* Mute Btn */ +.btn-mute{ + z-index: 500; +} + +/* Video box */ +.video-box{ + position: absolute; + display:none ; + /* display: flex; */ + flex-direction: column; + border: 2px solid; + box-shadow: 5px 5px 10px 2px black; + align-items: center; + justify-content: center; + z-index: 10; + width: fit-content; + height: fit-content; + border-radius: 3px; + overflow: hidden; +} + +/* .video-box .video{ + /* height: 150px!important; */ +/* } */ + +.video-box .title{ + background-color: purple; + margin: 0; + text-align: center; + color: white; + padding: 3px; + font-size: 1.2em; + +} + +.video-box .controls{ + display: flex; + background-color: purple; + align-items: center; + justify-content: space-around; + width: 100%; +} +.video-box .controls img{ + height: 26px; + +} + +.video-box .controls .restart{ + padding: 2px; + display: flex; + justify-content: center; + align-items: center; +} + +/* Temp texts/titles */ +.temp{ + display: none; + font-weight: bold; + font-size: 1.0rem; + position: absolute; + text-align: justify; + background-color: black; + color: white; + width: 35px; + padding: 0 1px; + border-radius: 4px; +} + + +/* Content Adder Boxc */ +.content-adder-box{ + padding: 10px 5px; + /* display: flex; */ + display: none; + flex-direction: column; + gap: 5px; + height: fit-content; + width: fit-content; + z-index: 1000; + border-radius: 10px; + background-color: #5c4b99; + box-shadow: 3px 3px 5px ; + position: absolute; + right: 20px; + top: 80px!important; +} + + + /* print */ + @media print{ + #drawer, .progress-bar, .anime-header, .anime-footer{ + display: none!important; + } + .main-window{ + border: none; + } + .certificate{ + display: flex; + transform: translateY(400px) rotate(90deg) scale(1.5,2); + + + } + } + /* for transparent box */ + .transparent-box{ + display: none; + height: 100% ; + width: 950px; + background-color: transparent; + z-index: 500; + position: absolute; + + } + + + .image-box{ + /* display: flex; */ + display: none; + border: 2px solid; + text-align: center; + flex-direction: column; + justify-content: center; + /* background-color: white; */ + height: fit-content; + width: fit-content; + position: absolute; + padding: 3px; + border-radius: 10px; + box-shadow: 5px 5px 14px ; + } + .image-box .title{ + margin: 0; + font-weight: bold; + } + .image-box .image{ + border-radius: 10px; + } + + .pointer{ + cursor: pointer; + } + + .btn-img{ + transition: 0.1s; + } + .btn-img:hover{ + /* scale: 0.95; */ + filter: brightness(1.4); + } + .btn-img:active{ + filter: opacity(0.9); + } + + .btn-img-disabled{ + /* filter: grayscale(1); */ + } + + + \ No newline at end of file diff --git a/experiment/simulation/EE5/css/progressBar.css b/experiment/simulation/EE5/css/progressBar.css new file mode 100644 index 0000000..4b55d7e --- /dev/null +++ b/experiment/simulation/EE5/css/progressBar.css @@ -0,0 +1,128 @@ +:root { + --primary-color: rgb(11, 78, 179); + --gray: #e5e5e5; + --gray2: #808080; + --blue: #2183dd; + --primary: #0d6efc; + --green: #009900; + --white: #ffffff; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + + + + + + + +/* Progressbar */ +.progress-bar { + /* width: clamp(320px, 30%, 430px); */ + grid-area: progressBar; + font-family: Roboto; + width: 100%; + margin-bottom: 10px; +} + +.progressbar { + position: relative; + display: flex; + justify-content: space-between; + counter-reset: step; +} + +.progressbar::before, +.progress { + content: ""; + position: absolute; + top: 50%; + transform: translateY(-50%); + height: 5px; + width: 100%; + background-color: var(--gray); + z-index: -1; +} + +.progress { + background-color: var(--primary); + width: 0%; + transition: 0.3s; +} + +.progress-step { + width: 1.5rem; + height: 1.5rem; + /* background-color: var(--gray); */ + background-color: white; + border-radius: 50%; + border: 2px solid var(--gray2); + display: flex; + justify-content: center; + align-items: center; +} + +.progress-step::before { + counter-increment: step; + content: counter(step); + font-weight: bold; + /* content: "\f00c"; */ +} + +.progress-step::after { + display: none; + content: attr(data-title); + position: absolute; + top: calc(100% + 0.5rem); + font-size: 0.85rem; + color: #666; +} + +.progress-step-active { + background-color: var(--primary); + color: #f3f3f3; +} + +/* Form */ + + + +/* Button */ +.btns-group { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 1.5rem; +} + +.btn { + box-shadow: 3px 2px 4px 0px black; + padding: 0.75rem; + display: block; + text-decoration: none; + /* background-color: var(--primary); */ + background-color: #FFDBC3; + color: black; + text-align: center; + border: none; + border-radius: 0.25rem; + cursor: pointer; + transition: 0.1s; + height: fit-content; + margin: 0 10px; + font-family: Roboto; + font-weight: bold; + +} + +.btn:hover { + box-shadow: 0 0 0 2px #fff, 0 0 0 3px var(--green); +} + +.btn:active{ + opacity: 0.8!important; + transform: scale(0.95)!important; +} diff --git a/experiment/simulation/EE5/css/quiz.css b/experiment/simulation/EE5/css/quiz.css new file mode 100644 index 0000000..512981b --- /dev/null +++ b/experiment/simulation/EE5/css/quiz.css @@ -0,0 +1,86 @@ +.quiz-container { + z-index: 501; + top: 0; + position: absolute; + color: #000000; + border-radius: 10px; + box-shadow: 3px 3px 20px 1px black; + overflow: hidden; + width: 350px; + min-height: 350px; + height: fit-content; + max-width: 100%; + /* background-color: #fff5; */ + background-color: #ffffffc2; + backdrop-filter: blur(10px); + padding: 0.9rem; + display: none; + /* border: 2px solid ; */ + } + + + .quiz-container h2 { + padding: 1rem; + font-size: 1.2rem; + text-align: center; + margin: 0; + } + + .quiz-container ul { + list-style-type: none; + padding: 0; + } + + .quiz-container ul li { + font-size: 1.2rem; + margin: 1rem 0; + } + + .quiz-container ul li label { + cursor: pointer; + } + + .quiz-container button { + background-color: #aa84bb; + border: none; + color: white; + cursor: pointer; + display: block; + font-family: inherit; + font-size: 1.1rem; + width: 100%; + padding: 1rem; + border-radius: 5px; + } + + .quiz-container button:hover { + background-color: #732d91; + } + + .quiz-container button:focus { + background-color: #5e3370; + outline: none; + } + + .quiz-container #quizAns{ + display: none; + } + + .quiz-container #closeQuiz{ + margin: 10px; + right: 0; + top: 0; + position: absolute; + font-size: 1rem; + color: white; + padding: 4px 10px; + height: fit-content; + font-weight: bold; + background-color: #732d91; + cursor: pointer; + border-radius: 50%; +} + .quiz-container .title{ + display: flex; + justify-content: space-between; + } \ No newline at end of file diff --git a/experiment/simulation/EE5/css/resultTable.css b/experiment/simulation/EE5/css/resultTable.css new file mode 100644 index 0000000..44aeb3f --- /dev/null +++ b/experiment/simulation/EE5/css/resultTable.css @@ -0,0 +1,142 @@ +/* +Responsive HTML Table With Pure CSS - Web Design/UI Design + +Code written by: +👨🏻‍⚕️ Coding Design (Jeet Saru) + +> You can do whatever you want with the code. However if you love my content, you can **SUBSCRIBED** my YouTube Channel. + +🌎link: www.youtube.com/codingdesign +*/ + + + +main.table { + width: 82vw; + height: 90vh; + background-color: #fff5; + + backdrop-filter: blur(7px); + box-shadow: 0 .4rem .8rem #0005; + border-radius: .8rem; + + overflow: hidden; +} + +main.table__header { + width: 100%; + height: 10%; + background-color: #fff4; + padding: .8rem 1rem; + + display: flex; + justify-content: space-between; + align-items: center; +} + + + + + +main.table__body { + width: 95%; + max-height: calc(89% - 1.6rem); + background-color: #fffb; + + margin: .8rem auto; + border-radius: .6rem; + + overflow: auto; + overflow: overlay; +} + +main.table__body::-webkit-scrollbar{ + width: 0.5rem; + height: 0.5rem; +} + +main.table__body::-webkit-scrollbar-thumb{ + border-radius: .5rem; + background-color: #0004; + visibility: hidden; +} + +main.table__body:hover::-webkit-scrollbar-thumb{ + visibility: visible; +} + +main table { + width: 100%; +} + +main td img { + width: 36px; + height: 36px; + margin-right: .5rem; + border-radius: 50%; + + vertical-align: middle; +} + +main table, th, td { + border-collapse: collapse; + padding: 1rem; + text-align: left; +} + +main thead th { + position: sticky; + top: 0; + left: 0; + background-color: #d5d1defe; + cursor: pointer; + text-transform: capitalize; +} + +main tbody tr:nth-child(even) { + background-color: #0000000b; +} + +main tbody tr { + --delay: .1s; + transition: .5s ease-in-out var(--delay), background-color 0s; +} + +main tbody tr.hide { + opacity: 0; + transform: translateX(100%); +} + +main tbody tr:hover { + background-color: #fff6 !important; +} + +main tbody tr td, +main tbody tr td p, +main tbody tr td img { + transition: .2s ease-in-out; +} + +main tbody tr.hide td, +main tbody tr.hide td p { + padding: 0; + font: 0 / 0 sans-serif; + transition: .2s ease-in-out .5s; +} + +main tbody tr.hide td img { + width: 0; + height: 0; + transition: .2s ease-in-out .5s; +} + + + +main thead th:hover { + color: #6c00bd; +} + +main thead th.active,tbody td.active { + color: #6c00bd; +} + diff --git a/experiment/simulation/EE5/css/scenes.css b/experiment/simulation/EE5/css/scenes.css new file mode 100644 index 0000000..128ec3e --- /dev/null +++ b/experiment/simulation/EE5/css/scenes.css @@ -0,0 +1,116 @@ +.anime-main{ + display: flex; + justify-content: center; + align-items: center; +} + +/* Scene 1 */ +/* step1 */ +.user-input{ + font-size: 1.5rem; + flex-direction: column; + display: none; + gap: 10px; + position: absolute; + left: 200; +} +.user-input p{ + margin: 0; +} +.user-input *{ + padding: 10px; + +} + +.anime-header{ + display: none; + position: relative; + top: 0px; + z-index: 6000; +} + +/* step2 - project intro */ +.project-intro{ + top: 50px; + padding: 10px; + display: none; + position: absolute; +} + +.project-intro .heading{ + font-weight: bold; + font-size: 1.1rem; +} +.project-intro .description{ + margin: 5px 0 15px 0; + color: rgb(48, 48, 48); +} + + + + +/* Mouse position */ + +#demo { + height: 100%; + width: 100%; + background-color: #222831; +} + +#info { + z-index: 200; + padding-left: 10px; + border-radius: 10px; + position: absolute; + user-select: none; + font-size: 2em; + width: 120px; + color: #EEEEEE; + background-color: #FD7013; +} + +/* step3 */ +/* input template */ +.temp-input{ + position: absolute; + font-size: 1.5rem; + display: none; +} +.temp-input span{ + margin: 5px; +} +.error{ + color: red; + font-size: 1rem; + text-align: center; + display: none; +} +.temp-input .input{ + font-size: 1.5rem; + width: 100px; + padding: 5px; +} + +.temp-input .submit-btn{ + margin: 20px 0; +} + +/* step 7 */ +.utm-button{ + cursor: pointer; + background-color: rgb(0, 255, 0); + padding: 4px; + box-shadow: 1px 1px 10px 3px green; + border-radius: 50%; + /* border: 1px solid; */ + left: 251px; + top: 147px; + position: absolute; + z-index: 6; + opacity: 0; +} + +.celebration{ + display: none; + position: absolute; +} \ No newline at end of file diff --git a/experiment/simulation/EE5/css/sliders.css b/experiment/simulation/EE5/css/sliders.css new file mode 100644 index 0000000..b7515ed --- /dev/null +++ b/experiment/simulation/EE5/css/sliders.css @@ -0,0 +1,74 @@ +.slider-box .row1{ + display: flex; + gap: 20px; +} +.slider-box .header{ + color: white; + font-size: 1.2rem; + font-weight: bold; + text-align: center; + padding: 2px; +} +.slider-box .header_v{ + background-color: #0000cc; +} +.slider-box .header_r{ + background-color: #c00000; + +} +.slider-box .header_c{ + background-color: #ff0066; + } +.slider-box .slider{ + width: 155px; + height: 30px; +} +.slider-box .slider_vIn{ + background-color: #fff5cc; +} +.slider-box .slider_R{ + background-color: #f5efff; +} +.slider-box .slider_C{ + background-color: #f5efff; +} +.slider-box .slider { + font-family: 'Times New Roman', Times, serif; + font-weight: bold; + font-size: 1.4rem; + color: #c00000; + +} +.slider-box .slider option:hover{ + background-color: #a8cf40; +} +.slider-box .slider-box-container-4 .header_d{ + height: 10px; + width: fit-content; +} +.slider-box .slider-box-container-4 { + margin-top: 20px; +} +.slider-box .slider_D_input{ + width: 50px; + height: 30px; + font-weight: bold; + font-size: 1.1rem; + text-align: center; + border: 2px solid black; + margin-left: 5px; + border-radius: 12px; +} +.slider-box .slider option:hover{ + background-color: #a8cf40!important ; +} +.slider-box .slider-box-container-4{ + display: flex; + width: fit-content; + padding: 7px 18px; + border-radius: 81px; + background-color: #7030a0; +} +.slider-box .slider_D{ + /* width: 210px; */ +} \ No newline at end of file diff --git a/experiment/simulation/EE5/css/table.css b/experiment/simulation/EE5/css/table.css new file mode 100644 index 0000000..91dbed8 --- /dev/null +++ b/experiment/simulation/EE5/css/table.css @@ -0,0 +1,163 @@ +table { + background-color: #fff5; + + backdrop-filter: blur(7px); + box-shadow: 0 .4rem .8rem #0005; + border-radius: .8rem; + + overflow: hidden; +} + +main.table { + min-width: 600px; + height: 430px; + background-color: #fff5; + + backdrop-filter: blur(7px); + box-shadow: 0 .4rem .8rem #0005; + border-radius: .8rem; + + overflow: overlay; +} +.table__header .input-group { + width: 35%; + height: 100%; + background-color: #fff5; + padding: 0 .8rem; + border-radius: 2rem; + + display: flex; + justify-content: center; + align-items: center; + + transition: .2s; +} + +.table__header .input-group:hover { + width: 45%; + background-color: #fff8; + box-shadow: 0 .0.7rem .4rem #0002; +} + +.table__header .input-group img { + width: 1.2rem; + height: 1.2rem; +} + +.table__header .input-group input { + width: 100%; + padding: 0 .5rem 0 .3rem; + background-color: transparent; + border: none; + outline: none; +} + +main .table__body { + /* width: 95%; */ + /* max-height: calc(89% - 1.6rem); */ + background-color: #fffb; + display: flex; + justify-content: center; + border-radius: .6rem; + + overflow: auto; + /* overflow: overlay!important; */ +} + +.table__body::-webkit-scrollbar{ + width: 0.5rem; + height: 0.5rem; +} + +.table__body::-webkit-scrollbar-thumb{ + border-radius: .5rem; + background-color: #0004; + visibility: hidden; +} + +.table__body:hover::-webkit-scrollbar-thumb{ + visibility: visible; +} + + +td img { + width: 36px; + height: 36px; + margin-right: .5rem; + border-radius: 50%; + + vertical-align: middle; +} + +table, th, td { + border-collapse: collapse; + padding: 0.7rem; + text-align: left; +} +table{ + padding: 0.3rem; +} + +thead th { + position: sticky; + top: 0; + left: 0; + background-color: #d5d1defe; + cursor: pointer; + text-transform: capitalize; +} + +tbody tr:nth-child(even) { + background-color: #0000000b; +} + +tbody tr { + --delay: .1s; + transition: .5s ease-in-out var(--delay), background-color 0s; +} + +tbody tr.hide { + opacity: 0; + transform: translateX(100%); +} + +tbody tr:hover { + background-color: #fff6 !important; +} + +tbody tr td, +tbody tr td p, +tbody tr td img { + transition: .2s ease-in-out; +} + +tbody tr.hide td, +tbody tr.hide td p { + padding: 0; + font: 0 / 0 sans-serif; + transition: .2s ease-in-out .5s; +} + +tbody tr.hide td img { + width: 0; + height: 0; + transition: .2s ease-in-out .5s; +} + + + +.result-table{ + position: absolute; + left: 400; + display: none; +} + +.result-table .table__header{ + height: ""; + min-width: 600px!important; +} +.result-table th{ + display: flex; + align-items: center; +} + diff --git a/experiment/simulation/EE5/fonts/ComicSansMS3.ttf b/experiment/simulation/EE5/fonts/ComicSansMS3.ttf new file mode 100644 index 0000000..da55369 Binary files /dev/null and b/experiment/simulation/EE5/fonts/ComicSansMS3.ttf differ diff --git a/experiment/simulation/EE5/helper/GRAPH/graph.html b/experiment/simulation/EE5/helper/GRAPH/graph.html new file mode 100644 index 0000000..8bd3618 --- /dev/null +++ b/experiment/simulation/EE5/helper/GRAPH/graph.html @@ -0,0 +1,78 @@ + + + + + Horizontal Bar Chart with Rotated Y-axis Labels + + + +
    + +
    + + + + diff --git a/experiment/simulation/EE5/helper/cable/css/simstyle.css b/experiment/simulation/EE5/helper/cable/css/simstyle.css new file mode 100644 index 0000000..eb0fbe5 --- /dev/null +++ b/experiment/simulation/EE5/helper/cable/css/simstyle.css @@ -0,0 +1,150 @@ +.exp { + position: absolute; + top: 0em; + border: 5px; + left: 0%; + height: 48em; + width: 89em; + border-style: groove; + background-color: white; + /* width: 1422px; */ +} +/* input { + background: #228b22; + color: white; + padding: 10px 10px; + border: none; + border-radius: 3px; +} */ + #dragDropWindow1{ + left: 19.9em; + top: 27.6em; + position: fixed; + } + #dragDropWindow6{ + left: 17.5em; + top: 27.6em; + position: fixed; + } + #dragDropWindow8{ + left: 62.1em; + top: 29.3em; + position: fixed; + } + #dragDropWindow4{ + left: 73.55em; + top: 23.1em; + position: fixed; + } + #dragDropWindow5{ + left: 42.5em; + top: 27em; + position: fixed; + } + #dragDropWindow2{ + left: 27.7em; + top: 24em; + position: fixed; + } + #dragDropWindow7{ + left: 71.3em; + top: 23.1em; + position: absolute; + } + #dragDropWindow3{ + left: 62.1em; + top: 25.7em; + position: fixed; + } + .image{ + position:relative; + margin-top:100px; + } + .top{ + position:absolute; + bottom:50px; + right:30px; + /*z-index:10;*/ + } + .instruct{ + float:right; + } + .b1:hover{ + background-color:yellow; + color:red; + cursor:pointer; + } + .b2:hover{ + background-color:red; + color:white; + cursor:pointer; + } + .button{ + display:inline-flex; + margin-right:50px; + } + .modal { + display: none; + position: fixed; + z-index: 1; + padding-top: 100px; + left: 0; + top: 0; + width: 100%; + height: 100%; + overflow: auto; + } + .modal-content { + background-color: #fefefe; + margin: auto; + padding: 20px; + border: 1px solid #888; + width: 80%; + -webkit-animation-name: animatetop; + -webkit-animation-duration: 0.4s; + animation-name: animatetop; + animation-duration: 0.4s + } + @-webkit-keyframes animatetop { + from {top:-300px; opacity:0} + to {top:0; opacity:1} + } + @keyframes animatetop { + from {top:-300px; opacity:0} + to {top:0; opacity:1} + } + .close { + color: #ffffff; + float: right; + font-size: 28px; + font-weight: bold; + } + .close:hover, + .close:focus { + text-decoration: none; + cursor: pointer; + } + .modal-header { + padding: 2px 16px; + background-color: #044ca3; + color: white; + } + .modal-body {padding: 2px 16px;} + .modal-footer { + padding: 2px 16px; + background-color: #044ca3; + color: white; + } + path, .jtk-endpoint { cursor:pointer; } + .cmdLink { font-size:0.80em;} + .drag-drop-demo a, .drag-drop-demo a:visited { + color:#057D9F; + } + .demo { + /* for IE10+ touch devices */ + touch-action:none; + } + body{ + margin-left: 15px!important; + margin-top: -23px!important; + } \ No newline at end of file diff --git a/experiment/simulation/EE5/helper/cable/images/Log.png b/experiment/simulation/EE5/helper/cable/images/Log.png new file mode 100644 index 0000000..33a261a Binary files /dev/null and b/experiment/simulation/EE5/helper/cable/images/Log.png differ diff --git a/experiment/simulation/EE5/helper/cable/images/meter.png b/experiment/simulation/EE5/helper/cable/images/meter.png new file mode 100644 index 0000000..cde49fa Binary files /dev/null and b/experiment/simulation/EE5/helper/cable/images/meter.png differ diff --git a/experiment/simulation/EE5/helper/cable/images/meter2.png b/experiment/simulation/EE5/helper/cable/images/meter2.png new file mode 100644 index 0000000..f6efa4e Binary files /dev/null and b/experiment/simulation/EE5/helper/cable/images/meter2.png differ diff --git a/experiment/simulation/EE5/helper/cable/images/setup.PNG b/experiment/simulation/EE5/helper/cable/images/setup.PNG new file mode 100644 index 0000000..56f5f66 Binary files /dev/null and b/experiment/simulation/EE5/helper/cable/images/setup.PNG differ diff --git a/experiment/simulation/EE5/helper/cable/js/demo.js b/experiment/simulation/EE5/helper/cable/js/demo.js new file mode 100644 index 0000000..cc5ade7 --- /dev/null +++ b/experiment/simulation/EE5/helper/cable/js/demo.js @@ -0,0 +1,261 @@ +(function () { + var yy = document.getElementById("check"); + yy.onclick = checkk; + + // ! check + function checkk() { + if (connections.length == 0) { + alert("Please make the connections first"); + return false; + } + + if (connections.length < 6) { + alert("Wrong Connections\nPlease go through the instructions once"); + return false; + } + let isConnectionRight = false + if (connections.length >= 6) { + let matrixForCheckGraph = [ + // 0 1 2 3 4 5 6 7 8 9 10 + [0,0,0,0,0,0,0,0,0,0,0], // 0 + [0,0,0,1,0,0,0,0,0,0,0], // 1 + [0,0,0,0,0,0,1,0,1,0,0], // 2 + [0,1,0,0,0,0,0,0,0,0,0], // 3 + [0,0,0,0,0,0,0,1,0,1,0], // 4 + [0,0,0,0,0,0,0,0,0,0,1], // 5 + [0,0,1,0,0,0,0,0,1,0,0], // 6 + [0,0,0,0,1,0,0,0,0,1,0], // 7 + [0,0,1,0,0,0,1,0,0,0,0], // 8 + [0,0,0,0,1,0,0,1,0,0,0], // 9 + [0,0,0,0,0,1,0,0,0,0,0], // 10 + ] + var listDiv = []; + for (var j = 0; j < connections.length; j++) { + let pos = [connections[j].targetId,connections[j].sourceId] + listDiv.push(pos) + } + for(let i=0;i 0) { + var listDiv = []; + for (var j = 0; j < connections.length; j++) { + let pos = [connections[j].targetId,connections[j].sourceId] + listDiv.push(pos) + } + showConnectionInfo(listDiv); + } + }); + + jsPlumb.ready(function () { + var instance = jsPlumb.getInstance(); + + // suspend drawing and initialise. + instance.batch(function () { + // bind to connection/connectionDetached events, and update the list of connections on screen. + instance.bind("connection", function (info, originalEvent) { + updateConnections(info.connection); + }); + instance.bind("connectionDetached", function (info, originalEvent) { + updateConnections(info.connection, true); + }); + + instance.bind("connectionMoved", function (info, originalEvent) { + // only remove here, because a 'connection' event is also fired. + // in a future release of jsplumb this extra connection event will not + // be fired. + updateConnections(info.connection, true); + }); + + // configure some drop options for use by all endpoints. + var exampleDropOptions = { + tolerance: "touch", + hoverClass: "dropHover", + activeClass: "dragActive", + }; + let radius = 14 + var exampleEndpoint1 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "pink" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "pink", strokeWidth: 6 }, + connector: ["Bezier", { curviness: 10 }], + maxConnections: 1, + isTarget: true, + dropOptions: exampleDropOptions, + }; + var exampleEndpoint2 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "black" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "black", strokeWidth: 6 }, + connector: ["Bezier", { curviness: -50 }], + maxConnections: 3, + isTarget: true, + dropOptions: exampleDropOptions, + }; + var exampleEndpoint3 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "red" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "red", strokeWidth: 6 }, + connector: ["Bezier", { curviness: -30 }], + maxConnections: 3, + isTarget: true, + dropOptions: exampleDropOptions, + }; + var exampleEndpoint4 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "green" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "green", strokeWidth: 6 }, + connector: ["Bezier", { curviness: -50 }], + maxConnections: 1, + isTarget: true, + dropOptions: exampleDropOptions, + }; + // conn 1 + instance.addEndpoint( + "dragDropWindow1", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint1 + ); + instance.addEndpoint( + "dragDropWindow3", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint1 + ); + + // conn 2 + instance.addEndpoint( + "dragDropWindow4", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint2 + ); + instance.addEndpoint( + "dragDropWindow7", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint2 + ); + instance.addEndpoint( + "dragDropWindow9", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint2 + ); + + // conn 3 + instance.addEndpoint( + "dragDropWindow8", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint3 + ); + instance.addEndpoint( + "dragDropWindow6", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint3 + ); + instance.addEndpoint( + "dragDropWindow2", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint3 + ); + + // conn 4 + instance.addEndpoint( + "dragDropWindow10", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint4 + ); + instance.addEndpoint( + "dragDropWindow5", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint4 + ); + /*instance.addEndpoint("dragDropWindow9", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint4); + instance.addEndpoint("dragDropWindow10", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint4); + instance.addEndpoint("dragDropWindow11", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint3); + instance.addEndpoint("dragDropWindow12", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint3);*/ + + instance.draggable(jsPlumb.getSelector(".drag-drop-demo .window")); + + var hideLinks = jsPlumb.getSelector(".drag-drop-demo .hide"); + instance.on(hideLinks, "click", function (e) { + instance.toggleVisible(this.getAttribute("rel")); + jsPlumbUtil.consume(e); + }); + + var dragLinks = jsPlumb.getSelector(".drag-drop-demo .drag"); + instance.on(dragLinks, "click", function (e) { + var s = instance.toggleDraggable(this.getAttribute("rel")); + this.innerHTML = s ? "disable dragging" : "enable dragging"; + jsPlumbUtil.consume(e); + }); + + var detachLinks = jsPlumb.getSelector(".drag-drop-demo .detach"); + instance.on(detachLinks, "click", function (e) { + instance.deleteConnectionsForElement(this.getAttribute("rel")); + jsPlumbUtil.consume(e); + }); + + // ! reset + instance.on(document.getElementById("reset"), "click", function (e) { + // instance.detachEveryConnection(); + instance.deleteEveryConnection() + showConnectionInfo(""); + jsPlumbUtil.consume(e); + }); + }); + + jsPlumb.fire("jsPlumbDemoLoaded", instance); + }); + +})(); diff --git a/experiment/simulation/EE5/helper/cable/js/jsplumb.js b/experiment/simulation/EE5/helper/cable/js/jsplumb.js new file mode 100644 index 0000000..5c66789 --- /dev/null +++ b/experiment/simulation/EE5/helper/cable/js/jsplumb.js @@ -0,0 +1,15949 @@ +/** + * jsBezier + * + * Copyright (c) 2010 - 2017 jsPlumb (hello@jsplumbtoolkit.com) + * + * licensed under the MIT license. + * + * a set of Bezier curve functions that deal with Beziers, used by jsPlumb, and perhaps useful for other people. These functions work with Bezier + * curves of arbitrary degree. + * + * - functions are all in the 'jsBezier' namespace. + * + * - all input points should be in the format {x:.., y:..}. all output points are in this format too. + * + * - all input curves should be in the format [ {x:.., y:..}, {x:.., y:..}, {x:.., y:..}, {x:.., y:..} ] + * + * - 'location' as used as an input here refers to a decimal in the range 0-1 inclusive, which indicates a point some proportion along the length + * of the curve. location as output has the same format and meaning. + * + * + * Function List: + * -------------- + * + * distanceFromCurve(point, curve) + * + * Calculates the distance that the given point lies from the given Bezier. Note that it is computed relative to the center of the Bezier, + * so if you have stroked the curve with a wide pen you may wish to take that into account! The distance returned is relative to the values + * of the curve and the point - it will most likely be pixels. + * + * gradientAtPoint(curve, location) + * + * Calculates the gradient to the curve at the given location, as a decimal between 0 and 1 inclusive. + * + * gradientAtPointAlongCurveFrom (curve, location) + * + * Calculates the gradient at the point on the given curve that is 'distance' units from location. + * + * nearestPointOnCurve(point, curve) + * + * Calculates the nearest point to the given point on the given curve. The return value of this is a JS object literal, containing both the + *point's coordinates and also the 'location' of the point (see above), for example: { point:{x:551,y:150}, location:0.263365 }. + * + * pointOnCurve(curve, location) + * + * Calculates the coordinates of the point on the given Bezier curve at the given location. + * + * pointAlongCurveFrom(curve, location, distance) + * + * Calculates the coordinates of the point on the given curve that is 'distance' units from location. 'distance' should be in the same coordinate + * space as that used to construct the Bezier curve. For an HTML Canvas usage, for example, distance would be a measure of pixels. + * + * locationAlongCurveFrom(curve, location, distance) + * + * Calculates the location on the given curve that is 'distance' units from location. 'distance' should be in the same coordinate + * space as that used to construct the Bezier curve. For an HTML Canvas usage, for example, distance would be a measure of pixels. + * + * perpendicularToCurveAt(curve, location, length, distance) + * + * Calculates the perpendicular to the given curve at the given location. length is the length of the line you wish for (it will be centered + * on the point at 'location'). distance is optional, and allows you to specify a point along the path from the given location as the center of + * the perpendicular returned. The return value of this is an array of two points: [ {x:...,y:...}, {x:...,y:...} ]. + * + * + */ + + (function() { + + var root = this; + + if(typeof Math.sgn == "undefined") { + Math.sgn = function(x) { return x == 0 ? 0 : x > 0 ? 1 :-1; }; + } + + var Vectors = { + subtract : function(v1, v2) { return {x:v1.x - v2.x, y:v1.y - v2.y }; }, + dotProduct : function(v1, v2) { return (v1.x * v2.x) + (v1.y * v2.y); }, + square : function(v) { return Math.sqrt((v.x * v.x) + (v.y * v.y)); }, + scale : function(v, s) { return {x:v.x * s, y:v.y * s }; } + }, + + maxRecursion = 64, + flatnessTolerance = Math.pow(2.0,-maxRecursion-1); + + /** + * Calculates the distance that the point lies from the curve. + * + * @param point a point in the form {x:567, y:3342} + * @param curve a Bezier curve in the form [{x:..., y:...}, {x:..., y:...}, {x:..., y:...}, {x:..., y:...}]. note that this is currently + * hardcoded to assume cubiz beziers, but would be better off supporting any degree. + * @return a JS object literal containing location and distance, for example: {location:0.35, distance:10}. Location is analogous to the location + * argument you pass to the pointOnPath function: it is a ratio of distance travelled along the curve. Distance is the distance in pixels from + * the point to the curve. + */ + var _distanceFromCurve = function(point, curve) { + var candidates = [], + w = _convertToBezier(point, curve), + degree = curve.length - 1, higherDegree = (2 * degree) - 1, + numSolutions = _findRoots(w, higherDegree, candidates, 0), + v = Vectors.subtract(point, curve[0]), dist = Vectors.square(v), t = 0.0; + + for (var i = 0; i < numSolutions; i++) { + v = Vectors.subtract(point, _bezier(curve, degree, candidates[i], null, null)); + var newDist = Vectors.square(v); + if (newDist < dist) { + dist = newDist; + t = candidates[i]; + } + } + v = Vectors.subtract(point, curve[degree]); + newDist = Vectors.square(v); + if (newDist < dist) { + dist = newDist; + t = 1.0; + } + return {location:t, distance:dist}; + }; + /** + * finds the nearest point on the curve to the given point. + */ + var _nearestPointOnCurve = function(point, curve) { + var td = _distanceFromCurve(point, curve); + return {point:_bezier(curve, curve.length - 1, td.location, null, null), location:td.location}; + }; + var _convertToBezier = function(point, curve) { + var degree = curve.length - 1, higherDegree = (2 * degree) - 1, + c = [], d = [], cdTable = [], w = [], + z = [ [1.0, 0.6, 0.3, 0.1], [0.4, 0.6, 0.6, 0.4], [0.1, 0.3, 0.6, 1.0] ]; + + for (var i = 0; i <= degree; i++) c[i] = Vectors.subtract(curve[i], point); + for (var i = 0; i <= degree - 1; i++) { + d[i] = Vectors.subtract(curve[i+1], curve[i]); + d[i] = Vectors.scale(d[i], 3.0); + } + for (var row = 0; row <= degree - 1; row++) { + for (var column = 0; column <= degree; column++) { + if (!cdTable[row]) cdTable[row] = []; + cdTable[row][column] = Vectors.dotProduct(d[row], c[column]); + } + } + for (i = 0; i <= higherDegree; i++) { + if (!w[i]) w[i] = []; + w[i].y = 0.0; + w[i].x = parseFloat(i) / higherDegree; + } + var n = degree, m = degree-1; + for (var k = 0; k <= n + m; k++) { + var lb = Math.max(0, k - m), + ub = Math.min(k, n); + for (i = lb; i <= ub; i++) { + var j = k - i; + w[i+j].y += cdTable[j][i] * z[j][i]; + } + } + return w; + }; + /** + * counts how many roots there are. + */ + var _findRoots = function(w, degree, t, depth) { + var left = [], right = [], + left_count, right_count, + left_t = [], right_t = []; + + switch (_getCrossingCount(w, degree)) { + case 0 : { + return 0; + } + case 1 : { + if (depth >= maxRecursion) { + t[0] = (w[0].x + w[degree].x) / 2.0; + return 1; + } + if (_isFlatEnough(w, degree)) { + t[0] = _computeXIntercept(w, degree); + return 1; + } + break; + } + } + _bezier(w, degree, 0.5, left, right); + left_count = _findRoots(left, degree, left_t, depth+1); + right_count = _findRoots(right, degree, right_t, depth+1); + for (var i = 0; i < left_count; i++) t[i] = left_t[i]; + for (var i = 0; i < right_count; i++) t[i+left_count] = right_t[i]; + return (left_count+right_count); + }; + var _getCrossingCount = function(curve, degree) { + var n_crossings = 0, sign, old_sign; + sign = old_sign = Math.sgn(curve[0].y); + for (var i = 1; i <= degree; i++) { + sign = Math.sgn(curve[i].y); + if (sign != old_sign) n_crossings++; + old_sign = sign; + } + return n_crossings; + }; + var _isFlatEnough = function(curve, degree) { + var error, + intercept_1, intercept_2, left_intercept, right_intercept, + a, b, c, det, dInv, a1, b1, c1, a2, b2, c2; + a = curve[0].y - curve[degree].y; + b = curve[degree].x - curve[0].x; + c = curve[0].x * curve[degree].y - curve[degree].x * curve[0].y; + + var max_distance_above, max_distance_below; + max_distance_above = max_distance_below = 0.0; + + for (var i = 1; i < degree; i++) { + var value = a * curve[i].x + b * curve[i].y + c; + if (value > max_distance_above) + max_distance_above = value; + else if (value < max_distance_below) + max_distance_below = value; + } + + a1 = 0.0; b1 = 1.0; c1 = 0.0; a2 = a; b2 = b; + c2 = c - max_distance_above; + det = a1 * b2 - a2 * b1; + dInv = 1.0/det; + intercept_1 = (b1 * c2 - b2 * c1) * dInv; + a2 = a; b2 = b; c2 = c - max_distance_below; + det = a1 * b2 - a2 * b1; + dInv = 1.0/det; + intercept_2 = (b1 * c2 - b2 * c1) * dInv; + left_intercept = Math.min(intercept_1, intercept_2); + right_intercept = Math.max(intercept_1, intercept_2); + error = right_intercept - left_intercept; + return (error < flatnessTolerance)? 1 : 0; + }; + var _computeXIntercept = function(curve, degree) { + var XLK = 1.0, YLK = 0.0, + XNM = curve[degree].x - curve[0].x, YNM = curve[degree].y - curve[0].y, + XMK = curve[0].x - 0.0, YMK = curve[0].y - 0.0, + det = XNM*YLK - YNM*XLK, detInv = 1.0/det, + S = (XNM*YMK - YNM*XMK) * detInv; + return 0.0 + XLK * S; + }; + var _bezier = function(curve, degree, t, left, right) { + var temp = [[]]; + for (var j =0; j <= degree; j++) temp[0][j] = curve[j]; + for (var i = 1; i <= degree; i++) { + for (var j =0 ; j <= degree - i; j++) { + if (!temp[i]) temp[i] = []; + if (!temp[i][j]) temp[i][j] = {}; + temp[i][j].x = (1.0 - t) * temp[i-1][j].x + t * temp[i-1][j+1].x; + temp[i][j].y = (1.0 - t) * temp[i-1][j].y + t * temp[i-1][j+1].y; + } + } + if (left != null) + for (j = 0; j <= degree; j++) left[j] = temp[j][0]; + if (right != null) + for (j = 0; j <= degree; j++) right[j] = temp[degree-j][j]; + + return (temp[degree][0]); + }; + + var _curveFunctionCache = {}; + var _getCurveFunctions = function(order) { + var fns = _curveFunctionCache[order]; + if (!fns) { + fns = []; + var f_term = function() { return function(t) { return Math.pow(t, order); }; }, + l_term = function() { return function(t) { return Math.pow((1-t), order); }; }, + c_term = function(c) { return function(t) { return c; }; }, + t_term = function() { return function(t) { return t; }; }, + one_minus_t_term = function() { return function(t) { return 1-t; }; }, + _termFunc = function(terms) { + return function(t) { + var p = 1; + for (var i = 0; i < terms.length; i++) p = p * terms[i](t); + return p; + }; + }; + + fns.push(new f_term()); // first is t to the power of the curve order + for (var i = 1; i < order; i++) { + var terms = [new c_term(order)]; + for (var j = 0 ; j < (order - i); j++) terms.push(new t_term()); + for (var j = 0 ; j < i; j++) terms.push(new one_minus_t_term()); + fns.push(new _termFunc(terms)); + } + fns.push(new l_term()); // last is (1-t) to the power of the curve order + + _curveFunctionCache[order] = fns; + } + + return fns; + }; + + + /** + * calculates a point on the curve, for a Bezier of arbitrary order. + * @param curve an array of control points, eg [{x:10,y:20}, {x:50,y:50}, {x:100,y:100}, {x:120,y:100}]. For a cubic bezier this should have four points. + * @param location a decimal indicating the distance along the curve the point should be located at. this is the distance along the curve as it travels, taking the way it bends into account. should be a number from 0 to 1, inclusive. + */ + var _pointOnPath = function(curve, location) { + var cc = _getCurveFunctions(curve.length - 1), + _x = 0, _y = 0; + for (var i = 0; i < curve.length ; i++) { + _x = _x + (curve[i].x * cc[i](location)); + _y = _y + (curve[i].y * cc[i](location)); + } + + return {x:_x, y:_y}; + }; + + var _dist = function(p1,p2) { + return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2)); + }; + + var _isPoint = function(curve) { + return curve[0].x === curve[1].x && curve[0].y === curve[1].y; + }; + + /** + * finds the point that is 'distance' along the path from 'location'. this method returns both the x,y location of the point and also + * its 'location' (proportion of travel along the path); the method below - _pointAlongPathFrom - calls this method and just returns the + * point. + */ + var _pointAlongPath = function(curve, location, distance) { + + if (_isPoint(curve)) { + return { + point:curve[0], + location:location + }; + } + + var prev = _pointOnPath(curve, location), + tally = 0, + curLoc = location, + direction = distance > 0 ? 1 : -1, + cur = null; + + while (tally < Math.abs(distance)) { + curLoc += (0.005 * direction); + cur = _pointOnPath(curve, curLoc); + tally += _dist(cur, prev); + prev = cur; + } + + return {point:cur, location:curLoc}; + }; + + var _length = function(curve) { + + var d = new Date().getTime(); + + if (_isPoint(curve)) return 0; + + var prev = _pointOnPath(curve, 0), + tally = 0, + curLoc = 0, + direction = 1, + cur = null; + + while (curLoc < 1) { + curLoc += (0.005 * direction); + cur = _pointOnPath(curve, curLoc); + tally += _dist(cur, prev); + prev = cur; + } + console.log("length", new Date().getTime() - d); + + return tally; + }; + + /** + * finds the point that is 'distance' along the path from 'location'. + */ + var _pointAlongPathFrom = function(curve, location, distance) { + return _pointAlongPath(curve, location, distance).point; + }; + + /** + * finds the location that is 'distance' along the path from 'location'. + */ + var _locationAlongPathFrom = function(curve, location, distance) { + return _pointAlongPath(curve, location, distance).location; + }; + + /** + * returns the gradient of the curve at the given location, which is a decimal between 0 and 1 inclusive. + * + * thanks // http://bimixual.org/AnimationLibrary/beziertangents.html + */ + var _gradientAtPoint = function(curve, location) { + + var p1 = _pointOnPath(curve, location), + p2 = _pointOnPath(curve.slice(0, curve.length - 1), location), + dy = p2.y - p1.y, dx = p2.x - p1.x; + + return dy === 0 ? Infinity : Math.atan(dy / dx); + }; + + /** + returns the gradient of the curve at the point which is 'distance' from the given location. + if this point is greater than location 1, the gradient at location 1 is returned. + if this point is less than location 0, the gradient at location 0 is returned. + */ + var _gradientAtPointAlongPathFrom = function(curve, location, distance) { + var p = _pointAlongPath(curve, location, distance); + if (p.location > 1) p.location = 1; + if (p.location < 0) p.location = 0; + return _gradientAtPoint(curve, p.location); + }; + + /** + * calculates a line that is 'length' pixels long, perpendicular to, and centered on, the path at 'distance' pixels from the given location. + * if distance is not supplied, the perpendicular for the given location is computed (ie. we set distance to zero). + */ + var _perpendicularToPathAt = function(curve, location, length, distance) { + distance = distance == null ? 0 : distance; + var p = _pointAlongPath(curve, location, distance), + m = _gradientAtPoint(curve, p.location), + _theta2 = Math.atan(-1 / m), + y = length / 2 * Math.sin(_theta2), + x = length / 2 * Math.cos(_theta2); + return [{x:p.point.x + x, y:p.point.y + y}, {x:p.point.x - x, y:p.point.y - y}]; + }; + + /** + * Calculates all intersections of the given line with the given curve. + * @param x1 + * @param y1 + * @param x2 + * @param y2 + * @param curve + * @returns {Array} + */ + var _lineIntersection = function(x1, y1, x2, y2, curve) { + var a = y2 - y1, + b = x1 - x2, + c = (x1 * (y1 - y2)) + (y1 * (x2-x1)), + coeffs = _computeCoefficients(curve), + p = [ + (a*coeffs[0][0]) + (b * coeffs[1][0]), + (a*coeffs[0][1])+(b*coeffs[1][1]), + (a*coeffs[0][2])+(b*coeffs[1][2]), + (a*coeffs[0][3])+(b*coeffs[1][3]) + c + ], + r = _cubicRoots.apply(null, p), + intersections = []; + + if (r != null) { + + for (var i = 0; i < 3; i++) { + var t = r[i], + t2 = Math.pow(t, 2), + t3 = Math.pow(t, 3), + x = [ + (coeffs[0][0] * t3) + (coeffs[0][1] * t2) + (coeffs[0][2] * t) + coeffs[0][3], + (coeffs[1][0] * t3) + (coeffs[1][1] * t2) + (coeffs[1][2] * t) + coeffs[1][3] + ]; + + // check bounds of the line + var s; + if ((x2 - x1) !== 0) { + s = (x[0] - x1) / (x2 - x1); + } + else { + s = (x[1] - y1) / (y2 - y1); + } + + if (t >= 0 && t <= 1.0 && s >= 0 && s <= 1.0) { + intersections.push(x); + } + } + } + + return intersections; + }; + + /** + * Calculates all intersections of the given box with the given curve. + * @param x X position of top left corner of box + * @param y Y position of top left corner of box + * @param w width of box + * @param h height of box + * @param curve + * @returns {Array} + */ + var _boxIntersection = function(x, y, w, h, curve) { + var i = []; + i.push.apply(i, _lineIntersection(x, y, x + w, y, curve)); + i.push.apply(i, _lineIntersection(x + w, y, x + w, y + h, curve)); + i.push.apply(i, _lineIntersection(x + w, y + h, x, y + h, curve)); + i.push.apply(i, _lineIntersection(x, y + h, x, y, curve)); + return i; + }; + + /** + * Calculates all intersections of the given bounding box with the given curve. + * @param boundingBox Bounding box, in { x:.., y:..., w:..., h:... } format. + * @param curve + * @returns {Array} + */ + var _boundingBoxIntersection = function(boundingBox, curve) { + var i = []; + i.push.apply(i, _lineIntersection(boundingBox.x, boundingBox.y, boundingBox.x + boundingBox.w, boundingBox.y, curve)); + i.push.apply(i, _lineIntersection(boundingBox.x + boundingBox.w, boundingBox.y, boundingBox.x + boundingBox.w, boundingBox.y + boundingBox.h, curve)); + i.push.apply(i, _lineIntersection(boundingBox.x + boundingBox.w, boundingBox.y + boundingBox.h, boundingBox.x, boundingBox.y + boundingBox.h, curve)); + i.push.apply(i, _lineIntersection(boundingBox.x, boundingBox.y + boundingBox.h, boundingBox.x, boundingBox.y, curve)); + return i; + }; + + + function _computeCoefficientsForAxis(curve, axis) { + return [ + -(curve[0][axis]) + (3*curve[1][axis]) + (-3 * curve[2][axis]) + curve[3][axis], + (3*(curve[0][axis])) - (6*(curve[1][axis])) + (3*(curve[2][axis])), + -3*curve[0][axis] + 3*curve[1][axis], + curve[0][axis] + ]; + } + + function _computeCoefficients(curve) + { + return [ + _computeCoefficientsForAxis(curve, "x"), + _computeCoefficientsForAxis(curve, "y") + ]; + } + + function sgn(x) { + return x < 0 ? -1 : x > 0 ? 1 : 0; + } + + function _cubicRoots(a, b, c, d) { + var A = b / a, + B = c / a, + C = d / a, + Q = (3*B - Math.pow(A, 2))/9, + R = (9*A*B - 27*C - 2*Math.pow(A, 3))/54, + D = Math.pow(Q, 3) + Math.pow(R, 2), + S, + T, + t = []; + + if (D >= 0) // complex or duplicate roots + { + S = sgn(R + Math.sqrt(D))*Math.pow(Math.abs(R + Math.sqrt(D)),(1/3)); + T = sgn(R - Math.sqrt(D))*Math.pow(Math.abs(R - Math.sqrt(D)),(1/3)); + + t[0] = -A/3 + (S + T); + t[1] = -A/3 - (S + T)/2; + t[2] = -A/3 - (S + T)/2; + + /*discard complex roots*/ + if (Math.abs(Math.sqrt(3)*(S - T)/2) !== 0) { + t[1] = -1; + t[2] = -1; + } + } + else // distinct real roots + { + var th = Math.acos(R/Math.sqrt(-Math.pow(Q, 3))); + t[0] = 2*Math.sqrt(-Q)*Math.cos(th/3) - A/3; + t[1] = 2*Math.sqrt(-Q)*Math.cos((th + 2*Math.PI)/3) - A/3; + t[2] = 2*Math.sqrt(-Q)*Math.cos((th + 4*Math.PI)/3) - A/3; + } + + // discard out of spec roots + for (var i = 0; i < 3; i++) { + if (t[i] < 0 || t[i] > 1.0) { + t[i] = -1; + } + } + + return t; + } + + var jsBezier = this.jsBezier = { + distanceFromCurve : _distanceFromCurve, + gradientAtPoint : _gradientAtPoint, + gradientAtPointAlongCurveFrom : _gradientAtPointAlongPathFrom, + nearestPointOnCurve : _nearestPointOnCurve, + pointOnCurve : _pointOnPath, + pointAlongCurveFrom : _pointAlongPathFrom, + perpendicularToCurveAt : _perpendicularToPathAt, + locationAlongCurveFrom:_locationAlongPathFrom, + getLength:_length, + lineIntersection:_lineIntersection, + boxIntersection:_boxIntersection, + boundingBoxIntersection:_boundingBoxIntersection, + version:"0.9.0" + }; + + if (typeof exports !== "undefined") { + exports.jsBezier = jsBezier; + } + +}).call(typeof window !== 'undefined' ? window : this); + +/** + * Biltong v0.4.0 + * + * Various geometry functions written as part of jsPlumb and perhaps useful for others. + * + * Copyright (c) 2017 jsPlumb + * https://jsplumbtoolkit.com + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +;(function() { + + "use strict"; + var root = this; + + var Biltong = root.Biltong = { + version:"0.4.0" + }; + + if (typeof exports !== "undefined") { + exports.Biltong = Biltong; + } + + var _isa = function(a) { return Object.prototype.toString.call(a) === "[object Array]"; }, + _pointHelper = function(p1, p2, fn) { + p1 = _isa(p1) ? p1 : [p1.x, p1.y]; + p2 = _isa(p2) ? p2 : [p2.x, p2.y]; + return fn(p1, p2); + }, + /** + * @name Biltong.gradient + * @function + * @desc Calculates the gradient of a line between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The gradient of a line between the two points. + */ + _gradient = Biltong.gradient = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + if (_p2[0] == _p1[0]) + return _p2[1] > _p1[1] ? Infinity : -Infinity; + else if (_p2[1] == _p1[1]) + return _p2[0] > _p1[0] ? 0 : -0; + else + return (_p2[1] - _p1[1]) / (_p2[0] - _p1[0]); + }); + }, + /** + * @name Biltong.normal + * @function + * @desc Calculates the gradient of a normal to a line between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The gradient of a normal to a line between the two points. + */ + _normal = Biltong.normal = function(p1, p2) { + return -1 / _gradient(p1, p2); + }, + /** + * @name Biltong.lineLength + * @function + * @desc Calculates the length of a line between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The length of a line between the two points. + */ + _lineLength = Biltong.lineLength = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + return Math.sqrt(Math.pow(_p2[1] - _p1[1], 2) + Math.pow(_p2[0] - _p1[0], 2)); + }); + }, + /** + * @name Biltong.quadrant + * @function + * @desc Calculates the quadrant in which the angle between the two points lies. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Integer} The quadrant - 1 for upper right, 2 for lower right, 3 for lower left, 4 for upper left. + */ + _quadrant = Biltong.quadrant = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + if (_p2[0] > _p1[0]) { + return (_p2[1] > _p1[1]) ? 2 : 1; + } + else if (_p2[0] == _p1[0]) { + return _p2[1] > _p1[1] ? 2 : 1; + } + else { + return (_p2[1] > _p1[1]) ? 3 : 4; + } + }); + }, + /** + * @name Biltong.theta + * @function + * @desc Calculates the angle between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The angle between the two points. + */ + _theta = Biltong.theta = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + var m = _gradient(_p1, _p2), + t = Math.atan(m), + s = _quadrant(_p1, _p2); + if ((s == 4 || s== 3)) t += Math.PI; + if (t < 0) t += (2 * Math.PI); + + return t; + }); + }, + /** + * @name Biltong.intersects + * @function + * @desc Calculates whether or not the two rectangles intersect. + * @param {Rectangle} r1 First rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @param {Rectangle} r2 Second rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @return {Boolean} True if the rectangles intersect, false otherwise. + */ + _intersects = Biltong.intersects = function(r1, r2) { + var x1 = r1.x, x2 = r1.x + r1.w, y1 = r1.y, y2 = r1.y + r1.h, + a1 = r2.x, a2 = r2.x + r2.w, b1 = r2.y, b2 = r2.y + r2.h; + + return ( (x1 <= a1 && a1 <= x2) && (y1 <= b1 && b1 <= y2) ) || + ( (x1 <= a2 && a2 <= x2) && (y1 <= b1 && b1 <= y2) ) || + ( (x1 <= a1 && a1 <= x2) && (y1 <= b2 && b2 <= y2) ) || + ( (x1 <= a2 && a1 <= x2) && (y1 <= b2 && b2 <= y2) ) || + ( (a1 <= x1 && x1 <= a2) && (b1 <= y1 && y1 <= b2) ) || + ( (a1 <= x2 && x2 <= a2) && (b1 <= y1 && y1 <= b2) ) || + ( (a1 <= x1 && x1 <= a2) && (b1 <= y2 && y2 <= b2) ) || + ( (a1 <= x2 && x1 <= a2) && (b1 <= y2 && y2 <= b2) ); + }, + /** + * @name Biltong.encloses + * @function + * @desc Calculates whether or not r2 is completely enclosed by r1. + * @param {Rectangle} r1 First rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @param {Rectangle} r2 Second rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @param {Boolean} [allowSharedEdges=false] If true, the concept of enclosure allows for one or more edges to be shared by the two rectangles. + * @return {Boolean} True if r1 encloses r2, false otherwise. + */ + _encloses = Biltong.encloses = function(r1, r2, allowSharedEdges) { + var x1 = r1.x, x2 = r1.x + r1.w, y1 = r1.y, y2 = r1.y + r1.h, + a1 = r2.x, a2 = r2.x + r2.w, b1 = r2.y, b2 = r2.y + r2.h, + c = function(v1, v2, v3, v4) { return allowSharedEdges ? v1 <= v2 && v3>= v4 : v1 < v2 && v3 > v4; }; + + return c(x1,a1,x2,a2) && c(y1,b1,y2,b2); + }, + _segmentMultipliers = [null, [1, -1], [1, 1], [-1, 1], [-1, -1] ], + _inverseSegmentMultipliers = [null, [-1, -1], [-1, 1], [1, 1], [1, -1] ], + /** + * @name Biltong.pointOnLine + * @function + * @desc Calculates a point on the line from `fromPoint` to `toPoint` that is `distance` units along the length of the line. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Point} Point on the line, in the form `{ x:..., y:... }`. + */ + _pointOnLine = Biltong.pointOnLine = function(fromPoint, toPoint, distance) { + var m = _gradient(fromPoint, toPoint), + s = _quadrant(fromPoint, toPoint), + segmentMultiplier = distance > 0 ? _segmentMultipliers[s] : _inverseSegmentMultipliers[s], + theta = Math.atan(m), + y = Math.abs(distance * Math.sin(theta)) * segmentMultiplier[1], + x = Math.abs(distance * Math.cos(theta)) * segmentMultiplier[0]; + return { x:fromPoint.x + x, y:fromPoint.y + y }; + }, + /** + * @name Biltong.perpendicularLineTo + * @function + * @desc Calculates a line of length `length` that is perpendicular to the line from `fromPoint` to `toPoint` and passes through `toPoint`. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Line} Perpendicular line, in the form `[ { x:..., y:... }, { x:..., y:... } ]`. + */ + _perpendicularLineTo = Biltong.perpendicularLineTo = function(fromPoint, toPoint, length) { + var m = _gradient(fromPoint, toPoint), + theta2 = Math.atan(-1 / m), + y = length / 2 * Math.sin(theta2), + x = length / 2 * Math.cos(theta2); + return [{x:toPoint.x + x, y:toPoint.y + y}, {x:toPoint.x - x, y:toPoint.y - y}]; + }; +}).call(typeof window !== 'undefined' ? window : this); +; +(function () { + + "use strict"; + + /** + * Creates a Touch object. + * @param view + * @param target + * @param pageX + * @param pageY + * @param screenX + * @param screenY + * @param clientX + * @param clientY + * @returns {Touch} + * @private + */ + function _touch(view, target, pageX, pageY, screenX, screenY, clientX, clientY) { + + return new Touch({ + target:target, + identifier:_uuid(), + pageX: pageX, + pageY: pageY, + screenX: screenX, + screenY: screenY, + clientX: clientX || screenX, + clientY: clientY || screenY + }); + } + + /** + * Create a synthetic touch list from the given list of Touch objects. + * @returns {Array} + * @private + */ + function _touchList() { + var list = []; + Array.prototype.push.apply(list, arguments); + list.item = function(index) { return this[index]; }; + return list; + } + + /** + * Create a Touch object and then insert it into a synthetic touch list, returning the list.s + * @param view + * @param target + * @param pageX + * @param pageY + * @param screenX + * @param screenY + * @param clientX + * @param clientY + * @returns {Array} + * @private + */ + function _touchAndList(view, target, pageX, pageY, screenX, screenY, clientX, clientY) { + return _touchList(_touch.apply(null, arguments)); + } + + var root = this, + matchesSelector = function (el, selector, ctx) { + ctx = ctx || el.parentNode; + var possibles = ctx.querySelectorAll(selector); + for (var i = 0; i < possibles.length; i++) { + if (possibles[i] === el) { + return true; + } + } + return false; + }, + _gel = function (el) { + return (typeof el == "string" || el.constructor === String) ? document.getElementById(el) : el; + }, + _t = function (e) { + return e.srcElement || e.target; + }, + // + // gets path info for the given event - the path from target to obj, in the event's bubble chain. if doCompute + // is false we just return target for the path. + // + _pi = function(e, target, obj, doCompute) { + if (!doCompute) return { path:[target], end:1 }; + else if (typeof e.path !== "undefined" && e.path.indexOf) { + return { path: e.path, end: e.path.indexOf(obj) }; + } else { + var out = { path:[], end:-1 }, _one = function(el) { + out.path.push(el); + if (el === obj) { + out.end = out.path.length - 1; + } + else if (el.parentNode != null) { + _one(el.parentNode) + } + }; + _one(target); + return out; + } + }, + _d = function (l, fn) { + for (var i = 0, j = l.length; i < j; i++) { + if (l[i] == fn) break; + } + if (i < l.length) l.splice(i, 1); + }, + guid = 1, + // + // this function generates a guid for every handler, sets it on the handler, then adds + // it to the associated object's map of handlers for the given event. this is what enables us + // to unbind all events of some type, or all events (the second of which can be requested by the user, + // but it also used by Mottle when an element is removed.) + _store = function (obj, event, fn) { + var g = guid++; + obj.__ta = obj.__ta || {}; + obj.__ta[event] = obj.__ta[event] || {}; + // store each handler with a unique guid. + obj.__ta[event][g] = fn; + // set the guid on the handler. + fn.__tauid = g; + return g; + }, + _unstore = function (obj, event, fn) { + obj.__ta && obj.__ta[event] && delete obj.__ta[event][fn.__tauid]; + // a handler might have attached extra functions, so we unbind those too. + if (fn.__taExtra) { + for (var i = 0; i < fn.__taExtra.length; i++) { + _unbind(obj, fn.__taExtra[i][0], fn.__taExtra[i][1]); + } + fn.__taExtra.length = 0; + } + // a handler might have attached an unstore callback + fn.__taUnstore && fn.__taUnstore(); + }, + _curryChildFilter = function (children, obj, fn, evt) { + if (children == null) return fn; + else { + var c = children.split(","), + _fn = function (e) { + _fn.__tauid = fn.__tauid; + var t = _t(e), target = t; // t is the target element on which the event occurred. it is the + // element we will wish to pass to any callbacks. + var pathInfo = _pi(e, t, obj, children != null) + if (pathInfo.end != -1) { + for (var p = 0; p < pathInfo.end; p++) { + target = pathInfo.path[p]; + for (var i = 0; i < c.length; i++) { + if (matchesSelector(target, c[i], obj)) { + fn.apply(target, arguments); + } + } + } + } + }; + registerExtraFunction(fn, evt, _fn); + return _fn; + } + }, + // + // registers an 'extra' function on some event listener function we were given - a function that we + // created and bound to the element as part of our housekeeping, and which we want to unbind and remove + // whenever the given function is unbound. + registerExtraFunction = function (fn, evt, newFn) { + fn.__taExtra = fn.__taExtra || []; + fn.__taExtra.push([evt, newFn]); + }, + DefaultHandler = function (obj, evt, fn, children) { + if (isTouchDevice && touchMap[evt]) { + var tfn = _curryChildFilter(children, obj, fn, touchMap[evt]); + _bind(obj, touchMap[evt], tfn , fn); + } + if (evt === "focus" && obj.getAttribute("tabindex") == null) { + obj.setAttribute("tabindex", "1"); + } + _bind(obj, evt, _curryChildFilter(children, obj, fn, evt), fn); + }, + SmartClickHandler = function (obj, evt, fn, children) { + if (obj.__taSmartClicks == null) { + var down = function (e) { + obj.__tad = _pageLocation(e); + }, + up = function (e) { + obj.__tau = _pageLocation(e); + }, + click = function (e) { + if (obj.__tad && obj.__tau && obj.__tad[0] === obj.__tau[0] && obj.__tad[1] === obj.__tau[1]) { + for (var i = 0; i < obj.__taSmartClicks.length; i++) + obj.__taSmartClicks[i].apply(_t(e), [ e ]); + } + }; + DefaultHandler(obj, "mousedown", down, children); + DefaultHandler(obj, "mouseup", up, children); + DefaultHandler(obj, "click", click, children); + obj.__taSmartClicks = []; + } + + // store in the list of callbacks + obj.__taSmartClicks.push(fn); + // the unstore function removes this function from the object's listener list for this type. + fn.__taUnstore = function () { + _d(obj.__taSmartClicks, fn); + }; + }, + _tapProfiles = { + "tap": {touches: 1, taps: 1}, + "dbltap": {touches: 1, taps: 2}, + "contextmenu": {touches: 2, taps: 1} + }, + TapHandler = function (clickThreshold, dblClickThreshold) { + return function (obj, evt, fn, children) { + // if event is contextmenu, for devices which are mouse only, we want to + // use the default bind. + if (evt == "contextmenu" && isMouseDevice) + DefaultHandler(obj, evt, fn, children); + else { + // the issue here is that this down handler gets registered only for the + // child nodes in the first registration. in fact it should be registered with + // no child selector and then on down we should cycle through the registered + // functions to see if one of them matches. on mouseup we should execute ALL of + // the functions whose children are either null or match the element. + if (obj.__taTapHandler == null) { + var tt = obj.__taTapHandler = { + tap: [], + dbltap: [], + contextmenu: [], + down: false, + taps: 0, + downSelectors: [] + }; + var down = function (e) { + var target = _t(e), pathInfo = _pi(e, target, obj, children != null), finished = false; + for (var p = 0; p < pathInfo.end; p++) { + if (finished) return; + target = pathInfo.path[p]; + for (var i = 0; i < tt.downSelectors.length; i++) { + if (tt.downSelectors[i] == null || matchesSelector(target, tt.downSelectors[i], obj)) { + tt.down = true; + setTimeout(clearSingle, clickThreshold); + setTimeout(clearDouble, dblClickThreshold); + finished = true; + break; // we only need one match on mousedown + } + } + } + }, + up = function (e) { + if (tt.down) { + var target = _t(e), currentTarget, pathInfo; + tt.taps++; + var tc = _touchCount(e); + for (var eventId in _tapProfiles) { + if (_tapProfiles.hasOwnProperty(eventId)) { + var p = _tapProfiles[eventId]; + if (p.touches === tc && (p.taps === 1 || p.taps === tt.taps)) { + for (var i = 0; i < tt[eventId].length; i++) { + pathInfo = _pi(e, target, obj, tt[eventId][i][1] != null); + for (var pLoop = 0; pLoop < pathInfo.end; pLoop++) { + currentTarget = pathInfo.path[pLoop]; + // this is a single event registration handler. + if (tt[eventId][i][1] == null || matchesSelector(currentTarget, tt[eventId][i][1], obj)) { + tt[eventId][i][0].apply(currentTarget, [ e ]); + break; + } + } + } + } + } + } + } + }, + clearSingle = function () { + tt.down = false; + }, + clearDouble = function () { + tt.taps = 0; + }; + + DefaultHandler(obj, "mousedown", down); + DefaultHandler(obj, "mouseup", up); + } + // add this child selector (it can be null, that's fine). + obj.__taTapHandler.downSelectors.push(children); + + obj.__taTapHandler[evt].push([fn, children]); + // the unstore function removes this function from the object's listener list for this type. + fn.__taUnstore = function () { + _d(obj.__taTapHandler[evt], fn); + }; + } + }; + }, + meeHelper = function (type, evt, obj, target) { + for (var i in obj.__tamee[type]) { + if (obj.__tamee[type].hasOwnProperty(i)) { + obj.__tamee[type][i].apply(target, [ evt ]); + } + } + }, + MouseEnterExitHandler = function () { + var activeElements = []; + return function (obj, evt, fn, children) { + if (!obj.__tamee) { + // __tamee holds a flag saying whether the mouse is currently "in" the element, and a list of + // both mouseenter and mouseexit functions. + obj.__tamee = { over: false, mouseenter: [], mouseexit: [] }; + // register over and out functions + var over = function (e) { + var t = _t(e); + if ((children == null && (t == obj && !obj.__tamee.over)) || (matchesSelector(t, children, obj) && (t.__tamee == null || !t.__tamee.over))) { + meeHelper("mouseenter", e, obj, t); + t.__tamee = t.__tamee || {}; + t.__tamee.over = true; + activeElements.push(t); + } + }, + out = function (e) { + var t = _t(e); + // is the current target one of the activeElements? and is the + // related target NOT a descendant of it? + for (var i = 0; i < activeElements.length; i++) { + if (t == activeElements[i] && !matchesSelector((e.relatedTarget || e.toElement), "*", t)) { + t.__tamee.over = false; + activeElements.splice(i, 1); + meeHelper("mouseexit", e, obj, t); + } + } + }; + + _bind(obj, "mouseover", _curryChildFilter(children, obj, over, "mouseover"), over); + _bind(obj, "mouseout", _curryChildFilter(children, obj, out, "mouseout"), out); + } + + fn.__taUnstore = function () { + delete obj.__tamee[evt][fn.__tauid]; + }; + + _store(obj, evt, fn); + obj.__tamee[evt][fn.__tauid] = fn; + }; + }, + isTouchDevice = "ontouchstart" in document.documentElement || navigator.maxTouchPoints, + isMouseDevice = "onmousedown" in document.documentElement, + touchMap = { "mousedown": "touchstart", "mouseup": "touchend", "mousemove": "touchmove" }, + touchstart = "touchstart", touchend = "touchend", touchmove = "touchmove", + iev = (function () { + var rv = -1; + if (navigator.appName == 'Microsoft Internet Explorer') { + var ua = navigator.userAgent, + re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); + if (re.exec(ua) != null) + rv = parseFloat(RegExp.$1); + } + return rv; + })(), + isIELT9 = iev > -1 && iev < 9, + _genLoc = function (e, prefix) { + if (e == null) return [ 0, 0 ]; + var ts = _touches(e), t = _getTouch(ts, 0); + return [t[prefix + "X"], t[prefix + "Y"]]; + }, + _pageLocation = function (e) { + if (e == null) return [ 0, 0 ]; + if (isIELT9) { + return [ e.clientX + document.documentElement.scrollLeft, e.clientY + document.documentElement.scrollTop ]; + } + else { + return _genLoc(e, "page"); + } + }, + _screenLocation = function (e) { + return _genLoc(e, "screen"); + }, + _clientLocation = function (e) { + return _genLoc(e, "client"); + }, + _getTouch = function (touches, idx) { + return touches.item ? touches.item(idx) : touches[idx]; + }, + _touches = function (e) { + return e.touches && e.touches.length > 0 ? e.touches : + e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches : + e.targetTouches && e.targetTouches.length > 0 ? e.targetTouches : + [ e ]; + }, + _touchCount = function (e) { + return _touches(e).length; + }, + //http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html + _bind = function (obj, type, fn, originalFn) { + _store(obj, type, fn); + originalFn.__tauid = fn.__tauid; + if (obj.addEventListener) + obj.addEventListener(type, fn, false); + else if (obj.attachEvent) { + var key = type + fn.__tauid; + obj["e" + key] = fn; + // TODO look at replacing with .call(..) + obj[key] = function () { + obj["e" + key] && obj["e" + key](window.event); + }; + obj.attachEvent("on" + type, obj[key]); + } + }, + _unbind = function (obj, type, fn) { + if (fn == null) return; + _each(obj, function () { + var _el = _gel(this); + _unstore(_el, type, fn); + // it has been bound if there is a tauid. otherwise it was not bound and we can ignore it. + if (fn.__tauid != null) { + if (_el.removeEventListener) { + _el.removeEventListener(type, fn, false); + if (isTouchDevice && touchMap[type]) _el.removeEventListener(touchMap[type], fn, false); + } + else if (this.detachEvent) { + var key = type + fn.__tauid; + _el[key] && _el.detachEvent("on" + type, _el[key]); + _el[key] = null; + _el["e" + key] = null; + } + } + + // if a touch event was also registered, deregister now. + if (fn.__taTouchProxy) { + _unbind(obj, fn.__taTouchProxy[1], fn.__taTouchProxy[0]); + } + }); + }, + _each = function (obj, fn) { + if (obj == null) return; + // if a list (or list-like), use it. if a string, get a list + // by running the string through querySelectorAll. else, assume + // it's an Element. + // obj.top is "unknown" in IE8. + obj = (typeof Window !== "undefined" && (typeof obj.top !== "unknown" && obj == obj.top)) ? [ obj ] : + (typeof obj !== "string") && (obj.tagName == null && obj.length != null) ? obj : + typeof obj === "string" ? document.querySelectorAll(obj) + : [ obj ]; + + for (var i = 0; i < obj.length; i++) + fn.apply(obj[i]); + }, + _uuid = function () { + return ('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + })); + }; + + /** + * Mottle offers support for abstracting out the differences + * between touch and mouse devices, plus "smart click" functionality + * (don't fire click if the mouse has moved between mousedown and mouseup), + * and synthesized click/tap events. + * @class Mottle + * @constructor + * @param {Object} params Constructor params + * @param {Number} [params.clickThreshold=250] Threshold, in milliseconds beyond which a touchstart followed by a touchend is not considered to be a click. + * @param {Number} [params.dblClickThreshold=450] Threshold, in milliseconds beyond which two successive tap events are not considered to be a click. + * @param {Boolean} [params.smartClicks=false] If true, won't fire click events if the mouse has moved between mousedown and mouseup. Note that this functionality + * requires that Mottle consume the mousedown event, and so may not be viable in all use cases. + */ + root.Mottle = function (params) { + params = params || {}; + var clickThreshold = params.clickThreshold || 250, + dblClickThreshold = params.dblClickThreshold || 450, + mouseEnterExitHandler = new MouseEnterExitHandler(), + tapHandler = new TapHandler(clickThreshold, dblClickThreshold), + _smartClicks = params.smartClicks, + _doBind = function (obj, evt, fn, children) { + if (fn == null) return; + _each(obj, function () { + var _el = _gel(this); + if (_smartClicks && evt === "click") + SmartClickHandler(_el, evt, fn, children); + else if (evt === "tap" || evt === "dbltap" || evt === "contextmenu") { + tapHandler(_el, evt, fn, children); + } + else if (evt === "mouseenter" || evt == "mouseexit") + mouseEnterExitHandler(_el, evt, fn, children); + else + DefaultHandler(_el, evt, fn, children); + }); + }; + + /** + * Removes an element from the DOM, and deregisters all event handlers for it. You should use this + * to ensure you don't leak memory. + * @method remove + * @param {String|Element} el Element, or id of the element, to remove. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.remove = function (el) { + _each(el, function () { + var _el = _gel(this); + if (_el.__ta) { + for (var evt in _el.__ta) { + if (_el.__ta.hasOwnProperty(evt)) { + for (var h in _el.__ta[evt]) { + if (_el.__ta[evt].hasOwnProperty(h)) + _unbind(_el, evt, _el.__ta[evt][h]); + } + } + } + } + _el.parentNode && _el.parentNode.removeChild(_el); + }); + return this; + }; + + /** + * Register an event handler, optionally as a delegate for some set of descendant elements. Note + * that this method takes either 3 or 4 arguments - if you supply 3 arguments it is assumed you have + * omitted the `children` parameter, and that the event handler should be bound directly to the given element. + * @method on + * @param {Element[]|Element|String} el Either an Element, or a CSS spec for a list of elements, or an array of Elements. + * @param {String} [children] Comma-delimited list of selectors identifying allowed children. + * @param {String} event Event ID. + * @param {Function} fn Event handler function. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.on = function (el, event, children, fn) { + var _el = arguments[0], + _c = arguments.length == 4 ? arguments[2] : null, + _e = arguments[1], + _f = arguments[arguments.length - 1]; + + _doBind(_el, _e, _f, _c); + return this; + }; + + /** + * Cancel delegate event handling for the given function. Note that unlike with 'on' you do not supply + * a list of child selectors here: it removes event delegation from all of the child selectors for which the + * given function was registered (if any). + * @method off + * @param {Element[]|Element|String} el Element - or ID of element - from which to remove event listener. + * @param {String} event Event ID. + * @param {Function} fn Event handler function. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.off = function (el, event, fn) { + _unbind(el, event, fn); + return this; + }; + + /** + * Triggers some event for a given element. + * @method trigger + * @param {Element} el Element for which to trigger the event. + * @param {String} event Event ID. + * @param {Event} originalEvent The original event. Should be optional of course, but currently is not, due + * to the jsPlumb use case that caused this method to be added. + * @param {Object} [payload] Optional object to set as `payload` on the generated event; useful for message passing. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.trigger = function (el, event, originalEvent, payload) { + // MouseEvent undefined in old IE; that's how we know it's a mouse event. A fine Microsoft paradox. + var originalIsMouse = isMouseDevice && (typeof MouseEvent === "undefined" || originalEvent == null || originalEvent.constructor === MouseEvent); + + var eventToBind = (isTouchDevice && !isMouseDevice && touchMap[event]) ? touchMap[event] : event, + bindingAMouseEvent = !(isTouchDevice && !isMouseDevice && touchMap[event]); + + var pl = _pageLocation(originalEvent), sl = _screenLocation(originalEvent), cl = _clientLocation(originalEvent); + _each(el, function () { + var _el = _gel(this), evt; + originalEvent = originalEvent || { + screenX: sl[0], + screenY: sl[1], + clientX: cl[0], + clientY: cl[1] + }; + + var _decorate = function (_evt) { + if (payload) _evt.payload = payload; + }; + + var eventGenerators = { + "TouchEvent": function (evt) { + + var touchList = _touchAndList(window, _el, 0, pl[0], pl[1], sl[0], sl[1], cl[0], cl[1]), + init = evt.initTouchEvent || evt.initEvent; + + init(eventToBind, true, true, window, null, sl[0], sl[1], + cl[0], cl[1], false, false, false, false, + touchList, touchList, touchList, 1, 0); + }, + "MouseEvents": function (evt) { + evt.initMouseEvent(eventToBind, true, true, window, 0, + sl[0], sl[1], + cl[0], cl[1], + false, false, false, false, 1, _el); + } + }; + + if (document.createEvent) { + + var ite = !bindingAMouseEvent && !originalIsMouse && (isTouchDevice && touchMap[event]), + evtName = ite ? "TouchEvent" : "MouseEvents"; + + evt = document.createEvent(evtName); + eventGenerators[evtName](evt); + _decorate(evt); + _el.dispatchEvent(evt); + } + else if (document.createEventObject) { + evt = document.createEventObject(); + evt.eventType = evt.eventName = eventToBind; + evt.screenX = sl[0]; + evt.screenY = sl[1]; + evt.clientX = cl[0]; + evt.clientY = cl[1]; + _decorate(evt); + _el.fireEvent('on' + eventToBind, evt); + } + }); + return this; + } + }; + + /** + * Static method to assist in 'consuming' an element: uses `stopPropagation` where available, or sets + * `e.returnValue=false` where it is not. + * @method Mottle.consume + * @param {Event} e Event to consume + * @param {Boolean} [doNotPreventDefault=false] If true, does not call `preventDefault()` on the event. + */ + root.Mottle.consume = function (e, doNotPreventDefault) { + if (e.stopPropagation) + e.stopPropagation(); + else + e.returnValue = false; + + if (!doNotPreventDefault && e.preventDefault) + e.preventDefault(); + }; + + /** + * Gets the page location corresponding to the given event. For touch events this means get the page location of the first touch. + * @method Mottle.pageLocation + * @param {Event} e Event to get page location for. + * @return {Number[]} [left, top] for the given event. + */ + root.Mottle.pageLocation = _pageLocation; + + /** + * Forces touch events to be turned "on". Useful for testing: even if you don't have a touch device, you can still + * trigger a touch event when this is switched on and it will be captured and acted on. + * @method setForceTouchEvents + * @param {Boolean} value If true, force touch events to be on. + */ + root.Mottle.setForceTouchEvents = function (value) { + isTouchDevice = value; + }; + + /** + * Forces mouse events to be turned "on". Useful for testing: even if you don't have a mouse, you can still + * trigger a mouse event when this is switched on and it will be captured and acted on. + * @method setForceMouseEvents + * @param {Boolean} value If true, force mouse events to be on. + */ + root.Mottle.setForceMouseEvents = function (value) { + isMouseDevice = value; + }; + + root.Mottle.version = "0.8.0"; + + if (typeof exports !== "undefined") { + exports.Mottle = root.Mottle; + } + +}).call(typeof window === "undefined" ? this : window); + +/** + drag/drop functionality for use with jsPlumb but with + no knowledge of jsPlumb. supports multiple scopes (separated by whitespace), dragging + multiple elements, constrain to parent, drop filters, drag start filters, custom + css classes. + + a lot of the functionality of this script is expected to be plugged in: + + addClass + removeClass + + addEvent + removeEvent + + getPosition + setPosition + getSize + + indexOf + intersects + + the name came from here: + + http://mrsharpoblunto.github.io/foswig.js/ + + copyright 2016 jsPlumb + */ + +;(function() { + + "use strict"; + var root = this; + + var _suggest = function(list, item, head) { + if (list.indexOf(item) === -1) { + head ? list.unshift(item) : list.push(item); + return true; + } + return false; + }; + + var _vanquish = function(list, item) { + var idx = list.indexOf(item); + if (idx !== -1) list.splice(idx, 1); + }; + + var _difference = function(l1, l2) { + var d = []; + for (var i = 0; i < l1.length; i++) { + if (l2.indexOf(l1[i]) === -1) + d.push(l1[i]); + } + return d; + }; + + var _isString = function(f) { + return f == null ? false : (typeof f === "string" || f.constructor === String); + }; + + var getOffsetRect = function (elem) { + // (1) + var box = elem.getBoundingClientRect(), + body = document.body, + docElem = document.documentElement, + // (2) + scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop, + scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft, + // (3) + clientTop = docElem.clientTop || body.clientTop || 0, + clientLeft = docElem.clientLeft || body.clientLeft || 0, + // (4) + top = box.top + scrollTop - clientTop, + left = box.left + scrollLeft - clientLeft; + + return { top: Math.round(top), left: Math.round(left) }; + }; + + var matchesSelector = function(el, selector, ctx) { + ctx = ctx || el.parentNode; + var possibles = ctx.querySelectorAll(selector); + for (var i = 0; i < possibles.length; i++) { + if (possibles[i] === el) + return true; + } + return false; + }; + + var findDelegateElement = function(parentElement, childElement, selector) { + if (matchesSelector(childElement, selector, parentElement)) { + return childElement; + } else { + var currentParent = childElement.parentNode; + while (currentParent != null && currentParent !== parentElement) { + if (matchesSelector(currentParent, selector, parentElement)) { + return currentParent; + } else { + currentParent = currentParent.parentNode; + } + } + } + }; + + /** + * Finds all elements matching the given selector, for the given parent. In order to support "scoped root" selectors, + * ie. things like "> .someClass", that is .someClass elements that are direct children of `parentElement`, we have to + * jump through a small hoop here: when a delegate draggable is registered, we write a `katavorio-draggable` attribute + * on the element on which the draggable is registered. Then when this method runs, we grab the value of that attribute and + * prepend it as part of the selector we're looking for. So "> .someClass" ends up being written as + * "[katavorio-draggable='...' > .someClass]", which works with querySelectorAll. + * + * @param availableSelectors + * @param parentElement + * @param childElement + * @returns {*} + */ + var findMatchingSelector = function(availableSelectors, parentElement, childElement) { + var el = null; + var draggableId = parentElement.getAttribute("katavorio-draggable"), + prefix = draggableId != null ? "[katavorio-draggable='" + draggableId + "'] " : ""; + + for (var i = 0; i < availableSelectors.length; i++) { + el = findDelegateElement(parentElement, childElement, prefix + availableSelectors[i].selector); + if (el != null) { + if (availableSelectors[i].filter) { + var matches = matchesSelector(childElement, availableSelectors[i].filter, el), + exclude = availableSelectors[i].filterExclude === true; + + if ( (exclude && !matches) || matches) { + return null; + } + + } + return [ availableSelectors[i], el ]; + } + } + return null; + }; + + var iev = (function() { + var rv = -1; + if (navigator.appName === 'Microsoft Internet Explorer') { + var ua = navigator.userAgent, + re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); + if (re.exec(ua) != null) + rv = parseFloat(RegExp.$1); + } + return rv; + })(), + DEFAULT_GRID_X = 10, + DEFAULT_GRID_Y = 10, + isIELT9 = iev > -1 && iev < 9, + isIE9 = iev === 9, + _pl = function(e) { + if (isIELT9) { + return [ e.clientX + document.documentElement.scrollLeft, e.clientY + document.documentElement.scrollTop ]; + } + else { + var ts = _touches(e), t = _getTouch(ts, 0); + // for IE9 pageX might be null if the event was synthesized. We try for pageX/pageY first, + // falling back to clientX/clientY if necessary. In every other browser we want to use pageX/pageY. + return isIE9 ? [t.pageX || t.clientX, t.pageY || t.clientY] : [t.pageX, t.pageY]; + } + }, + _getTouch = function(touches, idx) { return touches.item ? touches.item(idx) : touches[idx]; }, + _touches = function(e) { + return e.touches && e.touches.length > 0 ? e.touches : + e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches : + e.targetTouches && e.targetTouches.length > 0 ? e.targetTouches : + [ e ]; + }, + _classes = { + delegatedDraggable:"katavorio-delegated-draggable", // elements that are the delegated drag handler for a bunch of other elements + draggable:"katavorio-draggable", // draggable elements + droppable:"katavorio-droppable", // droppable elements + drag : "katavorio-drag", // elements currently being dragged + selected:"katavorio-drag-selected", // elements in current drag selection + active : "katavorio-drag-active", // droppables that are targets of a currently dragged element + hover : "katavorio-drag-hover", // droppables over which a matching drag element is hovering + noSelect : "katavorio-drag-no-select", // added to the body to provide a hook to suppress text selection + ghostProxy:"katavorio-ghost-proxy", // added to a ghost proxy element in use when a drag has exited the bounds of its parent. + clonedDrag:"katavorio-clone-drag" // added to a node that is a clone of an element created at the start of a drag + }, + _defaultScope = "katavorio-drag-scope", + _events = [ "stop", "start", "drag", "drop", "over", "out", "beforeStart" ], + _devNull = function() {}, + _true = function() { return true; }, + _foreach = function(l, fn, from) { + for (var i = 0; i < l.length; i++) { + if (l[i] != from) + fn(l[i]); + } + }, + _setDroppablesActive = function(dd, val, andHover, drag) { + _foreach(dd, function(e) { + e.setActive(val); + if (val) e.updatePosition(); + if (andHover) e.setHover(drag, val); + }); + }, + _each = function(obj, fn) { + if (obj == null) return; + obj = !_isString(obj) && (obj.tagName == null && obj.length != null) ? obj : [ obj ]; + for (var i = 0; i < obj.length; i++) + fn.apply(obj[i], [ obj[i] ]); + }, + _consume = function(e) { + if (e.stopPropagation) { + e.stopPropagation(); + e.preventDefault(); + } + else { + e.returnValue = false; + } + }, + _defaultInputFilterSelector = "input,textarea,select,button,option", + // + // filters out events on all input elements, like textarea, checkbox, input, select. + _inputFilter = function(e, el, _katavorio) { + var t = e.srcElement || e.target; + return !matchesSelector(t, _katavorio.getInputFilterSelector(), el); + }; + + var Super = function(el, params, css, scope) { + this.params = params || {}; + this.el = el; + this.params.addClass(this.el, this._class); + this.uuid = _uuid(); + var enabled = true; + this.setEnabled = function(e) { enabled = e; }; + this.isEnabled = function() { return enabled; }; + this.toggleEnabled = function() { enabled = !enabled; }; + this.setScope = function(scopes) { + this.scopes = scopes ? scopes.split(/\s+/) : [ scope ]; + }; + this.addScope = function(scopes) { + var m = {}; + _each(this.scopes, function(s) { m[s] = true;}); + _each(scopes ? scopes.split(/\s+/) : [], function(s) { m[s] = true;}); + this.scopes = []; + for (var i in m) this.scopes.push(i); + }; + this.removeScope = function(scopes) { + var m = {}; + _each(this.scopes, function(s) { m[s] = true;}); + _each(scopes ? scopes.split(/\s+/) : [], function(s) { delete m[s];}); + this.scopes = []; + for (var i in m) this.scopes.push(i); + }; + this.toggleScope = function(scopes) { + var m = {}; + _each(this.scopes, function(s) { m[s] = true;}); + _each(scopes ? scopes.split(/\s+/) : [], function(s) { + if (m[s]) delete m[s]; + else m[s] = true; + }); + this.scopes = []; + for (var i in m) this.scopes.push(i); + }; + this.setScope(params.scope); + this.k = params.katavorio; + return params.katavorio; + }; + + var TRUE = function() { return true; }; + var FALSE = function() { return false; }; + + var Drag = function(el, params, css, scope) { + this._class = css.draggable; + var k = Super.apply(this, arguments); + this.rightButtonCanDrag = this.params.rightButtonCanDrag; + var downAt = [0,0], posAtDown = null, pagePosAtDown = null, pageDelta = [0,0], moving = false, initialScroll = [0,0], + consumeStartEvent = this.params.consumeStartEvent !== false, + dragEl = this.el, + clone = this.params.clone, + scroll = this.params.scroll, + _multipleDrop = params.multipleDrop !== false, + isConstrained = false, + useGhostProxy = params.ghostProxy === true ? TRUE : params.ghostProxy && typeof params.ghostProxy === "function" ? params.ghostProxy : FALSE, + ghostProxy = function(el) { return el.cloneNode(true); }, + elementToDrag = null, + availableSelectors = [], + activeSelectorParams = null, // which, if any, selector config is currently active. + ghostProxyParent = params.ghostProxyParent, + currentParentPosition, + ghostParentPosition, + ghostDx, + ghostDy; + + // if an initial selector was provided, push the entire set of params as a selector config. + if (params.selector) { + var draggableId = el.getAttribute("katavorio-draggable"); + if (draggableId == null) { + draggableId = "" + new Date().getTime(); + el.setAttribute("katavorio-draggable", draggableId); + } + + availableSelectors.push(params); + } + + var snapThreshold = params.snapThreshold, + _snap = function(pos, gridX, gridY, thresholdX, thresholdY) { + var _dx = Math.floor(pos[0] / gridX), + _dxl = gridX * _dx, + _dxt = _dxl + gridX, + _x = Math.abs(pos[0] - _dxl) <= thresholdX ? _dxl : Math.abs(_dxt - pos[0]) <= thresholdX ? _dxt : pos[0]; + + var _dy = Math.floor(pos[1] / gridY), + _dyl = gridY * _dy, + _dyt = _dyl + gridY, + _y = Math.abs(pos[1] - _dyl) <= thresholdY ? _dyl : Math.abs(_dyt - pos[1]) <= thresholdY ? _dyt : pos[1]; + + return [ _x, _y]; + }; + + this.posses = []; + this.posseRoles = {}; + + this.toGrid = function(pos) { + if (this.params.grid == null) { + return pos; + } + else { + var tx = this.params.grid ? this.params.grid[0] / 2 : snapThreshold ? snapThreshold : DEFAULT_GRID_X / 2, + ty = this.params.grid ? this.params.grid[1] / 2 : snapThreshold ? snapThreshold : DEFAULT_GRID_Y / 2; + + return _snap(pos, this.params.grid[0], this.params.grid[1], tx, ty); + } + }; + + this.snap = function(x, y) { + if (dragEl == null) return; + x = x || (this.params.grid ? this.params.grid[0] : DEFAULT_GRID_X); + y = y || (this.params.grid ? this.params.grid[1] : DEFAULT_GRID_Y); + var p = this.params.getPosition(dragEl), + tx = this.params.grid ? this.params.grid[0] / 2 : snapThreshold, + ty = this.params.grid ? this.params.grid[1] / 2 : snapThreshold, + snapped = _snap(p, x, y, tx, ty); + + this.params.setPosition(dragEl, snapped); + return snapped; + }; + + this.setUseGhostProxy = function(val) { + useGhostProxy = val ? TRUE : FALSE; + }; + + var constrain; + var negativeFilter = function(pos) { + return (params.allowNegative === false) ? [ Math.max (0, pos[0]), Math.max(0, pos[1]) ] : pos; + }; + + var _setConstrain = function(value) { + constrain = typeof value === "function" ? value : value ? function(pos, dragEl, _constrainRect, _size) { + return negativeFilter([ + Math.max(0, Math.min(_constrainRect.w - _size[0], pos[0])), + Math.max(0, Math.min(_constrainRect.h - _size[1], pos[1])) + ]); + }.bind(this) : function(pos) { return negativeFilter(pos); }; + }.bind(this); + + _setConstrain(typeof this.params.constrain === "function" ? this.params.constrain : (this.params.constrain || this.params.containment)); + + + /** + * Sets whether or not the Drag is constrained. A value of 'true' means constrain to parent bounds; a function + * will be executed and returns true if the position is allowed. + * @param value + */ + this.setConstrain = function(value) { + _setConstrain(value); + }; + + var revertFunction; + /** + * Sets a function to call on drag stop, which, if it returns true, indicates that the given element should + * revert to its position before the previous drag. + * @param fn + */ + this.setRevert = function(fn) { + revertFunction = fn; + }; + + if (this.params.revert) { + revertFunction = this.params.revert; + } + + var _assignId = function(obj) { + if (typeof obj === "function") { + obj._katavorioId = _uuid(); + return obj._katavorioId; + } else { + return obj; + } + }, + // a map of { spec -> [ fn, exclusion ] } entries. + _filters = {}, + _testFilter = function(e) { + for (var key in _filters) { + var f = _filters[key]; + var rv = f[0](e); + if (f[1]) rv = !rv; + if (!rv) return false; + } + return true; + }, + _setFilter = this.setFilter = function(f, _exclude) { + if (f) { + var key = _assignId(f); + _filters[key] = [ + function(e) { + var t = e.srcElement || e.target, m; + if (_isString(f)) { + m = matchesSelector(t, f, el); + } + else if (typeof f === "function") { + m = f(e, el); + } + return m; + }, + _exclude !== false + ]; + + } + }, + _addFilter = this.addFilter = _setFilter, + _removeFilter = this.removeFilter = function(f) { + var key = typeof f === "function" ? f._katavorioId : f; + delete _filters[key]; + }; + + this.clearAllFilters = function() { + _filters = {}; + }; + + this.canDrag = this.params.canDrag || _true; + + var constrainRect, + matchingDroppables = [], + intersectingDroppables = []; + + this.addSelector = function(params) { + if (params.selector) { + availableSelectors.push(params); + } + }; + + this.downListener = function(e) { + if (e.defaultPrevented) { return; } + var isNotRightClick = this.rightButtonCanDrag || (e.which !== 3 && e.button !== 2); + if (isNotRightClick && this.isEnabled() && this.canDrag()) { + + var _f = _testFilter(e) && _inputFilter(e, this.el, this.k); + if (_f) { + + activeSelectorParams = null; + elementToDrag = null; + + // if (selector) { + // elementToDrag = findDelegateElement(this.el, e.target || e.srcElement, selector); + // if(elementToDrag == null) { + // return; + // } + // } + if (availableSelectors.length > 0) { + var match = findMatchingSelector(availableSelectors, this.el, e.target || e.srcElement); + if (match != null) { + activeSelectorParams = match[0]; + elementToDrag = match[1]; + } + // elementToDrag = findDelegateElement(this.el, e.target || e.srcElement, selector); + if(elementToDrag == null) { + return; + } + } + else { + elementToDrag = this.el; + } + + if (clone) { + dragEl = elementToDrag.cloneNode(true); + this.params.addClass(dragEl, _classes.clonedDrag); + + dragEl.setAttribute("id", null); + dragEl.style.position = "absolute"; + + if (this.params.parent != null) { + var p = this.params.getPosition(this.el); + dragEl.style.left = p[0] + "px"; + dragEl.style.top = p[1] + "px"; + this.params.parent.appendChild(dragEl); + } else { + // the clone node is added to the body; getOffsetRect gives us a value + // relative to the body. + var b = getOffsetRect(elementToDrag); + dragEl.style.left = b.left + "px"; + dragEl.style.top = b.top + "px"; + + document.body.appendChild(dragEl); + } + + } else { + dragEl = elementToDrag; + } + + consumeStartEvent && _consume(e); + downAt = _pl(e); + if (dragEl && dragEl.parentNode) + { + initialScroll = [dragEl.parentNode.scrollLeft, dragEl.parentNode.scrollTop]; + } + // + this.params.bind(document, "mousemove", this.moveListener); + this.params.bind(document, "mouseup", this.upListener); + k.markSelection(this); + k.markPosses(this); + this.params.addClass(document.body, css.noSelect); + _dispatch("beforeStart", {el:this.el, pos:posAtDown, e:e, drag:this}); + } + else if (this.params.consumeFilteredEvents) { + _consume(e); + } + } + }.bind(this); + + this.moveListener = function(e) { + if (downAt) { + if (!moving) { + var _continue = _dispatch("start", {el:this.el, pos:posAtDown, e:e, drag:this}); + if (_continue !== false) { + if (!downAt) { + return; + } + this.mark(true); + moving = true; + } else { + this.abort(); + } + } + + // it is possible that the start event caused the drag to be aborted. So we check + // again that we are currently dragging. + if (downAt) { + intersectingDroppables.length = 0; + var pos = _pl(e), dx = pos[0] - downAt[0], dy = pos[1] - downAt[1], + z = this.params.ignoreZoom ? 1 : k.getZoom(); + if (dragEl && dragEl.parentNode) + { + dx += dragEl.parentNode.scrollLeft - initialScroll[0]; + dy += dragEl.parentNode.scrollTop - initialScroll[1]; + } + dx /= z; + dy /= z; + this.moveBy(dx, dy, e); + k.updateSelection(dx, dy, this); + k.updatePosses(dx, dy, this); + } + } + }.bind(this); + + this.upListener = function(e) { + if (downAt) { + downAt = null; + this.params.unbind(document, "mousemove", this.moveListener); + this.params.unbind(document, "mouseup", this.upListener); + this.params.removeClass(document.body, css.noSelect); + this.unmark(e); + k.unmarkSelection(this, e); + k.unmarkPosses(this, e); + this.stop(e); + + k.notifyPosseDragStop(this, e); + moving = false; + intersectingDroppables.length = 0; + + if (clone) { + dragEl && dragEl.parentNode && dragEl.parentNode.removeChild(dragEl); + dragEl = null; + } else { + if (revertFunction && revertFunction(dragEl, this.params.getPosition(dragEl)) === true) { + this.params.setPosition(dragEl, posAtDown); + _dispatch("revert", dragEl); + } + } + + } + }.bind(this); + + this.getFilters = function() { return _filters; }; + + this.abort = function() { + if (downAt != null) { + this.upListener(); + } + }; + + /** + * Returns the element that was last dragged. This may be some original element from the DOM, or if `clone` is + * set, then its actually a copy of some original DOM element. In some client calls to this method, it is the + * actual element that was dragged that is desired. In others, it is the original DOM element that the user + * wishes to get - in which case, pass true for `retrieveOriginalElement`. + * + * @returns {*} + */ + this.getDragElement = function(retrieveOriginalElement) { + return retrieveOriginalElement ? elementToDrag || this.el : dragEl || this.el; + }; + + var listeners = {"start":[], "drag":[], "stop":[], "over":[], "out":[], "beforeStart":[], "revert":[] }; + if (params.events.start) listeners.start.push(params.events.start); + if (params.events.beforeStart) listeners.beforeStart.push(params.events.beforeStart); + if (params.events.stop) listeners.stop.push(params.events.stop); + if (params.events.drag) listeners.drag.push(params.events.drag); + if (params.events.revert) listeners.revert.push(params.events.revert); + + this.on = function(evt, fn) { + if (listeners[evt]) listeners[evt].push(fn); + }; + + this.off = function(evt, fn) { + if (listeners[evt]) { + var l = []; + for (var i = 0; i < listeners[evt].length; i++) { + if (listeners[evt][i] !== fn) l.push(listeners[evt][i]); + } + listeners[evt] = l; + } + }; + + var _dispatch = function(evt, value) { + var result = null; + if (activeSelectorParams && activeSelectorParams[evt]) { + result = activeSelectorParams[evt](value); + } else if (listeners[evt]) { + for (var i = 0; i < listeners[evt].length; i++) { + try { + var v = listeners[evt][i](value); + if (v != null) { + result = v; + } + } + catch (e) { } + } + } + return result; + }; + + this.notifyStart = function(e) { + _dispatch("start", {el:this.el, pos:this.params.getPosition(dragEl), e:e, drag:this}); + }; + + this.stop = function(e, force) { + if (force || moving) { + var positions = [], + sel = k.getSelection(), + dPos = this.params.getPosition(dragEl); + + if (sel.length > 0) { + for (var i = 0; i < sel.length; i++) { + var p = this.params.getPosition(sel[i].el); + positions.push([ sel[i].el, { left: p[0], top: p[1] }, sel[i] ]); + } + } + else { + positions.push([ dragEl, {left:dPos[0], top:dPos[1]}, this ]); + } + + _dispatch("stop", { + el: dragEl, + pos: ghostProxyOffsets || dPos, + finalPos:dPos, + e: e, + drag: this, + selection:positions + }); + } + }; + + this.mark = function(andNotify) { + posAtDown = this.params.getPosition(dragEl); + pagePosAtDown = this.params.getPosition(dragEl, true); + pageDelta = [pagePosAtDown[0] - posAtDown[0], pagePosAtDown[1] - posAtDown[1]]; + this.size = this.params.getSize(dragEl); + matchingDroppables = k.getMatchingDroppables(this); + _setDroppablesActive(matchingDroppables, true, false, this); + this.params.addClass(dragEl, this.params.dragClass || css.drag); + + var cs; + if (this.params.getConstrainingRectangle) { + cs = this.params.getConstrainingRectangle(dragEl) + } else { + cs = this.params.getSize(dragEl.parentNode); + } + constrainRect = {w: cs[0], h: cs[1]}; + + ghostDx = 0; + ghostDy = 0; + + if (andNotify) { + k.notifySelectionDragStart(this); + } + }; + var ghostProxyOffsets; + this.unmark = function(e, doNotCheckDroppables) { + _setDroppablesActive(matchingDroppables, false, true, this); + + if (isConstrained && useGhostProxy(elementToDrag, dragEl)) { + ghostProxyOffsets = [dragEl.offsetLeft - ghostDx, dragEl.offsetTop - ghostDy]; + dragEl.parentNode.removeChild(dragEl); + dragEl = elementToDrag; + } + else { + ghostProxyOffsets = null; + } + + this.params.removeClass(dragEl, this.params.dragClass || css.drag); + matchingDroppables.length = 0; + isConstrained = false; + if (!doNotCheckDroppables) { + if (intersectingDroppables.length > 0 && ghostProxyOffsets) { + params.setPosition(elementToDrag, ghostProxyOffsets); + } + intersectingDroppables.sort(_rankSort); + for (var i = 0; i < intersectingDroppables.length; i++) { + var retVal = intersectingDroppables[i].drop(this, e); + if (retVal === true) break; + } + } + }; + this.moveBy = function(dx, dy, e) { + intersectingDroppables.length = 0; + + var desiredLoc = this.toGrid([posAtDown[0] + dx, posAtDown[1] + dy]), + cPos = constrain(desiredLoc, dragEl, constrainRect, this.size); + + // if we should use a ghost proxy... + if (useGhostProxy(this.el, dragEl)) { + // and the element has been dragged outside of its parent bounds + if (desiredLoc[0] !== cPos[0] || desiredLoc[1] !== cPos[1]) { + + // ...if ghost proxy not yet created + if (!isConstrained) { + // create it + var gp = ghostProxy(elementToDrag); + params.addClass(gp, _classes.ghostProxy); + + if (ghostProxyParent) { + ghostProxyParent.appendChild(gp); + // find offset between drag el's parent the ghost parent + currentParentPosition = params.getPosition(elementToDrag.parentNode, true); + ghostParentPosition = params.getPosition(params.ghostProxyParent, true); + ghostDx = currentParentPosition[0] - ghostParentPosition[0]; + ghostDy = currentParentPosition[1] - ghostParentPosition[1]; + + } else { + elementToDrag.parentNode.appendChild(gp); + } + + // the ghost proxy is the drag element + dragEl = gp; + // set this flag so we dont recreate the ghost proxy + isConstrained = true; + } + // now the drag position can be the desired position, as the ghost proxy can support it. + cPos = desiredLoc; + } + else { + // if the element is not outside of its parent bounds, and ghost proxy is in place, + if (isConstrained) { + // remove the ghost proxy from the dom + dragEl.parentNode.removeChild(dragEl); + // reset the drag element to the original element + dragEl = elementToDrag; + // clear this flag. + isConstrained = false; + currentParentPosition = null; + ghostParentPosition = null; + ghostDx = 0; + ghostDy = 0; + } + } + } + + var rect = { x:cPos[0], y:cPos[1], w:this.size[0], h:this.size[1]}, + pageRect = { x:rect.x + pageDelta[0], y:rect.y + pageDelta[1], w:rect.w, h:rect.h}, + focusDropElement = null; + + this.params.setPosition(dragEl, [cPos[0] + ghostDx, cPos[1] + ghostDy]); + + for (var i = 0; i < matchingDroppables.length; i++) { + var r2 = { x:matchingDroppables[i].pagePosition[0], y:matchingDroppables[i].pagePosition[1], w:matchingDroppables[i].size[0], h:matchingDroppables[i].size[1]}; + if (this.params.intersects(pageRect, r2) && (_multipleDrop || focusDropElement == null || focusDropElement === matchingDroppables[i].el) && matchingDroppables[i].canDrop(this)) { + if (!focusDropElement) focusDropElement = matchingDroppables[i].el; + intersectingDroppables.push(matchingDroppables[i]); + matchingDroppables[i].setHover(this, true, e); + } + else if (matchingDroppables[i].isHover()) { + matchingDroppables[i].setHover(this, false, e); + } + } + + _dispatch("drag", {el:this.el, pos:cPos, e:e, drag:this}); + + /* test to see if the parent needs to be scrolled (future) + if (scroll) { + var pnsl = dragEl.parentNode.scrollLeft, pnst = dragEl.parentNode.scrollTop; + console.log("scroll!", pnsl, pnst); + }*/ + }; + this.destroy = function() { + this.params.unbind(this.el, "mousedown", this.downListener); + this.params.unbind(document, "mousemove", this.moveListener); + this.params.unbind(document, "mouseup", this.upListener); + this.downListener = null; + this.upListener = null; + this.moveListener = null; + }; + + // init:register mousedown, and perhaps set a filter + this.params.bind(this.el, "mousedown", this.downListener); + + // if handle provided, use that. otherwise, try to set a filter. + // note that a `handle` selector always results in filterExclude being set to false, ie. + // the selector defines the handle element(s). + if (this.params.handle) + _setFilter(this.params.handle, false); + else + _setFilter(this.params.filter, this.params.filterExclude); + }; + + var Drop = function(el, params, css, scope) { + this._class = css.droppable; + this.params = params || {}; + this.rank = params.rank || 0; + this._activeClass = this.params.activeClass || css.active; + this._hoverClass = this.params.hoverClass || css.hover; + Super.apply(this, arguments); + var hover = false; + this.allowLoopback = this.params.allowLoopback !== false; + + this.setActive = function(val) { + this.params[val ? "addClass" : "removeClass"](this.el, this._activeClass); + }; + + this.updatePosition = function() { + this.position = this.params.getPosition(this.el); + this.pagePosition = this.params.getPosition(this.el, true); + this.size = this.params.getSize(this.el); + }; + + this.canDrop = this.params.canDrop || function(drag) { + return true; + }; + + this.isHover = function() { return hover; }; + + this.setHover = function(drag, val, e) { + // if turning off hover but this was not the drag that caused the hover, ignore. + if (val || this.el._katavorioDragHover == null || this.el._katavorioDragHover === drag.el._katavorio) { + this.params[val ? "addClass" : "removeClass"](this.el, this._hoverClass); + this.el._katavorioDragHover = val ? drag.el._katavorio : null; + if (hover !== val) { + this.params.events[val ? "over" : "out"]({el: this.el, e: e, drag: drag, drop: this}); + } + hover = val; + } + }; + + /** + * A drop event. `drag` is the corresponding Drag object, which may be a Drag for some specific element, or it + * may be a Drag on some element acting as a delegate for elements contained within it. + * @param drag + * @param event + * @returns {*} + */ + this.drop = function(drag, event) { + return this.params.events["drop"]({ drag:drag, e:event, drop:this }); + }; + + this.destroy = function() { + this._class = null; + this._activeClass = null; + this._hoverClass = null; + hover = null; + }; + }; + + var _uuid = function() { + return ('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = Math.random()*16|0, v = c === 'x' ? r : (r&0x3|0x8); + return v.toString(16); + })); + }; + + var _rankSort = function(a,b) { + return a.rank < b.rank ? 1 : a.rank > b.rank ? -1 : 0; + }; + + var _gel = function(el) { + if (el == null) return null; + el = (typeof el === "string" || el.constructor === String) ? document.getElementById(el) : el; + if (el == null) return null; + el._katavorio = el._katavorio || _uuid(); + return el; + }; + + root.Katavorio = function(katavorioParams) { + + var _selection = [], + _selectionMap = {}; + + this._dragsByScope = {}; + this._dropsByScope = {}; + var _zoom = 1, + _reg = function(obj, map) { + _each(obj, function(_obj) { + for(var i = 0; i < _obj.scopes.length; i++) { + map[_obj.scopes[i]] = map[_obj.scopes[i]] || []; + map[_obj.scopes[i]].push(_obj); + } + }); + }, + _unreg = function(obj, map) { + var c = 0; + _each(obj, function(_obj) { + for(var i = 0; i < _obj.scopes.length; i++) { + if (map[_obj.scopes[i]]) { + var idx = katavorioParams.indexOf(map[_obj.scopes[i]], _obj); + if (idx !== -1) { + map[_obj.scopes[i]].splice(idx, 1); + c++; + } + } + } + }); + + return c > 0 ; + }, + _getMatchingDroppables = this.getMatchingDroppables = function(drag) { + var dd = [], _m = {}; + for (var i = 0; i < drag.scopes.length; i++) { + var _dd = this._dropsByScope[drag.scopes[i]]; + if (_dd) { + for (var j = 0; j < _dd.length; j++) { + if (_dd[j].canDrop(drag) && !_m[_dd[j].uuid] && (_dd[j].allowLoopback || _dd[j].el !== drag.el)) { + _m[_dd[j].uuid] = true; + dd.push(_dd[j]); + } + } + } + } + dd.sort(_rankSort); + return dd; + }, + _prepareParams = function(p) { + p = p || {}; + var _p = { + events:{} + }, i; + for (i in katavorioParams) _p[i] = katavorioParams[i]; + for (i in p) _p[i] = p[i]; + // events + + for (i = 0; i < _events.length; i++) { + _p.events[_events[i]] = p[_events[i]] || _devNull; + } + _p.katavorio = this; + return _p; + }.bind(this), + _mistletoe = function(existingDrag, params) { + for (var i = 0; i < _events.length; i++) { + if (params[_events[i]]) { + existingDrag.on(_events[i], params[_events[i]]); + } + } + }.bind(this), + _css = {}, + overrideCss = katavorioParams.css || {}, + _scope = katavorioParams.scope || _defaultScope; + + // prepare map of css classes based on defaults frst, then optional overrides + for (var i in _classes) _css[i] = _classes[i]; + for (var i in overrideCss) _css[i] = overrideCss[i]; + + var inputFilterSelector = katavorioParams.inputFilterSelector || _defaultInputFilterSelector; + /** + * Gets the selector identifying which input elements to filter from drag events. + * @method getInputFilterSelector + * @return {String} Current input filter selector. + */ + this.getInputFilterSelector = function() { return inputFilterSelector; }; + + /** + * Sets the selector identifying which input elements to filter from drag events. + * @method setInputFilterSelector + * @param {String} selector Input filter selector to set. + * @return {Katavorio} Current instance; method may be chained. + */ + this.setInputFilterSelector = function(selector) { + inputFilterSelector = selector; + return this; + }; + + /** + * Either makes the given element draggable, or identifies it as an element inside which some identified list + * of elements may be draggable. + * @param el + * @param params + * @returns {Array} + */ + this.draggable = function(el, params) { + var o = []; + _each(el, function (_el) { + _el = _gel(_el); + if (_el != null) { + if (_el._katavorioDrag == null) { + var p = _prepareParams(params); + _el._katavorioDrag = new Drag(_el, p, _css, _scope); + _reg(_el._katavorioDrag, this._dragsByScope); + o.push(_el._katavorioDrag); + katavorioParams.addClass(_el, p.selector ? _css.delegatedDraggable : _css.draggable); + } + else { + _mistletoe(_el._katavorioDrag, params); + } + } + }.bind(this)); + return o; + }; + + this.droppable = function(el, params) { + var o = []; + _each(el, function(_el) { + _el = _gel(_el); + if (_el != null) { + var drop = new Drop(_el, _prepareParams(params), _css, _scope); + _el._katavorioDrop = _el._katavorioDrop || []; + _el._katavorioDrop.push(drop); + _reg(drop, this._dropsByScope); + o.push(drop); + katavorioParams.addClass(_el, _css.droppable); + } + }.bind(this)); + return o; + }; + + /** + * @name Katavorio#select + * @function + * @desc Adds an element to the current selection (for multiple node drag) + * @param {Element|String} DOM element - or id of the element - to add. + */ + this.select = function(el) { + _each(el, function() { + var _el = _gel(this); + if (_el && _el._katavorioDrag) { + if (!_selectionMap[_el._katavorio]) { + _selection.push(_el._katavorioDrag); + _selectionMap[_el._katavorio] = [ _el, _selection.length - 1 ]; + katavorioParams.addClass(_el, _css.selected); + } + } + }); + return this; + }; + + /** + * @name Katavorio#deselect + * @function + * @desc Removes an element from the current selection (for multiple node drag) + * @param {Element|String} DOM element - or id of the element - to remove. + */ + this.deselect = function(el) { + _each(el, function() { + var _el = _gel(this); + if (_el && _el._katavorio) { + var e = _selectionMap[_el._katavorio]; + if (e) { + var _s = []; + for (var i = 0; i < _selection.length; i++) + if (_selection[i].el !== _el) _s.push(_selection[i]); + _selection = _s; + delete _selectionMap[_el._katavorio]; + katavorioParams.removeClass(_el, _css.selected); + } + } + }); + return this; + }; + + this.deselectAll = function() { + for (var i in _selectionMap) { + var d = _selectionMap[i]; + katavorioParams.removeClass(d[0], _css.selected); + } + + _selection.length = 0; + _selectionMap = {}; + }; + + this.markSelection = function(drag) { + _foreach(_selection, function(e) { e.mark(); }, drag); + }; + + this.markPosses = function(drag) { + if (drag.posses) { + _each(drag.posses, function(p) { + if (drag.posseRoles[p] && _posses[p]) { + _foreach(_posses[p].members, function (d) { + d.mark(); + }, drag); + } + }) + } + }; + + this.unmarkSelection = function(drag, event) { + _foreach(_selection, function(e) { e.unmark(event); }, drag); + }; + + this.unmarkPosses = function(drag, event) { + if (drag.posses) { + _each(drag.posses, function(p) { + if (drag.posseRoles[p] && _posses[p]) { + _foreach(_posses[p].members, function (d) { + d.unmark(event, true); + }, drag); + } + }); + } + }; + + this.getSelection = function() { return _selection.slice(0); }; + + this.updateSelection = function(dx, dy, drag) { + _foreach(_selection, function(e) { e.moveBy(dx, dy); }, drag); + }; + + var _posseAction = function(fn, drag) { + if (drag.posses) { + _each(drag.posses, function(p) { + if (drag.posseRoles[p] && _posses[p]) { + _foreach(_posses[p].members, function (e) { + fn(e); + }, drag); + } + }); + } + }; + + this.updatePosses = function(dx, dy, drag) { + _posseAction(function(e) { e.moveBy(dx, dy); }, drag); + }; + + this.notifyPosseDragStop = function(drag, evt) { + _posseAction(function(e) { e.stop(evt, true); }, drag); + }; + + this.notifySelectionDragStop = function(drag, evt) { + _foreach(_selection, function(e) { e.stop(evt, true); }, drag); + }; + + this.notifySelectionDragStart = function(drag, evt) { + _foreach(_selection, function(e) { e.notifyStart(evt);}, drag); + }; + + this.setZoom = function(z) { _zoom = z; }; + this.getZoom = function() { return _zoom; }; + + // does the work of changing scopes + var _scopeManip = function(kObj, scopes, map, fn) { + _each(kObj, function(_kObj) { + _unreg(_kObj, map); // deregister existing scopes + _kObj[fn](scopes); // set scopes + _reg(_kObj, map); // register new ones + }); + }; + + _each([ "set", "add", "remove", "toggle"], function(v) { + this[v + "Scope"] = function(el, scopes) { + _scopeManip(el._katavorioDrag, scopes, this._dragsByScope, v + "Scope"); + _scopeManip(el._katavorioDrop, scopes, this._dropsByScope, v + "Scope"); + }.bind(this); + this[v + "DragScope"] = function(el, scopes) { + _scopeManip(el.constructor === Drag ? el : el._katavorioDrag, scopes, this._dragsByScope, v + "Scope"); + }.bind(this); + this[v + "DropScope"] = function(el, scopes) { + _scopeManip(el.constructor === Drop ? el : el._katavorioDrop, scopes, this._dropsByScope, v + "Scope"); + }.bind(this); + }.bind(this)); + + this.snapToGrid = function(x, y) { + for (var s in this._dragsByScope) { + _foreach(this._dragsByScope[s], function(d) { d.snap(x, y); }); + } + }; + + this.getDragsForScope = function(s) { return this._dragsByScope[s]; }; + this.getDropsForScope = function(s) { return this._dropsByScope[s]; }; + + var _destroy = function(el, type, map) { + el = _gel(el); + if (el[type]) { + + // remove from selection, if present. + var selIdx = _selection.indexOf(el[type]); + if (selIdx >= 0) { + _selection.splice(selIdx, 1); + } + + if (_unreg(el[type], map)) { + _each(el[type], function(kObj) { kObj.destroy() }); + } + + delete el[type]; + } + }; + + var _removeListener = function(el, type, evt, fn) { + el = _gel(el); + if (el[type]) { + el[type].off(evt, fn); + } + }; + + this.elementRemoved = function(el) { + this.destroyDraggable(el); + this.destroyDroppable(el); + }; + + /** + * Either completely remove drag functionality from the given element, or remove a specific event handler. If you + * call this method with a single argument - the element - all drag functionality is removed from it. Otherwise, if + * you provide an event name and listener function, this function is de-registered (if found). + * @param el Element to update + * @param {string} [evt] Optional event name to unsubscribe + * @param {Function} [fn] Optional function to unsubscribe + */ + this.destroyDraggable = function(el, evt, fn) { + if (arguments.length === 1) { + _destroy(el, "_katavorioDrag", this._dragsByScope); + } else { + _removeListener(el, "_katavorioDrag", evt, fn); + } + }; + + /** + * Either completely remove drop functionality from the given element, or remove a specific event handler. If you + * call this method with a single argument - the element - all drop functionality is removed from it. Otherwise, if + * you provide an event name and listener function, this function is de-registered (if found). + * @param el Element to update + * @param {string} [evt] Optional event name to unsubscribe + * @param {Function} [fn] Optional function to unsubscribe + */ + this.destroyDroppable = function(el, evt, fn) { + if (arguments.length === 1) { + _destroy(el, "_katavorioDrop", this._dropsByScope); + } else { + _removeListener(el, "_katavorioDrop", evt, fn); + } + }; + + this.reset = function() { + this._dragsByScope = {}; + this._dropsByScope = {}; + _selection = []; + _selectionMap = {}; + _posses = {}; + }; + + // ----- groups + var _posses = {}; + + var _processOneSpec = function(el, _spec, dontAddExisting) { + var posseId = _isString(_spec) ? _spec : _spec.id; + var active = _isString(_spec) ? true : _spec.active !== false; + var posse = _posses[posseId] || (function() { + var g = {name:posseId, members:[]}; + _posses[posseId] = g; + return g; + })(); + _each(el, function(_el) { + if (_el._katavorioDrag) { + + if (dontAddExisting && _el._katavorioDrag.posseRoles[posse.name] != null) return; + + _suggest(posse.members, _el._katavorioDrag); + _suggest(_el._katavorioDrag.posses, posse.name); + _el._katavorioDrag.posseRoles[posse.name] = active; + } + }); + return posse; + }; + + /** + * Add the given element to the posse with the given id, creating the group if it at first does not exist. + * @method addToPosse + * @param {Element} el Element to add. + * @param {String...|Object...} spec Variable args parameters. Each argument can be a either a String, indicating + * the ID of a Posse to which the element should be added as an active participant, or an Object containing + * `{ id:"posseId", active:false/true}`. In the latter case, if `active` is not provided it is assumed to be + * true. + * @returns {Posse|Posse[]} The Posse(s) to which the element(s) was/were added. + */ + this.addToPosse = function(el, spec) { + + var posses = []; + + for (var i = 1; i < arguments.length; i++) { + posses.push(_processOneSpec(el, arguments[i])); + } + + return posses.length === 1 ? posses[0] : posses; + }; + + /** + * Sets the posse(s) for the element with the given id, creating those that do not yet exist, and removing from + * the element any current Posses that are not specified by this method call. This method will not change the + * active/passive state if it is given a posse in which the element is already a member. + * @method setPosse + * @param {Element} el Element to set posse(s) on. + * @param {String...|Object...} spec Variable args parameters. Each argument can be a either a String, indicating + * the ID of a Posse to which the element should be added as an active participant, or an Object containing + * `{ id:"posseId", active:false/true}`. In the latter case, if `active` is not provided it is assumed to be + * true. + * @returns {Posse|Posse[]} The Posse(s) to which the element(s) now belongs. + */ + this.setPosse = function(el, spec) { + + var posses = []; + + for (var i = 1; i < arguments.length; i++) { + posses.push(_processOneSpec(el, arguments[i], true).name); + } + + _each(el, function(_el) { + if (_el._katavorioDrag) { + var diff = _difference(_el._katavorioDrag.posses, posses); + var p = []; + Array.prototype.push.apply(p, _el._katavorioDrag.posses); + for (var i = 0; i < diff.length; i++) { + this.removeFromPosse(_el, diff[i]); + } + } + }.bind(this)); + + return posses.length === 1 ? posses[0] : posses; + }; + + /** + * Remove the given element from the given posse(s). + * @method removeFromPosse + * @param {Element} el Element to remove. + * @param {String...} posseId Varargs parameter: one value for each posse to remove the element from. + */ + this.removeFromPosse = function(el, posseId) { + if (arguments.length < 2) throw new TypeError("No posse id provided for remove operation"); + for(var i = 1; i < arguments.length; i++) { + posseId = arguments[i]; + _each(el, function (_el) { + if (_el._katavorioDrag && _el._katavorioDrag.posses) { + var d = _el._katavorioDrag; + _each(posseId, function (p) { + _vanquish(_posses[p].members, d); + _vanquish(d.posses, p); + delete d.posseRoles[p]; + }); + } + }); + } + }; + + /** + * Remove the given element from all Posses to which it belongs. + * @method removeFromAllPosses + * @param {Element|Element[]} el Element to remove from Posses. + */ + this.removeFromAllPosses = function(el) { + _each(el, function(_el) { + if (_el._katavorioDrag && _el._katavorioDrag.posses) { + var d = _el._katavorioDrag; + _each(d.posses, function(p) { + _vanquish(_posses[p].members, d); + }); + d.posses.length = 0; + d.posseRoles = {}; + } + }); + }; + + /** + * Changes the participation state for the element in the Posse with the given ID. + * @param {Element|Element[]} el Element(s) to change state for. + * @param {String} posseId ID of the Posse to change element state for. + * @param {Boolean} state True to make active, false to make passive. + */ + this.setPosseState = function(el, posseId, state) { + var posse = _posses[posseId]; + if (posse) { + _each(el, function(_el) { + if (_el._katavorioDrag && _el._katavorioDrag.posses) { + _el._katavorioDrag.posseRoles[posse.name] = state; + } + }); + } + }; + + }; + + root.Katavorio.version = "1.0.0"; + + if (typeof exports !== "undefined") { + exports.Katavorio = root.Katavorio; + } + +}).call(typeof window !== 'undefined' ? window : this); + + +(function() { + + var root = this; + root.jsPlumbUtil = root.jsPlumbUtil || {}; + var jsPlumbUtil = root.jsPlumbUtil; + + if (typeof exports !=='undefined') { exports.jsPlumbUtil = jsPlumbUtil;} + + + /** + * Tests if the given object is an Array. + * @param a + */ + function isArray(a) { + return Object.prototype.toString.call(a) === "[object Array]"; + } + jsPlumbUtil.isArray = isArray; + /** + * Tests if the given object is a Number. + * @param n + */ + function isNumber(n) { + return Object.prototype.toString.call(n) === "[object Number]"; + } + jsPlumbUtil.isNumber = isNumber; + function isString(s) { + return typeof s === "string"; + } + jsPlumbUtil.isString = isString; + function isBoolean(s) { + return typeof s === "boolean"; + } + jsPlumbUtil.isBoolean = isBoolean; + function isNull(s) { + return s == null; + } + jsPlumbUtil.isNull = isNull; + function isObject(o) { + return o == null ? false : Object.prototype.toString.call(o) === "[object Object]"; + } + jsPlumbUtil.isObject = isObject; + function isDate(o) { + return Object.prototype.toString.call(o) === "[object Date]"; + } + jsPlumbUtil.isDate = isDate; + function isFunction(o) { + return Object.prototype.toString.call(o) === "[object Function]"; + } + jsPlumbUtil.isFunction = isFunction; + function isNamedFunction(o) { + return isFunction(o) && o.name != null && o.name.length > 0; + } + jsPlumbUtil.isNamedFunction = isNamedFunction; + function isEmpty(o) { + for (var i in o) { + if (o.hasOwnProperty(i)) { + return false; + } + } + return true; + } + jsPlumbUtil.isEmpty = isEmpty; + function clone(a) { + if (isString(a)) { + return "" + a; + } + else if (isBoolean(a)) { + return !!a; + } + else if (isDate(a)) { + return new Date(a.getTime()); + } + else if (isFunction(a)) { + return a; + } + else if (isArray(a)) { + var b = []; + for (var i = 0; i < a.length; i++) { + b.push(clone(a[i])); + } + return b; + } + else if (isObject(a)) { + var c = {}; + for (var j in a) { + c[j] = clone(a[j]); + } + return c; + } + else { + return a; + } + } + jsPlumbUtil.clone = clone; + function merge(a, b, collations, overwrites) { + // first change the collations array - if present - into a lookup table, because its faster. + var cMap = {}, ar, i, oMap = {}; + collations = collations || []; + overwrites = overwrites || []; + for (i = 0; i < collations.length; i++) { + cMap[collations[i]] = true; + } + for (i = 0; i < overwrites.length; i++) { + oMap[overwrites[i]] = true; + } + var c = clone(a); + for (i in b) { + if (c[i] == null || oMap[i]) { + c[i] = b[i]; + } + else if (isString(b[i]) || isBoolean(b[i])) { + if (!cMap[i]) { + c[i] = b[i]; // if we dont want to collate, just copy it in. + } + else { + ar = []; + // if c's object is also an array we can keep its values. + ar.push.apply(ar, isArray(c[i]) ? c[i] : [c[i]]); + ar.push.apply(ar, isBoolean(b[i]) ? b[i] : [b[i]]); + c[i] = ar; + } + } + else { + if (isArray(b[i])) { + ar = []; + // if c's object is also an array we can keep its values. + if (isArray(c[i])) { + ar.push.apply(ar, c[i]); + } + ar.push.apply(ar, b[i]); + c[i] = ar; + } + else if (isObject(b[i])) { + // overwrite c's value with an object if it is not already one. + if (!isObject(c[i])) { + c[i] = {}; + } + for (var j in b[i]) { + c[i][j] = b[i][j]; + } + } + } + } + return c; + } + jsPlumbUtil.merge = merge; + function replace(inObj, path, value) { + if (inObj == null) { + return; + } + var q = inObj, t = q; + path.replace(/([^\.])+/g, function (term, lc, pos, str) { + var array = term.match(/([^\[0-9]+){1}(\[)([0-9+])/), last = pos + term.length >= str.length, _getArray = function () { + return t[array[1]] || (function () { + t[array[1]] = []; + return t[array[1]]; + })(); + }; + if (last) { + // set term = value on current t, creating term as array if necessary. + if (array) { + _getArray()[array[3]] = value; + } + else { + t[term] = value; + } + } + else { + // set to current t[term], creating t[term] if necessary. + if (array) { + var a_1 = _getArray(); + t = a_1[array[3]] || (function () { + a_1[array[3]] = {}; + return a_1[array[3]]; + })(); + } + else { + t = t[term] || (function () { + t[term] = {}; + return t[term]; + })(); + } + } + return ""; + }); + return inObj; + } + jsPlumbUtil.replace = replace; + // + // chain a list of functions, supplied by [ object, method name, args ], and return on the first + // one that returns the failValue. if none return the failValue, return the successValue. + // + function functionChain(successValue, failValue, fns) { + for (var i = 0; i < fns.length; i++) { + var o = fns[i][0][fns[i][1]].apply(fns[i][0], fns[i][2]); + if (o === failValue) { + return o; + } + } + return successValue; + } + jsPlumbUtil.functionChain = functionChain; + /** + * + * Take the given model and expand out any parameters. 'functionPrefix' is optional, and if present, helps jsplumb figure out what to do if a value is a Function. + * if you do not provide it (and doNotExpandFunctions is null, or false), jsplumb will run the given values through any functions it finds, and use the function's + * output as the value in the result. if you do provide the prefix, only functions that are named and have this prefix + * will be executed; other functions will be passed as values to the output. + * + * @param model + * @param values + * @param functionPrefix + * @param doNotExpandFunctions + * @returns {any} + */ + function populate(model, values, functionPrefix, doNotExpandFunctions) { + // for a string, see if it has parameter matches, and if so, try to make the substitutions. + var getValue = function (fromString) { + var matches = fromString.match(/(\${.*?})/g); + if (matches != null) { + for (var i = 0; i < matches.length; i++) { + var val = values[matches[i].substring(2, matches[i].length - 1)] || ""; + if (val != null) { + fromString = fromString.replace(matches[i], val); + } + } + } + return fromString; + }; + // process one entry. + var _one = function (d) { + if (d != null) { + if (isString(d)) { + return getValue(d); + } + else if (isFunction(d) && !doNotExpandFunctions && (functionPrefix == null || (d.name || "").indexOf(functionPrefix) === 0)) { + return d(values); + } + else if (isArray(d)) { + var r = []; + for (var i = 0; i < d.length; i++) { + r.push(_one(d[i])); + } + return r; + } + else if (isObject(d)) { + var s = {}; + for (var j in d) { + s[j] = _one(d[j]); + } + return s; + } + else { + return d; + } + } + }; + return _one(model); + } + jsPlumbUtil.populate = populate; + /** + * Find the index of a given object in an array. + * @param a The array to search + * @param f The function to run on each element. Return true if the element matches. + * @returns {number} -1 if not found, otherwise the index in the array. + */ + function findWithFunction(a, f) { + if (a) { + for (var i = 0; i < a.length; i++) { + if (f(a[i])) { + return i; + } + } + } + return -1; + } + jsPlumbUtil.findWithFunction = findWithFunction; + /** + * Remove some element from an array by matching each element in the array against some predicate function. Note that this + * is an in-place removal; the array is altered. + * @param a The array to search + * @param f The function to run on each element. Return true if the element matches. + * @returns {boolean} true if removed, false otherwise. + */ + function removeWithFunction(a, f) { + var idx = findWithFunction(a, f); + if (idx > -1) { + a.splice(idx, 1); + } + return idx !== -1; + } + jsPlumbUtil.removeWithFunction = removeWithFunction; + /** + * Remove some element from an array by simple lookup in the array for the given element. Note that this + * is an in-place removal; the array is altered. + * @param l The array to search + * @param v The value to remove. + * @returns {boolean} true if removed, false otherwise. + */ + function remove(l, v) { + var idx = l.indexOf(v); + if (idx > -1) { + l.splice(idx, 1); + } + return idx !== -1; + } + jsPlumbUtil.remove = remove; + /** + * Add some element to the given array, unless it is determined that it is already in the array. + * @param list The array to add the element to. + * @param item The item to add. + * @param hashFunction A function to use to determine if the given item already exists in the array. + */ + function addWithFunction(list, item, hashFunction) { + if (findWithFunction(list, hashFunction) === -1) { + list.push(item); + } + } + jsPlumbUtil.addWithFunction = addWithFunction; + /** + * Add some element to a list that is contained in a map of lists. + * @param map The map of [ key -> list ] entries + * @param key The name of the list to insert into + * @param value The value to insert + * @param insertAtStart Whether or not to insert at the start; defaults to false. + */ + function addToList(map, key, value, insertAtStart) { + var l = map[key]; + if (l == null) { + l = []; + map[key] = l; + } + l[insertAtStart ? "unshift" : "push"](value); + return l; + } + jsPlumbUtil.addToList = addToList; + /** + * Add an item to a list, unless it is already in the list. The test for pre-existence is a simple list lookup. + * If you want to do something more complex, perhaps #addWithFunction might help. + * @param list List to add the item to + * @param item Item to add + * @param insertAtHead Whether or not to insert at the start; defaults to false. + */ + function suggest(list, item, insertAtHead) { + if (list.indexOf(item) === -1) { + if (insertAtHead) { + list.unshift(item); + } + else { + list.push(item); + } + return true; + } + return false; + } + jsPlumbUtil.suggest = suggest; + /** + * Extends the given obj (which can be an array) with the given constructor function, prototype functions, and class members, any of which may be null. + * @param child + * @param parent + * @param _protoFn + */ + function extend(child, parent, _protoFn) { + var i; + parent = isArray(parent) ? parent : [parent]; + var _copyProtoChain = function (focus) { + var proto = focus.__proto__; + while (proto != null) { + if (proto.prototype != null) { + for (var j in proto.prototype) { + if (proto.prototype.hasOwnProperty(j) && !child.prototype.hasOwnProperty(j)) { + child.prototype[j] = proto.prototype[j]; + } + } + proto = proto.prototype.__proto__; + } + else { + proto = null; + } + } + }; + for (i = 0; i < parent.length; i++) { + for (var j in parent[i].prototype) { + if (parent[i].prototype.hasOwnProperty(j) && !child.prototype.hasOwnProperty(j)) { + child.prototype[j] = parent[i].prototype[j]; + } + } + _copyProtoChain(parent[i]); + } + var _makeFn = function (name, protoFn) { + return function () { + for (i = 0; i < parent.length; i++) { + if (parent[i].prototype[name]) { + parent[i].prototype[name].apply(this, arguments); + } + } + return protoFn.apply(this, arguments); + }; + }; + var _oneSet = function (fns) { + for (var k in fns) { + child.prototype[k] = _makeFn(k, fns[k]); + } + }; + if (arguments.length > 2) { + for (i = 2; i < arguments.length; i++) { + _oneSet(arguments[i]); + } + } + return child; + } + jsPlumbUtil.extend = extend; + /** + * Generate a UUID. + */ + // export function uuid(): string { + // return ('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + // let r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8); + // return v.toString(16); + // })); + // } + var lut = []; + for (var i = 0; i < 256; i++) { + lut[i] = (i < 16 ? '0' : '') + (i).toString(16); + } + function uuid() { + var d0 = Math.random() * 0xffffffff | 0; + var d1 = Math.random() * 0xffffffff | 0; + var d2 = Math.random() * 0xffffffff | 0; + var d3 = Math.random() * 0xffffffff | 0; + return lut[d0 & 0xff] + lut[d0 >> 8 & 0xff] + lut[d0 >> 16 & 0xff] + lut[d0 >> 24 & 0xff] + '-' + + lut[d1 & 0xff] + lut[d1 >> 8 & 0xff] + '-' + lut[d1 >> 16 & 0x0f | 0x40] + lut[d1 >> 24 & 0xff] + '-' + + lut[d2 & 0x3f | 0x80] + lut[d2 >> 8 & 0xff] + '-' + lut[d2 >> 16 & 0xff] + lut[d2 >> 24 & 0xff] + + lut[d3 & 0xff] + lut[d3 >> 8 & 0xff] + lut[d3 >> 16 & 0xff] + lut[d3 >> 24 & 0xff]; + } + jsPlumbUtil.uuid = uuid; + /** + * Trim a string. + * @param s String to trim + * @returns the String with leading and trailing whitespace removed. + */ + function fastTrim(s) { + if (s == null) { + return null; + } + var str = s.replace(/^\s\s*/, ''), ws = /\s/, i = str.length; + while (ws.test(str.charAt(--i))) { + } + return str.slice(0, i + 1); + } + jsPlumbUtil.fastTrim = fastTrim; + function each(obj, fn) { + obj = obj.length == null || typeof obj === "string" ? [obj] : obj; + for (var i = 0; i < obj.length; i++) { + fn(obj[i]); + } + } + jsPlumbUtil.each = each; + function map(obj, fn) { + var o = []; + for (var i = 0; i < obj.length; i++) { + o.push(fn(obj[i])); + } + return o; + } + jsPlumbUtil.map = map; + function mergeWithParents(type, map, parentAttribute) { + parentAttribute = parentAttribute || "parent"; + var _def = function (id) { + return id ? map[id] : null; + }; + var _parent = function (def) { + return def ? _def(def[parentAttribute]) : null; + }; + var _one = function (parent, def) { + if (parent == null) { + return def; + } + else { + var overrides = ["anchor", "anchors", "cssClass", "connector", "paintStyle", "hoverPaintStyle", "endpoint", "endpoints"]; + if (def.mergeStrategy === "override") { + Array.prototype.push.apply(overrides, ["events", "overlays"]); + } + var d_1 = merge(parent, def, [], overrides); + return _one(_parent(parent), d_1); + } + }; + var _getDef = function (t) { + if (t == null) { + return {}; + } + if (typeof t === "string") { + return _def(t); + } + else if (t.length) { + var done = false, i = 0, _dd = void 0; + while (!done && i < t.length) { + _dd = _getDef(t[i]); + if (_dd) { + done = true; + } + else { + i++; + } + } + return _dd; + } + }; + var d = _getDef(type); + if (d) { + return _one(_parent(d), d); + } + else { + return {}; + } + } + jsPlumbUtil.mergeWithParents = mergeWithParents; + jsPlumbUtil.logEnabled = true; + function log() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (jsPlumbUtil.logEnabled && typeof console !== "undefined") { + try { + var msg = arguments[arguments.length - 1]; + console.log(msg); + } + catch (e) { + } + } + } + jsPlumbUtil.log = log; + /** + * Wraps one function with another, creating a placeholder for the + * wrapped function if it was null. this is used to wrap the various + * drag/drop event functions - to allow jsPlumb to be notified of + * important lifecycle events without imposing itself on the user's + * drag/drop functionality. + * @method jsPlumbUtil.wrap + * @param {Function} wrappedFunction original function to wrap; may be null. + * @param {Function} newFunction function to wrap the original with. + * @param {Object} [returnOnThisValue] Optional. Indicates that the wrappedFunction should + * not be executed if the newFunction returns a value matching 'returnOnThisValue'. + * note that this is a simple comparison and only works for primitives right now. + */ + function wrap(wrappedFunction, newFunction, returnOnThisValue) { + return function () { + var r = null; + try { + if (newFunction != null) { + r = newFunction.apply(this, arguments); + } + } + catch (e) { + log("jsPlumb function failed : " + e); + } + if ((wrappedFunction != null) && (returnOnThisValue == null || (r !== returnOnThisValue))) { + try { + r = wrappedFunction.apply(this, arguments); + } + catch (e) { + log("wrapped function failed : " + e); + } + } + return r; + }; + } + jsPlumbUtil.wrap = wrap; + var EventGenerator = /** @class */ (function () { + function EventGenerator() { + var _this = this; + this._listeners = {}; + this.eventsSuspended = false; + this.tick = false; + // this is a list of events that should re-throw any errors that occur during their dispatch. + this.eventsToDieOn = { "ready": true }; + this.queue = []; + this.bind = function (event, listener, insertAtStart) { + var _one = function (evt) { + addToList(_this._listeners, evt, listener, insertAtStart); + listener.__jsPlumb = listener.__jsPlumb || {}; + listener.__jsPlumb[uuid()] = evt; + }; + if (typeof event === "string") { + _one(event); + } + else if (event.length != null) { + for (var i = 0; i < event.length; i++) { + _one(event[i]); + } + } + return _this; + }; + this.fire = function (event, value, originalEvent) { + if (!this.tick) { + this.tick = true; + if (!this.eventsSuspended && this._listeners[event]) { + var l = this._listeners[event].length, i = 0, _gone = false, ret = null; + if (!this.shouldFireEvent || this.shouldFireEvent(event, value, originalEvent)) { + while (!_gone && i < l && ret !== false) { + // doing it this way rather than catching and then possibly re-throwing means that an error propagated by this + // method will have the whole call stack available in the debugger. + if (this.eventsToDieOn[event]) { + this._listeners[event][i].apply(this, [value, originalEvent]); + } + else { + try { + ret = this._listeners[event][i].apply(this, [value, originalEvent]); + } + catch (e) { + log("jsPlumb: fire failed for event " + event + " : " + e); + } + } + i++; + if (this._listeners == null || this._listeners[event] == null) { + _gone = true; + } + } + } + } + this.tick = false; + this._drain(); + } + else { + this.queue.unshift(arguments); + } + return this; + }; + this._drain = function () { + var n = _this.queue.pop(); + if (n) { + _this.fire.apply(_this, n); + } + }; + this.unbind = function (eventOrListener, listener) { + if (arguments.length === 0) { + this._listeners = {}; + } + else if (arguments.length === 1) { + if (typeof eventOrListener === "string") { + delete this._listeners[eventOrListener]; + } + else if (eventOrListener.__jsPlumb) { + var evt = void 0; + for (var i in eventOrListener.__jsPlumb) { + evt = eventOrListener.__jsPlumb[i]; + remove(this._listeners[evt] || [], eventOrListener); + } + } + } + else if (arguments.length === 2) { + remove(this._listeners[eventOrListener] || [], listener); + } + return this; + }; + this.getListener = function (forEvent) { + return _this._listeners[forEvent]; + }; + this.setSuspendEvents = function (val) { + _this.eventsSuspended = val; + }; + this.isSuspendEvents = function () { + return _this.eventsSuspended; + }; + this.silently = function (fn) { + _this.setSuspendEvents(true); + try { + fn(); + } + catch (e) { + log("Cannot execute silent function " + e); + } + _this.setSuspendEvents(false); + }; + this.cleanupListeners = function () { + for (var i in _this._listeners) { + _this._listeners[i] = null; + } + }; + } + return EventGenerator; + }()); + jsPlumbUtil.EventGenerator = EventGenerator; + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains utility functions that run in browsers only. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ + ;(function() { + + "use strict"; + + var root = this; + + root.jsPlumbUtil.matchesSelector = function(el, selector, ctx) { + ctx = ctx || el.parentNode; + var possibles = ctx.querySelectorAll(selector); + for (var i = 0; i < possibles.length; i++) { + if (possibles[i] === el) { + return true; + } + } + return false; + }; + + root.jsPlumbUtil.consume = function(e, doNotPreventDefault) { + if (e.stopPropagation) { + e.stopPropagation(); + } + else { + e.returnValue = false; + } + + if (!doNotPreventDefault && e.preventDefault){ + e.preventDefault(); + } + }; + + /* + * Function: sizeElement + * Helper to size and position an element. You would typically use + * this when writing your own Connector or Endpoint implementation. + * + * Parameters: + * x - [int] x position for the element origin + * y - [int] y position for the element origin + * w - [int] width of the element + * h - [int] height of the element + * + */ + root.jsPlumbUtil.sizeElement = function(el, x, y, w, h) { + if (el) { + el.style.height = h + "px"; + el.height = h; + el.style.width = w + "px"; + el.width = w; + el.style.left = x + "px"; + el.style.top = y + "px"; + } + }; + + }).call(typeof window !== 'undefined' ? window : this); + +;(function() { + + var DEFAULT_OPTIONS = { + deriveAnchor:function(edge, index, ep, conn) { + return { + top:["TopRight", "TopLeft"], + bottom:["BottomRight", "BottomLeft"] + }[edge][index]; + } + }; + + var root = this; + + var ListManager = function(jsPlumbInstance, params) { + + this.count = 0; + this.instance = jsPlumbInstance; + this.lists = {}; + this.options = params || {}; + + this.instance.addList = function(el, options) { + return this.listManager.addList(el, options); + }; + + this.instance.removeList = function(el) { + this.listManager.removeList(el); + }; + + this.instance.bind("manageElement", function(p) { + + //look for [jtk-scrollable-list] elements and attach scroll listeners if necessary + var scrollableLists = this.instance.getSelector(p.el, "[jtk-scrollable-list]"); + for (var i = 0; i < scrollableLists.length; i++) { + this.addList(scrollableLists[i]); + } + + }.bind(this)); + + this.instance.bind("unmanageElement", function(p) { + this.removeList(p.el); + }); + + + this.instance.bind("connection", function(c, evt) { + if (evt == null) { + // not added by mouse. look for an ancestor of the source and/or target element that is a scrollable list, and run + // its scroll method. + this._maybeUpdateParentList(c.source); + this._maybeUpdateParentList(c.target); + } + }.bind(this)); + }; + + root.jsPlumbListManager = ListManager; + + ListManager.prototype = { + + addList : function(el, options) { + var dp = this.instance.extend({}, DEFAULT_OPTIONS); + this.instance.extend(dp, this.options); + options = this.instance.extend(dp, options || {}); + var id = [this.instance.getInstanceIndex(), this.count++].join("_"); + this.lists[id] = new List(this.instance, el, options, id); + }, + + removeList:function(el) { + var list = this.lists[el._jsPlumbList]; + if (list) { + list.destroy(); + delete this.lists[el._jsPlumbList]; + } + }, + + _maybeUpdateParentList:function (el) { + var parent = el.parentNode, container = this.instance.getContainer(); + while(parent != null && parent !== container) { + if (parent._jsPlumbList != null && this.lists[parent._jsPlumbList] != null) { + parent._jsPlumbScrollHandler(); + return + } + parent = parent.parentNode; + } + } + + + }; + + var List = function(instance, el, options, id) { + + el["_jsPlumbList"] = id; + + // + // Derive an anchor to use for the current situation. In contrast to the way we derive an endpoint, here we use `anchor` from the options, if present, as + // our first choice, and then `deriveAnchor` as our next choice. There is a default `deriveAnchor` implementation that uses TopRight/TopLeft for top and + // BottomRight/BottomLeft for bottom. + // + // edge - "top" or "bottom" + // index - 0 when endpoint is connection source, 1 when endpoint is connection target + // ep - the endpoint that is being proxied + // conn - the connection that is being proxied + // + function deriveAnchor(edge, index, ep, conn) { + return options.anchor ? options.anchor : options.deriveAnchor(edge, index, ep, conn); + } + + // + // Derive an endpoint to use for the current situation. We'll use a `deriveEndpoint` function passed in to the options as our first choice, + // followed by `endpoint` (an endpoint spec) from the options, and failing either of those we just use the `type` of the endpoint that is being proxied. + // + // edge - "top" or "bottom" + // index - 0 when endpoint is connection source, 1 when endpoint is connection target + // endpoint - the endpoint that is being proxied + // connection - the connection that is being proxied + // + function deriveEndpoint(edge, index, ep, conn) { + return options.deriveEndpoint ? options.deriveEndpoint(edge, index, ep, conn) : options.endpoint ? options.endpoint : ep.type; + } + + // + // look for a parent of the given scrollable list that is draggable, and then update the child offsets for it. this should not + // be necessary in the delegated drag stuff from the upcoming 3.0.0 release. + // + function _maybeUpdateDraggable(el) { + var parent = el.parentNode, container = instance.getContainer(); + while(parent != null && parent !== container) { + if (instance.hasClass(parent, "jtk-managed")) { + instance.recalculateOffsets(parent); + return + } + parent = parent.parentNode; + } + } + + var scrollHandler = function(e) { + + var children = instance.getSelector(el, ".jtk-managed"); + var elId = instance.getId(el); + + for (var i = 0; i < children.length; i++) { + + if (children[i].offsetTop < el.scrollTop) { + if (!children[i]._jsPlumbProxies) { + children[i]._jsPlumbProxies = children[i]._jsPlumbProxies || []; + instance.select({source: children[i]}).each(function (c) { + + + instance.proxyConnection(c, 0, el, elId, function () { + return deriveEndpoint("top", 0, c.endpoints[0], c); + }, function () { + return deriveAnchor("top", 0, c.endpoints[0], c); + }); + children[i]._jsPlumbProxies.push([c, 0]); + }); + + instance.select({target: children[i]}).each(function (c) { + instance.proxyConnection(c, 1, el, elId, function () { + return deriveEndpoint("top", 1, c.endpoints[1], c); + }, function () { + return deriveAnchor("top", 1, c.endpoints[1], c); + }); + children[i]._jsPlumbProxies.push([c, 1]); + }); + } + } + // + else if (children[i].offsetTop + children[i].offsetHeight > el.scrollTop + el.offsetHeight) { + if (!children[i]._jsPlumbProxies) { + children[i]._jsPlumbProxies = children[i]._jsPlumbProxies || []; + + instance.select({source: children[i]}).each(function (c) { + instance.proxyConnection(c, 0, el, elId, function () { + return deriveEndpoint("bottom", 0, c.endpoints[0], c); + }, function () { + return deriveAnchor("bottom", 0, c.endpoints[0], c); + }); + children[i]._jsPlumbProxies.push([c, 0]); + }); + + instance.select({target: children[i]}).each(function (c) { + instance.proxyConnection(c, 1, el, elId, function () { + return deriveEndpoint("bottom", 1, c.endpoints[1], c); + }, function () { + return deriveAnchor("bottom", 1, c.endpoints[1], c); + }); + children[i]._jsPlumbProxies.push([c, 1]); + }); + } + } else if (children[i]._jsPlumbProxies) { + for (var j = 0; j < children[i]._jsPlumbProxies.length; j++) { + instance.unproxyConnection(children[i]._jsPlumbProxies[j][0], children[i]._jsPlumbProxies[j][1], elId); + } + + delete children[i]._jsPlumbProxies; + } + + instance.revalidate(children[i]); + } + + _maybeUpdateDraggable(el); + }; + + instance.setAttribute(el, "jtk-scrollable-list", "true"); + el._jsPlumbScrollHandler = scrollHandler; + instance.on(el, "scroll", scrollHandler); + scrollHandler(); // run it once; there may be connections already. + + this.destroy = function() { + instance.off(el, "scroll", scrollHandler); + delete el._jsPlumbScrollHandler; + + var children = instance.getSelector(el, ".jtk-managed"); + var elId = instance.getId(el); + + for (var i = 0; i < children.length; i++) { + if (children[i]._jsPlumbProxies) { + for (var j = 0; j < children[i]._jsPlumbProxies.length; j++) { + instance.unproxyConnection(children[i]._jsPlumbProxies[j][0], children[i]._jsPlumbProxies[j][1], elId); + } + + delete children[i]._jsPlumbProxies; + } + } + }; + }; + + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the core code. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function () { + + "use strict"; + + var root = this; + + var _ju = root.jsPlumbUtil, + + /** + * creates a timestamp, using milliseconds since 1970, but as a string. + */ + _timestamp = function () { + return "" + (new Date()).getTime(); + }, + + // helper method to update the hover style whenever it, or paintStyle, changes. + // we use paintStyle as the foundation and merge hoverPaintStyle over the + // top. + _updateHoverStyle = function (component) { + if (component._jsPlumb.paintStyle && component._jsPlumb.hoverPaintStyle) { + var mergedHoverStyle = {}; + jsPlumb.extend(mergedHoverStyle, component._jsPlumb.paintStyle); + jsPlumb.extend(mergedHoverStyle, component._jsPlumb.hoverPaintStyle); + delete component._jsPlumb.hoverPaintStyle; + // we want the fill of paintStyle to override a gradient, if possible. + if (mergedHoverStyle.gradient && component._jsPlumb.paintStyle.fill) { + delete mergedHoverStyle.gradient; + } + component._jsPlumb.hoverPaintStyle = mergedHoverStyle; + } + }, + events = ["tap", "dbltap", "click", "dblclick", "mouseover", "mouseout", "mousemove", "mousedown", "mouseup", "contextmenu" ], + eventFilters = { "mouseout": "mouseleave", "mouseexit": "mouseleave" }, + _updateAttachedElements = function (component, state, timestamp, sourceElement) { + var affectedElements = component.getAttachedElements(); + if (affectedElements) { + for (var i = 0, j = affectedElements.length; i < j; i++) { + if (!sourceElement || sourceElement !== affectedElements[i]) { + affectedElements[i].setHover(state, true, timestamp); // tell the attached elements not to inform their own attached elements. + } + } + } + }, + _splitType = function (t) { + return t == null ? null : t.split(" "); + }, + _mapType = function(map, obj, typeId) { + for (var i in obj) { + map[i] = typeId; + } + }, + _each = function(fn, obj) { + obj = _ju.isArray(obj) || (obj.length != null && !_ju.isString(obj)) ? obj : [ obj ]; + for (var i = 0; i < obj.length; i++) { + try { + fn.apply(obj[i], [ obj[i] ]); + } + catch (e) { + _ju.log(".each iteration failed : " + e); + } + } + }, + _applyTypes = function (component, params, doNotRepaint) { + if (component.getDefaultType) { + var td = component.getTypeDescriptor(), map = {}; + var defType = component.getDefaultType(); + var o = _ju.merge({}, defType); + _mapType(map, defType, "__default"); + for (var i = 0, j = component._jsPlumb.types.length; i < j; i++) { + var tid = component._jsPlumb.types[i]; + if (tid !== "__default") { + var _t = component._jsPlumb.instance.getType(tid, td); + if (_t != null) { + + var overrides = ["anchor", "anchors", "connector", "paintStyle", "hoverPaintStyle", "endpoint", "endpoints", "connectorOverlays", "connectorStyle", "connectorHoverStyle", "endpointStyle", "endpointHoverStyle"]; + var collations = [ ]; + + if (_t.mergeStrategy === "override") { + Array.prototype.push.apply(overrides, ["events", "overlays", "cssClass"]); + } else { + collations.push("cssClass"); + } + + o = _ju.merge(o, _t, collations, overrides); + _mapType(map, _t, tid); + } + } + } + + if (params) { + o = _ju.populate(o, params, "_"); + } + + component.applyType(o, doNotRepaint, map); + if (!doNotRepaint) { + component.repaint(); + } + } + }, + +// ------------------------------ BEGIN jsPlumbUIComponent -------------------------------------------- + + jsPlumbUIComponent = root.jsPlumbUIComponent = function (params) { + + _ju.EventGenerator.apply(this, arguments); + + var self = this, + a = arguments, + idPrefix = self.idPrefix, + id = idPrefix + (new Date()).getTime(); + + this._jsPlumb = { + instance: params._jsPlumb, + parameters: params.parameters || {}, + paintStyle: null, + hoverPaintStyle: null, + paintStyleInUse: null, + hover: false, + beforeDetach: params.beforeDetach, + beforeDrop: params.beforeDrop, + overlayPlacements: [], + hoverClass: params.hoverClass || params._jsPlumb.Defaults.HoverClass, + types: [], + typeCache:{} + }; + + this.cacheTypeItem = function(key, item, typeId) { + this._jsPlumb.typeCache[typeId] = this._jsPlumb.typeCache[typeId] || {}; + this._jsPlumb.typeCache[typeId][key] = item; + }; + this.getCachedTypeItem = function(key, typeId) { + return this._jsPlumb.typeCache[typeId] ? this._jsPlumb.typeCache[typeId][key] : null; + }; + + this.getId = function () { + return id; + }; + +// ----------------------------- default type -------------------------------------------- + + + var o = params.overlays || [], oo = {}; + if (this.defaultOverlayKeys) { + for (var i = 0; i < this.defaultOverlayKeys.length; i++) { + Array.prototype.push.apply(o, this._jsPlumb.instance.Defaults[this.defaultOverlayKeys[i]] || []); + } + + for (i = 0; i < o.length; i++) { + // if a string, convert to object representation so that we can store the typeid on it. + // also assign an id. + var fo = jsPlumb.convertToFullOverlaySpec(o[i]); + oo[fo[1].id] = fo; + } + } + + var _defaultType = { + overlays:oo, + parameters: params.parameters || {}, + scope: params.scope || this._jsPlumb.instance.getDefaultScope() + }; + this.getDefaultType = function() { + return _defaultType; + }; + this.appendToDefaultType = function(obj) { + for (var i in obj) { + _defaultType[i] = obj[i]; + } + }; + +// ----------------------------- end default type -------------------------------------------- + + // all components can generate events + + if (params.events) { + for (var evtName in params.events) { + self.bind(evtName, params.events[evtName]); + } + } + + // all components get this clone function. + // TODO issue 116 showed a problem with this - it seems 'a' that is in + // the clone function's scope is shared by all invocations of it, the classic + // JS closure problem. for now, jsPlumb does a version of this inline where + // it used to call clone. but it would be nice to find some time to look + // further at this. + this.clone = function () { + var o = Object.create(this.constructor.prototype); + this.constructor.apply(o, a); + return o; + }.bind(this); + + // user can supply a beforeDetach callback, which will be executed before a detach + // is performed; returning false prevents the detach. + this.isDetachAllowed = function (connection) { + var r = true; + if (this._jsPlumb.beforeDetach) { + try { + r = this._jsPlumb.beforeDetach(connection); + } + catch (e) { + _ju.log("jsPlumb: beforeDetach callback failed", e); + } + } + return r; + }; + + // user can supply a beforeDrop callback, which will be executed before a dropped + // connection is confirmed. user can return false to reject connection. + this.isDropAllowed = function (sourceId, targetId, scope, connection, dropEndpoint, source, target) { + var r = this._jsPlumb.instance.checkCondition("beforeDrop", { + sourceId: sourceId, + targetId: targetId, + scope: scope, + connection: connection, + dropEndpoint: dropEndpoint, + source: source, target: target + }); + if (this._jsPlumb.beforeDrop) { + try { + r = this._jsPlumb.beforeDrop({ + sourceId: sourceId, + targetId: targetId, + scope: scope, + connection: connection, + dropEndpoint: dropEndpoint, + source: source, target: target + }); + } + catch (e) { + _ju.log("jsPlumb: beforeDrop callback failed", e); + } + } + return r; + }; + + var domListeners = []; + + // sets the component associated with listener events. for instance, an overlay delegates + // its events back to a connector. but if the connector is swapped on the underlying connection, + // then this component must be changed. This is called by setConnector in the Connection class. + this.setListenerComponent = function (c) { + for (var i = 0; i < domListeners.length; i++) { + domListeners[i][3] = c; + } + }; + + + }; + + var _removeTypeCssHelper = function (component, typeIndex) { + var typeId = component._jsPlumb.types[typeIndex], + type = component._jsPlumb.instance.getType(typeId, component.getTypeDescriptor()); + + if (type != null && type.cssClass && component.canvas) { + component._jsPlumb.instance.removeClass(component.canvas, type.cssClass); + } + }; + + _ju.extend(root.jsPlumbUIComponent, _ju.EventGenerator, { + + getParameter: function (name) { + return this._jsPlumb.parameters[name]; + }, + + setParameter: function (name, value) { + this._jsPlumb.parameters[name] = value; + }, + + getParameters: function () { + return this._jsPlumb.parameters; + }, + + setParameters: function (p) { + this._jsPlumb.parameters = p; + }, + + getClass:function() { + return jsPlumb.getClass(this.canvas); + }, + + hasClass:function(clazz) { + return jsPlumb.hasClass(this.canvas, clazz); + }, + + addClass: function (clazz) { + jsPlumb.addClass(this.canvas, clazz); + }, + + removeClass: function (clazz) { + jsPlumb.removeClass(this.canvas, clazz); + }, + + updateClasses: function (classesToAdd, classesToRemove) { + jsPlumb.updateClasses(this.canvas, classesToAdd, classesToRemove); + }, + + setType: function (typeId, params, doNotRepaint) { + this.clearTypes(); + this._jsPlumb.types = _splitType(typeId) || []; + _applyTypes(this, params, doNotRepaint); + }, + + getType: function () { + return this._jsPlumb.types; + }, + + reapplyTypes: function (params, doNotRepaint) { + _applyTypes(this, params, doNotRepaint); + }, + + hasType: function (typeId) { + return this._jsPlumb.types.indexOf(typeId) !== -1; + }, + + addType: function (typeId, params, doNotRepaint) { + var t = _splitType(typeId), _cont = false; + if (t != null) { + for (var i = 0, j = t.length; i < j; i++) { + if (!this.hasType(t[i])) { + this._jsPlumb.types.push(t[i]); + _cont = true; + } + } + if (_cont) { + _applyTypes(this, params, doNotRepaint); + } + } + }, + + removeType: function (typeId, params, doNotRepaint) { + var t = _splitType(typeId), _cont = false, _one = function (tt) { + var idx = this._jsPlumb.types.indexOf(tt); + if (idx !== -1) { + // remove css class if necessary + _removeTypeCssHelper(this, idx); + this._jsPlumb.types.splice(idx, 1); + return true; + } + return false; + }.bind(this); + + if (t != null) { + for (var i = 0, j = t.length; i < j; i++) { + _cont = _one(t[i]) || _cont; + } + if (_cont) { + _applyTypes(this, params, doNotRepaint); + } + } + }, + clearTypes: function (params, doNotRepaint) { + var i = this._jsPlumb.types.length; + for (var j = 0; j < i; j++) { + _removeTypeCssHelper(this, 0); + this._jsPlumb.types.splice(0, 1); + } + _applyTypes(this, params, doNotRepaint); + }, + + toggleType: function (typeId, params, doNotRepaint) { + var t = _splitType(typeId); + if (t != null) { + for (var i = 0, j = t.length; i < j; i++) { + var idx = this._jsPlumb.types.indexOf(t[i]); + if (idx !== -1) { + _removeTypeCssHelper(this, idx); + this._jsPlumb.types.splice(idx, 1); + } + else { + this._jsPlumb.types.push(t[i]); + } + } + + _applyTypes(this, params, doNotRepaint); + } + }, + applyType: function (t, doNotRepaint) { + this.setPaintStyle(t.paintStyle, doNotRepaint); + this.setHoverPaintStyle(t.hoverPaintStyle, doNotRepaint); + if (t.parameters) { + for (var i in t.parameters) { + this.setParameter(i, t.parameters[i]); + } + } + this._jsPlumb.paintStyleInUse = this.getPaintStyle(); + }, + setPaintStyle: function (style, doNotRepaint) { + // this._jsPlumb.paintStyle = jsPlumb.extend({}, style); + // TODO figure out if we want components to clone paintStyle so as not to share it. + this._jsPlumb.paintStyle = style; + this._jsPlumb.paintStyleInUse = this._jsPlumb.paintStyle; + _updateHoverStyle(this); + if (!doNotRepaint) { + this.repaint(); + } + }, + getPaintStyle: function () { + return this._jsPlumb.paintStyle; + }, + setHoverPaintStyle: function (style, doNotRepaint) { + //this._jsPlumb.hoverPaintStyle = jsPlumb.extend({}, style); + // TODO figure out if we want components to clone paintStyle so as not to share it. + this._jsPlumb.hoverPaintStyle = style; + _updateHoverStyle(this); + if (!doNotRepaint) { + this.repaint(); + } + }, + getHoverPaintStyle: function () { + return this._jsPlumb.hoverPaintStyle; + }, + destroy: function (force) { + if (force || this.typeId == null) { + this.cleanupListeners(); // this is on EventGenerator + this.clone = null; + this._jsPlumb = null; + } + }, + + isHover: function () { + return this._jsPlumb.hover; + }, + + setHover: function (hover, ignoreAttachedElements, timestamp) { + // while dragging, we ignore these events. this keeps the UI from flashing and + // swishing and whatevering. + if (this._jsPlumb && !this._jsPlumb.instance.currentlyDragging && !this._jsPlumb.instance.isHoverSuspended()) { + + this._jsPlumb.hover = hover; + var method = hover ? "addClass" : "removeClass"; + + if (this.canvas != null) { + if (this._jsPlumb.instance.hoverClass != null) { + this._jsPlumb.instance[method](this.canvas, this._jsPlumb.instance.hoverClass); + } + if (this._jsPlumb.hoverClass != null) { + this._jsPlumb.instance[method](this.canvas, this._jsPlumb.hoverClass); + } + } + if (this._jsPlumb.hoverPaintStyle != null) { + this._jsPlumb.paintStyleInUse = hover ? this._jsPlumb.hoverPaintStyle : this._jsPlumb.paintStyle; + if (!this._jsPlumb.instance.isSuspendDrawing()) { + timestamp = timestamp || _timestamp(); + this.repaint({timestamp: timestamp, recalc: false}); + } + } + // get the list of other affected elements, if supported by this component. + // for a connection, its the endpoints. for an endpoint, its the connections! surprise. + if (this.getAttachedElements && !ignoreAttachedElements) { + _updateAttachedElements(this, hover, _timestamp(), this); + } + } + } + }); + +// ------------------------------ END jsPlumbUIComponent -------------------------------------------- + + var _jsPlumbInstanceIndex = 0, + getInstanceIndex = function () { + var i = _jsPlumbInstanceIndex + 1; + _jsPlumbInstanceIndex++; + return i; + }; + + var jsPlumbInstance = root.jsPlumbInstance = function (_defaults) { + + this.version = "2.13.2"; + + this.Defaults = { + Anchor: "Bottom", + Anchors: [ null, null ], + ConnectionsDetachable: true, + ConnectionOverlays: [ ], + Connector: "Bezier", + Container: null, + DoNotThrowErrors: false, + DragOptions: { }, + DropOptions: { }, + Endpoint: "Dot", + EndpointOverlays: [ ], + Endpoints: [ null, null ], + EndpointStyle: { fill: "#456" }, + EndpointStyles: [ null, null ], + EndpointHoverStyle: null, + EndpointHoverStyles: [ null, null ], + HoverPaintStyle: null, + LabelStyle: { color: "black" }, + ListStyle: { }, + LogEnabled: false, + Overlays: [ ], + MaxConnections: 1, + PaintStyle: { "stroke-width": 4, stroke: "#456" }, + ReattachConnections: false, + RenderMode: "svg", + Scope: "jsPlumb_DefaultScope" + }; + + if (_defaults) { + jsPlumb.extend(this.Defaults, _defaults); + } + + this.logEnabled = this.Defaults.LogEnabled; + this._connectionTypes = {}; + this._endpointTypes = {}; + + _ju.EventGenerator.apply(this); + + var _currentInstance = this, + _instanceIndex = getInstanceIndex(), + _bb = _currentInstance.bind, + _initialDefaults = {}, + _zoom = 1, + _info = function (el) { + if (el == null) { + return null; + } + else if (el.nodeType === 3 || el.nodeType === 8) { + return { el:el, text:true }; + } + else { + var _el = _currentInstance.getElement(el); + return { el: _el, id: (_ju.isString(el) && _el == null) ? el : _getId(_el) }; + } + }; + + this.getInstanceIndex = function () { + return _instanceIndex; + }; + + // CONVERTED + this.setZoom = function (z, repaintEverything) { + _zoom = z; + _currentInstance.fire("zoom", _zoom); + if (repaintEverything) { + _currentInstance.repaintEverything(); + } + return true; + }; + // CONVERTED + this.getZoom = function () { + return _zoom; + }; + + for (var i in this.Defaults) { + _initialDefaults[i] = this.Defaults[i]; + } + + var _container, _containerDelegations = []; + this.unbindContainer = function() { + if (_container != null && _containerDelegations.length > 0) { + for (var i = 0; i < _containerDelegations.length; i++) { + _currentInstance.off(_container, _containerDelegations[i][0], _containerDelegations[i][1]); + } + } + }; + this.setContainer = function (c) { + + this.unbindContainer(); + + // get container as dom element. + c = this.getElement(c); + // move existing connections and endpoints, if any. + this.select().each(function (conn) { + conn.moveParent(c); + }); + this.selectEndpoints().each(function (ep) { + ep.moveParent(c); + }); + + // set container. + var previousContainer = _container; + _container = c; + _containerDelegations.length = 0; + var eventAliases = { + "endpointclick":"endpointClick", + "endpointdblclick":"endpointDblClick" + }; + + var _oneDelegateHandler = function (id, e, componentType) { + var t = e.srcElement || e.target, + jp = (t && t.parentNode ? t.parentNode._jsPlumb : null) || (t ? t._jsPlumb : null) || (t && t.parentNode && t.parentNode.parentNode ? t.parentNode.parentNode._jsPlumb : null); + if (jp) { + jp.fire(id, jp, e); + var alias = componentType ? eventAliases[componentType + id] || id : id; + // jsplumb also fires every event coming from components/overlays. That's what the test for `jp.component` is for. + _currentInstance.fire(alias, jp.component || jp, e); + } + }; + + var _addOneDelegate = function(eventId, selector, fn) { + _containerDelegations.push([eventId, fn]); + _currentInstance.on(_container, eventId, selector, fn); + }; + + // delegate one event on the container to jsplumb elements. it might be possible to + // abstract this out: each of endpoint, connection and overlay could register themselves with + // jsplumb as "component types" or whatever, and provide a suitable selector. this would be + // done by the renderer (although admittedly from 2.0 onwards we're not supporting vml anymore) + var _oneDelegate = function (id) { + // connections. + _addOneDelegate(id, ".jtk-connector", function (e) { + _oneDelegateHandler(id, e); + }); + // endpoints. note they can have an enclosing div, or not. + _addOneDelegate(id, ".jtk-endpoint", function (e) { + _oneDelegateHandler(id, e, "endpoint"); + }); + // overlays + _addOneDelegate(id, ".jtk-overlay", function (e) { + _oneDelegateHandler(id, e); + }); + }; + + for (var i = 0; i < events.length; i++) { + _oneDelegate(events[i]); + } + + // managed elements + for (var elId in managedElements) { + var el = managedElements[elId].el; + if (el.parentNode === previousContainer) { + previousContainer.removeChild(el); + _container.appendChild(el); + } + } + + }; + this.getContainer = function () { + return _container; + }; + + this.bind = function (event, fn) { + if ("ready" === event && initialized) { + fn(); + } + else { + _bb.apply(_currentInstance, [event, fn]); + } + }; + + _currentInstance.importDefaults = function (d) { + for (var i in d) { + _currentInstance.Defaults[i] = d[i]; + } + if (d.Container) { + _currentInstance.setContainer(d.Container); + } + + return _currentInstance; + }; + + _currentInstance.restoreDefaults = function () { + _currentInstance.Defaults = jsPlumb.extend({}, _initialDefaults); + return _currentInstance; + }; + + var log = null, + initialized = false, + // TODO remove from window scope + connections = [], + // map of element id -> endpoint lists. an element can have an arbitrary + // number of endpoints on it, and not all of them have to be connected + // to anything. + endpointsByElement = {}, + endpointsByUUID = {}, + managedElements = {}, + offsets = {}, + offsetTimestamps = {}, + draggableStates = {}, + connectionBeingDragged = false, + sizes = [], + _suspendDrawing = false, + _suspendedAt = null, + DEFAULT_SCOPE = this.Defaults.Scope, + _curIdStamp = 1, + _idstamp = function () { + return "" + _curIdStamp++; + }, + + // + // appends an element to some other element, which is calculated as follows: + // + // 1. if Container exists, use that element. + // 2. if the 'parent' parameter exists, use that. + // 3. otherwise just use the root element. + // + // + _appendElement = function (el, parent) { + if (_container) { + _container.appendChild(el); + } + else if (!parent) { + this.appendToRoot(el); + } + else { + this.getElement(parent).appendChild(el); + } + }.bind(this), + + // + // Draws an endpoint and its connections. this is the main entry point into drawing connections as well + // as endpoints, since jsPlumb is endpoint-centric under the hood. + // + // @param element element to draw (of type library specific element object) + // @param ui UI object from current library's event system. optional. + // @param timestamp timestamp for this paint cycle. used to speed things up a little by cutting down the amount of offset calculations we do. + // @param clearEdits defaults to false; indicates that mouse edits for connectors should be cleared + /// + _draw = function (element, ui, timestamp, clearEdits) { + + if (!_suspendDrawing) { + + element = _currentInstance.getElement(element); + + if (element != null) { + + var id = _getId(element), + repaintEls = element.querySelectorAll(".jtk-managed"); + + if (timestamp == null) { + timestamp = _timestamp(); + } + + // update the offset of everything _before_ we try to draw anything. + var o = _updateOffset({elId: id, offset: ui, recalc: false, timestamp: timestamp}); + + for (var i = 0; i < repaintEls.length; i++) { + _updateOffset({ + elId: repaintEls[i].getAttribute("id"), + // offset: { + // left: o.o.left + repaintEls[i].offset.left, + // top: o.o.top + repaintEls[i].offset.top + // }, + recalc: true, + timestamp: timestamp + }); + } + + _currentInstance.anchorManager.redraw(id, ui, timestamp, null, clearEdits); + + if (repaintEls) { + for (var j = 0; j < repaintEls.length; j++) { + _currentInstance.anchorManager.redraw(repaintEls[j].getAttribute("id"), null, timestamp, null, clearEdits, true); + } + } + } + } + }, + + // + // gets an Endpoint by uuid. + // + _getEndpoint = function (uuid) { + return endpointsByUUID[uuid]; + }, + + /** + * inits a draggable if it's not already initialised. + * TODO: somehow abstract this to the adapter, because the concept of "draggable" has no + * place on the server. + */ + + + _scopeMatch = function (e1, e2) { + var s1 = e1.scope.split(/\s/), s2 = e2.scope.split(/\s/); + for (var i = 0; i < s1.length; i++) { + for (var j = 0; j < s2.length; j++) { + if (s2[j] === s1[i]) { + return true; + } + } + } + + return false; + }, + + _mergeOverrides = function (def, values) { + var m = jsPlumb.extend({}, def); + for (var i in values) { + if (values[i]) { + m[i] = values[i]; + } + } + return m; + }, + + /* + * prepares a final params object that can be passed to _newConnection, taking into account defaults, events, etc. + */ + _prepareConnectionParams = function (params, referenceParams) { + var _p = jsPlumb.extend({ }, params); + if (referenceParams) { + jsPlumb.extend(_p, referenceParams); + } + + // hotwire endpoints passed as source or target to sourceEndpoint/targetEndpoint, respectively. + if (_p.source) { + if (_p.source.endpoint) { + _p.sourceEndpoint = _p.source; + } + else { + _p.source = _currentInstance.getElement(_p.source); + } + } + if (_p.target) { + if (_p.target.endpoint) { + _p.targetEndpoint = _p.target; + } + else { + _p.target = _currentInstance.getElement(_p.target); + } + } + + // test for endpoint uuids to connect + if (params.uuids) { + _p.sourceEndpoint = _getEndpoint(params.uuids[0]); + _p.targetEndpoint = _getEndpoint(params.uuids[1]); + } + + // now ensure that if we do have Endpoints already, they're not full. + // source: + if (_p.sourceEndpoint && _p.sourceEndpoint.isFull()) { + _ju.log(_currentInstance, "could not add connection; source endpoint is full"); + return; + } + + // target: + if (_p.targetEndpoint && _p.targetEndpoint.isFull()) { + _ju.log(_currentInstance, "could not add connection; target endpoint is full"); + return; + } + + // if source endpoint mandates connection type and nothing specified in our params, use it. + if (!_p.type && _p.sourceEndpoint) { + _p.type = _p.sourceEndpoint.connectionType; + } + + // copy in any connectorOverlays that were specified on the source endpoint. + // it doesnt copy target endpoint overlays. i'm not sure if we want it to or not. + if (_p.sourceEndpoint && _p.sourceEndpoint.connectorOverlays) { + _p.overlays = _p.overlays || []; + for (var i = 0, j = _p.sourceEndpoint.connectorOverlays.length; i < j; i++) { + _p.overlays.push(_p.sourceEndpoint.connectorOverlays[i]); + } + } + + // scope + if (_p.sourceEndpoint && _p.sourceEndpoint.scope) { + _p.scope = _p.sourceEndpoint.scope; + } + + // pointer events + if (!_p["pointer-events"] && _p.sourceEndpoint && _p.sourceEndpoint.connectorPointerEvents) { + _p["pointer-events"] = _p.sourceEndpoint.connectorPointerEvents; + } + + + var _addEndpoint = function (el, def, idx) { + var params = _mergeOverrides(def, { + anchor: _p.anchors ? _p.anchors[idx] : _p.anchor, + endpoint: _p.endpoints ? _p.endpoints[idx] : _p.endpoint, + paintStyle: _p.endpointStyles ? _p.endpointStyles[idx] : _p.endpointStyle, + hoverPaintStyle: _p.endpointHoverStyles ? _p.endpointHoverStyles[idx] : _p.endpointHoverStyle + }); + return _currentInstance.addEndpoint(el, params); + }; + + // check for makeSource/makeTarget specs. + + var _oneElementDef = function (type, idx, defs, matchType) { + if (_p[type] && !_p[type].endpoint && !_p[type + "Endpoint"] && !_p.newConnection) { + var tid = _getId(_p[type]), tep = defs[tid]; + + tep = tep ? tep[matchType] : null; + + if (tep) { + // if not enabled, return. + if (!tep.enabled) { + return false; + } + + var epDef = jsPlumb.extend({}, tep.def); + delete epDef.label; + + var newEndpoint = tep.endpoint != null && tep.endpoint._jsPlumb ? tep.endpoint : _addEndpoint(_p[type], epDef, idx); + if (newEndpoint.isFull()) { + return false; + } + _p[type + "Endpoint"] = newEndpoint; + if (!_p.scope && epDef.scope) { + _p.scope = epDef.scope; + } // provide scope if not already provided and endpoint def has one. + if (tep.uniqueEndpoint) { + if (!tep.endpoint) { + tep.endpoint = newEndpoint; + newEndpoint.setDeleteOnEmpty(false); + } + else { + newEndpoint.finalEndpoint = tep.endpoint; + } + } else { + newEndpoint.setDeleteOnEmpty(true); + } + + // + // copy in connector overlays if present on the source definition. + // + if (idx === 0 && tep.def.connectorOverlays) { + _p.overlays = _p.overlays || []; + Array.prototype.push.apply(_p.overlays, tep.def.connectorOverlays); + } + } + } + }; + + if (_oneElementDef("source", 0, this.sourceEndpointDefinitions, _p.type || "default") === false) { + return; + } + if (_oneElementDef("target", 1, this.targetEndpointDefinitions, _p.type || "default") === false) { + return; + } + + // last, ensure scopes match + if (_p.sourceEndpoint && _p.targetEndpoint) { + if (!_scopeMatch(_p.sourceEndpoint, _p.targetEndpoint)) { + _p = null; + } + } + + return _p; + }.bind(_currentInstance), + + _newConnection = function (params) { + var connectionFunc = _currentInstance.Defaults.ConnectionType || _currentInstance.getDefaultConnectionType(); + + params._jsPlumb = _currentInstance; + params.newConnection = _newConnection; + params.newEndpoint = _newEndpoint; + params.endpointsByUUID = endpointsByUUID; + params.endpointsByElement = endpointsByElement; + params.finaliseConnection = _finaliseConnection; + params.id = "con_" + _idstamp(); + var con = new connectionFunc(params); + + // if the connection is draggable, then maybe we need to tell the target endpoint to init the + // dragging code. it won't run again if it already configured to be draggable. + if (con.isDetachable()) { + con.endpoints[0].initDraggable("_jsPlumbSource"); + con.endpoints[1].initDraggable("_jsPlumbTarget"); + } + + return con; + }, + + // + // adds the connection to the backing model, fires an event if necessary and then redraws + // + _finaliseConnection = _currentInstance.finaliseConnection = function (jpc, params, originalEvent, doInformAnchorManager) { + params = params || {}; + // add to list of connections (by scope). + if (!jpc.suspendedEndpoint) { + connections.push(jpc); + } + + jpc.pending = null; + + // turn off isTemporarySource on the source endpoint (only viable on first draw) + jpc.endpoints[0].isTemporarySource = false; + + // always inform the anchor manager + // except that if jpc has a suspended endpoint it's not true to say the + // connection is new; it has just (possibly) moved. the question is whether + // to make that call here or in the anchor manager. i think perhaps here. + if (doInformAnchorManager !== false) { + _currentInstance.anchorManager.newConnection(jpc); + } + + // force a paint + _draw(jpc.source); + + // fire an event + if (!params.doNotFireConnectionEvent && params.fireEvent !== false) { + + var eventArgs = { + connection: jpc, + source: jpc.source, target: jpc.target, + sourceId: jpc.sourceId, targetId: jpc.targetId, + sourceEndpoint: jpc.endpoints[0], targetEndpoint: jpc.endpoints[1] + }; + + _currentInstance.fire("connection", eventArgs, originalEvent); + } + }, + + /* + factory method to prepare a new endpoint. this should always be used instead of creating Endpoints + manually, since this method attaches event listeners and an id. + */ + _newEndpoint = function (params, id) { + var endpointFunc = _currentInstance.Defaults.EndpointType || jsPlumb.Endpoint; + var _p = jsPlumb.extend({}, params); + //delete _p.label; // not supported by endpoint. + _p._jsPlumb = _currentInstance; + _p.newConnection = _newConnection; + _p.newEndpoint = _newEndpoint; + _p.endpointsByUUID = endpointsByUUID; + _p.endpointsByElement = endpointsByElement; + _p.fireDetachEvent = fireDetachEvent; + _p.elementId = id || _getId(_p.source); + var ep = new endpointFunc(_p); + ep.id = "ep_" + _idstamp(); + _manage(_p.elementId, _p.source); + + if (!jsPlumb.headless) { + _currentInstance.getDragManager().endpointAdded(_p.source, id); + } + + return ep; + }, + + /* + * performs the given function operation on all the connections found + * for the given element id; this means we find all the endpoints for + * the given element, and then for each endpoint find the connectors + * connected to it. then we pass each connection in to the given + * function. + */ + _operation = function (elId, func, endpointFunc) { + var endpoints = endpointsByElement[elId]; + if (endpoints && endpoints.length) { + for (var i = 0, ii = endpoints.length; i < ii; i++) { + for (var j = 0, jj = endpoints[i].connections.length; j < jj; j++) { + var retVal = func(endpoints[i].connections[j]); + // if the function passed in returns true, we exit. + // most functions return false. + if (retVal) { + return; + } + } + if (endpointFunc) { + endpointFunc(endpoints[i]); + } + } + } + }, + + _setDraggable = function (element, draggable) { + return jsPlumb.each(element, function (el) { + if (_currentInstance.isDragSupported(el)) { + draggableStates[_currentInstance.getAttribute(el, "id")] = draggable; + _currentInstance.setElementDraggable(el, draggable); + } + }); + }, + /* + * private method to do the business of hiding/showing. + * + * @param el + * either Id of the element in question or a library specific + * object for the element. + * @param state + * String specifying a value for the css 'display' property + * ('block' or 'none'). + */ + _setVisible = function (el, state, alsoChangeEndpoints) { + state = state === "block"; + var endpointFunc = null; + if (alsoChangeEndpoints) { + endpointFunc = function (ep) { + ep.setVisible(state, true, true); + }; + } + var info = _info(el); + _operation(info.id, function (jpc) { + if (state && alsoChangeEndpoints) { + // this test is necessary because this functionality is new, and i wanted to maintain backwards compatibility. + // this block will only set a connection to be visible if the other endpoint in the connection is also visible. + var oidx = jpc.sourceId === info.id ? 1 : 0; + if (jpc.endpoints[oidx].isVisible()) { + jpc.setVisible(true); + } + } + else { // the default behaviour for show, and what always happens for hide, is to just set the visibility without getting clever. + jpc.setVisible(state); + } + }, endpointFunc); + }, + /** + * private method to do the business of toggling hiding/showing. + */ + _toggleVisible = function (elId, changeEndpoints) { + var endpointFunc = null; + if (changeEndpoints) { + endpointFunc = function (ep) { + var state = ep.isVisible(); + ep.setVisible(!state); + }; + } + _operation(elId, function (jpc) { + var state = jpc.isVisible(); + jpc.setVisible(!state); + }, endpointFunc); + }, + + // TODO comparison performance + _getCachedData = function (elId) { + var o = offsets[elId]; + if (!o) { + return _updateOffset({elId: elId}); + } + else { + return {o: o, s: sizes[elId]}; + } + }, + + /** + * gets an id for the given element, creating and setting one if + * necessary. the id is of the form + * + * jsPlumb__ + * + * where "index in instance" is a monotonically increasing integer that starts at 0, + * for each instance. this method is used not only to assign ids to elements that do not + * have them but also to connections and endpoints. + */ + _getId = function (element, uuid, doNotCreateIfNotFound) { + if (_ju.isString(element)) { + return element; + } + if (element == null) { + return null; + } + var id = _currentInstance.getAttribute(element, "id"); + if (!id || id === "undefined") { + // check if fixed uuid parameter is given + if (arguments.length === 2 && arguments[1] !== undefined) { + id = uuid; + } + else if (arguments.length === 1 || (arguments.length === 3 && !arguments[2])) { + id = "jsPlumb_" + _instanceIndex + "_" + _idstamp(); + } + + if (!doNotCreateIfNotFound) { + _currentInstance.setAttribute(element, "id", id); + } + } + return id; + }; + + this.setConnectionBeingDragged = function (v) { + connectionBeingDragged = v; + }; + this.isConnectionBeingDragged = function () { + return connectionBeingDragged; + }; + + /** + * Returns a map of all the elements this jsPlumbInstance is currently managing. + * @returns {Object} Map of [id-> {el, endpoint[], connection, position}] information. + */ + this.getManagedElements = function() { + return managedElements; + }; + + this.connectorClass = "jtk-connector"; + this.connectorOutlineClass = "jtk-connector-outline"; + this.connectedClass = "jtk-connected"; + this.hoverClass = "jtk-hover"; + this.endpointClass = "jtk-endpoint"; + this.endpointConnectedClass = "jtk-endpoint-connected"; + this.endpointFullClass = "jtk-endpoint-full"; + this.endpointDropAllowedClass = "jtk-endpoint-drop-allowed"; + this.endpointDropForbiddenClass = "jtk-endpoint-drop-forbidden"; + this.overlayClass = "jtk-overlay"; + this.draggingClass = "jtk-dragging";// CONVERTED + this.elementDraggingClass = "jtk-element-dragging";// CONVERTED + this.sourceElementDraggingClass = "jtk-source-element-dragging"; // CONVERTED + this.targetElementDraggingClass = "jtk-target-element-dragging";// CONVERTED + this.endpointAnchorClassPrefix = "jtk-endpoint-anchor"; + this.hoverSourceClass = "jtk-source-hover"; + this.hoverTargetClass = "jtk-target-hover"; + this.dragSelectClass = "jtk-drag-select"; + + this.Anchors = {}; + this.Connectors = { "svg": {} }; + this.Endpoints = { "svg": {} }; + this.Overlays = { "svg": {} } ; + this.ConnectorRenderers = {}; + this.SVG = "svg"; + +// --------------------------- jsPlumbInstance public API --------------------------------------------------------- + + + this.addEndpoint = function (el, params, referenceParams) { + referenceParams = referenceParams || {}; + var p = jsPlumb.extend({}, referenceParams); + jsPlumb.extend(p, params); + p.endpoint = p.endpoint || _currentInstance.Defaults.Endpoint; + p.paintStyle = p.paintStyle || _currentInstance.Defaults.EndpointStyle; + + var results = [], + inputs = (_ju.isArray(el) || (el.length != null && !_ju.isString(el))) ? el : [ el ]; + + for (var i = 0, j = inputs.length; i < j; i++) { + p.source = _currentInstance.getElement(inputs[i]); + _ensureContainer(p.source); + + var id = _getId(p.source), e = _newEndpoint(p, id); + + // ensure element is managed. force a recalc if drawing not suspended, to ensure the cached value is fresh + var myOffset = _manage(id, p.source, null, !_suspendDrawing).info.o; + _ju.addToList(endpointsByElement, id, e); + + if (!_suspendDrawing) { + e.paint({ + anchorLoc: e.anchor.compute({ xy: [ myOffset.left, myOffset.top ], wh: sizes[id], element: e, timestamp: _suspendedAt }), + timestamp: _suspendedAt + }); + } + + results.push(e); + } + + return results.length === 1 ? results[0] : results; + }; + + this.addEndpoints = function (el, endpoints, referenceParams) { + var results = []; + for (var i = 0, j = endpoints.length; i < j; i++) { + var e = _currentInstance.addEndpoint(el, endpoints[i], referenceParams); + if (_ju.isArray(e)) { + Array.prototype.push.apply(results, e); + } + else { + results.push(e); + } + } + return results; + }; + + this.animate = function (el, properties, options) { + if (!this.animationSupported) { + return false; + } + + options = options || {}; + var del = _currentInstance.getElement(el), + id = _getId(del), + stepFunction = jsPlumb.animEvents.step, + completeFunction = jsPlumb.animEvents.complete; + + options[stepFunction] = _ju.wrap(options[stepFunction], function () { + _currentInstance.revalidate(id); + }); + + // onComplete repaints, just to make sure everything looks good at the end of the animation. + options[completeFunction] = _ju.wrap(options[completeFunction], function () { + _currentInstance.revalidate(id); + }); + + _currentInstance.doAnimate(del, properties, options); + }; + + /** + * checks for a listener for the given condition, executing it if found, passing in the given value. + * condition listeners would have been attached using "bind" (which is, you could argue, now overloaded, since + * firing click events etc is a bit different to what this does). i thought about adding a "bindCondition" + * or something, but decided against it, for the sake of simplicity. jsPlumb will never fire one of these + * condition events anyway. + */ + this.checkCondition = function (conditionName, args) { + var l = _currentInstance.getListener(conditionName), + r = true; + + if (l && l.length > 0) { + var values = Array.prototype.slice.call(arguments, 1); + try { + for (var i = 0, j = l.length; i < j; i++) { + r = r && l[i].apply(l[i], values); + } + } + catch (e) { + _ju.log(_currentInstance, "cannot check condition [" + conditionName + "]" + e); + } + } + return r; + }; + + this.connect = function (params, referenceParams) { + // prepare a final set of parameters to create connection with + var _p = _prepareConnectionParams(params, referenceParams), jpc; + // TODO probably a nicer return value if the connection was not made. _prepareConnectionParams + // will return null (and log something) if either endpoint was full. what would be nicer is to + // create a dedicated 'error' object. + if (_p) { + if (_p.source == null && _p.sourceEndpoint == null) { + _ju.log("Cannot establish connection - source does not exist"); + return; + } + if (_p.target == null && _p.targetEndpoint == null) { + _ju.log("Cannot establish connection - target does not exist"); + return; + } + _ensureContainer(_p.source); + // create the connection. it is not yet registered + jpc = _newConnection(_p); + // now add it the model, fire an event, and redraw + _finaliseConnection(jpc, _p); + } + return jpc; + }; + + var stTypes = [ + { el: "source", elId: "sourceId", epDefs: "sourceEndpointDefinitions" }, + { el: "target", elId: "targetId", epDefs: "targetEndpointDefinitions" } + ]; + + var _set = function (c, el, idx, doNotRepaint) { + var ep, _st = stTypes[idx], cId = c[_st.elId], cEl = c[_st.el], sid, sep, + oldEndpoint = c.endpoints[idx]; + + var evtParams = { + index: idx, + originalSourceId: idx === 0 ? cId : c.sourceId, + newSourceId: c.sourceId, + originalTargetId: idx === 1 ? cId : c.targetId, + newTargetId: c.targetId, + connection: c + }; + + if (el.constructor === jsPlumb.Endpoint) { + ep = el; + ep.addConnection(c); + el = ep.element; + } + else { + sid = _getId(el); + sep = this[_st.epDefs][sid]; + + if (sid === c[_st.elId]) { + ep = null; // dont change source/target if the element is already the one given. + } + else if (sep) { + for (var t in sep) { + if (!sep[t].enabled) { + return; + } + ep = sep[t].endpoint != null && sep[t].endpoint._jsPlumb ? sep[t].endpoint : this.addEndpoint(el, sep[t].def); + if (sep[t].uniqueEndpoint) { + sep[t].endpoint = ep; + } + ep.addConnection(c); + } + } + else { + ep = c.makeEndpoint(idx === 0, el, sid); + } + } + + if (ep != null) { + oldEndpoint.detachFromConnection(c); + c.endpoints[idx] = ep; + c[_st.el] = ep.element; + c[_st.elId] = ep.elementId; + evtParams[idx === 0 ? "newSourceId" : "newTargetId"] = ep.elementId; + + fireMoveEvent(evtParams); + + if (!doNotRepaint) { + c.repaint(); + } + } + + evtParams.element = el; + return evtParams; + + }.bind(this); + + this.setSource = function (connection, el, doNotRepaint) { + var p = _set(connection, el, 0, doNotRepaint); + this.anchorManager.sourceChanged(p.originalSourceId, p.newSourceId, connection, p.el); + }; + this.setTarget = function (connection, el, doNotRepaint) { + var p = _set(connection, el, 1, doNotRepaint); + this.anchorManager.updateOtherEndpoint(p.originalSourceId, p.originalTargetId, p.newTargetId, connection); + }; + + this.deleteEndpoint = function (object, dontUpdateHover, deleteAttachedObjects) { + var endpoint = (typeof object === "string") ? endpointsByUUID[object] : object; + if (endpoint) { + _currentInstance.deleteObject({ endpoint: endpoint, dontUpdateHover: dontUpdateHover, deleteAttachedObjects:deleteAttachedObjects }); + } + return _currentInstance; + }; + + this.deleteEveryEndpoint = function () { + var _is = _currentInstance.setSuspendDrawing(true); + for (var id in endpointsByElement) { + var endpoints = endpointsByElement[id]; + if (endpoints && endpoints.length) { + for (var i = 0, j = endpoints.length; i < j; i++) { + _currentInstance.deleteEndpoint(endpoints[i], true); + } + } + } + endpointsByElement = {}; + managedElements = {}; + endpointsByUUID = {}; + offsets = {}; + offsetTimestamps = {}; + _currentInstance.anchorManager.reset(); + var dm = _currentInstance.getDragManager(); + if (dm) { + dm.reset(); + } + if (!_is) { + _currentInstance.setSuspendDrawing(false); + } + return _currentInstance; + }; + + var fireDetachEvent = function (jpc, doFireEvent, originalEvent) { + // may have been given a connection, or in special cases, an object + var connType = _currentInstance.Defaults.ConnectionType || _currentInstance.getDefaultConnectionType(), + argIsConnection = jpc.constructor === connType, + params = argIsConnection ? { + connection: jpc, + source: jpc.source, target: jpc.target, + sourceId: jpc.sourceId, targetId: jpc.targetId, + sourceEndpoint: jpc.endpoints[0], targetEndpoint: jpc.endpoints[1] + } : jpc; + + if (doFireEvent) { + _currentInstance.fire("connectionDetached", params, originalEvent); + } + + // always fire this. used by internal jsplumb stuff. + _currentInstance.fire("internal.connectionDetached", params, originalEvent); + + _currentInstance.anchorManager.connectionDetached(params); + }; + + var fireMoveEvent = _currentInstance.fireMoveEvent = function (params, evt) { + _currentInstance.fire("connectionMoved", params, evt); + }; + + this.unregisterEndpoint = function (endpoint) { + if (endpoint._jsPlumb.uuid) { + endpointsByUUID[endpoint._jsPlumb.uuid] = null; + } + _currentInstance.anchorManager.deleteEndpoint(endpoint); + // TODO at least replace this with a removeWithFunction call. + for (var e in endpointsByElement) { + var endpoints = endpointsByElement[e]; + if (endpoints) { + var newEndpoints = []; + for (var i = 0, j = endpoints.length; i < j; i++) { + if (endpoints[i] !== endpoint) { + newEndpoints.push(endpoints[i]); + } + } + + endpointsByElement[e] = newEndpoints; + } + if (endpointsByElement[e].length < 1) { + delete endpointsByElement[e]; + } + } + }; + + var IS_DETACH_ALLOWED = "isDetachAllowed"; + var BEFORE_DETACH = "beforeDetach"; + var CHECK_CONDITION = "checkCondition"; + + /** + * Deletes a Connection. + * @method deleteConnection + * @param connection Connection to delete + * @param {Object} [params] Optional delete parameters + * @param {Boolean} [params.doNotFireEvent=false] If true, a connection detached event will not be fired. Otherwise one will. + * @param {Boolean} [params.force=false] If true, the connection will be deleted even if a beforeDetach interceptor tries to stop the deletion. + * @returns {Boolean} True if the connection was deleted, false otherwise. + */ + this.deleteConnection = function(connection, params) { + + if (connection != null) { + params = params || {}; + + if (params.force || _ju.functionChain(true, false, [ + [ connection.endpoints[0], IS_DETACH_ALLOWED, [ connection ] ], + [ connection.endpoints[1], IS_DETACH_ALLOWED, [ connection ] ], + [ connection, IS_DETACH_ALLOWED, [ connection ] ], + [ _currentInstance, CHECK_CONDITION, [ BEFORE_DETACH, connection ] ] + ])) { + + connection.setHover(false); + fireDetachEvent(connection, !connection.pending && params.fireEvent !== false, params.originalEvent); + + connection.endpoints[0].detachFromConnection(connection); + connection.endpoints[1].detachFromConnection(connection); + _ju.removeWithFunction(connections, function (_c) { + return connection.id === _c.id; + }); + + connection.cleanup(); + connection.destroy(); + return true; + } + } + return false; + }; + + /** + * Remove all Connections from all elements, but leaves Endpoints in place ((unless a connection is set to auto delete its Endpoints). + * @method deleteEveryConnection + * @param {Object} [params] optional params object for the call + * @param {Boolean} [params.fireEvent=true] Whether or not to fire detach events + * @param {Boolean} [params.forceDetach=false] If true, this call will ignore any `beforeDetach` interceptors. + * @returns {Number} The number of connections that were deleted. + */ + this.deleteEveryConnection = function (params) { + params = params || {}; + var count = connections.length, deletedCount = 0; + _currentInstance.batch(function () { + for (var i = 0; i < count; i++) { + deletedCount += _currentInstance.deleteConnection(connections[0], params) ? 1 : 0; + } + }); + return deletedCount; + }; + + /** + * Removes all an element's Connections. + * @method deleteConnectionsForElement + * @param {Object} el Either the id of the element, or a selector for the element. + * @param {Object} [params] Optional parameters. + * @param {Boolean} [params.fireEvent=true] Whether or not to fire the detach event. + * @param {Boolean} [params.forceDetach=false] If true, this call will ignore any `beforeDetach` interceptors. + * @return {jsPlumbInstance} The current jsPlumb instance. + */ + this.deleteConnectionsForElement = function (el, params) { + params = params || {}; + el = _currentInstance.getElement(el); + var id = _getId(el), endpoints = endpointsByElement[id]; + if (endpoints && endpoints.length) { + for (var i = 0, j = endpoints.length; i < j; i++) { + endpoints[i].deleteEveryConnection(params); + } + } + return _currentInstance; + }; + + /// not public. but of course its exposed. how to change this. + this.deleteObject = function (params) { + var result = { + endpoints: {}, + connections: {}, + endpointCount: 0, + connectionCount: 0 + }, + deleteAttachedObjects = params.deleteAttachedObjects !== false; + + var unravelConnection = function (connection) { + if (connection != null && result.connections[connection.id] == null) { + if (!params.dontUpdateHover && connection._jsPlumb != null) { + connection.setHover(false); + } + result.connections[connection.id] = connection; + result.connectionCount++; + } + }; + var unravelEndpoint = function (endpoint) { + if (endpoint != null && result.endpoints[endpoint.id] == null) { + if (!params.dontUpdateHover && endpoint._jsPlumb != null) { + endpoint.setHover(false); + } + result.endpoints[endpoint.id] = endpoint; + result.endpointCount++; + + if (deleteAttachedObjects) { + for (var i = 0; i < endpoint.connections.length; i++) { + var c = endpoint.connections[i]; + unravelConnection(c); + } + } + } + }; + + if (params.connection) { + unravelConnection(params.connection); + } + else { + unravelEndpoint(params.endpoint); + } + + // loop through connections + for (var i in result.connections) { + var c = result.connections[i]; + if (c._jsPlumb) { + _ju.removeWithFunction(connections, function (_c) { + return c.id === _c.id; + }); + + fireDetachEvent(c, params.fireEvent === false ? false : !c.pending, params.originalEvent); + var doNotCleanup = params.deleteAttachedObjects == null ? null : !params.deleteAttachedObjects; + + c.endpoints[0].detachFromConnection(c, null, doNotCleanup); + c.endpoints[1].detachFromConnection(c, null, doNotCleanup); + + c.cleanup(true); + c.destroy(true); + } + } + + // loop through endpoints + for (var j in result.endpoints) { + var e = result.endpoints[j]; + if (e._jsPlumb) { + _currentInstance.unregisterEndpoint(e); + // FIRE some endpoint deleted event? + e.cleanup(true); + e.destroy(true); + } + } + + return result; + }; + + + // helpers for select/selectEndpoints + var _setOperation = function (list, func, args, selector) { + for (var i = 0, j = list.length; i < j; i++) { + list[i][func].apply(list[i], args); + } + return selector(list); + }, + _getOperation = function (list, func, args) { + var out = []; + for (var i = 0, j = list.length; i < j; i++) { + out.push([ list[i][func].apply(list[i], args), list[i] ]); + } + return out; + }, + setter = function (list, func, selector) { + return function () { + return _setOperation(list, func, arguments, selector); + }; + }, + getter = function (list, func) { + return function () { + return _getOperation(list, func, arguments); + }; + }, + prepareList = function (input, doNotGetIds) { + var r = []; + if (input) { + if (typeof input === 'string') { + if (input === "*") { + return input; + } + r.push(input); + } + else { + if (doNotGetIds) { + r = input; + } + else { + if (input.length) { + for (var i = 0, j = input.length; i < j; i++) { + r.push(_info(input[i]).id); + } + } + else { + r.push(_info(input).id); + } + } + } + } + return r; + }, + filterList = function (list, value, missingIsFalse) { + if (list === "*") { + return true; + } + return list.length > 0 ? list.indexOf(value) !== -1 : !missingIsFalse; + }; + + // get some connections, specifying source/target/scope + this.getConnections = function (options, flat) { + if (!options) { + options = {}; + } else if (options.constructor === String) { + options = { "scope": options }; + } + var scope = options.scope || _currentInstance.getDefaultScope(), + scopes = prepareList(scope, true), + sources = prepareList(options.source), + targets = prepareList(options.target), + results = (!flat && scopes.length > 1) ? {} : [], + _addOne = function (scope, obj) { + if (!flat && scopes.length > 1) { + var ss = results[scope]; + if (ss == null) { + ss = results[scope] = []; + } + ss.push(obj); + } else { + results.push(obj); + } + }; + + for (var j = 0, jj = connections.length; j < jj; j++) { + var c = connections[j], + sourceId = c.proxies && c.proxies[0] ? c.proxies[0].originalEp.elementId : c.sourceId, + targetId = c.proxies && c.proxies[1] ? c.proxies[1].originalEp.elementId : c.targetId; + + if (filterList(scopes, c.scope) && filterList(sources, sourceId) && filterList(targets, targetId)) { + _addOne(c.scope, c); + } + } + + return results; + }; + + var _curryEach = function (list, executor) { + return function (f) { + for (var i = 0, ii = list.length; i < ii; i++) { + f(list[i]); + } + return executor(list); + }; + }, + _curryGet = function (list) { + return function (idx) { + return list[idx]; + }; + }; + + var _makeCommonSelectHandler = function (list, executor) { + var out = { + length: list.length, + each: _curryEach(list, executor), + get: _curryGet(list) + }, + setters = ["setHover", "removeAllOverlays", "setLabel", "addClass", "addOverlay", "removeOverlay", + "removeOverlays", "showOverlay", "hideOverlay", "showOverlays", "hideOverlays", "setPaintStyle", + "setHoverPaintStyle", "setSuspendEvents", "setParameter", "setParameters", "setVisible", + "repaint", "addType", "toggleType", "removeType", "removeClass", "setType", "bind", "unbind" ], + + getters = ["getLabel", "getOverlay", "isHover", "getParameter", "getParameters", "getPaintStyle", + "getHoverPaintStyle", "isVisible", "hasType", "getType", "isSuspendEvents" ], + i, ii; + + for (i = 0, ii = setters.length; i < ii; i++) { + out[setters[i]] = setter(list, setters[i], executor); + } + + for (i = 0, ii = getters.length; i < ii; i++) { + out[getters[i]] = getter(list, getters[i]); + } + + return out; + }; + + var _makeConnectionSelectHandler = function (list) { + var common = _makeCommonSelectHandler(list, _makeConnectionSelectHandler); + return jsPlumb.extend(common, { + // setters + setDetachable: setter(list, "setDetachable", _makeConnectionSelectHandler), + setReattach: setter(list, "setReattach", _makeConnectionSelectHandler), + setConnector: setter(list, "setConnector", _makeConnectionSelectHandler), + delete: function () { + for (var i = 0, ii = list.length; i < ii; i++) { + _currentInstance.deleteConnection(list[i]); + } + }, + // getters + isDetachable: getter(list, "isDetachable"), + isReattach: getter(list, "isReattach") + }); + }; + + var _makeEndpointSelectHandler = function (list) { + var common = _makeCommonSelectHandler(list, _makeEndpointSelectHandler); + return jsPlumb.extend(common, { + setEnabled: setter(list, "setEnabled", _makeEndpointSelectHandler), + setAnchor: setter(list, "setAnchor", _makeEndpointSelectHandler), + isEnabled: getter(list, "isEnabled"), + deleteEveryConnection: function () { + for (var i = 0, ii = list.length; i < ii; i++) { + list[i].deleteEveryConnection(); + } + }, + "delete": function () { + for (var i = 0, ii = list.length; i < ii; i++) { + _currentInstance.deleteEndpoint(list[i]); + } + } + }); + }; + + this.select = function (params) { + params = params || {}; + params.scope = params.scope || "*"; + return _makeConnectionSelectHandler(params.connections || _currentInstance.getConnections(params, true)); + }; + + this.selectEndpoints = function (params) { + params = params || {}; + params.scope = params.scope || "*"; + var noElementFilters = !params.element && !params.source && !params.target, + elements = noElementFilters ? "*" : prepareList(params.element), + sources = noElementFilters ? "*" : prepareList(params.source), + targets = noElementFilters ? "*" : prepareList(params.target), + scopes = prepareList(params.scope, true); + + var ep = []; + + for (var el in endpointsByElement) { + var either = filterList(elements, el, true), + source = filterList(sources, el, true), + sourceMatchExact = sources !== "*", + target = filterList(targets, el, true), + targetMatchExact = targets !== "*"; + + // if they requested 'either' then just match scope. otherwise if they requested 'source' (not as a wildcard) then we have to match only endpoints that have isSource set to to true, and the same thing with isTarget. + if (either || source || target) { + inner: + for (var i = 0, ii = endpointsByElement[el].length; i < ii; i++) { + var _ep = endpointsByElement[el][i]; + if (filterList(scopes, _ep.scope, true)) { + + var noMatchSource = (sourceMatchExact && sources.length > 0 && !_ep.isSource), + noMatchTarget = (targetMatchExact && targets.length > 0 && !_ep.isTarget); + + if (noMatchSource || noMatchTarget) { + continue inner; + } + + ep.push(_ep); + } + } + } + } + + return _makeEndpointSelectHandler(ep); + }; + + // get all connections managed by the instance of jsplumb. + this.getAllConnections = function () { + return connections; + }; + this.getDefaultScope = function () { + return DEFAULT_SCOPE; + }; + // get an endpoint by uuid. + this.getEndpoint = _getEndpoint; + /** + * Gets the list of Endpoints for a given element. + * @method getEndpoints + * @param {String|Element|Selector} el The element to get endpoints for. + * @return {Endpoint[]} An array of Endpoints for the specified element. + */ + this.getEndpoints = function (el) { + return endpointsByElement[_info(el).id] || []; + }; + // gets the default endpoint type. used when subclassing. see wiki. + this.getDefaultEndpointType = function () { + return jsPlumb.Endpoint; + }; + // gets the default connection type. used when subclassing. see wiki. + this.getDefaultConnectionType = function () { + return jsPlumb.Connection; + }; + /* + * Gets an element's id, creating one if necessary. really only exposed + * for the lib-specific functionality to access; would be better to pass + * the current instance into the lib-specific code (even though this is + * a static call. i just don't want to expose it to the public API). + */ + this.getId = _getId; + this.draw = _draw; + this.info = _info; + + this.appendElement = _appendElement; + + var _hoverSuspended = false; + this.isHoverSuspended = function () { + return _hoverSuspended; + }; + this.setHoverSuspended = function (s) { + _hoverSuspended = s; + }; + + // set an element's connections to be hidden + this.hide = function (el, changeEndpoints) { + _setVisible(el, "none", changeEndpoints); + return _currentInstance; + }; + + // exposed for other objects to use to get a unique id. + this.idstamp = _idstamp; + + // ensure that, if the current container exists, it is a DOM element and not a selector. + // if it does not exist and `candidate` is supplied, the offset parent of that element will be set as the Container. + // this is used to do a better default behaviour for the case that the user has not set a container: + // addEndpoint, makeSource, makeTarget and connect all call this method with the offsetParent of the + // element in question (for connect it is the source element). So if no container is set, it is inferred + // to be the offsetParent of the first element the user tries to connect. + var _ensureContainer = function (candidate) { + if (!_container && candidate) { + var can = _currentInstance.getElement(candidate); + if (can.offsetParent) { + _currentInstance.setContainer(can.offsetParent); + } + } + }; + + var _getContainerFromDefaults = function () { + if (_currentInstance.Defaults.Container) { + _currentInstance.setContainer(_currentInstance.Defaults.Container); + } + }; + + // check if a given element is managed or not. if not, add to our map. if drawing is not suspended then + // we'll also stash its dimensions; otherwise we'll do this in a lazy way through updateOffset. + var _manage = _currentInstance.manage = function (id, element, _transient, _recalc) { + if (!managedElements[id]) { + managedElements[id] = { + el: element, + endpoints: [], + connections: [] + }; + + managedElements[id].info = _updateOffset({ elId: id, timestamp: _suspendedAt }); + _currentInstance.addClass(element, "jtk-managed"); + + if (!_transient) { + _currentInstance.fire("manageElement", { id:id, info:managedElements[id].info, el:element }); + } + } else { + if (_recalc) { + managedElements[id].info = _updateOffset({ elId: id, timestamp: _suspendedAt, recalc:true }); + } + } + + return managedElements[id]; + }; + + var _unmanage = _currentInstance.unmanage = function(id) { + if (managedElements[id]) { + var el = managedElements[id].el; + _currentInstance.removeClass(el, "jtk-managed"); + delete managedElements[id]; + _currentInstance.fire("unmanageElement", {id:id, el:el}); + } + }; + + /** + * updates the offset and size for a given element, and stores the + * values. if 'offset' is not null we use that (it would have been + * passed in from a drag call) because it's faster; but if it is null, + * or if 'recalc' is true in order to force a recalculation, we get the current values. + * @method updateOffset + */ + var _updateOffset = function (params) { + + var timestamp = params.timestamp, recalc = params.recalc, offset = params.offset, elId = params.elId, s; + if (_suspendDrawing && !timestamp) { + timestamp = _suspendedAt; + } + if (!recalc) { + if (timestamp && timestamp === offsetTimestamps[elId]) { + return {o: params.offset || offsets[elId], s: sizes[elId]}; + } + } + if (recalc || (!offset && offsets[elId] == null)) { // if forced repaint or no offset available, we recalculate. + + // get the current size and offset, and store them + s = managedElements[elId] ? managedElements[elId].el : null; + if (s != null) { + sizes[elId] = _currentInstance.getSize(s); + offsets[elId] = _currentInstance.getOffset(s); + offsetTimestamps[elId] = timestamp; + } + } else { + offsets[elId] = offset || offsets[elId]; + if (sizes[elId] == null) { + s = managedElements[elId].el; + if (s != null) { + sizes[elId] = _currentInstance.getSize(s); + } + } + offsetTimestamps[elId] = timestamp; + } + + if (offsets[elId] && !offsets[elId].right) { + offsets[elId].right = offsets[elId].left + sizes[elId][0]; + offsets[elId].bottom = offsets[elId].top + sizes[elId][1]; + offsets[elId].width = sizes[elId][0]; + offsets[elId].height = sizes[elId][1]; + offsets[elId].centerx = offsets[elId].left + (offsets[elId].width / 2); + offsets[elId].centery = offsets[elId].top + (offsets[elId].height / 2); + } + + return {o: offsets[elId], s: sizes[elId]}; + }; + + this.updateOffset = _updateOffset; + + /** + * callback from the current library to tell us to prepare ourselves (attach + * mouse listeners etc; can't do that until the library has provided a bind method) + */ + this.init = function () { + if (!initialized) { + _getContainerFromDefaults(); + _currentInstance.anchorManager = new root.jsPlumb.AnchorManager({jsPlumbInstance: _currentInstance}); + initialized = true; + _currentInstance.fire("ready", _currentInstance); + } + }.bind(this); + + this.log = log; + this.jsPlumbUIComponent = jsPlumbUIComponent; + + /* + * Creates an anchor with the given params. + * + * + * Returns: The newly created Anchor. + * Throws: an error if a named anchor was not found. + */ + this.makeAnchor = function () { + var pp, _a = function (t, p) { + if (root.jsPlumb.Anchors[t]) { + return new root.jsPlumb.Anchors[t](p); + } + if (!_currentInstance.Defaults.DoNotThrowErrors) { + throw { msg: "jsPlumb: unknown anchor type '" + t + "'" }; + } + }; + if (arguments.length === 0) { + return null; + } + var specimen = arguments[0], elementId = arguments[1], jsPlumbInstance = arguments[2], newAnchor = null; + // if it appears to be an anchor already... + if (specimen.compute && specimen.getOrientation) { + return specimen; + } //TODO hazy here about whether it should be added or is already added somehow. + // is it the name of an anchor type? + else if (typeof specimen === "string") { + newAnchor = _a(arguments[0], {elementId: elementId, jsPlumbInstance: _currentInstance}); + } + // is it an array? it will be one of: + // an array of [spec, params] - this defines a single anchor, which may be dynamic, but has parameters. + // an array of arrays - this defines some dynamic anchors + // an array of numbers - this defines a single anchor. + else if (_ju.isArray(specimen)) { + if (_ju.isArray(specimen[0]) || _ju.isString(specimen[0])) { + // if [spec, params] format + if (specimen.length === 2 && _ju.isObject(specimen[1])) { + // if first arg is a string, its a named anchor with params + if (_ju.isString(specimen[0])) { + pp = root.jsPlumb.extend({elementId: elementId, jsPlumbInstance: _currentInstance}, specimen[1]); + newAnchor = _a(specimen[0], pp); + } + // otherwise first arg is array, second is params. we treat as a dynamic anchor, which is fine + // even if the first arg has only one entry. you could argue all anchors should be implicitly dynamic in fact. + else { + pp = root.jsPlumb.extend({elementId: elementId, jsPlumbInstance: _currentInstance, anchors: specimen[0]}, specimen[1]); + newAnchor = new root.jsPlumb.DynamicAnchor(pp); + } + } + else { + newAnchor = new jsPlumb.DynamicAnchor({anchors: specimen, selector: null, elementId: elementId, jsPlumbInstance: _currentInstance}); + } + + } + else { + var anchorParams = { + x: specimen[0], y: specimen[1], + orientation: (specimen.length >= 4) ? [ specimen[2], specimen[3] ] : [0, 0], + offsets: (specimen.length >= 6) ? [ specimen[4], specimen[5] ] : [ 0, 0 ], + elementId: elementId, + jsPlumbInstance: _currentInstance, + cssClass: specimen.length === 7 ? specimen[6] : null + }; + newAnchor = new root.jsPlumb.Anchor(anchorParams); + newAnchor.clone = function () { + return new root.jsPlumb.Anchor(anchorParams); + }; + } + } + + if (!newAnchor.id) { + newAnchor.id = "anchor_" + _idstamp(); + } + return newAnchor; + }; + + /** + * makes a list of anchors from the given list of types or coords, eg + * ["TopCenter", "RightMiddle", "BottomCenter", [0, 1, -1, -1] ] + */ + this.makeAnchors = function (types, elementId, jsPlumbInstance) { + var r = []; + for (var i = 0, ii = types.length; i < ii; i++) { + if (typeof types[i] === "string") { + r.push(root.jsPlumb.Anchors[types[i]]({elementId: elementId, jsPlumbInstance: jsPlumbInstance})); + } + else if (_ju.isArray(types[i])) { + r.push(_currentInstance.makeAnchor(types[i], elementId, jsPlumbInstance)); + } + } + return r; + }; + + /** + * Makes a dynamic anchor from the given list of anchors (which may be in shorthand notation as strings or dimension arrays, or Anchor + * objects themselves) and the given, optional, anchorSelector function (jsPlumb uses a default if this is not provided; most people will + * not need to provide this - i think). + */ + this.makeDynamicAnchor = function (anchors, anchorSelector) { + return new root.jsPlumb.DynamicAnchor({anchors: anchors, selector: anchorSelector, elementId: null, jsPlumbInstance: _currentInstance}); + }; + +// --------------------- makeSource/makeTarget ---------------------------------------------- + + this.targetEndpointDefinitions = {}; + this.sourceEndpointDefinitions = {}; + + var selectorFilter = function (evt, _el, selector, _instance, negate) { + var t = evt.target || evt.srcElement, ok = false, + sel = _instance.getSelector(_el, selector); + for (var j = 0; j < sel.length; j++) { + if (sel[j] === t) { + ok = true; + break; + } + } + return negate ? !ok : ok; + }; + + var _makeElementDropHandler = function (elInfo, p, dropOptions, isSource, isTarget) { + var proxyComponent = new jsPlumbUIComponent(p); + var _drop = p._jsPlumb.EndpointDropHandler({ + jsPlumb: _currentInstance, + enabled: function () { + return elInfo.def.enabled; + }, + isFull: function () { + var targetCount = _currentInstance.select({target: elInfo.id}).length; + return elInfo.def.maxConnections > 0 && targetCount >= elInfo.def.maxConnections; + }, + element: elInfo.el, + elementId: elInfo.id, + isSource: isSource, + isTarget: isTarget, + addClass: function (clazz) { + _currentInstance.addClass(elInfo.el, clazz); + }, + removeClass: function (clazz) { + _currentInstance.removeClass(elInfo.el, clazz); + }, + onDrop: function (jpc) { + var source = jpc.endpoints[0]; + source.anchor.unlock(); + }, + isDropAllowed: function () { + return proxyComponent.isDropAllowed.apply(proxyComponent, arguments); + }, + isRedrop:function(jpc) { + return (jpc.suspendedElement != null && jpc.suspendedEndpoint != null && jpc.suspendedEndpoint.element === elInfo.el); + }, + getEndpoint: function (jpc) { + + // make a new Endpoint for the target, or get it from the cache if uniqueEndpoint + // is set. if its a redrop the new endpoint will be immediately cleaned up. + + var newEndpoint = elInfo.def.endpoint; + + // if no cached endpoint, or there was one but it has been cleaned up + // (ie. detached), create a new one + if (newEndpoint == null || newEndpoint._jsPlumb == null) { + var eps = _currentInstance.deriveEndpointAndAnchorSpec(jpc.getType().join(" "), true); + var pp = eps.endpoints ? root.jsPlumb.extend(p, { + endpoint:elInfo.def.def.endpoint || eps.endpoints[1] + }) :p; + if (eps.anchors) { + pp = root.jsPlumb.extend(pp, { + anchor:elInfo.def.def.anchor || eps.anchors[1] + }); + } + newEndpoint = _currentInstance.addEndpoint(elInfo.el, pp); + newEndpoint._mtNew = true; + } + + if (p.uniqueEndpoint) { + elInfo.def.endpoint = newEndpoint; + } + + newEndpoint.setDeleteOnEmpty(true); + + // if connection is detachable, init the new endpoint to be draggable, to support that happening. + if (jpc.isDetachable()) { + newEndpoint.initDraggable(); + } + + // if the anchor has a 'positionFinder' set, then delegate to that function to find + // out where to locate the anchor. + if (newEndpoint.anchor.positionFinder != null) { + var dropPosition = _currentInstance.getUIPosition(arguments, _currentInstance.getZoom()), + elPosition = _currentInstance.getOffset(elInfo.el), + elSize = _currentInstance.getSize(elInfo.el), + ap = dropPosition == null ? [0,0] : newEndpoint.anchor.positionFinder(dropPosition, elPosition, elSize, newEndpoint.anchor.constructorParams); + + newEndpoint.anchor.x = ap[0]; + newEndpoint.anchor.y = ap[1]; + // now figure an orientation for it..kind of hard to know what to do actually. probably the best thing i can do is to + // support specifying an orientation in the anchor's spec. if one is not supplied then i will make the orientation + // be what will cause the most natural link to the source: it will be pointing at the source, but it needs to be + // specified in one axis only, and so how to make that choice? i think i will use whichever axis is the one in which + // the target is furthest away from the source. + } + + return newEndpoint; + }, + maybeCleanup: function (ep) { + if (ep._mtNew && ep.connections.length === 0) { + _currentInstance.deleteObject({endpoint: ep}); + } + else { + delete ep._mtNew; + } + } + }); + + // wrap drop events as needed and initialise droppable + var dropEvent = root.jsPlumb.dragEvents.drop; + dropOptions.scope = dropOptions.scope || (p.scope || _currentInstance.Defaults.Scope); + dropOptions[dropEvent] = _ju.wrap(dropOptions[dropEvent], _drop, true); + dropOptions.rank = p.rank || 0; + + // if target, return true from the over event. this will cause katavorio to stop setting drops to hover + // if multipleDrop is set to false. + if (isTarget) { + dropOptions[root.jsPlumb.dragEvents.over] = function () { return true; }; + } + + // vanilla jsplumb only + if (p.allowLoopback === false) { + dropOptions.canDrop = function (_drag) { + var de = _drag.getDragElement()._jsPlumbRelatedElement; + return de !== elInfo.el; + }; + } + _currentInstance.initDroppable(elInfo.el, dropOptions, "internal"); + + return _drop; + + }; + + // see API docs + this.makeTarget = function (el, params, referenceParams) { + + // put jsplumb ref into params without altering the params passed in + var p = root.jsPlumb.extend({_jsPlumb: this}, referenceParams); + root.jsPlumb.extend(p, params); + + var maxConnections = p.maxConnections || -1, + + _doOne = function (el) { + + // get the element's id and store the endpoint definition for it. jsPlumb.connect calls will look for one of these, + // and use the endpoint definition if found. + // decode the info for this element (id and element) + var elInfo = _info(el), + elid = elInfo.id, + dropOptions = root.jsPlumb.extend({}, p.dropOptions || {}), + type = p.connectionType || "default"; + + this.targetEndpointDefinitions[elid] = this.targetEndpointDefinitions[elid] || {}; + + _ensureContainer(elid); + + // if this is a group and the user has not mandated a rank, set to -1 so that Nodes takes + // precedence. + if (elInfo.el._isJsPlumbGroup && dropOptions.rank == null) { + dropOptions.rank = -1; + } + + // store the definition + var _def = { + def: root.jsPlumb.extend({}, p), + uniqueEndpoint: p.uniqueEndpoint, + maxConnections: maxConnections, + enabled: true + }; + + if (p.createEndpoint) { + _def.uniqueEndpoint = true; + _def.endpoint = _currentInstance.addEndpoint(el, _def.def); + _def.endpoint.setDeleteOnEmpty(false); + } + + elInfo.def = _def; + this.targetEndpointDefinitions[elid][type] = _def; + _makeElementDropHandler(elInfo, p, dropOptions, p.isSource === true, true); + // stash the definition on the drop + elInfo.el._katavorioDrop[elInfo.el._katavorioDrop.length - 1].targetDef = _def; + + }.bind(this); + + // make an array if only given one element + var inputs = el.length && el.constructor !== String ? el : [ el ]; + + // register each one in the list. + for (var i = 0, ii = inputs.length; i < ii; i++) { + _doOne(inputs[i]); + } + + return this; + }; + + // see api docs + this.unmakeTarget = function (el, doNotClearArrays) { + var info = _info(el); + _currentInstance.destroyDroppable(info.el, "internal"); + if (!doNotClearArrays) { + delete this.targetEndpointDefinitions[info.id]; + } + + return this; + }; + + // see api docs + this.makeSource = function (el, params, referenceParams) { + var p = root.jsPlumb.extend({_jsPlumb: this}, referenceParams); + root.jsPlumb.extend(p, params); + var type = p.connectionType || "default"; + var aae = _currentInstance.deriveEndpointAndAnchorSpec(type); + p.endpoint = p.endpoint || aae.endpoints[0]; + p.anchor = p.anchor || aae.anchors[0]; + var maxConnections = p.maxConnections || -1, + onMaxConnections = p.onMaxConnections, + _doOne = function (elInfo) { + // get the element's id and store the endpoint definition for it. jsPlumb.connect calls will look for one of these, + // and use the endpoint definition if found. + var elid = elInfo.id, + _del = this.getElement(elInfo.el); + + this.sourceEndpointDefinitions[elid] = this.sourceEndpointDefinitions[elid] || {}; + _ensureContainer(elid); + + var _def = { + def:root.jsPlumb.extend({}, p), + uniqueEndpoint: p.uniqueEndpoint, + maxConnections: maxConnections, + enabled: true + }; + + if (p.createEndpoint) { + _def.uniqueEndpoint = true; + _def.endpoint = _currentInstance.addEndpoint(el, _def.def); + _def.endpoint.setDeleteOnEmpty(false); + } + + this.sourceEndpointDefinitions[elid][type] = _def; + elInfo.def = _def; + + var stopEvent = root.jsPlumb.dragEvents.stop, + dragEvent = root.jsPlumb.dragEvents.drag, + dragOptions = root.jsPlumb.extend({ }, p.dragOptions || {}), + existingDrag = dragOptions.drag, + existingStop = dragOptions.stop, + ep = null, + endpointAddedButNoDragYet = false; + + // set scope if its not set in dragOptions but was passed in in params + dragOptions.scope = dragOptions.scope || p.scope; + + dragOptions[dragEvent] = _ju.wrap(dragOptions[dragEvent], function () { + if (existingDrag) { + existingDrag.apply(this, arguments); + } + endpointAddedButNoDragYet = false; + }); + + dragOptions[stopEvent] = _ju.wrap(dragOptions[stopEvent], function () { + + if (existingStop) { + existingStop.apply(this, arguments); + } + this.currentlyDragging = false; + if (ep._jsPlumb != null) { // if not cleaned up... + + // reset the anchor to the anchor that was initially provided. the one we were using to drag + // the connection was just a placeholder that was located at the place the user pressed the + // mouse button to initiate the drag. + var anchorDef = p.anchor || this.Defaults.Anchor, + oldAnchor = ep.anchor, + oldConnection = ep.connections[0]; + + var newAnchor = this.makeAnchor(anchorDef, elid, this), + _el = ep.element; + + // if the anchor has a 'positionFinder' set, then delegate to that function to find + // out where to locate the anchor. issue 117. + if (newAnchor.positionFinder != null) { + var elPosition = _currentInstance.getOffset(_el), + elSize = this.getSize(_el), + dropPosition = { left: elPosition.left + (oldAnchor.x * elSize[0]), top: elPosition.top + (oldAnchor.y * elSize[1]) }, + ap = newAnchor.positionFinder(dropPosition, elPosition, elSize, newAnchor.constructorParams); + + newAnchor.x = ap[0]; + newAnchor.y = ap[1]; + } + + ep.setAnchor(newAnchor, true); + ep.repaint(); + this.repaint(ep.elementId); + if (oldConnection != null) { + this.repaint(oldConnection.targetId); + } + } + }.bind(this)); + + // when the user presses the mouse, add an Endpoint, if we are enabled. + var mouseDownListener = function (e) { + // on right mouse button, abort. + if (e.which === 3 || e.button === 2) { + return; + } + + elid = this.getId(this.getElement(elInfo.el)); // elid might have changed since this method was called to configure the element. + + // TODO store def on element. + var def = this.sourceEndpointDefinitions[elid][type]; + + // if disabled, return. + if (!def.enabled) { + return; + } + + // if a filter was given, run it, and return if it says no. + if (p.filter) { + var r = _ju.isString(p.filter) ? selectorFilter(e, elInfo.el, p.filter, this, p.filterExclude) : p.filter(e, elInfo.el); + if (r === false) { + return; + } + } + + // if maxConnections reached + var sourceCount = this.select({source: elid}).length; + if (def.maxConnections >= 0 && (sourceCount >= def.maxConnections)) { + if (onMaxConnections) { + onMaxConnections({ + element: elInfo.el, + maxConnections: maxConnections + }, e); + } + return false; + } + + // find the position on the element at which the mouse was pressed; this is where the endpoint + // will be located. + var elxy = root.jsPlumb.getPositionOnElement(e, _del, _zoom); + + // we need to override the anchor in here, and force 'isSource', but we don't want to mess with + // the params passed in, because after a connection is established we're going to reset the endpoint + // to have the anchor we were given. + var tempEndpointParams = {}; + root.jsPlumb.extend(tempEndpointParams, def.def); + tempEndpointParams.isTemporarySource = true; + tempEndpointParams.anchor = [ elxy[0], elxy[1] , 0, 0]; + tempEndpointParams.dragOptions = dragOptions; + + if (def.def.scope) { + tempEndpointParams.scope = def.def.scope; + } + + ep = this.addEndpoint(elid, tempEndpointParams); + endpointAddedButNoDragYet = true; + ep.setDeleteOnEmpty(true); + + // if unique endpoint and it's already been created, push it onto the endpoint we create. at the end + // of a successful connection we'll switch to that endpoint. + // TODO this is the same code as the programmatic endpoints create on line 1050 ish + if (def.uniqueEndpoint) { + if (!def.endpoint) { + def.endpoint = ep; + ep.setDeleteOnEmpty(false); + } + else { + ep.finalEndpoint = def.endpoint; + } + } + + var _delTempEndpoint = function () { + // this mouseup event is fired only if no dragging occurred, by jquery and yui, but for mootools + // it is fired even if dragging has occurred, in which case we would blow away a perfectly + // legitimate endpoint, were it not for this check. the flag is set after adding an + // endpoint and cleared in a drag listener we set in the dragOptions above. + _currentInstance.off(ep.canvas, "mouseup", _delTempEndpoint); + _currentInstance.off(elInfo.el, "mouseup", _delTempEndpoint); + if (endpointAddedButNoDragYet) { + endpointAddedButNoDragYet = false; + _currentInstance.deleteEndpoint(ep); + } + }; + + _currentInstance.on(ep.canvas, "mouseup", _delTempEndpoint); + _currentInstance.on(elInfo.el, "mouseup", _delTempEndpoint); + + // optionally check for attributes to extract from the source element + var payload = {}; + if (def.def.extract) { + for (var att in def.def.extract) { + var v = (e.srcElement || e.target).getAttribute(att); + if (v) { + payload[def.def.extract[att]] = v; + } + } + } + + // and then trigger its mousedown event, which will kick off a drag, which will start dragging + // a new connection from this endpoint. + _currentInstance.trigger(ep.canvas, "mousedown", e, payload); + + _ju.consume(e); + + }.bind(this); + + this.on(elInfo.el, "mousedown", mouseDownListener); + _def.trigger = mouseDownListener; + + // if a filter was provided, set it as a dragFilter on the element, + // to prevent the element drag function from kicking in when we want to + // drag a new connection + if (p.filter && (_ju.isString(p.filter) || _ju.isFunction(p.filter))) { + _currentInstance.setDragFilter(elInfo.el, p.filter); + } + + var dropOptions = root.jsPlumb.extend({}, p.dropOptions || {}); + + _makeElementDropHandler(elInfo, p, dropOptions, true, p.isTarget === true); + + }.bind(this); + + var inputs = el.length && el.constructor !== String ? el : [ el ]; + for (var i = 0, ii = inputs.length; i < ii; i++) { + _doOne(_info(inputs[i])); + } + + return this; + }; + + // see api docs + this.unmakeSource = function (el, connectionType, doNotClearArrays) { + var info = _info(el); + _currentInstance.destroyDroppable(info.el, "internal"); + var eldefs = this.sourceEndpointDefinitions[info.id]; + if (eldefs) { + for (var def in eldefs) { + if (connectionType == null || connectionType === def) { + var mouseDownListener = eldefs[def].trigger; + if (mouseDownListener) { + _currentInstance.off(info.el, "mousedown", mouseDownListener); + } + if (!doNotClearArrays) { + delete this.sourceEndpointDefinitions[info.id][def]; + } + } + } + } + + return this; + }; + + // see api docs + this.unmakeEverySource = function () { + for (var i in this.sourceEndpointDefinitions) { + _currentInstance.unmakeSource(i, null, true); + } + + this.sourceEndpointDefinitions = {}; + return this; + }; + + var _getScope = function (el, types, connectionType) { + types = _ju.isArray(types) ? types : [ types ]; + var id = _getId(el); + connectionType = connectionType || "default"; + for (var i = 0; i < types.length; i++) { + var eldefs = this[types[i]][id]; + if (eldefs && eldefs[connectionType]) { + return eldefs[connectionType].def.scope || this.Defaults.Scope; + } + } + }.bind(this); + + var _setScope = function (el, scope, types, connectionType) { + types = _ju.isArray(types) ? types : [ types ]; + var id = _getId(el); + connectionType = connectionType || "default"; + for (var i = 0; i < types.length; i++) { + var eldefs = this[types[i]][id]; + if (eldefs && eldefs[connectionType]) { + eldefs[connectionType].def.scope = scope; + } + } + + }.bind(this); + + this.getScope = function (el, scope) { + return _getScope(el, [ "sourceEndpointDefinitions", "targetEndpointDefinitions" ]); + }; + this.getSourceScope = function (el) { + return _getScope(el, "sourceEndpointDefinitions"); + }; + this.getTargetScope = function (el) { + return _getScope(el, "targetEndpointDefinitions"); + }; + this.setScope = function (el, scope, connectionType) { + this.setSourceScope(el, scope, connectionType); + this.setTargetScope(el, scope, connectionType); + }; + this.setSourceScope = function (el, scope, connectionType) { + _setScope(el, scope, "sourceEndpointDefinitions", connectionType); + // we get the source scope during the mousedown event, but we also want to set this. + this.setDragScope(el, scope); + }; + this.setTargetScope = function (el, scope, connectionType) { + _setScope(el, scope, "targetEndpointDefinitions", connectionType); + this.setDropScope(el, scope); + }; + + // see api docs + this.unmakeEveryTarget = function () { + for (var i in this.targetEndpointDefinitions) { + _currentInstance.unmakeTarget(i, true); + } + + this.targetEndpointDefinitions = {}; + return this; + }; + + // does the work of setting a source enabled or disabled. + var _setEnabled = function (type, el, state, toggle, connectionType) { + var a = type === "source" ? this.sourceEndpointDefinitions : this.targetEndpointDefinitions, + originalState, info, newState; + + connectionType = connectionType || "default"; + + // a selector or an array + if (el.length && !_ju.isString(el)) { + originalState = []; + for (var i = 0, ii = el.length; i < ii; i++) { + info = _info(el[i]); + if (a[info.id] && a[info.id][connectionType]) { + originalState[i] = a[info.id][connectionType].enabled; + newState = toggle ? !originalState[i] : state; + a[info.id][connectionType].enabled = newState; + _currentInstance[newState ? "removeClass" : "addClass"](info.el, "jtk-" + type + "-disabled"); + } + } + } + // otherwise a DOM element or a String ID. + else { + info = _info(el); + var id = info.id; + if (a[id] && a[id][connectionType]) { + originalState = a[id][connectionType].enabled; + newState = toggle ? !originalState : state; + a[id][connectionType].enabled = newState; + _currentInstance[newState ? "removeClass" : "addClass"](info.el, "jtk-" + type + "-disabled"); + } + } + return originalState; + }.bind(this); + + var _first = function (el, fn) { + if (_ju.isString(el) || !el.length) { + return fn.apply(this, [ el ]); + } + else if (el.length) { + return fn.apply(this, [ el[0] ]); + } + + }.bind(this); + + this.toggleSourceEnabled = function (el, connectionType) { + _setEnabled("source", el, null, true, connectionType); + return this.isSourceEnabled(el, connectionType); + }; + + this.setSourceEnabled = function (el, state, connectionType) { + return _setEnabled("source", el, state, null, connectionType); + }; + this.isSource = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var eldefs = this.sourceEndpointDefinitions[_info(_el).id]; + return eldefs != null && eldefs[connectionType] != null; + }.bind(this)); + }; + this.isSourceEnabled = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var sep = this.sourceEndpointDefinitions[_info(_el).id]; + return sep && sep[connectionType] && sep[connectionType].enabled === true; + }.bind(this)); + }; + + this.toggleTargetEnabled = function (el, connectionType) { + _setEnabled("target", el, null, true, connectionType); + return this.isTargetEnabled(el, connectionType); + }; + + this.isTarget = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var eldefs = this.targetEndpointDefinitions[_info(_el).id]; + return eldefs != null && eldefs[connectionType] != null; + }.bind(this)); + }; + this.isTargetEnabled = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var tep = this.targetEndpointDefinitions[_info(_el).id]; + return tep && tep[connectionType] && tep[connectionType].enabled === true; + }.bind(this)); + }; + this.setTargetEnabled = function (el, state, connectionType) { + return _setEnabled("target", el, state, null, connectionType); + }; + +// --------------------- end makeSource/makeTarget ---------------------------------------------- + + this.ready = function (fn) { + _currentInstance.bind("ready", fn); + }; + + var _elEach = function(el, fn) { + // support both lists... + if (typeof el === 'object' && el.length) { + for (var i = 0, ii = el.length; i < ii; i++) { + fn(el[i]); + } + } + else {// ...and single strings or elements. + fn(el); + } + + return _currentInstance; + }; + + // repaint some element's endpoints and connections + this.repaint = function (el, ui, timestamp) { + return _elEach(el, function(_el) { + _draw(_el, ui, timestamp); + }); + }; + + this.revalidate = function (el, timestamp, isIdAlready) { + return _elEach(el, function(_el) { + var elId = isIdAlready ? _el : _currentInstance.getId(_el); + _currentInstance.updateOffset({ elId: elId, recalc: true, timestamp:timestamp }); + var dm = _currentInstance.getDragManager(); + if (dm) { + dm.updateOffsets(elId); + } + _currentInstance.repaint(_el); + }); + }; + + // repaint every endpoint and connection. + this.repaintEverything = function () { + // TODO this timestamp causes continuous anchors to not repaint properly. + // fix this. do not just take out the timestamp. it runs a lot faster with + // the timestamp included. + var timestamp = _timestamp(), elId; + + for (elId in endpointsByElement) { + _currentInstance.updateOffset({ elId: elId, recalc: true, timestamp: timestamp }); + } + + for (elId in endpointsByElement) { + _draw(elId, null, timestamp); + } + + return this; + }; + + this.removeAllEndpoints = function (el, recurse, affectedElements) { + affectedElements = affectedElements || []; + var _one = function (_el) { + var info = _info(_el), + ebe = endpointsByElement[info.id], + i, ii; + + if (ebe) { + affectedElements.push(info); + for (i = 0, ii = ebe.length; i < ii; i++) { + _currentInstance.deleteEndpoint(ebe[i], false); + } + } + delete endpointsByElement[info.id]; + + if (recurse) { + if (info.el && info.el.nodeType !== 3 && info.el.nodeType !== 8) { + for (i = 0, ii = info.el.childNodes.length; i < ii; i++) { + _one(info.el.childNodes[i]); + } + } + } + + }; + _one(el); + return this; + }; + + var _doRemove = function(info, affectedElements) { + _currentInstance.removeAllEndpoints(info.id, true, affectedElements); + var dm = _currentInstance.getDragManager(); + var _one = function(_info) { + + if (dm) { + dm.elementRemoved(_info.id); + } + _currentInstance.anchorManager.clearFor(_info.id); + _currentInstance.anchorManager.removeFloatingConnection(_info.id); + + if (_currentInstance.isSource(_info.el)) { + _currentInstance.unmakeSource(_info.el); + } + if (_currentInstance.isTarget(_info.el)) { + _currentInstance.unmakeTarget(_info.el); + } + _currentInstance.destroyDraggable(_info.el); + _currentInstance.destroyDroppable(_info.el); + + + delete _currentInstance.floatingConnections[_info.id]; + delete managedElements[_info.id]; + delete offsets[_info.id]; + if (_info.el) { + _currentInstance.removeElement(_info.el); + _info.el._jsPlumb = null; + } + }; + + // remove all affected child elements + for (var ae = 1; ae < affectedElements.length; ae++) { + _one(affectedElements[ae]); + } + // and always remove the requested one from the dom. + _one(info); + }; + + /** + * Remove the given element, including cleaning up all endpoints registered for it. + * This is exposed in the public API but also used internally by jsPlumb when removing the + * element associated with a connection drag. + */ + this.remove = function (el, doNotRepaint) { + var info = _info(el), affectedElements = []; + if (info.text && info.el.parentNode) { + info.el.parentNode.removeChild(info.el); + } + else if (info.id) { + _currentInstance.batch(function () { + _doRemove(info, affectedElements); + }, doNotRepaint === true); + } + return _currentInstance; + }; + + this.empty = function (el, doNotRepaint) { + var affectedElements = []; + var _one = function(el, dontRemoveFocus) { + var info = _info(el); + if (info.text) { + info.el.parentNode.removeChild(info.el); + } + else if (info.el) { + while(info.el.childNodes.length > 0) { + _one(info.el.childNodes[0]); + } + if (!dontRemoveFocus) { + _doRemove(info, affectedElements); + } + } + }; + + _currentInstance.batch(function() { + _one(el, true); + }, doNotRepaint === false); + + return _currentInstance; + }; + + this.reset = function (doNotUnbindInstanceEventListeners) { + _currentInstance.silently(function() { + _hoverSuspended = false; + _currentInstance.removeAllGroups(); + _currentInstance.removeGroupManager(); + _currentInstance.deleteEveryEndpoint(); + if (!doNotUnbindInstanceEventListeners) { + _currentInstance.unbind(); + } + this.targetEndpointDefinitions = {}; + this.sourceEndpointDefinitions = {}; + connections.length = 0; + if (this.doReset) { + this.doReset(); + } + }.bind(this)); + }; + + var _clearObject = function (obj) { + if (obj.canvas && obj.canvas.parentNode) { + obj.canvas.parentNode.removeChild(obj.canvas); + } + obj.cleanup(); + obj.destroy(); + }; + + this.clear = function () { + _currentInstance.select().each(_clearObject); + _currentInstance.selectEndpoints().each(_clearObject); + + endpointsByElement = {}; + endpointsByUUID = {}; + }; + + this.setDefaultScope = function (scope) { + DEFAULT_SCOPE = scope; + return _currentInstance; + }; + + this.deriveEndpointAndAnchorSpec = function(type, dontPrependDefault) { + var bits = ((dontPrependDefault ? "" : "default ") + type).split(/[\s]/), eps = null, ep = null, a = null, as = null; + for (var i = 0; i < bits.length; i++) { + var _t = _currentInstance.getType(bits[i], "connection"); + if (_t) { + if (_t.endpoints) { + eps = _t.endpoints; + } + if (_t.endpoint) { + ep = _t.endpoint; + } + if (_t.anchors) { + as = _t.anchors; + } + if (_t.anchor) { + a = _t.anchor; + } + } + } + return { endpoints: eps ? eps : [ ep, ep ], anchors: as ? as : [a, a ]}; + }; + + // sets the id of some element, changing whatever we need to to keep track. + this.setId = function (el, newId, doNotSetAttribute) { + // + var id; + + if (_ju.isString(el)) { + id = el; + } + else { + el = this.getElement(el); + id = this.getId(el); + } + + var sConns = this.getConnections({source: id, scope: '*'}, true), + tConns = this.getConnections({target: id, scope: '*'}, true); + + newId = "" + newId; + + if (!doNotSetAttribute) { + el = this.getElement(id); + this.setAttribute(el, "id", newId); + } + else { + el = this.getElement(newId); + } + + endpointsByElement[newId] = endpointsByElement[id] || []; + for (var i = 0, ii = endpointsByElement[newId].length; i < ii; i++) { + endpointsByElement[newId][i].setElementId(newId); + endpointsByElement[newId][i].setReferenceElement(el); + } + delete endpointsByElement[id]; + + this.sourceEndpointDefinitions[newId] = this.sourceEndpointDefinitions[id]; + delete this.sourceEndpointDefinitions[id]; + this.targetEndpointDefinitions[newId] = this.targetEndpointDefinitions[id]; + delete this.targetEndpointDefinitions[id]; + + this.anchorManager.changeId(id, newId); + var dm = this.getDragManager(); + if (dm) { + dm.changeId(id, newId); + } + managedElements[newId] = managedElements[id]; + delete managedElements[id]; + + var _conns = function (list, epIdx, type) { + for (var i = 0, ii = list.length; i < ii; i++) { + list[i].endpoints[epIdx].setElementId(newId); + list[i].endpoints[epIdx].setReferenceElement(el); + list[i][type + "Id"] = newId; + list[i][type] = el; + } + }; + _conns(sConns, 0, "source"); + _conns(tConns, 1, "target"); + + this.repaint(newId); + }; + + this.setDebugLog = function (debugLog) { + log = debugLog; + }; + + this.setSuspendDrawing = function (val, repaintAfterwards) { + var curVal = _suspendDrawing; + _suspendDrawing = val; + if (val) { + _suspendedAt = new Date().getTime(); + } else { + _suspendedAt = null; + } + if (repaintAfterwards) { + this.repaintEverything(); + } + return curVal; + }; + + // returns whether or not drawing is currently suspended. + this.isSuspendDrawing = function () { + return _suspendDrawing; + }; + + // return timestamp for when drawing was suspended. + this.getSuspendedAt = function () { + return _suspendedAt; + }; + + this.batch = function (fn, doNotRepaintAfterwards) { + var _wasSuspended = this.isSuspendDrawing(); + if (!_wasSuspended) { + this.setSuspendDrawing(true); + } + try { + fn(); + } + catch (e) { + _ju.log("Function run while suspended failed", e); + } + if (!_wasSuspended) { + this.setSuspendDrawing(false, !doNotRepaintAfterwards); + } + }; + + this.doWhileSuspended = this.batch; + + this.getCachedData = _getCachedData; + this.timestamp = _timestamp; + this.show = function (el, changeEndpoints) { + _setVisible(el, "block", changeEndpoints); + return _currentInstance; + }; + + // TODO: update this method to return the current state. + this.toggleVisible = _toggleVisible; + this.addListener = this.bind; + + var floatingConnections = []; + this.registerFloatingConnection = function(info, conn, ep) { + floatingConnections[info.id] = conn; + // only register for the target endpoint; we will not be dragging the source at any time + // before this connection is either discarded or made into a permanent connection. + _ju.addToList(endpointsByElement, info.id, ep); + }; + this.getFloatingConnectionFor = function(id) { + return floatingConnections[id]; + }; + + this.listManager = new root.jsPlumbListManager(this, this.Defaults.ListStyle); + }; + + _ju.extend(root.jsPlumbInstance, _ju.EventGenerator, { + setAttribute: function (el, a, v) { + this.setAttribute(el, a, v); + }, + getAttribute: function (el, a) { + return this.getAttribute(root.jsPlumb.getElement(el), a); + }, + convertToFullOverlaySpec: function(spec) { + if (_ju.isString(spec)) { + spec = [ spec, { } ]; + } + spec[1].id = spec[1].id || _ju.uuid(); + return spec; + }, + registerConnectionType: function (id, type) { + this._connectionTypes[id] = root.jsPlumb.extend({}, type); + if (type.overlays) { + var to = {}; + for (var i = 0; i < type.overlays.length; i++) { + // if a string, convert to object representation so that we can store the typeid on it. + // also assign an id. + var fo = this.convertToFullOverlaySpec(type.overlays[i]); + to[fo[1].id] = fo; + } + this._connectionTypes[id].overlays = to; + } + }, + registerConnectionTypes: function (types) { + for (var i in types) { + this.registerConnectionType(i, types[i]); + } + }, + registerEndpointType: function (id, type) { + this._endpointTypes[id] = root.jsPlumb.extend({}, type); + if (type.overlays) { + var to = {}; + for (var i = 0; i < type.overlays.length; i++) { + // if a string, convert to object representation so that we can store the typeid on it. + // also assign an id. + var fo = this.convertToFullOverlaySpec(type.overlays[i]); + to[fo[1].id] = fo; + } + this._endpointTypes[id].overlays = to; + } + }, + registerEndpointTypes: function (types) { + for (var i in types) { + this.registerEndpointType(i, types[i]); + } + }, + getType: function (id, typeDescriptor) { + return typeDescriptor === "connection" ? this._connectionTypes[id] : this._endpointTypes[id]; + }, + setIdChanged: function (oldId, newId) { + this.setId(oldId, newId, true); + }, + // set parent: change the parent for some node and update all the registrations we need to. + setParent: function (el, newParent) { + var _dom = this.getElement(el), + _id = this.getId(_dom), + _pdom = this.getElement(newParent), + _pid = this.getId(_pdom), + dm = this.getDragManager(); + + _dom.parentNode.removeChild(_dom); + _pdom.appendChild(_dom); + if (dm) { + dm.setParent(_dom, _id, _pdom, _pid); + } + }, + extend: function (o1, o2, names) { + var i; + if (names) { + for (i = 0; i < names.length; i++) { + o1[names[i]] = o2[names[i]]; + } + } + else { + for (i in o2) { + o1[i] = o2[i]; + } + } + + return o1; + }, + floatingConnections: {}, + getFloatingAnchorIndex: function (jpc) { + return jpc.endpoints[0].isFloating() ? 0 : jpc.endpoints[1].isFloating() ? 1 : -1; + }, + proxyConnection :function(connection, index, proxyEl, proxyElId, endpointGenerator, anchorGenerator) { + var proxyEp, + originalElementId = connection.endpoints[index].elementId, + originalEndpoint = connection.endpoints[index]; + + connection.proxies = connection.proxies || []; + if(connection.proxies[index]) { + proxyEp = connection.proxies[index].ep; + }else { + proxyEp = this.addEndpoint(proxyEl, { + endpoint:endpointGenerator(connection, index), + anchor:anchorGenerator(connection, index), + parameters:{ + isProxyEndpoint:true + } + }); + } + proxyEp.setDeleteOnEmpty(true); + + // for this index, stash proxy info: the new EP, the original EP. + connection.proxies[index] = { ep:proxyEp, originalEp: originalEndpoint }; + + // and advise the anchor manager + if (index === 0) { + // TODO why are there two differently named methods? Why is there not one method that says "some end of this + // connection changed (you give the index), and here's the new element and element id." + this.anchorManager.sourceChanged(originalElementId, proxyElId, connection, proxyEl); + } + else { + this.anchorManager.updateOtherEndpoint(connection.endpoints[0].elementId, originalElementId, proxyElId, connection); + connection.target = proxyEl; + connection.targetId = proxyElId; + } + + // detach the original EP from the connection. + originalEndpoint.detachFromConnection(connection, null, true); + + // set the proxy as the new ep + proxyEp.connections = [ connection ]; + connection.endpoints[index] = proxyEp; + + originalEndpoint.setVisible(false); + + connection.setVisible(true); + + this.revalidate(proxyEl); + }, + unproxyConnection : function(connection, index, proxyElId) { + // if connection cleaned up, no proxies, or none for this end of the connection, abort. + if (connection._jsPlumb == null || connection.proxies == null || connection.proxies[index] == null) { + return; + } + + var originalElement = connection.proxies[index].originalEp.element, + originalElementId = connection.proxies[index].originalEp.elementId; + + connection.endpoints[index] = connection.proxies[index].originalEp; + // and advise the anchor manager + if (index === 0) { + // TODO why are there two differently named methods? Why is there not one method that says "some end of this + // connection changed (you give the index), and here's the new element and element id." + this.anchorManager.sourceChanged(proxyElId, originalElementId, connection, originalElement); + } + else { + this.anchorManager.updateOtherEndpoint(connection.endpoints[0].elementId, proxyElId, originalElementId, connection); + connection.target = originalElement; + connection.targetId = originalElementId; + } + + // detach the proxy EP from the connection (which will cause it to be removed as we no longer need it) + connection.proxies[index].ep.detachFromConnection(connection, null); + + connection.proxies[index].originalEp.addConnection(connection); + if(connection.isVisible()) { + connection.proxies[index].originalEp.setVisible(true); + } + + // cleanup + delete connection.proxies[index]; + } + }); + +// --------------------- static instance + module registration ------------------------------------------- + +// create static instance and assign to window if window exists. + var jsPlumb = new jsPlumbInstance(); + // register on 'root' (lets us run on server or browser) + root.jsPlumb = jsPlumb; + // add 'getInstance' method to static instance + jsPlumb.getInstance = function (_defaults, overrideFns) { + var j = new jsPlumbInstance(_defaults); + if (overrideFns) { + for (var ovf in overrideFns) { + j[ovf] = overrideFns[ovf]; + } + } + j.init(); + return j; + }; + jsPlumb.each = function (spec, fn) { + if (spec == null) { + return; + } + if (typeof spec === "string") { + fn(jsPlumb.getElement(spec)); + } + else if (spec.length != null) { + for (var i = 0; i < spec.length; i++) { + fn(jsPlumb.getElement(spec[i])); + } + } + else { + fn(spec); + } // assume it's an element. + }; + + // CommonJS + if (typeof exports !== 'undefined') { + exports.jsPlumb = jsPlumb; + } + +// --------------------- end static instance + AMD registration ------------------------------------------- + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function() { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + // ------------------------------ BEGIN OverlayCapablejsPlumbUIComponent -------------------------------------------- + + var _internalLabelOverlayId = "__label", + // this is a shortcut helper method to let people add a label as + // overlay. + _makeLabelOverlay = function (component, params) { + + var _params = { + cssClass: params.cssClass, + labelStyle: component.labelStyle, + id: _internalLabelOverlayId, + component: component, + _jsPlumb: component._jsPlumb.instance // TODO not necessary, since the instance can be accessed through the component. + }, + mergedParams = _jp.extend(_params, params); + + return new _jp.Overlays[component._jsPlumb.instance.getRenderMode()].Label(mergedParams); + }, + _processOverlay = function (component, o) { + var _newOverlay = null; + if (_ju.isArray(o)) { // this is for the shorthand ["Arrow", { width:50 }] syntax + // there's also a three arg version: + // ["Arrow", { width:50 }, {location:0.7}] + // which merges the 3rd arg into the 2nd. + var type = o[0], + // make a copy of the object so as not to mess up anyone else's reference... + p = _jp.extend({component: component, _jsPlumb: component._jsPlumb.instance}, o[1]); + if (o.length === 3) { + _jp.extend(p, o[2]); + } + _newOverlay = new _jp.Overlays[component._jsPlumb.instance.getRenderMode()][type](p); + } else if (o.constructor === String) { + _newOverlay = new _jp.Overlays[component._jsPlumb.instance.getRenderMode()][o]({component: component, _jsPlumb: component._jsPlumb.instance}); + } else { + _newOverlay = o; + } + + _newOverlay.id = _newOverlay.id || _ju.uuid(); + component.cacheTypeItem("overlay", _newOverlay, _newOverlay.id); + component._jsPlumb.overlays[_newOverlay.id] = _newOverlay; + + return _newOverlay; + }; + + _jp.OverlayCapableJsPlumbUIComponent = function (params) { + + root.jsPlumbUIComponent.apply(this, arguments); + this._jsPlumb.overlays = {}; + this._jsPlumb.overlayPositions = {}; + + if (params.label) { + this.getDefaultType().overlays[_internalLabelOverlayId] = ["Label", { + label: params.label, + location: params.labelLocation || this.defaultLabelLocation || 0.5, + labelStyle: params.labelStyle || this._jsPlumb.instance.Defaults.LabelStyle, + id:_internalLabelOverlayId + }]; + } + + this.setListenerComponent = function (c) { + if (this._jsPlumb) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].setListenerComponent(c); + } + } + }; + }; + + _jp.OverlayCapableJsPlumbUIComponent.applyType = function (component, t) { + if (t.overlays) { + // loop through the ones in the type. if already present on the component, + // dont remove or re-add. + var keep = {}, i; + + for (i in t.overlays) { + + var existing = component._jsPlumb.overlays[t.overlays[i][1].id]; + if (existing) { + // maybe update from data, if there were parameterised values for instance. + existing.updateFrom(t.overlays[i][1]); + keep[t.overlays[i][1].id] = true; + + existing.reattach(component._jsPlumb.instance, component); + } + else { + var c = component.getCachedTypeItem("overlay", t.overlays[i][1].id); + if (c != null) { + c.reattach(component._jsPlumb.instance, component); + c.setVisible(true); + // maybe update from data, if there were parameterised values for instance. + c.updateFrom(t.overlays[i][1]); + component._jsPlumb.overlays[c.id] = c; + } + else { + c = component.addOverlay(t.overlays[i], true); + } + keep[c.id] = true; + } + } + + // now loop through the full overlays and remove those that we dont want to keep + for (i in component._jsPlumb.overlays) { + if (keep[component._jsPlumb.overlays[i].id] == null) { + component.removeOverlay(component._jsPlumb.overlays[i].id, true); // remove overlay but dont clean it up. + // that would remove event listeners etc; overlays are never discarded by the types stuff, they are + // just detached/reattached. + } + } + } + }; + + _ju.extend(_jp.OverlayCapableJsPlumbUIComponent, root.jsPlumbUIComponent, { + + setHover: function (hover, ignoreAttachedElements) { + if (this._jsPlumb && !this._jsPlumb.instance.isConnectionBeingDragged()) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i][hover ? "addClass" : "removeClass"](this._jsPlumb.instance.hoverClass); + } + } + }, + addOverlay: function (overlay, doNotRepaint) { + var o = _processOverlay(this, overlay); + + if (this.getData && o.type === "Label" && _ju.isArray(overlay)) { + // + // component data might contain label location - look for it here. + var d = this.getData(), p = overlay[1]; + if (d) { + var locationAttribute = p.labelLocationAttribute || "labelLocation"; + var loc = d ? d[locationAttribute] : null; + + if (loc) { + o.loc = loc; + } + } + } + + if (!doNotRepaint) { + this.repaint(); + } + return o; + }, + getOverlay: function (id) { + return this._jsPlumb.overlays[id]; + }, + getOverlays: function () { + return this._jsPlumb.overlays; + }, + hideOverlay: function (id) { + var o = this.getOverlay(id); + if (o) { + o.hide(); + } + }, + hideOverlays: function () { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].hide(); + } + }, + showOverlay: function (id) { + var o = this.getOverlay(id); + if (o) { + o.show(); + } + }, + showOverlays: function () { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].show(); + } + }, + removeAllOverlays: function (doNotRepaint) { + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays[i].cleanup) { + this._jsPlumb.overlays[i].cleanup(); + } + } + + this._jsPlumb.overlays = {}; + this._jsPlumb.overlayPositions = null; + this._jsPlumb.overlayPlacements= {}; + if (!doNotRepaint) { + this.repaint(); + } + }, + removeOverlay: function (overlayId, dontCleanup) { + var o = this._jsPlumb.overlays[overlayId]; + if (o) { + o.setVisible(false); + if (!dontCleanup && o.cleanup) { + o.cleanup(); + } + delete this._jsPlumb.overlays[overlayId]; + if (this._jsPlumb.overlayPositions) { + delete this._jsPlumb.overlayPositions[overlayId]; + } + + if (this._jsPlumb.overlayPlacements) { + delete this._jsPlumb.overlayPlacements[overlayId]; + } + } + }, + removeOverlays: function () { + for (var i = 0, j = arguments.length; i < j; i++) { + this.removeOverlay(arguments[i]); + } + }, + moveParent: function (newParent) { + if (this.bgCanvas) { + this.bgCanvas.parentNode.removeChild(this.bgCanvas); + newParent.appendChild(this.bgCanvas); + } + + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + newParent.appendChild(this.canvas); + + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays[i].isAppendedAtTopLevel) { + var el = this._jsPlumb.overlays[i].getElement(); + el.parentNode.removeChild(el); + newParent.appendChild(el); + } + } + } + }, + getLabel: function () { + var lo = this.getOverlay(_internalLabelOverlayId); + return lo != null ? lo.getLabel() : null; + }, + getLabelOverlay: function () { + return this.getOverlay(_internalLabelOverlayId); + }, + setLabel: function (l) { + var lo = this.getOverlay(_internalLabelOverlayId); + if (!lo) { + var params = l.constructor === String || l.constructor === Function ? { label: l } : l; + lo = _makeLabelOverlay(this, params); + this._jsPlumb.overlays[_internalLabelOverlayId] = lo; + } + else { + if (l.constructor === String || l.constructor === Function) { + lo.setLabel(l); + } + else { + if (l.label) { + lo.setLabel(l.label); + } + if (l.location) { + lo.setLocation(l.location); + } + } + } + + if (!this._jsPlumb.instance.isSuspendDrawing()) { + this.repaint(); + } + }, + cleanup: function (force) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].cleanup(force); + this._jsPlumb.overlays[i].destroy(force); + } + if (force) { + this._jsPlumb.overlays = {}; + this._jsPlumb.overlayPositions = null; + } + }, + setVisible: function (v) { + this[v ? "showOverlays" : "hideOverlays"](); + }, + setAbsoluteOverlayPosition: function (overlay, xy) { + this._jsPlumb.overlayPositions[overlay.id] = xy; + }, + getAbsoluteOverlayPosition: function (overlay) { + return this._jsPlumb.overlayPositions ? this._jsPlumb.overlayPositions[overlay.id] : null; + }, + _clazzManip:function(action, clazz, dontUpdateOverlays) { + if (!dontUpdateOverlays) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i][action + "Class"](clazz); + } + } + }, + addClass:function(clazz, dontUpdateOverlays) { + this._clazzManip("add", clazz, dontUpdateOverlays); + }, + removeClass:function(clazz, dontUpdateOverlays) { + this._clazzManip("remove", clazz, dontUpdateOverlays); + } + }); + +// ------------------------------ END OverlayCapablejsPlumbUIComponent -------------------------------------------- + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the code for Endpoints. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + // create the drag handler for a connection + var _makeConnectionDragHandler = function (endpoint, placeholder, _jsPlumb) { + var stopped = false; + return { + drag: function () { + if (stopped) { + stopped = false; + return true; + } + + if (placeholder.element) { + var _ui = _jsPlumb.getUIPosition(arguments, _jsPlumb.getZoom()); + if (_ui != null) { + _jsPlumb.setPosition(placeholder.element, _ui); + } + _jsPlumb.repaint(placeholder.element, _ui); + // always repaint the source endpoint, because only continuous/dynamic anchors cause the endpoint + // to be repainted, so static anchors need to be told (or the endpoint gets dragged around) + endpoint.paint({anchorPoint:endpoint.anchor.getCurrentLocation({element:endpoint})}); + } + }, + stopDrag: function () { + stopped = true; + } + }; + }; + + // creates a placeholder div for dragging purposes, adds it, and pre-computes its offset. + var _makeDraggablePlaceholder = function (placeholder, _jsPlumb, ipco, ips) { + var n = _jsPlumb.createElement("div", { position : "absolute" }); + _jsPlumb.appendElement(n); + var id = _jsPlumb.getId(n); + _jsPlumb.setPosition(n, ipco); + n.style.width = ips[0] + "px"; + n.style.height = ips[1] + "px"; + _jsPlumb.manage(id, n, true); // TRANSIENT MANAGE + // create and assign an id, and initialize the offset. + placeholder.id = id; + placeholder.element = n; + }; + + // create a floating endpoint (for drag connections) + var _makeFloatingEndpoint = function (paintStyle, referenceAnchor, endpoint, referenceCanvas, sourceElement, _jsPlumb, _newEndpoint, scope) { + var floatingAnchor = new _jp.FloatingAnchor({ reference: referenceAnchor, referenceCanvas: referenceCanvas, jsPlumbInstance: _jsPlumb }); + //setting the scope here should not be the way to fix that mootools issue. it should be fixed by not + // adding the floating endpoint as a droppable. that makes more sense anyway! + // TRANSIENT MANAGE + return _newEndpoint({ + paintStyle: paintStyle, + endpoint: endpoint, + anchor: floatingAnchor, + source: sourceElement, + scope: scope + }); + }; + + var typeParameters = [ "connectorStyle", "connectorHoverStyle", "connectorOverlays", + "connector", "connectionType", "connectorClass", "connectorHoverClass" ]; + + // a helper function that tries to find a connection to the given element, and returns it if so. if elementWithPrecedence is null, + // or no connection to it is found, we return the first connection in our list. + var findConnectionToUseForDynamicAnchor = function (ep, elementWithPrecedence) { + var idx = 0; + if (elementWithPrecedence != null) { + for (var i = 0; i < ep.connections.length; i++) { + if (ep.connections[i].sourceId === elementWithPrecedence || ep.connections[i].targetId === elementWithPrecedence) { + idx = i; + break; + } + } + } + + return ep.connections[idx]; + }; + + _jp.Endpoint = function (params) { + var _jsPlumb = params._jsPlumb, + _newConnection = params.newConnection, + _newEndpoint = params.newEndpoint; + + this.idPrefix = "_jsplumb_e_"; + this.defaultLabelLocation = [ 0.5, 0.5 ]; + this.defaultOverlayKeys = ["Overlays", "EndpointOverlays"]; + _jp.OverlayCapableJsPlumbUIComponent.apply(this, arguments); + +// TYPE + + this.appendToDefaultType({ + connectionType:params.connectionType, + maxConnections: params.maxConnections == null ? this._jsPlumb.instance.Defaults.MaxConnections : params.maxConnections, // maximum number of connections this endpoint can be the source of., + paintStyle: params.endpointStyle || params.paintStyle || params.style || this._jsPlumb.instance.Defaults.EndpointStyle || _jp.Defaults.EndpointStyle, + hoverPaintStyle: params.endpointHoverStyle || params.hoverPaintStyle || this._jsPlumb.instance.Defaults.EndpointHoverStyle || _jp.Defaults.EndpointHoverStyle, + connectorStyle: params.connectorStyle, + connectorHoverStyle: params.connectorHoverStyle, + connectorClass: params.connectorClass, + connectorHoverClass: params.connectorHoverClass, + connectorOverlays: params.connectorOverlays, + connector: params.connector, + connectorTooltip: params.connectorTooltip + }); + +// END TYPE + + this._jsPlumb.enabled = !(params.enabled === false); + this._jsPlumb.visible = true; + this.element = _jp.getElement(params.source); + this._jsPlumb.uuid = params.uuid; + this._jsPlumb.floatingEndpoint = null; + var inPlaceCopy = null; + if (this._jsPlumb.uuid) { + params.endpointsByUUID[this._jsPlumb.uuid] = this; + } + this.elementId = params.elementId; + this.dragProxy = params.dragProxy; + + this._jsPlumb.connectionCost = params.connectionCost; + this._jsPlumb.connectionsDirected = params.connectionsDirected; + this._jsPlumb.currentAnchorClass = ""; + this._jsPlumb.events = {}; + + var deleteOnEmpty = params.deleteOnEmpty === true; + this.setDeleteOnEmpty = function(d) { + deleteOnEmpty = d; + }; + + var _updateAnchorClass = function () { + // stash old, get new + var oldAnchorClass = _jsPlumb.endpointAnchorClassPrefix + "-" + this._jsPlumb.currentAnchorClass; + this._jsPlumb.currentAnchorClass = this.anchor.getCssClass(); + var anchorClass = _jsPlumb.endpointAnchorClassPrefix + (this._jsPlumb.currentAnchorClass ? "-" + this._jsPlumb.currentAnchorClass : ""); + + this.removeClass(oldAnchorClass); + this.addClass(anchorClass); + // add and remove at the same time to reduce the number of reflows. + _jp.updateClasses(this.element, anchorClass, oldAnchorClass); + }.bind(this); + + this.prepareAnchor = function(anchorParams) { + var a = this._jsPlumb.instance.makeAnchor(anchorParams, this.elementId, _jsPlumb); + a.bind("anchorChanged", function (currentAnchor) { + this.fire("anchorChanged", {endpoint: this, anchor: currentAnchor}); + _updateAnchorClass(); + }.bind(this)); + return a; + }; + + this.setPreparedAnchor = function(anchor, doNotRepaint) { + this._jsPlumb.instance.continuousAnchorFactory.clear(this.elementId); + this.anchor = anchor; + _updateAnchorClass(); + + if (!doNotRepaint) { + this._jsPlumb.instance.repaint(this.elementId); + } + + return this; + }; + + this.setAnchor = function (anchorParams, doNotRepaint) { + var a = this.prepareAnchor(anchorParams); + this.setPreparedAnchor(a, doNotRepaint); + return this; + }; + + var internalHover = function (state) { + if (this.connections.length > 0) { + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].setHover(state, false); + } + } + else { + this.setHover(state); + } + }.bind(this); + + this.bind("mouseover", function () { + internalHover(true); + }); + this.bind("mouseout", function () { + internalHover(false); + }); + + // ANCHOR MANAGER + if (!params._transient) { // in place copies, for example, are transient. they will never need to be retrieved during a paint cycle, because they dont move, and then they are deleted. + this._jsPlumb.instance.anchorManager.add(this, this.elementId); + } + + this.prepareEndpoint = function(ep, typeId) { + var _e = function (t, p) { + var rm = _jsPlumb.getRenderMode(); + if (_jp.Endpoints[rm][t]) { + return new _jp.Endpoints[rm][t](p); + } + if (!_jsPlumb.Defaults.DoNotThrowErrors) { + throw { msg: "jsPlumb: unknown endpoint type '" + t + "'" }; + } + }; + + var endpointArgs = { + _jsPlumb: this._jsPlumb.instance, + cssClass: params.cssClass, + container: params.container, + tooltip: params.tooltip, + connectorTooltip: params.connectorTooltip, + endpoint: this + }; + + var endpoint; + + if (_ju.isString(ep)) { + endpoint = _e(ep, endpointArgs); + } + else if (_ju.isArray(ep)) { + endpointArgs = _ju.merge(ep[1], endpointArgs); + endpoint = _e(ep[0], endpointArgs); + } + else { + endpoint = ep.clone(); + } + + // assign a clone function using a copy of endpointArgs. this is used when a drag starts: the endpoint that was dragged is cloned, + // and the clone is left in its place while the original one goes off on a magical journey. + // the copy is to get around a closure problem, in which endpointArgs ends up getting shared by + // the whole world. + //var argsForClone = jsPlumb.extend({}, endpointArgs); + endpoint.clone = function () { + // TODO this, and the code above, can be refactored to be more dry. + if (_ju.isString(ep)) { + return _e(ep, endpointArgs); + } + else if (_ju.isArray(ep)) { + endpointArgs = _ju.merge(ep[1], endpointArgs); + return _e(ep[0], endpointArgs); + } + }.bind(this); + + endpoint.typeId = typeId; + return endpoint; + }; + + this.setEndpoint = function(ep, doNotRepaint) { + var _ep = this.prepareEndpoint(ep); + this.setPreparedEndpoint(_ep, true); + }; + + this.setPreparedEndpoint = function (ep, doNotRepaint) { + if (this.endpoint != null) { + this.endpoint.cleanup(); + this.endpoint.destroy(); + } + this.endpoint = ep; + this.type = this.endpoint.type; + this.canvas = this.endpoint.canvas; + }; + + _jp.extend(this, params, typeParameters); + + this.isSource = params.isSource || false; + this.isTemporarySource = params.isTemporarySource || false; + this.isTarget = params.isTarget || false; + + this.connections = params.connections || []; + this.connectorPointerEvents = params["connector-pointer-events"]; + + this.scope = params.scope || _jsPlumb.getDefaultScope(); + this.timestamp = null; + this.reattachConnections = params.reattach || _jsPlumb.Defaults.ReattachConnections; + this.connectionsDetachable = _jsPlumb.Defaults.ConnectionsDetachable; + if (params.connectionsDetachable === false || params.detachable === false) { + this.connectionsDetachable = false; + } + this.dragAllowedWhenFull = params.dragAllowedWhenFull !== false; + + if (params.onMaxConnections) { + this.bind("maxConnections", params.onMaxConnections); + } + + // + // add a connection. not part of public API. + // + this.addConnection = function (connection) { + this.connections.push(connection); + this[(this.connections.length > 0 ? "add" : "remove") + "Class"](_jsPlumb.endpointConnectedClass); + this[(this.isFull() ? "add" : "remove") + "Class"](_jsPlumb.endpointFullClass); + }; + + this.detachFromConnection = function (connection, idx, doNotCleanup) { + idx = idx == null ? this.connections.indexOf(connection) : idx; + if (idx >= 0) { + this.connections.splice(idx, 1); + this[(this.connections.length > 0 ? "add" : "remove") + "Class"](_jsPlumb.endpointConnectedClass); + this[(this.isFull() ? "add" : "remove") + "Class"](_jsPlumb.endpointFullClass); + } + + if (!doNotCleanup && deleteOnEmpty && this.connections.length === 0) { + _jsPlumb.deleteObject({ + endpoint: this, + fireEvent: false, + deleteAttachedObjects: doNotCleanup !== true + }); + } + }; + + this.deleteEveryConnection = function(params) { + var c = this.connections.length; + for (var i = 0; i < c; i++) { + _jsPlumb.deleteConnection(this.connections[0], params); + } + }; + + this.detachFrom = function (targetEndpoint, fireEvent, originalEvent) { + var c = []; + for (var i = 0; i < this.connections.length; i++) { + if (this.connections[i].endpoints[1] === targetEndpoint || this.connections[i].endpoints[0] === targetEndpoint) { + c.push(this.connections[i]); + } + } + for (var j = 0, count = c.length; j < count; j++) { + _jsPlumb.deleteConnection(c[0]); + } + return this; + }; + + this.getElement = function () { + return this.element; + }; + + this.setElement = function (el) { + var parentId = this._jsPlumb.instance.getId(el), + curId = this.elementId; + // remove the endpoint from the list for the current endpoint's element + _ju.removeWithFunction(params.endpointsByElement[this.elementId], function (e) { + return e.id === this.id; + }.bind(this)); + this.element = _jp.getElement(el); + this.elementId = _jsPlumb.getId(this.element); + _jsPlumb.anchorManager.rehomeEndpoint(this, curId, this.element); + _jsPlumb.dragManager.endpointAdded(this.element); + _ju.addToList(params.endpointsByElement, parentId, this); + return this; + }; + + /** + * private but must be exposed. + */ + this.makeInPlaceCopy = function () { + var loc = this.anchor.getCurrentLocation({element: this}), + o = this.anchor.getOrientation(this), + acc = this.anchor.getCssClass(), + inPlaceAnchor = { + bind: function () { + }, + compute: function () { + return [ loc[0], loc[1] ]; + }, + getCurrentLocation: function () { + return [ loc[0], loc[1] ]; + }, + getOrientation: function () { + return o; + }, + getCssClass: function () { + return acc; + } + }; + + return _newEndpoint({ + dropOptions: params.dropOptions, + anchor: inPlaceAnchor, + source: this.element, + paintStyle: this.getPaintStyle(), + endpoint: params.hideOnDrag ? "Blank" : this.endpoint, + _transient: true, + scope: this.scope, + reference:this + }); + }; + + /** + * returns a connection from the pool; used when dragging starts. just gets the head of the array if it can. + */ + this.connectorSelector = function () { + return this.connections[0]; + }; + + this.setStyle = this.setPaintStyle; + + this.paint = function (params) { + params = params || {}; + var timestamp = params.timestamp, recalc = !(params.recalc === false); + if (!timestamp || this.timestamp !== timestamp) { + + var info = _jsPlumb.updateOffset({ elId: this.elementId, timestamp: timestamp }); + + var xy = params.offset ? params.offset.o : info.o; + if (xy != null) { + var ap = params.anchorPoint, connectorPaintStyle = params.connectorPaintStyle; + if (ap == null) { + var wh = params.dimensions || info.s, + anchorParams = { xy: [ xy.left, xy.top ], wh: wh, element: this, timestamp: timestamp }; + if (recalc && this.anchor.isDynamic && this.connections.length > 0) { + var c = findConnectionToUseForDynamicAnchor(this, params.elementWithPrecedence), + oIdx = c.endpoints[0] === this ? 1 : 0, + oId = oIdx === 0 ? c.sourceId : c.targetId, + oInfo = _jsPlumb.getCachedData(oId), + oOffset = oInfo.o, oWH = oInfo.s; + + anchorParams.index = oIdx === 0 ? 1 : 0; + anchorParams.connection = c; + anchorParams.txy = [ oOffset.left, oOffset.top ]; + anchorParams.twh = oWH; + anchorParams.tElement = c.endpoints[oIdx]; + } else if (this.connections.length > 0) { + anchorParams.connection = this.connections[0]; + } + ap = this.anchor.compute(anchorParams); + } + + this.endpoint.compute(ap, this.anchor.getOrientation(this), this._jsPlumb.paintStyleInUse, connectorPaintStyle || this.paintStyleInUse); + this.endpoint.paint(this._jsPlumb.paintStyleInUse, this.anchor); + this.timestamp = timestamp; + + // paint overlays + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays.hasOwnProperty(i)) { + var o = this._jsPlumb.overlays[i]; + if (o.isVisible()) { + this._jsPlumb.overlayPlacements[i] = o.draw(this.endpoint, this._jsPlumb.paintStyleInUse); + o.paint(this._jsPlumb.overlayPlacements[i]); + } + } + } + } + } + }; + + this.getTypeDescriptor = function () { + return "endpoint"; + }; + this.isVisible = function () { + return this._jsPlumb.visible; + }; + + this.repaint = this.paint; + + var draggingInitialised = false; + this.initDraggable = function () { + + // is this a connection source? we make it draggable and have the + // drag listener maintain a connection with a floating endpoint. + if (!draggingInitialised && _jp.isDragSupported(this.element)) { + var placeholderInfo = { id: null, element: null }, + jpc = null, + existingJpc = false, + existingJpcParams = null, + _dragHandler = _makeConnectionDragHandler(this, placeholderInfo, _jsPlumb), + dragOptions = params.dragOptions || {}, + defaultOpts = {}, + startEvent = _jp.dragEvents.start, + stopEvent = _jp.dragEvents.stop, + dragEvent = _jp.dragEvents.drag, + beforeStartEvent = _jp.dragEvents.beforeStart, + payload; + + // respond to beforeStart from katavorio; this will have, optionally, a payload of attribute values + // that were placed there by the makeSource mousedown listener. + var beforeStart = function(beforeStartParams) { + payload = beforeStartParams.e.payload || {}; + }; + + var start = function (startParams) { + +// ------------- first, get a connection to drag. this may be null, in which case we are dragging a new one. + + jpc = this.connectorSelector(); + +// -------------------------------- now a bunch of tests about whether or not to proceed ------------------------- + + var _continue = true; + // if not enabled, return + if (!this.isEnabled()) { + _continue = false; + } + // if no connection and we're not a source - or temporarily a source, as is the case with makeSource - return. + if (jpc == null && !this.isSource && !this.isTemporarySource) { + _continue = false; + } + // otherwise if we're full and not allowed to drag, also return false. + if (this.isSource && this.isFull() && !(jpc != null && this.dragAllowedWhenFull)) { + _continue = false; + } + // if the connection was setup as not detachable or one of its endpoints + // was setup as connectionsDetachable = false, or Defaults.ConnectionsDetachable + // is set to false... + if (jpc != null && !jpc.isDetachable(this)) { + // .. and the endpoint is full + if (this.isFull()) { + _continue = false; + } else { + // otherwise, if not full, set the connection to null, and we will now proceed + // to drag a new connection. + jpc = null; + } + } + + var beforeDrag = _jsPlumb.checkCondition(jpc == null ? "beforeDrag" : "beforeStartDetach", { + endpoint:this, + source:this.element, + sourceId:this.elementId, + connection:jpc + }); + if (beforeDrag === false) { + _continue = false; + } + // else we might have been given some data. we'll pass it in to a new connection as 'data'. + // here we also merge in the optional payload we were given on mousedown. + else if (typeof beforeDrag === "object") { + _jp.extend(beforeDrag, payload || {}); + } + else { + // or if no beforeDrag data, maybe use the payload on its own. + beforeDrag = payload || {}; + } + + if (_continue === false) { + // this is for mootools and yui. returning false from this causes jquery to stop drag. + // the events are wrapped in both mootools and yui anyway, but i don't think returning + // false from the start callback would stop a drag. + if (_jsPlumb.stopDrag) { + _jsPlumb.stopDrag(this.canvas); + } + _dragHandler.stopDrag(); + return false; + } + +// --------------------------------------------------------------------------------------------------------------------- + + // ok to proceed. + + // clear hover for all connections for this endpoint before continuing. + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].setHover(false); + } + + this.addClass("endpointDrag"); + _jsPlumb.setConnectionBeingDragged(true); + + // if we're not full but there was a connection, make it null. we'll create a new one. + if (jpc && !this.isFull() && this.isSource) { + jpc = null; + } + + _jsPlumb.updateOffset({ elId: this.elementId }); + +// ---------------- make the element we will drag around, and position it ----------------------------- + + var ipco = this._jsPlumb.instance.getOffset(this.canvas), + canvasElement = this.canvas, + ips = this._jsPlumb.instance.getSize(this.canvas); + + _makeDraggablePlaceholder(placeholderInfo, _jsPlumb, ipco, ips); + + // store the id of the dragging div and the source element. the drop function will pick these up. + _jsPlumb.setAttributes(this.canvas, { + "dragId": placeholderInfo.id, + "elId": this.elementId + }); + +// ------------------- create an endpoint that will be our floating endpoint ------------------------------------ + + var endpointToFloat = this.dragProxy || this.endpoint; + if (this.dragProxy == null && this.connectionType != null) { + var aae = this._jsPlumb.instance.deriveEndpointAndAnchorSpec(this.connectionType); + if (aae.endpoints[1]) { + endpointToFloat = aae.endpoints[1]; + } + } + var centerAnchor = this._jsPlumb.instance.makeAnchor("Center"); + centerAnchor.isFloating = true; + this._jsPlumb.floatingEndpoint = _makeFloatingEndpoint(this.getPaintStyle(), centerAnchor, endpointToFloat, this.canvas, placeholderInfo.element, _jsPlumb, _newEndpoint, this.scope); + var _savedAnchor = this._jsPlumb.floatingEndpoint.anchor; + + + if (jpc == null) { + + this.setHover(false, false); + // create a connection. one end is this endpoint, the other is a floating endpoint. + jpc = _newConnection({ + sourceEndpoint: this, + targetEndpoint: this._jsPlumb.floatingEndpoint, + source: this.element, // for makeSource with parent option. ensure source element is represented correctly. + target: placeholderInfo.element, + anchors: [ this.anchor, this._jsPlumb.floatingEndpoint.anchor ], + paintStyle: params.connectorStyle, // this can be null. Connection will use the default. + hoverPaintStyle: params.connectorHoverStyle, + connector: params.connector, // this can also be null. Connection will use the default. + overlays: params.connectorOverlays, + type: this.connectionType, + cssClass: this.connectorClass, + hoverClass: this.connectorHoverClass, + scope:params.scope, + data:beforeDrag + }); + jpc.pending = true; + jpc.addClass(_jsPlumb.draggingClass); + this._jsPlumb.floatingEndpoint.addClass(_jsPlumb.draggingClass); + this._jsPlumb.floatingEndpoint.anchor = _savedAnchor; + // fire an event that informs that a connection is being dragged + _jsPlumb.fire("connectionDrag", jpc); + + // register the new connection on the drag manager. This connection, at this point, is 'pending', + // and has as its target a temporary element (the 'placeholder'). If the connection subsequently + // becomes established, the anchor manager is informed that the target of the connection has + // changed. + + _jsPlumb.anchorManager.newConnection(jpc); + + } else { + existingJpc = true; + jpc.setHover(false); + // new anchor idx + var anchorIdx = jpc.endpoints[0].id === this.id ? 0 : 1; + this.detachFromConnection(jpc, null, true); // detach from the connection while dragging is occurring. but dont cleanup automatically. + + // store the original scope (issue 57) + var dragScope = _jsPlumb.getDragScope(canvasElement); + _jsPlumb.setAttribute(this.canvas, "originalScope", dragScope); + + // fire an event that informs that a connection is being dragged. we do this before + // replacing the original target with the floating element info. + _jsPlumb.fire("connectionDrag", jpc); + + // now we replace ourselves with the temporary div we created above: + if (anchorIdx === 0) { + existingJpcParams = [ jpc.source, jpc.sourceId, canvasElement, dragScope ]; + _jsPlumb.anchorManager.sourceChanged(jpc.endpoints[anchorIdx].elementId, placeholderInfo.id, jpc, placeholderInfo.element); + + } else { + existingJpcParams = [ jpc.target, jpc.targetId, canvasElement, dragScope ]; + jpc.target = placeholderInfo.element; + jpc.targetId = placeholderInfo.id; + + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.endpoints[anchorIdx].elementId, jpc.targetId, jpc); + } + + // store the original endpoint and assign the new floating endpoint for the drag. + jpc.suspendedEndpoint = jpc.endpoints[anchorIdx]; + + // PROVIDE THE SUSPENDED ELEMENT, BE IT A SOURCE OR TARGET (ISSUE 39) + jpc.suspendedElement = jpc.endpoints[anchorIdx].getElement(); + jpc.suspendedElementId = jpc.endpoints[anchorIdx].elementId; + jpc.suspendedElementType = anchorIdx === 0 ? "source" : "target"; + + jpc.suspendedEndpoint.setHover(false); + this._jsPlumb.floatingEndpoint.referenceEndpoint = jpc.suspendedEndpoint; + jpc.endpoints[anchorIdx] = this._jsPlumb.floatingEndpoint; + + jpc.addClass(_jsPlumb.draggingClass); + this._jsPlumb.floatingEndpoint.addClass(_jsPlumb.draggingClass); + } + + _jsPlumb.registerFloatingConnection(placeholderInfo, jpc, this._jsPlumb.floatingEndpoint); + + // // register it and register connection on it. + // _jsPlumb.floatingConnections[placeholderInfo.id] = jpc; + // + // // only register for the target endpoint; we will not be dragging the source at any time + // // before this connection is either discarded or made into a permanent connection. + // _ju.addToList(params.endpointsByElement, placeholderInfo.id, this._jsPlumb.floatingEndpoint); + + + // tell jsplumb about it + _jsPlumb.currentlyDragging = true; + }.bind(this); + + var stop = function () { + _jsPlumb.setConnectionBeingDragged(false); + + if (jpc && jpc.endpoints != null) { + // get the actual drop event (decode from library args to stop function) + var originalEvent = _jsPlumb.getDropEvent(arguments); + // unlock the other endpoint (if it is dynamic, it would have been locked at drag start) + var idx = _jsPlumb.getFloatingAnchorIndex(jpc); + jpc.endpoints[idx === 0 ? 1 : 0].anchor.unlock(); + // TODO: Dont want to know about css classes inside jsplumb, ideally. + jpc.removeClass(_jsPlumb.draggingClass); + + // if we have the floating endpoint then the connection has not been dropped + // on another endpoint. If it is a new connection we throw it away. If it is an + // existing connection we check to see if we should reattach it, throwing it away + // if not. + if (this._jsPlumb && (jpc.deleteConnectionNow || jpc.endpoints[idx] === this._jsPlumb.floatingEndpoint)) { + // 6a. if the connection was an existing one... + if (existingJpc && jpc.suspendedEndpoint) { + // fix for issue35, thanks Sylvain Gizard: when firing the detach event make sure the + // floating endpoint has been replaced. + if (idx === 0) { + jpc.floatingElement = jpc.source; + jpc.floatingId = jpc.sourceId; + jpc.floatingEndpoint = jpc.endpoints[0]; + jpc.floatingIndex = 0; + jpc.source = existingJpcParams[0]; + jpc.sourceId = existingJpcParams[1]; + } else { + // keep a copy of the floating element; the anchor manager will want to clean up. + jpc.floatingElement = jpc.target; + jpc.floatingId = jpc.targetId; + jpc.floatingEndpoint = jpc.endpoints[1]; + jpc.floatingIndex = 1; + jpc.target = existingJpcParams[0]; + jpc.targetId = existingJpcParams[1]; + } + + var fe = this._jsPlumb.floatingEndpoint; // store for later removal. + // restore the original scope (issue 57) + _jsPlumb.setDragScope(existingJpcParams[2], existingJpcParams[3]); + jpc.endpoints[idx] = jpc.suspendedEndpoint; + // if the connection should be reattached, or the other endpoint refuses detach, then + // reset the connection to its original state + if (jpc.isReattach() || jpc._forceReattach || jpc._forceDetach || !_jsPlumb.deleteConnection(jpc, {originalEvent: originalEvent})) { + + jpc.setHover(false); + jpc._forceDetach = null; + jpc._forceReattach = null; + this._jsPlumb.floatingEndpoint.detachFromConnection(jpc); + jpc.suspendedEndpoint.addConnection(jpc); + + // TODO this code is duplicated in lots of places...and there is nothing external + // in the code; it all refers to the connection itself. we could add a + // `checkSanity(connection)` method to anchorManager that did this. + if (idx === 1) { + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.floatingId, jpc.targetId, jpc); + } + else { + _jsPlumb.anchorManager.sourceChanged(jpc.floatingId, jpc.sourceId, jpc, jpc.source); + } + + _jsPlumb.repaint(existingJpcParams[1]); + } + else { + _jsPlumb.deleteObject({endpoint: fe}); + } + } + } + + // makeTargets sets this flag, to tell us we have been replaced and should delete this object. + if (this.deleteAfterDragStop) { + _jsPlumb.deleteObject({endpoint: this}); + } + else { + if (this._jsPlumb) { + this.paint({recalc: false}); + } + } + + // although the connection is no longer valid, there are use cases where this is useful. + _jsPlumb.fire("connectionDragStop", jpc, originalEvent); + // fire this event to give people more fine-grained control (connectionDragStop fires a lot) + if (jpc.pending) { + _jsPlumb.fire("connectionAborted", jpc, originalEvent); + } + // tell jsplumb that dragging is finished. + _jsPlumb.currentlyDragging = false; + jpc.suspendedElement = null; + jpc.suspendedEndpoint = null; + jpc = null; + } + + // if no endpoints, jpc already cleaned up. but still we want to ensure we're reset properly. + // remove the element associated with the floating endpoint + // (and its associated floating endpoint and visual artefacts) + if (placeholderInfo && placeholderInfo.element) { + _jsPlumb.remove(placeholderInfo.element, false, false); + } + // remove the inplace copy + if (inPlaceCopy) { + _jsPlumb.deleteObject({endpoint: inPlaceCopy}); + } + + if (this._jsPlumb) { + // make our canvas visible (TODO: hand off to library; we should not know about DOM) + this.canvas.style.visibility = "visible"; + // unlock our anchor + this.anchor.unlock(); + // clear floating anchor. + this._jsPlumb.floatingEndpoint = null; + } + + }.bind(this); + + dragOptions = _jp.extend(defaultOpts, dragOptions); + dragOptions.scope = this.scope || dragOptions.scope; + dragOptions[beforeStartEvent] = _ju.wrap(dragOptions[beforeStartEvent], beforeStart, false); + dragOptions[startEvent] = _ju.wrap(dragOptions[startEvent], start, false); + // extracted drag handler function so can be used by makeSource + dragOptions[dragEvent] = _ju.wrap(dragOptions[dragEvent], _dragHandler.drag); + dragOptions[stopEvent] = _ju.wrap(dragOptions[stopEvent], stop); + dragOptions.multipleDrop = false; + + dragOptions.canDrag = function () { + return this.isSource || this.isTemporarySource || (this.connections.length > 0 && this.connectionsDetachable !== false); + }.bind(this); + + _jsPlumb.initDraggable(this.canvas, dragOptions, "internal"); + + this.canvas._jsPlumbRelatedElement = this.element; + + draggingInitialised = true; + } + }; + + var ep = params.endpoint || this._jsPlumb.instance.Defaults.Endpoint || _jp.Defaults.Endpoint; + this.setEndpoint(ep, true); + var anchorParamsToUse = params.anchor ? params.anchor : params.anchors ? params.anchors : (_jsPlumb.Defaults.Anchor || "Top"); + this.setAnchor(anchorParamsToUse, true); + + // finally, set type if it was provided + var type = [ "default", (params.type || "")].join(" "); + this.addType(type, params.data, true); + this.canvas = this.endpoint.canvas; + this.canvas._jsPlumb = this; + + this.initDraggable(); + + // pulled this out into a function so we can reuse it for the inPlaceCopy canvas; you can now drop detached connections + // back onto the endpoint you detached it from. + var _initDropTarget = function (canvas, isTransient, endpoint, referenceEndpoint) { + + if (_jp.isDropSupported(this.element)) { + var dropOptions = params.dropOptions || _jsPlumb.Defaults.DropOptions || _jp.Defaults.DropOptions; + dropOptions = _jp.extend({}, dropOptions); + dropOptions.scope = dropOptions.scope || this.scope; + var dropEvent = _jp.dragEvents.drop, + overEvent = _jp.dragEvents.over, + outEvent = _jp.dragEvents.out, + _ep = this, + drop = _jsPlumb.EndpointDropHandler({ + getEndpoint: function () { + return _ep; + }, + jsPlumb: _jsPlumb, + enabled: function () { + return endpoint != null ? endpoint.isEnabled() : true; + }, + isFull: function () { + return endpoint.isFull(); + }, + element: this.element, + elementId: this.elementId, + isSource: this.isSource, + isTarget: this.isTarget, + addClass: function (clazz) { + _ep.addClass(clazz); + }, + removeClass: function (clazz) { + _ep.removeClass(clazz); + }, + isDropAllowed: function () { + return _ep.isDropAllowed.apply(_ep, arguments); + }, + reference:referenceEndpoint, + isRedrop:function(jpc, dhParams) { + return jpc.suspendedEndpoint && dhParams.reference && (jpc.suspendedEndpoint.id === dhParams.reference.id); + } + }); + + dropOptions[dropEvent] = _ju.wrap(dropOptions[dropEvent], drop, true); + dropOptions[overEvent] = _ju.wrap(dropOptions[overEvent], function () { + var draggable = _jp.getDragObject(arguments), + id = _jsPlumb.getAttribute(_jp.getElement(draggable), "dragId"), + _jpc = _jsPlumb.getFloatingConnectionFor(id);//_jsPlumb.floatingConnections[id]; + + if (_jpc != null) { + var idx = _jsPlumb.getFloatingAnchorIndex(_jpc); + // here we should fire the 'over' event if we are a target and this is a new connection, + // or we are the same as the floating endpoint. + var _cont = (this.isTarget && idx !== 0) || (_jpc.suspendedEndpoint && this.referenceEndpoint && this.referenceEndpoint.id === _jpc.suspendedEndpoint.id); + if (_cont) { + var bb = _jsPlumb.checkCondition("checkDropAllowed", { + sourceEndpoint: _jpc.endpoints[idx], + targetEndpoint: this, + connection: _jpc + }); + this[(bb ? "add" : "remove") + "Class"](_jsPlumb.endpointDropAllowedClass); + this[(bb ? "remove" : "add") + "Class"](_jsPlumb.endpointDropForbiddenClass); + _jpc.endpoints[idx].anchor.over(this.anchor, this); + } + } + }.bind(this)); + + dropOptions[outEvent] = _ju.wrap(dropOptions[outEvent], function () { + var draggable = _jp.getDragObject(arguments), + id = draggable == null ? null : _jsPlumb.getAttribute(_jp.getElement(draggable), "dragId"), + _jpc = id ? _jsPlumb.getFloatingConnectionFor(id) : null; + + if (_jpc != null) { + var idx = _jsPlumb.getFloatingAnchorIndex(_jpc); + var _cont = (this.isTarget && idx !== 0) || (_jpc.suspendedEndpoint && this.referenceEndpoint && this.referenceEndpoint.id === _jpc.suspendedEndpoint.id); + if (_cont) { + this.removeClass(_jsPlumb.endpointDropAllowedClass); + this.removeClass(_jsPlumb.endpointDropForbiddenClass); + _jpc.endpoints[idx].anchor.out(); + } + } + }.bind(this)); + + _jsPlumb.initDroppable(canvas, dropOptions, "internal", isTransient); + } + }.bind(this); + + // Initialise the endpoint's canvas as a drop target. The drop handler will take care of the logic of whether + // something can actually be dropped. + if (!this.anchor.isFloating) { + _initDropTarget(this.canvas, !(params._transient || this.anchor.isFloating), this, params.reference); + } + + return this; + }; + + _ju.extend(_jp.Endpoint, _jp.OverlayCapableJsPlumbUIComponent, { + + setVisible: function (v, doNotChangeConnections, doNotNotifyOtherEndpoint) { + this._jsPlumb.visible = v; + if (this.canvas) { + this.canvas.style.display = v ? "block" : "none"; + } + this[v ? "showOverlays" : "hideOverlays"](); + if (!doNotChangeConnections) { + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].setVisible(v); + if (!doNotNotifyOtherEndpoint) { + var oIdx = this === this.connections[i].endpoints[0] ? 1 : 0; + // only change the other endpoint if this is its only connection. + if (this.connections[i].endpoints[oIdx].connections.length === 1) { + this.connections[i].endpoints[oIdx].setVisible(v, true, true); + } + } + } + } + }, + getAttachedElements: function () { + return this.connections; + }, + applyType: function (t, doNotRepaint) { + this.setPaintStyle(t.endpointStyle || t.paintStyle, doNotRepaint); + this.setHoverPaintStyle(t.endpointHoverStyle || t.hoverPaintStyle, doNotRepaint); + if (t.maxConnections != null) { + this._jsPlumb.maxConnections = t.maxConnections; + } + if (t.scope) { + this.scope = t.scope; + } + _jp.extend(this, t, typeParameters); + if (t.cssClass != null && this.canvas) { + this._jsPlumb.instance.addClass(this.canvas, t.cssClass); + } + _jp.OverlayCapableJsPlumbUIComponent.applyType(this, t); + }, + isEnabled: function () { + return this._jsPlumb.enabled; + }, + setEnabled: function (e) { + this._jsPlumb.enabled = e; + }, + cleanup: function () { + var anchorClass = this._jsPlumb.instance.endpointAnchorClassPrefix + (this._jsPlumb.currentAnchorClass ? "-" + this._jsPlumb.currentAnchorClass : ""); + _jp.removeClass(this.element, anchorClass); + this.anchor = null; + this.endpoint.cleanup(true); + this.endpoint.destroy(); + this.endpoint = null; + // drag/drop + this._jsPlumb.instance.destroyDraggable(this.canvas, "internal"); + this._jsPlumb.instance.destroyDroppable(this.canvas, "internal"); + }, + setHover: function (h) { + if (this.endpoint && this._jsPlumb && !this._jsPlumb.instance.isConnectionBeingDragged()) { + this.endpoint.setHover(h); + } + }, + isFull: function () { + return this._jsPlumb.maxConnections === 0 ? true : !(this.isFloating() || this._jsPlumb.maxConnections < 0 || this.connections.length < this._jsPlumb.maxConnections); + }, + /** + * private but needs to be exposed. + */ + isFloating: function () { + return this.anchor != null && this.anchor.isFloating; + }, + isConnectedTo: function (endpoint) { + var found = false; + if (endpoint) { + for (var i = 0; i < this.connections.length; i++) { + if (this.connections[i].endpoints[1] === endpoint || this.connections[i].endpoints[0] === endpoint) { + found = true; + break; + } + } + } + return found; + }, + getConnectionCost: function () { + return this._jsPlumb.connectionCost; + }, + setConnectionCost: function (c) { + this._jsPlumb.connectionCost = c; + }, + areConnectionsDirected: function () { + return this._jsPlumb.connectionsDirected; + }, + setConnectionsDirected: function (b) { + this._jsPlumb.connectionsDirected = b; + }, + setElementId: function (_elId) { + this.elementId = _elId; + this.anchor.elementId = _elId; + }, + setReferenceElement: function (_el) { + this.element = _jp.getElement(_el); + }, + setDragAllowedWhenFull: function (allowed) { + this.dragAllowedWhenFull = allowed; + }, + equals: function (endpoint) { + return this.anchor.equals(endpoint.anchor); + }, + getUuid: function () { + return this._jsPlumb.uuid; + }, + computeAnchor: function (params) { + return this.anchor.compute(params); + } + }); + + root.jsPlumbInstance.prototype.EndpointDropHandler = function (dhParams) { + return function (e) { + + var _jsPlumb = dhParams.jsPlumb; + + // remove the classes that are added dynamically. drop is neither forbidden nor allowed now that + // the drop is finishing. + dhParams.removeClass(_jsPlumb.endpointDropAllowedClass); + dhParams.removeClass(_jsPlumb.endpointDropForbiddenClass); + + var originalEvent = _jsPlumb.getDropEvent(arguments), + draggable = _jsPlumb.getDragObject(arguments), + id = _jsPlumb.getAttribute(draggable, "dragId"), + elId = _jsPlumb.getAttribute(draggable, "elId"), + scope = _jsPlumb.getAttribute(draggable, "originalScope"), + jpc = _jsPlumb.getFloatingConnectionFor(id); + + // if no active connection, bail. + if (jpc == null) { + return; + } + + // calculate if this is an existing connection. + var existingConnection = jpc.suspendedEndpoint != null; + + // if suspended endpoint exists but has been cleaned up, bail. This means it's an existing connection + // that has been detached and will shortly be discarded. + if (existingConnection && jpc.suspendedEndpoint._jsPlumb == null) { + return; + } + + // get the drop endpoint. for a normal connection this is just the one that would replace the currently + // floating endpoint. for a makeTarget this is a new endpoint that is created on drop. But we leave that to + // the handler to figure out. + var _ep = dhParams.getEndpoint(jpc); + + // If we're not given an endpoint to use, bail. + if (_ep == null) { + return; + } + + // if this is a drop back where the connection came from, mark it force reattach and + // return; the stop handler will reattach. without firing an event. + if (dhParams.isRedrop(jpc, dhParams)) { + jpc._forceReattach = true; + jpc.setHover(false); + if (dhParams.maybeCleanup) { + dhParams.maybeCleanup(_ep); + } + return; + } + + // ensure we dont bother trying to drop sources on non-source eps, and same for target. + var idx = _jsPlumb.getFloatingAnchorIndex(jpc); + if ((idx === 0 && !dhParams.isSource)|| (idx === 1 && !dhParams.isTarget)){ + if (dhParams.maybeCleanup) { + dhParams.maybeCleanup(_ep); + } + return; + } + + if (dhParams.onDrop) { + dhParams.onDrop(jpc); + } + + // restore the original scope if necessary (issue 57) + if (scope) { + _jsPlumb.setDragScope(draggable, scope); + } + + // if the target of the drop is full, fire an event (we abort below) + // makeTarget: keep. + var isFull = dhParams.isFull(e); + if (isFull) { + _ep.fire("maxConnections", { + endpoint: this, + connection: jpc, + maxConnections: _ep._jsPlumb.maxConnections + }, originalEvent); + } + // + // if endpoint enabled, not full, and matches the index of the floating endpoint... + if (!isFull && dhParams.enabled()) { + var _doContinue = true; + + // before testing for beforeDrop, reset the connection's source/target to be the actual DOM elements + // involved (that is, stash any temporary stuff used for dragging. but we need to keep it around in + // order that the anchor manager can clean things up properly). + if (idx === 0) { + jpc.floatingElement = jpc.source; + jpc.floatingId = jpc.sourceId; + jpc.floatingEndpoint = jpc.endpoints[0]; + jpc.floatingIndex = 0; + jpc.source = dhParams.element; + jpc.sourceId = _jsPlumb.getId(dhParams.element); + } else { + jpc.floatingElement = jpc.target; + jpc.floatingId = jpc.targetId; + jpc.floatingEndpoint = jpc.endpoints[1]; + jpc.floatingIndex = 1; + jpc.target = dhParams.element; + jpc.targetId = _jsPlumb.getId(dhParams.element); + } + + // if this is an existing connection and detach is not allowed we won't continue. The connection's + // endpoints have been reinstated; everything is back to how it was. + if (existingConnection && jpc.suspendedEndpoint.id !== _ep.id) { + if (!jpc.isDetachAllowed(jpc) || !jpc.endpoints[idx].isDetachAllowed(jpc) || !jpc.suspendedEndpoint.isDetachAllowed(jpc) || !_jsPlumb.checkCondition("beforeDetach", jpc)) { + _doContinue = false; + } + } + +// ------------ wrap the execution path in a function so we can support asynchronous beforeDrop + + var continueFunction = function (optionalData) { + // remove this jpc from the current endpoint, which is a floating endpoint that we will + // subsequently discard. + jpc.endpoints[idx].detachFromConnection(jpc); + + // if there's a suspended endpoint, detach it from the connection. + if (jpc.suspendedEndpoint) { + jpc.suspendedEndpoint.detachFromConnection(jpc); + } + + jpc.endpoints[idx] = _ep; + _ep.addConnection(jpc); + + // copy our parameters in to the connection: + var params = _ep.getParameters(); + for (var aParam in params) { + jpc.setParameter(aParam, params[aParam]); + } + + if (!existingConnection) { + // if not an existing connection and + if (params.draggable) { + _jsPlumb.initDraggable(this.element, dhParams.dragOptions, "internal", _jsPlumb); + } + } + else { + var suspendedElementId = jpc.suspendedEndpoint.elementId; + _jsPlumb.fireMoveEvent({ + index: idx, + originalSourceId: idx === 0 ? suspendedElementId : jpc.sourceId, + newSourceId: idx === 0 ? _ep.elementId : jpc.sourceId, + originalTargetId: idx === 1 ? suspendedElementId : jpc.targetId, + newTargetId: idx === 1 ? _ep.elementId : jpc.targetId, + originalSourceEndpoint: idx === 0 ? jpc.suspendedEndpoint : jpc.endpoints[0], + newSourceEndpoint: idx === 0 ? _ep : jpc.endpoints[0], + originalTargetEndpoint: idx === 1 ? jpc.suspendedEndpoint : jpc.endpoints[1], + newTargetEndpoint: idx === 1 ? _ep : jpc.endpoints[1], + connection: jpc + }, originalEvent); + } + + if (idx === 1) { + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.floatingId, jpc.targetId, jpc); + } + else { + _jsPlumb.anchorManager.sourceChanged(jpc.floatingId, jpc.sourceId, jpc, jpc.source); + } + + // when makeSource has uniqueEndpoint:true, we want to create connections with new endpoints + // that are subsequently deleted. So makeSource sets `finalEndpoint`, which is the Endpoint to + // which the connection should be attached. The `detachFromConnection` call below results in the + // temporary endpoint being cleaned up. + if (jpc.endpoints[0].finalEndpoint) { + var _toDelete = jpc.endpoints[0]; + _toDelete.detachFromConnection(jpc); + jpc.endpoints[0] = jpc.endpoints[0].finalEndpoint; + jpc.endpoints[0].addConnection(jpc); + } + + // if optionalData was given, merge it onto the connection's data. + if (_ju.isObject(optionalData)) { + jpc.mergeData(optionalData); + } + // finalise will inform the anchor manager and also add to + // connectionsByScope if necessary. + _jsPlumb.finaliseConnection(jpc, null, originalEvent, false); + jpc.setHover(false); + + // SP continuous anchor flush + _jsPlumb.revalidate(jpc.endpoints[0].element); + + }.bind(this); + + var dontContinueFunction = function () { + // otherwise just put it back on the endpoint it was on before the drag. + if (jpc.suspendedEndpoint) { + jpc.endpoints[idx] = jpc.suspendedEndpoint; + jpc.setHover(false); + jpc._forceDetach = true; + if (idx === 0) { + jpc.source = jpc.suspendedEndpoint.element; + jpc.sourceId = jpc.suspendedEndpoint.elementId; + } else { + jpc.target = jpc.suspendedEndpoint.element; + jpc.targetId = jpc.suspendedEndpoint.elementId; + } + jpc.suspendedEndpoint.addConnection(jpc); + + // TODO checkSanity + if (idx === 1) { + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.floatingId, jpc.targetId, jpc); + } + else { + _jsPlumb.anchorManager.sourceChanged(jpc.floatingId, jpc.sourceId, jpc, jpc.source); + } + + _jsPlumb.repaint(jpc.sourceId); + jpc._forceDetach = false; + } + }; + +// -------------------------------------- + // now check beforeDrop. this will be available only on Endpoints that are setup to + // have a beforeDrop condition (although, secretly, under the hood all Endpoints and + // the Connection have them, because they are on jsPlumbUIComponent. shhh!), because + // it only makes sense to have it on a target endpoint. + _doContinue = _doContinue && dhParams.isDropAllowed(jpc.sourceId, jpc.targetId, jpc.scope, jpc, _ep);// && jpc.pending; + + if (_doContinue) { + continueFunction(_doContinue); + return true; + } + else { + dontContinueFunction(); + } + } + + if (dhParams.maybeCleanup) { + dhParams.maybeCleanup(_ep); + } + + _jsPlumb.currentlyDragging = false; + }; + }; +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the code for Connections. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, + _jp = root.jsPlumb, + _ju = root.jsPlumbUtil; + + var makeConnector = function (_jsPlumb, renderMode, connectorName, connectorArgs, forComponent) { + // first make sure we have a cache for the specified renderer + _jp.Connectors[renderMode] = _jp.Connectors[renderMode] || {}; + + // now see if the one we want exists; if not we will try to make it + if (_jp.Connectors[renderMode][connectorName] == null) { + + if (_jp.Connectors[connectorName] == null) { + if (!_jsPlumb.Defaults.DoNotThrowErrors) { + throw new TypeError("jsPlumb: unknown connector type '" + connectorName + "'"); + } else { + return null; + } + } + + _jp.Connectors[renderMode][connectorName] = function() { + _jp.Connectors[connectorName].apply(this, arguments); + _jp.ConnectorRenderers[renderMode].apply(this, arguments); + }; + + _ju.extend(_jp.Connectors[renderMode][connectorName], [ _jp.Connectors[connectorName], _jp.ConnectorRenderers[renderMode]]); + + } + + return new _jp.Connectors[renderMode][connectorName](connectorArgs, forComponent); + }, + _makeAnchor = function (anchorParams, elementId, _jsPlumb) { + return (anchorParams) ? _jsPlumb.makeAnchor(anchorParams, elementId, _jsPlumb) : null; + }, + _updateConnectedClass = function (conn, element, _jsPlumb, remove) { + if (element != null) { + element._jsPlumbConnections = element._jsPlumbConnections || {}; + if (remove) { + delete element._jsPlumbConnections[conn.id]; + } + else { + element._jsPlumbConnections[conn.id] = true; + } + + if (_ju.isEmpty(element._jsPlumbConnections)) { + _jsPlumb.removeClass(element, _jsPlumb.connectedClass); + } + else { + _jsPlumb.addClass(element, _jsPlumb.connectedClass); + } + } + }; + + _jp.Connection = function (params) { + var _newEndpoint = params.newEndpoint; + + this.id = params.id; + this.connector = null; + this.idPrefix = "_jsplumb_c_"; + this.defaultLabelLocation = 0.5; + this.defaultOverlayKeys = ["Overlays", "ConnectionOverlays"]; + // if a new connection is the result of moving some existing connection, params.previousConnection + // will have that Connection in it. listeners for the jsPlumbConnection event can look for that + // member and take action if they need to. + this.previousConnection = params.previousConnection; + this.source = _jp.getElement(params.source); + this.target = _jp.getElement(params.target); + + + _jp.OverlayCapableJsPlumbUIComponent.apply(this, arguments); + + // sourceEndpoint and targetEndpoint override source/target, if they are present. but + // source is not overridden if the Endpoint has declared it is not the final target of a connection; + // instead we use the source that the Endpoint declares will be the final source element. + if (params.sourceEndpoint) { + this.source = params.sourceEndpoint.getElement(); + this.sourceId = params.sourceEndpoint.elementId; + } else { + this.sourceId = this._jsPlumb.instance.getId(this.source); + } + + if (params.targetEndpoint) { + this.target = params.targetEndpoint.getElement(); + this.targetId = params.targetEndpoint.elementId; + } else { + this.targetId = this._jsPlumb.instance.getId(this.target); + } + + + this.scope = params.scope; // scope may have been passed in to the connect call. if it wasn't, we will pull it from the source endpoint, after having initialised the endpoints. + this.endpoints = []; + this.endpointStyles = []; + + var _jsPlumb = this._jsPlumb.instance; + + _jsPlumb.manage(this.sourceId, this.source); + _jsPlumb.manage(this.targetId, this.target); + + this._jsPlumb.visible = true; + + this._jsPlumb.params = { + cssClass: params.cssClass, + container: params.container, + "pointer-events": params["pointer-events"], + editorParams: params.editorParams, + overlays: params.overlays + }; + this._jsPlumb.lastPaintedAt = null; + + // listen to mouseover and mouseout events passed from the container delegate. + this.bind("mouseover", function () { + this.setHover(true); + }.bind(this)); + this.bind("mouseout", function () { + this.setHover(false); + }.bind(this)); + + +// INITIALISATION CODE + + this.makeEndpoint = function (isSource, el, elId, ep, definition) { + elId = elId || this._jsPlumb.instance.getId(el); + return this.prepareEndpoint(_jsPlumb, _newEndpoint, this, ep, isSource ? 0 : 1, params, el, elId, definition); + }; + + // if type given, get the endpoint definitions mapping to that type from the jsplumb instance, and use those. + // we apply types at the end of this constructor but endpoints are only honoured in a type definition at + // create time. + if (params.type) { + params.endpoints = params.endpoints || this._jsPlumb.instance.deriveEndpointAndAnchorSpec(params.type).endpoints; + } + + var eS = this.makeEndpoint(true, this.source, this.sourceId, params.sourceEndpoint), + eT = this.makeEndpoint(false, this.target, this.targetId, params.targetEndpoint); + + if (eS) { + _ju.addToList(params.endpointsByElement, this.sourceId, eS); + } + if (eT) { + _ju.addToList(params.endpointsByElement, this.targetId, eT); + } + // if scope not set, set it to be the scope for the source endpoint. + if (!this.scope) { + this.scope = this.endpoints[0].scope; + } + + // if explicitly told to (or not to) delete endpoints when empty, override endpoint's preferences + if (params.deleteEndpointsOnEmpty != null) { + this.endpoints[0].setDeleteOnEmpty(params.deleteEndpointsOnEmpty); + this.endpoints[1].setDeleteOnEmpty(params.deleteEndpointsOnEmpty); + } + +// -------------------------- DEFAULT TYPE --------------------------------------------- + + // DETACHABLE + var _detachable = _jsPlumb.Defaults.ConnectionsDetachable; + if (params.detachable === false) { + _detachable = false; + } + if (this.endpoints[0].connectionsDetachable === false) { + _detachable = false; + } + if (this.endpoints[1].connectionsDetachable === false) { + _detachable = false; + } + // REATTACH + var _reattach = params.reattach || this.endpoints[0].reattachConnections || this.endpoints[1].reattachConnections || _jsPlumb.Defaults.ReattachConnections; + + this.appendToDefaultType({ + detachable: _detachable, + reattach: _reattach, + paintStyle:this.endpoints[0].connectorStyle || this.endpoints[1].connectorStyle || params.paintStyle || _jsPlumb.Defaults.PaintStyle || _jp.Defaults.PaintStyle, + hoverPaintStyle:this.endpoints[0].connectorHoverStyle || this.endpoints[1].connectorHoverStyle || params.hoverPaintStyle || _jsPlumb.Defaults.HoverPaintStyle || _jp.Defaults.HoverPaintStyle + }); + + var _suspendedAt = _jsPlumb.getSuspendedAt(); + if (!_jsPlumb.isSuspendDrawing()) { + // paint the endpoints + var myInfo = _jsPlumb.getCachedData(this.sourceId), + myOffset = myInfo.o, myWH = myInfo.s, + otherInfo = _jsPlumb.getCachedData(this.targetId), + otherOffset = otherInfo.o, + otherWH = otherInfo.s, + initialTimestamp = _suspendedAt || _jsPlumb.timestamp(), + anchorLoc = this.endpoints[0].anchor.compute({ + xy: [ myOffset.left, myOffset.top ], wh: myWH, element: this.endpoints[0], + elementId: this.endpoints[0].elementId, + txy: [ otherOffset.left, otherOffset.top ], twh: otherWH, tElement: this.endpoints[1], + timestamp: initialTimestamp + }); + + this.endpoints[0].paint({ anchorLoc: anchorLoc, timestamp: initialTimestamp }); + + anchorLoc = this.endpoints[1].anchor.compute({ + xy: [ otherOffset.left, otherOffset.top ], wh: otherWH, element: this.endpoints[1], + elementId: this.endpoints[1].elementId, + txy: [ myOffset.left, myOffset.top ], twh: myWH, tElement: this.endpoints[0], + timestamp: initialTimestamp + }); + this.endpoints[1].paint({ anchorLoc: anchorLoc, timestamp: initialTimestamp }); + } + + this.getTypeDescriptor = function () { + return "connection"; + }; + this.getAttachedElements = function () { + return this.endpoints; + }; + + this.isDetachable = function (ep) { + return this._jsPlumb.detachable === false ? false : ep != null ? ep.connectionsDetachable === true : this._jsPlumb.detachable === true; + }; + this.setDetachable = function (detachable) { + this._jsPlumb.detachable = detachable === true; + }; + this.isReattach = function () { + return this._jsPlumb.reattach === true || this.endpoints[0].reattachConnections === true || this.endpoints[1].reattachConnections === true; + }; + this.setReattach = function (reattach) { + this._jsPlumb.reattach = reattach === true; + }; + +// END INITIALISATION CODE + + +// COST + DIRECTIONALITY + // if cost not supplied, try to inherit from source endpoint + this._jsPlumb.cost = params.cost || this.endpoints[0].getConnectionCost(); + this._jsPlumb.directed = params.directed; + // inherit directed flag if set no source endpoint + if (params.directed == null) { + this._jsPlumb.directed = this.endpoints[0].areConnectionsDirected(); + } +// END COST + DIRECTIONALITY + +// PARAMETERS + // merge all the parameters objects into the connection. parameters set + // on the connection take precedence; then source endpoint params, then + // finally target endpoint params. + var _p = _jp.extend({}, this.endpoints[1].getParameters()); + _jp.extend(_p, this.endpoints[0].getParameters()); + _jp.extend(_p, this.getParameters()); + this.setParameters(_p); +// END PARAMETERS + +// PAINTING + + this.setConnector(this.endpoints[0].connector || this.endpoints[1].connector || params.connector || _jsPlumb.Defaults.Connector || _jp.Defaults.Connector, true); + var data = params.data == null || !_ju.isObject(params.data) ? {} : params.data; + this.getData = function() { return data; }; + this.setData = function(d) { data = d || {}; }; + this.mergeData = function(d) { data = _jp.extend(data, d); }; + + // the very last thing we do is apply types, if there are any. + var _types = [ "default", this.endpoints[0].connectionType, this.endpoints[1].connectionType, params.type ].join(" "); + if (/[^\s]/.test(_types)) { + this.addType(_types, params.data, true); + } + + this.updateConnectedClass(); + +// END PAINTING + }; + + _ju.extend(_jp.Connection, _jp.OverlayCapableJsPlumbUIComponent, { + applyType: function (t, doNotRepaint, typeMap) { + + var _connector = null; + if (t.connector != null) { + _connector = this.getCachedTypeItem("connector", typeMap.connector); + if (_connector == null) { + _connector = this.prepareConnector(t.connector, typeMap.connector); + this.cacheTypeItem("connector", _connector, typeMap.connector); + } + this.setPreparedConnector(_connector); + } + + // none of these things result in the creation of objects so can be ignored. + if (t.detachable != null) { + this.setDetachable(t.detachable); + } + if (t.reattach != null) { + this.setReattach(t.reattach); + } + if (t.scope) { + this.scope = t.scope; + } + + if (t.cssClass != null && this.canvas) { + this._jsPlumb.instance.addClass(this.canvas, t.cssClass); + } + + var _anchors = null; + // this also results in the creation of objects. + if (t.anchor) { + // note that even if the param was anchor, we store `anchors`. + _anchors = this.getCachedTypeItem("anchors", typeMap.anchor); + if (_anchors == null) { + _anchors = [ this._jsPlumb.instance.makeAnchor(t.anchor), this._jsPlumb.instance.makeAnchor(t.anchor) ]; + this.cacheTypeItem("anchors", _anchors, typeMap.anchor); + } + } + else if (t.anchors) { + _anchors = this.getCachedTypeItem("anchors", typeMap.anchors); + if (_anchors == null) { + _anchors = [ + this._jsPlumb.instance.makeAnchor(t.anchors[0]), + this._jsPlumb.instance.makeAnchor(t.anchors[1]) + ]; + this.cacheTypeItem("anchors", _anchors, typeMap.anchors); + } + } + if (_anchors != null) { + this.endpoints[0].anchor = _anchors[0]; + this.endpoints[1].anchor = _anchors[1]; + if (this.endpoints[1].anchor.isDynamic) { + this._jsPlumb.instance.repaint(this.endpoints[1].elementId); + } + } + + _jp.OverlayCapableJsPlumbUIComponent.applyType(this, t); + }, + addClass: function (c, informEndpoints) { + if (informEndpoints) { + this.endpoints[0].addClass(c); + this.endpoints[1].addClass(c); + if (this.suspendedEndpoint) { + this.suspendedEndpoint.addClass(c); + } + } + if (this.connector) { + this.connector.addClass(c); + } + }, + removeClass: function (c, informEndpoints) { + if (informEndpoints) { + this.endpoints[0].removeClass(c); + this.endpoints[1].removeClass(c); + if (this.suspendedEndpoint) { + this.suspendedEndpoint.removeClass(c); + } + } + if (this.connector) { + this.connector.removeClass(c); + } + }, + isVisible: function () { + return this._jsPlumb.visible; + }, + setVisible: function (v) { + this._jsPlumb.visible = v; + if (this.connector) { + this.connector.setVisible(v); + } + this.repaint(); + }, + cleanup: function () { + this.updateConnectedClass(true); + this.endpoints = null; + this.source = null; + this.target = null; + if (this.connector != null) { + this.connector.cleanup(true); + this.connector.destroy(true); + } + this.connector = null; + }, + updateConnectedClass:function(remove) { + if (this._jsPlumb) { + _updateConnectedClass(this, this.source, this._jsPlumb.instance, remove); + _updateConnectedClass(this, this.target, this._jsPlumb.instance, remove); + } + }, + setHover: function (state) { + if (this.connector && this._jsPlumb && !this._jsPlumb.instance.isConnectionBeingDragged()) { + this.connector.setHover(state); + root.jsPlumb[state ? "addClass" : "removeClass"](this.source, this._jsPlumb.instance.hoverSourceClass); + root.jsPlumb[state ? "addClass" : "removeClass"](this.target, this._jsPlumb.instance.hoverTargetClass); + } + }, + getUuids:function() { + return [ this.endpoints[0].getUuid(), this.endpoints[1].getUuid() ]; + }, + getCost: function () { + return this._jsPlumb ? this._jsPlumb.cost : -Infinity; + }, + setCost: function (c) { + this._jsPlumb.cost = c; + }, + isDirected: function () { + return this._jsPlumb.directed; + }, + getConnector: function () { + return this.connector; + }, + prepareConnector:function(connectorSpec, typeId) { + var connectorArgs = { + _jsPlumb: this._jsPlumb.instance, + cssClass: this._jsPlumb.params.cssClass, + container: this._jsPlumb.params.container, + "pointer-events": this._jsPlumb.params["pointer-events"] + }, + renderMode = this._jsPlumb.instance.getRenderMode(), + connector; + + if (_ju.isString(connectorSpec)) { + connector = makeConnector(this._jsPlumb.instance, renderMode, connectorSpec, connectorArgs, this); + } // lets you use a string as shorthand. + else if (_ju.isArray(connectorSpec)) { + if (connectorSpec.length === 1) { + connector = makeConnector(this._jsPlumb.instance, renderMode, connectorSpec[0], connectorArgs, this); + } + else { + connector = makeConnector(this._jsPlumb.instance, renderMode, connectorSpec[0], _ju.merge(connectorSpec[1], connectorArgs), this); + } + } + if (typeId != null) { + connector.typeId = typeId; + } + return connector; + }, + setPreparedConnector: function(connector, doNotRepaint, doNotChangeListenerComponent, typeId) { + + if (this.connector !== connector) { + + var previous, previousClasses = ""; + // the connector will not be cleaned up if it was set as part of a type, because `typeId` will be set on it + // and we havent passed in `true` for "force" here. + if (this.connector != null) { + previous = this.connector; + previousClasses = previous.getClass(); + this.connector.cleanup(); + this.connector.destroy(); + } + + this.connector = connector; + if (typeId) { + this.cacheTypeItem("connector", connector, typeId); + } + + this.canvas = this.connector.canvas; + this.bgCanvas = this.connector.bgCanvas; + + this.connector.reattach(this._jsPlumb.instance); + + // put classes from prior connector onto the canvas + this.addClass(previousClasses); + + // new: instead of binding listeners per connector, we now just have one delegate on the container. + // so for that handler we set the connection as the '_jsPlumb' member of the canvas element, and + // bgCanvas, if it exists, which it does right now in the VML renderer, so it won't from v 2.0.0 onwards. + if (this.canvas) { + this.canvas._jsPlumb = this; + } + if (this.bgCanvas) { + this.bgCanvas._jsPlumb = this; + } + + if (previous != null) { + var o = this.getOverlays(); + for (var i = 0; i < o.length; i++) { + if (o[i].transfer) { + o[i].transfer(this.connector); + } + } + } + + if (!doNotChangeListenerComponent) { + this.setListenerComponent(this.connector); + } + if (!doNotRepaint) { + this.repaint(); + } + } + }, + setConnector: function (connectorSpec, doNotRepaint, doNotChangeListenerComponent, typeId) { + var connector = this.prepareConnector(connectorSpec, typeId); + this.setPreparedConnector(connector, doNotRepaint, doNotChangeListenerComponent, typeId); + }, + paint: function (params) { + + if (!this._jsPlumb.instance.isSuspendDrawing() && this._jsPlumb.visible) { + params = params || {}; + var timestamp = params.timestamp, + // if the moving object is not the source we must transpose the two references. + swap = false, + tId = swap ? this.sourceId : this.targetId, sId = swap ? this.targetId : this.sourceId, + tIdx = swap ? 0 : 1, sIdx = swap ? 1 : 0; + + if (timestamp == null || timestamp !== this._jsPlumb.lastPaintedAt) { + var sourceInfo = this._jsPlumb.instance.updateOffset({elId:sId}).o, + targetInfo = this._jsPlumb.instance.updateOffset({elId:tId}).o, + sE = this.endpoints[sIdx], tE = this.endpoints[tIdx]; + + var sAnchorP = sE.anchor.getCurrentLocation({xy: [sourceInfo.left, sourceInfo.top], wh: [sourceInfo.width, sourceInfo.height], element: sE, timestamp: timestamp}), + tAnchorP = tE.anchor.getCurrentLocation({xy: [targetInfo.left, targetInfo.top], wh: [targetInfo.width, targetInfo.height], element: tE, timestamp: timestamp}); + + this.connector.resetBounds(); + + this.connector.compute({ + sourcePos: sAnchorP, + targetPos: tAnchorP, + sourceOrientation:sE.anchor.getOrientation(sE), + targetOrientation:tE.anchor.getOrientation(tE), + sourceEndpoint: this.endpoints[sIdx], + targetEndpoint: this.endpoints[tIdx], + "stroke-width": this._jsPlumb.paintStyleInUse.strokeWidth, + sourceInfo: sourceInfo, + targetInfo: targetInfo + }); + + var overlayExtents = { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity }; + + // compute overlays. we do this first so we can get their placements, and adjust the + // container if needs be (if an overlay would be clipped) + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays.hasOwnProperty(i)) { + var o = this._jsPlumb.overlays[i]; + if (o.isVisible()) { + this._jsPlumb.overlayPlacements[i] = o.draw(this.connector, this._jsPlumb.paintStyleInUse, this.getAbsoluteOverlayPosition(o)); + overlayExtents.minX = Math.min(overlayExtents.minX, this._jsPlumb.overlayPlacements[i].minX); + overlayExtents.maxX = Math.max(overlayExtents.maxX, this._jsPlumb.overlayPlacements[i].maxX); + overlayExtents.minY = Math.min(overlayExtents.minY, this._jsPlumb.overlayPlacements[i].minY); + overlayExtents.maxY = Math.max(overlayExtents.maxY, this._jsPlumb.overlayPlacements[i].maxY); + } + } + } + + var lineWidth = parseFloat(this._jsPlumb.paintStyleInUse.strokeWidth || 1) / 2, + outlineWidth = parseFloat(this._jsPlumb.paintStyleInUse.strokeWidth || 0), + extents = { + xmin: Math.min(this.connector.bounds.minX - (lineWidth + outlineWidth), overlayExtents.minX), + ymin: Math.min(this.connector.bounds.minY - (lineWidth + outlineWidth), overlayExtents.minY), + xmax: Math.max(this.connector.bounds.maxX + (lineWidth + outlineWidth), overlayExtents.maxX), + ymax: Math.max(this.connector.bounds.maxY + (lineWidth + outlineWidth), overlayExtents.maxY) + }; + // paint the connector. + this.connector.paintExtents = extents; + this.connector.paint(this._jsPlumb.paintStyleInUse, null, extents); + // and then the overlays + for (var j in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays.hasOwnProperty(j)) { + var p = this._jsPlumb.overlays[j]; + if (p.isVisible()) { + p.paint(this._jsPlumb.overlayPlacements[j], extents); + } + } + } + } + this._jsPlumb.lastPaintedAt = timestamp; + } + }, + repaint: function (params) { + var p = jsPlumb.extend(params || {}, {}); + p.elId = this.sourceId; + this.paint(p); + }, + prepareEndpoint: function (_jsPlumb, _newEndpoint, conn, existing, index, params, element, elementId, definition) { + var e; + if (existing) { + conn.endpoints[index] = existing; + existing.addConnection(conn); + } else { + if (!params.endpoints) { + params.endpoints = [ null, null ]; + } + var ep = definition || params.endpoints[index] || params.endpoint || _jsPlumb.Defaults.Endpoints[index] || _jp.Defaults.Endpoints[index] || _jsPlumb.Defaults.Endpoint || _jp.Defaults.Endpoint; + if (!params.endpointStyles) { + params.endpointStyles = [ null, null ]; + } + if (!params.endpointHoverStyles) { + params.endpointHoverStyles = [ null, null ]; + } + var es = params.endpointStyles[index] || params.endpointStyle || _jsPlumb.Defaults.EndpointStyles[index] || _jp.Defaults.EndpointStyles[index] || _jsPlumb.Defaults.EndpointStyle || _jp.Defaults.EndpointStyle; + // Endpoints derive their fill from the connector's stroke, if no fill was specified. + if (es.fill == null && params.paintStyle != null) { + es.fill = params.paintStyle.stroke; + } + + if (es.outlineStroke == null && params.paintStyle != null) { + es.outlineStroke = params.paintStyle.outlineStroke; + } + if (es.outlineWidth == null && params.paintStyle != null) { + es.outlineWidth = params.paintStyle.outlineWidth; + } + + var ehs = params.endpointHoverStyles[index] || params.endpointHoverStyle || _jsPlumb.Defaults.EndpointHoverStyles[index] || _jp.Defaults.EndpointHoverStyles[index] || _jsPlumb.Defaults.EndpointHoverStyle || _jp.Defaults.EndpointHoverStyle; + // endpoint hover fill style is derived from connector's hover stroke style + if (params.hoverPaintStyle != null) { + if (ehs == null) { + ehs = {}; + } + if (ehs.fill == null) { + ehs.fill = params.hoverPaintStyle.stroke; + } + } + var a = params.anchors ? params.anchors[index] : + params.anchor ? params.anchor : + _makeAnchor(_jsPlumb.Defaults.Anchors[index], elementId, _jsPlumb) || + _makeAnchor(_jp.Defaults.Anchors[index], elementId, _jsPlumb) || + _makeAnchor(_jsPlumb.Defaults.Anchor, elementId, _jsPlumb) || + _makeAnchor(_jp.Defaults.Anchor, elementId, _jsPlumb), + u = params.uuids ? params.uuids[index] : null; + + e = _newEndpoint({ + paintStyle: es, hoverPaintStyle: ehs, endpoint: ep, connections: [ conn ], + uuid: u, anchor: a, source: element, scope: params.scope, + reattach: params.reattach || _jsPlumb.Defaults.ReattachConnections, + detachable: params.detachable || _jsPlumb.Defaults.ConnectionsDetachable + }); + if (existing == null) { + e.setDeleteOnEmpty(true); + } + conn.endpoints[index] = e; + + if (params.drawEndpoints === false) { + e.setVisible(false, true, true); + } + + } + return e; + }, + replaceEndpoint:function(idx, endpointDef) { + + var current = this.endpoints[idx], + elId = current.elementId, + ebe = this._jsPlumb.instance.getEndpoints(elId), + _idx = ebe.indexOf(current), + _new = this.makeEndpoint(idx === 0, current.element, elId, null, endpointDef); + + this.endpoints[idx] = _new; + + ebe.splice(_idx, 1, _new); + this._jsPlumb.instance.deleteObject({endpoint:current, deleteAttachedObjects:false}); + this._jsPlumb.instance.fire("endpointReplaced", {previous:current, current:_new}); + + this._jsPlumb.instance.anchorManager.updateOtherEndpoint(this.endpoints[0].elementId, this.endpoints[1].elementId, this.endpoints[1].elementId, this); + + } + + }); // END Connection class +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the code for creating and manipulating anchors. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + + var root = this, + _ju = root.jsPlumbUtil, + _jp = root.jsPlumb; + + // + // manages anchors for all elements. + // + _jp.AnchorManager = function (params) { + var _amEndpoints = {}, + continuousAnchorLocations = {}, + continuousAnchorOrientations = {}, + connectionsByElementId = {}, + self = this, + anchorLists = {}, + jsPlumbInstance = params.jsPlumbInstance, + floatingConnections = {}, + // used by placeAnchors function + placeAnchorsOnLine = function (desc, elementDimensions, elementPosition, connections, horizontal, otherMultiplier, reverse) { + var a = [], step = elementDimensions[horizontal ? 0 : 1] / (connections.length + 1); + + for (var i = 0; i < connections.length; i++) { + var val = (i + 1) * step, other = otherMultiplier * elementDimensions[horizontal ? 1 : 0]; + if (reverse) { + val = elementDimensions[horizontal ? 0 : 1] - val; + } + + var dx = (horizontal ? val : other), x = elementPosition[0] + dx, xp = dx / elementDimensions[0], + dy = (horizontal ? other : val), y = elementPosition[1] + dy, yp = dy / elementDimensions[1]; + + a.push([ x, y, xp, yp, connections[i][1], connections[i][2] ]); + } + + return a; + }, + rightAndBottomSort = function(a, b) { + return b[0][0] - a[0][0]; + }, + // used by edgeSortFunctions + leftAndTopSort = function (a, b) { + var p1 = a[0][0] < 0 ? -Math.PI - a[0][0] : Math.PI - a[0][0], + p2 = b[0][0] < 0 ? -Math.PI - b[0][0] : Math.PI - b[0][0]; + + return p1 - p2; + }, + // used by placeAnchors + edgeSortFunctions = { + "top":leftAndTopSort, + "right": rightAndBottomSort, + "bottom": rightAndBottomSort, + "left": leftAndTopSort + }, + // used by placeAnchors + _sortHelper = function (_array, _fn) { + return _array.sort(_fn); + }, + // used by AnchorManager.redraw + placeAnchors = function (elementId, _anchorLists) { + var cd = jsPlumbInstance.getCachedData(elementId), sS = cd.s, sO = cd.o, + placeSomeAnchors = function (desc, elementDimensions, elementPosition, unsortedConnections, isHorizontal, otherMultiplier, orientation) { + if (unsortedConnections.length > 0) { + var sc = _sortHelper(unsortedConnections, edgeSortFunctions[desc]), // puts them in order based on the target element's pos on screen + reverse = desc === "right" || desc === "top", + anchors = placeAnchorsOnLine(desc, elementDimensions, + elementPosition, sc, + isHorizontal, otherMultiplier, reverse); + + // takes a computed anchor position and adjusts it for parent offset and scroll, then stores it. + var _setAnchorLocation = function (endpoint, anchorPos) { + continuousAnchorLocations[endpoint.id] = [ anchorPos[0], anchorPos[1], anchorPos[2], anchorPos[3] ]; + continuousAnchorOrientations[endpoint.id] = orientation; + }; + + for (var i = 0; i < anchors.length; i++) { + var c = anchors[i][4], weAreSource = c.endpoints[0].elementId === elementId, weAreTarget = c.endpoints[1].elementId === elementId; + if (weAreSource) { + _setAnchorLocation(c.endpoints[0], anchors[i]); + } + if (weAreTarget) { + _setAnchorLocation(c.endpoints[1], anchors[i]); + } + } + } + }; + + placeSomeAnchors("bottom", sS, [sO.left, sO.top], _anchorLists.bottom, true, 1, [0, 1]); + placeSomeAnchors("top", sS, [sO.left, sO.top], _anchorLists.top, true, 0, [0, -1]); + placeSomeAnchors("left", sS, [sO.left, sO.top], _anchorLists.left, false, 0, [-1, 0]); + placeSomeAnchors("right", sS, [sO.left, sO.top], _anchorLists.right, false, 1, [1, 0]); + }; + + this.reset = function () { + _amEndpoints = {}; + connectionsByElementId = {}; + anchorLists = {}; + }; + this.addFloatingConnection = function (key, conn) { + floatingConnections[key] = conn; + }; + this.removeFloatingConnection = function (key) { + delete floatingConnections[key]; + }; + this.newConnection = function (conn) { + var sourceId = conn.sourceId, targetId = conn.targetId, + ep = conn.endpoints, + doRegisterTarget = true, + registerConnection = function (otherIndex, otherEndpoint, otherAnchor, elId, c) { + if ((sourceId === targetId) && otherAnchor.isContinuous) { + // remove the target endpoint's canvas. we dont need it. + conn._jsPlumb.instance.removeElement(ep[1].canvas); + doRegisterTarget = false; + } + _ju.addToList(connectionsByElementId, elId, [c, otherEndpoint, otherAnchor.constructor === _jp.DynamicAnchor]); + }; + + registerConnection(0, ep[0], ep[0].anchor, targetId, conn); + if (doRegisterTarget) { + registerConnection(1, ep[1], ep[1].anchor, sourceId, conn); + } + }; + var removeEndpointFromAnchorLists = function (endpoint) { + (function (list, eId) { + if (list) { // transient anchors dont get entries in this list. + var f = function (e) { + return e[4] === eId; + }; + _ju.removeWithFunction(list.top, f); + _ju.removeWithFunction(list.left, f); + _ju.removeWithFunction(list.bottom, f); + _ju.removeWithFunction(list.right, f); + } + })(anchorLists[endpoint.elementId], endpoint.id); + }; + this.connectionDetached = function (connInfo, doNotRedraw) { + var connection = connInfo.connection || connInfo, + sourceId = connInfo.sourceId, + targetId = connInfo.targetId, + ep = connection.endpoints, + removeConnection = function (otherIndex, otherEndpoint, otherAnchor, elId, c) { + _ju.removeWithFunction(connectionsByElementId[elId], function (_c) { + return _c[0].id === c.id; + }); + }; + + removeConnection(1, ep[1], ep[1].anchor, sourceId, connection); + removeConnection(0, ep[0], ep[0].anchor, targetId, connection); + if (connection.floatingId) { + removeConnection(connection.floatingIndex, connection.floatingEndpoint, connection.floatingEndpoint.anchor, connection.floatingId, connection); + removeEndpointFromAnchorLists(connection.floatingEndpoint); + } + + // remove from anchorLists + removeEndpointFromAnchorLists(connection.endpoints[0]); + removeEndpointFromAnchorLists(connection.endpoints[1]); + + if (!doNotRedraw) { + self.redraw(connection.sourceId); + if (connection.targetId !== connection.sourceId) { + self.redraw(connection.targetId); + } + } + }; + this.add = function (endpoint, elementId) { + _ju.addToList(_amEndpoints, elementId, endpoint); + }; + this.changeId = function (oldId, newId) { + connectionsByElementId[newId] = connectionsByElementId[oldId]; + _amEndpoints[newId] = _amEndpoints[oldId]; + delete connectionsByElementId[oldId]; + delete _amEndpoints[oldId]; + }; + this.getConnectionsFor = function (elementId) { + return connectionsByElementId[elementId] || []; + }; + this.getEndpointsFor = function (elementId) { + return _amEndpoints[elementId] || []; + }; + this.deleteEndpoint = function (endpoint) { + _ju.removeWithFunction(_amEndpoints[endpoint.elementId], function (e) { + return e.id === endpoint.id; + }); + removeEndpointFromAnchorLists(endpoint); + }; + this.clearFor = function (elementId) { + delete _amEndpoints[elementId]; + _amEndpoints[elementId] = []; + }; + // updates the given anchor list by either updating an existing anchor's info, or adding it. this function + // also removes the anchor from its previous list, if the edge it is on has changed. + // all connections found along the way (those that are connected to one of the faces this function + // operates on) are added to the connsToPaint list, as are their endpoints. in this way we know to repaint + // them wthout having to calculate anything else about them. + var _updateAnchorList = function (lists, theta, order, conn, aBoolean, otherElId, idx, reverse, edgeId, elId, connsToPaint, endpointsToPaint) { + // first try to find the exact match, but keep track of the first index of a matching element id along the way.s + var exactIdx = -1, + firstMatchingElIdx = -1, + endpoint = conn.endpoints[idx], + endpointId = endpoint.id, + oIdx = [1, 0][idx], + values = [ + [ theta, order ], + conn, + aBoolean, + otherElId, + endpointId + ], + listToAddTo = lists[edgeId], + listToRemoveFrom = endpoint._continuousAnchorEdge ? lists[endpoint._continuousAnchorEdge] : null, + i, + candidate; + + if (listToRemoveFrom) { + var rIdx = _ju.findWithFunction(listToRemoveFrom, function (e) { + return e[4] === endpointId; + }); + if (rIdx !== -1) { + listToRemoveFrom.splice(rIdx, 1); + // get all connections from this list + for (i = 0; i < listToRemoveFrom.length; i++) { + candidate = listToRemoveFrom[i][1]; + _ju.addWithFunction(connsToPaint, candidate, function (c) { + return c.id === candidate.id; + }); + _ju.addWithFunction(endpointsToPaint, listToRemoveFrom[i][1].endpoints[idx], function (e) { + return e.id === candidate.endpoints[idx].id; + }); + _ju.addWithFunction(endpointsToPaint, listToRemoveFrom[i][1].endpoints[oIdx], function (e) { + return e.id === candidate.endpoints[oIdx].id; + }); + } + } + } + + for (i = 0; i < listToAddTo.length; i++) { + candidate = listToAddTo[i][1]; + if (params.idx === 1 && listToAddTo[i][3] === otherElId && firstMatchingElIdx === -1) { + firstMatchingElIdx = i; + } + _ju.addWithFunction(connsToPaint, candidate, function (c) { + return c.id === candidate.id; + }); + _ju.addWithFunction(endpointsToPaint, listToAddTo[i][1].endpoints[idx], function (e) { + return e.id === candidate.endpoints[idx].id; + }); + _ju.addWithFunction(endpointsToPaint, listToAddTo[i][1].endpoints[oIdx], function (e) { + return e.id === candidate.endpoints[oIdx].id; + }); + } + if (exactIdx !== -1) { + listToAddTo[exactIdx] = values; + } + else { + var insertIdx = reverse ? firstMatchingElIdx !== -1 ? firstMatchingElIdx : 0 : listToAddTo.length; // of course we will get this from having looked through the array shortly. + listToAddTo.splice(insertIdx, 0, values); + } + + // store this for next time. + endpoint._continuousAnchorEdge = edgeId; + }; + + // + // find the entry in an endpoint's list for this connection and update its target endpoint + // with the current target in the connection. + // This method and sourceChanged need to be folder into one. + // + this.updateOtherEndpoint = function (sourceElId, oldTargetId, newTargetId, connection) { + var sIndex = _ju.findWithFunction(connectionsByElementId[sourceElId], function (i) { + return i[0].id === connection.id; + }), + tIndex = _ju.findWithFunction(connectionsByElementId[oldTargetId], function (i) { + return i[0].id === connection.id; + }); + + // update or add data for source + if (sIndex !== -1) { + connectionsByElementId[sourceElId][sIndex][0] = connection; + connectionsByElementId[sourceElId][sIndex][1] = connection.endpoints[1]; + connectionsByElementId[sourceElId][sIndex][2] = connection.endpoints[1].anchor.constructor === _jp.DynamicAnchor; + } + + // remove entry for previous target (if there) + if (tIndex > -1) { + connectionsByElementId[oldTargetId].splice(tIndex, 1); + // add entry for new target + _ju.addToList(connectionsByElementId, newTargetId, [connection, connection.endpoints[0], connection.endpoints[0].anchor.constructor === _jp.DynamicAnchor]); + } + + connection.updateConnectedClass(); + }; + + // + // notification that the connection given has changed source from the originalId to the newId. + // This involves: + // 1. removing the connection from the list of connections stored for the originalId + // 2. updating the source information for the target of the connection + // 3. re-registering the connection in connectionsByElementId with the newId + // + this.sourceChanged = function (originalId, newId, connection, newElement) { + if (originalId !== newId) { + + connection.sourceId = newId; + connection.source = newElement; + + // remove the entry that points from the old source to the target + _ju.removeWithFunction(connectionsByElementId[originalId], function (info) { + return info[0].id === connection.id; + }); + // find entry for target and update it + var tIdx = _ju.findWithFunction(connectionsByElementId[connection.targetId], function (i) { + return i[0].id === connection.id; + }); + if (tIdx > -1) { + connectionsByElementId[connection.targetId][tIdx][0] = connection; + connectionsByElementId[connection.targetId][tIdx][1] = connection.endpoints[0]; + connectionsByElementId[connection.targetId][tIdx][2] = connection.endpoints[0].anchor.constructor === _jp.DynamicAnchor; + } + // add entry for new source + _ju.addToList(connectionsByElementId, newId, [connection, connection.endpoints[1], connection.endpoints[1].anchor.constructor === _jp.DynamicAnchor]); + + // TODO SP not final on this yet. when a user drags an existing connection and it turns into a self + // loop, then this code hides the target endpoint (by removing it from the DOM) But I think this should + // occur only if the anchor is Continuous + if (connection.endpoints[1].anchor.isContinuous) { + if (connection.source === connection.target) { + connection._jsPlumb.instance.removeElement(connection.endpoints[1].canvas); + } + else { + if (connection.endpoints[1].canvas.parentNode == null) { + connection._jsPlumb.instance.appendElement(connection.endpoints[1].canvas); + } + } + } + + connection.updateConnectedClass(); + } + }; + + // + // moves the given endpoint from `currentId` to `element`. + // This involves: + // + // 1. changing the key in _amEndpoints under which the endpoint is stored + // 2. changing the source or target values in all of the endpoint's connections + // 3. changing the array in connectionsByElementId in which the endpoint's connections + // are stored (done by either sourceChanged or updateOtherEndpoint) + // + this.rehomeEndpoint = function (ep, currentId, element) { + var eps = _amEndpoints[currentId] || [], + elementId = jsPlumbInstance.getId(element); + + if (elementId !== currentId) { + var idx = eps.indexOf(ep); + if (idx > -1) { + var _ep = eps.splice(idx, 1)[0]; + self.add(_ep, elementId); + } + } + + for (var i = 0; i < ep.connections.length; i++) { + if (ep.connections[i].sourceId === currentId) { + self.sourceChanged(currentId, ep.elementId, ep.connections[i], ep.element); + } + else if (ep.connections[i].targetId === currentId) { + ep.connections[i].targetId = ep.elementId; + ep.connections[i].target = ep.element; + self.updateOtherEndpoint(ep.connections[i].sourceId, currentId, ep.elementId, ep.connections[i]); + } + } + }; + + this.redraw = function (elementId, ui, timestamp, offsetToUI, clearEdits, doNotRecalcEndpoint) { + + if (!jsPlumbInstance.isSuspendDrawing()) { + // get all the endpoints for this element + var ep = _amEndpoints[elementId] || [], + endpointConnections = connectionsByElementId[elementId] || [], + connectionsToPaint = [], + endpointsToPaint = [], + anchorsToUpdate = []; + + timestamp = timestamp || jsPlumbInstance.timestamp(); + // offsetToUI are values that would have been calculated in the dragManager when registering + // an endpoint for an element that had a parent (somewhere in the hierarchy) that had been + // registered as draggable. + offsetToUI = offsetToUI || {left: 0, top: 0}; + if (ui) { + ui = { + left: ui.left + offsetToUI.left, + top: ui.top + offsetToUI.top + }; + } + + // valid for one paint cycle. + var myOffset = jsPlumbInstance.updateOffset({ elId: elementId, offset: ui, recalc: false, timestamp: timestamp }), + orientationCache = {}; + + // actually, first we should compute the orientation of this element to all other elements to which + // this element is connected with a continuous anchor (whether both ends of the connection have + // a continuous anchor or just one) + + for (var i = 0; i < endpointConnections.length; i++) { + var conn = endpointConnections[i][0], + sourceId = conn.sourceId, + targetId = conn.targetId, + sourceContinuous = conn.endpoints[0].anchor.isContinuous, + targetContinuous = conn.endpoints[1].anchor.isContinuous; + + if (sourceContinuous || targetContinuous) { + var oKey = sourceId + "_" + targetId, + o = orientationCache[oKey], + oIdx = conn.sourceId === elementId ? 1 : 0; + + if (sourceContinuous && !anchorLists[sourceId]) { + anchorLists[sourceId] = { top: [], right: [], bottom: [], left: [] }; + } + if (targetContinuous && !anchorLists[targetId]) { + anchorLists[targetId] = { top: [], right: [], bottom: [], left: [] }; + } + + if (elementId !== targetId) { + jsPlumbInstance.updateOffset({ elId: targetId, timestamp: timestamp }); + } + if (elementId !== sourceId) { + jsPlumbInstance.updateOffset({ elId: sourceId, timestamp: timestamp }); + } + + var td = jsPlumbInstance.getCachedData(targetId), + sd = jsPlumbInstance.getCachedData(sourceId); + + if (targetId === sourceId && (sourceContinuous || targetContinuous)) { + // here we may want to improve this by somehow determining the face we'd like + // to put the connector on. ideally, when drawing, the face should be calculated + // by determining which face is closest to the point at which the mouse button + // was released. for now, we're putting it on the top face. + _updateAnchorList( anchorLists[sourceId], -Math.PI / 2, 0, conn, false, targetId, 0, false, "top", sourceId, connectionsToPaint, endpointsToPaint); + _updateAnchorList( anchorLists[targetId], -Math.PI / 2, 0, conn, false, sourceId, 1, false, "top", targetId, connectionsToPaint, endpointsToPaint); + } + else { + if (!o) { + o = this.calculateOrientation(sourceId, targetId, sd.o, td.o, conn.endpoints[0].anchor, conn.endpoints[1].anchor, conn); + orientationCache[oKey] = o; + // this would be a performance enhancement, but the computed angles need to be clamped to + //the (-PI/2 -> PI/2) range in order for the sorting to work properly. + /* orientationCache[oKey2] = { + orientation:o.orientation, + a:[o.a[1], o.a[0]], + theta:o.theta + Math.PI, + theta2:o.theta2 + Math.PI + };*/ + } + if (sourceContinuous) { + _updateAnchorList(anchorLists[sourceId], o.theta, 0, conn, false, targetId, 0, false, o.a[0], sourceId, connectionsToPaint, endpointsToPaint); + } + if (targetContinuous) { + _updateAnchorList(anchorLists[targetId], o.theta2, -1, conn, true, sourceId, 1, true, o.a[1], targetId, connectionsToPaint, endpointsToPaint); + } + } + + if (sourceContinuous) { + _ju.addWithFunction(anchorsToUpdate, sourceId, function (a) { + return a === sourceId; + }); + } + if (targetContinuous) { + _ju.addWithFunction(anchorsToUpdate, targetId, function (a) { + return a === targetId; + }); + } + _ju.addWithFunction(connectionsToPaint, conn, function (c) { + return c.id === conn.id; + }); + if ((sourceContinuous && oIdx === 0) || (targetContinuous && oIdx === 1)) { + _ju.addWithFunction(endpointsToPaint, conn.endpoints[oIdx], function (e) { + return e.id === conn.endpoints[oIdx].id; + }); + } + } + } + + // place Endpoints whose anchors are continuous but have no Connections + for (i = 0; i < ep.length; i++) { + if (ep[i].connections.length === 0 && ep[i].anchor.isContinuous) { + if (!anchorLists[elementId]) { + anchorLists[elementId] = { top: [], right: [], bottom: [], left: [] }; + } + _updateAnchorList(anchorLists[elementId], -Math.PI / 2, 0, {endpoints: [ep[i], ep[i]], paint: function () { + }}, false, elementId, 0, false, ep[i].anchor.getDefaultFace(), elementId, connectionsToPaint, endpointsToPaint); + _ju.addWithFunction(anchorsToUpdate, elementId, function (a) { + return a === elementId; + }); + } + } + + // now place all the continuous anchors we need to; + for (i = 0; i < anchorsToUpdate.length; i++) { + placeAnchors(anchorsToUpdate[i], anchorLists[anchorsToUpdate[i]]); + } + + // now that continuous anchors have been placed, paint all the endpoints for this element + for (i = 0; i < ep.length; i++) { + ep[i].paint({ timestamp: timestamp, offset: myOffset, dimensions: myOffset.s, recalc: doNotRecalcEndpoint !== true }); + } + + // ... and any other endpoints we came across as a result of the continuous anchors. + for (i = 0; i < endpointsToPaint.length; i++) { + var cd = jsPlumbInstance.getCachedData(endpointsToPaint[i].elementId); + //endpointsToPaint[i].paint({ timestamp: timestamp, offset: cd, dimensions: cd.s }); + endpointsToPaint[i].paint({ timestamp: null, offset: cd, dimensions: cd.s }); + } + + // paint all the standard and "dynamic connections", which are connections whose other anchor is + // static and therefore does need to be recomputed; we make sure that happens only one time. + + // TODO we could have compiled a list of these in the first pass through connections; might save some time. + for (i = 0; i < endpointConnections.length; i++) { + var otherEndpoint = endpointConnections[i][1]; + if (otherEndpoint.anchor.constructor === _jp.DynamicAnchor) { + otherEndpoint.paint({ elementWithPrecedence: elementId, timestamp: timestamp }); + _ju.addWithFunction(connectionsToPaint, endpointConnections[i][0], function (c) { + return c.id === endpointConnections[i][0].id; + }); + // all the connections for the other endpoint now need to be repainted + for (var k = 0; k < otherEndpoint.connections.length; k++) { + if (otherEndpoint.connections[k] !== endpointConnections[i][0]) { + _ju.addWithFunction(connectionsToPaint, otherEndpoint.connections[k], function (c) { + return c.id === otherEndpoint.connections[k].id; + }); + } + } + } else { + _ju.addWithFunction(connectionsToPaint, endpointConnections[i][0], function (c) { + return c.id === endpointConnections[i][0].id; + }); + } + } + + // paint current floating connection for this element, if there is one. + var fc = floatingConnections[elementId]; + if (fc) { + fc.paint({timestamp: timestamp, recalc: false, elId: elementId}); + } + + // paint all the connections + for (i = 0; i < connectionsToPaint.length; i++) { + connectionsToPaint[i].paint({elId: elementId, timestamp: null, recalc: false, clearEdits: clearEdits}); + } + } + }; + + var ContinuousAnchor = function (anchorParams) { + _ju.EventGenerator.apply(this); + this.type = "Continuous"; + this.isDynamic = true; + this.isContinuous = true; + var faces = anchorParams.faces || ["top", "right", "bottom", "left"], + clockwise = !(anchorParams.clockwise === false), + availableFaces = { }, + opposites = { "top": "bottom", "right": "left", "left": "right", "bottom": "top" }, + clockwiseOptions = { "top": "right", "right": "bottom", "left": "top", "bottom": "left" }, + antiClockwiseOptions = { "top": "left", "right": "top", "left": "bottom", "bottom": "right" }, + secondBest = clockwise ? clockwiseOptions : antiClockwiseOptions, + lastChoice = clockwise ? antiClockwiseOptions : clockwiseOptions, + cssClass = anchorParams.cssClass || "", + _currentFace = null, _lockedFace = null, X_AXIS_FACES = ["left", "right"], Y_AXIS_FACES = ["top", "bottom"], + _lockedAxis = null; + + for (var i = 0; i < faces.length; i++) { + availableFaces[faces[i]] = true; + } + + this.getDefaultFace = function () { + return faces.length === 0 ? "top" : faces[0]; + }; + + this.isRelocatable = function() { return true; }; + this.isSnapOnRelocate = function() { return true; }; + + // if the given edge is supported, returns it. otherwise looks for a substitute that _is_ + // supported. if none supported we also return the request edge. + this.verifyEdge = function (edge) { + if (availableFaces[edge]) { + return edge; + } + else if (availableFaces[opposites[edge]]) { + return opposites[edge]; + } + else if (availableFaces[secondBest[edge]]) { + return secondBest[edge]; + } + else if (availableFaces[lastChoice[edge]]) { + return lastChoice[edge]; + } + return edge; // we have to give them something. + }; + + this.isEdgeSupported = function (edge) { + return _lockedAxis == null ? + + (_lockedFace == null ? availableFaces[edge] === true : _lockedFace === edge) + + : _lockedAxis.indexOf(edge) !== -1; + }; + + this.setCurrentFace = function(face, overrideLock) { + _currentFace = face; + // if currently locked, and the user wants to override, do that. + if (overrideLock && _lockedFace != null) { + _lockedFace = _currentFace; + } + }; + + this.getCurrentFace = function() { return _currentFace; }; + this.getSupportedFaces = function() { + var af = []; + for (var k in availableFaces) { + if (availableFaces[k]) { + af.push(k); + } + } + return af; + }; + + this.lock = function() { + _lockedFace = _currentFace; + }; + this.unlock = function() { + _lockedFace = null; + }; + this.isLocked = function() { + return _lockedFace != null; + }; + + this.lockCurrentAxis = function() { + if (_currentFace != null) { + _lockedAxis = (_currentFace === "left" || _currentFace === "right") ? X_AXIS_FACES : Y_AXIS_FACES; + } + }; + + this.unlockCurrentAxis = function() { + _lockedAxis = null; + }; + + this.compute = function (params) { + return continuousAnchorLocations[params.element.id] || [0, 0]; + }; + this.getCurrentLocation = function (params) { + return continuousAnchorLocations[params.element.id] || [0, 0]; + }; + this.getOrientation = function (endpoint) { + return continuousAnchorOrientations[endpoint.id] || [0, 0]; + }; + this.getCssClass = function () { + return cssClass; + }; + }; + + // continuous anchors + jsPlumbInstance.continuousAnchorFactory = { + get: function (params) { + return new ContinuousAnchor(params); + }, + clear: function (elementId) { + delete continuousAnchorLocations[elementId]; + } + }; + }; + + _jp.AnchorManager.prototype.calculateOrientation = function (sourceId, targetId, sd, td, sourceAnchor, targetAnchor) { + + var Orientation = { HORIZONTAL: "horizontal", VERTICAL: "vertical", DIAGONAL: "diagonal", IDENTITY: "identity" }, + axes = ["left", "top", "right", "bottom"]; + + if (sourceId === targetId) { + return { + orientation: Orientation.IDENTITY, + a: ["top", "top"] + }; + } + + var theta = Math.atan2((td.centery - sd.centery), (td.centerx - sd.centerx)), + theta2 = Math.atan2((sd.centery - td.centery), (sd.centerx - td.centerx)); + +// -------------------------------------------------------------------------------------- + + // improved face calculation. get midpoints of each face for source and target, then put in an array with all combinations of + // source/target faces. sort this array by distance between midpoints. the entry at index 0 is our preferred option. we can + // go through the array one by one until we find an entry in which each requested face is supported. + var candidates = [], midpoints = { }; + (function (types, dim) { + for (var i = 0; i < types.length; i++) { + midpoints[types[i]] = { + "left": [ dim[i].left, dim[i].centery ], + "right": [ dim[i].right, dim[i].centery ], + "top": [ dim[i].centerx, dim[i].top ], + "bottom": [ dim[i].centerx , dim[i].bottom] + }; + } + })([ "source", "target" ], [ sd, td ]); + + for (var sf = 0; sf < axes.length; sf++) { + for (var tf = 0; tf < axes.length; tf++) { + candidates.push({ + source: axes[sf], + target: axes[tf], + dist: Biltong.lineLength(midpoints.source[axes[sf]], midpoints.target[axes[tf]]) + }); + } + } + + candidates.sort(function (a, b) { + return a.dist < b.dist ? -1 : a.dist > b.dist ? 1 : 0; + }); + + // now go through this list and try to get an entry that satisfies both (there will be one, unless one of the anchors + // declares no available faces) + var sourceEdge = candidates[0].source, targetEdge = candidates[0].target; + for (var i = 0; i < candidates.length; i++) { + + if (!sourceAnchor.isContinuous || sourceAnchor.isEdgeSupported(candidates[i].source)) { + sourceEdge = candidates[i].source; + } + else { + sourceEdge = null; + } + + if (!targetAnchor.isContinuous || targetAnchor.isEdgeSupported(candidates[i].target)) { + targetEdge = candidates[i].target; + } + else { + targetEdge = null; + } + + if (sourceEdge != null && targetEdge != null) { + break; + } + } + + if (sourceAnchor.isContinuous) { + sourceAnchor.setCurrentFace(sourceEdge); + } + + if (targetAnchor.isContinuous) { + targetAnchor.setCurrentFace(targetEdge); + } + +// -------------------------------------------------------------------------------------- + + return { + a: [ sourceEdge, targetEdge ], + theta: theta, + theta2: theta2 + }; + }; + + /** + * Anchors model a position on some element at which an Endpoint may be located. They began as a first class citizen of jsPlumb, ie. a user + * was required to create these themselves, but over time this has been replaced by the concept of referring to them either by name (eg. "TopMiddle"), + * or by an array describing their coordinates (eg. [ 0, 0.5, 0, -1 ], which is the same as "TopMiddle"). jsPlumb now handles all of the + * creation of Anchors without user intervention. + */ + _jp.Anchor = function (params) { + this.x = params.x || 0; + this.y = params.y || 0; + this.elementId = params.elementId; + this.cssClass = params.cssClass || ""; + this.userDefinedLocation = null; + this.orientation = params.orientation || [ 0, 0 ]; + this.lastReturnValue = null; + this.offsets = params.offsets || [ 0, 0 ]; + this.timestamp = null; + + var relocatable = params.relocatable !== false; + this.isRelocatable = function() { return relocatable; }; + this.setRelocatable = function(_relocatable) { relocatable = _relocatable; }; + var snapOnRelocate = params.snapOnRelocate !== false; + this.isSnapOnRelocate = function() { return snapOnRelocate; }; + + var locked = false; + this.lock = function() { locked = true; }; + this.unlock = function() { locked = false; }; + this.isLocked = function() { return locked; }; + + _ju.EventGenerator.apply(this); + + this.compute = function (params) { + + var xy = params.xy, wh = params.wh, timestamp = params.timestamp; + + if (params.clearUserDefinedLocation) { + this.userDefinedLocation = null; + } + + if (timestamp && timestamp === this.timestamp) { + return this.lastReturnValue; + } + + if (this.userDefinedLocation != null) { + this.lastReturnValue = this.userDefinedLocation; + } + else { + this.lastReturnValue = [ xy[0] + (this.x * wh[0]) + this.offsets[0], xy[1] + (this.y * wh[1]) + this.offsets[1], this.x, this.y ]; + } + + this.timestamp = timestamp; + return this.lastReturnValue; + }; + + this.getCurrentLocation = function (params) { + params = params || {}; + return (this.lastReturnValue == null || (params.timestamp != null && this.timestamp !== params.timestamp)) ? this.compute(params) : this.lastReturnValue; + }; + + this.setPosition = function(x, y, ox, oy, overrideLock) { + if (!locked || overrideLock) { + this.x = x; + this.y = y; + this.orientation = [ ox, oy ]; + this.lastReturnValue = null; + } + }; + }; + _ju.extend(_jp.Anchor, _ju.EventGenerator, { + equals: function (anchor) { + if (!anchor) { + return false; + } + var ao = anchor.getOrientation(), + o = this.getOrientation(); + return this.x === anchor.x && this.y === anchor.y && this.offsets[0] === anchor.offsets[0] && this.offsets[1] === anchor.offsets[1] && o[0] === ao[0] && o[1] === ao[1]; + }, + getUserDefinedLocation: function () { + return this.userDefinedLocation; + }, + setUserDefinedLocation: function (l) { + this.userDefinedLocation = l; + }, + clearUserDefinedLocation: function () { + this.userDefinedLocation = null; + }, + getOrientation: function () { + return this.orientation; + }, + getCssClass: function () { + return this.cssClass; + } + }); + + /** + * An Anchor that floats. its orientation is computed dynamically from + * its position relative to the anchor it is floating relative to. It is used when creating + * a connection through drag and drop. + * + * TODO FloatingAnchor could totally be refactored to extend Anchor just slightly. + */ + _jp.FloatingAnchor = function (params) { + + _jp.Anchor.apply(this, arguments); + + // this is the anchor that this floating anchor is referenced to for + // purposes of calculating the orientation. + var ref = params.reference, + // the canvas this refers to. + refCanvas = params.referenceCanvas, + size = _jp.getSize(refCanvas), + // these are used to store the current relative position of our + // anchor wrt the reference anchor. they only indicate + // direction, so have a value of 1 or -1 (or, very rarely, 0). these + // values are written by the compute method, and read + // by the getOrientation method. + xDir = 0, yDir = 0, + // temporary member used to store an orientation when the floating + // anchor is hovering over another anchor. + orientation = null, + _lastResult = null; + + // clear from parent. we want floating anchor orientation to always be computed. + this.orientation = null; + + // set these to 0 each; they are used by certain types of connectors in the loopback case, + // when the connector is trying to clear the element it is on. but for floating anchor it's not + // very important. + this.x = 0; + this.y = 0; + + this.isFloating = true; + + this.compute = function (params) { + var xy = params.xy, + result = [ xy[0] + (size[0] / 2), xy[1] + (size[1] / 2) ]; // return origin of the element. we may wish to improve this so that any object can be the drag proxy. + _lastResult = result; + return result; + }; + + this.getOrientation = function (_endpoint) { + if (orientation) { + return orientation; + } + else { + var o = ref.getOrientation(_endpoint); + // here we take into account the orientation of the other + // anchor: if it declares zero for some direction, we declare zero too. this might not be the most awesome. perhaps we can come + // up with a better way. it's just so that the line we draw looks like it makes sense. maybe this wont make sense. + return [ Math.abs(o[0]) * xDir * -1, + Math.abs(o[1]) * yDir * -1 ]; + } + }; + + /** + * notification the endpoint associated with this anchor is hovering + * over another anchor; we want to assume that anchor's orientation + * for the duration of the hover. + */ + this.over = function (anchor, endpoint) { + orientation = anchor.getOrientation(endpoint); + }; + + /** + * notification the endpoint associated with this anchor is no + * longer hovering over another anchor; we should resume calculating + * orientation as we normally do. + */ + this.out = function () { + orientation = null; + }; + + this.getCurrentLocation = function (params) { + return _lastResult == null ? this.compute(params) : _lastResult; + }; + }; + _ju.extend(_jp.FloatingAnchor, _jp.Anchor); + + var _convertAnchor = function (anchor, jsPlumbInstance, elementId) { + return anchor.constructor === _jp.Anchor ? anchor : jsPlumbInstance.makeAnchor(anchor, elementId, jsPlumbInstance); + }; + + /* + * A DynamicAnchor is an Anchor that contains a list of other Anchors, which it cycles + * through at compute time to find the one that is located closest to + * the center of the target element, and returns that Anchor's compute + * method result. this causes endpoints to follow each other with + * respect to the orientation of their target elements, which is a useful + * feature for some applications. + * + */ + _jp.DynamicAnchor = function (params) { + _jp.Anchor.apply(this, arguments); + + this.isDynamic = true; + this.anchors = []; + this.elementId = params.elementId; + this.jsPlumbInstance = params.jsPlumbInstance; + + for (var i = 0; i < params.anchors.length; i++) { + this.anchors[i] = _convertAnchor(params.anchors[i], this.jsPlumbInstance, this.elementId); + } + + this.getAnchors = function () { + return this.anchors; + }; + + var _curAnchor = this.anchors.length > 0 ? this.anchors[0] : null, + _lastAnchor = _curAnchor, + self = this, + + // helper method to calculate the distance between the centers of the two elements. + _distance = function (anchor, cx, cy, xy, wh) { + var ax = xy[0] + (anchor.x * wh[0]), ay = xy[1] + (anchor.y * wh[1]), + acx = xy[0] + (wh[0] / 2), acy = xy[1] + (wh[1] / 2); + return (Math.sqrt(Math.pow(cx - ax, 2) + Math.pow(cy - ay, 2)) + + Math.sqrt(Math.pow(acx - ax, 2) + Math.pow(acy - ay, 2))); + }, + // default method uses distance between element centers. you can provide your own method in the dynamic anchor + // constructor (and also to jsPlumb.makeDynamicAnchor). the arguments to it are four arrays: + // xy - xy loc of the anchor's element + // wh - anchor's element's dimensions + // txy - xy loc of the element of the other anchor in the connection + // twh - dimensions of the element of the other anchor in the connection. + // anchors - the list of selectable anchors + _anchorSelector = params.selector || function (xy, wh, txy, twh, anchors) { + var cx = txy[0] + (twh[0] / 2), cy = txy[1] + (twh[1] / 2); + var minIdx = -1, minDist = Infinity; + for (var i = 0; i < anchors.length; i++) { + var d = _distance(anchors[i], cx, cy, xy, wh); + if (d < minDist) { + minIdx = i + 0; + minDist = d; + } + } + return anchors[minIdx]; + }; + + this.compute = function (params) { + var xy = params.xy, wh = params.wh, txy = params.txy, twh = params.twh; + + this.timestamp = params.timestamp; + + var udl = self.getUserDefinedLocation(); + if (udl != null) { + return udl; + } + + // if anchor is locked or an opposite element was not given, we + // maintain our state. anchor will be locked + // if it is the source of a drag and drop. + if (this.isLocked() || txy == null || twh == null) { + return _curAnchor.compute(params); + } + else { + params.timestamp = null; // otherwise clear this, i think. we want the anchor to compute. + } + + _curAnchor = _anchorSelector(xy, wh, txy, twh, this.anchors); + this.x = _curAnchor.x; + this.y = _curAnchor.y; + + if (_curAnchor !== _lastAnchor) { + this.fire("anchorChanged", _curAnchor); + } + + _lastAnchor = _curAnchor; + + return _curAnchor.compute(params); + }; + + this.getCurrentLocation = function (params) { + return this.getUserDefinedLocation() || (_curAnchor != null ? _curAnchor.getCurrentLocation(params) : null); + }; + + this.getOrientation = function (_endpoint) { + return _curAnchor != null ? _curAnchor.getOrientation(_endpoint) : [ 0, 0 ]; + }; + this.over = function (anchor, endpoint) { + if (_curAnchor != null) { + _curAnchor.over(anchor, endpoint); + } + }; + this.out = function () { + if (_curAnchor != null) { + _curAnchor.out(); + } + }; + + this.setAnchor = function(a) { + _curAnchor = a; + }; + + this.getCssClass = function () { + return (_curAnchor && _curAnchor.getCssClass()) || ""; + }; + + /** + * Attempt to match an anchor with the given coordinates and then set it. + * @param coords + * @returns true if matching anchor found, false otherwise. + */ + this.setAnchorCoordinates = function(coords) { + var idx = jsPlumbUtil.findWithFunction(this.anchors, function(a) { + return a.x === coords[0] && a.y === coords[1]; + }); + if (idx !== -1) { + this.setAnchor(this.anchors[idx]); + return true; + } else { + return false; + } + }; + }; + _ju.extend(_jp.DynamicAnchor, _jp.Anchor); + +// -------- basic anchors ------------------ + var _curryAnchor = function (x, y, ox, oy, type, fnInit) { + _jp.Anchors[type] = function (params) { + var a = params.jsPlumbInstance.makeAnchor([ x, y, ox, oy, 0, 0 ], params.elementId, params.jsPlumbInstance); + a.type = type; + if (fnInit) { + fnInit(a, params); + } + return a; + }; + }; + + _curryAnchor(0.5, 0, 0, -1, "TopCenter"); + _curryAnchor(0.5, 1, 0, 1, "BottomCenter"); + _curryAnchor(0, 0.5, -1, 0, "LeftMiddle"); + _curryAnchor(1, 0.5, 1, 0, "RightMiddle"); + + _curryAnchor(0.5, 0, 0, -1, "Top"); + _curryAnchor(0.5, 1, 0, 1, "Bottom"); + _curryAnchor(0, 0.5, -1, 0, "Left"); + _curryAnchor(1, 0.5, 1, 0, "Right"); + _curryAnchor(0.5, 0.5, 0, 0, "Center"); + _curryAnchor(1, 0, 0, -1, "TopRight"); + _curryAnchor(1, 1, 0, 1, "BottomRight"); + _curryAnchor(0, 0, 0, -1, "TopLeft"); + _curryAnchor(0, 1, 0, 1, "BottomLeft"); + +// ------- dynamic anchors ------------------- + + // default dynamic anchors chooses from Top, Right, Bottom, Left + _jp.Defaults.DynamicAnchors = function (params) { + return params.jsPlumbInstance.makeAnchors(["TopCenter", "RightMiddle", "BottomCenter", "LeftMiddle"], params.elementId, params.jsPlumbInstance); + }; + + // default dynamic anchors bound to name 'AutoDefault' + _jp.Anchors.AutoDefault = function (params) { + var a = params.jsPlumbInstance.makeDynamicAnchor(_jp.Defaults.DynamicAnchors(params)); + a.type = "AutoDefault"; + return a; + }; + +// ------- continuous anchors ------------------- + + var _curryContinuousAnchor = function (type, faces) { + _jp.Anchors[type] = function (params) { + var a = params.jsPlumbInstance.makeAnchor(["Continuous", { faces: faces }], params.elementId, params.jsPlumbInstance); + a.type = type; + return a; + }; + }; + + _jp.Anchors.Continuous = function (params) { + return params.jsPlumbInstance.continuousAnchorFactory.get(params); + }; + + _curryContinuousAnchor("ContinuousLeft", ["left"]); + _curryContinuousAnchor("ContinuousTop", ["top"]); + _curryContinuousAnchor("ContinuousBottom", ["bottom"]); + _curryContinuousAnchor("ContinuousRight", ["right"]); + +// ------- position assign anchors ------------------- + + // this anchor type lets you assign the position at connection time. + _curryAnchor(0, 0, 0, 0, "Assign", function (anchor, params) { + // find what to use as the "position finder". the user may have supplied a String which represents + // the id of a position finder in jsPlumb.AnchorPositionFinders, or the user may have supplied the + // position finder as a function. we find out what to use and then set it on the anchor. + var pf = params.position || "Fixed"; + anchor.positionFinder = pf.constructor === String ? params.jsPlumbInstance.AnchorPositionFinders[pf] : pf; + // always set the constructor params; the position finder might need them later (the Grid one does, + // for example) + anchor.constructorParams = params; + }); + + // these are the default anchor positions finders, which are used by the makeTarget function. supplying + // a position finder argument to that function allows you to specify where the resulting anchor will + // be located + root.jsPlumbInstance.prototype.AnchorPositionFinders = { + "Fixed": function (dp, ep, es) { + return [ (dp.left - ep.left) / es[0], (dp.top - ep.top) / es[1] ]; + }, + "Grid": function (dp, ep, es, params) { + var dx = dp.left - ep.left, dy = dp.top - ep.top, + gx = es[0] / (params.grid[0]), gy = es[1] / (params.grid[1]), + mx = Math.floor(dx / gx), my = Math.floor(dy / gy); + return [ ((mx * gx) + (gx / 2)) / es[0], ((my * gy) + (gy / 2)) / es[1] ]; + } + }; + +// ------- perimeter anchors ------------------- + + _jp.Anchors.Perimeter = function (params) { + params = params || {}; + var anchorCount = params.anchorCount || 60, + shape = params.shape; + + if (!shape) { + throw new Error("no shape supplied to Perimeter Anchor type"); + } + + var _circle = function () { + var r = 0.5, step = Math.PI * 2 / anchorCount, current = 0, a = []; + for (var i = 0; i < anchorCount; i++) { + var x = r + (r * Math.sin(current)), + y = r + (r * Math.cos(current)); + a.push([ x, y, 0, 0 ]); + current += step; + } + return a; + }, + _path = function (segments) { + var anchorsPerFace = anchorCount / segments.length, a = [], + _computeFace = function (x1, y1, x2, y2, fractionalLength, ox, oy) { + anchorsPerFace = anchorCount * fractionalLength; + var dx = (x2 - x1) / anchorsPerFace, dy = (y2 - y1) / anchorsPerFace; + for (var i = 0; i < anchorsPerFace; i++) { + a.push([ + x1 + (dx * i), + y1 + (dy * i), + ox == null ? 0 : ox, + oy == null ? 0 : oy + ]); + } + }; + + for (var i = 0; i < segments.length; i++) { + _computeFace.apply(null, segments[i]); + } + + return a; + }, + _shape = function (faces) { + var s = []; + for (var i = 0; i < faces.length; i++) { + s.push([faces[i][0], faces[i][1], faces[i][2], faces[i][3], 1 / faces.length, faces[i][4], faces[i][5]]); + } + return _path(s); + }, + _rectangle = function () { + return _shape([ + [ 0, 0, 1, 0, 0, -1 ], + [ 1, 0, 1, 1, 1, 0 ], + [ 1, 1, 0, 1, 0, 1 ], + [ 0, 1, 0, 0, -1, 0 ] + ]); + }; + + var _shapes = { + "Circle": _circle, + "Ellipse": _circle, + "Diamond": function () { + return _shape([ + [ 0.5, 0, 1, 0.5 ], + [ 1, 0.5, 0.5, 1 ], + [ 0.5, 1, 0, 0.5 ], + [ 0, 0.5, 0.5, 0 ] + ]); + }, + "Rectangle": _rectangle, + "Square": _rectangle, + "Triangle": function () { + return _shape([ + [ 0.5, 0, 1, 1 ], + [ 1, 1, 0, 1 ], + [ 0, 1, 0.5, 0] + ]); + }, + "Path": function (params) { + var points = params.points, p = [], tl = 0; + for (var i = 0; i < points.length - 1; i++) { + var l = Math.sqrt(Math.pow(points[i][2] - points[i][0]) + Math.pow(points[i][3] - points[i][1])); + tl += l; + p.push([points[i][0], points[i][1], points[i + 1][0], points[i + 1][1], l]); + } + for (var j = 0; j < p.length; j++) { + p[j][4] = p[j][4] / tl; + } + return _path(p); + } + }, + _rotate = function (points, amountInDegrees) { + var o = [], theta = amountInDegrees / 180 * Math.PI; + for (var i = 0; i < points.length; i++) { + var _x = points[i][0] - 0.5, + _y = points[i][1] - 0.5; + + o.push([ + 0.5 + ((_x * Math.cos(theta)) - (_y * Math.sin(theta))), + 0.5 + ((_x * Math.sin(theta)) + (_y * Math.cos(theta))), + points[i][2], + points[i][3] + ]); + } + return o; + }; + + if (!_shapes[shape]) { + throw new Error("Shape [" + shape + "] is unknown by Perimeter Anchor type"); + } + + var da = _shapes[shape](params); + if (params.rotation) { + da = _rotate(da, params.rotation); + } + var a = params.jsPlumbInstance.makeDynamicAnchor(da); + a.type = "Perimeter"; + return a; + }; +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the default Connectors, Endpoint and Overlay definitions. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil, _jg = root.Biltong; + + _jp.Segments = { + + /* + * Class: AbstractSegment + * A Connector is made up of 1..N Segments, each of which has a Type, such as 'Straight', 'Arc', + * 'Bezier'. This is new from 1.4.2, and gives us a lot more flexibility when drawing connections: things such + * as rounded corners for flowchart connectors, for example, or a straight line stub for Bezier connections, are + * much easier to do now. + * + * A Segment is responsible for providing coordinates for painting it, and also must be able to report its length. + * + */ + AbstractSegment: function (params) { + this.params = params; + + /** + * Function: findClosestPointOnPath + * Finds the closest point on this segment to the given [x, y], + * returning both the x and y of the point plus its distance from + * the supplied point, and its location along the length of the + * path inscribed by the segment. This implementation returns + * Infinity for distance and null values for everything else; + * subclasses are expected to override. + */ + this.findClosestPointOnPath = function (x, y) { + return { + d: Infinity, + x: null, + y: null, + l: null + }; + }; + + this.getBounds = function () { + return { + minX: Math.min(params.x1, params.x2), + minY: Math.min(params.y1, params.y2), + maxX: Math.max(params.x1, params.x2), + maxY: Math.max(params.y1, params.y2) + }; + }; + + /** + * Computes the list of points on the segment that intersect the given line. + * @method lineIntersection + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @returns {Array<[number, number]>} + */ + this.lineIntersection = function(x1, y1, x2, y2) { + return []; + }; + + /** + * Computes the list of points on the segment that intersect the box with the given origin and size. + * @method boxIntersection + * @param {number} x1 + * @param {number} y1 + * @param {number} w + * @param {number} h + * @returns {Array<[number, number]>} + */ + this.boxIntersection = function(x, y, w, h) { + var a = []; + a.push.apply(a, this.lineIntersection(x, y, x + w, y)); + a.push.apply(a, this.lineIntersection(x + w, y, x + w, y + h)); + a.push.apply(a, this.lineIntersection(x + w, y + h, x, y + h)); + a.push.apply(a, this.lineIntersection(x, y + h, x, y)); + return a; + }; + + /** + * Computes the list of points on the segment that intersect the given bounding box, which is an object of the form { x:.., y:.., w:.., h:.. }. + * @method lineIntersection + * @param {BoundingRectangle} box + * @returns {Array<[number, number]>} + */ + this.boundingBoxIntersection = function(box) { + return this.boxIntersection(box.x, box.y, box.w, box.y); + }; + }, + Straight: function (params) { + var _super = _jp.Segments.AbstractSegment.apply(this, arguments), + length, m, m2, x1, x2, y1, y2, + _recalc = function () { + length = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); + m = _jg.gradient({x: x1, y: y1}, {x: x2, y: y2}); + m2 = -1 / m; + }; + + this.type = "Straight"; + + this.getLength = function () { + return length; + }; + this.getGradient = function () { + return m; + }; + + this.getCoordinates = function () { + return { x1: x1, y1: y1, x2: x2, y2: y2 }; + }; + this.setCoordinates = function (coords) { + x1 = coords.x1; + y1 = coords.y1; + x2 = coords.x2; + y2 = coords.y2; + _recalc(); + }; + this.setCoordinates({x1: params.x1, y1: params.y1, x2: params.x2, y2: params.y2}); + + this.getBounds = function () { + return { + minX: Math.min(x1, x2), + minY: Math.min(y1, y2), + maxX: Math.max(x1, x2), + maxY: Math.max(y1, y2) + }; + }; + + /** + * returns the point on the segment's path that is 'location' along the length of the path, where 'location' is a decimal from + * 0 to 1 inclusive. for the straight line segment this is simple maths. + */ + this.pointOnPath = function (location, absolute) { + if (location === 0 && !absolute) { + return { x: x1, y: y1 }; + } + else if (location === 1 && !absolute) { + return { x: x2, y: y2 }; + } + else { + var l = absolute ? location > 0 ? location : length + location : location * length; + return _jg.pointOnLine({x: x1, y: y1}, {x: x2, y: y2}, l); + } + }; + + /** + * returns the gradient of the segment at the given point - which for us is constant. + */ + this.gradientAtPoint = function (_) { + return m; + }; + + /** + * returns the point on the segment's path that is 'distance' along the length of the path from 'location', where + * 'location' is a decimal from 0 to 1 inclusive, and 'distance' is a number of pixels. + * this hands off to jsPlumbUtil to do the maths, supplying two points and the distance. + */ + this.pointAlongPathFrom = function (location, distance, absolute) { + var p = this.pointOnPath(location, absolute), + farAwayPoint = distance <= 0 ? {x: x1, y: y1} : {x: x2, y: y2 }; + + /* + location == 1 ? { + x:x1 + ((x2 - x1) * 10), + y:y1 + ((y1 - y2) * 10) + } : + */ + + if (distance <= 0 && Math.abs(distance) > 1) { + distance *= -1; + } + + return _jg.pointOnLine(p, farAwayPoint, distance); + }; + + // is c between a and b? + var within = function (a, b, c) { + return c >= Math.min(a, b) && c <= Math.max(a, b); + }; + // find which of a and b is closest to c + var closest = function (a, b, c) { + return Math.abs(c - a) < Math.abs(c - b) ? a : b; + }; + + /** + Function: findClosestPointOnPath + Finds the closest point on this segment to [x,y]. See + notes on this method in AbstractSegment. + */ + this.findClosestPointOnPath = function (x, y) { + var out = { + d: Infinity, + x: null, + y: null, + l: null, + x1: x1, + x2: x2, + y1: y1, + y2: y2 + }; + + if (m === 0) { + out.y = y1; + out.x = within(x1, x2, x) ? x : closest(x1, x2, x); + } + else if (m === Infinity || m === -Infinity) { + out.x = x1; + out.y = within(y1, y2, y) ? y : closest(y1, y2, y); + } + else { + // closest point lies on normal from given point to this line. + var b = y1 - (m * x1), + b2 = y - (m2 * x), + // y1 = m.x1 + b and y1 = m2.x1 + b2 + // so m.x1 + b = m2.x1 + b2 + // x1(m - m2) = b2 - b + // x1 = (b2 - b) / (m - m2) + _x1 = (b2 - b) / (m - m2), + _y1 = (m * _x1) + b; + + out.x = within(x1, x2, _x1) ? _x1 : closest(x1, x2, _x1);//_x1; + out.y = within(y1, y2, _y1) ? _y1 : closest(y1, y2, _y1);//_y1; + } + + var fractionInSegment = _jg.lineLength([ out.x, out.y ], [ x1, y1 ]); + out.d = _jg.lineLength([x, y], [out.x, out.y]); + out.l = fractionInSegment / length; + return out; + }; + + var _pointLiesBetween = function(q, p1, p2) { + return (p2 > p1) ? (p1 <= q && q <= p2) : (p1 >= q && q >= p2); + }, _plb = _pointLiesBetween; + + /** + * Calculates all intersections of the given line with this segment. + * @param _x1 + * @param _y1 + * @param _x2 + * @param _y2 + * @returns {Array} + */ + this.lineIntersection = function(_x1, _y1, _x2, _y2) { + var m2 = Math.abs(_jg.gradient({x: _x1, y: _y1}, {x: _x2, y: _y2})), + m1 = Math.abs(m), + b = m1 === Infinity ? x1 : y1 - (m1 * x1), + out = [], + b2 = m2 === Infinity ? _x1 : _y1 - (m2 * _x1); + + // if lines parallel, no intersection + if (m2 !== m1) { + // perpendicular, segment horizontal + if(m2 === Infinity && m1 === 0) { + if (_plb(_x1, x1, x2) && _plb(y1, _y1, _y2)) { + out = [ _x1, y1 ]; // we return X on the incident line and Y from the segment + } + } else if(m2 === 0 && m1 === Infinity) { + // perpendicular, segment vertical + if(_plb(_y1, y1, y2) && _plb(x1, _x1, _x2)) { + out = [x1, _y1]; // we return X on the segment and Y from the incident line + } + } else { + var X, Y; + if (m2 === Infinity) { + // test line is a vertical line. where does it cross the segment? + X = _x1; + if (_plb(X, x1, x2)) { + Y = (m1 * _x1) + b; + if (_plb(Y, _y1, _y2)) { + out = [ X, Y ]; + } + } + } else if (m2 === 0) { + Y = _y1; + // test line is a horizontal line. where does it cross the segment? + if (_plb(Y, y1, y2)) { + X = (_y1 - b) / m1; + if (_plb(X, _x1, _x2)) { + out = [ X, Y ]; + } + } + } else { + // mX + b = m2X + b2 + // mX - m2X = b2 - b + // X(m - m2) = b2 - b + // X = (b2 - b) / (m - m2) + // Y = mX + b + X = (b2 - b) / (m1 - m2); + Y = (m1 * X) + b; + if(_plb(X, x1, x2) && _plb(Y, y1, y2)) { + out = [ X, Y]; + } + } + } + } + + return out; + }; + + /** + * Calculates all intersections of the given box with this segment. By default this method simply calls `lineIntersection` with each of the four + * faces of the box; subclasses can override this if they think there's a faster way to compute the entire box at once. + * @param x X position of top left corner of box + * @param y Y position of top left corner of box + * @param w width of box + * @param h height of box + * @returns {Array} + */ + this.boxIntersection = function(x, y, w, h) { + var a = []; + a.push.apply(a, this.lineIntersection(x, y, x + w, y)); + a.push.apply(a, this.lineIntersection(x + w, y, x + w, y + h)); + a.push.apply(a, this.lineIntersection(x + w, y + h, x, y + h)); + a.push.apply(a, this.lineIntersection(x, y + h, x, y)); + return a; + }; + + /** + * Calculates all intersections of the given bounding box with this segment. By default this method simply calls `lineIntersection` with each of the four + * faces of the box; subclasses can override this if they think there's a faster way to compute the entire box at once. + * @param box Bounding box, in { x:.., y:..., w:..., h:... } format. + * @returns {Array} + */ + this.boundingBoxIntersection = function(box) { + return this.boxIntersection(box.x, box.y, box.w, box.h); + }; + }, + + /* + Arc Segment. You need to supply: + + r - radius + cx - center x for the arc + cy - center y for the arc + ac - whether the arc is anticlockwise or not. default is clockwise. + + and then either: + + startAngle - startAngle for the arc. + endAngle - endAngle for the arc. + + or: + + x1 - x for start point + y1 - y for start point + x2 - x for end point + y2 - y for end point + + */ + Arc: function (params) { + var _super = _jp.Segments.AbstractSegment.apply(this, arguments), + _calcAngle = function (_x, _y) { + return _jg.theta([params.cx, params.cy], [_x, _y]); + }, + _calcAngleForLocation = function (segment, location) { + if (segment.anticlockwise) { + var sa = segment.startAngle < segment.endAngle ? segment.startAngle + TWO_PI : segment.startAngle, + s = Math.abs(sa - segment.endAngle); + return sa - (s * location); + } + else { + var ea = segment.endAngle < segment.startAngle ? segment.endAngle + TWO_PI : segment.endAngle, + ss = Math.abs(ea - segment.startAngle); + + return segment.startAngle + (ss * location); + } + }, + TWO_PI = 2 * Math.PI; + + this.radius = params.r; + this.anticlockwise = params.ac; + this.type = "Arc"; + + if (params.startAngle && params.endAngle) { + this.startAngle = params.startAngle; + this.endAngle = params.endAngle; + this.x1 = params.cx + (this.radius * Math.cos(params.startAngle)); + this.y1 = params.cy + (this.radius * Math.sin(params.startAngle)); + this.x2 = params.cx + (this.radius * Math.cos(params.endAngle)); + this.y2 = params.cy + (this.radius * Math.sin(params.endAngle)); + } + else { + this.startAngle = _calcAngle(params.x1, params.y1); + this.endAngle = _calcAngle(params.x2, params.y2); + this.x1 = params.x1; + this.y1 = params.y1; + this.x2 = params.x2; + this.y2 = params.y2; + } + + if (this.endAngle < 0) { + this.endAngle += TWO_PI; + } + if (this.startAngle < 0) { + this.startAngle += TWO_PI; + } + + // segment is used by vml + //this.segment = _jg.quadrant([this.x1, this.y1], [this.x2, this.y2]); + + // we now have startAngle and endAngle as positive numbers, meaning the + // absolute difference (|d|) between them is the sweep (s) of this arc, unless the + // arc is 'anticlockwise' in which case 's' is given by 2PI - |d|. + + var ea = this.endAngle < this.startAngle ? this.endAngle + TWO_PI : this.endAngle; + this.sweep = Math.abs(ea - this.startAngle); + if (this.anticlockwise) { + this.sweep = TWO_PI - this.sweep; + } + var circumference = 2 * Math.PI * this.radius, + frac = this.sweep / TWO_PI, + length = circumference * frac; + + this.getLength = function () { + return length; + }; + + this.getBounds = function () { + return { + minX: params.cx - params.r, + maxX: params.cx + params.r, + minY: params.cy - params.r, + maxY: params.cy + params.r + }; + }; + + var VERY_SMALL_VALUE = 0.0000000001, + gentleRound = function (n) { + var f = Math.floor(n), r = Math.ceil(n); + if (n - f < VERY_SMALL_VALUE) { + return f; + } + else if (r - n < VERY_SMALL_VALUE) { + return r; + } + return n; + }; + + /** + * returns the point on the segment's path that is 'location' along the length of the path, where 'location' is a decimal from + * 0 to 1 inclusive. + */ + this.pointOnPath = function (location, absolute) { + + if (location === 0) { + return { x: this.x1, y: this.y1, theta: this.startAngle }; + } + else if (location === 1) { + return { x: this.x2, y: this.y2, theta: this.endAngle }; + } + + if (absolute) { + location = location / length; + } + + var angle = _calcAngleForLocation(this, location), + _x = params.cx + (params.r * Math.cos(angle)), + _y = params.cy + (params.r * Math.sin(angle)); + + return { x: gentleRound(_x), y: gentleRound(_y), theta: angle }; + }; + + /** + * returns the gradient of the segment at the given point. + */ + this.gradientAtPoint = function (location, absolute) { + var p = this.pointOnPath(location, absolute); + var m = _jg.normal([ params.cx, params.cy ], [p.x, p.y ]); + if (!this.anticlockwise && (m === Infinity || m === -Infinity)) { + m *= -1; + } + return m; + }; + + this.pointAlongPathFrom = function (location, distance, absolute) { + var p = this.pointOnPath(location, absolute), + arcSpan = distance / circumference * 2 * Math.PI, + dir = this.anticlockwise ? -1 : 1, + startAngle = p.theta + (dir * arcSpan), + startX = params.cx + (this.radius * Math.cos(startAngle)), + startY = params.cy + (this.radius * Math.sin(startAngle)); + + return {x: startX, y: startY}; + }; + + // TODO: lineIntersection + }, + + Bezier: function (params) { + this.curve = [ + { x: params.x1, y: params.y1}, + { x: params.cp1x, y: params.cp1y }, + { x: params.cp2x, y: params.cp2y }, + { x: params.x2, y: params.y2 } + ]; + + var _isPoint = function(c) { + return c[0].x === c[1].x && c[0].y === c[1].y; + }; + + var _dist = function(p1, p2 ) { + return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2)); + }; + + var _compute = function(loc) { + + var EMPTY_POINT = {x:0, y:0}; + + if (loc === 0) { + return this.curve[0]; + } + + var degree = this.curve.length - 1; + + if (loc === 1) { + return this.curve[degree]; + } + + var o = this.curve; + var s = 1 - loc; + + if (degree === 0) { + return this.curve[0]; + } + + if (degree === 1) { + return { + x: s * o[0].x + loc * o[1].x, + y: s * o[0].y + loc * o[1].y + }; + } + + if (degree < 4) { + + var l = s * s, h = loc * loc, u = 0, m, g, f; + + if (degree === 2) { + o = [o[0], o[1], o[2], EMPTY_POINT]; + m = l; + g = 2 * (s * loc); + f = h; + } else if (degree === 3) { + m = l * s; + g = 3 * (l * loc); + f = 3 * (s * h); + u = loc * h; + } + + return { + x: m * o[0].x + g * o[1].x + f * o[2].x + u * o[3].x, + y: m * o[0].y + g * o[1].y + f * o[2].y + u * o[3].y + }; + } else { + return EMPTY_POINT; // not supported. + } + }.bind(this); + + var _getLUT = function(steps) { + var out = []; + steps--; + for (var n = 0; n <= steps; n++) { + out.push(_compute(n / steps)); + } + return out; + }; + + var _computeLength = function() { + + if (_isPoint(this.curve)) { + this.length = 0; + } + + var steps = 16; + var lut = _getLUT(steps); + this.length = 0; + + for (var i = 0; i < steps - 1; i++) { + var a = lut[i], b = lut[i + 1]; + this.length += _dist(a, b); + } + }.bind(this); + + var _super = _jp.Segments.AbstractSegment.apply(this, arguments); + // although this is not a strictly rigorous determination of bounds + // of a bezier curve, it works for the types of curves that this segment + // type produces. + this.bounds = { + minX: Math.min(params.x1, params.x2, params.cp1x, params.cp2x), + minY: Math.min(params.y1, params.y2, params.cp1y, params.cp2y), + maxX: Math.max(params.x1, params.x2, params.cp1x, params.cp2x), + maxY: Math.max(params.y1, params.y2, params.cp1y, params.cp2y) + }; + + this.type = "Bezier"; + + _computeLength(); + + var _translateLocation = function (_curve, location, absolute) { + if (absolute) { + location = root.jsBezier.locationAlongCurveFrom(_curve, location > 0 ? 0 : 1, location); + } + + return location; + }; + + /** + * returns the point on the segment's path that is 'location' along the length of the path, where 'location' is a decimal from + * 0 to 1 inclusive. + */ + this.pointOnPath = function (location, absolute) { + location = _translateLocation(this.curve, location, absolute); + return root.jsBezier.pointOnCurve(this.curve, location); + }; + + /** + * returns the gradient of the segment at the given point. + */ + this.gradientAtPoint = function (location, absolute) { + location = _translateLocation(this.curve, location, absolute); + return root.jsBezier.gradientAtPoint(this.curve, location); + }; + + this.pointAlongPathFrom = function (location, distance, absolute) { + location = _translateLocation(this.curve, location, absolute); + return root.jsBezier.pointAlongCurveFrom(this.curve, location, distance); + }; + + this.getLength = function () { + return this.length; + }; + + this.getBounds = function () { + return this.bounds; + }; + + this.findClosestPointOnPath = function (x, y) { + var p = root.jsBezier.nearestPointOnCurve({x:x,y:y}, this.curve); + return { + d:Math.sqrt(Math.pow(p.point.x - x, 2) + Math.pow(p.point.y - y, 2)), + x:p.point.x, + y:p.point.y, + l:1 - p.location, + s:this + }; + }; + + this.lineIntersection = function(x1, y1, x2, y2) { + return root.jsBezier.lineIntersection(x1, y1, x2, y2, this.curve); + }; + } + }; + + _jp.SegmentRenderer = { + getPath: function (segment, isFirstSegment) { + return ({ + "Straight": function (isFirstSegment) { + var d = segment.getCoordinates(); + return (isFirstSegment ? "M " + d.x1 + " " + d.y1 + " " : "") + "L " + d.x2 + " " + d.y2; + }, + "Bezier": function (isFirstSegment) { + var d = segment.params; + return (isFirstSegment ? "M " + d.x2 + " " + d.y2 + " " : "") + + "C " + d.cp2x + " " + d.cp2y + " " + d.cp1x + " " + d.cp1y + " " + d.x1 + " " + d.y1; + }, + "Arc": function (isFirstSegment) { + var d = segment.params, + laf = segment.sweep > Math.PI ? 1 : 0, + sf = segment.anticlockwise ? 0 : 1; + + return (isFirstSegment ? "M" + segment.x1 + " " + segment.y1 + " " : "") + "A " + segment.radius + " " + d.r + " 0 " + laf + "," + sf + " " + segment.x2 + " " + segment.y2; + } + })[segment.type](isFirstSegment); + } + }; + + /* + Class: UIComponent + Superclass for Connector and AbstractEndpoint. + */ + var AbstractComponent = function () { + this.resetBounds = function () { + this.bounds = { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity }; + }; + this.resetBounds(); + }; + + /* + * Class: Connector + * Superclass for all Connectors; here is where Segments are managed. This is exposed on jsPlumb just so it + * can be accessed from other files. You should not try to instantiate one of these directly. + * + * When this class is asked for a pointOnPath, or gradient etc, it must first figure out which segment to dispatch + * that request to. This is done by keeping track of the total connector length as segments are added, and also + * their cumulative ratios to the total length. Then when the right segment is found it is a simple case of dispatching + * the request to it (and adjusting 'location' so that it is relative to the beginning of that segment.) + */ + _jp.Connectors.AbstractConnector = function (params) { + + AbstractComponent.apply(this, arguments); + + var segments = [], + totalLength = 0, + segmentProportions = [], + segmentProportionalLengths = [], + stub = params.stub || 0, + sourceStub = _ju.isArray(stub) ? stub[0] : stub, + targetStub = _ju.isArray(stub) ? stub[1] : stub, + gap = params.gap || 0, + sourceGap = _ju.isArray(gap) ? gap[0] : gap, + targetGap = _ju.isArray(gap) ? gap[1] : gap, + userProvidedSegments = null, + paintInfo = null; + + this.getPathData = function() { + var p = ""; + for (var i = 0; i < segments.length; i++) { + p += _jp.SegmentRenderer.getPath(segments[i], i === 0); + p += " "; + } + return p; + }; + + /** + * Function: findSegmentForPoint + * Returns the segment that is closest to the given [x,y], + * null if nothing found. This function returns a JS + * object with: + * + * d - distance from segment + * l - proportional location in segment + * x - x point on the segment + * y - y point on the segment + * s - the segment itself. + * connectorLocation - the location on the connector of the point, expressed as a decimal between 0 and 1 inclusive. + */ + this.findSegmentForPoint = function (x, y) { + var out = { d: Infinity, s: null, x: null, y: null, l: null }; + for (var i = 0; i < segments.length; i++) { + var _s = segments[i].findClosestPointOnPath(x, y); + if (_s.d < out.d) { + out.d = _s.d; + out.l = _s.l; + out.x = _s.x; + out.y = _s.y; + out.s = segments[i]; + out.x1 = _s.x1; + out.x2 = _s.x2; + out.y1 = _s.y1; + out.y2 = _s.y2; + out.index = i; + out.connectorLocation = segmentProportions[i][0] + (_s.l * (segmentProportions[i][1] - segmentProportions[i][0])); + } + } + + return out; + }; + + this.lineIntersection = function(x1, y1, x2, y2) { + var out = []; + for (var i = 0; i < segments.length; i++) { + out.push.apply(out, segments[i].lineIntersection(x1, y1, x2, y2)); + } + return out; + }; + + this.boxIntersection = function(x, y, w, h) { + var out = []; + for (var i = 0; i < segments.length; i++) { + out.push.apply(out, segments[i].boxIntersection(x, y, w, h)); + } + return out; + }; + + this.boundingBoxIntersection = function(box) { + var out = []; + for (var i = 0; i < segments.length; i++) { + out.push.apply(out, segments[i].boundingBoxIntersection(box)); + } + return out; + }; + + var _updateSegmentProportions = function () { + var curLoc = 0; + for (var i = 0; i < segments.length; i++) { + var sl = segments[i].getLength(); + segmentProportionalLengths[i] = sl / totalLength; + segmentProportions[i] = [curLoc, (curLoc += (sl / totalLength)) ]; + } + }, + + /** + * returns [segment, proportion of travel in segment, segment index] for the segment + * that contains the point which is 'location' distance along the entire path, where + * 'location' is a decimal between 0 and 1 inclusive. in this connector type, paths + * are made up of a list of segments, each of which contributes some fraction to + * the total length. + * From 1.3.10 this also supports the 'absolute' property, which lets us specify a location + * as the absolute distance in pixels, rather than a proportion of the total path. + */ + _findSegmentForLocation = function (location, absolute) { + + var idx, i, inSegmentProportion; + + if (absolute) { + location = location > 0 ? location / totalLength : (totalLength + location) / totalLength; + } + + // if location 1 we know its the last segment + if (location === 1) { + idx = segments.length - 1; + inSegmentProportion = 1; + } else if (location === 0) { + // if location 0 we know its the first segment + inSegmentProportion = 0; + idx = 0; + } else { + + // if location >= 0.5, traverse backwards (of course not exact, who knows the segment proportions. but + // an educated guess at least) + if (location >= 0.5) { + + idx = 0; + inSegmentProportion = 0; + for (i = segmentProportions.length - 1; i > -1; i--) { + if (segmentProportions[i][1] >= location && segmentProportions[i][0] <= location) { + idx = i; + inSegmentProportion = (location - segmentProportions[i][0]) / segmentProportionalLengths[i]; + break; + } + } + + } else { + idx = segmentProportions.length - 1; + inSegmentProportion = 1; + for (i = 0; i < segmentProportions.length; i++) { + if (segmentProportions[i][1] >= location) { + idx = i; + inSegmentProportion = (location - segmentProportions[i][0]) / segmentProportionalLengths[i]; + break; + } + } + } + } + + return { segment: segments[idx], proportion: inSegmentProportion, index: idx }; + }, + _addSegment = function (conn, type, params) { + if (params.x1 === params.x2 && params.y1 === params.y2) { + return; + } + var s = new _jp.Segments[type](params); + segments.push(s); + totalLength += s.getLength(); + conn.updateBounds(s); + }, + _clearSegments = function () { + totalLength = segments.length = segmentProportions.length = segmentProportionalLengths.length = 0; + }; + + this.setSegments = function (_segs) { + userProvidedSegments = []; + totalLength = 0; + for (var i = 0; i < _segs.length; i++) { + userProvidedSegments.push(_segs[i]); + totalLength += _segs[i].getLength(); + } + }; + + this.getLength = function() { + return totalLength; + }; + + var _prepareCompute = function (params) { + this.strokeWidth = params.strokeWidth; + var segment = _jg.quadrant(params.sourcePos, params.targetPos), + swapX = params.targetPos[0] < params.sourcePos[0], + swapY = params.targetPos[1] < params.sourcePos[1], + lw = params.strokeWidth || 1, + so = params.sourceEndpoint.anchor.getOrientation(params.sourceEndpoint), + to = params.targetEndpoint.anchor.getOrientation(params.targetEndpoint), + x = swapX ? params.targetPos[0] : params.sourcePos[0], + y = swapY ? params.targetPos[1] : params.sourcePos[1], + w = Math.abs(params.targetPos[0] - params.sourcePos[0]), + h = Math.abs(params.targetPos[1] - params.sourcePos[1]); + + // if either anchor does not have an orientation set, we derive one from their relative + // positions. we fix the axis to be the one in which the two elements are further apart, and + // point each anchor at the other element. this is also used when dragging a new connection. + if (so[0] === 0 && so[1] === 0 || to[0] === 0 && to[1] === 0) { + var index = w > h ? 0 : 1, oIndex = [1, 0][index]; + so = []; + to = []; + so[index] = params.sourcePos[index] > params.targetPos[index] ? -1 : 1; + to[index] = params.sourcePos[index] > params.targetPos[index] ? 1 : -1; + so[oIndex] = 0; + to[oIndex] = 0; + } + + var sx = swapX ? w + (sourceGap * so[0]) : sourceGap * so[0], + sy = swapY ? h + (sourceGap * so[1]) : sourceGap * so[1], + tx = swapX ? targetGap * to[0] : w + (targetGap * to[0]), + ty = swapY ? targetGap * to[1] : h + (targetGap * to[1]), + oProduct = ((so[0] * to[0]) + (so[1] * to[1])); + + var result = { + sx: sx, sy: sy, tx: tx, ty: ty, lw: lw, + xSpan: Math.abs(tx - sx), + ySpan: Math.abs(ty - sy), + mx: (sx + tx) / 2, + my: (sy + ty) / 2, + so: so, to: to, x: x, y: y, w: w, h: h, + segment: segment, + startStubX: sx + (so[0] * sourceStub), + startStubY: sy + (so[1] * sourceStub), + endStubX: tx + (to[0] * targetStub), + endStubY: ty + (to[1] * targetStub), + isXGreaterThanStubTimes2: Math.abs(sx - tx) > (sourceStub + targetStub), + isYGreaterThanStubTimes2: Math.abs(sy - ty) > (sourceStub + targetStub), + opposite: oProduct === -1, + perpendicular: oProduct === 0, + orthogonal: oProduct === 1, + sourceAxis: so[0] === 0 ? "y" : "x", + points: [x, y, w, h, sx, sy, tx, ty ], + stubs:[sourceStub, targetStub] + }; + result.anchorOrientation = result.opposite ? "opposite" : result.orthogonal ? "orthogonal" : "perpendicular"; + return result; + }; + + this.getSegments = function () { + return segments; + }; + + this.updateBounds = function (segment) { + var segBounds = segment.getBounds(); + this.bounds.minX = Math.min(this.bounds.minX, segBounds.minX); + this.bounds.maxX = Math.max(this.bounds.maxX, segBounds.maxX); + this.bounds.minY = Math.min(this.bounds.minY, segBounds.minY); + this.bounds.maxY = Math.max(this.bounds.maxY, segBounds.maxY); + }; + + var dumpSegmentsToConsole = function () { + console.log("SEGMENTS:"); + for (var i = 0; i < segments.length; i++) { + console.log(segments[i].type, segments[i].getLength(), segmentProportions[i]); + } + }; + + this.pointOnPath = function (location, absolute) { + var seg = _findSegmentForLocation(location, absolute); + return seg.segment && seg.segment.pointOnPath(seg.proportion, false) || [0, 0]; + }; + + this.gradientAtPoint = function (location, absolute) { + var seg = _findSegmentForLocation(location, absolute); + return seg.segment && seg.segment.gradientAtPoint(seg.proportion, false) || 0; + }; + + this.pointAlongPathFrom = function (location, distance, absolute) { + var seg = _findSegmentForLocation(location, absolute); + // TODO what happens if this crosses to the next segment? + return seg.segment && seg.segment.pointAlongPathFrom(seg.proportion, distance, false) || [0, 0]; + }; + + this.compute = function (params) { + paintInfo = _prepareCompute.call(this, params); + + _clearSegments(); + this._compute(paintInfo, params); + this.x = paintInfo.points[0]; + this.y = paintInfo.points[1]; + this.w = paintInfo.points[2]; + this.h = paintInfo.points[3]; + this.segment = paintInfo.segment; + _updateSegmentProportions(); + }; + + return { + addSegment: _addSegment, + prepareCompute: _prepareCompute, + sourceStub: sourceStub, + targetStub: targetStub, + maxStub: Math.max(sourceStub, targetStub), + sourceGap: sourceGap, + targetGap: targetGap, + maxGap: Math.max(sourceGap, targetGap) + }; + }; + _ju.extend(_jp.Connectors.AbstractConnector, AbstractComponent); + + + // ********************************* END OF CONNECTOR TYPES ******************************************************************* + + // ********************************* ENDPOINT TYPES ******************************************************************* + + _jp.Endpoints.AbstractEndpoint = function (params) { + AbstractComponent.apply(this, arguments); + var compute = this.compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + var out = this._compute.apply(this, arguments); + this.x = out[0]; + this.y = out[1]; + this.w = out[2]; + this.h = out[3]; + this.bounds.minX = this.x; + this.bounds.minY = this.y; + this.bounds.maxX = this.x + this.w; + this.bounds.maxY = this.y + this.h; + return out; + }; + return { + compute: compute, + cssClass: params.cssClass + }; + }; + _ju.extend(_jp.Endpoints.AbstractEndpoint, AbstractComponent); + + /** + * Class: Endpoints.Dot + * A round endpoint, with default radius 10 pixels. + */ + + /** + * Function: Constructor + * + * Parameters: + * + * radius - radius of the endpoint. defaults to 10 pixels. + */ + _jp.Endpoints.Dot = function (params) { + this.type = "Dot"; + var _super = _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + params = params || {}; + this.radius = params.radius || 10; + this.defaultOffset = 0.5 * this.radius; + this.defaultInnerRadius = this.radius / 3; + + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + this.radius = endpointStyle.radius || this.radius; + var x = anchorPoint[0] - this.radius, + y = anchorPoint[1] - this.radius, + w = this.radius * 2, + h = this.radius * 2; + + if (endpointStyle.stroke) { + var lw = endpointStyle.strokeWidth || 1; + x -= lw; + y -= lw; + w += (lw * 2); + h += (lw * 2); + } + return [ x, y, w, h, this.radius ]; + }; + }; + _ju.extend(_jp.Endpoints.Dot, _jp.Endpoints.AbstractEndpoint); + + _jp.Endpoints.Rectangle = function (params) { + this.type = "Rectangle"; + var _super = _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + params = params || {}; + this.width = params.width || 20; + this.height = params.height || 20; + + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + var width = endpointStyle.width || this.width, + height = endpointStyle.height || this.height, + x = anchorPoint[0] - (width / 2), + y = anchorPoint[1] - (height / 2); + + return [ x, y, width, height]; + }; + }; + _ju.extend(_jp.Endpoints.Rectangle, _jp.Endpoints.AbstractEndpoint); + + var DOMElementEndpoint = function (params) { + _jp.jsPlumbUIComponent.apply(this, arguments); + this._jsPlumb.displayElements = []; + }; + _ju.extend(DOMElementEndpoint, _jp.jsPlumbUIComponent, { + getDisplayElements: function () { + return this._jsPlumb.displayElements; + }, + appendDisplayElement: function (el) { + this._jsPlumb.displayElements.push(el); + } + }); + + /** + * Class: Endpoints.Image + * Draws an image as the Endpoint. + */ + /** + * Function: Constructor + * + * Parameters: + * + * src - location of the image to use. + + TODO: multiple references to self. not sure quite how to get rid of them entirely. perhaps self = null in the cleanup + function will suffice + + TODO this class still might leak memory. + + */ + _jp.Endpoints.Image = function (params) { + + this.type = "Image"; + DOMElementEndpoint.apply(this, arguments); + _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + + var _onload = params.onload, + src = params.src || params.url, + clazz = params.cssClass ? " " + params.cssClass : ""; + + this._jsPlumb.img = new Image(); + this._jsPlumb.ready = false; + this._jsPlumb.initialized = false; + this._jsPlumb.deleted = false; + this._jsPlumb.widthToUse = params.width; + this._jsPlumb.heightToUse = params.height; + this._jsPlumb.endpoint = params.endpoint; + + this._jsPlumb.img.onload = function () { + if (this._jsPlumb != null) { + this._jsPlumb.ready = true; + this._jsPlumb.widthToUse = this._jsPlumb.widthToUse || this._jsPlumb.img.width; + this._jsPlumb.heightToUse = this._jsPlumb.heightToUse || this._jsPlumb.img.height; + if (_onload) { + _onload(this); + } + } + }.bind(this); + + /* + Function: setImage + Sets the Image to use in this Endpoint. + + Parameters: + img - may be a URL or an Image object + onload - optional; a callback to execute once the image has loaded. + */ + this._jsPlumb.endpoint.setImage = function (_img, onload) { + var s = _img.constructor === String ? _img : _img.src; + _onload = onload; + this._jsPlumb.img.src = s; + + if (this.canvas != null) { + this.canvas.setAttribute("src", this._jsPlumb.img.src); + } + }.bind(this); + + this._jsPlumb.endpoint.setImage(src, _onload); + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + this.anchorPoint = anchorPoint; + if (this._jsPlumb.ready) { + return [anchorPoint[0] - this._jsPlumb.widthToUse / 2, anchorPoint[1] - this._jsPlumb.heightToUse / 2, + this._jsPlumb.widthToUse, this._jsPlumb.heightToUse]; + } + else { + return [0, 0, 0, 0]; + } + }; + + this.canvas = _jp.createElement("img", { + position:"absolute", + margin:0, + padding:0, + outline:0 + }, this._jsPlumb.instance.endpointClass + clazz); + + if (this._jsPlumb.widthToUse) { + this.canvas.setAttribute("width", this._jsPlumb.widthToUse); + } + if (this._jsPlumb.heightToUse) { + this.canvas.setAttribute("height", this._jsPlumb.heightToUse); + } + this._jsPlumb.instance.appendElement(this.canvas); + + this.actuallyPaint = function (d, style, anchor) { + if (!this._jsPlumb.deleted) { + if (!this._jsPlumb.initialized) { + this.canvas.setAttribute("src", this._jsPlumb.img.src); + this.appendDisplayElement(this.canvas); + this._jsPlumb.initialized = true; + } + var x = this.anchorPoint[0] - (this._jsPlumb.widthToUse / 2), + y = this.anchorPoint[1] - (this._jsPlumb.heightToUse / 2); + _ju.sizeElement(this.canvas, x, y, this._jsPlumb.widthToUse, this._jsPlumb.heightToUse); + } + }; + + this.paint = function (style, anchor) { + if (this._jsPlumb != null) { // may have been deleted + if (this._jsPlumb.ready) { + this.actuallyPaint(style, anchor); + } + else { + root.setTimeout(function () { + this.paint(style, anchor); + }.bind(this), 200); + } + } + }; + }; + _ju.extend(_jp.Endpoints.Image, [ DOMElementEndpoint, _jp.Endpoints.AbstractEndpoint ], { + cleanup: function (force) { + if (force) { + this._jsPlumb.deleted = true; + if (this.canvas) { + this.canvas.parentNode.removeChild(this.canvas); + } + this.canvas = null; + } + } + }); + + /* + * Class: Endpoints.Blank + * An Endpoint that paints nothing (visible) on the screen. Supports cssClass and hoverClass parameters like all Endpoints. + */ + _jp.Endpoints.Blank = function (params) { + var _super = _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + this.type = "Blank"; + DOMElementEndpoint.apply(this, arguments); + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + return [anchorPoint[0], anchorPoint[1], 10, 0]; + }; + + var clazz = params.cssClass ? " " + params.cssClass : ""; + + this.canvas = _jp.createElement("div", { + display: "block", + width: "1px", + height: "1px", + background: "transparent", + position: "absolute" + }, this._jsPlumb.instance.endpointClass + clazz); + + this._jsPlumb.instance.appendElement(this.canvas); + + this.paint = function (style, anchor) { + _ju.sizeElement(this.canvas, this.x, this.y, this.w, this.h); + }; + }; + _ju.extend(_jp.Endpoints.Blank, [_jp.Endpoints.AbstractEndpoint, DOMElementEndpoint], { + cleanup: function () { + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + } + }); + + /* + * Class: Endpoints.Triangle + * A triangular Endpoint. + */ + /* + * Function: Constructor + * + * Parameters: + * + * width width of the triangle's base. defaults to 55 pixels. + * height height of the triangle from base to apex. defaults to 55 pixels. + */ + _jp.Endpoints.Triangle = function (params) { + this.type = "Triangle"; + _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + var self = this; + params = params || { }; + params.width = params.width || 55; + params.height = params.height || 55; + this.width = params.width; + this.height = params.height; + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + var width = endpointStyle.width || self.width, + height = endpointStyle.height || self.height, + x = anchorPoint[0] - (width / 2), + y = anchorPoint[1] - (height / 2); + return [ x, y, width, height ]; + }; + }; +// ********************************* END OF ENDPOINT TYPES ******************************************************************* + + +// ********************************* OVERLAY DEFINITIONS *********************************************************************** + + var AbstractOverlay = _jp.Overlays.AbstractOverlay = function (params) { + this.visible = true; + this.isAppendedAtTopLevel = true; + this.component = params.component; + this.loc = params.location == null ? 0.5 : params.location; + this.endpointLoc = params.endpointLocation == null ? [ 0.5, 0.5] : params.endpointLocation; + this.visible = params.visible !== false; + }; + AbstractOverlay.prototype = { + cleanup: function (force) { + if (force) { + this.component = null; + this.canvas = null; + this.endpointLoc = null; + } + }, + reattach:function(instance, component) { }, + setVisible: function (val) { + this.visible = val; + this.component.repaint(); + }, + isVisible: function () { + return this.visible; + }, + hide: function () { + this.setVisible(false); + }, + show: function () { + this.setVisible(true); + }, + incrementLocation: function (amount) { + this.loc += amount; + this.component.repaint(); + }, + setLocation: function (l) { + this.loc = l; + this.component.repaint(); + }, + getLocation: function () { + return this.loc; + }, + updateFrom:function() { } + }; + + + /* + * Class: Overlays.Arrow + * + * An arrow overlay, defined by four points: the head, the two sides of the tail, and a 'foldback' point at some distance along the length + * of the arrow that lines from each tail point converge into. The foldback point is defined using a decimal that indicates some fraction + * of the length of the arrow and has a default value of 0.623. A foldback point value of 1 would mean that the arrow had a straight line + * across the tail. + */ + /* + * @constructor + * + * @param {Object} params Constructor params. + * @param {Number} [params.length] Distance in pixels from head to tail baseline. default 20. + * @param {Number} [params.width] Width in pixels of the tail baseline. default 20. + * @param {String} [params.fill] Style to use when filling the arrow. defaults to "black". + * @param {String} [params.stroke] Style to use when stroking the arrow. defaults to null, which means the arrow is not stroked. + * @param {Number} [params.stroke-width] Line width to use when stroking the arrow. defaults to 1, but only used if stroke is not null. + * @param {Number} [params.foldback] Distance (as a decimal from 0 to 1 inclusive) along the length of the arrow marking the point the tail points should fold back to. defaults to 0.623. + * @param {Number} [params.location] Distance (as a decimal from 0 to 1 inclusive) marking where the arrow should sit on the connector. defaults to 0.5. + * @param {NUmber} [params.direction] Indicates the direction the arrow points in. valid values are -1 and 1; 1 is default. + */ + _jp.Overlays.Arrow = function (params) { + this.type = "Arrow"; + AbstractOverlay.apply(this, arguments); + this.isAppendedAtTopLevel = false; + params = params || {}; + var self = this; + + this.length = params.length || 20; + this.width = params.width || 20; + this.id = params.id; + this.direction = (params.direction || 1) < 0 ? -1 : 1; + var paintStyle = params.paintStyle || { "stroke-width": 1 }, + // how far along the arrow the lines folding back in come to. default is 62.3%. + foldback = params.foldback || 0.623; + + this.computeMaxSize = function () { + return self.width * 1.5; + }; + + this.elementCreated = function(p, component) { + this.path = p; + if (params.events) { + for (var i in params.events) { + _jp.on(p, i, params.events[i]); + } + } + }; + + this.draw = function (component, currentConnectionPaintStyle) { + + var hxy, mid, txy, tail, cxy; + if (component.pointAlongPathFrom) { + + if (_ju.isString(this.loc) || this.loc > 1 || this.loc < 0) { + var l = parseInt(this.loc, 10), + fromLoc = this.loc < 0 ? 1 : 0; + hxy = component.pointAlongPathFrom(fromLoc, l, false); + mid = component.pointAlongPathFrom(fromLoc, l - (this.direction * this.length / 2), false); + txy = _jg.pointOnLine(hxy, mid, this.length); + } + else if (this.loc === 1) { + hxy = component.pointOnPath(this.loc); + mid = component.pointAlongPathFrom(this.loc, -(this.length)); + txy = _jg.pointOnLine(hxy, mid, this.length); + + if (this.direction === -1) { + var _ = txy; + txy = hxy; + hxy = _; + } + } + else if (this.loc === 0) { + txy = component.pointOnPath(this.loc); + mid = component.pointAlongPathFrom(this.loc, this.length); + hxy = _jg.pointOnLine(txy, mid, this.length); + if (this.direction === -1) { + var __ = txy; + txy = hxy; + hxy = __; + } + } + else { + hxy = component.pointAlongPathFrom(this.loc, this.direction * this.length / 2); + mid = component.pointOnPath(this.loc); + txy = _jg.pointOnLine(hxy, mid, this.length); + } + + tail = _jg.perpendicularLineTo(hxy, txy, this.width); + cxy = _jg.pointOnLine(hxy, txy, foldback * this.length); + + var d = { hxy: hxy, tail: tail, cxy: cxy }, + stroke = paintStyle.stroke || currentConnectionPaintStyle.stroke, + fill = paintStyle.fill || currentConnectionPaintStyle.stroke, + lineWidth = paintStyle.strokeWidth || currentConnectionPaintStyle.strokeWidth; + + return { + component: component, + d: d, + "stroke-width": lineWidth, + stroke: stroke, + fill: fill, + minX: Math.min(hxy.x, tail[0].x, tail[1].x), + maxX: Math.max(hxy.x, tail[0].x, tail[1].x), + minY: Math.min(hxy.y, tail[0].y, tail[1].y), + maxY: Math.max(hxy.y, tail[0].y, tail[1].y) + }; + } + else { + return {component: component, minX: 0, maxX: 0, minY: 0, maxY: 0}; + } + }; + }; + _ju.extend(_jp.Overlays.Arrow, AbstractOverlay, { + updateFrom:function(d) { + this.length = d.length || this.length; + this.width = d.width|| this.width; + this.direction = d.direction != null ? d.direction : this.direction; + this.foldback = d.foldback|| this.foldback; + }, + cleanup:function() { + if (this.path && this.path.parentNode) { + this.path.parentNode.removeChild(this.path); + } + } + }); + + /* + * Class: Overlays.PlainArrow + * + * A basic arrow. This is in fact just one instance of the more generic case in which the tail folds back on itself to some + * point along the length of the arrow: in this case, that foldback point is the full length of the arrow. so it just does + * a 'call' to Arrow with foldback set appropriately. + */ + /* + * Function: Constructor + * See for allowed parameters for this overlay. + */ + _jp.Overlays.PlainArrow = function (params) { + params = params || {}; + var p = _jp.extend(params, {foldback: 1}); + _jp.Overlays.Arrow.call(this, p); + this.type = "PlainArrow"; + }; + _ju.extend(_jp.Overlays.PlainArrow, _jp.Overlays.Arrow); + + /* + * Class: Overlays.Diamond + * + * A diamond. Like PlainArrow, this is a concrete case of the more generic case of the tail points converging on some point...it just + * happens that in this case, that point is greater than the length of the the arrow. + * + * this could probably do with some help with positioning...due to the way it reuses the Arrow paint code, what Arrow thinks is the + * center is actually 1/4 of the way along for this guy. but we don't have any knowledge of pixels at this point, so we're kind of + * stuck when it comes to helping out the Arrow class. possibly we could pass in a 'transpose' parameter or something. the value + * would be -l/4 in this case - move along one quarter of the total length. + */ + /* + * Function: Constructor + * See for allowed parameters for this overlay. + */ + _jp.Overlays.Diamond = function (params) { + params = params || {}; + var l = params.length || 40, + p = _jp.extend(params, {length: l / 2, foldback: 2}); + _jp.Overlays.Arrow.call(this, p); + this.type = "Diamond"; + }; + _ju.extend(_jp.Overlays.Diamond, _jp.Overlays.Arrow); + + var _getDimensions = function (component, forceRefresh) { + if (component._jsPlumb.cachedDimensions == null || forceRefresh) { + component._jsPlumb.cachedDimensions = component.getDimensions(); + } + return component._jsPlumb.cachedDimensions; + }; + + // abstract superclass for overlays that add an element to the DOM. + var AbstractDOMOverlay = function (params) { + _jp.jsPlumbUIComponent.apply(this, arguments); + AbstractOverlay.apply(this, arguments); + + // hand off fired events to associated component. + var _f = this.fire; + this.fire = function () { + _f.apply(this, arguments); + if (this.component) { + this.component.fire.apply(this.component, arguments); + } + }; + + this.detached=false; + this.id = params.id; + this._jsPlumb.div = null; + this._jsPlumb.initialised = false; + this._jsPlumb.component = params.component; + this._jsPlumb.cachedDimensions = null; + this._jsPlumb.create = params.create; + this._jsPlumb.initiallyInvisible = params.visible === false; + + this.getElement = function () { + if (this._jsPlumb.div == null) { + var div = this._jsPlumb.div = _jp.getElement(this._jsPlumb.create(this._jsPlumb.component)); + div.style.position = "absolute"; + jsPlumb.addClass(div, this._jsPlumb.instance.overlayClass + " " + + (this.cssClass ? this.cssClass : + params.cssClass ? params.cssClass : "")); + this._jsPlumb.instance.appendElement(div); + this._jsPlumb.instance.getId(div); + this.canvas = div; + + // in IE the top left corner is what it placed at the desired location. This will not + // be fixed. IE8 is not going to be supported for much longer. + var ts = "translate(-50%, -50%)"; + div.style.webkitTransform = ts; + div.style.mozTransform = ts; + div.style.msTransform = ts; + div.style.oTransform = ts; + div.style.transform = ts; + + // write the related component into the created element + div._jsPlumb = this; + + if (params.visible === false) { + div.style.display = "none"; + } + } + return this._jsPlumb.div; + }; + + this.draw = function (component, currentConnectionPaintStyle, absolutePosition) { + var td = _getDimensions(this); + if (td != null && td.length === 2) { + var cxy = { x: 0, y: 0 }; + + // absolutePosition would have been set by a call to connection.setAbsoluteOverlayPosition. + if (absolutePosition) { + cxy = { x: absolutePosition[0], y: absolutePosition[1] }; + } + else if (component.pointOnPath) { + var loc = this.loc, absolute = false; + if (_ju.isString(this.loc) || this.loc < 0 || this.loc > 1) { + loc = parseInt(this.loc, 10); + absolute = true; + } + cxy = component.pointOnPath(loc, absolute); // a connection + } + else { + var locToUse = this.loc.constructor === Array ? this.loc : this.endpointLoc; + cxy = { x: locToUse[0] * component.w, + y: locToUse[1] * component.h }; + } + + var minx = cxy.x - (td[0] / 2), + miny = cxy.y - (td[1] / 2); + + return { + component: component, + d: { minx: minx, miny: miny, td: td, cxy: cxy }, + minX: minx, + maxX: minx + td[0], + minY: miny, + maxY: miny + td[1] + }; + } + else { + return {minX: 0, maxX: 0, minY: 0, maxY: 0}; + } + }; + }; + _ju.extend(AbstractDOMOverlay, [_jp.jsPlumbUIComponent, AbstractOverlay], { + getDimensions: function () { + return [1,1]; + }, + setVisible: function (state) { + if (this._jsPlumb.div) { + this._jsPlumb.div.style.display = state ? "block" : "none"; + // if initially invisible, dimensions are 0,0 and never get updated + if (state && this._jsPlumb.initiallyInvisible) { + _getDimensions(this, true); + this.component.repaint(); + this._jsPlumb.initiallyInvisible = false; + } + } + }, + /* + * Function: clearCachedDimensions + * Clears the cached dimensions for the label. As a performance enhancement, label dimensions are + * cached from 1.3.12 onwards. The cache is cleared when you change the label text, of course, but + * there are other reasons why the text dimensions might change - if you make a change through CSS, for + * example, you might change the font size. in that case you should explicitly call this method. + */ + clearCachedDimensions: function () { + this._jsPlumb.cachedDimensions = null; + }, + cleanup: function (force) { + if (force) { + if (this._jsPlumb.div != null) { + this._jsPlumb.div._jsPlumb = null; + this._jsPlumb.instance.removeElement(this._jsPlumb.div); + } + } + else { + // if not a forced cleanup, just detach child from parent for now. + if (this._jsPlumb && this._jsPlumb.div && this._jsPlumb.div.parentNode) { + this._jsPlumb.div.parentNode.removeChild(this._jsPlumb.div); + } + this.detached = true; + } + + }, + reattach:function(instance, component) { + if (this._jsPlumb.div != null) { + instance.getContainer().appendChild(this._jsPlumb.div); + } + this.detached = false; + }, + computeMaxSize: function () { + var td = _getDimensions(this); + return Math.max(td[0], td[1]); + }, + paint: function (p, containerExtents) { + if (!this._jsPlumb.initialised) { + this.getElement(); + p.component.appendDisplayElement(this._jsPlumb.div); + this._jsPlumb.initialised = true; + if (this.detached) { + this._jsPlumb.div.parentNode.removeChild(this._jsPlumb.div); + } + } + this._jsPlumb.div.style.left = (p.component.x + p.d.minx) + "px"; + this._jsPlumb.div.style.top = (p.component.y + p.d.miny) + "px"; + } + }); + + /* + * Class: Overlays.Custom + * A Custom overlay. You supply a 'create' function which returns some DOM element, and jsPlumb positions it. + * The 'create' function is passed a Connection or Endpoint. + */ + /* + * Function: Constructor + * + * Parameters: + * create - function for jsPlumb to call that returns a DOM element. + * location - distance (as a decimal from 0 to 1 inclusive) marking where the label should sit on the connector. defaults to 0.5. + * id - optional id to use for later retrieval of this overlay. + * + */ + _jp.Overlays.Custom = function (params) { + this.type = "Custom"; + AbstractDOMOverlay.apply(this, arguments); + }; + _ju.extend(_jp.Overlays.Custom, AbstractDOMOverlay); + + _jp.Overlays.GuideLines = function () { + var self = this; + self.length = 50; + self.strokeWidth = 5; + this.type = "GuideLines"; + AbstractOverlay.apply(this, arguments); + _jp.jsPlumbUIComponent.apply(this, arguments); + this.draw = function (connector, currentConnectionPaintStyle) { + + var head = connector.pointAlongPathFrom(self.loc, self.length / 2), + mid = connector.pointOnPath(self.loc), + tail = _jg.pointOnLine(head, mid, self.length), + tailLine = _jg.perpendicularLineTo(head, tail, 40), + headLine = _jg.perpendicularLineTo(tail, head, 20); + + return { + connector: connector, + head: head, + tail: tail, + headLine: headLine, + tailLine: tailLine, + minX: Math.min(head.x, tail.x, headLine[0].x, headLine[1].x), + minY: Math.min(head.y, tail.y, headLine[0].y, headLine[1].y), + maxX: Math.max(head.x, tail.x, headLine[0].x, headLine[1].x), + maxY: Math.max(head.y, tail.y, headLine[0].y, headLine[1].y) + }; + }; + + // this.cleanup = function() { }; // nothing to clean up for GuideLines + }; + + /* + * Class: Overlays.Label + + */ + /* + * Function: Constructor + * + * Parameters: + * cssClass - optional css class string to append to css class. This string is appended "as-is", so you can of course have multiple classes + * defined. This parameter is preferred to using labelStyle, borderWidth and borderStyle. + * label - the label to paint. May be a string or a function that returns a string. Nothing will be painted if your label is null or your + * label function returns null. empty strings _will_ be painted. + * location - distance (as a decimal from 0 to 1 inclusive) marking where the label should sit on the connector. defaults to 0.5. + * id - optional id to use for later retrieval of this overlay. + * + * + */ + _jp.Overlays.Label = function (params) { + this.labelStyle = params.labelStyle; + + var labelWidth = null, labelHeight = null, labelText = null, labelPadding = null; + this.cssClass = this.labelStyle != null ? this.labelStyle.cssClass : null; + var p = _jp.extend({ + create: function () { + return _jp.createElement("div"); + }}, params); + _jp.Overlays.Custom.call(this, p); + this.type = "Label"; + this.label = params.label || ""; + this.labelText = null; + if (this.labelStyle) { + var el = this.getElement(); + this.labelStyle.font = this.labelStyle.font || "12px sans-serif"; + el.style.font = this.labelStyle.font; + el.style.color = this.labelStyle.color || "black"; + if (this.labelStyle.fill) { + el.style.background = this.labelStyle.fill; + } + if (this.labelStyle.borderWidth > 0) { + var dStyle = this.labelStyle.borderStyle ? this.labelStyle.borderStyle : "black"; + el.style.border = this.labelStyle.borderWidth + "px solid " + dStyle; + } + if (this.labelStyle.padding) { + el.style.padding = this.labelStyle.padding; + } + } + + }; + _ju.extend(_jp.Overlays.Label, _jp.Overlays.Custom, { + cleanup: function (force) { + if (force) { + this.div = null; + this.label = null; + this.labelText = null; + this.cssClass = null; + this.labelStyle = null; + } + }, + getLabel: function () { + return this.label; + }, + /* + * Function: setLabel + * sets the label's, um, label. you would think i'd call this function + * 'setText', but you can pass either a Function or a String to this, so + * it makes more sense as 'setLabel'. This uses innerHTML on the label div, so keep + * that in mind if you need escaped HTML. + */ + setLabel: function (l) { + this.label = l; + this.labelText = null; + this.clearCachedDimensions(); + this.update(); + this.component.repaint(); + }, + getDimensions: function () { + this.update(); + return AbstractDOMOverlay.prototype.getDimensions.apply(this, arguments); + }, + update: function () { + if (typeof this.label === "function") { + var lt = this.label(this); + this.getElement().innerHTML = lt.replace(/\r\n/g, "
    "); + } + else { + if (this.labelText == null) { + this.labelText = this.label; + this.getElement().innerHTML = this.labelText.replace(/\r\n/g, "
    "); + } + } + }, + updateFrom:function(d) { + if(d.label != null){ + this.setLabel(d.label); + } + } + }); + + // ********************************* END OF OVERLAY DEFINITIONS *********************************************************************** + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * Copyright (c) 2010 - 2020 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function() { + "use strict"; + + var root = this, + _ju = root.jsPlumbUtil, + _jpi = root.jsPlumbInstance; + + var GROUP_COLLAPSED_CLASS = "jtk-group-collapsed"; + var GROUP_EXPANDED_CLASS = "jtk-group-expanded"; + var GROUP_CONTAINER_SELECTOR = "[jtk-group-content]"; + var ELEMENT_DRAGGABLE_EVENT = "elementDraggable"; + var STOP = "stop"; + var REVERT = "revert"; + var GROUP_MANAGER = "_groupManager"; + var GROUP = "_jsPlumbGroup"; + var GROUP_DRAG_SCOPE = "_jsPlumbGroupDrag"; + var EVT_CHILD_ADDED = "group:addMember"; + var EVT_CHILD_REMOVED = "group:removeMember"; + var EVT_GROUP_ADDED = "group:add"; + var EVT_GROUP_REMOVED = "group:remove"; + var EVT_EXPAND = "group:expand"; + var EVT_COLLAPSE = "group:collapse"; + var EVT_GROUP_DRAG_STOP = "groupDragStop"; + var EVT_CONNECTION_MOVED = "connectionMoved"; + var EVT_INTERNAL_CONNECTION_DETACHED = "internal.connectionDetached"; + + var CMD_REMOVE_ALL = "removeAll"; + var CMD_ORPHAN_ALL = "orphanAll"; + var CMD_SHOW = "show"; + var CMD_HIDE = "hide"; + + var GroupManager = function(_jsPlumb) { + var _managedGroups = {}, _connectionSourceMap = {}, _connectionTargetMap = {}, self = this; + + // function findGroupFor(el) { + // var c = _jsPlumb.getContainer(); + // var abort = false, g = null, child = null; + // while (!abort) { + // if (el == null || el === c) { + // abort = true; + // } else { + // if (el[GROUP]) { + // g = el[GROUP]; + // child = el; + // abort = true; + // } else { + // el = el.parentNode; + // } + // } + // } + // return g; + // } + + function isDescendant(el, parentEl) { + var c = _jsPlumb.getContainer(); + var abort = false, g = null, child = null; + while (!abort) { + if (el == null || el === c) { + return false; + } else { + if (el === parentEl) { + return true; + } else { + el = el.parentNode; + } + } + } + } + + _jsPlumb.bind("connection", function(p) { + + var sourceGroup = _jsPlumb.getGroupFor(p.source); + var targetGroup = _jsPlumb.getGroupFor(p.target); + + if (sourceGroup != null && targetGroup != null && sourceGroup === targetGroup) { + _connectionSourceMap[p.connection.id] = sourceGroup; + _connectionTargetMap[p.connection.id] = sourceGroup; + } + else { + if (sourceGroup != null) { + _ju.suggest(sourceGroup.connections.source, p.connection); + _connectionSourceMap[p.connection.id] = sourceGroup; + } + if (targetGroup != null) { + _ju.suggest(targetGroup.connections.target, p.connection); + _connectionTargetMap[p.connection.id] = targetGroup; + } + } + }); + + function _cleanupDetachedConnection(conn) { + delete conn.proxies; + var group = _connectionSourceMap[conn.id], f; + if (group != null) { + f = function(c) { return c.id === conn.id; }; + _ju.removeWithFunction(group.connections.source, f); + _ju.removeWithFunction(group.connections.target, f); + delete _connectionSourceMap[conn.id]; + } + + group = _connectionTargetMap[conn.id]; + if (group != null) { + f = function(c) { return c.id === conn.id; }; + _ju.removeWithFunction(group.connections.source, f); + _ju.removeWithFunction(group.connections.target, f); + delete _connectionTargetMap[conn.id]; + } + } + + _jsPlumb.bind(EVT_INTERNAL_CONNECTION_DETACHED, function(p) { + _cleanupDetachedConnection(p.connection); + }); + + _jsPlumb.bind(EVT_CONNECTION_MOVED, function(p) { + var connMap = p.index === 0 ? _connectionSourceMap : _connectionTargetMap; + var group = connMap[p.connection.id]; + if (group) { + var list = group.connections[p.index === 0 ? "source" : "target"]; + var idx = list.indexOf(p.connection); + if (idx !== -1) { + list.splice(idx, 1); + } + } + }); + + this.addGroup = function(group) { + _jsPlumb.addClass(group.getEl(), GROUP_EXPANDED_CLASS); + _managedGroups[group.id] = group; + group.manager = this; + _updateConnectionsForGroup(group); + _jsPlumb.fire(EVT_GROUP_ADDED, { group:group }); + }; + + this.addToGroup = function(group, el, doNotFireEvent) { + group = this.getGroup(group); + if (group) { + var groupEl = group.getEl(); + + if (el._isJsPlumbGroup) { + return; + } + var currentGroup = el._jsPlumbGroup; + // if already a member of this group, do nothing + if (currentGroup !== group) { + + _jsPlumb.removeFromDragSelection(el); + + var elpos = _jsPlumb.getOffset(el, true); + var cpos = group.collapsed ? _jsPlumb.getOffset(groupEl, true) : _jsPlumb.getOffset(group.getDragArea(), true); + + // otherwise, transfer to this group. + if (currentGroup != null) { + currentGroup.remove(el, false, doNotFireEvent, false, group); + self.updateConnectionsForGroup(currentGroup); + } + group.add(el, doNotFireEvent/*, currentGroup*/); + + var handleDroppedConnections = function (list, index) { + var oidx = index === 0 ? 1 : 0; + list.each(function (c) { + c.setVisible(false); + if (c.endpoints[oidx].element._jsPlumbGroup === group) { + c.endpoints[oidx].setVisible(false); + _expandConnection(c, oidx, group); + } + else { + c.endpoints[index].setVisible(false); + _collapseConnection(c, index, group); + } + }); + }; + + if (group.collapsed) { + handleDroppedConnections(_jsPlumb.select({source: el}), 0); + handleDroppedConnections(_jsPlumb.select({target: el}), 1); + } + + var elId = _jsPlumb.getId(el); + _jsPlumb.dragManager.setParent(el, elId, groupEl, _jsPlumb.getId(groupEl), elpos); + + var newPosition = { left: elpos.left - cpos.left, top: elpos.top - cpos.top }; + + _jsPlumb.setPosition(el, newPosition); + + _jsPlumb.dragManager.revalidateParent(el, elId, elpos); + + self.updateConnectionsForGroup(group); + + _jsPlumb.revalidate(elId); + + if (!doNotFireEvent) { + var p = {group: group, el: el, pos:newPosition}; + if (currentGroup) { + p.sourceGroup = currentGroup; + } + _jsPlumb.fire(EVT_CHILD_ADDED, p); + } + } + } + }; + + this.removeFromGroup = function(group, el, doNotFireEvent) { + group = this.getGroup(group); + if (group) { + + // if this group is currently collapsed then any proxied connections for the given el (or its descendants) need + // to be put back on their original element, and unproxied + if (group.collapsed) { + var _expandSet = function (conns, index) { + for (var i = 0; i < conns.length; i++) { + var c = conns[i]; + if (c.proxies) { + for(var j = 0; j < c.proxies.length; j++) { + if (c.proxies[j] != null) { + var proxiedElement = c.proxies[j].originalEp.element; + if (proxiedElement === el || isDescendant(proxiedElement, el)) { + _expandConnection(c, index, group); + } + } + + } + } + } + }; + + // setup proxies for sources and targets + _expandSet(group.connections.source.slice(), 0); + _expandSet(group.connections.target.slice(), 1); + } + + group.remove(el, null, doNotFireEvent); + } + }; + + this.getGroup = function(groupId) { + var group = groupId; + if (_ju.isString(groupId)) { + group = _managedGroups[groupId]; + if (group == null) { + throw new TypeError("No such group [" + groupId + "]"); + } + } + return group; + }; + + this.getGroups = function() { + var o = []; + for (var g in _managedGroups) { + o.push(_managedGroups[g]); + } + return o; + }; + + this.removeGroup = function(group, deleteMembers, manipulateDOM, doNotFireEvent) { + group = this.getGroup(group); + this.expandGroup(group, true); // this reinstates any original connections and removes all proxies, but does not fire an event. + var newPositions = group[deleteMembers ? CMD_REMOVE_ALL : CMD_ORPHAN_ALL](manipulateDOM, doNotFireEvent); + _jsPlumb.remove(group.getEl()); + delete _managedGroups[group.id]; + delete _jsPlumb._groups[group.id]; + _jsPlumb.fire(EVT_GROUP_REMOVED, { group:group }); + return newPositions; // this will be null in the case or remove, but be a map of {id->[x,y]} in the case of orphan + }; + + this.removeAllGroups = function(deleteMembers, manipulateDOM, doNotFireEvent) { + for (var g in _managedGroups) { + this.removeGroup(_managedGroups[g], deleteMembers, manipulateDOM, doNotFireEvent); + } + }; + + function _setVisible(group, state) { + + // TODO discovering the list of elements would ideally be a pluggable function. + var m = group.getEl().querySelectorAll(".jtk-managed"); + for (var i = 0; i < m.length; i++) { + _jsPlumb[state ? CMD_SHOW : CMD_HIDE](m[i], true); + } + } + + var _collapseConnection = function(c, index, group) { + + var otherEl = c.endpoints[index === 0 ? 1 : 0].element; + if (otherEl[GROUP] && (!otherEl[GROUP].shouldProxy() && otherEl[GROUP].collapsed)) { + return; + } + + var groupEl = group.getEl(), groupElId = _jsPlumb.getId(groupEl); + + _jsPlumb.proxyConnection(c, index, groupEl, groupElId, function(c, index) { return group.getEndpoint(c, index); }, function(c, index) { return group.getAnchor(c, index); }); + }; + + this.collapseGroup = function(group) { + group = this.getGroup(group); + if (group == null || group.collapsed) { + return; + } + var groupEl = group.getEl(); + + // todo remove old proxy endpoints first, just in case? + //group.proxies.length = 0; + + // hide all connections + _setVisible(group, false); + + if (group.shouldProxy()) { + // collapses all connections in a group. + var _collapseSet = function (conns, index) { + for (var i = 0; i < conns.length; i++) { + var c = conns[i]; + _collapseConnection(c, index, group); + } + }; + + // setup proxies for sources and targets + _collapseSet(group.connections.source, 0); + _collapseSet(group.connections.target, 1); + } + + group.collapsed = true; + _jsPlumb.removeClass(groupEl, GROUP_EXPANDED_CLASS); + _jsPlumb.addClass(groupEl, GROUP_COLLAPSED_CLASS); + _jsPlumb.revalidate(groupEl); + _jsPlumb.fire(EVT_COLLAPSE, { group:group }); + }; + + var _expandConnection = function(c, index, group) { + _jsPlumb.unproxyConnection(c, index, _jsPlumb.getId(group.getEl())); + }; + + this.expandGroup = function(group, doNotFireEvent) { + + group = this.getGroup(group); + + if (group == null || !group.collapsed) { + return; + } + var groupEl = group.getEl(); + + _setVisible(group, true); + + if (group.shouldProxy()) { + // expands all connections in a group. + var _expandSet = function (conns, index) { + for (var i = 0; i < conns.length; i++) { + var c = conns[i]; + _expandConnection(c, index, group); + } + }; + + // setup proxies for sources and targets + _expandSet(group.connections.source, 0); + _expandSet(group.connections.target, 1); + } + + group.collapsed = false; + _jsPlumb.addClass(groupEl, GROUP_EXPANDED_CLASS); + _jsPlumb.removeClass(groupEl, GROUP_COLLAPSED_CLASS); + _jsPlumb.revalidate(groupEl); + this.repaintGroup(group); + if (!doNotFireEvent) { + _jsPlumb.fire(EVT_EXPAND, { group: group}); + } + }; + + this.repaintGroup = function(group) { + group = this.getGroup(group); + var m = group.getMembers(); + for (var i = 0; i < m.length; i++) { + _jsPlumb.revalidate(m[i]); + } + }; + + // TODO refactor this with the code that responds to `connection` events. + function _updateConnectionsForGroup(group) { + var members = group.getMembers().slice(); + + var childMembers = []; + for (var i = 0; i < members.length; i++) { + Array.prototype.push.apply(childMembers, members[i].querySelectorAll(".jtk-managed")); + } + Array.prototype.push.apply(members, childMembers); + + var c1 = _jsPlumb.getConnections({source:members, scope:"*"}, true); + var c2 = _jsPlumb.getConnections({target:members, scope:"*"}, true); + + var processed = {}; + group.connections.source.length = 0; + group.connections.target.length = 0; + var oneSet = function(c) { + for (var i = 0; i < c.length; i++) { + if (processed[c[i].id]) { + continue; + } + processed[c[i].id] = true; + var gs = _jsPlumb.getGroupFor(c[i].source), + gt = _jsPlumb.getGroupFor(c[i].target); + + if (gs === group) { + if (gt !== group) { + group.connections.source.push(c[i]); + } + _connectionSourceMap[c[i].id] = group; + } + else if (gt === group) { + group.connections.target.push(c[i]); + _connectionTargetMap[c[i].id] = group; + } + } + }; + oneSet(c1); oneSet(c2); + } + + this.updateConnectionsForGroup = _updateConnectionsForGroup; + this.refreshAllGroups = function() { + for (var g in _managedGroups) { + _updateConnectionsForGroup(_managedGroups[g]); + _jsPlumb.dragManager.updateOffsets(_jsPlumb.getId(_managedGroups[g].getEl())); + } + }; + }; + + /** + * + * @param {jsPlumbInstance} _jsPlumb Associated jsPlumb instance. + * @param {Object} params + * @param {Element} params.el The DOM element representing the Group. + * @param {String} [params.id] Optional ID for the Group. A UUID will be assigned as the Group's ID if you do not provide one. + * @param {Boolean} [params.constrain=false] If true, child elements will not be able to be dragged outside of the Group container. + * @param {Boolean} [params.revert=true] By default, child elements revert to the container if dragged outside. You can change this by setting `revert:false`. This behaviour is also overridden if you set `orphan` or `prune`. + * @param {Boolean} [params.orphan=false] If true, child elements dropped outside of the Group container will be removed from the Group (but not from the DOM). + * @param {Boolean} [params.prune=false] If true, child elements dropped outside of the Group container will be removed from the Group and also from the DOM. + * @param {Boolean} [params.dropOverride=false] If true, a child element that has been dropped onto some other Group will not be subject to the controls imposed by `prune`, `revert` or `orphan`. + * @constructor + */ + var Group = function(_jsPlumb, params) { + var self = this; + var el = params.el; + this.getEl = function() { return el; }; + this.id = params.id || _ju.uuid(); + el._isJsPlumbGroup = true; + + var getDragArea = this.getDragArea = function() { + var da = _jsPlumb.getSelector(el, GROUP_CONTAINER_SELECTOR); + return da && da.length > 0 ? da[0] : el; + }; + + var ghost = params.ghost === true; + var constrain = ghost || (params.constrain === true); + var revert = params.revert !== false; + var orphan = params.orphan === true; + var prune = params.prune === true; + var dropOverride = params.dropOverride === true; + var proxied = params.proxied !== false; + var elements = []; + this.connections = { source:[], target:[], internal:[] }; + + // this function, and getEndpoint below, are stubs for a future setup in which we can choose endpoint + // and anchor based upon the connection and the index (source/target) of the endpoint to be proxied. + this.getAnchor = function(conn, endpointIndex) { + return params.anchor || "Continuous"; + }; + + this.getEndpoint = function(conn, endpointIndex) { + return params.endpoint || [ "Dot", { radius:10 }]; + }; + + this.collapsed = false; + if (params.draggable !== false) { + var opts = { + drag:function() { + for (var i = 0; i < elements.length; i++) { + _jsPlumb.draw(elements[i]); + } + }, + stop:function(params) { + _jsPlumb.fire(EVT_GROUP_DRAG_STOP, jsPlumb.extend(params, {group:self})); + }, + scope:GROUP_DRAG_SCOPE + }; + if (params.dragOptions) { + root.jsPlumb.extend(opts, params.dragOptions); + } + _jsPlumb.draggable(params.el, opts); + } + if (params.droppable !== false) { + _jsPlumb.droppable(params.el, { + drop:function(p) { + var el = p.drag.el; + if (el._isJsPlumbGroup) { + return; + } + var currentGroup = el._jsPlumbGroup; + if (currentGroup !== self) { + if (currentGroup != null) { + if (currentGroup.overrideDrop(el, self)) { + return; + } + } + _jsPlumb.getGroupManager().addToGroup(self, el, false); + } + + } + }); + } + var _each = function(_el, fn) { + var els = _el.nodeType == null ? _el : [ _el ]; + for (var i = 0; i < els.length; i++) { + fn(els[i]); + } + }; + + this.overrideDrop = function(_el, targetGroup) { + return dropOverride && (revert || prune || orphan); + }; + + this.add = function(_el, doNotFireEvent/*, sourceGroup*/) { + var dragArea = getDragArea(); + _each(_el, function(__el) { + + if (__el._jsPlumbGroup != null) { + if (__el._jsPlumbGroup === self) { + return; + } else { + __el._jsPlumbGroup.remove(__el, true, doNotFireEvent, false); + } + } + + __el._jsPlumbGroup = self; + elements.push(__el); + // test if draggable and add handlers if so. + if (_jsPlumb.isAlreadyDraggable(__el)) { + _bindDragHandlers(__el); + } + + if (__el.parentNode !== dragArea) { + dragArea.appendChild(__el); + } + + // if (!doNotFireEvent) { + // var p = {group: self, el: __el}; + // if (sourceGroup) { + // p.sourceGroup = sourceGroup; + // } + // //_jsPlumb.fire(EVT_CHILD_ADDED, p); + // } + }); + + _jsPlumb.getGroupManager().updateConnectionsForGroup(self); + }; + + this.remove = function(el, manipulateDOM, doNotFireEvent, doNotUpdateConnections, targetGroup) { + + _each(el, function(__el) { + if (__el._jsPlumbGroup === self) { + delete __el._jsPlumbGroup; + _ju.removeWithFunction(elements, function (e) { + return e === __el; + }); + + + if (manipulateDOM) { + try { + self.getDragArea().removeChild(__el); + } catch (e) { + jsPlumbUtil.log("Could not remove element from Group " + e); + } + } + _unbindDragHandlers(__el); + + if (!doNotFireEvent) { + var p = {group: self, el: __el}; + if (targetGroup) { + p.targetGroup = targetGroup; + } + _jsPlumb.fire(EVT_CHILD_REMOVED, p); + } + } + }); + if (!doNotUpdateConnections) { + _jsPlumb.getGroupManager().updateConnectionsForGroup(self); + } + }; + this.removeAll = function(manipulateDOM, doNotFireEvent) { + for (var i = 0, l = elements.length; i < l; i++) { + var el = elements[0]; + self.remove(el, manipulateDOM, doNotFireEvent, true); + _jsPlumb.remove(el, true); + } + elements.length = 0; + _jsPlumb.getGroupManager().updateConnectionsForGroup(self); + }; + this.orphanAll = function() { + var orphanedPositions = {}; + for (var i = 0; i < elements.length; i++) { + var newPosition = _orphan(elements[i]); + orphanedPositions[newPosition[0]] = newPosition[1]; + } + elements.length = 0; + + return orphanedPositions; + }; + this.getMembers = function() { return elements; }; + + el[GROUP] = this; + + _jsPlumb.bind(ELEMENT_DRAGGABLE_EVENT, function(dragParams) { + // if its for the current group, + if (dragParams.el._jsPlumbGroup === this) { + _bindDragHandlers(dragParams.el); + } + }.bind(this)); + + function _findParent(_el) { + return _el.offsetParent; + } + + function _isInsideParent(_el, pos) { + var p = _findParent(_el), + s = _jsPlumb.getSize(p), + ss = _jsPlumb.getSize(_el), + leftEdge = pos[0], + rightEdge = leftEdge + ss[0], + topEdge = pos[1], + bottomEdge = topEdge + ss[1]; + + return rightEdge > 0 && leftEdge < s[0] && bottomEdge > 0 && topEdge < s[1]; + } + + // + // orphaning an element means taking it out of the group and adding it to the main jsplumb container. + // we return the new calculated position from this method and the element's id. + // + function _orphan(_el) { + var id = _jsPlumb.getId(_el); + var pos = _jsPlumb.getOffset(_el); + _el.parentNode.removeChild(_el); + _jsPlumb.getContainer().appendChild(_el); + _jsPlumb.setPosition(_el, pos); + _unbindDragHandlers(_el); + _jsPlumb.dragManager.clearParent(_el, id); + return [id, pos]; + } + + // + // remove an element from the group, then either prune it from the jsplumb instance, or just orphan it. + // + function _pruneOrOrphan(p) { + + var out = []; + + function _one(el, left, top) { + var orphanedPosition = null; + if (!_isInsideParent(el, [left, top])) { + var group = el._jsPlumbGroup; + if (prune) { + _jsPlumb.remove(el); + } else { + orphanedPosition = _orphan(el); + } + + group.remove(el); + } + + return orphanedPosition; + } + + for (var i = 0; i < p.selection.length; i++) { + out.push(_one(p.selection[i][0], p.selection[i][1].left, p.selection[i][1].top)); + } + + return out.length === 1 ? out[0] : out; + + } + + // + // redraws the element + // + function _revalidate(_el) { + var id = _jsPlumb.getId(_el); + _jsPlumb.revalidate(_el); + _jsPlumb.dragManager.revalidateParent(_el, id); + } + + // + // unbind the group specific drag/revert handlers. + // + function _unbindDragHandlers(_el) { + if (!_el._katavorioDrag) { + return; + } + if (prune || orphan) { + _el._katavorioDrag.off(STOP, _pruneOrOrphan); + } + if (!prune && !orphan && revert) { + _el._katavorioDrag.off(REVERT, _revalidate); + _el._katavorioDrag.setRevert(null); + } + } + + function _bindDragHandlers(_el) { + if (!_el._katavorioDrag) { + return; + } + if (prune || orphan) { + _el._katavorioDrag.on(STOP, _pruneOrOrphan); + } + + if (constrain) { + _el._katavorioDrag.setConstrain(true); + } + + if (ghost) { + _el._katavorioDrag.setUseGhostProxy(true); + } + + if (!prune && !orphan && revert) { + _el._katavorioDrag.on(REVERT, _revalidate); + _el._katavorioDrag.setRevert(function(__el, pos) { + return !_isInsideParent(__el, pos); + }); + } + } + + this.shouldProxy = function() { + return proxied; + }; + + _jsPlumb.getGroupManager().addGroup(this); + }; + + /** + * Adds a group to the jsPlumb instance. + * @method addGroup + * @param {Object} params + * @return {Group} The newly created Group. + */ + _jpi.prototype.addGroup = function(params) { + var j = this; + j._groups = j._groups || {}; + if (j._groups[params.id] != null) { + throw new TypeError("cannot create Group [" + params.id + "]; a Group with that ID exists"); + } + if (params.el[GROUP] != null) { + throw new TypeError("cannot create Group [" + params.id + "]; the given element is already a Group"); + } + var group = new Group(j, params); + j._groups[group.id] = group; + if (params.collapsed) { + this.collapseGroup(group); + } + return group; + }; + + /** + * Add an element to a group. + * @method addToGroup + * @param {String} group Group, or ID of the group, to add the element to. + * @param {Element} el Element to add to the group. + */ + _jpi.prototype.addToGroup = function(group, el, doNotFireEvent) { + + var _one = function(_el) { + var id = this.getId(_el); + this.manage(id, _el); + this.getGroupManager().addToGroup(group, _el, doNotFireEvent); + }.bind(this); + + if (Array.isArray(el)) { + for (var i = 0; i < el.length; i++) { + _one(el[i]); + } + } else { + _one(el); + } + }; + + /** + * Remove an element from a group, and sets its DOM element to be a child of the container again. ?? + * @method removeFromGroup + * @param {String} group Group, or ID of the group, to remove the element from. + * @param {Element} el Element to add to the group. + */ + _jpi.prototype.removeFromGroup = function(group, el, doNotFireEvent) { + this.getGroupManager().removeFromGroup(group, el, doNotFireEvent); + this.getContainer().appendChild(el); + }; + + /** + * Remove a group, and optionally remove its members from the jsPlumb instance. + * @method removeGroup + * @param {String|Group} group Group to delete, or ID of Group to delete. + * @param {Boolean} [deleteMembers=false] If true, group members will be removed along with the group. Otherwise they will + * just be 'orphaned' (returned to the main container). + * @returns {Map[String, Position}} When deleteMembers is false, this method returns a map of {id->position} + */ + _jpi.prototype.removeGroup = function(group, deleteMembers, manipulateDOM, doNotFireEvent) { + return this.getGroupManager().removeGroup(group, deleteMembers, manipulateDOM, doNotFireEvent); + }; + + /** + * Remove all groups, and optionally remove their members from the jsPlumb instance. + * @method removeAllGroup + * @param {Boolean} [deleteMembers=false] If true, group members will be removed along with the groups. Otherwise they will + * just be 'orphaned' (returned to the main container). + */ + _jpi.prototype.removeAllGroups = function(deleteMembers, manipulateDOM, doNotFireEvent) { + this.getGroupManager().removeAllGroups(deleteMembers, manipulateDOM, doNotFireEvent); + }; + + /** + * Get a Group + * @method getGroup + * @param {String} groupId ID of the group to get + * @return {Group} Group with the given ID, null if not found. + */ + _jpi.prototype.getGroup = function(groupId) { + return this.getGroupManager().getGroup(groupId); + }; + + /** + * Gets all the Groups managed by the jsPlumb instance. + * @returns {Group[]} List of Groups. Empty if none. + */ + _jpi.prototype.getGroups = function() { + return this.getGroupManager().getGroups(); + }; + + /** + * Expands a group element. jsPlumb doesn't do "everything" for you here, because what it means to expand a Group + * will vary from application to application. jsPlumb does these things: + * + * - Hides any connections that are internal to the group (connections between members, and connections from member of + * the group to the group itself) + * - Proxies all connections for which the source or target is a member of the group. + * - Hides the proxied connections. + * - Adds the jtk-group-expanded class to the group's element + * - Removes the jtk-group-collapsed class from the group's element. + * + * @method expandGroup + * @param {String|Group} group Group to expand, or ID of Group to expand. + */ + _jpi.prototype.expandGroup = function(group) { + this.getGroupManager().expandGroup(group); + }; + + /** + * Collapses a group element. jsPlumb doesn't do "everything" for you here, because what it means to collapse a Group + * will vary from application to application. jsPlumb does these things: + * + * - Shows any connections that are internal to the group (connections between members, and connections from member of + * the group to the group itself) + * - Removes proxies for all connections for which the source or target is a member of the group. + * - Shows the previously proxied connections. + * - Adds the jtk-group-collapsed class to the group's element + * - Removes the jtk-group-expanded class from the group's element. + * + * @method expandGroup + * @param {String|Group} group Group to expand, or ID of Group to expand. + */ + _jpi.prototype.collapseGroup = function(groupId) { + this.getGroupManager().collapseGroup(groupId); + }; + + + _jpi.prototype.repaintGroup = function(group) { + this.getGroupManager().repaintGroup(group); + }; + + /** + * Collapses or expands a group element depending on its current state. See notes in the collapseGroup and expandGroup method. + * + * @method toggleGroup + * @param {String|Group} group Group to expand/collapse, or ID of Group to expand/collapse. + */ + _jpi.prototype.toggleGroup = function(group) { + group = this.getGroupManager().getGroup(group); + if (group != null) { + this.getGroupManager()[group.collapsed ? "expandGroup" : "collapseGroup"](group); + } + }; + + // + // lazy init a group manager for the given jsplumb instance. + // + _jpi.prototype.getGroupManager = function() { + var mgr = this[GROUP_MANAGER]; + if (mgr == null) { + mgr = this[GROUP_MANAGER] = new GroupManager(this); + } + return mgr; + }; + + _jpi.prototype.removeGroupManager = function() { + delete this[GROUP_MANAGER]; + }; + + /** + * Gets the Group that the given element belongs to, null if none. + * @method getGroupFor + * @param {String|Element} el Element, or element ID. + * @returns {Group} A Group, if found, or null. + */ + _jpi.prototype.getGroupFor = function(el) { + el = this.getElement(el); + if (el) { + var c = this.getContainer(); + var abort = false, g = null, child = null; + while (!abort) { + if (el == null || el === c) { + abort = true; + } else { + if (el[GROUP]) { + g = el[GROUP]; + child = el; + abort = true; + } else { + el = el.parentNode; + } + } + } + return g; + } + }; + +}).call(typeof window !== 'undefined' ? window : this); + + +/* + * This file contains the 'flowchart' connectors, consisting of vertical and horizontal line segments. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + var STRAIGHT = "Straight"; + var ARC = "Arc"; + + var Flowchart = function (params) { + this.type = "Flowchart"; + params = params || {}; + params.stub = params.stub == null ? 30 : params.stub; + var segments, + _super = _jp.Connectors.AbstractConnector.apply(this, arguments), + midpoint = params.midpoint == null ? 0.5 : params.midpoint, + alwaysRespectStubs = params.alwaysRespectStubs === true, + lastx = null, lasty = null, lastOrientation, + cornerRadius = params.cornerRadius != null ? params.cornerRadius : 0, + + // TODO now common between this and AbstractBezierEditor; refactor into superclass? + loopbackRadius = params.loopbackRadius || 25, + isLoopbackCurrently = false, + + sgn = function (n) { + return n < 0 ? -1 : n === 0 ? 0 : 1; + }, + segmentDirections = function(segment) { + return [ + sgn( segment[2] - segment[0] ), + sgn( segment[3] - segment[1] ) + ]; + }, + /** + * helper method to add a segment. + */ + addSegment = function (segments, x, y, paintInfo) { + if (lastx === x && lasty === y) { + return; + } + var lx = lastx == null ? paintInfo.sx : lastx, + ly = lasty == null ? paintInfo.sy : lasty, + o = lx === x ? "v" : "h"; + + lastx = x; + lasty = y; + segments.push([ lx, ly, x, y, o ]); + }, + segLength = function (s) { + return Math.sqrt(Math.pow(s[0] - s[2], 2) + Math.pow(s[1] - s[3], 2)); + }, + _cloneArray = function (a) { + var _a = []; + _a.push.apply(_a, a); + return _a; + }, + writeSegments = function (conn, segments, paintInfo) { + var current = null, next, currentDirection, nextDirection; + for (var i = 0; i < segments.length - 1; i++) { + + current = current || _cloneArray(segments[i]); + next = _cloneArray(segments[i + 1]); + + currentDirection = segmentDirections(current); + nextDirection = segmentDirections(next); + + if (cornerRadius > 0 && current[4] !== next[4]) { + + var minSegLength = Math.min(segLength(current), segLength(next)); + var radiusToUse = Math.min(cornerRadius, minSegLength / 2); + + current[2] -= currentDirection[0] * radiusToUse; + current[3] -= currentDirection[1] * radiusToUse; + next[0] += nextDirection[0] * radiusToUse; + next[1] += nextDirection[1] * radiusToUse; + + var ac = (currentDirection[1] === nextDirection[0] && nextDirection[0] === 1) || + ((currentDirection[1] === nextDirection[0] && nextDirection[0] === 0) && currentDirection[0] !== nextDirection[1]) || + (currentDirection[1] === nextDirection[0] && nextDirection[0] === -1), + sgny = next[1] > current[3] ? 1 : -1, + sgnx = next[0] > current[2] ? 1 : -1, + sgnEqual = sgny === sgnx, + cx = (sgnEqual && ac || (!sgnEqual && !ac)) ? next[0] : current[2], + cy = (sgnEqual && ac || (!sgnEqual && !ac)) ? current[3] : next[1]; + + _super.addSegment(conn, STRAIGHT, { + x1: current[0], y1: current[1], x2: current[2], y2: current[3] + }); + + _super.addSegment(conn, ARC, { + r: radiusToUse, + x1: current[2], + y1: current[3], + x2: next[0], + y2: next[1], + cx: cx, + cy: cy, + ac: ac + }); + } + else { + // dx + dy are used to adjust for line width. + var dx = (current[2] === current[0]) ? 0 : (current[2] > current[0]) ? (paintInfo.lw / 2) : -(paintInfo.lw / 2), + dy = (current[3] === current[1]) ? 0 : (current[3] > current[1]) ? (paintInfo.lw / 2) : -(paintInfo.lw / 2); + + _super.addSegment(conn, STRAIGHT, { + x1: current[0] - dx, y1: current[1] - dy, x2: current[2] + dx, y2: current[3] + dy + }); + } + current = next; + } + if (next != null) { + // last segment + _super.addSegment(conn, STRAIGHT, { + x1: next[0], y1: next[1], x2: next[2], y2: next[3] + }); + } + }; + + this._compute = function (paintInfo, params) { + + segments = []; + lastx = null; + lasty = null; + lastOrientation = null; + + var commonStubCalculator = function () { + return [paintInfo.startStubX, paintInfo.startStubY, paintInfo.endStubX, paintInfo.endStubY]; + }, + stubCalculators = { + perpendicular: commonStubCalculator, + orthogonal: commonStubCalculator, + opposite: function (axis) { + var pi = paintInfo, + idx = axis === "x" ? 0 : 1, + areInProximity = { + "x": function () { + return ( (pi.so[idx] === 1 && ( + ( (pi.startStubX > pi.endStubX) && (pi.tx > pi.startStubX) ) || + ( (pi.sx > pi.endStubX) && (pi.tx > pi.sx))))) || + + ( (pi.so[idx] === -1 && ( + ( (pi.startStubX < pi.endStubX) && (pi.tx < pi.startStubX) ) || + ( (pi.sx < pi.endStubX) && (pi.tx < pi.sx))))); + }, + "y": function () { + return ( (pi.so[idx] === 1 && ( + ( (pi.startStubY > pi.endStubY) && (pi.ty > pi.startStubY) ) || + ( (pi.sy > pi.endStubY) && (pi.ty > pi.sy))))) || + + ( (pi.so[idx] === -1 && ( + ( (pi.startStubY < pi.endStubY) && (pi.ty < pi.startStubY) ) || + ( (pi.sy < pi.endStubY) && (pi.ty < pi.sy))))); + } + }; + + if (!alwaysRespectStubs && areInProximity[axis]()) { + return { + "x": [(paintInfo.sx + paintInfo.tx) / 2, paintInfo.startStubY, (paintInfo.sx + paintInfo.tx) / 2, paintInfo.endStubY], + "y": [paintInfo.startStubX, (paintInfo.sy + paintInfo.ty) / 2, paintInfo.endStubX, (paintInfo.sy + paintInfo.ty) / 2] + }[axis]; + } + else { + return [paintInfo.startStubX, paintInfo.startStubY, paintInfo.endStubX, paintInfo.endStubY]; + } + } + }; + + // calculate Stubs. + var stubs = stubCalculators[paintInfo.anchorOrientation](paintInfo.sourceAxis), + idx = paintInfo.sourceAxis === "x" ? 0 : 1, + oidx = paintInfo.sourceAxis === "x" ? 1 : 0, + ss = stubs[idx], + oss = stubs[oidx], + es = stubs[idx + 2], + oes = stubs[oidx + 2]; + + // add the start stub segment. use stubs for loopback as it will look better, with the loop spaced + // away from the element. + addSegment(segments, stubs[0], stubs[1], paintInfo); + + // if its a loopback and we should treat it differently. + // if (false && params.sourcePos[0] === params.targetPos[0] && params.sourcePos[1] === params.targetPos[1]) { + // + // // we use loopbackRadius here, as statemachine connectors do. + // // so we go radius to the left from stubs[0], then upwards by 2*radius, to the right by 2*radius, + // // down by 2*radius, left by radius. + // addSegment(segments, stubs[0] - loopbackRadius, stubs[1], paintInfo); + // addSegment(segments, stubs[0] - loopbackRadius, stubs[1] - (2 * loopbackRadius), paintInfo); + // addSegment(segments, stubs[0] + loopbackRadius, stubs[1] - (2 * loopbackRadius), paintInfo); + // addSegment(segments, stubs[0] + loopbackRadius, stubs[1], paintInfo); + // addSegment(segments, stubs[0], stubs[1], paintInfo); + // + // } + // else { + + + var midx = paintInfo.startStubX + ((paintInfo.endStubX - paintInfo.startStubX) * midpoint), + midy = paintInfo.startStubY + ((paintInfo.endStubY - paintInfo.startStubY) * midpoint); + + var orientations = {x: [0, 1], y: [1, 0]}, + lineCalculators = { + perpendicular: function (axis) { + var pi = paintInfo, + sis = { + x: [ + [[1, 2, 3, 4], null, [2, 1, 4, 3]], + null, + [[4, 3, 2, 1], null, [3, 4, 1, 2]] + ], + y: [ + [[3, 2, 1, 4], null, [2, 3, 4, 1]], + null, + [[4, 1, 2, 3], null, [1, 4, 3, 2]] + ] + }, + stubs = { + x: [[pi.startStubX, pi.endStubX], null, [pi.endStubX, pi.startStubX]], + y: [[pi.startStubY, pi.endStubY], null, [pi.endStubY, pi.startStubY]] + }, + midLines = { + x: [[midx, pi.startStubY], [midx, pi.endStubY]], + y: [[pi.startStubX, midy], [pi.endStubX, midy]] + }, + linesToEnd = { + x: [[pi.endStubX, pi.startStubY]], + y: [[pi.startStubX, pi.endStubY]] + }, + startToEnd = { + x: [[pi.startStubX, pi.endStubY], [pi.endStubX, pi.endStubY]], + y: [[pi.endStubX, pi.startStubY], [pi.endStubX, pi.endStubY]] + }, + startToMidToEnd = { + x: [[pi.startStubX, midy], [pi.endStubX, midy], [pi.endStubX, pi.endStubY]], + y: [[midx, pi.startStubY], [midx, pi.endStubY], [pi.endStubX, pi.endStubY]] + }, + otherStubs = { + x: [pi.startStubY, pi.endStubY], + y: [pi.startStubX, pi.endStubX] + }, + soIdx = orientations[axis][0], toIdx = orientations[axis][1], + _so = pi.so[soIdx] + 1, + _to = pi.to[toIdx] + 1, + otherFlipped = (pi.to[toIdx] === -1 && (otherStubs[axis][1] < otherStubs[axis][0])) || (pi.to[toIdx] === 1 && (otherStubs[axis][1] > otherStubs[axis][0])), + stub1 = stubs[axis][_so][0], + stub2 = stubs[axis][_so][1], + segmentIndexes = sis[axis][_so][_to]; + + if (pi.segment === segmentIndexes[3] || (pi.segment === segmentIndexes[2] && otherFlipped)) { + return midLines[axis]; + } + else if (pi.segment === segmentIndexes[2] && stub2 < stub1) { + return linesToEnd[axis]; + } + else if ((pi.segment === segmentIndexes[2] && stub2 >= stub1) || (pi.segment === segmentIndexes[1] && !otherFlipped)) { + return startToMidToEnd[axis]; + } + else if (pi.segment === segmentIndexes[0] || (pi.segment === segmentIndexes[1] && otherFlipped)) { + return startToEnd[axis]; + } + }, + orthogonal: function (axis, startStub, otherStartStub, endStub, otherEndStub) { + var pi = paintInfo, + extent = { + "x": pi.so[0] === -1 ? Math.min(startStub, endStub) : Math.max(startStub, endStub), + "y": pi.so[1] === -1 ? Math.min(startStub, endStub) : Math.max(startStub, endStub) + }[axis]; + + return { + "x": [ + [extent, otherStartStub], + [extent, otherEndStub], + [endStub, otherEndStub] + ], + "y": [ + [otherStartStub, extent], + [otherEndStub, extent], + [otherEndStub, endStub] + ] + }[axis]; + }, + opposite: function (axis, ss, oss, es) { + var pi = paintInfo, + otherAxis = {"x": "y", "y": "x"}[axis], + dim = {"x": "height", "y": "width"}[axis], + comparator = pi["is" + axis.toUpperCase() + "GreaterThanStubTimes2"]; + + if (params.sourceEndpoint.elementId === params.targetEndpoint.elementId) { + var _val = oss + ((1 - params.sourceEndpoint.anchor[otherAxis]) * params.sourceInfo[dim]) + _super.maxStub; + return { + "x": [ + [ss, _val], + [es, _val] + ], + "y": [ + [_val, ss], + [_val, es] + ] + }[axis]; + + } + else if (!comparator || (pi.so[idx] === 1 && ss > es) || (pi.so[idx] === -1 && ss < es)) { + return { + "x": [ + [ss, midy], + [es, midy] + ], + "y": [ + [midx, ss], + [midx, es] + ] + }[axis]; + } + else if ((pi.so[idx] === 1 && ss < es) || (pi.so[idx] === -1 && ss > es)) { + return { + "x": [ + [midx, pi.sy], + [midx, pi.ty] + ], + "y": [ + [pi.sx, midy], + [pi.tx, midy] + ] + }[axis]; + } + } + }; + + // compute the rest of the line + var p = lineCalculators[paintInfo.anchorOrientation](paintInfo.sourceAxis, ss, oss, es, oes); + if (p) { + for (var i = 0; i < p.length; i++) { + addSegment(segments, p[i][0], p[i][1], paintInfo); + } + } + + // line to end stub + addSegment(segments, stubs[2], stubs[3], paintInfo); + + //} + + // end stub to end (common) + addSegment(segments, paintInfo.tx, paintInfo.ty, paintInfo); + + + + // write out the segments. + writeSegments(this, segments, paintInfo); + + }; + }; + + _jp.Connectors.Flowchart = Flowchart; + _ju.extend(_jp.Connectors.Flowchart, _jp.Connectors.AbstractConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the code for the Bezier connector type. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + _jp.Connectors.AbstractBezierConnector = function(params) { + params = params || {}; + var showLoopback = params.showLoopback !== false, + curviness = params.curviness || 10, + margin = params.margin || 5, + proximityLimit = params.proximityLimit || 80, + clockwise = params.orientation && params.orientation === "clockwise", + loopbackRadius = params.loopbackRadius || 25, + isLoopbackCurrently = false, + _super; + + this._compute = function (paintInfo, p) { + + var sp = p.sourcePos, + tp = p.targetPos, + _w = Math.abs(sp[0] - tp[0]), + _h = Math.abs(sp[1] - tp[1]); + + if (!showLoopback || (p.sourceEndpoint.elementId !== p.targetEndpoint.elementId)) { + isLoopbackCurrently = false; + this._computeBezier(paintInfo, p, sp, tp, _w, _h); + } else { + isLoopbackCurrently = true; + // a loopback connector. draw an arc from one anchor to the other. + var x1 = p.sourcePos[0], y1 = p.sourcePos[1] - margin, + cx = x1, cy = y1 - loopbackRadius, + // canvas sizing stuff, to ensure the whole painted area is visible. + _x = cx - loopbackRadius, + _y = cy - loopbackRadius; + + _w = 2 * loopbackRadius; + _h = 2 * loopbackRadius; + + paintInfo.points[0] = _x; + paintInfo.points[1] = _y; + paintInfo.points[2] = _w; + paintInfo.points[3] = _h; + + // ADD AN ARC SEGMENT. + _super.addSegment(this, "Arc", { + loopback: true, + x1: (x1 - _x) + 4, + y1: y1 - _y, + startAngle: 0, + endAngle: 2 * Math.PI, + r: loopbackRadius, + ac: !clockwise, + x2: (x1 - _x) - 4, + y2: y1 - _y, + cx: cx - _x, + cy: cy - _y + }); + } + }; + + _super = _jp.Connectors.AbstractConnector.apply(this, arguments); + return _super; + }; + _ju.extend(_jp.Connectors.AbstractBezierConnector, _jp.Connectors.AbstractConnector); + + var Bezier = function (params) { + params = params || {}; + this.type = "Bezier"; + + var _super = _jp.Connectors.AbstractBezierConnector.apply(this, arguments), + majorAnchor = params.curviness || 150, + minorAnchor = 10; + + this.getCurviness = function () { + return majorAnchor; + }; + + this._findControlPoint = function (point, sourceAnchorPosition, targetAnchorPosition, sourceEndpoint, targetEndpoint, soo, too) { + // determine if the two anchors are perpendicular to each other in their orientation. we swap the control + // points around if so (code could be tightened up) + var perpendicular = soo[0] !== too[0] || soo[1] === too[1], + p = []; + + if (!perpendicular) { + if (soo[0] === 0) { + p.push(sourceAnchorPosition[0] < targetAnchorPosition[0] ? point[0] + minorAnchor : point[0] - minorAnchor); + } + else { + p.push(point[0] - (majorAnchor * soo[0])); + } + + if (soo[1] === 0) { + p.push(sourceAnchorPosition[1] < targetAnchorPosition[1] ? point[1] + minorAnchor : point[1] - minorAnchor); + } + else { + p.push(point[1] + (majorAnchor * too[1])); + } + } + else { + if (too[0] === 0) { + p.push(targetAnchorPosition[0] < sourceAnchorPosition[0] ? point[0] + minorAnchor : point[0] - minorAnchor); + } + else { + p.push(point[0] + (majorAnchor * too[0])); + } + + if (too[1] === 0) { + p.push(targetAnchorPosition[1] < sourceAnchorPosition[1] ? point[1] + minorAnchor : point[1] - minorAnchor); + } + else { + p.push(point[1] + (majorAnchor * soo[1])); + } + } + + return p; + }; + + this._computeBezier = function (paintInfo, p, sp, tp, _w, _h) { + + var _CP, _CP2, + _sx = sp[0] < tp[0] ? _w : 0, + _sy = sp[1] < tp[1] ? _h : 0, + _tx = sp[0] < tp[0] ? 0 : _w, + _ty = sp[1] < tp[1] ? 0 : _h; + + _CP = this._findControlPoint([_sx, _sy], sp, tp, p.sourceEndpoint, p.targetEndpoint, paintInfo.so, paintInfo.to); + _CP2 = this._findControlPoint([_tx, _ty], tp, sp, p.targetEndpoint, p.sourceEndpoint, paintInfo.to, paintInfo.so); + + + _super.addSegment(this, "Bezier", { + x1: _sx, y1: _sy, x2: _tx, y2: _ty, + cp1x: _CP[0], cp1y: _CP[1], cp2x: _CP2[0], cp2y: _CP2[1] + }); + }; + + + }; + + _jp.Connectors.Bezier = Bezier; + _ju.extend(Bezier, _jp.Connectors.AbstractBezierConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the state machine connectors, which extend AbstractBezierConnector. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + var _segment = function (x1, y1, x2, y2) { + if (x1 <= x2 && y2 <= y1) { + return 1; + } + else if (x1 <= x2 && y1 <= y2) { + return 2; + } + else if (x2 <= x1 && y2 >= y1) { + return 3; + } + return 4; + }, + + // the control point we will use depends on the faces to which each end of the connection is assigned, specifically whether or not the + // two faces are parallel or perpendicular. if they are parallel then the control point lies on the midpoint of the axis in which they + // are parellel and varies only in the other axis; this variation is proportional to the distance that the anchor points lie from the + // center of that face. if the two faces are perpendicular then the control point is at some distance from both the midpoints; the amount and + // direction are dependent on the orientation of the two elements. 'seg', passed in to this method, tells you which segment the target element + // lies in with respect to the source: 1 is top right, 2 is bottom right, 3 is bottom left, 4 is top left. + // + // sourcePos and targetPos are arrays of info about where on the source and target each anchor is located. their contents are: + // + // 0 - absolute x + // 1 - absolute y + // 2 - proportional x in element (0 is left edge, 1 is right edge) + // 3 - proportional y in element (0 is top edge, 1 is bottom edge) + // + _findControlPoint = function (midx, midy, segment, sourceEdge, targetEdge, dx, dy, distance, proximityLimit) { + // TODO (maybe) + // - if anchor pos is 0.5, make the control point take into account the relative position of the elements. + if (distance <= proximityLimit) { + return [midx, midy]; + } + + if (segment === 1) { + if (sourceEdge[3] <= 0 && targetEdge[3] >= 1) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] >= 1 && targetEdge[2] <= 0) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + (-1 * dx) , midy + (-1 * dy) ]; + } + } + else if (segment === 2) { + if (sourceEdge[3] >= 1 && targetEdge[3] <= 0) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] >= 1 && targetEdge[2] <= 0) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + dx, midy + (-1 * dy) ]; + } + } + else if (segment === 3) { + if (sourceEdge[3] >= 1 && targetEdge[3] <= 0) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] <= 0 && targetEdge[2] >= 1) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + (-1 * dx) , midy + (-1 * dy) ]; + } + } + else if (segment === 4) { + if (sourceEdge[3] <= 0 && targetEdge[3] >= 1) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] <= 0 && targetEdge[2] >= 1) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + dx , midy + (-1 * dy) ]; + } + } + + }; + + var StateMachine = function (params) { + params = params || {}; + this.type = "StateMachine"; + + var _super = _jp.Connectors.AbstractBezierConnector.apply(this, arguments), + curviness = params.curviness || 10, + margin = params.margin || 5, + proximityLimit = params.proximityLimit || 80, + clockwise = params.orientation && params.orientation === "clockwise", + _controlPoint; + + this._computeBezier = function(paintInfo, params, sp, tp, w, h) { + var _sx = params.sourcePos[0] < params.targetPos[0] ? 0 : w, + _sy = params.sourcePos[1] < params.targetPos[1] ? 0 : h, + _tx = params.sourcePos[0] < params.targetPos[0] ? w : 0, + _ty = params.sourcePos[1] < params.targetPos[1] ? h : 0; + + // now adjust for the margin + if (params.sourcePos[2] === 0) { + _sx -= margin; + } + if (params.sourcePos[2] === 1) { + _sx += margin; + } + if (params.sourcePos[3] === 0) { + _sy -= margin; + } + if (params.sourcePos[3] === 1) { + _sy += margin; + } + if (params.targetPos[2] === 0) { + _tx -= margin; + } + if (params.targetPos[2] === 1) { + _tx += margin; + } + if (params.targetPos[3] === 0) { + _ty -= margin; + } + if (params.targetPos[3] === 1) { + _ty += margin; + } + + // + // these connectors are quadratic bezier curves, having a single control point. if both anchors + // are located at 0.5 on their respective faces, the control point is set to the midpoint and you + // get a straight line. this is also the case if the two anchors are within 'proximityLimit', since + // it seems to make good aesthetic sense to do that. outside of that, the control point is positioned + // at 'curviness' pixels away along the normal to the straight line connecting the two anchors. + // + // there may be two improvements to this. firstly, we might actually support the notion of avoiding nodes + // in the UI, or at least making a good effort at doing so. if a connection would pass underneath some node, + // for example, we might increase the distance the control point is away from the midpoint in a bid to + // steer it around that node. this will work within limits, but i think those limits would also be the likely + // limits for, once again, aesthetic good sense in the layout of a chart using these connectors. + // + // the second possible change is actually two possible changes: firstly, it is possible we should gradually + // decrease the 'curviness' as the distance between the anchors decreases; start tailing it off to 0 at some + // point (which should be configurable). secondly, we might slightly increase the 'curviness' for connectors + // with respect to how far their anchor is from the center of its respective face. this could either look cool, + // or stupid, and may indeed work only in a way that is so subtle as to have been a waste of time. + // + + var _midx = (_sx + _tx) / 2, + _midy = (_sy + _ty) / 2, + segment = _segment(_sx, _sy, _tx, _ty), + distance = Math.sqrt(Math.pow(_tx - _sx, 2) + Math.pow(_ty - _sy, 2)), + cp1x, cp2x, cp1y, cp2y; + + + // calculate the control point. this code will be where we'll put in a rudimentary element avoidance scheme; it + // will work by extending the control point to force the curve to be, um, curvier. + _controlPoint = _findControlPoint(_midx, + _midy, + segment, + params.sourcePos, + params.targetPos, + curviness, curviness, + distance, + proximityLimit); + + cp1x = _controlPoint[0]; + cp2x = _controlPoint[0]; + cp1y = _controlPoint[1]; + cp2y = _controlPoint[1]; + + _super.addSegment(this, "Bezier", { + x1: _tx, y1: _ty, x2: _sx, y2: _sy, + cp1x: cp1x, cp1y: cp1y, + cp2x: cp2x, cp2y: cp2y + }); + }; + }; + + _jp.Connectors.StateMachine = StateMachine; + _ju.extend(StateMachine, _jp.Connectors.AbstractBezierConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the 'flowchart' connectors, consisting of vertical and horizontal line segments. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + var STRAIGHT = "Straight"; + + var Straight = function (params) { + this.type = STRAIGHT; + var _super = _jp.Connectors.AbstractConnector.apply(this, arguments); + + this._compute = function (paintInfo, _) { + _super.addSegment(this, STRAIGHT, {x1: paintInfo.sx, y1: paintInfo.sy, x2: paintInfo.startStubX, y2: paintInfo.startStubY}); + _super.addSegment(this, STRAIGHT, {x1: paintInfo.startStubX, y1: paintInfo.startStubY, x2: paintInfo.endStubX, y2: paintInfo.endStubY}); + _super.addSegment(this, STRAIGHT, {x1: paintInfo.endStubX, y1: paintInfo.endStubY, x2: paintInfo.tx, y2: paintInfo.ty}); + }; + }; + + _jp.Connectors.Straight = Straight; + _ju.extend(Straight, _jp.Connectors.AbstractConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the SVG renderers. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + +// ************************** SVG utility methods ******************************************** + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + var svgAttributeMap = { + "stroke-linejoin": "stroke-linejoin", + "stroke-dashoffset": "stroke-dashoffset", + "stroke-linecap": "stroke-linecap" + }, + STROKE_DASHARRAY = "stroke-dasharray", + DASHSTYLE = "dashstyle", + LINEAR_GRADIENT = "linearGradient", + RADIAL_GRADIENT = "radialGradient", + DEFS = "defs", + FILL = "fill", + STOP = "stop", + STROKE = "stroke", + STROKE_WIDTH = "stroke-width", + STYLE = "style", + NONE = "none", + JSPLUMB_GRADIENT = "jsplumb_gradient_", + LINE_WIDTH = "strokeWidth", + ns = { + svg: "http://www.w3.org/2000/svg" + }, + _attr = function (node, attributes) { + for (var i in attributes) { + node.setAttribute(i, "" + attributes[i]); + } + }, + _node = function (name, attributes) { + attributes = attributes || {}; + attributes.version = "1.1"; + attributes.xmlns = ns.svg; + return _jp.createElementNS(ns.svg, name, null, null, attributes); + }, + _pos = function (d) { + return "position:absolute;left:" + d[0] + "px;top:" + d[1] + "px"; + }, + _clearGradient = function (parent) { + var els = parent.querySelectorAll(" defs,linearGradient,radialGradient"); + for (var i = 0; i < els.length; i++) { + els[i].parentNode.removeChild(els[i]); + } + }, + _updateGradient = function (parent, node, style, dimensions, uiComponent) { + var id = JSPLUMB_GRADIENT + uiComponent._jsPlumb.instance.idstamp(); + // first clear out any existing gradient + _clearGradient(parent); + // this checks for an 'offset' property in the gradient, and in the absence of it, assumes + // we want a linear gradient. if it's there, we create a radial gradient. + // it is possible that a more explicit means of defining the gradient type would be + // better. relying on 'offset' means that we can never have a radial gradient that uses + // some default offset, for instance. + // issue 244 suggested the 'gradientUnits' attribute; without this, straight/flowchart connectors with gradients would + // not show gradients when the line was perfectly horizontal or vertical. + var g; + if (!style.gradient.offset) { + g = _node(LINEAR_GRADIENT, {id: id, gradientUnits: "userSpaceOnUse"}); + } + else { + g = _node(RADIAL_GRADIENT, { id: id }); + } + + var defs = _node(DEFS); + parent.appendChild(defs); + defs.appendChild(g); + + // the svg radial gradient seems to treat stops in the reverse + // order to how canvas does it. so we want to keep all the maths the same, but + // iterate the actual style declarations in reverse order, if the x indexes are not in order. + for (var i = 0; i < style.gradient.stops.length; i++) { + var styleToUse = uiComponent.segment === 1 || uiComponent.segment === 2 ? i : style.gradient.stops.length - 1 - i, + stopColor = style.gradient.stops[styleToUse][1], + s = _node(STOP, {"offset": Math.floor(style.gradient.stops[i][0] * 100) + "%", "stop-color": stopColor}); + + g.appendChild(s); + } + var applyGradientTo = style.stroke ? STROKE : FILL; + node.setAttribute(applyGradientTo, "url(#" + id + ")"); + }, + _applyStyles = function (parent, node, style, dimensions, uiComponent) { + + node.setAttribute(FILL, style.fill ? style.fill : NONE); + node.setAttribute(STROKE, style.stroke ? style.stroke : NONE); + + if (style.gradient) { + _updateGradient(parent, node, style, dimensions, uiComponent); + } + else { + // make sure we clear any existing gradient + _clearGradient(parent); + node.setAttribute(STYLE, ""); + } + + if (style.strokeWidth) { + node.setAttribute(STROKE_WIDTH, style.strokeWidth); + } + + // in SVG there is a stroke-dasharray attribute we can set, and its syntax looks like + // the syntax in VML but is actually kind of nasty: values are given in the pixel + // coordinate space, whereas in VML they are multiples of the width of the stroked + // line, which makes a lot more sense. for that reason, jsPlumb is supporting both + // the native svg 'stroke-dasharray' attribute, and also the 'dashstyle' concept from + // VML, which will be the preferred method. the code below this converts a dashstyle + // attribute given in terms of stroke width into a pixel representation, by using the + // stroke's lineWidth. + if (style[DASHSTYLE] && style[LINE_WIDTH] && !style[STROKE_DASHARRAY]) { + var sep = style[DASHSTYLE].indexOf(",") === -1 ? " " : ",", + parts = style[DASHSTYLE].split(sep), + styleToUse = ""; + parts.forEach(function (p) { + styleToUse += (Math.floor(p * style.strokeWidth) + sep); + }); + node.setAttribute(STROKE_DASHARRAY, styleToUse); + } + else if (style[STROKE_DASHARRAY]) { + node.setAttribute(STROKE_DASHARRAY, style[STROKE_DASHARRAY]); + } + + // extra attributes such as join type, dash offset. + for (var i in svgAttributeMap) { + if (style[i]) { + node.setAttribute(svgAttributeMap[i], style[i]); + } + } + }, + _appendAtIndex = function (svg, path, idx) { + if (svg.childNodes.length > idx) { + svg.insertBefore(path, svg.childNodes[idx]); + } + else { + svg.appendChild(path); + } + }; + + /** + utility methods for other objects to use. + */ + _ju.svg = { + node: _node, + attr: _attr, + pos: _pos + }; + + // ************************** / SVG utility methods ******************************************** + + /* + * Base class for SVG components. + */ + var SvgComponent = function (params) { + var pointerEventsSpec = params.pointerEventsSpec || "all", renderer = {}; + + _jp.jsPlumbUIComponent.apply(this, params.originalArgs); + this.canvas = null; + this.path = null; + this.svg = null; + this.bgCanvas = null; + + var clazz = params.cssClass + " " + (params.originalArgs[0].cssClass || ""), + svgParams = { + "style": "", + "width": 0, + "height": 0, + "pointer-events": pointerEventsSpec, + "position": "absolute" + }; + + this.svg = _node("svg", svgParams); + + if (params.useDivWrapper) { + this.canvas = _jp.createElement("div", { position : "absolute" }); + _ju.sizeElement(this.canvas, 0, 0, 1, 1); + this.canvas.className = clazz; + } + else { + _attr(this.svg, { "class": clazz }); + this.canvas = this.svg; + } + + params._jsPlumb.appendElement(this.canvas, params.originalArgs[0].parent); + if (params.useDivWrapper) { + this.canvas.appendChild(this.svg); + } + + var displayElements = [ this.canvas ]; + this.getDisplayElements = function () { + return displayElements; + }; + + this.appendDisplayElement = function (el) { + displayElements.push(el); + }; + + this.paint = function (style, anchor, extents) { + if (style != null) { + + var xy = [ this.x, this.y ], wh = [ this.w, this.h ], p; + if (extents != null) { + if (extents.xmin < 0) { + xy[0] += extents.xmin; + } + if (extents.ymin < 0) { + xy[1] += extents.ymin; + } + wh[0] = extents.xmax + ((extents.xmin < 0) ? -extents.xmin : 0); + wh[1] = extents.ymax + ((extents.ymin < 0) ? -extents.ymin : 0); + } + + if (params.useDivWrapper) { + _ju.sizeElement(this.canvas, xy[0], xy[1], wh[0], wh[1]); + xy[0] = 0; + xy[1] = 0; + p = _pos([ 0, 0 ]); + } + else { + p = _pos([ xy[0], xy[1] ]); + } + + renderer.paint.apply(this, arguments); + + _attr(this.svg, { + "style": p, + "width": wh[0] || 0, + "height": wh[1] || 0 + }); + } + }; + + return { + renderer: renderer + }; + }; + + _ju.extend(SvgComponent, _jp.jsPlumbUIComponent, { + cleanup: function (force) { + if (force || this.typeId == null) { + if (this.canvas) { + this.canvas._jsPlumb = null; + } + if (this.svg) { + this.svg._jsPlumb = null; + } + if (this.bgCanvas) { + this.bgCanvas._jsPlumb = null; + } + + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + if (this.bgCanvas && this.bgCanvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + + this.svg = null; + this.canvas = null; + this.path = null; + this.group = null; + } + else { + // if not a forced cleanup, just detach from DOM for now. + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + if (this.bgCanvas && this.bgCanvas.parentNode) { + this.bgCanvas.parentNode.removeChild(this.bgCanvas); + } + } + }, + reattach:function(instance) { + var c = instance.getContainer(); + if (this.canvas && this.canvas.parentNode == null) { + c.appendChild(this.canvas); + } + if (this.bgCanvas && this.bgCanvas.parentNode == null) { + c.appendChild(this.bgCanvas); + } + }, + setVisible: function (v) { + if (this.canvas) { + this.canvas.style.display = v ? "block" : "none"; + } + } + }); + + /* + * Base class for SVG connectors. + */ + _jp.ConnectorRenderers.svg = function (params) { + var self = this, + _super = SvgComponent.apply(this, [ + { + cssClass: params._jsPlumb.connectorClass, + originalArgs: arguments, + pointerEventsSpec: "none", + _jsPlumb: params._jsPlumb + } + ]); + + _super.renderer.paint = function (style, anchor, extents) { + + var segments = self.getSegments(), p = "", offset = [0, 0]; + if (extents.xmin < 0) { + offset[0] = -extents.xmin; + } + if (extents.ymin < 0) { + offset[1] = -extents.ymin; + } + + if (segments.length > 0) { + + p = self.getPathData(); + + var a = { + d: p, + transform: "translate(" + offset[0] + "," + offset[1] + ")", + "pointer-events": params["pointer-events"] || "visibleStroke" + }, + outlineStyle = null, + d = [self.x, self.y, self.w, self.h]; + + // outline style. actually means drawing an svg object underneath the main one. + if (style.outlineStroke) { + var outlineWidth = style.outlineWidth || 1, + outlineStrokeWidth = style.strokeWidth + (2 * outlineWidth); + outlineStyle = _jp.extend({}, style); + delete outlineStyle.gradient; + outlineStyle.stroke = style.outlineStroke; + outlineStyle.strokeWidth = outlineStrokeWidth; + + if (self.bgPath == null) { + self.bgPath = _node("path", a); + _jp.addClass(self.bgPath, _jp.connectorOutlineClass); + _appendAtIndex(self.svg, self.bgPath, 0); + } + else { + _attr(self.bgPath, a); + } + + _applyStyles(self.svg, self.bgPath, outlineStyle, d, self); + } + + if (self.path == null) { + self.path = _node("path", a); + _appendAtIndex(self.svg, self.path, style.outlineStroke ? 1 : 0); + } + else { + _attr(self.path, a); + } + + _applyStyles(self.svg, self.path, style, d, self); + } + }; + }; + _ju.extend(_jp.ConnectorRenderers.svg, SvgComponent); + +// ******************************* svg segment renderer ***************************************************** + + +// ******************************* /svg segments ***************************************************** + + /* + * Base class for SVG endpoints. + */ + var SvgEndpoint = _jp.SvgEndpoint = function (params) { + var _super = SvgComponent.apply(this, [ + { + cssClass: params._jsPlumb.endpointClass, + originalArgs: arguments, + pointerEventsSpec: "all", + useDivWrapper: true, + _jsPlumb: params._jsPlumb + } + ]); + + _super.renderer.paint = function (style) { + var s = _jp.extend({}, style); + if (s.outlineStroke) { + s.stroke = s.outlineStroke; + } + + if (this.node == null) { + this.node = this.makeNode(s); + this.svg.appendChild(this.node); + } + else if (this.updateNode != null) { + this.updateNode(this.node); + } + _applyStyles(this.svg, this.node, s, [ this.x, this.y, this.w, this.h ], this); + _pos(this.node, [ this.x, this.y ]); + }.bind(this); + + }; + _ju.extend(SvgEndpoint, SvgComponent); + + /* + * SVG Dot Endpoint + */ + _jp.Endpoints.svg.Dot = function () { + _jp.Endpoints.Dot.apply(this, arguments); + SvgEndpoint.apply(this, arguments); + this.makeNode = function (style) { + return _node("circle", { + "cx": this.w / 2, + "cy": this.h / 2, + "r": this.radius + }); + }; + this.updateNode = function (node) { + _attr(node, { + "cx": this.w / 2, + "cy": this.h / 2, + "r": this.radius + }); + }; + }; + _ju.extend(_jp.Endpoints.svg.Dot, [_jp.Endpoints.Dot, SvgEndpoint]); + + /* + * SVG Rectangle Endpoint + */ + _jp.Endpoints.svg.Rectangle = function () { + _jp.Endpoints.Rectangle.apply(this, arguments); + SvgEndpoint.apply(this, arguments); + this.makeNode = function (style) { + return _node("rect", { + "width": this.w, + "height": this.h + }); + }; + this.updateNode = function (node) { + _attr(node, { + "width": this.w, + "height": this.h + }); + }; + }; + _ju.extend(_jp.Endpoints.svg.Rectangle, [_jp.Endpoints.Rectangle, SvgEndpoint]); + + /* + * SVG Image Endpoint is the default image endpoint. + */ + _jp.Endpoints.svg.Image = _jp.Endpoints.Image; + /* + * Blank endpoint in svg renderer is the default Blank endpoint. + */ + _jp.Endpoints.svg.Blank = _jp.Endpoints.Blank; + /* + * Label overlay in svg renderer is the default Label overlay. + */ + _jp.Overlays.svg.Label = _jp.Overlays.Label; + /* + * Custom overlay in svg renderer is the default Custom overlay. + */ + _jp.Overlays.svg.Custom = _jp.Overlays.Custom; + + var AbstractSvgArrowOverlay = function (superclass, originalArgs) { + superclass.apply(this, originalArgs); + _jp.jsPlumbUIComponent.apply(this, originalArgs); + this.isAppendedAtTopLevel = false; + var self = this; + this.path = null; + this.paint = function (params, containerExtents) { + // only draws on connections, not endpoints. + if (params.component.svg && containerExtents) { + if (this.path == null) { + this.path = _node("path", { + "pointer-events": "all" + }); + params.component.svg.appendChild(this.path); + if (this.elementCreated) { + this.elementCreated(this.path, params.component); + } + + this.canvas = params.component.svg; // for the sake of completeness; this behaves the same as other overlays + } + var clazz = originalArgs && (originalArgs.length === 1) ? (originalArgs[0].cssClass || "") : "", + offset = [0, 0]; + + if (containerExtents.xmin < 0) { + offset[0] = -containerExtents.xmin; + } + if (containerExtents.ymin < 0) { + offset[1] = -containerExtents.ymin; + } + + _attr(this.path, { + "d": makePath(params.d), + "class": clazz, + stroke: params.stroke ? params.stroke : null, + fill: params.fill ? params.fill : null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + } + }; + var makePath = function (d) { + return (isNaN(d.cxy.x) || isNaN(d.cxy.y)) ? "" : "M" + d.hxy.x + "," + d.hxy.y + + " L" + d.tail[0].x + "," + d.tail[0].y + + " L" + d.cxy.x + "," + d.cxy.y + + " L" + d.tail[1].x + "," + d.tail[1].y + + " L" + d.hxy.x + "," + d.hxy.y; + }; + this.transfer = function(target) { + if (target.canvas && this.path && this.path.parentNode) { + this.path.parentNode.removeChild(this.path); + target.canvas.appendChild(this.path); + } + }; + }; + + var svgProtoFunctions = { + cleanup : function (force) { + if (this.path != null) { + if (force) { + this._jsPlumb.instance.removeElement(this.path); + } + else { + if (this.path.parentNode) { + this.path.parentNode.removeChild(this.path); + } + } + } + }, reattach :function(instance, component) { + if (this.path && component.canvas) { + component.canvas.appendChild(this.path); + } + }, + setVisible : function (v) { + if (this.path != null) { + (this.path.style.display = (v ? "block" : "none")); + } + } + }; + + _ju.extend(AbstractSvgArrowOverlay, [_jp.jsPlumbUIComponent, _jp.Overlays.AbstractOverlay]); + + _jp.Overlays.svg.Arrow = function () { + AbstractSvgArrowOverlay.apply(this, [_jp.Overlays.Arrow, arguments]); + }; + _ju.extend(_jp.Overlays.svg.Arrow, [ _jp.Overlays.Arrow, AbstractSvgArrowOverlay ], svgProtoFunctions); + + _jp.Overlays.svg.PlainArrow = function () { + AbstractSvgArrowOverlay.apply(this, [_jp.Overlays.PlainArrow, arguments]); + }; + _ju.extend(_jp.Overlays.svg.PlainArrow, [ _jp.Overlays.PlainArrow, AbstractSvgArrowOverlay ], svgProtoFunctions); + + _jp.Overlays.svg.Diamond = function () { + AbstractSvgArrowOverlay.apply(this, [_jp.Overlays.Diamond, arguments]); + }; + _ju.extend(_jp.Overlays.svg.Diamond, [ _jp.Overlays.Diamond, AbstractSvgArrowOverlay ], svgProtoFunctions); + + // a test + _jp.Overlays.svg.GuideLines = function () { + var path = null, self = this, p1_1, p1_2; + _jp.Overlays.GuideLines.apply(this, arguments); + this.paint = function (params, containerExtents) { + if (path == null) { + path = _node("path"); + params.connector.svg.appendChild(path); + self.attachListeners(path, params.connector); + self.attachListeners(path, self); + + p1_1 = _node("path"); + params.connector.svg.appendChild(p1_1); + self.attachListeners(p1_1, params.connector); + self.attachListeners(p1_1, self); + + p1_2 = _node("path"); + params.connector.svg.appendChild(p1_2); + self.attachListeners(p1_2, params.connector); + self.attachListeners(p1_2, self); + } + + var offset = [0, 0]; + if (containerExtents.xmin < 0) { + offset[0] = -containerExtents.xmin; + } + if (containerExtents.ymin < 0) { + offset[1] = -containerExtents.ymin; + } + + _attr(path, { + "d": makePath(params.head, params.tail), + stroke: "red", + fill: null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + + _attr(p1_1, { + "d": makePath(params.tailLine[0], params.tailLine[1]), + stroke: "blue", + fill: null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + + _attr(p1_2, { + "d": makePath(params.headLine[0], params.headLine[1]), + stroke: "green", + fill: null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + }; + + var makePath = function (d1, d2) { + return "M " + d1.x + "," + d1.y + + " L" + d2.x + "," + d2.y; + }; + }; + _ju.extend(_jp.Overlays.svg.GuideLines, _jp.Overlays.GuideLines); +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains code used when jsPlumb is being rendered in a DOM. + * + * Copyright (c) 2010 - 2019 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil, + _jk = root.Katavorio, _jg = root.Biltong; + + var _getEventManager = function(instance) { + var e = instance._mottle; + if (!e) { + e = instance._mottle = new root.Mottle(); + } + return e; + }; + + var _getDragManager = function (instance, category) { + + category = category || "main"; + var key = "_katavorio_" + category; + var k = instance[key], + e = instance.getEventManager(); + + if (!k) { + k = new _jk({ + bind: e.on, + unbind: e.off, + getSize: _jp.getSize, + getConstrainingRectangle:function(el) { + return [ el.parentNode.scrollWidth, el.parentNode.scrollHeight ]; + }, + getPosition: function (el, relativeToRoot) { + // if this is a nested draggable then compute the offset against its own offsetParent, otherwise + // compute against the Container's origin. see also the getUIPosition method below. + var o = instance.getOffset(el, relativeToRoot, el._katavorioDrag ? el.offsetParent : null); + return [o.left, o.top]; + }, + setPosition: function (el, xy) { + el.style.left = xy[0] + "px"; + el.style.top = xy[1] + "px"; + }, + addClass: _jp.addClass, + removeClass: _jp.removeClass, + intersects: _jg.intersects, + indexOf: function(l, i) { return l.indexOf(i); }, + scope:instance.getDefaultScope(), + css: { + noSelect: instance.dragSelectClass, + droppable: "jtk-droppable", + draggable: "jtk-draggable", + drag: "jtk-drag", + selected: "jtk-drag-selected", + active: "jtk-drag-active", + hover: "jtk-drag-hover", + ghostProxy:"jtk-ghost-proxy" + } + }); + k.setZoom(instance.getZoom()); + instance[key] = k; + instance.bind("zoom", k.setZoom); + } + return k; + }; + + var _dragStart=function(params) { + var options = params.el._jsPlumbDragOptions; + var cont = true; + if (options.canDrag) { + cont = options.canDrag(); + } + if (cont) { + this.setHoverSuspended(true); + this.select({source: params.el}).addClass(this.elementDraggingClass + " " + this.sourceElementDraggingClass, true); + this.select({target: params.el}).addClass(this.elementDraggingClass + " " + this.targetElementDraggingClass, true); + this.setConnectionBeingDragged(true); + } + return cont; + }; + var _dragMove=function(params) { + var ui = this.getUIPosition(arguments, this.getZoom()); + if (ui != null) { + var o = params.el._jsPlumbDragOptions; + this.draw(params.el, ui, null, true); + if (o._dragging) { + this.addClass(params.el, "jtk-dragged"); + } + o._dragging = true; + } + }; + var _dragStop=function(params) { + var elements = params.selection, uip; + + var _one = function (_e) { + if (_e[1] != null) { + // run the reported offset through the code that takes parent containers + // into account, to adjust if necessary (issue 554) + uip = this.getUIPosition([{ + el:_e[2].el, + pos:[_e[1].left, _e[1].top] + }]); + this.draw(_e[2].el, uip); + } + + if (_e[0]._jsPlumbDragOptions != null) { + delete _e[0]._jsPlumbDragOptions._dragging; + } + + this.removeClass(_e[0], "jtk-dragged"); + this.select({source: _e[2].el}).removeClass(this.elementDraggingClass + " " + this.sourceElementDraggingClass, true); + this.select({target: _e[2].el}).removeClass(this.elementDraggingClass + " " + this.targetElementDraggingClass, true); + this.getDragManager().dragEnded(_e[2].el); + }.bind(this); + + for (var i = 0; i < elements.length; i++) { + _one(elements[i]); + } + + this.setHoverSuspended(false); + this.setConnectionBeingDragged(false); + }; + + var _animProps = function (o, p) { + var _one = function (pName) { + if (p[pName] != null) { + if (_ju.isString(p[pName])) { + var m = p[pName].match(/-=/) ? -1 : 1, + v = p[pName].substring(2); + return o[pName] + (m * v); + } + else { + return p[pName]; + } + } + else { + return o[pName]; + } + }; + return [ _one("left"), _one("top") ]; + }; + + var _genLoc = function (prefix, e) { + if (e == null) { + return [ 0, 0 ]; + } + var ts = _touches(e), t = _getTouch(ts, 0); + return [t[prefix + "X"], t[prefix + "Y"]]; + }, + _pageLocation = _genLoc.bind(this, "page"), + _screenLocation = _genLoc.bind(this, "screen"), + _clientLocation = _genLoc.bind(this, "client"), + _getTouch = function (touches, idx) { + return touches.item ? touches.item(idx) : touches[idx]; + }, + _touches = function (e) { + return e.touches && e.touches.length > 0 ? e.touches : + e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches : + e.targetTouches && e.targetTouches.length > 0 ? e.targetTouches : + [ e ]; + }; + + /** + Manages dragging for some instance of jsPlumb. + + TODO instead of this being accessed directly, it should subscribe to events on the jsPlumb instance: every method + in here is called directly by jsPlumb. But what should happen is that we have unpublished events that this listens + to. The only trick is getting one of these instantiated with every jsPlumb instance: it needs to have a hook somehow. + Basically the general idea is to pull ALL the drag code out (prototype method registrations plus this) into a + dedicated drag script), that does not necessarily need to be included. + + + */ + var DragManager = function (_currentInstance) { + var _draggables = {}, _dlist = [], _delements = {}, _elementsWithEndpoints = {}, + // elementids mapped to the draggable to which they belong. + _draggablesForElements = {}; + + /** + register some element as draggable. right now the drag init stuff is done elsewhere, and it is + possible that will continue to be the case. + */ + this.register = function (el) { + var id = _currentInstance.getId(el), + parentOffset; + + if (!_draggables[id]) { + _draggables[id] = el; + _dlist.push(el); + _delements[id] = {}; + } + + // look for child elements that have endpoints and register them against this draggable. + var _oneLevel = function (p) { + if (p) { + for (var i = 0; i < p.childNodes.length; i++) { + if (p.childNodes[i].nodeType !== 3 && p.childNodes[i].nodeType !== 8) { + var cEl = jsPlumb.getElement(p.childNodes[i]), + cid = _currentInstance.getId(p.childNodes[i], null, true); + if (cid && _elementsWithEndpoints[cid] && _elementsWithEndpoints[cid] > 0) { + if (!parentOffset) { + parentOffset = _currentInstance.getOffset(el); + } + var cOff = _currentInstance.getOffset(cEl); + _delements[id][cid] = { + id: cid, + offset: { + left: cOff.left - parentOffset.left, + top: cOff.top - parentOffset.top + } + }; + _draggablesForElements[cid] = id; + } + _oneLevel(p.childNodes[i]); + } + } + } + }; + + _oneLevel(el); + }; + + // refresh the offsets for child elements of this element. + this.updateOffsets = function (elId, childOffsetOverrides) { + if (elId != null) { + childOffsetOverrides = childOffsetOverrides || {}; + var domEl = jsPlumb.getElement(elId), + id = _currentInstance.getId(domEl), + children = _delements[id], + parentOffset; + + if (children) { + for (var i in children) { + if (children.hasOwnProperty(i)) { + var cel = jsPlumb.getElement(i), + cOff = childOffsetOverrides[i] || _currentInstance.getOffset(cel); + + // do not update if we have a value already and we'd just be writing 0,0 + if (cel.offsetParent == null && _delements[id][i] != null) { + continue; + } + + if (!parentOffset) { + parentOffset = _currentInstance.getOffset(domEl); + } + + _delements[id][i] = { + id: i, + offset: { + left: cOff.left - parentOffset.left, + top: cOff.top - parentOffset.top + } + }; + _draggablesForElements[i] = id; + } + } + } + } + }; + + /** + notification that an endpoint was added to the given el. we go up from that el's parent + node, looking for a parent that has been registered as a draggable. if we find one, we add this + el to that parent's list of elements to update on drag (if it is not there already) + */ + this.endpointAdded = function (el, id) { + + id = id || _currentInstance.getId(el); + + var b = document.body, + p = el.parentNode; + + _elementsWithEndpoints[id] = _elementsWithEndpoints[id] ? _elementsWithEndpoints[id] + 1 : 1; + + while (p != null && p !== b) { + var pid = _currentInstance.getId(p, null, true); + if (pid && _draggables[pid]) { + var pLoc = _currentInstance.getOffset(p); + + if (_delements[pid][id] == null) { + var cLoc = _currentInstance.getOffset(el); + _delements[pid][id] = { + id: id, + offset: { + left: cLoc.left - pLoc.left, + top: cLoc.top - pLoc.top + } + }; + _draggablesForElements[id] = pid; + } + break; + } + p = p.parentNode; + } + }; + + this.endpointDeleted = function (endpoint) { + if (_elementsWithEndpoints[endpoint.elementId]) { + _elementsWithEndpoints[endpoint.elementId]--; + if (_elementsWithEndpoints[endpoint.elementId] <= 0) { + for (var i in _delements) { + if (_delements.hasOwnProperty(i) && _delements[i]) { + delete _delements[i][endpoint.elementId]; + delete _draggablesForElements[endpoint.elementId]; + } + } + } + } + }; + + this.changeId = function (oldId, newId) { + _delements[newId] = _delements[oldId]; + _delements[oldId] = {}; + _draggablesForElements[newId] = _draggablesForElements[oldId]; + _draggablesForElements[oldId] = null; + }; + + this.getElementsForDraggable = function (id) { + return _delements[id]; + }; + + this.elementRemoved = function (elementId) { + var elId = _draggablesForElements[elementId]; + if (elId) { + delete _delements[elId][elementId]; + delete _draggablesForElements[elementId]; + } + }; + + this.reset = function () { + _draggables = {}; + _dlist = []; + _delements = {}; + _elementsWithEndpoints = {}; + }; + + // + // notification drag ended. We check automatically if need to update some + // ancestor's offsets. + // + this.dragEnded = function (el) { + if (el.offsetParent != null) { + var id = _currentInstance.getId(el), + ancestor = _draggablesForElements[id]; + + if (ancestor) { + this.updateOffsets(ancestor); + } + } + }; + + this.setParent = function (el, elId, p, pId, currentChildLocation) { + var current = _draggablesForElements[elId]; + if (!_delements[pId]) { + _delements[pId] = {}; + } + var pLoc = _currentInstance.getOffset(p), + cLoc = currentChildLocation || _currentInstance.getOffset(el); + + if (current && _delements[current]) { + delete _delements[current][elId]; + } + + _delements[pId][elId] = { + id:elId, + offset : { + left: cLoc.left - pLoc.left, + top: cLoc.top - pLoc.top + } + }; + _draggablesForElements[elId] = pId; + }; + + this.clearParent = function(el, elId) { + var current = _draggablesForElements[elId]; + if (current) { + delete _delements[current][elId]; + delete _draggablesForElements[elId]; + } + }; + + this.revalidateParent = function(el, elId, childOffset) { + var current = _draggablesForElements[elId]; + if (current) { + var co = {}; + co[elId] = childOffset; + this.updateOffsets(current, co); + _currentInstance.revalidate(current); + } + }; + + this.getDragAncestor = function (el) { + var de = jsPlumb.getElement(el), + id = _currentInstance.getId(de), + aid = _draggablesForElements[id]; + + if (aid) { + return jsPlumb.getElement(aid); + } + else { + return null; + } + }; + + }; + + var _setClassName = function (el, cn, classList) { + cn = _ju.fastTrim(cn); + if (typeof el.className.baseVal !== "undefined") { + el.className.baseVal = cn; + } + else { + el.className = cn; + } + + // recent (i currently have 61.0.3163.100) version of chrome do not update classList when you set the base val + // of an svg element's className. in the long run we'd like to move to just using classList anyway + try { + var cl = el.classList; + if (cl != null) { + while (cl.length > 0) { + cl.remove(cl.item(0)); + } + for (var i = 0; i < classList.length; i++) { + if (classList[i]) { + cl.add(classList[i]); + } + } + } + } + catch(e) { + // not fatal + _ju.log("JSPLUMB: cannot set class list", e); + } + }, + _getClassName = function (el) { + return (typeof el.className.baseVal === "undefined") ? el.className : el.className.baseVal; + }, + _classManip = function (el, classesToAdd, classesToRemove) { + classesToAdd = classesToAdd == null ? [] : _ju.isArray(classesToAdd) ? classesToAdd : classesToAdd.split(/\s+/); + classesToRemove = classesToRemove == null ? [] : _ju.isArray(classesToRemove) ? classesToRemove : classesToRemove.split(/\s+/); + + var className = _getClassName(el), + curClasses = className.split(/\s+/); + + var _oneSet = function (add, classes) { + for (var i = 0; i < classes.length; i++) { + if (add) { + if (curClasses.indexOf(classes[i]) === -1) { + curClasses.push(classes[i]); + } + } + else { + var idx = curClasses.indexOf(classes[i]); + if (idx !== -1) { + curClasses.splice(idx, 1); + } + } + } + }; + + _oneSet(true, classesToAdd); + _oneSet(false, classesToRemove); + + _setClassName(el, curClasses.join(" "), curClasses); + }; + + root.jsPlumb.extend(root.jsPlumbInstance.prototype, { + + headless: false, + + pageLocation: _pageLocation, + screenLocation: _screenLocation, + clientLocation: _clientLocation, + + getDragManager:function() { + if (this.dragManager == null) { + this.dragManager = new DragManager(this); + } + + return this.dragManager; + }, + + recalculateOffsets:function(elId) { + this.getDragManager().updateOffsets(elId); + }, + + createElement:function(tag, style, clazz, atts) { + return this.createElementNS(null, tag, style, clazz, atts); + }, + + createElementNS:function(ns, tag, style, clazz, atts) { + var e = ns == null ? document.createElement(tag) : document.createElementNS(ns, tag); + var i; + style = style || {}; + for (i in style) { + e.style[i] = style[i]; + } + + if (clazz) { + e.className = clazz; + } + + atts = atts || {}; + for (i in atts) { + e.setAttribute(i, "" + atts[i]); + } + + return e; + }, + + getAttribute: function (el, attName) { + return el.getAttribute != null ? el.getAttribute(attName) : null; + }, + + setAttribute: function (el, a, v) { + if (el.setAttribute != null) { + el.setAttribute(a, v); + } + }, + + setAttributes: function (el, atts) { + for (var i in atts) { + if (atts.hasOwnProperty(i)) { + el.setAttribute(i, atts[i]); + } + } + }, + appendToRoot: function (node) { + document.body.appendChild(node); + }, + getRenderModes: function () { + return [ "svg" ]; + }, + getClass:_getClassName, + addClass: function (el, clazz) { + jsPlumb.each(el, function (e) { + _classManip(e, clazz); + }); + }, + hasClass: function (el, clazz) { + el = jsPlumb.getElement(el); + if (el.classList) { + return el.classList.contains(clazz); + } + else { + return _getClassName(el).indexOf(clazz) !== -1; + } + }, + removeClass: function (el, clazz) { + jsPlumb.each(el, function (e) { + _classManip(e, null, clazz); + }); + }, + toggleClass:function(el, clazz) { + if (jsPlumb.hasClass(el, clazz)) { + jsPlumb.removeClass(el, clazz); + } else { + jsPlumb.addClass(el, clazz); + } + }, + updateClasses: function (el, toAdd, toRemove) { + jsPlumb.each(el, function (e) { + _classManip(e, toAdd, toRemove); + }); + }, + setClass: function (el, clazz) { + if (clazz != null) { + jsPlumb.each(el, function (e) { + _setClassName(e, clazz, clazz.split(/\s+/)); + }); + } + }, + setPosition: function (el, p) { + el.style.left = p.left + "px"; + el.style.top = p.top + "px"; + }, + getPosition: function (el) { + var _one = function (prop) { + var v = el.style[prop]; + return v ? v.substring(0, v.length - 2) : 0; + }; + return { + left: _one("left"), + top: _one("top") + }; + }, + getStyle:function(el, prop) { + if (typeof window.getComputedStyle !== 'undefined') { + return getComputedStyle(el, null).getPropertyValue(prop); + } else { + return el.currentStyle[prop]; + } + }, + getSelector: function (ctx, spec) { + var sel = null; + if (arguments.length === 1) { + sel = ctx.nodeType != null ? ctx : document.querySelectorAll(ctx); + } + else { + sel = ctx.querySelectorAll(spec); + } + + return sel; + }, + getOffset:function(el, relativeToRoot, container) { + el = jsPlumb.getElement(el); + container = container || this.getContainer(); + var out = { + left: el.offsetLeft, + top: el.offsetTop + }, + op = (relativeToRoot || (container != null && (el !== container && el.offsetParent !== container))) ? el.offsetParent : null, + _maybeAdjustScroll = function(offsetParent) { + if (offsetParent != null && offsetParent !== document.body && (offsetParent.scrollTop > 0 || offsetParent.scrollLeft > 0)) { + out.left -= offsetParent.scrollLeft; + out.top -= offsetParent.scrollTop; + } + }.bind(this); + + while (op != null) { + out.left += op.offsetLeft; + out.top += op.offsetTop; + _maybeAdjustScroll(op); + op = relativeToRoot ? op.offsetParent : + op.offsetParent === container ? null : op.offsetParent; + } + + // if container is scrolled and the element (or its offset parent) is not absolute or fixed, adjust accordingly. + if (container != null && !relativeToRoot && (container.scrollTop > 0 || container.scrollLeft > 0)) { + var pp = el.offsetParent != null ? this.getStyle(el.offsetParent, "position") : "static", + p = this.getStyle(el, "position"); + if (p !== "absolute" && p !== "fixed" && pp !== "absolute" && pp !== "fixed") { + out.left -= container.scrollLeft; + out.top -= container.scrollTop; + } + } + return out; + }, + // + // return x+y proportion of the given element's size corresponding to the location of the given event. + // + getPositionOnElement: function (evt, el, zoom) { + var box = typeof el.getBoundingClientRect !== "undefined" ? el.getBoundingClientRect() : { left: 0, top: 0, width: 0, height: 0 }, + body = document.body, + docElem = document.documentElement, + scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop, + scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft, + clientTop = docElem.clientTop || body.clientTop || 0, + clientLeft = docElem.clientLeft || body.clientLeft || 0, + pst = 0, + psl = 0, + top = box.top + scrollTop - clientTop + (pst * zoom), + left = box.left + scrollLeft - clientLeft + (psl * zoom), + cl = jsPlumb.pageLocation(evt), + w = box.width || (el.offsetWidth * zoom), + h = box.height || (el.offsetHeight * zoom), + x = (cl[0] - left) / w, + y = (cl[1] - top) / h; + + return [ x, y ]; + }, + + /** + * Gets the absolute position of some element as read from the left/top properties in its style. + * @method getAbsolutePosition + * @param {Element} el The element to retrieve the absolute coordinates from. **Note** this is a DOM element, not a selector from the underlying library. + * @return {Number[]} [left, top] pixel values. + */ + getAbsolutePosition: function (el) { + var _one = function (s) { + var ss = el.style[s]; + if (ss) { + return parseFloat(ss.substring(0, ss.length - 2)); + } + }; + return [ _one("left"), _one("top") ]; + }, + + /** + * Sets the absolute position of some element by setting the left/top properties in its style. + * @method setAbsolutePosition + * @param {Element} el The element to set the absolute coordinates on. **Note** this is a DOM element, not a selector from the underlying library. + * @param {Number[]} xy x and y coordinates + * @param {Number[]} [animateFrom] Optional previous xy to animate from. + * @param {Object} [animateOptions] Options for the animation. + */ + setAbsolutePosition: function (el, xy, animateFrom, animateOptions) { + if (animateFrom) { + this.animate(el, { + left: "+=" + (xy[0] - animateFrom[0]), + top: "+=" + (xy[1] - animateFrom[1]) + }, animateOptions); + } + else { + el.style.left = xy[0] + "px"; + el.style.top = xy[1] + "px"; + } + }, + /** + * gets the size for the element, in an array : [ width, height ]. + */ + getSize: function (el) { + return [ el.offsetWidth, el.offsetHeight ]; + }, + getWidth: function (el) { + return el.offsetWidth; + }, + getHeight: function (el) { + return el.offsetHeight; + }, + getRenderMode : function() { return "svg"; }, + draggable : function (el, options) { + var info; + el = _ju.isArray(el) || (el.length != null && !_ju.isString(el)) ? el: [ el ]; + Array.prototype.slice.call(el).forEach(function(_el) { + info = this.info(_el); + if (info.el) { + this._initDraggableIfNecessary(info.el, true, options, info.id, true); + } + }.bind(this)); + return this; + }, + snapToGrid : function(el, x, y) { + var out = []; + var _oneEl = function(_el) { + var info = this.info(_el); + if (info.el != null && info.el._katavorioDrag) { + var snapped = info.el._katavorioDrag.snap(x, y); + this.revalidate(info.el); + out.push([info.el, snapped]); + } + }.bind(this); + + // if you call this method with 0 arguments or 2 arguments it is assumed you want to snap all managed elements to + // a grid. if you supply one argument or 3, then you are assumed to be specifying one element. + if(arguments.length === 1 || arguments.length === 3) { + _oneEl(el, x, y); + } else { + var _me = this.getManagedElements(); + for (var mel in _me) { + _oneEl(mel, arguments[0], arguments[1]); + } + } + + return out; + }, + initDraggable: function (el, options, category) { + _getDragManager(this, category).draggable(el, options); + el._jsPlumbDragOptions = options; + }, + destroyDraggable: function (el, category) { + _getDragManager(this, category).destroyDraggable(el); + delete el._jsPlumbDragOptions; + }, + unbindDraggable: function (el, evt, fn, category) { + _getDragManager(this, category).destroyDraggable(el, evt, fn); + }, + setDraggable : function (element, draggable) { + return jsPlumb.each(element, function (el) { + if (this.isDragSupported(el)) { + this._draggableStates[this.getAttribute(el, "id")] = draggable; + this.setElementDraggable(el, draggable); + } + }.bind(this)); + }, + _draggableStates : {}, + /* + * toggles the draggable state of the given element(s). + * el is either an id, or an element object, or a list of ids/element objects. + */ + toggleDraggable : function (el) { + var state; + jsPlumb.each(el, function (el) { + var elId = this.getAttribute(el, "id"); + state = this._draggableStates[elId] == null ? false : this._draggableStates[elId]; + state = !state; + this._draggableStates[elId] = state; + this.setDraggable(el, state); + return state; + }.bind(this)); + return state; + }, + _initDraggableIfNecessary : function (element, isDraggable, dragOptions, id, fireEvent) { + // TODO FIRST: move to DragManager. including as much of the decision to init dragging as possible. + if (!jsPlumb.headless) { + var _draggable = isDraggable == null ? false : isDraggable; + if (_draggable) { + if (jsPlumb.isDragSupported(element, this)) { + var options = dragOptions || this.Defaults.DragOptions; + options = jsPlumb.extend({}, options); // make a copy. + if (!jsPlumb.isAlreadyDraggable(element, this)) { + var dragEvent = jsPlumb.dragEvents.drag, + stopEvent = jsPlumb.dragEvents.stop, + startEvent = jsPlumb.dragEvents.start; + + this.manage(id, element); + + options[startEvent] = _ju.wrap(options[startEvent], _dragStart.bind(this)); + + options[dragEvent] = _ju.wrap(options[dragEvent], _dragMove.bind(this)); + + options[stopEvent] = _ju.wrap(options[stopEvent], _dragStop.bind(this)); + + var elId = this.getId(element); // need ID + + this._draggableStates[elId] = true; + var draggable = this._draggableStates[elId]; + + options.disabled = draggable == null ? false : !draggable; + this.initDraggable(element, options); + this.getDragManager().register(element); + if (fireEvent) { + this.fire("elementDraggable", {el:element, options:options}); + } + } + else { + // already draggable. attach any start, drag or stop listeners to the current Drag. + if (dragOptions.force) { + this.initDraggable(element, options); + } + } + } + } + } + }, + animationSupported:true, + getElement: function (el) { + if (el == null) { + return null; + } + // here we pluck the first entry if el was a list of entries. + // this is not my favourite thing to do, but previous versions of + // jsplumb supported jquery selectors, and it is possible a selector + // will be passed in here. + el = typeof el === "string" ? el : el.length != null && el.enctype == null ? el[0] : el; + return typeof el === "string" ? document.getElementById(el) : el; + }, + removeElement: function (element) { + _getDragManager(this).elementRemoved(element); + this.getEventManager().remove(element); + }, + // + // this adapter supports a rudimentary animation function. no easing is supported. only + // left/top properties are supported. property delta args are expected to be in the form + // + // +=x.xxxx + // + // or + // + // -=x.xxxx + // + doAnimate: function (el, properties, options) { + options = options || {}; + var o = this.getOffset(el), + ap = _animProps(o, properties), + ldist = ap[0] - o.left, + tdist = ap[1] - o.top, + d = options.duration || 250, + step = 15, steps = d / step, + linc = (step / d) * ldist, + tinc = (step / d) * tdist, + idx = 0, + _int = setInterval(function () { + _jp.setPosition(el, { + left: o.left + (linc * (idx + 1)), + top: o.top + (tinc * (idx + 1)) + }); + if (options.step != null) { + options.step(idx, Math.ceil(steps)); + } + idx++; + if (idx >= steps) { + window.clearInterval(_int); + if (options.complete != null) { + options.complete(); + } + } + }, step); + }, + // DRAG/DROP + + + destroyDroppable: function (el, category) { + _getDragManager(this, category).destroyDroppable(el); + }, + unbindDroppable: function (el, evt, fn, category) { + _getDragManager(this, category).destroyDroppable(el, evt, fn); + }, + + droppable :function(el, options) { + el = _ju.isArray(el) || (el.length != null && !_ju.isString(el)) ? el: [ el ]; + var info; + options = options || {}; + options.allowLoopback = false; + Array.prototype.slice.call(el).forEach(function(_el) { + info = this.info(_el); + if (info.el) { + this.initDroppable(info.el, options); + } + }.bind(this)); + return this; + }, + + initDroppable: function (el, options, category) { + _getDragManager(this, category).droppable(el, options); + }, + isAlreadyDraggable: function (el) { + return el._katavorioDrag != null; + }, + isDragSupported: function (el, options) { + return true; + }, + isDropSupported: function (el, options) { + return true; + }, + isElementDraggable: function (el) { + el = _jp.getElement(el); + return el._katavorioDrag && el._katavorioDrag.isEnabled(); + }, + getDragObject: function (eventArgs) { + return eventArgs[0].drag.getDragElement(); + }, + getDragScope: function (el) { + return el._katavorioDrag && el._katavorioDrag.scopes.join(" ") || ""; + }, + getDropEvent: function (args) { + return args[0].e; + }, + getUIPosition: function (eventArgs, zoom) { + // here the position reported to us by Katavorio is relative to the element's offsetParent. For top + // level nodes that is fine, but if we have a nested draggable then its offsetParent is actually + // not going to be the jsplumb container; it's going to be some child of that element. In that case + // we want to adjust the UI position to account for the offsetParent's position relative to the Container + // origin. + var el = eventArgs[0].el; + if (el.offsetParent == null) { + return null; + } + var finalPos = eventArgs[0].finalPos || eventArgs[0].pos; + var p = { left:finalPos[0], top:finalPos[1] }; + if (el._katavorioDrag && el.offsetParent !== this.getContainer()) { + var oc = this.getOffset(el.offsetParent); + p.left += oc.left; + p.top += oc.top; + } + return p; + }, + setDragFilter: function (el, filter, _exclude) { + if (el._katavorioDrag) { + el._katavorioDrag.setFilter(filter, _exclude); + } + }, + setElementDraggable: function (el, draggable) { + el = _jp.getElement(el); + if (el._katavorioDrag) { + el._katavorioDrag.setEnabled(draggable); + } + }, + setDragScope: function (el, scope) { + if (el._katavorioDrag) { + el._katavorioDrag.k.setDragScope(el, scope); + } + }, + setDropScope:function(el, scope) { + if (el._katavorioDrop && el._katavorioDrop.length > 0) { + el._katavorioDrop[0].k.setDropScope(el, scope); + } + }, + addToPosse:function(el, spec) { + var specs = Array.prototype.slice.call(arguments, 1); + var dm = _getDragManager(this); + _jp.each(el, function(_el) { + _el = [ _jp.getElement(_el) ]; + _el.push.apply(_el, specs ); + dm.addToPosse.apply(dm, _el); + }); + }, + setPosse:function(el, spec) { + var specs = Array.prototype.slice.call(arguments, 1); + var dm = _getDragManager(this); + _jp.each(el, function(_el) { + _el = [ _jp.getElement(_el) ]; + _el.push.apply(_el, specs ); + dm.setPosse.apply(dm, _el); + }); + }, + removeFromPosse:function(el, posseId) { + var specs = Array.prototype.slice.call(arguments, 1); + var dm = _getDragManager(this); + _jp.each(el, function(_el) { + _el = [ _jp.getElement(_el) ]; + _el.push.apply(_el, specs ); + dm.removeFromPosse.apply(dm, _el); + }); + }, + removeFromAllPosses:function(el) { + var dm = _getDragManager(this); + _jp.each(el, function(_el) { dm.removeFromAllPosses(_jp.getElement(_el)); }); + }, + setPosseState:function(el, posseId, state) { + var dm = _getDragManager(this); + _jp.each(el, function(_el) { dm.setPosseState(_jp.getElement(_el), posseId, state); }); + }, + dragEvents: { + 'start': 'start', 'stop': 'stop', 'drag': 'drag', 'step': 'step', + 'over': 'over', 'out': 'out', 'drop': 'drop', 'complete': 'complete', + 'beforeStart':'beforeStart' + }, + animEvents: { + 'step': "step", 'complete': 'complete' + }, + stopDrag: function (el) { + if (el._katavorioDrag) { + el._katavorioDrag.abort(); + } + }, + addToDragSelection: function (spec) { + var el = this.getElement(spec); + if (el != null && (el._isJsPlumbGroup || el._jsPlumbGroup == null)) { + _getDragManager(this).select(spec); + } + }, + removeFromDragSelection: function (spec) { + _getDragManager(this).deselect(spec); + }, + getDragSelection:function() { + return _getDragManager(this).getSelection(); + }, + clearDragSelection: function () { + _getDragManager(this).deselectAll(); + }, + trigger: function (el, event, originalEvent, payload) { + this.getEventManager().trigger(el, event, originalEvent, payload); + }, + doReset:function() { + // look for katavorio instances and reset each one if found. + for (var key in this) { + if (key.indexOf("_katavorio_") === 0) { + this[key].reset(); + } + } + }, + getEventManager:function() { + return _getEventManager(this); + }, + on : function(el, event, callback) { + // TODO: here we would like to map the tap event if we know its + // an internal bind to a click. we have to know its internal because only + // then can we be sure that the UP event wont be consumed (tap is a synthesized + // event from a mousedown followed by a mouseup). + //event = { "click":"tap", "dblclick":"dbltap"}[event] || event; + this.getEventManager().on.apply(this, arguments); + return this; + }, + off : function(el, event, callback) { + this.getEventManager().off.apply(this, arguments); + return this; + } + + }); + + var ready = function (f) { + var _do = function () { + if (/complete|loaded|interactive/.test(document.readyState) && typeof(document.body) !== "undefined" && document.body != null) { + f(); + } + else { + setTimeout(_do, 9); + } + }; + + _do(); + }; + ready(_jp.init); + +}).call(typeof window !== 'undefined' ? window : this); diff --git a/experiment/simulation/EE5/helper/cable/simulate.html b/experiment/simulation/EE5/helper/cable/simulate.html new file mode 100644 index 0000000..d650bcc --- /dev/null +++ b/experiment/simulation/EE5/helper/cable/simulate.html @@ -0,0 +1,117 @@ + + + Log Amplifier + + + + + + + +
    + +

    Log Amplifier

    + + + + +
    +

    1

    +

    2

    +

    3

    +

    4

    +

    5

    +

    6

    +

    7

    +

    8

    +

    9

    +

    10

    +
    + + + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + Copyright©2019 | Lab developed by Virtual Labs, IIT Roorkee
    +
    + + +
    + + + + + + + \ No newline at end of file diff --git a/experiment/simulation/EE5/helper/cable/temp.html b/experiment/simulation/EE5/helper/cable/temp.html new file mode 100644 index 0000000..8311e75 --- /dev/null +++ b/experiment/simulation/EE5/helper/cable/temp.html @@ -0,0 +1,76 @@ + + + + + + JsPlumb Circuit Simulator + + + + + + +
    1
    +
    2
    +
    3
    +
    4
    +
    5
    +
    6
    +
    7
    +
    8
    +
    9
    +
    10
    + + + + + diff --git a/experiment/simulation/EE5/helper/img/slider_D_blank.png b/experiment/simulation/EE5/helper/img/slider_D_blank.png new file mode 100644 index 0000000..d7893b4 Binary files /dev/null and b/experiment/simulation/EE5/helper/img/slider_D_blank.png differ diff --git a/experiment/simulation/EE5/helper/img/slider_R_arrow.png b/experiment/simulation/EE5/helper/img/slider_R_arrow.png new file mode 100644 index 0000000..cbbb9c5 Binary files /dev/null and b/experiment/simulation/EE5/helper/img/slider_R_arrow.png differ diff --git a/experiment/simulation/EE5/helper/img/slider_V_arrow.png b/experiment/simulation/EE5/helper/img/slider_V_arrow.png new file mode 100644 index 0000000..b855b94 Binary files /dev/null and b/experiment/simulation/EE5/helper/img/slider_V_arrow.png differ diff --git a/experiment/simulation/EE5/helper/img/slider_V_back.png b/experiment/simulation/EE5/helper/img/slider_V_back.png new file mode 100644 index 0000000..14ddcee Binary files /dev/null and b/experiment/simulation/EE5/helper/img/slider_V_back.png differ diff --git a/experiment/simulation/EE5/helper/img/slider_circuit.png b/experiment/simulation/EE5/helper/img/slider_circuit.png new file mode 100644 index 0000000..f58870f Binary files /dev/null and b/experiment/simulation/EE5/helper/img/slider_circuit.png differ diff --git a/experiment/simulation/EE5/helper/img/slider_tip.png b/experiment/simulation/EE5/helper/img/slider_tip.png new file mode 100644 index 0000000..13c5348 Binary files /dev/null and b/experiment/simulation/EE5/helper/img/slider_tip.png differ diff --git a/experiment/simulation/EE5/helper/practice component/leet.js b/experiment/simulation/EE5/helper/practice component/leet.js new file mode 100644 index 0000000..41e7fb1 --- /dev/null +++ b/experiment/simulation/EE5/helper/practice component/leet.js @@ -0,0 +1,8 @@ +let sc = "!@#$%^&*()-+" + + +let pass = "sneha@@33" + +console.log("skjdkj") + +console.log(pass.indexOf(sc)); \ No newline at end of file diff --git a/experiment/simulation/EE5/helper/practice component/temp.html b/experiment/simulation/EE5/helper/practice component/temp.html new file mode 100644 index 0000000..c79f92f --- /dev/null +++ b/experiment/simulation/EE5/helper/practice component/temp.html @@ -0,0 +1,202 @@ + + + + + + Document + + + +
    +
    +
    +
    V in (V)
    + +
    +
    +
    R (Ω)
    + +
    +
    +
    Characteristics
    + +
    +
    + +
    +
    +
    D
    + + +
    +
    +
    + + + \ No newline at end of file diff --git a/experiment/simulation/EE5/helper/practice component/tempCodeRunnerFile.js b/experiment/simulation/EE5/helper/practice component/tempCodeRunnerFile.js new file mode 100644 index 0000000..2550fd3 --- /dev/null +++ b/experiment/simulation/EE5/helper/practice component/tempCodeRunnerFile.js @@ -0,0 +1,8 @@ +let sc = "!@#$%^&*()-+" + + +let pass = "sneha@@33" + +console.log("skjdkj") + +console.log(pass.indexOf("sc")); \ No newline at end of file diff --git a/experiment/simulation/EE5/helper/sliders.css b/experiment/simulation/EE5/helper/sliders.css new file mode 100644 index 0000000..6a7e6fc --- /dev/null +++ b/experiment/simulation/EE5/helper/sliders.css @@ -0,0 +1,137 @@ +body{ + background-color: #f1ece3; +} +.universal-slider{ + +} +.universal-slider .slider-circuit{ + position: relative; + z-index: 20; +} +.slider .slider_R,.range-slider{ + position: absolute; + left: 557px; + top: 115px; + z-index: 499; + -webkit-appearance: none; + appearance: none; + transform: rotate(-90deg); + width: 80px; + height: 30px; + height: 10px; + border-radius: 5px; + /* background: #d3d3d3; */ + background: transparent; + outline: none; + opacity: 0.9; + -webkit-transition: .2s; + transition: opacity .2s; +} +.slider .slider_R::-webkit-slider-thumb,.range-slider::-webkit-slider-thumb{ + -webkit-appearance: none; + appearance: none; + height: 30px; + width: 30px; + border: 0; + transform: rotate(90deg); + background: url('./img/slider_tip.png'); + background-position: center; + background-size: cover; + background-repeat: no-repeat; + cursor: pointer; + +} +.slider .slider_R:hover,.range-slider:hover{ + /* background-color: black; */ + opacity: 1; +} + +.slider .slider_R+img{ + position: absolute; + left: 569px; + top: 120px; + z-index: 498; +} +.slider .value-box{ + background-color: white; + text-align: black; + border: 1px solid black; + width: fit-content; + display: flex; + padding: 0 3px; +} +.slider .value-box input{ + border: none; + outline: none; + width: 25px; + font-weight: bold; +} + + + + +/* ! Fix positions of all slider input value */ +.slider .r .value-box{ + position: absolute; + left: 588px; + top: 54px; + z-index: 500; +} +/* slider d */ +.slider .slider_D{ + transform: rotate(0deg); + left: 281px; + top: 143.8px; + width: 80px; + background-color: transparent; +} + +.slider .d .value-box{ + position: absolute; + left: 299px; + top: 97px; + z-index: 500; +} +.slider .slider_D+img{ + position: absolute; + left: 218px; + top: 141px; + width: 80px; + z-index: 10; +} + +/* slider v */ +.slider .v .meter{ + width: 113px; + position: absolute; + top: 12px; + left: 70px; +} + +.slider .v .slider-V-arrow{ + width: 35px; + position: absolute; + z-index: 200; +} + +.slider-v-r1{ + transform: rotate(0deg); + top: 65px; + left: 100px; +} +.slider-v-r2{ + transform: rotate(50deg); + top: 62px; + left: 110px; +} +.slider-v-r3{ + transform: rotate(110deg); + top: 67px; + left: 119px; +} +.slider .v .value-box{ + position: absolute; + top: 103px; + left: 116px; + z-index: 200; +} diff --git a/experiment/simulation/EE5/helper/sliders.js b/experiment/simulation/EE5/helper/sliders.js new file mode 100644 index 0000000..eadb1ec --- /dev/null +++ b/experiment/simulation/EE5/helper/sliders.js @@ -0,0 +1,103 @@ +function sliderR(){ + let slider_R = document.querySelector(".slider_R") + let sliderImg = document.querySelector(".slider-R-arrow") + let sliderValueInput = document.querySelector(".r .value-box input") + // ratio to move 450/50 = 1:10 + // max img 71px -> min 120 px + let val = 0 + + // slider function + function slide(e){ + e = e instanceof Event + if(e){ + sliderValueInput.value = slider_R.value + } + else{ + slider_R.value = sliderValueInput.value + } + val = (slider_R.value / 9.3) - 5 + sliderImg.style.top = `${120 - val}px` + } + + const slideInput = ()=>{ + let val = sliderValueInput.value + if(val > 500){ + val = 500 + } + sliderValueInput.value = val + slide(false) + } + + slider_R.oninput = slide + sliderValueInput.onkeyup = slideInput + sliderValueInput.addEventListener("focusout",()=>{ + if(sliderValueInput.value < 50){ + sliderValueInput.value = 50 + } + slide(false) + }) +} +function sliderD(){ + let slider_D = document.querySelector(".slider_D") + let sliderImg = document.querySelector(".slider-D-arrow") + let sliderValueInput = document.querySelector(".d .value-box input") + let val = 0 + + // slider function + function slide(e){ + e = e instanceof Event + if(e){ + sliderValueInput.value = slider_D.value + } + else{ + slider_D.value = sliderValueInput.value + } + val = ((slider_D.value*100) / 1.7) - 5 + sliderImg.style.left = `${218 + val}px` + } + + const slideInput = ()=>{ + let val = sliderValueInput.value + if(val > 0.95){ + val = 0.95 + } + sliderValueInput.value = val + slide(false) + } + + slider_D.oninput = slide + sliderValueInput.onkeyup = slideInput + sliderValueInput.addEventListener("focusout",()=>{ + if(sliderValueInput.value < 0.1){ + sliderValueInput.value = 0.1 + } + slide(false) + }) +} +function sliderV(){ + let sliderArrow = document.querySelector(".slider-V-arrow") + let sliderValueInput = document.querySelector(".v .value-box input") + + // slider function + function rotateArrow(rot=0){ + if(sliderArrow.classList.contains("slider-v-r3")){ + sliderArrow.classList.remove("slider-v-r3") + sliderArrow.classList.add("slider-v-r1") + sliderValueInput.value = 24 + + }else if(sliderArrow.classList.contains("slider-v-r1")){ + sliderArrow.classList.remove("slider-v-r1") + sliderArrow.classList.add("slider-v-r2") + sliderValueInput.value = 48 + }else if(sliderArrow.classList.contains("slider-v-r2")){ + sliderArrow.classList.remove("slider-v-r2") + sliderArrow.classList.add("slider-v-r3") + sliderValueInput.value = 72 + } + } + + sliderArrow.onclick = rotateArrow +} +sliderV() +sliderR() +sliderD() \ No newline at end of file diff --git a/experiment/simulation/EE5/helper/temp.html b/experiment/simulation/EE5/helper/temp.html new file mode 100644 index 0000000..33e8c0d --- /dev/null +++ b/experiment/simulation/EE5/helper/temp.html @@ -0,0 +1,97 @@ + + + + + + Document + + + + + + +
    + + + + + + + + + + + + +
    + + + diff --git a/experiment/simulation/EE5/helper/temp.py b/experiment/simulation/EE5/helper/temp.py new file mode 100644 index 0000000..13c9c50 --- /dev/null +++ b/experiment/simulation/EE5/helper/temp.py @@ -0,0 +1,51 @@ +import os +def html(name): + return ''' + + '''.format(name) + +def src(name :str): + return name[0:name.find('.')] + ":this.allImgsDom[index++],\n" + + +def dom(name): + name1 = name[0: name.find(".")] + return f'{name1} : new Dom("{name1}"),\n' + + +sneha_folder_path = "E:\\office project\\vlabs-EE\\EE5\\src\\images\\final_src\\" + +# utkarsh_folder_path = "S:\\Users\\Utkarsh\\Documents\\Office Main\\All Projects Repo\\vlabs-EE\\EE4\\src\\images\\exp4\\part2\\" + +names = os.listdir(sneha_folder_path) + +# namesStr = '' +# for name in names: +# namesStr = namesStr + f'{name}\n' + +# open("temp3.txt","w").write(namesStr) + +# BASE_COUNT = 13 +# count = 168 + +srcs = '' +doms = '' +htms = '' +for i in range(len(names)): + htms = htms + html(names[i]) + doms = doms + dom(names[i]) + srcs = srcs + src(names[i]) + + + + +# open("temp.txt","w").write() +allItems = f'{htms}\n\n{srcs}\n\n{doms}' +open("temp2.txt","w").write(allItems) + +print("Done 👍") +# print(os.__path__) +# \ No newline at end of file diff --git a/experiment/simulation/EE5/helper/temp.txt b/experiment/simulation/EE5/helper/temp.txt new file mode 100644 index 0000000..e69de29 diff --git a/experiment/simulation/EE5/helper/temp2.py b/experiment/simulation/EE5/helper/temp2.py new file mode 100644 index 0000000..6554647 --- /dev/null +++ b/experiment/simulation/EE5/helper/temp2.py @@ -0,0 +1,325 @@ +domitems = ''' + anchor_plate.webp + anchor_plate.webp + anchor_plate.webp + anchor_plate.webp + + beam_3d_1.png + beam_3d_1.png + + beam_3d_with_holes.png + beam_3d_with_holes.png + + ct_prop.png + ct_prop.png + ct_prop.png + ct_prop.png + ct_prop.png + ct_prop.png + + foot_adapter.png + foot_adapter.png + foot_adapter.png + + head_adapter.webp + head_adapter.webp + full_column.jpeg + drill_machine.png + hammer.png + nail.png + objective.png + real_foot_adapter.png + real_head_adapter.png + + sheathing.png + sheathing.png + sheathing.png + sheathing.png + sheathing.png + + steel_waler.png + steel_waler.png + steel_waler.png + tie_rod.png + tie_rod.png + tie_rod.png + tie_rod.png + wing_nut_top-cutout.png + wing_nut_top-cutout.png + wing_nut_top-cutout.png + wing_nut_top-cutout.png + wing_nut_top-cutout.png + wing_nut_full.png +''' + +names = '''anchor_plate +anchor_plate +anchor_plate +anchor_plate +beam_3d_1 +beam_3d_1 +beam_3d_with_holes +beam_3d_with_holes +ct_prop +ct_prop +ct_prop +ct_prop +ct_prop +ct_prop +foot_adapter +foot_adapter +foot_adapter +head_adapter +head_adapter +full_column +drill_machine +hammer +nail +objective +real_foot_adapter +real_head_adapter +sheathing +sheathing +sheathing +sheathing +sheathing +steel +steel +steel +tie_rod +tie_rod +tie_rod +tie_rod +wing_nut_top +wing_nut_top +wing_nut_top +wing_nut_top +wing_nut_top +wing_nut_full +''' + +names = names.split("\n") +for i in range(27,len(names)+27): + l = names[i-27] + ": this.allImgsDom[{0}],".format(i) + print(l) + \ No newline at end of file diff --git a/experiment/simulation/EE5/helper/temp2.txt b/experiment/simulation/EE5/helper/temp2.txt new file mode 100644 index 0000000..a802c50 --- /dev/null +++ b/experiment/simulation/EE5/helper/temp2.txt @@ -0,0 +1,68 @@ + + formulas_component_stress.png + + formulas_efficiency.png + + formulas_ideal.png + + formulas_nomenclautre.png + + formulas_non_ideal.png + + formulas_procedure.png + + formulas_universal.png + + graph2_arrow.png + + +formulas_component_stress:this.allImgsDom[134], +formulas_efficiency:this.allImgsDom[135], +formulas_ideal:this.allImgsDom[136], +formulas_nomenclautre:this.allImgsDom[137], +formulas_non_ideal:this.allImgsDom[138], +formulas_procedure:this.allImgsDom[139], +formulas_universal:this.allImgsDom[140], +graph2_arrow:this.allImgsDom[141], + + +formulas_component_stress : new Dom("formulas_component_stress"), +formulas_efficiency : new Dom("formulas_efficiency"), +formulas_ideal : new Dom("formulas_ideal"), +formulas_nomenclautre : new Dom("formulas_nomenclautre"), +formulas_non_ideal : new Dom("formulas_non_ideal"), +formulas_procedure : new Dom("formulas_procedure"), +formulas_universal : new Dom("formulas_universal"), +graph2_arrow : new Dom("graph2_arrow"), diff --git a/experiment/simulation/EE5/helper/temp3.txt b/experiment/simulation/EE5/helper/temp3.txt new file mode 100644 index 0000000..56fbe1c --- /dev/null +++ b/experiment/simulation/EE5/helper/temp3.txt @@ -0,0 +1,90 @@ +slide_1.png +slide_2.png +slide_3_page_1.png +slide_3_page_2.png +slide_3_page_3.png +slide_3_page_4.png +slide_4_page_1.png +slide_4_page_1_fan.png +slide_4_page_2_battery_1.png +slide_4_page_2_battery_2.png +slide_4_page_2_battery_3.png +slide_4_page_2_volt_text.png +slide_4_page_3_text_1.png +slide_4_page_3_text_2.png +slide_4_page_3_wire.png +slide_5_page_1.png +slide_5_page_2_text_1.png +slide_5_page_2_volt_text.png +slide_5_page_3_1_text_1.png +slide_5_page_3_2_wire.png +slide_5_page_3_3_light.png +slide_5_page_3_4_blast.gif +slide_5_page_3_5_cross.png +slide_5_page_3_6_emoji.png +slide_5_page_3_7_text_2.png +slide_5_page_3_8_text_3.png +slide_5_page_4_1_text_1.png +slide_6_page_1.png +slide_6_page_2_1_text_1.png +slide_6_page_2_2_emoji_blink.png +slide_6_page_3_1_text_1.png +slide_6_page_3_2_emoji_blink.png +slide_7_page_1_1.png +slide_7_page_1_2.png +slide_7_page_1_3.png +slide_8_page_1.png +slide_8_page_2_and_rotate_the_fan.png +slide_8_page_3_1.png +slide_8_page_3_2_light.png +slide_8_page_3_3_blank.png +slide_8_page_3_4_emoji.png +slide_8_page_3_5_text.png +slide_9.png +slide_10_page_1.png +slide_10_page_2.png +slide_10_page_3.png +slide_10_page_4_1.png +slide_10_page_4_2_plus.png +slide_10_page_4_3_minus.png +slide_10_page_4_4_arrow.png +slide_10_page_4_5_text.png +slide_11_page_1.png +slide_11_page_2_1.png +slide_11_page_2_2_blink.png +slide_11_page_3_1.png +slide_11_page_3_2_rotate_it.png +slide_11_page_3_3_text_and_arrow.png +slide_12_page_1.png +slide_12_page_2_1_pwm_blink.png +slide_12_page_2_2.png +slide_12_page_2_3_text.png +slide_12_page_3_1_pwn_blink.png +slide_12_page_3_2.png +slide_12_page_3_3_text.png +slide_12_page_3_4_text_2.png +slide_13_page_1.png +slide_13_page_2.png +slide_13_page_3_1_plus.png +slide_13_page_3_2_minus_rotate_both.png +slide_13_page_3_4.png +slide_13_page_3_5_text.png +['slide_14_helper.png', +'slide_14_page_1.png', +'slide_14_page_1_ball.png', +'slide_14_page_2_1_blink.png', +'slide_14_page_2_2_text.png', +'slide_14_page_3_1_symbols.png', +'slide_14_page_3_2_green_graph_and_start_ball.png', +'slide_14_page_3_3_white_image_for_blue_line.png', +'slide_15_page_1.png', +'slide_15_page_1_ball.png', +'slide_15_page_1_green_graph.png', +'slide_15_page_1_minus.png', +'slide_15_page_1_plus.png', +'slide_15_page_2_1_blink.png', +'slide_15_page_2_2_text.png', +'slide_15_page_3_1_arrow_and_text.png', +'slide_15_page_3_1_white.png', +'slide_15_page_3_2_graph.png', +'slide_15_page_3_3_text.png',] \ No newline at end of file diff --git a/experiment/simulation/EE5/helper/tempCodeRunnerFile.py b/experiment/simulation/EE5/helper/tempCodeRunnerFile.py new file mode 100644 index 0000000..0b8a6fb --- /dev/null +++ b/experiment/simulation/EE5/helper/tempCodeRunnerFile.py @@ -0,0 +1,42 @@ +import os + +def html(name): + return ''' + {0} + '''.format(name) + +def src(name :str,i :int): + return name[0:name.find('.')] + ":this.allImgsDom[{0}],\n".format(i) + + +def dom(name): + name1 = name[0: name.find(".")] + return f'{name1} : new Dom("{name1}"),\n' + + +names = os.listdir("S:\\Users\\Utkarsh\\Documents\\Project2\\CE8\\src\\images\\Beam and Slab") + +count = 108 + +srcs = '' +doms = '' +htms = '' +for i in range(len(names)): + htms = htms + html(names[i]) + doms = doms + dom(names[i]) + srcs = srcs + src(names[i],i+count) + + + +# open("temp.txt","w").write() +allItems = f'{htms}\n\n{srcs}\n\n{doms}' +open("temp2.txt","w").write(allItems) + +print("Done 👍") +# print(os.__path__) +# \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/apple-touch-icon.png b/experiment/simulation/EE5/iframes/data/apple-touch-icon.png new file mode 100644 index 0000000..5add869 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/apple-touch-icon.png differ diff --git a/experiment/simulation/EE5/iframes/data/browsersupport.js b/experiment/simulation/EE5/iframes/data/browsersupport.js new file mode 100644 index 0000000..9608730 --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/browsersupport.js @@ -0,0 +1,6 @@ +!function(e,n,s){function t(e,n){return typeof e===n}function o(){var e,n,s,o,a,i,l;for(var c in f)if(f.hasOwnProperty(c)){if(e=[],n=f[c],n.name&&(e.push(n.name.toLowerCase()),n.options&&n.options.aliases&&n.options.aliases.length))for(s=0;si;i++){var r=g[i],f=r.toUpperCase()+"_"+t;if(f in a)return"@-"+r.toLowerCase()+"-"+n}return!1};l.atRule=m;var g=l._config.usePrefixes?" -webkit- -moz- -o- -ms- ".split(" "):["",""];l._prefixes=g,o(),a(r),delete l.addTest,delete l.addAsyncTest;for(var v=0;v + + + + + + + + + Page Not Available + + + + + + \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/img0.png b/experiment/simulation/EE5/iframes/data/img0.png new file mode 100644 index 0000000..9ce6d95 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img0.png differ diff --git a/experiment/simulation/EE5/iframes/data/img1.png b/experiment/simulation/EE5/iframes/data/img1.png new file mode 100644 index 0000000..31d8fa9 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img1.png differ diff --git a/experiment/simulation/EE5/iframes/data/img10.png b/experiment/simulation/EE5/iframes/data/img10.png new file mode 100644 index 0000000..8a7215b Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img10.png differ diff --git a/experiment/simulation/EE5/iframes/data/img100.png b/experiment/simulation/EE5/iframes/data/img100.png new file mode 100644 index 0000000..6645dab Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img100.png differ diff --git a/experiment/simulation/EE5/iframes/data/img101.png b/experiment/simulation/EE5/iframes/data/img101.png new file mode 100644 index 0000000..d163d8c Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img101.png differ diff --git a/experiment/simulation/EE5/iframes/data/img102.png b/experiment/simulation/EE5/iframes/data/img102.png new file mode 100644 index 0000000..fe349e0 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img102.png differ diff --git a/experiment/simulation/EE5/iframes/data/img103.png b/experiment/simulation/EE5/iframes/data/img103.png new file mode 100644 index 0000000..3d19fa7 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img103.png differ diff --git a/experiment/simulation/EE5/iframes/data/img104.png b/experiment/simulation/EE5/iframes/data/img104.png new file mode 100644 index 0000000..db5b93e Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img104.png differ diff --git a/experiment/simulation/EE5/iframes/data/img105.png b/experiment/simulation/EE5/iframes/data/img105.png new file mode 100644 index 0000000..85ac173 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img105.png differ diff --git a/experiment/simulation/EE5/iframes/data/img106.png b/experiment/simulation/EE5/iframes/data/img106.png new file mode 100644 index 0000000..7b45342 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img106.png differ diff --git a/experiment/simulation/EE5/iframes/data/img107.png b/experiment/simulation/EE5/iframes/data/img107.png new file mode 100644 index 0000000..34ac4cd Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img107.png differ diff --git a/experiment/simulation/EE5/iframes/data/img108.png b/experiment/simulation/EE5/iframes/data/img108.png new file mode 100644 index 0000000..0045204 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img108.png differ diff --git a/experiment/simulation/EE5/iframes/data/img109.png b/experiment/simulation/EE5/iframes/data/img109.png new file mode 100644 index 0000000..294b078 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img109.png differ diff --git a/experiment/simulation/EE5/iframes/data/img11.png b/experiment/simulation/EE5/iframes/data/img11.png new file mode 100644 index 0000000..31f9368 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img11.png differ diff --git a/experiment/simulation/EE5/iframes/data/img110.png b/experiment/simulation/EE5/iframes/data/img110.png new file mode 100644 index 0000000..3be4076 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img110.png differ diff --git a/experiment/simulation/EE5/iframes/data/img111.png b/experiment/simulation/EE5/iframes/data/img111.png new file mode 100644 index 0000000..e27d317 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img111.png differ diff --git a/experiment/simulation/EE5/iframes/data/img112.png b/experiment/simulation/EE5/iframes/data/img112.png new file mode 100644 index 0000000..380dea5 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img112.png differ diff --git a/experiment/simulation/EE5/iframes/data/img113.png b/experiment/simulation/EE5/iframes/data/img113.png new file mode 100644 index 0000000..1c81641 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img113.png differ diff --git a/experiment/simulation/EE5/iframes/data/img114.jpg b/experiment/simulation/EE5/iframes/data/img114.jpg new file mode 100644 index 0000000..6e41704 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img114.jpg differ diff --git a/experiment/simulation/EE5/iframes/data/img115.jpg b/experiment/simulation/EE5/iframes/data/img115.jpg new file mode 100644 index 0000000..b2b279c Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img115.jpg differ diff --git a/experiment/simulation/EE5/iframes/data/img116.png b/experiment/simulation/EE5/iframes/data/img116.png new file mode 100644 index 0000000..cd32a52 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img116.png differ diff --git a/experiment/simulation/EE5/iframes/data/img117.png b/experiment/simulation/EE5/iframes/data/img117.png new file mode 100644 index 0000000..66b309e Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img117.png differ diff --git a/experiment/simulation/EE5/iframes/data/img118.png b/experiment/simulation/EE5/iframes/data/img118.png new file mode 100644 index 0000000..5ecd88a Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img118.png differ diff --git a/experiment/simulation/EE5/iframes/data/img119.png b/experiment/simulation/EE5/iframes/data/img119.png new file mode 100644 index 0000000..3db6363 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img119.png differ diff --git a/experiment/simulation/EE5/iframes/data/img12.png b/experiment/simulation/EE5/iframes/data/img12.png new file mode 100644 index 0000000..1ae699f Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img12.png differ diff --git a/experiment/simulation/EE5/iframes/data/img120.png b/experiment/simulation/EE5/iframes/data/img120.png new file mode 100644 index 0000000..74d368d Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img120.png differ diff --git a/experiment/simulation/EE5/iframes/data/img121.png b/experiment/simulation/EE5/iframes/data/img121.png new file mode 100644 index 0000000..df46214 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img121.png differ diff --git a/experiment/simulation/EE5/iframes/data/img122.png b/experiment/simulation/EE5/iframes/data/img122.png new file mode 100644 index 0000000..53290c7 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img122.png differ diff --git a/experiment/simulation/EE5/iframes/data/img123.png b/experiment/simulation/EE5/iframes/data/img123.png new file mode 100644 index 0000000..dd4c9d6 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img123.png differ diff --git a/experiment/simulation/EE5/iframes/data/img124.png b/experiment/simulation/EE5/iframes/data/img124.png new file mode 100644 index 0000000..a524df6 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img124.png differ diff --git a/experiment/simulation/EE5/iframes/data/img125.png b/experiment/simulation/EE5/iframes/data/img125.png new file mode 100644 index 0000000..eb8361a Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img125.png differ diff --git a/experiment/simulation/EE5/iframes/data/img126.png b/experiment/simulation/EE5/iframes/data/img126.png new file mode 100644 index 0000000..950eab7 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img126.png differ diff --git a/experiment/simulation/EE5/iframes/data/img127.png b/experiment/simulation/EE5/iframes/data/img127.png new file mode 100644 index 0000000..a04fcb3 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img127.png differ diff --git a/experiment/simulation/EE5/iframes/data/img128.png b/experiment/simulation/EE5/iframes/data/img128.png new file mode 100644 index 0000000..5d4e93a Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img128.png differ diff --git a/experiment/simulation/EE5/iframes/data/img129.png b/experiment/simulation/EE5/iframes/data/img129.png new file mode 100644 index 0000000..7de3852 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img129.png differ diff --git a/experiment/simulation/EE5/iframes/data/img13.png b/experiment/simulation/EE5/iframes/data/img13.png new file mode 100644 index 0000000..6594b97 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img13.png differ diff --git a/experiment/simulation/EE5/iframes/data/img130.png b/experiment/simulation/EE5/iframes/data/img130.png new file mode 100644 index 0000000..81a527a Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img130.png differ diff --git a/experiment/simulation/EE5/iframes/data/img131.png b/experiment/simulation/EE5/iframes/data/img131.png new file mode 100644 index 0000000..ab85f3e Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img131.png differ diff --git a/experiment/simulation/EE5/iframes/data/img132.png b/experiment/simulation/EE5/iframes/data/img132.png new file mode 100644 index 0000000..1e82bd5 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img132.png differ diff --git a/experiment/simulation/EE5/iframes/data/img133.png b/experiment/simulation/EE5/iframes/data/img133.png new file mode 100644 index 0000000..187d8f6 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img133.png differ diff --git a/experiment/simulation/EE5/iframes/data/img134.png b/experiment/simulation/EE5/iframes/data/img134.png new file mode 100644 index 0000000..8be76ad Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img134.png differ diff --git a/experiment/simulation/EE5/iframes/data/img135.png b/experiment/simulation/EE5/iframes/data/img135.png new file mode 100644 index 0000000..f5d7688 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img135.png differ diff --git a/experiment/simulation/EE5/iframes/data/img136.png b/experiment/simulation/EE5/iframes/data/img136.png new file mode 100644 index 0000000..0dd9a98 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img136.png differ diff --git a/experiment/simulation/EE5/iframes/data/img14.png b/experiment/simulation/EE5/iframes/data/img14.png new file mode 100644 index 0000000..af19a8b Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img14.png differ diff --git a/experiment/simulation/EE5/iframes/data/img15.png b/experiment/simulation/EE5/iframes/data/img15.png new file mode 100644 index 0000000..15ccd3d Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img15.png differ diff --git a/experiment/simulation/EE5/iframes/data/img16.png b/experiment/simulation/EE5/iframes/data/img16.png new file mode 100644 index 0000000..f4c17de Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img16.png differ diff --git a/experiment/simulation/EE5/iframes/data/img17.png b/experiment/simulation/EE5/iframes/data/img17.png new file mode 100644 index 0000000..1647e69 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img17.png differ diff --git a/experiment/simulation/EE5/iframes/data/img18.png b/experiment/simulation/EE5/iframes/data/img18.png new file mode 100644 index 0000000..e857526 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img18.png differ diff --git a/experiment/simulation/EE5/iframes/data/img19.png b/experiment/simulation/EE5/iframes/data/img19.png new file mode 100644 index 0000000..6dc1b81 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img19.png differ diff --git a/experiment/simulation/EE5/iframes/data/img2.png b/experiment/simulation/EE5/iframes/data/img2.png new file mode 100644 index 0000000..76ae15f Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img2.png differ diff --git a/experiment/simulation/EE5/iframes/data/img20.png b/experiment/simulation/EE5/iframes/data/img20.png new file mode 100644 index 0000000..6ba4c3f Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img20.png differ diff --git a/experiment/simulation/EE5/iframes/data/img21.png b/experiment/simulation/EE5/iframes/data/img21.png new file mode 100644 index 0000000..aa2bd32 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img21.png differ diff --git a/experiment/simulation/EE5/iframes/data/img22.png b/experiment/simulation/EE5/iframes/data/img22.png new file mode 100644 index 0000000..3203cb8 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img22.png differ diff --git a/experiment/simulation/EE5/iframes/data/img23.png b/experiment/simulation/EE5/iframes/data/img23.png new file mode 100644 index 0000000..8d79141 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img23.png differ diff --git a/experiment/simulation/EE5/iframes/data/img24.png b/experiment/simulation/EE5/iframes/data/img24.png new file mode 100644 index 0000000..3aada34 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img24.png differ diff --git a/experiment/simulation/EE5/iframes/data/img25.png b/experiment/simulation/EE5/iframes/data/img25.png new file mode 100644 index 0000000..2ed546a Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img25.png differ diff --git a/experiment/simulation/EE5/iframes/data/img26.png b/experiment/simulation/EE5/iframes/data/img26.png new file mode 100644 index 0000000..a6a430e Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img26.png differ diff --git a/experiment/simulation/EE5/iframes/data/img27.png b/experiment/simulation/EE5/iframes/data/img27.png new file mode 100644 index 0000000..592df88 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img27.png differ diff --git a/experiment/simulation/EE5/iframes/data/img28.png b/experiment/simulation/EE5/iframes/data/img28.png new file mode 100644 index 0000000..a6dbe52 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img28.png differ diff --git a/experiment/simulation/EE5/iframes/data/img29.png b/experiment/simulation/EE5/iframes/data/img29.png new file mode 100644 index 0000000..7b1c7cf Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img29.png differ diff --git a/experiment/simulation/EE5/iframes/data/img3.png b/experiment/simulation/EE5/iframes/data/img3.png new file mode 100644 index 0000000..72878d3 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img3.png differ diff --git a/experiment/simulation/EE5/iframes/data/img30.png b/experiment/simulation/EE5/iframes/data/img30.png new file mode 100644 index 0000000..57dd7bb Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img30.png differ diff --git a/experiment/simulation/EE5/iframes/data/img31.png b/experiment/simulation/EE5/iframes/data/img31.png new file mode 100644 index 0000000..70bb53f Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img31.png differ diff --git a/experiment/simulation/EE5/iframes/data/img32.png b/experiment/simulation/EE5/iframes/data/img32.png new file mode 100644 index 0000000..96398d1 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img32.png differ diff --git a/experiment/simulation/EE5/iframes/data/img33.png b/experiment/simulation/EE5/iframes/data/img33.png new file mode 100644 index 0000000..e3494ae Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img33.png differ diff --git a/experiment/simulation/EE5/iframes/data/img34.png b/experiment/simulation/EE5/iframes/data/img34.png new file mode 100644 index 0000000..ea07786 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img34.png differ diff --git a/experiment/simulation/EE5/iframes/data/img35.png b/experiment/simulation/EE5/iframes/data/img35.png new file mode 100644 index 0000000..d07365c Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img35.png differ diff --git a/experiment/simulation/EE5/iframes/data/img36.png b/experiment/simulation/EE5/iframes/data/img36.png new file mode 100644 index 0000000..2a0e611 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img36.png differ diff --git a/experiment/simulation/EE5/iframes/data/img37.png b/experiment/simulation/EE5/iframes/data/img37.png new file mode 100644 index 0000000..d1cc727 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img37.png differ diff --git a/experiment/simulation/EE5/iframes/data/img38.png b/experiment/simulation/EE5/iframes/data/img38.png new file mode 100644 index 0000000..7948e50 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img38.png differ diff --git a/experiment/simulation/EE5/iframes/data/img39.png b/experiment/simulation/EE5/iframes/data/img39.png new file mode 100644 index 0000000..e88a1a0 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img39.png differ diff --git a/experiment/simulation/EE5/iframes/data/img4.png b/experiment/simulation/EE5/iframes/data/img4.png new file mode 100644 index 0000000..d837ab1 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img4.png differ diff --git a/experiment/simulation/EE5/iframes/data/img40.png b/experiment/simulation/EE5/iframes/data/img40.png new file mode 100644 index 0000000..8b1df68 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img40.png differ diff --git a/experiment/simulation/EE5/iframes/data/img41.png b/experiment/simulation/EE5/iframes/data/img41.png new file mode 100644 index 0000000..61d5bf9 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img41.png differ diff --git a/experiment/simulation/EE5/iframes/data/img42.png b/experiment/simulation/EE5/iframes/data/img42.png new file mode 100644 index 0000000..dc4aba1 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img42.png differ diff --git a/experiment/simulation/EE5/iframes/data/img43.png b/experiment/simulation/EE5/iframes/data/img43.png new file mode 100644 index 0000000..68b4a3b Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img43.png differ diff --git a/experiment/simulation/EE5/iframes/data/img44.png b/experiment/simulation/EE5/iframes/data/img44.png new file mode 100644 index 0000000..5643b08 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img44.png differ diff --git a/experiment/simulation/EE5/iframes/data/img45.png b/experiment/simulation/EE5/iframes/data/img45.png new file mode 100644 index 0000000..dbb7fae Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img45.png differ diff --git a/experiment/simulation/EE5/iframes/data/img46.png b/experiment/simulation/EE5/iframes/data/img46.png new file mode 100644 index 0000000..9a9d354 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img46.png differ diff --git a/experiment/simulation/EE5/iframes/data/img47.png b/experiment/simulation/EE5/iframes/data/img47.png new file mode 100644 index 0000000..9cd1a27 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img47.png differ diff --git a/experiment/simulation/EE5/iframes/data/img48.png b/experiment/simulation/EE5/iframes/data/img48.png new file mode 100644 index 0000000..c74f798 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img48.png differ diff --git a/experiment/simulation/EE5/iframes/data/img49.png b/experiment/simulation/EE5/iframes/data/img49.png new file mode 100644 index 0000000..9e084aa Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img49.png differ diff --git a/experiment/simulation/EE5/iframes/data/img5.png b/experiment/simulation/EE5/iframes/data/img5.png new file mode 100644 index 0000000..e6e77e3 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img5.png differ diff --git a/experiment/simulation/EE5/iframes/data/img50.png b/experiment/simulation/EE5/iframes/data/img50.png new file mode 100644 index 0000000..8367f8f Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img50.png differ diff --git a/experiment/simulation/EE5/iframes/data/img51.png b/experiment/simulation/EE5/iframes/data/img51.png new file mode 100644 index 0000000..f1ca4df Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img51.png differ diff --git a/experiment/simulation/EE5/iframes/data/img52.png b/experiment/simulation/EE5/iframes/data/img52.png new file mode 100644 index 0000000..a03f25d Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img52.png differ diff --git a/experiment/simulation/EE5/iframes/data/img53.png b/experiment/simulation/EE5/iframes/data/img53.png new file mode 100644 index 0000000..6416cdc Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img53.png differ diff --git a/experiment/simulation/EE5/iframes/data/img54.png b/experiment/simulation/EE5/iframes/data/img54.png new file mode 100644 index 0000000..7c4cd51 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img54.png differ diff --git a/experiment/simulation/EE5/iframes/data/img55.png b/experiment/simulation/EE5/iframes/data/img55.png new file mode 100644 index 0000000..3c6163b Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img55.png differ diff --git a/experiment/simulation/EE5/iframes/data/img56.png b/experiment/simulation/EE5/iframes/data/img56.png new file mode 100644 index 0000000..f693ba6 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img56.png differ diff --git a/experiment/simulation/EE5/iframes/data/img57.png b/experiment/simulation/EE5/iframes/data/img57.png new file mode 100644 index 0000000..2e227eb Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img57.png differ diff --git a/experiment/simulation/EE5/iframes/data/img58.png b/experiment/simulation/EE5/iframes/data/img58.png new file mode 100644 index 0000000..eed2050 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img58.png differ diff --git a/experiment/simulation/EE5/iframes/data/img59.png b/experiment/simulation/EE5/iframes/data/img59.png new file mode 100644 index 0000000..399cc08 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img59.png differ diff --git a/experiment/simulation/EE5/iframes/data/img6.png b/experiment/simulation/EE5/iframes/data/img6.png new file mode 100644 index 0000000..5946330 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img6.png differ diff --git a/experiment/simulation/EE5/iframes/data/img60.png b/experiment/simulation/EE5/iframes/data/img60.png new file mode 100644 index 0000000..0330c0e Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img60.png differ diff --git a/experiment/simulation/EE5/iframes/data/img61.png b/experiment/simulation/EE5/iframes/data/img61.png new file mode 100644 index 0000000..fe1a701 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img61.png differ diff --git a/experiment/simulation/EE5/iframes/data/img62.png b/experiment/simulation/EE5/iframes/data/img62.png new file mode 100644 index 0000000..90a8da8 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img62.png differ diff --git a/experiment/simulation/EE5/iframes/data/img63.png b/experiment/simulation/EE5/iframes/data/img63.png new file mode 100644 index 0000000..d49c2b9 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img63.png differ diff --git a/experiment/simulation/EE5/iframes/data/img64.png b/experiment/simulation/EE5/iframes/data/img64.png new file mode 100644 index 0000000..40c962a Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img64.png differ diff --git a/experiment/simulation/EE5/iframes/data/img65.png b/experiment/simulation/EE5/iframes/data/img65.png new file mode 100644 index 0000000..0841b50 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img65.png differ diff --git a/experiment/simulation/EE5/iframes/data/img66.png b/experiment/simulation/EE5/iframes/data/img66.png new file mode 100644 index 0000000..3937512 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img66.png differ diff --git a/experiment/simulation/EE5/iframes/data/img67.png b/experiment/simulation/EE5/iframes/data/img67.png new file mode 100644 index 0000000..58a2065 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img67.png differ diff --git a/experiment/simulation/EE5/iframes/data/img68.png b/experiment/simulation/EE5/iframes/data/img68.png new file mode 100644 index 0000000..cfdf3d1 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img68.png differ diff --git a/experiment/simulation/EE5/iframes/data/img69.png b/experiment/simulation/EE5/iframes/data/img69.png new file mode 100644 index 0000000..6efd2d3 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img69.png differ diff --git a/experiment/simulation/EE5/iframes/data/img7.png b/experiment/simulation/EE5/iframes/data/img7.png new file mode 100644 index 0000000..2b226ed Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img7.png differ diff --git a/experiment/simulation/EE5/iframes/data/img70.png b/experiment/simulation/EE5/iframes/data/img70.png new file mode 100644 index 0000000..0eb8e50 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img70.png differ diff --git a/experiment/simulation/EE5/iframes/data/img71.png b/experiment/simulation/EE5/iframes/data/img71.png new file mode 100644 index 0000000..9d73f57 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img71.png differ diff --git a/experiment/simulation/EE5/iframes/data/img72.png b/experiment/simulation/EE5/iframes/data/img72.png new file mode 100644 index 0000000..63a7d4e Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img72.png differ diff --git a/experiment/simulation/EE5/iframes/data/img73.png b/experiment/simulation/EE5/iframes/data/img73.png new file mode 100644 index 0000000..12546df Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img73.png differ diff --git a/experiment/simulation/EE5/iframes/data/img74.png b/experiment/simulation/EE5/iframes/data/img74.png new file mode 100644 index 0000000..560f99a Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img74.png differ diff --git a/experiment/simulation/EE5/iframes/data/img75.png b/experiment/simulation/EE5/iframes/data/img75.png new file mode 100644 index 0000000..9764f2a Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img75.png differ diff --git a/experiment/simulation/EE5/iframes/data/img76.png b/experiment/simulation/EE5/iframes/data/img76.png new file mode 100644 index 0000000..e6bbfbd Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img76.png differ diff --git a/experiment/simulation/EE5/iframes/data/img77.png b/experiment/simulation/EE5/iframes/data/img77.png new file mode 100644 index 0000000..093f66a Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img77.png differ diff --git a/experiment/simulation/EE5/iframes/data/img78.png b/experiment/simulation/EE5/iframes/data/img78.png new file mode 100644 index 0000000..8b93257 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img78.png differ diff --git a/experiment/simulation/EE5/iframes/data/img79.png b/experiment/simulation/EE5/iframes/data/img79.png new file mode 100644 index 0000000..5e641b1 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img79.png differ diff --git a/experiment/simulation/EE5/iframes/data/img8.png b/experiment/simulation/EE5/iframes/data/img8.png new file mode 100644 index 0000000..73152d5 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img8.png differ diff --git a/experiment/simulation/EE5/iframes/data/img80.png b/experiment/simulation/EE5/iframes/data/img80.png new file mode 100644 index 0000000..1b586c4 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img80.png differ diff --git a/experiment/simulation/EE5/iframes/data/img81.png b/experiment/simulation/EE5/iframes/data/img81.png new file mode 100644 index 0000000..40e3978 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img81.png differ diff --git a/experiment/simulation/EE5/iframes/data/img82.png b/experiment/simulation/EE5/iframes/data/img82.png new file mode 100644 index 0000000..51541dc Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img82.png differ diff --git a/experiment/simulation/EE5/iframes/data/img83.png b/experiment/simulation/EE5/iframes/data/img83.png new file mode 100644 index 0000000..c9251ea Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img83.png differ diff --git a/experiment/simulation/EE5/iframes/data/img84.png b/experiment/simulation/EE5/iframes/data/img84.png new file mode 100644 index 0000000..36d755e Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img84.png differ diff --git a/experiment/simulation/EE5/iframes/data/img85.png b/experiment/simulation/EE5/iframes/data/img85.png new file mode 100644 index 0000000..67677ff Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img85.png differ diff --git a/experiment/simulation/EE5/iframes/data/img86.png b/experiment/simulation/EE5/iframes/data/img86.png new file mode 100644 index 0000000..c8a91d7 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img86.png differ diff --git a/experiment/simulation/EE5/iframes/data/img87.png b/experiment/simulation/EE5/iframes/data/img87.png new file mode 100644 index 0000000..7d89fe9 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img87.png differ diff --git a/experiment/simulation/EE5/iframes/data/img88.png b/experiment/simulation/EE5/iframes/data/img88.png new file mode 100644 index 0000000..c65e0a6 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img88.png differ diff --git a/experiment/simulation/EE5/iframes/data/img89.png b/experiment/simulation/EE5/iframes/data/img89.png new file mode 100644 index 0000000..02f2725 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img89.png differ diff --git a/experiment/simulation/EE5/iframes/data/img9.png b/experiment/simulation/EE5/iframes/data/img9.png new file mode 100644 index 0000000..7189c19 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img9.png differ diff --git a/experiment/simulation/EE5/iframes/data/img90.png b/experiment/simulation/EE5/iframes/data/img90.png new file mode 100644 index 0000000..46a52bd Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img90.png differ diff --git a/experiment/simulation/EE5/iframes/data/img91.png b/experiment/simulation/EE5/iframes/data/img91.png new file mode 100644 index 0000000..d53f4f3 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img91.png differ diff --git a/experiment/simulation/EE5/iframes/data/img92.png b/experiment/simulation/EE5/iframes/data/img92.png new file mode 100644 index 0000000..359cc30 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img92.png differ diff --git a/experiment/simulation/EE5/iframes/data/img93.png b/experiment/simulation/EE5/iframes/data/img93.png new file mode 100644 index 0000000..f5badf8 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img93.png differ diff --git a/experiment/simulation/EE5/iframes/data/img94.png b/experiment/simulation/EE5/iframes/data/img94.png new file mode 100644 index 0000000..7c285b7 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img94.png differ diff --git a/experiment/simulation/EE5/iframes/data/img95.png b/experiment/simulation/EE5/iframes/data/img95.png new file mode 100644 index 0000000..8345a0e Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img95.png differ diff --git a/experiment/simulation/EE5/iframes/data/img96.png b/experiment/simulation/EE5/iframes/data/img96.png new file mode 100644 index 0000000..37e6f01 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img96.png differ diff --git a/experiment/simulation/EE5/iframes/data/img97.png b/experiment/simulation/EE5/iframes/data/img97.png new file mode 100644 index 0000000..59b2036 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img97.png differ diff --git a/experiment/simulation/EE5/iframes/data/img98.png b/experiment/simulation/EE5/iframes/data/img98.png new file mode 100644 index 0000000..868b584 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img98.png differ diff --git a/experiment/simulation/EE5/iframes/data/img99.png b/experiment/simulation/EE5/iframes/data/img99.png new file mode 100644 index 0000000..8c33d02 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/img99.png differ diff --git a/experiment/simulation/EE5/iframes/data/lock.cur b/experiment/simulation/EE5/iframes/data/lock.cur new file mode 100644 index 0000000..e92f527 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/lock.cur differ diff --git a/experiment/simulation/EE5/iframes/data/marker.cur b/experiment/simulation/EE5/iframes/data/marker.cur new file mode 100644 index 0000000..0726e17 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/marker.cur differ diff --git a/experiment/simulation/EE5/iframes/data/player.js b/experiment/simulation/EE5/iframes/data/player.js new file mode 100644 index 0000000..b0ef552 --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/player.js @@ -0,0 +1,1851 @@ +(function(){/* + + Copyright The Closure Library Authors. + SPDX-License-Identifier: Apache-2.0 +*/ +var k,ba="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};function ca(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b>>0),pa=0;function qa(a,b,c){return a.call.apply(a.bind,arguments)}function sa(a,b,c){if(!a)throw Error();if(2b?null:"string"===typeof a?a.charAt(b):a[b]}function Pa(a,b){return 0<=Ia(a,b)}function Ra(a,b){b=Ia(a,b);let c;(c=0<=b)&&Sa(a,b);return c}function Sa(a,b){Array.prototype.splice.call(a,b,1)}function Ta(a){return Array.prototype.concat.apply([],arguments)} +function Ua(a){const b=a.length;if(0=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)} +function Za(a){let b=0,c=0;const d={};for(;cb?1:a")&&(a=a.replace(mb,">"));-1!=a.indexOf('"')&&(a=a.replace(ob,"""));-1!=a.indexOf("'")&&(a=a.replace(pb,"'"));-1!=a.indexOf("\x00")&&(a=a.replace(qb,"�"));return a}var kb=/&/g,lb=//g,ob=/"/g,pb=/'/g,qb=/\x00/g,jb=/[\x00&<>"']/; +function rb(a,b){let c=0;a=hb(String(a)).split(".");b=hb(String(b)).split(".");const d=Math.max(a.length,b.length);for(let g=0;0==c&&gb?1:0};function ub(){var a=ia.navigator;return a&&(a=a.userAgent)?a:""}function vb(a){return-1!=ub().indexOf(a)};function xb(){return vb("Firefox")||vb("FxiOS")}function yb(){return vb("Safari")&&!(zb()||vb("Coast")||vb("Opera")||vb("Edge")||vb("Edg/")||vb("OPR")||xb()||vb("Silk")||vb("Android"))}function zb(){return(vb("Chrome")||vb("CriOS"))&&!vb("Edge")||vb("Silk")}function Ab(){return vb("Android")&&!(zb()||xb()||vb("Opera")||vb("Silk"))};function Bb(){return vb("iPhone")&&!vb("iPod")&&!vb("iPad")}function Db(){return Bb()||vb("iPad")||vb("iPod")};function Eb(a){Eb[" "](a);return a}Eb[" "]=function(){};function Gb(a,b,c,d){d=d?d(b):b;return Object.prototype.hasOwnProperty.call(a,d)?a[d]:a[d]=c(b)};var Hb=vb("Opera"),Ib=vb("Trident")||vb("MSIE"),Jb=vb("Edge"),Kb=Jb||Ib,Lb=vb("Gecko")&&!(-1!=ub().toLowerCase().indexOf("webkit")&&!vb("Edge"))&&!(vb("Trident")||vb("MSIE"))&&!vb("Edge"),Mb=-1!=ub().toLowerCase().indexOf("webkit")&&!vb("Edge"),Nb=vb("Macintosh"),Ob=vb("Windows"),Pb=vb("Linux")||vb("CrOS"),Qb=vb("Android"),Rb=Bb(),Sb=vb("iPad"),Tb=vb("iPod");function Ub(){var a=ia.document;return a?a.documentMode:void 0}var Vb; +a:{var Wb="",Xb=function(){var a=ub();if(Lb)return/rv:([^\);]+)(\)|;)/.exec(a);if(Jb)return/Edge\/([\d\.]+)/.exec(a);if(Ib)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(Mb)return/WebKit\/(\S+)/.exec(a);if(Hb)return/(?:Version)[ \/]?(\S+)/.exec(a)}();Xb&&(Wb=Xb?Xb[1]:"");if(Ib){var Yb=Ub();if(null!=Yb&&Yb>parseFloat(Wb)){Vb=String(Yb);break a}}Vb=Wb}var Zb={};function $b(a){return Gb(Zb,a,function(){return 0<=rb(Vb,a)})}var bc; +if(ia.document&&Ib){var cc=Ub();bc=cc?cc:parseInt(Vb,10)||void 0}else bc=void 0;var dc=bc;var ec=Ib||Mb;function fc(a,b,c){for(const d in a)b.call(c,a[d],d,a)}function gc(a,b){const c={};for(const d in a)b.call(void 0,a[d],d,a)&&(c[d]=a[d]);return c}function hc(a,b){const c={};for(const d in a)c[d]=b.call(void 0,a[d],d,a);return c}function ic(a){const b=[];let c=0;for(const d in a)b[c++]=a[d];return b}function jc(a){const b=[];let c=0;for(const d in a)b[c++]=d;return b}function kc(a,b){return null!==a&&b in a}function mc(a,b){for(const c in a)if(b.call(void 0,a[c],c,a))return c} +function nc(){var a=oc;for(const b in a)return!1;return!0}function pc(a,b,c){if(null!==a&&b in a)throw Error(`The object already contains the key "${b}"`);a[b]=c}function v(a,b,c){return null!==a&&b in a?a[b]:c}function qc(a){const b={};for(const c in a)b[c]=a[c];return b}const sc="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "); +function tc(a,b){let c,d;for(let e=1;e{Array.isArray(e)?e.forEach(d):(e=Jc(e),c.push(Hc(e).toString()))};a.forEach(d);return Kc(c.join(Hc(b).toString()))} +function Nc(a){return Lc(Array.prototype.slice.call(arguments))}class Ic{constructor(a,b){this.GR=b===Gc?a:"";this.Px=!0}Jx(){return this.GR.toString()}toString(){return this.GR.toString()}}var Mc=new Ic(ia.trustedTypes&&ia.trustedTypes.emptyHTML||"",Gc),Oc=Kc("
    ");var Qc={MATH:!0,SCRIPT:!0,STYLE:!0,SVG:!0,TEMPLATE:!0},Rc=function(a){let b=!1,c;return function(){b||(c=a(),b=!0);return c}}(function(){var a=document.createElement("div"),b=document.createElement("div");b.appendChild(document.createElement("div"));a.appendChild(b);b=a.firstChild.firstChild;a.innerHTML=Hc(Mc);return!b.parentElement}); +function Sc(a,b){if(a.tagName&&Qc[a.tagName.toUpperCase()])throw Error("goog.dom.safe.setInnerHtml cannot be used to set content of "+a.tagName+".");if(Rc())for(;a.lastChild;)a.removeChild(a.lastChild);a.innerHTML=Hc(b)}function Tc(a,b,c,d){a=a instanceof Ac?a:Ec(a);b=b||ia;c instanceof wc?c instanceof wc&&c.constructor===wc&&c.X2===yc?c=c.o2:(Ga("expected object of type Const, got '"+c+"'"),c="type_error:Const"):c=c||"";return void 0!==d?b.open(Bc(a),c,d):b.open(Bc(a),c)}var Uc=/^[\w+/_-]+[=]{0,2}$/;function Vc(a,b,c){return Math.min(Math.max(a,b),c)}function Wc(a,b,c){return a+c*(b-a)};function Xc(a,b){this.x=void 0!==a?a:0;this.y=void 0!==b?b:0}k=Xc.prototype;k.clone=function(){return new Xc(this.x,this.y)};k.Pm=function(a){return a instanceof Xc&&Yc(this,a)};function Yc(a,b){return a==b?!0:a&&b?a.x==b.x&&a.y==b.y:!1}function Zc(a,b){var c=a.x-b.x;a=a.y-b.y;return Math.sqrt(c*c+a*a)}function $c(a,b){var c=a.x-b.x;a=a.y-b.y;return c*c+a*a}function ad(a,b){return new Xc(a.x-b.x,a.y-b.y)}function bd(a,b){return new Xc(a.x+b.x,a.y+b.y)} +k.ceil=function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};k.floor=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this};k.round=function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this};k.translate=function(a,b){a instanceof Xc?(this.x+=a.x,this.y+=a.y):(this.x+=Number(a),"number"===typeof b&&(this.y+=b));return this};k.scale=function(a,b){this.x*=a;this.y*="number"===typeof b?b:a;return this};function cd(a,b){this.width=a;this.height=b}function dd(a,b){return a==b?!0:a&&b?a.width==b.width&&a.height==b.height:!1}k=cd.prototype;k.clone=function(){return new cd(this.width,this.height)};k.area=function(){return this.width*this.height};k.aspectRatio=function(){return this.width/this.height};k.xi=function(){return!this.area()};k.ceil=function(){this.width=Math.ceil(this.width);this.height=Math.ceil(this.height);return this}; +k.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};k.round=function(){this.width=Math.round(this.width);this.height=Math.round(this.height);return this};k.scale=function(a,b){this.width*=a;this.height*="number"===typeof b?b:a;return this};function ed(a){const b={"&":"&","<":"<",">":">",""":'"'};let c;c=ia.document.createElement("div");return a.replace(fd,function(d,e){let f=b[d];if(f)return f;"#"==e.charAt(0)&&(e=Number("0"+e.slice(1)),isNaN(e)||(f=String.fromCharCode(e)));f||(Sc(c,Kc(d+" ")),f=c.firstChild.nodeValue.slice(0,-1));return b[d]=f})} +function gd(a){return a.replace(/&([^;]+);/g,function(b,c){switch(c){case "amp":return"&";case "lt":return"<";case "gt":return">";case "quot":return'"';default:return"#"!=c.charAt(0)||(c=Number("0"+c.slice(1)),isNaN(c))?b:String.fromCharCode(c)}})}var fd=/&([^;\s<&]+);?/g,hd={"\x00":"\\0","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\x0B",'"':'\\"',"\\":"\\\\","<":"\\u003C"},id={"'":"\\'"},jd=String.prototype.repeat?function(a,b){return a.repeat(b)}:function(a,b){return Array(b+1).join(a)}; +function kd(a,b){if(!Number.isFinite(a))return String(a);a=String(a);let c=a.indexOf(".");-1===c&&(c=a.length);const d="-"===a[0]?"-":"";d&&(a=a.substring(1));return d+jd("0",Math.max(0,b-c))+a}function ld(){return Math.floor(2147483648*Math.random()).toString(36)+Math.abs(Math.floor(2147483648*Math.random())^wa()).toString(36)}function md(a){return String(a).replace(/\-([a-z])/g,function(b,c){return c.toUpperCase()})} +function nd(a){return a.replace(RegExp("(^|[\\s]+)([a-z])","g"),function(b,c,d){return c+d.toUpperCase()})};function od(a){return a?new pd(qd(a)):Ba||(Ba=new pd)}function rd(a,b){return"string"===typeof b?a.getElementById(b):b} +function sd(a,b,c){var d=document;c=c||d;a=a&&"*"!=a?String(a).toUpperCase():"";if(c.querySelectorAll&&c.querySelector&&(a||b))return c.querySelectorAll(a+(b?"."+b:""));if(b&&c.getElementsByClassName){c=c.getElementsByClassName(b);if(a){d={};for(var e=0,f=0,g;g=c[f];f++)a==g.nodeName&&(d[e++]=g);d.length=e;return d}return c}c=c.getElementsByTagName(a||"*");if(b){d={};for(f=e=0;g=c[f];f++)a=g.className,"function"==typeof a.split&&Pa(a.split(/\s+/),b)&&(d[e++]=g);d.length=e;return d}return c} +function td(a,b){fc(b,function(c,d){c&&"object"==typeof c&&c.Px&&(c=c.Jx());"style"==d?a.style.cssText=c:"class"==d?a.className=c:"for"==d?a.htmlFor=c:ud.hasOwnProperty(d)?a.setAttribute(ud[d],c):0==d.lastIndexOf("aria-",0)||0==d.lastIndexOf("data-",0)?a.setAttribute(d,c):a[d]=c})} +var ud={cellpadding:"cellPadding",cellspacing:"cellSpacing",colspan:"colSpan",frameborder:"frameBorder",height:"height",maxlength:"maxLength",nonce:"nonce",role:"role",rowspan:"rowSpan",type:"type",usemap:"useMap",valign:"vAlign",width:"width"}; +function vd(a){var b=a.scrollingElement?a.scrollingElement:Mb||"CSS1Compat"!=a.compatMode?a.body||a.documentElement:a.documentElement;a=a.parentWindow||a.defaultView;return Ib&&$b("10")&&a.pageYOffset!=b.scrollTop?new Xc(b.scrollLeft,b.scrollTop):new Xc(a.pageXOffset||b.scrollLeft,a.pageYOffset||b.scrollTop)} +function wd(a,b,c){var d=arguments,e=document,f=d[1],g=xd(e,String(d[0]));f&&("string"===typeof f?g.className=f:Array.isArray(f)?g.className=f.join(" "):td(g,f));2{},b),ia.removeEventListener("test",()=>{},b)}catch(c){}return a}();function fe(a){return Mb?"webkit"+a:a.toLowerCase()};var ge=fe("AnimationEnd"),he=fe("TransitionEnd");function ie(a,b){be.call(this,a?a.type:"");this.relatedTarget=this.currentTarget=this.target=null;this.button=this.screenY=this.screenX=this.clientY=this.clientX=this.offsetY=this.offsetX=0;this.key="";this.charCode=this.keyCode=0;this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.pointerId=0;this.pointerType="";this.te=null;a&&this.yr(a,b)}r(ie,be);var je={2:"touch",3:"pen",4:"mouse"}; +ie.prototype.yr=function(a,b){var c=this.type=a.type,d=a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:null;this.target=a.target||a.srcElement;this.currentTarget=b;if(b=a.relatedTarget){if(Lb){a:{try{Eb(b.nodeName);var e=!0;break a}catch(f){}e=!1}e||(b=null)}}else"mouseover"==c?b=a.fromElement:"mouseout"==c&&(b=a.toElement);this.relatedTarget=b;d?(this.clientX=void 0!==d.clientX?d.clientX:d.pageX,this.clientY=void 0!==d.clientY?d.clientY:d.pageY,this.screenX=d.screenX||0,this.screenY= +d.screenY||0):(this.offsetX=Mb||void 0!==a.offsetX?a.offsetX:a.layerX,this.offsetY=Mb||void 0!==a.offsetY?a.offsetY:a.layerY,this.clientX=void 0!==a.clientX?a.clientX:a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0);this.button=a.button;this.keyCode=a.keyCode||0;this.key=a.key||"";this.charCode=a.charCode||("keypress"==c?a.keyCode:0);this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=a.shiftKey;this.metaKey=a.metaKey;this.pointerId= +a.pointerId||0;this.pointerType="string"===typeof a.pointerType?a.pointerType:je[a.pointerType]||"";this.state=a.state;this.te=a;a.defaultPrevented&&ie.Mb.preventDefault.call(this)};ie.prototype.stopPropagation=function(){ie.Mb.stopPropagation.call(this);this.te.stopPropagation?this.te.stopPropagation():this.te.cancelBubble=!0};ie.prototype.preventDefault=function(){ie.Mb.preventDefault.call(this);var a=this.te;a.preventDefault?a.preventDefault():a.returnValue=!1};var ke="closure_listenable_"+(1E6*Math.random()|0);function le(a){return!(!a||!a[ke])};var me=0;function ne(a,b,c,d,e){this.listener=a;this.proxy=null;this.src=b;this.type=c;this.capture=!!d;this.oI=e;this.key=++me;this.fD=this.ZH=!1}function oe(a){a.fD=!0;a.listener=null;a.proxy=null;a.src=null;a.oI=null};function pe(a){this.src=a;this.Zg={};this.yD=0}pe.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.Zg[f];a||(a=this.Zg[f]=[],this.yD++);var g=qe(a,b,d,e);-1>>0);function xe(a){if("function"===typeof a)return a;a[Ge]||(a[Ge]=function(b){return a.handleEvent(b)});return a[Ge]};function He(){Yd.call(this);this.Bl=new pe(this);this.I$=this;this.wR=null}r(He,Yd);He.prototype[ke]=!0;k=He.prototype;k.addEventListener=function(a,b,c,d){ve(this,a,b,c,d)};k.removeEventListener=function(a,b,c,d){De(this,a,b,c,d)}; +k.dispatchEvent=function(a){var b,c=this.wR;if(c)for(b=[];c;c=c.wR)b.push(c);c=this.I$;var d=a.type||a;if("string"===typeof a)a=new be(a,c);else if(a instanceof be)a.target=a.target||c;else{var e=a;a=new be(d,c);tc(a,e)}e=!0;if(b)for(var f=b.length-1;!a.bD&&0<=f;f--){var g=a.currentTarget=b[f];e=Ie(g,d,!0,a)&&e}a.bD||(g=a.currentTarget=c,e=Ie(g,d,!0,a)&&e,a.bD||(e=Ie(g,d,!1,a)&&e));if(b)for(f=0;!a.bD&&f{a:{var g={yQ:b,Ex:c,context:d,priority:void 0};for(const h in f)if(!(h in g)||f[h]!==g[h]){f=!1;break a}for(const h in g)if(!(h in f)){f=!1;break a}f=!0}return f});e&&Ke(a,e)}function Qe(a,b,c,d){const e=(...f)=>{c.apply(d,f);Pe(a,b,e,d)};z(a,b,e,d)}function Re(a,b){if(b){if(a.Bj){var c=gc(a.Bj,d=>d.yQ.GX==b);for(const d of Object.keys(c))Ke(a,d)}if(a.Wd){const d=Le(b);c=Ka(a.Wd,e=>e.src==d);for(const e of c)Oe(a,e)}}} +function B(a,b){a.Sp=a.Sp||[];a.Sp.push(b);return b}function Se(a,...b){if(a.Sp)for(const c of b)c&&(a.ks(c),b=Ia(a.Sp,c),0<=b&&(a.Sp.splice(b,1),Te(c)))}function Ue(a,...b){for(const c of b)c&&a.ks(c)}class Ve{constructor(){this.Sp=this.Bj=this.Wd=null}gd(){this.vd();if(this.Sp)for(const a of this.Sp)Te(a);if(this.Wd){for(const a of this.Wd)if(Array.isArray(a))for(const b of a)Ee(b);else Ee(a);this.Wd=null}if(this.Bj)for(const a of Object.keys(this.Bj))Ke(this,a)}ks(a){Re(this,a)}vd(){}};function We(a,b){return 0==b?a.qx:a.Tt[b]}function Xe(a,b){return 0==b?a.qx||[]:b in a.Tt?We(a,b):[]}function af(a){if(!a.Tt)return a.qx?a.qx.slice():[];const b=[],c=a.FG;for(let d=0;d>>1);let l;l=d(b,c[h]);0d&&Wa(c,-(d+1),0,b)}We(this,b).push(a)}remove(a,b){(b=We(this,b))&&Ra(b,a)}};function cf(a){return a.Ti?af(a.Ti).length:0}function df(a,b){a.SA||(a.SA=[]);a.SA.push(b)} +class C extends Ve{constructor(a=null){super();this.SA=this.Ti=null;this.GX=a}Haa(){return this.GX}addHandler(a,b,c){this.Ti=this.Ti||new bf;this.Ti.push({Ex:a,context:b},c||0)}removeHandler(a,b,c){c=c||0;if(this.Ti){var d=Xe(this.Ti,c),e=d.length;for(let f=0;f{b.C(...a)})}vd(){super.vd()}}C.prototype.dispatch=C.prototype.C;C.prototype.hasHandler=C.prototype.VQ;C.prototype.removeHandler=C.prototype.removeHandler;C.prototype.addHandler=C.prototype.addHandler;C.prototype.eventOwner=C.prototype.Haa;function ff(a,b){return a.L()!=b.L()?a.L()-b.L():a.Ba()!=b.Ba()?a.Ba()-b.Ba():a.ib()-b.ib()}class gf{constructor(a,b,c){this.Ld=a||0;this.SB=b||0;this.mj=c||0}L(){return this.Ld}Ba(){return this.SB}ib(){return this.mj}}gf.prototype.timeOffset=gf.prototype.ib;gf.prototype.stepIndex=gf.prototype.Ba;gf.prototype.slideIndex=gf.prototype.L;function hf(){}q("ispring.presenter.presentation.slides.IAnimationStep",hf);hf.prototype.Al=function(){};hf.prototype.automaticAdvance=hf.prototype.Al;hf.prototype.duration=function(){};hf.prototype.duration=hf.prototype.duration;hf.prototype.startTime=function(){};hf.prototype.startTime=hf.prototype.startTime;function jf(){}q("ispring.presenter.presentation.meta.IMetaCommands",jf);jf.prototype.getMetaCommand=jf.prototype.MC;jf.prototype.count=jf.prototype.count;function kf(){}q("ispring.presenter.presentation.slides.IAnimationSteps",kf);kf.prototype.count=function(){};kf.prototype.count=kf.prototype.count;kf.prototype.sc=function(){};kf.prototype.getStep=kf.prototype.sc;kf.prototype.duration=function(){};kf.prototype.duration=kf.prototype.duration;kf.prototype.getTime=function(){};kf.prototype.getTime=kf.prototype.getTime;function lf(){}q("ispring.presenter.presentation.slides.ISlideShowTransition",lf);lf.prototype.effectType=lf.prototype.J0;lf.prototype.duration=lf.prototype.duration;class mf{constructor(a,b){this.Jf=a;this.Ha=b}src(){return this.Jf}type(){return this.Ha}};class nf{constructor(a,b){this.Tb=a;this.Oz=b}id(){return this.Tb}wi(){return this.Oz}rj(){return!1}sources(){const a=[],b=this.Oz.match(//g);if(b)for(let d=0;da||a>=this.count())throw Error("index is out of bounds");return this.Fd[a]};sf.prototype.getMetaCommand=sf.prototype.MC;sf.prototype.count=function(){return this.Fd.length};sf.prototype.count=sf.prototype.count;function tf(a,b,c){this.TX=a;this.JN=null!=b?b:0;this.$r=void 0!==c?c:!0;this.Xj=0}tf.prototype.animationDuration=function(){return this.TX};tf.prototype.Al=function(){return this.$r};tf.prototype.automaticAdvance=tf.prototype.Al;tf.prototype.duration=function(){return this.TX+this.JN};tf.prototype.duration=tf.prototype.duration;tf.prototype.startTime=function(){return this.Xj};tf.prototype.startTime=tf.prototype.startTime;tf.prototype.gS=function(a){this.Xj=a};function uf(){this.TB=[]}uf.prototype.Fa=0;uf.prototype.add=function(a){a.gS(this.Fa);this.TB.push(a);this.Fa+=a.duration()};uf.prototype.count=function(){return this.TB.length};uf.prototype.count=uf.prototype.count;uf.prototype.sc=function(a){if(0>a||a>=this.TB.length)throw Error("stepIndex is out of range");return this.TB[a]};uf.prototype.getStep=uf.prototype.sc;uf.prototype.duration=function(){return this.Fa};uf.prototype.duration=uf.prototype.duration; +uf.prototype.getTime=function(a,b){return this.sc(a).startTime()+b};uf.prototype.getTime=uf.prototype.getTime;let vf=0;class wf{constructor(a,b){this.$h=a;this.Md=b;this.Tb=`${vf++}`}name(){return this.$h}time(){return this.Md}id(){return this.Tb}};function xf(a,b){if(0>b||b>=a.count())throw Error();return a.gs[b]}class yf{constructor(){this.gs=[]}count(){return this.gs.length}add(a){this.gs.push(a)}};class zf{constructor(a,b,c){this.Ha=a;this.Am=b;this.zm=c}type(){return this.Ha}Lb(){return this.Am}Gi(){return this.zm}};class Af{constructor(){this.Fd=[]}count(){return this.Fd.length}};class Bf{constructor(a,b,c){this.Q3=a;this.Am=b;this.hL=c}Lb(){return this.Am}qf(){return this.hL}};function Cf(a){if(0>=a.count())throw Error("index is out of range");return a.$i[0]}function Df(a,b){for(let c=0;cff(b,d.qf()))return d}return null}class Ef{constructor(a){this.$i=a}count(){return this.$i.length}};function Ff(a,b,c){c&&!Gf(a,b,c)&&(c=null);c||(c=Hf(a,b));a.$i.push(new Bf(b,b.Lb(),c))}function Gf(a,b,c){a=Hf(a,b);return 0<=ff(a,c)} +function Hf(a,b){const c=a.Ye;var d=c.wm,e=c.Pj,f=null;if("number"===typeof d)f=c.duration(),f=f-(b.Gi()||0)+f*(d-1);else switch(d){case "untilNextClick":e=-1;break;case "untilNextSlide":e=Math.max(e,0)}b=b.Lb();e=0>e?new gf(b.L(),b.Ba()+1,0):new gf(b.L()+e+1,-1,0);d=null;null!==f&&(a=a.M,b=a.ti(b,!0,!1),f=Math.min(b+f,a.duration()),d=a.Xo(f,!0,!1));return d&&0>ff(d,e)?d:e} +class If{constructor(a,b){this.Ye=a;this.M=b;this.$i=[];a=this.Ye.Fd;b=null;for(let e=0;ed||d>=c.count())throw Error("index is out of range");c=c.Fd[d];d=c.Lb();switch(c.type()){case "play":b&&Ff(this,b,d);b=c;break;case "togglePlay":b&&Gf(this,b,d)?(Ff(this,b,d),b=null):(b&&Ff(this,b),b=c);break;case "stop":b&&(Ff(this,b,d),b=null)}}b&&Ff(this,b)}oQ(){return new Ef(this.$i)}};function Kf(a,b){a.$i||(a.$i=(new If(a,b)).oQ());return a.$i}class Lf{constructor(a,b,c){this.Tb=a;this.Ni=b;this.Fa=c;this.Pj=-1;this.Le=this.wm=1;this.gs=new yf;this.Fd=new Af;this.$i=null}id(){return this.Tb}duration(){return this.Fa}volume(){return this.Le}setVolume(a){this.Le=a}ik(){return this.gs}};class Mf extends Lf{constructor(a,b,c){super(a,b,c);this.Kv=!1}};function Nf(a,b,c,d){this.zv=a;this.Fa=b;this.If=c||null;this.TZ=d||!1}Nf.prototype.If=null;Nf.prototype.J0=function(){return this.zv};Nf.prototype.effectType=Nf.prototype.J0;Nf.prototype.duration=function(){return this.Fa};Nf.prototype.duration=Nf.prototype.duration;Nf.prototype.clone=function(){return new Nf(this.zv,this.Fa,this.If,this.TZ)};function Of(){}Of.prototype.uW=null;Of.prototype.mY=null;Of.prototype.kp=function(){return this.uW};function Pf(a,b){a.uW=b}Of.prototype.ey=function(){return this.mY};function Qf(a,b){a.mY=b};function Rf(a,b){if(0>b||b>=a.Qs.length)throw Error("index is out of range");return a.Qs[b]}function Sf(a,b){for(let c=0;c=this.left&&a.right<=this.right&&a.top>=this.top&&a.bottom<=this.bottom:a.x>=this.left&&a.x<=this.right&&a.y>=this.top&&a.y<=this.bottom:!1}; +k.expand=function(a,b,c,d){la(a)?(this.top-=a.top,this.right+=a.right,this.bottom+=a.bottom,this.left-=a.left):(this.top-=a,this.right+=Number(b),this.bottom+=Number(c),this.left-=Number(d));return this};k.ceil=function(){this.top=Math.ceil(this.top);this.right=Math.ceil(this.right);this.bottom=Math.ceil(this.bottom);this.left=Math.ceil(this.left);return this}; +k.floor=function(){this.top=Math.floor(this.top);this.right=Math.floor(this.right);this.bottom=Math.floor(this.bottom);this.left=Math.floor(this.left);return this};k.round=function(){this.top=Math.round(this.top);this.right=Math.round(this.right);this.bottom=Math.round(this.bottom);this.left=Math.round(this.left);return this}; +k.translate=function(a,b){a instanceof Xc?(this.left+=a.x,this.right+=a.x,this.top+=a.y,this.bottom+=a.y):(this.left+=a,this.right+=a,"number"===typeof b&&(this.top+=b,this.bottom+=b));return this};k.scale=function(a,b){b="number"===typeof b?b:a;this.left*=a;this.right*=a;this.top*=b;this.bottom*=b;return this};function Wf(a,b,c,d){this.left=a;this.top=b;this.width=c;this.height=d}k=Wf.prototype;k.clone=function(){return new Wf(this.left,this.top,this.width,this.height)};k.contains=function(a){return a instanceof Xc?a.x>=this.left&&a.x<=this.left+this.width&&a.y>=this.top&&a.y<=this.top+this.height:this.left<=a.left&&this.left+this.width>=a.left+a.width&&this.top<=a.top&&this.top+this.height>=a.top+a.height}; +k.G0=function(){var a=(void 0).xl-n);this.M=g}id(){return this.Tb}xy(){return this.M9}Ya(){return this.Af}duration(){return this.a$}slides(){return this.M}Kr(){return this.E8}hn(){return this.Z8}rotation(){return this.Kw}};function Zf(a,b){return Oa(a.Si,c=>c.id()==b)}function $f(a,b){return Oa(a.Si,c=>!!c.slides().length&&c.slides()[0]==b)}function ag(a){let b=[];for(var c of a.Si)b=b.concat(c.slides());if(!b.length)return!0;b.sort((d,e)=>d-e);a=b[0];for(c=0;ca)throw Error("negative time not accepted");let c=0;b&&null!=this.transition()&&(b=this.transition().duration(),b=a)break;a-=d.duration()}if(c==b.count())if(.001>=a)--c,a=b.sc(c).duration();else throw Error("time out of bounds");}return new gf(this.index(),c,a)}} +dg.prototype.convertTimeToTimestamp=dg.prototype.Xo;dg.prototype.zoomEffects=dg.prototype.Bk;dg.prototype.navigationSettings=dg.prototype.ou;dg.prototype.presenter=dg.prototype.Qf;dg.prototype.metaCommands=dg.prototype.jp;dg.prototype.text=dg.prototype.text;dg.prototype.nestingLevel=dg.prototype.tc;dg.prototype.startTime=dg.prototype.startTime;dg.prototype.thumbnail=dg.prototype.Ku;dg.prototype.duration=dg.prototype.duration;dg.prototype.transition=dg.prototype.transition; +dg.prototype.slideNotes=dg.prototype.Ei;dg.prototype.title=dg.prototype.title;dg.prototype.isLoaded=dg.prototype.uf;dg.prototype.visible=dg.prototype.visible;dg.prototype.visibleIndex=dg.prototype.Mi;dg.prototype.index=dg.prototype.index;dg.prototype.id=dg.prototype.id;dg.prototype.type=dg.prototype.type;dg.prototype.animationSteps=dg.prototype.sb;function eg(a,b){b.Hj=a.M.length;b.gS(a.duration());a.M.push(b);if(b.visible()){b.S_=a.iC.length;a.iC.push(b);const c=b.duration(),d=b.transition()?b.transition().duration():0;a.XP+=c;a.WP+=c-d}b.T_.addHandler(c=>{a.HZ.C(c)},a)} +class fg{constructor(){this.M=[];this.iC=[];this.WP=this.XP=0;this.HZ=new C}la(a){if(0>a||a>=this.M.length)throw Error("slideIndex is out of range");return this.M[a]}count(){return this.M.length}duration(){if(0==this.count())return 0;const a=this.M[this.M.length-1];return a.startTime()+a.duration()}laa(a,b,c){return new gf(a,b,c)}ti(a,b,c){if(!a)throw Error("Invalid timestamp");var d=a.L();if(d>=this.count())throw Error("Slide index is out of bounds");if(0>d)return NaN;void 0===b&&(b=!0);void 0=== +c&&(c=!0);let e=0;for(var f=0;f=a.count())throw Error("stepIndex is out of bounds");a=a.sc(g);f>a.duration()&&(f=a.duration());e+=a.startTime()+f}else b&&(f>h.duration()&&(f=h.duration()),e+=f);return e}Xo(a,b,c){if(isNaN(a))throw Error("NaN time not accepted");if(0>a)throw Error("negative time not accepted"); +let d=null;for(var e=0;e=a||f&&.001>=a-g)break;a-=g}if(e==this.count()&&0<=a)throw Error("time out of bounds");c=0;b&&(b=d.transition().duration(),b=a)break;a-=e.duration()}if(c==b.count())if(.001>=a)--c,a=b.sc(c).duration();else throw Error("time out of bounds"); +}return new gf(d.index(),c,a)}Cp(){return this.iC.length}mI(a){if(0>a||a>=this.Cp())throw Error("Slide index is out of range");return this.iC[a]}tda(){return this.XP}Pu(){return this.WP}}fg.prototype.visibleAnimationStepsDuration=fg.prototype.Pu;fg.prototype.visibleSlidesDuration=fg.prototype.tda;fg.prototype.getVisibleSlide=fg.prototype.mI;fg.prototype.visibleSlidesCount=fg.prototype.Cp;fg.prototype.convertTimeToTimestamp=fg.prototype.Xo;fg.prototype.convertTimestampToTime=fg.prototype.ti; +fg.prototype.createTimestamp=fg.prototype.laa;fg.prototype.duration=fg.prototype.duration;fg.prototype.count=fg.prototype.count;fg.prototype.getSlide=fg.prototype.la;function gg(a){0<=a.W&&--a.W;return 0<=a.W}function hg(a){for(;a.CI()&&!a.fa().visible(););return!!a.fa()}function ig(a){for(;gg(a)&&!a.fa().visible(););return!!a.fa()}class jg{constructor(a,b){this.j8=a;this.Vw=b;this.mE=b.length;this.W=-1}seekTo(a){this.W=Vc(a,-1,this.mE);return!0}CI(){this.Wb||b>=a.count())throw Error("actionIndex is out of range");return a.nc[b]};function ug(){this.nc=new sg}ug.prototype.Hb=!0;ug.prototype.enabled=function(){return this.Hb};ug.prototype.qa=function(a){this.Hb=a};ug.prototype.actions=function(){return this.nc};function vg(){this.Hb=!0}vg.prototype.enabled=function(){return this.Hb};vg.prototype.enabled=vg.prototype.enabled;vg.prototype.qa=function(a){this.Hb=a};vg.prototype.$g=function(){return this.De};function E(a,b){const c=new C(a);B(a,c);if(b)if(Array.isArray(b))for(const d of b)df(d,c);else df(b,c);return c}class wg extends Ve{};const xg=[.75,1,1.25,1.5,2];class yg extends wg{constructor(){super();this.NN=1;this.lx=!1;this.Qj=E(this)}playbackRate(){return this.NN}wk(a){this.NN!=a&&(this.NN=a,this.Qj.C())}ED(){return this.lx}};function zg(){return Mb?"Webkit":Lb?"Moz":Ib?"ms":null}function Ag(a,b){if(b&&a in b)return a;var c=zg();return c?(c=c.toLowerCase(),a=c+nd(a),void 0===b||a in b?a:null):null};var Bg=class extends be{constructor(a,b){super("visibilitychange");this.hidden=a;this.visibilityState=b}};const Cg=new WeakMap;function Dg(a){var b=Eg;const c=ma(a),d=([,...f])=>b(c,f),e=([f,...g])=>a.apply(f,g);return function(...f){const g=this||ia;let h=Cg.get(g);h||(h={},Cg.set(g,h));return Gb(h,[this,...f],e,d)}}function Eg(a,b){a=[a];for(let c=b.length-1;0<=c;--c)a.push(typeof b[c],b[c]);return a.join("\v")};function Fg(a){He.call(this);this.EC=a||od();if(this.M0=this.Saa())this.Gaa=ve(this.EC.od,this.M0,ta(this.Zaa,this))}r(Fg,He);k=Fg.prototype;k.Saa=Dg(function(){var a=!!this.KC(),b="hidden"!=this.KC();return a?b?((zg()||"")+"visibilitychange").toLowerCase():"visibilitychange":null});k.KC=Dg(function(){return Ag("hidden",this.EC.od)});k.Vaa=Dg(function(){return Ag("visibilityState",this.EC.od)});function Gg(a){return!!a.EC.od[a.KC()]} +k.Zaa=function(){var a=this.KC()?this.EC.od[this.Vaa()]:null;a=new Bg(Gg(this),a);this.dispatchEvent(a)};k.pf=function(){Ee(this.Gaa);Fg.Mb.pf.call(this)};class Hg{constructor(){this.M=[];this.BF=1;this.Un=this.Ie=0;this.hg=!1}push(a){this.hg||(this.M[this.Un]=a,this.Un=(this.Un+1)%this.BF,this.Ie=Math.min(this.Ie+1,this.BF))}pop(){if(this.hg||this.xi())return null;this.Un=0>this.Un-1?this.BF-1:this.Un-1;this.Ie--;return this.M[this.Un]}top(){return this.xi()?null:this.M[0>this.Un-1?this.BF-1:this.Un-1]}xi(){return!this.Ie}size(){return this.Ie}lock(){this.hg=!0}unlock(){this.hg=!1}};var Ig={Vfa:"playingSlide",Wfa:"playingTransition",Rfa:"pausedTransition",Qfa:"pausedSlide",Y2:"suspended",KS:"buffering"};q("ispring.presenter.player.PresentationPlaybackState",Ig);q("PLAYING_SLIDE","playingSlide",Ig);q("PAUSED_SLIDE","pausedSlide",Ig);q("SUSPENDED","suspended",Ig);q("PLAYING_TRANSITION","playingTransition",Ig);q("PAUSED_TRANSITION","pausedTransition",Ig);q("BUFFERING","buffering",Ig);function Jg(a){this.Ha=a}Jg.prototype.type=function(){return this.Ha};function Kg(a){this.Ha="gotoSlide";this.Ld=a}r(Kg,Jg);Kg.prototype.L=function(){return this.Ld};function Lg(a){this.B=a}Lg.prototype.EQ=function(a){switch(a.type()){case "closePlayerWindow":this.B.BE.C();return;case "gotoNextSlide":Mg(this.B,!0,!0,!0);return;case "gotoSlide":this.CL(a.L());return}throw Error("unknown action type");};Lg.prototype.CL=function(a){this.B.ue(a)};function Qg(a,b,c,d,e){this.HG=a;this.vY=b;this.GG=c;this.WS=d;this.I_=e}Qg.prototype.quizState=function(){return this.vY};Qg.prototype.quizPassed=function(){return this.GG};Qg.prototype.allowRetakeQuiz=function(){return this.WS};Qg.prototype.wD=function(){return{type:this.HG,state:this.vY,passed:this.GG,retake:this.WS,attempts:this.I_}}; +function Rg(a){const b=a.quiz().isGraded()?"graded":"survey";var c=a.currentSession();if(c){const d=c.evaluation();c=c.sessionMode();const e=a.usedAttemptsCount();let f=!1,g=!1;d&&(f=d.quizPassed(),g=a.allowRetakeQuiz());return new Qg(b,c,f,g,e)}return new Qg(b,null,!1,a.allowRetakeQuiz(),0)};function Sg(a){return"graded"==a.HG?a.quizPassed():Tg(a)}function Tg(a){a=a.quizState();return"completed"==a||"reviewing"==a};function Ug(a){this.Ha=a}Ug.prototype.type=function(){return this.Ha};function Vg(a){this.Ha="gotoSlide";this.Ld=a}r(Vg,Ug);Vg.prototype.L=function(){return this.Ld};function Wg(a){this.B=a}Wg.prototype.EQ=function(a){switch(a.type()){case "closePlayerWindow":this.B.BE.C();return;case "gotoNextSlide":Mg(this.B,!0,!0,!0);return;case "gotoSlide":this.CL(a.L());return}throw Error("unknown action type");};Wg.prototype.CL=function(a){this.B.ue(a)};class Xg{constructor(a,b,c){this.Tw=a;this.JY=b;this.q9=c}};var Yg={pha:"started",Y2:"suspended",KS:"buffering",qha:"stopped",Cga:"rewinding"};q("ispring.presenter.player.clock.PresentationClockState",Yg);q("STARTED","started",Yg);q("SUSPENDED","suspended",Yg);q("BUFFERING","buffering",Yg);q("STOPPED","stopped",Yg);q("REWINDING","rewinding",Yg);class Zg extends Lf{constructor(a,b,c,d){super(a,b,c);this.PX=d;this.SX=this.LY=this.XU=!1}XQ(){return this.XU}XI(){return this.LY}yR(){return this.SX}};var $g=xb(),ah=Bb()||vb("iPod"),bh=vb("iPad"),ch=Ab(),dh=zb(),eh=yb()&&!Db();function fh(a,b){b||(b={});var c=window;if(a instanceof Ac)var d=a;else d="undefined"!=typeof a.href?a.href:String(a),d instanceof Ac||(d="object"==typeof d&&d.Px?d.Jx():String(d),Dc.test(d)?d=new Ac(d,zc):(d=String(d),d=d.replace(/(%0A|%0D)/g,""),d=d.match(Cc)?new Ac(d,zc):null)),d=d||Fc;var e=void 0!==self.crossOriginIsolated,f="strict-origin-when-cross-origin";window.Request&&(f=(new Request("/")).referrerPolicy);const g="unsafe-url"===f;f=b.noreferrer;if(e&&f){if(g)throw Error("Cannot use the noreferrer option on a page that sets a referrer-policy of `unsafe-url` in modern browsers!"); +f=!1}a=b.target||a.target;e=[];for(var h in b)switch(h){case "width":case "height":case "top":case "left":e.push(h+"="+b[h]);break;case "target":case "noopener":case "noreferrer":break;default:e.push(h+"="+(b[h]?1:0))}h=e.join(",");if(Db()&&c.navigator&&c.navigator.standalone&&a&&"_self"!=a){b=zd("A");a:{try{var l=b&&b.ownerDocument,n=l&&(l.defaultView||l.parentWindow);n=n||ia;if(n.Element&&n.Location){var m=n;break a}}catch(t){}m=null}if(m&&"undefined"!=typeof m.HTMLAnchorElement&&(!b||!(b instanceof +m.HTMLAnchorElement)&&(b instanceof m.Location||b instanceof m.Element))){if(la(b))try{var p=b.constructor.displayName||b.constructor.name||Object.prototype.toString.call(b)}catch(t){p=""}else p=void 0===b?"undefined":null===b?"null":typeof b;Ga("Argument is not a %s (or a non-Element, non-Location mock); got: %s","HTMLAnchorElement",p)}m=d instanceof Ac?d:Ec(d);b.href=Bc(m);b.target=a;f&&(b.rel="noreferrer");m=document.createEvent("MouseEvent");m.initMouseEvent("click", +!0,!0,c,1);b.dispatchEvent(m);c={}}else f?(c=Tc("",c,a,h),b=Bc(d),c&&(Kb&&-1!=b.indexOf(";")&&(b="'"+b.replace(/'/g,"%27")+"'"),c.opener=null,""===b&&(b="javascript:''"),b=ib(b),b=Kc(''),(m=c.document)&&m.write&&(m.write(Hc(b)),m.close()))):((c=Tc(d,c,a,h))&&b.noopener&&(c.opener=null),c&&b.noreferrer&&(c.opener=null));return c};let gh;function hh(a){a instanceof ie&&(a=a.te);gh||(gh=new WeakMap);return gh.has(a)}function ih(a){a instanceof ie&&(a=a.te);return a.defaultPrevented?!0:hh(a)};function jh(a,b){He.call(this);this.Rx=a||1;this.vD=b||ia;this.p0=ta(this.gda,this);this.d1=wa()}r(jh,He);k=jh.prototype;k.enabled=!1;k.Ol=null;k.setInterval=function(a){this.Rx=a;this.Ol&&this.enabled?(this.stop(),this.start()):this.Ol&&this.stop()};k.gda=function(){if(this.enabled){var a=wa()-this.d1;0>=8);b[c++]=e}a=void 0;void 0===a&&(a=0);rh();a=lh[a];c=Array(Math.floor(b.length/3));d=a[64]||"";let n=0;for(e=0;n>2];f=a[(f&3)<<4|g>>4];g=a[(g&15)<<2|h>>6];h=a[h&63];c[e++]=""+l+f+g+h}l=0;h=d;switch(b.length-n){case 2:l=b[n+1],h=a[(l&15)<<2]||d;case 1:b=b[n],c[e]=""+a[b>>2]+a[(b&3)<<4|l>>4]+h+d}b=c.join("")}return b} +function sh(a){if(ph)return ia.atob(a);var b="";th(a,function(c){b+=String.fromCharCode(c)});return b}function uh(a){var b=[];th(a,function(c){b.push(c)});return b}function th(a,b){function c(l){for(;d>4);64!=g&&(b(f<<4&240|g>>2),64!=h&&b(g<<6&192|h))}} +function rh(){if(!mh){mh={};for(var a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""),b=["+/=","+/","-_=","-_.","-_"],c=0;5>c;c++){var d=a.concat(b[c].split(""));lh[c]=d;for(var e=0;e{Fd(b)},100)}catch(b){return!1}return!0};function gi(a){this.length=a.length||a;for(let b=0;b{a.apply(b||null,e)},c)}function Hi(){return Ii&&!Ji?"about:blank":""}function Ki(){const a=Li();return Math.max(1,Math.min(a.width,a.height)/420)} +function Li(){if(Mi)return new cd(document.documentElement.clientWidth,document.documentElement.clientHeight);if(Ii&&Ib)return new cd(screen.width,screen.height);var a=void 0!==window.devicePixelRatio?window.devicePixelRatio:1;return Ji?new cd(screen.width/a,screen.height/a):Ii?Ni&&(a=Math.max(screen.width,screen.height),document.documentElement.clientWidth>a)?new cd(Math.max(document.documentElement.clientWidth,a),Math.max(document.documentElement.clientHeight,Math.min(screen.width,screen.height))): +new cd(screen.width,screen.height):new cd(screen.width*a,screen.height*a)}function Oi(){var a=window.location.search.substr(1);if(a){var b={};a=a.split("&");for(let e=0;e{setTimeout(()=>{if(!ih(d.te)){const e=d.currentTarget;Ri(e.href,e.target||"_blank")}})});ve(c,"click",d=>{d.preventDefault()})}}function Ri(a,b){ei?(new di("openWindow",[a])).Dx():fh(a,b?{target:b}:void 0)}function Si(a){if(!a)return!1;for(;a;){if("A"==a.nodeName.toLocaleUpperCase())return!0;a=a.parentNode}return!1}function Ti(a){return a&&"VIDEO"==a.nodeName&&a.controls} +function Ui(a){const b=wd("script",{type:"text/javascript",charset:"UTF-8"});document.body.appendChild(b);b.src=a;return b}function Vi(){return 0==window.location.href.indexOf("file:")}function Wi(){const a=wd("DIV");try{Di(a,"100px")}catch(b){return!1}return!0}function Xi(){let a;try{const b=wd("CANVAS");a=b.getContext("webgl")||b.getContext("experimental-webgl")}catch(b){}return a?!0:!1};(function(){function a(b){try{return b.ISPlayer&&(window.ISPlayer=b.ISPlayer),b.ISPVideoPlayer&&(window.ISPVideoPlayer=b.ISPVideoPlayer),b.ISPQuizPlayer&&(window.ISPQuizPlayer=b.ISPQuizPlayer),b.ISPInteractionPlayerCore&&(window.ISPInteractionPlayerCore=b.ISPInteractionPlayerCore),b.ISPBookPlayer&&(window.ISPBookPlayer=b.ISPBookPlayer),b.ISPScenarioPlayer&&(window.ISPScenarioPlayer=b.ISPScenarioPlayer),b.ISPFlipPlayer&&(window.ISPFlipPlayer=b.ISPFlipPlayer),!0}catch(c){return!1}}if(function(){let b; +try{b=window.frameElement}catch(c){}return null!=b}()){let b=window,c=7;for(;b&&b.parent!=b&&0!=c--&&!a(b.parent);)b=b.parent}})();var Yi;const Zi=Oi().user_agent;Yi=Zi?Zi:ub()||"";var Ni=bh||ah,Mi="1"==Oi().small_screen,$i="1"==Oi().tablet_screen,aj;let bj;try{bj=window.top.location.href?window.frameElement:null}catch(a){}var cj=(aj=null!=bj)&&window.frameElement&&window.frameElement.parentNode&&"FRAMESET"==window.frameElement.parentNode.tagName?!0:!1,dj=ah&&aj; +function ej(){const a=Yi.toLowerCase();return-1!=a.indexOf("android")||-1!=a.indexOf("mobile")||-1!=a.indexOf("wpdesktop")||Mi||$i}var fj=-1!=Yi.toLowerCase().indexOf("chrome"),gj=Mb&&!fj,hj=-1!=Yi.indexOf("CriOS"),ij=-1==Yi.toLowerCase().indexOf("windows phone")&&-1!=Yi.toLowerCase().indexOf("android"),Ii=ej(),jj=Ii&&(ej()?"ontouchstart"in window||void 0!==window.DocumentTouch&&document instanceof window.DocumentTouch||-1!=Yi.toLowerCase().indexOf("touch"):!1);let kj=""; +if(Ni){const a=/CPU.+OS\s(\d+)_(\d+)/.exec(Yi);kj=a?a[1]+"."+a[2]:""}var lj=parseInt(kj,10),mj=Ni&&6>=lj,nj=Ni&&7<=lj,oj=Ni&&8<=lj,pj=Ni&&9<=lj,qj=Ni&&10<=lj,rj=Ni&&12<=lj,sj=Ib&&"9."==Vb.substr(0,2),tj=Ib&&"10."==Vb.substr(0,3),vj=uj&&Ib,Ji=ij&&!fj&&!$g&&!Hb,wj=-1!=Yi.toLowerCase().indexOf("micromessenger"),ei=-1!=Yi.indexOf("ismobile"),xj=ei&&ah,yj=ei&&ij,zj; +if(zj=!window._ispringFullsizeSkin){var Aj;if(!(Aj=Mi))if(window._ispringFullsizeSkin)Aj=!1;else{var Bj=Li();Aj=(ah||700>Math.min(Bj.width,Bj.height))&&!$i}zj=Aj}var uj=zj,Cj=ah&&!xj&&10>lj||vj&&uj,Dj=void 0!==window.ISPlayer,Ej=Dj&&uj,Fj=Ii&&!Dj,Gj=!1,Hj=Ni||vj||ij||jj;const Ij=document.createElement("audio"),Jj=Ij.play&&Ij.play(); +Jj&&Jj.then(()=>{Ij.pause()},a=>{if(0=HTMLMediaElement.HAVE_METADATA}function Sj(a){var b=(b=a.lg)?b.error?"error":b.ended?"ended":Tj(a)?"paused":a.Bf?"buffering":"playing":"disposed";const c=a.Pa;c!=b&&(a.Pa=b,a.Sq.C(a,c))}function Tj(a){const b=a.mediaElement();return Ni||!a.rj()?!a.fd:b.paused}function Rj(a){return!!a.lg&&!a.lg.error&&void 0!==a.lg.play}function Uj(a){a.Uy&&(clearInterval(a.Uy),a.Uy=void 0)}function Vj(a){0>a.Ty&&(a.Ty=setInterval(a.J3.bind(a),500))} +function Wj(a){0=HTMLMediaElement.HAVE_CURRENT_DATA)||we(a,"canplay",this.hN,!1,this);Sj(this)}mediaElement(){if(!this.lg)throw Error("media player was disposed");return this.lg}state(){return this.Pa}playbackRate(){return this.lg.playbackRate}wk(a){this.lg&&a!=this.playbackRate()&&(this.lg.playbackRate= +a,this.lg.defaultPlaybackRate=a,this.Qj.C())}ready(){return Rj(this)&&this.ki}Sz(){const a=this.vn;var b=this.mediaElement().getAttribute("preload");b=b&&"metadata"!=b?$g?HTMLMediaElement.HAVE_CURRENT_DATA:HTMLMediaElement.HAVE_FUTURE_DATA:HTMLMediaElement.HAVE_METADATA;$g&&this.mediaElement().readyState>=HTMLMediaElement.HAVE_CURRENT_DATA&&!this.ki?this.hN():(this.vn=this.ki&&Rj(this)&&this.mediaElement().readyState>=b,!this.vn&&Ii&&1==this.mediaElement().networkState&&1==this.p5&&(this.vn=!0,this.Z7.C(this)), +this.vn||this.Ks?this.vn&&(clearInterval(this.Ks),this.Ks=void 0):this.Ks=setInterval(this.Sz.bind(this),2E3),!a&&this.vn&&this.Kp.C(this),this.p5=this.mediaElement().networkState)}xC(){this.Sz();return this.vn}XM(){this.Sz()}playing(){return this.fd}play(){if(Rj(this)){this.fd=!0;Ni&&"VIDEO"==this.mediaElement().tagName&&this.src()&&!this.mediaElement().src&&(this.mediaElement().src=this.src());const a=this.mediaElement().play();a&&a.catch(b=>window.console.log(b));if(nj){const b=this.mediaElement().currentTime; +let c=0;clearInterval(this.Uy);this.Uy=setInterval(()=>{++c;this.mediaElement().currentTime=d&&e>=Math.min(this.currentTime()+5,this.duration())){c=!1;this.mediaElement().paused&&this.mediaElement().play();break}}this.Bf!=c&&(this.Bf=c,Sj(this))}}Zo(a){this.mediaElement().controls=a}rj(){return this.mediaElement().controls|| +ah}Ih(a){if(this.lg&&this.lg.play){if("string"!==typeof a)a:{Array.isArray(a)||(a=[a]);for(let c=0;c{});c.pause();d.push(c)}function b(){if(30>ek.length)for(var c=ek.length;30>c;++c){var d=dk();a(d,ek)}if(30>fk.length)for(c=fk.length;30>c;++c)d=zd("VIDEO"),d.setAttribute("preload","metadata"),qj&&d.setAttribute("playsinline",""),a(d,fk)}if(Fj){let c=!1;document.body.addEventListener("touchstart",()=>{c=!0});document.body.addEventListener("touchmove", +d=>{if(Ni||!d.defaultPrevented)c=!1});document.body.addEventListener("touchend",d=>{!1!==d.isTrusted&&c&&b()})}else Ib||Jb||document.body.addEventListener("mouseup",()=>b());window.ismediacreator=[ek,fk]}function gk(){return ek&&ek.length?ek.shift():dk()};class hk extends Xj{constructor(a){super(a);this.hA=0;this.LL=!1}fN(){this.LL?this.LL=!1:super.fN()}iN(){super.iN();this.hA=Date.now()}pw(){super.pw();if(this.ready()&&Ji){var a=100>Date.now()-this.hA;this.playing()||a||(this.LL=!0,a=this.mediaElement(),a.play(),a.pause())}}};class ik extends ck{constructor(a){super(new hk(a))}};class jk{constructor(a,b,c){this.nm=a;this.SB=b;this.mj=c;0>this.mj&&(this.mj=0);this.nm&&0>this.nm.m.t&&(this.nm.m.t=0)}Ba(){return this.SB}ib(){return this.mj}OR(){const a={s:this.SB,t:this.mj};this.nm&&(a.S=qc(this.nm));return a}clone(){return new jk(this.nm?qc(this.nm):null,this.SB,this.mj)}};function kk(a,b){return a.sa.querySelector(`#${b}`)}class lk{constructor(a,b){this.sa=a;this.Yv=b}content(){return this.sa}ky(a,b){this.sa!=a&&(this.sa=a,this.Yv=b,this.gZ())}gZ(){}};function mk(a,b,c){a.Da.Ji(a.L(),b,c,!0)}function nk(a){a.HI(a.Uu.count()-1)}function ok(a){a.pause();mk(a,0,0)}function pk(a){const b=a.Da.$().timestamp();if(null==a.Wa||b.L()!=a.L()||0>b.Ba())throw Error("playback controller not active");}function qk(a,b){b&&a.wq!=b&&(a.wq=b,a.ft())} +class rk{constructor(a,b,c){this.ya=a;this.pa=b;this.Da=c;this.kY=this.Wa=null;this.Uu=a.sb();this.Ld=a.index();this.wq=!1;this.RB=new C;this.Ef=new C;this.Tq=new C}slide(){return this.ya}view(){return this.pa}activate(a){this.Wa=a;this.Da.$().Zb().addHandler(this.Ab,this)}deactivate(){this.Wa=null;this.Da.$().Zb().removeHandler(this.Ab,this)}play(){this.Da.start()}pause(){this.Da.stop()}L(){return this.Ld}TH(){}vQ(){}HI(a){const b=this.Uu.sc(a);this.pause();mk(this,a,b.duration())}sb(){return this.Uu}cI(){pk(this); +return this.Da.$().timestamp().Ba()}uQ(){pk(this);const a=this.sb().sc(this.cI());return Math.min(a.duration(),this.Da.$().timestamp().ib())}paa(){pk(this);const a=this.sb().sc(this.cI());return 0=d.time){a=d.freeze?d.OQ:d.OQ+a-d.time;break a}}throw Error("invalid clock");}return a}sk.prototype.add=function(a){const b=this.Yf();b.Md+=a;return b};sk.prototype.Yf=function(){return new sk(this.ET,this.Md)}; +function uk(a){this.Rq=new sk(this);this.ND=[];this.Dm=[{time:0,OQ:a,freeze:!1}]}function vk(a,b,c,d){b={time:b,OQ:c,freeze:d||!1};0==a.Dm.length?a.Dm.push(b):(c=a.Dm[a.Dm.length-1],c.time!=b.time&&wk(a,c.time,b.time)?a.Dm.push(b):a.Dm.splice(a.Dm.length-1,1,b))}uk.prototype.persistState=function(){return{t:this.Rq.time(),p:Ua(this.Dm)}};function wk(a,b,c){return La(a.ND,d=>d>=b&&d<=c)};class xk{constructor(a,b){this.caa=a[ia.Symbol.iterator]();this.wba=b}[Symbol.iterator](){return this}next(){const a=this.caa.next();return{value:a.done?void 0:this.wba.call(void 0,a.value),done:a.done}}}function yk(a,b){return new xk(a,b)};function zk(){}zk.prototype.next=function(){return Ak};var Ak={done:!0,value:void 0};function Bk(a){return{value:a,done:!1}}zk.prototype.Aj=function(){return this};function Ck(a){if(a instanceof zk)return a;if("function"==typeof a.Aj)return a.Aj(!1);if(ka(a)){let b=0;const c=new zk;c.next=function(){for(;;){if(b>=a.length)return Ak;if(b in a)return Bk(a[b++]);b++}};return c}throw Error("Not implemented");} +function Dk(a,b){if(ka(a))u(a,b);else for(a=Ck(a);;){const {done:c,value:d}=a.next();if(c)break;b.call(void 0,d,void 0,a)}}function Ek(a,b,c){let d=0,e=a,f=c||1;1=e||0>f&&d<=e)return Ak;const h=d;d+=f;return Bk(h)};return g}function Fk(a){if(ka(a))return Ua(a);a=Ck(a);const b=[];Dk(a,function(c){b.push(c)});return b};function Gk(a){if(a instanceof Hk||a instanceof Ik||a instanceof Jk)return a;if("function"==typeof a.next)return new Hk(()=>a);if("function"==typeof a[Symbol.iterator])return new Hk(()=>a[Symbol.iterator]());if("function"==typeof a.Aj)return new Hk(()=>a.Aj());throw Error("Not an iterator or iterable.");}class Hk{constructor(a){this.QQ=a}Aj(){return new Ik(this.QQ())}[Symbol.iterator](){return new Jk(this.QQ())}uJ(){return new Jk(this.QQ())}} +class Ik extends zk{constructor(a){super();this.VC=a}next(){return this.VC.next()}[Symbol.iterator](){return new Jk(this.VC)}uJ(){return new Jk(this.VC)}}class Jk extends Hk{constructor(a){super(()=>a);this.VC=a}next(){return this.VC.next()}};function Kk(a,b){this.Gl={};this.hd=[];this.BD=this.size=0;var c=arguments.length;if(12*this.size&&Mk(this),!0):!1}; +function Mk(a){if(a.size!=a.hd.length){for(var b=0,c=0;b=d.hd.length)return Ak;var f=d.hd[b++];return Bk(a?f:d.Gl[f])};return e};function Nk(a,b){return Object.prototype.hasOwnProperty.call(a,b)};function Pk(){this.ns=[[]]}function Qk(a){return a.ns[a.ns.length-1]}k=Pk.prototype;k.add=function(a){let b=Qk(this);Array.isArray(a)?(b=Ta(b,a),this.ns[this.ns.length-1]=b):b.push(a)};k.push=function(){this.ns.push([])};k.pop=function(){if(1>=this.ns.length)throw Error("");const a=this.ns.pop();this.add(a);return a};k.clear=function(a,b){const c=Qk(this);a=void 0!==a?a:0;b=void 0!==b?b:c.length;c.splice(a,b-a)};k.apply=function(a){const b=Qk(this);for(let c=0;c=l?(e-f)/(2*l):(e-f)/(2-2*l));c=[Math.round(g+360)%360,h,l]}else c=b;d=c;"rgb"==a?(b=d[1],c=d[2],a=d[0]/360,0==b?c=d=a=255*c:(b=.5>c?c*(1+b):c+b-b*c,e=2*c-b,c=255*Vk(e,b,a+1/3),d=255*Vk(e,b,a),a=255*Vk(e,b,a-1/3)),a=[Math.round(c),Math.round(d),Math.round(a)]):a=d}return a}Pm(a){const b= +this.je==a.je?this.Sb:this.Mc(a.je);return bb(b,a.Sb)}clone(){return new Tk(this.je,Ua(this.Sb))}};class Wk extends Sk{constructor(a,b,c,d,e){super(c,d,e);this.Zf=a;this.Vr=[];this.Bq=b||0}color(){return this.Zf}priority(){return this.Bq}pu(){const a=this.Yf();a.Zf.multiple(-1);return a}Yf(){const a=new Wk(this.Zf.clone(),this.Bq,this.absolute(),this.$(),this.completed());a.Vr=Ua(this.Vr);return a}QD(a){if(this.absolute()){this.Zf.add(a.Zf);for(let b=0;b=a)return 0;if(1<=a)return 1;const b=this.Z2,c=this.j4,d=1-(b+c),e=1/(b/2+d+c/2);let f=0;0b?b:a,2)/2,a-=b);0d?d:a),a-=d);0a||a>this.duration())throw Error("invalid action's run time");return this.Mt?this.Mt.normalize(a,this.duration(),b):a};function Fl(){}r(Fl,El);function Gl(a){let b=0;a instanceof El&&(b=a.duration());return b}function Hl(){}Hl.prototype.xe=function(a,b,c,d){a.xe(b,c,d)};Hl.prototype.complete=function(a,b,c){if(a instanceof Al)a.xe(b,c);else if(a instanceof El)a.complete(b,c);else throw Error("unknown action");};var Il=null;function Jl(){Il||(Il=new Hl);return Il}function Kl(){}Kl.prototype.xe=function(a,b,c,d){a.tk(b,c,d)}; +Kl.prototype.complete=function(a,b,c){if(a instanceof Al)a.tk(b,c);else if(a instanceof El)a.gD(b,c);else throw Error("unknown action");};var Ll=null;function Ml(){Ll||(Ll=new Kl);return Ll};function Nl(a){this.nc=a||[];this.nO=a?a.slice().reverse():[]}r(Nl,Fl);k=Nl.prototype;k.Fa=-1;k.Ah=function(a){if(0<=this.Fa)throw Error("ActionsSequence was already initialized");this.nc.push(a);this.nO.splice(0,0,a)};k.hK=function(){let a=0;for(let b=0;bthis.Fa&&(this.Fa=this.hK());return this.Fa};k.xe=function(a,b,c){a=this.Xi(a);this.yc(this.nc,Jl(),a,b,c)};k.complete=function(a,b){this.Kh(this.nc,Jl(),a,b)}; +k.tk=function(a,b,c){a=this.Xi(a,!0);this.yc(this.nO,Ml(),a,b,c)};k.gD=function(a,b){this.Kh(this.nO,Ml(),a,b)}; +k.yc=function(a,b,c,d,e){const f=ma(this)+"",g=d.Fd;g.push();var h=0;let l=0,n=d.Dv.get(f);var m;if(m=n)m=n,m=tk(m.$())==tk(e)&&m.time()<=c;m&&(h=n.d3+1,l=n.duration(),g.add(n.Fd));n=null;m=!1;const p=a.length;for(let t=h;ta||a>=this.count()?null:this.Wn[a]};fm.prototype.Kl=function(a){for(let b=0;bb.push(c));return b}function sm(a){if(a.Tc){var b=a.Tc.Ya,c=a.Ya,d=a.zr;c=new Wf(c.left-.5*d,c.top-.5*d,c.width+d,c.height+d);d=Math.abs(b.top-c.top);var e=Math.abs(b.width-c.width),f=Math.abs(b.height-c.height);a.uC=1E-4>Math.abs(b.left-c.left)&&1E-4>d&&1E-4>e&&1E-4>f&&!a.o0}} +class tm{constructor(a,b,c){this.type=a;this.Ya=b;this.zIndex=c;this.Nl=[];this.pr=[];this.Tc=null;this.o0=!1;this.text="";this.Pl=this.Dl=!1;this.rotation=0;this.se=this.vj=void 0;this.zr=0;this.uC=!1;this.Fx=new qm}};var um={hga:"slide",N2:"interaction",V2:"quiz",W2:"scenario"};q("ispring.presenter.presentation.slides.SlideType",um);q("PRESENTATION_SLIDE","slide",um);q("INTERACTION_SLIDE","interaction",um);q("QUIZ_SLIDE","quiz",um);q("SCENARIO_SLIDE","scenario",um);function vm(a,b,c,d,e,f,g){this.T3=a;this.zh=b;this.Va=c;this.Na=d;this.mj=e;this.D3=void 0==f?"":f;this.b$=g;this.vl=1}k=vm.prototype;k.containerId=function(){return this.T3};k.url=function(){return this.zh};k.width=function(){return this.Va};k.height=function(){return this.Na};k.ib=function(){return this.mj*this.vl};k.Kl=function(a){this.vl=a};k.bgColor=function(){return this.D3};k.w2=function(){return this.b$};function wm(){this.Az=[]}wm.prototype.count=function(){return this.Az.length};wm.prototype.Kl=function(a){for(let b=0;b{a.jC.push(e)}),c=!0);c||a.jC.push(b)} +class Am extends dg{constructor(){var a=new em;super("slide");this.fM=!0;this.Uv=new bm(a);this.rV=[];this.Tu=new nm;this.Yd=[];this.jC=[];this.bV=[];this.Po=new ym;this.xz=new fm;this.bL=new wm;this.Sw=[];this.Xg=a}persistState(a){a=super.persistState(a);a.visitedHyperlinks=this.jC;return a}To(a,b){super.To(a,b);this.jC=v(a,"visitedHyperlinks",!1)}yJ(){return this.jC}xD(){return this.Yd}Bh(a){0>Ia(this.Yd,a)&&this.Yd.push(a)}GD(){return this.Po}};function Bm(a,b){this.ya=a;this.Ht=b}k=Bm.prototype;k.Za=null;k.cJ=function(a){this.Za=a};function Cm(a,b){return Sf(a.ya.Dd(),b)}function Dm(a,b){return Sf(a.ya.ie(),b)}k.playVideo=function(a,b,c){a=Dm(this,a);if(null!=this.Ht.Wa&&a){var d=this.Za;Em(d,a,d.Y.timestamp(),null!=b?b:null,c||!1)}};k.stopVideo=function(a,b){a=Dm(this,a);null!=this.Ht.Wa&&a&&Fm(this.Za,a,b)}; +k.pauseVideo=function(a,b){a=Dm(this,a);if(null!=this.Ht.Wa&&a){var c=this.Za;const d=Gm(c,a);d.playing()?(d.pause(),c.Vl==d&&(c.Vl=null)):Em(c,a,c.Y.timestamp(),null,b||!1)}};function Hm(a,b,c,d,e){this.Tb=a;this.L3=b;this.M3=c;this.S8=d;this.T8=e}k=Hm.prototype;k.id=function(){return this.Tb};k.clientX=function(){return this.L3};k.clientY=function(){return this.M3};k.screenX=function(){return this.S8};k.screenY=function(){return this.T8};function Im(a,b){this.jL=a;this.T9=b}function Jm(a){const b=[];for(let c=0;cd&&(d=h,e=g)}return e?(c.eu().defaultPrevented?e.nr():e.WH(c),!0):!1}function Qm(a,b){a.Lk[b.Hx()]=b}function Wm(a,b){b=b.Hx();b in a.Lk&&delete a.Lk[b]}function Xm(a,b){return b in a.Lk?a.Lk[b]:null};function Ym(){this.VB=new C;this.eU=new C;this.kP=new C;this.jP=new C}k=Ym.prototype;k.Do=null;k.EH=!1;k.Hx=function(){return"tap"};k.nI=function(a,b){if("touchEnd"==a)return this.EH?1:0;const c=new Xc(b.touches()[0].clientX(),b.touches()[0].clientY());if("touchStart"==a&&1==b.touches().length)return this.Do=c,this.EH=!0,this.kP.C(),vj||ve(window,"scroll",this.nr,!1,this),0;if(!this.Do)return 0;50>=$c(c,this.Do)||this.EH&&this.nr();return 0}; +k.WH=function(a){this.VB.C(this.Do.x,this.Do.y,a.eu());let b=!1;const c=Date.now();this.IV&&1E3>c-this.IV&&50>=$c(this.r5,this.Do)&&(b=!0,this.eU.C(this.Do.x,this.Do.y,a.eu()));this.IV=b?null:c;this.r5=this.Do};k.nr=function(){De(window,"scroll",this.nr,!1,this);this.EH=!1;this.jP.C()};var Zm={},$m=!1,an=-1;function bn(a){return a in Zm?Zm[a]:null}function cn(a,b,c,d,e){this.Na=a;this.A$=b;this.l_=c;this.F3=d||!1;this.h5=e||!1}cn.prototype.height=function(){return this.Na};cn.prototype.HS=function(){return this.A$};cn.prototype.bold=function(){return this.F3};cn.prototype.italic=function(){return this.h5};function dn(a){a=a||document.styleSheets;for(var b=[],c=en(a),d=0;a=c[d];d++){var e=fn(a);if(e&&e.length)for(var f=0,g=0,h=e.length,l;gparseInt(Vb,10);let d=Ib,e;d&&(e=parseInt(Vb,10),11<=e&&(d=!1));const f=a.content();a=f.querySelectorAll("span");const g=new Ln(()=>{yn(f)});for(let w=0;wl.length)continue;h=3;if(0<=l[0].search("rgb")||0<=l[0].search("#"))h=0;var n= +l.splice(h,l.length-3).join(""),m=parseFloat(l[2]);l=parseFloat(D.top)||0;h=parseFloat(D.left)||0;let I=1,A=1;var p=0,t=D.msTransform;t&&(t=t.match(/matrix\(\s*([\d.-]+),\s*([\d.-]+),\s*([\d.-]+),\s*([\d.-]+),\s*[\d.-]+,\s*[\d.-]+\s*\)/))&&5==t.length&&(I=parseFloat(t[1]),A=parseFloat(t[4]),p=parseFloat(t[3]));if(10>e)y.style.color=n,0null!=d.onclick)&&(b=new Mn,this.Ot.C(a.Nu,b),b.actionPrevented()&&c.preventDefault())}};function Sn(a,b){this.C5=a;this.ZV=b||null}var Tn=[];Sn.prototype.ZV=null;Sn.prototype.Wx=function(){return this.C5};Sn.prototype.yi=function(){return this.ZV};function Un(a,b,c,d,e,f,g,h){this.ID=a;this.KD=b;this.x1=c;this.y1=d;this.x2=e;this.y2=f;this.JD=g;this.LD=h}Un.prototype.clone=function(){return new Un(this.ID,this.KD,this.x1,this.y1,this.x2,this.y2,this.JD,this.LD)};Un.prototype.Pm=function(a){return this.ID==a.ID&&this.KD==a.KD&&this.x1==a.x1&&this.y1==a.y1&&this.x2==a.x2&&this.y2==a.y2&&this.JD==a.JD&&this.LD==a.LD};function Vn(a,b){const c=zd("canvas");void 0!==a&&(c.width=a);void 0!==b&&(c.height=b);return c}function Wn(a,b){b=b instanceof gm?[b.pd,b.ge,b.fe,b.Od,b.ve,b.we]:b;a.transform(b[0],b[1],b[2],b[3],b[4],b[5])};function Xn(a,b,c){this.iq=a;this.Id=this.Nh(b||100,c||100);this.kg=this.Id.getContext("2d");this.kg.fillStyle="rgba(255,255,255,1)";this.Vv=Yn}Xn.prototype.Vv="";Xn.prototype.Yz=!1;Xn.prototype.Nh=function(a,b){return Vn(a,b)};Xn.prototype.apply=function(a,b){const c=a.getContext("2d");c.save();this.oj(this.Yz?1-b:b);b=this.Id;c.scale(a.width/b.width,a.height/b.height);c.globalCompositeOperation=this.Vv==Yn?"destination-in":"destination-out";c.drawImage(b,0,0);c.restore()}; +function Zn(a){a.kg.clearRect(-a.Id.width,-a.Id.height,2*a.Id.width,2*a.Id.height)}function $n(a,b){const c=a.Id.width,d=a.Id.height;a=a.kg;switch(b){case ao[90]:a.rotate(.5*Math.PI);a.translate(0,-d);break;case ao[180]:a.rotate(Math.PI);a.translate(-c,-d);break;case ao[270]:a.rotate(1.5*Math.PI),a.translate(-c,0)}}var Yn="maskIn",ao={0:"0",90:"90",180:"180",270:"270"};function bo(a){Xn.call(this,a);a=a.yi();a&1&&$n(this,ao[90]);a&4&&(this.Vv="maskOut",this.Yz=!0)}r(bo,Xn);bo.prototype.oj=function(a){const b=this.Id;Zn(this);a*=b.width;this.kg.fillRect(b.width/2-a/2,0,a,b.height)};function co(a,b,c,d){Xn.call(this,a,102,102);this.P3=d;this.I8=c;b||$n(this,ao[90]);a=Math.ceil(this.Id.width/d);c=Math.ceil(this.Id.height/c);this.yz=this.Nh(a,c);this.OG=this.Nh(this.Id.width+a,c)}r(co,Xn); +co.prototype.oj=function(a){Zn(this);var b=this.yz.width,c=this.yz.height,d=this.yz.getContext("2d");d.clearRect(0,0,b,c);d.fillStyle="rgba(255,255,255,1)";d.fillRect(0,0,b*a,c);a=this.OG.getContext("2d");a.clearRect(0,0,this.OG.width,this.OG.height);b=this.yz;for(c=0;ca;++a)this.IN.push(mo(100)),this.HN.push(this.Nh(20,20));const b=mo(25);for(a=0;aa;++a)for(c=20*a,d=0;5>d;++d)b.drawImage(this.HN[this.Y7[5*a+d]],c,20*d)};function no(a){Xn.call(this,a);a.yi()&2&&$n(this,ao[90]);this.wY=Fk(Ek(0,100));db(this.wY)}r(no,Xn);no.prototype.oj=function(a){Zn(this);const b=this.kg,c=this.Id.width;a=Math.floor(100*a);for(let d=0;dd;++d)c.fillRect(0,6*d,b?6*(16-d-1):6*d,6);a&32&&$n(this,ao[180])}r(oo,Xn);oo.prototype.oj=function(a){Zn(this);this.kg.drawImage(this.WZ,-192*(1-a),0)};function po(a){Xn.call(this,a);a.yi()&16&&(this.Vv="maskOut",this.Yz=!0);$n(this,ao[270])}r(po,Xn);po.prototype.oj=function(a){Zn(this);const b=this.kg;a*=Math.PI;const c=this.Id.width;b.save();b.translate(c/2,c/2);b.beginPath();b.moveTo(0,0);b.arc(0,0,c,-a,a,!1);b.lineTo(0,0);b.fill();b.restore()};function qo(a,b){Xn.call(this,a);this.HT=a.yi();b||(this.Vv="maskOut",this.Yz=!0);$n(this,ao[270])}r(qo,Xn);qo.prototype.oj=function(a){Zn(this);const b=this.kg,c=this.Id.width,d=2*Math.PI/this.HT;a*=d;b.save();b.translate(c/2,c/2);b.beginPath();for(let e=0;e=c&&0<=e&&255>=e&&0<=d&&255>=d){c=[c,e,d];break a}}c=[]}if(c.length)return b.pI=Uk(c[0],c[1],c[2]),b.type="rgb",b;if(Go&&(c=Go[a.toLowerCase()]))return b.pI=c,b.type="named",b;throw Error(a+" is not a valid color string");}var Lo=/#(.)(.)(.)/; +function Jo(a){if(!Io.test(a))throw Error("'"+a+"' is not a valid hex color");4==a.length&&(a=a.replace(Lo,"#$1$1$2$2$3$3"));return a.toLowerCase()}function Mo(a){a=Jo(a);a=parseInt(a.slice(1),16);return[a>>16,a>>8&255,a&255]}function Uk(a,b,c){a=Number(a);b=Number(b);c=Number(c);if(a!=(a&255)||b!=(b&255)||c!=(c&255))throw Error('"('+a+","+b+","+c+'") is not a valid RGB color');b=a<<16|b<<8|c;return 16>a?"#"+(16777216|b).toString(16).slice(1):"#"+b.toString(16)} +function Vk(a,b,c){0>c?c+=1:16*c?a+6*(b-a)*c:1>2*c?b:2>3*c?a+(b-a)*(2/3-c)*6:a}var Io=/^#(?:[0-9a-f]{3}){1,2}$/i,Ko=/^(?:rgb)?\((0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2})\)$/i;function No(){}r(No,Do);No.prototype.ln=function(a,b){No.Mb.ln.call(this,a,b);Eo(this,a,b.context());var c=b.context();try{const d=Fh(a,"backgroundColor"),e=a.style.width,f=a.style.height;if(""!=d&&"transparent"!=d&&""!=e&&""!=f){const g=Ho(d);c.save();c.fillStyle=g.pI;c.fillRect(0,0,parseFloat(e),parseFloat(f));c.restore()}}catch(d){}"block"==ia.window.getComputedStyle(a,null).display&&(b.KK=0)};function Ro(){}r(Ro,Do);Ro.prototype.ln=function(a,b){Ro.Mb.ln.call(this,a,b);Eo(this,a,b.context());try{if(a.complete&&0{var e=d=d.clone(),f=-d.we;e.ve+=-d.ve;e.we+=f;hm(b,d)});return b} +function Vo(a,b,c,d){const e=parseFloat(c.fontSize);let f=parseFloat(c.letterSpacing);var g=parseFloat(c.lineHeight);isNaN(g)&&(g=parseFloat(c.height));var h=bn(c.fontFamily);!h||isNaN(g)?isNaN(g)?(a.textBaseline="alphabetic",g=e):(a.textBaseline="middle",g*=.5):(a.textBaseline="alphabetic",g=.5*(e*h.height()+g)-e*(h.HS()+h.l_));if(isNaN(f))a.fillText(b,0,g),b=a.measureText(b).width;else{const l=[];let n=0;for(h=0;ha.indexOf("http://www.w3.org/2000/svg")&&(a=']*>/g,"").replace(/<\/a>/g,"")}k.P1=function(){};function $o(){this.Go={};this.aK=this.p4.bind(this)}$o.prototype.nT=null;$o.prototype.EV=null;$o.prototype.rK=null;$o.prototype.p4=function(){const a=this.Go,b=this.EV;let c;for(;c=b.next();){const d=a[c.nodeName.toLowerCase()],e=d.async(),f=this.nT;b.a1()?e?d.k0(f,this.aK):d.s2(f):e?d.l0(c,f,this.aK):d.ln(c,f);if(e)return}c||this.rK&&this.rK()}; +function ap(a,b,c,d){const e=b.getContext("2d");e.clearRect(0,0,b.width,b.height);d&&(b.setAttribute("data-scale-x",d.width),e.scale(d.width,d.height));b=new $o;b.Go.div=new No;b.Go.a=new No;b.Go.img=new Ro;b.Go.span=new To;b.Go.svg=new Wo;b.Go.canvas=new Fo;b.Go.video=new Fo;b.nT=new Co(e);e.ux=[];b.rK=c||null;b.EV=new bp(a,b.Go,b.aK)} +function bp(a,b,c){this.jb=[];const d=new Fn(a),e=this;setTimeout(()=>{const f=new Bo(a);for(;;){var g=f.next();if(g.done)break;g=g.value;if(g!==a){var h=g.nodeName.toLowerCase();if(h in b){var l=f.UC();h=b[h];const n=g.hasAttribute("data-draw-ignore");l&&!h.isVisible(g)||n?(g=f,l=g.Dh?-1:1,g.Gh==l&&(g.Gh=-1*l,g.depth+=g.Gh*(g.Dh?-1:1))):(l&&h.P1(g),e.jb.push({element:g,UC:l}))}}}Jn(d);c()},0)}bp.prototype.Oh=-1; +bp.prototype.next=function(){this.Oh{var f=b.iq;var g=ma(f)+"";g in vo?g=vo[g]:(f=wo(f),g=vo[g]=f);g.apply(e,b.progress());yi(e,"50% 50%");on(e,a.B5);yo(d,!0)}),c&&.1>b.progress()&&yo(d,!0)):(d.Fq=null,d.bE&&(yo(d,!1),Ib&&qp(a)))}function qp(a){if(a=a.Vd.querySelector("video")){const b=Ld(a),c=Qh(b);c.width&&(Oh(b,c.width+1),setTimeout(()=>{Oh(b,c.width)},0))}} +function lp(a,b,c){c=c||a.Vd;a=jc(b.ji);for(let d=0;d{const f=e.getContext("2d");try{const g=f.getImageData(0,0,e.width,e.height),h=g.data;for(e=0;e=e&&g<=f&&c.xe(b,d.add(g))}};function Pp(a,b){this.Xg=a;this.fk=b;this.ze=new Qp(Ql(b.wt),a);this.jW=[new Kp(b),new Np(b)];this.X3=new Kk;this.reset(0);this.ix=new C}k=Pp.prototype;k.Md=0;k.Ay=function(){return this.ix};k.timeline=function(){return this.fk};k.time=function(){return this.Md};k.resume=function(a){const b=Lp(this.ze);b&&vk(Mp(this.ze,b),this.Md,a)}; +k.seek=function(a,b){if(aa)break}else if(l=h.Ak(),l.required())break;else f=new uk(tk(f.add(g))),this.ze.Bh(l,f),f=f.Rq,a-=g,g=0}this.Md=a;b=new yl(b,this.X3);for(h=0;h{a.push(c.id())},this);const b=[];u(this.cC,c=>{b.push(c.persistState())},this);return{t:a,at:b}};Qp.prototype.Bh=function(a,b){b.ND=this.ND[this.cC.length];this.Yd.push(a);this.cC.push(b)}; +function Mp(a,b){b=Ia(a.Yd,b);if(0>b)throw Error("trigger wasn't activated");return a.cC[b]}function Lp(a){const b=a.Yd.length;return 0{b=b.$();c=c.$();return!!b!=!!c?b?1:-1:b&&c?tk(b)-tk(c):0})};function Zp(a){const b=a.ya;var c=b.Uv;if(!c)throw Error("slide must contain main timeline");$p(a);a.ig=new Pp(b.Xg,c);a.ig.Ay().addHandler(()=>{a.ix.C(a.Ld)});c=b.rV;a.Sk=[];for(let d=0;d{a.ix.C(a.Ld)})}} +function $p(a){a.ya.fM&&a.ya.Tu.Mc().forEach(b=>{if(!a.UL.includes(b.id())){var c=a.Ep.get(b.id());aq(a,b)&&(jl(c,"moveX",!0).add(new bl(b.Ya().left,!0)),jl(c,"moveY",!0).add(new bl(b.Ya().top,!0)));if(c=(c=sp(a.R_,b,c))?c.S4:null)c=new Up(b.id(),c),a.ya.Uv.RL.Ah(c),a.ya.Uv.wt.Ah(b.id(),new Vp(0),0),a.UL.push(b.id())}})}function aq(a,b){return!a.ya.Sw.find(c=>c.Tc&&c.Tc.id==b.id()||!!c.Nl.find(d=>d.id==b.id()))}function bq(a,b){a&&(a.reset(b),a.timeline().wt.reset())} +function cq(a){if(!a.ig)throw Error("animation controller isn't activated");}function dq(a){return"completed"==a.ig.playbackState().state()?a.ya.sb().count()-1:a.ig.ze.Yd.length-1-1}function eq(a){if(a.Sk){const b=a.Bn();for(let c=0;cb.Ba()||c!=a.Ld?!1:!0} +class gq{constructor(a,b,c,d,e){this.ya=a;this.Y=c;this.Ee=e;this.ix=new C;this.Ld=a.index();this.Ep=new xl;this.R_=new rp(a,b);this.J5=new tp(d);this.Sk=this.ig=null;this.Nb=!1;this.UL=[];a.Sw.forEach(f=>rm(f).forEach(g=>this.Ep.set(g.id,g.state)))}Ay(){return this.ix}persistState(){const a=[];u(this.Sk,b=>{a.push(b.persistState())},this);return{m:this.ig.persistState(),i:a}}restoreState(a){this.ig||Zp(this);this.ig.restoreState(a.m);this.WI(a);this.Jo(0,0)}WI(a){u(a.i,(b,c)=>{this.Sk[c].restoreState(b)})}reset(a, +b){void 0===a&&(a=-1);void 0===b&&(b=0);this.ig||Zp(this);this.EG=this.Bn();this.nY=a;this.oY=b;bq(this.ig,this.EG);0<=a&&(this.Jo(0,0),this.seek(a,b));this.Jo(0,0,!1)}SI(){this.ya.Tu.Mc().some(a=>!this.UL.includes(a.id()))&&(this.ya.Uv.RL.Fa=-1,$p(this),this.reset(0,0))}activate(){if(this.Nb)throw Error("already activated");this.Nb=!0;this.Y.Zb().addHandler(this.Ab,this);this.Y.Ml().addHandler(this.DW,this)}deactivate(){cq(this);this.Nb=!1;this.Y.Zb().removeHandler(this.Ab,this);this.Y.Ml().removeHandler(this.DW, +this)}play(){cq(this);this.ig.resume(this.Bn())}pause(){cq(this)}Jo(a,b,c){var d=[];c=void 0!==c?c:this.Y.Kg();a=this.ig.Ji(a,this.Ep,c);d.push(a);for(a=0;a +w.level())p=w;m=p}else if(m instanceof Xk){m=Yp(p);p=null;for(t=0;t=this.ig.ze.Yd.length?0:this.ig.time();if(a>d||a==d&&(void 0===b||e<=b)){for(;dq(this)!=a;)this.ig.sx("__step",c),e=0;void 0!== +b&&0e)){c=c.ik();const f=[];for(let g=0;g=d&&l<=e&&f.push(h)}d=f;for(e=0;e{(e=kk(a.pa,e.PX))?(lq(d,e),b=!0):c=!0});a.RP=b&&!c}function mq(a){kq(a,b=>b.LR())}function nq(a){kq(a,b=>{b.stop();Lj&&b.qQ()})}function oq(a){kq(a,b=>pq(b));a.RP=!1}function kq(a,b){const c=a.Wa.me;a.ya.ie().Mc().forEach(d=>{if(!(0b?a.Gp:a.M[b]).pl)}Cu(a){Th(this.slide(),a)}width(){return this.Va}height(){return this.Na}slide(){return this.ya}clone(){return this.Yf}Iv(a){Oq(this,a.yb,a.slideBackground()); +Pq(this)}Ir(){this.Uc();this.ya=zd("DIV");F(this.ya,"position","absolute");this.Rw=zd("DIV");F(this.Rw,"position","absolute");this.ya.appendChild(this.Rw);Qq(this,this.Hv);this.cH=zd("DIV");F(this.cH,"position","absolute");this.ya.appendChild(this.cH);this.cH.appendChild(this.yb);this.pl.appendChild(this.ya);Pq(this)}$0(a){Qq(this,a);this.ya&&Pq(this)}rI(){return this.Hv}Uc(){this.ya&&(Fd(this.ya),this.ya=null)}content(){return this.cH}background(){return this.Rw}hX(a){this.Iv(a)}resize(a,b){if(this.Va!= +a||this.Na!=b)this.Va=a,this.Na=b,this.Gw(a,b)}Gw(a,b){a=Math.min(a/this.FX,b/this.EX,this.aW);this.yb&&Rq(this,this.yb,a);this.Co&&Rq(this,this.Co,a)}};class Tq{constructor(a){this.c4=a}displayObject(){return this.c4}};class Uq{constructor({nk:a,MD:b}){this.oh=a.concat();this.bQ=b.concat()}nk(){return this.oh.concat()}MD(){return this.bQ.concat()}persistState(){const a={};a.indexes=this.oh;a.zoomStates=this.bQ;return a}sQ(){return new Uq({nk:this.oh,MD:this.bQ})}};function Vq(a){for(let b=a.Si.length-1;0<=b;--b)if(a.Si[b])return a.Si[b];return null}function Wq(a,b=null){a.YD=b?new Tq(b):null;a.Ps=null}function Xq(a,b){const c=[];for(let d=0;dd.includes(e))} +function Zq(a,b,c,d,e,f){function g(l){if(e&&!f.la(c).visible())return l;for(;l{Kq(a.Yl,a.ni,g,c,l=>{a.IZ.set(a.gH[e],l);h(l)},f.rI())})} +function gr(a,b,c,d,e,f){const g=a.Da.$().timestamp(),h=er(g,b,f,d,e);if(a.sE[h])return Promise.resolve(a.RT.get(a.sE[h]));a.sE[h]={hash:h};const l=a.zc.Gd[c],n=fr(a,c);return new Promise(m=>{Mq(a.Yl,a.ni,n,e,d,f,p=>{a.RT.set(a.sE[h],p);p.setAttribute("id",b);m(p)},l.rI())})} +function hr(a,b,c){function d(){return new Promise(n=>{dr(l,h).then(m=>{l.Rb.WR(m);c.WR(l.Rb.fR());n()})})}function e(){return new Promise(n=>{gr(l,g.id(),h,g.Ya(),g.rotation(),[g.xy()]).then(m=>{l.Rb.YD=new Tq(m);n()})})}b=0<=b?a.M.la(b):void 0;var f=b instanceof cr||b instanceof tq||b instanceof Bq;if(!c||f)return Promise.resolve();const g=c.effect(),h=c.Qr(),l=a;g&&g.hn()&&(Wq(a.Rb),a.Rb.tV.C(b));b=g&&!g.hn()&&!c.oa();f=!!c.sp();a=[];if(f&&b)b=new Promise(n=>{d().then(()=>{e().then(()=>{n()})})}), +a.push(b);else if(f||b)f&&(f=d(),a.push(f)),b&&(b=e(),a.push(b));return Promise.all(a)}function er(a,b,c,d,e){c=c.join(",");a=[a.Ba(),a.ib(),b,c];d&&a.push(d.toString());void 0!==e&&a.push(e);return a.join("_")}function fr(a,b){const c=a.zc.Gd[b];b=a.M.la(b);var d=c.CZ;b.fM=!1;d=new br({content:d,xD:b.xD()});a=new qq(b,d,a.Da,a.Ee);a.tI();var e=a.sb();d=e.sc(e.count()-1);e=e.count()-1;d=d.duration();a.Se.activate();a.Se.reset(e,1E3*d);b.fM=!0;return c.clone()} +class ir{constructor({Vca:a,kn:b,Hda:c,Wo:d,slides:e,aI:f,JI:g}){this.ni=a;this.zc=b;this.Da=d;this.M=e;this.Wa=f;this.Ee=g;this.Yl=new Nq;this.IZ=new WeakMap;this.gH={};this.RT=new WeakMap;this.sE={};this.Rb=c;this.Pz={}}};function jr(a){this.sa=a.content;this.V3=""==a.contentHover?a.content:a.contentHover;this.zh=a.url;this.Va=a.width;this.Na=a.height;this.c$=a.zy;this.o5=a.language;this.f4=a.yx;this.e4=a.xx;this.g4=a.zx;this.h4=a.Ax}k=jr.prototype;k.content=function(){return this.sa};k.contentHover=function(){return this.V3};k.url=function(){return this.zh};k.width=function(){return this.Va};k.height=function(){return this.Na};k.zy=function(){return this.c$};k.language=function(){return this.o5};k.yx=function(){return this.f4}; +k.xx=function(){return this.e4};k.zx=function(){return this.g4};k.Ax=function(){return this.h4};function kr(a){jr.call(this,a)}r(kr,jr);class lr{constructor(a,b,c){this.$h=a;this.y5=b;this.k$=[].concat(c)}name(){return this.$h}localName(){return this.y5}urls(){return this.k$}};class mr{constructor(){this.ZA=[]}count(){return this.ZA.length}U0(a){if(0>a||a>=this.count())throw Error("index is out of range");return this.ZA[a]}J$(a){this.ZA.push(a)}}mr.prototype.getPresenter=mr.prototype.U0;mr.prototype.count=mr.prototype.count;class nr{constructor(a,b){this.Jf=a;this.hs=b;this.th=1;this.zh=null;this.Uq="_self"}src(){return this.Jf}Ya(){return this.hs}opacity(){return this.th}Rf(a){this.th=a}url(){return this.zh}target(){return this.Uq}};class or{constructor(){this.Wu={}}FQ(a){return a in this.Wu}};var pr={Ida:"activated",Cea:"deactivated",KS:"buffering"};q("ispring.presenter.presentation.narration.NarrationTrackPlaybackState",pr);q("ACTIVATED","activated",pr);q("DEACTIVATED","deactivated",pr);q("BUFFERING","buffering",pr);function qr(a,b){a.ii!=b&&(a.ii=b,a.VX.C(a))}class rr{constructor(a,b,c){this.Am=a;this.hL=b;this.Le=void 0!==c?c:1;this.ii="deactivated";this.VX=new C}Lb(){return this.Am}qf(){return this.hL}volume(){return this.Le}playbackState(){return this.ii}playbackStateChangedEvent(){return this.VX}}rr.prototype.playbackStateChangedEvent=rr.prototype.playbackStateChangedEvent;rr.prototype.playbackState=rr.prototype.playbackState;rr.prototype.endTimestamp=rr.prototype.qf;rr.prototype.startTimestamp=rr.prototype.Lb;class sr extends rr{constructor(a,b,c,d){super(b,c,d);this.o3=a}audio(){return this.o3}}sr.prototype.audio=sr.prototype.audio;class tr{constructor(){this.Fm=[]}get v2(){return this.Fm}count(){return this.Fm.length}NC(a){if(0>a||a>=this.count())throw Error("index is out of range");return this.Fm[a]}}tr.prototype.getTrack=tr.prototype.NC;tr.prototype.count=tr.prototype.count;class ur extends tr{S0(a){return this.NC(a)}d0(a){this.Fm.push(a)}Mc(){const a=[];for(let b=0;ba||a>=this.count())throw Error("index is out of range");return this.Ew[a]}Mc(){return this.Ew}}zr.prototype.getReference=zr.prototype.SQ;zr.prototype.count=zr.prototype.count;class Ar{constructor(){this.Ew=new zr}Ai(){return this.Ew}}Ar.prototype.references=Ar.prototype.Ai;class Br{constructor(){this.Hb=!1}enabled(){return this.Hb}qa(a){this.Hb=a}};class Cr{constructor(){this.zz=!0}fitToWindow(){return this.zz}}Cr.prototype.fitToWindow=Cr.prototype.fitToWindow;var Dr={$ea:"free",wga:"restricted",Qga:"sequential"};q("ispring.presenter.presentation.settings.NavigationType",Dr);q("FREE","free",Dr);q("RESTRICTED","restricted",Dr);q("SEQUENTIAL","sequential",Dr);class Er{constructor(){this.N5=new vg;this.eA=new ug;this.E4=new pg;this.Qn="free"}Um(){return this.N5}keyboard(){return this.eA}Gx(){return this.E4}navigationType(){return this.Qn}YR(a){this.Qn=a}}Er.prototype.navigationType=Er.prototype.navigationType;Er.prototype.mouse=Er.prototype.Um;var Fr={jga:"prompt",Lda:"always",yfa:"never"};q("ispring.presenter.presentation.settings.PresentationResumeMode",Fr);q("PROMPT_TO_RESUME","prompt",Fr);q("ALWAYS_RESUME","always",Fr);q("NEVER_RESUME","never",Fr);class Gr{constructor(){this.PG=this.Fp=this.WV=!1;this.Iw="never"}Tm(){return this.WV}Oca(a){this.WV=a}mf(){return this.Fp}bJ(a){this.Fp=a}wu(){return this.Iw}NR(){return this.PG}}Gr.prototype.resumeMode=Gr.prototype.wu;Gr.prototype.autoStart=Gr.prototype.mf;Gr.prototype.loopPlayback=Gr.prototype.Tm;var Hr={Kea:["BC","AD"],Jea:["Before Christ","Anno Domini"],wfa:"JFMAMJJASOND".split(""),kha:"JFMAMJJASOND".split(""),sfa:"January February March April May June July August September October November December".split(" "),jha:"January February March April May June July August September October November December".split(" "),Uga:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),mha:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),Sha:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "), +oha:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),Wga:"Sun Mon Tue Wed Thu Fri Sat".split(" "),nha:"Sun Mon Tue Wed Thu Fri Sat".split(" "),xfa:"SMTWTFS".split(""),lha:"SMTWTFS".split(""),Vga:["Q1","Q2","Q3","Q4"],oga:["1st quarter","2nd quarter","3rd quarter","4th quarter"],Mda:["AM","PM"],Aea:["EEEE, MMMM d, y","MMMM d, y","MMM d, y","M/d/yy"],Bha:["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],Bea:["{1} 'at' {0}","{1} 'at' {0}","{1}, {0}","{1}, {0}"],K2:6,Tha:[5,6], +L2:5},Ir=Hr;Ir=Hr;function Jr(a,b,c,d,e,f){"string"===typeof a?(this.zj=a==Kr?b:0,this.uj=a==Lr?b:0,this.days=a==Mr?b:0,this.mk=a==Nr?b:0,this.pk=a==Or?b:0,this.uk=a==Pr?b:0):(this.zj=a||0,this.uj=b||0,this.days=c||0,this.mk=d||0,this.pk=e||0,this.uk=f||0)} +Jr.prototype.vJ=function(){var a=Math.min(this.zj,this.uj,this.days,this.mk,this.pk,this.uk),b=Math.max(this.zj,this.uj,this.days,this.mk,this.pk,this.uk);if(0>a&&0a&&b.push("-");b.push("P");this.zj&&b.push(Math.abs(this.zj)+"Y");this.uj&&b.push(Math.abs(this.uj)+"M");this.days&&b.push(Math.abs(this.days)+"D");if(this.mk||this.pk||this.uk)b.push("T"),this.mk&&b.push(Math.abs(this.mk)+"H"),this.pk&&b.push(Math.abs(this.pk)+"M"),this.uk&&b.push(Math.abs(this.uk)+ +"S");return b.join("")};Jr.prototype.Pm=function(a){return a.zj==this.zj&&a.uj==this.uj&&a.days==this.days&&a.mk==this.mk&&a.pk==this.pk&&a.uk==this.uk};Jr.prototype.clone=function(){return new Jr(this.zj,this.uj,this.days,this.mk,this.pk,this.uk)};var Kr="y",Lr="m",Mr="d",Nr="h",Or="n",Pr="s";Jr.prototype.add=function(a){this.zj+=a.zj;this.uj+=a.uj;this.days+=a.days;this.mk+=a.mk;this.pk+=a.pk;this.uk+=a.uk}; +function Qr(a,b,c){"number"===typeof a?(this.jc=Rr(a,b||0,c||1),Sr(this,c||1)):la(a)?(this.jc=Rr(a.getFullYear(),a.getMonth(),a.getDate()),Sr(this,a.getDate())):(this.jc=new Date(wa()),a=this.jc.getDate(),this.jc.setHours(0),this.jc.setMinutes(0),this.jc.setSeconds(0),this.jc.setMilliseconds(0),Sr(this,a))}function Rr(a,b,c){b=new Date(a,b,c);0<=a&&100>a&&b.setFullYear(b.getFullYear()-1900);return b}k=Qr.prototype;k.O0=Ir.K2;k.Q0=Ir.L2; +k.clone=function(){var a=new Qr(this.jc);a.O0=this.O0;a.Q0=this.Q0;return a};k.getFullYear=function(){return this.jc.getFullYear()};k.getYear=function(){return this.getFullYear()};k.getMonth=function(){return this.jc.getMonth()};k.getDate=function(){return this.jc.getDate()};k.getTime=function(){return this.jc.getTime()};k.getDay=function(){return this.jc.getDay()};k.getUTCFullYear=function(){return this.jc.getUTCFullYear()};k.getUTCMonth=function(){return this.jc.getUTCMonth()};k.getUTCDate=function(){return this.jc.getUTCDate()}; +k.getUTCDay=function(){return this.jc.getDay()};k.getUTCHours=function(){return this.jc.getUTCHours()};k.getUTCMinutes=function(){return this.jc.getUTCMinutes()};k.getTimezoneOffset=function(){return this.jc.getTimezoneOffset()};k.set=function(a){this.jc=new Date(a.getFullYear(),a.getMonth(),a.getDate())};k.setFullYear=function(a){this.jc.setFullYear(a)};k.setYear=function(a){this.setFullYear(a)};k.setMonth=function(a){this.jc.setMonth(a)};k.setDate=function(a){this.jc.setDate(a)};k.setTime=function(a){this.jc.setTime(a)}; +k.setUTCFullYear=function(a){this.jc.setUTCFullYear(a)};k.setUTCMonth=function(a){this.jc.setUTCMonth(a)};k.setUTCDate=function(a){this.jc.setUTCDate(a)}; +k.add=function(a){if(a.zj||a.uj){var b=this.getMonth()+a.uj+12*a.zj,c=this.getYear()+Math.floor(b/12);b%=12;0>b&&(b+=12);a:{switch(b){case 1:var d=0!=c%4||0==c%100&&0!=c%400?28:29;break a;case 5:case 8:case 10:case 3:d=30;break a}d=31}d=Math.min(d,this.getDate());this.setDate(1);this.setFullYear(c);this.setMonth(b);this.setDate(d)}a.days&&(c=this.getYear(),b=0<=c&&99>=c?-1900:0,a=new Date((new Date(c,this.getMonth(),this.getDate(),12)).getTime()+864E5*a.days),this.setDate(1),this.setFullYear(a.getFullYear()+ +b),this.setMonth(a.getMonth()),this.setDate(a.getDate()),Sr(this,a.getDate()))};k.vJ=function(){var a=this.getFullYear();const b=0>a?"-":1E4<=a?"+":"";return[b+kd(Math.abs(a),b?6:4),kd(this.getMonth()+1,2),kd(this.getDate(),2)].join("")+""};k.Pm=function(a){return!(!a||this.getYear()!=a.getYear()||this.getMonth()!=a.getMonth()||this.getDate()!=a.getDate())};k.toString=function(){return this.vJ()};function Sr(a,b){a.getDate()!=b&&a.jc.setUTCHours(a.jc.getUTCHours()+(a.getDate()=this.i2.valueOf()&&a.valueOf()<=this.GC.valueOf()};Ur.prototype.iterator=function(){return new Vr(this)};function Vr(a){this.oR=a.getStartDate().clone();this.GC=Number(a.GC.vJ())}r(Vr,zk);Vr.prototype.next=function(){if(Number(this.oR.vJ())>this.GC)return Ak;var a=this.oR.clone();this.oR.add(new Jr(Mr,1));return Bk(a)};function Wr(a,b){a.e_=b}class Xr{constructor(){this.GN=void 0;this.dU=this.e_=null}password(){return this.GN}yy(){return this.e_}fI(){return this.dU}};function Yr(){}Yr.prototype.zZ=null;Yr.prototype.eY=null;Yr.prototype.kJ=function(){return this.zZ};function Zr(a,b){a.zZ=b}Yr.prototype.NI=function(){return this.eY};function $r(a,b){a.eY=b}function as(a,b){this.zh=a;this.Uq=b}as.prototype.url=function(){return this.zh};as.prototype.target=function(){return this.Uq};as.prototype.open=function(){fh(this.zh,{target:this.Uq})};class bs{constructor(){this.FM=new Er;this.ON=new Gr;this.l3=new Cr;this.I=this.cF=this.Xa=null;this.Oq="";this.w$=new Yr;this.r8=new Xr;this.c3=new Br}navigation(){return this.FM}Vc(){return this.ON}kr(){return this.l3}qJ(){return this.Oq}skin(){return this.Xa}ga(){return this.I}RR(a){this.I=a}Qu(){return this.w$}gy(){return this.r8}Yt(){return this.c3}}bs.prototype.i18n=bs.prototype.ga;bs.prototype.skin=bs.prototype.skin;bs.prototype.appearance=bs.prototype.kr;bs.prototype.playback=bs.prototype.Vc;function cs(){this.bP=[]}cs.prototype.count=function(){return this.bP.length};cs.prototype.add=function(a){this.bP.push(a)};function ds(a,b){const c=a.count();for(let d=0;d{hr(a.RH,b,n).then(()=>{a.QU(b,c,d,e,f,g,h,l,n);m&&a.Rb.reset();a.TF&&a.TF();a.TF=null})},t=n?n.Qr():b,w=a.M.la(t);!n||w.uf()?p():(a.jf.ql.addHandler(y=>{y.index()===t&&p()}),a.jf.Au(t))} +function qs(a,b=!0){if(a.PG){var c=a.$().timestamp();if(0<=c.L()&&0<=c.Ba()){var d=a.rf(c.L());d=d instanceof qq?d.persistState():null;d=new jk(d,c.Ba(),c.ib());a=a.Wa.Ge;b&&(a.YB=!0);rs(a,c.L(),d);a.invalidate()}}}function ss(a){var b=a.Y.timestamp(),c=b.Ba();b=b.ib();const d=a.Td.sb();c=0<=c?d.sc(c):null;return"suspended"==a.Y.state()||null!==c&&b>=c.duration()}function ts(a,b){const c=ns(a)?os(a).Uw:void 0;return new hs(a.G.slides(),b.id(),b,c)} +function us(a,b,c,d,e){c=c?d&&d.sp()?new gf(d.Qr(),0,0):e||a.Y.timestamp():null;a.Kf.push(new Xg(b,c,a.Ue));b=lg(b);0>b&&(b=0);a.Ue=b}function vs(a,b,c){const d=Vq(a.Rb)||void 0,e=d?!1:void 0;if(d){var f=d.effect();const g=ts(a,f),h=new gf(d.Qr(),0,0);d.oa()||us(a,g,f.Kr(),d,h);f=lg(g);0>f&&(f=0);a.Ue=f}ps(a,{L:b,mf:c,qD:e,Jr:!0,eQ:!1,Ey:d})} +function ws(a){if(0a.M.la(d).visible()&&d>os(a).slides()[a.Ue]);if(void 0===c)for(b=a.Kf.length-2;-1<=b;--b)c=a.Kf[b],c=(c?c.Tw:a.Zh).slides().find(d=>a.M.la(d).visible()&&d>os(a).slides()[a.Ue]);return void 0!==c?c:-1}c=ns(a)?os(a).Uw:void 0; +b=b?Zq(a.Rb,b.index(),a.W,a.fa().Bk(),c,a.M):-1;return b>=a.M.count()?-1:b}return-1}function Bs(a){if(!a.Rb.xi()){var b=a.Rb.wI();if(-1!=b)return b}var c=a.fa();b=zs(a);if(!ns(a)&&a.W!=b)return os(a).slides()[0];b=kg(os(a));if(b.seekTo(a.Ue)){for(c=c.visible();gg(b);){const d=b.fa();if(d&&d.Dy()||!c||c&&d&&d.visible())break}b=b.fa();return!b&&ns(a)&&xs(a)?(b=As(a).slides().concat().reverse().find(d=>da.Kf.length)return a.Zh;const b=a.Kf[a.Kf.length-2];return b?b.Tw:a.Zh}function Fs(a,b,c,d,e){us(a,b,c,d);ps(a,{L:b.slides()[a.Ue],qD:!0,Ey:d,vu:e})}function Gs(a,b,c){const d=ts(a,b);c=Ds(a,b,!1,c);Fs(a,d,b.Kr(),c)}function Hs(a,b){a.Kf.length||a.BE.C();var c=ns(a),d=a.Kf.pop();const e=c?d.Tw.a0:void 0;e&&Wq(a.Rb);(c=d.JY)?(a.Ue=d.q9,d=e?Ds(a,e,!0):void 0,ps(a,{L:c.L(),Jr:!1,Ey:d,vu:b})):a.Ue=a.W} +function Mg(a,b,c,d){if(0>a.W)throw Error("current slide is null");var e=!!a.fa().pj().kp();const f=d?ws(a):a.fh();0<=f?(d=()=>{a.ot=!0;const g=Is(a,f);g?Gs(a,g.u1,g.sp):0=a.M.count())){if(!a.M.la(b).visible())return ys(a,b+1);b=a.W==b?void 0:$f(a.fa().Bk(),b);var c=ns(a)?os(a).Uw:void 0;return b&&Yq(a.Rb,b.slides(),c)?ys(a,Math.max.apply(a,b.slides())+1):b}}function Js(a){a.xG||(a.xG=!0,a.pm.C())}function Ls(a){return"accessible"==a.zc.Ib} +function Ms(a,b){a.TF=b}function Ns(a,b,c,d,e){a.W!=b&&(c&&0<=a.W&&a.UE.push(a.M.la(a.W)),d&&0<=a.W&&(d=ns(a)?os(a).Uw:void 0,a.Rb.push(a.M.la(a.W),e,d)),a.Td&&(a.Td.vQ(),a.Td.deactivate()),e=os(a).slides(),d=-1,null!==a.ot&&(d=a.ot?e.indexOf(b,a.Ue):e.lastIndexOf(b,a.Ue)),e=0<=d?d:e.indexOf(b),0<=e&&(a.Ue=e),a.ot=null,a.W=b,e=a.M.la(b),e.Dy()||cg(e,!0),Ls(a)&&!e.completed()&&(e.Dj=!0),c&&Os(a.Wa.Ge,b),a.Td=a.rf(b),a.xZ.C(b),Ps(a,e),a.BZ.C(b))} +function Qs(a){if(a.Td){var b=a.Td;qk(b,a.Nb);b.activate(a.Wa);a.Td instanceof qq&&(a.Td.tI(),a.Td.SI())}}function Ps(a,b){const c=b.index(),d=a.rf(c);b=b.persistState(d);a=a.Wa.Ge;a.Mq[c]=b;a.ul=!0;a.invalidate()}function Rs(a){var b=a.Wa.Ge.Jm;if(b){var c=b.nk();b=b.MD();for(let e=0;e{this.yP.$().Ml().C()},this);this.Y.Pr().addHandler(()=>{this.yP.$().Pr().C()},this); +this.Ke.wJ().addHandler(this.sX,this);this.Ke.Mu().addHandler(()=>{this.q_.C()},this);this.Ke.wJ().addHandler(()=>{this.p_.C();ms(this)},this);this.t9=[];this.UE=new Hg;this.Zh=a.zI();this.Kf=[];a=new cd(this.G.slideWidth(),this.G.slideHeight());this.Rb=new ar(this.Wa.Ge);this.Rb.bX.addHandler(()=>{this.RH.Pz={};ns(this)&&(this.Kf.pop(),this.Ue=this.W);ms(this)},this);this.Rb.tV.addHandler(n=>{ms(this,n)},this);this.RH=new ir({Vca:a,kn:b,Hda:this.Rb,Wo:e,slides:this.M,aI:f,JI:this.fj});b=this.Y.timestamp().L(); +0<=b&&(this.Y.started()?ps(this,{L:b,e0:!1,$m:!1}):this.Ab(this.Y));this.lM=Date.now();this.YS=new is;this.YS.Zb().addHandler(this.Z5,this);this.YS.start();this.XJ=new C;this.Wr=new C;this.BZ=new C;this.RB=new C;this.xZ=new C;this.BE=new C;this.AU=new C;this.q_=new C;this.p_=new C;this.vU=new C;this.Qj=new C;this.EN=new Fg;this.EN.KC()&&ve(this.EN,"visibilitychange",this.O7,!1,this);ve(window,"beforeunload",()=>{qs(this,!1)});this.TV=new C;this.u_=new C;this.fj.Qj.addHandler(this.L6,this)}play(){0> +this.W?ps(this,{L:this.Pf(),Jr:!1}):ss(this)&&!this.Y.nd()?this.fp():this.Td.play()}pause(){this.Td&&this.Td.pause()}ue(a,b,c=!0){this.Rb.reset();ps(this,{L:a,mf:b,Jr:!c,vu:!0})}wI(){const a=this.UE.top();return a?a.index():-1}Lx(a){this.Rb.reset();if(!this.UE.xi()){void 0===a&&(a=!0);var b=this.UE.pop();b&&ps(this,{L:b.index(),mf:a,e0:!1,vu:!0})}}Pf(){const a=kg(this.Zh);return hg(a)?a.fa().index():this.Zh.slides()[0]}Sm(){var a=kg(this.Zh);a.W=a.Vw.length;if(ig(a))return a.fa().index();a=this.Zh.slides().length; +return this.Zh.slides()[a-1]}wr(a){this.Rb.reset();ps(this,{L:this.Pf(),mf:a,vu:!0})}xr(a){this.Rb.reset();ps(this,{L:this.Sm(),mf:a,vu:!0})}sf(a){Mg(this,void 0!==a?a:!0,!0)}vi(a){void 0===a&&(a=!0);if(0>this.W)throw Error("current slide is null");this.BL(a,!1)}fp(){if(0>this.W)throw Error("Slide has not been loaded");var a=this.Y.timestamp(),b=a.Ba(),c=a.ib();a=this.Td;var d=a.sb();const e=0<=b?d.sc(b):null,f=e?e.duration():0;d=b==d.count()-1&&(c>=f||e&&e.Al());0>b?(Ks(this.Ke),this.aC&&Mg(this, +!0,!1)):d?(nk(a),Mg(this,!0,!0)):(this.WE=f<=c,b=a.ya.sb(),c=a.Da.$().timestamp().Ba(),c==b.count()-1?nk(a):(b=c+1,a.play(),mk(a,b,0)),Cs(this),this.WE=!1)}lk(a,b,c,d){void 0==d&&(d=!1);if(a>this.M.count()||0>a)throw Error("slideIndex is out of bounds");var e=this.M.la(a);if(0>b)c=b=0;else{var f=e.sb().count();b>f-1&&(b=f-1)}"idle"!=this.Ke.state()&&Ks(this.Ke);if(f=a!=this.W){qs(this);this.jf.Au(a);if(!e.uf()){this.Xp=arguments;this.Gz=this.lk.bind(this);this.Xp.L=a;Ts(this.Da,!0,this.jf);return}this.Xp&& +(this.Gz=this.Xp=null,Ts(this.Da,!1,this.jf));if(0==b&&0==c){ps(this,{L:a,mf:d,qD:!1});return}e=this.rf(a);if(e instanceof qq){e.Se.reset(b,1E3*c);var g=Us(this.Wa.Ge,a);(g=g?g.nm:null)&&e.WI(g)}}this.Da.Ji(a,b,c,!0);f&&this.Wr.C(a);d?this.Da.start():this.Da.stop();Cs(this)}BL(a,b,c=!1){void 0!==this.AL?this.jY=arguments:this.AL=setTimeout(this.OU.bind(this,a,b,c),0)}OU(a,b,c=!1){clearTimeout(this.AL);this.AL=void 0;var d=this.jY;if(d)this.jY=null,this.OU.apply(this,d);else{d=this.gh();if(0>d){if(0> +this.W)return;d=this.W}this.ot=!1;if(!this.Rb.xi()&&this.Rb.wI()==d){const {slide:g,Caa:h}=this.Rb.pop();if(g){d=void 0;if(h){var e=h.Qr()==g.index();d=void 0;var f=h.effect();h.sp()&&(f=h.sp(),d=h.effect());d=Ds(this,f,e,d);e&&Wq(this.Rb,Vs(this.zc,g.index()).rI())}ns(this)&&xs(this)&&(this.Kf.pop(),this.Ue=this.W);d&&!ns(this)&&(e=d.effect(),f=ts(this,e),us(this,f,e.Kr(),d));ps(this,{L:g.index(),mf:a,oa:b,Jr:c,eQ:!1,Ey:d});return}}ps(this,{L:d,mf:a,oa:b,Jr:c,eQ:!1})}}gh(){if(0>this.W)return-1;const a= +this.fa().pj().ey();return a?Es(a):Bs(this)}ju(){const a=this.rf(this.W);let b=!0;var c=this.Y.timestamp();const d=c.Ba();0>d?(Ks(this.Ke),this.aC||(this.BL(!1,!0,!0),b=!1)):0this.W)){var b=this.Y.Kg(),c=b?(this.lM-a)/1E3:0,d=this.Y.timestamp();a=d.L();var e=d.Ba();d=d.ib();var f=this.fj.playbackRate();d+=c*f;if(b&&0<=e&&(b=this.fa().sb(),c=b.sc(e),d>=c.duration()))if(c.Al()){++e;if(e==b.count()){this.Da.Ji(a,e-1,c.duration());Mg(this,!0,!1);return}d=0}else{this.Da.Ji(a,e,c.duration());Ws(this.Da,!0);return}this.Da.Ji(a,e,d)}}sX(){this.jf.qa(!0);const a=this.rf(this.W);a.TH();const b=Us(this.Wa.Ge,this.W), +c=b?b.nm:null;this.WE=!0;b&&this.A8?(this.Da.Ji(this.W,b.Ba(),b.ib()),this.Td instanceof qq&&c&&this.Td.restoreState(c),this.Fp?a.play():a.pause()):this.Fp?(a.play(),mk(a,0,0)):ok(a);this.WE=!1;(this.aC||b)&&Cs(this)}fh(){if(0>this.W)return-1;const a=this.fa().pj().kp();return a?Es(a):ws(this)}QU(a,b,c,d,e,f,g,h,l){a<<=0;if(a>=this.M.count()||0>a)throw Error("Invalid slide index");void 0==b&&(b=!0);void 0==c&&(c=!0);void 0==d&&(d=!1);void 0==e&&(e=!0);void 0==f&&(f=!0);void 0==g&&(g=!0);void 0==h&& +(h=!0);if(a!=this.W){var n=~this.W?this.M.la(this.W).type():null,m=this.M.la(a).type(),p=Ls(this);this.XJ.C(n,m);n="quiz"==m||this.Oa();m="interaction"==m||this.fb();if(n||m||p)f=!1;"idle"!=this.Ke.state()&&Ks(this.Ke);this.jf.Au(a);if(2!=this.jf.Ix(a))this.Xp=arguments,this.Xp.L=a,this.Gz=this.QU.bind(this),Ts(this.Da,!0,this.jf);else{this.Gz=this.Xp=null;this.jf.qa(!1);m=l?l.effect():void 0;this.Fp=p?!1:b;this.aC=l?void 0===m.duration()?null===this.ot?!1:!this.ot:l.oa():d;this.A8=g;p=this.aC?0> +this.W?a:this.W:a;this.Dg=this.M.la(p).transition().clone();l&&(void 0===m.duration()?m=null:(m=m.duration(),m=new Nf("Zoom",m,null,!1)),this.Dg=m||this.Dg);this.AU.C(this.Dg,this.W,a);qs(this);this.Da.Ji(p,-1,0);p=this.rf(a);p instanceof qq&&(g||rs(this.Wa.Ge,a),(m=(m=Us(this.Wa.Ge,a))?m.nm:null)?p.restoreState(m):(eq(p.Se),p.Se.reset(0,0)));Ns(this,a,c,h,l);if(p=f&&0m.W;m.Zn=A?I.background():m.zc.Gd[m.W];m.ew=I.Gd[t];I=[];0<=m.W&&(I=m.G.slides().la(m.W),I=I instanceof Am?I.Sw:[]);var J=m.G.slides().la(t);J=J instanceof Am?J.Sw:[];m.W=t;Xs(m);w=t=new Ys(m.zg,m.yg,y,m.ew,m.Zn,m.fg,w,D);y=J;w.Ys=I;w.Vs=y;t.iw=A;A=n;n=t;"RandomTransition"==A&&(A=Zs[Math.floor(Math.random()*Zs.length)],A=A[Math.floor(Math.random()*A.length)]);n=(A=$s[A])?A(n):new at(n);m.jh=n;m.jh.mu()&&(A=m.jh,A.Y=m.Y,A.Y.Ml().addHandler(A.BW,A),A.Y.Pr().addHandler(A.AW,A),m.jh.ke.addHandler(m.rX, +m));n.Ux()?bt(m):n.fB.addHandler(m.yN,m)}else ct(this.Ke,a),ms(this);Qs(this);this.Wr.C(a);this.Da.start(d);f&&((n=this.Dg.If)?(m=this.Wa.mediaController(),dt(m,n,m.Y.timestamp(),0)):this.Dg.TZ&&Hp(this.Wa.mediaController()));p||this.sX();e&&Cs(this)}}}playbackState(){const a=this.Y.state(),b=this.Y.timestamp().Ba();return"stopped"==a?0>b?"pausedTransition":"pausedSlide":"suspended"==a?"suspended":"buffering"==a?"buffering":0>b?"playingTransition":"playingSlide"}Ab(a){a=a.timestamp();const b=a.L(), +c=a.Ba();var d=a.ib();if(0>c){var e=d,f=0;if(this.Dg&&"null"!=this.Dg.zv){var g=this.Ke.hP*this.Dg.duration();isNaN(g)&&(g=0);f=Math.max(0,this.Dg.duration()-g);e-=g}this.yP.Lg(0{ft(a,b.yl())},1E3)}yl(){return 0this.W)throw Error("Current slide is undefined");return this.M.la(this.W)}$d(){if(!this.Td)throw Error("Current slide is undefined");return this.Td}rf(a,b=!0){if(!this.M.la(a).uf())return null;const c= +this.t9;let d=c[a]||null;!d&&b&&(d=gt(this.s9,a),c[a]=d,d.stateChangedEvent().addHandler(this.s7,this),d instanceof qq?d.Ay().addHandler(e=>{this.W==e&&qs(this)}):d instanceof xq?d.Oa().quizPlayerEvent().addHandler(this.U6,this):d instanceof Cq&&d.tb().scenarioPlayerEvent().addHandler(this.c7,this));return d}U6(a){switch(a){case "gotoPreviousSlide":this.vi();break;case "skipQuizSlide":this.sf();break;case "quizFinished":a=this.fa();var b=this.$d();b=Rg(b.Oa());a=Sg(b)?a.nG:a.EE;b=this.fa();const c= +this.$d().Oa(),d=Rg(c);"graded"==d.HG&&Tg(d)&&!Sg(d)&&b.KR()&&c.restartQuiz();(new Lg(this)).EQ(a);break;case "lockPresentationViewMode":this.TV.C();break;case "unlockPresentationViewMode":this.u_.C()}}c7(a){switch(a){case "gotoPreviousSlide":this.vi();break;case "gotoNextSlide":this.sf();break;case "skipScenarioSlide":this.sf();break;case "scenarioRestarted":case "scenarioRestored":this.vU.C(a);break;case "scenarioFinished":a=this.fa();var b=this.$d();a=zq(b.tb()).scenarioPassed()?a.oG:a.FE;(new Wg(this)).EQ(a)}}s7(a){Ps(this, +a)}Il(){return this.fj}vc(){return this.BZ}Mu(){return this.q_}zS(){return this.p_}HQ(){return this.vU}vy(){return this.RB}lS(){return this.xZ}qp(){return this.pm}hX(a){const b=this.Xp,c=this.Gz;c&&b&&b.L==a.index()&&(this.Gz=this.Xp=null,Ts(this.Da,!1,this.jf),c.apply(this,b))}Oa(){return 0>this.W||!(this.fa()instanceof cr)?null:this.$d().Oa()}fb(){return 0>this.W||!(this.fa()instanceof tq)?null:this.$d().fb()}tb(){return 0>this.W||!(this.fa()instanceof Bq)?null:this.$d().tb()}rD(){return this.Ke}lu(){return this.Wa.lu()}t6(a){var b= +this.rf(this.W);b&&(b=b.view(),b instanceof Rn&&b.Ot.C(a,new Mn,!0))}O7(){Gg(this.EN)?(this.N3=this.Y.Kg(),this.pause()):this.N3&&Gi(()=>{this.play()},this,100)}L6(){this.Qj.C()}}Ss.prototype.slideTransitionController=Ss.prototype.rD;Ss.prototype.scenarioPlayer=Ss.prototype.tb;Ss.prototype.interactionPlayer=Ss.prototype.fb;Ss.prototype.quizPlayer=Ss.prototype.Oa;Ss.prototype.playbackCompleteEvent=Ss.prototype.qp;Ss.prototype.stepChangeEvent=Ss.prototype.vy;Ss.prototype.slideChangeEvent=Ss.prototype.vc; +Ss.prototype.currentSlide=Ss.prototype.fa;Ss.prototype.currentSlideIndex=Ss.prototype.ma;Ss.prototype.clock=Ss.prototype.$;Ss.prototype.playbackState=Ss.prototype.playbackState;Ss.prototype.nextSlideIndex=Ss.prototype.fh;Ss.prototype.gotoPreviousStep=Ss.prototype.ju;Ss.prototype.previousSlideIndex=Ss.prototype.gh;Ss.prototype.gotoTimestamp=Ss.prototype.lk;Ss.prototype.gotoNextStep=Ss.prototype.fp;Ss.prototype.gotoPreviousSlide=Ss.prototype.vi;Ss.prototype.gotoNextSlide=Ss.prototype.sf; +Ss.prototype.gotoLastSlide=Ss.prototype.xr;Ss.prototype.gotoFirstSlide=Ss.prototype.wr;Ss.prototype.lastSlideIndex=Ss.prototype.Sm;Ss.prototype.firstSlideIndex=Ss.prototype.Pf;Ss.prototype.gotoLastSlideViewed=Ss.prototype.Lx;Ss.prototype.gotoSlide=Ss.prototype.ue;Ss.prototype.pause=Ss.prototype.pause;Ss.prototype.play=Ss.prototype.play;let ht;function it(a,b){b?a.setAttribute("role",b):a.removeAttribute("role")}function jt(a,b,c){Array.isArray(c)&&(c=c.join(" "));var d="aria-"+b;""===c||void 0==c?(ht||(ht={atomic:!1,autocomplete:"none",dropeffect:"none",haspopup:!1,live:"off",multiline:!1,multiselectable:!1,orientation:"vertical",readonly:!1,relevant:"additions text",required:!1,sort:"none",busy:!1,disabled:!1,hidden:!1,invalid:"false"}),c=ht,b in c?a.setAttribute(d,c[b]):a.removeAttribute(d)):a.setAttribute(d,c)} +function kt(a,b){a=a.getAttribute("aria-"+b);return null==a||void 0==a?"":String(a)};class lt{constructor(a){this.pg=a}ia(a,b,c){c=this.pg.hasOwnProperty(a)?this.pg[a]:c;if(void 0!==c){if(void 0!==b){a=this.JU;for(let d in b)if(b.hasOwnProperty(d)){const e=b[d];a&&(d=a(d));c=c.replace(new RegExp(d,"g"),e)}}return c}Ga("unknown message id: "+a);return a}messages(){return this.pg}JU(a){return"%"+a.toUpperCase()+"%"}}lt.prototype.getMessage=lt.prototype.ia;class mt{constructor(a){this.pa=a;this.vW=!1;this.Db=zd("DIV");mn(this.Db,"framesLayer");this.vh=new C;a.Qe().addHandler(this.KA,this)}KA(a,b,c,d){this.pa.uI()?Gh(this.Db,0,0):Gh(this.Db,c,d);F(this.Db,"pointer-events","none");c="";this.vW||(c="rect(0px,"+a+"px,"+b+"px,0px)");F(this.Db,"clip",c);this.vh.C()}Qe(){return this.vh}position(a,b){const c=this.pa.Fi();return this.yq(c.querySelector("#"+a),c,b||this.scale())}scale(){return this.pa.scale()}yq(a,b,c){let d=new Xc(0,0);if(!a)return d;a=Kh(a); +b=Kh(b);d=ad(a,b);return d=new Xc(d.x/c,d.y/c)}displayObject(){return this.Db}};function nt(a,b){return`${a.className()}_${b}`}function ot(a,b,c){return`${nt(a,b)}_${c}`}function pt(a,b,c){b=jn(b);const d=ot(a,c,"");return Oa(b,e=>0==e.indexOf(d))}class qt{constructor(a,b){this.cK=a;this.Vd=b}className(){return this.Vd?`${this.cK}__${this.Vd}`:this.cK}};var rt=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||setTimeout;function st(a){return"string"!==typeof a.className}function tt(a,b){a.className.baseVal=b}function ut(a){return st(a)?(a=a.className.baseVal,"string"===typeof a&&a.match(/\S+/g)||[]):jn(a)}function vt(a,b){return st(a)?Pa(ut(a),b):ln(a,b)}function wt(a,b){if(st(a)){if(!vt(a,b)){let c=a.className.baseVal;c+=0c!=b).join(" ")):nn(a,b)};class yt extends C{constructor(a){super(a);this.Jz=B(this,new C);this.DL=B(this,new C)}addHandler(a,b,c){super.addHandler(a,b,c);this.Jz.C()}removeHandler(a,b,c){super.removeHandler(a,b,c);this.DL.C()}};let zt;const At=[];if(window.MutationObserver){zt=new MutationObserver(b=>{b&&b.forEach(c=>{for(const d of c.removedNodes)for(const e of At)"function"===typeof d.contains&&d.contains(e.displayObject())&&e.hj(!1)})});const a={subtree:!0,childList:!0};rt(()=>{zt.observe(document.body,a)})}function Bt(a,b){a.Oy.push(b);wt(a.U,b.className())} +function Ct(a){const b=new ResizeObserver(c=>{for(const d of c)void 0!==d.target&&0{1==cf(b)&&Rm(c);x(a,a.U,"mouseover",()=>{a.enabled()&&0{a.hj(!1)})});z(a,b.DL,()=>{0==cf(b)&&Sm(c)});const d=new Ym;z(a,d.VB,(e,f,g)=>{a.hj(!1);a.enabled()&&a.Rp(g);a.Aq&&g.target==a.U&&g.preventDefault()});z(a,d.jP,()=>{a.hj(!0)});z(a,d.kP,()=>{a.enabled()&&a.Jy()});Qm(c,d)} +function Et(a){zt?At.push(a):Ib?x(a,window,"DOMNodeRemoved",b=>{Md(b.target,a.U)&&a.hj(!1)}):x(a,a.U,"DOMNodeRemovedFromDocument",()=>{a.hj(!1)})}function L(a,b,c){F(a.U,b,c)}function M(a,b,c){B(a,b);null!=c?a.Me(b,c):a.O(b)}function Ft(a,b){for(const c of Object.keys(b))F(a.U,c,b[c])}function Gt(a,b){b instanceof qt||(b=new qt(b));Bt(a,b)}function O(a,b){return new qt(a.Oy[0].cK,b)} +function Ht(a,b,c=b){const d=a.U.scrollTop;b=Math.min(0,b-d-a.O_);c=Math.max(0,c-(d+a.U.clientHeight)+a.O_);0!=b?a.U.scrollTop+=b:0!=c&&(a.U.scrollTop+=c)}function It(a,b,c,d){const e=a.ha.bind(a),f=()=>{var g="string"===typeof c?c:c();g=b.ia(g,d&&d());e(g)};z(a,b.og,g=>{const h="string"===typeof c?c:c();g==h&&f()});f();a.WL=f} +class P extends wg{constructor(a){let {ka:b,F:c,K0:d,za:e,Yb:f,OI:g,i0:h,jI:l,zf:n,Cia:m=0,aJ:p,tabIndex:t,K$:w}=a||{};super();e||(e=wd(f||"DIV"));this.U=e;this.Oy=[];if(b||c)b=b||new qt(c,d),Bt(this,b);this.Aq=void 0!==g?g:!0;this.th=this.Na=this.Va=this.Xb=this.Wb=this.vs=void 0;this.O_=m;this.kt=1;this.WL=null;this.VZ={};this.Ra=null;n&&(this.tt=Ct(this));(this.X8=p)&&this.Eh(!1);void 0!==t&&this.oy(t);this.ja=B(this,new yt(this));Dt(this,this.ja);l&&z(this,this.ja,()=>{});w&&Et(this);this.vh= +E(this);if(!1===h){let y=!1;x(this,this.displayObject(),"mousedown",()=>{y=!0});x(this,this.displayObject(),"focusout",D=>{D.target==D.currentTarget&&(y=!1)});x(this,this.displayObject(),"focusin",D=>{y&&D.target==D.currentTarget&&rt(()=>{this.displayObject().blur()})})}}Qe(){return this.vh}focus(){(()=>{this.U.focus()})()}getAttribute(a){return this.U.getAttribute(a)}setAttribute(a,b){(()=>{this.U.setAttribute(a,b)})()}removeAttribute(a){(()=>{this.U.removeAttribute(a)})()}oy(a){this.vs=a;this.vB(a)}xj(a){this.Wb= +a;(()=>{this.U.style.left=a+"px"})()}Tf(a){this.Xb=a;(()=>{this.U.style.top=a+"px"})()}move(a,b){this.xj(a);this.Tf(b)}Kb(a){this.resize(a)}Wc(a){this.resize(void 0,a)}resize(a,b){this.Gw(a,b);void 0!==a&&(this.Va=a);void 0!==b&&(this.Na=b);this.Qa(this.width(),this.height());this.vh.C(this)}qa(a){void 0!==this.vs&&this.vB(a?this.vs:-1);(()=>{a?this.U.removeAttribute("disabled"):this.U.setAttribute("disabled","")})()}J(a){this.Ra=a;(()=>{this.Ra=null;Th(this.U,a)})()}Rf(a){(()=>{L(this,"opacity", +a)})();this.th=a}O(a){const b=this.Nk(a);(()=>{this.U.appendChild(b)})()}Me(a,b){const c=this.Nk(a);this.U==c.parentNode&&this.U.childNodes[b]==c||(()=>{Ed(this.U,c,b)})()}removeChild(a){const b=this.Nk(a);this.tf(b)&&(()=>{this.U.removeChild(b)})()}tp(){(()=>{Cd(this.U)})()}ha(a){(()=>{Nd(this.U,a)})()}wp(a){(()=>{this.U.innerHTML=a})()}SR(a){(()=>{this.U.id=a})()}vp(a){this.wf("label",a)}vf(a){Array.isArray(a)&&(a=a.join(" "));(()=>{it(this.U,a)})()}vk(a){this.wf("hidden",a)}wf(a,b){(()=>{jt(this.U, +a,b)})()}X(a,b){if(this.Oy.length)for(const c of this.Oy)if("string"===typeof b){const d=pt(c,this.U,a);d&&(delete this.VZ[a],(()=>{xt(this.U,d)})());if(b){const e=ot(c,a,b);this.VZ[a]=e;(()=>{wt(this.U,e)})()}}else{const d=nt(c,a);(()=>{var e=this.U,f=d;b?mn(e,f):nn(e,f)})()}else(()=>{var c=this.U;b?mn(c,a):nn(c,a)})(),Ga("component has no bemInfo")}OC(a){const b=this.Oy[0];a=b?nt(b,a):a;return vt(this.U,a)}Eh(a){this.wf("selected",a)}selected(){return"true"==kt(this.U,"selected")}xb(){this.Qa(this.width(), +this.height());this.vh.C()}tf(a){return this.Nk(a).parentNode==this.displayObject()}x(){return void 0!==this.Wb?this.Wb:Ih(this.displayObject()).x}y(){return void 0!==this.Xb?this.Xb:Ih(this.displayObject()).y}width(){return void 0!==this.Va?this.Va:this.wL()}height(){return void 0!==this.Na?this.Na:this.vL()}enabled(){return!this.U.hasAttribute("disabled")}visible(){return"boolean"===typeof this.Ra?this.Ra:"none"!=this.displayObject().style.display}opacity(){if(void 0!==this.th)return this.th;const a= +Sh(this.U);return"number"===typeof a?a:1}displayObject(){return this.U}setScale(a,b="0 0"){(()=>{wn(this.U,a,a);yi(this.U,b)})()}setParentScale(a){this.kt=a;this.GA()}contains(a){if(!a)return!1;a=this.Nk(a);return Md(this.U,a)}ks(a){(a instanceof Node||"function"===typeof a.displayObject)&&this.removeChild(a);super.ks(a)}Nk(a){return a instanceof Node?a:a.displayObject()}wL(){const a=this.U;return a.tagName.toUpperCase()=="SVG".toString()?a.width.baseVal.value:Vh(a).width}vL(){const a=this.U;return a.tagName.toUpperCase()== +"SVG".toString()?a.height.baseVal.value:Vh(a).height}Gw(a,b){(()=>{void 0!==a&&Oh(this.U,a);void 0!==b&&Ph(this.U,b)})()}Qa(){}GA(){}Rp(a){this.ja.C(this,a)}Jy(){this.X("active",!0)}hj(){this.X("active",!1)}Ky(){x(this,this.U,"keydown",this.ZM,this)}ZM(a){document.activeElement!=this.displayObject()||a.defaultPrevented||13!=a.keyCode&&32!=a.keyCode||(a.preventDefault(),this.Rp())}vB(a){(()=>{this.setAttribute("tabindex",a+"")})()}vd(){this.tt&&this.tt.disconnect();const a=At.indexOf(this);0<=a&&At.splice(a, +1)}};function Jt(a){Jd(a)?this.fs=this.U=a:(this.U=wd("DIV",Kt("component_container",a)),this.fs=this.KT(Kt("component_base",a)),this.U.appendChild(this.fs));this.Wd=[];this.Aq=!1;if(jj){const b=new Pm(this.wy());this.ja=new yt;this.ja.Jz.addHandler(function(){1==cf(this.ja)&&Rm(b)},this);this.ja.DL.addHandler(function(){0==cf(this.ja)&&Sm(b)},this);a=new Ym;a.VB.addHandler(function(c,d,e){this.hj(!1);this.Aq&&e.preventDefault();this.enabled()&&this.Rp(e)},this);a.jP.addHandler(function(){this.hj(!0)}, +this);a.kP.addHandler(function(){this.enabled()&&this.Jy()},this);Qm(b,a)}else this.Aq=!0,this.ja=new yt,this.ja.Jz.addHandler(function c(){this.ja.Jz.removeHandler(c,this);var d=ve(this.wy(),"mouseover",function(){this.enabled()&&0{for(const b of a)void 0!==b.target&&(a=b.contentRect,this.Va=a.width,this.Na=a.height,this.Qa(a.width,a.height),this.vh.C(this))});this.tt.observe(this.U);this.Qa(parseInt(this.U.style.width,10),parseInt(this.U.style.height,10));this.vh.C(this)};k.Jy=function(){this.X("active",!0)};k.hj=function(){this.X("active",!1)};k.za=function(){return this.fs};Jt.prototype.baseElement=Jt.prototype.za;Jt.prototype.displayObject=function(){return this.U}; +Jt.prototype.displayObject=Jt.prototype.displayObject;k=Jt.prototype;k.width=function(){return void 0!==this.Va?this.Va:this.wL(this.za())};k.wL=function(a){return"SVG"==a.tagName.toUpperCase()?a.width.baseVal.value:Vh(a).width};k.Kb=function(a){this.resize(a)};k.height=function(){return void 0!==this.Na?this.Na:this.vL(this.za())};k.vL=function(a){return"SVG"==a.tagName.toUpperCase()?a.height.baseVal.value:Vh(a).height};k.Wc=function(a){this.resize(void 0,a)}; +k.resize=function(a,b){if(void 0!==this.tt)throw Error("ResizeObserver is turned on");this.Gw(a,b);void 0!==a&&(this.Va=a);void 0!==b&&(this.Na=b);this.vh.C(this)};k.Gw=function(a,b){void 0!==a&&(Oh(this.displayObject(),a),Oh(this.za(),a));void 0!==b&&(Ph(this.displayObject(),b),Ph(this.za(),b));void 0!==a&&void 0!==b&&this.Qa(a,b)};k.Qa=function(){};k.x=function(){return void 0!==this.Wb?this.Wb:Ih(this.displayObject()).x};k.xj=function(a){this.Wb=a;this.displayObject().style.left=a+"px"}; +k.y=function(){return void 0!==this.Xb?this.Xb:Ih(this.displayObject()).y};k.Tf=function(a){this.Xb=a;this.displayObject().style.top=a+"px"};k.move=function(a,b){this.xj(a);this.Tf(b)};k.enabled=function(){return!this.za().hasAttribute("disabled")};k.qa=function(a){void 0!==this.vs&&this.vB(a?this.vs:-1);a?this.za().removeAttribute("disabled"):this.za().setAttribute("disabled","")};k.visible=function(){return"none"!=this.displayObject().style.display};k.J=function(a){Th(this.displayObject(),a)}; +k.opacity=function(){return this.th};k.Rf=function(a){Lt(this,"opacity",a);this.th=a};k.O=function(a){a=this.Nk(a);this.displayObject().appendChild(a)};k.Me=function(a,b){a=this.Nk(a);Ed(this.displayObject(),a,b)};k.removeChild=function(a){a=this.Nk(a);this.tf(a)&&this.displayObject().removeChild(a)};k.tp=function(){const a=this.displayObject();for(;a.firstChild;)a.removeChild(a.firstChild)};k.tf=function(a){return(a instanceof Jt?a.displayObject():a).parentNode==this.displayObject()}; +k.ha=function(a){Nd(this.za(),a)};k.wp=function(a){this.za().innerHTML=a};function Lt(a,b,c){F(a.displayObject(),b,c)}k.vp=function(a){this.wf("label",a)};k.vf=function(a){Array.isArray(a)&&(a=a.join(" "));it(this.BH?this.fs:this.U,a)};k.vk=function(a){this.wf("hidden",a)};k.wf=function(a,b){jt(this.BH?this.fs:this.U,a,b)};k.KT=function(a){return wd("DIV",a)};function Kt(a,b){return void 0===b?a:b instanceof Array?(b=Ua(b),b.push(a),b):[a,b]} +k.X=function(a,b){a=this.ZJ?nt(this.ZJ,a):a;var c=this.U;b?mn(c,a):nn(c,a);this.U!=this.fs&&(c=this.fs,b?mn(c,a):nn(c,a))};k.OC=function(a){a=this.ZJ?nt(this.ZJ,a):a;return ln(this.U,a)};k.Ky=function(){ve(this.displayObject(),"keydown",this.ZM,!1,this)};k.ZM=function(a){document.activeElement!=this.displayObject()||a.defaultPrevented||13!=a.keyCode&&32!=a.keyCode||(a.preventDefault(),this.Rp(null))};k.vB=function(a){this.setAttribute("tabindex",a+"")}; +k.gd=function(){for(let a=0;a{d.stopPropagation();c= +this.ZD.url();Ri(c)},this);F(this.displayObject(),"z-index","1000")}Ya(){return this.hs}displayObject(){return this.Ri.displayObject()}};function Rt(){this.yE=new C;this.A3=new C;this.hU=new C;this.fU=new C}k=Rt.prototype;k.wv=!1;k.vv=!1;k.jH=null;k.$A=null;k.Hx=function(){return"drag"};k.nI=function(a,b){if(1==b.touches().length){if("touchStart"==a)return this.wv&&(this.vv=this.wv=!1),this.vv=!1,1;if("touchMove"==a&&this.vv)return 1}this.wv&&(this.vv=this.wv=!1,this.fU.C(this.$A.x,this.$A.y));return 0}; +k.WH=function(a){a=new Xc(a.touches()[0].clientX(),a.touches()[0].clientY());this.vv?(a=ad(a,this.jH),Yc(a,this.$A)||(this.wv||(this.wv=!0,this.hU.C(this.jH.x,this.jH.y)),this.$A=a,this.yE.C(a.x,a.y))):(this.vv=!0,this.jH=a,this.$A=new Xc,this.A3.C())};k.nr=function(){};function St(){this.K8=new C;this.Lw=new C;this.XY=new C;this.yE=new C;this.fA=null;this.tO=!1}k=St.prototype;k.gA=-1;k.$E=0;k.Hx=function(){return"scale"};k.nI=function(a,b){a=2==b.touches().length;const c=!a&&0c.x&&0>d.x||0c.y&&0>d.y||0=Math.abs(a.y-b.y)};Vt.prototype.J_=function(a,b){const c=b.x-a.x;return 40=Math.abs(a.y-b.y)};function Wt(){this.pB=new C}r(Wt,Ut);Wt.prototype.Hx=function(){return"scrollRight"};Wt.prototype.L_=function(a,b){return a.x>=b.x};Wt.prototype.K_=function(a,b){return a.x-b.x>=Math.abs(a.y-b.y)}; +Wt.prototype.J_=function(a,b){const c=a.x-b.x;return 40=Math.abs(a.y-b.y)};function Xt(){He.call(this);this.Yc=Yt;this.endTime=this.startTime=null}r(Xt,He);var Yt=0;Xt.prototype.mp=function(){this.Ch("begin")};Xt.prototype.Hl=function(){this.Ch("end")};Xt.prototype.Ch=function(a){this.dispatchEvent(a)};function Zt(a,b,c){Yd.call(this);this.dR=a;this.Rx=b||0;this.Mx=c;this.aaa=ta(this.zaa,this)}r(Zt,Yd);k=Zt.prototype;k.PC=0;k.pf=function(){Zt.Mb.pf.call(this);this.stop();delete this.dR;delete this.Mx};k.start=function(a){this.stop();this.PC=kh(this.aaa,void 0!==a?a:this.Rx)};k.stop=function(){this.isActive()&&ia.clearTimeout(this.PC);this.PC=0};k.isActive=function(){return 0!=this.PC};k.zaa=function(){this.PC=0;this.dR&&this.dR.call(this.Mx)};var oc={},$t=null;function au(a){a=ma(a);delete oc[a];nc()&&$t&&$t.stop()}function bu(){$t||($t=new Zt(function(){cu()},20));var a=$t;a.isActive()||a.start()}function cu(){var a=wa();fc(oc,function(b){du(b,a)});nc()||bu()};function eu(a,b,c,d){Xt.call(this);if(!Array.isArray(a)||!Array.isArray(b))throw Error("Start and end parameters must be arrays");if(a.length!=b.length)throw Error("Start and end points must be the same length");this.tD=a;this.Eaa=b;this.duration=c;this.c0=d;this.coords=[];this.AD=!1;this.progress=0}r(eu,Xt);k=eu.prototype; +k.play=function(a){if(a||this.Yc==Yt)this.progress=0,this.coords=this.tD;else if(1==this.Yc)return!1;au(this);this.startTime=a=wa();-1==this.Yc&&(this.startTime-=this.duration*this.progress);this.endTime=this.startTime+this.duration;this.progress||this.mp();this.Ch("play");-1==this.Yc&&this.Ch("resume");this.Yc=1;var b=ma(this);b in oc||(oc[b]=this);bu();du(this,a);return!0};k.stop=function(a){au(this);this.Yc=Yt;a&&(this.progress=1);fu(this,this.progress);this.Ch("stop");this.Hl()}; +k.pause=function(){1==this.Yc&&(au(this),this.Yc=-1,this.Ch("pause"))};k.Lg=function(a){this.progress=a;1==this.Yc&&(this.startTime=wa()-this.duration*this.progress,this.endTime=this.startTime+this.duration)};k.pf=function(){this.Yc==Yt||this.stop(!1);this.C1();eu.Mb.pf.call(this)};k.destroy=function(){this.gd()}; +function du(a,b){bthis.lH&&(ku(this),this.lH=this.hq);lu(this,Vc(this.lH*a,1,4))};k.L7=function(){this.lH=-1};k.J7=function(a,b){1b.ie().Mc())}function su(a){return new ru(a,b=>b.Dd().Mc())}function tu(a,b,c){return pu(a.Pq[b]||[],a.Pq[c]||[])}class ru{constructor(a,b){this.Pq=[];for(let e=0;e{var c=a.$e.Rr();c.Fe()&&c.xE(c.n9)&&c.G.settings().navigation().Um().enabled()&&c.B.fa().nC()&&xu(c)});z(a,Xm(b,"scrollRight").pB,()=>{var c=a.$e.Rr();c.Fe()&&c.xE(c.o9)&&c.G.settings().navigation().Um().enabled()&&c.B.fa().nC()&&c.rc.vi()});Rm(b);if(Hj){const c=new Ym;z(a,c.VB,a.f6,a);z(a,c.eU,a.e6,a);Qm(b,c)}return b} +function yu(a){var b=Hd(a.Ve.displayObject());if(b.length)for(const c of b)ln(c,"framesLayerContent")&&(b=c,b.setAttribute("data-width",a.Va),b.setAttribute("data-height",a.Na))}function zu(a){var b=a.B;-1!=b.ma()&&(b=b.$d().view(),b instanceof Aq&&b.tb().setParentScale(a.ra),uj||(b instanceof wq?b.Oa().resize(a.Va,a.Na):b instanceof sq&&b.fb().resize(a.Va,a.Na)))}function Au(a,b,c){for(let d=0;d{null!=e.id&&0{let m=16*Math.random()|0;return("x"==n?m:m&3|8).toString(16)}));let f;if(kc(a.ML,e.id)){var g=v(a.ML,e.id);f=g.transform.clone();var h=g.origin.clone();var l=g.width;g=g.height}else f=sn(e),null===f&&(f=new gm),h=tn(e),null===h&&(h=new Xc), +yi(e,h.x+"px "+h.y+"px"),l=parseFloat(e.getAttribute("width")),g=parseFloat(e.getAttribute("height")),pc(a.ML,e.id,{transform:f.clone(),origin:h.clone(),width:l,height:g});g*=a.ra;Oh(e,l*a.ra);Ph(e,g);l=1/a.ra;g=1/a.ra;h=ad(new Xc,h);h=new gm(l,0,0,g,h.x-l*h.x,h.y-g*h.y);on(e,hm(f,h))},a)}}function Hu(a){a.Sh&&(Fd(a.Sh),a.Sh=null)} +class Iu extends wg{constructor({Ca:a,dca:b,yI:c,pJ:d,Fi:e,tr:f,wa:g,lJ:h,V:l,kda:n}){super();this.G=a;this.$e=b;this.Ga=c;this.rl=d;this.Je=e;this.Ve=f;this.fg=g;this.Gt=h;uu(this);this.Va=a.slideWidth();this.Na=a.slideHeight();this.ra=1;this.Mk=vu(this);const {width:m,height:p}=this.ni();b=new iu(this.Ga,this.Mk,m,p);ju(b,!1);z(this,b.Lw,this.L8,this);this.UP=b;this.QG=E(this);this.Gc=null;this.oF=!1;this.B=l;this.Ke=n;this.ML={};this.Zk=!1;this.Sh=null;a=a.slides();this.Qq=qu(a)}width(){return this.Va}height(){return this.Na}scale(){return this.ra}resize(a, +b){this.Va=a;this.Na=b;Nh(this.Ga,a,b);var c=this.UP;c.xc=nu(c,bd(c.xc,new Xc((a-c.KH)/2,(b-c.JH)/2)));c.KH=a;c.JH=b;c.bT=Math.min(a/c.zg,b/c.yg,c.D5);lu(c,c.hq);yu(this);zu(this)}B1(a){var b=this.B,c=this.Gc?this.Gc.index():-1;const d=b.ma();this.Gc=0<=d?b.fa():null;b=this.Gc instanceof cr;const e=this.Gc instanceof tq,f=this.Gc instanceof Bq;this.oF=(this.Ve.vW=b)||e||f;this.rl.style.opacity=this.oF?"0":"";this.Rt();a&&F(a.displayObject(),"display",f?"none":"");a=tu(this.Qq,c,d);c=tu(this.Qq,d, +c);Au(this,a,!1);Au(this,c,!0);this.Zk&&(Cu(this,a),Du(this,c));yu(this);Eu(this)}g0(a){lu(this.UP,1);Fu(this);zu(this);Gu(this);var b=this.B;-1!=b.ma()&&void 0!==a&&(b=(b=b.$d())&&b.view(),b instanceof wq?b.Oa().setBannerView(a.displayObject()):b instanceof sq?b.fb().setBannerView(a.displayObject()):b instanceof Aq&&b.tb().setBannerView(a.displayObject()))}setOverlayDisplayed(a){if(this.Zk!=a){this.Zk=a;if(this.Gc){var b=this.Gc.index();b=this.Qq.Pq[b]||[];a?Du(this,b):Cu(this,b);(b=this.B.Oa())&& +b.setOverlayDisplayed(a)}Eu(this)}}qI(a){this.Je.style.display="";this.rl.style.display="";Ju(a);Fu(this)}uI(){return this.oF}gV(){const a=this.Ga;a.setAttribute("role","main");a.setAttribute("aria-live","polite");a.style.overflow="hidden";Nh(a,this.ni().width,this.ni().height);ah&&(a.style["-webkit-text-size-adjust"]="none")}jV(){const a=this.rl;Ld(a)||Ed(this.Ga,this.rl,0);a.style.display="none";const {width:b,height:c}=this.ni();Nh(a,b-2,c-2);Gh(a,1,1)}kV(){const a=this.Je;a.removeAttribute("class"); +a.style.overflow="hidden";a.style.position="absolute";Nh(a,this.ni().width,this.ni().height);yi(a,"0 0")}eV(){const a=this.Ve.displayObject();F(a,"z-index","2");Ld(a)||this.Ga.appendChild(a)}fV(){Ld(this.fg)||this.Je.appendChild(this.fg)}hV(){nn(this.Gt,"slide-displays-parent")}e6(a,b,c){a=c.target;a instanceof HTMLVideoElement&&a.controls?c.stopPropagation():Md(this.Je,a)&&(c.preventDefault(),c=this.$e.Rr(),c.xE(c.m9))}f6(a,b,c){Si(c.target)||(a=c.target,a instanceof HTMLVideoElement&&a.controls? +c.stopPropagation():Md(this.Je,a)&&(c.preventDefault(),rq(this.$e.Rr(),this,c)))}L8(a,b,c){b=Math.round(b);c=Math.round(c);var d=this.G.slideWidth(),e=this.G.slideHeight();d*=a;e*=a;const f=this.ra!=a;f&&(this.ra=a,wn(this.Je,a),Ku(this.$e.me,this.ra),zu(this),Gu(this),Nh(this.rl,d-2,e-2));Gh(this.Je,b,c);Gh(this.rl,b+1,c+1);this.QG.C(d,e,b,c);f&&Ii&&yn(this.Ga)}ni(){return new cd(this.G.slideWidth(),this.G.slideHeight())}Rt(){Hu(this);0<=this.B.ma()&&(this.HP()||this.EP()||this.IP())}HP(){if(this.B.fa()instanceof +cr){const a=this.B.Oa();a.setOverlayDisplayed(this.Zk);uj||(this.Sh=a.skin().displayObject(),this.Ga.appendChild(this.Sh));return!0}return!1}EP(){if(this.B.fa()instanceof tq){const a=this.B.fb();a.setOverlayDisplayed(this.Zk);uj||(this.Sh=a.displayObject(),this.Ga.appendChild(this.Sh));return!0}return!1}IP(){this.B.fa()instanceof Bq&&this.B.tb().setOverlayDisplayed(this.Zk)}vd(){super.vd();Sm(this.Mk);Hu(this)}};class Lu extends wg{constructor({Ca:a,V:b,yI:c,pJ:d,Fi:e,tr:f,wa:g,lJ:h}){super();this.G=a;this.B=b;this.Ga=c;this.rl=d;this.Je=e;this.Ve=f;this.fg=g;this.Gt=h;this.QG=E(this);this.Sh=null;uu(this);z(this,this.B.HQ(),this.Rt,this)}width(){return 0}height(){return 0}scale(){return 1}resize(){}B1(a){a&&F(a.displayObject(),"display","");this.Rt();this.QG.C()}g0(){}setOverlayDisplayed(){}qI(){Th(this.Je,!0)}uI(){return!1}gV(){this.Ga.removeAttribute("role");this.Ga.removeAttribute("aria-live");this.Ga.removeAttribute("style")}jV(){Fd(this.rl)}kV(){this.Je.removeAttribute("style"); +mn(this.Je,"slides-container")}eV(){Fd(this.Ve.displayObject())}fV(){Fd(this.fg)}hV(){mn(this.Gt,"slide-displays-parent")}Rt(){Hu(this);0<=this.B.ma()&&(this.HP()||this.EP()||this.IP())}HP(){return this.B.fa()instanceof cr?(this.Sh=this.B.Oa().skin().displayObject(),this.Ga.appendChild(this.Sh),!0):!1}EP(){return this.B.fa()instanceof tq?(this.Sh=this.B.fb().displayObject(),this.Ga.appendChild(this.Sh),!0):!1}IP(){this.B.fa()instanceof Bq&&(this.Sh=this.B.tb().displayObject(),this.Ga.appendChild(this.Sh))}vd(){super.vd(); +Hu(this)}};class Mu{constructor(a){this.Ck=a}create(a){switch(a){case "normal":return new Iu(this.Ck);case "accessible":return new Lu({Ca:this.Ck.Ca,V:this.Ck.V,yI:this.Ck.yI,pJ:this.Ck.pJ,Fi:this.Ck.Fi,tr:this.Ck.tr,wa:this.Ck.wa,lJ:this.Ck.lJ});default:throw Error("unknown presentation view mode");}}};var Nu={xha:"switchToNextSlide",zha:"switchToPreviousSlide",Nda:"arbitrarySlideSwitching",eha:"slideShowControl",yha:"switchToNextStep",Aha:"switchToPreviousStep",Xfa:"playPauseControl",fga:"presentationSeeking",dha:"slideSeeking",rga:"quizSwitchToNextSlide",sga:"quizSwitchToNextSlideWithoutBranching",pga:"quizArbitrarySlideSwitching",Oga:"scenarioSwitchToNextSlide",Pga:"scenarioSwitchToNextSlideWithoutBranching",Mga:"ScenarioArbitrarySlideSwitching"}; +q("ispring.presenter.player.restriction.NavigationActionType",Nu);function Ou(){return"switchToNextSlide switchToPreviousSlide arbitrarySlideSwitching slideShowControl switchToNextStep switchToPreviousStep playPauseControl presentationSeeking slideSeeking".split(" ")}Nu.all=Ou;q("SWITCH_TO_NEXT_SLIDE","switchToNextSlide",Nu);q("SWITCH_TO_PREVIOUS_SLIDE","switchToPreviousSlide",Nu);q("ARBITRARY_SLIDE_SWITCHING","arbitrarySlideSwitching",Nu);q("SLIDE_SHOW_CONTROL","slideShowControl",Nu); +q("SWITCH_TO_NEXT_STEP","switchToNextStep",Nu);q("SWITCH_TO_PREVIOUS_STEP","switchToPreviousStep",Nu);q("PLAY_PAUSE_CONTROL","playPauseControl",Nu);q("PRESENTATION_SEEKING","presentationSeeking",Nu);q("SLIDE_SEEKING","slideSeeking",Nu);class Pu{constructor(a,b){this.Ha=a;this.x8=b}type(){return this.Ha}Pd(){return this.x8}}Pu.prototype.relatedSlideIndex=Pu.prototype.Pd;Pu.prototype.type=Pu.prototype.type;class Qu{constructor(a,b,c,d,e,f){this.Q5=a;this.D8=b;this.C8=c;this.Ld=null!=d?d:null;this.Mf=e||null;this.Tw=f||null}lR(){return this.Q5}up(){return this.D8}rd(){return this.C8}Pd(){return this.Ld}yca(){return this.Mf}xca(){return this.Tw}}Qu.prototype.relatedSlideShow=Qu.prototype.xca;Qu.prototype.relatedTimestamp=Qu.prototype.yca;Qu.prototype.relatedSlideIndex=Qu.prototype.Pd;Qu.prototype.restrictionReason=Qu.prototype.rd;Qu.prototype.restrictionSource=Qu.prototype.up; +Qu.prototype.navigationAction=Qu.prototype.lR;var Ru={vea:"currentSlideIsLocked",wea:"currentSlideIsNotCompleted",sea:"currentSlideIsFirstSlide",uea:"currentSlideIsLastSlide",tea:"currentSlideIsInteraction",Qda:"backwardNavigationIsRestricted",Yea:"forwardNavigationIsRestricted",gga:"presentationSeekingDisabled",qfa:"interactionNotCompleted",$fa:"precedingQuizNotPassed",Zfa:"precedingQuizNotCompleted",Yfa:"precedingQuizFailed",bga:"precedingScenarioNotCompleted",cga:"precedingScenarioNotPassed",aga:"precedingScenarioFailed"}; +q("ispring.presenter.player.restriction.NavigationRestrictionReasonType",Ru);q("CURRENT_SLIDE_IS_LOCKED","currentSlideIsLocked",Ru);q("CURRENT_SLIDE_IS_NOT_COMPLETED","currentSlideIsNotCompleted",Ru);q("CURRENT_SLIDE_IS_LAST_SLIDE","currentSlideIsLastSlide",Ru);q("CURRENT_SLIDE_IS_FIRST_SLIDE","currentSlideIsFirstSlide",Ru);q("BACKWARD_NAVIGATION_IS_RESTRICTED","backwardNavigationIsRestricted",Ru);q("FORWARD_NAVIGATION_IS_RESTRICTED","forwardNavigationIsRestricted",Ru); +q("PRESENTATION_SEEKING_DISABLED","presentationSeekingDisabled",Ru);q("PRECEDING_QUIZ_NOT_PASSED","precedingQuizNotPassed",Ru);q("PRECEDING_QUIZ_NOT_COMPLETED","precedingQuizNotCompleted",Ru);q("PRECEDING_QUIZ_FAILED","precedingQuizFailed",Ru);q("PRECEDING_SCENARIO_NOT_COMPLETED","precedingScenarioNotCompleted",Ru);q("PRECEDING_SCENARIO_FAILED","precedingScenarioFailed",Ru);q("PRECEDING_SCENARIO_NOT_PASSED","precedingScenarioNotPassed",Ru);var Su={ega:"presentationNavigationType",cha:"slideNavigationSettings",qga:"quizNavigationSettings",Nga:"scenarioNavigationSettings",dga:"presentationFlow"};q("ispring.presenter.player.restriction.NavigationRestrictionSource",Su);q("PRESENTATION_NAVIGATION_TYPE","presentationNavigationType",Su);q("SLIDE_NAVIGATION_SETTINGS","slideNavigationSettings",Su);q("PRESENTATION_FLOW","presentationFlow",Su);function Q(a,b){this.B=a;this.G=b;this.qW=new C}Q.prototype.rf=function(a){return this.B.rf(a)}; +Q.prototype.nf=function(a,b,c,d){const e={};var f;a:{if(Tu(this,a)){if((f=-1==this.B.fh())&&!(f=this.fa().pj().kp())&&(f=!this.G.settings().Vc().Tm())){var g=this.B,h=g.Y.timestamp();f=h.Ba();h=h.ib();g=g.Td.sb();f=f==g.count()-1?g.sc(f):null;f=null!==f&&h>=f.duration()}if(f){f=new Pu("currentSlideIsLastSlide");break a}}else if(Uu(this,a)&&-1==this.B.gh()&&(f=this.B.$().timestamp(),0==f.Ba()&&0==f.ib()||this.fa().pj().ey())){f=new Pu("currentSlideIsFirstSlide");break a}f=null}e.presentationFlow=f; +"quizSwitchToNextSlide"!=a&&"quizSwitchToNextSlideWithoutBranching"!=a&&"scenarioSwitchToNextSlide"!=a&&"scenarioSwitchToNextSlideWithoutBranching"!=a&&(e.presentationNavigationType=Vu(this,a,b));f="quizSwitchToNextSlideWithoutBranching"==a||"scenarioSwitchToNextSlideWithoutBranching"==a?ws(this.B):this.B.fh();e.quizNavigationSettings=Wu(this,a,b,f);e.scenarioNavigationSettings=Xu(this,a,b,f);f="playPauseControl"!=a||Tu(this,a)?(f=0<=this.B.ma()?this.B.fa():null)?f.ou().q1(a)?null:new Pu("currentSlideIsLocked"): +null:null;e.slideNavigationSettings=f;h=f=null;for(const l in e)e.hasOwnProperty(l)&&(g=e[l])&&(f=l,h=g);return null!==f?new Qu(a,f,h,b,c,d):null};Q.prototype.checkNavigationRestriction=Q.prototype.nf; +function Vu(a,b,c){const d=a.B,e=a.G.settings().navigation().navigationType(),f=0<=d.ma()?d.fa():null;if(!f)return null;{const l=a.B;var g=0<=l.ma()?l.fa():null;if(g){var h=a.G.slides();switch(b){case "arbitrarySlideSwitching":g=h.la(c);break;case "switchToNextSlide":case "switchToNextStep":case "playPauseControl":Tu(a,b)&&(c=l.fh(),0<=c?g=h.la(c):(c=!!a.fa().pj().kp(),a.G.settings().Vc().Tm()&&!c&&(g=h.la(a.Pf()))));break;case "switchToPreviousSlide":case "switchToPreviousStep":Uu(a,b)&&(a=l.gh(), +0<=a&&(g=h.la(a)));break;case "presentationSeeking":g=null}h=g}else h=null}if(h==f)return null;if(!h)return"presentationSeeking"==b&&"free"!=e?new Pu("presentationSeekingDisabled"):null;switch(e){case "restricted":if(h.Dy())break;if(h.index()!=d.fh()&&h.index()!=d.gh())return new Pu("forwardNavigationIsRestricted");if("slide"==f.type()&&!f.completed())return new Pu("currentSlideIsNotCompleted");break;case "sequential":if(h.index()!=d.fh()&&(0!=h.index()||"switchToNextSlide"!=b))return h.Dy()?new Pu("backwardNavigationIsRestricted"): +new Pu("forwardNavigationIsRestricted");if("slide"==f.type()&&!f.completed())return new Pu("currentSlideIsNotCompleted")}return null} +function Wu(a,b,c,d){Tu(a,b)?c=d:Uu(a,b)&&(c=a.gh());if(void 0===c)return null;d=a.B.$d().view();if((d instanceof wq||d instanceof sq)&&!d.ty()&&c!=a.B.ma())return new Pu("interactionNotCompleted");if(!(0=a.ib()}return!1}function $u(a,b,c,d){return(b=a.nf(b,c,d,null))?(a.qW.C(b),!1):!0}Q.prototype.play=function(){$u(this,"playPauseControl",this.B.ma(),null)&&this.B.play()};Q.prototype.play=Q.prototype.play;Q.prototype.pause=function(){$u(this,"playPauseControl",this.B.ma(),null)&&this.B.pause()};Q.prototype.pause=Q.prototype.pause; +Q.prototype.ue=function(a,b){$u(this,"arbitrarySlideSwitching",a,null)&&this.B.ue(a,b)};Q.prototype.gotoSlide=Q.prototype.ue;Q.prototype.Lx=function(a){const b=this.B.wI();-1!=b&&$u(this,"arbitrarySlideSwitching",b,null)&&this.B.Lx(a)};Q.prototype.gotoLastSlideViewed=Q.prototype.Lx;Q.prototype.wr=function(a){$u(this,"arbitrarySlideSwitching",this.B.Pf(),null)&&this.B.wr(a)};Q.prototype.gotoFirstSlide=Q.prototype.wr;Q.prototype.xr=function(a){$u(this,"arbitrarySlideSwitching",this.B.Sm(),null)&&this.B.xr(a)}; +Q.prototype.gotoLastSlide=Q.prototype.xr;Q.prototype.sf=function(a){$u(this,"switchToNextSlide",this.B.fh(),null)&&this.B.sf(a)};Q.prototype.gotoNextSlide=Q.prototype.sf;Q.prototype.vi=function(a){$u(this,"switchToPreviousSlide",this.B.gh(),null)&&this.B.vi(a)};Q.prototype.gotoPreviousSlide=Q.prototype.vi;Q.prototype.fp=function(){$u(this,"switchToNextStep",this.B.ma(),null)&&this.B.fp()};Q.prototype.gotoNextStep=Q.prototype.fp; +Q.prototype.ju=function(){$u(this,"switchToPreviousStep",this.B.ma(),null)&&this.B.ju()};Q.prototype.gotoPreviousStep=Q.prototype.ju;Q.prototype.lk=function(a,b,c,d){$u(this,a==this.B.ma()?"slideSeeking":"presentationSeeking",a,new gf(a,b,c))&&this.B.lk(a,b,c,d)};Q.prototype.gotoTimestamp=Q.prototype.lk;Q.prototype.Pf=function(){return this.B.Pf()};Q.prototype.firstSlideIndex=Q.prototype.Pf;Q.prototype.Sm=function(){return this.B.Sm()};Q.prototype.lastSlideIndex=Q.prototype.Sm;Q.prototype.fh=function(){return this.B.fh()}; +Q.prototype.nextSlideIndex=Q.prototype.fh;Q.prototype.gh=function(){return this.B.gh()};Q.prototype.previousSlideIndex=Q.prototype.gh;Q.prototype.ma=function(){return this.B.ma()};Q.prototype.currentSlideIndex=Q.prototype.ma;Q.prototype.fa=function(){return this.B.fa()};Q.prototype.currentSlide=Q.prototype.fa;Q.prototype.playbackState=function(){return this.B.playbackState()};Q.prototype.playbackState=Q.prototype.playbackState;Q.prototype.$=function(){return this.B.$()};Q.prototype.clock=Q.prototype.$; +Q.prototype.vc=function(){return this.B.vc()};Q.prototype.slideChangeEvent=Q.prototype.vc;Q.prototype.vy=function(){return this.B.vy()};Q.prototype.stepChangeEvent=Q.prototype.vy;k=Q.prototype;k.lS=function(){return this.B.lS()};k.Mu=function(){return this.B.Mu()};k.HQ=function(){return this.B.HQ()};k.zS=function(){return this.B.zS()};k.qp=function(){return this.B.qp()};Q.prototype.playbackCompleteEvent=Q.prototype.qp;Q.prototype.Yx=function(){return this.qW}; +Q.prototype.navigationRestrictedEvent=Q.prototype.Yx;Q.prototype.AR=function(){return this.B.AR()};Q.prototype.$d=function(){return this.B.$d()};Q.prototype.Oa=function(){return this.B.Oa()};Q.prototype.quizPlayer=Q.prototype.Oa;Q.prototype.tb=function(){return this.B.tb()};Q.prototype.scenarioPlayer=Q.prototype.tb;Q.prototype.fb=function(){return this.B.fb()};Q.prototype.rD=function(){return this.B.rD()};Q.prototype.slideTransitionController=Q.prototype.rD;k=Q.prototype;k.lu=function(){return this.B.lu()}; +k.pS=function(a,b){this.B.pS(a,b)};k.uD=function(a){this.B.uD(a)};k.BQ=function(){this.B.BQ()};k.JR=function(){this.B.JR()};k.Il=function(){return this.B.Il()};function Ju(a){a.Yu.forEach(b=>b.displayObject().style.display="")}function av(a,b){a.Yu.push(b);b=b.displayObject();yi(b,"0 0");Ed(a.pa.displayObject(),b,0)}function bv(a){a.Yu.forEach(b=>b.displayObject().style.display="none")}function cv(a,b){a.Yu.forEach(c=>Ed(b,c.displayObject(),0))}function dv(a,b){a.Yu.forEach(c=>b(c))} +class ev extends wg{constructor(a){super();this.pa=a;this.Yu=[];z(this,this.pa.Qe(),this.HA,this)}HA(a,b,c,d){for(const f of this.Yu){a=f;b=c;var e=d;const g=a.displayObject(),h=this.pa.scale();wn(g,h);const [l,n]="accessible"==this.pa.Ib?[0,0]:[b+h*a.Ya().left,e+h*a.Ya().top];Gh(g,l,n)}}};class fv extends Qt{constructor(a,b){var c=a.content(),d=RegExp('',"gi");const e=[];for(var f=d.exec(c);f;)e.push(f[1]),f=d.exec(c);for(d=0;de&&a.hv.push(c):0<=e&&a.hv.splice(e,1);jv(a);a.nd()!=d&&a.eK.C(a);a.fK.C(a)} +function kv(a,b,c){const d=a.nd(),e=a.$w.indexOf(c);b?0>e&&a.$w.push(c):0<=e&&a.$w.splice(e,1);jv(a);a.nd()!=d&&a.eK.C(a);a.fK.C(a)}hv.prototype.Zb=function(){return this.Wq};hv.prototype.tickEvent=hv.prototype.Zb;hv.prototype.Ml=function(){return this.kH};hv.prototype.startEvent=hv.prototype.Ml;hv.prototype.Pr=function(){return this.mH};hv.prototype.stopEvent=hv.prototype.Pr;hv.prototype.Ec=function(){return this.Sq};hv.prototype.stateChangeEvent=hv.prototype.Ec;hv.prototype.YH=function(){return this.eK}; +hv.prototype.bufferStateChangeEvent=hv.prototype.YH;hv.prototype.wC=function(){return this.fK};hv.prototype.bufferedObjectChangeEvent=hv.prototype.wC;function iv(a,b){return a.Fo||a.Bf(b)||a.Zj(b)}function jv(a){let b="stopped";a.Eo&&(b=a.Fo?"suspended":a.nd()?"buffering":a.MG?"rewinding":"started");a.Pa!=b&&(a.Pa=b,a.Sq.C(a))}hv.prototype.Bf=function(a){return 1{h.setViewMode(g)})}fb(){return this.Ni.fb()}Cu(a){this.slide().style.opacity=""+(a?1:0)}mr(a){a?a.appendChild(this.yb):Fd(this.yb)}};class mv extends Sq{constructor(a,b,c,d,e,f,g){super(a,b,c,d,e,f);this.Ni=f;this.gO=null;f.Oa()?this.wB(g):Qe(this,f.uY,()=>this.wB(g))}Oa(){return this.Ni.Oa()}Cu(a){this.slide().style.opacity=""+(a?1:0)}mr(a){a?a.appendChild(this.yb):Fd(this.yb)}wB(a){const b=this.Ni.Oa();b.onPresentationViewModeChanged(a);this.gO=b.skin().displayObject();this.yb.appendChild(this.gO);this.bH.innerHTML=this.yb.innerHTML;Th(this.Co,"normal"==a)}vd(){super.vd();Fd(this.gO)}};class nv extends wg{constructor(a){super();this.ya=a;this.Pa=0;this.ql=E(this);this.Gy=this.Co=this.yb=null}slide(){return this.ya}yr(a,b,c){this.yb=a;this.Co=b;this.Gy=c;this.Pa=2;this.ql.C(this)}slideBackground(){return this.Co}uf(){return 2==this.Pa}state(){return this.Pa}};class ov extends nv{constructor(a){super(a);this.Hf=null;this.$Y=E(this)}tb(){return this.Hf}dS(a){this.Hf=a;this.$Y.C()}};class pv extends Sq{constructor(a,b,c,d,e,f,g){super(a,b,c,d,e,f);this.Ni=f;f.Hf?this.wB(g):Qe(this,f.$Y,()=>this.wB(g))}tb(){return this.Ni.tb()}Cu(a){this.slide().style.opacity=""+(a?1:0)}mr(a){a?a.appendChild(this.yb):Fd(this.yb)}wB(a){this.Ni.tb().setViewMode(a);this.bH.innerHTML=this.yb.innerHTML;Th(this.Co,"normal"==a)}};function gt(a,b){const c=a.M.la(b);b=a.zc.Gd[b];if(c instanceof Am){b.Ir();b.Cu(!1);var d=new Rn({content:b.pl,mode:a.zc.Ib,yJ:c.yJ(),xD:c.xD()});d=new qq(c,d,a.Da,a.Ee)}else if(c instanceof cr){if(!b.Oa())return null;d=new wq({content:b.pl,mode:a.zc.Ib,Oa:b.Oa(),qC:c.qC()});d=new xq(c,d,a.Da)}else if(c instanceof tq){if(!b.fb())return null;d=new sq({content:b.pl,mode:a.zc.Ib,fb:b.fb(),pC:c.pC()});d=new uq(c,d,a.Da)}else if(c instanceof Bq){if(!b.tb())return null;d=new Aq({content:b.pl,mode:a.zc.Ib, +tb:b.tb(),rC:c.rC()});d=new Cq(c,d,a.Da)}return d}class qv{constructor(a,b,c,d){this.Da=c;this.M=b;this.zc=a;this.Ee=d}};class Ys{constructor(a,b,c,d,e,f,g,h){this.Ys=[];this.Vs=[];this.iw=!1;this.zg=a;this.yg=b;this.Zz=c;this.Tg=d;this.Vg=e||null;this.fg=f;this.AE=g;this.E$=h}Ey(){return this.E$}slideWidth(){return this.zg}slideHeight(){return this.yg}oa(){return this.Zz}lb(){return this.Tg}uc(){return this.Vg}wa(){return this.fg}};function rv(a,b,c,d,e,f){this.G=a;this.zc=b;this.Y=c;this.zg=d;this.yg=e;this.fg=f;this.lU=new C;this.kU=new C}rv.prototype.W=-1;rv.prototype.lda=function(){return this.Y.progress()};rv.prototype.transitionProgress=rv.prototype.lda;rv.prototype.state=function(){return this.jh?this.Y.c1()?"playing":"paused":"idle"};rv.prototype.state=rv.prototype.state;rv.prototype.Mu=function(){return this.lU};rv.prototype.transitionEffectStartEvent=rv.prototype.Mu;rv.prototype.wJ=function(){return this.kU}; +rv.prototype.transitionEffectCompleteEvent=rv.prototype.wJ;function Ks(a){a.jh&&sv(a,!1)}function ct(a,b){const c=a.zc;c.Gd[b].Ir();0<=a.W&&c.Gd[a.W].Uc();a.W=b}function Xs(a){a.Zn.Ig();a.ew.Ir();a.Zn.Ir()}function bt(a){a.jh.start();a.mU=!0;Ji&&(a.w8=setInterval(a.v8,100));a.Y.Zb().addHandler(a.qX,a);a.lU.C(a.W);sj&&document.body&&yn(document.body)}k=rv.prototype;k.v8=function(){if(Ji&&document.body)return yn(document.body)};k.rX=function(){sv(this)}; +k.yN=function(a){this.jh.fB.removeHandler(this.yN,this);a&&bt(this)};k.qX=function(a){isNaN(this.hP)&&(this.hP=a,a=0);this.jh.mu()||(1>a?this.jh.Lg(a):sv(this))};function sv(a,b){void 0===b&&(b=oj);a.mU&&(a.Y.Zb().removeHandler(a.qX,a),a.mU=!1);Ji&&clearInterval(a.w8);a.jh.Ux()||a.jh.fB.removeHandler(a.yN,a);a.jh.mu()&&a.jh.ke.removeHandler(a.rX,a);a.jh.terminate();a.jh=null;Xs(a);a.Zn&&(a.Zn.Uc(),a.Zn=null);a.ew=null;b?Gi(a.FW,a):a.FW()}k.FW=function(){Cd(this.fg);this.kU.C(this.W)};function tv(){this.Wq=new C;this.kH=new C;this.mH=new C}k=tv.prototype;k.pe=0;k.iM=!1;k.progress=function(){return this.pe};k.Lg=function(a){this.pe=a;this.Wq.C(a)};k.c1=function(){return this.iM};k.start=function(){this.iM=!0};k.stop=function(){this.iM=!1};k.Zb=function(){return this.Wq};k.Ml=function(){return this.kH};k.Pr=function(){return this.mH};k.$=function(){return this};function R(a){this.Zz=a.oa();this.ew=a.lb();this.Zn=a.uc();this.aA=!0;this.W7=a;this.zg=a.slideWidth();this.yg=a.slideHeight();this.fB=new C;this.ke=new C;this.fg=a.wa();this.AE=a.AE;this.zg>this.yg?(this.tM=Math.min(this.zg,1024),this.Os=this.tM/this.zg,this.sM=this.yg*this.Os):(this.sM=Math.min(this.yg,1024),this.Os=this.sM/this.yg,this.tM=this.zg*this.Os);this.uO=wd("DIV");wn(this.uO,1/this.Os,1/this.Os);this.lf=Ii}k=R.prototype; +k.start=function(){this.fg.appendChild(this.uO);var a=this.uc().slide();mn(a,"transitionSlide");a=this.lb().slide();mn(a,"transitionSlide");this.initialize();this.Lg(0)};k.terminate=function(){this.Lg(1);this.eI();this.Y&&(this.Y.Ml().removeHandler(this.BW,this),this.Y.Pr().removeHandler(this.AW,this));var a=this.uc().slide();nn(a,"transitionSlide");a=this.lb().slide();nn(a,"transitionSlide");Cd(this.fg)}; +function uv(a,b){b?(b=a.uc().slide(),mn(b,"paused"),a=a.lb().slide(),mn(a,"paused")):(b=a.uc().slide(),nn(b,"paused"),a=a.lb().slide(),nn(a,"paused"))}k.Lg=function(a){if(this.Ux()){var b=this.Ia;a=this.oa()?1-a:a;b.call(this,a)}};k.Ux=function(){return this.aA};k.iw=function(){return this.W7.iw};k.oa=function(){return this.Zz};k.initialize=function(){};k.eI=function(){};k.Ia=function(){};k.lb=function(){return this.oa()?this.Zn:this.ew};k.uc=function(){return this.oa()?this.ew:this.Zn}; +function vv(a,b){null!=a.uc()&&a.uc().Cu(b)}function wv(a,b){a.lb().Cu(b)} +k.Ma=function(a,b,c,d,e,f){function g(){if(!--h){var A=t,J=w,T=y,U=D,X=I;this.qb=p;this.Ea=A;this.Rn=J;this.IF=U;this.pq=T;this.OF=X;this.iX();1!=this.aA&&(this.aA=!0,this.fB.C(!0))}}0!=this.aA&&(this.aA=!1,this.fB.C(!1));let h=0;for(var l=0;l>1;a|=a>>2;a|=a>>4;a|=a>>8;return(a|a>>16)+1}function zv(a,b){b=b||0;return Math.round(a*Math.pow(10,b))/Math.pow(10,b)};function Av(a){R.call(this,a)}var Bv,Cv;r(Av,R);function Dv(a,b){a.Hs();a.Qz(b);b=a.N;a.mb=mat4.create();a.IX=mat4.create();b.viewport(0,0,b.F2,b.E2);b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT);const c=.5*a.slideHeight()/Math.tan(22.5*Math.PI/180);mat4.perspective(45,b.F2/b.E2,1,1E4,a.IX);mat4.identity(a.mb);mat4.translate(a.mb,[0,0,-c])}k=Av.prototype; +k.Hs=function(){this.Kq=!0;void 0===Bv&&(Bv=S(this.slideWidth()+3,this.slideHeight()+3),F(Bv,"left","-1px"),F(Bv,"top","-1px"));void 0===Cv&&(Cv=Bv.getContext("webgl")||Bv.getContext("experimental-webgl"));this.wa().appendChild(Bv);try{Cv.F2=Bv.width,Cv.E2=Bv.height,Cv.enable(Cv.DEPTH_TEST)}catch(b){}const a=this.N=Cv;this.sL=Ev(this,a.FRAGMENT_SHADER,this.Th());this.PP=Ev(this,a.VERTEX_SHADER,this.Uh());null!==this.sL&&null!==this.PP&&(this.Jq=a.createProgram(),a.attachShader(this.Jq,this.PP),a.attachShader(this.Jq, +this.sL),a.linkProgram(this.Jq),a.getProgramParameter(this.Jq,a.LINK_STATUS)?(a.useProgram(this.Jq),this.gi()):this.Kq=!1)};k.eI=function(){this.N&&(this.Qh(),Fv(this,this.OP),Fv(this,this.mP),Fv(this,this.ZX),Fv(this,this.nW),this.Rh(),this.N.deleteTexture(this.IB),this.N.deleteShader(this.sL),this.N.deleteShader(this.PP),this.N.deleteProgram(this.Jq))};k.Rh=function(){alert("override _disableAttributes")};k.Qh=function(){}; +function Gv(a,b){a.N.bindBuffer(a.N.ARRAY_BUFFER,null);a.N.deleteBuffer(b.ug);a.N.deleteBuffer(b.gg);a.N.deleteBuffer(b.Bg);a.N.deleteBuffer(b.Vn)}k.Qz=function(a){this.IB=Hv(this,this.N.TEXTURE0,this.Gj(),0,a)}; +function Hv(a,b,c,d,e,f){const g=a.N;var h=a.slideWidth(),l=a.slideHeight();h=yv(h);l=yv(l);a=a.N.getParameter(a.N.MAX_TEXTURE_SIZE);if(Math.max(h,l)>a){var n=h/l;h>l?(h=a,l=h/n):(l=a,h=l*n)}a=new cd(h,l);h=a.width;l=a.height;a=S(h,l);n=a.getContext("2d");void 0!==f?f(n,e,h,l):n.drawImage(e,0,0,h,l);e=g.createTexture();g.activeTexture(b);g.bindTexture(g.TEXTURE_2D,e);g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,a);g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MAG_FILTER,g.LINEAR);g.texParameteri(g.TEXTURE_2D, +g.TEXTURE_MIN_FILTER,g.LINEAR_MIPMAP_LINEAR);g.generateMipmap(g.TEXTURE_2D);g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_S,g.CLAMP_TO_EDGE);g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_T,g.CLAMP_TO_EDGE);g.bindTexture(g.TEXTURE_2D,null);g.activeTexture(b);g.bindTexture(g.TEXTURE_2D,e);g.uniform1i(c,d);return e}k.Th=function(){alert("Please override _getFragmentShaderSource");return""};k.Uh=function(){alert("Please override _getVertexShaderSource");return""};k.gi=function(){}; +function Ev(a,b,c){const d=a.N;b=d.createShader(b);d.shaderSource(b,c);d.compileShader(b);return d.getShaderParameter(b,d.COMPILE_STATUS)?b:(a.Kq=!1,null)}function Iv(a,b,c){a=a.N;const d=b.length/c,e=a.createBuffer();a.bindBuffer(a.ARRAY_BUFFER,e);a.bufferData(a.ARRAY_BUFFER,new Float32Array(b),a.DYNAMIC_DRAW);e.Vx=c;e.v1=d;return e} +function Jv(a,b){a=a.N;const c=b.length/1,d=a.createBuffer();a.bindBuffer(a.ELEMENT_ARRAY_BUFFER,d);a.bufferData(a.ELEMENT_ARRAY_BUFFER,new Uint16Array(b),a.DYNAMIC_DRAW);d.Vx=1;d.v1=c;return d}function Kv(a){if(0==a.EM.length)throw"Invalid popMatrix!";a.mb=a.EM.pop()}function Lv(a){const b=mat4.create();mat4.set(a.mb,b);a.EM.push(b)}function Mv(a,b,c,d){mat4.translate(a.mb,[-d[0],-d[1],-d[2]]);mat4.rotate(a.mb,b*Math.PI/180,c);mat4.translate(a.mb,d)} +function Nv(a,b,c,d,e){const f=a.N,g=b.ug;f.bindBuffer(f.ARRAY_BUFFER,g);void 0!==d&&d();f.vertexAttribPointer(a.OP,g.Vx,f.FLOAT,!1,0,0);b.Vn&&(d=b.Vn,f.bindBuffer(f.ARRAY_BUFFER,d),void 0!==e&&e(),f.vertexAttribPointer(a.Fz(),d.Vx,f.FLOAT,!1,0,0));e=b.Bg;f.bindBuffer(f.ARRAY_BUFFER,e);f.vertexAttribPointer(a.mP,e.Vx,f.FLOAT,!1,0,0);a.$J();a=b.gg;f.bindBuffer(f.ELEMENT_ARRAY_BUFFER,a);void 0===c&&(c=f.TRIANGLES);f.drawElements(c,a.v1,f.UNSIGNED_SHORT,0)} +k.Fz=function(){alert("override _getVertexNormalAttributeLocation");return-1};k.Gj=function(){alert("override _getSamplerUniform");return null};k.$J=function(){};function Ov(a){a.OP=Pv(a,"aVertexPosition");a.mP=Pv(a,"aTextureCoord");a.ZX=Qv(a,"uPMVMatrix");a.nW=Qv(a,"uNMatrix")} +function Rv(a,b){let c=0;for(let e=0;ea){var b=Y(0,0,.3,1)(a);this.xs(b,!0);this.xs(b,!1)}b=this.slideWidth();var c=this.slideHeight();c=Math.max(b,c);const d=this.P==mw?1:-1;Lv(this);.1<=a&&(.1=a?(a=Y(.1,0,.4,1)(a),nw(this,a),mat4.translate(this.mb,[0,0,-a*c/4]),Mv(this,-60*a,[1,0,0],[-d*b/4,0,0]),Mv(this,45*d*a,[0,0,1],[-d*b/4,0,0])):.4=a?(a=Y(.4,0,.5,1)(a),nw(this,1),mat4.translate(this.mb,[0,0,-c/4]),mat4.translate(this.mb,[d*a*c/50,-a*c/50,a*c/50]),Mv(this, +-60,[1,0,0],[-d*b/4,0,0]),Mv(this,45*d,[0,0,1],[-d*b/4,0,0])):.5a?(a=Y(.5,0,.55,1)(a),nw(this,1),mat4.translate(this.mb,[0,0,-c/4]),mat4.translate(this.mb,[d*c/50,-c/50,c/50]),Mv(this,-60,[1,0,0],[-d*b/4,0,0]),Mv(this,45*d,[0,0,1],[-d*b/4,0,0]),Mv(this,-1*a,[1,0,0],[0,0,0])):.55h;++h){var d=g,e=a,f=b;d=3*(1-3*f+3*e)*d*d+2*(3*f-6*e)*d+3*e;if(0==d)break;g-=((((1-3*b+3*a)*g+(3*b-6*a))*g+3*a)*g-c)/d}c=(-2*g+3)*g*g}return c}}var Ew=Dw(.42,.58);function Y(a,b,c,d){return function(e){return b+(d-b)/(c-a)*(e-a)}}function pw(a,b,c){if(c=b)return 1;a=(c-a)/(b-a);return-2*Math.pow(a,3)+3*Math.pow(a,2)} +function Fw(a,b,c,d){if(d>1)}const c=this.Ea,d=this.qb;var e=this.slideWidth(),f=this.slideHeight();e=Math.floor(e/7);f=Math.floor(f/5);const g=c.width-6*e,h=c.height-4*f;this.wn=[];for(let l=0;5>l;++l){const n=b(5,l),m=n*f,p=4==n?h:f+1;for(let t=0;7>t;++t){const w=b(7,t),y=new Mw(c,d,w*e,m,6==w?g:e+1,p,a,this.As,this.Bc);this.vt.appendChild(y.Tp);this.wn[7*n+w]=y}}Nw(this)}; +Kw.prototype.NL=function(){const a=this.slideWidth(),b=this.slideHeight();Nh(this.vt,a,b);var c=(.5*a).toString()+"px "+(.5*b).toString()+"px";Di(this.vt,this.UA.toString()+"px");Ei(this.vt,c);Lb&&(c=zd("DIV"),this.vt.appendChild(c),Nh(c,a,b),F(c,"position","absolute"),Ci(c,"preserve-3d"),this.vt=c)}; +function Nw(a){var b=.7-.15,c=a.P==Lw?b/4:0,d=a.P==Ow?b/6:0;b=0;var e=1;for(var f=0;5>f;++f)for(let g=0;7>g;++g){const h=f*c+g*d+.15*Math.random();b=Math.max(h,b);e=Math.min(h,e);a.wn[g+7*f].jQ=h}c=e;b=.7/(b-c);for(d=0;5>d;++d)for(e=0;7>e;++e)f=a.wn[e+7*d],f.jQ=(f.jQ-c)*b}Kw.prototype.Ia=function(a){const b=this.wn.length;for(let c=0;ce:1=c&&Qw(a,!0);xi(a.Tp,(a.Nz?"rotateX(-":"rotateY(")+b.toString()+"deg)")}else a.nF?90<=b&&Qw(a,!1):90>=b&&Qw(a,!0),xi(a.Tp,(a.Nz?"scaleY(":"scaleX(")+Math.cos(a.cE*Math.PI/180).toString()+")");G(a.VG,.5*Math.sin(a.cE*Math.PI/180))}} +function Qw(a,b){const c=b?a.HU:a.WD,d=b?a.WD:a.HU;a.nF=b;F(c,"visibility","visible");F(d,"visibility","hidden")};function Rw(a,b){R.call(this,a);this.P=b;this.lf=!1;this.Ma(!1,!0);this.P==Sw?(this.Pg=(1-Tw)/(Uw-1),this.RS=2*this.slideWidth()/Math.pow(Tw,2)):(this.Pg=.25,this.RS=2*this.slideHeight()/Math.pow(Tw,2))}r(Rw,R);function Vw(a,b,c,d,e,f){const g=S(e+1,f+1);g.getContext("2d").drawImage(a.Ea,c,d,e,f,0,0,e+1,f+1);b.push(new Ww(g,c,d,e,f))} +Rw.prototype.initialize=function(){let a;a=this.P==Sw?Uw:Xw;const b=this.slideWidth(),c=this.slideHeight();this.fv=[];this.gv=[];const d=b/a,e=c/a;let f=0;for(let h=0;h=b?0:a.RS*Math.pow(b,2)/2}function Zw(a,b){const c=a.slideHeight();let d=0,e=a.Pg,f=0,g=1,h=e,l=1;a.oa()&&(d=c,e=1-e,f=1-f,g=1-g,h=e,l=1-l);if(!a.oa()){if(be)return d;return c*(f+(g-f)/(l-h)*(b-h))} +Rw.prototype.Ia=function(a){let b,c,d;const e=this.Ea.getContext("2d");e.clearRect(0,0,this.slideWidth(),this.slideHeight());if(this.P==Sw){for(b=0;b1-ex?1-a:ex;var b=Math.max(this.slideWidth(),this.slideHeight());b=Y(0,0,ex,.2*-b);const c=Y(0,0,ex,10);yi(this.pa,"50% 100%");xi(this.pa,"rotateX("+c(a)+"deg) translateZ("+b(a)+"px)")}; +k.PL=function(a){const b=this.slideWidth(),c=this.slideHeight();this.jl=this.il=this.Xl=this.Wl=0;switch(a){case fx:this.Xl=1;this.il=gx*b;this.jl=-gx*c;break;case hx:this.Xl=-1;this.il=-gx*b;this.jl=gx*c;break;case ix:this.Wl=-1;this.il=gx*b;this.jl=gx*c;break;case jx:this.Wl=1;this.il=-gx*b;this.jl=-gx*c;break;case kx:this.Xl=this.Wl=-1;this.il=-gx*b;this.jl=gx*c;break;case lx:this.Wl=-1;this.Xl=1;this.il=-gx*b;this.jl=-gx*c;break;case mx:this.Wl=1;this.Xl=-1;this.il=gx*b;this.jl=gx*c;break;case nx:this.Xl= +this.Wl=1,this.il=gx*b,this.jl=-gx*c}this.We?(this.Xl*=-1,this.jl*=-1):(this.Wl*=-1,this.il*=-1)}; +k.Ia=function(a){this.We&&(a=1-a);this.DM(a);if(a>=ox&&a=px&&(this.oa()||this.We?this.oa()&&this.We&&wv(this,!1):vv(this,!1),F(this.Ow,"visibility","hidden"))};var hx=0,ix=1,jx=2,fx=3,lx=4,kx=5,nx=6,mx=7,ex=.4,ox=.1,px=.7,qx=800,rx=.5,cx=.3,bx=50,gx=1,dx=1;function sx(a,b,c){R.call(this,a);this.P=b;this.We=c;this.lf=!1;this.PL(b)}r(sx,R);k=sx.prototype;k.initialize=function(){vv(this,!0);wv(this,!0);this.Gn().Ig()};k.Gn=function(){return this.We?this.uc():this.lb()};k.Ez=function(){return this.We?this.lb():this.uc()}; +k.PL=function(a){const b=this.slideWidth(),c=this.slideHeight();this.tl=this.sl=0;switch(a){case fx:this.tl=c;break;case hx:this.tl=-c;break;case ix:this.sl=b;break;case jx:this.sl=-b;break;case kx:this.sl=b;this.tl=-c;break;case lx:this.sl=b;this.tl=c;break;case mx:this.sl=-b;this.tl=-c;break;case nx:this.sl=-b,this.tl=c}this.We&&(this.sl*=-1,this.tl*=-1)};k.Ia=function(a){a=Ew(a);this.We&&(a=1-a);const b=Y(0,this.sl,1,0),c=Y(0,this.tl,1,0);Gh(this.Gn().slide(),b(a),c(a))};function tx(a,b,c){var d=new W;this.Sr=a;this.By=b;this.Cy=c;this.n=d};function ux(a){R.call(this,a);this.Ma(!1,!0)}r(ux,Av); +var vx=[0,1,2,3,2,4,5,4,6,7,6,8,9,8,10,11,10,12,13,12,14,15,14,16,17,16,18,19,18,20,21,20,22,1,23,24,2,24,25,4,25,26,6,26,27,8,27,28,10,28,29,12,29,30,14,30,31,16,31,32,18,32,33,20,33,34,23,35,36,24,36,37,25,37,38,26,38,39,27,39,40,28,40,41,29,41,42,30,42,43,31,43,44,32,44,45,33,45,46,35,47,48,36,48,49,37,49,50,38,50,51,39,51,52,40,52,53,41,53,54,42,54,55,43,55,56,44,56,57,45,57,58,47,59,60,48,60,61,49,61,62,50,62,63,51,63,64,52,64,65,53,65,66,54,66,67,55,67,68,56,68,69,57,69,70,59,71,72,60,72,73, +61,73,74,62,74,75,63,75,76,64,76,77,65,77,78,66,78,79,67,79,80,68,80,81,69,81,82,71,83,84,72,84,85,73,85,86,74,86,87,75,87,88,76,88,89,77,89,90,78,90,91,79,91,92,80,92,93,81,93,94,83,95,96,84,96,97,85,97,98,86,98,99,87,99,100,88,100,101,89,101,102,90,102,103,91,103,104,92,104,105,93,105,106,0,2,3,3,4,5,5,6,7,7,8,9,9,10,11,11,12,13,13,14,15,15,16,17,17,18,19,19,20,21,21,22,107,1,24,2,2,25,4,4,26,6,6,27,8,8,28,10,10,29,12,12,30,14,14,31,16,16,32,18,18,33,20,20,34,22,23,36,24,24,37,25,25,38,26,26,39, +27,27,40,28,28,41,29,29,42,30,30,43,31,31,44,32,32,45,33,33,46,34,35,48,36,36,49,37,37,50,38,38,51,39,39,52,40,40,53,41,41,54,42,42,55,43,43,56,44,44,57,45,45,58,46,47,60,48,48,61,49,49,62,50,50,63,51,51,64,52,52,65,53,53,66,54,54,67,55,55,68,56,56,69,57,57,70,58,59,72,60,60,73,61,61,74,62,62,75,63,63,76,64,64,77,65,65,78,66,66,79,67,67,80,68,68,81,69,69,82,70,71,84,72,72,85,73,73,86,74,74,87,75,75,88,76,76,89,77,77,90,78,78,91,79,79,92,80,80,93,81,81,94,82,83,96,84,84,97,85,85,98,86,86,99,87,87, +100,88,88,101,89,89,102,90,90,103,91,91,104,92,92,105,93,93,106,94],wx="/+8MAP/rSADoi0gA6I8MANFLSADRTwwAuitIALovDACi60gAou8MAIurSACLrwwAC6tIAAuvDAAi60gAIu8MADorSAA6LwwAUUtIAFFPDABoi0gAaI8MAH/rSAD/54QA6IeEANFHhAC6J4QAoueEAIunhAALp4QAIueEADonhABRR4QAaIeEAH/nhAD/48AA6IPAANFDwAC6I8AAouPAAIujwAALo8AAIuPAADojwABRQ8AAaIPAAH/jwAD/4AAA6IAAANFAAAC6IAAAouAAAIugAAALoAAAIuAAADogAABRQAAAaIAAAH/gAAD/88AA6JPAANFTwAC6M8AAovPAAIuzwAALs8AAIvPAADozwABRU8AAaJPAAH/zwAD/94QA6JeEANFXhAC6N4QAoveEAIu3hAALt4QAIveEADo3hABRV4QAaJeEAH/3hAD/+0gA6JtIANFbSAC6O0gAovtIAIu7SAALu0gAIvtIADo7SABRW0gAaJtIAH/7SAD//wwA6J8MANFfDAC6PwwAov8MAIu/DAALvwwAIv8MADo/DABRXwwAaJ8MAH//DAB/7wwA 8u/+EviMJALjCzwa4S7kSs1rNAHNrw4Gt0s8DLfPDAyhC0wLoa8UC4qrWAuLbyALC6tgCwrvIAsiK1gLIS8QCziLPAs3LuwNTqsQDEzOvgJkiugHYU5gLXpLHAn8aCwJ5WeUC85nZAm3p2gLoQd4C4pnjAsMJ5wLIsecCzlnhAtQB2QLZodIC31HbAv+JDQL5yPgC8/DrAu4o5wLoaOoC4rDwAsMA9ALIuPcCznD0AtQo7QLZ4OUC36DnAv+oEQL56AkC9CQBAu5cBwLonAcC4twDAsLgAQLIoAUCzmAGAtQoAALZ9AoC37QSAv+k5wL55OYC9CzuAu5s9QLotPgC4vz2AsK88QLIdOwCzjTqAtP87QLZzPoC340PAv9N3AL5pdMC8/3aAu5V4gLorecC4v3oAsKt5QLIXeACjgXdA1Ot3AGZZecC3x4PAn6WxwK5HrsB86bFAu4ezwLohtYC4ubZAsK+1wLIZtQCjf7SA9OGz4KY3tEJnh8NAD1frIJ4V5gMMz+wgO3PvANoT8UC4rfJAsLvyQLIj8YCji/DBBPHv4TYb7EY3K/+ht1TrII 4w9GCOysIArfCtim3S6MudHrDgHSzswEu8soObxO6DWk6ywqpU7sKo3rJCyOLuQsCOsYKwjO2C4gCxAuH87IHjcrCBo17oBVTEqAbUsNlBBcKKoNWcrMc3JJkhHziKAA4gc4g9DHUgO653A7pAdwKI1HZCwJZ1gsICdQKzcnTC5OR0QcYyaManbmFAf5JNAP48P0Pc6DrgG5A8A4ooPAKYwjrCwKQ5wsIMOQLDdjkCtOQ4QuZONIHXrCuED6QPAl5ABcKs1gIC+3ABQuoMAQLIqAACsL0BgsIjAoKjhQKDBOcCwtZRBgKnsxBCP58sw849NQIM0zkC22U6Arn7OsLIkzuCsNc8wtJBPUJDqTzEJP07ILZFP0S3k05Ar2tjgI4na0Y80XTB+2F1wtnzdoLIhXeCsOd4QtJVeMJTv3hEBRd2YGYhdQhHNYrADyOb4D3BjqEsvaqGi2OxgenxsoLYf7OCsO+0gsJftMJzz7QD5SuyIFXzr0pWy8LAjlnEIq2LrgccqdzA61XqRRnv7kIYf++C0PPwgsJl8MKD1/BDlTnuQAXN6ouGRffgNlrCov 1W44NeArWEHX6ij31I3c/9EqMDXSDfQ1u+pkhL0OMH+larxUpm6IWo5rFGWPTtxiCItYYAgPJGQfi4RpH49AXTYrSEYzDbi6RmkgtkSr5E1R5mgxVMj8n2eGlg3lB+Qp3WaQ4dCGcDe65pyBpGbwUY1nSGkJh5BhIGfIWjaH2I9KZug7WuS8qmoDBCHoJGAH4kL4wdBCtD66AtB1oyMoVYwDhGUK48xkIcQIZTikZEtNg/ycX+MEKm/gZIPwYToG5BC0lM1QvG63EIwxoVB0g4qQNFoMYBhPIwBMfjoApFpRIPw+ZcCQm3CRigbvMMCB3xNMJcx0XJe2lFxNn9QgZYjz6GAOM5RvJRNITDuzCH1RktQzYTMAxmfUiA/ps3Qf2dUIpcmXQDa09/SBnnfgXYe3qF4PV1xuJhcUSzx20IJR1qAyXTao4mQ38Cvm9woM0RbELcU5YLO0m4BFndukaIbbdF8QWyhpJzrcTT1alIdSemQzWLpM9l/baD3XmOon01lAn8L8IEqxnfi4nb9gXoY/PGMRHvRlKD6oVT5+WIZTPiQ0VT4FAFcelDlX6GIn x+00d9EKJG7PSWU3xSyFPMtpOHHFjOBru2jdC7yMmSipaeCPrC2knZLKzLmU7pCtBCuIoALvQKwZy6TqGm9IyjALKLUsrT0xP+iBFj5rpMFJBjh1UklElFhE1hjXJtBW1uYRI8yFbHS6BTzrpiYkhZBHCMEGh9iqHWh4mzDn6QlBZmiUV6VYyVyh4EDOo7Be3UKxB80BkIq4QZDKowJgiY1DQMEJBCSgH2TgzjXFTJ1I5Bj8VeKgYWLwdK3eQrQz3JC0ysZxGPS00bB1n9EwwYnwbJ8MAGiUISEM0jahfJpMwbCBXwBE0l4yxC7iICym0VJwYsg09Pu0NWSdnbT0xYb0JKgPkzTAJbJYjzpxzOZNEiR0WTKtGE8zxFrYMchC05UI1cC3GIevWFT6m1iEkoRX1KISdvzGKFYkhTtViPdMFdhyVRY5K1d27GLYFQoNyDbAc7041Q+uW6yrl9vY1oG7hJ8VGsDDKxngiTxZLQ9LWZRwTnm5OFD6PG/HtnAP0Pnwhby8FL+qPZkpl5+MxQAfRK0XfoC0Lh2cjT0c5SZEvSxlRBzZN0e9QG9IhZAt sGuEisDqQKa6x8lHsKrJTbYHAImvKmSDsccRV6zq0VOqJyCVq8sEgZyIrTejrEU2iCrlDI3uHUoKqw2QCM5xUB5quSIaa+2sMahtZyyLoSY4RqC1PgokqEPFNBO/ptxswyTRKLhjZIi1wzlSpkNYtJUFQSuCJ2zaEIhlPSXoLYAxpqjcR+Vk8EoCIF27gzRlziKU576wGI+0MMFCoXAQ7Y0h4SQFhBTTFKThZChl2QQ9ZL0zRIK0hFKQZMLL4mgzzhD8wrqxiSSmMhzalnHBX4ew2L8MwMi7G6FZVzEC+U8+AuClTyBQ5EvzIF3SUBiawVMMfLz1SS2nddDrknWVTYEUJNMSEekkJzA87jhQnWY7MMSaRdHJQzuzxJnFslRWxxV477OXyNajGA1lj3jQ/QZXdNYZNVkwKrO4tDXUhWY4NGCaPtUhUkcWkJ/HdeQjuXd4s7NZeWCee0kgiLrlbgta3QIgGM06LVd4lC54FVw2GASVOjihWT852KG5lhyHuZr8gKqcPReZfCWphz6BSg++QTclfHUoK1swbyf7oUMuO0yELNsxVjCcBJM4xXiO qubgL7knVJmqRcEtryjU3p7jgJeiZsBOpmVhTKvoTQSX5Eypm6e0cKIleVupSNEOjwgBQ5kK8SyCiRHTh8spWhCqEWAHaP3fIidZiBdKPVsnBmjAJQocuDZmoCipJVSmtQMFQq0A+JGxonVOn2DIz5diZY2GBVlQAsVt/hbG8a4f5gTzN4XE9j4DaFKrQrBXwCK0wrhx2LuvkOGDnbHdMYmgCXcCAxkKC0IF1BjEHVovhck9NkPIfkPgULS6wogPwRDkmrVxkVOhMpk4kJGNoIeQKNwMQJDEFwBxdyjjFZEtZBy9P2FM4znyaG3EkBxTsxL8YrMU3SCd9a0VipU9lwFTdO8RMNFZJGHtEjKQYYYvAMi0NzAlZS4TTNW7U1QiurTg4aaXKOibNs2gh1jBWApWmP4cE9VKItFIqCazjWInkfCnL1OFXz7T8LC1tuQGrldww6XXLYOSub1nAFip3RN2fYgktt0MJZSEXCjWzRgsFOxiMlbVGjEVFGCvNdiSoVm8lZn55VuKeMnmBrr5aRmZqWIgGbi3H5eUDyW5/Mkn+BAbKdng4TF4sCcpZXiK".split(" "); +k=ux.prototype;k.initialize=function(){vv(this,!1);wv(this,!0);Dv(this,this.Ea);this.Hd();this.N.enable(this.N.DEPTH_TEST);const a=mat4.create();mat4.identity(a);a[0]=this.slideWidth()/921.6;a[5]=this.slideHeight()/518.4;this.mb=mat4.multiply(this.mb,a,this.mb);this.UB=mat4.create();mat4.set(this.mb,this.UB)};k.jK=function(a){for(let b=0;b>>=0;e.push(new W(yx((0==(g>>31&1)?1:-1)*((g&2145386496)>>21),460.8,11),yx((0==(g>>20&1)?1:-1)*((g&1047552)>>10),275.3,11),yx((0==(g>>9&1)?1:-1)*(g&511),211.2,10)))}for(f=0;fwx.length-1&&(c=wx.length-1,b=0);if(0!=b||this.oa()&&!this.e5){if(this.m5!=c){var d=c!=wx.length-1?wx[c+1]:null;this.n5=xx(this,wx[c],!0);this.tW=null!=d?xx(this,d,!0):null}for(d=0;da?(f=Y(0,90,45,0),f=.5*Math.sin(f(e)*Math.PI/180),G(this.Hp,f)):(f=Y(45,0,90,90),f=.5*Math.sin(f(e)*Math.PI/180),G(this.Ip,f)));this.Bc?(a=e-n(a),0>=a?(G(this.Pc,0),G(this.Hp,0)):90<=a?(G(this.Qc,0),G(this.Ip,0)):(G(this.Pc,1),G(this.Qc,1)),xi(this.Pp,b)):(xi(this.Qc,c),xi(this.Pc,d),xi(this.Ip,c),xi(this.Hp,d))}; +var Bx=0,Ax=1,Cx=2,Dx=3;function Ex(a,b,c,d){d/=a-1;c/=b-1;const e=new aw,f=new W(0,0,1);for(let g=0;gg;++g)for(let h=c;h= max)\n\t\t{\n\t\t\treturn 1.0;\n\t\t}\n\n\t\tfloat value = (x - min) / (max - min);\n\t\tfloat squaredValue = value * value;\n\n\t\treturn -2.0 * squaredValue * value + 3.0 * squaredValue;\n\t}\n\n\tfloat calcAmp()\n\t{\n\t\tfloat periodKoef = linearInterpolation(uPhase, waveStartAppearTime, 1.0, waveStartAppearTime + WAVE_APPEAR_DURATION, MIN_AMP_KOEF);\n\t\tperiodKoef = clamp(periodKoef, MIN_AMP_KOEF, 1.0);\n\n\t\treturn calcAmpKoef(periodKoef) * uSlideWidth / WAVES_COUNT;\n\t}\n\n\tfloat calcX()\n\t{\n\t\tfloat forcedX = smoothStep(xTimesPart1.x, xTimesPart1.y, uPhase) * forcedXPath + smoothStep(xTimesPart1.z, xTimesPart1.w, uPhase) * 0.75;\n\t\tfloat dampAmpKoef = (uPhase <= xTimesPart2.w + 0.35) ? 1.0 : (diagonalRatio == 0.0 ? 1.0 : diagonalRatio);\n\t\tfloat stretchWidth = smoothStep(xTimesPart2.w, xTimesPart3.x, uPhase);\n\t\tfloat compressionWidth = smoothStep(xTimesPart3.x, xTimesPart3.y, uPhase);\n\t\tfloat deltaWidthKoef = (linearInterpolation(diagonalRatio, 0.0, 0.0, 1.0, compressionWidth) - linearInterpolation(diagonalRatio, 0.0, 0.0, 1.0, stretchWidth)) * STRETCH_KOEF;\n\n\t\tfloat dampX = smoothStep(xTimesPart2.x, xTimesPart2.y, uPhase);\n\t\tdampX -= smoothStep(xTimesPart2.y, xTimesPart2.z, uPhase) * 1.25;\n\t\tdampX += deltaWidthKoef;\n\n\t\treturn (forcedX + dampX * xDampAmp / dampAmpKoef) * uSlideWidth;\n\t}\n\n\tfloat calcY(vec3 vertex)\n\t{\n\t\tfloat cornerBounceAtStartKoef = linearInterpolation(uPhase, yTimesPart1.y, 0.0, yTimesPart1.z, MAX_CORNER_BOUNCE_AT_START_KOEF);\n\t\tfloat x0 = uLeftCurtain ? uSlideWidth * 0.25 : uSlideWidth * 0.5;\n\t\tfloat x1 = uLeftCurtain ? uSlideWidth * 0.5 : uSlideWidth * 0.75;\n\t\tfloat fx0 = uLeftCurtain ? cornerBounceAtStartKoef : MAX_CORNER_BOUNCE_AT_START_KOEF;\n\t\tfloat fx1 = uLeftCurtain ? MAX_CORNER_BOUNCE_AT_START_KOEF: cornerBounceAtStartKoef ;\n\t\tfloat colBounceAtStartKoef = linearInterpolation(vertex.x, x0, fx0, x1, fx1);\n\t\tcolBounceAtStartKoef = clamp(colBounceAtStartKoef, 0.0, MAX_CORNER_BOUNCE_AT_START_KOEF);\n\n\t\tfloat cornerBounceAtEndKoef = linearInterpolation(uPhase, yTimesPart2.y, 0.0, yTimesPart2.z, MAX_CORNER_BOUNCE_AT_END_KOEF);\n\t\tx0 = uLeftCurtain ? 0.0 : uSlideWidth * 0.5;\n\t\tx1 = uLeftCurtain ? uSlideWidth * 0.5 : uSlideWidth;\n\t\tfx0 = uLeftCurtain ? cornerBounceAtEndKoef : MAX_CORNER_BOUNCE_AT_END_KOEF;\n\t\tfx1 = uLeftCurtain ? MAX_CORNER_BOUNCE_AT_END_KOEF: cornerBounceAtEndKoef ;\n\t\tfloat colBounceAtEndKoef = linearInterpolation(vertex.x, x0, fx0, x1, fx1);\n\n\t\tfloat y0 = -smoothStep(yTimesPart1.x, yTimesPart1.y, uPhase) * colBounceAtStartKoef;\n\t\ty0 += smoothStep(yTimesPart1.y, yTimesPart1.z, uPhase) * MAX_CORNER_BOUNCE_AT_START_KOEF;\n\t\ty0 -= smoothStep(yTimesPart1.z, yTimesPart1.w, uPhase) * 0.25;\n\t\ty0 += smoothStep(yTimesPart1.w, yTimesPart2.x, uPhase) * 0.25;\n\t\ty0 -= smoothStep(yTimesPart2.x, yTimesPart2.y, uPhase) * colBounceAtEndKoef;\n\t\ty0 += smoothStep(yTimesPart2.y, yTimesPart2.z, uPhase) * (MAX_CORNER_BOUNCE_AT_END_KOEF + 1.0);\n\n\t\treturn (y0 * yAmp + rowRatio) * uSlideHeight;\n\t}\n\n\tvec3 getVertexPosition(vec3 vertex)\n\t{\n\t\tfloat amp = calcAmp();\n\t\tfloat z = -amp * sinX;\n\t\tfloat xKoef = uLeftCurtain ? 1.0 : -1.0;\n\n\t\treturn vec3(vertex.x - calcX() * xKoef, -calcY(vertex), z);\n\t}\n\n\tvoid initVertexParams(vec3 vertex)\n\t{\n\t\tfloat periodWidth = uSlideWidth / WAVES_COUNT;\n\t\tfloat frequency = PI * 2.0 / periodWidth;\n\t\tsinX = sin(frequency * vertex.x);\n\n\t\trowRatio = vertex.y / uSlideHeight;\n\n\t\tfloat halfRowRatio = rowRatio * 0.5;\n\t\tfloat halfSquaredRowRatio = rowRatio * halfRowRatio;\n\n\t\tfloat maxDT = 0.1;\n\t\tfloat dtAmp = 2.0 * maxDT;\n\t\tfloat dt = dtAmp * halfRowRatio;\n\n\t\tfloat distT = (0.6 - dt);\n\n\t\tfloat xT1 = dt;\n\t\tfloat xT2 = 0.4 + dt;\n\t\tfloat xT3 = xT2 + distT * 0.5;\n\t\tfloat xT4 = 1.0 + (1.0 - xT3);\n\n\t\tfloat xDampT1 = (xT1 + xT2) * 0.45;\n\t\tfloat xDampT2 = xT2;\n\t\tfloat xDampT3 = xT3;\n\t\tfloat xDampT4 = xDampT2 + (xDampT3 - xDampT2) * 0.5;\n\t\tfloat xDampT5 = xDampT3 + 0.075;\n\t\tfloat xDampT6 = 1.0;\n\n\t\tdistT = (0.7 - dt);\n\n\t\tfloat yT2 = 0.3 + dt;\n\t\tfloat yT3 = yT2 + distT * 0.5;\n\n\t\tfloat yDampT1 = 0.0;\n\t\tfloat yDampT2 = (yDampT1 * 2.0 + 0.35) * 0.5;\n\t\tfloat yDampT3 = yT2;\n\t\tfloat yDampT4 = (yT2 + yT2 + yT3) / 3.0;\n\t\tfloat yDampT5 = (yT2 + yT3 + yT3) / 3.0;\n\t\tfloat yDampT6 = yT3 + 0.1175;\n\t\tfloat yDampT7 = 1.0;\n\n\t\txTimesPart1 = vec4(xT1, xT2, xT3 - 0.125, xT4);\n\t\txTimesPart2 = vec4(xDampT1, xDampT2, xDampT3, xDampT4);\n\t\txTimesPart3 = vec2(xDampT5, xDampT6);\n\n\t\tyTimesPart1 = vec4(yDampT1 + 0.05, yDampT2, yDampT3, yDampT4);\n\t\tyTimesPart2 = vec3(yDampT5, yDampT6, yDampT7);\n\n\t\twaveStartAppearTime = linearInterpolation(vertex.y, 0.0, WAVES_START_APPEAR_PHASE, uSlideHeight, WAVES_READY_PHASE - WAVE_APPEAR_DURATION);\n\n\t\tfloat colRatio = (uLeftCurtain ? vertex.x : uSlideWidth - vertex.x) / (uSlideWidth * 0.5);\n\t\tdiagonalRatio = (colRatio + rowRatio) * 0.5;\n\n\t\tfloat x0 = uLeftCurtain ? 0.0 : uSlideWidth * 0.5;\n\t\tfloat x1 = uLeftCurtain ? uSlideWidth * 0.5 : uSlideWidth;\n\t\tfloat fx0 = uLeftCurtain ? 0.2 : 0.0;\n\t\tfloat fx1 = uLeftCurtain ? 0.0 : 0.2;\n\t\tforcedXPath = 0.2 * (colRatio + linearInterpolation(vertex.x, x0, fx0, x1, fx1));\n\n\t\tfloat mxDampAmp = 0.1 * diagonalRatio;\n\t\tfloat dampAcc = 2.0 * mxDampAmp;\n\t\txDampAmp = dampAcc * halfRowRatio;\n\n\t\tfloat maxYAmp = 0.02;\n\t\tfloat dyAmp = 2.0 * maxYAmp * diagonalRatio * rowRatio;\n\t\tyAmp = dyAmp * halfSquaredRowRatio;\n\t}\n\n\tvec3 getVertexNormal(vec3 vertex, vec3 p)\n\t{\n\t\tbool rightSideXPos = vertex.x == (uLeftCurtain ? uSlideWidth * 0.5 : uSlideWidth);\n\t\tfloat deltaWidth = rightSideXPos ? -DELTA_W : DELTA_W;\n\n\t\tvec3 rightVertex = vec3(vertex.x + deltaWidth, vertex.y, vertex.z);\n\t\tinitVertexParams(rightVertex);\n\t\tvec3 right = getVertexPosition(rightVertex);\n\n\t\tvec3 downVertex = vec3(vertex.x, vertex.y + DELTA_H, vertex.z);\n\t\tinitVertexParams(downVertex);\n\t\tvec3 down = getVertexPosition(downVertex);\n\n\t\tvec3 v1 = vec3(right.x - p.x, right.y - p.y, right.z - p.z);\n\t\tvec3 v2 = vec3(down.x - p.x, down.y - p.y, down.z - p.z);\n\n\t\tvec3 n = rightSideXPos ? cross(v1, v2) : cross(v2, v1);\n\t\tn = normalize(n);\n\n\t\treturn n;\n\t}\n\n\tvoid main(void)\n\t{\n\t\tvTextureCoord = aTextureCoord;\n\n\t\tvec3 vertex = vec3(aVertexPosition.x, -aVertexPosition.y, aVertexPosition.z);\n\t\tinitVertexParams(vertex);\n\t\tvec3 p = getVertexPosition(vertex);\n\n\t\tvec3 pNormal = getVertexNormal(vertex, p);\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\n\t\tif (vertex.y == 0.0)\n\t\t{\n\t\t\tfloat maxDY = calcAmpKoef(MIN_AMP_KOEF) * uSlideWidth / WAVES_COUNT * 0.4;\n\t\t\tp.y += max(0.0, min(maxDY, linearInterpolation(uPhase, WAVES_START_APPEAR_PHASE, 0.0, WAVES_START_APPEAR_PHASE + WAVE_APPEAR_DURATION, maxDY)));\n\t\t}\n\t\tgl_Position = uPMVMatrix * vec4(p, 1.0);\n\t}"}; +k.sS=function(){if(void 0!==this.Kq)return this.Kq;this.Hs();return this.Kq=this.Kq};k.Hs=function(){void 0===this.N&&Ix.Mb.Hs.call(this)};k.Ia=function(a){this.N.uniform1f(this.tg,a);this.iU=!0;Nv(this,this.iA,this.N.TRIANGLE_STRIP);this.iU=!1;Nv(this,this.kB,this.N.TRIANGLE_STRIP)}; +k.gi=function(){Ov(this);this.gf=Qv(this,"uSampler");this.tg=Qv(this,"uPhase");this.s5=Qv(this,"uLeftCurtain");const a=Qv(this,"uSlideWidth");this.N.uniform1f(Qv(this,"uSlideHeight"),this.slideHeight());this.N.uniform1f(a,this.slideWidth())};k.Qh=function(){Gv(this,this.iA);Gv(this,this.kB)};k.Rh=function(){};k.$J=function(){this.N.uniform1i(this.s5,this.iU?1:0)}; +k.Hd=function(){var a=this.slideWidth();const b=this.slideHeight();this.LV=Fx(a,b,0,31);this.NY=Fx(a,b,30,61);this.Ce=Gx(15,31);this.iA=new Wv;a=Iv(this,cw(this.LV),3);this.iA.ug=a;a=Iv(this,dw(this.LV),2);this.iA.Bg=a;a=Jv(this,this.Ce);this.iA.gg=a;this.kB=new Wv;a=Iv(this,cw(this.NY),3);this.kB.ug=a;a=Iv(this,dw(this.NY),2);this.kB.Bg=a;a=Jv(this,this.Ce);this.kB.gg=a};k.Gj=function(){return this.gf};function Jx(a){R.call(this,a);this.lb().Ig();this.lf=!1}r(Jx,R);Jx.prototype.initialize=function(){vv(this,!0);wv(this,!0)};Jx.prototype.Ia=function(a){.3>a?G(this.lb().slide(),0):G(this.lb().slide(),1)};function Kx(a){R.call(this,a);this.lb().Ig();this.lf=!1}r(Kx,R);Kx.prototype.initialize=function(){vv(this,!0);wv(this,!0);this.Ng=document.createElement("div");Oh(this.Ng,this.slideWidth());Ph(this.Ng,this.slideHeight());F(this.Ng,"backgroundColor","#000000");F(this.Ng,"position","relative");this.wa().appendChild(this.Ng)};Kx.prototype.Ia=function(a){.5>a?(G(this.lb().slide(),0),G(this.Ng,0)):.8>a?G(this.Ng,1):(G(this.Ng,0),G(this.lb().slide(),1))};function Lx(a){R.call(this,a);this.lf=!1;this.Ma(!1,!0);this.OM=0;a=this.slideWidth();const b=this.slideHeight(),c=Mx!=a||Nx!=b;if(!Ox||c)Ox=[],Mx=a,Nx=b,Px(a,b)}var Ox,Mx,Nx;r(Lx,R);Lx.prototype.initialize=function(){vv(this,!1);wv(this,!0);const a=this.Ea;this.wa().appendChild(a);this.CA=S(this.slideWidth(),this.slideHeight());this.CA.getContext("2d").drawImage(a,0,0)}; +function Px(a,b){var c=Ox;a/=54;const d=b/42;let e=0,f=0;for(b=0;54>b;++b){f=0;const g=Math.round((b+1)*a)-e,h=e;for(let l=0;42>l;++l){const n=Math.round((l+1)*d)-f,m=new Qx(h,f,g,n);m.Nr=Math.random();c.push(m);f+=n}e+=g}c.sort(function(g,h){return g.Nrh.Nr?1:0});a=c.length;for(b=0;b time)\n\t\t{\n\t\t\treturn linearInterpolation(phase, time, ANGLE_3, 1.0, ANGLE_2);\n\t\t}\n\t\tfloat angle = linearInterpolation(phase, constAngleTime, ANGLE_2, time, ANGLE_3);\n\t\treturn angle;\n\t}\n\n\tfloat getRowAngleByPhase(vec3 pos, float phase)\n\t{\n\t\tconst float HORIZONTAL_DELAY = 0.05;\n\t\tfloat colDelay = uDirectionIsLeft\n\t\t\t? linearInterpolation(pos.x, 0.0, 0.0, uSlideWidth, HORIZONTAL_DELAY)\n\t\t\t: linearInterpolation(pos.x, 0.0, HORIZONTAL_DELAY, uSlideWidth, 0.0);\n\n\t\tphase = linearInterpolation(phase, 0.0, colDelay, 1.0, 1.0);\n\n\t\tfloat constAngleTime = linearInterpolation(pos.y, 0.0, TIME_2, uSlideHeight, TIME_1);\n\t\tif (phase > constAngleTime)\n\t\t{\n\t\t\treturn goBack(pos.y, phase, constAngleTime);\n\t\t}\n\n\t\tfloat angle = linearInterpolation(phase, 0.0, ANGLE_1, constAngleTime, ANGLE_2);\n\t\treturn angle;\n\t}\n\n\tvec3 getVertexPosition(float phase, vec3 pos)\n\t{\n\t\tfloat R_1 = uSlideHeight;\n\t\tfloat R_2 = uSlideHeight * 0.25;\n\t\tvec2 r = vec2(linearInterpolation(pos.y, 0.0, R_1, uSlideHeight, 0.0), linearInterpolation(pos.y, 0.0, R_2, uSlideHeight, 0.0));\n\n\t\tfloat angle = getRowAngleByPhase(pos, phase);\n\t\tvec3 v = ellipse(angle, pos, vec2(0.0, 0.0), r);\n\t\treturn v;\n\t}\n\tvec3 getVertexNormal(float phase, vec3 pos)\n\t{\n\t\tconst float DELTA_W = 1.0;\n\t\tconst float DELTA_H = 1.0;\n\n\t\tfloat deltaWidth = (pos.x == uSlideWidth) ? -DELTA_W : DELTA_W;\n\t\tfloat deltaHeight = (pos.y == uSlideHeight) ? -DELTA_H : DELTA_H;\n\n\t\tvec3 right = getVertexPosition(phase, vec3(pos.x + deltaWidth, pos.y, pos.z));\n\t\tvec3 down = getVertexPosition(phase, vec3(pos.x, pos.y + deltaHeight, pos.z));\n\t\tvec3 p = getVertexPosition(phase, vec3(pos.x, pos.y, pos.z));\n\n\t\tvec3 v1 = right - p;\n\t\tvec3 v2 = down - p;\n\n\t\tvec3 n = (pos.x == uSlideWidth) ? cross(v1, v2) : cross(v2, v1);\n\n\t\treturn normalize(n);\n\t}\n\n\tvoid main(void)\n\t{\n\t\tfloat phase = uPhase;\n\t\tif (phase < START_PHASE)\n\t\t{\n\t\t\tphase = 0.0;\n\t\t}\n\t\telse if (phase > END_PHASE)\n\t\t{\n\t\t\tphase = 1.0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tphase = linearInterpolation(phase, START_PHASE, 0.0, END_PHASE, 1.0);\n\t\t}\n\t\t\n\t\tvec3 vertex = vec3(aVertexPosition.x, -aVertexPosition.y, aVertexPosition.z);\n\t\tvec4 p = vec4(getVertexPosition(phase, vertex), 1.0);\n\t\tgl_Position = uPMVMatrix * p;\n\t\tvTextureCoord = aTextureCoord;\n\n\t\tvec3 pNormal = getVertexNormal(phase, vertex);\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\t}"}; +k.Ia=function(a){this.N.uniform1f(this.tg,a);Nv(this,this.sz,this.N.TRIANGLE_STRIP)};k.gi=function(){Ov(this);this.gf=Qv(this,"uSampler");this.tg=Qv(this,"uPhase");const a=Qv(this,"uDirectionIsLeft"),b=Qv(this,"uSlideWidth");this.N.uniform1f(Qv(this,"uSlideHeight"),this.slideHeight());this.N.uniform1f(b,this.slideWidth());this.N.uniform1i(a,this.P==Vx?1:0)};k.Rh=function(){}; +k.Hd=function(){this.mg=Ex(30,30,this.slideWidth(),this.slideHeight());this.Ce=this.P==Vx?Hx(30,30):Gx(30,30);this.sz=new Wv;var a=Iv(this,cw(this.mg),3);this.sz.ug=a;a=Iv(this,dw(this.mg),2);this.sz.Bg=a;a=Jv(this,this.Ce);this.sz.gg=a};k.Qz=function(a){this.IB=Hv(this,this.N.TEXTURE0,this.Gj(),0,a,this.qL.bind(this))};k.Qh=function(){Gv(this,this.sz)};k.qL=function(a,b,c,d){a.translate(0,d);a.scale(1,-1);a.drawImage(b,0,0,c,d)};k.Gj=function(){return this.gf};var Vx=0;function at(a){R.call(this,a)}r(at,R);function Wx(a){R.call(this,a);this.lb().Ig();this.lf=!1}r(Wx,R);Wx.prototype.initialize=function(){};Wx.prototype.Ia=function(a){G(this.lb().slide(),a)};function Xx(a){R.call(this,a);this.lb().Ig()}r(Xx,R);Xx.prototype.initialize=function(){vv(this,!0);this.lf=!1;this.Ng=document.createElement("div");Oh(this.Ng,this.slideWidth());Ph(this.Ng,this.slideHeight());F(this.Ng,"backgroundColor","#000000");F(this.Ng,"position","relative");this.wa().appendChild(this.Ng)};Xx.prototype.Ia=function(a){.5>a?(G(this.Ng,1-2*(.5-a)),wv(this,!1)):(G(this.Ng,1-2*(a-.5)),wv(this,!0))};function Yx(a,b){R.call(this,a);this.P=b;this.Ma(!1,!0)}r(Yx,Av);k=Yx.prototype;k.initialize=function(){vv(this,!1);wv(this,!0);Dv(this,this.Ea);this.Hd();mat4.translate(this.mb,[-this.slideWidth()/2,-this.slideHeight()/2,0]);Vv(this)};k.Th=function(){return"precision mediump float; \n\n\tvarying vec2 vTextureCoord; \n\tvarying vec3 vNormal; \n\n\tuniform sampler2D uSampler; \n\n\tvoid main(void) \n\t{ \n\t\tvec3 n = normalize(vNormal); \n\t\tvec3 lightingDirection = vec3(0.0, 0.0, 1.0); \n\t\tfloat directionalLightWeighting = dot(n, lightingDirection); \n\t\tfloat intentsity = 0.55 + 0.45 * directionalLightWeighting; \n\t\tvec4 textureColor = texture2D(uSampler, vTextureCoord); \n\t\tgl_FragColor = vec4(textureColor.rgb * intentsity, textureColor.a); \n\t}"}; +k.Uh=function(){return"attribute vec3 aVertexPosition;\n\tattribute vec2 aTextureCoord;\n\n\tuniform mat4 uPMVMatrix;\n\tuniform mat3 uNMatrix;\n\n\tuniform float uPhase;\n\tuniform bool uDirectionIsLeft;\n\tuniform float uSlideHeight;\n\tuniform float uSlideWidth;\n\n\tvarying vec2 vTextureCoord;\n\tvarying vec3 vNormal;\n\n\tconst float DELAY_ANGLE = 5.0;\n\tconst float SLIDE_WIDTH_KOEF = 0.2;\n\tconst float PI = 3.14159265358979323846264;\n\tconst vec2 CENTER = vec2(0.0, 0.0);\n\tconst float DELTA_W = 0.5;\n\tconst float DELTA_H = 0.5;\n\n\tfloat linearInterpolation(float x, float x0, float fx0, float x1, float fx1)\n\t{\n\t\treturn mix(fx0, fx1, (x - x0) / (x1 - x0));\n\t}\n\n\tvec2 ellipse(float angle, vec2 center, vec2 radius)\n\t{\n\t\tfloat ang = radians(angle);\n\t\treturn vec2((center.x + radius.x * cos(ang)), -(center.y + radius.y * sin(ang)));\n\t}\n\n\tfloat accelerationFunc(float progress)\n\t{\n\t\tfloat a = 3.0;\n\t\tfloat b = 1.0;\n\t\tfloat c = 1.0;\n\t\tfloat d = 1.0;\n\n\t\tfloat squaredProgress = progress * progress;\n\t\treturn a * squaredProgress * progress + b * squaredProgress + c * progress + d;\n\t}\n\n\tfloat getRowAngleByPhase(vec3 vertex)\n\t{\n\t\tfloat endAngle = atan(uSlideHeight * 0.5 / max(uSlideWidth, uSlideHeight)) * 180.0 / PI + 90.0 + DELAY_ANGLE * 4.0;\n\n\t\tfloat a = -0.6;\n\t\tfloat b = 2.0 + a;\n\n\t\tfloat phase = linearInterpolation(uPhase, 0.0, a, 1.0, b);\n\t\tphase = accelerationFunc(phase);\n\n\t\tfloat angle = linearInterpolation(phase, accelerationFunc(a), 0.0, accelerationFunc(b), endAngle);\n\t\tfloat rowDelayAngle = linearInterpolation(vertex.y, 0.0, DELAY_ANGLE, uSlideHeight, 0.0);\n\t\tfloat extraAngle = linearInterpolation(uPhase, 0.5, 0.0, 0.8, DELAY_ANGLE);\n\t\tfloat maxDelayAngle = DELAY_ANGLE + max(0.0, min(DELAY_ANGLE, extraAngle));\n\t\tfloat colAngle = uDirectionIsLeft\n\t\t\t? linearInterpolation(vertex.x, 0.0, maxDelayAngle * 0.5, uSlideWidth, maxDelayAngle)\n\t\t\t: linearInterpolation(vertex.x, 0.0, maxDelayAngle, uSlideWidth, maxDelayAngle * 0.5);\n\n\t\tfloat colDelayAngle = uDirectionIsLeft\n\t\t\t? linearInterpolation(vertex.x, 0.0, 0.0, uSlideWidth, colAngle)\n\t\t\t: linearInterpolation(vertex.x, 0.0, colAngle, uSlideWidth, 0.0);\n\n\n\t\treturn max(0.0, angle - rowDelayAngle - colDelayAngle);\n\t}\n\n\tvec3 getVertexPosition(vec3 vertex)\n\t{\n\t\tfloat maxXRadius = uSlideHeight;\n\t\tfloat maxYRadius = sqrt(uSlideWidth * SLIDE_WIDTH_KOEF * uSlideWidth * SLIDE_WIDTH_KOEF + uSlideHeight * uSlideHeight);\n\n\t\tfloat xRadius = linearInterpolation(vertex.y, 0.0, maxXRadius, uSlideHeight, 0.0);\n\t\tfloat yRadius = linearInterpolation(vertex.y, 0.0, maxYRadius, uSlideHeight, 0.0);\n\n\t\treturn vec3(vertex.x, ellipse(getRowAngleByPhase(vertex), CENTER, vec2(xRadius, yRadius)));\n\t}\n\n\tvec3 getVertexNormal(vec3 pos, vec3 p)\n\t{\n\t\tbool rightSideXPos = pos.x == uSlideWidth;\n\t\tfloat deltaWidth = rightSideXPos ? -DELTA_W : DELTA_W;\n\n\t\tvec3 right = getVertexPosition(vec3(pos.x + deltaWidth, pos.y, pos.z));\n\t\tvec3 down = getVertexPosition(vec3(pos.x, pos.y + DELTA_H, pos.z));\n\n\t\tvec3 v1 = right - p;\n\t\tvec3 v2 = down - p;\n\n\t\tvec3 n = rightSideXPos ? cross(v1, v2) : cross(v2, v1);\n\t\tn = normalize(n);\n\n\t\treturn n;\n\t}\n\n\tvoid main(void)\n\t{\n\t\tvTextureCoord = aTextureCoord;\n\n\t\tvec3 vertex = vec3(aVertexPosition.x, -aVertexPosition.y, aVertexPosition.z);\n\t\tvec4 p = vec4(getVertexPosition(vertex), 1.0);\n\t\tgl_Position = uPMVMatrix * p;\n\n\t\tvec3 pNormal = getVertexNormal(vertex, vec3(p.xyz));\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\t}"}; +k.Ia=function(a){this.N.uniform1f(this.tg,a);Nv(this,this.ng,this.N.TRIANGLE_STRIP)};k.gi=function(){Ov(this);this.gf=Qv(this,"uSampler");this.tg=Qv(this,"uPhase");const a=Qv(this,"uDirectionIsLeft"),b=Qv(this,"uSlideWidth");this.N.uniform1f(Qv(this,"uSlideHeight"),this.slideHeight());this.N.uniform1f(b,this.slideWidth());this.N.uniform1i(a,0==this.P?1:0)};k.Rh=function(){};k.Qh=function(){Gv(this,this.ng)}; +k.Hd=function(){var a=this.slideWidth();const b=this.slideHeight();this.mg=Ex(15,15,a,b);this.Ce=Gx(15,15);this.ng=new Wv;a=Iv(this,cw(this.mg),3);this.ng.ug=a;a=Iv(this,dw(this.mg),2);this.ng.Bg=a;a=Jv(this,this.Ce);this.ng.gg=a};k.Gj=function(){return this.gf};function Zx(a,b){R.call(this,a);this.P=b;this.Ma(!1,!1,!0,!0,!0,!0)}r(Zx,R);k=Zx.prototype; +k.initialize=function(){vv(this,!1);wv(this,!1);const a=this.slideWidth(),b=this.slideHeight();var c=S(a,b);F(c,"position","absolute");this.wa().appendChild(c);c.getContext("2d").drawImage(this.IF,0,0);this.Us=c;c=S(a,b);F(c,"position","absolute");this.wa().appendChild(c);c.getContext("2d").drawImage(this.OF,0,0);this.Xs=c;this.Te=this.pc(a,b);this.wa().appendChild(this.Te);var d=S(a,b);c=S(a,b);this.hH=this.pc(a,b);this.sh=this.pc(a,b);this.rh=this.pc(a,b);this.sh.appendChild(d);this.rh.appendChild(c); +this.Te.appendChild(this.hH);this.hH.appendChild(this.sh);this.hH.appendChild(this.rh);d=d.getContext("2d");c=c.getContext("2d");d.drawImage(this.pq,0,0);c.drawImage(this.Rn,0,0);Di(this.Te,Math.max(a,b)+"px");Ei(this.Te,a/2+"px "+b/2+"px");Ci(this.hH,"preserve-3d")}; +k.Ia=function(a){const b=this.slideWidth(),c=this.slideHeight();G(this.Xs,1-a);G(this.Us,a);a=pw(0,1,a);const d=this.P==$x?1:-1,e=d*this.Q2*b*(1-a),f=-this.R2*c*(1-a),g=-Math.max(b,c)*(1-a),h=-this.OS*(1-a),l=-d*this.PS*(1-a),n=d*this.S2*(1-a);xi(this.sh,"translateZ("+Math.max(b,c)*a+"px) translateY("+c*a+"px) translateX("+-d*this.T2*b*a+"px) rotateX("+this.OS*a+"deg) rotateY("+d*this.PS*a+"deg) rotateZ("+-d*this.U2*a+"deg)");xi(this.rh,"translateZ("+g+"px) translateY("+f+"px) translateX("+e+"px) rotateX("+ +h+"deg) rotateY("+l+"deg) rotateZ("+n+"deg)")};k.pc=function(a,b){const c=zd("DIV");Oh(c,a);Ph(c,b);F(c,"position","absolute");return c};k.T2=.1;k.Q2=.5;k.R2=1.75;k.S2=30;k.U2=10;k.OS=80;k.PS=30;var $x=1;function ay(a){R.call(this,a);this.lf=!1;this.Ma(!0,!0)}r(ay,R);ay.prototype.initialize=function(){this.dH=!1;vv(this,!1);wv(this,!1);const a=this.slideWidth(),b=this.slideHeight(),c=this.qb,d=this.Ea;F(c,"position","absolute");F(d,"position","absolute");var e=this.wa(),f=this.oa()?d:c;e.appendChild(f);e=this.wa();f=this.oa()?c:d;e.appendChild(f);this.CA=S(a,b);e=this.CA.getContext("2d");this.sW=S(a,b);this.sW.getContext("2d").drawImage(c,0,0);e.drawImage(d,0,0)}; +ay.prototype.Ia=function(a){const b=this.qb,c=this.Ea;.2>a?(!this.dH&&this.oa()&&(this.dH=!0,Fd(b)),by(this,c,this.CA,a/.2)):(this.dH||this.oa()||(this.dH=!0,Fd(c)),by(this,b,this.sW,(1-a)/.8))};function by(a,b,c,d){b=b.getContext("2d");const e=a.slideWidth();a=a.slideHeight();b.drawImage(c,0,0,e,a);b.save();b.globalCompositeOperation="lighter";b.fillStyle="rgba(255, 255, 255,"+zn(d)+")";b.rect(0,0,e,a);b.fill();b.restore()};function cy(a,b,c){R.call(this,a);this.Bc=c;this.oa()?this.lb().Ig():this.uc().Ig();this.Ma(!0,!0);this.P=b}r(cy,R);cy.prototype.initialize=function(){vv(this,!1);wv(this,!1);this.Kn()}; +cy.prototype.Ia=function(a){a=pw(0,1,a);let b;if(this.Bc){var c=-this.slideWidth()/2;.5>a?(b=Y(0,0,.5,-90),this.oz=b(a),b=Y(0,0,.5,-45),this.ws=b(a),b=Y(0,0,.5,40),a=this.P==dy?"translateX("+-c+"px) translateZ("+this.oz+"px) rotateY("+this.ws+"deg) rotateX("+b(a)+"deg) translateX("+c+"px)":"translateX("+c+"px) translateZ("+this.oz+"px) rotateY("+-this.ws+"deg) rotateX("+b(a)+"deg) translateX("+-c+"px)"):.85>a?(b=Y(.5,-90,.85,0),this.oz=b(a),b=Y(.5,-45,.85,0),this.ws=b(a),b=Y(.5,40,.85,90),a=this.P== +dy?"translateX("+-c+"px) translateZ("+this.oz+"px) rotateY("+this.ws+"deg) rotateX("+b(a)+"deg) translateX("+c+"px)":"translateX("+c+"px) translateZ("+this.oz+"px) rotateY("+-this.ws+"deg) rotateX("+b(a)+"deg) translateX("+-c+"px)"):(this.oa()&&(this.ws=0),b=Y(.85,90,1,180),a="translateX("+-c+"px) rotateY("+this.ws+"deg) rotateX("+b(a)+"deg) translateX("+c+"px)");xi(this.Be,a)}else.5>a?(b=Y(0,1,.5,0),a="scaleY("+b(a)+")",G(this.Qc,1),G(this.Pc,0),xi(this.Qc,a)):(b=Y(.5,0,1,1),a="scaleY("+b(a)+")", +G(this.Pc,1),G(this.Qc,0),xi(this.Pc,a))}; +cy.prototype.Kn=function(){this.Qc=this.Ea;this.Pc=this.qb;const a=wd("DIV");this.Be=wd("DIV");const b=this.slideWidth(),c=this.slideHeight();try{Di(a,b+"px"),Ei(a,b/2+"px "+c/2+"px"),Ci(this.Be,"preserve-3d"),this.Be.appendChild(this.Qc),this.Be.appendChild(this.Pc),a.appendChild(this.Be),this.wa().appendChild(a)}catch(d){this.wa().appendChild(this.Qc),this.wa().appendChild(this.Pc)}F(this.Qc,"position","absolute");F(this.Pc,"position","absolute");Nh(this.Be,b,c);Nh(this.Qc,b,c);Nh(this.Pc,b,c); +this.Bc&&(xi(this.Qc,"translateZ(10px)"),xi(this.Pc,"rotateX(180deg)"))};var dy=1;function ey(a,b,c){R.call(this,a);this.Bc=c;this.oa()?this.lb().Ig():this.uc().Ig();this.Ma(!0,!0);this.qo=b==dy}r(ey,R); +ey.prototype.initialize=function(){vv(this,!1);wv(this,!1);this.Qc=this.Ea;this.Pc=this.qb;const a=wd("DIV");this.Be=wd("DIV");const b=this.slideWidth(),c=this.slideHeight();try{Di(a,Math.max(b,c)+"px"),Ei(a,b/2+"px "+c/2+"px"),Ci(this.Be,"preserve-3d"),Fi(this.Be,"hidden"),this.qo?(this.Be.appendChild(this.Qc),this.Be.appendChild(this.Pc)):(this.Be.appendChild(this.Pc),this.Be.appendChild(this.Qc)),a.appendChild(this.Be),this.wa().appendChild(a)}catch(d){this.qo?(this.Be.appendChild(this.Qc),this.Be.appendChild(this.Pc)): +(this.Be.appendChild(this.Pc),this.Be.appendChild(this.Qc))}F(this.Qc,"position","absolute");F(this.Pc,"position","absolute");Nh(this.Be,b,c);Nh(this.Qc,b,c);Nh(this.Pc,b,c);this.Bc&&(this.qo?xi(this.Qc,"rotateY(180deg)"):xi(this.Pc,"rotateY(180deg)"))};ey.prototype.Ia=function(a){this.Bc?this.kO(a):this.mL(a)}; +ey.prototype.kO=function(a){a=this.qo?1-a:a;const b=.25*(1-Math.cos(2*a*Math.PI));a=Dw(.63,.43)(a);const c=Math.max(this.slideWidth(),this.slideHeight());xi(this.Be,"rotateY("+-180*a+"deg)translateZ("+b*c*-.3+"px)")};ey.prototype.mL=function(a){a=Dw(.63,.43)(a);if(.5>a){var b=Y(0,1,.5,0);a="scaleX("+b(a)+")";G(this.Qc,1);G(this.Pc,0);xi(this.Qc,a)}else b=Y(.5,0,1,1),a="scaleX("+b(a)+")",G(this.Pc,1),G(this.Qc,0),xi(this.Pc,a)};function fy(a){R.call(this,a);this.Ma(!1,!0)}r(fy,Av);k=fy.prototype;k.Gj=function(){return this.gf}; +k.initialize=function(){vv(this,!1);wv(this,!0);Dv(this,this.Ea);this.N.disable(this.N.DEPTH_TEST);var a=[new V(.1806930693069307,0),new V(.3725247524752475,0),new V(.4603960396039604,0),new V(.6856435643564357,0),new V(.7673267326732673,0),new V(.8849009900990099,0),new V(.9987623762376238,.02103960396039604),new V(0,.027227722772277228),new V(0,.15841584158415842),new V(.47,.16955445544554457),new V(.4876237623762376,.16955445544554457),new V(.5284653465346535,.17202970297029702),new V(.41707920792079206, +.1745049504950495),new V(1,.18316831683168316),new V(0,.19554455445544555),new V(.6076732673267327,.2042079207920792),new V(.32,.21658415841584158),new V(.6485148514851485,.2202970297029703),new V(.7141089108910891,.22153465346534654),new V(0,.2623762376237624),new V(.275990099009901,.2908415841584158),new V(.2524752475247525,.33292079207920794),new V(.22153465346534654,.38242574257425743),new V(.8081683168316832,.41336633663366334),new V(0,.44183168316831684),new V(.18935643564356436,.46410891089108913), +new V(.4752475247524752,.47029702970297027),new V(.4665841584158416,.4715346534653465),new V(.4938118811881188,.4814356435643564),new V(.5024752475247525,.48267326732673266),new V(.5099009900990099,.4863861386138614),new V(.5123762376237624,.49133663366336633),new V(.801980198019802,.4938118811881188),new V(.5148514851485149,.49876237623762376),new V(.47896039603960394,.5),new V(.47,.5),new V(.5,.5),new V(.5148514851485149,.5012376237623762),new V(.4801980198019802,.5061881188118812),new V(.5136138613861386, +.5099009900990099),new V(.48267326732673266,.5123762376237624),new V(.5099009900990099,.5136138613861386),new V(.48514851485148514,.5148514851485149),new V(.504950495049505,.5160891089108911),new V(.48886138613861385,.5185643564356436),new V(.4938118811881188,.5185643564356436),new V(.4975247524752475,.5185643564356436),new V(.5334158415841584,.5334158415841584),new V(1,.5346534653465347),new V(.4962871287128713,.5371287128712872),new V(.47648514851485146,.5396039603960396),new V(.18811881188118812, +.568069306930693),new V(0,.6485148514851485),new V(.2537128712871287,.6534653465346535),new V(.7982673267326733,.6670792079207921),new V(.28589108910891087,.7066831683168316),new V(.775,.7351485148514851),new V(1,.7784653465346535),new V(.3341584158415842,.7945544554455446),new V(.7066831683168316,.8032178217821783),new V(0,.8106435643564357),new V(.38985148514851486,.8477722772277227),new V(.47,.8564356435643564),new V(.6150990099009901,.8601485148514851),new V(1,.943069306930693),new V(0,.9826732673267327), +new V(.21905940594059406,1),new V(.34034653465346537,1),new V(.4752475247524752,1),new V(.6596534653465347,1),new V(.8403465346534653,1),new V(0,0),new V(1,0),new V(1,1),new V(0,1)],b=new aw,c=new W(0,0,1);for(var d=0;d=1-this.Ru&&(b=!1,xi(this.Fc,"translateZ("+this.JS*(1-a)+"px) rotateY("+(1-a)/this.Ru*c*this.MS+"deg)"),this.qF||this.oa()||(this.qF=this.$v=!0));if(b||this.$v)b=this.slideWidth()+this.QS,a=this.$v?this.oa()?0:1:(a-this.Ru)/(1-2*this.Ru),this.$v&&(this.$v=!1),a=a*c*b,xi(this.Vg, +"translateX("+a+"px)"),this.oo&&xi(this.jw,"translate("+a+"px, "+(this.slideHeight()+this.Fy)+"px)"),xi(this.Tg,"translateX("+(a-c*b)+"px)"),this.oo&&xi(this.fw,"translate("+(a-c*b)+"px, "+(this.slideHeight()+this.Fy)+"px)")}};k.pc=function(a,b){const c=zd("DIV");Oh(c,a);Ph(c,b);F(c,"position","absolute");return c}; +function jy(a,b,c){b=b.getContext("2d");b.save();b.translate(0,a.slideHeight()/4);b.scale(1,-1);b.drawImage(c,0,.75*a.slideHeight(),a.slideWidth(),a.slideHeight()/4,0,0,a.slideWidth(),a.slideHeight()/4);b.restore();b.globalCompositeOperation="destination-out";c=b.createLinearGradient(a.slideWidth()/4,0,a.slideWidth()/4,a.slideHeight()/4);c.addColorStop(0,"rgba(0, 255, 0, 0)");c.addColorStop(.8,"rgba(0, 255, 0, 1)");b.fillStyle=c;b.beginPath();b.rect(0,0,a.slideWidth(),a.slideHeight()/4);b.fill()} +k.$v=!1;k.qF=!1;k.Fy=7.5;k.Ru=.3;k.MS=20;k.LS=20;k.JS=-100;k.QS=70;var ky=0,ly=1;function my(a,b,c){R.call(this,a);this.Ha=b;this.P=c;this.Ma(!0,!0)}r(my,R); +my.prototype.initialize=function(){vv(this,!1);wv(this,!1);if(this.oa())switch(this.P){case ny:this.P=oy;break;case oy:this.P=ny;break;case py:this.P=qy;break;default:this.P=py}const a=this.oa()?this.qb:this.Ea,b=this.oa()?this.Ea:this.qb;this.Ha==ry?(this.PH=16,this.aQ=8):(this.PH=16,this.aQ=12);this.B$=2*this.aQ+1;const c=this.slideWidth()/this.PH,d=c/2,e=this.slideHeight()/this.aQ,f=e/2;this.ni=this.P==py||this.P==qy?this.slideWidth():this.slideHeight();this.Jt=2*this.ni;this.wn=[];let g;const h= +-f;let l;for(let n=0;nthis.NS&&(f.cM=!0)}};function sy(a,b,c){b=S(b,c);F(b,"position","absolute");a.wa().appendChild(b);return b} +function uy(a,b,c,d,e,f){b=b.getContext("2d");b.save();b.fillStyle="#FFFFFF";dh&&(zy(a,b,c,d),b.globalCompositeOperation="destination-in");b.beginPath();const g=Math.round(.5*e),h=Math.round(.5*f);e=Math.round(e);f=Math.round(f);b.moveTo(g,-1);b.lineTo(e+1,h);b.lineTo(g,f+1);b.lineTo(-1,h);b.lineTo(g,-1);b.fill();dh||(b.globalCompositeOperation="source-in",zy(a,b,c,d));b.restore()} +function vy(a,b,c,d,e,f){b=b.getContext("2d");b.save();b.fillStyle="#FFFFFF";dh&&(zy(a,b,c,d),b.globalCompositeOperation="destination-in");const g=Math.round(.5*e)+.5;e=Math.round(e)+.5;const h=Math.round(f)+.5;b.beginPath();b.moveTo(g,-1);b.lineTo(e,Math.round(.25*f)-1);b.lineTo(e,Math.round(.75*f)+1);b.lineTo(g,h);b.lineTo(-1,Math.round(.75*f)+1);b.lineTo(-1,Math.round(.25*f)-1);b.lineTo(g,1);b.fill();dh||(b.globalCompositeOperation="source-in",zy(a,b,c,d));b.restore()} +function zy(a,b,c,d){c=Math.round(c);d=Math.round(d);b.drawImage(a,-c,-d)}function yy(a,b,c){switch(a.P){case ny:return b.Xb>=c?b.Xb-c:0;case oy:return b.Xb<=c?c-b.Xb:0;case py:return b.Wb>=c?b.Wb-c:0}return b.Wb<=c?c-b.Wb:0}my.prototype.NS=.3;my.prototype.BJ=.7;var ry=0,ny=0,oy=1,py=2,qy=3;function ty(){}k=ty.prototype;k.Wb=0;k.Xb=0;k.AV=!0;k.BV=!0;k.Wf=0;k.Fv=!0;k.NB=0;k.cM=!1;k.mF=!1;k.xj=function(a){this.Wb=a;this.Mg()};k.Tf=function(a){this.Xb=a;this.Mg()}; +function wy(a,b){a.AV=b;null!=a.CB&&G(a.CB,b?1:0);b&&a.Mg()}function xy(a,b){a.BV=b;null!=a.Pw&&G(a.Pw,b?1:0);b&&a.Mg()}k.Mg=function(){null!=this.CB&&this.AV&&Gh(this.CB,this.Wb,this.Xb);null!=this.Pw&&this.BV&&Gh(this.Pw,this.Wb,this.Xb)};function Ay(a){R.call(this,a);this.Ma(!0,!0)}r(Ay,R);Ay.prototype.initialize=function(){vv(this,!1);wv(this,!1);this.OL();this.Kn()}; +Ay.prototype.Kn=function(){const a=this.slideWidth(),b=this.slideHeight();this.jm=S(a,b);this.LM=this.jm.getContext("2d");this.$U=S(a,b);this.aV=this.$U.getContext("2d");this.YV=S(a,b);this.Wv=this.YV.getContext("2d");this.KZ=S(a,b);this.z9=this.KZ.getContext("2d");this.QF=S(a,b);this.VM=this.QF.getContext("2d");this.YU=S(a,b);this.ZU=this.YU.getContext("2d");this.Oc=S(a,b);this.jg=this.Oc.getContext("2d");this.JZ=S(a,b);this.y9=this.JZ.getContext("2d");this.wa().appendChild(this.jm);this.wa().appendChild(this.QF); +F(this.jm,"position","absolute");F(this.QF,"position","absolute")}; +Ay.prototype.Ia=function(a){var b=this.slideWidth();const c=this.slideHeight();this.LM.clearRect(0,0,b,c);this.VM.clearRect(0,0,b,c);this.jg.clearRect(0,0,b,c);this.ZU.clearRect(0,0,b,c);this.jg.drawImage(this.Ea,0,0);this.jg.save();this.jg.globalCompositeOperation="destination-in";By(this,this.ZU,this.oT,a);this.jg.drawImage(this.YU,0,0);this.jg.restore();Cy(this,this.y9,this.Ea,a/Dy,!1);this.VM.drawImage(this.Oc,0,0);this.VM.drawImage(this.JZ,0,0);if(a>Ey&&a<1-Ey){var d=Y(Ey,1,1-Ey,4),e=Y(Ey,0, +1-Ey,-30);xi(this.QF,"rotate("+e(a)+"deg) scale("+d(a)+", "+d(a)+")")}a>Fy&&(this.Wv.clearRect(0,0,b,c),this.aV.clearRect(0,0,b,c),this.Wv.drawImage(this.qb,0,0),this.Wv.save(),this.Wv.globalCompositeOperation="destination-in",By(this,this.aV,this.pT,a),this.Wv.drawImage(this.$U,0,0),this.Wv.restore(),this.LM.drawImage(this.YV,0,0),a=e.sJ&&d<=e.sJ+.05){var g=(d-e.sJ)/.05;f=e.wQ?1-g:g}else f=d{b.push(new Ry(e.element,e.id))},this);u(this.Qw,e=>{b.push(new Ry(e.element,e.id))},this);const c=[0,.005,.01,.015,.02,.025,.03,.035,.04,.045,.05,.1,.15,.2,.25,.3,.35,.4,.45,.46,.47,.48,.49,.495,.498,.499];u(c,function(e){const f=this.Lo(e);u(b,g=>{const h=f[g.id];h.Lg(e);g.Or.push(h)},this)},this);Ja(c,function(e){e=1-e;const f=this.Lo(e);u(b,g=>{const h=f[g.id];h.Lg(e);g.Or.push(h)},this)},this);this.kv=0;this.vP=b.length;let d="";u(b,function(e){d+=Sy(e); +const f=e.element;f?(f.style.animation=e.id+" "+a+"s 1 linear",f.firstElementChild&&(f.firstElementChild.style.animation=e.id+"_ "+a+"s 1 linear"),ve(f,ge,this.Hk,!1,this)):this.Hk()},this);this.$f=gn(d)};k.update=function(a){this.q5!=a&&this.Lo(a);this.q5=a};k.Hk=function(){this.kv++;this.kv==this.vP&&this.ke.C()}; +function Sy(a){let b="@keyframes "+a.id+" {\n";u(a.Or,d=>{b+=d.xR+" {transform: "+d.transform+";opacity:"+d.opacity+";z-index:"+d.zIndex+"}\n"});b+="}\n";let c="";a.Or[0].yC&&(c="@keyframes "+a.id+"_ {\n",u(a.Or,d=>{c+=d.xR+" {transform:"+d.yC+"}\n"}),c+="}\n");return b+c} +k.Lo=function(a){const b=this.Bo[0];let c=this.M8*a+1;c*=b.iD;let d=this.O8*a+1;d*=b.jD;const e=Math.round(this.D$*a)+this.C$;let f=this.G8*a;f+=b.rotation;const g=this.N8*a+1,h=this.P8*a+1;if(this.ym)var l=new Vf((this.vz.top-this.ym.top)*a+this.ym.top,(this.vz.right-this.ym.right)*a+this.ym.right,(this.vz.bottom-this.ym.bottom)*a+this.ym.bottom,(this.vz.left-this.ym.left)*a+this.ym.left);const n={};u(this.Bo,function(m){if(this.fT)var p=1;else p=1-Math.pow(a,2),.425>a&&(p=a*(1-Math.pow(.425,2)- +1)/.425+1);let t=!0,w=l;this.TU&&(this.Y3?(w=this.ym,t=!1):w=void 0);p=Ty(m,c,d,f,g,h,this.TY*a,this.X_*a,this.Y_*a,p,e,w,Uy(this,m,a,!1),t);Vy(this,p);n[m.id]=p},this);u(this.Qw,function(m,p){p=Math.min(this.Bo.length-1,p);p=this.Bo[p];const t=Wy(-p.dx,-p.dy,f,c,d),w=Wy(-m.dx,-m.dy,f,c,d);if(this.fT)var y=a;else y=1+Math.pow(a-1,3),.425Math.PI?a-=2*Math.PI:a<-Math.PI&&(a+=2*Math.PI);return a==Math.PI||a==-Math.PI?-a:a} +function Uy(a,b,c,d){var e="13"==b.b2;if(!a.Bc||e){var f=e=1;"bg"==b.type&&(c=d?2*(c-.5):2*(.5-c),a.Zp!=a.PE&&(e=c),a.Zq!=a.CH&&(f=c));a="scaleX("+e+") scaleY("+f+")"}else e=a.Zp!=a.PE,f=a.Zq!=a.CH,"bg"!=b.type||!e&&!f?a="":f&&!e?a="rotateX("+(a.Zq&&!a.CH?-1:1)*c*180+"deg)"+(d?" scaleY(-1)":""):e&&!f?a="rotateY("+(a.Zp&&!a.PE?1:-1)*c*180+"deg)"+(d?" scaleX(-1)":""):a.Zp&&!a.Zq||!a.Zp&&a.Zq?(b=pw(0,1,c),a="rotateX("+-90*pw(0,1,.5>c?2*b:2*(1-b))+"deg) rotateZ("+180*(a.Zp&&!a.Zq?1:!a.Zp&&a.Zq?-1:1)* +b+"deg)"+(d?" scaleX(-1) scaleY(-1) ":"")):(b=pw(0,1,c),a="rotateX("+90*pw(0,1,.5>c?2*b:2*(1-b))+"deg) rotateZ("+180*(a.CH&&a.PE?1:a.Zq&&a.Zp?-1:1)*b+"deg)"+(d?" scaleX(-1) scaleY(-1) ":""));return a} +function Ty(a,b,c,d,e,f,g,h,l,n,m,p,t,w){var y=new gm;y.translate(a.Dda,a.Eda);y.rotate(d,0,0);y.scale(b,c);(b=a.yj)&&(y=hm(y,b));(b=a.zk)&&(y=hm(b.clone(),y));b=new gm;b.rotate(-a.Pca,0,0);b.translate(a.dx,a.dy);b=hm(b,a.yj);hm(b,im(y));c=im(b);e="rotate("+g+"rad) "+t+(" scaleX("+e+") scaleY("+f+")");h=jm(h,l);l=rn(h)+" "+rn(c)+" "+e+" "+rn(b)+" "+rn(y);h=new My(a.element);h.transform=l;""!=a.opacity&&(n*=a.opacity);h.opacity=n;h.zIndex=m;p?(n=(1-a.se.right-a.se.left)/(1-p.right-p.left),m=(1-a.se.top- +a.se.bottom)/(1-p.top-p.bottom),h.yC=a.sI+" translate("+-(a.Dl?p.right:p.left)*a.haa*n+"px, "+-(a.Pl?p.bottom:p.top)*a.gaa*m+"px) scale("+n+", "+m+")"):w&&(h.yC=a.sI);return h}function Wy(a,b,c,d,e){const f=new Eq(a,b);f.rotate(c);f.scale(d,e);f.Ii(new Eq(a,b));return f}function Ry(a,b){this.element=a;this.id=b;this.Or=[]};function Xy(a,b){this.W5=a;this.X5=b;this.o4=Zc(Xf(a.Ya),Xf(b.Ya));a=a.Fx;b=b.Fx;let c;c=a.line!=b.line?1:0;c+=a.fill!=b.fill?1:0;c+=a.iu!=b.iu?1:0;c+=a.uu!=b.uu?1:0;c+=a.Du!=b.Du?1:0;c+=a.Iu!=b.Iu?1:0;this.m4=c+=a.Ju!=b.Ju?2:0}Xy.prototype.G0=function(){return this.o4};Xy.prototype.lI=function(){return 1E3*this.m4+this.G0()/1E3};function Yy(a,b){if(a instanceof Yy)this.Hg=a.Mc();else{var c;if(c=ka(a))a:{for(var d=c=0;d=Math.abs(this.Hg[b][c]-a.Hg[b][c])))return!1;return!0};k.T0=function(){if(this.Rd.width!=this.Rd.height)throw Error("A determinant can only be take on a square matrix");return bz(this)};k.Cl=function(){return this.Rd};function cz(a,b,c){return 0<=b&&b=b?f+1:f])},a);return c}function ez(a,b){var c=new Yy(a.Rd.height,b.Cl().width);$y(c,function(d,e,f){for(var g=d=0;g{b.forEach(g=>{dz(e.lv,f.index(),g.index(),c(f,g))})});jz(this)}function jz(a){const b=a.lv.Cl().width+1,c=[];for(let d=0;da.MM.size())for(f= +1;f<=a.WM.size()-a.MM.size();f++)if(d+1==f+a.MM.size()){d=-1;break}b.push(d)}return b}function lz(a,b){const c=[];for(let d=0;d>16&255,a>>8&255,a&255]};function oz(a,b,c){this.SM=a.content();this.JM=a.content();this.links=[];this.FF=[];this.EF=[];a=pz(this,this.JM,c);b=pz(this,this.SM,b);const d={},e={};u(a,g=>{const h=g.type;d[h]=!0;e[h]?e[h].push(g):e[h]=[g]});const f={};u(b,g=>{const h=g.type;d[h]=!0;f[h]?f[h].push(g):f[h]=[g]});this.t1=[];this.z1=[];this.s1=[];this.w1=[];u(jc(d),g=>{qz(this,f[g]||[],e[g]||[])},this)} +oz.prototype.F4=function(a,b){a=a.object();b=b.object();const c=new Xy(a,b),d=rz(a,b),e=c.W5.rotation!=c.X5.rotation;c.lI()||e||!d||(this.EF.push(sz(a,b,!1)),this.EF.push(sz(a,b,!0)));d||(this.FF.push(sz(a,b,!1)),this.FF.push(sz(a,b,!0)));return d?c.lI():1E13};function sz(a,b,c){return c?ma(b)+"_"+ma(a):ma(a)+"_"+ma(b)} +function qz(a,b,c){function d(m){const p=new hz;for(let t=0;t{tz(a, +a.z1,a.SM,m)},a);u(c,m=>{tz(a,a.t1,a.JM,m)},a);u(h,m=>{tz(a,a.w1,a.SM,m)},a);u(l,m=>{tz(a,a.s1,a.JM,m)},a)}function pz(a,b,c){return Ka(c,d=>{const e=d.Tc;if(e)return"none"!=b.querySelector(`#${e.id}`).style.display;d=d.Nl||[];return d.length?"none"!=b.querySelector(`#${d[0].id}`).style.display:!0},a)}function tz(a,b,c,d){const e=d.Tc;e&&uz(b,c,e.id);u(d.Nl,f=>{uz(b,c,f.id)},a)}function uz(a,b,c){(b=b.querySelector("#"+c))&&"none"!=b.style.display&&a.push(b)} +function rz(a,b){if(a.type!=b.type||a.text!=b.text)return!1;if("6"==a.type){if(a.pr.length!=b.pr.length)return!1;for(let c=0;cvz(d.vj,e.vj)}return!0}return a.vj&&b.vj?.0325>vz(a.vj,b.vj):!0} +function vz(a,b){const c=a.length,d=[0,0,0];for(let e=0;e{g.Tc&&b(g.Tc.id,c,g.zIndex, +this.lC);u(g.Nl,h=>{b(h.id,c,g.zIndex,this.lC)},this)},this);u(a,g=>{g.Tc&&b(g.Tc.id,d,g.zIndex,this.lC);u(g.Nl,h=>{b(h.id,d,g.zIndex,this.lC)},this)},this);this.gC=[];u(f.links,g=>{g=new Ny(this.AE,c,d,g[0],g[1],this.mu(),this.slideWidth(),this.slideHeight());g.ke.addHandler(this.Hk,this);this.gC.push(g)},this);this.Tn=this.lb().background().firstChild;this.iw()&&F(this.Tn,"top",0);this.uc().background().appendChild(this.Tn);this.Ys=f.z1;this.UM=f.w1;this.Vs=f.t1;this.KM=f.s1;this.kv=0;this.vP=this.gC.length+ +this.Vs.length+this.Ys.length+1;this.mu()&&this.SL()}r(wz,R);k=wz.prototype; +k.SL=function(){const a=this.AE;this.$f=gn("@keyframes newSlideBackground {0% {opacity:0} 100% {opacity:1}} @keyframes oldSlideObjects {0% {opacity:1} 50% {opacity:0} 100% {opacity:0}} @keyframes newSlideObjects {0% {opacity:0} 50% {opacity:0} 100% {opacity:1}}");this.Tn.style.animation="newSlideBackground "+a+"s 1 linear";G(this.Tn,1);ve(this.Tn,ge,this.Hk,!1,this);u(this.Ys,b=>{b.style.animation="oldSlideObjects "+a+"s 1 linear";G(b,0);ve(b,ge,this.Hk,!1,this)},this);u(this.Vs,b=>{b.style.animation= +"newSlideObjects "+a+"s 1 linear";G(b,1);ve(b,ge,this.Hk,!1,this)},this);u(this.UM,b=>{G(b,0)},this);u(this.KM,b=>{G(b,1)},this)};k.initialize=function(){wz.Mb.initialize.call(this)};k.Hk=function(){this.kv++;this.kv==this.vP&&this.ke.C()};k.mu=function(){const a=Modernizr.atRule("@keyframes");return Ni?!1:Ii?a:!1}; +k.Ia=function(a){if(!this.mu()){a=this.oa()?1-a:a;u(this.gC,d=>{d.update(a)},this);var b=1-Math.min(1,2*a),c=2*Math.max(0,a-.5);u(this.Ys,d=>{d&&G(d,b)},this);u(this.Vs,d=>{d&&G(d,c)},this);u(this.UM,d=>{d&&G(d,0)},this);u(this.KM,d=>{d&&G(d,1)},this);G(this.Tn,a);1<=a&&this.ke.C();fj&&yn(document.body)}}; +k.eI=function(){wz.Mb.eI.call(this);u(this.Vp,a=>{this.lb().content().firstElementChild.removeChild(a);this.uc().content().firstElementChild.appendChild(a)},this);this.Vp=[];this.$f&&Fd(this.$f);De(this.Tn,ge,this.Hk,!1,this);this.kv=0;u(this.gC,a=>{a.clear()},this);this.Tn.style.animation="";this.iw()&&F(this.Tn,"top","");u(this.Ys,a=>{a.style.animation="";G(a,1);De(a,ge,this.Hk,!1,this)},this);u(this.Vs,a=>{a.style.animation="";G(a,1);De(a,ge,this.Hk,!1,this)},this);u(this.UM,a=>{G(a,1)},this); +u(this.KM,a=>{G(a,1)},this);u(this.gC,a=>{a.ke.removeHandler(this.Hk,this)},this);u(this.lC,a=>{a.style.zIndex=""},this)};function xz(a){R.call(this,a);this.lb().Ig()}r(xz,R);xz.prototype.initialize=function(){vv(this,!0);wv(this,!0)};xz.prototype.Ia=function(a){const b=this.lb().slide();var c=this.slideWidth();const d=this.slideHeight(),e="scale("+a+") rotate("+-360*a+"deg)";c=c/2+"px "+d/2+"px";G(b,a);F(b,"MozTransform",e);F(b,"MozTransformOrigin",c);F(b,"webkitTransform",e);F(b,"webkitTransformOrigin",c);F(b,"OTransform",e);F(b,"OTransformOrigin",c);F(b,"msTransform",e);F(b,"msTransformOrigin",c)};function yz(a,b,c){this.a=a;this.b=b;this.c=c}function zz(a,b){var c=-a.b;const d=a.a,e=-c*b.x()-d*b.y();c=Az(a,new yz(c,d,e));a=2*c.x()-b.x();b=2*c.y()-b.y();return new V(a,b)}function Az(a,b){const c=a.a*b.b-b.a*a.b;return 1E-9>Math.abs(c)?null:new V((a.b*b.c-b.b)*a.c/c,(a.c*b.a-b.c*a.a)/c)}function Bz(a,b){const c=a.y()-b.y(),d=b.x()-a.x();a=a.x()*b.y()-b.x()*a.y();return new yz(c,d,a)};function Cz(a,b){R.call(this,a);this.P=b;this.Ma(!0,!0)}r(Cz,Av);k=Cz.prototype; +k.initialize=function(){vv(this,!1);wv(this,!0);Dv(this,this.Ea);var a=this.slideWidth(),b=-this.slideHeight()/2;a=a/2-.2*a;var c=3*b/4,d=Bz(new V(-a,-b),new V(a/2,-b/2)),e=Bz(new V(-a/4,-b),new V(0,0)),f=Bz(new V(a/2,-b/2),new V(a,b)),g=Bz(new V(0,0),new V(a,b/4)),h=Az(d,e),l=Az(f,g);const n=new V(Y(0,.5,a,.8)(l.x()),Y(0,.5,b,1)(l.y())),m=new V(Y(-a,.2,0,.5)(h.x()),Y(-b,0,0,.5)(h.y()));var p=new W(5*a/8,3*-b/8,-(10*c/16));const t=new W(-a/8,-b/2,15*-c/32),w=new W(a/2,b/8,15*-c/32);var y=new W(5* +-a/8,5*-b/16,9*-c/8),D=new W(a/2,b/4,5*-c/6),I=new W(-a/10,b/10,-c),A=new W(4*-a/8,-b/8,3*-c/16),J=new W(-a/16,5*b/8,3*-c/16),T=new W(5*a/16,5*b/8,-c),U=new W(14*-a/32,4*-b/8,0),X=new W(4*a/8,23*b/32,0),aa=new W(5*-a/16,3*-b/16,-c/4),ha=new W(3*a/16,5*b/16,0);e=new W(3*-a/4,3*b/4,0);f=new Dz(new W(a,-b,0),new W(15*a/16,9*-b/16,-c),new V(.8,0));g=new Dz(new W(7*a/8,7*-b/8,0),new W(9*a/12,-b/2,-(46*c/48)),new V(.7625,.0625));d=new Dz(new W(a/2,-b,0),new W(6*a/9,8*-b/12,47*-c/48),new V(.65,0));c=new Dz(new W(a, +-b/2,0),new W(19*a/24,4*-b/9,47*-c/48),new V(.8,.25));var ra=new Dz(new W(a/2,-b/2,0),p,new V(.65,.25));h=new Dz(new W(h.x(),h.y(),0),t,new V(m.x(),m.y()));l=new Dz(new W(l.x(),l.y(),0),w,new V(n.x(),n.y()));p=new Dz(new W(-a/4,-b,0),p,new V(.425,0));D=new Dz(new W(a,b/4,0),D,new V(.8,.625));I=new Dz(new W(0,0,0),I,new V(.5,.5));A=new Dz(new W(-a/2,-b/2,0),A,new V(.35,.25));J=new Dz(new W(a/2,b/2,0),J,new V(.65,.75));y=new Dz(new W(-a,-b,0),y,new V(.2,0));T=new Dz(new W(a,b,0),T,new V(.8,1));U=new Dz(new W(-a, +-b/2,0),U,new V(.2,.25));X=new Dz(new W(a/2,b,0),X,new V(.65,1));aa=new Dz(new W(-a/2,0,0),aa,new V(.35,.5));ha=new Dz(new W(0,b/2,0),ha,new V(.5,.75));b=new Dz(new W(-a,b,0),e,new V(.2,1));this.Nj=[f,f,g,g,d,c,g,g,d,c,ra,ra,d,c,h,l,ra,ra,d,c,h,l,p,D,ra,ra,h,l,I,I,h,l,I,I,A,J,h,l,p,D,y,T,h,l,A,J,y,T,I,I,aa,ha,A,J,A,J,y,T,U,X,A,J,U,X,aa,ha,I,I,aa,ha,b,b,aa,ha,U,X,b,b];if(this.P==Ez){b=[];a=this.slideHeight();a=Bz(new V(0,-a/2),new V(0,a/2));for(f=0;f=a?Jz(this,a):.2>=a?(d=Y(.1,.1,.2,1),a=d(a),Mv(this,-60*a,[1,0,0],[0,0,0]),mat4.translate(this.mb,[0,0,20*-a]),this.Xk=Gz(a,this.Nj),Mv(this,-15*c*a,[0,0,1],[0,0,0])):.4>=a?(this.Xk=Gz(1,this.Nj),Mv(this,-60,[1,0,0],[0,0,0]),Mv(this,-15*c,[0,0,1],[0,0,0]),mat4.translate(this.mb,[0,0,-20]),d=Y(.2,0,.4,1),a=Math.pow(d(a),3),mat4.translate(this.mb,[0,0,-a*b/20])):.5>a?(this.Xk=Gz(1,this.Nj), +Mv(this,-60,[1,0,0],[0,0,0]),Mv(this,-15*c,[0,0,1],[0,0,0]),mat4.translate(this.mb,[0,0,-(20+b/20)]),d=Y(.4,0,.5,1),a=d(a),mat4.translate(this.mb,[0,0,-a*b/30]),Kz(a,this.Nj,this.Xk,8)):(this.Xk=Gz(1,this.Nj),Mv(this,-60,[1,0,0],[0,0,0]),Mv(this,-15*c,[0,0,1],[0,0,0]),mat4.translate(this.mb,[0,0,-(20+b/20+b/30)]),d=Y(.5,0,1,1),a=d(a),Kz(a,this.Nj,this.Xk,40),a=pw(0,1,a),mat4.translate(this.mb,[c*a*b,a*b/2,a*b/2]),Mv(this,-30*c*a,[0,0,1],[0,0,0]),Mv(this,-60*c*a,[0,1,0],[0,0,0]));Vv(this);Nv(this, +this.BX,this.N.TRIANGLES,this.$L.bind(this),this.YL.bind(this));Kv(this)};k.$L=function(){this.N.bufferSubData(this.N.ARRAY_BUFFER,0,new Float32Array(cw(this.Xk)))};k.YL=function(){Rv(this.Xk,this.CN);this.N.bufferSubData(this.N.ARRAY_BUFFER,0,new Float32Array(kw(this.Xk)))}; +function Jz(a,b){var c=Y(0,0,.1,.1);a.Xk=Gz(c(b),a.Nj);Mv(a,-60*c(b),[1,0,0],[0,0,0]);c=Y(0,0,.1,1);a.jA=Gz(c(b),a.pM);a.lB=Gz(c(b),a.pO);Vv(a);Nv(a,a.MV,a.N.TRIANGLES,ta(function(){this.N.bufferSubData(this.N.ARRAY_BUFFER,0,new Float32Array(cw(this.jA)))},a),ta(function(){Rv(this.jA,this.oM);this.N.bufferSubData(this.N.ARRAY_BUFFER,0,new Float32Array(kw(this.jA)))},a));Nv(a,a.OY,a.N.TRIANGLES,ta(function(){this.N.bufferSubData(this.N.ARRAY_BUFFER,0,new Float32Array(cw(this.lB)))},a),ta(function(){Rv(this.lB, +this.oO);this.N.bufferSubData(this.N.ARRAY_BUFFER,0,new Float32Array(kw(this.lB)))},a))} +function Kz(a,b,c,d){void 0===d&&(d=50);const e=[new Lz([0,1],0,0,-5),new Lz([2,3,6,7],0,0,-5),new Lz([4,8,12,18],0,0,-5),new Lz([5,9,13,19],0,0,-5),new Lz([20,14,26,30,42,36],0,0,15),new Lz([15,21,37,43,31,27],0,0,15),new Lz([44,34,52,60,54],0,0,20),new Lz([35,45,55,61,53],0,0,20),new Lz([40,46,56],0,0,30),new Lz([41,47,57],20,20,30),new Lz([58,62,74],20,20,15),new Lz([75,63,59],0,0,15),new Lz([76,70,71,77],0,0,-20)];for(let p=0;p= 0.0 && phase <= CHANGE_PHASE)\n\t\t{\n\t\t\tangle = -ANGLE * (phase + (PHASE_OFFSET_FUNC1(x) * PHASE_FUNC(phase)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tangle = -ANGLE * (phase + PHASE_OFFSET_FUNC1(x));\n\t\t}\n\t\treturn max(angle, -ANGLE);\n\t}\n\n\tvec2 getPosition(float x)\n\t{\n\t\tfloat a = uSlideWidth * 0.5 * C_FUNC1(x);\n\t\tfloat b = a * COEF_1;\n\t\tvec2 center = vec2(uSlideWidth * 0.5, 0.0);\n\t\tfloat angle = getAngleInDoubleLeft(x, uPhase);\n\n\t\tvec2 pos = ellipse(angle, center, vec2(a, b));\n\t\tpos.y = pos.y - (b * C_FUNC1(x) * PHASE_FUNC1(uPhase));\n\t\tpos.y = max(pos.y, 1.0);\n\t\treturn pos;\n\t}\n\n\tvoid main(void)\n\t{\n\t\tvec3 pNormal;\n\t\tfloat x = aVertexPosition.x;\n\t\tif (x <= uSlideWidth * 0.5)\n\t\t{\n\t\t\tgl_Position = uPMVMatrix * vec4(aVertexPosition, 1.0);\n\t\t\tpNormal = vec3(0.0, 0.0, 1.0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvec2 pos = getPosition(x);\n\t\t\tvec3 v = vec3(pos.x, aVertexPosition.y, pos.y);\n\t\t\tgl_Position = uPMVMatrix * vec4(v, 1.0);\n\n\t\t\tfloat nextX = x + uDeltaX;\n\t\t\tvec2 pr = getPosition(nextX);\n\t\t\tpNormal = getNormal(v, pr);\n\t\t}\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\t\tvTextureCoord = aTextureCoord;\n\t}";case 1:return"\n\tfloat C_FUNC2(float x)\n\t{\n\t\treturn linearInterpolation(x, 0.0, 1.0, uSlideWidth * 0.5, 0.0);\n\t}\n\tfloat PHASE_OFFSET_FUNC2(float x)\n\t{\n\t\treturn linearInterpolation(x, 0.0, 0.0, uSlideWidth * 0.5, PHASE_OFFSET);\n\t}\n\n\tfloat getAngleInDoubleRight(float x, float phase)\n\t{\n\t\tfloat angle;\n\t\tif (phase >= 0.0 && phase <= CHANGE_PHASE)\n\t\t{\n\t\t\tangle = ANGLE * (1.0 + phase + (PHASE_OFFSET_FUNC2(x) * PHASE_FUNC(phase)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tangle = ANGLE * (1.0 + phase + PHASE_OFFSET_FUNC2(x));\n\t\t}\n\t\treturn min(angle, ANGLE * 2.0);\n\t}\n\n\tvec2 getPosition(float x)\n\t{\n\t\tfloat a = uSlideWidth * 0.5 * C_FUNC2(x);\n\t\tfloat b = a * COEF_1;\n\t\tvec2 center = vec2(uSlideWidth * 0.5, 0.0);\n\t\tfloat angle = getAngleInDoubleRight(x, uPhase);\n\n\t\tvec2 pos = ellipse(angle, center, vec2(a, b));\n\t\tpos.y = pos.y - (b * C_FUNC2(x) * PHASE_FUNC1(uPhase));\n\t\tpos.y = max(pos.y, 1.0);\n\t\treturn pos;\n\t}\n\n\tvoid main(void)\n\t{\n\t\tvec3 pNormal;\n\t\tfloat x = aVertexPosition.x;\n\t\tif (x >= uSlideWidth * 0.5)\n\t\t{\n\t\t\tgl_Position = uPMVMatrix * vec4(aVertexPosition, 1.0);\n\t\t\tpNormal = vec3(0.0, 0.0, 1.0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvec2 pos = getPosition(x);\n\t\t\tvec3 v = vec3(pos.x, aVertexPosition.y, pos.y);\n\t\t\tgl_Position = uPMVMatrix * vec4(v, 1.0);\n\n\t\t\tfloat nextX = x + uDeltaX;\n\t\t\tvec2 pr = getPosition(nextX);\n\t\t\tpNormal = getNormal(v, pr);\n\t\t}\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\t\tvTextureCoord = aTextureCoord;\n\t}"; +case 2:return"\n\tfloat C_FUNC3(float x)\n\t{\n\t\treturn linearInterpolation(x, 0.0, 0.0, uSlideWidth, 1.0);\n\t}\n\n\tfloat PHASE_OFFSET_FUNC3(float x)\n\t{\n\t\treturn linearInterpolation(x, 0.0, 0.0, uSlideWidth, PHASE_OFFSET);\n\t}\n\n\tfloat getAngleInSingleLeft(float x, float phase)\n\t{\n\t\tfloat angle;\n\t\tif (phase >= 0.0 && phase <= CHANGE_PHASE)\n\t\t{\n\t\t\tangle = -ANGLE * (phase - (PHASE_OFFSET_FUNC3(x) * PHASE_FUNC(phase)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tangle = -ANGLE * (phase - PHASE_OFFSET_FUNC3(x));\n\t\t}\n\t\treturn min(angle, 0.0);\n\t}\n\n\tvec2 getPosition(float x)\n\t{\n\t\tfloat a = uSlideWidth * C_FUNC3(x);\n\t\tfloat b = a * COEF_2;\n\t\tvec2 center = vec2(0.0, 0.0);\n\t\tfloat angle = getAngleInSingleLeft(x, uPhase);\n\n\t\tvec2 pos = ellipse(angle, center, vec2(a, b));\n\t\tpos.y = pos.y - (b * C_FUNC3(x) * PHASE_FUNC2(uPhase));\n\t\tpos.y = max(pos.y, 0.0);\n\t\treturn pos;\n\t}\n\n\tvoid main(void)\n\t{\n\t\tvec2 pos = getPosition(aVertexPosition.x);\n\t\tvec3 v = vec3(pos.x, aVertexPosition.y, pos.y);\n\t\tgl_Position = uPMVMatrix * vec4(v, 1.0);\n\t\tvTextureCoord = aTextureCoord;\n\n\t\tfloat nextX = aVertexPosition.x + uDeltaX;\n\t\tvec2 pr = getPosition(nextX);\n\t\tvec3 pNormal = getNormal(v, pr);\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\t}"; +case 3:return"\n\tfloat C_FUNC4(float x)\n\t{\n\t\treturn linearInterpolation(x, 0.0, 1.0, uSlideWidth, 0.0);\n\t}\n\n\tfloat PHASE_OFFSET_FUNC4(float x)\n\t{\n\t\treturn linearInterpolation(x, 0.0, PHASE_OFFSET, uSlideWidth, 0.0);\n\t}\n\n\tfloat getAngleInSingleRight(float x, float phase)\n\t{\n\t\tfloat angle;\n\t\tif (phase >= 0.0 && phase <= CHANGE_PHASE)\n\t\t{\n\t\t\tangle = ANGLE * (1.0 + phase - (PHASE_OFFSET_FUNC4(x) * PHASE_FUNC(phase)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tangle = ANGLE * (1.0 + phase - PHASE_OFFSET_FUNC4(x));\n\t\t}\n\t\treturn max(angle, ANGLE);\n\t}\n\n\tvec2 getPosition(float x)\n\t{\n\t\tfloat a = uSlideWidth * C_FUNC4(x);\n\t\tfloat b = a * COEF_2;\n\t\tvec2 center = vec2(uSlideWidth, 0.0);\n\t\tfloat angle = getAngleInSingleRight(x, uPhase);\n\n\t\tvec2 pos = ellipse(angle, center, vec2(a, b));\n\t\tpos.y = pos.y - (b * C_FUNC4(x) * PHASE_FUNC2(uPhase));\n\t\tpos.y = max(pos.y, 0.0);\n\t\treturn pos;\n\t}\n\n\tvoid main(void)\n\t{\n\t\tvec2 pos = getPosition(aVertexPosition.x);\n\t\tvec3 v = vec3(pos.x, aVertexPosition.y, pos.y);\n\t\tgl_Position = uPMVMatrix * vec4(v, 1.0);\n\t\tvTextureCoord = aTextureCoord;\n\n\t\tfloat nextX = aVertexPosition.x + uDeltaX;\n\t\tvec2 pr = getPosition(nextX);\n\t\tvec3 pNormal = getNormal(v, pr);\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\t}"; +default:throw Error("Unknown transition page curl type");}}k.Hd=function(){var a=this.slideWidth();const b=this.slideHeight();this.mg=Ex(2,40,a,b);this.Ce=Gx(2,40);this.RA=new Wv;a=Iv(this,cw(this.mg),3);this.RA.ug=a;a=Iv(this,dw(this.mg),2);this.RA.Bg=a;a=Jv(this,this.Ce);this.RA.gg=a};function Oz(a,b,c){R.call(this,a);this.P=b;this.dK=c}r(Oz,R);Oz.prototype.initialize=function(){vv(this,!0);wv(this,!0);this.lb().Ig();this.lf=!1;var a=this.wa(),b=this.uc().content();a.appendChild(b);a=this.wa();b=this.lb().content();a.appendChild(b)}; +Oz.prototype.Ia=function(a){const b=this.slideWidth(),c=this.slideHeight();var d=0,e=0;let f=0,g=0;this.P==Pz||this.P==Qz?(d=this.P==Pz?1:-1,f=this.P==Pz?-1:1):(e=this.P==Rz?1:-1,g=this.P==Rz?-1:1);const h=this.dK?Fw(0,.7,7,a):Ew(a);d=Math.floor(h*d*b);e=Math.floor(h*e*c);Gh(this.uc().content(),d,e);Gh(this.lb().content(),f*b+d,g*c+e);G(this.lb().background(),a)};var Rz=0,Qz=1,Pz=2;function Sz(a,b){R.call(this,a);this.P=b;this.Ma(!1,!0)}r(Sz,Av);k=Sz.prototype;k.initialize=function(){vv(this,!1);wv(this,!0);Dv(this,this.Ea);this.Hd();mat4.translate(this.mb,[(this.P==Tz?-1:1)*this.slideWidth()/2,this.slideHeight()/2,0]);Vv(this)};k.Th=function(){return"precision mediump float;\n\n\tvarying vec2 vTextureCoord;\n\tvarying vec3 vNormal;\n\n\tuniform sampler2D uSampler;\n\n\tconst vec3 LIGHT_DIRECTION = vec3(0.0, 0.0, 1.0);\n\tconst float AMBIENT_INTENSITY = 0.4;\n\tconst float DIFFUSE_INTENSITY = 0.6;\n\n\tvoid main(void) \n\t{ \n\t\tfloat intentsity = AMBIENT_INTENSITY + DIFFUSE_INTENSITY * abs(dot(normalize(vNormal), LIGHT_DIRECTION));\n\t\tvec4 textureColor = texture2D(uSampler, vTextureCoord); \n\t\tgl_FragColor = vec4(textureColor.rgb * intentsity, textureColor.a); \n\t}"}; +k.Uh=function(){return"attribute vec3 aVertexPosition;\n\tattribute vec2 aTextureCoord;\n\n\tuniform mat4 uPMVMatrix;\n\tuniform mat3 uNMatrix;\n\n\tuniform float uPhase;\n\tuniform bool uDirectionIsLeft;\n\tuniform float uSlideHeight;\n\tuniform float uSlideWidth;\n\n\tvarying vec2 vTextureCoord;\n\tvarying vec3 vNormal;\n\n\tconst float ANGLE = 45.0;\n\tconst float PI = 3.14159265358979323846264;\n\n\tfloat linearInterpolation(float x, float x0, float fx0, float x1, float fx1)\n\t{\n\t\treturn mix(fx0, fx1, (x - x0) / (x1 - x0));\n\t}\n\n\tmat4 rotationZmatrix(float angle)\n\t{\n\t \tfloat ang = radians(angle);\n\t \tfloat cosA = cos(ang);\n\t \tfloat sinA = sin(ang);\n\n\t \tmat4 m = mat4(1.0);\n\t \tm[0] = vec4(cosA, sinA, 0, 0);\n\t \tm[1] = vec4(-sinA, cosA, 0, 0);\n\t \treturn m;\n\t}\n\n\tvec3 getOriginPos(vec3 pos)\n\t{\n\t\tvec3 v = vec3(pos.x, pos.y, 0.0);;\n\t\tmat4 m;\n\n\t\tvec2 p;\n\t\tif (uDirectionIsLeft)\n\t\t{\n\t\t\tm = rotationZmatrix(ANGLE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tv.x = pos.x - uSlideWidth;\n\t\t\tm = rotationZmatrix(-ANGLE);\n\t\t}\n\t\tv = (m * vec4(v.xyz, 1.0)).xyz;\n\t\treturn vec3(v.x, v.y, 0.0);\n\t}\n\n\tfloat calcX(float phase, float u, float r, float maxSide)\n\t{\n\t\tfloat coeff = (u < 0.0) ? -1.0 : 1.0;\n\t\tfloat centerX = linearInterpolation(phase, 0.0, maxSide, 1.0, 0.0);\n\t\tfloat m = PI * r;\n\n\t\tif (centerX > coeff * u)\n\t\t{\n\t\t\treturn u;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfloat a = 180.0 * (maxSide - centerX) / (PI * r);\n\t\t\tfloat b = linearInterpolation(coeff * u, centerX, -90.0, maxSide + 1.0, a - 90.0);\n\n\t\t\tif (coeff * u >= centerX + m)\n\t\t\t{\n\t\t\t\treturn coeff * (centerX - (coeff * u - centerX - m));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfloat ang = b * PI / 180.0;\n\t\t\t\treturn coeff * (centerX + r * cos(ang));\n\t\t\t}\n\t\t}\n\t}\n\n\tfloat calcY(float phase, float u, float r, float maxSide)\n\t{\n\t\tu = abs(u);\n\n\t\tfloat centerX = linearInterpolation(phase, 0.0, maxSide, 1.0, 0.0);\n\t\tfloat centerY = r;\n\n\t\tfloat m = PI * r;\n\t\tif (centerX >= u)\n\t\t{\n\t\t\treturn 0.0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (u > centerX + m)\n\t\t\t{\n\t\t\t\treturn linearInterpolation(u, centerX + m, r * 2.0, centerX + m + m, r * 2.5);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfloat a = 180.0 * (maxSide - centerX) / (PI * r);\n\t\t\t\tfloat b = linearInterpolation(u, centerX, -90.0, maxSide+1.0, a - 90.0);\n\n\t\t\t\tfloat ang = b * PI / 180.0;\n\t\t\t\treturn centerY + r * sin(ang);\n\t\t\t}\n\t\t}\n\t}\n\n\tvec3 getVertexPosition(float phase, vec3 pos)\n\t{\n\t\tvec3 originPos = getOriginPos(pos);\n\t\tfloat maxSide = sqrt(uSlideWidth * uSlideWidth + uSlideHeight * uSlideHeight);\n\n\t\tfloat r = max(uSlideWidth, uSlideHeight) / 4.0;\n\t\tvec3 v = vec3(calcX(phase, originPos.x, r, maxSide), originPos.y, calcY(phase, originPos.x, r, maxSide));\n\n\t\tmat4 m;\n\t\tif (uDirectionIsLeft)\n\t\t{\n\t\t\tm = rotationZmatrix(-ANGLE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm = rotationZmatrix(ANGLE);\n\t\t}\n\n\t\treturn (m * vec4(v.xyz, 1.0)).xyz;\n\t}\n\n\tvec3 getVertexNormal(float phase, vec3 pos)\n\t{\n\t\tconst float DELTA_W = 1.0;\n\t\tconst float DELTA_H = 1.0;\n\n\t\tvec3 right = getVertexPosition(phase, vec3(pos.x + DELTA_W, pos.y, pos.z));\n\t\tvec3 down = getVertexPosition(phase, vec3(pos.x, pos.y + DELTA_H, pos.z));\n\t\tvec3 p = getVertexPosition(phase, vec3(pos.x, pos.y, pos.z));\n\n\t\tvec3 v1 = right - p;\n\t\tvec3 v2 = down - p;\n\n\t\treturn normalize(cross(v2, v1));\n\t}\n\n\tvoid main(void)\n\t{\n\t\tfloat phase = uPhase;\n\t\tvec3 vertex = vec3(aVertexPosition.x, aVertexPosition.y, aVertexPosition.z);\n\t\tvec4 p = vec4(getVertexPosition(phase, vertex), 1.0);\n\t\tgl_Position = uPMVMatrix * p;\n\t\tvTextureCoord = aTextureCoord;\n\n\t\tvec3 pNormal = getVertexNormal(phase, vertex);\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\t}"}; +k.Ia=function(a){a=Y(0,0,1,1.2)(a);this.N.uniform1f(this.tg,a);Nv(this,this.ng,this.N.TRIANGLE_STRIP)};k.gi=function(){Ov(this);this.gf=Qv(this,"uSampler");this.tg=Qv(this,"uPhase");const a=Qv(this,"uDirectionIsLeft"),b=Qv(this,"uSlideWidth");this.N.uniform1f(Qv(this,"uSlideHeight"),this.slideHeight());this.N.uniform1f(b,this.slideWidth());this.N.uniform1i(a,this.P==Tz?1:0)};k.Rh=function(){}; +k.Hd=function(){this.mg=Ex(30,30,this.slideWidth(),this.slideHeight());this.Ce=Gx(30,30);this.ng=new Wv;var a=Iv(this,cw(this.mg),3);this.ng.ug=a;a=Iv(this,dw(this.mg),2);this.ng.Bg=a;a=Jv(this,this.Ce);this.ng.gg=a};k.Gj=function(){return this.gf};k.Qh=function(){Gv(this,this.ng)};var Tz=0;function Uz(a){R.call(this,a);this.Ma(!1,!0)}r(Uz,Av);k=Uz.prototype;k.initialize=function(){vv(this,!1);wv(this,!0);Dv(this,this.Ea);this.Hd();mat4.translate(this.mb,[-this.slideWidth()/2,this.slideHeight()/2,0]);Vv(this)};k.sS=function(){if(void 0!==Vz)return Vz;this.Hs();return Vz=this.Kq};k.Hs=function(){void 0===this.N&&Uz.Mb.Hs.call(this)};k.Ia=function(a){this.N.uniform1f(this.tg,a);Nv(this,this.ng,this.N.TRIANGLE_STRIP)}; +k.Hd=function(){this.mg=Ex(10,35,this.slideWidth(),this.slideHeight());this.Ce=Gx(10,35);this.ng=new Wv;var a=Iv(this,cw(this.mg),3);this.ng.ug=a;a=Iv(this,dw(this.mg),2);this.ng.Bg=a;a=Jv(this,this.Ce);this.ng.gg=a};k.Qh=function(){Gv(this,this.ng)};k.gi=function(){Ov(this);this.gf=Qv(this,"uSampler");this.tg=Qv(this,"uPhase");const a=Qv(this,"uSlideWidth");this.N.uniform1f(Qv(this,"uSlideHeight"),this.slideHeight());this.N.uniform1f(a,this.slideWidth())};k.Rh=function(){};k.Gj=function(){return this.gf}; +k.Th=function(){return"precision mediump float;\n\n\tvarying vec2 vTextureCoord;\n\tvarying vec3 vNormal;\n\n\tuniform sampler2D uSampler;\n\n\tconst vec3 LIGHT_DIRECTION = vec3(0.0, 0.0, 1.0);\n\tconst float AMBIENT_INTENSITY = 0.3;\n\tconst float DIFFUSE_INTENSITY = 0.7;\n\n\tvoid main(void)\n\t{\n\t\tfloat intentsity = AMBIENT_INTENSITY + DIFFUSE_INTENSITY * abs(dot(normalize(vNormal), LIGHT_DIRECTION));\n\t\tvec4 textureColor = texture2D(uSampler, vTextureCoord);\n\t\tgl_FragColor = vec4(textureColor.rgb * intentsity, textureColor.a);\n\t}"}; +k.Uh=function(){return"attribute vec3 aVertexPosition;\n\tattribute vec3 aVertexNormal;\n\tattribute vec2 aTextureCoord;\n\n\tuniform mat4 uPMVMatrix;\n\tuniform mat3 uNMatrix;\n\n\tuniform float uPhase;\n\tuniform float uSlideHeight;\n\tuniform float uSlideWidth;\n\n\tvarying vec2 vTextureCoord;\n\tvarying vec3 vNormal;\n\n\tconst float START_EFFECT_TIME = 0.0;\n\tconst float START_FLY_EFFECT_TIME = 0.4;\n\tconst float STOP_FLY_EFFECT_TIME = 0.8;\n\tconst float START_TOP_CENTER = 0.0;\n\tconst float START_TOP_CORNERS_TIME = 0.1;\n\tconst float START_BOTTOM_CORNERS_TIME = 0.0;\n\n\tconst float HORIZONTAL_WAVES_COUNT = 3.0;\n\tfloat HORIZONTAL_MAX_AMPLITUDE;\n\tconst float HORIZONTAL_WAVE_RUNNING_START_TIME = 0.0;\n\n\tconst float MAX_FLEX_DELAY = 0.1;\n\n\tfloat MAX_STRETCHING_Z;\n\tfloat MAX_STRETCHING_Y;\n\tfloat HORIZONTAL_TOP_STRETCHING;\n\tfloat VERTICAL_TOP_STRETCHING;\n\n\tconst float PI = 3.141592654;\n\n\tfloat linearInterpolation(float x, float x0, float fx0, float x1, float fx1)\n\t{\n\t\treturn mix(fx0, fx1, (x - x0) / (x1 - x0));\n\t}\n\tvec2 getMirrorPoint(vec2 a, vec2 b, vec2 p)\n\t{\n\t\treturn a + reflect(a - p, b - a);\n\t}\n\tfloat calcCenterWave(float x, float phase, float A, float F, float dx, float dy)\n\t{\n\t\tfloat CENTER_LINE_POS = uSlideWidth * 0.5;\n\t\tfloat startX = CENTER_LINE_POS;\n\t\tif (x < startX)\n\t\t{\n\t\t\tx = getMirrorPoint(vec2(CENTER_LINE_POS, 0), vec2(CENTER_LINE_POS , uSlideHeight), vec2(x, 0)).x;\n\t\t}\n\t\tfloat s = linearInterpolation(phase, 0.0, startX, 1.0, uSlideWidth);\n\t\tif ((x < startX) || (x < s))\n\t\t{\n\t\t\treturn 0.0;\n\t\t}\n\t\tfloat x0 = - linearInterpolation(phase, 0.0, 2.0 * PI * startX / uSlideWidth * HORIZONTAL_WAVES_COUNT, 1.0, PI * 2.0 * HORIZONTAL_WAVES_COUNT);\n\t\treturn A + A * sin(F * x +-PI / 2.0 + x0);\n\t}\n\tfloat getColWaveDelay(float phase, vec3 pos)\n\t{\n\t\tphase = linearInterpolation(phase, HORIZONTAL_WAVE_RUNNING_START_TIME, 0.0, 1.0, 1.0);\n\t\tfloat MAX_AMPLITUDE = linearInterpolation(phase, 0.0, 0.0, 1.0, HORIZONTAL_MAX_AMPLITUDE);\n\t\tfloat A = linearInterpolation(pos.y, 0.0, 0.0, uSlideHeight, MAX_AMPLITUDE);\n\t\tfloat F = (PI * 2.0 / uSlideWidth) * HORIZONTAL_WAVES_COUNT;\n\t\treturn calcCenterWave(pos.x, phase, A, F, 0.0, 0.0);\n\t}\n\tvec3 getVertexPosition(float phase, vec3 pos)\n\t{\n\t\tfloat CENTER = uSlideWidth * 0.5;\n\t\tphase = pow(phase, 4.0);\n\t\tfloat modifiedPhase = phase;\n\n\t\tfloat deltaZVertical = linearInterpolation(abs(pos.y), 0.0, 1.0, uSlideHeight / 2.0, 0.0);\n\t\tif (abs(pos.y) > uSlideHeight * 0.5)\n\t\t{\n\t\t\tdeltaZVertical = 0.0;\n\t\t}\n\t\tbool isLeft = (pos.x < CENTER);\n\t\tfloat stretch;\n\t\tfloat yDelay;\n\t\tvec3 delta = vec3(0, 0, 0);\n\t\tif (modifiedPhase > START_TOP_CENTER)\n\t\t{\n\t\t\tif (isLeft)\n\t\t\t{\n\t\t\t\tyDelay = linearInterpolation(pos.x, 0.0, MAX_FLEX_DELAY, CENTER, 0.0);\n\t\t\t\tstretch = linearInterpolation(pos.x, 0.0, 0.0, CENTER, 1.0);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tyDelay = linearInterpolation(pos.x, CENTER, 0.0, uSlideWidth, MAX_FLEX_DELAY);\n\t\t\t\tstretch = linearInterpolation(pos.x, CENTER, 1.0, uSlideWidth, 0.0);\n\t\t\t}\n\t\t\tfloat deltaZHorizontal = pow(stretch, 3.0);\n\t\t\tmodifiedPhase = linearInterpolation(modifiedPhase, START_TOP_CENTER, 0.0, 1.0, 1.0);\n\t\t\tif (modifiedPhase >= yDelay)\n\t\t\t{\n\t\t\t\tdelta.y = linearInterpolation(modifiedPhase, yDelay, 0.0, 1.0, MAX_STRETCHING_Y * deltaZHorizontal * deltaZVertical);\n\t\t\t\tdelta.z = linearInterpolation(modifiedPhase, yDelay, 0.0, 1.0, MAX_STRETCHING_Z * deltaZHorizontal * deltaZVertical);\n\t\t\t}\n\t\t\tdelta.y = -delta.y;\n\t\t}\n\t\tif (phase > HORIZONTAL_WAVE_RUNNING_START_TIME)\n\t\t{\n\t\t\tdelta.z += getColWaveDelay(phase, pos);\n\t\t}\n\t\treturn pos - delta;\n\t}\n\tfloat getPower(float h1, float h2, float v1, float v2, vec2 pos, float max2)\n\t{\n\t float a1 = min(max(linearInterpolation(pos.x, h1, 1.0, h2, 0.0), 0.0), 1.0);\n\t float a2 = linearInterpolation(pos.y, v1, 1.0, v2, max2);\n\t return a1 * a2;\n\t}\n\tvec3 updateVertex(float phase, vec3 translation)\n\t{\n\t\tfloat pPhase = phase;\n\t\tvec3 delta = vec3(0, 0, 0);\n\t\tvec3 v0 = getVertexPosition(phase, aVertexPosition);\n\n\t\tif (phase > START_TOP_CORNERS_TIME)\n\t\t{\n\t\t\tpPhase = linearInterpolation(phase, START_TOP_CORNERS_TIME, 0.0, 1.0, 1.0);\n\t\t\tpPhase = pow(pPhase, 4.0);\n\n\t\t\tfloat p1 = getPower(0.0, uSlideWidth * 0.5, 0.0, uSlideHeight, v0.xy, 2.0);\n\t\t\tfloat p2 = getPower(uSlideWidth, uSlideWidth * 0.5, 0.0, uSlideHeight, v0.xy, 2.0);\n\n\t\t\tdelta += vec3(p2 - p1, -p1 - p2, 0) * vec3(HORIZONTAL_TOP_STRETCHING, VERTICAL_TOP_STRETCHING, 0) * vec3(pPhase, pPhase, 0);\n\t\t}\n\t\tif (phase > START_BOTTOM_CORNERS_TIME)\n\t\t{\n\t\t\tpPhase = linearInterpolation(phase, START_BOTTOM_CORNERS_TIME, 0.0, 1.0, 1.0);\n\t\t\tpPhase = pow(pPhase, 4.0);\n\n\t\t\tfloat p1 = getPower(0.0, uSlideWidth * 0.25, uSlideHeight, 0.0, v0.xy, 0.0);\n\t\t\tfloat p2 = getPower(uSlideWidth, uSlideWidth * 0.75, uSlideHeight, 0.0, v0.xy, 0.0);\n\n\t\t\tdelta += vec3(0.5, 1, 0.25) * vec3(p2 - p1, p2, p2) * vec3(uSlideWidth, uSlideHeight, uSlideHeight) * vec3(pPhase, pPhase, pPhase);\n\t\t}\n\t\tdelta.y = -min(uSlideHeight * 0.75, abs(delta.y));\n\t\treturn (translation + v0 + delta);\n\t}\n\tvec3 getPosition(float phase, vec3 pos)\n\t{\n\t \tfloat maxSide = sqrt(uSlideHeight * uSlideHeight + (uSlideWidth * 0.5) * (uSlideWidth * 0.5)) * 2.0;\n\t\tvec3 translation = vec3(0.0);\n\t\tif ((phase >= START_FLY_EFFECT_TIME) && (phase <= STOP_FLY_EFFECT_TIME))\n\t\t{\n\t\t\tfloat modifiedPhase = linearInterpolation(phase, START_FLY_EFFECT_TIME, 0.0, STOP_FLY_EFFECT_TIME, 1.0);\n\t\t\tmodifiedPhase = pow(modifiedPhase, 4.0);\n\t\t\ttranslation = vec3(0.0, modifiedPhase * maxSide, 0.0);\n\t\t}\n\t\telse if (phase > STOP_FLY_EFFECT_TIME)\n\t\t{\n\t\t\ttranslation = vec3(0.0, maxSide, 0.0);\n\t\t}\n\t\tif (phase >= START_EFFECT_TIME)\n\t\t{\n\t\t\tfloat modifiedPhase = linearInterpolation(phase, START_EFFECT_TIME, 0.0, 1.0, 1.0);\n\t\t\treturn updateVertex(modifiedPhase, translation);\n\t\t}\n\t\treturn updateVertex(0.0, translation);\n\t}\n\n\tvec3 getVertexNormal(float phase, vec3 pos)\n\t{\n\t\tfloat deltaWidth = (pos.x == uSlideWidth) ? -1.0 : 1.0;\n\t\tfloat deltaHeight = 1.0;\n\n\t\tvec3 right = getVertexPosition(phase, vec3(pos.x + deltaWidth, pos.y, pos.z));\n\t\tvec3 down = getVertexPosition(phase, vec3(pos.x, pos.y + deltaHeight, pos.z));\n\t\tvec3 p = getVertexPosition(phase, vec3(pos.x, pos.y, pos.z));\n\n\t\tvec3 v1 = right - p;\n\t\tvec3 v2 = down - p;\n\n\t\tvec3 n = (pos.x == uSlideWidth) ? cross(v1, v2) : cross(v2, v1);\n\t\tn = normalize(n);\n\n\t\treturn n;\n\t}\n\tvoid main()\n\t{\n\t\tMAX_STRETCHING_Z = 0.74 * uSlideHeight;\n\t\tMAX_STRETCHING_Y = 0.74 * uSlideHeight;\n\t\tHORIZONTAL_TOP_STRETCHING = 0.42 * uSlideWidth;\n\t\tVERTICAL_TOP_STRETCHING = 0.05 * uSlideHeight;\n\t\tHORIZONTAL_MAX_AMPLITUDE = 0.93 * uSlideHeight;\n\n\t \tvTextureCoord = aTextureCoord;\n\n\t\tvec3 vertex = vec3(aVertexPosition.x, -aVertexPosition.y, aVertexPosition.z);\n\t\tvec4 p = vec4(getPosition(uPhase, vertex), 1.0);\n\t\tgl_Position = uPMVMatrix * p;\n\n\t\tvec3 transformedNormal = uNMatrix * getVertexNormal(uPhase, vertex);\n\t\tvNormal = transformedNormal;\n\t}"}; +var Vz=void 0;function Wz(a,b){R.call(this,a);this.P=b;this.Ma(!0,!0)}r(Wz,R);Wz.prototype.initialize=function(){vv(this,!1);wv(this,!1);const a=S(this.slideWidth(),this.slideHeight());F(a,"position","absolute");this.wa().appendChild(a);this.aH=a}; +Wz.prototype.Ia=function(a){const b=this.slideWidth(),c=this.slideHeight(),d=b*pw(0,b,Math.floor(a*b));a=c*pw(0,c,Math.floor(a*c));const e=this.aH.getContext("2d");e.clearRect(0,0,b,c);switch(this.P){case Xz:e.drawImage(this.qb,0,a-c);e.drawImage(this.Ea,0,a);break;case Yz:e.drawImage(this.qb,b-d,0);e.drawImage(this.Ea,-d,0);break;case Zz:e.drawImage(this.qb,d-b,0);e.drawImage(this.Ea,d,0);break;case $z:e.drawImage(this.qb,0,c-a),e.drawImage(this.Ea,0,-a)}};var Xz=0,Yz=1,Zz=2,$z=3;function aA(a,b){R.call(this,a);this.VS=b;this.Ma(!1,!0);this.Ny=[];a=this.slideWidth();switch(this.VS){case bA:a=this.slideHeight();break;case cA:a=this.slideWidth()}this.Zu=Math.floor(a/7);a=[];for(b=0;bd.YI?1:0});for(b=0;b=this.Ny[c].getStartTime()+.2?b.addColorStop(g,f):d>=this.Ny[c].getStartTime()?b.addColorStop(g,"rgba(255,255,255,"+h+")"):b.addColorStop(g,a)}e.fillStyle=b;e.beginPath();e.rect(0,0,this.slideWidth(),this.slideHeight());e.fill();e.restore()};var bA=0,cA=1;function dA(a,b){this.yq=a;this.Xj=b}dA.prototype.getStartTime=function(){return this.Xj};function eA(a,b){R.call(this,a);this.P=b;this.lf=!1;this.Ma(!1,!1,!0,!0,!1,!1)}r(eA,R);eA.prototype.initialize=function(){vv(this,!1);wv(this,!1);var a=this.wa(),b=this.lb().background();a.appendChild(b);a=this.wa();b=this.uc().background();a.appendChild(b);this.iE=S(this.slideWidth(),this.slideHeight());F(this.iE,"position","absolute");this.wa().appendChild(this.iE);this.bK=S(this.slideWidth(),this.slideHeight());F(this.bK,"position","absolute");this.wa().appendChild(this.bK)}; +eA.prototype.Ia=function(a){var b=this.slideWidth(),c=this.slideHeight(),d=this.iE.getContext("2d");d.clearRect(0,0,b,c);var e=.5>a?this.P==fA||this.P==gA?Y(0,-b,.5,b):Y(0,b,.5,-b):this.P==fA||this.P==gA?Y(.5,b,1,-b):Y(.5,-b,1,b);e=d.createLinearGradient(e(a),0,e(a)+b,0);this.P==fA||this.P==gA?(e.addColorStop(0,"rgba(0, 0, 0, 1)"),e.addColorStop(1,"rgba(0, 0, 0, 0)")):(e.addColorStop(0,"rgba(0, 0, 0, 0)"),e.addColorStop(1,"rgba(0, 0, 0, 1)"));this.P==hA||this.P==gA?(G(this.uc().background(),1-a), +.5>a?d.drawImage(this.pq,0,0):d.drawImage(this.Rn,0,0),d.save(),d.globalCompositeOperation="destination-out",d.fillStyle=e,d.fillRect(0,0,this.slideWidth(),this.slideHeight()),d.restore()):(.5>a?(G(this.uc().background(),1),d.drawImage(this.pq,0,0)):(G(this.uc().background(),0),d.drawImage(this.Rn,0,0)),d=this.bK.getContext("2d"),d.clearRect(0,0,b,c),d.fillStyle=e,d.fillRect(0,0,this.slideWidth(),this.slideHeight()));.5>a?(b=Y(0,0,.5,iA),c=Y(0,0,.5,jA),d=Y(0,1,.5,1+kA)):(b=Y(.5,-iA,1,0),c=Y(.5,jA, +1,0),d=Y(.5,1+kA,1,1));a="scale("+d(a)+") translate("+b(a)+"px,"+c(a)+"px)";xi(this.iE,a)};var iA=-30,jA=-20,kA=.1,hA=0,gA=1,fA=2;function lA(a,b){R.call(this,a);this.Ha=b;this.lf=!1;this.Ma(!1,!0)}r(lA,R);lA.prototype.initialize=function(){vv(this,!1);wv(this,!0);const a=this.slideWidth(),b=this.slideHeight();this.W_=Math.sqrt(a*a+b*b)*(this.Ha==mA?.5:1);this.nx=a/2;this.ox=b/2;switch(this.Ha){case nA:this.nx=a;this.ox=b;break;case oA:this.nx=a;this.ox=0;break;case pA:this.nx=0;this.ox=b;break;case qA:this.ox=this.nx=0}this.Yn=S(a,b);F(this.Yn,"position","relative");this.wa().appendChild(this.Yn);this.RM=this.Yn.getContext("2d")}; +lA.prototype.Ia=function(a){this.RM.drawImage(this.Ea,0,0);var b=this.RM,c=this.nx,d=this.ox,e=this.W_;b.save();b.globalCompositeOperation="destination-in";c=b.createRadialGradient(c,d,0,c,d,e);d=1.2*a;e=1;var f=d,g=0,h=d-.2;.2>d?(g=1-d/.2,h=0):1<=d&&(e=1-(d-1)/.2,f=1);c.addColorStop(h,"rgba(0,0,0,"+zn(g)+")");c.addColorStop(f,"rgba(0,0,0,"+zn(e)+")");b.fillStyle=c;b.fillRect(0,0,this.slideWidth(),this.slideHeight());b.restore();b=.8-.2;c=this.RM;e=0;for(d=[1];;){f=2*a-.03125*e;if(0>=f)break;else 1> +f&&d.push(f);++e}d.push(0);e=this.nx;f=this.ox;e=c.createRadialGradient(e,f,0,e,f,this.W_);f=d.length;for(--f;0<=f;--f){g=d[f];h=a;h*=2;h=1-pw(h-.2,h,g);var l=a;l*=2;h=.3*(.5*Math.cos(8*Math.PI*(g-2*a))+.5)*h*pw(l-.2-b-.2,l-.2-b,g);h*=1-.5*g;e.addColorStop(g,"rgba(0,0,0,alpha)".replace("alpha",zn(h).toString()))}c.fillStyle=e;c.fillRect(0,0,this.slideWidth(),this.slideHeight())};var mA=0,pA=1,nA=2,oA=3,qA=4;function rA(a,b){R.call(this,a);this.P=b;this.Ma(!0,!0)}r(rA,Av);k=rA.prototype;k.initialize=function(){vv(this,!1);wv(this,!1);Dv(this,this.Ea);this.Hd();mat4.translate(this.mb,[-this.slideWidth()/2,this.slideHeight()/2,0]);Vv(this)};k.Hd=function(){this.mg=Ex(50,50,this.slideWidth(),this.slideHeight());this.Ce=Gx(50,50);this.ol=new Wv;var a=Iv(this,cw(this.mg),3);this.ol.ug=a;a=Iv(this,dw(this.mg),2);this.ol.Bg=a;a=Jv(this,this.Ce);this.ol.gg=a};k.Qh=function(){Gv(this,this.ol);this.N.deleteTexture(this.JB)}; +k.gi=function(){Ov(this);this.mB=Qv(this,"uSampler1");this.nB=Qv(this,"uSampler2");this.tg=Qv(this,"uPhase");const a=Qv(this,"uSlideSize"),b=Qv(this,"uWaveCenter"),c=Qv(this,"uWaveRadius"),d=this.slideWidth(),e=this.slideHeight();let f;switch(this.P){case mA:f=new V(d/2,e/2);break;case oA:f=new V(d,0);break;case qA:f=new V(0,0);break;case pA:f=new V(0,e);break;case nA:f=new V(d,e);break;default:throw Error("Unknown direction");}let g=Math.sqrt(d*d+e*e);this.P==mA&&(g=Math.sqrt(f.x()*f.x()+f.y()*f.y())); +this.N.uniform2fv(a,[d,e]);this.N.uniform2fv(b,[f.x(),f.y()]);this.N.uniform1f(c,g)};k.Rh=function(){};k.Ia=function(a){this.N.uniform1f(this.tg,a);Nv(this,this.ol,this.N.TRIANGLE_STRIP)};k.Uh=function(){return"precision mediump float;\n\n\tattribute vec3 aVertexPosition;\n\tattribute vec2 aTextureCoord;\n\n\tuniform mat4 uPMVMatrix;\n\tuniform mat3 uNMatrix;\n\n\tconst float FREQUENCY = 12.566371; // 4.0 * PI\n\tconst float SHADOW = 0.3;\n\n\tuniform float uPhase;\n\tuniform vec2 uSlideSize;\n\tuniform vec2 uWaveCenter;\n\tuniform float uWaveRadius;\n\n\tvarying mediump vec2 vTextureCoord;\n\tvarying mediump float vShadow;\n\tvarying mediump float vAlpha;\n\n\tvoid main(void)\n\t{\n\t\tvec2 texCoord = aTextureCoord;\n\t\tvec2 screenCoord = texCoord * uSlideSize;\n\t\tvec2 centerToPoint = screenCoord - uWaveCenter;\n\n\t\tfloat angle = atan(centerToPoint.y, centerToPoint.x);\n\t\tfloat radius = length(centerToPoint);\n\n\t\tfloat phaseOffset = radius / uWaveRadius;\n\t\tfloat phaseOffsetFixed = (uPhase + uPhase) - phaseOffset;\n\t\tfloat offset = sin(phaseOffsetFixed * FREQUENCY) * smoothstep(1.0, 0.85, phaseOffsetFixed) * smoothstep(0.0, 0.15, phaseOffsetFixed) * (phaseOffset);\n\n\t\tfloat AMPLITUDE = min(uSlideSize.x, uSlideSize.y) / 15.0;\n\t\tradius = radius + offset * AMPLITUDE;\n\t\tcenterToPoint = vec2(radius * cos(angle), radius * sin(angle));\n\n\t\ttexCoord =(uWaveCenter + centerToPoint) / uSlideSize;\n\t\tfloat alpha = smoothstep(0.0, 1.0, phaseOffsetFixed);\n\t\tfloat shadow = (1.0 - SHADOW * abs(offset));\n\n\t\tvTextureCoord = texCoord;\n\t\tvShadow = shadow;\n\t\tvAlpha = alpha;\n\n\t\tgl_Position = uPMVMatrix * vec4(aVertexPosition, 1.0);\n\t}"}; +k.Th=function(){return"precision mediump float;\n\n\tvarying mediump vec2 vTextureCoord;\n\tvarying mediump float vShadow;\n\tvarying mediump float vAlpha;\n\n\tuniform sampler2D uSampler1;\n\tuniform sampler2D uSampler2;\n\n\tvoid main(void) \n\t{ \n\t\tif (vTextureCoord.x < 0.0 || vTextureCoord.x > 1.0 || vTextureCoord.y < 0.0 || vTextureCoord.y > 1.0) \n\t\t{ \n\t\t\tgl_FragColor = mix(vec4(0.0), vec4(0.0), 0.0);\n\t\t\treturn;\n\t\t} \n\t\tvec4 color1 = texture2D(uSampler1, vTextureCoord);\n\t\tvec4 color2 = texture2D(uSampler2, vTextureCoord);\n\t\tvec4 mixedColor = mix(color1, color2, vAlpha);\n\t\tgl_FragColor = vec4(vShadow * mixedColor.rgb, mixedColor.a);\n\t}"}; +k.Qz=function(){this.IB=Hv(this,this.N.TEXTURE0,this.mB,0,this.Ea);this.JB=Hv(this,this.N.TEXTURE1,this.nB,1,this.qb)};function sA(a){R.call(this,a);this.Ma(!1,!0)}r(sA,R);sA.prototype.initialize=function(){vv(this,!1);this.Yn=S(this.slideWidth(),this.slideHeight());this.wa().appendChild(this.Yn);this.Cj=this.Yn.getContext("2d")}; +sA.prototype.Ia=function(a){const b=this.slideWidth(),c=this.slideHeight();var d=this.Ea;const e=this.Cj;e.clearRect(0,0,b,c);e.drawImage(d,0,0);e.save();d=a*Math.max(b,c);e.globalCompositeOperation="destination-out";const f=e.createRadialGradient(b/2,c/2,a*d,b/2,c/2,d);f.addColorStop(0,"#FFFFFF");f.addColorStop(.15,"rgba(255,255,255,128)");f.addColorStop(1,"rgba(255,255,255,0)");e.fillStyle=f;e.beginPath();e.arc(b/2,c/2,d,0,2*Math.PI,!0);e.fill();e.restore();this.oa()&&0>=a&&wv(this,!1)};function tA(a){R.call(this,a);this.Ma(!0,!1)}r(tA,R);tA.prototype.initialize=function(){wv(this,!1);vv(this,!0);this.rW=S(this.slideWidth(),this.slideHeight());this.wa().appendChild(this.rW);this.S5=this.qb.getContext("2d");this.T5=this.rW.getContext("2d")}; +tA.prototype.Ia=function(a){if(0!=a||this.oa()){var b=this.slideWidth(),c=this.slideHeight(),d=this.qb,e=this.T5;e.clearRect(0,0,b,c);e.drawImage(d,0,0);e.save();e.globalCompositeOperation="destination-out";d=uA(this,b/2,c/2,b/2+b*a,c/2+c*a,a,!1,!1);var f=b/2,g=c/2,h=b/2,l=c/2;e.fillStyle=d;e.beginPath();e.rect(f,g,h,l);e.fill();d=uA(this,b/2,c/2,b/2+b*a,-a*c+c/2,a,!0,!1);f=b/2;g=b/2;h=c/2;e.fillStyle=d;e.beginPath();e.rect(f,0,g,h);e.fill();d=uA(this,b/2,c/2,-a*b+b/2,c/2+c*a,a,!1,!0);f=c/2;g=b/2; +h=c/2;e.fillStyle=d;e.beginPath();e.rect(0,f,g,h);e.fill();a=uA(this,b/2,c/2,-a*b+b/2,-a*c+c/2,a,!0,!0);b/=2;c/=2;e.fillStyle=a;e.beginPath();e.rect(0,0,b,c);e.fill();e.restore()}}; +function uA(a,b,c,d,e,f,g,h){const l=a.S5;a=a.slideHeight()>a.slideWidth()?l.createLinearGradient(b,c,(h?-b:b)*f*2+d,e):l.createLinearGradient(b,c,d,(g?-c:c)*f*2+e);a.addColorStop(0,"rgba(255,255,255,0)");a.addColorStop(.2f?f+.2:1,"#FFFFFF");a.addColorStop(1,"#FFFFFF");return a};function vA(a){R.call(this,a);this.Ma(!1,!0)}r(vA,R);vA.prototype.initialize=function(){vv(this,!1);wv(this,!0);this.Oc=S(this.slideWidth(),this.slideHeight());this.wa().appendChild(this.Oc)}; +vA.prototype.Ia=function(a){var b=(this.slideWidth()/2+50)*(1-a),c=b-50,d=(this.slideHeight()/2+50)*(1-a);let e=d-50;const f=this.Oc.getContext("2d");f.clearRect(0,0,this.slideWidth(),this.slideHeight());f.drawImage(this.Ea,0,0);f.save();f.globalCompositeOperation="destination-out";d=f.createLinearGradient(0,d,0,e);d.addColorStop(0,"rgba(255, 255, 255, 1)");d.addColorStop(1,"rgba(255, 255, 255, 0)");b=f.createLinearGradient(b,0,c,0);b.addColorStop(0,"rgba(255, 255, 255, 1)");b.addColorStop(1,"rgba(255, 255, 255, 0)"); +c=this.slideWidth()/2+(this.slideWidth()/2+50)*a;c=f.createLinearGradient(c-50,0,c,0);c.addColorStop(0,"rgba(255, 255, 255, 1)");c.addColorStop(1,"rgba(255, 255, 255, 0)");e=this.slideHeight()/2+(this.slideHeight()/2+50)*a;a=f.createLinearGradient(0,e-50,0,e);a.addColorStop(0,"rgba(255, 255, 255, 1)");a.addColorStop(1,"rgba(255, 255, 255, 0)");f.fillStyle=d;f.fillRect(0,0,this.slideWidth()/2,this.slideHeight()/2);f.fillStyle=b;f.fillRect(0,0,this.slideWidth()/2,this.slideHeight()/2);f.fillStyle=a; +f.fillRect(0,this.slideHeight()/2,this.slideWidth()/2,this.slideHeight()/2);f.fillStyle=b;f.fillRect(0,this.slideHeight()/2,this.slideWidth()/2,this.slideHeight()/2);f.fillStyle=d;f.fillRect(this.slideWidth()/2,0,this.slideWidth()/2,this.slideHeight()/2);f.fillStyle=c;f.fillRect(this.slideWidth()/2,0,this.slideWidth()/2,this.slideHeight()/2);f.fillStyle=a;f.fillRect(this.slideWidth()/2,this.slideHeight()/2,this.slideWidth()/2,this.slideHeight()/2);f.fillStyle=c;f.fillRect(this.slideWidth()/2,this.slideHeight()/ +2,this.slideWidth()/2,this.slideHeight()/2);f.restore()};function wA(){var a=Array(2);xA(a,0,0);return a}function xA(a,b,c){a[0]=b;a[1]=c};function yA(a,b){R.call(this,a);this.Ha=b;this.Ma(!0,!0)}r(yA,R);k=yA.prototype; +k.initialize=function(){vv(this,!1);wv(this,!1);this.kK=this.a_=!1;this.JF=[];this.PF=[];var a=this.slideWidth(),b=this.slideHeight();this.zM=Math.max(a,b);var c=this.yn(this.wa(),a,b,!0);Di(c,this.zM+"px");this.pa=this.yn(c,a,b,!0);this.TM=this.yn(this.pa,a,b,!0);this.KF=this.yn(this.pa,a,b,!0);F(this.KF,"visibility","hidden");if(this.Ha==zA||this.Ha==AA){b=Ni?4:8;c=this.oa()?this.qb:this.Ea;const p=this.oa()?this.Ea:this.qb;var d=this.slideWidth(),e=this.slideHeight(),f=b/2-1;for(a=0;aMath.random()?-1:1));this.PF[a]=this.ov(this.TM,d,e,g,l,h);this.JF[a]=this.ov(this.KF,d,e,g,l,h)}d/=128;e/=96;f=0;h=[];for(a=0;128>a;++a){g=0;l=Math.round((a+1)*d)-f;const t=f;for(let w=0;96>w;++w){if(0==h.length)for(var n=0;nc&&(T=c-J);if(!w&&J+T>=c)if(T>.5*g+h)T=h;else{X.iy=void 0;y=wA();xA(y,X.Vo.x,0);D=wA();xA(D,J+T,U);X.Vo.Fr.x+=T;X.Vo.Fr.y=d;continue}w?(y=wA(),xA(y,J,0),D=wA(),xA(D,J+T,U),X.Vo={YC:y,Fr:D}):(y=wA(),xA(y,J,U),D=wA(),xA(D,J+T,d),X.iy={YC:y,Fr:D},m.push({WC:void 0,Vo:void 0,iy:void 0}),p=m[++t],y=wA(),xA(y,J,0),D=wA(),xA(D,J+T,U),p.WC={YC:y,Fr:D});p=T;w= +!w}const I=a.oa()?a.qb:a.Ea,A=a.oa()?a.Ea:a.qb;e=.5>Math.random()?-1:1;for(f=0;f=a)&&(this.kK=!0);if(0<=a&&.4>a){var d=Y(0,0,.4,1);a=d(a)}else.6<=a&&1>a?(d=Y(.6,1,1,0),a=d(a)):a=1;d=-this.zM*a/2;let e=30*a*(this.kK?-1:1);c&&b&&(e=-e);xi(this.pa,"translateZ("+d+"px) rotateY("+e+"deg) rotateX("+-15*a+"deg)")}; +k.Ia=function(a){if(1!=a||!this.oa()){this.DM(a);const f=2*this.zM;var b=this.oa();let g=this.PF;if(b&&.47>=a||!b&&.47<=a)g=this.JF,this.a_||(this.a_=!0,F(this.KF,"visibility","visible"),F(this.TM,"visibility","hidden"));b=g.length;for(let h=0;hc){var d=Y(0,0,.4,1);c=d(c)}else.522<=c&&.922>c?(d=Y(.522,1,.922,0),c=d(c)):c=.4<=c&&.522>c?1:0;c*=l.yaa;d=a;if(.401<=d&&.461>d){var e=Y(.401,0,.461,1);d=e(d)}else.461<=d&&.521>d?(e=Y(.461,1,.521,0),d=e(d)):d=0;xi(l.canvas, +"translateZ("+(d*f*l.direction+c)+"px)")}}};function CA(a,b,c,d){this.canvas=a;this.startTime=b;this.yaa=c;this.direction=d}var DA=1,zA=2,AA=3;function EA(a,b){R.call(this,a);this.Ma(!1,!0);this.P=b}r(EA,R);EA.prototype.initialize=function(){vv(this,!1);wv(this,!0);this.Oc=S(this.slideWidth(),this.slideHeight());this.wa().appendChild(this.Oc)}; +EA.prototype.Ia=function(a){var b=0;let c=0,d=0,e=0;var f=0;let g=0,h=0,l=0;switch(this.P){case FA:e=(this.slideHeight()/2+200)*a;c=e-200;h=this.slideHeight()-a*(this.slideHeight()/2+200);l=h+200;break;case GA:c=(this.slideHeight()/2+200)*(1-a);e=c-200;l=this.slideHeight()-(1-a)*(this.slideHeight()/2+200);h=l+200;break;case HA:d=(this.slideWidth()/2+200)*a;b=d-200;f=this.slideWidth()-a*(this.slideWidth()/2+200);g=f+200;break;case IA:b=(this.slideWidth()/2+200)*(1-a),d=b-200,g=this.slideWidth()-(1- +a)*(this.slideWidth()/2+200),f=g+200}a=this.Oc.getContext("2d");a.clearRect(0,0,this.slideWidth(),this.slideHeight());a.drawImage(this.Ea,0,0);a.save();a.globalCompositeOperation="destination-out";b=a.createLinearGradient(b,c,d,e);b.addColorStop(0,"rgba(255, 255, 255, 1)");b.addColorStop(1,"rgba(255, 255, 255, 0)");a.fillStyle=b;this.P==HA||this.P==IA?a.fillRect(0,0,this.slideWidth()/2,this.slideHeight()):a.fillRect(0,0,this.slideWidth(),this.slideHeight()/2);f=a.createLinearGradient(f,h,g,l);f.addColorStop(0, +"rgba(255, 255, 255, 0)");f.addColorStop(1,"rgba(255, 255, 255, 1)");a.fillStyle=f;this.P==HA||this.P==IA?a.fillRect(this.slideWidth()/2,0,this.slideWidth()/2,this.slideHeight()):a.fillRect(0,this.slideHeight()/2,this.slideWidth(),this.slideHeight()/2);a.restore()};var HA=0,IA=1,FA=2,GA=3;function JA(a,b){R.call(this,a);this.Ma(!1,!0);this.P=b}r(JA,R);JA.prototype.initialize=function(){vv(this,!1);wv(this,!0);this.Oc=S(this.slideWidth(),this.slideHeight());F(this.Oc,"position","relative");this.wa().appendChild(this.Oc)}; +JA.prototype.Ia=function(a){var b=0;let c=0,d=0,e=0;switch(this.P){case KA:e=(this.slideHeight()+400)*a;c=e-200;b=(this.slideWidth()+400)*(1-a);d=b-200;break;case LA:c=(this.slideHeight()+400)*(1-a);e=c-200;b=(this.slideWidth()+400)*(1-a);d=b-200;break;case MA:e=(this.slideHeight()+400)*a;c=e-200;d=(this.slideWidth()+400)*a;b=d-200;break;case NA:d=(this.slideWidth()+400)*a,b=d-200,c=(this.slideHeight()+400)*(1-a),e=c-200}a=this.Oc.getContext("2d");a.clearRect(0,0,this.slideWidth(),this.slideHeight()); +a.drawImage(this.Ea,0,0);a.save();a.globalCompositeOperation="destination-out";b=a.createLinearGradient(b,c,d,e);b.addColorStop(0,"rgba(255, 255, 255, 1)");b.addColorStop(1,"rgba(255, 255, 255, 0)");a.fillStyle=b;a.fillRect(0,0,this.slideWidth(),this.slideHeight());a.restore()};var KA=0,LA=1,MA=2,NA=3;function OA(a,b,c){R.call(this,a);this.P=b;this.$z=c;this.Ma(!0,!0)}r(OA,R);k=OA.prototype; +k.initialize=function(){vv(this,!1);wv(this,!1);const a=this.slideWidth(),b=this.slideHeight();this.Te=this.pc(a,b);this.wa().appendChild(this.Te);var c=S(a,b),d=S(a,b);this.Fc=this.pc(a,b);this.sh=this.pc(a,b);this.rh=this.pc(a,b);this.$z||(this.Sn=S(a,b));this.sh.appendChild(c);this.rh.appendChild(d);this.Te.appendChild(this.Fc);this.Fc.appendChild(this.rh);this.Fc.appendChild(this.sh);this.$z||(F(this.Sn,"position","absolute"),this.Fc.appendChild(this.Sn));c=c.getContext("2d");d=d.getContext("2d"); +c.drawImage(this.Ea,0,0);d.drawImage(this.qb,0,0);this.$z||(this.Sn.getContext("2d").drawImage(this.qb,0,0),this.oa()||G(this.Sn,0));this.rF=!1;this.$z&&(Di(this.Te,Math.max(a,b)+"px"),Ei(this.Te,this.slideWidth()/2+"px "+this.slideHeight()/2+"px"),Ci(this.Fc,"preserve-3d"))};k.pc=function(a,b){const c=zd("DIV");Oh(c,a);Ph(c,b);F(c,"position","absolute");return c}; +k.Ia=function(a){const b=this.P==PA?-1:1;if(this.$z){var c=.25*(1-Math.cos(2*a*Math.PI));var d=Math.max(this.slideHeight(),this.slideWidth()),e=this.O2,f=this.P2,g=this.AJ,h=-b*c*this.slideWidth()/2,l=c*this.slideHeight()*1.5;xi(this.Fc,"translateZ("+d+"px) translateY("+l+"px) translateX("+h+"px) rotateX("+-e*c+"deg) rotateY("+-b*f*c+"deg) rotateZ("+b*g*c+"deg)");QA(this,a,!1);QA(this,a,!0)}else e=this.slideHeight()/2,c=.25*(1-Math.cos(2*a*Math.PI)),d=-e*c,e=(this.slideHeight()+e)*c,Gh(this.sh,0, +d),Gh(this.rh,0,e),Gh(this.Sn,0,e),e=new gm,d=new gm,e.rotate(this.AJ*Math.PI/180*b*c,0,0),d.rotate(this.AJ*Math.PI/180*b*c,0,0),on(this.sh,e),on(this.rh,d),on(this.Sn,d),c=Math.max(1-a,.8),e.scale(c,c),on(this.sh,e),c=this.oa()?Math.max(a,.8):Math.max(.5>a?1-a:a,.8),d.scale(c,c),on(this.rh,d),on(this.Sn,d),.5<=a&&!this.rF&&!this.oa()?(this.rF=!0,G(this.Sn,1)):.5>=a&&!this.rF&&this.oa()&&(this.rF=!0,G(this.Sn,0))}; +function QA(a,b,c){var d=a.slideHeight()/2;const e=.25*(1-Math.cos(2*b*Math.PI));d=(c?-(d+a.Ql):a.slideHeight()+d+a.Ql)*e;b=-(c?1+b:2-b)*Math.max(a.slideWidth(),a.slideHeight());xi(c?a.sh:a.rh,"translateY("+d+"px) translateZ("+b+"px)")}k.O2=30;k.P2=20;k.AJ=30;k.Ql=20;var PA=1;function RA(a,b,c){R.call(this,a);this.Bc=c;this.Ma(!0,!0);this.qo=b==PA}r(RA,R);k=RA.prototype; +k.initialize=function(){vv(this,!1);wv(this,!1);const a=this.slideWidth(),b=this.slideHeight();this.OH=this.pc(a,b);this.wa().appendChild(this.OH);this.Jp=this.pc(a,b);this.Vg=this.pc(a,b);this.Tg=this.pc(a,b);this.qo?(this.Vg.appendChild(this.qb),this.Tg.appendChild(this.Ea)):(this.Vg.appendChild(this.Ea),this.Tg.appendChild(this.qb));this.OH.appendChild(this.Jp);this.qo?(this.Jp.appendChild(this.Vg),this.Jp.appendChild(this.Tg)):(this.Jp.appendChild(this.Tg),this.Jp.appendChild(this.Vg));this.QH= +!1;this.Bc&&(Di(this.OH,Math.max(a,b)+"px"),Ei(this.OH,this.slideWidth()/2+"px "+this.slideHeight()/2+"px"),Ci(this.Jp,"preserve-3d"))};k.Ia=function(a){a=this.qo?1-a:a;this.Bc?this.kO(a):this.mL(a)}; +k.kO=function(a){function b(g){const h=g?-1:1,l=g?this.Vg:this.Tg;g="translateZ("+(g?e:f).call(this,a)*d+"px)rotateY("+-30*h*c+"deg)translateX("+h*c*this.slideWidth()*1.05+"px)";xi(l,g)}const c=.25*(1-Math.cos(2*a*Math.PI)),d=Math.max(this.slideWidth(),this.slideHeight()),e=Y(0,0,1,-.3),f=Y(0,-.3,1,0);b.call(this,!0);b.call(this,!1)}; +k.mL=function(a){function b(d){const e=d?-1:1;d=d?this.Vg:this.Tg;const f=new gm;f.scale(1-.5*c,1-.5*c);f.translate(e*c*this.slideWidth()*1.05,0);on(d,f)}this.qo?.5>a&&!this.QH&&(this.Jp.appendChild(this.Vg),this.QH=!0):.5<=a&&!this.QH&&(this.Jp.appendChild(this.Tg),this.QH=!0);const c=.25*(1-Math.cos(2*a*Math.PI));this.slideWidth();this.slideHeight();b.call(this,!0);b.call(this,!1)};k.pc=function(a,b){const c=zd("DIV");Oh(c,a);Ph(c,b);F(c,"position","absolute");return c};function SA(a,b){R.call(this,a);this.P=b;this.Ma(!0,!0);this.yr()}var TA,UA,VA,WA,XA,YA,ZA;r(SA,R); +SA.prototype.yr=function(){var a=this.slideWidth(),b=this.slideHeight(),c=YA!=a||ZA!=b;if(!(TA&&UA&&VA&&WA&&XA)||c){YA=a;ZA=b;TA=[];UA=[];VA=[];WA=[];XA=[];a=this.slideWidth();b=this.slideHeight();c=TA;const g=UA,h=VA;for(var d=0;d<$A;++d)c[d]=aB(a,b),g[d]=aB(a,b),h[d]=aB(a,b);d=bB/cB;const l=dB/cB,n=[],m=a/bB,p=b/dB;let t=0,w;for(let y=0;y=Ma.uR;m=Ma;var t=lc,w=p;p=ha;var y=ra,D=sb,I=Cb;const $k=this.P==iB||this.P==jB,al=this.oa();var A=this.slideWidth(), +J=this.slideHeight();const wu=this.XD.getContext("2d"),Oo=TA;var T=UA,U=VA;const Po=this.Ea,Qo=this.qb;w&&(w=Oo[t],t=($k?T:U)[t],T=m.NQ.getContext("2d"),U=m.lQ.getContext("2d"),A-=p+D,J-=y+I,T.drawImage(w,p,y,D,I,0,0,D,I),U.drawImage(t,A,J,D,I,0,0,D,I),T.save(),T.globalCompositeOperation="source-out",T.drawImage(Po,p,y,D,I,0,0,D,I),T.restore(),U.save(),U.globalCompositeOperation="source-out",U.drawImage(Qo,A,J,D,I,0,0,D,I),U.restore(),wu.clearRect(al&&$k?A:p,al&&!$k?J:y,D,I),m.b1=!0)}Ma.BS(a,g,h, +aa.naa)}}};function lB(a,b,c){this.X7=a;this.e1=[];this.H8=b;this.uF=c}lB.prototype.BS=function(a){const b=this.uF;a=(a-this.H8)/gB;a=Math.min(Math.max(a,0),1);a=Math.PI*a*(b?1:-1);xi(this.X7,(b?"rotateY":"rotateX")+"("+a+"rad)");this.naa=a}; +function hB(a,b,c,d,e,f,g,h,l,n,m,p){this.NQ=b;this.lQ=c;xi(c,(m?"rotateY":"rotateX")+"(180deg)");this.Ie=f;this.wc=a;this.sl=d;this.tl=e;this.As=n;this.uR=g;this.HX=g+(h-g)/2;this.U7=.8+this.uR-.2;this.I1=.8+this.HX-.2;this.n4=0>l?-1:1;this.F5=Math.abs(l);this.U5=p;this.uF=m;this.b1=!1;mB(this,!0)} +hB.prototype.BS=function(a,b,c,d){var e=this.wc,f=this.F5,g=this.Ie,h=nB(a,this.uR,this.U7,f);a=nB(a,this.HX,this.I1,f);f=this.uF;var l=this.U5,n=this.n4,m=l?-n:n;f&&(m=l?n:-n);l=l?Math.max(h,a):Math.min(h,a);g=Math.atan2(h-a,g)*m;h>a?yi(e,"0% 0%"):yi(e,"100% 100%");l*=n;xi(e,"translateZ("+l+"px)"+((f?"rotateY":"rotateX")+"("+g+"rad)"));f=l;e=this.sl;h=this.tl;n=this.Ie;m=this.uF;a=Array(16);a[0]=0;a[1]=0;a[2]=0;a[3]=0;a[4]=0;a[5]=0;a[6]=0;a[7]=0;a[8]=0;a[9]=0;a[10]=0;a[11]=0;a[12]=0;a[13]=0;a[14]= +0;a[15]=0;a[0]=1;a[1]=0;a[2]=0;a[3]=0;a[4]=0;a[5]=1;a[6]=0;a[7]=0;a[8]=0;a[9]=0;a[10]=1;a[11]=0;a[12]=0;a[13]=0;a[14]=0;a[15]=1;m?(b-=(e-n)/2,ti(a,b,0,0),vi(a,d),ti(a,-b,0,0),ti(a,0,0,f),vi(a,g)):(b=c-(h-n)/2,ti(a,0,b,0),ui(a,d),ti(a,0,-b,0),ti(a,0,0,f),ui(a,g));b=pi();qi(b,e,h,0,1);si(a,b,b);d=pi();qi(d,b[0],b[1],b[2],0);ri(d,this.As,d);b=pi();qi(b,e,h,1,0);c=pi();qi(c,e,h,0,0);ri(b,c,b);si(a,b,b);d=ni(b,d);this.nF?0<=d&&mB(this,!1):0>=d&&mB(this,!0)}; +function mB(a,b){const c=b?a.NQ:a.lQ,d=b?a.lQ:a.NQ;a.nF=b;F(c,"visibility","visible");F(d,"visibility","hidden")}function nB(a,b,c,d){return a>=b&&a<=b+.2?d*(a-b)/.2:a>=c?Math.max(d-d*(a-c)/.2,0):a>=b?d:0}var iB=0,jB=2,kB=3;function oB(a,b){R.call(this,a);this.P=b;this.Ma(!0,!0)}r(oB,Av);k=oB.prototype;k.initialize=function(){vv(this,!1);wv(this,!1);Dv(this,this.Ea);this.Hd();mat4.translate(this.mb,[-this.slideWidth()/2,this.slideHeight()/2,0]);Vv(this)}; +k.gi=function(){Ov(this);this.ZT=Pv(this,"aDelay");this.$V=Pv(this,"aMaxDistance");this.mB=Qv(this,"uSampler1");this.nB=Qv(this,"uSampler2");this.tg=Qv(this,"uPhase");const a=Qv(this,"uSlideWidth"),b=Qv(this,"uHorizontal");this.N.uniform1f(Qv(this,"uSlideHeight"),this.slideHeight());this.N.uniform1f(a,this.slideWidth());this.N.uniform1i(b,this.P==iB||this.P==jB?1:0)};k.Rh=function(){Fv(this,this.ZT);Fv(this,this.$V)}; +k.$J=function(){const a=this.N;a.bindBuffer(a.ARRAY_BUFFER,this.TK);a.vertexAttribPointer(this.ZT,this.TK.Vx,a.FLOAT,!1,0,0);a.bindBuffer(a.ARRAY_BUFFER,this.XK);a.vertexAttribPointer(this.$V,this.XK.Vx,a.FLOAT,!1,0,0)}; +k.Hd=function(){var a=this.slideWidth();const b=this.slideHeight();var c=ij&&Ii,d=Ni&&Ii||c;c=d?26:50;d=d?20:45;const e=a/c,f=b/d;this.jb=new pB;for(let g=0;g endTime)\n\t\t{\n\t\t\tpPhase = 1.0;\n\t\t}\n\t\tfloat z = 4.0 * aMaxDistance * pPhase * (pPhase - 1.0);\n\t\tfloat rotation = 180.0 * pPhase;\n\n\t\tmat4 m = mat4(1.0);\n\n\t\tvec3 pivotPoint = vec3(- uSlideWidth / 2.0, uSlideHeight / 2.0, 0.0);\n\t\tm = m * translationMatrix(-pivotPoint.x, -pivotPoint.y, -pivotPoint.z);\n\t\tif (uHorizontal)\n\t\t{\n\t\t m = m * rotationYmatrix(rotation);//left right\n\t\t}\n\t\telse \n\t\t{\n\t\t\tm = m * rotationXmatrix(rotation);//top bottom\n\t\t}\n\t\tm = m * translationMatrix(pivotPoint.x, pivotPoint.y, pivotPoint.z);\n\t\tm = m * translationMatrix(0.0, 0.0, z);\n\n\t\treturn m;\n\t}\n\n\tvec3 getVertexPosition() \n\t{ \n\t\tmat4 m = positionMatrix();\n\t\tvec4 v = m * vec4(aVertexPosition, 1.0);\n\t\treturn v.xyz;\n\t} \n\tvec3 getNormal() \n\t{\n\t\tmat4 m = positionMatrix();\n\t\tvec4 v = m * vec4(0 ,0, 1, 0.0);\n\t\treturn v.xyz;\n\t}\n\tvoid main(void)\n\t{\n\t\tvTextureCoord = aTextureCoord;\n\n\t\tvec3 pos = getVertexPosition();\n\t\tvec3 n = getNormal();\n\t\tn = normalize(n);\n\t\tgl_Position = uPMVMatrix * vec4(pos, 1.0); \n\t\tvNormal = uNMatrix * n;\n\t}"}; +function pB(){this.GT=0;this.VN=[];this.UK=[];this.YK=[];this.nP=[];this.oh=[]}k=pB.prototype;k.tx=function(a){this.VN=this.VN.concat(a.FR());this.UK=this.UK.concat(a.xQ());this.YK=this.YK.concat(a.zQ());this.nP=this.nP.concat(a.vS());const b=4*this.GT;for(let c=0;c=1.5*Math.PI&&(d.beginPath(),d.moveTo(b,c),d.arc(b,c,this.Yg,3*Math.PI-a,a,!1),d.lineTo(b,c),d.fillStyle="#000",d.fill());d=this.QA;d.drawImage(this.qb,0,0);d.save();d.globalCompositeOperation="destination-in";d.drawImage(this.Oc,0,0);d.restore()}; +vB.prototype.zE=function(a,b,c,d,e,f,g){const h=this.jg;h.fillStyle="rgba(0,0,0,"+g.toString()+")";h.beginPath();h.moveTo(a,b);h.lineTo(c,d);h.lineTo(e,f);h.fill()}; +vB.prototype.ZK=function(a,b){const c=.5*this.slideWidth(),d=.5*this.slideHeight();let e=wB;b-=a;var f=a;f<1.5*Math.PI&&(e=(1.5*Math.PI-a)/b,f=1.5*Math.PI);let g=c+this.Yg*Math.cos(f),h=d+this.Yg*Math.sin(f),l=c+this.Yg*Math.cos(3*Math.PI-f);for(f=d+this.Yg*Math.sin(3*Math.PI-f);1>=e;){let n=a+e*b;n>2.5*Math.PI&&(n=2.5*Math.PI);const m=c+this.Yg*Math.cos(n),p=d+this.Yg*Math.sin(n);this.zE(c,d,g,h,m,p,1-e);const t=c+this.Yg*Math.cos(3*Math.PI-n),w=d+this.Yg*Math.sin(3*Math.PI-n);this.zE(c,d,l,f,t, +w,1-e);e+=wB;g=m;h=p;l=t;f=w;if(n==2.5*Math.PI)break}};function xB(a,b){R.call(this,a);this.po=!1;0>b&&(b=-b,this.po=!0);this.gP=b;this.Ma(!0,!1)}r(xB,R);xB.prototype.initialize=function(){var a=this.slideWidth();const b=this.slideHeight();wv(this,!1);const c=S(a,b);this.QA=c.getContext("2d");this.Oc=S(a,b);this.jg=this.Oc.getContext("2d");this.jg.scale(1,b/a);a*=.5;this.Yg=Math.sqrt(2*a*a);F(c,"position","absolute");this.wa().appendChild(c)};var yB=1/15; +xB.prototype.Ia=function(a){var b=this.slideWidth();this.slideHeight();const c=this.jg;let d=2/this.gP,e=.2/this.gP;this.po&&(d=-d,e=-e);c.clearRect(0,0,b,b);for(b=0;b=f)g.beginPath(),g.moveTo(l,l),this.po?g.arc(l,l,this.Yg,f,h,!0):g.arc(l,l,this.Yg,f,h,!1),g.lineTo(l,l),g.fillStyle="#000",g.fill()}a=this.QA;a.drawImage(this.qb,0,0);a.save(); +a.globalCompositeOperation="destination-in";a.drawImage(this.Oc,0,0);a.restore()};xB.prototype.zE=function(a,b,c,d,e,f,g){const h=this.jg;h.fillStyle="rgba(0,0,0,"+zn(g).toString()+")";h.beginPath();h.moveTo(a,b);h.lineTo(c,d);h.lineTo(e,f);h.fill()}; +xB.prototype.ZK=function(a,b,c,d){const e=.5*this.slideWidth();let f=yB;b-=a;var g=a;if(this.po&&g>c||!this.po&&g=f;){let h=a+f*b;if(this.po&&hd)h=d;const l=e+this.Yg*Math.cos(h),n=e+this.Yg*Math.sin(h);this.zE(e,e,c,g,l,n,1-f);f+=yB;c=l;g=n;if(h==d)break}};function zB(a,b){R.call(this,a);this.P=b;this.Ma(!1,!0)}r(zB,Av);k=zB.prototype;k.initialize=function(){vv(this,!1);wv(this,!0);Dv(this,this.Ea);this.Hd();this.N.enable(this.N.DEPTH_TEST);mat4.translate(this.mb,[-this.slideWidth()/2,this.slideHeight()/2,0]);this.UB=mat4.create();mat4.set(this.mb,this.UB)}; +k.Hd=function(){this.rg=Ex(20,20,this.slideWidth(),this.slideHeight());for(var a=0==this.P?Hx(20,20):Gx(20,20),b=[],c=0,d=a.length;c+2e)){var f=a[c++];if(!(0>f))for(var g=!0;ch)break;e!=f&&e!=h&&f!=h&&b.push(e,f,h);g?e=h:f=h;g=!g}}}this.Ce=b;this.$q=new aw;for(a=0;am;m++)w[0].push(AB(3,m,n));for(m=0;4>m;m++)w[1].push(AB(3,m,p));for(m=0;2>m;m++)w[2].push(AB(1,m,t));this.M_.push(w)}this.uh=[];for(c=0;4>c;c++)for(d=0;4>d;d++)for(e=0;2>e;e++)f=this.Hj(c,d,e),g=a,h=b,l=d,n=e,p=[0,0,0],p[0]=g[0]+c/3*(h[0]-g[0]),p[1]=g[1]+l/3*(h[1]-g[1]),p[2]=g[2]+n/1*(h[2]-g[2]),g=p,this.uh[f]= +g[0],this.uh[f+1]=g[1],this.uh[f+2]=g[2];this.XA={}};function AB(a,b,c){let d=1;for(let e=1;e<=b;e++)d*=(a-(b-e))/e;return d*Math.pow(c,b)*Math.pow(1-c,a-b)}k.Hj=function(a,b,c){return 3*(a+4*b+16*c)};k.Qh=function(){Gv(this,this.Oi)};k.Rh=function(){Fv(this,this.xl)};k.Th=function(){return"precision mediump float;\n\n\tvarying vec2 vTextureCoord;\n\tvarying vec3 vNormal;\n\n\tuniform sampler2D uSampler;\n\n\tconst vec3 LIGHT_DIRECTION = vec3(0.0, 0.0, 1.0);\n\tconst float AMBIENT_INTENSITY = 0.4;\n\tconst float DIFFUSE_INTENSITY = 0.6;\n\n\tvoid main(void)\n\t{\n\t\tfloat diffuseFactor = dot(normalize(vNormal), LIGHT_DIRECTION);\n\t\tfloat intentsity = AMBIENT_INTENSITY + DIFFUSE_INTENSITY * diffuseFactor * diffuseFactor;\n\t\tvec4 textureColor = texture2D(uSampler, vTextureCoord);\n\t\tgl_FragColor = vec4(textureColor.rgb * intentsity, textureColor.a);\n\t}"}; +k.Uh=function(){return"attribute vec3 aVertexPosition;\n\tattribute vec3 aVertexNormal;\n\tattribute vec2 aTextureCoord;\n\n\tuniform mat4 uPMVMatrix;\n\n\tuniform mat3 uNMatrix;\n\n\tvarying vec2 vTextureCoord;\n\tvarying vec3 vNormal;\n\n\tvoid main(void)\n\t{\n\t\tgl_Position = uPMVMatrix * vec4(aVertexPosition, 1.0);\n\t\tvTextureCoord = aTextureCoord;\n\t\tvNormal = uNMatrix * normalize(aVertexNormal);\n\t}"};k.gi=function(){Ov(this);this.xl=Pv(this,"aVertexNormal");this.gf=Qv(this,"uSampler")}; +k.Gj=function(){return this.gf};function BB(a,b,c,d){let e=a.Hj(b,c,0);const f=b.toString()+c.toString();let g;void 0===a.XA[f]?(g=[a.uh[e+0],a.uh[e+1],a.uh[e+2]],a.XA[f]=[g[0],g[1],g[2]]):g=[a.XA[f][0],a.XA[f][1],a.XA[f][2]];mat4.multiplyVec3(d,g,g);a.uh[e+0]=g[0];a.uh[e+1]=g[1];a.uh[e+2]=g[2];e=a.Hj(b,c,1);a.uh[e+0]=g[0];a.uh[e+1]=g[1];a.uh[e+2]=g[2]}k.Fz=function(){return this.xl}; +k.jK=function(){for(let a=0;ab&&DB(a,e,0,.2*a.slideHeight(),b);.6<=b&&DB(a,f,.2*a.slideHeight(),-.7*a.slideHeight(),b);mat4.identity(g);mat4.translate(g,[0,0,-.3*a.slideHeight()*Math.sin(1.5*Math.PI*d)]);c=0==a.P?0:3;BB(a,c,0,g)} +function FB(a,b){for(var c=0;c.2*a.slideWidth()?CB(a,d,b):0:d.position().x()<.8*a.slideWidth()?CB(a,d,b):0;var e=a.$q.kb[c],f=a,g=a.M_[c];let h;const l=new W;for(let n=0;4>n;n++){const m=new W;for(let p=0;4>p;p++){const t=new W;for(let w=0;2>w;w++){const y=f.Hj(n,p,w);h=g[2][w];Xv(t,new W(f.uh[y+0]*h,f.uh[y+1]*h,f.uh[y+2]*h))}h=g[1][p];Xv(m,new W(t.x()*h,t.y()*h,t.z()*h))}h=g[0][n];Xv(l,new W(m.x()*h,m.y()*h,m.z()*h))}$v(e,l.add(new W(0, +0,d)));Uv(a.$q.kb[c],new W)}a.jK();for(b=0;b=parseFloat(Vb)?!1:Wi(),d=Xi();if(!$s){const e={"null":function(h){return new at(h)},Cut:function(h){return new Jx(h)},CutThroughBlack:function(h){return new Kx(h)}};c?(e.BlindsHorizontal=function(h){return new ow(h,1)},e.BlindsVertical=function(h){return new ow(h,qw)}):(e.BlindsHorizontal=function(h){return new vw(h,1)},e.BlindsVertical=function(h){return new vw(h,ww)});e.CheckerboardAcross=function(h){return new Kw(h,Ow)};e.CheckerboardDown=function(h){return new Kw(h, +Lw)};e.Dissolve=function(h){return new Lx(h)};e.FadeThroughBlack=function(h){return new Xx(h)};b&&2013>a&&2007!=a?(e.CoverLeft=function(h){return new $w(h,ix,!1)},e.CoverUp=function(h){return new $w(h,fx,!1)},e.CoverRight=function(h){return new $w(h,jx,!1)},e.CoverDown=function(h){return new $w(h,hx,!1)},e.CoverLeftUp=function(h){return new $w(h,lx,!1)},e.CoverRightUp=function(h){return new $w(h,nx,!1)},e.CoverLeftDown=function(h){return new $w(h,kx,!1)},e.CoverRightDown=function(h){return new $w(h, +mx,!1)},e.UncoverLeft=function(h){return new $w(h,ix,!0)},e.UncoverUp=function(h){return new $w(h,fx,!0)},e.UncoverRight=function(h){return new $w(h,jx,!0)},e.UncoverDown=function(h){return new $w(h,hx,!0)},e.UncoverLeftUp=function(h){return new $w(h,lx,!0)},e.UncoverRightUp=function(h){return new $w(h,nx,!0)},e.UncoverLeftDown=function(h){return new $w(h,kx,!0)},e.UncoverRightDown=function(h){return new $w(h,mx,!0)}):(e.CoverLeft=function(h){return new sx(h,ix,!1)},e.CoverUp=function(h){return new sx(h, +fx,!1)},e.CoverRight=function(h){return new sx(h,jx,!1)},e.CoverDown=function(h){return new sx(h,hx,!1)},e.CoverLeftUp=function(h){return new sx(h,lx,!1)},e.CoverRightUp=function(h){return new sx(h,nx,!1)},e.CoverLeftDown=function(h){return new sx(h,kx,!1)},e.CoverRightDown=function(h){return new sx(h,mx,!1)},e.UncoverLeft=function(h){return new sx(h,ix,!0)},e.UncoverUp=function(h){return new sx(h,fx,!0)},e.UncoverRight=function(h){return new sx(h,jx,!0)},e.UncoverDown=function(h){return new sx(h, +hx,!0)},e.UncoverLeftUp=function(h){return new sx(h,lx,!0)},e.UncoverRightUp=function(h){return new sx(h,nx,!0)},e.UncoverLeftDown=function(h){return new sx(h,kx,!0)},e.UncoverRightDown=function(h){return new sx(h,mx,!0)});e.RandomBarsHorizontal=function(h){return new aA(h,bA)};e.RandomBarsVertical=function(h){return new aA(h,cA)};e.StripsLeftUp=function(h){return new JA(h,LA)};e.StripsRightUp=function(h){return new JA(h,NA)};e.StripsLeftDown=function(h){return new JA(h,KA)};e.StripsRightDown=function(h){return new JA(h, +MA)};e.WipeLeft=function(h){return new HB(h,KB)};e.WipeUp=function(h){return new HB(h,JB)};e.WipeRight=function(h){return new HB(h,LB)};e.WipeDown=function(h){return new HB(h,IB)};e.BoxOut=function(h){return new zw(h,Aw)};e.BoxIn=function(h){return new zw(h,Bw)};e.SplitHorizontalOut=function(h){return new EA(h,GA)};e.SplitHorizontalIn=function(h){return new EA(h,FA)};e.SplitVerticalOut=function(h){return new EA(h,IA)};e.SplitVerticalIn=function(h){return new EA(h,HA)};e.ShapeCircle=function(h){return new sA(h)}; +e.ShapeDiamond=function(h){return new tA(h)};e.CombHorizontal=function(h){return new Rw(h,Sw)};e.CombVertical=function(h){return new Rw(h,1)};e.FadeSmoothly=function(h){return new Wx(h)};e.Newsflash=function(h){return new xz(h)};e.ShapePlus=function(h){return new vA(h)};e.PushDown=function(h){return new Wz(h,Xz)};e.PushLeft=function(h){return new Wz(h,Yz)};e.PushRight=function(h){return new Wz(h,Zz)};e.PushUp=function(h){return new Wz(h,$z)};e.Wedge=function(h){return new vB(h)};e.Wheel1Spoke=function(h){return new xB(h, +1)};e.Wheel2Spokes=function(h){return new xB(h,2)};e.Wheel3Spokes=function(h){return new xB(h,3)};e.Wheel4Spokes=function(h){return new xB(h,4)};e.Wheel8Spokes=function(h){return new xB(h,8)};e.WheelReverse1Spoke=function(h){return new xB(h,-1)};e.MorphByObject=function(h){return new wz(h)};e.MorphByWord=function(h){return new wz(h)};e.MorphByChar=function(h){return new wz(h)};b?d?(e.VortexLeft=function(h){return new oB(h,iB)},e.VortexUp=function(h){return new oB(h,1)},e.VortexRight=function(h){return new oB(h, +jB)},e.VortexDown=function(h){return new oB(h,kB)}):(e.VortexLeft=function(h){return new SA(h,iB)},e.VortexUp=function(h){return new SA(h,1)},e.VortexRight=function(h){return new SA(h,jB)},e.VortexDown=function(h){return new SA(h,kB)}):(e.VortexLeft=function(h){return new Lx(h)},e.VortexUp=function(h){return new Lx(h)},e.VortexRight=function(h){return new Lx(h)},e.VortexDown=function(h){return new Lx(h)});!d||Ni||ij?(e.RippleCenter=function(h){return new lA(h,mA)},e.RippleRightUp=function(h){return new lA(h, +pA)},e.RippleLeftUp=function(h){return new lA(h,nA)},e.RippleLeftDown=function(h){return new lA(h,oA)},e.RippleRightDown=function(h){return new lA(h,qA)}):(e.RippleCenter=function(h){return new rA(h,mA)},e.RippleRightUp=function(h){return new rA(h,pA)},e.RippleLeftUp=function(h){return new rA(h,nA)},e.RippleLeftDown=function(h){return new rA(h,oA)},e.RippleRightDown=function(h){return new rA(h,qA)});e.GlitterDiamondLeft=function(h){return new my(h,ry,py)};e.GlitterDiamondUp=function(h){return new my(h, +ry,ny)};e.GlitterDiamondRight=function(h){return new my(h,ry,qy)};e.GlitterDiamondDown=function(h){return new my(h,ry,oy)};e.GlitterHexagonLeft=function(h){return new my(h,1,py)};e.GlitterHexagonUp=function(h){return new my(h,1,ny)};e.GlitterHexagonRight=function(h){return new my(h,1,qy)};e.GlitterHexagonDown=function(h){return new my(h,1,oy)};b?(e.GalleryLeft=function(h){return new iy(h,ky,!1)},e.GalleryRight=function(h){return new iy(h,ly,!1)}):(e.GalleryLeft=function(h){return new Wz(h,Yz)},e.GalleryRight= +function(h){return new Wz(h,Zz)});b?(e.ConveyorLeft=function(h){return new iy(h,ky,!0)},e.ConveyorRight=function(h){return new iy(h,ly,!0)}):(e.ConveyorLeft=function(h){return new Oz(h,Qz,!0)},e.ConveyorRight=function(h){return new Oz(h,Pz,!0)});e.DoorsVertical=function(h){return new Rx(h,Sx,!1,!0)};e.DoorsHorizontal=function(h){return new Rx(h,Tx,!1,!0)};e.WindowVertical=function(h){return new Rx(h,Sx,!0,2013>a)};e.WindowHorizontal=function(h){return new Rx(h,Tx,!0,2013>a)};e.WarpIn=function(h){return new rB(h, +sB,!1,!1)};e.WarpOut=function(h){return new rB(h,1,!1,!1)};e.FlyThroughIn=function(h){return new rB(h,sB,!0,!1)};e.FlyThroughOut=function(h){return new rB(h,1,!0,!1)};e.FlyThroughInBounce=function(h){return new rB(h,sB,!0,!0)};e.FlyThroughOutBounce=function(h){return new rB(h,1,!0,!0)};e.RevealSmoothLeft=function(h){return new eA(h,hA)};e.RevealSmoothRight=function(h){return new eA(h,gA)};e.RevealBlackLeft=function(h){return new eA(h,fA)};e.RevealBlackRight=function(h){return new eA(h,3)};e.Honeycomb= +function(h){return new Ay(h)};b?(e.FerrisWheelLeft=function(h){return new Zx(h,0)},e.FerrisWheelRight=function(h){return new Zx(h,$x)}):(e.FerrisWheelLeft=function(h){return new Oz(h,Rz,!0)},e.FerrisWheelRight=function(h){return new Oz(h,Rz,!0)});const f=2013<=a?RA:OA,g=2013<=a?ey:cy;e.SwitchLeft=function(h){return new f(h,0,c)};e.SwitchRight=function(h){return new f(h,PA,c)};e.FlipLeft=function(h){return new g(h,0,c)};e.FlipRight=function(h){return new g(h,dy,c)};e.Flashbulb=function(h){return new ay(h)}; +c?(e.ShredStripsIn=function(h){return new yA(h,0)},e.ShredStripsOut=function(h){return new yA(h,DA)},e.ShredRectangleIn=function(h){return new yA(h,zA)},e.ShredRectangleOut=function(h){return new yA(h,AA)}):(e.ShredStripsIn=function(h){return new Lx(h)},e.ShredStripsOut=function(h){return new Lx(h)},e.ShredRectangleIn=function(h){return new Lx(h)},e.ShredRectangleOut=function(h){return new Lx(h)});e.CubeLeft=function(h){return new zx(h,Cx,!1,c)};e.CubeUp=function(h){return new zx(h,Bx,!1,c)};e.CubeRight= +function(h){return new zx(h,Dx,!1,c)};e.CubeDown=function(h){return new zx(h,Ax,!1,c)};e.RotateLeft=function(h){return new zx(h,Cx,!0,c)};e.RotateUp=function(h){return new zx(h,Bx,!0,c)};e.RotateRight=function(h){return new zx(h,Dx,!0,c)};e.RotateDown=function(h){return new zx(h,Ax,!0,c)};c?(e.BoxLeft=function(h){return new Gw(h,Jw,!1)},e.BoxUp=function(h){return new Gw(h,0,!1)},e.BoxRight=function(h){return new Gw(h,Hw,!1)},e.BoxDown=function(h){return new Gw(h,Iw,!1)},e.OrbitLeft=function(h){return new Gw(h, +Jw,!0)},e.OrbitUp=function(h){return new Gw(h,0,!0)},e.OrbitRight=function(h){return new Gw(h,Hw,!0)},e.OrbitDown=function(h){return new Gw(h,Iw,!0)}):(e.BoxLeft=function(h){return new Wz(h,Yz)},e.BoxUp=function(h){return new Wz(h,$z)},e.BoxRight=function(h){return new Wz(h,Zz)},e.BoxDown=function(h){return new Wz(h,Xz)},e.OrbitLeft=function(h){return new Oz(h,Qz,!0)},e.OrbitUp=function(h){return new Oz(h,3,!0)},e.OrbitRight=function(h){return new Oz(h,Pz,!0)},e.OrbitDown=function(h){return new Oz(h, +Rz,!0)});e.PanLeft=function(h){return new Oz(h,Qz,2013>a)};e.PanUp=function(h){return new Oz(h,3,2013>a)};e.PanRight=function(h){return new Oz(h,Pz,2013>a)};e.PanDown=function(h){return new Oz(h,Rz,2013>a)};d?(e.AirplaneLeft=function(h){return new lw(h,mw)},e.AirplaneRight=function(h){return new lw(h,1)},e.OrigamiLeft=function(h){return new Cz(h,Ez)},e.OrigamiRight=function(h){return new Cz(h,Iz)},e.DrapeLeft=function(h){return new Ux(h,Vx)},e.DrapeRight=function(h){return new Ux(h,1)},e.FallOverLeft= +function(h){return new Yx(h,0)},e.FallOverRight=function(h){return new Yx(h,1)},e.Curtains=function(h){const l=new Ix(h);return l.sS()?l:new Wx(h)},e.Fracture=function(h){return new fy(h)},e.Crush=function(h){return new ux(h)},e.WindRight=function(h){return new zB(h,0)},e.WindLeft=function(h){return new zB(h,1)},e.PeelOffLeft=function(h){return new Sz(h,Tz)},e.PeelOffRight=function(h){return new Sz(h,1)},e.Prestige=function(h){const l=new Uz(h);return l.sS()?l:new Wx(h)},e.PageCurlDoubleLeft=function(h){return new Mz(h, +0)},e.PageCurlDoubleRight=function(h){return new Mz(h,1)},e.PageCurlSingleLeft=function(h){return new Mz(h,2)},e.PageCurlSingleRight=function(h){return new Mz(h,3)}):(e.AirplaneLeft=function(h){return new Wx(h)},e.AirplaneRight=function(h){return new Wx(h)},e.OrigamiLeft=function(h){return new Wx(h)},e.OrigamiRight=function(h){return new Wx(h)},e.DrapeLeft=function(h){return new Wx(h)},e.DrapeRight=function(h){return new Wx(h)},e.FallOverLeft=function(h){return new Wx(h)},e.FallOverRight=function(h){return new Wx(h)}, +e.Curtains=function(h){return new Wx(h)},e.Fracture=function(h){return new Wx(h)},e.Crush=function(h){return new Wx(h)},e.WindRight=function(h){return new Wx(h)},e.WindLeft=function(h){return new Wx(h)},e.PeelOffLeft=function(h){return new Wx(h)},e.PeelOffRight=function(h){return new Wx(h)},e.Prestige=function(h){return new Wx(h)},e.PageCurlDoubleLeft=function(h){return new Wx(h)},e.PageCurlDoubleRight=function(h){return new Wx(h)},e.PageCurlSingleLeft=function(h){return new Wx(h)},e.PageCurlSingleRight= +function(h){return new Wx(h)});e.Zoom=function(h){return new NB(h)};$s=e}} +var $s,Zs=[["PushUp","PushLeft","PushRight","PushDown"],["ShapePlus","ShapeCircle","ShapeDiamond"],["BlindsVertical","BlindsHorizontal"],["BoxIn","BoxOut"],["CheckerboardAcross","CheckerboardDown"],["Flashbulb"],["WipeDown","WipeUp","WipeLeft","WipeRight"],["RandomBarsVertical","RandomBarsHorizontal"],["FadeSmoothly","FadeThroughBlack"],["null"],["Cut","CutThroughBlack"],["CombHorizontal","CombVertical"],["Dissolve"],["FlyThroughIn","FlyThroughOut","FlyThroughInBounce","FlyThroughOutBounce"],["WarpIn", +"WarpOut"],["Newsflash"],["BoxLeft","BoxUp","BoxRight","BoxDown"],["OrbitUp","OrbitDown","OrbitLeft","OrbitRight"],["WindowHorizontal","WindowVertical"],["DoorsHorizontal","DoorsVertical"],["FerrisWheelLeft","FerrisWheelRight"],["SwitchLeft","SwitchRight"],["GalleryLeft","GalleryRight"],["RippleCenter","RippleRightUp","RippleLeftUp","RippleLeftDown","RippleRightDown"],["VortexLeft","VortexRight","VortexUp","VortexDown"],["ShredStripsIn","ShredStripsOut","ShredRectangleIn","ShredRectangleOut"],["FlipLeft", +"FlipRight"],"CoverLeft CoverUp CoverRight CoverDown CoverLeftUp CoverRightUp CoverLeftDown CoverRightDown".split(" "),"UncoverDown UncoverLeft UncoverLeftDown UncoverLeftUp UncoverRight UncoverRightDown UncoverRightUp UncoverUp".split(" "),["StripsLeftDown","StripsLeftUp","StripsRightDown","StripsRightUp"],["Honeycomb"],["SplitVerticalIn","SplitVerticalOut","SplitHorizontalIn","SplitHorizontalOut"],"Wedge Wheel1Spoke Wheel2Spokes Wheel3Spokes Wheel4Spokes Wheel8Spokes WheelReverse1Spoke".split(" "), +["RevealSmoothLeft","RevealSmoothRight","RevealBlackLeft","RevealBlackRight"],["CubeLeft","CubeUp","CubeRight","CubeDown"],["RotateLeft","RotateUp","RotateRight","RotateDown"],"GlitterDiamondDown GlitterDiamondUp GlitterDiamondLeft GlitterDiamondRight GlitterHexagonDown GlitterHexagonUp GlitterHexagonLeft GlitterHexagonRight".split(" "),["ConveyorLeft","ConveyorRight"],["PanLeft","PanUp","PanRight","PanDown"],["AirplaneLeft","AirplaneRight"],["OrigamiLeft","OrigamiRight"],["DrapeLeft","DrapeRight"], +["FallOverLeft","FallOverRight"],["Curtains"],["Fracture"],["Crush"],["WindRight","WindLeft"],["PeelOffLeft","PeelOffRight"],["Prestige"],["PageCurlDoubleLeft","PageCurlDoubleRight","PageCurlSingleLeft","PageCurlSingleRight"]];function PB(){}k=PB.prototype;k.qH=null;k.rH=null;k.start=function(a,b,c,d){b=jd(b[0],8);const e={};e.family=a;e.bold=!0===c;e.italic=!0===d;this.qH=new QB(e,"arial,'URW Gothic L',sans-serif",b);this.rH=new QB(e,"Georgia,'Century Schoolbook L',serif",b)};k.finish=function(){this.qH.gd();this.qH=null;this.rH.gd();this.rH=null};k.check=function(){return RB(this.qH)||RB(this.rH)}; +function QB(a,b,c){var d=v(a,"family","");d=String(d);const e=['"'];for(let n=0;ng)l=f;else if(l=f,l in id)l=id[l];else if(l in hd)l=id[l]=hd[l];else{g=l.charCodeAt(0);if(31g)f=l;else{if(256>g){if(f="\\x",16>g||256g&&(f+="0");f+=g.toString(16).toUpperCase()}l=id[l]=f}e[h]=l}e.push('"');d=e.join("");this.It=zd("span");this.It.innerHTML=c;F(this.It,{position:"absolute",top:"-999px", +left:"-999px",fontSize:"100px",fontFamily:b,fontWeight:v(a,"bold",!1)?"bold":"normal",fontStyle:v(a,"italic",!1)?"italic":"normal",opacity:"0"});document.body.appendChild(this.It);this.DX=Qh(this.It).width;F(this.It,"fontFamily",d+","+b)}QB.prototype.gd=function(){Fd(this.It)};function RB(a){return!!a.DX&&Qh(a.It).width!=a.DX};var SB={};function TB(a,b,c,d){d=d||c;let e="",f=!1,g=!1;"string"!==typeof a?(e=v(a,"family",""),f=v(a,"bold",!1),g=v(a,"italic",!1)):e=a;e=e.replace(/^"|"$/g,"");if(e in SB)(SB[e]?c:d)();else{var h=h||5E3;var l=new PB;l.start(e,b,f,g);var n=Date.now(),m=setInterval(()=>{let p=!1,t=!1;l.check()?t=p=!0:Date.now()-n>h&&(p=!0,t=!1);p&&(clearInterval(m),l.finish(),t?c():d&&(Ga(`can't preload font ${a&&a.family}`),d()))},50)}} +function UB(a,b){Array.isArray(b)||(b=[b]);const c=[];u(b,d=>{c.push(d.C9+"('"+d.src()+"')"+(d.format()?" format('"+d.format()+"')":""))});return`@font-face { + font-family: '${a}'; + src: ${c.join(",")}; + ${""} + ${""} + }`}function VB(a,b){this.C9=a;this.Jf=b;this.D4=null}VB.prototype.src=function(){return this.Jf};VB.prototype.format=function(){return this.D4};function WB(a,b){b=a.m8.create(b);B(a,b);z(a,b.QG,a.a7,a);return b}function XB(a){"normal"==a.Ib&&cv(a.rn,a.Ga);dv(a.rn,b=>{if(b instanceof gv){const c="normal"==a.Ib?"":"none";b.displayObject().style.display=c}})} +class YB extends wg{constructor(a,b,c){super();this.$e=a;this.G=b;this.fj=c;this.Ib="normal";this.vh=new C;this.Ga=this.pc();this.rl=this.pc("slidesBackground");this.Je=this.pc();this.Ve=new mt(this);this.Gt=this.pc();this.fg=this.pc("frontLayers");this.Ga.appendChild(this.rl);this.Ga.appendChild(this.Je);a=this.Ve.displayObject();this.Ga.appendChild(a);this.Je.appendChild(this.Gt);this.Je.appendChild(this.fg);this.Je.style.display="none";this.zc=ZB(this.$e.hy(),{mS:this.Gt,width:this.G.slideWidth(), +height:this.G.slideHeight(),zba:Number.MAX_VALUE,backgroundColor:"#000000",FS:this.Ib});a=new tv;this.Ke=new rv(this.G,this.zc,a,this.G.slideWidth(),this.G.slideHeight(),this.fg);c=new hv;var d=new qv(this.zc,this.G.slides(),c,this.fj);this.B=new Ss(this.G,this.zc,this.$e.hy().jf,d,c,this.$e,this.Ke,a,this.fj);z(this,this.B.vc(),this.Mj,this);z(this,this.B.Wr,this.PJ,this);a=this.B;this.$e.JL.Ot.addHandler(a.t6,a);z(this,this.B.XJ,this.a6,this);z(this,this.B.Wr,this.Y5,this);this.rc=new Q(this.B, +this.G);this.m8=new Mu({Ca:this.G,dca:this.$e,yI:this.Ga,pJ:this.rl,Fi:this.Je,tr:this.Ve,wa:this.fg,lJ:this.Gt,V:this.B,kda:this.Ke,kn:this.zc});this.Rj=WB(this,"normal");b=b.fonts();a=$g||Ib;c=[];for(d=0;d{this.tL.C(jC())},!1,this)}};function aC(a,b){a.kM!=b&&((a.kM=b)&&a.eA.enabled()?(ve(document,"keydown",a.nw,!1,a),ve(document,"keyup",a.QW,!1,a)):(De(document,"keydown",a.nw,!1,a),De(document,"keyup",a.QW,!1,a)))} +function mC(a,b){const c=a.B;if(!(0>c.ma())){var d=c.$(),e=a.M;0>a.OB&&(a.OB=Date.now(),a.om=d.Kg(),c.pause());a=(1+(Date.now()-a.OB)/1E3)*(b?1:-1);d=d.timestamp();b=e.ti(d,!1,!0);e=e.Xo(Vc(b+a,0,e.Pu()),!1,!0);a=c.$d();e.L()>d.L()?1==a.M1()?c.sf(!1):nk(a):e.L(){let c=!1,d=!1;a.Zb().removeHandler(this.Ab,this);a.Kg()||(d=(c=tC(this,a.timestamp()))&&uC(this,a.timestamp()),this.eE=a.timestamp(),a.Zb().addHandler(this.Ab,this));sC(this,a,c,d,!1)};this.pK?b():setTimeout(b,0)};k.Ab=function(a){var b=a.timestamp(),c;(c=!this.eE)||(c=this.eE,c=!(c.L()==b.L()&&c.Ba()==b.Ba()&&0>=Math.abs(c.ib()-b.ib())));c&&(this.eE=b,c=(b=tC(this,a.timestamp()))&&uC(this,a.timestamp()),sC(this,a,b,c,!0))}; +function tC(a,b){a=a.G.slides().la(b.L());if(0>b.Ba())return!1;a=a.sb().sc(b.Ba());return b.ib()>=a.duration()}function uC(a,b){a=a.G.slides().la(b.L());return b.Ba()==a.sb().count()-1}k.gN=function(a){this.remove(a)};k.eN=function(a){Ts(this.Da,a.nd(),a)};function vC(a){this.HI=!1;this.aca=a}var rC=new vC(!1),wC=new vC(!0),xC=new vC(!0);function yC(a,b,c,d){this.M=a;this.Y=b;this.If=c;this.D=d;this.pm=new C;this.Og=new C}k=yC.prototype;k.Mf=null;k.Fe=!1;k.wl=!1;k.playing=function(){return this.D.playing()};k.nd=function(){return this.D.nd()};k.play=function(a){this.pp(this.Y.timestamp(),a||0)}; +k.pp=function(a,b){this.hB();this.D.Ec().addHandler(this.UF,this);this.D.Og.addHandler(this.qq,this);this.Mf=a;this.wl=!1;this.Fe=!0;this.D.activate();var c=this.D,d=c.Dr;const e=this.M;a=(e.ti(this.Y.timestamp(),!0,!1)-e.ti(a,!0,!1)+b)%this.If.duration();d.call(c,a)};k.pause=function(){this.stop()};k.stop=function(){this.Fe&&(this.lm(),this.D.stop(),this.D.deactivate())};k.hB=function(){this.D.Ec().removeHandler(this.UF,this);this.D.Og.removeHandler(this.qq,this)}; +k.UF=function(){if("ended"==this.D.state()){let a=!0;if("untilNextSound"==this.If.wm){const b=this.Mf.L();this.Y.timestamp().L()>=b&&(this.D.seek(0),this.D.play(),a=!1)}a&&(this.lm(),this.D.deactivate())}};k.qq=function(){this.Og.C(this);!this.nd()&&this.playing()&&this.wl&&this.D.pause()};k.q2=function(){this.wl=!1;this.D.play()};k.p2=function(){this.wl=!0;this.nd()||this.D.pause()};k.lm=function(){this.Fe&&(this.Fe=!1,this.hB(),this.pm.C(this))};k.qp=function(){return this.pm};function zC(a,b,c,d){this.M=a;this.Y=b;this.Ye=c;this.D=d;this.pm=new C;this.Og=new C;this.D.Ec().addHandler(this.UF,this);this.D.sB.addHandler(this.DY,this)}k=zC.prototype;k.Mf=null;k.wG=0;k.zm=null;k.Fe=!1;k.wl=!1;k.iP=!1;k.activate=function(){this.Nb=!0;this.D.Nb||this.D.activate()};k.deactivate=function(){this.D.playing()||this.D.deactivate();this.Nb=!1};k.kc=function(){return this.D};k.playing=function(){return this.D.playing()};k.nd=function(){return this.Fe&&(this.D.nd()||!this.D.xC())}; +k.play=function(a){this.pp(this.Y.timestamp(),void 0!==a?a:null,!1)};function AC(a,b){var c=Df(Kf(a.Ye,a.M),b);b=c?c.Lb():b;c=a.D;if(Ii&&c instanceof ck){const d=c.kc(),e=d.src();d.Ih(Hi());d.play();setTimeout(()=>{d.Ih(e);a.pp(b,0,!0)},0)}else a.pp(b,0,!0)} +k.pp=function(a,b,c){this.hB();const d=this.D;this.Y.Zb().addHandler(this.Ab,this);d.Og.addHandler(this.qq,this);d.Kp.addHandler(this.qq,this);d.kx.addHandler(this.tX,this);this.Fe=!0;this.wl=!1;this.iP=c;this.Mf=a;this.zm=null!=b?b:null;if(this.iP){const e=this;a=function(){BC(e,!0);d.play();e.qq()};gj&&!Ii?setTimeout(a,150):(ij&&d.Ih(d.src()),a())}else null!=b?d.Dr(b):d.play()};k.pause=function(){this.lm();this.D.pause();CC(this)}; +k.stop=function(a){this.lm();this.D.pause();const b=this.Ye instanceof Zg&&this.Ye.XI();a=a||b?0:this.D.duration();this.D.seek(a);CC(this);DC(this)};k.hB=function(){this.Y.Zb().removeHandler(this.Ab,this);this.D.Og.removeHandler(this.qq,this);this.D.Kp.removeHandler(this.qq,this);this.D.kx.removeHandler(this.tX,this)}; +k.Ab=function(){if(this.Mf){var a=this.Mf;const d=this.Y.timestamp();var b=d.L()-a.L(),c=0==b;a=c?d.Ba()-a.Ba():0;c=c&&0==a;0>b||0>a?b=!0:(a=this.Ye.Pj,b=0>a?!c:b>a);b&&(this.lm(),this.D.pause(),CC(this))}}; +k.UF=function(){const a=this.D.state();if("ended"==a){++this.wG;let c=!1;const d=this.Ye.wm;if("number"!==typeof d){var b=this.Mf;const e=this.Y.timestamp();b=b.L()!=e.L()||b.Ba()!=e.Ba();switch(d){case "untilNextClick":c=!b;break;case "untilNextSlide":c=!0}}else c=this.wGe?a.pH(f):c.seek(f)}}k.pH=function(a){this.Zj||this.nd()||(this.Zj=!0,kv(this.Y,!0,this),this.D.Ef.addHandler(function c(){.1>a-this.D.currentTime()&&(this.D.Ef.removeHandler(c,this),EC(this))},this))};function EC(a){a.Zj&&(a.Zj=!1,kv(a.Y,!1,a))} +k.$F=function(){this.Am=this.Y.timestamp();this.Y.Zb().addHandler(this.xT,this);this.Y.Ec().addHandler(this.wT,this);if(this.Ye instanceof Zg){const a=this.D;a.show(!0);this.Ye.yR()&&a.ly(!0);FC(a,!1)}};function DC(a){a.Am=void 0;a.Y.Zb().removeHandler(a.xT,a);a.Y.Ec().removeHandler(a.wT,a);a.VE=!1;a.HV="ended";if(a.Ye instanceof Zg){const b=a.D;a.Ye.XI()&&b.stop();b.ly(!1);a.Ye.XQ()&&b.show(!1)}a.Og.C(a);EC(a)} +k.wT=function(){var a;if(a=this.Fe)a:if(this.Y.suspended()){a=this.Y.timestamp();if(0{Pa(a.OD,c)||(Gp(a,c).activate(),a.OD.push(c))},a);Gi(a.i4,a)} +function dt(a,b,c,d){if(a.gq.v0()){var e=KC(a,b);HC(a,b,e,!0);e.pp(c,d)}}function MC(a,b){return"accessible"==a.Ib?null:a.G.slides().la(b).Py} +class NC{constructor(a,b,c){this.Nb=!1;this.G=a;this.me=b;this.gq=c;this.Y=null;this.On=new qC(a);this.YE=this.Vl=this.uv=this.ev=null;this.Ib="normal";this.cP={};this.KB={};this.zP={};this.W=-1;this.Qq=qu(a.slides());this.hC=[];this.sV=new C;this.pV={};this.OD=[];a=this.me;b=gk();b=new OC(b);z(a,b.Iy,a.cG,a);this.q3=b}bS(a,b){this.Y=a;this.On.bS(a,b);a.Zb().addHandler(this.Ab,this)}fn(a){this.Ib=a;this.gq.fn(a)}activate(){this.Nb=!0;this.Vl&&AC(this.Vl,this.Y.timestamp());this.ev&&this.ev.activate(); +const a=this.Y.timestamp().L();0<=a&&LC(this,a)}Ab(a){a=a.timestamp().L();a!=this.W&&this.Mj(a)}i4(){const a=this.Y.timestamp().L(),b=this.G.slides().la(a).Dd().Mc();u(this.OD,c=>{Pa(b,c)||(Gp(this,c).deactivate(),Ra(this.OD,c))},this)}Mj(a){JC(this);this.Nb&&LC(this,a);const b=(f,g)=>{for(let h=0;h{g.kx.removeHandler(this.uX,this);Ra(d,g)});b(c,(f,g)=>{g.kx.addHandler(this.uX, +this)});this.me.tS();$B(this,MC(this,a))}uX(a,b){var c=this.hC;Pa(c,a)||c.push(a);"play"==b&&this.sV.C(a)}};class PC{constructor(){this.Ob={};this.$S={};this.Le=1}forEach(a){fc(this.Ob,a,this)}get(a){a=a.id();return this.Ob[a]}set(a,b,c){this.Ob[a.id()]=b;this.$S[a.id()]=c;b.setVolume(this.Le*c)}FQ(a){return a.id()in this.Ob}setVolume(a){if(this.Le!=a){this.Le=a;for(const b in this.Ob)this.Ob.hasOwnProperty(b)&&this.Ob[b].setVolume(this.Le*this.$S[b])}}GI(){for(const a in this.Ob)this.Ob.hasOwnProperty(a)&&this.Ob[a].pause()}};class OC extends ik{constructor(a){super(a);this.rm=null}aS(a){this.rm!=a&&(a?this.Ih(a.Zt()[0].sources()):this.D.Ih(Hi()),this.rm=a)}};(function(){if(Ob){var a=/Windows NT ([0-9.]+)/;return(a=a.exec(ub()))?a[1]:"0"}return Nb?(a=/1[0|1][_.][0-9_.]+/,(a=a.exec(ub()))?a[0].replace(/_/g,"."):"10"):Qb?(a=/Android\s+([^\);]+)(\)|;)/,(a=a.exec(ub()))?a[1]:""):Rb||Sb||Tb?(a=/(?:iPhone|CPU)\s+OS\s+(\S+)/,(a=a.exec(ub()))?a[1].replace(/_/g,"."):""):""})();function QC(a){return(a=a.exec(ub()))?a[1]:""}(function(){if($g)return QC(/Firefox\/([0-9.]+)/);if(Ib||Jb||Hb)return Vb;if(dh){if(Db()||vb("Macintosh")){var a=QC(/CriOS\/([0-9.]+)/);if(a)return a}return QC(/Chrome\/([0-9.]+)/)}if(eh&&!Db())return QC(/Version\/([0-9.]+)/);if(ah||bh){if(a=/Version\/(\S+).*Mobile\/(\S+)/.exec(ub()))return a[1]+"."+a[2]}else if(ch)return(a=QC(/Android\s+([0-9.]+)/))?a:QC(/Version\/([0-9.]+)/);return""})();function RC(a,b,c,d,e){eu.call(this,b,c,d,e);this.element=a}r(RC,eu);RC.prototype.Bp=function(){};RC.prototype.DI=function(){this.Bp();RC.Mb.DI.call(this)};RC.prototype.Hl=function(){this.Bp();RC.Mb.Hl.call(this)};RC.prototype.mp=function(){this.Bp();RC.Mb.mp.call(this)};function SC(a,b,c,d,e){if(2!=b.length||2!=c.length)throw Error("Start and end points must be 2D");RC.call(this,a,b,c,d,e)}r(SC,RC); +SC.prototype.Bp=function(){var a;if(a=this.AD)void 0===this.hD&&(this.hD=Uh(this.element)),a=this.hD;this.element.style[a?"right":"left"]=Math.round(this.coords[0])+"px";this.element.style.top=Math.round(this.coords[1])+"px"};function TC(a,b,c,d,e){"number"===typeof b&&(b=[b]);"number"===typeof c&&(c=[c]);RC.call(this,a,b,c,d,e);if(1!=b.length||1!=c.length)throw Error("Start and end points must be 1D");this.vI=UC}r(TC,RC);var VC=1/1024,UC=-1;k=TC.prototype; +k.Bp=function(){var a=this.coords[0];Math.abs(a-this.vI)>=VC&&(G(this.element,a),this.vI=a)};k.mp=function(){this.vI=UC;TC.Mb.mp.call(this)};k.Hl=function(){this.vI=UC;TC.Mb.Hl.call(this)};k.show=function(){this.element.style.display=""};k.Uc=function(){this.element.style.display="none"};function WC(a,b,c){TC.call(this,a,1,0,b,c)}r(WC,TC);function XC(a,b,c){TC.call(this,a,0,1,b,c)}r(XC,TC);class YC extends RC{constructor(a,b,c){super(null,[b],[c],200);this.U=a}Bp(){this.U.Rf(this.coords[0])}};class ZC extends P{constructor({ka:a,F:b,K0:c,OI:d,i0:e,tabIndex:f,yia:g,toggle:h,zf:l}){super({ka:a,F:b,K0:c,OI:d,i0:e,tabIndex:f,Yb:"BUTTON",K$:!0,zf:l});g&&(a=g.top,b=g.right,c=g.bottom,g=g.left,this.ri=new P,M(this,this.ri),L(this.ri,"position","absolute"),L(this.ri,"top",a?`${-a}px`:0),L(this.ri,"right",b?`${-b}px`:0),L(this.ri,"bottom",c?`${-c}px`:0),L(this.ri,"left",g?`${-g}px`:0));(this.S9=h)&&this.Dc(!1);this.Ky()}Dc(a){this.wf("pressed",a)}selected(){return!1}Eh(){}pressed(){return"true"== +kt(this.U,"pressed")}ha(a){super.ha(a);this.ri&&this.Me(this.ri,0)}wp(a){super.wp(a);this.ri&&this.Me(this.ri,0)}};class $C extends P{constructor(a,b){super({F:"bookmark"});this.D=a;this.Qy=b;this.J(!1);a.duration()?this.aF():Qe(this,a.gW,this.aF,this);x(this,this.displayObject(),Km,this.E6,this,!1)}aF(){L(this,"left",`${this.Qy.time()/this.D.duration()*100}%`);this.J(!0)}E6(a){a.stopPropagation();this.D.seek(this.Qy.time());return yn(this.displayObject().parentNode)}};function aD(a,b){null!==b&&0>b&&(b=null);null!==a.mi&&a.jb[a.mi].Eh(!1);a.mi=b;null!==b&&a.jb[b].Eh(!0);if(null!==a.mi){var c=a.jb[a.mi];b=c.displayObject().offsetTop;c=b+c.displayObject().offsetHeight;Ht(a,b,c)}}function bD(a,b){b=a.jG.indexOf(b);aD(a,0<=b?b:null)}class cD extends P{constructor({F:a,zf:b,options:c}){super({F:a,zf:b});this.vf("listbox");L(this,"position","absolute");this.jG=c.slice();Object.freeze(this.jG);this.jb=[];this.mi=null;this.DO=E(this)}options(){return this.jG}};class dD extends cD{constructor({F:a,options:b,C0:c}){super({F:a,options:b});for(const d of b){const e=c(d);e.vf("option");e.Eh(!1);Gt(e,O(this,"item"));M(this,e);this.jb.push(e);z(this,e.ja,()=>{aD(this,this.jb.indexOf(e));this.DO.C()})}}Qa(a,b){super.Qa(a,b);this.jb.forEach(c=>c.xb())}};const eD=[{value:.75,toString:()=>"0.75x"},{value:1,toString:()=>"1x"},{value:1.25,toString:()=>"1.25x"},{value:1.5,toString:()=>"1.5x"},{value:2,toString:()=>"2x"}];function fD(a){const b=eD.find(c=>("number"===typeof a.mi?a.jG[a.mi]:null)==c.toString());return b?b.value:null}function gD(a,b){const c=eD.find(d=>d.value==b);bD(a,c?c.toString():null)} +class hD extends dD{constructor(a){super({F:"playback-rate-menu",options:eD.map(c=>c.toString()),C0:c=>{const d=new P({aJ:!0});d.ha(c);return d}});const b=new P({ka:O(this,"caption")});b.ha(a.ia("PB_PLAYBACK_RATE_MENU_CAPTION",{},"Rate"));M(this,b,0)}};class iD extends dD{constructor(a,b){super({F:"subtitles-list",options:[b.ia("PB_SUBTITLES_OFF",{},"Off"),...a],C0:c=>{const d=new P({aJ:!0});d.ha(c);return d}});a=new P({ka:O(this,"caption")});a.ha(b.ia("PB_SUBTITLES_MENU_CAPTION",{},"Subtitles"));M(this,a,0)}};function jD(a,b){void 0===b&&(b=a.D.muted()?0:a.D.volume());L(a.VT,"height",`${100*(1-b)}%`);return yn(a.displayObject())} +class kD extends P{constructor(a){super({F:"volume_popup"});this.D=a;this.kC=new P({F:"volume"});M(this,this.kC);this.VT=new P({F:"back"});M(this.kC,this.VT);jD(this,this.D.volume());z(this,this.D.GF,()=>jD(this));z(this,this.D.YP,()=>jD(this));x(this,this.kC.displayObject(),Km,this.Q7,this)}Q7(a){x(this,document,Mm,this.gG,this);x(this,document,Lm,this.xX,this);this.gG(a);this.D.qk(!1)}gG(a){this.visible()&&(a=Lh(a,this.kC.displayObject()).y,a=Math.min(1,a/this.kC.height()),a=Math.max(0,a),a=1-a, +this.D.setVolume(a),jD(this,a))}xX(a){Ne(this,document,Mm,this.gG,this);Ne(this,document,Lm,this.xX,this);this.gG(a)}};function lD(a){const b=new ZC({F:"play",toggle:!0});b.vk(!0);z(a,b.ja,()=>a.D.playing()?a.D.pause():a.D.play());return b} +function mD(a){if(a.lx){const b=new ZC({F:"rate",toggle:!0});b.vk(!0);b.X("subtitle-button-next",nD(a));const c=new hD(a.I);c.J(!1);c.X("subtitle-button-next",nD(a));gD(c,a.D.playbackRate());z(a,b.ja,()=>{if(c.visible()){const d=new TC(c.displayObject(),1,0,150);d.play();Me(a,d,"finish",()=>{c.J(!1);b.Dc(!1);xt(b.displayObject(),"selected")})}else oD(a,{button:b,Er:c,F1:()=>{b.Dc(!1);xt(b.displayObject(),"selected")}}),b.Dc(!0),wt(b.displayObject(),"selected")});z(a,c.DO,()=>{a.D.wk(fD(c));c.J(!1)}); +return{N1:b,O1:c}}return{N1:null,O1:null}}function pD(a){const b=new ZC({F:"mute",toggle:!0});b.vk(!0);const c=new kD(a.D);c.J(!1);z(a,b.ja,()=>{const d=!a.D.muted();a.D.qk(d);b.Dc(d);d?wt(b.displayObject(),"selected"):xt(b.displayObject(),"selected")});z(a,a.D.GF,()=>{const d=a.D.muted();b.Dc(d);d?wt(b.displayObject(),"selected"):xt(b.displayObject(),"selected")});x(a,b.displayObject(),"mouseover",()=>{c.visible()||oD(a,{button:b,Er:c})});return{Fba:b,uda:c}} +function qD(a,b){var c=a.b8.displayObject(),d=a.va.width()-2;a=Lh(b,c).x/a.lO*a.ra;d=Math.min(1,a/d);return d=Math.max(0,d)}function rD(a){function b(e){e=e.toString();1==e.length&&(e="0"+e);return e}a=Math.round(a);const c=Math.floor(a/3600);a%=3600;const d=Math.floor(a/60);a%=60;return b(c)+":"+b(d)+":"+b(a)}function nD(a){return!!a.Lf&&!!sD(a.Lf).length} +function oD(a,{button:b,Er:c,F1:d}){c.J(!0);let e=new TC(c.displayObject(),0,1,150);e.play();let f=!1;x(a,document,Mm,g=>{g=tD({button:b,Er:c,Iaa:g});if(g==f){const h=parseFloat(Eh(c.displayObject(),"opacity"));e.stop();g?(f=!1,e=new TC(c.displayObject(),h,1,150),e.play()):(f=!0,e=new TC(c.displayObject(),h,0,150),e.play(),Me(a,e,"finish",()=>{c.J(!1);d&&d()}))}})} +function uD(a){const b=new ZC({F:"subtitles",toggle:!0});b.vk(!0);z(a,b.ja,()=>{a.Yj&&a.pi&&!a.Yj.visible()&&(oD(a,{button:a.pi,Er:a.Yj,F1:()=>{a.pi&&(a.pi.Dc(!1),xt(a.pi.displayObject(),"selected"))}}),a.pi.Dc(!0),wt(a.pi.displayObject(),"selected"))});a.pi=b;a.O(b)}function vD(a,b){b=new iD(b,a.I);b.J(!1);z(a,b.DO,()=>{if(a.Lf&&a.Yj){var c=(c=a.Yj.mi)?c-1:null;"number"===typeof c?a.Lf.select(c):a.Lf.show(!1);a.Yj.J(!1)}});a.Yj=b;a.O(b)} +function tD({button:a,Er:b,Iaa:c}){const d=Lh(c,b.displayObject());if(0>d.x||d.x>b.width()||0>d.y)return!1;b=Lh(c,a.displayObject());return 0>=b.y||0<=b.x&&b.x<=a.width()&&b.y<=a.height()} +class wD extends P{constructor({kc:a,dda:b,ga:c,ik:d,ED:e}){super({F:"controls",jI:!0});this.D=a;this.Lf=b;this.I=c;this.lx=e;this.hb=lD(this);M(this,this.hb);const {fca:f,lc:g}=this.rs(d);this.b8=f;this.va=g;M(this,this.va);const {N1:h,O1:l}=mD(this);(this.yG=h)&&M(this,this.yG);(this.zG=l)&&M(this,this.zG);this.Yj=this.pi=null;this.Lf&&(this.D_(),z(this,this.Lf.rT,this.D_,this),z(this,this.Lf.tT,this.E_,this));const {Fba:n,uda:m}=pD(this);this.O5=n;M(this,this.O5);this.v$=m;M(this,this.v$);this.Wp= +this.yK();M(this,this.Wp);this.j_=new C;this.UV=new C;this.hg=this.om=!1;this.lO=this.ra=1;z(this,this.D.Ec(),this.gt,this);z(this,this.D.Qj,this.M6,this);yi(this.displayObject(),"left bottom")}locked(){return this.hg}yK(){const a=new ZC({F:"toggle_fullscreen",toggle:!0});a.vk(!0);z(this,a.ja,()=>this.j_.C());return a}rs(a){const b=new P({F:"progress"}),c=new P({F:"loading"});M(b,c);const d=new P({F:"playing"});M(b,d);const e=new P({F:"tooltip"});e.J(!1);M(b,e);if(a)for(let f=0;f{L(c,"width",100*this.D.xI()+"%")});z(this,this.D.Ef,()=>{L(d,"width",this.D.currentTime()/this.D.duration()*100+"%")});x(this,b,"mouseover",()=>{e.J(!0)});x(this,b,"mouseout",()=>{e.J(!1)});x(this,b,Mm,f=>{f=qD(this,f);L(e,"left",`${100*f}%`);e.ha(rD(f*this.D.duration()))},this);x(this,b,Km,this.rw,this);return{fca:d,lc:b}}D_(){this.Yj&&(this.removeChild(this.Yj),this.Yj=null);nD(this)&&(this.pi||uD(this),vD(this,sD(this.Lf)));this.E_()}E_(){var a=nD(this); +this.pi&&this.pi.J(a);if(this.Yj){const b=this.Lf;a=a&&b.isVisible()?b.At:null;aD(this.Yj,null==a?0:a+1)}}rw(a){this.hg=!0;x(this,document,Mm,this.qw,this);x(this,document,Lm,this.aG,this);this.D.playing()&&(this.D.pause(),this.om=!0);this.qw(a);a.preventDefault()}qw(a){this.D.seek(qD(this,a)*this.D.duration())}aG(a){Ne(this,document,Mm,this.qw,this);Ne(this,document,Lm,this.aG,this);this.qw(a);this.om&&(this.D.play(),this.om=!1);this.hg=!1;this.UV.C()}gt(){const a=this.D.playing();this.hb.Dc(a); +a?wt(this.hb.displayObject(),"selected"):xt(this.hb.displayObject(),"selected")}M6(){this.zG&&gD(this.zG,this.D.playbackRate())}};const xD=$g?{snapToLines:!1,line:83,lineAlign:"end"}:{snapToLines:!0,line:-4,lineAlign:"end"},yD=(a,b)=>{b?a.mode="showing":"showing"===a.mode&&(a.mode="hidden")},zD=a=>{for(let b=0;b{a.snapToLines=b.snapToLines;a.line=b.line;a.lineAlign=b.lineAlign},BD=a=>{if(a&&a.cues){const b=[];for(let c=0;c{this.select(zD(this.nj));this.tT.C(this)};a=()=>{this.select(zD(this.nj));this.rT.C(this)};this.nj.onaddtrack=a;this.nj.onremovetrack=a}select(a){this.At=null!==a&&ac&&"SOURCE"==c.nodeName&&"video/mp4"==c.getAttribute("type"));b&&a.appendChild(b)}return new FD(a)} +function HD(a){if(!Ii){const b=a.mediaElement().getAttribute("poster");a.mediaElement().removeAttribute("poster");if(b)return a=new P({F:"poster"}),L(a,"background",`url(${b})`),L(a,"background-size","100% 100%"),a}return null}function ID(a){if(!Ii)if(a=a.mediaElement(),tj)JD(a);else if(!sj&&la(a.textTracks)&&void 0!==a.textTracks.length)return new ED(a.textTracks);return null} +function JD(a){const b=c=>c&&"TRACK"===c.nodeName&&c.hasAttribute("kind")?(c=c.getAttribute("kind"),!!c&&("captions"===c||"subtitles"===c)):!1;Pd(a,c=>c&&b(c)&&c.hasAttribute("default"))||(a=Pd(a,b))&&a.setAttribute("default","")};function lq(a,b){a.uw=b;Bd(b,a.$a.displayObject());Ii&&KD(a,a.D.mediaElement().width,a.D.mediaElement().height);Ii&&(Fj?void 0!==window.TouchEvent&&window.event instanceof window.TouchEvent||window.event instanceof MouseEvent:1)&&(a.D.play(),a.D.pause());sj&&(a.$a.resize(a.$a.width()+1),Gi(()=>a.$a.resize(a.$a.width()-1)))} +function pq(a){a.uw=null;if(Fd(a.$a.displayObject())&&Ii){const b=a.D,c=GD(a.p$);Cj?(a.$a.removeChild(b.mediaElement()),a.$a.O(c.mediaElement())):a.$a=new P({za:c.mediaElement()});ak(a,c);b.gd()}}function Bu(a,b){a.Ej&&(b?a.eF||(a.eF=setInterval(()=>LD(a),100)):(clearInterval(a.eF),a.eF=void 0,a.ly(!1)))} +function FC(a,b){if(a.ff){const c=Vi()?"poster_frame_hide_video":"poster_frame";b?wt(a.$a.displayObject(),c):xt(a.$a.displayObject(),c);a.ff.Rf(b?1:0);!b&&a.BG&&(MD(a,a.BG),a.BG=void 0);Ib&&!Ii&&Th(a.D.mediaElement(),!b)}} +function ND(a,b){const c=new wD({kc:a.D,dda:a.Lf,ga:a.I,ik:b,ED:a.lx});c.resize(a.D.mediaElement().width);c.Rf(0);c.j_.addHandler(()=>{a.ly(!a.$l);return yn(c.displayObject())},a);c.UV.addHandler(()=>{a.BM||OD(a,!1)},a);ve(a.$a.displayObject(),"mouseenter",()=>{a.BM=!0;OD(a,!0)},!1,a);ve(a.$a.displayObject(),"mouseleave",()=>{a.BM=!1;c.locked()||OD(a,!1)},!1,a);return c}function MD(a,b){a.ff&&L(a.ff,"background-image",`url(${b})`)} +function PD(a,b,c){a.ff||(a.ff=new P({F:"poster"}),L(a.ff,"background-size","contain"),L(a.ff,"background-position","center"),L(a.ff,"background-repeat","no-repeat"),L(a.ff,"position","absolute"),L(a.ff,"top","0"),Ii?a.$a.displayObject().parentNode.appendChild(a.ff.displayObject()):a.$a.O(a.ff),a.ff.resize(a.$a.width(),a.$a.height()));!c&&Ii&&a.ff.opacity()?a.BG=b:MD(a,b)} +function LD(a){var b=a.$a.displayObject().parentNode;if(b&&"none"!=b.style.display){var c=Qh(a.$a.displayObject());a.Ej.resize(c.width);b=(b=sn(b))?b.pd:1;b=tj||a.$l?b*a.$N:b;a=a.Ej;b&&(a.lO=b,b=a.width())&&(a.ra=Math.max(a.lO,240/b),c=Math.round(11/a.ra),L(a,"left",`${c}px`),L(a,"bottom",`${c}px`),b=Math.round(b*a.ra)-22,wn(a.displayObject(),1/a.ra),c=b-173,a.pi&&a.pi.visible()&&(c-=a.pi.width()),a.yG&&(c-=a.yG.width()),a.va.resize(c),a.Kb(b))}} +function KD(a,b,c){const d=tj||a.$l?1:a.$N,e=new gm;e.scale(1/d,1/d);on(a.$a.displayObject(),e);a.$a.resize(b*d,c*d)}function OD(a,b){var c=b?1:0;(new YC(a.Ej,a.Ej.opacity(),c)).play();a.Lf&&(b?(a=a.Lf,a.Yq||(a.Yq=BD(DD(a)))):CD(a.Lf))} +class QD extends ck{constructor(a,b,c,d=null){const e=GD(a);super(e);this.p$=a;this.I=new lt(d||{});this.ff=HD(e);this.Lf=ID(e);this.Ej=null;this.BG=void 0;this.BM=this.$l=!1;this.$N=1;this.FH=!1;this.eF=void 0;this.uw=null;this.lx=b;Ii?Cj?(this.$a=new P({F:"video_player"}),Gt(this.$a,"iphone"),this.$a.O(this.D.mediaElement()),this.$a.resize(this.D.mediaElement().width,this.D.mediaElement().height),c=this.D.mediaElement().getAttribute("poster"),this.D.mediaElement().removeAttribute("poster"),c&&(L(this.$a, +"background","url("+c+")"),L(this.$a,"background-size","100% 100%")),this.Zo(this.rj())):this.$a=new P({za:this.D.mediaElement()}):(a=this.rj(),super.Zo(!1),this.$a=new P({F:"video_player"}),this.Ej=ND(this,c),this.ff&&this.$a.O(this.ff),this.$a.O(this.D.mediaElement()),this.$a.O(this.Ej),this.$a.resize(this.D.mediaElement().width,this.D.mediaElement().height),this.Zo(a),ve(this.D.mediaElement(),"loadeddata",this.hF,!1,this));FC(this,!0);pj&&this.D.Ec().addHandler(f=>{"playing"==f.state()&&this.uw&& +(f=this.uw.style.opacity,this.uw.style.opacity="0.99",this.uw.style.opacity=f)},this)}Zo(a){this.Ej?this.Ej.J(a):Cj?a?xt(this.$a.displayObject(),"without_controls"):wt(this.$a.displayObject(),"without_controls"):this.D.Zo(a);a?this.FH||(ij?x(this,this.$a,"click",this.fG,this):z(this,this.$a.ja,this.fG,this),x(this,this.$a,"click",this.SZ,this),this.FH=!0):this.FH&&(ij?Ne(this,this.$a,"click",this.fG,this):Pe(this,this.$a.ja,this.fG,this),Ne(this,this.$a,"click",this.SZ,this),this.FH=!1)}rj(){return this.Ej? +this.Ej.visible():super.rj()}qQ(){this.D&&this.D.qQ()}LR(){this.D&&this.D.LR()}setScale(a){this.$N=a;KD(this,this.D.mediaElement().width,this.D.mediaElement().height)}videoWidth(){return this.D.videoWidth()}videoHeight(){return this.D.videoHeight()}resize(a,b){this.$a&&(KD(this,a,b),this.Ej&&LD(this));const c=this.D.mediaElement();c.width=a;c.height=b;this.hF();this.ff&&this.ff.resize(this.$a.width(),this.$a.height())}Ih(a){a=super.Ih(a);this.hF();return a}hF(){if(Ib||Jb){var a=this.D.mediaElement(); +L(this.$a,"background","#000000");F(a,"width","");F(a,"height","");this.$l||(a.videoWidth/a.videoHeight{c.setScale(b)})}function RD(a){const b=a.Pn?0:a.Le;b!=a.hO&&(a.hO=b,a.xY.C(),a.Ww.setVolume(b),a.Ut.setVolume(b))} +class SD extends wg{constructor(a){super();this.Ee=a;this.Ww=new PC;this.Ut=new PC;this.Le=1;this.Pn=!1;this.hO=1;this.zl=E(this);this.xY=E(this);this.mW=E(this);this.NX=E(this);this.LZ=E(this);this.s$=E(this);this.ra=1;this.I=null;z(this,this.Ee.Qj,this.tS,this)}TQ(a){var b=a.Ni;a=a.volume();a=void 0!==a?a:1;if(this.Ww.FQ(b))var c=this.Ww.get(b);else c=null,b.lr()?c=rd(document,b.lr()):b.wi()&&(c=Ad(Kc(b.wi()))),c=new ik(c),c.wk(this.Ee.playbackRate()),z(this,c.Iy,this.cG,this),this.Ww.set(b,c,a); +return c}Rm(a){var b=a.Ni,c=a.volume();a=a.ik();c=void 0!==c?c:1;this.Ut.FQ(b)?a=this.Ut.get(b):(a=new QD(b.wi(),this.Ee.ED(),a,this.I),z(this,a.Iy,this.F7,this),a.setScale(this.ra),a.wk(this.Ee.playbackRate()),this.Ut.set(b,a,c));return a}tS(){const a=this.Ee.playbackRate();this.Ww.forEach(b=>b.wk(a));this.Ut.forEach(b=>b.wk(a))}volume(){return this.Le}setVolume(a){if(0>a||1new jk(d.S,d.s,d.t)),b.YB=!0;return b}function Us(a,b){return b in a.Nq?a.Nq[b]:null}function rs(a,b,c){c?a.Nq[b]=c:delete a.Nq[b];a.ul=!0}function ft(a,b){a.yl!=b&&(a.yl=b,a.ul=!0,a.wV.Dx())}function Os(a,b){a.Ns!=b&&(a.Ns=b,a.ul=!0)} +class WD{constructor(){this.Ns=null;this.yl=0;this.Jm=null;this.Mq={};this.Nq={};this.ul=!1;this.wV=new UD(this.Y4.bind(this));this.Tq=new C;this.YB=!1}cR(){return this.Ns}Ix(a){return a in this.Mq?this.Mq[a]:null}OR(){const a={};a.lastViewedSlide=this.Ns;a.viewDuration=this.yl;a.slideStates=qc(this.Mq);this.Jm&&(a.zoomState=this.Jm.persistState());this.YB&&(a.slideTimelineStates=hc(this.Nq,b=>b.OR()));return a}sQ(a){this.Ns=a.Ns;this.yl=a.yl;this.Mq=qc(a.Mq);this.YB=a.YB;this.Jm=a.Jm?a.Jm.sQ():null; +this.Nq=hc(a.Nq,b=>b.clone());this.ul=!0}invalidate(){this.wV.Jaa()}Y4(){this.ul&&(this.ul=!1,this.Tq.C())}stateChangedEvent(){return this.Tq}};function rq(a,b,c){a.Fe()&&a.xE(a.yZ,b,c)&&(b=a.G.settings().Qu().kJ(),c="quiz"==a.B.fa().type(),b&&!c?b.open():a.B.fa().nC()&&!uj&&xu(a))}function xu(a){const b=a.rc,c=b.$(),d=a.G.settings().Vc().Tm(),e=b.AR()&&0>b.fh();c.started()||e?!d&&e?et(a.Za.On):"bySlides"==a.G.settings().navigation().Um().$g()?b.sf():b.fp():b.play()} +class XD{constructor(a,b){this.G=a;this.Za=b;this.rc=this.B=null;this.yZ=new C;this.n9=new C;this.o9=new C;this.m9=new C}Fe(){return!!this.B&&0<=this.B.ma()}xE(a,b){const c=new Mn,d=Xa(Ua(arguments),1);a.C(...d.concat(c));return!c.actionPrevented()}};var YD=RegExp("^(?:([^:/?#.]+):)?(?://(?:([^\\\\/?#]*)@)?([^\\\\/?#]*?)(?::([0-9]+))?(?=[\\\\/?#]|$))?([^?#]+)?(?:\\?([^#]*))?(?:#([\\s\\S]*))?$");function ZD(a,b,c){if(Array.isArray(b))for(var d=0;d{aE=!0;cE(a)&&a.Ab(a.Y)});const c=window.location.toString().match(YD)[1]||null;b.src="https"==c?"https://players.youku.com/jsapi":"http://player.youku.com/jsapi";document.body.appendChild(b)};function dE(a,b){this.Tb=a;this.Q_=b}k=dE.prototype;k.Tb="";k.Q_="";k.Va=0;k.Na=0;k.mj=0;k.vl=1;k.width=function(){return this.Va};k.Kb=function(a){this.Va=a};k.height=function(){return this.Na};k.Wc=function(a){this.Na=a};k.id=function(){return this.Tb};k.Li=function(){return this.Q_};k.ib=function(){return this.mj*this.vl};k.Kl=function(a){this.vl=a};function eE(a,b,c){dE.call(this,a,b);this.BT=c}r(eE,dE);eE.prototype.BT="";eE.prototype.clientId=function(){return this.BT};function fE(a,b){this.D=null;this.In=!1;this.Db=a;this.qm=b;this.Gq=new C;this.wc=zd("DIV");this.wc.style.position="absolute";a.displayObject().appendChild(this.wc);Th(this.wc,this.lh);this.Nf(a)}k=fE.prototype;k.In=!1;k.lh=!1;k.rR=function(){this.In=!0;this.Mg(this.Db);this.yB(this.lh);this.Gq.C(this)};k.Rba=function(){};k.Qba=function(){};k.ki=function(){return this.In&&null!=this.D};k.stop=function(){if(this.ki())try{this.D.pauseVideo()}catch(a){}};k.visible=function(){return this.lh}; +k.Mg=function(a){this.Nf(a);if(this.ki()){const c=this.sa;var b=a.scale();a=b*this.qm.width();b*=this.qm.height();Nh(c,a,b)}};k.Nf=function(a){a=a.position(this.qm.id(),1);Gh(this.wc,a.x,a.y)};k.iJ=function(a){this.lh!=a&&(this.lh=a,this.yB(a))}; +k.yB=function(a){if(a){if(!this.D){var b=this.wc,c=this.Db.scale();const e=this.qm,f={styleid:"0",client_id:e.clientId(),vid:e.Li(),autoplay:!1,show_related:!1,events:{onPlayerReady:this.rR.bind(this),onPlayStart:this.Rba.bind(this),onPlayEnd:this.Qba.bind(this)}},g="_"+e.id(),h=zd("DIV");h.setAttribute("id",g);var d=c*e.width();c*=e.height();Nh(h,d,c);F(h,"background","#494949");d=zd("DIV");F(d,"position","absolute");F(d,"top","50%");F(d,"left","50%");F(d,"transform","translate(-50%, -50%)");h.appendChild(d); +c=zd("DIV");mn(c,"preloader");F(c,"position","relative");d.appendChild(c);c=zd("DIV");Nd(c,"\u8bf7\u7a0d\u540e");F(c,"position","relative");F(c,"font-family",'Tahoma, Arial, Helvetica, "Microsoft YaHei New", "Microsoft Yahei", "\u5fae\u8f6f\u96c5\u9ed1", \u5b8b\u4f53, SimSun, STXihei, "\u534e\u6587\u7ec6\u9ed1", sans-serif');F(c,"font-weight","lighter");F(c,"font-size","32px");F(c,"color","white");F(c,"text-align","center");F(c,"margin-top","12px");d.appendChild(c);b.appendChild(h);this.sa=h;this.D= +new YKU.Player(g,f);this.Mg(this.Db)}}else Cd(this.wc),this.D=null,this.In=!1;Th(this.wc,a)};k.readyEvent=function(){return this.Gq};var gE,hE=!1;q("onYouTubePlayerAPIReady",function(){hE=!0;var a=gE;cE(a)&&a.Ab(a.Y);gE=null});function iE(a,b){dE.call(this,a,b)}r(iE,dE);function jE(a,b){this.D=null;this.In=!1;this.Db=a;this.qm=b;this.Gq=new C;this.wc=zd("DIV");this.wc.style.position="absolute";a.displayObject().appendChild(this.wc);Th(this.wc,this.lh);this.Nf(a)}k=jE.prototype;k.In=!1;k.lh=!1;k.rR=function(){this.In=!0;this.Mg(this.Db);this.yB(this.lh);this.Gq.C(this)};k.Tba=function(){};k.Uba=function(){};k.Sba=function(){};k.ki=function(){return this.In&&null!=this.D};k.sa=function(){return this.ki()?this.D.getIframe():null};k.stop=function(){if(this.ki())try{this.D.stopVideo()}catch(a){}}; +k.visible=function(){return this.lh};k.Mg=function(a){this.Nf(a);const b=this.sa();if(b){var c=a.scale();a=c*this.qm.width();c*=this.qm.height();Nh(b,a,c)}};k.Nf=function(a){const b=this.qm.id();a=a.position(b,1);Gh(this.wc,a.x,a.y)};k.iJ=function(a){this.lh!=a&&(this.lh=a,this.yB(a))}; +k.yB=function(a){if(a){if(!this.D){var b=this.wc,c=this.Db.scale(),d=this.qm;c={width:c*d.width(),height:c*d.height(),videoId:d.Li(),playerVars:{controls:1,loop:0,enablejsapi:1,autohide:2,autoplay:0,showinfo:1,rel:0},events:{onReady:this.rR.bind(this),onPlaybackQualityChange:this.Tba.bind(this),onStateChange:this.Uba.bind(this),onError:this.Sba.bind(this)}};d="_"+d.id();const e=zd("DIV");e.setAttribute("id",d);b.appendChild(e);this.D=new YT.Player(d,c);this.Mg(this.Db)}}else Cd(this.wc),this.D=null, +this.In=!1;Th(this.wc,a)};k.readyEvent=function(){return this.Gq};function kE(a,b,c){this.Ob={};this.Db=a;this.M=c;this.Y=b;a.Qe().addHandler(this.KA,this);b.Zb().addHandler(this.Ab,this)}k=kE.prototype;k.W=-1;k.$_=!1;k.Z_=!1;function lE(a,b,c){let d=0;if(0>b||b>=a.M.count())return d;a=a.M.la(b);if(a instanceof Am)for(a=a.xz,b=0;bb||b>=a.M.count())&&(b=a.M.la(b),b instanceof Am)){b=b.xz;for(let f=0;fa/uE.width||1>b)&&F(c,"backgroundSize","contain")}}; +k.Uc=function(){if(this.Ra)if(this.Ra=!1,this.BU){this.Db.Qe().removeHandler(this.SW,this);var a;null==(a=this.Cv)||a.gd();this.Cv=null}else{const b=sE(this);b&&(a=tE(),nn(b,a),Cd(b))}};function rE(a){const b=a.Db.scale(),c=a.Bv;a.Cv.setSize(c.width()*b,c.height()*b)}function qE(a){var b=document.getElementById(a.Bv.containerId());const c=a.Db.scale(),d=sn(b);if(d){var e=d.ve;b=d.we}else e=parseFloat(Eh(b,"left")),b=parseFloat(Eh(b,"top"));a=rd(a.Cv.od);Gh(a,e*c,b*c)}k.SW=function(){qE(this);rE(this)}; +function sE(a){if(a.IE)return a.IE;a.IE=rd(document,a.Bv.containerId());return a.IE}var uE=new cd(74,89); +function tE(){if(void 0!==pE)return pE;const a="_sf"+ld();pE=a;gn("."+a+" {background: #A42222;}."+a+" div {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEoAAABZCAYAAACZkrJEAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwQAADsEBuJFr7QAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAFA0lEQVR4Xu3c21MTVxwHcP/B+iwyPimoT46WPulY6INDR3mwdhTojJeOgC1MMZHhoha85EJIMCg1CTXQJEsokJCEJJgbyc/fiW5nJ2NjCL/dPecYZ74zIYa9fPZ7zh4Y3SNHWn9aAi0BYoGZM2dhGuMd/OW/bHgW4a+RESDelVibc/T0QPDRI0hHo1CpVP43UY/n64Kabj8By9iWnUCgLkwt2lcD5er5ARIHxNFiSQ9l7/oO8ru7B2rP54ag1FBbOK/Um3cO8ndSQoVwcj4IQiOflQrKicMs+4W7VyMoUg89/+AgtqisW6Iet/jLg5AVh1oZkXRM1C04VNKP6yEdgdRtCw0Vw6tsBBLbh7BQYQOGm/YiCAm1OjRsWJOEHXoLuASolPcNT9S9INZdr5BKGo7ELoxQUBuzs6Ygxfx+eDM0JEajvN09UNnHIadj0ooCrwYGYPL0GTFQPverv0ISh5xOSO8sVpgSGUcFqw45HZDCuF1re7u47dE2ynH6rC5Itu5uOYBUrKwSQagSWfLJBEzI0iIVaflaHxmQim2XrUkMq4BXn7JNUiIF8DZNiRS0WOSak9Rhl08koFwqkSTu88mJFOgfIAFi0DkEnzguyRKgdoFJ2aa5b7vkbNOr77uxTUWSxH1v5URizcpEwiRIDFvaIUfZJt/9+/K2advlImlTLrEjLxIbdlRz01J/v7xQoYcWKBdxEj9kcjuStymPJ3hYpGa/fx2HvBD//M3DlgTFgmlZd82LAbWFB9qCaqDTZiKxfQvRqKWr10xtkzBQmXDIdChFhDnK7GHH9s891D/jD6FcwLudyVHmOb/r5eJxRMqbHmXeye/ywMsmcQ6Q2DFwDZUO4STegqq/eLJd6OIGietGbeLkyUubuIbiCYkdS4THyXy1uiQw/06nPQYuofbzOeAtYaeDr+VBcHycDGnx1i1g8WjixtfaLODXalz4Ws08vq7m5k1wYmYuX+YLiqpJKwjewC8lxPxIcPwPbNN7kvx29Ki8UPs5RCLIuoOz+YSytxt4chRIbBsTnZ1ytukJnhgVktRtSq2tQim3R5I53u5OVMPu7a/3oPQekQiSRHCq4+JqO49xyFEAqduQtk1725sIlSWJ4rDJ2abUWpAESIW2ynin2369BKU9bBJRInYJ27T92otAGdIMfSPRKtzadhy2EKmISJTx3rsrz9z09Px5yG7+C8UsIhEmg9vk6jbe7MFMdXSCYrOR4mihJ/ECNHtsXHwfa5Bie4lAad0Sxu1zcbKNHMQYTqJTHR3VOH/shcDYKA6xDd1wVPgM7qOR4+PiM8UMtsWkvOjtFQlqF6GMT/jlC3GQqv/9C5GMTvzdilhIZkE9aGsTECqNjTIwjy9dEg+p2qh0CqGMifPnG2IiGQm1eOeOuEhGQTluCNwkdRFX2E2CXklHFZi5eFHsJukNFV/xw/CxY3IgMaw8Noo67tu36wKN4rNRnPjkQzUz+NCa3/E9FvUCPsDXLFz8+PIRKoFQNIlhi0ZPnWr45BTNU54dCBfRfO0ZHgE7vscPVAqRDplYwA/TTcxFWhiGwnBUmElsmU0WqLXnz5oCUjFqG8Te/7OvD9yfwJbxIYAcNWoHG9V41j0LMHvlCskJ1DaKofw99wxUoDBPD2CvhxQL+GDt+RzYf7oOlnPnSHC0DdFCqcPsKT7MhoV9jiuosZMngWW0JtxUvnUgLQGpBD4AN9FCi/luT4wAAAAASUVORK5CYII=) no-repeat;background-position: center;}");return a} +;function vE(a,b,c,d){this.R=a;this.Db=b;this.Y=c;this.M=d;this.pL=[];c.Zb().addHandler(this.Ab,this)}vE.prototype.W=-1;vE.prototype.Ab=function(){var a=this.Y.timestamp(),b=a.L();if(b!=this.W){if(0<=this.W){var c=this.M.la(this.W);c instanceof Am&&wE(this,c,-1)}this.W=b}if(0<=b&&(c=this.M.la(b),c instanceof Am)){b=c;const d=a.Ba();a=0>d?-1:b.sb().sc(d).startTime()+a.ib();wE(this,c,a)}}; +function wE(a,b,c){b=b.bL;for(let g=0;ge||e>=d.count())throw Error("index is out of range");d=d.Az[e];e=a;var f=d;const h=ma(f)+"";h in e.pL||(e.pL[h]=new oE(f,e.R,e.Db));e=e.pL[h];c>=d.ib()?e.show():e.Uc()}};function xE(a){ei&&a.uU.addHandler(this.q6,this)}xE.prototype.q6=function(a,b){"string"!==typeof a&&(a=a.baseVal);this.BN(a)&&(b.AT=!0)};xE.prototype.BN=function(a){return(new di("openWindow",[a])).Dx()};function yE(a,b,c,d){this.Ve=b;this.B=c;this.me=d;this.IH=zE(a);this.XO=[];this.QX={};this.FZ={};this.U=zd("div");this.Ve.displayObject().appendChild(this.U);c.$().Zb().addHandler(this.Ab,this);b.Qe().addHandler(this.S6,this)}k=yE.prototype;k.W=-1;k.Nb=!1;k.activate=function(){this.Nb=!0;const a=this.B.$().timestamp();0<=a.L()&&0<=a.Ba()&&this.Mj(a.L())};function zE(a){return new ru(a,b=>{b=b.ie();const c=[];for(let d=0;d{c.playbackStateChangedEvent().removeHandler(b.bN,b)});this.Rz=[];this.Ij.audioStartingEvent().removeHandler(this.MW,this);this.Ij.audioStartedEvent().removeHandler(this.LW,this);this.Ij.videoStartingEvent().removeHandler(this.OW,this);this.Ij.videoStartedEvent().removeHandler(this.NW,this);this.dF=this.Ij=null}const a=this.B.Oa()||this.B.tb()||this.B.fb();a&&(this.Ij=a.mediaController())&&(this.Ij.audioStartingEvent().addHandler(this.MW,this), +this.Ij.audioStartedEvent().addHandler(this.LW,this),this.Ij.videoStartingEvent().addHandler(this.OW,this),this.Ij.videoStartedEvent().addHandler(this.NW,this),this.dF=a.soundController(),this.A_())};k.MW=function(a,b,c){this.cW.s0(b)||c.suspend()};k.LW=function(a){a.ready()||a.readyEvent().addHandler(this.KW,this)};k.KW=function(a){a.readyEvent().removeHandler(this.KW,this);this.T4.C()};k.OW=function(a,b,c){this.cW.t0(b)||c.suspend()}; +k.NW=function(a){Pa(this.Rz,a)||(this.Rz.push(a),a.playbackStateChangedEvent().addHandler(this.bN,this),this.W4.C())};k.bN=function(a){a.playing()||(a.playbackStateChangedEvent().removeHandler(this.bN,this),Ra(this.Rz,a))};k.A_=function(){this.dF&&this.dF.setVolume(this.hc.dD())};function DE(){}DE.prototype.activate=function(){};class EE{constructor(a,b,c){const d=c.duration();b=new gf(b.index(),-1,0);const e=c.ti(b,!0,!1);a="untilNextSound"==a.wm?d:Math.min(d,e+a.duration());c=c.Xo(a,!0,!1);this.$i=new Ef([new Bf(new zf("play",b,0),b,c)])}oQ(){return this.$i}};function FE(a,b,c,d){this.M=a;this.Za=b;this.CF=[];this.Y=c;c.Ec().addHandler(this.kw,this,1);for(b=0;b=ff(d,Cf(c.zR).Lb()),c.rS(d))}}} +FE.prototype.kw=function(){this.Y.Kg()&&this.GM&&(GE(this),this.GM=!1)};FE.prototype.iV=function(a){const b=this.M;for(var c=a.Dd(),d=0;d=b.Ba()&&0==b.ib()?!LE(a)&&!ME(a):!0} +function OE(a){const b=a.G.slides(),c=a.Mf();var d=g=>{let h=null,l=null;for(let m=0;mff(c.Lb(),d.Lb()));return b}};function QE(a){this.UJ=new RE;this.kG={};a.LZ.addHandler(this.cG,this)}r(QE,DE);QE.prototype.activate=function(){this.UJ.activate()};QE.prototype.cG=function(a,b){if(b){b=ma(a)+"";var c=a.kc();var d=this.UJ;var e=c.src();let f=null;0a;++a){const b=new hk(zd("audio"));this.Ob.push(b)}} +RE.prototype.activate=function(){u(this.Ob,a=>{a=a.mediaElement();a.play();a.pause()})};RE.prototype.release=function(a){this.Ob.push(a)};function SE(a,b){const c=TE(a,b);UE(c);c.deactivate();a.V9.C(b)}function TE(a,b){const c=ma(b)+"";c in a.xP||(a.xP[c]=a.W9.sr(b,a.Y,a.Da));return a.xP[c]}function VE(a,b,c){if(a.Nb){b=WE(a,b);for(let d=0;d=b&&c.push(e)}return c} +function YE(a,b,c){c=ZE(a,c);const d=ZE(a,b.Lb());a=ZE(a,b.qf())-d;return Vc(c-d,0,a)}function ZE(a,b){return a.M.ti(b,!0,!1)} +class $E{constructor(a,b,c,d,e){this.M=a;this.Y=b;this.Da=c;this.W9=e;this.W=-1;this.BA=void 0;this.Nb=this.nK=!1;this.Fm=this.iH(d);this.Dp=[];this.xP={};this.U9=new C;this.V9=new C;b.Zb().addHandler(this.Ab,this);b.Ec().addHandler(this.kw,this)}activate(){this.Nb=!0;this.kw(this.Y)}Au(a){this.BA=a}F0(){this.Dp.forEach(a=>SE(this,a));this.Dp=[]}iH(a){const b=[];for(let c=0;cff(c.Lb(),d.Lb()));return b}Mj(a,b){this.nK=!0;if(0<=this.W){const c=WE(this,this.W); +for(let d=0;d=ff(e.qf(),b)||0{c.TC()||d()},this)}kw(a){if(this.Nb){a.started()&& +VE(this,this.W,a.timestamp());var b=this.Dp;for(let e=0;ethis.qc.wk(f.playbackRate()))}uf(){return 1==this.qc.xI()}TC(){return this.Bf||this.Zj||this.Wt}pH(a){this.Zj||this.Bf||(this.Zj=!0,kv(this.Da,!0,this),this.J9=a,a=1E3*(a-this.qc.currentTime())+500,this.ZZ=setTimeout(this.iZ.bind(this),a),this.qc.Ef.addHandler(this.yT,this))}iZ(){clearTimeout(this.ZZ); +this.ZZ=void 0;this.qc.Ef.removeHandler(this.yT,this);this.fd||this.qc.pause();this.Zj=!1;kv(this.Da,!1,this)}yT(){.1>this.J9-this.qc.currentTime()&&this.iZ()}preload(a){const b=this.qc,c=aF(this);if(!c&&!this.XN){this.XN=!0;const d=this.f$.bind(this);setTimeout(d,300);Ji&&(this.BP=setInterval(d,1E3))}!a||b.xC()&&c||this.Wt||(this.Wt=!0,Ts(this.Da,!0,this),b.Kp.addHandler(this.mN,this))}f$(){bF(this);this.qc.ready()?clearInterval(this.BP):this.qc.load()}mN(){Ji&&1==this.qc.duration()?this.vT=setInterval(this.K3.bind(this), +200):UE(this)}K3(){1!=this.qc.duration()&&UE(this)}activate(){qr(this.wP,"activated");this.qc.Ec().addHandler(this.VW,this)}deactivate(){qr(this.wP,"deactivated");this.qc.Ec().removeHandler(this.VW,this);this.Bf&&(this.Bf=!1,Ts(this.Da,!1,this));this.fd=!1;this.qc.pause()}$m(a,b,c){if(!this.Bf||b){bF(this);var d=this.qc,e=a-d.currentTime(),f=b?.01:.5;e>f&&!b&&!this.Bf&&!c?this.pH(a):Math.abs(e)>f&&d.MQ(a);this.fd&&!this.qc.playing()&&this.qc.play()}}play(a){this.fd||this.Wt||(this.$m(a,!this.qc.playing()), +this.fd=!0,this.qc.play())}pause(){this.fd&&(this.fd=!1,this.Bf||this.Zj||this.qc.pause())}VW(){var a=!1;"buffering"==this.qc.state()&&(a=!0);this.Bf!=a&&(this.Bf=a,qr(this.wP,a?"buffering":"activated"),Ts(this.Da,a,this),a||this.fd||this.qc.pause(),this.Og.C())}FP(){this.qc.Ih(this.XX)}};class dF extends cF{constructor(a,b,c,d,e){super(a,b,a.audio().sources(),c,d,e);this.Zr=b}};class eF{constructor(a,b){this.Zr=a;this.Ee=b}sr(a,b,c){return new dF(a,this.Zr,b,c,this.Ee)}};class fF{constructor(a){this.Ee=a}sr(a,b,c){var d=gk();d=new ik(d);return new dF(a,d,b,c,this.Ee)}};class gF extends $E{constructor(a,b,c,d,e,f){var g=gk();g=new ik(g);super(a,b,c,d,Ii?new eF(g,f):new fF(f));this.Zr=g;this.hc=e;e.eD().addHandler(this.Gm,this);this.Gm()}activate(){if(Ii){const a=this.Zr.kc().mediaElement();a.src=Hi();a.play()}super.activate()}Gm(){this.Zr.setVolume(this.hc.dD())}Hy(a){super.Hy(a);Ii||(this.Zr=TE(this,a).Zr,this.Gm())}};class hF extends cF{constructor({track:a,DD:b,$:c,Wo:d,su:e,JI:f}){super(a,b,a.video().sources(),c,d,f);this.Nd=b;this.zw=e}DD(){return this.Nd}activate(a){super.activate(a);this.zw&&PD(this.Nd,this.zw,!0)}FP(){this.zw&&(PD(this.Nd,this.zw,!0),FC(this.Nd,!0),this.Nd.Ef.addHandler(function b(){0!=this.Nd.currentTime()&&(this.Nd.Ef.removeHandler(b,this),FC(this.Nd,!1))},this));super.FP()}};class iF{constructor(a){this.Ee=a}sr(a,b,c){const d=new QD("",this.Ee.ED()),e=a.video().su();e&&PD(d,e,!0);return new hF({track:a,DD:d,$:b,Wo:c,su:a.video().su(),JI:this.Ee})}};function jF(a){this.Nd=a;this.U=zd("div");lq(a,this.U)}jF.prototype.displayObject=function(){return this.U};jF.prototype.displayObject=jF.prototype.displayObject;jF.prototype.resize=function(a,b){this.Nd.resize(a,b)};jF.prototype.resize=jF.prototype.resize;jF.prototype.width=function(){return this.Nd.width()};jF.prototype.width=jF.prototype.width;jF.prototype.height=function(){return this.Nd.height()};jF.prototype.height=jF.prototype.height; +jF.prototype.DS=function(a){a.resize(this.Nd.width(),this.Nd.height());pq(this.Nd);this.Nd=a;lq(a,this.U)};jF.prototype.updatePlayer=jF.prototype.DS;class kF{constructor(a,b){this.Nd=a;this.Ee=b}sr(a,b,c){return new hF({track:a,DD:this.Nd,$:b,Wo:c,su:a.video().su(),JI:this.Ee})}};class lF extends $E{constructor(a,b,c,d,e,f){const g=new QD(ah&&10>lj?"":"",f.ED());super(a,b,c,d,Ii?new kF(g,f):new iF(f));this.Nd=g;this.pa=new jF(g);this.hc=e;this.hc.eD().addHandler(this.Gm,this);this.Gm();this.bY=new P;this.bY.Rf(0);document.body.appendChild(this.bY.displayObject())}activate(){if(Fj){const a=this.Nd.kc().mediaElement();a.src=Hi();a.play();a.pause()}super.activate()}view(){return this.pa}WN(a){super.WN(a);Ii&&(clearTimeout(this.f8), +a.length&&(this.f8=Gi(()=>{const b=a[0].video().su();b&&PD(TE(this,a[0]).DD(),b)},this,500)))}Gm(){this.Nd.setVolume(this.hc.dD())}Hy(a){super.Hy(a);Ii||(this.Nd=TE(this,a).DD(),this.pa.DS(this.Nd),this.Gm())}}lF.prototype.view=lF.prototype.view;const mF={xga:"resumePlayback",nfa:"gotoSlide",Dea:"delayStartup"};class nF{constructor(a){this.Zw=a;this.Ld=0;this.Rl="gotoSlide";this.Fp=!1}L(){return this.Ld}Y1(a){this.Ld=a}action(){return this.Rl}xu(a){this.Rl=a}mf(){return this.Fp}bJ(a){this.Fp=a}$ca(){return this.Zw}}nF.prototype.startupController=nF.prototype.$ca;nF.prototype.setAutoStart=nF.prototype.bJ;nF.prototype.autoStart=nF.prototype.mf;nF.prototype.setAction=nF.prototype.xu;nF.prototype.action=nF.prototype.action;nF.prototype.setSlideIndex=nF.prototype.Y1;nF.prototype.slideIndex=nF.prototype.L; +q("ispring.presenter.player.startup.PresentationStartup.Action",mF);q("RESUME_PLAYBACK","resumePlayback",mF);q("GOTO_SLIDE","gotoSlide",mF);q("DELAY_STARTUP","delayStartup",mF);function oF(a){return a.s3.some(b=>a.B8.some(c=>c(b)))} +class pF{constructor(a,b,c){this.G=a;this.B=b;b=this.slides;var d=c;c=[];do if(c.push(d),"slide"==d.type()&&d.Al()){var e=b;const f=d.pj().kp();(d=f&&"gotoSlide"==f.type()?e.la(f.L()):d.index()b.Lb().L()<=a.index()&&b.qf().L()>=a.index())}t3(a){return!!a.Py}v3(a){return this.v9.some(b=>{a:{b:{var c=Kf(b,this.slides);if(0=b.L()&&a.index()<=c.L())){b={Lb:b,qf:c};break b}b=null}if(c=b){b=c.Lb;c=c.qf;if(a.index()==b.L()){if(0!!Df(Kf(c,this.slides),b))}return!1}t8(a){return a instanceof cr?(a=this.V.rf(a.index()))?!a.Oa().autoStartAvailable():!0:!1}Q8(a){return a instanceof Bq?(a=this.V.rf(a.index()))?!a.tb().autoStartAvailable():!0:!1}U4(a){return a instanceof tq?(a=this.V.rf(a.index()))?!a.fb().autoStartAvailable():!0:!1}};function qF(a,b,c,d,e){if(a.k8)throw Error("presentation was already started");if(e){var f=a.D;const l=f.Wa.Ge;l.sQ(e);ft(l,0);e=f.G.slides();for(f=0;f{Os(a.D.aI().Ge,b);a.D.pa.qI();const h=!(e instanceof Am);h&&f.lk(b,0,0,!1);let l=!1;if(void 0===c){c=d.settings().Vc().mf();const n=new pF(d,f,e);c&&(Fj||Gj)&&oF(n)&&(c=!1,l=!0)}l&&Ms(f,()=>{uF(a.D,b,!1,l)});l&&!h&&f.lk(b,0,0,!1);l||(vs(f,b,c),uF(a.D,b,c,l))};if(e.uf())g();else{const h=f.Wo();Ts(h,!0,a);const l=a.D.aI().hy().jf,n=m=>{m===e&&(Ts(h,!1,a),l.ql.removeHandler(n),g())};l.ql.addHandler(n)}} +class vF{constructor(a,b){this.D=a;this.H9=b;this.QZ=this.k8=!1}start(a,b){qF(this,a,b,"gotoSlide")}resume(a,b){qF(this,a,b,"resumePlayback",this.H9)}}vF.prototype.resume=vF.prototype.resume;vF.prototype.start=vF.prototype.start;function wF(a,b,c){this.sa=null;this.Oo=b;this.PN=c;b.DC()&&(this.wc=zd("DIV"),a.displayObject().appendChild(this.wc),this.wc.style.overflow="hidden",this.wc.style.position="absolute",Ni&&(this.wc.style["-webkit-overflow-scrolling"]="touch",this.wc.style.overflow="auto"),a=zd("IFRAME"),a.setAttribute("src",this.Oo.url()),a.style.border=0,a.style.backgroundColor="#ffffff",a.setAttribute("webkitallowfullscreen",""),a.setAttribute("mozallowfullscreen",""),a.setAttribute("allowfullscreen",""),this.sa= +a)}k=wF.prototype;k.lh=!1;k.Mg=function(a){const b=this.Oo;if(this.sa&&this.wc&&b.DC()){var c=a.scale();const d=c*b.width();c*=b.height();a=a.position(b.id(),1);Nh(this.wc,d,c);Gh(this.wc,a.x,a.y);Nh(this.sa,d,c)}};k.visible=function(){return this.lh}; +k.iJ=function(a){if(this.lh!=a)if(this.lh=a,this.Oo.DC()){if(a){this.wc.appendChild(this.sa);try{this.sa.contentWindow.ispringPresentationPlayer=this.PN}catch(b){}}else Cd(this.wc);Th(this.wc,a)}else if(a){if(!this.sa){a=this.Oo;const b={resizable:!0,statusbar:!1,toolbar:!1,location:!1,scrollbars:!1,menubar:!1},c=this.Oo.width()||this.Oo.height();a.PQ()?(b.width=screen.availWidth,b.height=screen.availHeight,b.top=0,b.left=0):c&&(b.width=Math.max(this.Oo.width(),100),b.height=Math.max(this.Oo.height(), +100));this.sa=ei?this.BN(a.url()):fh(a.url(),b)}}else{if(this.sa)try{this.sa.close()}catch(b){}this.sa=null}};k.BN=function(a){(new di("openWindow",[a])).Dx();return null};function xF(a,b,c,d){this.Ob={};this.PN=d;this.Db=a;this.M=c;b.Zb().addHandler(this.Ab,this);a.Qe().addHandler(this.KA,this)}k=xF.prototype;k.W=-1;k.Ab=function(a){a=a.timestamp();this.W!=a.L()&&yF(this,this.W,-1);this.W=a.L();-1!=a.Ba()&&(a=this.dP(a),yF(this,this.W,a))};k.D=function(a){const b=a.id();this.Ob[b]||(this.Ob[b]=new wF(this.Db,a,this.PN));return this.Ob[b]};k.KA=function(){const a=this;zF(this,this.W,function(b){b.Mg(a.Db)})}; +function yF(a,b,c){a.$O(b);zF(a,a.W,function(d){const e=d.Oo.timeout()<=c;e&&(d.visible()||d.Mg(a.Db));d.iJ(e)})}k.Po=function(a){return this.eH(a)&&(a=this.M.la(a),a instanceof Am)?a.GD():null};k.$O=function(a){this.eH(a)&&this.M.la(a).sb().duration()};k.dP=function(a){const b=a.Ba(),c=a.L();return this.M.la(c).sb().sc(b).startTime()+a.ib()};k.eH=function(a){return 0<=a&&af||f>=e.count()?null:e.Po[f])e=a.D(e),c(e)}}};var AF={M2:"gotoPreviousSlide",I2:"continuePresentation",J2:"finishAction",aha:"skipQuiz"};q("ispring.quiz.player.QuizPlayerControllerActionType",AF);q("GOTO_PREVIOUS_SLIDE","gotoPreviousSlide",AF);q("CONTINUE_PRESENTATION","continuePresentation",AF);q("FINISH_ACTION","finishAction",AF);q("SKIP_QUIZ","skipQuiz",AF);var BF={I2:"continuePresentation",J2:"finishAction",bha:"skipScenario",M2:"gotoPreviousSlide",lfa:"gotoNextSlide"};q("ispring.scenario.player.ScenarioPlayerControllerActionType",BF);q("CONTINUE_PRESENTATION","continuePresentation",BF);q("FINISH_ACTION","finishAction",BF);q("SKIP_SCENARIO","skipScenario",BF);q("GOTO_PREVIOUS_SLIDE","gotoPreviousSlide",BF);q("GOTO_NEXT_SLIDE","gotoNextSlide",BF);var CF={pfa:"initializing",Pda:"authorizating",rfa:"inProgress",cea:"completed"};q("ispring.scenario.session.ScenarioState",CF);q("INITIALIZING","initializing",CF);q("IN_PROGRESS","inProgress",CF);q("COMPLETED","completed",CF);q("AUTHORIZATING","authorizating",CF);var DF=null,EF=null;function FF(a,b,c){this.G=a;var d=Oi();if("1"==d.resume||"review"==window.launchMode)a.settings().Vc().Iw="always";else if("0"==d.resume||"browse"==window.launchMode)a.settings().Vc().Iw="never";d=Fj?new PE(a):new BE;const e=new eC,f=new yg,g=new SD(f);g.RR(a.settings().ga());const h=new NC(a,g,d);var l=new XD(a,h);this.Qg=new lC;var n=new nC(a.settings().navigation().keyboard(),a.slides(),g,this.Qg),m=new WD;m.stateChangedEvent().addHandler(this.NA,this);this.Wa=new vq(e,c,h,g,g,l,n,this,m);new OB(b); +this.pa=new YB(this.Wa,a,f);b=this.pa.V();m=this.pa.Cd();d.yr(b.$());h.bS(b.$(),b.Wo());n.lD(m);l.B=b;l.rc=m;e.lD(b);e.cJ(h);GF(this,e);l=this.pa.tr();n=l.displayObject();c.jf.Ve=n;new kE(l,b.$(),a.slides());new xF(l,b.$(),a.slides(),this);new vE(this.pa,l,b.$(),a.slides());this.fW=new TD(a);this.fW.lD(b);this.RZ=new C;this.PZ=new C;this.nV=new C;this.DT=new C;this.Tq=new C;this.BY=new C;this.VD=new gF(a.slides(),b.$(),b.Wo(),a.qd().Lm(),g,f);this.GH=new lF(a.slides(),b.$(),b.Wo(),a.qd().Vf(),g,f); +this.I5=new FE(a.slides(),h,b.$(),c.jf);new CE(b,g,d);Ii&&new xE(e);this.a4=new yE(a.slides(),l,b,g);this.H5=Fj?new QE(g):new DE(g);b.IY.addHandler(this.X6,this);b.qp().addHandler(this.lm,this);b.BE.addHandler(this.p6,this);b.AU.addHandler(this.z4,this);b.vc().addHandler(this.io,this);this.me=g;Dj&&ISPlayer.setPauseMediaCallback(this.pG.bind(this))}k=FF.prototype;k.zU=!1;k.kk=function(){return this.Qg};k.aI=function(){return this.Wa}; +function GF(a,b){const c=wd("DIV");c.getCore=function(){return b};c.setAttribute("id",a.G.settings().qJ());a.pa.displayObject().appendChild(c)}function uF(a,b,c,d){const e=a.pa.V().$(),f=!d;f&&a.ft();c&&tF(a);f&&c||e.Ec().addHandler(function h(){e.started()&&(e.Ec().removeHandler(h,this,-1),f||a.ft(),c||tF(a))},a,-1);a.nV.C(b,c,d)}k.ft=function(){this.a4.activate();this.pa.V().activate()}; +function tF(a){a.zU||(a.zU=!0,a.H5.activate(),a.VD.activate(),a.GH.activate(),a.Wa.mediaController().activate())}k.Ca=function(){return this.G};FF.prototype.presentation=FF.prototype.Ca;FF.prototype.view=function(){return this.pa};FF.prototype.view=FF.prototype.view;FF.prototype.version=function(){return"8.3.0"};FF.prototype.version=FF.prototype.version;FF.prototype.persistState=function(){return this.Wa.Ge.OR()};FF.prototype.persistState=FF.prototype.persistState; +FF.prototype.Uaa=function(a,b){var c={width:a,height:b,q0:!1};this.BY.C(c);return c.q0?new cd(c.width,c.height):(c=Math.min(a/this.G.slideWidth(),b/this.G.slideHeight()),new cd(a*c,b*c))};FF.prototype.getOptimalPlayerSize=FF.prototype.Uaa;FF.prototype.NA=function(){this.Tq.C(new Mn)}; +FF.prototype.start=function(a){var b=null;a&&(b=VD(a));a=this.G.settings().Vc();var c=this.view().V(),d=b,e=this.view().V().Pf(),f;if(f=d)a:{f=this.G.slides().count();var g=this.view().V().Pf();for(let h=0;hf||f>=this.G.slides().count();d="review"==window.launchMode;d=g&&null!=e&&0<=e&&("never"!=a.wu()||d);g&&(f=c.Pf());c=d?e:f;b=new vF(this,b);e=new nF(b); +e.bJ(a.mf());e.xu(d?"resumePlayback":"gotoSlide");e.Y1(c);this.RZ.C(e);switch(e.action()){case "resumePlayback":b.resume(e.L());break;case "gotoSlide":b.start(e.L());break;case "delayStartup":b.QZ=!0;break;default:throw Error("unknown startup action");}};FF.prototype.hy=function(){return this.Wa.hy()};FF.prototype.uy=function(){return this.RZ};FF.prototype.startupEvent=FF.prototype.uy;FF.prototype.startupCompletedEvent=function(){return this.PZ};FF.prototype.startupCompletedEvent=FF.prototype.startupCompletedEvent; +FF.prototype.Qx=function(){return this.nV};FF.prototype.initialSlideShownEvent=FF.prototype.Qx;FF.prototype.X6=function(){this.VD.$m();this.GH.$m();this.I5.$m()};FF.prototype.lm=function(){const a=this.G.settings().Qu().NI();a&&a.open()};FF.prototype.HC=function(){return this.fW.HC()};FF.prototype.executeMetaCommandEvent=FF.prototype.HC;FF.prototype.m0=function(){return this.VD};FF.prototype.audioNarrationController=FF.prototype.m0;FF.prototype.Tr=function(){return this.GH}; +FF.prototype.videoNarrationController=FF.prototype.Tr;FF.prototype.p6=function(){const a=new Mn;this.DT.C(a);if(!a.actionPrevented())if(ei)(new di("closeWindow")).Dx();else try{Ji||(window.open("","_self",""),window.close())}catch(b){}};FF.prototype.closeWindowEvent=function(){return this.DT};FF.prototype.closeWindowEvent=FF.prototype.closeWindowEvent;FF.prototype.stateChangedEvent=function(){return this.Tq};FF.prototype.stateChangedEvent=FF.prototype.stateChangedEvent; +FF.prototype.fn=function(a){this.pa.Ib!=a&&(this.pG(),this.pa.fn(a))};FF.prototype.gestureNavigationEnabled=function(){return this.G.settings().navigation().Um().enabled()};FF.prototype.gestureNavigationEnabled=FF.prototype.gestureNavigationEnabled;function HF(a,b){if(b=null==a.pa.Cd().nf(b))b=!(-1==a.pa.V().fh()&&-1==a.pa.V().gh());return b}function IF(a,b){return null==a.pa.Cd().nf("quizArbitrarySlideSwitching",b)}function JF(a,b){return null==a.pa.Cd().nf("ScenarioArbitrarySlideSwitching",b)} +function KF(a,b){var c=a.pa.V(),d=c.fa();c=c.$d().view();c=zq(c.tb());switch(b){case "gotoPreviousSlide":return-1!=a.pa.V().gh();case "skipScenario":return"atAnyTime"==d.Im&&HF(a,"switchToNextSlide");case "continuePresentation":return b=c.scenarioPassed()?d.oG:d.FE,d=0,b instanceof Vg&&(d=b.L()),"gotoSlide"==b.type()&&JF(a,d)||"gotoNextSlide"==b.type()&&HF(a,"scenarioSwitchToNextSlideWithoutBranching");case "finishAction":return b=c.scenarioPassed()?d.oG:d.FE,d=0,b instanceof Vg&&(d=b.L()),"closePlayerWindow"== +b.type()||"gotoSlide"==b.type()&&JF(a,d)||"gotoNextSlide"==b.type()&&HF(a,"scenarioSwitchToNextSlide")}return!1} +function LF(a,b){var c=a.pa.V();const d=c.fa();c=c.$d().view();const e=Rg(c.Oa());switch(b){case "gotoPreviousSlide":return"sequential"!=a.G.settings().navigation().navigationType()&&c.ty()&&-1!=a.pa.V().gh();case "skipQuiz":if(b="atAnyTime"==d.Im)b=HF(a,"switchToNextSlide")&&-1!=a.pa.V().fh();return b;case "continuePresentation":return b=Sg(e)?d.nG:d.EE,"gotoSlide"==b.type()?IF(a,b.L()):"gotoNextSlide"==b.type()&&HF(a,"quizSwitchToNextSlideWithoutBranching");case "finishAction":return b=Sg(e)?d.nG: +d.EE,"gotoSlide"==b.type()?IF(a,b.L()):"closePlayerWindow"==b.type()||"gotoNextSlide"==b.type()&&HF(a,"quizSwitchToNextSlide")}return!1}FF.prototype.actionAvailable=function(a){var b=this.pa.V().fa();if(b instanceof cr)a=LF(this,a);else if(b instanceof tq)a:{b=this.pa.V().$d().view();switch(a){case "gotoNextPresentationSlide":a=HF(this,"switchToNextSlide");break a;case "gotoPreviousPresentationSlide":a=b.ty()&&-1!=this.pa.V().gh();break a}a=!1}else a=b instanceof Bq?KF(this,a):!1;return a}; +FF.prototype.actionAvailable=FF.prototype.actionAvailable;FF.prototype.z4=function(a,b,c){const d=this.G.slides();b=0<=b?d.la(b):null;c=0<=c?d.la(c):null;if(b instanceof cr||c instanceof cr||b instanceof tq||c instanceof tq||b instanceof Bq||c instanceof Bq)uj?(a.zv="null",a.Fa=0):a.zv="FadeSmoothly"};FF.prototype.io=function(){const a=this.pa.V().fh();this.VD.Au(a);this.GH.Au(a)}; +FF.prototype.pG=function(){const a=this.pa.V();if(!(0>a.ma())){a.pause();this.me.GI();var b=this.pa.V().Oa();b&&b.pauseMedia();(b=this.pa.V().tb())&&b.pauseMedia();b=a.fa();b instanceof tq&&a.rf(b.index()).fb().pauseMedia()}};function MF(a){this.BI=a}MF.prototype.set=function(a,b){void 0===b?this.BI.remove(a):this.BI.set(a,vh(b))};MF.prototype.get=function(a){let b;try{b=this.BI.get(a)}catch(c){return}if(null!==b)try{return JSON.parse(b)}catch(c){throw"Storage: Invalid value was encountered";}};MF.prototype.remove=function(a){this.BI.remove(a)};function NF(){};function OF(){}r(OF,NF);OF.prototype.kI=function(){let a=0;for(const b of this)a++;return a};OF.prototype[Symbol.iterator]=function(){return Gk(this.Aj(!0)).uJ()};OF.prototype.clear=function(){const a=Array.from(this);for(const b of a)this.remove(b)};function PF(a){this.yk=a}r(PF,OF);k=PF.prototype;k.aR=function(){if(!this.yk)return!1;try{return this.yk.setItem("__sak","1"),this.yk.removeItem("__sak"),!0}catch(a){return!1}};k.set=function(a,b){try{this.yk.setItem(a,b)}catch(c){if(0==this.yk.length)throw"Storage mechanism: Storage disabled";throw"Storage mechanism: Quota exceeded";}};k.get=function(a){a=this.yk.getItem(a);if("string"!==typeof a&&null!==a)throw"Storage mechanism: Invalid value was encountered";return a};k.remove=function(a){this.yk.removeItem(a)}; +k.kI=function(){return this.yk.length};k.Aj=function(a){var b=0,c=this.yk,d=new zk;d.next=function(){if(b>=c.length)return Ak;var e=c.key(b++);if(a)return Bk(e);e=c.getItem(e);if("string"!==typeof e)throw"Storage mechanism: Invalid value was encountered";return Bk(e)};return d};k.clear=function(){this.yk.clear()};k.key=function(a){return this.yk.key(a)};function QF(){var a=null;try{a=window.localStorage||null}catch(b){}this.yk=a}r(QF,PF);function RF(a,b){this.n2=a;this.Fh=null;if(Ib&&!(9<=Number(dc))){SF||(SF=new Kk);this.Fh=SF.get(a);this.Fh||(b?this.Fh=document.getElementById(b):(this.Fh=document.createElement("userdata"),this.Fh.addBehavior("#default#userData"),document.body.appendChild(this.Fh)),SF.set(a,this.Fh));try{this.Fh.load(this.n2)}catch(c){this.Fh=null}}}r(RF,OF);var TF={".":".2E","!":".21","~":".7E","*":".2A","'":".27","(":".28",")":".29","%":"."},SF=null; +function UF(a){return"_"+encodeURIComponent(a).replace(/[.!~*'()%]/g,function(b){return TF[b]})}k=RF.prototype;k.aR=function(){return!!this.Fh};k.set=function(a,b){this.Fh.setAttribute(UF(a),b);VF(this)};k.get=function(a){a=this.Fh.getAttribute(UF(a));if("string"!==typeof a&&null!==a)throw"Storage mechanism: Invalid value was encountered";return a};k.remove=function(a){this.Fh.removeAttribute(UF(a));VF(this)};k.kI=function(){return WF(this).attributes.length}; +k.Aj=function(a){var b=0,c=WF(this).attributes,d=new zk;d.next=function(){if(b>=c.length)return Ak;var e=c[b++];if(a)return Bk(decodeURIComponent(e.nodeName.replace(/\./g,"%")).slice(1));e=e.nodeValue;if("string"!==typeof e)throw"Storage mechanism: Invalid value was encountered";return Bk(e)};return d};k.clear=function(){for(var a=WF(this),b=a.attributes.length;0{if(!e.actionPrevented()){e.preventAction();e=c.persistState();const f=$F();try{f.set(d,e)}catch(g){}}},null,99);c.start(b)};function cG(a,b){for(const c in a)a.hasOwnProperty(c)&&dG(a[c],c,b)}function dG(a,b,c){for(const d in a)a.hasOwnProperty(d)&&(d==c?b=a[c]:"toString"!=d&&dG(a[d],d,c));a.toString=function(){return b}};function eG(){var a={A:""};a:{for(const b in a){a=b;break a}a=void 0}return a};function fG(){const a={id:{A:"i"},title:{A:"t"},courseTitle:{A:"ct"},slideWidth:{A:"w"},slideHeight:{A:"h"},B0:{A:"c"},hca:{A:"pv"},slides:{A:"s",id:{A:"I"},sD:{A:"st",slide:{A:"s"},quiz:{A:"q"},interaction:{A:"i"},scenario:{A:"S"}},title:{A:"t"},visible:{A:"v"},D0:{A:"c"},src:{A:"s"},h2:{A:"sl"},qj:{A:"o"},lp:{A:"n"},hba:{A:"N"},G$:{A:"an"},text:{A:"x"},Ku:{A:"T",QC:{A:"i"},width:{A:"w"},height:{A:"h"}},nC:{A:"a"},L$:{A:"d"},tc:{A:"l"},kca:{A:"p"},S$:{A:"B"},X0:{A:"hi"},Hi:{A:"e",L1:{A:"p"},K1:{A:"a"}}, +timeline:{A:"i"},transition:{A:"q",type:{A:"t"},duration:{A:"d"},xk:{A:"s"}},Dd:{A:"S",id:{A:"i"},lr:{A:"a"},slides:{A:"s"},repeat:{A:"r",A2:{A:"s"},z2:{A:"c"},B2:{A:"n"}},volume:{A:"v"},effect:{A:"e"},ik:{A:"b",name:{A:"n"},time:{A:"t"}},duration:{A:"d"}},ie:{A:"V",id:{A:"i"},lr:{A:"a"},slides:{A:"s"},repeat:{A:"r",A2:{A:"s"},z2:{A:"c"},B2:{A:"n"}},yR:{A:"f"},XQ:{A:"H"},XI:{A:"R"},volume:{A:"v"},wi:{A:"h"},ik:{A:"b",name:{A:"n"},time:{A:"t"}},duration:{A:"d"}},GD:{A:"wo",containerId:{A:"c"},url:{A:"u"}, +timeout:{A:"to"},width:{A:"w"},height:{A:"h"},PQ:{A:"f"},DC:{A:"ds"}},Gda:{A:"y",containerId:{A:"c"},Li:{A:"v"},width:{A:"w"},height:{A:"h"},ib:{A:"to"}},Fda:{A:"yk",containerId:{A:"c"},Li:{A:"v"},width:{A:"w"},height:{A:"h"},ib:{A:"to"},clientId:{A:"cl"}},jp:{A:"m",name:{A:"n"},params:{A:"p",name:{A:"n"},value:{A:"v"}}},pj:{A:"b",action:{type:{A:"t",Lba:{A:"n"},ue:{A:"g"}},L:{A:"s"}},kp:{A:"n"},ey:{A:"p"}},ou:{A:"r",lock:{A:"l"}},Bk:{A:"z",id:{A:"i"},xy:{A:"t"},Kr:{A:"r"},hn:{A:"bg"},AS:{A:"tt"}, +Mm:{A:"b"},Dl:{A:"hF"},Pl:{A:"vF"},rotation:{A:"R"},slides:{A:"s"}},LQ:{A:"f",containerId:{A:"c"},width:{A:"w"},height:{A:"h"},url:{A:"u"},ib:{A:"to"},bgColor:{A:"b"},w2:{A:"t"}},Uca:{A:"si",fJ:{A:"shapes",item:{id:{A:"id"},Mm:{A:"bbox"},yj:{A:"transformBefore"},zk:{A:"transformAfter"}},Tc:{A:"bg"},Nl:{A:"textItems"},pr:{A:"childItems"},type:{A:"type"},text:{A:"text"},Mm:{A:"bbox"},Dl:{A:"hFlip"},Pl:{A:"vFlip"},rotation:{A:"rotation"},zr:{A:"lineWeight"},vj:{A:"normalizedPic"},aba:{A:"hasTransparency"}, +se:{A:"crop",left:{A:"l"},top:{A:"t"},right:{A:"r"},bottom:{A:"b"}},line:{A:"line"},fill:{A:"fill"},iu:{A:"glow"},uu:{A:"reflection"},Du:{A:"shadow"},Iu:{A:"softEdge"},Ju:{A:"threeD"}}},rca:{A:"qb"},sca:{A:"qB",qC:{A:"i"},KR:{A:"r"},hQ:{A:"n",kQ:{A:"t"},fQ:{A:"a"},gQ:{A:"p"}},JQ:{A:"f",qu:{A:"p",type:{A:"t",rQ:{A:"w"},sf:{A:"n"},ue:{A:"s"}},L:{A:"s"}},IQ:{A:"f"}}},tca:{A:"qt"},Hca:{A:"sB",rC:{A:"i"},hQ:{A:"n",kQ:{A:"t"},fQ:{A:"a"},gQ:{A:"p"}},JQ:{A:"f",qu:{A:"p",type:{A:"t",rQ:{A:"w"},sf:{A:"n"}, +ue:{A:"s"}},L:{A:"s"}},IQ:{A:"f"}}},YQ:{A:"it"},rp:{A:"pp"},kba:{A:"ip",navigationType:{A:"nt"},pC:{A:"ai"}}},settings:{A:"e",navigation:{A:"n",Um:{A:"m",enabled:{A:"e"},target:{A:"t",step:{A:"s"},slide:{A:"l"}}},keyboard:{A:"k",enabled:{A:"e"},actions:{A:"a",name:{A:"n",cca:{A:"pp"},CI:{A:"ns"},lca:{A:"ps"},Kba:{A:"nt"},mca:{A:"pt"},Lca:{A:"sf"},Kca:{A:"sb"},Laa:{A:"fs"},rba:{A:"ls"},cR:{A:"lv"},Wca:{A:"ss"},Tca:{A:"se"},wda:{A:"vu"},vda:{A:"vd"},hda:{A:"tf"}},Eu:{A:"s",key:{A:"k"},bI:{A:"c"},shift:{A:"s"}}}}, +Gx:{A:"g",IS:{A:"z"}}},Vc:{A:"p",NR:{A:"s"},mf:{A:"a"},resume:{A:"r",prompt:{A:"p"},M$:{A:"a"},Hba:{A:"n"}},Tm:{A:"l"},navigationType:{A:"n",sia:{A:"n"},zca:{A:"r"},Mca:{A:"s"}}},kr:{A:"a",fitToWindow:{A:"f"}},Qu:{A:"w",link:{url:{A:"u"},target:{A:"t"}},kJ:{A:"s"},NI:{A:"p"}},gy:{A:"P",password:{A:"p"},yy:{A:"t",vaa:{A:"a"},waa:{A:"u"}},fI:{A:"d"}},Yt:{A:"A",enabled:{A:"e"}}},oJ:{A:"S",name:{A:"n"},slides:{A:"s"}},zI:{A:"sS"},skinSettings:{A:"k"},ga:{A:"I"},tC:{A:"b",content:{A:"c"},contentHover:{A:"ch"}, +url:{A:"u"},width:{A:"w"},height:{A:"h"},zy:{A:"t"},language:{A:"l"},yx:{A:"x"},xx:{A:"d"},zx:{A:"xx"},Ax:{A:"xy"}},FD:{A:"W",src:{A:"s"},left:{A:"l"},top:{A:"t"},width:{A:"w"},height:{A:"h"},opacity:{A:"o"},url:{A:"u"},target:{A:"T"}},fonts:{A:"f",name:{A:"n"},localName:{A:"l"},urls:{A:"u"},Ada:{A:"A"},HS:{A:"D"},N$:{A:"a"},raa:{A:"d"},Raa:{A:"g"},bold:{A:"b"},italic:{A:"i"}},Zd:{A:"C",logo:{A:"l",QC:{A:"i"},width:{A:"w"},height:{A:"h"}},td:{A:"w"},HD:{A:"t"}},tu:{A:"p",name:{A:"n"},ip:{A:"j"},Nm:{A:"b"}, +td:{A:"w"},email:{A:"e"},phone:{A:"p"},Zd:{A:"C"},Cr:{A:"P",QC:{A:"i"},width:{A:"w"},height:{A:"h"}}},Dd:{A:"o",id:{A:"i"},wi:{A:"h"}},ie:{A:"v",id:{A:"i"},wi:{A:"h"},poster:{A:"p"}},qd:{A:"n",Lm:{A:"a"},Vf:{A:"v"},track:{$C:{A:"i"},volume:{A:"v"},Lb:{A:"st"},qf:{A:"et"},timestamp:{L:{A:"s"},Ba:{A:"t"},ib:{A:"i"}}}},Ai:{A:"r",type:{A:"t",O$:{A:"a"},wca:{A:"r"}},title:{A:"i"},url:{A:"u"},target:{A:"a"}},ru:{A:"P",loop:{A:"l"},Dd:{A:"s"}}},b=eG();cG(a,b);return a};class gG{Yo(a,b){var c=["data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA5LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDksMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbD0iI0RENEIzOCIgZD0iTTIxLjA0MSwyOXY5Ljg0NGMwLDUuNTA4LDQuNjkxLDkuOTczLDEwLjQ3OSw5Ljk3M2M1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTczVjI5SDIxLjA0MXoiLz4NCjxwYXRoIGZpbGw9IiNERDRCMzgiIGQ9Ik0yNi41NTgsMjl2LTcuNjg5YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MlYyOWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNFYyOUgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjEuMDQxLDI4LjIwNnY5Ljg0NWMwLDUuNTA2LDQuNjkxLDkuOTcxLDEwLjQ3OSw5Ljk3MWM1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTcxdi05Ljg0NUgyMS4wNDF6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjYuNTU4LDI4LjA0VjIwLjM1YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MnY3LjY4OWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNHY4LjA1NEgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRjA4RjgyIiBkPSJNMzQsMzYuMzY1YzAtMS4yODctMS4wNDQtMi4zMzEtMi4zMzEtMi4zMzFjLTEuMjg4LDAtMi4zMzIsMS4wNDQtMi4zMzIsMi4zMzENCgljMCwwLjk3MSwwLjU5NCwxLjgwMiwxLjQzOCwyLjE1MnY0LjQ2N2gxLjkxdi00LjUyOUMzMy40NjEsMzguMDc2LDM0LDM3LjI4NywzNCwzNi4zNjV6Ii8+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA4LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDgsMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik01OS42NDYsMzFoLTMuMjkzQzU2LjE1OCwzMSw1NiwzMS40NDgsNTYsMzINCgljMCwwLjU1MywwLjE1OCwxLDAuMzU0LDFoMy4yOTNDNTkuODQyLDMzLDYwLDMyLjU1Myw2MCwzMkM2MCwzMS40NDgsNTkuODQyLDMxLDU5LjY0NiwzMXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjREQ0QjM4IiBkPSJNNi42NDcsMzFIMy4zNTNDMy4xNTgsMzEsMywzMS40NDgsMywzMmMwLDAuNTUzLDAuMTU4LDEsMC4zNTMsMQ0KCWgzLjI5NEM2Ljg0MiwzMyw3LDMyLjU1Myw3LDMyQzcsMzEuNDQ4LDYuODQyLDMxLDYuNjQ3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik0zMSw4YzAuNTUzLDAsMS0wLjE1OCwxLTAuMzUzVjQuMzUzQzMyLDQuMTU4LDMxLjU1Myw0LDMxLDQNCgljLTAuNTUyLDAtMSwwLjE1OC0xLDAuMzUzdjMuMjk0QzMwLDcuODQyLDMwLjQ0OCw4LDMxLDh6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTMxLDU2Yy0wLjU1MiwwLTEsMC4xNTgtMSwwLjM1NHYzLjI5M0MzMCw1OS44NDIsMzAuNDQ4LDYwLDMxLDYwDQoJYzAuNTUzLDAsMS0wLjE1OCwxLTAuMzU0di0zLjI5M0MzMiw1Ni4xNTgsMzEuNTUzLDU2LDMxLDU2eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik00Ny42NjgsMzFoLTEyLjgxQzM0LjQ5NiwyOS42LDMzLjQsMjguNTA1LDMyLDI4LjE0Mg0KCWMwLDAtMC4xNzItMC4xNDItMS0wLjE0MmMtMC44MjksMC0yLDAuNTU1LTIsMC41NTVjLTEuMTksMC42OTMtMiwxLjk2OS0yLDMuNDQ1YzAsMi4yMDksMS43OTEsNCw0LDRjMS40NzcsMCwyLjc1Mi0wLjgwOSwzLjQ0NS0yDQoJaDEzLjIyM0M0OC40MDQsMzQsNDksMzMuMzI4LDQ5LDMyLjVDNDksMzEuNjcyLDQ4LjQwNCwzMSw0Ny42NjgsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTI3LjAxOCwyOS43NDhjMC41OTIsMS4wMjUsMS42NTIsMS41MiwyLjM3LDEuMTA2bDAsMA0KCWMwLjcxNy0wLjQxNSwwLjgxOS0xLjU4MSwwLjIyOC0yLjYwNmwtNy44NTctMTMuNjA5Yy0wLjU5Mi0xLjAyNC0xLjY1My0xLjUyLTIuMzcxLTEuMTA2bDAsMGMtMC43MTcsMC40MTUtMC44MTgsMS41ODEtMC4yMjgsMi42MDUNCglMMjcuMDE4LDI5Ljc0OHoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMjcuMDE4LDI4LjM2MWMwLjU5MiwxLjAyNSwxLjY1MiwxLjUyLDIuMzcsMS4xMDZsMCwwDQoJYzAuNzE3LTAuNDE1LDAuODE5LTEuNTgxLDAuMjI4LTIuNjA2bC03Ljg1Ny0xMy42MDljLTAuNTkyLTEuMDI0LTEuNjUzLTEuNTItMi4zNzEtMS4xMDZsMCwwYy0wLjcxNywwLjQxNS0wLjgxOCwxLjU4MS0wLjIyOCwyLjYwNQ0KCUwyNy4wMTgsMjguMzYxeiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgY3g9IjMxIiBjeT0iMzEiIHI9IjQiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNjAsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzU0LDFoLTMuMjkzQzU2LjE1OCwzMiw1NiwzMS41NTIsNTYsMzENCglsMCwwYzAtMC41NTIsMC4xNTgtMSwwLjM1NC0xaDMuMjkzQzU5Ljg0MiwzMCw2MCwzMC40NDgsNjAsMzFMNjAsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTcsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzUzLDFIMy4zNTNDMy4xNTgsMzIsMywzMS41NTIsMywzMWwwLDANCgljMC0wLjU1MiwwLjE1OC0xLDAuMzUzLTFoMy4yOTRDNi44NDIsMzAsNywzMC40NDgsNywzMUw3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0zMSwzYzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDYuODQyLDMxLjU1Myw3LDMxLDdsMCwwDQoJYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1M1YzLjM1M0MzMCwzLjE1OCwzMC40NDgsMywzMSwzTDMxLDN6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTMxLDU1YzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDU4Ljg0MiwzMS41NTMsNTksMzEsNTkNCglsMCwwYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1NHYtMy4yOTRDMzAsNTUuMTU4LDMwLjQ0OCw1NSwzMSw1NUwzMSw1NXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNDksMzEuNDk5QzQ5LDMwLjY3Miw0OC40MDQsMzAsNDcuNjY4LDMwSDM0LjMzMw0KCUMzMy41OTYsMzAsMzMsMzAuNjcxLDMzLDMxLjVsMCwwYzAsMC44MjgsMC41OTYsMS41LDEuMzMzLDEuNWgxMy4zMzVDNDguNDA0LDMzLDQ5LDMyLjMyOCw0OSwzMS40OTlMNDksMzEuNDk5eiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YxNjE1NSIgY3g9IjMxIiBjeT0iMzEiIHI9IjIiLz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPgo8cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHJ4PSI2IiBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIwLjciLz4KPGcgb3BhY2l0eT0iMC44IiBjbGlwLXBhdGg9InVybCgjY2xpcDApIj4KPHBhdGggZD0iTTUzLjUgMjQuODk4NEg1MkM1MS42MDIyIDI0Ljg5ODQgNTEuMjIwNiAyNS4wNTYgNTAuOTM5MyAyNS4zMzY0QzUwLjY1OCAyNS42MTY5IDUwLjUgMjUuOTk3MiA1MC41IDI2LjM5MzhDNTAuNSAyNi43OTA0IDUwLjY1OCAyNy4xNzA4IDUwLjkzOTMgMjcuNDUxMkM1MS4yMjA2IDI3LjczMTYgNTEuNjAyMiAyNy44ODkyIDUyIDI3Ljg4OTJINTMuNUM1My44OTc4IDI3Ljg4OTIgNTQuMjc5NCAyOC4wNDY3IDU0LjU2MDcgMjguMzI3MkM1NC44NDIgMjguNjA3NiA1NSAyOC45ODggNTUgMjkuMzg0NlY0MS4zODQ5QzUzLjcwOTMgNDAuMzk1OCA1Mi4xMjggMzkuODU3MiA1MC41IDM5Ljg1MjJDNDkuMjcxNyAzOS44NTI4IDQ4LjA2MjQgNDAuMTU0MSA0Ni45NzgzIDQwLjcyOTdDNDUuODk0MiA0MS4zMDUzIDQ0Ljk2ODUgNDIuMTM3NSA0NC4yODI1IDQzLjE1MzJDNDMuNzI2MSA0Mi41ODIxIDQzLjA2MDMgNDIuMTI4MSA0Mi4zMjQ4IDQxLjgxOEM0MS41ODkyIDQxLjUwOCA0MC43OTg2IDQxLjM0ODMgNDAgNDEuMzQ4M0MzOS4yMDE0IDQxLjM0ODMgMzguNDEwOCA0MS41MDggMzcuNjc1MiA0MS44MThDMzYuOTM5NyA0Mi4xMjgxIDM2LjI3MzkgNDIuNTgyMSAzNS43MTc1IDQzLjE1MzJDMzUuMDMxNSA0Mi4xMzc1IDM0LjEwNTggNDEuMzA1MyAzMy4wMjE3IDQwLjcyOTdDMzEuOTM3NiA0MC4xNTQxIDMwLjcyODMgMzkuODUyOCAyOS41IDM5Ljg1MjJDMjcuODcyIDM5Ljg1NzIgMjYuMjkwNyA0MC4zOTU4IDI1IDQxLjM4NDlWMjkuMzg0NkMyNSAyOC45ODggMjUuMTU4IDI4LjYwNzYgMjUuNDM5MyAyOC4zMjcyQzI1LjcyMDYgMjguMDQ2NyAyNi4xMDIyIDI3Ljg4OTIgMjYuNSAyNy44ODkySDI4QzI4LjM5NzggMjcuODg5MiAyOC43Nzk0IDI3LjczMTYgMjkuMDYwNyAyNy40NTEyQzI5LjM0MiAyNy4xNzA4IDI5LjUgMjYuNzkwNCAyOS41IDI2LjM5MzhDMjkuNSAyNS45OTcyIDI5LjM0MiAyNS42MTY5IDI5LjA2MDcgMjUuMzM2NEMyOC43Nzk0IDI1LjA1NiAyOC4zOTc4IDI0Ljg5ODQgMjggMjQuODk4NEgyNi41QzI1LjMwNjUgMjQuODk4NCAyNC4xNjE5IDI1LjM3MTEgMjMuMzE4IDI2LjIxMjRDMjIuNDc0MSAyNy4wNTM3IDIyIDI4LjE5NDggMjIgMjkuMzg0NlY0Ny4zMjkxQzIyIDQ5LjMxMjEgMjIuNzkwMiA1MS4yMTM4IDI0LjE5NjcgNTIuNjE2QzI1LjYwMzIgNTQuMDE4MiAyNy41MTA5IDU0LjgwNTkgMjkuNSA1NC44MDU5QzMxLjQ4OTEgNTQuODA1OSAzMy4zOTY4IDU0LjAxODIgMzQuODAzMyA1Mi42MTZDMzYuMjA5OCA1MS4yMTM4IDM3IDQ5LjMxMjEgMzcgNDcuMzI5MUMzNyA0Ni41MzU5IDM3LjMxNjEgNDUuNzc1MiAzNy44Nzg3IDQ1LjIxNDNDMzguNDQxMyA0NC42NTM0IDM5LjIwNDQgNDQuMzM4MyA0MCA0NC4zMzgzQzQwLjc5NTYgNDQuMzM4MyA0MS41NTg3IDQ0LjY1MzQgNDIuMTIxMyA0NS4yMTQzQzQyLjY4MzkgNDUuNzc1MiA0MyA0Ni41MzU5IDQzIDQ3LjMyOTFDNDMgNDkuMzEyMSA0My43OTAyIDUxLjIxMzggNDUuMTk2NyA1Mi42MTZDNDYuNjAzMiA1NC4wMTgyIDQ4LjUxMDkgNTQuODA1OSA1MC41IDU0LjgwNTlDNTIuNDg5MSA1NC44MDU5IDU0LjM5NjggNTQuMDE4MiA1NS44MDMzIDUyLjYxNkM1Ny4yMDk4IDUxLjIxMzggNTggNDkuMzEyMSA1OCA0Ny4zMjkxVjI5LjM4NDZDNTggMjguMTk0OCA1Ny41MjU5IDI3LjA1MzcgNTYuNjgyIDI2LjIxMjRDNTUuODM4MSAyNS4zNzExIDU0LjY5MzUgMjQuODk4NCA1My41IDI0Ljg5ODRaTTI5LjUgNTEuODE1MkMyOC42MSA1MS44MTUyIDI3Ljc0IDUxLjU1MjEgMjYuOTk5OSA1MS4wNTkxQzI2LjI1OTkgNTAuNTY2MiAyNS42ODMxIDQ5Ljg2NTYgMjUuMzQyNSA0OS4wNDU4QzI1LjAwMTkgNDguMjI2MSAyNC45MTI4IDQ3LjMyNDEgMjUuMDg2NSA0Ni40NTM5QzI1LjI2MDEgNDUuNTgzNiAyNS42ODg3IDQ0Ljc4NDMgMjYuMzE4IDQ0LjE1NjlDMjYuOTQ3NCA0My41Mjk1IDI3Ljc0OTIgNDMuMTAyMiAyOC42MjIxIDQyLjkyOTFDMjkuNDk1IDQyLjc1NiAzMC4zOTk4IDQyLjg0NDkgMzEuMjIyMSA0My4xODQ0QzMyLjA0NDMgNDMuNTI0IDMyLjc0NzEgNDQuMDk5IDMzLjI0MTYgNDQuODM2N0MzMy43MzYxIDQ1LjU3NDQgMzQgNDYuNDQxOCAzNCA0Ny4zMjkxQzM0IDQ4LjUxODkgMzMuNTI1OSA0OS42NTk5IDMyLjY4MiA1MC41MDEyQzMxLjgzODEgNTEuMzQyNSAzMC42OTM1IDUxLjgxNTIgMjkuNSA1MS44MTUyWk01MC41IDUxLjgxNTJDNDkuNjEgNTEuODE1MiA0OC43NCA1MS41NTIxIDQ3Ljk5OTkgNTEuMDU5MUM0Ny4yNTk5IDUwLjU2NjIgNDYuNjgzMSA0OS44NjU2IDQ2LjM0MjUgNDkuMDQ1OEM0Ni4wMDE5IDQ4LjIyNjEgNDUuOTEyOCA0Ny4zMjQxIDQ2LjA4NjUgNDYuNDUzOUM0Ni4yNjAxIDQ1LjU4MzYgNDYuNjg4NyA0NC43ODQzIDQ3LjMxOCA0NC4xNTY5QzQ3Ljk0NzQgNDMuNTI5NSA0OC43NDkyIDQzLjEwMjIgNDkuNjIyMSA0Mi45MjkxQzUwLjQ5NSA0Mi43NTYgNTEuMzk5OCA0Mi44NDQ5IDUyLjIyMjEgNDMuMTg0NEM1My4wNDQzIDQzLjUyNCA1My43NDcxIDQ0LjA5OSA1NC4yNDE2IDQ0LjgzNjdDNTQuNzM2MSA0NS41NzQ0IDU1IDQ2LjQ0MTggNTUgNDcuMzI5MUM1NSA0OC41MTg5IDU0LjUyNTkgNDkuNjU5OSA1My42ODIgNTAuNTAxMkM1Mi44MzgxIDUxLjM0MjUgNTEuNjkzNSA1MS44MTUyIDUwLjUgNTEuODE1MloiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OCA1Ny45MTQxTDIyIDIxLjkxNDEiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iMyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjwvZz4KPC9nPgo8ZGVmcz4KPGZpbHRlciBpZD0iZmlsdGVyMF9kIiB4PSIwIiB5PSIwIiB3aWR0aD0iODAiIGhlaWdodD0iODAiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLz4KPGZlT2Zmc2V0Lz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIvPgo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4yNSAwIi8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93Ii8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9kcm9wU2hhZG93IiByZXN1bHQ9InNoYXBlIi8+CjwvZmlsdGVyPgo8Y2xpcFBhdGggaWQ9ImNsaXAwIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjM5Ljg3NjciIGZpbGw9IndoaXRlIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMCAxOS45MTQxKSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPgo8cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHJ4PSI2IiBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIwLjgiLz4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwKSI+CjxwYXRoIGQ9Ik01My41IDI0Ljg5ODRINTJDNTEuNjAyMiAyNC44OTg0IDUxLjIyMDYgMjUuMDU2IDUwLjkzOTMgMjUuMzM2NEM1MC42NTggMjUuNjE2OSA1MC41IDI1Ljk5NzIgNTAuNSAyNi4zOTM4QzUwLjUgMjYuNzkwNCA1MC42NTggMjcuMTcwOCA1MC45MzkzIDI3LjQ1MTJDNTEuMjIwNiAyNy43MzE2IDUxLjYwMjIgMjcuODg5MiA1MiAyNy44ODkySDUzLjVDNTMuODk3OCAyNy44ODkyIDU0LjI3OTQgMjguMDQ2NyA1NC41NjA3IDI4LjMyNzJDNTQuODQyIDI4LjYwNzYgNTUgMjguOTg4IDU1IDI5LjM4NDZWNDEuMzg0OUM1My43MDkzIDQwLjM5NTggNTIuMTI4IDM5Ljg1NzIgNTAuNSAzOS44NTIyQzQ5LjI3MTcgMzkuODUyOCA0OC4wNjI0IDQwLjE1NDEgNDYuOTc4MyA0MC43Mjk3QzQ1Ljg5NDIgNDEuMzA1MyA0NC45Njg1IDQyLjEzNzUgNDQuMjgyNSA0My4xNTMyQzQzLjcyNjEgNDIuNTgyMSA0My4wNjAzIDQyLjEyODEgNDIuMzI0OCA0MS44MThDNDEuNTg5MiA0MS41MDggNDAuNzk4NiA0MS4zNDgzIDQwIDQxLjM0ODNDMzkuMjAxNCA0MS4zNDgzIDM4LjQxMDggNDEuNTA4IDM3LjY3NTIgNDEuODE4QzM2LjkzOTcgNDIuMTI4MSAzNi4yNzM5IDQyLjU4MjEgMzUuNzE3NSA0My4xNTMyQzM1LjAzMTUgNDIuMTM3NSAzNC4xMDU4IDQxLjMwNTMgMzMuMDIxNyA0MC43Mjk3QzMxLjkzNzYgNDAuMTU0MSAzMC43MjgzIDM5Ljg1MjggMjkuNSAzOS44NTIyQzI3Ljg3MiAzOS44NTcyIDI2LjI5MDcgNDAuMzk1OCAyNSA0MS4zODQ5VjI5LjM4NDZDMjUgMjguOTg4IDI1LjE1OCAyOC42MDc2IDI1LjQzOTMgMjguMzI3MkMyNS43MjA2IDI4LjA0NjcgMjYuMTAyMiAyNy44ODkyIDI2LjUgMjcuODg5MkgyOEMyOC4zOTc4IDI3Ljg4OTIgMjguNzc5NCAyNy43MzE2IDI5LjA2MDcgMjcuNDUxMkMyOS4zNDIgMjcuMTcwOCAyOS41IDI2Ljc5MDQgMjkuNSAyNi4zOTM4QzI5LjUgMjUuOTk3MiAyOS4zNDIgMjUuNjE2OSAyOS4wNjA3IDI1LjMzNjRDMjguNzc5NCAyNS4wNTYgMjguMzk3OCAyNC44OTg0IDI4IDI0Ljg5ODRIMjYuNUMyNS4zMDY1IDI0Ljg5ODQgMjQuMTYxOSAyNS4zNzExIDIzLjMxOCAyNi4yMTI0QzIyLjQ3NDEgMjcuMDUzNyAyMiAyOC4xOTQ4IDIyIDI5LjM4NDZWNDcuMzI5MUMyMiA0OS4zMTIxIDIyLjc5MDIgNTEuMjEzOCAyNC4xOTY3IDUyLjYxNkMyNS42MDMyIDU0LjAxODIgMjcuNTEwOSA1NC44MDU5IDI5LjUgNTQuODA1OUMzMS40ODkxIDU0LjgwNTkgMzMuMzk2OCA1NC4wMTgyIDM0LjgwMzMgNTIuNjE2QzM2LjIwOTggNTEuMjEzOCAzNyA0OS4zMTIxIDM3IDQ3LjMyOTFDMzcgNDYuNTM1OSAzNy4zMTYxIDQ1Ljc3NTIgMzcuODc4NyA0NS4yMTQzQzM4LjQ0MTMgNDQuNjUzNCAzOS4yMDQ0IDQ0LjMzODMgNDAgNDQuMzM4M0M0MC43OTU2IDQ0LjMzODMgNDEuNTU4NyA0NC42NTM0IDQyLjEyMTMgNDUuMjE0M0M0Mi42ODM5IDQ1Ljc3NTIgNDMgNDYuNTM1OSA0MyA0Ny4zMjkxQzQzIDQ5LjMxMjEgNDMuNzkwMiA1MS4yMTM4IDQ1LjE5NjcgNTIuNjE2QzQ2LjYwMzIgNTQuMDE4MiA0OC41MTA5IDU0LjgwNTkgNTAuNSA1NC44MDU5QzUyLjQ4OTEgNTQuODA1OSA1NC4zOTY4IDU0LjAxODIgNTUuODAzMyA1Mi42MTZDNTcuMjA5OCA1MS4yMTM4IDU4IDQ5LjMxMjEgNTggNDcuMzI5MVYyOS4zODQ2QzU4IDI4LjE5NDggNTcuNTI1OSAyNy4wNTM3IDU2LjY4MiAyNi4yMTI0QzU1LjgzODEgMjUuMzcxMSA1NC42OTM1IDI0Ljg5ODQgNTMuNSAyNC44OTg0Wk0yOS41IDUxLjgxNTJDMjguNjEgNTEuODE1MiAyNy43NCA1MS41NTIxIDI2Ljk5OTkgNTEuMDU5MUMyNi4yNTk5IDUwLjU2NjIgMjUuNjgzMSA0OS44NjU2IDI1LjM0MjUgNDkuMDQ1OEMyNS4wMDE5IDQ4LjIyNjEgMjQuOTEyOCA0Ny4zMjQxIDI1LjA4NjUgNDYuNDUzOUMyNS4yNjAxIDQ1LjU4MzYgMjUuNjg4NyA0NC43ODQzIDI2LjMxOCA0NC4xNTY5QzI2Ljk0NzQgNDMuNTI5NSAyNy43NDkyIDQzLjEwMjIgMjguNjIyMSA0Mi45MjkxQzI5LjQ5NSA0Mi43NTYgMzAuMzk5OCA0Mi44NDQ5IDMxLjIyMjEgNDMuMTg0NEMzMi4wNDQzIDQzLjUyNCAzMi43NDcxIDQ0LjA5OSAzMy4yNDE2IDQ0LjgzNjdDMzMuNzM2MSA0NS41NzQ0IDM0IDQ2LjQ0MTggMzQgNDcuMzI5MUMzNCA0OC41MTg5IDMzLjUyNTkgNDkuNjU5OSAzMi42ODIgNTAuNTAxMkMzMS44MzgxIDUxLjM0MjUgMzAuNjkzNSA1MS44MTUyIDI5LjUgNTEuODE1MlpNNTAuNSA1MS44MTUyQzQ5LjYxIDUxLjgxNTIgNDguNzQgNTEuNTUyMSA0Ny45OTk5IDUxLjA1OTFDNDcuMjU5OSA1MC41NjYyIDQ2LjY4MzEgNDkuODY1NiA0Ni4zNDI1IDQ5LjA0NThDNDYuMDAxOSA0OC4yMjYxIDQ1LjkxMjggNDcuMzI0MSA0Ni4wODY1IDQ2LjQ1MzlDNDYuMjYwMSA0NS41ODM2IDQ2LjY4ODcgNDQuNzg0MyA0Ny4zMTggNDQuMTU2OUM0Ny45NDc0IDQzLjUyOTUgNDguNzQ5MiA0My4xMDIyIDQ5LjYyMjEgNDIuOTI5MUM1MC40OTUgNDIuNzU2IDUxLjM5OTggNDIuODQ0OSA1Mi4yMjIxIDQzLjE4NDRDNTMuMDQ0MyA0My41MjQgNTMuNzQ3MSA0NC4wOTkgNTQuMjQxNiA0NC44MzY3QzU0LjczNjEgNDUuNTc0NCA1NSA0Ni40NDE4IDU1IDQ3LjMyOTFDNTUgNDguNTE4OSA1NC41MjU5IDQ5LjY1OTkgNTMuNjgyIDUwLjUwMTJDNTIuODM4MSA1MS4zNDI1IDUxLjY5MzUgNTEuODE1MiA1MC41IDUxLjgxNTJaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNTggNTcuOTE0MUwyMiAyMS45MTQxIiBzdHJva2U9IndoaXRlIiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L2c+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZCIgeD0iMCIgeT0iMCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjgwIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIi8+CjxmZU9mZnNldC8+CjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjQiLz4KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvdyIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvdyIgcmVzdWx0PSJzaGFwZSIvPgo8L2ZpbHRlcj4KPGNsaXBQYXRoIGlkPSJjbGlwMCI+CjxyZWN0IHdpZHRoPSI0MCIgaGVpZ2h0PSIzOS44NzY3IiBmaWxsPSJ3aGl0ZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjAgMTkuOTE0MSkiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iNiIgZmlsbD0iYmxhY2siIGZpbGwtb3BhY2l0eT0iMC44Ii8+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiPgo8cGF0aCBkPSJNNDUuNSAxNi44OTg0SDQ0QzQzLjYwMjIgMTYuODk4NCA0My4yMjA2IDE3LjA1NiA0Mi45MzkzIDE3LjMzNjRDNDIuNjU4IDE3LjYxNjkgNDIuNSAxNy45OTcyIDQyLjUgMTguMzkzOEM0Mi41IDE4Ljc5MDQgNDIuNjU4IDE5LjE3MDggNDIuOTM5MyAxOS40NTEyQzQzLjIyMDYgMTkuNzMxNiA0My42MDIyIDE5Ljg4OTIgNDQgMTkuODg5Mkg0NS41QzQ1Ljg5NzggMTkuODg5MiA0Ni4yNzk0IDIwLjA0NjcgNDYuNTYwNyAyMC4zMjcyQzQ2Ljg0MiAyMC42MDc2IDQ3IDIwLjk4OCA0NyAyMS4zODQ2VjMzLjM4NDlDNDUuNzA5MyAzMi4zOTU4IDQ0LjEyOCAzMS44NTcyIDQyLjUgMzEuODUyMkM0MS4yNzE3IDMxLjg1MjggNDAuMDYyNCAzMi4xNTQxIDM4Ljk3ODMgMzIuNzI5N0MzNy44OTQyIDMzLjMwNTMgMzYuOTY4NSAzNC4xMzc1IDM2LjI4MjUgMzUuMTUzMkMzNS43MjYxIDM0LjU4MjEgMzUuMDYwMyAzNC4xMjgxIDM0LjMyNDggMzMuODE4QzMzLjU4OTIgMzMuNTA4IDMyLjc5ODYgMzMuMzQ4MyAzMiAzMy4zNDgzQzMxLjIwMTQgMzMuMzQ4MyAzMC40MTA4IDMzLjUwOCAyOS42NzUyIDMzLjgxOEMyOC45Mzk3IDM0LjEyODEgMjguMjczOSAzNC41ODIxIDI3LjcxNzUgMzUuMTUzMkMyNy4wMzE1IDM0LjEzNzUgMjYuMTA1OCAzMy4zMDUzIDI1LjAyMTcgMzIuNzI5N0MyMy45Mzc2IDMyLjE1NDEgMjIuNzI4MyAzMS44NTI4IDIxLjUgMzEuODUyMkMxOS44NzIgMzEuODU3MiAxOC4yOTA3IDMyLjM5NTggMTcgMzMuMzg0OVYyMS4zODQ2QzE3IDIwLjk4OCAxNy4xNTggMjAuNjA3NiAxNy40MzkzIDIwLjMyNzJDMTcuNzIwNiAyMC4wNDY3IDE4LjEwMjIgMTkuODg5MiAxOC41IDE5Ljg4OTJIMjBDMjAuMzk3OCAxOS44ODkyIDIwLjc3OTQgMTkuNzMxNiAyMS4wNjA3IDE5LjQ1MTJDMjEuMzQyIDE5LjE3MDggMjEuNSAxOC43OTA0IDIxLjUgMTguMzkzOEMyMS41IDE3Ljk5NzIgMjEuMzQyIDE3LjYxNjkgMjEuMDYwNyAxNy4zMzY0QzIwLjc3OTQgMTcuMDU2IDIwLjM5NzggMTYuODk4NCAyMCAxNi44OTg0SDE4LjVDMTcuMzA2NSAxNi44OTg0IDE2LjE2MTkgMTcuMzcxMSAxNS4zMTggMTguMjEyNEMxNC40NzQxIDE5LjA1MzcgMTQgMjAuMTk0OCAxNCAyMS4zODQ2VjM5LjMyOTFDMTQgNDEuMzEyMSAxNC43OTAyIDQzLjIxMzggMTYuMTk2NyA0NC42MTZDMTcuNjAzMiA0Ni4wMTgyIDE5LjUxMDkgNDYuODA1OSAyMS41IDQ2LjgwNTlDMjMuNDg5MSA0Ni44MDU5IDI1LjM5NjggNDYuMDE4MiAyNi44MDMzIDQ0LjYxNkMyOC4yMDk4IDQzLjIxMzggMjkgNDEuMzEyMSAyOSAzOS4zMjkxQzI5IDM4LjUzNTkgMjkuMzE2MSAzNy43NzUyIDI5Ljg3ODcgMzcuMjE0M0MzMC40NDEzIDM2LjY1MzQgMzEuMjA0NCAzNi4zMzgzIDMyIDM2LjMzODNDMzIuNzk1NiAzNi4zMzgzIDMzLjU1ODcgMzYuNjUzNCAzNC4xMjEzIDM3LjIxNDNDMzQuNjgzOSAzNy43NzUyIDM1IDM4LjUzNTkgMzUgMzkuMzI5MUMzNSA0MS4zMTIxIDM1Ljc5MDIgNDMuMjEzOCAzNy4xOTY3IDQ0LjYxNkMzOC42MDMyIDQ2LjAxODIgNDAuNTEwOSA0Ni44MDU5IDQyLjUgNDYuODA1OUM0NC40ODkxIDQ2LjgwNTkgNDYuMzk2OCA0Ni4wMTgyIDQ3LjgwMzMgNDQuNjE2QzQ5LjIwOTggNDMuMjEzOCA1MCA0MS4zMTIxIDUwIDM5LjMyOTFWMjEuMzg0NkM1MCAyMC4xOTQ4IDQ5LjUyNTkgMTkuMDUzNyA0OC42ODIgMTguMjEyNEM0Ny44MzgxIDE3LjM3MTEgNDYuNjkzNSAxNi44OTg0IDQ1LjUgMTYuODk4NFpNMjEuNSA0My44MTUyQzIwLjYxIDQzLjgxNTIgMTkuNzQgNDMuNTUyMSAxOC45OTk5IDQzLjA1OTFDMTguMjU5OSA0Mi41NjYyIDE3LjY4MzEgNDEuODY1NiAxNy4zNDI1IDQxLjA0NThDMTcuMDAxOSA0MC4yMjYxIDE2LjkxMjggMzkuMzI0MSAxNy4wODY1IDM4LjQ1MzlDMTcuMjYwMSAzNy41ODM2IDE3LjY4ODcgMzYuNzg0MyAxOC4zMTggMzYuMTU2OUMxOC45NDc0IDM1LjUyOTUgMTkuNzQ5MiAzNS4xMDIyIDIwLjYyMjEgMzQuOTI5MUMyMS40OTUgMzQuNzU2IDIyLjM5OTggMzQuODQ0OSAyMy4yMjIxIDM1LjE4NDRDMjQuMDQ0MyAzNS41MjQgMjQuNzQ3MSAzNi4wOTkgMjUuMjQxNiAzNi44MzY3QzI1LjczNjEgMzcuNTc0NCAyNiAzOC40NDE4IDI2IDM5LjMyOTFDMjYgNDAuNTE4OSAyNS41MjU5IDQxLjY1OTkgMjQuNjgyIDQyLjUwMTJDMjMuODM4MSA0My4zNDI1IDIyLjY5MzUgNDMuODE1MiAyMS41IDQzLjgxNTJaTTQyLjUgNDMuODE1MkM0MS42MSA0My44MTUyIDQwLjc0IDQzLjU1MjEgMzkuOTk5OSA0My4wNTkxQzM5LjI1OTkgNDIuNTY2MiAzOC42ODMxIDQxLjg2NTYgMzguMzQyNSA0MS4wNDU4QzM4LjAwMTkgNDAuMjI2MSAzNy45MTI4IDM5LjMyNDEgMzguMDg2NSAzOC40NTM5QzM4LjI2MDEgMzcuNTgzNiAzOC42ODg3IDM2Ljc4NDMgMzkuMzE4IDM2LjE1NjlDMzkuOTQ3NCAzNS41Mjk1IDQwLjc0OTIgMzUuMTAyMiA0MS42MjIxIDM0LjkyOTFDNDIuNDk1IDM0Ljc1NiA0My4zOTk4IDM0Ljg0NDkgNDQuMjIyMSAzNS4xODQ0QzQ1LjA0NDMgMzUuNTI0IDQ1Ljc0NzEgMzYuMDk5IDQ2LjI0MTYgMzYuODM2N0M0Ni43MzYxIDM3LjU3NDQgNDcgMzguNDQxOCA0NyAzOS4zMjkxQzQ3IDQwLjUxODkgNDYuNTI1OSA0MS42NTk5IDQ1LjY4MiA0Mi41MDEyQzQ0LjgzODEgNDMuMzQyNSA0My42OTM1IDQzLjgxNTIgNDIuNSA0My44MTUyWiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTUwIDQ5LjkxNDFMMTQgMTMuOTE0MSIgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMCI+CjxyZWN0IHdpZHRoPSI0MCIgaGVpZ2h0PSIzOS44NzY3IiBmaWxsPSJ3aGl0ZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIgMTEuOTE0MSkiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K"]; +c=".trial_banner {position: relative;transform: translateZ(0); } .trial_banner .banner-content, .trial_banner .banner-content_hover {position: absolute;left: 0;right: 0;top: 0;bottom: 0;width: 100%;height: 100%; } .trial_banner .banner-content {visibility: visible;z-index: 1; } .trial_banner .banner-content_hover {visibility: hidden;z-index: 0; } .trial_banner .days_remaining {position: absolute;font-family: 'Open Sans', Arial, sans-serif;font-weight: normal;font-size: 13px;left: 65px;top: 41px;color: #7C1645;z-index: 1; } .trial_banner:hover .banner-content {visibility: hidden;z-index: 0; } .trial_banner:hover .banner-content_hover {visibility: visible;z-index: 1; }body {margin: 0;overflow-y: auto;overflow-x: hidden; } body .password_form, body .info_panel {position: absolute;background: #F7F7F7;border-radius: 4px;width: 513px;height: 210px;font-family: Arial; } body .password_form *, body .info_panel * {box-sizing: border-box; } body .password_form .password_label {position: absolute;color: #3A3A3A;font-size: 15px;top: 63px;left: 55px; } body .password_form .wrong_password_label {position: absolute;color: #DD4A37;font-size: 12px;top: 131px;left: 55px; } body .password_form input {position: absolute;width: 330px;height: 32px;background: #FFFFFF;border: 1px solid #D1D2D4;padding: 1px;border-radius: 2px;font-size: 18px;color: #231F20;left: 54px;top: 94px;padding-left: 8px; } body .password_form button {border: transparent;background: transparent;color: #343434;font-family: Arial;font-size: 15px;text-shadow: 0 1px 0 rgba(255, 255, 255, 0.4); } body .password_form button::before {background: linear-gradient(to bottom, #D3D3D3, #BABABA);position: absolute;content: '';top: 0;right: 0;bottom: 0;left: 0;border-radius: 4px;z-index: -1; } body .password_form button::after {background: linear-gradient(to bottom, #DCDCDC, #D1D1D1);position: absolute;content: '';top: 1px;right: 1px;bottom: 1px;left: 1px;border-radius: 4px;z-index: -1; } body .password_form .btn_ok {position: absolute;top: 94px;right: 55px;width: 60px;height: 32px;opacity: 0.99; } body .info_panel {display: table; } body .info_panel .label {position: static;display: table-cell;vertical-align: middle;width: 100%;padding-left: 120px;padding-right: 40px;color: #3A3A3A;font-size: 15px; } body .info_panel::after {position: absolute;content: '';width: 63px;height: 63px;top: 73px;left: 46px; } body .info_panel.domain::after {background: transparent url("+ +c[0]+"); } body .info_panel.time::after {background: transparent url("+c[1]+"); }#playerView * {position: static; }#playerView {position: static; }#content {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;padding: 0 96px;background: #CED1D3; }.presentation-view-mode-switch-control {width: 64px;height: 64px;position: fixed;left: 16px;top: 16px;cursor: pointer;border: none;background: url("+c[2]+") no-repeat center; } .presentation-view-mode-switch-control:hover {background: url("+ +c[3]+") no-repeat center; } .presentation-view-mode-switch-control:active {background: url("+c[4]+") no-repeat center; } .presentation-view-mode-switch-control:focus {outline: none; }.ppt-accessible-skin {font-family: Segoe UI, sans-serif;font-size: 20px;font-weight: normal;min-width: 0;padding: 20px 64px 20px 64px;box-sizing: border-box;background: #FFFFFF; }.accessible-null-skin {font-family: Segoe UI, sans-serif;font-size: 20px;font-weight: normal;min-width: 0;padding: 20px 64px 20px 64px;box-sizing: border-box;background: #FFFFFF; }.ppt-accessible-slide {margin-bottom: 20px; } .ppt-accessible-slide img, .ppt-accessible-slide video, .ppt-accessible-slide audio {display: block;margin: 32px 0 32px 0; } .ppt-accessible-slide img {max-width: 100%;max-height: 30%; } .ppt-accessible-slide video {max-width: 100%; }.ppt-accessible-top-panel {margin-bottom: 20px; } .ppt-accessible-top-panel__slide-status {font-size: 20px;font-weight: 400; }.ppt-accessible-narration {margin: 16px 0; } .ppt-accessible-narration video {max-width: 100%; }.ppt-accessible-slide-content p {margin: 16px 0; }.ppt-accessible-slide-content h2 {font-size: 30px;margin: 0; }.ppt-accessible-skip-link-container {position: relative;height: 27px; }.ppt-accessible-skip-link {position: absolute !important;display: block;left: -10000px;width: 1px;height: 1px;overflow: hidden; } .ppt-accessible-skip-link:focus {left: auto;width: auto;height: auto; }.simple-navigation-panel {margin-top: 32px;margin-bottom: 32px;float: left;direction: rtl; } .simple-navigation-panel__button {width: 217px;height: 46px;font-family: Segoe UI, sans-serif;font-size: 20px;font-weight: normal; } .simple-navigation-panel__button:nth-child(1) {margin-left: 12px; }.ppt-accessible-slide-list-wrapper {clear: both; }.ppt-accessible-slide-list {clear: both;margin: 16px 0;margin-top: 0; } .ppt-accessible-slide-list summary {font-weight: 600;margin-bottom: 8px; } .ppt-accessible-slide-list ul {padding: 0;margin: 0; } .ppt-accessible-slide-list__item {list-style: none; } .ppt-accessible-slide-list__item {cursor: pointer; } .ppt-accessible-slide-list__item.ppt-accessible-slide-list__item_active {color: #A52A2A; }.ppt-accessible-slide-notes {clear: both;margin: 16px 0; } .ppt-accessible-slide-notes summary {font-weight: 600;margin-bottom: 8px; } .ppt-accessible-slide-notes ul {padding: 0;margin: 0; } .ppt-accessible-slide-notes__item {list-style: none; } .ppt-accessible-slide-notes p {margin: 0; }.ppt-accessible-resources {clear: both;margin: 16px 0; } .ppt-accessible-resources summary {font-weight: 600;margin-bottom: 8px; } .ppt-accessible-resources ul {padding: 0;margin: 0; } .ppt-accessible-resources__item {list-style: none; }.ppt-accessible-presenter {clear: both;margin: 16px 0; } .ppt-accessible-presenter summary {font-weight: 600;margin-bottom: 8px; } .ppt-accessible-presenter ul {padding: 0;margin: 0; } .ppt-accessible-presenter__item {list-style: none; } .ppt-accessible-presenter p {margin: 6px 0;white-space: pre-line; } .ppt-accessible-presenter a, .ppt-accessible-presenter img {display: block;margin: 6px 0; }.quiz-accessible-skin {width: 100%;position: static !important; }.quiz-accessible-top-panel {padding-left: 0 !important;padding-right: 0 !important; }.quiz-accessible-slide {padding-left: 0 !important;padding-right: 0 !important; }.quiz-accessible-hidden-link-container {padding: 0 !important; }.quiz-accessible-control-panel {padding: 0 !important;margin-top: 32px;margin-bottom: 32px; }.quiz-accessible-slide-list {padding: 0 !important;margin: 16px 0 !important; }.accessible-quiz-review {padding: 0 !important;margin-bottom: 20px; }.ppt-accessible-scenario-slide-content {padding-top: 32px; }.scenario-accessible-skin {width: 100%;padding: 0 !important; }.ppt-accessible-footer .page-controls {position: relative;margin-top: 32px;margin-bottom: 32px;left: 0;top: 0;direction: rtl;float: left; } .ppt-accessible-footer .page-controls button {margin: 0;min-width: 217px;min-height: 46px;font-family: 'Segoe UI', sans-serif;font-size: 20px; } .ppt-accessible-footer .page-controls button:first-child {margin-left: 12px; }.ppt-accessible-footer .items-list {clear: both;margin-bottom: 16px;padding: 0;font-size: 20px; } .ppt-accessible-footer .items-list summary {margin-bottom: 8px;font-weight: 600; }.ppt-accessible-footer .scenario-accessible-bottom-panel__button {width: 217px;height: 46px;font-family: Segoe UI, sans-serif;font-size: 20px;font-weight: normal; }"; +let d;for(const [f,g]of Object.entries(null!=(d=a)?d:{}))a=`__${f.replace(RegExp("\\.","g"),"_")}__`,c=c.replace(new RegExp(a,"g"),g);let e;for(const [f,g]of Object.entries(null!=(e=b)?e:{}))c=c.replace(new RegExp(f,"g"),g);c=c.replace(/__verticalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.Pk);c=c.replace(/__horizontalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.Ok);return gn(c)}Pk(a,b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}Ok(a, +b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}};class hG{Yo(a,b){const c=g=>{g=sh(g);let h;for(const [l,n]of Object.entries(null!=(h=a)?h:{}))g=g.replace(new RegExp(`{${l}}`,"g"),n);return qh(g)};let d=function(){var g=["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAADcmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmFjOGVjNDFhLTZkYWItODQ0Ni04YzkzLWU1Mjk3N2YwMmE4NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFRThCNzU3NDYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFRThCNzU3MzYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cykiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0OWFlZmI1OC00ZWFmLWQ3NDgtYTI0ZS0zNmNhNGQ2M2QwNTYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6N0MwQkFBM0M2MjAxMTFFNUI4QjBERTk4MjY5MjQwQjUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6MGSVVAAAE3klEQVR42uycW4hWVRiG15Q4eYzGQySSQlriEQ9BF2mE4iSdESRRIb0RD+mNmHgICjqQEGUe6sqgCy1i0iRinAzELrooQhHLGQURUTzMiM7omCLj+/F/czX/t/890z6s9e/3hZcZ1l6z19r7mXXca62arq4uR/mjh/gKCIQiEAKhCIRAKAIhEIpACIQiEIpACIQiEAKhCIRAKAIhEMoX9Yu62NbWxjcUobq6OpaQQpcQz/QwPBOeDU+Fx8Oj4UfhoRrnJnwDvgC3wCfgY/Bf8P0QHrImahmQB1VWLfwGvAieqy+/LxJIR+Dv4QPwf75WWb4CGQavg9fo70mqFd4F79DfCSRCA+HN8Hp4cMppdcBfwB/Bt9mo99Sr8Cl4SwYwnKYhaf2jaXMconoE/hL+CR6TQ/pPato7NS+FbtSfgH+Gp8eMfwv+HT6qpakZvqzVT/d//ePw0/BEeI72ygbFvP/f8MvwpSK2IfLSGuGxFeJ1aby98CG4s5fpDNAqaTlcL89cIf45jddcpDZknI4PKsFo0NKzQLusnX1Iq1P/doHe60CF+GM1b+OK0obIYO5XeGREnLPwfHghfDzBtOVeb+q9z0bEG6njltHVDqQ2RuP9HTwDbkoxH02axv4YjX1tNQP5LKIBl7ZiK/yWToGkLUljsaZpNaTTNc9VCeR1eHUEjHfgD3OoQiXNVRFQVmveqwrIEHh3xPXNOp2Rl77WPFiSvA+tJiCb4FHGNanHP/FggCp52Gdck7y/Wy0Dw2Hatx9s9KZmZNRmxC3JMjh8qsy1Du0St4Y+DomaKFzlEQxRu+apnOQZ1oVeZfWPeMCGlLu2/6dL3BDRwPcPGYiMjocbvaoPnL963+h1DddnChbIMiP8cMIj8KQln34be/lM3gOREW69cW2v81/fGOH1aY7e0wTyrNGYyxT6wQCAHNS8lmvcZ4UIZL4RLt8z7gQA5I7mtZyeCxHIS0b4UReOrLw+EyIQqxScDAiIldcJIQLZYTTmvwUEpMUIHxMikB/gta40PXIF/lwHVrcCAnLVCH8srQR9X7mYt2RUbq1yrOFia390N9SReugaYoR3EEg+GmGEtxNIPhpvhJ8nkHw02Qj/l0Dy0Rwj/DSBZC9ZeD3buPYHgWSv11z5RdrSw/qTQLLX20Z4o0toSxyBxJdsKrVmq79NM2ECKa/3XPltC9fgXwgkW81zpVX35fSVS3HahEB6SqZK9hjXujeJOgLJTrLG19qos1OrLALJSLL+eLFx7SL8cRaZIJCSVrrSfnVL8qHtJoFkoy3ablibQeWz849ZZaZfgUHIfg/Z97EkIs5xLR2OQNLv2u5x0Ttt5UShV1wfj91glRVP01xp8UVTBRiyuOFFheJYQpKVzNrKwQErXPyDA2SF+5k8MhsykCnwPdfzaA3ZYy6nREyCX4Cfd/EPs+nV0RoEUlqWsx1eCie9Bkc2nW5wOa87Dg3Ipy75bWXntSd1yIcHDK1RT3KzTIcOBif6AqOo3d42HX/I0tZW3zIXWgnp68chmfaQjZxyoKac0bXNRxghlpCN2m1dpj/btXEfpD0uqYaua89Luq3dx8TKN3AeE1vt4mLrAohACIQiEAKhCIRAKAIhEIpACq7IqROKJYRA+AoIhCIQAqEIhEAoAiEQikCKrQcCDABHPgH2w7NQdAAAAABJRU5ErkJggg==", +"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICB3aWR0aD0iMjhweCIgaGVpZ2h0PSIzM3B4IiB2aWV3Qm94PSIwIDAgMjguMzAyIDMzLjI0MiI+DQoJPHBhdGggZD0iTTAsMS44VjMxLjQ0MmExLjgsMS44LDAsMCwwLDIuNzI2LDEuNTQzbDI0LjctMTQuODJhMS44LDEuOCwwLDAsMCwwLTMuMDg3TDIuNzI2LjI1N0ExLjgsMS44LDAsMCwwLDAsMS44WiIgc3R5bGU9ImZpbGw6IzMzMyIvPg0KPC9zdmc+","data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyOHB4IiBoZWlnaHQ9IjMzcHgiIHZpZXdCb3g9IjAgMCAyOC4zMDIgMzMuMjQyIj4NCgk8cGF0aCBkPSJNMCwxLjhWMzEuNDQyYTEuOCwxLjgsMCwwLDAsMi43MjYsMS41NDNsMjQuNy0xNC44MmExLjgsMS44LDAsMCwwLDAtMy4wODdMMi43MjYuMjU3QTEuOCwxLjgsMCwwLDAsMCwxLjhaIiBzdHlsZT0iZmlsbDojNTI4YmRmIi8+DQo8L3N2Zz4=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA5LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDksMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbD0iI0RENEIzOCIgZD0iTTIxLjA0MSwyOXY5Ljg0NGMwLDUuNTA4LDQuNjkxLDkuOTczLDEwLjQ3OSw5Ljk3M2M1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTczVjI5SDIxLjA0MXoiLz4NCjxwYXRoIGZpbGw9IiNERDRCMzgiIGQ9Ik0yNi41NTgsMjl2LTcuNjg5YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MlYyOWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNFYyOUgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjEuMDQxLDI4LjIwNnY5Ljg0NWMwLDUuNTA2LDQuNjkxLDkuOTcxLDEwLjQ3OSw5Ljk3MWM1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTcxdi05Ljg0NUgyMS4wNDF6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjYuNTU4LDI4LjA0VjIwLjM1YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MnY3LjY4OWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNHY4LjA1NEgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRjA4RjgyIiBkPSJNMzQsMzYuMzY1YzAtMS4yODctMS4wNDQtMi4zMzEtMi4zMzEtMi4zMzFjLTEuMjg4LDAtMi4zMzIsMS4wNDQtMi4zMzIsMi4zMzENCgljMCwwLjk3MSwwLjU5NCwxLjgwMiwxLjQzOCwyLjE1MnY0LjQ2N2gxLjkxdi00LjUyOUMzMy40NjEsMzguMDc2LDM0LDM3LjI4NywzNCwzNi4zNjV6Ii8+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA4LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDgsMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik01OS42NDYsMzFoLTMuMjkzQzU2LjE1OCwzMSw1NiwzMS40NDgsNTYsMzINCgljMCwwLjU1MywwLjE1OCwxLDAuMzU0LDFoMy4yOTNDNTkuODQyLDMzLDYwLDMyLjU1Myw2MCwzMkM2MCwzMS40NDgsNTkuODQyLDMxLDU5LjY0NiwzMXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjREQ0QjM4IiBkPSJNNi42NDcsMzFIMy4zNTNDMy4xNTgsMzEsMywzMS40NDgsMywzMmMwLDAuNTUzLDAuMTU4LDEsMC4zNTMsMQ0KCWgzLjI5NEM2Ljg0MiwzMyw3LDMyLjU1Myw3LDMyQzcsMzEuNDQ4LDYuODQyLDMxLDYuNjQ3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik0zMSw4YzAuNTUzLDAsMS0wLjE1OCwxLTAuMzUzVjQuMzUzQzMyLDQuMTU4LDMxLjU1Myw0LDMxLDQNCgljLTAuNTUyLDAtMSwwLjE1OC0xLDAuMzUzdjMuMjk0QzMwLDcuODQyLDMwLjQ0OCw4LDMxLDh6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTMxLDU2Yy0wLjU1MiwwLTEsMC4xNTgtMSwwLjM1NHYzLjI5M0MzMCw1OS44NDIsMzAuNDQ4LDYwLDMxLDYwDQoJYzAuNTUzLDAsMS0wLjE1OCwxLTAuMzU0di0zLjI5M0MzMiw1Ni4xNTgsMzEuNTUzLDU2LDMxLDU2eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik00Ny42NjgsMzFoLTEyLjgxQzM0LjQ5NiwyOS42LDMzLjQsMjguNTA1LDMyLDI4LjE0Mg0KCWMwLDAtMC4xNzItMC4xNDItMS0wLjE0MmMtMC44MjksMC0yLDAuNTU1LTIsMC41NTVjLTEuMTksMC42OTMtMiwxLjk2OS0yLDMuNDQ1YzAsMi4yMDksMS43OTEsNCw0LDRjMS40NzcsMCwyLjc1Mi0wLjgwOSwzLjQ0NS0yDQoJaDEzLjIyM0M0OC40MDQsMzQsNDksMzMuMzI4LDQ5LDMyLjVDNDksMzEuNjcyLDQ4LjQwNCwzMSw0Ny42NjgsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTI3LjAxOCwyOS43NDhjMC41OTIsMS4wMjUsMS42NTIsMS41MiwyLjM3LDEuMTA2bDAsMA0KCWMwLjcxNy0wLjQxNSwwLjgxOS0xLjU4MSwwLjIyOC0yLjYwNmwtNy44NTctMTMuNjA5Yy0wLjU5Mi0xLjAyNC0xLjY1My0xLjUyLTIuMzcxLTEuMTA2bDAsMGMtMC43MTcsMC40MTUtMC44MTgsMS41ODEtMC4yMjgsMi42MDUNCglMMjcuMDE4LDI5Ljc0OHoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMjcuMDE4LDI4LjM2MWMwLjU5MiwxLjAyNSwxLjY1MiwxLjUyLDIuMzcsMS4xMDZsMCwwDQoJYzAuNzE3LTAuNDE1LDAuODE5LTEuNTgxLDAuMjI4LTIuNjA2bC03Ljg1Ny0xMy42MDljLTAuNTkyLTEuMDI0LTEuNjUzLTEuNTItMi4zNzEtMS4xMDZsMCwwYy0wLjcxNywwLjQxNS0wLjgxOCwxLjU4MS0wLjIyOCwyLjYwNQ0KCUwyNy4wMTgsMjguMzYxeiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgY3g9IjMxIiBjeT0iMzEiIHI9IjQiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNjAsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzU0LDFoLTMuMjkzQzU2LjE1OCwzMiw1NiwzMS41NTIsNTYsMzENCglsMCwwYzAtMC41NTIsMC4xNTgtMSwwLjM1NC0xaDMuMjkzQzU5Ljg0MiwzMCw2MCwzMC40NDgsNjAsMzFMNjAsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTcsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzUzLDFIMy4zNTNDMy4xNTgsMzIsMywzMS41NTIsMywzMWwwLDANCgljMC0wLjU1MiwwLjE1OC0xLDAuMzUzLTFoMy4yOTRDNi44NDIsMzAsNywzMC40NDgsNywzMUw3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0zMSwzYzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDYuODQyLDMxLjU1Myw3LDMxLDdsMCwwDQoJYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1M1YzLjM1M0MzMCwzLjE1OCwzMC40NDgsMywzMSwzTDMxLDN6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTMxLDU1YzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDU4Ljg0MiwzMS41NTMsNTksMzEsNTkNCglsMCwwYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1NHYtMy4yOTRDMzAsNTUuMTU4LDMwLjQ0OCw1NSwzMSw1NUwzMSw1NXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNDksMzEuNDk5QzQ5LDMwLjY3Miw0OC40MDQsMzAsNDcuNjY4LDMwSDM0LjMzMw0KCUMzMy41OTYsMzAsMzMsMzAuNjcxLDMzLDMxLjVsMCwwYzAsMC44MjgsMC41OTYsMS41LDEuMzMzLDEuNWgxMy4zMzVDNDguNDA0LDMzLDQ5LDMyLjMyOCw0OSwzMS40OTlMNDksMzEuNDk5eiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YxNjE1NSIgY3g9IjMxIiBjeT0iMzEiIHI9IjIiLz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjM2MzgxNDQiPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgzNjAiIGNsYXNzPSJmaWwwIiBkPSJNNi43NzM1IDMuOTc5bDAgLTMuNDQyNDVjMCwtMC4yOTUxMTkgLTAuMjQxNDMzLC0wLjUzNjU1MiAtMC41MzY1NTIsLTAuNTM2NTUybC02LjIzNjk1IDAgMCA0LjUxNTU1IDYuMjM2OTUgMGMwLjI5NTExOSwwIDAuNTM2NTUyLC0wLjI0MTQzMyAwLjUzNjU1MiwtMC41MzY1NTJ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMzYzODEyMCIgY2xhc3M9ImZpbDEiIGQ9Ik0zLjE4NzUgMS4yMzAyMWwtMC4zMzU1NTIgMC4zMzU1MTQgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAtMC4yMjM2NjQgMC4yMjM2NjQgMC40NDczNjUgMC40NDczNjUgLTAuMzM1NTE0IDAuMzM1NTUyIDAuODk0NzMgMCAwIC0wLjg5NDczem0wLjI2NTY0MSAyLjA1NTFsMC4zMzU1MTQgLTAuMzM1NTE0IDAuNDQ3MzY1IDAuNDQ3MzY1IDAuMjIzNzAxIC0wLjIyMzcwMSAtMC40NDczNjUgLTAuNDQ3MzY1IDAuMzM1NTE0IC0wLjMzNTUxNCAtMC44OTQ3MyAwIDAgMC44OTQ3M3oiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDojRkVGRUZFO2ZpbGwtb3BhY2l0eTowLjEwMTk2MX0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIzNjM4MTQ0Ij4NCiAgIDxwYXRoIGlkPSJfMTIzNjM4MzYwIiBjbGFzcz0iZmlsMCIgZD0iTTYuNzczNSAzLjk3OWwwIC0zLjQ0MjQ1YzAsLTAuMjk1MTE5IC0wLjI0MTQzMywtMC41MzY1NTIgLTAuNTM2NTUyLC0wLjUzNjU1MmwtNi4yMzY5NSAwIDAgNC41MTU1NSA2LjIzNjk1IDBjMC4yOTUxMTksMCAwLjUzNjU1MiwtMC4yNDE0MzMgMC41MzY1NTIsLTAuNTM2NTUyeiIvPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgxMjAiIGNsYXNzPSJmaWwxIiBkPSJNMy4xODc1IDEuMjMwMjFsLTAuMzM1NTUyIDAuMzM1NTE0IC0wLjQ0NzM2NSAtMC40NDczNjUgLTAuMjIzNjY0IDAuMjIzNjY0IDAuNDQ3MzY1IDAuNDQ3MzY1IC0wLjMzNTUxNCAwLjMzNTU1MiAwLjg5NDczIDAgMCAtMC44OTQ3M3ptMC4yNjU2NDEgMi4wNTUxbDAuMzM1NTE0IC0wLjMzNTUxNCAwLjQ0NzM2NSAwLjQ0NzM2NSAwLjIyMzcwMSAtMC4yMjM3MDEgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAwLjMzNTUxNCAtMC4zMzU1MTQgLTAuODk0NzMgMCAwIDAuODk0NzN6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDojRkVGRUZFO2ZpbGwtb3BhY2l0eTowLjA1MDk4MH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIzNjM4MTQ0Ij4NCiAgIDxwYXRoIGlkPSJfMTIzNjM4MzYwIiBjbGFzcz0iZmlsMCIgZD0iTTYuNzczNSAzLjk3OWwwIC0zLjQ0MjQ1YzAsLTAuMjk1MTE5IC0wLjI0MTQzMywtMC41MzY1NTIgLTAuNTM2NTUyLC0wLjUzNjU1MmwtNi4yMzY5NSAwIDAgNC41MTU1NSA2LjIzNjk1IDBjMC4yOTUxMTksMCAwLjUzNjU1MiwtMC4yNDE0MzMgMC41MzY1NTIsLTAuNTM2NTUyeiIvPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgxMjAiIGNsYXNzPSJmaWwxIiBkPSJNMy4xODc1IDEuMjMwMjFsLTAuMzM1NTUyIDAuMzM1NTE0IC0wLjQ0NzM2NSAtMC40NDczNjUgLTAuMjIzNjY0IDAuMjIzNjY0IDAuNDQ3MzY1IDAuNDQ3MzY1IC0wLjMzNTUxNCAwLjMzNTU1MiAwLjg5NDczIDAgMCAtMC44OTQ3M3ptMC4yNjU2NDEgMi4wNTUxbDAuMzM1NTE0IC0wLjMzNTUxNCAwLjQ0NzM2NSAwLjQ0NzM2NSAwLjIyMzcwMSAtMC4yMjM3MDEgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAwLjMzNTUxNCAtMC4zMzU1MTQgLTAuODk0NzMgMCAwIDAuODk0NzN6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACHDwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKNWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAASMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEoqGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAGeIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gzSZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25qbc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9CvjcM4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjKuLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqxOPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIWiAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFVSAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAyrA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYghUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7rh2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SEdJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3JaSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQtlHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJy5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hopb2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsyu21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCccNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527PYS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOwEaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6sfaznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy+rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVsS1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9UxlfeqXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/wjowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9Vt1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503rm10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7Pnl/eriQvLDwG/eE8/s6uL5TAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAAGnRFWHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS4xMDD0cqEAAABfSURBVChTY/j//z8DMZgoRSCD4ApLK6rYgLgDiJ9CMYjNBrMNWWHnvAUL/3/4+BGMQWygwk5sCp+CFMDAhw8fQAqfYlcIlCRGYeeceQv+g0wCYRAbl9XEeYZQWBIdjgCVaiC8JN1udgAAAABJRU5ErkJggg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAACuSURBVHicY/n//z8DCLh7+/sAqWIgNmGAgDNA3Ltz68YtIA4LVFELkKpmQAUOIAyUawUqrmEBMnyxKEIG1UA1J0EmFsFELC3MGfJzssDsSVOnMxw7fgImVQRSaAzjgRQJCgqA2XnZmcgKjVnwWIkCWKC+cwRxJk6eypCfm80AYyOBMyCF/TCFx0+eAmMsoJ8F6PXNoCBgwO1zUPBsBrsRFE5AxSCXFzKgBng/LMABrBM9cyiwScIAAAAASUVORK5CYII=", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAZCAYAAABtnU33AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAETSURBVHic7ZgxCsJAFAUXSaeIpScQDyCCguA5rEUQEbWzsvACKhICaquHUQu18hxi6vgebCSgwSb5C2sGhpBkIX+aZIkTBIHS1OAI1mFR2cEDHuEKnnnB0TeGcAlzZuZKjTKswA4cwzWDW8rO2ChsY+OFwVNld2wIG6cMbpqeRJAmg0umpxCk5PxeYxdZsO1kwbaTBdvOXwb7MG96ECF8Bt9gw/QkQlwZ7Kr/CXYZvIdt2DU7S+rs4CF8afXgCU5g1dhI6XCHC7jlSRjM/zwbbUGbJDPY/7HGg/OEn/vUvvn2WfpYlAADfYyL9vSaIOZ+Ykh9hxkSFy0WSyQ3Ht+iRWOJ9E4rGq2UcCwxsbWMRovGkhc6FTEV3QXLmAAAAABJRU5ErkJggg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAElJREFUSEvt0qERAEAIA0H6b5rXL1ecI5qQOcIsanB+3TC5egZOyJm9B2Zgw0EnF+AeekPC+S3tGTjhoJMLcA+9IeG89+6L04QHtFKarLFAHLUAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAFBJREFUSEvtkjEKADAIA/PpQunnWzo63nBbBDdjOGPWPpd0yPCf5YLo5TNgB52Z54AZsKDQygVwDr5A4RxLfQbsUGjlAjgHX6Bw9r394KjDAzeSX574b7LUAAAAAElFTkSuQmCC", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAyMCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik03LjE3MDI1IDMuMDkxODJDOC4wNzEzMiAyLjY5OTkyIDkuMDMyNDkgMi41IDEwIDIuNUMxMC45Njc1IDIuNSAxMS45Mjg3IDIuNjk5OTIgMTIuODI5NyAzLjA5MTgyQzEzLjczMTIgMy40ODM4NyAxNC41NTgzIDQuMDYyMDIgMTUuMjYwNyA0Ljc5OTUyQzE1Ljk2MzQgNS41MzcyOCAxNi41MjY4IDYuNDE5NjcgMTYuOTEzMiA3LjM5OTI0QzE3LjI5OTcgOC4zNzg5NyAxNy41IDkuNDMyOTUgMTcuNSAxMC41SDIwQzIwIDkuMTIxMTIgMTkuNzQxMyA3Ljc1NTc0IDE5LjIzODggNi40ODE4MkMxOC43MzYyIDUuMjA3OSAxNy45OTk2IDQuMDUwMzkgMTcuMDcxMSAzLjA3NTM4QzE2LjE0MjUgMi4xMDAzNiAxNS4wNDAxIDEuMzI2OTQgMTMuODI2OCAwLjc5OTI2NUMxMi42MTM2IDAuMjcxNTg5IDExLjMxMzIgMCAxMCAwQzguNjg2NzggMCA3LjM4NjQyIDAuMjcxNTg5IDYuMTczMTcgMC43OTkyNjVDNC45NTk5MiAxLjMyNjk0IDMuODU3NTIgMi4xMDAzNiAyLjkyODkzIDMuMDc1MzhDMi4wMDAzNSA0LjA1MDM5IDEuMjYzNzUgNS4yMDc5IDAuNzYxMjA0IDYuNDgxODJDMC4yNTg2NTggNy43NTU3NCAwIDkuMTIxMTIgMCAxMC41SDIuNUMyLjUgOS40MzI5NSAyLjcwMDMgOC4zNzg5NyAzLjA4Njc5IDcuMzk5MjRDMy40NzMyMiA2LjQxOTY3IDQuMDM2NjUgNS41MzcyOCA0LjczOTI4IDQuNzk5NTJDNS40NDE2NiA0LjA2MjAyIDYuMjY4ODUgMy40ODM4NyA3LjE3MDI1IDMuMDkxODJaTTEwLjU3MSA3LjU4MzM1QzEwLjY4NDMgNy40OTI4MyAxMC43OTY2IDcuNDA0NSAxMC45MDcxIDcuMzE4ODNDMTEuMzUxNyA2Ljk3NDAzIDExLjc2NTggNi42NzI0MyAxMi4wODY4IDYuNDQ0OTlDMTIuMTcxNyA2LjM4NDgxIDEyLjI1MDEgNi4zMjk4MSAxMi4zMjA5IDYuMjgwNThDMTIuNDkgNi4xNjI5MiAxMi43MTIgNi4yOTExIDEyLjY5NDYgNi40OTYzOEMxMi42ODc0IDYuNTgyMjYgMTIuNjc5IDYuNjc3NjggMTIuNjY5MyA2Ljc4MTM0QzEyLjYzMjkgNy4xNzMwNCAxMi41Nzg3IDcuNjgyNDcgMTIuNTAyNCA4LjIzOTg4QzEyLjQ4MzQgOC4zNzgzNyAxMi40NjMxIDguNTE5ODIgMTIuNDQxMyA4LjY2MzE2QzEyLjI0NjggOS45NDQxNSAxMS45Mzc1IDExLjM3NjIgMTEuNDY0MSAxMi4xOTYyQzExLjA3MzYgMTIuODcyNiAxMC4wMzExIDEzLjY3ODIgOC43MzIwNSAxMi45MjgyQzcuNDMzMDEgMTIuMTc4MiA3LjYwOTQ4IDEwLjg3MjYgOCAxMC4xOTYyQzguNDczMzcgOS4zNzYyNSA5LjU1ODk0IDguMzkyMzEgMTAuNTcxIDcuNTgzMzVaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NzA3MjgiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjMzNjc2NjQiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjkxNDI4IDAuNjkxNDI4LDAuNjkxNDI4IDAuNjkxNDI4LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTcwNzA0IiBjbGFzcz0iZmlsMSIgZD0iTTAuMzQ1NzM2IDAuMTU3MTg4bC0wLjEyNTcyMiAwLjA5NDI2NDkgLTAuMDk0MzAwNiAwIDAgMC4xODg1ODMgMC4wOTQzMDA2IDAgMC4xMjU3MjIgMC4wOTQyNjQ5IDAgLTAuMzc3MTEzem0wLjE1NzExNyAtMi42NzI2N2UtMDA1bDAuMDMxNDMwNiAwIDAgMC4zNzcxNCAtMC4wMzE0MzA2IDAgMCAtMC4zNzcxNHptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjI1MTQwOSAtMC4wMzE0MzA2IDAgMCAtMC4yNTE0MDl6bS0wLjA2Mjg0MzMgMC4wNjI4NjExbDAuMDMxNDMwNiAwIDAgMC4xMjU2ODcgLTAuMDMxNDMwNiAwIDAgLTAuMTI1Njg3eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NjkwMjQiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjE5NjkyNDAiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjQzNjE2IDAuNjQzNjE2LDAuNjQzNjE2IDAuNjQzNjE2LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY5MDAwIiBjbGFzcz0iZmlsMSIgZD0iTTAuMzIxODM3IDAuMTQ2MzAybC0wLjExNzAyOSAwLjA4Nzc0NjYgLTAuMDg3Nzc5NyAwIDAgMC4xNzU1NDMgMC4wODc3Nzk3IDAgMC4xMTcwMjkgMC4wODc3NDY2IDAgLTAuMzUxMDM2em0wLjI3NzkwMSAwLjI1MDcyNmwtMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjA5MzA4NzIgLTAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjAyMDY5MDYgLTAuMDIwNjkwNiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAwLjAyMDY5MDYgLTAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MnoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTggM0MxOS4xMDQ2IDMgMjAgMy44OTU0MyAyMCA1VjE1QzIwIDE2LjEwNDYgMTkuMTA0NiAxNyAxOCAxN0gyQzAuODk1NDMxIDE3IDAgMTYuMTA0NiAwIDE1VjVDMCAzLjg5NTQzIDAuODk1NDMxIDMgMiAzSDE4Wk02LjU4MDA4IDcuMDA0ODhDNS41OTgzIDcuMDA0ODggNC44MjYwMSA3LjMyMDE1IDQuMjYzMTggNy45NTA2OEMzLjcwMDM1IDguNTgxMjIgMy40MTg5NSA5LjQyNTQ1IDMuNDE4OTUgMTAuNDgzNFYxMC42MDRDMy40MTg5NSAxMS43MDQzIDMuNzAyNDcgMTIuNTY2NSA0LjI2OTUzIDEzLjE5MDdDNC44MzY1OSAxMy44MTQ5IDUuNjExIDE0LjEyNyA2LjU5Mjc3IDE0LjEyN0M3LjExNzUyIDE0LjEyNyA3LjU5Njc2IDE0LjAyMDEgOC4wMzA1MiAxMy44MDY0QzguNDY0MjggMTMuNTkyNyA4LjgwNTk5IDEzLjI5MjIgOS4wNTU2NiAxMi45MDVDOS4zMDUzNCAxMi41MTc4IDkuNDMyMjkgMTIuMDkxNSA5LjQzNjUyIDExLjYyNkg3LjcxNjMxQzcuNzA3ODQgMTEuOTM0OSA3LjU5NzgyIDEyLjE4MjUgNy4zODYyMyAxMi4zNjg3QzcuMTc0NjQgMTIuNTU0OSA2Ljg5OTU4IDEyLjY0NzkgNi41NjEwNCAxMi42NDc5QzYuMTIwOTMgMTIuNjQ3OSA1Ljc5Mjk3IDEyLjQ5MzUgNS41NzcxNSAxMi4xODQ2QzUuMzYxMzMgMTEuODc1NiA1LjI1MzQyIDExLjM2NzggNS4yNTM0MiAxMC42NjExVjEwLjQ3MDdDNS4yNTM0MiA5Ljc3MjQ2IDUuMzYyMzkgOS4yNjc4MiA1LjU4MDMyIDguOTU2NzlDNS43OTgyNiA4LjY0NTc1IDYuMTIwOTMgOC40OTAyMyA2LjU0ODM0IDguNDkwMjNDNi44OTUzNSA4LjQ5MDIzIDcuMTc0NjQgOC42MDEzMiA3LjM4NjIzIDguODIzNDlDNy41OTc4MiA5LjA0NTY2IDcuNzA3ODQgOS4zMzQ0NyA3LjcxNjMxIDkuNjg5OTRIOS40MzY1MkM5LjQyODA2IDguODc3NDQgOS4xNjQ2NCA4LjIyNjgxIDguNjQ2MjQgNy43MzgwNEM4LjEyNzg1IDcuMjQ5MjcgNy40MzkxMyA3LjAwNDg4IDYuNTgwMDggNy4wMDQ4OFpNMTMuMzU5NCA3LjAwNDg4QzEyLjM3NzYgNy4wMDQ4OCAxMS42MDUzIDcuMzIwMTUgMTEuMDQyNSA3Ljk1MDY4QzEwLjQ3OTcgOC41ODEyMiAxMC4xOTgyIDkuNDI1NDUgMTAuMTk4MiAxMC40ODM0VjEwLjYwNEMxMC4xOTgyIDExLjcwNDMgMTAuNDgxOCAxMi41NjY1IDExLjA0ODggMTMuMTkwN0MxMS42MTU5IDEzLjgxNDkgMTIuMzkwMyAxNC4xMjcgMTMuMzcyMSAxNC4xMjdDMTMuODk2OCAxNC4xMjcgMTQuMzc2MSAxNC4wMjAxIDE0LjgwOTggMTMuODA2NEMxNS4yNDM2IDEzLjU5MjcgMTUuNTg1MyAxMy4yOTIyIDE1LjgzNSAxMi45MDVDMTYuMDg0NiAxMi41MTc4IDE2LjIxMTYgMTIuMDkxNSAxNi4yMTU4IDExLjYyNkgxNC40OTU2QzE0LjQ4NzEgMTEuOTM0OSAxNC4zNzcxIDEyLjE4MjUgMTQuMTY1NSAxMi4zNjg3QzEzLjk1MzkgMTIuNTU0OSAxMy42Nzg5IDEyLjY0NzkgMTMuMzQwMyAxMi42NDc5QzEyLjkwMDIgMTIuNjQ3OSAxMi41NzIzIDEyLjQ5MzUgMTIuMzU2NCAxMi4xODQ2QzEyLjE0MDYgMTEuODc1NiAxMi4wMzI3IDExLjM2NzggMTIuMDMyNyAxMC42NjExVjEwLjQ3MDdDMTIuMDMyNyA5Ljc3MjQ2IDEyLjE0MTcgOS4yNjc4MiAxMi4zNTk2IDguOTU2NzlDMTIuNTc3NiA4LjY0NTc1IDEyLjkwMDIgOC40OTAyMyAxMy4zMjc2IDguNDkwMjNDMTMuNjc0NiA4LjQ5MDIzIDEzLjk1MzkgOC42MDEzMiAxNC4xNjU1IDguODIzNDlDMTQuMzc3MSA5LjA0NTY2IDE0LjQ4NzEgOS4zMzQ0NyAxNC40OTU2IDkuNjg5OTRIMTYuMjE1OEMxNi4yMDc0IDguODc3NDQgMTUuOTQzOSA4LjIyNjgxIDE1LjQyNTUgNy43MzgwNEMxNC45MDcxIDcuMjQ5MjcgMTQuMjE4NCA3LjAwNDg4IDEzLjM1OTQgNy4wMDQ4OFoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxwYXRoIGNsYXNzPSJmaWwwIiBkPSJNLTAgMC4yNzExMDFsMCAxLjczOTM1YzAsMC4xNDkxMTMgMC4xMjE5ODgsMC4yNzExMDEgMC4yNzExMDEsMC4yNzExMDFsMy4xNTEzMSAwIDAgLTIuMjgxNTUgLTMuMTUxMzEgMGMtMC4xNDkxMTMsMCAtMC4yNzExMDEsMC4xMjE5ODggLTAuMjcxMTAxLDAuMjcxMTAxeiIvPg0KICA8cG9seWdvbiBjbGFzcz0iZmlsMSIgcG9pbnRzPSIxLjQwOTIsMC42NzEwMzggMi4wODAyOCwxLjE0MDc3IDEuNDA5MiwxLjYxMDUxICIvPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIxOTY2NTUyIj4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NzY4IiBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMzIzOTU2bDAgMi4wNzg0NmMwLDAuMTc4MTg1IDAuMTQ1NzcxLDAuMzIzOTU2IDAuMzIzOTU2LDAuMzIzOTU2bDMuNzY1NzEgMCAwIC0yLjcyNjM4IC0zLjc2NTcxIDBjLTAuMTc4MTg1LDAgLTAuMzIzOTU2LDAuMTQ1NzcxIC0wLjMyMzk1NiwwLjMyMzk1NnoiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NTI4IiBjbGFzcz0iZmlsMSIgZD0iTTEuNjAzOCAwLjg4MjAzOGwwLjMyMDc1MSAwIDAgMC45NjIyNTQgLTAuMzIwNzUxIDAgMCAtMC45NjIyNTR6bTAuNTYxMzMyIDBsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAhCAYAAAAYucG/AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAA+SURBVHicY/H09pViYQACFi4uLgYWbm5uOAHncsG4/Pz8xKv79u0bA8vXr1/hBJz7Dcb9+PEjIXVzZs18BgAgpy6CcHz1VgAAAABJRU5ErkJggg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsLW9wYWNpdHk9IjAiIGQ9Ik01MSw0LjA0MXYyNS45MThDNTEsMzIuMTgyLDQ5LjE4MiwzNCw0Ni45NiwzNEgwVjBoNDYuOTZDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDENCgkJCUw1MSw0LjA0MXoiLz4NCgkJPHBhdGggaWQ9Il8xMjMzNzQxNDQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xOCwxNS43MzdsMi41MjYtMi41MjZsMy4zNjksMy4zNjlsMS42ODQtMS42ODVsLTMuMzY4LTMuMzY4TDI0LjczNiw5aC01LjA1M0gxOHYxLjY4NA0KCQkJVjE1LjczN3ogTTM0LDE4LjI2NGwtMi41MjcsMi41MjVsLTMuMzY4LTMuMzY4bC0xLjY4NSwxLjY4NWwzLjM2OSwzLjM2N0wyNy4yNjMsMjVoNS4wNTNIMzR2LTEuNjg1VjE4LjI2NHoiLz4NCgk8L2c+DQo8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMTAyIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjRkVGRUZFIiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMDUxIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjOTY5Njk2IiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTRweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgMTQgMTUiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDU4ICg4NDY2MykgLSBodHRwczovL3NrZXRjaC5jb20gLS0+CiAgICA8dGl0bGU+dGljay1jb21ib2JveDwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJQRC0zNzQ0LeKAlC0yIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNzkwLjAwMDAwMCwgLTQzMS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgaWQ9InRpY2stY29tYm9ib3giIHRyYW5zZm9ybT0idHJhbnNsYXRlKDc4OS4wMDAwMDAsIDQzMC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMy4zNDQ3NjY4LDEuNjU5MzMyNTIgTDUuOCwxMi41ODY3MjE4IEw1LjgsMTIuNTg2NzIxOCBMMi42MDU2MzE3Nyw4LjkzNDE5NjUyIEMyLjM1MzE1MjQxLDguNjQ1NTA0OTMgMS45MTQ0NDY2Nyw4LjYxNjE0OTExIDEuNjI1NzU1MDcsOC44Njg2Mjg0OCBDMS41NzczMDU0Miw4LjkxMTAwMDgyIDEuNTM0OTgxOTMsOC45NTk5MDMyNiAxLjUsOS4wMTM5MzE0OCBDMS4yMDYzNDk0OSw5LjQ2NzQ2MzE2IDEuMjYwMDExMDgsMTAuMDYyODI2MyAxLjYzMDAyNTk4LDEwLjQ1NjU0MDEgTDUuNDc5NzMxMTgsMTQuNTUyODEzNSBDNS42Njg4NDMyLDE0Ljc1NDAzNzkgNS45ODUyNzMzOSwxNC43NjM4NTY5IDYuMTg2NDk3NzcsMTQuNTc0NzQ0OSBDNi4yMTEyMjc0NywxNC41NTE1MDM4IDYuMjMzNTI2NzQsMTQuNTI1ODA1MyA2LjI1MzA1MDY3LDE0LjQ5ODA0NyBMMTQuNTM5MDU1MywyLjcxNzM0NDAzIEMxNC44MDE1Mjc3LDIuMzQ0MTcxNDggMTQuNzQxNjUzNywxLjgzMzM1NzAzIDE0LjQsMS41MzA5OTU4NyBDMTQuMTA2MjM3OCwxLjI3MTAxODMyIDEzLjY1NzM0MywxLjI5ODQwNjIyIDEzLjM5NzM2NTUsMS41OTIxNjg0NCBDMTMuMzc4NTAyNywxLjYxMzQ4MjQgMTMuMzYwOTM4MiwxLjYzNTkxMDg3IDEzLjM0NDc2NjgsMS42NTkzMzI1MiBaIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cG9seWxpbmUgaWQ9IlBhdGgtMiIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjIiIHBvaW50cz0iMiA5LjY1NjUyODE3IDUuODYxNjc5NzcgMTQgMTQgMiI+PC9wb2x5bGluZT4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjIsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9ItCh0LvQvtC5XzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMzVweCIgaGVpZ2h0PSIzNXB4IiB2aWV3Qm94PSIwIDAgMzUgMzUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDM1IDM1IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMTcuNSwzNUMyNy4xMzksMzUsMzUsMjcuMTM4LDM1LDE3LjVDMzUsNy44NjEsMjcuMTM5LDAsMTcuNSwwDQoJQzcuODYxLDAsMCw3Ljg2MSwwLDE3LjVDMCwyNy4xMzgsNy44NjEsMzUsMTcuNSwzNXoiLz4NCjxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTcuNTAwNSIgeTE9IjIuNjQ5OSIgeDI9IjE3LjUwMDUiIHkyPSIzMi4zNDkiPg0KCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiM1Q0IwRkYiLz4NCgk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMTI5MEZGIi8+DQo8L2xpbmVhckdyYWRpZW50Pg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9InVybCgjU1ZHSURfMV8pIiBkPSJNMTcuNSwzMy45OTljOS4wODgsMCwxNi41LTcuNDEyLDE2LjUtMTYuNDk5DQoJUzI2LjU4NywxLDE3LjUsMUM4LjQxMywxLDEuMDAxLDguNDEzLDEuMDAxLDE3LjVTOC40MTMsMzMuOTk5LDE3LjUsMzMuOTk5eiIvPg0KPHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTE4LjM2OCwyMi41aC0zYy0wLjAwOC0wLjQ2MywwLTAuODk3LDAtMWMwLTEuMDM3LDAuMDU1LTEuODgxLDAuMzk2LTIuNTUNCgljMC4zNDQtMC42NzMsMS4wMzMtMS40MjMsMi4wNjMtMi4yNjRjMS4wMjgtMC44MzUsMS42NDYtMS4zODQsMS44NDMtMS42NDZjMC4zMTMtMC40MDcsMC40NjgtMC44NjIsMC40NjgtMS4zNTQNCgljMC0wLjY4Ni0wLjI3NS0xLjI3My0wLjgyNC0xLjc2NmMtMC41NDktMC40ODktMS4yODUtMC43MzMtMi4yMTUtMC43MzNjLTAuODk2LDAtMS42NDYsMC4yNTctMi4yNTEsMC43NjcNCgljLTAuNjAxLDAuNTEtMS4wMTYsMS4yOTEtMS4yNDMsMi4zMzZsLTMuMjM2LTAuNDAzYzAuMDktMS41LDAuNzI5LTIuNzczLDEuOTEyLTMuODE5QzEzLjQ2Nyw5LjAyMiwxNS4wMTgsOC41LDE2Ljk0OCw4LjUNCgljMi4wMjMsMCwzLjYzNSwwLjUzMSw0LjgzNSwxLjU5YzEuMTk2LDEuMDU5LDEuNzk2LDIuMjg5LDEuNzk2LDMuNjk5YzAsMC43NzYtMC4yMjMsMS41MTQtMC42NiwyLjIwOA0KCWMtMC40NDEsMC42OTQtMS40NjEsMS41NS0yLjgyLDIuODM3QzE4Ljg2OCwyMCwxOC4zNjgsMjAuNSwxOC4zNjgsMjIuNUwxOC4zNjgsMjIuNXogTTE1LjM2OCwyNy40OTl2LTNoM3YzSDE1LjM2OHoiLz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjIsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9ItCh0LvQvtC5XzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMzVweCIgaGVpZ2h0PSIzNXB4IiB2aWV3Qm94PSIwIDAgMzUgMzUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDM1IDM1IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMTcuNSwzNUMyNy4xMzgsMzUsMzUsMjcuMTQsMzUsMTcuNUMzNSw3Ljg2MiwyNy4xMzgsMCwxNy41LDANCglDNy44NjEsMCwwLDcuODYyLDAsMTcuNUMwLDI3LjE0LDcuODYxLDM1LDE3LjUsMzV6Ii8+DQo8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE3LjQ5OTUiIHkxPSIyLjY1MDQiIHgyPSIxNy40OTk1IiB5Mj0iMzIuMzUwNCI+DQoJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGODI1QyIvPg0KCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRjREMTIiLz4NCjwvbGluZWFyR3JhZGllbnQ+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0idXJsKCNTVkdJRF8xXykiIGQ9Ik0xNy41LDM0YzkuMDg3LDAsMTYuNS03LjQxMiwxNi41LTE2LjUNCgljMC05LjA4OC03LjQxMi0xNi41LTE2LjUtMTYuNVMxLDguNDEzLDEsMTcuNUMxLDI2LjU4OCw4LjQxMiwzNCwxNy41LDM0eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xNS41LDkuMDAxYzAtMiwzLjk5OS0yLDMuOTk5LDBMMTguOTk5LDIxDQoJYy0wLjA2MSwxLjQ5OC0yLjkzNywxLjUtMywwTDE1LjUsOS4wMDF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTE3LjUsMjhjMS4xMDIsMCwyLTAuODk3LDItMmMwLTEuMTAyLTAuODk3LTItMi0yDQoJYy0xLjEwMiwwLTEuOTk5LDAuODk4LTEuOTk5LDJDMTUuNSwyNy4xMDMsMTYuMzk4LDI4LDE3LjUsMjh6Ii8+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkNPUlJFQ1QtSUNPTiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IgoJIHk9IjBweCIgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNCAyNDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNGRkZGRkY7fQoJLnN0MXtmaWxsOiM3Q0I5MTE7fQo8L3N0eWxlPgo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPgo8cGF0aCBpZD0iU2hhcGVfM19jb3B5IiBjbGFzcz0ic3QxIiBkPSJNMTIsMkM2LjUsMiwyLDYuNSwyLDEyczQuNSwxMCwxMCwxMHMxMC00LjUsMTAtMTBTMTcuNSwyLDEyLDJ6IE0xNy45LDguOWwtNy43LDcuNwoJYy0wLjQsMC40LTAuOSwwLjQtMS4zLDBsLTMuMi0zLjJjLTAuNC0wLjQtMC40LTAuOSwwLTEuM3MwLjktMC40LDEuMywwbDIuNSwyLjVsNy4xLTcuMWMwLjMtMC40LDAuOS0wLjQsMS4zLDAKCUMxOC4yLDcuOSwxOC4yLDguNSwxNy45LDguOUMxNy45LDguOSwxNy45LDguOSwxNy45LDguOXoiLz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIKCSB5PSIwcHgiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjQgMjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGNpcmNsZSBmaWxsPSIjRkZGRkZGIiBjeD0iMTIiIGN5PSIxMiIgcj0iMTIiLz4KPHBhdGggZmlsbD0iI2Y3YjQ0NSIgZD0iTTEyLDJDNi41LDIsMiw2LjUsMiwxMnM0LjUsMTAsMTAsMTBzMTAtNC41LDEwLTEwUzE3LjUsMiwxMiwyeiBNMTcuOSw4LjlsLTcuNyw3LjcKCWMtMC40LDAuNC0wLjksMC40LTEuMywwbC0zLjItMy4yYy0wLjQtMC40LTAuNC0wLjksMC0xLjNzMC45LTAuNCwxLjMsMGwyLjUsMi41bDcuMS03LjFjMC4zLTAuNCwwLjktMC40LDEuMywwCglDMTguMiw3LjksMTguMiw4LjUsMTcuOSw4LjlDMTcuOSw4LjksMTcuOSw4LjksMTcuOSw4Ljl6Ii8+Cjwvc3ZnPgo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IklOQ09SUkVDVC1JQ09OIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiCgkgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDI0IDI0OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6I0ZGRkZGRjt9Cgkuc3Qxe2ZpbGw6I0Y5NjAzRDt9Cjwvc3R5bGU+CjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjEyIiBjeT0iMTIiIHI9IjEyIi8+CjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0xMiwyQzYuNSwyLDIsNi41LDIsMTJzNC41LDEwLDEwLDEwczEwLTQuNSwxMC0xMFMxNy41LDIsMTIsMnogTTE2LjQsOC44TDEzLjIsMTJsMi45LDIuOQoJYzAuMywwLjMsMC4zLDAuOSwwLDEuMmMtMC4zLDAuMy0wLjksMC4zLTEuMiwwbDAsMEwxMiwxMy4ybC0zLjIsMy4yYy0wLjMsMC4zLTAuOSwwLjMtMS4yLDBzLTAuMy0wLjksMC0xLjJsMy4yLTMuMkw3LjksOS4xCgljLTAuMy0wLjMtMC4zLTAuOSwwLTEuMnMwLjktMC4zLDEuMiwwbDIuOSwyLjlsMy4yLTMuMmMwLjMtMC4zLDAuOS0wLjMsMS4yLDBDMTYuNyw3LjksMTYuOCw4LjQsMTYuNCw4LjgKCUMxNi40LDguOCwxNi40LDguOCwxNi40LDguOHoiLz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkFOU1dFUkVELUlDT04iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIKCSB5PSIwcHgiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjQgMjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbDojRkZGRkZGO30KCS5zdDF7ZmlsbDojNTI4QkRGO30KPC9zdHlsZT4KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMTIiIGN5PSIxMiIgcj0iMTIiLz4KPHBhdGggY2xhc3M9InN0MSIgZD0iTTEyLDIyQzYuNSwyMiwyLDE3LjUsMiwxMlM2LjUsMiwxMiwyczEwLDQuNSwxMCwxMFMxNy41LDIyLDEyLDIyeiBNOSwxMUg3djJoMlYxMXogTTEzLDExaC0ydjJoMlYxMXogTTE3LDExCgloLTJ2MmgyVjExeiIvPgo8L3N2Zz4K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkNPUlJFQ1QtSUNPTiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IgoJIHk9IjBweCIgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNCAyNDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNGRkZGRkY7fQoJLnN0MXtmaWxsOiM1MjhCREY7fQo8L3N0eWxlPgo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPgo8cGF0aCBpZD0iU2hhcGVfM19jb3B5IiBjbGFzcz0ic3QxIiBkPSJNMTIsMkM2LjUsMiwyLDYuNSwyLDEyczQuNSwxMCwxMCwxMHMxMC00LjUsMTAtMTBTMTcuNSwyLDEyLDJ6IE0xNy45LDguOWwtNy43LDcuNwoJYy0wLjQsMC40LTAuOSwwLjQtMS4zLDBsLTMuMi0zLjJjLTAuNC0wLjQtMC40LTAuOSwwLTEuM3MwLjktMC40LDEuMywwbDIuNSwyLjVsNy4xLTcuMWMwLjMtMC40LDAuOS0wLjQsMS4zLDAKCUMxOC4yLDcuOSwxOC4yLDguNSwxNy45LDguOUMxNy45LDguOSwxNy45LDguOSwxNy45LDguOXoiLz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,"+c("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMiAxOCIgd2lkdGg9IjEycHgiIGhlaWdodD0iMTZweCI+DQoJPGRlZnM+DQoJCTxzdHlsZT4NCgkJCS5ub3JtYWwgew0KCQkJCWZpbGw6IHt0ZXh0fTsNCgkJCQlvcGFjaXR5OiAwLjc7DQoJCQkJaXNvbGF0aW9uOmlzb2xhdGU7DQoJCQl9DQoJCTwvc3R5bGU+DQoJPC9kZWZzPg0KCTxwYXRoIGNsYXNzPSJub3JtYWwiIGQ9Ik0xMCwwSDJBMiwyLDAsMCwwLDAsMlYxOGwyLS4yMiw0LTMuNjYsNCwzLjY2TDEyLDE4VjJBMiwyLDAsMCwwLDEwLDBaTTIsMmg4VjE0LjQ5bC00LTMtNCwzWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCkiLz4NCjwvc3ZnPg=="), +"data:image/svg+xml;base64,"+c("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMiAxOCIgd2lkdGg9IjEycHgiIGhlaWdodD0iMTZweCI+DQoJPGRlZnM+DQoJCTxzdHlsZT4NCgkJCS5vdmVyIHsNCgkJCQlmaWxsOiB7bGlzdEl0ZW0ubGFiZWwub3Zlcn07DQoJCQkJb3BhY2l0eTogMC43Ow0KCQkJCWlzb2xhdGlvbjppc29sYXRlOw0KCQkJfQ0KCQk8L3N0eWxlPg0KCTwvZGVmcz4NCgk8cGF0aCBjbGFzcz0ib3ZlciIgZD0iTTEwLDBIMkEyLDIsMCwwLDAsMCwyVjE4bDItLjIyLDQtMy42Niw0LDMuNjZMMTIsMThWMkEyLDIsMCwwLDAsMTAsMFpNMiwyaDhWMTQuNDlsLTQtMy00LDNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwKSIvPg0KPC9zdmc+"), +"data:image/svg+xml;base64,"+c("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMiAxOCIgd2lkdGg9IjEycHgiIGhlaWdodD0iMTZweCI+DQoJPGRlZnM+DQoJCTxzdHlsZT4NCgkJCS5zZWxlY3RlZCB7DQoJCQkJZmlsbDoge2xpc3RJdGVtLmxhYmVsLnByZXNzZWR9Ow0KCQkJCW9wYWNpdHk6IDAuNzsNCgkJCQlpc29sYXRpb246aXNvbGF0ZTsNCgkJCX0NCgkJPC9zdHlsZT4NCgk8L2RlZnM+DQoJPHBhdGggY2xhc3M9InNlbGVjdGVkIiBkPSJNMTAsMEgyQTIsMiwwLDAsMCwwLDJWMThsMi0uMjIsNC0zLjY2LDQsMy42NkwxMiwxOFYyQTIsMiwwLDAsMCwxMCwwWk0yLDJoOFYxNC40OWwtNC0zLTQsM1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDApIi8+DQo8L3N2Zz4="), +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPgo8cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHJ4PSI2IiBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIwLjciLz4KPGcgb3BhY2l0eT0iMC44Ij4KPHBhdGggZD0iTTUzLjUgMjVINTJDNTEuNjAyMiAyNSA1MS4yMjA2IDI1LjE1OCA1MC45MzkzIDI1LjQzOTNDNTAuNjU4IDI1LjcyMDYgNTAuNSAyNi4xMDIyIDUwLjUgMjYuNUM1MC41IDI2Ljg5NzggNTAuNjU4IDI3LjI3OTQgNTAuOTM5MyAyNy41NjA3QzUxLjIyMDYgMjcuODQyIDUxLjYwMjIgMjggNTIgMjhINTMuNUM1My44OTc4IDI4IDU0LjI3OTQgMjguMTU4IDU0LjU2MDcgMjguNDM5M0M1NC44NDIgMjguNzIwNiA1NSAyOS4xMDIyIDU1IDI5LjVWNDEuNTM3NUM1My43MDkzIDQwLjU0NTMgNTIuMTI4IDQwLjAwNSA1MC41IDQwQzQ5LjI3MTcgNDAuMDAwNiA0OC4wNjI0IDQwLjMwMjkgNDYuOTc4MyA0MC44ODAzQzQ1Ljg5NDIgNDEuNDU3NiA0NC45Njg1IDQyLjI5MjQgNDQuMjgyNSA0My4zMTEzQzQzLjcyNjEgNDIuNzM4NCA0My4wNjAzIDQyLjI4MjkgNDIuMzI0OCA0MS45NzE5QzQxLjU4OTIgNDEuNjYwOSA0MC43OTg2IDQxLjUwMDcgNDAgNDEuNTAwN0MzOS4yMDE0IDQxLjUwMDcgMzguNDEwOCA0MS42NjA5IDM3LjY3NTIgNDEuOTcxOUMzNi45Mzk3IDQyLjI4MjkgMzYuMjczOSA0Mi43Mzg0IDM1LjcxNzUgNDMuMzExM0MzNS4wMzE1IDQyLjI5MjQgMzQuMTA1OCA0MS40NTc2IDMzLjAyMTcgNDAuODgwM0MzMS45Mzc2IDQwLjMwMjkgMzAuNzI4MyA0MC4wMDA2IDI5LjUgNDBDMjcuODcyIDQwLjAwNSAyNi4yOTA3IDQwLjU0NTMgMjUgNDEuNTM3NVYyOS41QzI1IDI5LjEwMjIgMjUuMTU4IDI4LjcyMDYgMjUuNDM5MyAyOC40MzkzQzI1LjcyMDYgMjguMTU4IDI2LjEwMjIgMjggMjYuNSAyOEgyOEMyOC4zOTc4IDI4IDI4Ljc3OTQgMjcuODQyIDI5LjA2MDcgMjcuNTYwN0MyOS4zNDIgMjcuMjc5NCAyOS41IDI2Ljg5NzggMjkuNSAyNi41QzI5LjUgMjYuMTAyMiAyOS4zNDIgMjUuNzIwNiAyOS4wNjA3IDI1LjQzOTNDMjguNzc5NCAyNS4xNTggMjguMzk3OCAyNSAyOCAyNUgyNi41QzI1LjMwNjUgMjUgMjQuMTYxOSAyNS40NzQxIDIzLjMxOCAyNi4zMThDMjIuNDc0MSAyNy4xNjE5IDIyIDI4LjMwNjUgMjIgMjkuNVY0Ny41QzIyIDQ5LjQ4OTEgMjIuNzkwMiA1MS4zOTY4IDI0LjE5NjcgNTIuODAzM0MyNS42MDMyIDU0LjIwOTggMjcuNTEwOSA1NSAyOS41IDU1QzMxLjQ4OTEgNTUgMzMuMzk2OCA1NC4yMDk4IDM0LjgwMzMgNTIuODAzM0MzNi4yMDk4IDUxLjM5NjggMzcgNDkuNDg5MSAzNyA0Ny41QzM3IDQ2LjcwNDQgMzcuMzE2MSA0NS45NDEzIDM3Ljg3ODcgNDUuMzc4N0MzOC40NDEzIDQ0LjgxNjEgMzkuMjA0NCA0NC41IDQwIDQ0LjVDNDAuNzk1NiA0NC41IDQxLjU1ODcgNDQuODE2MSA0Mi4xMjEzIDQ1LjM3ODdDNDIuNjgzOSA0NS45NDEzIDQzIDQ2LjcwNDQgNDMgNDcuNUM0MyA0OS40ODkxIDQzLjc5MDIgNTEuMzk2OCA0NS4xOTY3IDUyLjgwMzNDNDYuNjAzMiA1NC4yMDk4IDQ4LjUxMDkgNTUgNTAuNSA1NUM1Mi40ODkxIDU1IDU0LjM5NjggNTQuMjA5OCA1NS44MDMzIDUyLjgwMzNDNTcuMjA5OCA1MS4zOTY4IDU4IDQ5LjQ4OTEgNTggNDcuNVYyOS41QzU4IDI4LjMwNjUgNTcuNTI1OSAyNy4xNjE5IDU2LjY4MiAyNi4zMThDNTUuODM4MSAyNS40NzQxIDU0LjY5MzUgMjUgNTMuNSAyNVpNMjkuNSA1MkMyOC42MSA1MiAyNy43NCA1MS43MzYxIDI2Ljk5OTkgNTEuMjQxNkMyNi4yNTk5IDUwLjc0NzEgMjUuNjgzMSA1MC4wNDQzIDI1LjM0MjUgNDkuMjIyMUMyNS4wMDE5IDQ4LjM5OTggMjQuOTEyOCA0Ny40OTUgMjUuMDg2NSA0Ni42MjIxQzI1LjI2MDEgNDUuNzQ5MiAyNS42ODg3IDQ0Ljk0NzQgMjYuMzE4IDQ0LjMxOEMyNi45NDc0IDQzLjY4ODcgMjcuNzQ5MiA0My4yNjAxIDI4LjYyMjEgNDMuMDg2NUMyOS40OTUgNDIuOTEyOCAzMC4zOTk4IDQzLjAwMTkgMzEuMjIyMSA0My4zNDI1QzMyLjA0NDMgNDMuNjgzMSAzMi43NDcxIDQ0LjI1OTkgMzMuMjQxNiA0NC45OTk5QzMzLjczNjEgNDUuNzQgMzQgNDYuNjEgMzQgNDcuNUMzNCA0OC42OTM1IDMzLjUyNTkgNDkuODM4MSAzMi42ODIgNTAuNjgyQzMxLjgzODEgNTEuNTI1OSAzMC42OTM1IDUyIDI5LjUgNTJaTTUwLjUgNTJDNDkuNjEgNTIgNDguNzQgNTEuNzM2MSA0Ny45OTk5IDUxLjI0MTZDNDcuMjU5OSA1MC43NDcxIDQ2LjY4MzEgNTAuMDQ0MyA0Ni4zNDI1IDQ5LjIyMjFDNDYuMDAxOSA0OC4zOTk4IDQ1LjkxMjggNDcuNDk1IDQ2LjA4NjUgNDYuNjIyMUM0Ni4yNjAxIDQ1Ljc0OTIgNDYuNjg4NyA0NC45NDc0IDQ3LjMxOCA0NC4zMThDNDcuOTQ3NCA0My42ODg3IDQ4Ljc0OTIgNDMuMjYwMSA0OS42MjIxIDQzLjA4NjVDNTAuNDk1IDQyLjkxMjggNTEuMzk5OCA0My4wMDE5IDUyLjIyMjEgNDMuMzQyNUM1My4wNDQzIDQzLjY4MzEgNTMuNzQ3MSA0NC4yNTk5IDU0LjI0MTYgNDQuOTk5OUM1NC43MzYxIDQ1Ljc0IDU1IDQ2LjYxIDU1IDQ3LjVDNTUgNDguNjkzNSA1NC41MjU5IDQ5LjgzODEgNTMuNjgyIDUwLjY4MkM1Mi44MzgxIDUxLjUyNTkgNTEuNjkzNSA1MiA1MC41IDUyWiIgZmlsbD0id2hpdGUiLz4KPC9nPgo8L2c+CjxkZWZzPgo8ZmlsdGVyIGlkPSJmaWx0ZXIwX2QiIHg9IjAiIHk9IjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSI4MCIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgo8ZmVDb2xvck1hdHJpeCBpbj0iU291cmNlQWxwaGEiIHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMCIvPgo8ZmVPZmZzZXQvPgo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0Ii8+CjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwLjI1IDAiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3ciLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3ciIHJlc3VsdD0ic2hhcGUiLz4KPC9maWx0ZXI+CjwvZGVmcz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPgo8cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHJ4PSI2IiBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIwLjgiLz4KPHBhdGggZD0iTTUzLjUgMjVINTJDNTEuNjAyMiAyNSA1MS4yMjA2IDI1LjE1OCA1MC45MzkzIDI1LjQzOTNDNTAuNjU4IDI1LjcyMDYgNTAuNSAyNi4xMDIyIDUwLjUgMjYuNUM1MC41IDI2Ljg5NzggNTAuNjU4IDI3LjI3OTQgNTAuOTM5MyAyNy41NjA3QzUxLjIyMDYgMjcuODQyIDUxLjYwMjIgMjggNTIgMjhINTMuNUM1My44OTc4IDI4IDU0LjI3OTQgMjguMTU4IDU0LjU2MDcgMjguNDM5M0M1NC44NDIgMjguNzIwNiA1NSAyOS4xMDIyIDU1IDI5LjVWNDEuNTM3NUM1My43MDkzIDQwLjU0NTMgNTIuMTI4IDQwLjAwNSA1MC41IDQwQzQ5LjI3MTcgNDAuMDAwNiA0OC4wNjI0IDQwLjMwMjkgNDYuOTc4MyA0MC44ODAzQzQ1Ljg5NDIgNDEuNDU3NiA0NC45Njg1IDQyLjI5MjQgNDQuMjgyNSA0My4zMTEzQzQzLjcyNjEgNDIuNzM4NCA0My4wNjAzIDQyLjI4MjkgNDIuMzI0OCA0MS45NzE5QzQxLjU4OTIgNDEuNjYwOSA0MC43OTg2IDQxLjUwMDcgNDAgNDEuNTAwN0MzOS4yMDE0IDQxLjUwMDcgMzguNDEwOCA0MS42NjA5IDM3LjY3NTIgNDEuOTcxOUMzNi45Mzk3IDQyLjI4MjkgMzYuMjczOSA0Mi43Mzg0IDM1LjcxNzUgNDMuMzExM0MzNS4wMzE1IDQyLjI5MjQgMzQuMTA1OCA0MS40NTc2IDMzLjAyMTcgNDAuODgwM0MzMS45Mzc2IDQwLjMwMjkgMzAuNzI4MyA0MC4wMDA2IDI5LjUgNDBDMjcuODcyIDQwLjAwNSAyNi4yOTA3IDQwLjU0NTMgMjUgNDEuNTM3NVYyOS41QzI1IDI5LjEwMjIgMjUuMTU4IDI4LjcyMDYgMjUuNDM5MyAyOC40MzkzQzI1LjcyMDYgMjguMTU4IDI2LjEwMjIgMjggMjYuNSAyOEgyOEMyOC4zOTc4IDI4IDI4Ljc3OTQgMjcuODQyIDI5LjA2MDcgMjcuNTYwN0MyOS4zNDIgMjcuMjc5NCAyOS41IDI2Ljg5NzggMjkuNSAyNi41QzI5LjUgMjYuMTAyMiAyOS4zNDIgMjUuNzIwNiAyOS4wNjA3IDI1LjQzOTNDMjguNzc5NCAyNS4xNTggMjguMzk3OCAyNSAyOCAyNUgyNi41QzI1LjMwNjUgMjUgMjQuMTYxOSAyNS40NzQxIDIzLjMxOCAyNi4zMThDMjIuNDc0MSAyNy4xNjE5IDIyIDI4LjMwNjUgMjIgMjkuNVY0Ny41QzIyIDQ5LjQ4OTEgMjIuNzkwMiA1MS4zOTY4IDI0LjE5NjcgNTIuODAzM0MyNS42MDMyIDU0LjIwOTggMjcuNTEwOSA1NSAyOS41IDU1QzMxLjQ4OTEgNTUgMzMuMzk2OCA1NC4yMDk4IDM0LjgwMzMgNTIuODAzM0MzNi4yMDk4IDUxLjM5NjggMzcgNDkuNDg5MSAzNyA0Ny41QzM3IDQ2LjcwNDQgMzcuMzE2MSA0NS45NDEzIDM3Ljg3ODcgNDUuMzc4N0MzOC40NDEzIDQ0LjgxNjEgMzkuMjA0NCA0NC41IDQwIDQ0LjVDNDAuNzk1NiA0NC41IDQxLjU1ODcgNDQuODE2MSA0Mi4xMjEzIDQ1LjM3ODdDNDIuNjgzOSA0NS45NDEzIDQzIDQ2LjcwNDQgNDMgNDcuNUM0MyA0OS40ODkxIDQzLjc5MDIgNTEuMzk2OCA0NS4xOTY3IDUyLjgwMzNDNDYuNjAzMiA1NC4yMDk4IDQ4LjUxMDkgNTUgNTAuNSA1NUM1Mi40ODkxIDU1IDU0LjM5NjggNTQuMjA5OCA1NS44MDMzIDUyLjgwMzNDNTcuMjA5OCA1MS4zOTY4IDU4IDQ5LjQ4OTEgNTggNDcuNVYyOS41QzU4IDI4LjMwNjUgNTcuNTI1OSAyNy4xNjE5IDU2LjY4MiAyNi4zMThDNTUuODM4MSAyNS40NzQxIDU0LjY5MzUgMjUgNTMuNSAyNVpNMjkuNSA1MkMyOC42MSA1MiAyNy43NCA1MS43MzYxIDI2Ljk5OTkgNTEuMjQxNkMyNi4yNTk5IDUwLjc0NzEgMjUuNjgzMSA1MC4wNDQzIDI1LjM0MjUgNDkuMjIyMUMyNS4wMDE5IDQ4LjM5OTggMjQuOTEyOCA0Ny40OTUgMjUuMDg2NSA0Ni42MjIxQzI1LjI2MDEgNDUuNzQ5MiAyNS42ODg3IDQ0Ljk0NzQgMjYuMzE4IDQ0LjMxOEMyNi45NDc0IDQzLjY4ODcgMjcuNzQ5MiA0My4yNjAxIDI4LjYyMjEgNDMuMDg2NUMyOS40OTUgNDIuOTEyOCAzMC4zOTk4IDQzLjAwMTkgMzEuMjIyMSA0My4zNDI1QzMyLjA0NDMgNDMuNjgzMSAzMi43NDcxIDQ0LjI1OTkgMzMuMjQxNiA0NC45OTk5QzMzLjczNjEgNDUuNzQgMzQgNDYuNjEgMzQgNDcuNUMzNCA0OC42OTM1IDMzLjUyNTkgNDkuODM4MSAzMi42ODIgNTAuNjgyQzMxLjgzODEgNTEuNTI1OSAzMC42OTM1IDUyIDI5LjUgNTJaTTUwLjUgNTJDNDkuNjEgNTIgNDguNzQgNTEuNzM2MSA0Ny45OTk5IDUxLjI0MTZDNDcuMjU5OSA1MC43NDcxIDQ2LjY4MzEgNTAuMDQ0MyA0Ni4zNDI1IDQ5LjIyMjFDNDYuMDAxOSA0OC4zOTk4IDQ1LjkxMjggNDcuNDk1IDQ2LjA4NjUgNDYuNjIyMUM0Ni4yNjAxIDQ1Ljc0OTIgNDYuNjg4NyA0NC45NDc0IDQ3LjMxOCA0NC4zMThDNDcuOTQ3NCA0My42ODg3IDQ4Ljc0OTIgNDMuMjYwMSA0OS42MjIxIDQzLjA4NjVDNTAuNDk1IDQyLjkxMjggNTEuMzk5OCA0My4wMDE5IDUyLjIyMjEgNDMuMzQyNUM1My4wNDQzIDQzLjY4MzEgNTMuNzQ3MSA0NC4yNTk5IDU0LjI0MTYgNDQuOTk5OUM1NC43MzYxIDQ1Ljc0IDU1IDQ2LjYxIDU1IDQ3LjVDNTUgNDguNjkzNSA1NC41MjU5IDQ5LjgzODEgNTMuNjgyIDUwLjY4MkM1Mi44MzgxIDUxLjUyNTkgNTEuNjkzNSA1MiA1MC41IDUyWiIgZmlsbD0id2hpdGUiLz4KPC9nPgo8ZGVmcz4KPGZpbHRlciBpZD0iZmlsdGVyMF9kIiB4PSIwIiB5PSIwIiB3aWR0aD0iODAiIGhlaWdodD0iODAiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLz4KPGZlT2Zmc2V0Lz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIvPgo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4yNSAwIi8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93Ii8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9kcm9wU2hhZG93IiByZXN1bHQ9InNoYXBlIi8+CjwvZmlsdGVyPgo8L2RlZnM+Cjwvc3ZnPgo=", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iNiIgZmlsbD0iYmxhY2siIGZpbGwtb3BhY2l0eT0iMC44Ii8+CjxwYXRoIGQ9Ik00NS41IDE3SDQ0QzQzLjYwMjIgMTcgNDMuMjIwNiAxNy4xNTggNDIuOTM5MyAxNy40MzkzQzQyLjY1OCAxNy43MjA2IDQyLjUgMTguMTAyMiA0Mi41IDE4LjVDNDIuNSAxOC44OTc4IDQyLjY1OCAxOS4yNzk0IDQyLjkzOTMgMTkuNTYwN0M0My4yMjA2IDE5Ljg0MiA0My42MDIyIDIwIDQ0IDIwSDQ1LjVDNDUuODk3OCAyMCA0Ni4yNzk0IDIwLjE1OCA0Ni41NjA3IDIwLjQzOTNDNDYuODQyIDIwLjcyMDYgNDcgMjEuMTAyMiA0NyAyMS41VjMzLjUzNzVDNDUuNzA5MyAzMi41NDUzIDQ0LjEyOCAzMi4wMDUgNDIuNSAzMkM0MS4yNzE3IDMyLjAwMDYgNDAuMDYyNCAzMi4zMDI5IDM4Ljk3ODMgMzIuODgwM0MzNy44OTQyIDMzLjQ1NzYgMzYuOTY4NSAzNC4yOTI0IDM2LjI4MjUgMzUuMzExM0MzNS43MjYxIDM0LjczODQgMzUuMDYwMyAzNC4yODI5IDM0LjMyNDggMzMuOTcxOUMzMy41ODkyIDMzLjY2MDkgMzIuNzk4NiAzMy41MDA3IDMyIDMzLjUwMDdDMzEuMjAxNCAzMy41MDA3IDMwLjQxMDggMzMuNjYwOSAyOS42NzUyIDMzLjk3MTlDMjguOTM5NyAzNC4yODI5IDI4LjI3MzkgMzQuNzM4NCAyNy43MTc1IDM1LjMxMTNDMjcuMDMxNSAzNC4yOTI0IDI2LjEwNTggMzMuNDU3NiAyNS4wMjE3IDMyLjg4MDNDMjMuOTM3NiAzMi4zMDI5IDIyLjcyODMgMzIuMDAwNiAyMS41IDMyQzE5Ljg3MiAzMi4wMDUgMTguMjkwNyAzMi41NDUzIDE3IDMzLjUzNzVWMjEuNUMxNyAyMS4xMDIyIDE3LjE1OCAyMC43MjA2IDE3LjQzOTMgMjAuNDM5M0MxNy43MjA2IDIwLjE1OCAxOC4xMDIyIDIwIDE4LjUgMjBIMjBDMjAuMzk3OCAyMCAyMC43Nzk0IDE5Ljg0MiAyMS4wNjA3IDE5LjU2MDdDMjEuMzQyIDE5LjI3OTQgMjEuNSAxOC44OTc4IDIxLjUgMTguNUMyMS41IDE4LjEwMjIgMjEuMzQyIDE3LjcyMDYgMjEuMDYwNyAxNy40MzkzQzIwLjc3OTQgMTcuMTU4IDIwLjM5NzggMTcgMjAgMTdIMTguNUMxNy4zMDY1IDE3IDE2LjE2MTkgMTcuNDc0MSAxNS4zMTggMTguMzE4QzE0LjQ3NDEgMTkuMTYxOSAxNCAyMC4zMDY1IDE0IDIxLjVWMzkuNUMxNCA0MS40ODkxIDE0Ljc5MDIgNDMuMzk2OCAxNi4xOTY3IDQ0LjgwMzNDMTcuNjAzMiA0Ni4yMDk4IDE5LjUxMDkgNDcgMjEuNSA0N0MyMy40ODkxIDQ3IDI1LjM5NjggNDYuMjA5OCAyNi44MDMzIDQ0LjgwMzNDMjguMjA5OCA0My4zOTY4IDI5IDQxLjQ4OTEgMjkgMzkuNUMyOSAzOC43MDQ0IDI5LjMxNjEgMzcuOTQxMyAyOS44Nzg3IDM3LjM3ODdDMzAuNDQxMyAzNi44MTYxIDMxLjIwNDQgMzYuNSAzMiAzNi41QzMyLjc5NTYgMzYuNSAzMy41NTg3IDM2LjgxNjEgMzQuMTIxMyAzNy4zNzg3QzM0LjY4MzkgMzcuOTQxMyAzNSAzOC43MDQ0IDM1IDM5LjVDMzUgNDEuNDg5MSAzNS43OTAyIDQzLjM5NjggMzcuMTk2NyA0NC44MDMzQzM4LjYwMzIgNDYuMjA5OCA0MC41MTA5IDQ3IDQyLjUgNDdDNDQuNDg5MSA0NyA0Ni4zOTY4IDQ2LjIwOTggNDcuODAzMyA0NC44MDMzQzQ5LjIwOTggNDMuMzk2OCA1MCA0MS40ODkxIDUwIDM5LjVWMjEuNUM1MCAyMC4zMDY1IDQ5LjUyNTkgMTkuMTYxOSA0OC42ODIgMTguMzE4QzQ3LjgzODEgMTcuNDc0MSA0Ni42OTM1IDE3IDQ1LjUgMTdaTTIxLjUgNDRDMjAuNjEgNDQgMTkuNzQgNDMuNzM2MSAxOC45OTk5IDQzLjI0MTZDMTguMjU5OSA0Mi43NDcxIDE3LjY4MzEgNDIuMDQ0MyAxNy4zNDI1IDQxLjIyMjFDMTcuMDAxOSA0MC4zOTk4IDE2LjkxMjggMzkuNDk1IDE3LjA4NjUgMzguNjIyMUMxNy4yNjAxIDM3Ljc0OTIgMTcuNjg4NyAzNi45NDc0IDE4LjMxOCAzNi4zMThDMTguOTQ3NCAzNS42ODg3IDE5Ljc0OTIgMzUuMjYwMSAyMC42MjIxIDM1LjA4NjVDMjEuNDk1IDM0LjkxMjggMjIuMzk5OCAzNS4wMDE5IDIzLjIyMjEgMzUuMzQyNUMyNC4wNDQzIDM1LjY4MzEgMjQuNzQ3MSAzNi4yNTk5IDI1LjI0MTYgMzYuOTk5OUMyNS43MzYxIDM3Ljc0IDI2IDM4LjYxIDI2IDM5LjVDMjYgNDAuNjkzNSAyNS41MjU5IDQxLjgzODEgMjQuNjgyIDQyLjY4MkMyMy44MzgxIDQzLjUyNTkgMjIuNjkzNSA0NCAyMS41IDQ0Wk00Mi41IDQ0QzQxLjYxIDQ0IDQwLjc0IDQzLjczNjEgMzkuOTk5OSA0My4yNDE2QzM5LjI1OTkgNDIuNzQ3MSAzOC42ODMxIDQyLjA0NDMgMzguMzQyNSA0MS4yMjIxQzM4LjAwMTkgNDAuMzk5OCAzNy45MTI4IDM5LjQ5NSAzOC4wODY1IDM4LjYyMjFDMzguMjYwMSAzNy43NDkyIDM4LjY4ODcgMzYuOTQ3NCAzOS4zMTggMzYuMzE4QzM5Ljk0NzQgMzUuNjg4NyA0MC43NDkyIDM1LjI2MDEgNDEuNjIyMSAzNS4wODY1QzQyLjQ5NSAzNC45MTI4IDQzLjM5OTggMzUuMDAxOSA0NC4yMjIxIDM1LjM0MjVDNDUuMDQ0MyAzNS42ODMxIDQ1Ljc0NzEgMzYuMjU5OSA0Ni4yNDE2IDM2Ljk5OTlDNDYuNzM2MSAzNy43NCA0NyAzOC42MSA0NyAzOS41QzQ3IDQwLjY5MzUgNDYuNTI1OSA0MS44MzgxIDQ1LjY4MiA0Mi42ODJDNDQuODM4MSA0My41MjU5IDQzLjY5MzUgNDQgNDIuNSA0NFoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo="]; +return"/* reset styles */* {box-sizing: border-box;-webkit-touch-callout: none;-webkit-user-select: none;-ms-user-select: none;user-select: none; }input,textarea {-webkit-user-select: text;-ms-user-select: text;user-select: text; }html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video {margin: 0;padding: 0;border: 0; }/* HTML5 display-role reset for older browsers */article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section {display: block; }ol,ul {list-style: none; }table {border-collapse: collapse;border-spacing: 0; }div {-webkit-tap-highlight-color: rgba(0, 0, 0, 0);-webkit-user-drag: none; }input {-webkit-appearance: none;-moz-appearance: none; } input::-ms-clear {display: none; }.clear {clear: both; }*::-moz-focus-inner {border: 0; }.popup-layer {top: 0;right: 0;bottom: 0;left: 0;z-index: 1;position: absolute;border-radius: inherit; }.modal-layer {background: #000000;opacity: 0.4;position: absolute;width: 100%;height: 100%;border-radius: inherit; }.slide-transiting .quiz-uikit-primary-button {transition: none; }.slide-transiting .quiz-uikit-secondary-button {transition: none; }.slide-transiting .quiz-uikit-link-button {transition: none; }.slide-transiting .visuals-uikit-primary-button {transition: none; }.slide-transiting .visuals-uikit-secondary-button {transition: none; }.slide-transiting .visuals-uikit-link-button {transition: none; }.uikit-primary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-primary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-primary-button.uikit-primary-button_size_medium {padding: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:first-child {margin-left: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:last-child {margin-right: 10px; } .uikit-primary-button.uikit-primary-button_size_small {padding: 6px 12px; } .uikit-primary-button.uikit-primary-button_size_small .uikit-primary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-primary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__button-text {margin-right: 8px; } .uikit-primary-button__left-icon {margin-right: 8px; } .uikit-primary-button__button-text:first-child {margin-left: 0; } .uikit-primary-button__button-text:last-child {margin-right: 0; } .uikit-primary-button__left-icon:first-child {margin-left: 0; } .uikit-primary-button__left-icon:last-child {margin-right: 0; } .uikit-primary-button__right-icon:first-child {margin-left: 0; } .uikit-primary-button__right-icon:last-child {margin-right: 0; } .uikit-primary-button[disabled] {opacity: 0.4; } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-secondary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-secondary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-secondary-button.uikit-secondary-button_size_medium {padding: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:first-child {margin-left: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:last-child {margin-right: 10px; } .uikit-secondary-button.uikit-secondary-button_size_small {padding: 6px 12px; } .uikit-secondary-button.uikit-secondary-button_size_small .uikit-secondary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-secondary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__button-text {margin-right: 8px; } .uikit-secondary-button__left-icon {margin-right: 8px; } .uikit-secondary-button__button-text:first-child {margin-left: 0; } .uikit-secondary-button__button-text:last-child {margin-right: 0; } .uikit-secondary-button__left-icon:first-child {margin-left: 0; } .uikit-secondary-button__left-icon:last-child {margin-right: 0; } .uikit-secondary-button__right-icon:first-child {margin-left: 0; } .uikit-secondary-button__right-icon:last-child {margin-right: 0; } .uikit-secondary-button[disabled] {opacity: 0.4; } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-link-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-link-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-link-button.uikit-link-button_size_medium {padding: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text {font-size: 17px;line-height: 20px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:first-child {margin-left: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:last-child {margin-right: 10px; } .uikit-link-button.uikit-link-button_size_small {padding: 6px 12px; } .uikit-link-button.uikit-link-button_size_small .uikit-link-button__button-text {font-size: 14px;line-height: 20px; } .uikit-link-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__button-text {margin-right: 8px; } .uikit-link-button__left-icon {margin-right: 8px; } .uikit-link-button__button-text:first-child {margin-left: 0; } .uikit-link-button__button-text:last-child {margin-right: 0; } .uikit-link-button__left-icon:first-child {margin-left: 0; } .uikit-link-button__left-icon:last-child {margin-right: 0; } .uikit-link-button__right-icon:first-child {margin-left: 0; } .uikit-link-button__right-icon:last-child {margin-right: 0; } .uikit-link-button[disabled] {opacity: 0.4; } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-primary-button {background: var(--primary-button-background-color);color: var(--primary-button-text-color); } .uikit-primary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--primary-button-border-color);background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-primary-button__button-text {font-family: var(--font-family-bold);font-weight: 700; } .uikit-primary-button.uikit-primary-button_active, .uikit-primary-button[aria-pressed='true'], .uikit-primary-button:focus {background: var(--primary-button-background-color-active);color: var(--primary-button-text-color-active); } .uikit-primary-button.uikit-primary-button_active::after, .uikit-primary-button[aria-pressed='true']::after, .uikit-primary-button:focus::after {background: var(--primary-button-border-color-active);background-origin: border-box; }.uikit-secondary-button {background: var(--secondary-button-background-color);color: var(--secondary-button-text-color); } .uikit-secondary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--secondary-button-border-color);background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-secondary-button__button-text {font-family: var(--font-family-normal); } .uikit-secondary-button.uikit-secondary-button_active, .uikit-secondary-button[aria-pressed='true'], .uikit-secondary-button:focus {background: var(--secondary-button-background-color-active);color: var(--secondary-button-text-color-active); } .uikit-secondary-button.uikit-secondary-button_active::after, .uikit-secondary-button[aria-pressed='true']::after, .uikit-secondary-button:focus::after {background: var(--secondary-button-border-color-active);background-origin: border-box; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 15px; }.uikit-link-button {background: var(--link-button-background-color);color: var(--link-button-text-color);border: none; } .uikit-link-button.uikit-link-button_active, .uikit-link-button[aria-pressed='true'] {background: var(--link-button-background-color); }.uikit-collapsed-control {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;position: relative;overflow: hidden;padding: 10px;border: none;border-radius: var(--button-border-radius);background: var(--secondary-button-background-color-active);color: var(--secondary-button-text-color-active);transition-property: background, color;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-collapsed-control::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--secondary-button-border-color-active);background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-collapsed-control__collapsed-component {cursor: pointer;display: -ms-flexbox;display: flex; } .uikit-collapsed-control__expanded-component {margin-left: 8px;opacity: 1;transition-property: width, opacity;transition-duration: 300ms;transition-timing-function: ease; } .uikit-collapsed-control.uikit-collapsed-control_collapsed {background: var(--secondary-button-background-color);color: var(--secondary-button-text-color);padding-right: 2px; } .uikit-collapsed-control.uikit-collapsed-control_collapsed::after {background: var(--secondary-button-border-color);background-origin: border-box; } .uikit-collapsed-control.uikit-collapsed-control_collapsed .uikit-collapsed-control__expanded-component {width: 0;opacity: 0; } .uikit-collapsed-control[data-tooltip]::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 0; } .uikit-collapsed-control[data-tooltip]:hover::before {opacity: 1;visibility: visible; }.menu-base {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: start;align-items: start;font-family: var(--font-family-normal); }.menu-base-item {width: 100%;box-sizing: border-box;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;height: 44px;padding: 0 20px;color: var(--popup-text-color); } .menu-base-item__label {-ms-flex-positive: 1;flex-grow: 1;font-size: 15px;line-height: 20px;margin-left: 12px; } .menu-base-item__icon {width: 20px;height: 20px;-ms-flex-negative: 0;flex-shrink: 0;color: var(--popup-text-color); } .menu-base-item__value {-ms-flex-negative: 0;flex-shrink: 0;margin-left: 16px; } .menu-base-item.menu-base-item_clickable:hover {cursor: pointer;background: var(--popup-background-hover-color);color: var(--popup-text-hover-color); } .menu-base-item.menu-base-item_clickable:hover .menu-base-item__icon {color: var(--popup-text-hover-color); }.rate-menu {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;width: 100%;padding: 12px 0; } .rate-menu__caption {padding: 8px 20px;color: var(--popup-text-color);font-size: 16px;line-height: 22px;font-family: var(--font-family-bold);font-weight: 700; } .rate-menu__delimiter {width: 100%;height: 1px;background: var(--popup-text-color);opacity: 0.08;margin: 8px 0; }.presenter-info {font-family: var(--font-family-normal);box-sizing: border-box;position: relative;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;color: var(--panel-text-color); } .presenter-info__main {display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: start; } .presenter-info__info {display: inline-block;-ms-flex-positive: 1;flex-grow: 1; } .presenter-info__photo {width: 64px;height: 64px;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;overflow: hidden;border-radius: 50%;-ms-flex-negative: 0;flex-shrink: 0;background-repeat: no-repeat;background-position: center;margin-right: 20px; } .presenter-info__photo img {width: auto;height: auto; } .presenter-info__name {font-family: var(--font-family-bold);font-weight: 700;word-wrap: break-word;overflow: hidden;font-size: 16px;line-height: 22px;margin-bottom: 8px;max-height: 53px; } .presenter-info__job {word-wrap: break-word;overflow: hidden;font-size: 14px;line-height: 18px;margin-bottom: 8px; } .presenter-info__phone {word-wrap: break-word;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;font-size: 15px;line-height: 20px; } .presenter-info__links {display: -ms-flexbox;display: flex;margin-top: 8px; } .presenter-info__link {border: 1px solid var(--presenter-info-link-border-color);border-radius: 10px;width: 36px;height: 28px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;position: relative;color: var(--panel-text-color); } .presenter-info__link:not(:last-child) {margin-right: 8px; } .presenter-info__link::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 6px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .presenter-info__link:hover::before {opacity: 1;visibility: visible; } .presenter-info__link-icon {width: 20px;height: 20px; } .presenter-info .bio-container {position: relative;display: -webkit-box;white-space: normal;text-overflow: ellipsis;margin-right: -20px;margin-top: 20px;padding-right: 10px;font-size: 14px;line-height: 20px;-ms-flex-positive: 1;flex-grow: 1;height: 100%;max-height: 120px;overflow: hidden; } .presenter-info .bio-container.bio-container_collapsed {max-height: 60px; } .presenter-info .bio-container.bio-container_collapsed .scroll-area__bio {display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .presenter-info .bio-container .scroll-area {word-break: break-word;overflow: hidden; } .presenter-info .bio-container .container-top-shadow {background: __verticalGradient(var(--panel-color), transparent);background: linear-gradient(to bottom, var(--panel-color), transparent);position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; } .presenter-info .bio-container .container-bottom-shadow {background: __verticalGradient(transparent, var(--panel-color));background: linear-gradient(to bottom, transparent, var(--panel-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; } .presenter-info__show-more {font-size: 14px;line-height: 20px;height: 20px;opacity: 0.6;text-decoration: underline; } .presenter-info__show-more:hover {cursor: pointer;opacity: 0.8; } .presenter-info.presenter-info_popup {margin-bottom: 0; } .presenter-info.presenter-info_no-photo .presenter-info__info {width: 100%; }.attachments-info {font-family: var(--font-family-normal);position: relative;width: 100%;overflow: hidden;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column; } .attachments-info__scroll-area {height: 100%;overflow: hidden; } .attachments-info__delimiter {height: 1px;margin: 8px 20px 8px 62px;background: var(--popup-text-color);opacity: 0.08; } .attachments-info .container-top-shadow {background: __verticalGradient(var(--panel-color), transparent);background: linear-gradient(to bottom, var(--panel-color), transparent);position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; } .attachments-info .container-bottom-shadow {background: __verticalGradient(transparent, var(--panel-color));background: linear-gradient(to bottom, transparent, var(--panel-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; }.attach-item {padding: 8px 20px;box-sizing: border-box;display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: start;cursor: pointer; } .attach-item__icon-container {width: 36px;height: 36px;border-radius: 50%;background: var(--top-panel-icon-container-color);display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;-ms-flex-negative: 0;flex-shrink: 0;margin-right: 6px; } .attach-item__icon {width: 20px;height: 20px;color: var(--popup-text-color);opacity: 0.72; } .attach-item__info-container {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-positive: 1;flex-grow: 1;padding-left: 6px; } .attach-item__title {font-size: 15px;line-height: 20px;margin-bottom: 4px;color: var(--popup-text-color);word-break: break-word;max-height: 60px;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .attach-item__subtitle {font-size: 14px;line-height: 18px;color: var(--popup-text-color);opacity: 0.6; } .attach-item:hover {background: var(--list-item-background-hover-color); } .attach-item:hover .attach-item__title {color: var(--popup-text-hover-color); } .attach-item:hover .attach-item__subtitle {color: var(--popup-text-hover-color); } .attach-item:hover .attach-item__icon {color: var(--popup-text-hover-color); }:root {--page-background-color: __pageBackground__;--button-background-color: __primaryButtonBackground__;--button-hover-background-color: __primaryButtonBackgroundHover__;--button-hover-text-color: __primaryButtonTextHover__;--button-text-color: __primaryButtonText__;--company-logo-background-color: __asideLogoBackground__;--font-family-bold: PFnb;--font-family-bold-italic: PFnbi;--font-family-italic: PFni;--font-family-normal: PFn;--font-family-semibold: PFnsb, PFn;--font-family-semibold-italic: PFnsbi, PFni;--hyperlink-text-color: __hyperlink__;--list-item-background-hover-color: __asideElementBackgroundHover__;--list-item-background-pressed-color: __asideElementBackgroundActive__;--list-item-text-hover-color: __asideElementTextHover__;--list-item-text-pressed-color: __asideElementTextActive__;--list-item-text-visited-color: __asideElementTextVisited__;--panel-color: __asideBackground__;--panel-text-color: __asideElementText__;--panel-video-stub-background-color: __panelVideoStubBackgroundColor__;--panel-video-stub-color: __panelVideoStubColor__;--player-background-color: __playerBackground__;--progressbar-background-color: __progressBackground__;--progressbar-playback-color: __progressPlayback__;--slide-border-color: __slideBorder__;--text-color: __playerText__;--topbar-hover-background-color: __secondaryButtonBackgroundHover__;--topbar-text-color: __secondaryButtonText__;--primary-button-text-color: __primaryButtonText__;--primary-button-text-color-active: __primaryButtonTextHover__;--primary-button-background-color-active: __primaryButtonBackgroundHover__;--primary-button-background-color: __primaryButtonBackground__;--primary-button-border-color: __primaryButtonBorder__;--primary-button-border-color-active: __primaryButtonBorderHover__;--secondary-button-background-color: __secondaryButtonBackground__;--secondary-button-background-color-active: __secondaryButtonBackgroundHover__;--secondary-button-text-color: __secondaryButtonText__;--secondary-button-text-color-active: __secondaryButtonTextHover__;--secondary-button-border-color: __secondaryButtonBorder__;--secondary-button-border-color-active: __secondaryButtonBorderHover__;--volume-control-background-color: __volumeControlBackgroundColor__;--volume-control-playback-color: __volumeControlPlaybackColor__;--volume-control-thumb-color: __volumeControlThumbColor__;--more-menu-volume-control-background-color: __moreMenuVolumeControlBackgroundColor__;--more-menu-volume-control-playbackColor: __moreMenuVolumeControlPlaybackColor__;--more-menu-volume-control-thumb-color: __moreMenuVolumeControlThumbColor__;--popup-background-color: __popupBackground__;--popup-transparent-background-color: __transparentPopupBackground__;--popup-border: __popupBorder__;--popup-background-hover-color: __popupBackgroundHover__;--popup-text-color: __popupText__;--popup-text-hover-color: __popupTextHover__;--link-button-background-color: transparent;--link-button-text-color: __linkButtonTextColor__;--player-text: __playerText__;--button-border-radius: __borderRadius__;--presenter-info-link-border-color: __presenterInfoLinkBorderColor__;--search-field-background-color: __searchFieldBackgroundColor__;--hovered-tab-background-color: __hoveredTabBackgroundColor__;--selected-tab-background-color: __selectedTabBackgroundColor__;--top-panel-icon-container-color: __topPanelIconContainerColor__;--mini-skin-menu-button-text: __miniSkinMenuButtonText__;--mini-skin-menu-button-background-active: __miniSkinMenuButtonBackgroundActive__;--mini-skin-top-bottom-panel-border: __miniSkinTopBottomPanelBorder__;--mini-skin-presenter-delimiter-color: __miniSkinPresenterDelimiterColor__;--top-bottom-panel-border-color: __topBottomPanelBorderColor__; }.logo-container {display: -ms-flexbox;display: flex; } .logo-container > a {display: -ms-flexbox;display: flex; }.top-panel {display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;-ms-flex-pack: justify;justify-content: space-between;height: 52px;padding: 0 16px;border-bottom: 1px solid var(--top-bottom-panel-border-color);box-sizing: border-box;will-change: transform; } .top-panel.top-panel_reversed {-ms-flex-direction: row-reverse;flex-direction: row-reverse; } .top-panel__container {display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;-ms-flex-align: center;align-items: center; } .top-panel__presenter-info {max-width: 400px;padding: 32px 28px; }.top-main-container {display: -ms-flexbox;display: flex;-ms-flex-positive: 1;flex-grow: 1;-ms-flex-pack: justify;justify-content: space-between;max-height: 100%; } .top-main-container .info-container {margin-left: auto; } .top-main-container .info-container__item:first-child {margin-right: 20px; } .top-main-container .info-container__item:last-child {margin-right: 0; } .top-main-container.top-main-container_reversed {-ms-flex-direction: row-reverse;flex-direction: row-reverse; } .top-main-container.top-main-container_reversed .info-container {margin-right: auto;margin-left: 0;-ms-flex-direction: row-reverse;flex-direction: row-reverse; } .top-main-container.top-main-container_reversed .info-container__item:first-child {margin-right: 0; } .top-main-container.top-main-container_reversed .info-container__item:last-child {margin-right: 20px; }.buttons-container {-ms-flex-negative: 0;flex-shrink: 0; } .buttons-container__button {margin-right: 8px; }.info-container {overflow: hidden; } .info-container__title {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;overflow: hidden;color: var(--text-color);max-width: 480px; } .info-container__title > div {font-family: var(--font-family-normal);font-size: 14px;line-height: 20px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; }.popups-layer {position: absolute;margin-left: 0 !important;left: 0;top: 0;width: 100%; } .popups-layer .popup {background: var(--popup-background-color);border: 1px solid var(--popup-border);box-shadow: 0 20px 32px rgba(0, 0, 0, 0.16);-webkit-backdrop-filter: blur(8px);backdrop-filter: blur(8px);border-radius: 10px;position: absolute;top: 0;left: 0; } .popups-layer .popup.popup_outline-popup {width: 280px; } .popups-layer .popup.popup_presenter .mask {width: calc(100% - 2px);left: 1px;bottom: 12px; } .popups-layer .popup.popup_attachments {width: 368px;box-sizing: border-box; }.notes-popup {position: relative;font-size: 15px;line-height: 20px;word-wrap: break-word;width: 372px;padding: 16px;border-radius: inherit; } .notes-popup__scroll-area {overflow: hidden;height: 100%; } .notes-popup .notes-text {word-wrap: break-word; } .notes-popup .notes-text p {margin-top: 0;margin-bottom: 0;white-space: pre-wrap; } .notes-popup .notes-text p, .notes-popup .notes-text span {color: var(--panel-text-color) !important; } .notes-popup .notes-text p:first-child {margin-top: 0; } .notes-popup .notes-text p:last-child {margin-bottom: 0; } .notes-popup .notes-text p, .notes-popup .notes-text p.bold span.nobold, .notes-popup .notes-text p.italic span.noitalic, .notes-popup .notes-text p.bold.italic span.nobold.noitalic {font-family: var(--font-family-normal); } .notes-popup .notes-text p span.bold, .notes-popup .notes-text p.bold, .notes-popup .notes-text p.italic span.bold.noitalic, .notes-popup .notes-text p.bold.italic span.noitalic {font-family: var(--font-family-bold); } .notes-popup .notes-text p span.italic, .notes-popup .notes-text p.bold span.nobold.italic, .notes-popup .notes-text p.italic, .notes-popup .notes-text p.bold.italic span.nobold {font-family: var(--font-family-italic); } .notes-popup .notes-text p span.bold.italic, .notes-popup .notes-text p.bold span.italic, .notes-popup .notes-text p.italic span.bold, .notes-popup .notes-text p.bold.italic {font-family: var(--font-family-bold-italic); }.attachments-popup {padding: 12px 0;border-radius: inherit; }.progress-tooltip {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;z-index: 1; } .progress-tooltip__thumbnail-tooltip {border: 2px var(--top-bottom-bar-background-color) solid;border-radius: 3px;width: 140px;height: 80px;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out; } .progress-tooltip__timing-tooltip {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: 4px; }.universal-skin-separator {position: relative;width: 100%;padding-top: 1px; } .universal-skin-separator::after {content: '';display: block;height: 1px;background: var(--top-bottom-panel-border-color); }.progressbar {position: relative;height: 2px;width: 100%; } .progressbar__progress {position: absolute;top: 0;left: 0;width: 100%;height: 100%;background-color: var(--progressbar-background-color);transition: transform 0.3s ease-in-out; } .progressbar__progress-background {position: absolute;background: var(--progressbar-playback-color);top: 0;left: 0;height: 100%;transition: transform 0.3s ease-in-out; } .progressbar__thumb {width: 12px;height: 12px;border-radius: 50%;background: var(--progressbar-playback-color);bottom: -5px;position: absolute;left: -6px;cursor: pointer; } .progressbar__progress-tooltip {position: absolute;top: -14px;-ms-transform: translateY(-100%);transform: translateY(-100%); }:root {--page-background-color: __pageBackground__;--button-background-color: __primaryButtonBackground__;--button-hover-background-color: __primaryButtonBackgroundHover__;--button-hover-text-color: __primaryButtonTextHover__;--button-text-color: __primaryButtonText__;--company-logo-background-color: __asideLogoBackground__;--font-family-bold: PFnb;--font-family-bold-italic: PFnbi;--font-family-italic: PFni;--font-family-normal: PFn;--font-family-semibold: PFnsb, PFn;--font-family-semibold-italic: PFnsbi, PFni;--hyperlink-text-color: __hyperlink__;--list-item-background-hover-color: __asideElementBackgroundHover__;--list-item-background-pressed-color: __asideElementBackgroundActive__;--list-item-text-hover-color: __asideElementTextHover__;--list-item-text-pressed-color: __asideElementTextActive__;--list-item-text-visited-color: __asideElementTextVisited__;--panel-color: __asideBackground__;--panel-text-color: __asideElementText__;--panel-video-stub-background-color: __panelVideoStubBackgroundColor__;--panel-video-stub-color: __panelVideoStubColor__;--player-background-color: __playerBackground__;--progressbar-background-color: __progressBackground__;--progressbar-playback-color: __progressPlayback__;--slide-border-color: __slideBorder__;--text-color: __playerText__;--topbar-hover-background-color: __secondaryButtonBackgroundHover__;--topbar-text-color: __secondaryButtonText__;--primary-button-text-color: __primaryButtonText__;--primary-button-text-color-active: __primaryButtonTextHover__;--primary-button-background-color-active: __primaryButtonBackgroundHover__;--primary-button-background-color: __primaryButtonBackground__;--primary-button-border-color: __primaryButtonBorder__;--primary-button-border-color-active: __primaryButtonBorderHover__;--secondary-button-background-color: __secondaryButtonBackground__;--secondary-button-background-color-active: __secondaryButtonBackgroundHover__;--secondary-button-text-color: __secondaryButtonText__;--secondary-button-text-color-active: __secondaryButtonTextHover__;--secondary-button-border-color: __secondaryButtonBorder__;--secondary-button-border-color-active: __secondaryButtonBorderHover__;--volume-control-background-color: __volumeControlBackgroundColor__;--volume-control-playback-color: __volumeControlPlaybackColor__;--volume-control-thumb-color: __volumeControlThumbColor__;--more-menu-volume-control-background-color: __moreMenuVolumeControlBackgroundColor__;--more-menu-volume-control-playbackColor: __moreMenuVolumeControlPlaybackColor__;--more-menu-volume-control-thumb-color: __moreMenuVolumeControlThumbColor__;--popup-background-color: __popupBackground__;--popup-transparent-background-color: __transparentPopupBackground__;--popup-border: __popupBorder__;--popup-background-hover-color: __popupBackgroundHover__;--popup-text-color: __popupText__;--popup-text-hover-color: __popupTextHover__;--link-button-background-color: transparent;--link-button-text-color: __linkButtonTextColor__;--player-text: __playerText__;--button-border-radius: __borderRadius__;--presenter-info-link-border-color: __presenterInfoLinkBorderColor__;--search-field-background-color: __searchFieldBackgroundColor__;--hovered-tab-background-color: __hoveredTabBackgroundColor__;--selected-tab-background-color: __selectedTabBackgroundColor__;--top-panel-icon-container-color: __topPanelIconContainerColor__;--mini-skin-menu-button-text: __miniSkinMenuButtonText__;--mini-skin-menu-button-background-active: __miniSkinMenuButtonBackgroundActive__;--mini-skin-top-bottom-panel-border: __miniSkinTopBottomPanelBorder__;--mini-skin-presenter-delimiter-color: __miniSkinPresenterDelimiterColor__;--top-bottom-panel-border-color: __topBottomPanelBorderColor__; }.more-menu-popup {padding: 12px 0; } .more-menu-popup .volume-slider-wrapper {width: 86px; } .more-menu-popup .volume-slider {position: relative;width: 80px;height: 3px; } .more-menu-popup .volume-slider__enlarged-click-area {position: absolute;cursor: pointer;width: 100%;height: 40px;top: 50%;-ms-transform: translateY(-50%);transform: translateY(-50%); } .more-menu-popup .volume-slider__background {position: absolute;width: 100%;height: 100%;background: var(--more-menu-volume-control-background-color); } .more-menu-popup .volume-slider__volume {position: absolute;background: var(--more-menu-volume-control-playbackColor);bottom: 0;left: 0;height: 100%;border-radius: 4px; } .more-menu-popup .volume-slider__track {position: relative;height: 100%; } .more-menu-popup .volume-slider__thumb {position: absolute;width: 12px;height: 12px;border-radius: 50%;background: var(--more-menu-volume-control-thumb-color);bottom: -4.5px;margin-left: -6px; }.collapsable-buttons-group {vertical-align: middle;display: -ms-inline-flexbox;display: inline-flex;-ms-flex-align: center;align-items: center;overflow: hidden;-ms-flex-positive: 1;flex-grow: 1;-ms-flex-negative: 1;flex-shrink: 1; } .collapsable-buttons-group__collapsable-button {margin-right: 8px; }.navigation-controls {display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;-ms-flex-align: center;align-items: center;position: relative; } .navigation-controls__button.navigation-controls__button_next {margin-left: 8px; } .navigation-controls__button.navigation-controls__button_prev {margin-left: 20px; } .navigation-controls__button.navigation-controls__button_locked {pointer-events: auto;cursor: url(data/lock.cur), no-drop; } .navigation-controls__label {font-size: 14px;color: var(--text-color);opacity: 0.72; }.play-controls-container {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative;-ms-flex-positive: 1;flex-grow: 1;-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;margin: 14px 16px; } .play-controls-container::before {content: '';display: inline-block;height: 100%;vertical-align: middle; } .play-controls-container__play-pause-button {margin-right: 8px; } .play-controls-container__outline-button {margin-right: 8px; }.universal-control-panel {font-family: var(--font-family-normal);display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;width: 100%;position: relative;-ms-transform-origin: 0 0;transform-origin: 0 0;min-height: 66px;will-change: transform; } .universal-control-panel .volume-slider-wrapper {width: 86px; } .universal-control-panel .volume-slider {position: relative;width: 80px;height: 3px; } .universal-control-panel .volume-slider__enlarged-click-area {position: absolute;cursor: pointer;width: 100%;height: 40px;top: 50%;-ms-transform: translateY(-50%);transform: translateY(-50%); } .universal-control-panel .volume-slider__background {position: absolute;width: 100%;height: 100%;background: var(--volume-control-background-color); } .universal-control-panel .volume-slider__volume {position: absolute;background: var(--volume-control-playback-color);bottom: 0;left: 0;height: 100%;border-radius: 4px; } .universal-control-panel .volume-slider__track {position: relative;height: 100%; } .universal-control-panel .volume-slider__thumb {position: absolute;width: 12px;height: 12px;border-radius: 50%;background: var(--volume-control-thumb-color);bottom: -4.5px;margin-left: -6px; } .universal-control-panel__navigation-controls {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;margin: 14px 16px 14px auto; } .universal-control-panel.universal-control-panel_interaction-mode .universal-control-panel__play-controls-container {display: none; } .universal-control-panel.universal-control-panel_hide-controls {visibility: hidden; }.universal-side-panel {width: 280px;height: 100%;overflow: hidden;z-index: 0;position: relative;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-transform-origin: left center;transform-origin: left center;background: var(--panel-color);color: var(--panel-text-color);vertical-align: top;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel__presenter-info {padding: 24px 20px;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel__presenter-info.universal-side-panel__presenter-info_with-delimiter::after {content: '';height: 1px;width: 240px;background: var(--popup-text-color);opacity: 0.08;position: absolute;bottom: 0;left: 20px; } .universal-side-panel .logo {width: 100%;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;-ms-flex-negative: 0;flex-shrink: 0;position: relative;background: var(--company-logo-background-color); } .universal-side-panel .logo.logo_has-logo {padding: 12px 0;min-height: 75px;max-height: 180px;max-width: 280px; } .universal-side-panel .logo a {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;height: 100%; } .universal-side-panel .logo a canvas {max-height: 156px;max-width: 280px; } .universal-side-panel .logo.logo_with-delimiter::after {content: '';height: 1px;width: 240px;background: var(--popup-text-color);opacity: 0.08;position: absolute;bottom: 0;left: 20px; } .universal-side-panel .video-container {box-sizing: border-box;overflow: hidden;margin-bottom: 12px;position: relative;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel .video-container::before {content: '';box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.04);position: absolute;z-index: 1;left: 0;top: 0;width: 100%;height: 100%;pointer-events: none; } .universal-side-panel__video-stub {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;box-sizing: border-box;-ms-flex-negative: 0;flex-shrink: 0;height: 158px;margin-bottom: 12px;background: var(--panel-video-stub-background-color);color: var(--panel-video-stub-color); } .universal-side-panel .playerView {box-sizing: border-box;overflow: hidden;position: relative;margin-bottom: 12px;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel .playerView::before {content: '';box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.04);position: absolute;z-index: 1;left: 0;top: 0;width: 100%;height: 100%;pointer-events: none; } .universal-side-panel__maximized {margin: 0;position: absolute;width: 36px;height: 36px;background: rgba(69, 69, 69, 0.84);color: #FFFFFF;border-radius: 10px;-webkit-backdrop-filter: blur(8px);backdrop-filter: blur(8px);left: 8px;bottom: 5px;z-index: 3;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center; } .universal-side-panel__maximized.universal-side-panel__maximized_at-left {right: 8px;left: auto; } .universal-side-panel__maximized.universal-side-panel__maximized_active {background: #454545; } .universal-side-panel__panel-title {color: var(--text-color);padding: 5px 8px 12px 8px; }.outline-info-panel {font-family: var(--font-family-normal);-ms-flex-positive: 1;flex-grow: 1;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;border-radius: inherit;height: 100%; } .outline-info-panel .outline-panel-header {display: -ms-flexbox;display: flex;-ms-flex-negative: 0;flex-shrink: 0;-ms-flex-align: center;align-items: center;width: 100%;height: 68px;padding: 16px 16px 16px 20px; } .outline-info-panel .outline-panel-header__switcher {display: -ms-flexbox;display: flex;-ms-flex-negative: 0;flex-shrink: 0;-ms-flex-positive: 1;flex-grow: 1; } .outline-info-panel .outline-panel-header__panel-title {font-family: var(--font-family-bold);font-size: 16px;line-height: 20px;color: var(--panel-text-color);-ms-flex-negative: 0;flex-shrink: 0;-ms-flex-positive: 1;flex-grow: 1; } .outline-info-panel .search-button {width: 36px;height: 36px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;color: var(--popup-text-color);cursor: pointer; } .outline-info-panel .search-button svg {width: 20px;height: 20px; } .outline-info-panel .clear-button {width: 36px;height: 36px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;color: var(--popup-text-color);cursor: pointer; } .outline-info-panel .clear-button svg {width: 20px;height: 20px; } .outline-info-panel .search-button {opacity: 0.72; } .outline-info-panel .clear-button {position: absolute;right: 4px;top: 2px;opacity: 0.6; } .outline-info-panel .search-wrapper {-ms-flex-positive: 1;flex-grow: 1;position: relative; } .outline-info-panel .search-field {position: relative;height: 40px;width: 100%;background: var(--search-field-background-color);border-radius: 8px;padding: 10px 44px 10px 16px;font-size: 15px;line-height: 20px;color: var(--panel-text-color);border: none;outline: none; } .outline-info-panel .search-field:-ms-input-placeholder {opacity: 0.4; } .outline-info-panel .search-field::placeholder {opacity: 0.4; } .outline-info-panel .panel-tab-button {font-family: var(--font-family-bold);display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;height: 36px;padding: 0 16px;border-radius: var(--button-border-radius);color: var(--panel-text-color);background: transparent;opacity: 0.72;transition: background 0.3s ease, color 0.3s ease, opacity 0.3s ease; } .outline-info-panel .panel-tab-button.panel-tab-button_active {background: var(--hovered-tab-background-color);color: var(--list-item-text-hover-color);opacity: 1; } .outline-info-panel .panel-tab-button.panel-tab-button_chosen {background: var(--selected-tab-background-color);color: var(--list-item-text-pressed-color);opacity: 1; } .outline-info-panel .panel-tab-button:not(:last-child) {margin-right: 4px; } .outline-info-panel.outline-info-panel_mode_notes .outline-info-panel__outline-container {display: none; } .outline-info-panel__notes-container {-ms-flex-positive: 1;flex-grow: 1;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;height: 100%; } .outline-info-panel__outline-container {-ms-flex-positive: 1;flex-grow: 1;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;height: 100%; } .outline-info-panel__outline-container {border-radius: inherit;border-top-left-radius: 0;border-top-right-radius: 0;height: 100%; } .outline-info-panel__notes-container {padding-bottom: 10px; } .outline-info-panel .outline {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;border-radius: inherit;height: 100%; } .outline-info-panel .notes {height: 100%;position: relative;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;padding-left: 12px; } .outline-info-panel .notes .notes-text {word-wrap: break-word;padding-right: 10px; } .outline-info-panel .notes .notes-text p {margin-top: 0;margin-bottom: 0;white-space: pre-wrap; } .outline-info-panel .notes .notes-text p, .outline-info-panel .notes .notes-text span {color: var(--panel-text-color) !important; } .outline-info-panel .notes .notes-text p:first-child {margin-top: 0; } .outline-info-panel .notes .notes-text p:last-child {margin-bottom: 0; } .outline-info-panel .notes .notes-text p, .outline-info-panel .notes .notes-text p.bold span.nobold, .outline-info-panel .notes .notes-text p.italic span.noitalic, .outline-info-panel .notes .notes-text p.bold.italic span.nobold.noitalic {font-family: var(--font-family-normal); } .outline-info-panel .notes .notes-text p span.bold, .outline-info-panel .notes .notes-text p.bold, .outline-info-panel .notes .notes-text p.italic span.bold.noitalic, .outline-info-panel .notes .notes-text p.bold.italic span.noitalic {font-family: var(--font-family-bold); } .outline-info-panel .notes .notes-text p span.italic, .outline-info-panel .notes .notes-text p.bold span.nobold.italic, .outline-info-panel .notes .notes-text p.italic, .outline-info-panel .notes .notes-text p.bold.italic span.nobold {font-family: var(--font-family-italic); } .outline-info-panel .notes .notes-text p span.bold.italic, .outline-info-panel .notes .notes-text p.bold span.italic, .outline-info-panel .notes .notes-text p.italic span.bold, .outline-info-panel .notes .notes-text p.bold.italic {font-family: var(--font-family-bold-italic); } .outline-info-panel .notes__scroll-area {overflow: hidden; } .outline-info-panel.outline-info-panel_mode_outline .outline-info-panel__notes-container {display: none; }.video-container.video-container_force-fit-video video {position: absolute;width: 100%;height: 100%;margin: auto;top: 0;right: 0;bottom: 0;left: 0; }.video-container video {background-color: black; }.marker-panel {font-family: var(--font-family-normal);padding: 12px 0;width: 260px; } .marker-panel__separator {position: relative;background: var(--popup-text-color);opacity: 0.08;height: 1px;margin: 3px 0; }.marker-panel-button {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative;padding: 4px 20px;opacity: 1;background-color: transparent;transition: background-color 0.28s ease-in-out;width: 100%; } .marker-panel-button__text {font-size: 15px;text-align: left;color: var(--popup-text-color); } .marker-panel-button.marker-panel-button_type_eraseAll, .marker-panel-button.marker-panel-button_type_endDrawing {padding: 14px 20px 14px 24px; } .marker-panel-button:focus, .marker-panel-button:hover {background-color: var(--list-item-background-hover-color); } .marker-panel-button:focus .marker-panel-button__text, .marker-panel-button:hover .marker-panel-button__text {color: var(--popup-text-hover-color); } .marker-panel-button:focus .marker-panel-button__item-icon, .marker-panel-button:hover .marker-panel-button__item-icon {color: var(--popup-text-hover-color); } .marker-panel-button[disabled] {opacity: 0.5;color: var(--popup-text-color);pointer-events: none; } .marker-panel-button[aria-selected='true'] {background-color: var(--list-item-background-pressed-color);color: var(--list-item-text-pressed-color); }.item-icon {width: 40px;height: 40px;background-color: var(--top-panel-icon-container-color);border-radius: 50%;margin-right: 10px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;color: var(--popup-text-color); } .item-icon__item-icon-image {width: 28px;height: 28px;color: inherit; }.marker-tool-container {position: absolute;top: 0; } .marker-tool-container.marker-tool-container_tool_line {cursor: url(data/marker.cur) 3 3, crosshair; } .marker-tool-container.marker-tool-container_tool_marker {cursor: url(data/highlighter.cur) 3 10, crosshair; } .marker-tool-container.marker-tool-container_tool_eraser {cursor: url(data/eraser.cur) 5 5, crosshair; }.draw-control {position: absolute; }.closed-caption-panel {position: absolute;height: 110px;width: 100%;bottom: 0;background-color: rgba(0, 0, 0, 0.5);padding: 13px 4px 7px 14px; } .closed-caption-panel__scroll-area {height: 100%; }.closed-captions {font-family: var(--font-family-normal);color: #FFFFFF;line-height: 19px;font-size: 14px;width: 100%;padding-right: 30px;word-wrap: break-word;white-space: pre-wrap;text-shadow: -1.4px 1.4px 2px rgba(0, 0, 0, 0.48); } .closed-captions p {position: relative !important;margin: 0; }.show-side-panel-button {position: absolute;top: 6px;z-index: 1001; } .show-side-panel-button.show-side-panel-button_side_left {left: 0; } .show-side-panel-button.show-side-panel-button_side_left .show-side-panel-button__button {left: -9px;border-radius: 0 25px 25px 0; } .show-side-panel-button.show-side-panel-button_side_right {right: 0; } .show-side-panel-button.show-side-panel-button_side_right .show-side-panel-button__button {left: 9px;border-radius: 25px 0 0 25px; } .show-side-panel-button.show-side-panel-button_side_right .show-side-panel-button__button.show-side-panel-button__button_active, .show-side-panel-button.show-side-panel-button_side_right .show-side-panel-button__button[aria-pressed='true'], .show-side-panel-button.show-side-panel-button_side_left .show-side-panel-button__button.show-side-panel-button__button_active, .show-side-panel-button.show-side-panel-button_side_left .show-side-panel-button__button[aria-pressed='true'] {background: var(--player-background-color);left: 0; } .show-side-panel-button__button {background: var(--player-background-color);box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.2);transition-property: left; }@keyframes preloader_spin {0% {transform: rotate(0deg); } 100% {transform: rotate(360deg); } }.message-box {background: var(--player-background-color);position: absolute;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;border-radius: 7px;min-width: 280px;padding: 40px;box-shadow: 0 8px 16px rgba(0, 0, 0, 0.08); } .message-box::after {content: '';box-sizing: border-box;border: 1px solid var(--popup-border);width: 100%;height: 100%;position: absolute;left: 0;top: 0;border-radius: 7px;pointer-events: none; } .message-box__content {position: relative;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-direction: column;flex-direction: column; } .message-box__icon {width: 24px;height: 24px;margin-bottom: 24px;position: relative;display: inline-block;color: var(--text-color);opacity: 0.72; } .message-box .message-box-buttons {position: relative;width: 100%;height: 36px; } .message-box .message-box-buttons__buttons {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center; } .message-box .message-box-buttons__window-button {margin: 0 4px; } .message-box .vertical-scrollbar {top: 40px; } .message-box__message-container {overflow: hidden;display: inline-block;max-width: 480px;vertical-align: top;position: relative; } .message-box__message {text-align: center;font-size: 16px;color: var(--text-color);text-overflow: ellipsis;overflow: hidden;position: relative;font-family: var(--font-family-normal); } .message-box__buttons {margin-top: 28px; }body {overflow: hidden;cursor: default; }:focus {outline: none; }button {cursor: pointer;margin: 0;border: 0;background: transparent; }#content {width: 100%;height: 100%; }.universal {font-family: var(--font-family-normal);display: -ms-flexbox;display: flex;overflow: hidden;position: relative;background: var(--player-background-color);-ms-transform-origin: 0 0;transform-origin: 0 0; } .universal.universal_left-panel {-ms-flex-direction: row-reverse;flex-direction: row-reverse; } .universal.universal_side-panel-hidden .universal__main-container {width: 100%; } .universal.universal_embedded-mode::after {content: '';top: 0;bottom: 0;left: 0;right: 0;position: absolute;border: 1px solid rgba(0, 0, 0, 0.12);pointer-events: none; }.main-container {position: relative;display: inline-block;z-index: 0;-ms-flex-positive: 1;flex-grow: 1; }.content-area {margin-left: auto;margin-right: auto;left: 0;right: 0;position: relative; } .content-area > div {position: absolute !important;top: 0;bottom: 0;margin-top: auto;margin-bottom: auto; } .content-area #playerView {position: absolute; } .content-area .preloader {width: 50px;height: 50px;position: absolute;top: 0;left: 0;bottom: 0;right: 0;margin: auto;border-radius: 10px;background-color: rgba(0, 0, 0, 0.5); } .content-area .preloader::after {content: '';position: absolute;background: url("+ +g[0]+");background-size: cover;top: 0;left: 0;bottom: 0;right: 0;animation: preloader_spin 1s infinite linear; } .content-area .float-panel-overlay {width: 100%;height: 100%;position: absolute;top: 0;left: 0; }.treecontrol {position: relative;-webkit-overflow-scrolling: touch;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;border-radius: inherit; } .treecontrol .container-top-shadow {background: __verticalGradient(var(--panel-color), transparent);background: linear-gradient(to bottom, var(--panel-color), transparent);position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; } .treecontrol .container-bottom-shadow {background: __verticalGradient(transparent, var(--panel-color));background: linear-gradient(to bottom, transparent, var(--panel-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; } .treecontrol.treecontrol_locked {cursor: url(data/lock.cur), no-drop; }.launch-screen {z-index: 100;position: fixed;top: 0;right: 0;bottom: 0;left: 0;background-color: rgba(0, 0, 0, 0.48); } .launch-screen .launch-screen-button {top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 96px;height: 96px;position: absolute; } .launch-screen .launch-screen-button__play-icon {background-color: #FFFFFF;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 90px;height: 90px;box-shadow: 0 12px 50px 0 rgba(0, 0, 0, 0.2);transition: 0.3s ease-in-out; } .launch-screen .launch-screen-button__icon {background: url("+ +g[1]+") no-repeat center;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 6px;width: 90px;height: 90px; } .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__play-icon {width: 96px;height: 96px; } .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__icon {background: url("+g[2]+") no-repeat center; }body {margin: 0;padding: 0;overflow: hidden;cursor: default;-ms-touch-action: pan-y;touch-action: pan-y;-webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body .password_form, body .info_panel {position: absolute;background: #F7F7F7;border-radius: 4px;width: 513px;height: 210px;font-family: Arial; } body .password_form *, body .info_panel * {box-sizing: border-box; } body .password_form .password_label {position: absolute;color: #3A3A3A;font-size: 15px;top: 63px;left: 55px; } body .password_form .wrong_password_label {position: absolute;color: #DD4A37;font-size: 12px;top: 131px;left: 55px; } body .password_form input {position: absolute;width: 330px;height: 32px;background: #FFFFFF;border: 1px solid #D1D2D4;padding: 1px;border-radius: 2px;font-size: 18px;color: #231F20;left: 54px;top: 94px;padding-left: 8px; } body .password_form button {border: transparent;background: transparent;color: #343434;font-family: Arial;font-size: 15px;text-shadow: 0 1px 0 rgba(255, 255, 255, 0.4); } body .password_form button::before {background: linear-gradient(to bottom, #D3D3D3, #BABABA);position: absolute;content: '';top: 0;right: 0;bottom: 0;left: 0;border-radius: 4px;z-index: -1; } body .password_form button::after {background: linear-gradient(to bottom, #DCDCDC, #D1D1D1);position: absolute;content: '';top: 1px;right: 1px;bottom: 1px;left: 1px;border-radius: 4px;z-index: -1; } body .password_form .btn_ok {position: absolute;top: 94px;right: 55px;width: 60px;height: 32px;opacity: 0.99; } body .info_panel {display: table; } body .info_panel .label {position: static;display: table-cell;vertical-align: middle;width: 100%;padding-left: 120px;padding-right: 40px;color: #3A3A3A;font-size: 15px; } body .info_panel::after {position: absolute;content: '';width: 63px;height: 63px;top: 73px;left: 46px; } body .info_panel.domain::after {background: transparent url("+ +g[3]+"); } body .info_panel.time::after {background: transparent url("+g[4]+"); }.component_base,.component_container {position: absolute; }:focus {outline: none; }::-moz-focus-inner {border: 0; }input {-webkit-appearance: none;appearance: none; }button {cursor: pointer;margin: 0;border: 0; }button[disabled] {cursor: default; }.__player_view_id__ {position: absolute; } .__player_view_id__ > * {position: absolute; } .__player_view_id__ .slide {white-space: nowrap;font-size: 0; } .__player_view_id__ .slide a {text-decoration: none;cursor: pointer; } .__player_view_id__ .slide a img {border: 0; } .__player_view_id__ .slide * {-ms-transform-origin: 0 0;transform-origin: 0 0; } .__player_view_id__ .slide.relpos, .__player_view_id__ .slide .relpos {position: relative !important;vertical-align: top; } .__player_view_id__ .slide.kern, .__player_view_id__ .slide .kern {text-rendering: optimizeLegibility;font-feature-settings: 'kern' 1, 'liga' 0; } .__player_view_id__ .slide.nokern, .__player_view_id__ .slide .nokern {text-rendering: optimizeSpeed;font-feature-settings: 'kern' 0, 'liga' 0; } .__player_view_id__ .fullscreen {-ms-transform: none !important;transform: none !important;top: 0 !important;left: 0 !important; } .__player_view_id__ .fullscreen > video, .__player_view_id__ .fullscreen .video_player {background-color: black;width: __slide_width__ !important;height: __slide_height__ !important;z-index: 100;-ms-transform: none !important;transform: none !important; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen {background: url("+ +g[5]+") no-repeat; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen:hover {background: url("+g[6]+") no-repeat; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen:active {background: url("+g[7]+") no-repeat; } .__player_view_id__ .video_player video {width: 100%;height: 100%;margin: auto;top: 0;right: 0;bottom: 0;left: 0; } .__player_view_id__ .video_player video::cue {color: #FFFFFF;background-color: rgba(8, 8, 8, 0.75);border-radius: 4px;font-family: Helvetica, Roboto, Arial, sans-serif;line-height: 1.1; } .__player_view_id__ .video_player.poster_frame_hide_video video {display: none; } .__player_view_id__ .video_player.poster_frame video {opacity: 0; } .__player_view_id__ .video_player.poster_frame_hide_video .poster, .__player_view_id__ .video_player.poster_frame .poster {position: absolute;width: 100%;height: 100%; } .__player_view_id__ .video_player .controls {height: 36px;background: rgba(45, 50, 55, 0.85098);border: 1px solid #444648;cursor: default;border-radius: 4px; } .__player_view_id__ .video_player .controls, .__player_view_id__ .video_player .controls * {-webkit-backface-visibility: hidden;backface-visibility: hidden; } .__player_view_id__ .video_player .controls .progress {background-color: #75787A;height: 14px;left: 64px;top: 0;bottom: 0;margin-top: auto;margin-bottom: auto;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark {width: 10px;height: 10px;margin-top: -5px;margin-left: -5px;top: 50%;background: url("+ +g[8]+") no-repeat;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark:hover, .__player_view_id__ .video_player .controls .progress .bookmark:active {background: url("+g[9]+") no-repeat; } .__player_view_id__ .video_player .controls .progress .loading {background-color: #B1B3B5;height: 100%; } .__player_view_id__ .video_player .controls .progress .playing {background-color: #FFFFFF;height: 100%; } .__player_view_id__ .video_player .controls .progress .tooltip {background: url("+ +g[10]+") no-repeat;width: 60px;height: 25px;top: -33px;margin-left: -30px;font-family: Arial;font-size: 12px;padding-top: 2px;text-align: center; } .__player_view_id__ .video_player .controls .volume_popup {border-radius: 3px;background: rgba(45, 50, 55, 0.85098);top: -67px;right: 65px;padding: 8px;box-sizing: border-box;width: 28px;height: 64px; } .__player_view_id__ .video_player .controls .volume_popup .volume {background: url("+g[11]+");position: relative;cursor: pointer;width: 12px;height: 48px; } .__player_view_id__ .video_player .controls .volume_popup .volume .back {background: url("+ +g[12]+");width: 100%; } .__player_view_id__ .video_player .controls button {width: 100%;height: 100%; } .__player_view_id__ .video_player .controls button.rate {background: url("+g[13]+") no-repeat center; } .__player_view_id__ .video_player .controls button.rate.selected {background-color: rgba(255, 255, 255, 0.1); } .__player_view_id__ .video_player .controls button.mute {background: url("+g[14]+"); } .__player_view_id__ .video_player .controls button.mute:hover {background: url("+ +g[15]+"); } .__player_view_id__ .video_player .controls button.mute:active {background: url("+g[16]+"); } .__player_view_id__ .video_player .controls button.mute.selected {background: url("+g[17]+"); } .__player_view_id__ .video_player .controls button.mute.selected:hover {background: url("+g[18]+"); } .__player_view_id__ .video_player .controls button.mute.selected:active {background: url("+g[19]+"); } .__player_view_id__ .video_player .controls button.subtitles {background: url("+ +g[20]+") no-repeat center; } .__player_view_id__ .video_player .controls button.subtitles.selected {background-color: rgba(255, 255, 255, 0.1); } .__player_view_id__ .video_player .controls button.play {background: url("+g[21]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:hover {background: url("+g[22]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:active {background: url("+g[23]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected {background: url("+ +g[24]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:hover {background: url("+g[25]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:active {background: url("+g[26]+") no-repeat; } .__player_view_id__ .video_player .controls button.play::after {background: url("+g[27]+");width: 1px;height: 32px;right: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls button.toggle_fullscreen {background: url("+ +g[28]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:hover {background: url("+g[29]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:active {background: url("+g[30]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen::before {background: url("+g[27]+") no-repeat;width: 1px;height: 32px;left: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls .subtitles-list {width: 195px;right: 0;border-radius: 4px;border: solid 1px #444648;background-color: rgba(45, 50, 55, 0.85);font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;font-weight: normal;font-stretch: normal;font-style: normal;line-height: normal;letter-spacing: normal;padding: 3px 0;bottom: 37px; } .__player_view_id__ .video_player .controls .subtitles-list__caption {position: relative !important;padding: 12px 0 22px 0;color: #b8b8b8;text-align: center; } .__player_view_id__ .video_player .controls .subtitles-list__caption::after {position: absolute;content: '';width: calc(100% - 20px);left: 0;right: 0;bottom: 5px;margin: auto;border-bottom: 1px solid #444648; } .__player_view_id__ .video_player .controls .subtitles-list__item {color: #b8b8b8;position: relative !important;padding: 10px 2px 10px 35px;cursor: pointer;overflow: hidden;text-overflow: ellipsis; } .__player_view_id__ .video_player .controls .subtitles-list__item.subtitles-list__item_active {background-color: rgba(255, 255, 255, 0.1);color: #FFFFFF; } .__player_view_id__ .video_player .controls .subtitles-list__item[aria-selected='true'] {background-color: rgba(0, 0, 0, 0.24);color: #FFFFFF;padding-left: 12px; } .__player_view_id__ .video_player .controls .subtitles-list__item[aria-selected='true']::before {background: url("+ +g[31]+") no-repeat;width: 14px;height: 15px;padding-right: 23px;content: ''; } .__player_view_id__ .video_player .controls .toggle_fullscreen {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .play {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .rate {width: 32px;height: 34px;right: 95px;top: 0; } .__player_view_id__ .video_player .controls .rate.rate_subtitle-button-next {right: 127px; } .__player_view_id__ .video_player .controls .playback-rate-menu {width: 120px;right: 51px;border-radius: 4px;border: solid 1px #444648;background-color: rgba(45, 50, 55, 0.85);font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;font-weight: normal;font-stretch: normal;font-style: normal;line-height: normal;letter-spacing: normal;padding: 3px 0;bottom: 37px; } .__player_view_id__ .video_player .controls .playback-rate-menu.playback-rate-menu_subtitle-button-next {right: 83px; } .__player_view_id__ .video_player .controls .playback-rate-menu__caption {position: relative !important;padding: 12px 0 22px 0;color: #b8b8b8;text-align: center; } .__player_view_id__ .video_player .controls .playback-rate-menu__caption::after {position: absolute;content: '';width: calc(100% - 20px);left: 0;right: 0;bottom: 5px;margin: auto;border-bottom: 1px solid #444648; } .__player_view_id__ .video_player .controls .playback-rate-menu__item {color: #b8b8b8;position: relative !important;padding: 10px 2px 10px 35px;cursor: pointer;overflow: hidden;text-overflow: ellipsis; } .__player_view_id__ .video_player .controls .playback-rate-menu__item.playback-rate-menu__item_active {background-color: rgba(255, 255, 255, 0.1);color: #FFFFFF; } .__player_view_id__ .video_player .controls .playback-rate-menu__item[aria-selected='true'] {background-color: rgba(0, 0, 0, 0.24);color: #FFFFFF;padding-left: 12px; } .__player_view_id__ .video_player .controls .playback-rate-menu__item[aria-selected='true']::before {background: url("+ +g[31]+") no-repeat;width: 14px;height: 15px;padding-right: 23px;content: ''; } .__player_view_id__ .video_player .controls .subtitles {width: 32px;height: 34px;right: 95px;top: 0; } .__player_view_id__ .video_player .controls .toggle_fullscreen {right: -1px; } .__player_view_id__ .video_player .controls .mute {width: 22px;height: 22px;right: 67px;top: 6px; }.popup_layer {position: absolute; } .popup_layer .modal_layer {background: #000000;opacity: 0.4;z-index: 10;width: 100%;height: 100%; } .popup_layer .message_box, .popup_layer .confirm_window {background: #FFFFFF;border-radius: 5px;border: 1px solid rgba(0, 0, 0, 0.75);width: 357px;height: 150px;position: absolute;top: 0;right: 0;bottom: 0;left: 0;margin: auto;z-index: 10; } .popup_layer .message_box::after, .popup_layer .confirm_window::after {background-color: #E6E6E6;width: 100%;height: 1px;top: 30px;position: absolute;content: ''; } .popup_layer .message_box .title, .popup_layer .message_box .message, .popup_layer .confirm_window .title, .popup_layer .confirm_window .message {font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;color: #323232; } .popup_layer .message_box .title, .popup_layer .confirm_window .title {position: absolute;left: 13px;top: 7px;font-weight: bold;background: transparent; } .popup_layer .message_box .message, .popup_layer .confirm_window .message {position: absolute;top: 47px;left: 69px;margin-right: 25px; } .popup_layer .message_box .message::before, .popup_layer .confirm_window .message::before {background-color: #E6E6E6;width: 35px;height: 35px;left: -45px;position: absolute;content: ''; } .popup_layer .message_box button, .popup_layer .confirm_window button {font-size: 14px;border-radius: 5px;color: #323232;width: 68px;height: 30px; } .popup_layer .message_box button, .popup_layer .message_box button.mobile:hover, .popup_layer .message_box button.mobile:active, .popup_layer .confirm_window button, .popup_layer .confirm_window button.mobile:hover, .popup_layer .confirm_window button.mobile:active {background: #D4D4D4; } .popup_layer .message_box button:hover, .popup_layer .message_box button:active, .popup_layer .message_box button.mobile.active, .popup_layer .confirm_window button:hover, .popup_layer .confirm_window button:active, .popup_layer .confirm_window button.mobile.active {background: #B8B8B8; } .popup_layer .confirm_window button.btn_yes {left: 101px;top: 98px; } .popup_layer .confirm_window button.btn_no {left: 181px;top: 98px; } .popup_layer .confirm_window .message::before {background: url("+ +g[32]+"); } .popup_layer .message_box button.btn_ok {left: 141px;top: 98px; } .popup_layer .message_box .message::before {background: url("+g[33]+"); }.transitionSlide.paused * {animation-play-state: paused !important; }.framesLayer .video_player {-ms-transform-origin: 0 0;transform-origin: 0 0; }.framesLayer *:not(.framesLayerContent) {pointer-events: all; }.framesLayer .framesLayerContent {position: absolute; } .framesLayer .framesLayerContent > div {pointer-events: all; }.trial_banner {position: relative;transform: translateZ(0); } .trial_banner .banner-content, .trial_banner .banner-content_hover {position: absolute;left: 0;right: 0;top: 0;bottom: 0;width: 100%;height: 100%; } .trial_banner .banner-content {visibility: visible;z-index: 1; } .trial_banner .banner-content_hover {visibility: hidden;z-index: 0; } .trial_banner .days_remaining {position: absolute;font-family: 'Open Sans', Arial, sans-serif;font-weight: normal;font-size: 13px;left: 65px;top: 41px;color: #7C1645;z-index: 1; } .trial_banner:hover .banner-content {visibility: hidden;z-index: 0; } .trial_banner:hover .banner-content_hover {visibility: visible;z-index: 1; }.outline {font-family: var(--font-family-normal);position: relative; }.search-result {font-family: var(--font-family-bold);padding: 16px 0 8px 20px;position: relative;font-size: 15px;line-height: 20px;color: var(--popup-text-color); } .search-result.search-result_no-results {font-family: var(--font-family-normal);height: 100%;text-align: center;padding: 60px 0 0;opacity: 0.6; }.slide-item-view {position: relative;overflow: hidden;display: table;width: 100%;color: var(--panel-text-color);transition: background 0.28s ease; } .slide-item-view__content {height: 100%;display: table-row; } .slide-item-view__content > * {display: table-cell;vertical-align: middle; } .slide-item-view__open-button {width: 12px;height: 12px;margin: 0 8px 0 12px;opacity: 0.6;padding: 0;color: var(--popup-text-color);transition: transform 0.3s ease;background: transparent; } .slide-item-view__open-button[aria-pressed='true'] {-ms-transform: rotate(90deg);transform: rotate(90deg); } .slide-item-view__thumb {max-width: 100px;max-height: 60px;vertical-align: middle;margin-top: 1px;border: 1px solid rgba(0, 0, 0, 0.04);border-radius: 4px;background-color: var(--player-background-color); } .slide-item-view__status {position: absolute;width: 18px;height: 18px;background-size: 18px 18px; } .slide-item-view__status.slide-item-view__status_status_correct {background-image: url("+ +g[34]+"); } .slide-item-view__status.slide-item-view__status_status_partially {background-image: url("+g[35]+"); } .slide-item-view__status.slide-item-view__status_status_incorrect {background-image: url("+g[36]+"); } .slide-item-view__status.slide-item-view__status_status_answered {background-image: url("+g[37]+"); } .slide-item-view__status.slide-item-view__status_answered {background-image: url("+g[38]+"); } .slide-item-view__mark {position: absolute;width: 12px;height: 18px;top: 0;bottom: 0;margin: auto;background-image: url("+ +g[39]+");background-size: 12px 18px;background-repeat: no-repeat;margin-left: -40px; } .slide-item-view__mark.slide-item-view__mark_with-status {left: 8px; } .slide-item-view__title-container {width: 100%; } .slide-item-view__title {padding: 0 16px;font-size: 14px;line-height: 18px;max-height: 60px;word-break: break-word;overflow: hidden;display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .slide-item-view__title.slide-item-view__title_minimized {max-height: 70px; } .slide-item-view.slide-item-view_with-thumbnail .slide-item-view__title {padding-left: 11px; } .slide-item-view.slide-item-view_with-thumbnail .slide-item-view__mark {margin-left: -20px; } .slide-item-view.slide-item-view_active {background: var(--list-item-background-hover-color);color: var(--list-item-text-hover-color); } .slide-item-view.slide-item-view_active .slide-item-view__mark {background-image: url("+ +g[40]+"); } .slide-item-view[aria-selected='true'] {background: var(--list-item-background-pressed-color);color: var(--list-item-text-pressed-color); } .slide-item-view[aria-selected='true'] .slide-item-view__mark {background-image: url("+g[41]+"); }.treecontrol.treecontrol_highlight-viewed .slide-item-view.slide-item-view_viewed {color: var(--list-item-text-visited-color); }.treecontrol.treecontrol_highlight-viewed .slide-item-view.slide-item-view_viewed.slide-item-view_active {background: var(--list-item-background-hover-color);color: var(--list-item-text-hover-color); }.treecontrol.treecontrol_highlight-viewed .slide-item-view.slide-item-view_viewed[aria-selected='true'] {background: var(--list-item-background-pressed-color);color: var(--list-item-text-pressed-color); }.highlighted {font-family: var(--font-family-bold);padding: 2px 3px;margin: -2px -3px;font-size: 14px;line-height: 18px;color: var(--popup-text-color);opacity: 1; }.search-context {font-size: 14px;line-height: 18px;color: var(--popup-text-color);opacity: 0.6; }.container-top-shadow {background: __verticalGradient(var(--popup-background-color), var(--popup-transparent-background-color));background: linear-gradient(to bottom, var(--popup-background-color), var(--popup-transparent-background-color));position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; }.container-bottom-shadow {background: __verticalGradient(var(--popup-transparent-background-color), var(--popup-background-color));background: linear-gradient(to bottom, var(--popup-transparent-background-color), var(--popup-background-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; }.vertical-scrollbar {position: absolute;right: 0;top: 4px;bottom: 4px;width: 14px;transition: opacity 0.2s ease; } .vertical-scrollbar .thumb {position: absolute;width: 8px;right: 3px;padding: 1px;border-radius: 5px; } .vertical-scrollbar .thumb__background {height: 100%;border-radius: 4px;background-color: rgba(0, 0, 0, 0.32);border: 1px solid rgba(255, 255, 255, 0.12); }.vertical-scrollbar {transition: none;opacity: 0.5 !important; }.vertical-scrollbar .thumb {padding: 0;right: 0; } .vertical-scrollbar .thumb__background {height: 100%;border-radius: 20px;background-color: rgba(0, 0, 0, 0.16);border: 1px solid rgba(255, 255, 255, 0.12); }.presentation-view-mode-switch-control {width: 64px;height: 64px;position: fixed;left: 16px;top: 16px;cursor: pointer;border: none;background: url("+ +g[42]+") no-repeat center; } .presentation-view-mode-switch-control:not([disabled]):hover {background: url("+g[43]+") no-repeat center; } .presentation-view-mode-switch-control:not([disabled]):active {background: url("+g[44]+") no-repeat center; } .presentation-view-mode-switch-control:not([disabled]):focus {outline: none; } .presentation-view-mode-switch-control:not([disabled]):focus::before {content: '';position: absolute;top: 3px;bottom: 3px;left: 3px;right: 3px;border: 1px dotted #FFFFFF;opacity: 0.6; }"}(); +var e;for(const [g,h]of Object.entries(null!=(e=a)?e:{}))e=`__${g.replace(RegExp("\\.","g"),"_")}__`,d=d.replace(new RegExp(e,"g"),h);let f;for(const [g,h]of Object.entries(null!=(f=b)?f:{}))d=d.replace(new RegExp(g,"g"),h);d=d.replace(/__verticalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.Pk);d=d.replace(/__horizontalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.Ok);return gn(d)}Pk(a,b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}Ok(a, +b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}};var iG={mb_question_icon:'', +mb_warning_icon:'', +arrows_left:'',arrows_right:'', +"attachment-doc":'', +"attachment-image":'', +"attachment-link":'',"attachment-unknown":'', +"attachment-video":'', +attachments_button_icon:'', +"btn_pause_big.svg":' \t\t', +"btn_play_big.svg":' ', +cc:'', +cc_on:'', +chevron_left:'',chevron_right:'',collapse_icon:'', +erase_search:'', +exit_fullscreen:'', +"external-link":'',fullscreen:'', +"mail-link":'', +marker_eraser:'', +marker_highlighter:'', +marker_panel_button_icon:'', +marker_pen:'', +more:'', +next_btn:'',next_btn_mobile:'', +notes_button_icon:'', +outline:'', +outline_button_icon:'', +pause:'',play:'',play_pause_btn:' ', +presenter_info_button_icon:'',prev_btn:' ', +prev_btn_mobile:'',"rate-0.75x":'', +"rate-1.25x":'', +"rate-1.5x":'', +"rate-1x":'', +"rate-2x":'', +replay:'',search:'', +"tab-left":'',"tab-right":'',tab1:'', +tab2:'',tick:'', +video_maximize:'',"video_stub.svg":'', +volume_high:'', +volume_middle:'', +volume_mute:''};class jG{Yo(a,b){var c="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA5LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDksMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbD0iI0RENEIzOCIgZD0iTTIxLjA0MSwyOXY5Ljg0NGMwLDUuNTA4LDQuNjkxLDkuOTczLDEwLjQ3OSw5Ljk3M2M1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTczVjI5SDIxLjA0MXoiLz4NCjxwYXRoIGZpbGw9IiNERDRCMzgiIGQ9Ik0yNi41NTgsMjl2LTcuNjg5YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MlYyOWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNFYyOUgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjEuMDQxLDI4LjIwNnY5Ljg0NWMwLDUuNTA2LDQuNjkxLDkuOTcxLDEwLjQ3OSw5Ljk3MWM1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTcxdi05Ljg0NUgyMS4wNDF6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjYuNTU4LDI4LjA0VjIwLjM1YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MnY3LjY4OWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNHY4LjA1NEgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRjA4RjgyIiBkPSJNMzQsMzYuMzY1YzAtMS4yODctMS4wNDQtMi4zMzEtMi4zMzEtMi4zMzFjLTEuMjg4LDAtMi4zMzIsMS4wNDQtMi4zMzIsMi4zMzENCgljMCwwLjk3MSwwLjU5NCwxLjgwMiwxLjQzOCwyLjE1MnY0LjQ2N2gxLjkxdi00LjUyOUMzMy40NjEsMzguMDc2LDM0LDM3LjI4NywzNCwzNi4zNjV6Ii8+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA4LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDgsMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik01OS42NDYsMzFoLTMuMjkzQzU2LjE1OCwzMSw1NiwzMS40NDgsNTYsMzINCgljMCwwLjU1MywwLjE1OCwxLDAuMzU0LDFoMy4yOTNDNTkuODQyLDMzLDYwLDMyLjU1Myw2MCwzMkM2MCwzMS40NDgsNTkuODQyLDMxLDU5LjY0NiwzMXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjREQ0QjM4IiBkPSJNNi42NDcsMzFIMy4zNTNDMy4xNTgsMzEsMywzMS40NDgsMywzMmMwLDAuNTUzLDAuMTU4LDEsMC4zNTMsMQ0KCWgzLjI5NEM2Ljg0MiwzMyw3LDMyLjU1Myw3LDMyQzcsMzEuNDQ4LDYuODQyLDMxLDYuNjQ3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik0zMSw4YzAuNTUzLDAsMS0wLjE1OCwxLTAuMzUzVjQuMzUzQzMyLDQuMTU4LDMxLjU1Myw0LDMxLDQNCgljLTAuNTUyLDAtMSwwLjE1OC0xLDAuMzUzdjMuMjk0QzMwLDcuODQyLDMwLjQ0OCw4LDMxLDh6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTMxLDU2Yy0wLjU1MiwwLTEsMC4xNTgtMSwwLjM1NHYzLjI5M0MzMCw1OS44NDIsMzAuNDQ4LDYwLDMxLDYwDQoJYzAuNTUzLDAsMS0wLjE1OCwxLTAuMzU0di0zLjI5M0MzMiw1Ni4xNTgsMzEuNTUzLDU2LDMxLDU2eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik00Ny42NjgsMzFoLTEyLjgxQzM0LjQ5NiwyOS42LDMzLjQsMjguNTA1LDMyLDI4LjE0Mg0KCWMwLDAtMC4xNzItMC4xNDItMS0wLjE0MmMtMC44MjksMC0yLDAuNTU1LTIsMC41NTVjLTEuMTksMC42OTMtMiwxLjk2OS0yLDMuNDQ1YzAsMi4yMDksMS43OTEsNCw0LDRjMS40NzcsMCwyLjc1Mi0wLjgwOSwzLjQ0NS0yDQoJaDEzLjIyM0M0OC40MDQsMzQsNDksMzMuMzI4LDQ5LDMyLjVDNDksMzEuNjcyLDQ4LjQwNCwzMSw0Ny42NjgsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTI3LjAxOCwyOS43NDhjMC41OTIsMS4wMjUsMS42NTIsMS41MiwyLjM3LDEuMTA2bDAsMA0KCWMwLjcxNy0wLjQxNSwwLjgxOS0xLjU4MSwwLjIyOC0yLjYwNmwtNy44NTctMTMuNjA5Yy0wLjU5Mi0xLjAyNC0xLjY1My0xLjUyLTIuMzcxLTEuMTA2bDAsMGMtMC43MTcsMC40MTUtMC44MTgsMS41ODEtMC4yMjgsMi42MDUNCglMMjcuMDE4LDI5Ljc0OHoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMjcuMDE4LDI4LjM2MWMwLjU5MiwxLjAyNSwxLjY1MiwxLjUyLDIuMzcsMS4xMDZsMCwwDQoJYzAuNzE3LTAuNDE1LDAuODE5LTEuNTgxLDAuMjI4LTIuNjA2bC03Ljg1Ny0xMy42MDljLTAuNTkyLTEuMDI0LTEuNjUzLTEuNTItMi4zNzEtMS4xMDZsMCwwYy0wLjcxNywwLjQxNS0wLjgxOCwxLjU4MS0wLjIyOCwyLjYwNQ0KCUwyNy4wMTgsMjguMzYxeiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgY3g9IjMxIiBjeT0iMzEiIHI9IjQiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNjAsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzU0LDFoLTMuMjkzQzU2LjE1OCwzMiw1NiwzMS41NTIsNTYsMzENCglsMCwwYzAtMC41NTIsMC4xNTgtMSwwLjM1NC0xaDMuMjkzQzU5Ljg0MiwzMCw2MCwzMC40NDgsNjAsMzFMNjAsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTcsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzUzLDFIMy4zNTNDMy4xNTgsMzIsMywzMS41NTIsMywzMWwwLDANCgljMC0wLjU1MiwwLjE1OC0xLDAuMzUzLTFoMy4yOTRDNi44NDIsMzAsNywzMC40NDgsNywzMUw3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0zMSwzYzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDYuODQyLDMxLjU1Myw3LDMxLDdsMCwwDQoJYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1M1YzLjM1M0MzMCwzLjE1OCwzMC40NDgsMywzMSwzTDMxLDN6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTMxLDU1YzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDU4Ljg0MiwzMS41NTMsNTksMzEsNTkNCglsMCwwYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1NHYtMy4yOTRDMzAsNTUuMTU4LDMwLjQ0OCw1NSwzMSw1NUwzMSw1NXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNDksMzEuNDk5QzQ5LDMwLjY3Miw0OC40MDQsMzAsNDcuNjY4LDMwSDM0LjMzMw0KCUMzMy41OTYsMzAsMzMsMzAuNjcxLDMzLDMxLjVsMCwwYzAsMC44MjgsMC41OTYsMS41LDEuMzMzLDEuNWgxMy4zMzVDNDguNDA0LDMzLDQ5LDMyLjMyOCw0OSwzMS40OTlMNDksMzEuNDk5eiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YxNjE1NSIgY3g9IjMxIiBjeT0iMzEiIHI9IjIiLz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRjhCNDUwIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGQ0U2RCIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA4LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDgsMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGNEE2M0MiIGQ9Ik0zMS41MTQsMTNDMjUuNzA0LDEzLDIxLDE3Ljc0NiwyMSwyMy42MTMNCgljMCw0LjY2LDIuOTc2LDguNjI5LDcuMTEzLDEwLjAzOHYxOS4yMTRMMzEuNDg2LDU2TDM0LDUzdi0xbC0xLjA5OC0xLjQzN0wzNSw0OXYtMWwtMi0ydi0xbDItMXYtMWwtMi0xbDItNHYtNA0KCWM0LjA1My0xLjQ2Nyw3LTUuNzg0LDctMTAuMzg3QzQyLDE3Ljc0NiwzNy4yOTUsMTMsMzEuNTE0LDEzeiBNMjksNTFWMzRoMXYxOEwyOSw1MXogTTMxLjUsMjNjLTEuOTIxLDAtMy41LTEuNTUyLTMuNS0zLjQ4Mw0KCUMyOCwxNy41NTIsMjkuNTc4LDE2LDMxLjUsMTZjMS45MjIsMCwzLjUsMS41NTIsMy41LDMuNTE3QzM1LDIxLjQ0OCwzMy40MjIsMjMsMzEuNSwyM3oiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMzEuNTE0LDEyQzI1LjcwNCwxMiwyMSwxNi43NDYsMjEsMjIuNjEzDQoJYzAsNC42NiwyLjk3Niw4LjYyOSw3LjExMywxMC4wMzh2MTkuMjE0TDMxLjQ4Niw1NUwzNCw1MnYtMWwtMS4wOTgtMS40MzdMMzUsNDh2LTFsLTItMnYtMWwyLTF2LTFsLTItMWwyLTR2LTQNCgljNC4wNTMtMS40NjcsNy01Ljc4NCw3LTEwLjM4N0M0MiwxNi43NDYsMzcuMjk1LDEyLDMxLjUxNCwxMnogTTI5LDUwVjMzaDF2MThMMjksNTB6IE0zMS41LDIyYy0xLjkyMSwwLTMuNS0xLjU1Mi0zLjUtMy40ODMNCglDMjgsMTYuNTUyLDI5LjU3OCwxNSwzMS41LDE1YzEuOTIyLDAsMy41LDEuNTUyLDMuNSwzLjUxN0MzNSwyMC40NDgsMzMuNDIyLDIyLDMxLjUsMjJ6Ii8+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNzJweCIgaGVpZ2h0PSI3MnB4IiB2aWV3Qm94PSIwIDAgMTQyLjIyIDE0Mi4yMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTQyLjIyIDE0Mi4yMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8Y2lyY2xlIG9wYWNpdHk9IjAuNDMiIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBjeD0iNzEuMTEiIGN5PSI3MS4xMSIgcj0iNzEuMTEiLz4NCjxwb2x5Z29uIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBwb2ludHM9IjU0LjQyMywxMDQuNTk0IDEwNS43OTgsNzAuNzc0IDU0LjQyMywzNy42MjYgIi8+DQo8L3N2Zz4= data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACHDwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKNWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAASMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEoqGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAGeIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gzSZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25qbc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9CvjcM4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjKuLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqxOPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIWiAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFVSAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAyrA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYghUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7rh2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SEdJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3JaSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQtlHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJy5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hopb2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsyu21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCccNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527PYS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOwEaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6sfaznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy+rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVsS1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9UxlfeqXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/wjowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9Vt1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503rm10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7Pnl/eriQvLDwG/eE8/s6uL5TAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAAGnRFWHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS4xMDD0cqEAAABfSURBVChTY/j//z8DMZgoRSCD4ApLK6rYgLgDiJ9CMYjNBrMNWWHnvAUL/3/4+BGMQWygwk5sCp+CFMDAhw8fQAqfYlcIlCRGYeeceQv+g0wCYRAbl9XEeYZQWBIdjgCVaiC8JN1udgAAAABJRU5ErkJggg== data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAACuSURBVHicY/n//z8DCLh7+/sAqWIgNmGAgDNA3Ltz68YtIA4LVFELkKpmQAUOIAyUawUqrmEBMnyxKEIG1UA1J0EmFsFELC3MGfJzssDsSVOnMxw7fgImVQRSaAzjgRQJCgqA2XnZmcgKjVnwWIkCWKC+cwRxJk6eypCfm80AYyOBMyCF/TCFx0+eAmMsoJ8F6PXNoCBgwO1zUPBsBrsRFE5AxSCXFzKgBng/LMABrBM9cyiwScIAAAAASUVORK5CYII= data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAZCAYAAABtnU33AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAETSURBVHic7ZgxCsJAFAUXSaeIpScQDyCCguA5rEUQEbWzsvACKhICaquHUQu18hxi6vgebCSgwSb5C2sGhpBkIX+aZIkTBIHS1OAI1mFR2cEDHuEKnnnB0TeGcAlzZuZKjTKswA4cwzWDW8rO2ChsY+OFwVNld2wIG6cMbpqeRJAmg0umpxCk5PxeYxdZsO1kwbaTBdvOXwb7MG96ECF8Bt9gw/QkQlwZ7Kr/CXYZvIdt2DU7S+rs4CF8afXgCU5g1dhI6XCHC7jlSRjM/zwbbUGbJDPY/7HGg/OEn/vUvvn2WfpYlAADfYyL9vSaIOZ+Ykh9hxkSFy0WSyQ3Ht+iRWOJ9E4rGq2UcCwxsbWMRovGkhc6FTEV3QXLmAAAAABJRU5ErkJggg== data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAElJREFUSEvt0qERAEAIA0H6b5rXL1ecI5qQOcIsanB+3TC5egZOyJm9B2Zgw0EnF+AeekPC+S3tGTjhoJMLcA+9IeG89+6L04QHtFKarLFAHLUAAAAASUVORK5CYII= data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAFBJREFUSEvtkjEKADAIA/PpQunnWzo63nBbBDdjOGPWPpd0yPCf5YLo5TNgB52Z54AZsKDQygVwDr5A4RxLfQbsUGjlAjgHX6Bw9r394KjDAzeSX574b7LUAAAAAElFTkSuQmCC data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NzA3MjgiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjMzNjc2NjQiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjkxNDI4IDAuNjkxNDI4LDAuNjkxNDI4IDAuNjkxNDI4LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTcwNzA0IiBjbGFzcz0iZmlsMSIgZD0iTTAuMzQ1NzM2IDAuMTU3MTg4bC0wLjEyNTcyMiAwLjA5NDI2NDkgLTAuMDk0MzAwNiAwIDAgMC4xODg1ODMgMC4wOTQzMDA2IDAgMC4xMjU3MjIgMC4wOTQyNjQ5IDAgLTAuMzc3MTEzem0wLjE1NzExNyAtMi42NzI2N2UtMDA1bDAuMDMxNDMwNiAwIDAgMC4zNzcxNCAtMC4wMzE0MzA2IDAgMCAtMC4zNzcxNHptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjI1MTQwOSAtMC4wMzE0MzA2IDAgMCAtMC4yNTE0MDl6bS0wLjA2Mjg0MzMgMC4wNjI4NjExbDAuMDMxNDMwNiAwIDAgMC4xMjU2ODcgLTAuMDMxNDMwNiAwIDAgLTAuMTI1Njg3eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NjkwMjQiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjE5NjkyNDAiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjQzNjE2IDAuNjQzNjE2LDAuNjQzNjE2IDAuNjQzNjE2LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY5MDAwIiBjbGFzcz0iZmlsMSIgZD0iTTAuMzIxODM3IDAuMTQ2MzAybC0wLjExNzAyOSAwLjA4Nzc0NjYgLTAuMDg3Nzc5NyAwIDAgMC4xNzU1NDMgMC4wODc3Nzk3IDAgMC4xMTcwMjkgMC4wODc3NDY2IDAgLTAuMzUxMDM2em0wLjI3NzkwMSAwLjI1MDcyNmwtMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjA5MzA4NzIgLTAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjAyMDY5MDYgLTAuMDIwNjkwNiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAwLjAyMDY5MDYgLTAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MnoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxwYXRoIGNsYXNzPSJmaWwwIiBkPSJNLTAgMC4yNzExMDFsMCAxLjczOTM1YzAsMC4xNDkxMTMgMC4xMjE5ODgsMC4yNzExMDEgMC4yNzExMDEsMC4yNzExMDFsMy4xNTEzMSAwIDAgLTIuMjgxNTUgLTMuMTUxMzEgMGMtMC4xNDkxMTMsMCAtMC4yNzExMDEsMC4xMjE5ODggLTAuMjcxMTAxLDAuMjcxMTAxeiIvPg0KICA8cG9seWdvbiBjbGFzcz0iZmlsMSIgcG9pbnRzPSIxLjQwOTIsMC42NzEwMzggMi4wODAyOCwxLjE0MDc3IDEuNDA5MiwxLjYxMDUxICIvPg0KIDwvZz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIxOTY2NTUyIj4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NzY4IiBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMzIzOTU2bDAgMi4wNzg0NmMwLDAuMTc4MTg1IDAuMTQ1NzcxLDAuMzIzOTU2IDAuMzIzOTU2LDAuMzIzOTU2bDMuNzY1NzEgMCAwIC0yLjcyNjM4IC0zLjc2NTcxIDBjLTAuMTc4MTg1LDAgLTAuMzIzOTU2LDAuMTQ1NzcxIC0wLjMyMzk1NiwwLjMyMzk1NnoiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NTI4IiBjbGFzcz0iZmlsMSIgZD0iTTEuNjAzOCAwLjg4MjAzOGwwLjMyMDc1MSAwIDAgMC45NjIyNTQgLTAuMzIwNzUxIDAgMCAtMC45NjIyNTR6bTAuNTYxMzMyIDBsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAhCAYAAAAYucG/AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAA+SURBVHicY/H09pViYQACFi4uLgYWbm5uOAHncsG4/Pz8xKv79u0bA8vXr1/hBJz7Dcb9+PEjIXVzZs18BgAgpy6CcHz1VgAAAABJRU5ErkJggg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsLW9wYWNpdHk9IjAiIGQ9Ik01MSw0LjA0MXYyNS45MThDNTEsMzIuMTgyLDQ5LjE4MiwzNCw0Ni45NiwzNEgwVjBoNDYuOTZDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDENCgkJCUw1MSw0LjA0MXoiLz4NCgkJPHBhdGggaWQ9Il8xMjMzNzQxNDQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xOCwxNS43MzdsMi41MjYtMi41MjZsMy4zNjksMy4zNjlsMS42ODQtMS42ODVsLTMuMzY4LTMuMzY4TDI0LjczNiw5aC01LjA1M0gxOHYxLjY4NA0KCQkJVjE1LjczN3ogTTM0LDE4LjI2NGwtMi41MjcsMi41MjVsLTMuMzY4LTMuMzY4bC0xLjY4NSwxLjY4NWwzLjM2OSwzLjM2N0wyNy4yNjMsMjVoNS4wNTNIMzR2LTEuNjg1VjE4LjI2NHoiLz4NCgk8L2c+DQo8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMTAyIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjRkVGRUZFIiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMDUxIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjOTY5Njk2IiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTNweCIgaGVpZ2h0PSIyMXB4IiB2aWV3Qm94PSIwIDAgMTMgMjEiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5CYWNrLUFycm93PC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9ImlQaG9uZS1YLUNvdXJzZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyLjAwMDAwMCwgLTU2LjAwMDAwMCkiIGZpbGw9IiMzREEwRTEiPgogICAgICAgICAgICA8cGF0aCBkPSJNMjEuOTA2MzgyOCw1Ni45ODk5NDk1IEwxMiw2Ni41IEwyMS45MDYzODI4LDc2LjAxMDA1MDUgQzIyLjQ4MjU4NSw3Ni41NjMyMDAyIDIzLjM5MjU5Miw3Ni41NjMyMDAyIDIzLjk2ODc5NDMsNzYuMDEwMDUwNSBMMjMuOTY4Nzk0Myw3Ni4wMTAwNTA1IEMyNC41MTU1MjgzLDc1LjQ4NTE5MDEgMjQuNTMzMjYwMyw3NC42MTY0OTEyIDI0LjAwODM5OTksNzQuMDY5NzU3MiBDMjMuOTk1NDY4OSw3NC4wNTYyODcyIDIzLjk4MjI2NDIsNzQuMDQzMDgyNiAyMy45Njg3OTQzLDc0LjAzMDE1MTUgTDE2LjEyNDgyMjksNjYuNSBMMjMuOTY4Nzk0Myw1OC45Njk4NDg1IEMyNC41MTU1MjgzLDU4LjQ0NDk4ODEgMjQuNTMzMjYwMyw1Ny41NzYyODkyIDI0LjAwODM5OTksNTcuMDI5NTU1MiBDMjMuOTk1NDY4OSw1Ny4wMTYwODUyIDIzLjk4MjI2NDIsNTcuMDAyODgwNiAyMy45Njg3OTQzLDU2Ljk4OTk0OTUgTDIzLjk2ODc5NDMsNTYuOTg5OTQ5NSBDMjMuMzkyNTkyLDU2LjQzNjc5OTggMjIuNDgyNTg1LDU2LjQzNjc5OTggMjEuOTA2MzgyOCw1Ni45ODk5NDk1IFoiIGlkPSJCYWNrLUFycm93Ij48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4= data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICB3aWR0aD0iMjhweCIgaGVpZ2h0PSIzM3B4IiB2aWV3Qm94PSIwIDAgMjguMzAyIDMzLjI0MiI+DQoJPHBhdGggZD0iTTAsMS44VjMxLjQ0MmExLjgsMS44LDAsMCwwLDIuNzI2LDEuNTQzbDI0LjctMTQuODJhMS44LDEuOCwwLDAsMCwwLTMuMDg3TDIuNzI2LjI1N0ExLjgsMS44LDAsMCwwLDAsMS44WiIgc3R5bGU9ImZpbGw6IzMzMyIvPg0KPC9zdmc+ data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyOHB4IiBoZWlnaHQ9IjMzcHgiIHZpZXdCb3g9IjAgMCAyOC4zMDIgMzMuMjQyIj4NCgk8cGF0aCBkPSJNMCwxLjhWMzEuNDQyYTEuOCwxLjgsMCwwLDAsMi43MjYsMS41NDNsMjQuNy0xNC44MmExLjgsMS44LDAsMCwwLDAtMy4wODdMMi43MjYuMjU3QTEuOCwxLjgsMCwwLDAsMCwxLjhaIiBzdHlsZT0iZmlsbDojNTI4YmRmIi8+DQo8L3N2Zz4= data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NCAzNCIgd2lkdGg9IjQ0IiBoZWlnaHQ9IjM0Ij4NCgk8cGF0aCBkPSJNMywxNEg0MWEzLDMsMCwwLDEsMCw2SDNhMywzLDAsMCwxLDAtNlpNMywyOEg0MWEzLDMsMCwwLDEsMCw2SDNhMywzLDAsMCwxLDAtNlpNMywwSDQxYTMsMywwLDAsMSwwLDZIM0EzLDMsMCwwLDEsMywwWiIgc3R5bGU9ImZpbGw6IzNkYTBlMSIvPg0KPC9zdmc+ data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNiAzMCI+DQoJPHBhdGggZD0iTTMuODEsMi43M2gwQTEuNTYsMS41NiwwLDAsMSw0LjcsM2guMTNsMTYuOSwxMC4zM2MxLjIzLjgyLDEuNjcsMS41NSwxLjY3LDEuOTFzLS40NCwxLjA4LTEuNjcsMS45Mkw0LjgzLDI3LjMyaDBhMS44OCwxLjg4LDAsMCwxLTEsLjMyYy0uNzUsMC0xLjMzLS40NC0xLjMzLS44MlYzLjU0YzAtLjM2LjY2LS44MSwxLjQyLS44MU00LDBDMS45MywwLDAsMS4zNSwwLDMuMzNWMjYuNjRBMy42MSwzLjYxLDAsMCwwLDMuODMsMzBhNC4zMyw0LjMzLDAsMCwwLDIuMzktLjcybDE3LTEwLjJjNC0yLjY5LDMuNTQtNS43NiwwLTguMDdMNi4yMi43QTQsNCwwLDAsMCwzLjkyLDBaIiBzdHlsZT0iZmlsbDojM2RhMGUxIi8+DQo8L3N2Zz4= data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNiAzMCI+DQoJPHBhdGggZD0iTTMuODEsMi43M2gwQTEuNTYsMS41NiwwLDAsMSw0LjcsM2guMTNsMTYuOSwxMC4zM2MxLjIzLjgyLDEuNjcsMS41NSwxLjY3LDEuOTFzLS40NCwxLjA4LTEuNjcsMS45Mkw0LjgzLDI3LjMyaDBhMS44OCwxLjg4LDAsMCwxLTEsLjMyYy0uNzUsMC0xLjMzLS40NC0xLjMzLS44MlYzLjU0YzAtLjM2LjY2LS44MSwxLjQyLS44MU00LDBDMS45MywwLDAsMS4zNSwwLDMuMzNWMjYuNjRBMy42MSwzLjYxLDAsMCwwLDMuODMsMzBhNC4zMyw0LjMzLDAsMCwwLDIuMzktLjcybDE3LTEwLjJjNC0yLjY5LDMuNTQtNS43NiwwLTguMDdMNi4yMi43QTQsNCwwLDAsMCwzLjkyLDBaIiBzdHlsZT0iZmlsbDojM2RhMGUxO2ZpbGwtb3BhY2l0eTogMC40ODsiLz4NCjwvc3ZnPg== data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzNCAzNCI+DQoJPHBhdGggZD0iTTE3LDBBMTcsMTcsMCwxLDAsMzQsMTcsMTcsMTcsMCwwLDAsMTcsMFptMCwzMS44OEExNC44OCwxNC44OCwwLDEsMSwzMS44OCwxNywxNC45LDE0LjksMCwwLDEsMTcsMzEuODhaIiBzdHlsZT0iZmlsbDojM2RhMGUxIi8+DQoJPHBhdGggZD0iTTE1LDEwLjc1YTEuMjUsMS4yNSwwLDAsMC0yLjUsMHYwaDBWMjMuMjFoMHYwYTEuMjUsMS4yNSwwLDAsMCwyLjUsMHYwaDBWMTAuNzloMFoiIHN0eWxlPSJmaWxsOiMzZGEwZTEiLz4NCgk8cGF0aCBkPSJNMjEuNSwxMC43NWExLjI1LDEuMjUsMCwwLDAtMi41LDB2MGgwVjIzLjIxaDB2MGExLjI1LDEuMjUsMCwwLDAsMi41LDB2MGgwVjEwLjc5aDBaIiBzdHlsZT0iZmlsbDojM2RhMGUxIi8+DQo8L3N2Zz4= data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik05LjE3MDI1IDguMDkxODJDMTAuMDcxMyA3LjY5OTkyIDExLjAzMjUgNy41IDEyIDcuNUMxMi45Njc1IDcuNSAxMy45Mjg3IDcuNjk5OTIgMTQuODI5NyA4LjA5MTgyQzE1LjczMTIgOC40ODM4NyAxNi41NTgzIDkuMDYyMDIgMTcuMjYwNyA5Ljc5OTUyQzE3Ljk2MzQgMTAuNTM3MyAxOC41MjY4IDExLjQxOTcgMTguOTEzMiAxMi4zOTkyQzE5LjI5OTcgMTMuMzc5IDE5LjUgMTQuNDMzIDE5LjUgMTUuNUgyMkMyMiAxNC4xMjExIDIxLjc0MTMgMTIuNzU1NyAyMS4yMzg4IDExLjQ4MThDMjAuNzM2MiAxMC4yMDc5IDE5Ljk5OTYgOS4wNTAzOSAxOS4wNzExIDguMDc1MzhDMTguMTQyNSA3LjEwMDM2IDE3LjA0MDEgNi4zMjY5NCAxNS44MjY4IDUuNzk5MjZDMTQuNjEzNiA1LjI3MTU5IDEzLjMxMzIgNSAxMiA1QzEwLjY4NjggNSA5LjM4NjQyIDUuMjcxNTkgOC4xNzMxNyA1Ljc5OTI3QzYuOTU5OTIgNi4zMjY5NCA1Ljg1NzUyIDcuMTAwMzYgNC45Mjg5MyA4LjA3NTM4QzQuMDAwMzUgOS4wNTAzOSAzLjI2Mzc1IDEwLjIwNzkgMi43NjEyIDExLjQ4MThDMi4yNTg2NiAxMi43NTU3IDIgMTQuMTIxMSAyIDE1LjVINC41QzQuNSAxNC40MzMgNC43MDAzIDEzLjM3OSA1LjA4Njc5IDEyLjM5OTJDNS40NzMyMiAxMS40MTk3IDYuMDM2NjUgMTAuNTM3MyA2LjczOTI4IDkuNzk5NTJDNy40NDE2NiA5LjA2MjAyIDguMjY4ODUgOC40ODM4NyA5LjE3MDI1IDguMDkxODJaTTEyLjU3MSAxMi41ODM0QzEyLjY4NDMgMTIuNDkyOCAxMi43OTY2IDEyLjQwNDUgMTIuOTA3MSAxMi4zMTg4QzEzLjM1MTcgMTEuOTc0IDEzLjc2NTggMTEuNjcyNCAxNC4wODY4IDExLjQ0NUMxNC4xNzE3IDExLjM4NDggMTQuMjUwMSAxMS4zMjk4IDE0LjMyMDkgMTEuMjgwNkMxNC40OSAxMS4xNjI5IDE0LjcxMiAxMS4yOTExIDE0LjY5NDYgMTEuNDk2NEMxNC42ODc0IDExLjU4MjMgMTQuNjc5IDExLjY3NzcgMTQuNjY5MyAxMS43ODEzQzE0LjYzMjkgMTIuMTczIDE0LjU3ODcgMTIuNjgyNSAxNC41MDI0IDEzLjIzOTlDMTQuNDgzNCAxMy4zNzg0IDE0LjQ2MzEgMTMuNTE5OCAxNC40NDEzIDEzLjY2MzJDMTQuMjQ2OCAxNC45NDQxIDEzLjkzNzUgMTYuMzc2MiAxMy40NjQxIDE3LjE5NjJDMTMuMDczNiAxNy44NzI2IDEyLjAzMTEgMTguNjc4MiAxMC43MzIxIDE3LjkyODJDOS40MzMwMSAxNy4xNzgyIDkuNjA5NDggMTUuODcyNiAxMCAxNS4xOTYyQzEwLjQ3MzQgMTQuMzc2MiAxMS41NTg5IDEzLjM5MjMgMTIuNTcxIDEyLjU4MzRaIiBmaWxsPSIjM0RBMEUxIi8+Cjwvc3ZnPgo= data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj4KICA8ZGVmcz4KICAgIDxzdHlsZT4KICAgICAgLmNscy0xLCAuY2xzLTIgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjM2RhMGUxOwogICAgICB9CgogICAgICAuY2xzLTEgewogICAgICAgIHN0cm9rZS13aWR0aDogMnB4OwogICAgICB9CgogICAgICAuY2xzLTIgewogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwogICAgICAgIHN0cm9rZS13aWR0aDogMi41cHg7CiAgICAgICAgZmlsbC1ydWxlOiBldmVub2RkOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8Y2lyY2xlIGlkPSJFbGxpcHNlXzg2M19jb3B5XzIiIGRhdGEtbmFtZT0iRWxsaXBzZSA4NjMgY29weSAyIiBjbGFzcz0iY2xzLTEiIGN4PSIxNiIgY3k9IjE2IiByPSIxNSIvPgogIDxwYXRoIGlkPSJQcmV2aW91cy1jaGV2cm9uX2NvcHlfMiIgZGF0YS1uYW1lPSJQcmV2aW91cy1jaGV2cm9uIGNvcHkgMiIgY2xhc3M9ImNscy0yIiBkPSJNNjQ5My4zOSw1ODQ3LjUzbC03LjA4LDYuNDgsNy4wOCw2LjQ3IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNjQ3NSAtNTgzOCkiLz4KPC9zdmc+Cg== data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj4KICA8ZGVmcz4KICAgIDxzdHlsZT4KICAgICAgLmNscy0xLCAuY2xzLTIgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjM2RhMGUxOwoJCW9wYWNpdHk6IDAuNDg7CiAgICAgIH0KCiAgICAgIC5jbHMtMSB7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAycHg7CiAgICAgIH0KCiAgICAgIC5jbHMtMiB7CiAgICAgICAgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kOwogICAgICAgIHN0cm9rZS1saW5lam9pbjogcm91bmQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyLjVweDsKICAgICAgICBmaWxsLXJ1bGU6IGV2ZW5vZGQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9kZWZzPgogIDxjaXJjbGUgY2xhc3M9ImNscy0xIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTUiLz4KICA8cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik02NDkzLjM5LDU4NDcuNTNsLTcuMDgsNi40OCw3LjA4LDYuNDciIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02NDc1IC01ODM4KSIvPgo8L3N2Zz4K data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj4KICA8ZGVmcz4KICAgIDxzdHlsZT4KICAgICAgLmNscy0xLCAuY2xzLTIgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjM2RhMGUxOwogICAgICB9CgogICAgICAuY2xzLTEgewogICAgICAgIHN0cm9rZS13aWR0aDogMnB4OwogICAgICB9CgogICAgICAuY2xzLTIgewogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwogICAgICAgIHN0cm9rZS13aWR0aDogMi41cHg7CiAgICAgICAgZmlsbC1ydWxlOiBldmVub2RkOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8Y2lyY2xlIGlkPSJFbGxpcHNlXzg2M19jb3B5XzIiIGRhdGEtbmFtZT0iRWxsaXBzZSA4NjMgY29weSAyIiBjbGFzcz0iY2xzLTEiIGN4PSIxNiIgY3k9IjE2IiByPSIxNSIvPgogIDxwYXRoIGlkPSJQcmV2aW91cy1jaGV2cm9uX2NvcHlfMiIgZGF0YS1uYW1lPSJQcmV2aW91cy1jaGV2cm9uIGNvcHkgMiIgY2xhc3M9ImNscy0yIiBkPSJNNjQ4OC42MSw1ODYwLjQ3bDcuMDgtNi40OC03LjA4LTYuNDciIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02NDc1IC01ODM4KSIvPgo8L3N2Zz4K data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj4KICA8ZGVmcz4KICAgIDxzdHlsZT4KICAgICAgLmNscy0xLCAuY2xzLTIgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjM2RhMGUxOwoJCW9wYWNpdHk6IDAuNDg7CiAgICAgIH0KCiAgICAgIC5jbHMtMSB7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAycHg7CiAgICAgIH0KCiAgICAgIC5jbHMtMiB7CiAgICAgICAgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kOwogICAgICAgIHN0cm9rZS1saW5lam9pbjogcm91bmQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyLjVweDsKICAgICAgICBmaWxsLXJ1bGU6IGV2ZW5vZGQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9kZWZzPgogIDxjaXJjbGUgY2xhc3M9ImNscy0xIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTUiLz4KICA8cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik02NDg4LjYxLDU4NjAuNDdsNy4wOC02LjQ4LTcuMDgtNi40NyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTY0NzUgLTU4MzgpIi8+Cjwvc3ZnPgo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMnB4IiB2aWV3Qm94PSIwIDAgMjAgMjIiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5TV0FQLUlDT048L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iaVBob25lLTgtUGx1cy1ALUNvdXJzZS1sYW5kc2NhcGUtU1dBUCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQ2Mi4wMDAwMDAsIC0xMTAuMDAwMDAwKSIgZmlsbD0iI0ZGRkZGRiIgZmlsbC1ydWxlPSJub256ZXJvIj4KICAgICAgICAgICAgPGcgaWQ9IlNXQVAtQlVUVE9OIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0NTAuMDAwMDAwLCA5OS4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNS45MTQyMTM2LDE2IEwyNCwxNiBDMjQuNTUyMjg0NywxNiAyNSwxNi40NDc3MTUzIDI1LDE3IEMyNSwxNy41NTIyODQ3IDI0LjU1MjI4NDcsMTggMjQsMTggTDE1LjkxNDIxMzYsMTggTDE4LjcwNzEwNjgsMjAuNzkyODkzMiBDMTkuMDk3NjMxMSwyMS4xODM0MTc1IDE5LjA5NzYzMTEsMjEuODE2NTgyNSAxOC43MDcxMDY4LDIyLjIwNzEwNjggQzE4LjMxNjU4MjUsMjIuNTk3NjMxMSAxNy42ODM0MTc1LDIyLjU5NzYzMTEgMTcuMjkyODkzMiwyMi4yMDcxMDY4IEwxMi43OTI4OTMyLDE3LjcwNzEwNjggQzEyLjQwMjM2ODksMTcuMzE2NTgyNSAxMi40MDIzNjg5LDE2LjY4MzQxNzUgMTIuNzkyODkzMiwxNi4yOTI4OTMyIEwxNy4yOTI4OTMyLDExLjc5Mjg5MzIgQzE3LjY4MzQxNzUsMTEuNDAyMzY4OSAxOC4zMTY1ODI1LDExLjQwMjM2ODkgMTguNzA3MTA2OCwxMS43OTI4OTMyIEMxOS4wOTc2MzExLDEyLjE4MzQxNzUgMTkuMDk3NjMxMSwxMi44MTY1ODI1IDE4LjcwNzEwNjgsMTMuMjA3MTA2OCBMMTUuOTE0MjEzNiwxNiBaIE0yOC4wODU3ODY0LDI4IEwyMCwyOCBDMTkuNDQ3NzE1MywyOCAxOSwyNy41NTIyODQ3IDE5LDI3IEMxOSwyNi40NDc3MTUzIDE5LjQ0NzcxNTMsMjYgMjAsMjYgTDI4LjA4NTc4NjQsMjYgTDI1LjI5Mjg5MzIsMjMuMjA3MTA2OCBDMjQuOTAyMzY4OSwyMi44MTY1ODI1IDI0LjkwMjM2ODksMjIuMTgzNDE3NSAyNS4yOTI4OTMyLDIxLjc5Mjg5MzIgQzI1LjY4MzQxNzUsMjEuNDAyMzY4OSAyNi4zMTY1ODI1LDIxLjQwMjM2ODkgMjYuNzA3MTA2OCwyMS43OTI4OTMyIEwzMS4yMDcxMDY4LDI2LjI5Mjg5MzIgQzMxLjU5NzYzMTEsMjYuNjgzNDE3NSAzMS41OTc2MzExLDI3LjMxNjU4MjUgMzEuMjA3MTA2OCwyNy43MDcxMDY4IEwyNi43MDcxMDY4LDMyLjIwNzEwNjggQzI2LjMxNjU4MjUsMzIuNTk3NjMxMSAyNS42ODM0MTc1LDMyLjU5NzYzMTEgMjUuMjkyODkzMiwzMi4yMDcxMDY4IEMyNC45MDIzNjg5LDMxLjgxNjU4MjUgMjQuOTAyMzY4OSwzMS4xODM0MTc1IDI1LjI5Mjg5MzIsMzAuNzkyODkzMiBMMjguMDg1Nzg2NCwyOCBaIiBpZD0iU1dBUC1JQ09OIj48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg== data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAADcmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmFjOGVjNDFhLTZkYWItODQ0Ni04YzkzLWU1Mjk3N2YwMmE4NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFRThCNzU3NDYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFRThCNzU3MzYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cykiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0OWFlZmI1OC00ZWFmLWQ3NDgtYTI0ZS0zNmNhNGQ2M2QwNTYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6N0MwQkFBM0M2MjAxMTFFNUI4QjBERTk4MjY5MjQwQjUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6MGSVVAAAE3klEQVR42uycW4hWVRiG15Q4eYzGQySSQlriEQ9BF2mE4iSdESRRIb0RD+mNmHgICjqQEGUe6sqgCy1i0iRinAzELrooQhHLGQURUTzMiM7omCLj+/F/czX/t/890z6s9e/3hZcZ1l6z19r7mXXca62arq4uR/mjh/gKCIQiEAKhCIRAKAIhEIpACIQiEIpACIQiEAKhCIRAKAIhEMoX9Yu62NbWxjcUobq6OpaQQpcQz/QwPBOeDU+Fx8Oj4UfhoRrnJnwDvgC3wCfgY/Bf8P0QHrImahmQB1VWLfwGvAieqy+/LxJIR+Dv4QPwf75WWb4CGQavg9fo70mqFd4F79DfCSRCA+HN8Hp4cMppdcBfwB/Bt9mo99Sr8Cl4SwYwnKYhaf2jaXMconoE/hL+CR6TQ/pPato7NS+FbtSfgH+Gp8eMfwv+HT6qpakZvqzVT/d//ePw0/BEeI72ygbFvP/f8MvwpSK2IfLSGuGxFeJ1aby98CG4s5fpDNAqaTlcL89cIf45jddcpDZknI4PKsFo0NKzQLusnX1Iq1P/doHe60CF+GM1b+OK0obIYO5XeGREnLPwfHghfDzBtOVeb+q9z0bEG6njltHVDqQ2RuP9HTwDbkoxH02axv4YjX1tNQP5LKIBl7ZiK/yWToGkLUljsaZpNaTTNc9VCeR1eHUEjHfgD3OoQiXNVRFQVmveqwrIEHh3xPXNOp2Rl77WPFiSvA+tJiCb4FHGNanHP/FggCp52Gdck7y/Wy0Dw2Hatx9s9KZmZNRmxC3JMjh8qsy1Du0St4Y+DomaKFzlEQxRu+apnOQZ1oVeZfWPeMCGlLu2/6dL3BDRwPcPGYiMjocbvaoPnL963+h1DddnChbIMiP8cMIj8KQln34be/lM3gOREW69cW2v81/fGOH1aY7e0wTyrNGYyxT6wQCAHNS8lmvcZ4UIZL4RLt8z7gQA5I7mtZyeCxHIS0b4UReOrLw+EyIQqxScDAiIldcJIQLZYTTmvwUEpMUIHxMikB/gta40PXIF/lwHVrcCAnLVCH8srQR9X7mYt2RUbq1yrOFia390N9SReugaYoR3EEg+GmGEtxNIPhpvhJ8nkHw02Qj/l0Dy0Rwj/DSBZC9ZeD3buPYHgWSv11z5RdrSw/qTQLLX20Z4o0toSxyBxJdsKrVmq79NM2ECKa/3XPltC9fgXwgkW81zpVX35fSVS3HahEB6SqZK9hjXujeJOgLJTrLG19qos1OrLALJSLL+eLFx7SL8cRaZIJCSVrrSfnVL8qHtJoFkoy3ablibQeWz849ZZaZfgUHIfg/Z97EkIs5xLR2OQNLv2u5x0Ttt5UShV1wfj91glRVP01xp8UVTBRiyuOFFheJYQpKVzNrKwQErXPyDA2SF+5k8MhsykCnwPdfzaA3ZYy6nREyCX4Cfd/EPs+nV0RoEUlqWsx1eCie9Bkc2nW5wOa87Dg3Ipy75bWXntSd1yIcHDK1RT3KzTIcOBif6AqOo3d42HX/I0tZW3zIXWgnp68chmfaQjZxyoKac0bXNRxghlpCN2m1dpj/btXEfpD0uqYaua89Luq3dx8TKN3AeE1vt4mLrAohACIQiEAKhCIRAKAIhEIpACq7IqROKJYRA+AoIhCIQAqEIhEAoAiEQikCKrQcCDABHPgH2w7NQdAAAAABJRU5ErkJggg== data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzNiAzNiI+DQoJPHBhdGggZD0iTTE1LjQ4LDMuOTRBMTEuNDEsMTEuNDEsMCwxLDEsNCwxNS4zNSwxMS40OCwxMS40OCwwLDAsMSwxNS40OCwzLjk0bTAtMy45NUExNS4zNiwxNS4zNiwwLDEsMCwzMSwxNS4zNSwxNS40MywxNS40MywwLDAsMCwxNS40OCwwWiIgc3R5bGU9ImZpbGw6IzNkYTBlMSIvPg0KCTxwYXRoIGQ9Ik0zMi41OSwzNS40MWwtOC4xNC04LjA2YTIsMiwwLDAsMSwwLTIuOGgwYTIsMiwwLDAsMSwyLjgyLDBsOC4xNCw4LjA3YTIsMiwwLDAsMSwwLDIuNzloMEEyLDIsMCwwLDEsMzIuNTksMzUuNDFaIiBzdHlsZT0iZmlsbDojM2RhMGUxIi8+DQo8L3N2Zz4= data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzNCAzNCIgd2lkdGg9IjM0IiBoZWlnaHQ9IjM0Ij4NCgk8cGF0aCBkPSJNMjEuMjUsMTYuOTgsMzMuMTEsMjguODVhMy4wMTIsMy4wMTIsMCwwLDEtNC4yNiw0LjI2TDE2Ljk4LDIxLjI1LDUuMTIsMzMuMTFBMy4wMTYsMy4wMTYsMCwwLDEsLjg1LDI4Ljg1TDEyLjcyLDE2Ljk4Ljg1LDUuMTJBMy4wMTksMy4wMTksMCwwLDEsNS4xMi44NUwxNi45OCwxMi43MiwyOC44NS44NWEzLjAxNiwzLjAxNiwwLDAsMSw0LjI2LDQuMjdaIiBzdHlsZT0iZmlsbDojM2RhMGUxIi8+DQo8L3N2Zz4= data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMiAyMCIgd2lkdGg9IjEyIiBoZWlnaHQ9IjIwIj4NCgk8dGl0bGU+QmFjazwvdGl0bGU+DQoJPHBhdGggZD0iTTEwLjQwNSwxOS41YTEuMjkxLDEuMjkxLDAsMCwxLS45MDktLjM3M0wtLjAxOCw5Ljc0Miw5LjUuMzU4QTEuMywxLjMsMCwwLDEsMTEuMzE4LDIuMkwzLjY3LDkuNzQybDcuNjQ1LDcuNTQxYTEuMywxLjMsMCwwLDEtLjkxLDIuMjE3WiIgc3R5bGU9ImZpbGw6IzNkYTBlMSIvPg0KPC9zdmc+ data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyOCAyOCI+PHRpdGxlPnN5c3RlbS1zZWFyY2g8L3RpdGxlPjxwYXRoIGQ9Ik0yNy40OSwyNS4xNWwtNy42Ny03LjY3QTEwLjg2LDEwLjg2LDAsMCwwLDIxLjkyLDExYTExLjA2LDExLjA2LDAsMCwwLTExLTExQTEwLjg3LDEwLjg3LDAsMCwwLDAsMTAuOTQsMTEuMDYsMTEuMDYsMCwwLDAsMTEsMjJhMTAuODQsMTAuODQsMCwwLDAsNi40OC0yLjEyaDBsNy42Niw3LjY2YTEuNjUsMS42NSwwLDEsMCwyLjM0LTIuMzNaTTExLDE5Ljc2YTguODYsOC44NiwwLDAsMS04LjgtOC44Miw4LjcxLDguNzEsMCwwLDEsOC43NC04Ljc1QTguODYsOC44NiwwLDAsMSwxOS43MywxMSw4LjcxLDguNzEsMCwwLDEsMTEsMTkuNzZaIiBzdHlsZT0iZmlsbDojOGU4ZTkzO2ZpbGwtcnVsZTpldmVub2RkIi8+PC9zdmc+ data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiIgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCIgPg0KCTxwYXRoIGQ9Ik0xNiwwQTE2LDE2LDAsMSwwLDMyLDE2LDE2LDE2LDAsMCwwLDE2LDBabTYuNTUsMjAuNDRhMS41LDEuNSwwLDAsMS0yLjExLDIuMTJMMTYsMTguMTJsLTQuNDUsNC40NGExLjUsMS41LDAsMCwxLTIuMTEtMi4xMkwxMy44NywxNiw5LjQzLDExLjU2YTEuNDksMS40OSwwLDEsMSwyLjExLTIuMTFMMTYsMTMuODlsNC40NS00LjQ0YTEuNDksMS40OSwwLDEsMSwyLjExLDIuMTFMMTguMTEsMTZaIiBzdHlsZT0iZmlsbDojOGU4ZTkzO2ZpbGwtcnVsZTpldmVub2RkIi8+DQo8L3N2Zz4= data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NiA1NiI+DQoJPHJlY3QgeD0iNS41IiB5PSIyLjUiIHdpZHRoPSI0NSIgaGVpZ2h0PSI1MSIgcng9IjYuNSIgcnk9IjYuNSIgc3R5bGU9ImZpbGw6I2ZmZiIvPg0KCTxwYXRoIGQ9Ik00NCw0YTUsNSwwLDAsMSw1LDVWNDdhNSw1LDAsMCwxLTUsNUgxMmE1LDUsMCwwLDEtNS01VjlhNSw1LDAsMCwxLDUtNUg0NG0wLTNIMTJBOCw4LDAsMCwwLDQsOVY0N2E4LDgsMCwwLDAsOCw4SDQ0YTgsOCwwLDAsMCw4LThWOWE4LDgsMCwwLDAtOC04WiIgc3R5bGU9ImZpbGw6IzllYWViOSIvPg0KCTxjaXJjbGUgY3g9IjE1LjUiIGN5PSIxNy41IiByPSIwLjUiIHN0eWxlPSJmaWxsOiNmZmYiLz4NCgk8cGF0aCBkPSJNMTUuNSwxNUEyLjUsMi41LDAsMSwwLDE4LDE3LjUsMi41LDIuNSwwLDAsMCwxNS41LDE1WiIgc3R5bGU9ImZpbGw6IzllYWViOSIvPg0KCTxyZWN0IHg9IjIxIiB5PSIxNiIgd2lkdGg9IjIyIiBoZWlnaHQ9IjMiIHJ4PSIxLjUiIHJ5PSIxLjUiIHN0eWxlPSJmaWxsOiNmZmYiLz4NCgk8cGF0aCBkPSJNNDEuNSwxNmgtMTlhMS41LDEuNSwwLDAsMCwwLDNoMTlhMS41LDEuNSwwLDAsMCwwLTNaIiBzdHlsZT0iZmlsbDojOWVhZWI5Ii8+DQoJPGNpcmNsZSBjeD0iMTUuNSIgY3k9IjI2LjUiIHI9IjAuNSIgc3R5bGU9ImZpbGw6I2ZmZiIvPg0KCTxwYXRoIGQ9Ik0xNS41LDI0QTIuNSwyLjUsMCwxLDAsMTgsMjYuNSwyLjUsMi41LDAsMCwwLDE1LjUsMjRaIiBzdHlsZT0iZmlsbDojOWVhZWI5Ii8+DQoJPHJlY3QgeD0iMjEiIHk9IjI1IiB3aWR0aD0iMjIiIGhlaWdodD0iMyIgcng9IjEuNSIgcnk9IjEuNSIgc3R5bGU9ImZpbGw6I2ZmZiIvPg0KCTxwYXRoIGQ9Ik00MS41LDI1aC0xOWExLjUsMS41LDAsMCwwLDAsM2gxOWExLjUsMS41LDAsMCwwLDAtM1oiIHN0eWxlPSJmaWxsOiM5ZWFlYjkiLz4NCgk8Y2lyY2xlIGN4PSIxNS41IiBjeT0iMzUuNSIgcj0iMC41IiBzdHlsZT0iZmlsbDojZmZmIi8+DQoJPHBhdGggZD0iTTE1LjUsMzNBMi41LDIuNSwwLDEsMCwxOCwzNS41LDIuNSwyLjUsMCwwLDAsMTUuNSwzM1oiIHN0eWxlPSJmaWxsOiM5ZWFlYjkiLz4NCgk8cmVjdCB4PSIyMSIgeT0iMzQiIHdpZHRoPSIyMiIgaGVpZ2h0PSIzIiByeD0iMS41IiByeT0iMS41IiBzdHlsZT0iZmlsbDojZmZmIi8+DQoJPHBhdGggZD0iTTQxLjUsMzRoLTE5YTEuNSwxLjUsMCwwLDAsMCwzaDE5YTEuNSwxLjUsMCwwLDAsMC0zWiIgc3R5bGU9ImZpbGw6IzllYWViOSIvPg0KPC9zdmc+ data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NiA1NiI+DQoJPHJlY3QgeD0iNiIgeT0iMyIgd2lkdGg9IjQ0IiBoZWlnaHQ9IjUwIiByeD0iNiIgcnk9IjYiIHN0eWxlPSJmaWxsOiNmZmYiLz4NCgk8cGF0aCBkPSJNNDQsNWE0LDQsMCwwLDEsNCw0VjQ3YTQsNCwwLDAsMS00LDRIMTJhNCw0LDAsMCwxLTQtNFY5YTQsNCwwLDAsMSw0LTRINDRtMC00SDEyQTgsOCwwLDAsMCw0LDlWNDdhOCw4LDAsMCwwLDgsOEg0NGE4LDgsMCwwLDAsOC04VjlhOCw4LDAsMCwwLTgtOFoiIHN0eWxlPSJmaWxsOiMzZGEwZTEiLz4NCgk8Y2lyY2xlIGN4PSIxNS41IiBjeT0iMTcuNSIgcj0iMC41IiBzdHlsZT0iZmlsbDojZmZmIi8+DQoJPHBhdGggZD0iTTE1LjUsMTVBMi41LDIuNSwwLDEsMCwxOCwxNy41LDIuNSwyLjUsMCwwLDAsMTUuNSwxNVoiIHN0eWxlPSJmaWxsOiMzZGEwZTEiLz4NCgk8cmVjdCB4PSIyMSIgeT0iMTYiIHdpZHRoPSIyMiIgaGVpZ2h0PSIzIiByeD0iMS41IiByeT0iMS41IiBzdHlsZT0iZmlsbDojZmZmIi8+DQoJPHBhdGggZD0iTTQxLjUsMTZoLTE5YTEuNSwxLjUsMCwwLDAsMCwzaDE5YTEuNSwxLjUsMCwwLDAsMC0zWiIgc3R5bGU9ImZpbGw6IzNkYTBlMSIvPg0KCTxjaXJjbGUgY3g9IjE1LjUiIGN5PSIyNi41IiByPSIwLjUiIHN0eWxlPSJmaWxsOiNmZmYiLz4NCgk8cGF0aCBkPSJNMTUuNSwyNEEyLjUsMi41LDAsMSwwLDE4LDI2LjUsMi41LDIuNSwwLDAsMCwxNS41LDI0WiIgc3R5bGU9ImZpbGw6IzNkYTBlMSIvPg0KCTxyZWN0IHg9IjIxIiB5PSIyNSIgd2lkdGg9IjIyIiBoZWlnaHQ9IjMiIHJ4PSIxLjUiIHJ5PSIxLjUiIHN0eWxlPSJmaWxsOiNmZmYiLz4NCgk8cGF0aCBkPSJNNDEuNSwyNWgtMTlhMS41LDEuNSwwLDAsMCwwLDNoMTlhMS41LDEuNSwwLDAsMCwwLTNaIiBzdHlsZT0iZmlsbDojM2RhMGUxIi8+DQoJPGNpcmNsZSBjeD0iMTUuNSIgY3k9IjM1LjUiIHI9IjAuNSIgc3R5bGU9ImZpbGw6I2ZmZiIvPg0KCTxwYXRoIGQ9Ik0xNS41LDMzQTIuNSwyLjUsMCwxLDAsMTgsMzUuNSwyLjUsMi41LDAsMCwwLDE1LjUsMzNaIiBzdHlsZT0iZmlsbDojM2RhMGUxIi8+DQoJPHJlY3QgeD0iMjEiIHk9IjM0IiB3aWR0aD0iMjIiIGhlaWdodD0iMyIgcng9IjEuNSIgcnk9IjEuNSIgc3R5bGU9ImZpbGw6I2ZmZiIvPg0KCTxwYXRoIGQ9Ik00MS41LDM0aC0xOWExLjUsMS41LDAsMCwwLDAsM2gxOWExLjUsMS41LDAsMCwwLDAtM1oiIHN0eWxlPSJmaWxsOiMzZGEwZTEiLz4NCjwvc3ZnPg== data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NiA1NiI+DQoJPHBhdGggZD0iTTQwLjg1LjVBNy43Niw3Ljc2LDAsMCwxLDQzLC44MWE5LjYyLDkuNjIsMCwwLDEsNi40MSw2Ljg3LDEwLjMsMTAuMywwLDAsMS0yLjcxLDkuNjRsLTI0LjIzLDI2QTcuNDMsNy40MywwLDAsMSwxOCw0NS44N2E2LjA1LDYuMDUsMCwwLDEtLjYzLDAsNC42OSw0LjY5LDAsMCwxLTMuNDUtMS41MWMtMS44OS0yLTIuMTYtNS44MywxLTkuMTlsMTctMTguMjcuMTEtLjEyYTEuNzQsMS43NCwwLDAsMSwxLjE1LS40NCwxLjcxLDEuNzEsMCwwLDEsMS4yNi41NSwyLDIsMCwwLDEsMCwyLjczbC0xNywxOC4yN2MtMS40NywxLjU3LTEuNiwzLjA3LTEsMy43NmExLjI3LDEuMjcsMCwwLDAsLjkxLjM4aC4wNmwuMjUsMEE0LjI0LDQuMjQsMCwwLDAsMjAsNDAuNjFsMjQuMi0yNkE2LjM2LDYuMzYsMCwwLDAsNDYsOC43YTUuODMsNS44MywwLDAsMC0zLjg4LTQuMTcsNC41Miw0LjUyLDAsMCwwLTEuMjktLjE4aDBhNS44Nyw1Ljg3LDAsMCwwLTQuMjIsMi4xMUwxMS4yNSwzMy42NWMtNC43MSw1LjA2LTMuNTgsMTAuODktLjU0LDE0LjE2QTguNjksOC42OSwwLDAsMCwxNyw1MC42NmE5LjY0LDkuNjQsMCwwLDAsNy0zLjQzTDQ5LjI0LDIwYTEuMzYsMS4zNiwwLDAsMSwuMTItLjEyLDEuNjksMS42OSwwLDAsMSwyLjM5LjEyLDIsMiwwLDAsMSwwLDIuNzJMMjYuNDIsNTBBMTIuOTMsMTIuOTMsMCwwLDEsMTcsNTQuNWExMi4xMiwxMi4xMiwwLDAsMS04Ljc3LTRjLTQuNDEtNC43Mi01LjY0LTEzLC41NC0xOS42TDM0LjA3LDMuNzJBOS4zMiw5LjMyLDAsMCwxLDQwLjgzLjVoMCIgc3R5bGU9ImZpbGw6IzllYWViOSIvPg0KPC9zdmc+ data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NiA1NiI+DQoJPHBhdGggZD0iTTQwLjgxLDBhOS44Nyw5Ljg3LDAsMCwwLTcuMTIsMy4zOUw4LjM3LDMwLjU5QzIsMzcuNDQsMy4yNyw0Niw3LjgzLDUwLjg3QTEyLjU4LDEyLjU4LDAsMCwwLDE3LDU1YTEzLjQ0LDEzLjQ0LDAsMCwwLDkuODQtNC43TDUyLjEyLDIzLjFhMi41MiwyLjUyLDAsMCwwLDAtMy40LDIuMTksMi4xOSwwLDAsMC0zLjEtLjE1bC0uMTUuMTVMMjMuNTUsNDYuODlBOS4xLDkuMSwwLDAsMSwxNyw1MC4xNmE4LjE3LDguMTcsMCwwLDEtNS44Ny0yLjY4Yy0yLjg5LTMuMTEtNC04LjY2LjU0LTEzLjQ5TDM2Ljk0LDYuOGE1LjM0LDUuMzQsMCwwLDEsMy44OC0xLjk1QTQsNCwwLDAsMSw0Miw1YTUuMjksNS4yOSwwLDAsMSwzLjUzLDMuODEsNS44MSw1LjgxLDAsMCwxLTEuNjcsNS40NGwtMjQuMjIsMjZhMy43NywzLjc3LDAsMCwxLTIuMDUsMS4yOGgtLjE2YS44LjgsMCwwLDEtLjU5LS4yM2MtLjM5LS40Mi0uMzUtMS42NSwxLTMuMDdMMzQuNzgsMjBhMi41NCwyLjU0LDAsMCwwLDAtMy40LDIuMjEsMi4yMSwwLDAsMC0zLjEyLS4xNWwtLjE0LjE1LTE3LDE4LjI3Yy0zLjM0LDMuNTgtMyw3LjY4LTEsOS44N2E1LjIxLDUuMjEsMCwwLDAsMy44NiwxLjY3Yy4yMSwwLC40MywwLC42NCwwYTgsOCwwLDAsMCw0LjgyLTIuN2wyNC4yMi0yNkExMC44MywxMC44MywwLDAsMCw0OS45LDcuNTcsMTAuMDcsMTAuMDcsMCwwLDAsNDMuMTUuMzMsOC40Myw4LjQzLDAsMCwwLDQwLjgxLDBaIiBzdHlsZT0iZmlsbDojM2RhMGUxIi8+DQo8L3N2Zz4= data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NiA1NiI+DQoJPGNpcmNsZSBjeD0iMjgiIGN5PSIyOCIgcj0iMjUuNSIgc3R5bGU9ImZpbGw6I2ZmZiIvPg0KCTxwYXRoIGQ9Ik0yOCw0QTI0LDI0LDAsMSwxLDQsMjgsMjQsMjQsMCwwLDEsMjgsNG0wLTNBMjcsMjcsMCwxLDAsNTUsMjgsMjcsMjcsMCwwLDAsMjgsMVoiIHN0eWxlPSJmaWxsOiM5ZWFlYjkiLz4NCgk8cGF0aCBkPSJNMTIsNDlzNi4wOS0yMCwxNi0yMFM0NCw0OSw0NCw0OSIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzllYWViOTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2Utd2lkdGg6M3B4O2ZpbGwtcnVsZTpldmVub2RkIi8+DQoJPGVsbGlwc2UgY3g9IjI4IiBjeT0iMjIiIHJ4PSI4LjUiIHJ5PSI5LjUiIHN0eWxlPSJmaWxsOiNmZmYiLz4NCgk8cGF0aCBkPSJNMjgsMTRjMy44NiwwLDcsMy41OSw3LDhzLTMuMTQsOC03LDgtNy0zLjU5LTctOCwzLjE0LTgsNy04bTAtM2MtNS41MiwwLTEwLDQuOTItMTAsMTFzNC40OCwxMSwxMCwxMSwxMC00LjkyLDEwLTExUzMzLjUyLDExLDI4LDExWiIgc3R5bGU9ImZpbGw6IzllYWViOSIvPg0KPC9zdmc+ data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NiA1NiI+DQoJPGNpcmNsZSBjeD0iMjgiIGN5PSIyOCIgcj0iMjUiIHN0eWxlPSJmaWxsOiNmZmYiLz4NCgk8cGF0aCBkPSJNMjgsNUEyMywyMywwLDEsMSw1LDI4LDIzLDIzLDAsMCwxLDI4LDVtMC00QTI3LDI3LDAsMSwwLDU1LDI4LDI3LDI3LDAsMCwwLDI4LDFaIiBzdHlsZT0iZmlsbDojM2RhMGUxIi8+DQoJPHBhdGggZD0iTTEyLDQ5czYuMDktMjAsMTYtMjBTNDQsNDksNDQsNDkiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMzZGEwZTE7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLXdpZHRoOjNweDtmaWxsLXJ1bGU6ZXZlbm9kZCIvPg0KCTxlbGxpcHNlIGN4PSIyOCIgY3k9IjIyIiByeD0iOC41IiByeT0iOS41IiBzdHlsZT0iZmlsbDojZmZmIi8+DQoJPHBhdGggZD0iTTI4LDE0YzMuODYsMCw3LDMuNTksNyw4cy0zLjE0LDgtNyw4LTctMy41OS03LTgsMy4xNC04LDctOG0wLTNjLTUuNTIsMC0xMCw0LjkyLTEwLDExczQuNDgsMTEsMTAsMTEsMTAtNC45MiwxMC0xMVMzMy41MiwxMSwyOCwxMVoiIHN0eWxlPSJmaWxsOiMzZGEwZTEiLz4NCjwvc3ZnPg== data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NiA1NiI+DQoJPHJlY3QgeD0iNS41IiB5PSI1LjUiIHdpZHRoPSI0NSIgaGVpZ2h0PSI0NSIgcng9IjYuNSIgcnk9IjYuNSIgc3R5bGU9ImZpbGw6I2ZmZiIvPg0KCTxwYXRoIGQ9Ik00NCw3YTUsNSwwLDAsMSw1LDVWNDRhNSw1LDAsMCwxLTUsNUgxMmE1LDUsMCwwLDEtNS01VjEyYTUsNSwwLDAsMSw1LTVINDRtMC0zSDEyYTgsOCwwLDAsMC04LDhWNDRhOCw4LDAsMCwwLDgsOEg0NGE4LDgsMCwwLDAsOC04VjEyYTgsOCwwLDAsMC04LThaIiBzdHlsZT0iZmlsbDojOWVhZWI5Ii8+DQoJPHJlY3QgeD0iMTQiIHk9IjE3IiB3aWR0aD0iMjgiIGhlaWdodD0iMyIgcng9IjEuNSIgcnk9IjEuNSIgc3R5bGU9ImZpbGw6I2ZmZiIvPg0KCTxwYXRoIGQ9Ik00MC41LDE3aC0yNWExLjUsMS41LDAsMCwwLDAsM2gyNWExLjUsMS41LDAsMCwwLDAtM1oiIHN0eWxlPSJmaWxsOiM5ZWFlYjkiLz4NCgk8cmVjdCB4PSIxNCIgeT0iMjYiIHdpZHRoPSIyOCIgaGVpZ2h0PSIzIiByeD0iMS41IiByeT0iMS41IiBzdHlsZT0iZmlsbDojZmZmIi8+DQoJPHBhdGggZD0iTTQwLjUsMjZoLTI1YTEuNSwxLjUsMCwwLDAsMCwzaDI1YTEuNSwxLjUsMCwwLDAsMC0zWiIgc3R5bGU9ImZpbGw6IzllYWViOSIvPg0KCTxyZWN0IHg9IjE0IiB5PSIzNSIgd2lkdGg9IjE0IiBoZWlnaHQ9IjMiIHJ4PSIxLjUiIHJ5PSIxLjUiIHN0eWxlPSJmaWxsOiNmZmYiLz4NCgk8cGF0aCBkPSJNMjYuNSwzNWgtMTFhMS41LDEuNSwwLDAsMCwwLDNoMTFhMS41LDEuNSwwLDAsMCwwLTNaIiBzdHlsZT0iZmlsbDojOWVhZWI5Ii8+DQo8L3N2Zz4= data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NiA1NiI+DQoJPHJlY3QgeD0iNiIgeT0iNiIgd2lkdGg9IjQ0IiBoZWlnaHQ9IjQ0IiByeD0iNiIgcnk9IjYiIHN0eWxlPSJmaWxsOiNmZmYiLz4NCgk8cGF0aCBkPSJNNDQsOGE0LDQsMCwwLDEsNCw0VjQ0YTQsNCwwLDAsMS00LDRIMTJhNCw0LDAsMCwxLTQtNFYxMmE0LDQsMCwwLDEsNC00SDQ0bTAtNEgxMmE4LDgsMCwwLDAtOCw4VjQ0YTgsOCwwLDAsMCw4LDhINDRhOCw4LDAsMCwwLDgtOFYxMmE4LDgsMCwwLDAtOC04WiIgc3R5bGU9ImZpbGw6IzNkYTBlMSIvPg0KCTxyZWN0IHg9IjE0IiB5PSIxNyIgd2lkdGg9IjI4IiBoZWlnaHQ9IjMiIHJ4PSIxLjUiIHJ5PSIxLjUiIHN0eWxlPSJmaWxsOiNmZmYiLz4NCgk8cGF0aCBkPSJNNDAuNSwxN2gtMjVhMS41LDEuNSwwLDAsMCwwLDNoMjVhMS41LDEuNSwwLDAsMCwwLTNaIiBzdHlsZT0iZmlsbDojM2RhMGUxIi8+DQoJPHJlY3QgeD0iMTQiIHk9IjI2IiB3aWR0aD0iMjgiIGhlaWdodD0iMyIgcng9IjEuNSIgcnk9IjEuNSIgc3R5bGU9ImZpbGw6I2ZmZiIvPg0KCTxwYXRoIGQ9Ik00MC41LDI2aC0yNWExLjUsMS41LDAsMCwwLDAsM2gyNWExLjUsMS41LDAsMCwwLDAtM1oiIHN0eWxlPSJmaWxsOiMzZGEwZTEiLz4NCgk8cmVjdCB4PSIxNCIgeT0iMzUiIHdpZHRoPSIxNCIgaGVpZ2h0PSIzIiByeD0iMS41IiByeT0iMS41IiBzdHlsZT0iZmlsbDojZmZmIi8+DQoJPHBhdGggZD0iTTI2LjUsMzVoLTExYTEuNSwxLjUsMCwwLDAsMCwzaDExYTEuNSwxLjUsMCwwLDAsMC0zWiIgc3R5bGU9ImZpbGw6IzNkYTBlMSIvPg0KPC9zdmc+ data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4IDEyIiB3aWR0aD0iOCIgaGVpZ2h0PSIxMiI+DQoJPHRpdGxlPlRvLXF1aXo8L3RpdGxlPg0KCTxwYXRoIGQ9Ik0xLDEyYTEsMSwwLDAsMS0uNzA3LTEuNzA3TDQuNTg2LDYsLjI5MywxLjcwN0ExLDEsMCwwLDEsMS43MDcuMjkzTDcuNDE0LDYsMS43MDcsMTEuNzA3QTEsMSwwLDAsMSwxLDEyWiIgc3R5bGU9ImZpbGw6IzllYWViOSIvPg0KPC9zdmc+ data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MCA0MCIgd2lkdGg9IjIwcHgiIGhlaWdodD0iMjBweCI+DQoJPHBhdGggZD0iTTguMzQsNDBhOC4wOCw4LjA4LDAsMCwxLTUuODctMi42NSw5LjM5LDkuMzksMCwwLDEsLjM2LTEzLjA4bDE3LTE4LjEyYTUuOSw1LjksMCwwLDEsNi0yLDYuNDEsNi40MSwwLDAsMSw0LjI5LDQuNiw2LjgzLDYuODMsMCwwLDEtMS44Miw2LjQxTDEyLjA1LDMyLjUyYTUuMDgsNS4wOCwwLDAsMS0zLDEuNjksMy4yMSwzLjIxLDAsMCwxLTIuNzMtMUM1LDMxLjg4LDQuODUsMjkuMzQsNywyNy4wOUwxOC4zNCwxNC45MkExLjE0LDEuMTQsMCwwLDEsMjAsMTQuODRhLjYuNiwwLDAsMSwuMDguMDgsMS4zNCwxLjM0LDAsMCwxLDAsMS44MUw4LjY0LDI4LjkyYy0xLDEtMS4wOCwyLS42NiwyLjVhMSwxLDAsMCwwLC43OS4yNSwyLjg5LDIuODksMCwwLDAsMS41OC0xTDI2LjU3LDEzLjM3YTQuMiw0LjIsMCwwLDAsMS4yLTMuOTQsMy44OCwzLjg4LDAsMCwwLTIuNi0yLjc4LDMuNjMsMy42MywwLDAsMC0zLjY5LDEuMjhDMTYuNjUsMTMuMTEsNywyMy40Nyw0LjUyLDI2LjA2Yy0zLjE1LDMuMzktMi40LDcuMjctLjM2LDkuNDVzNS42NywzLDguODQtLjM5TDMwLDE3YTEuMTUsMS4xNSwwLDAsMSwxLjYzLS4wNy4yMy4yMywwLDAsMSwuMDcuMDcsMS4zNCwxLjM0LDAsMCwxLDAsMS44MUwxNC43LDM2Ljk0QTguNzIsOC43MiwwLDAsMSw4LjM0LDQwWiIgc3R5bGU9ImZpbGw6IzllYWViOSIvPg0KPC9zdmc+ data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MCA0MCIgd2lkdGg9IjIwcHgiIGhlaWdodD0iMjBweCI+DQoJPHBhdGggZD0iTTE4LDJBMTgsMTgsMCwxLDAsMzYsMjAsMTgsMTgsMCwwLDAsMTgsMlpNMzMuMzUsMjBhMTUuMjksMTUuMjksMCwwLDEtMy4xOCw5LjM0LDIuNDYsMi40NiwwLDAsMS0uNi0yLjg2LDEzLjYsMTMuNiwwLDAsMCwuNTktNS4yMmMtLjEyLTEuMTEtLjctMy43OS0yLjI4LTMuODJBMy42MiwzLjYyLDAsMCwxLDI0LjMsMTVjLTEuOTQtMy44NywzLjY0LTQuNjIsMS43LTYuNzYtLjU0LS42MS0zLjM0LDIuNDgtMy43NS0xLjYzYTIuMDYsMi4wNiwwLDAsMSwuNjMtMS4xOUExNS4zNywxNS4zNywwLDAsMSwzMy4zNSwyMFpNMTUuODksNC44Yy0uMzcuNzItMS4zNCwxLTEuOTIsMS41NC0xLjI5LDEuMTYtMS44NCwxLTIuNTMsMi4xMlM4LjUsMTEuMTcsOC41LDEyczEuMTQsMS43NiwxLjcsMS41N2E2LjExLDYuMTEsMCwwLDEsMi45NC4xM2MuODguMzEsNy4zNC42Miw1LjI4LDYuMDgtLjY1LDEuNzQtMy41MSwxLjQ1LTQuMjcsNC4zMmEyMywyMywwLDAsMC0uNTQsMi44MWMwLC45Mi42NSw0LjM1LS4yMyw0LjM1cy0zLjI2LTMuMDctMy4yNi0zLjYzYTM1LjczLDM1LjczLDAsMCwxLS42MS00LjE4YzAtMS42Ny0yLjg1LTEuNjQtMi44NS0zLjg3LDAtMiwxLjU0LTMsMS4yLTRzLTMuMDUtMS00LjE5LTEuMUExNS40MiwxNS40MiwwLDAsMSwxNS44OSw0LjhaTTEzLjE3LDM0LjU3Yy45Mi0uNDksMS0xLjEyLDEuODUtMS4xNWExOC40MywxOC40MywwLDAsMCwyLjgyLS42MWMuOTUtLjIxLDIuNjYtMS4xOCw0LjE3LTEuMzEsMS4yNy0uMSwzLjc4LjA3LDQuNDUsMS4zYTE1LjMyLDE1LjMyLDAsMCwxLTEzLjI5LDEuNzdaIiBzdHlsZT0iZmlsbDojOWVhZWI5Ii8+DQo8L3N2Zz4= data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMTA2cHgiIGhlaWdodD0iMTM0cHgiIHZpZXdCb3g9IjAgMCAxMDYgMTM0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDYgMTM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGw9IiMzZGEwZTEiIGQ9Ik01MywxOWMtMTYuNzA2LDAtMzAuMjUsMTUuMjI3LTMwLjI1LDM0LjAzMWMwLDE4Ljc5NCwxMy41NDQsMzQuMDMxLDMwLjI1LDM0LjAzMQ0KCWMxNi43MTMsMCwzMC4yNS0xNS4yMzcsMzAuMjUtMzQuMDMxQzgzLjI1LDM0LjIyNyw2OS43MTMsMTksNTMsMTl6Ii8+DQo8cGF0aCBmaWxsPSIjM2RhMGUxIiBkPSJNNzQuMTE5LDg4LjYyNWMtNi4yOTMsNS4wNTMtMTMuNDg2LDcuOTYyLTIxLjEyMiw3Ljk2MmMtNy42MywwLTE0LjgyMy0yLjkwNC0yMS4xMjItNy45NjINCglDMTguMjg2LDkzLjk4NCw3LjYyMSwxMDYuNjg4LDIuNzM5LDEzNGgxMDAuNTIxQzk4LjM3OSwxMDYuNjg4LDg3LjcyMyw5My45NzEsNzQuMTE5LDg4LjYyNXoiLz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MCA0MCIgd2lkdGg9IjIwcHgiIGhlaWdodD0iMjBweCI+DQoJPHBhdGggZD0iTTIwLjY5LDIyLjY0Yy0zLjM0LDMuMzMtNy4wNiw2LjQ2LTguNjMsNC44OS0yLjE1LTIuMTUtMy41My00LjEtOC4yMy0uMTlzLTEuMTgsNi4yNiwxLDguNDFDNy4xNiwzOC4xLDE2LjE4LDM2LDI1LjIsMjdTMzYuMzcsOS4xNSwzNCw2LjhjLTIuMTYtMi4xNS00LjcxLTUuNjctOC40My0xcy0yLDYuMDcuMTksOC4yMkMyNy4xNiwxNS42LDI0LDE5LjMyLDIwLjY5LDIyLjY0WiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzllYWViOTtzdHJva2Utd2lkdGg6M3B4Ii8+DQo8L3N2Zz4= data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MCA0MCIgd2lkdGg9IjIwcHgiIGhlaWdodD0iMjBweCIgPg0KCTxwYXRoIGQ9Ik01Ljc2LDdIMjkuMjJhNC4zNiw0LjM2LDAsMCwxLDQuMjYsNC40NXYxNS42YTQuMzYsNC4zNiwwLDAsMS00LjI2LDQuNDVINS43NkE0LjM3LDQuMzcsMCwwLDEsMS41LDI3LjA1VjExLjQ1QTQuMzcsNC4zNywwLDAsMSw1Ljc2LDdaIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojOWVhZWI5O3N0cm9rZS13aWR0aDozcHgiLz4NCgk8cGF0aCBkPSJNLjg2LDEzbDE2LjYzLDkuMTRMMzQuMTIsMTMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM5ZWFlYjk7c3Ryb2tlLXdpZHRoOjNweCIvPg0KPC9zdmc+ data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MCA0MCIgd2lkdGg9IjIwcHgiIGhlaWdodD0iMjBweCI+DQoJPHBhdGggZD0iTTE5LjUyNyw5LjE2NGExLjg2NCwxLjg2NCwwLDAsMSwyLjEyNSwxLjU2LDEuODQyLDEuODQyLDAsMCwxLC4wMS40OTIsMi43MjIsMi43MjIsMCwwLDEtMi44LDIuNjM5Yy0uMDUzLDAtLjEwNiwwLS4xNTgtLjAwOS0xLjU2MiwwLTIuMzA2LS43ODQtMi4yNi0yLjA4NGEyLjc5MSwyLjc5MSwwLDAsMSwyLjk2NC0yLjYwOEMxOS40NDcsOS4xNTYsMTkuNDg3LDkuMTYsMTkuNTI3LDkuMTY0WiIgc3R5bGU9ImZpbGw6IzllYWViOSIvPg0KCTxwYXRoIGQ9Ik0xNS4zLDMwLjExNGMtMS4xMjgsMC0xLjk1MS0uNjg2LTEuMTYzLTMuNjkxbDEuMjkyLTUuMzMzYy4yMjQtLjg1My4yNjEtMS4yLDAtMS4yYTguNTc3LDguNTc3LDAsMCwwLTIuNjY2LDEuMTdsLS41NjItLjkyMmMyLjc0MS0yLjI5LDUuODkzLTMuNjMzLDcuMjQyLTMuNjMzLDEuMTI4LDAsMS4zMTUsMS4zMzMuNzUzLDMuMzg1TDE4LjcxNCwyNS41Yy0uMjYzLjk5LS4xNSwxLjMzMi4xMTMsMS4zMzJhNS44MTYsNS44MTYsMCwwLDAsMi41MzUtMS4yNjdsLjYzOC44NTdDMTkuMzMzLDI5LjA4OCwxNi40MjYsMzAuMTE0LDE1LjMsMzAuMTE0WiIgc3R5bGU9ImZpbGw6IzllYWViOSIvPg0KCTxwYXRoIGQ9Ik0xOCw1QTE1LDE1LDAsMSwxLDMsMjAsMTUsMTUsMCwwLDEsMTgsNW0wLTNBMTgsMTgsMCwxLDAsMzYsMjAsMTgsMTgsMCwwLDAsMTgsMloiIHN0eWxlPSJmaWxsOiM5ZWFlYjkiLz4NCjwvc3ZnPg== data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNyIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDcgMTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+DQo8cGF0aCBkPSJNNiAxTDEgNkw2IDExIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+DQo8L3N2Zz4= data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNyIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDcgMTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+DQo8cGF0aCBkPSJNNiAxTDEgNkw2IDExIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+DQo8L3N2Zz4= data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTUiIHZpZXdCb3g9IjAgMCAxNCAxNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCjxwYXRoIGQ9Ik0xIDlMNSAxM0wxMyAxLjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyIi8+DQo8L3N2Zz4NCg==".split(" "); +c=".popup-layer {top: 0;right: 0;bottom: 0;left: 0;z-index: 1;position: absolute;border-radius: inherit; }.modal-layer {background: #000000;opacity: 0.4;position: absolute;width: 100%;height: 100%;border-radius: inherit; }body {margin: 0;padding: 0;cursor: default;-ms-touch-action: pan-y;touch-action: pan-y;overflow-y: auto; } body .info_panel {position: relative;top: 0;background: #FFFFFF;font-family: Helvetica, Roboto, Arial;padding-top: 161px;padding-bottom: 50px; } body .info_panel, body .info_panel * {box-sizing: border-box; } body .info_panel.domain::before {background: transparent url("+ +c[0]+") no-repeat center; } body .info_panel.time::before {background: transparent url("+c[1]+") no-repeat center; } body .info_panel.password::before {background: transparent url("+c[2]+") no-repeat center; } body .info_panel::before {position: absolute;width: 100%;top: 55px;height: 63px;content: ''; } body .info_panel .message {position: relative;color: #414A5B;font-size: 16px;padding-left: 15px;padding-right: 15px;text-align: center; } body .password .password_field {position: relative;margin-left: 20px;margin-right: 20px;padding-top: 23px;padding-bottom: 26px; } body .password .password_field input {position: relative;width: 100%;height: 34px;border: 1px solid #D6D6D6;border-top: 1px solid #BABABA;padding-left: 8px;font-size: 20px; } body .password .wrong_password_label {position: absolute;font-size: 12px;color: #DD4A37;left: 22px;right: 22px;margin-top: -21px; } body .ok.component_container {position: fixed;bottom: 0;height: 50px;background: #434E50; } body .ok.component_container.active {background: #637375; } body .ok.component_container button {top: 0;bottom: 0;left: 0;width: 100%;position: absolute;background: transparent;border: 0;line-height: 50px;color: #E2E2E2;font-size: 16px; } body .ok.component_container button[disabled] {color: #647577; }.launch-screen {z-index: 999 !important; }.component_base,.component_container {position: absolute; }:focus {outline: none; }::-moz-focus-inner {border: 0; }input {-webkit-appearance: none;appearance: none; }button {cursor: pointer;margin: 0;border: 0; }button[disabled] {cursor: default; }.__player_view_id__ > * {position: absolute; }.__player_view_id__ .slide {white-space: nowrap;font-size: 0; } .__player_view_id__ .slide a {text-decoration: none;cursor: pointer; } .__player_view_id__ .slide a img {border: 0; } .__player_view_id__ .slide * {-ms-transform-origin: 0 0;transform-origin: 0 0; } .__player_view_id__ .slide.relpos, .__player_view_id__ .slide .relpos {position: relative !important;vertical-align: top; } .__player_view_id__ .slide.kern, .__player_view_id__ .slide .kern {text-rendering: optimizeLegibility;font-feature-settings: 'kern' 1, 'liga' 0; } .__player_view_id__ .slide.nokern, .__player_view_id__ .slide .nokern {text-rendering: optimizeSpeed;font-feature-settings: 'kern' 0, 'liga' 0; }.__player_view_id__ .fullscreen {-ms-transform: none !important;transform: none !important;top: 0 !important;left: 0 !important; } .__player_view_id__ .fullscreen > video {background-color: black;width: __slide_width__ !important;height: __slide_height__ !important;z-index: 100; }.__player_view_id__ .video_player video {width: 100%;height: 100%; } .__player_view_id__ .video_player video::cue {color: #FFFFFF;background-color: rgba(8, 8, 8, 0.75);border-radius: 4px;font-family: Helvetica, Roboto, Arial;line-height: 1.1; }.__player_view_id__ .video_player.iphone::after {background: rgba(0, 0, 0, 0) url("+ +c[3]+") no-repeat center;position: absolute;width: 100%;height: 100%;top: 0;right: 0;content: ''; }.__player_view_id__ .video_player.iphone video {opacity: 0; }.__player_view_id__ .video_player.iphone.without_controls video {display: none; }.__player_view_id__ .video_player .controls {height: 36px;background: rgba(45, 50, 55, 0.85098);border: 1px solid #444648;cursor: default;border-radius: 4px; } .__player_view_id__ .video_player .controls .progress {background-color: #75787A;height: 14px;left: 62px;top: 0;bottom: 0;margin-top: auto;margin-bottom: auto;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark {width: 10px;height: 10px;margin-top: -5px;margin-left: -5px;top: 50%;background: url("+ +c[4]+") no-repeat;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark:hover, .__player_view_id__ .video_player .controls .progress .bookmark:active {background: url("+c[5]+") no-repeat; } .__player_view_id__ .video_player .controls .progress .loading {background-color: #B1B3B5;height: 100%; } .__player_view_id__ .video_player .controls .progress .playing {background-color: #FFFFFF;height: 100%; } .__player_view_id__ .video_player .controls .progress .tooltip {background: url("+ +c[6]+") no-repeat;width: 60px;height: 25px;top: -33px;margin-left: -30px;font-family: Helvetica, Roboto, Arial;font-size: 12px;padding-top: 2px;text-align: center; } .__player_view_id__ .video_player .controls .volume_popup {border-radius: 3px;background: rgba(45, 50, 55, 0.85098);top: -67px;right: 55px;padding: 8px; } .__player_view_id__ .video_player .controls .volume_popup .volume {background: url("+c[7]+");position: relative;cursor: pointer;width: 12px;height: 48px; } .__player_view_id__ .video_player .controls .volume_popup .volume .back {background: url("+ +c[8]+");width: 100%; } .__player_view_id__ .video_player .controls button {width: 100%;height: 100%; } .__player_view_id__ .video_player .controls button.mute {background: url("+c[9]+"); } .__player_view_id__ .video_player .controls button.mute:hover {background: url("+c[10]+"); } .__player_view_id__ .video_player .controls button.mute:active {background: url("+c[11]+"); } .__player_view_id__ .video_player .controls button.mute.selected {background: url("+c[12]+"); } .__player_view_id__ .video_player .controls button.mute.selected:hover {background: url("+ +c[13]+"); } .__player_view_id__ .video_player .controls button.mute.selected:active {background: url("+c[14]+"); } .__player_view_id__ .video_player .controls button.play {background: url("+c[15]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:hover {background: url("+c[16]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:active {background: url("+c[17]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected {background: url("+ +c[18]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:hover {background: url("+c[19]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:active {background: url("+c[20]+") no-repeat; } .__player_view_id__ .video_player .controls button.play::after {background: url("+c[21]+");width: 1px;height: 32px;right: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls button.toggle_fullscreen {background: url("+ +c[22]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:hover {background: url("+c[23]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:active {background: url("+c[24]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen::before {background: url("+c[21]+") no-repeat;width: 1px;height: 32px;left: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls .component_container.toggle_fullscreen, .__player_view_id__ .video_player .controls .component_container.play {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .component_container.toggle_fullscreen {right: -1px; } .__player_view_id__ .video_player .controls .component_container.mute {width: 22px;height: 22px;right: 58px;top: 6px; }.modal_layer {background: #000000;opacity: 0.7;z-index: 1;width: 100%;height: 100%; }.message_box,.confirm_window {border-radius: 4px;min-height: 150px;min-width: 300px;z-index: 1;background: #FFFFFF;position: absolute;width: 300px;top: 0;right: 0;bottom: 0;left: 0;margin: auto; } .message_box .title, .confirm_window .title {display: none !important; } .message_box .message, .confirm_window .message {padding: 34px 34px 24px 34px;font-size: 14px;line-height: 18px;color: #231F20;font-family: Helvetica, Roboto, Arial; }.message_box .btn_ok.component_container {padding-bottom: 24px;position: relative;text-align: center;height: 44px;width: 100%; } .message_box .btn_ok.component_container button {vertical-align: middle;line-height: 44px;height: 44px;padding-left: 20px;padding-right: 20px;min-width: 110px;margin-left: 5px;margin-right: 5px;position: static;-webkit-appearance: none;appearance: none;border: 0;border-radius: 4px;font-size: 16px;background: #339BE0;color: #FFFFFF; } .message_box .btn_ok.component_container button.active {background: #058ACC; }.confirm_window .buttons_panel {text-align: center;position: relative;padding-bottom: 24px;height: 44px;width: 100%; } .confirm_window .buttons_panel > div {width: 50%;float: right;position: relative; } .confirm_window .buttons_panel > div button {vertical-align: middle;line-height: 44px;height: 44px;padding-left: 20px;padding-right: 20px;min-width: 110px;margin-left: 5px;margin-right: 5px;position: static;-webkit-appearance: none;appearance: none;border: 0;border-radius: 4px;font-size: 16px;background: #339BE0;color: #FFFFFF; } .confirm_window .buttons_panel > div.active button {background: #058ACC; } .confirm_window .buttons_panel > div:only-child {width: 100%;text-align: center !important; } .confirm_window .buttons_panel > div:nth-child(1) {text-align: left; } .confirm_window .buttons_panel > div:nth-child(2) {text-align: right; }.back_to_app {height: 100%;position: absolute;left: 0; } .back_to_app__text {color: #3DA0E1;font-size: 16px;font-family: Helvetica Neue, Helvetica, Roboto, Arial;text-overflow: ellipsis;overflow: hidden;position: absolute;bottom: 0;top: 0;height: 24px;line-height: 24px;margin: auto;padding-left: 25px;max-width: 80px; } .back_to_app__text::before {content: '';background: url("+ +c[25]+") no-repeat center;height: 24px;width: 14px;left: 8px;position: absolute; }.trial_banner {position: relative;transform: translateZ(0); } .trial_banner .banner-content, .trial_banner .banner-content_hover {position: absolute;left: 0;right: 0;top: 0;bottom: 0;width: 100%;height: 100%; } .trial_banner .banner-content {visibility: visible;z-index: 1; } .trial_banner .banner-content_hover {visibility: hidden;z-index: 0; } .trial_banner .days_remaining {position: absolute;font-family: 'Open Sans', Arial, sans-serif;font-weight: normal;font-size: 13px;left: 65px;top: 41px;color: #7C1645;z-index: 1; } .trial_banner:hover .banner-content {visibility: hidden;z-index: 0; } .trial_banner:hover .banner-content_hover {visibility: visible;z-index: 1; }.slide-transiting .quiz-uikit-primary-button {transition: none; }.slide-transiting .quiz-uikit-secondary-button {transition: none; }.slide-transiting .quiz-uikit-link-button {transition: none; }.slide-transiting .visuals-uikit-primary-button {transition: none; }.slide-transiting .visuals-uikit-secondary-button {transition: none; }.slide-transiting .visuals-uikit-link-button {transition: none; }@keyframes preloader_spin {0% {transform: rotate(0deg); } 100% {transform: rotate(360deg); } }html,body {background-color: #F7F7F7 !important; }.universal_mini {overflow: hidden;background-color: #F7F7F7; } .universal_mini div {-webkit-tap-highlight-color: rgba(0, 0, 0, 0);-webkit-user-select: none;-ms-user-select: none;user-select: none;-webkit-touch-callout: none;-webkit-user-drag: none; } .universal_mini .launch-screen {z-index: 100;position: fixed;top: 0;right: 0;bottom: 0;left: 0;background-color: rgba(0, 0, 0, 0.48); } .universal_mini .launch-screen .launch-screen-button {top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 96px;height: 96px;position: absolute; } .universal_mini .launch-screen .launch-screen-button__play-icon {background-color: #FFFFFF;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 90px;height: 90px;box-shadow: 0 12px 50px 0 rgba(0, 0, 0, 0.2);transition: 0.3s ease-in-out; } .universal_mini .launch-screen .launch-screen-button__icon {background: url("+ +c[26]+") no-repeat center;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 6px;width: 90px;height: 90px; } .universal_mini .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__play-icon {width: 96px;height: 96px; } .universal_mini .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__icon {background: url("+c[27]+") no-repeat center; } .universal_mini .playerView {-ms-transform: translateX(0);transform: translateX(0); } .universal_mini.not_loaded .top-panel, .universal_mini.not_loaded .bottom-panel, .universal_mini.not_loaded .landscape-bottom-panel {display: none; } .universal_mini.landscape > .bottom-panel {display: none; } .universal_mini.landscape > .top-panel {display: none !important; } .universal_mini.landscape .landscape-bottom-panel {display: block !important; } .universal_mini.landscape.quiz_mode .top-panel, .universal_mini.landscape.quiz_mode .landscape-bottom-panel {display: initial; } .universal_mini.landscape.quiz_mode > .bottom-panel {display: none; } .universal_mini > .top-panel {width: 100%;background: #FFFFFF;position: absolute;box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);height: 46px;top: 0; } .universal_mini > .top-panel::before, .universal_mini > .top-panel::after {top: 100%; } .universal_mini > .top-panel .menu {width: 46px;height: 100%;position: absolute;right: 0;cursor: pointer; } .universal_mini > .top-panel .menu::after {content: '';position: absolute;width: 22px;height: 19px;background-image: url("+ +c[28]+");background-repeat: no-repeat;background-size: contain;top: 0;right: 0;bottom: 0;left: 0;margin: auto; } .universal_mini > .top-panel .menu.menu_active::after {background-image: url("+c[28]+"); } .universal_mini > .top-panel .slide-info {width: 100%;position: absolute;color: #2B3B46;text-align: center;font-size: 15px;font-weight: bold;line-height: 46px;text-overflow: ellipsis;overflow: hidden;white-space: nowrap;z-index: 1;pointer-events: none;font-family: Helvetica Neue, Helvetica, Roboto, Arial; } .universal_mini > .bottom-panel {width: 100%;background: #FFFFFF;position: absolute;bottom: 0;box-shadow: 0 -2px 12px 0 rgba(0, 0, 0, 0.1);height: 66px;top: auto; } .universal_mini > .bottom-panel .play {position: absolute; } .universal_mini > .bottom-panel .prev {position: absolute; } .universal_mini > .bottom-panel .next {position: absolute; } .universal_mini > .bottom-panel .rate {position: absolute; } .universal_mini > .bottom-panel .play {width: 54px;height: 100%; } .universal_mini > .bottom-panel .play::after {content: '';position: absolute;width: 24px;height: 28px;background-image: url("+ +c[29]+");background-repeat: no-repeat;background-size: contain;top: 0;right: 0;bottom: 0;left: 0;margin: auto; } .universal_mini > .bottom-panel .play.play_active::after {background-image: url("+c[29]+"); } .universal_mini > .bottom-panel .play.play_active[disabled]::after {background-image: url("+c[30]+"); } .universal_mini > .bottom-panel .play[disabled]::after {background-image: url("+c[30]+"); } .universal_mini > .bottom-panel .play.play_is-playing::after {background-image: url("+ +c[31]+");width: 34px;height: 34px;left: -3px; } .universal_mini > .bottom-panel .rate {width: 54px;height: 100%; } .universal_mini > .bottom-panel .rate::after {content: '';position: absolute;width: 30px;height: 30px;background-image: url("+c[32]+");background-repeat: no-repeat;background-size: contain;top: 0;right: 0;bottom: 0;left: 0;margin: auto; } .universal_mini > .bottom-panel .rate.rate_active::after {background-image: url("+c[32]+"); } .universal_mini > .bottom-panel .rate.rate_active[disabled]::after {background-image: url("+ +c[32]+"); } .universal_mini > .bottom-panel .rate[disabled]::after {background-image: url("+c[32]+"); } .universal_mini > .bottom-panel .prev {width: 54px;height: 100%; } .universal_mini > .bottom-panel .prev::after {content: '';position: absolute;width: 30px;height: 30px;background-image: url("+c[33]+");background-repeat: no-repeat;background-size: contain;top: 0;right: 0;bottom: 0;left: 0;margin: auto; } .universal_mini > .bottom-panel .prev.prev_active::after {background-image: url("+ +c[33]+"); } .universal_mini > .bottom-panel .prev.prev_active[disabled]::after {background-image: url("+c[34]+"); } .universal_mini > .bottom-panel .prev[disabled]::after {background-image: url("+c[34]+"); } .universal_mini > .bottom-panel .next {width: 54px;height: 100%; } .universal_mini > .bottom-panel .next::after {content: '';position: absolute;width: 30px;height: 30px;background-image: url("+c[35]+");background-repeat: no-repeat;background-size: contain;top: 0;right: 0;bottom: 0;left: 0;margin: auto; } .universal_mini > .bottom-panel .next.next_active::after {background-image: url("+ +c[35]+"); } .universal_mini > .bottom-panel .next.next_active[disabled]::after {background-image: url("+c[36]+"); } .universal_mini > .bottom-panel .next[disabled]::after {background-image: url("+c[36]+"); } .universal_mini > .bottom-panel .play.play_first {left: 15px; } .universal_mini > .bottom-panel .play.play_is-playing {left: 14px; } .universal_mini > .bottom-panel .rate.rate_first {left: 17px; } .universal_mini > .bottom-panel .rate.rate_second {left: 79px; } .universal_mini > .bottom-panel .prev {right: 72px; } .universal_mini > .bottom-panel .prev.prev_next-button-hidden {right: 12px; } .universal_mini > .bottom-panel .next {right: 12px; } .universal_mini > .progress {position: absolute;top: auto;left: 0;height: 3px;background: linear-gradient(90deg, #3FA9F5 var(--play-progress), transparent var(--play-progress)); } .universal_mini > .top-panel > button {background: transparent; } .universal_mini > .landscape-bottom-panel > button {background: transparent; } .universal_mini > .bottom-panel > button {background: transparent; } .universal_mini > .landscape-bottom-panel {width: 100%;background: #FFFFFF;position: absolute;bottom: 0;display: none;right: 0;top: 0;width: 56px;box-shadow: -2px 0 12px 0 rgba(0, 0, 0, 0.1); } .universal_mini > .landscape-bottom-panel .play {position: absolute; } .universal_mini > .landscape-bottom-panel .prev {position: absolute; } .universal_mini > .landscape-bottom-panel .next {position: absolute; } .universal_mini > .landscape-bottom-panel .rate {position: absolute; } .universal_mini > .landscape-bottom-panel .play {width: 100%;height: 30px; } .universal_mini > .landscape-bottom-panel .play::after {content: '';position: absolute;width: 24px;height: 28px;background-image: url("+ +c[29]+");background-repeat: no-repeat;background-size: contain;top: 0;right: 0;bottom: 0;left: 0;margin: auto; } .universal_mini > .landscape-bottom-panel .play.play_active::after {background-image: url("+c[29]+"); } .universal_mini > .landscape-bottom-panel .play.play_active[disabled]::after {background-image: url("+c[30]+"); } .universal_mini > .landscape-bottom-panel .play[disabled]::after {background-image: url("+c[30]+"); } .universal_mini > .landscape-bottom-panel .play.play_is-playing::after {background-image: url("+ +c[31]+");width: 34px;height: 34px;left: -3px; } .universal_mini > .landscape-bottom-panel .rate {width: 100%;height: 30px; } .universal_mini > .landscape-bottom-panel .rate::after {content: '';position: absolute;width: 30px;height: 30px;background-image: url("+c[32]+");background-repeat: no-repeat;background-size: contain;top: 0;right: 0;bottom: 0;left: 0;margin: auto; } .universal_mini > .landscape-bottom-panel .rate.rate_active::after {background-image: url("+c[32]+"); } .universal_mini > .landscape-bottom-panel .rate.rate_active[disabled]::after {background-image: url("+ +c[32]+"); } .universal_mini > .landscape-bottom-panel .rate[disabled]::after {background-image: url("+c[32]+"); } .universal_mini > .landscape-bottom-panel .prev {width: 100%;height: 30px; } .universal_mini > .landscape-bottom-panel .prev::after {content: '';position: absolute;width: 30px;height: 30px;background-image: url("+c[33]+");background-repeat: no-repeat;background-size: contain;top: 0;right: 0;bottom: 0;left: 0;margin: auto; } .universal_mini > .landscape-bottom-panel .prev.prev_active::after {background-image: url("+ +c[33]+"); } .universal_mini > .landscape-bottom-panel .prev.prev_active[disabled]::after {background-image: url("+c[34]+"); } .universal_mini > .landscape-bottom-panel .prev[disabled]::after {background-image: url("+c[34]+"); } .universal_mini > .landscape-bottom-panel .next {width: 100%;height: 30px; } .universal_mini > .landscape-bottom-panel .next::after {content: '';position: absolute;width: 30px;height: 30px;background-image: url("+c[35]+");background-repeat: no-repeat;background-size: contain;top: 0;right: 0;bottom: 0;left: 0;margin: auto; } .universal_mini > .landscape-bottom-panel .next.next_active::after {background-image: url("+ +c[35]+"); } .universal_mini > .landscape-bottom-panel .next.next_active[disabled]::after {background-image: url("+c[36]+"); } .universal_mini > .landscape-bottom-panel .next[disabled]::after {background-image: url("+c[36]+"); } .universal_mini > .landscape-bottom-panel .menu {width: 100%;height: 46px;position: absolute; } .universal_mini > .landscape-bottom-panel .menu.menu_first {top: 12px; } .universal_mini > .landscape-bottom-panel .menu::after {content: '';position: absolute;width: 22px;height: 19px;background-image: url("+ +c[28]+");background-repeat: no-repeat;background-size: contain;top: 0;right: 0;bottom: 0;left: 0;margin: auto; } .universal_mini > .landscape-bottom-panel .menu.menu_active::after {background-image: url("+c[28]+"); } .universal_mini > .landscape-bottom-panel .play.play_first {top: 12px; } .universal_mini > .landscape-bottom-panel .play.play_second {top: 70px; } .universal_mini > .landscape-bottom-panel .rate.rate_first {top: 12px; } .universal_mini > .landscape-bottom-panel .rate.rate_second {top: 69px; } .universal_mini > .landscape-bottom-panel .rate.rate_third {top: 117px; } .universal_mini > .landscape-bottom-panel .prev {bottom: 78px; } .universal_mini > .landscape-bottom-panel .next {bottom: 18px; } .universal_mini.quiz_mode {overflow: visible;height: auto !important; } .universal_mini.quiz_mode #playerView, .universal_mini.quiz_mode .video-container {display: none; } .universal_mini.quiz_mode.interaction_slide .bottom-panel {box-shadow: 0 -2px 12px 0 rgba(0, 0, 0, 0.1);position: fixed;bottom: 0 !important; } .universal_mini.quiz_mode.interaction_slide .bottom-panel .play, .universal_mini.quiz_mode.interaction_slide .bottom-panel .progress {display: none; } .universal_mini.quiz_mode .top-panel {position: fixed;top: -1px;height: 46px; } .universal_mini.quiz_mode .top-panel .slide-info {top: 1px; } .universal_mini.quiz_mode .top-panel .menu.component_container {top: 1px;height: 46px; } .universal_mini, .universal_mini > div {position: absolute;top: 0; } .universal_mini .launch_layer {width: 100%;height: 100%;background: url("+ +c[26]+") no-repeat center;background-color: rgba(0, 0, 0, 0.75); } .universal_mini .launch_layer:active {background-image: url("+c[27]+"); } .universal_mini .launch_layer[disabled], .universal_mini .launch_layer:active[disabled] {background-image: none; } .universal_mini .video-container video {position: absolute; } .universal_mini .change-layout-button {width: 44px;height: 44px;border-radius: 100%;background: #333333;position: absolute;left: 10px;bottom: 10px;border: 1px solid rgba(255, 255, 255, 0.3);box-sizing: border-box; } .universal_mini .change-layout-button::after {content: '';position: absolute;width: 20px;height: 20px;background: url("+ +c[37]+");background-size: cover;margin: auto;top: 0;left: 0;bottom: 0;right: 0; } .universal_mini .preloader {width: 50px;height: 50px;position: absolute;top: 0;left: 0;bottom: 0;right: 0;margin: auto;border-radius: 10px;background-color: rgba(0, 0, 0, 0.5); } .universal_mini .preloader::after {content: '';position: absolute;background: url("+c[38]+");background-size: cover;top: 0;left: 0;bottom: 0;right: 0;animation: preloader_spin 1s infinite linear; } .universal_mini .menu_layer {position: absolute;background: #FFFFFF;z-index: 10; } .universal_mini .menu_layer .menu-layer-top-panel {position: absolute;height: 46px;background: #FFFFFF;display: block;z-index: 1;box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); } .universal_mini .menu_layer .menu-layer-top-panel .tab-title {position: absolute;color: #2B3B46;top: 1px;text-align: center;font-size: 15px;font-weight: bold;line-height: 46px;left: 44px;right: 44px;text-overflow: ellipsis;overflow: hidden;white-space: nowrap;z-index: 1;pointer-events: none;font-family: Helvetica Neue, Helvetica, Roboto, Arial; } .universal_mini .menu_layer .menu-layer-top-panel .search, .universal_mini .menu_layer .menu-layer-top-panel .close, .universal_mini .menu_layer .menu-layer-top-panel .back {position: absolute;height: 46px;top: 0;border: 0;background: transparent;cursor: pointer; } .universal_mini .menu_layer .menu-layer-top-panel .search {width: 58px;height: 46px; } .universal_mini .menu_layer .menu-layer-top-panel .search::after {content: '';position: absolute;width: 18px;height: 18px;background-image: url("+ +c[39]+");background-repeat: no-repeat;background-size: contain;top: 0;right: 0;bottom: 0;left: 0;margin: auto; } .universal_mini .menu_layer .menu-layer-top-panel .search.search_active::after {background-image: url("+c[39]+"); } .universal_mini .menu_layer .menu-layer-top-panel .close {width: 46px;height: 46px;right: 0; } .universal_mini .menu_layer .menu-layer-top-panel .close::after {content: '';position: absolute;width: 20px;height: 20px;background-image: url("+c[40]+");background-repeat: no-repeat;background-size: contain;top: 0;right: 0;bottom: 0;left: 0;margin: auto; } .universal_mini .menu_layer .menu-layer-top-panel .close.close_active::after {background-image: url("+ +c[40]+"); } .universal_mini .menu_layer .menu-layer-top-panel .search.component_container {left: 0; } .universal_mini .menu_layer .menu-layer-top-panel .back {width: 46px;height: 46px;left: 0; } .universal_mini .menu_layer .menu-layer-top-panel .back::after {content: '';position: absolute;width: 14px;height: 20px;background-image: url("+c[41]+");background-repeat: no-repeat;background-size: contain;top: 0;right: 0;bottom: 0;left: 0;margin: auto; } .universal_mini .menu_layer .menu-layer-top-panel .back.back_active::after {background-image: url("+ +c[41]+"); } .universal_mini .menu_layer .menu-layer-top-panel.with_search .back {right: 44px; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel {position: absolute;background: #FFFFFF;top: 0;right: 0;bottom: 0;left: 0;z-index: 1; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel .search_container {background: rgba(142, 142, 147, 0.12);border-radius: 8px;position: absolute;top: 0;bottom: 0;left: 16px;height: 34px;margin: auto; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel .search_container::before {content: '';position: absolute;width: 14px;height: 14px;background: url("+ +c[42]+");background-size: cover;left: 10px;top: 11px; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel .search_container.empty .clear {display: none; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel .search_container .clear {position: absolute;width: 38px;height: 100%;right: 0;background-image: url("+c[43]+");background-position: center;background-repeat: no-repeat; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel .search_container .search_input {position: absolute;top: 0;right: 30px;bottom: 0;border: 0;font-family: Helvetica Neue, Helvetica, Roboto, Arial;font-size: 15px;padding: 0;background: transparent;margin: 0;left: 33px;color: #2B3B46;width: calc(100% - 63px); } .universal_mini .menu_layer .menu-layer-top-panel .search_panel .search_container .search_input:-ms-input-placeholder {font-family: Helvetica Neue, Helvetica, Roboto, Arial;font-size: 15px; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel .search_container .search_input::placeholder {font-family: Helvetica Neue, Helvetica, Roboto, Arial;font-size: 15px; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel .search_container .search_input:-ms-input-placeholder {color: #8E8E93; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel .search_container .search_input::placeholder {color: #8E8E93; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel .cancel.component_container {position: absolute;top: 0;right: 0; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel .cancel.component_container button {background: transparent;border: 0;position: relative;line-height: 46px;padding: 0 18px;color: #3DA0E1;font-family: Helvetica Neue, Helvetica, Roboto, Arial;font-size: 15px; } .universal_mini .menu_layer.tab_control .content.component_container {bottom: 66px; } .universal_mini .menu_layer.tab_control .bottom-panel {position: absolute;bottom: 0;height: 66px;background: #FFFFFF;box-shadow: 0 -2px 12px 0 rgba(0, 0, 0, 0.1);display: block; } .universal_mini .menu_layer.tab_control .bottom-panel > div {cursor: pointer;height: 100%;position: relative;float: left; } .universal_mini .menu_layer.tab_control .bottom-panel > div button {position: absolute;width: 100%;height: 100%;background: transparent;border: 0;color: #84919D;font-family: Helvetica Neue, Helvetica, Roboto, Arial;font-size: 12px;font-weight: 500;line-height: 13px;padding-top: 35px;text-overflow: ellipsis;overflow: hidden;white-space: nowrap;opacity: 1; } .universal_mini .menu_layer.tab_control .bottom-panel > div button::after {content: '';position: absolute;width: 27px;height: 27px;top: 10px;left: 0;right: 0;margin: auto;background-size: contain;background-repeat: no-repeat;background-position: center; } .universal_mini .menu_layer.tab_control .bottom-panel > div button.selected {color: #2B3B46;opacity: 1; } .universal_mini .menu_layer.tab_control .bottom-panel > div.outline button::after {background-image: url("+ +c[44]+"); } .universal_mini .menu_layer.tab_control .bottom-panel > div.outline button.selected::after {background-image: url("+c[45]+"); } .universal_mini .menu_layer.tab_control .bottom-panel > div.resources button::after {background-image: url("+c[46]+"); } .universal_mini .menu_layer.tab_control .bottom-panel > div.resources button.selected::after {background-image: url("+c[47]+"); } .universal_mini .menu_layer.tab_control .bottom-panel > div.presenter button::after {background-image: url("+ +c[48]+"); } .universal_mini .menu_layer.tab_control .bottom-panel > div.presenter button.selected::after {background-image: url("+c[49]+"); } .universal_mini .menu_layer.tab_control .bottom-panel > div.notes button::after {background-image: url("+c[50]+"); } .universal_mini .menu_layer.tab_control .bottom-panel > div.notes button.selected::after {background-image: url("+c[51]+"); } .universal_mini .menu_layer .content.component_container {position: absolute;top: 46px;bottom: 0;width: 100%;background: initial; } .universal_mini .menu_layer .content.component_container.animation .content.component_base > div {position: absolute; } .universal_mini .menu_layer .content.component_container .content.component_base {width: 100%;position: relative; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .separator, .universal_mini .menu_layer .content.component_container .content.component_base .resources .separator {background: #E5E5E5;position: relative;width: calc(100% - 20px);height: 1px;left: 10px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .separator:first-child, .universal_mini .menu_layer .content.component_container .content.component_base .resources .separator:first-child {position: absolute;top: -1px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .separator:last-child, .universal_mini .menu_layer .content.component_container .content.component_base .resources .separator:last-child {position: absolute;bottom: -1px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list {position: relative; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item {position: relative;min-height: 54px;font-family: Helvetica Neue, Helvetica, Roboto, Arial;font-size: 15px;color: rgba(43, 59, 70, 0.8);margin-bottom: 1px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.level1 {padding-left: 24px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.level1::after {left: 34px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.level2 {padding-left: 48px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.level2::after {left: 58px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.level3 {padding-left: 72px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.level3::after {left: 82px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.level4 {padding-left: 96px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.level4::after {left: 106px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item::after {content: '';position: absolute;left: 10px;right: 10px;bottom: -1px;height: 1px;background: #E5E5E5; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item .image {float: left;margin: 5px 8px 6px 12px;border: solid 2px rgba(0, 0, 0, 0.12);box-sizing: content-box; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item .text {position: relative;margin: 0;padding-right: 10px;padding-bottom: 1px;line-height: 21px;word-break: break-word;max-height: 63px;overflow: hidden; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.text_only .text {padding-left: 13px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.visited {color: rgba(43, 59, 70, 0.8); } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.active, .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.selected {background: rgba(61, 160, 225, 0.1);color: rgba(43, 59, 70, 0.8); } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.parent::before {content: '';position: absolute;top: 0;bottom: 0;right: 19px;width: 8px;height: 12px;margin: auto;background: url("+ +c[52]+");background-size: contain;background-repeat: no-repeat; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.parent .text {padding-right: 25px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .separator::after {right: 10px;left: 10px; } .universal_mini .menu_layer .content.component_container .content.component_base .resources .item {width: 100%;height: 56px;position: relative;display: block; } .universal_mini .menu_layer .content.component_container .content.component_base .resources .item.active {background: rgba(61, 160, 225, 0.1);z-index: 1; } .universal_mini .menu_layer .content.component_container .content.component_base .resources .item .attachment-icon, .universal_mini .menu_layer .content.component_container .content.component_base .resources .item .url-icon {position: absolute;left: 28px;top: 0;bottom: 0;margin: auto; } .universal_mini .menu_layer .content.component_container .content.component_base .resources .item .attachment-icon, .universal_mini .menu_layer .content.component_container .content.component_base .resources .item .url-icon {width: 20px;height: 20px; } .universal_mini .menu_layer .content.component_container .content.component_base .resources .item .attachment-icon {background: url("+ +c[53]+"); } .universal_mini .menu_layer .content.component_container .content.component_base .resources .item .url-icon {background: url("+c[54]+"); } .universal_mini .menu_layer .content.component_container .content.component_base .resources .item .text {position: absolute;height: 56px;left: 61px;right: 20px;font-size: 15px;color: #3DA0E1;font-family: Helvetica Neue, Helvetica, Roboto, Arial;line-height: 56px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .universal_mini .menu_layer .content.component_container .content.component_base .resources .separator::after {right: 20px;left: 20px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .top-container {background-color: #FAFAFA;border-bottom: 1px solid #E5E5E5;padding-bottom: 30px;padding-top: 40px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .top-container .name, .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .top-container .job {word-wrap: break-word;padding-left: 24px;padding-right: 24px;position: relative;font-family: Helvetica Neue, Helvetica, Roboto, Arial;text-align: center; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .top-container .name {color: #2B3B46;font-size: 25px;font-weight: bold;padding-bottom: 12px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .top-container .job {color: #84919D;font-size: 15px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bottom-container {padding-top: 18px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bottom-container .bottom-container-text {position: absolute;height: 47px;left: 61px;right: 16px;font-size: 15px;color: #3DA0E1;font-family: Helvetica Neue, Helvetica, Roboto, Arial;line-height: 47px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .photo_container {position: relative;margin-left: auto;margin-right: auto;margin-bottom: 10px;border-radius: 100%; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .photo_container canvas, .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .photo_container svg {position: absolute;top: 0;right: 0;bottom: 0;left: 0;margin: auto; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .name_photo_container {width: 75px;height: 75px;background: #9EAEB9;border-radius: 100%;left: 0;right: 0;margin: auto;margin-bottom: 10px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .name_photo_container .letter {font-size: 24px;line-height: 75px;text-align: center;color: #FFFFFF;font-family: Helvetica Neue, Helvetica, Roboto, Arial; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .no_presenter_container {margin-bottom: 10px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .no_presenter_photo {width: 106px;height: 134px;background: url("+ +c[55]+"); } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .no_presenter_label {position: relative;font-family: Helvetica Neue, Helvetica, Roboto, Arial;font-size: 15px;color: #2B3B46;padding: 0 40px;text-align: center; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .item {width: 100%;height: 47px;position: relative; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .item.active {background: rgba(61, 160, 225, 0.1);margin-top: -1px;margin-bottom: -1px;height: 49px;z-index: 1; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .item.active .text {top: 1px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .item.active svg {top: 1px;bottom: 1px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .item .phone-icon, .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .item .email-icon, .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .item .url-icon {position: absolute;left: 30px;top: 0;bottom: 0;margin: auto; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .item .phone-icon, .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .item .email-icon, .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .item .url-icon {width: 20px;height: 20px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .item .phone-icon {background: url("+ +c[56]+"); } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .item .email-icon {background: url("+c[57]+"); } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .item .url-icon {background: url("+c[54]+"); } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bio-item {height: initial;width: 100%;position: relative; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bio-item .person-info {position: absolute;left: 30px;top: 20px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bio-item .person-info {width: 20px;height: 20px;background: url("+ +c[58]+"); } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bio-item .bio {position: relative;padding-right: 24px;padding-left: 61px;font-size: 15px;color: #2B3B46;font-family: Helvetica Neue, Helvetica, Roboto, Arial;overflow: hidden;text-overflow: ellipsis;white-space: pre-wrap;line-height: 26px;padding-top: 17px;padding-bottom: 24px; } .universal_mini .menu_layer .content.component_container .content.component_base .empty_results {color: #84919D;font-family: Helvetica Neue, Helvetica, Roboto, Arial;font-size: 15px;text-align: center;position: absolute;top: 30px;width: 100%; } .universal_mini .menu_layer .content.component_container .content.component_base .notes {padding: 18px 20px;font-family: Helvetica Neue, Helvetica, Roboto, Arial;font-size: 15px;color: initial;width: auto !important;white-space: pre-wrap;word-wrap: break-word; }body {margin: 0;padding: 0;cursor: default;-ms-touch-action: pan-y;touch-action: pan-y;overflow-y: auto; } body .info_panel {position: relative;top: 0;background: #FFFFFF;font-family: Helvetica, Roboto, Arial;padding-top: 161px;padding-bottom: 50px; } body .info_panel, body .info_panel * {box-sizing: border-box; } body .info_panel.domain::before {background: transparent url("+ +c[0]+") no-repeat center; } body .info_panel.time::before {background: transparent url("+c[1]+") no-repeat center; } body .info_panel.password::before {background: transparent url("+c[2]+") no-repeat center; } body .info_panel::before {position: absolute;width: 100%;top: 55px;height: 63px;content: ''; } body .info_panel .message {position: relative;color: #414A5B;font-size: 16px;padding-left: 15px;padding-right: 15px;text-align: center; } body .password .password_field {position: relative;margin-left: 20px;margin-right: 20px;padding-top: 23px;padding-bottom: 26px; } body .password .password_field input {position: relative;width: 100%;height: 34px;border: 1px solid #D6D6D6;border-top: 1px solid #BABABA;padding-left: 8px;font-size: 20px; } body .password .wrong_password_label {position: absolute;font-size: 12px;color: #DD4A37;left: 22px;right: 22px;margin-top: -21px; } body .ok.component_container {position: fixed;bottom: 0;height: 50px;background: #434E50; } body .ok.component_container.active {background: #637375; } body .ok.component_container button {top: 0;bottom: 0;left: 0;width: 100%;position: absolute;background: transparent;border: 0;line-height: 50px;color: #E2E2E2;font-size: 16px; } body .ok.component_container button[disabled] {color: #647577; }.launch-screen {z-index: 999 !important; }.component_base,.component_container {position: absolute; }:focus {outline: none; }::-moz-focus-inner {border: 0; }input {-webkit-appearance: none;appearance: none; }button {cursor: pointer;margin: 0;border: 0; }button[disabled] {cursor: default; }.__player_view_id__ > * {position: absolute; }.__player_view_id__ .slide {white-space: nowrap;font-size: 0; } .__player_view_id__ .slide a {text-decoration: none;cursor: pointer; } .__player_view_id__ .slide a img {border: 0; } .__player_view_id__ .slide * {-ms-transform-origin: 0 0;transform-origin: 0 0; } .__player_view_id__ .slide.relpos, .__player_view_id__ .slide .relpos {position: relative !important;vertical-align: top; } .__player_view_id__ .slide.kern, .__player_view_id__ .slide .kern {text-rendering: optimizeLegibility;font-feature-settings: 'kern' 1, 'liga' 0; } .__player_view_id__ .slide.nokern, .__player_view_id__ .slide .nokern {text-rendering: optimizeSpeed;font-feature-settings: 'kern' 0, 'liga' 0; }.__player_view_id__ .fullscreen {-ms-transform: none !important;transform: none !important;top: 0 !important;left: 0 !important; } .__player_view_id__ .fullscreen > video {background-color: black;width: __slide_width__ !important;height: __slide_height__ !important;z-index: 100; }.__player_view_id__ .video_player video {width: 100%;height: 100%; } .__player_view_id__ .video_player video::cue {color: #FFFFFF;background-color: rgba(8, 8, 8, 0.75);border-radius: 4px;font-family: Helvetica, Roboto, Arial;line-height: 1.1; }.__player_view_id__ .video_player.iphone::after {background: rgba(0, 0, 0, 0) url("+ +c[3]+") no-repeat center;position: absolute;width: 100%;height: 100%;top: 0;right: 0;content: ''; }.__player_view_id__ .video_player.iphone video {opacity: 0; }.__player_view_id__ .video_player.iphone.without_controls video {display: none; }.__player_view_id__ .video_player .controls {height: 36px;background: rgba(45, 50, 55, 0.85098);border: 1px solid #444648;cursor: default;border-radius: 4px; } .__player_view_id__ .video_player .controls .progress {background-color: #75787A;height: 14px;left: 62px;top: 0;bottom: 0;margin-top: auto;margin-bottom: auto;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark {width: 10px;height: 10px;margin-top: -5px;margin-left: -5px;top: 50%;background: url("+ +c[4]+") no-repeat;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark:hover, .__player_view_id__ .video_player .controls .progress .bookmark:active {background: url("+c[5]+") no-repeat; } .__player_view_id__ .video_player .controls .progress .loading {background-color: #B1B3B5;height: 100%; } .__player_view_id__ .video_player .controls .progress .playing {background-color: #FFFFFF;height: 100%; } .__player_view_id__ .video_player .controls .progress .tooltip {background: url("+ +c[6]+") no-repeat;width: 60px;height: 25px;top: -33px;margin-left: -30px;font-family: Helvetica, Roboto, Arial;font-size: 12px;padding-top: 2px;text-align: center; } .__player_view_id__ .video_player .controls .volume_popup {border-radius: 3px;background: rgba(45, 50, 55, 0.85098);top: -67px;right: 55px;padding: 8px; } .__player_view_id__ .video_player .controls .volume_popup .volume {background: url("+c[7]+");position: relative;cursor: pointer;width: 12px;height: 48px; } .__player_view_id__ .video_player .controls .volume_popup .volume .back {background: url("+ +c[8]+");width: 100%; } .__player_view_id__ .video_player .controls button {width: 100%;height: 100%; } .__player_view_id__ .video_player .controls button.mute {background: url("+c[9]+"); } .__player_view_id__ .video_player .controls button.mute:hover {background: url("+c[10]+"); } .__player_view_id__ .video_player .controls button.mute:active {background: url("+c[11]+"); } .__player_view_id__ .video_player .controls button.mute.selected {background: url("+c[12]+"); } .__player_view_id__ .video_player .controls button.mute.selected:hover {background: url("+ +c[13]+"); } .__player_view_id__ .video_player .controls button.mute.selected:active {background: url("+c[14]+"); } .__player_view_id__ .video_player .controls button.play {background: url("+c[15]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:hover {background: url("+c[16]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:active {background: url("+c[17]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected {background: url("+ +c[18]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:hover {background: url("+c[19]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:active {background: url("+c[20]+") no-repeat; } .__player_view_id__ .video_player .controls button.play::after {background: url("+c[21]+");width: 1px;height: 32px;right: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls button.toggle_fullscreen {background: url("+ +c[22]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:hover {background: url("+c[23]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:active {background: url("+c[24]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen::before {background: url("+c[21]+") no-repeat;width: 1px;height: 32px;left: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls .component_container.toggle_fullscreen, .__player_view_id__ .video_player .controls .component_container.play {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .component_container.toggle_fullscreen {right: -1px; } .__player_view_id__ .video_player .controls .component_container.mute {width: 22px;height: 22px;right: 58px;top: 6px; }.modal_layer {background: #000000;opacity: 0.7;z-index: 1;width: 100%;height: 100%; }.message_box,.confirm_window {border-radius: 4px;min-height: 150px;min-width: 300px;z-index: 1;background: #FFFFFF;position: absolute;width: 300px;top: 0;right: 0;bottom: 0;left: 0;margin: auto; } .message_box .title, .confirm_window .title {display: none !important; } .message_box .message, .confirm_window .message {padding: 34px 34px 24px 34px;font-size: 14px;line-height: 18px;color: #231F20;font-family: Helvetica, Roboto, Arial; }.message_box .btn_ok.component_container {padding-bottom: 24px;position: relative;text-align: center;height: 44px;width: 100%; } .message_box .btn_ok.component_container button {vertical-align: middle;line-height: 44px;height: 44px;padding-left: 20px;padding-right: 20px;min-width: 110px;margin-left: 5px;margin-right: 5px;position: static;-webkit-appearance: none;appearance: none;border: 0;border-radius: 4px;font-size: 16px;background: #339BE0;color: #FFFFFF; } .message_box .btn_ok.component_container button.active {background: #058ACC; }.confirm_window .buttons_panel {text-align: center;position: relative;padding-bottom: 24px;height: 44px;width: 100%; } .confirm_window .buttons_panel > div {width: 50%;float: right;position: relative; } .confirm_window .buttons_panel > div button {vertical-align: middle;line-height: 44px;height: 44px;padding-left: 20px;padding-right: 20px;min-width: 110px;margin-left: 5px;margin-right: 5px;position: static;-webkit-appearance: none;appearance: none;border: 0;border-radius: 4px;font-size: 16px;background: #339BE0;color: #FFFFFF; } .confirm_window .buttons_panel > div.active button {background: #058ACC; } .confirm_window .buttons_panel > div:only-child {width: 100%;text-align: center !important; } .confirm_window .buttons_panel > div:nth-child(1) {text-align: left; } .confirm_window .buttons_panel > div:nth-child(2) {text-align: right; }.back_to_app {height: 100%;position: absolute;left: 0; } .back_to_app__text {color: #3DA0E1;font-size: 16px;font-family: Helvetica Neue, Helvetica, Roboto, Arial;text-overflow: ellipsis;overflow: hidden;position: absolute;bottom: 0;top: 0;height: 24px;line-height: 24px;margin: auto;padding-left: 25px;max-width: 80px; } .back_to_app__text::before {content: '';background: url("+ +c[25]+") no-repeat center;height: 24px;width: 14px;left: 8px;position: absolute; }.trial_banner {position: relative;transform: translateZ(0); } .trial_banner .banner-content, .trial_banner .banner-content_hover {position: absolute;left: 0;right: 0;top: 0;bottom: 0;width: 100%;height: 100%; } .trial_banner .banner-content {visibility: visible;z-index: 1; } .trial_banner .banner-content_hover {visibility: hidden;z-index: 0; } .trial_banner .days_remaining {position: absolute;font-family: 'Open Sans', Arial, sans-serif;font-weight: normal;font-size: 13px;left: 65px;top: 41px;color: #7C1645;z-index: 1; } .trial_banner:hover .banner-content {visibility: hidden;z-index: 0; } .trial_banner:hover .banner-content_hover {visibility: visible;z-index: 1; }.popup_layer {z-index: 1; } .popup_layer .modal_layer {z-index: initial; }.framesLayer iframe {pointer-events: all; }.uikit-primary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: 4px;position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-primary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-primary-button.uikit-primary-button_size_medium {padding: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:first-child {margin-left: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:last-child {margin-right: 10px; } .uikit-primary-button.uikit-primary-button_size_small {padding: 6px 12px; } .uikit-primary-button.uikit-primary-button_size_small .uikit-primary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-primary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__button-text {margin-right: 8px; } .uikit-primary-button__left-icon {margin-right: 8px; } .uikit-primary-button__button-text:first-child {margin-left: 0; } .uikit-primary-button__button-text:last-child {margin-right: 0; } .uikit-primary-button__left-icon:first-child {margin-left: 0; } .uikit-primary-button__left-icon:last-child {margin-right: 0; } .uikit-primary-button__right-icon:first-child {margin-left: 0; } .uikit-primary-button__right-icon:last-child {margin-right: 0; } .uikit-primary-button[disabled] {opacity: 0.4; } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-secondary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: 4px;position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-secondary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-secondary-button.uikit-secondary-button_size_medium {padding: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:first-child {margin-left: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:last-child {margin-right: 10px; } .uikit-secondary-button.uikit-secondary-button_size_small {padding: 6px 12px; } .uikit-secondary-button.uikit-secondary-button_size_small .uikit-secondary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-secondary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__button-text {margin-right: 8px; } .uikit-secondary-button__left-icon {margin-right: 8px; } .uikit-secondary-button__button-text:first-child {margin-left: 0; } .uikit-secondary-button__button-text:last-child {margin-right: 0; } .uikit-secondary-button__left-icon:first-child {margin-left: 0; } .uikit-secondary-button__left-icon:last-child {margin-right: 0; } .uikit-secondary-button__right-icon:first-child {margin-left: 0; } .uikit-secondary-button__right-icon:last-child {margin-right: 0; } .uikit-secondary-button[disabled] {opacity: 0.4; } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-link-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: 4px;position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-link-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-link-button.uikit-link-button_size_medium {padding: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text {font-size: 17px;line-height: 20px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:first-child {margin-left: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:last-child {margin-right: 10px; } .uikit-link-button.uikit-link-button_size_small {padding: 6px 12px; } .uikit-link-button.uikit-link-button_size_small .uikit-link-button__button-text {font-size: 14px;line-height: 20px; } .uikit-link-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__button-text {margin-right: 8px; } .uikit-link-button__left-icon {margin-right: 8px; } .uikit-link-button__button-text:first-child {margin-left: 0; } .uikit-link-button__button-text:last-child {margin-right: 0; } .uikit-link-button__left-icon:first-child {margin-left: 0; } .uikit-link-button__left-icon:last-child {margin-right: 0; } .uikit-link-button__right-icon:first-child {margin-left: 0; } .uikit-link-button__right-icon:last-child {margin-right: 0; } .uikit-link-button[disabled] {opacity: 0.4; } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-primary-button {background: #339BE0;color: #FFFFFF; } .uikit-primary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: #339BE0;background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-primary-button__button-text {font-family: Helvetica Neue, Helvetica, Roboto, Arial;font-weight: 700; } .uikit-primary-button.uikit-primary-button_active, .uikit-primary-button[aria-pressed='true'], .uikit-primary-button:focus {background: #058ACC;color: #FFFFFF; } .uikit-primary-button.uikit-primary-button_active::after, .uikit-primary-button[aria-pressed='true']::after, .uikit-primary-button:focus::after {background: #058ACC;background-origin: border-box; }.message-box {background: #F7F7F7;position: absolute;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;border-radius: 7px;min-width: 280px;padding: 40px;box-shadow: 0 8px 16px rgba(0, 0, 0, 0.08); } .message-box::after {content: '';box-sizing: border-box;border: 1px solid rgba(43, 59, 70, 0.08);width: 100%;height: 100%;position: absolute;left: 0;top: 0;border-radius: 7px;pointer-events: none; } .message-box__content {position: relative;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-direction: column;flex-direction: column; } .message-box__icon {width: 24px;height: 24px;margin-bottom: 24px;position: relative;display: inline-block;color: #2B3B46;opacity: 0.72; } .message-box .message-box-buttons {position: relative;width: 100%;height: 36px; } .message-box .message-box-buttons__buttons {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center; } .message-box .message-box-buttons__window-button {margin: 0 4px; } .message-box .vertical-scrollbar {top: 40px; } .message-box__message-container {overflow: hidden;display: inline-block;max-width: 480px;vertical-align: top;position: relative; } .message-box__message {text-align: center;font-size: 15px;color: #2B3B46;text-overflow: ellipsis;overflow: hidden;position: relative;font-family: Helvetica Neue, Helvetica, Roboto, Arial; } .message-box__buttons {margin-top: 28px; }.rate-menu-item {position: relative;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;height: 40px;border-radius: 4px;background-repeat: no-repeat;padding-left: 37px; } .rate-menu-item.rate-menu-item_active {color: #58646D;background-color: #EBF5FC; } .rate-menu-item.rate-menu-item_caption {margin-bottom: 9px;background-image: url("+ +c[59]+");background-position: 14px; } .rate-menu-item.rate-menu-item_caption[disabled] {padding-left: 0;background-image: none; } .rate-menu-item.rate-menu-item_caption[disabled] .rate-menu-item__label {text-align: center; } .rate-menu-item.rate-menu-item_caption::after {position: absolute;content: '';width: 100%;left: 0;right: 0;bottom: -5px;margin: auto;border-bottom: 1px solid rgba(0, 0, 0, 0.12); } .rate-menu-item.rate-menu-item_caption.rate-menu-item_active {background-image: url("+ +c[60]+"); } .rate-menu-item__label {-ms-flex-positive: 1;flex-grow: 1; } .rate-menu-item_selected, .rate-menu-item_selected.rate-menu-item_active {background-color: #EBF5FC;background-image: url("+c[61]+");background-position: 14px 12px;color: #58646D; }.rate-menu {padding: 8px 10px;font-family: Open Sans, Arial, sans-serif, PFn;font-size: 13px;color: #58646D;width: 140px;position: absolute;box-sizing: border-box;background-color: #FFFFFF;border-radius: 5px;box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.3);left: 40px;bottom: 70px; } .rate-menu.rate-menu_rate-button-first {left: 4px;bottom: 70px; } .rate-menu.rate-menu_landscape {right: 60px;top: 4px;left: unset;bottom: unset; }"; +let d;for(const [f,g]of Object.entries(null!=(d=a)?d:{}))a=`__${f.replace(RegExp("\\.","g"),"_")}__`,c=c.replace(new RegExp(a,"g"),g);let e;for(const [f,g]of Object.entries(null!=(e=b)?e:{}))c=c.replace(new RegExp(f,"g"),g);c=c.replace(/__verticalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.Pk);c=c.replace(/__horizontalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.Ok);return gn(c)}Pk(a,b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}Ok(a, +b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}};var kG={mb_question_icon:'', +mb_warning_icon:'', +"attachment-doc":'', +"attachment-image":'', +"attachment-link":'',"attachment-unknown":'', +"attachment-video":'', +attachments:'', +attachment_icon:'\t', +back:'',back_to_app:'', +bio:'', +close:'', +mail:'', +next:'',notes:'', +outline:'', +outline_landscape:'', +pause:'',phone:'', +play:'',presenter_info:'', +prev:'',"rate-0.75x":'', +"rate-1.25x":'', +"rate-1.5x":'', +"rate-1x":'', +"rate-2x":'', +rate:'', +search:'', +site:'', +tick:'',url_icon:'\t'};class pG{Yo(a,b){var c="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICB3aWR0aD0iMjhweCIgaGVpZ2h0PSIzM3B4IiB2aWV3Qm94PSIwIDAgMjguMzAyIDMzLjI0MiI+DQoJPHBhdGggZD0iTTAsMS44VjMxLjQ0MmExLjgsMS44LDAsMCwwLDIuNzI2LDEuNTQzbDI0LjctMTQuODJhMS44LDEuOCwwLDAsMCwwLTMuMDg3TDIuNzI2LjI1N0ExLjgsMS44LDAsMCwwLDAsMS44WiIgc3R5bGU9ImZpbGw6IzMzMyIvPg0KPC9zdmc+ data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyOHB4IiBoZWlnaHQ9IjMzcHgiIHZpZXdCb3g9IjAgMCAyOC4zMDIgMzMuMjQyIj4NCgk8cGF0aCBkPSJNMCwxLjhWMzEuNDQyYTEuOCwxLjgsMCwwLDAsMi43MjYsMS41NDNsMjQuNy0xNC44MmExLjgsMS44LDAsMCwwLDAtMy4wODdMMi43MjYuMjU3QTEuOCwxLjgsMCwwLDAsMCwxLjhaIiBzdHlsZT0iZmlsbDojNTI4YmRmIi8+DQo8L3N2Zz4= data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAADcmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmFjOGVjNDFhLTZkYWItODQ0Ni04YzkzLWU1Mjk3N2YwMmE4NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFRThCNzU3NDYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFRThCNzU3MzYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cykiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0OWFlZmI1OC00ZWFmLWQ3NDgtYTI0ZS0zNmNhNGQ2M2QwNTYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6N0MwQkFBM0M2MjAxMTFFNUI4QjBERTk4MjY5MjQwQjUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6MGSVVAAAE3klEQVR42uycW4hWVRiG15Q4eYzGQySSQlriEQ9BF2mE4iSdESRRIb0RD+mNmHgICjqQEGUe6sqgCy1i0iRinAzELrooQhHLGQURUTzMiM7omCLj+/F/czX/t/890z6s9e/3hZcZ1l6z19r7mXXca62arq4uR/mjh/gKCIQiEAKhCIRAKAIhEIpACIQiEIpACIQiEAKhCIRAKAIhEMoX9Yu62NbWxjcUobq6OpaQQpcQz/QwPBOeDU+Fx8Oj4UfhoRrnJnwDvgC3wCfgY/Bf8P0QHrImahmQB1VWLfwGvAieqy+/LxJIR+Dv4QPwf75WWb4CGQavg9fo70mqFd4F79DfCSRCA+HN8Hp4cMppdcBfwB/Bt9mo99Sr8Cl4SwYwnKYhaf2jaXMconoE/hL+CR6TQ/pPato7NS+FbtSfgH+Gp8eMfwv+HT6qpakZvqzVT/d//ePw0/BEeI72ygbFvP/f8MvwpSK2IfLSGuGxFeJ1aby98CG4s5fpDNAqaTlcL89cIf45jddcpDZknI4PKsFo0NKzQLusnX1Iq1P/doHe60CF+GM1b+OK0obIYO5XeGREnLPwfHghfDzBtOVeb+q9z0bEG6njltHVDqQ2RuP9HTwDbkoxH02axv4YjX1tNQP5LKIBl7ZiK/yWToGkLUljsaZpNaTTNc9VCeR1eHUEjHfgD3OoQiXNVRFQVmveqwrIEHh3xPXNOp2Rl77WPFiSvA+tJiCb4FHGNanHP/FggCp52Gdck7y/Wy0Dw2Hatx9s9KZmZNRmxC3JMjh8qsy1Du0St4Y+DomaKFzlEQxRu+apnOQZ1oVeZfWPeMCGlLu2/6dL3BDRwPcPGYiMjocbvaoPnL963+h1DddnChbIMiP8cMIj8KQln34be/lM3gOREW69cW2v81/fGOH1aY7e0wTyrNGYyxT6wQCAHNS8lmvcZ4UIZL4RLt8z7gQA5I7mtZyeCxHIS0b4UReOrLw+EyIQqxScDAiIldcJIQLZYTTmvwUEpMUIHxMikB/gta40PXIF/lwHVrcCAnLVCH8srQR9X7mYt2RUbq1yrOFia390N9SReugaYoR3EEg+GmGEtxNIPhpvhJ8nkHw02Qj/l0Dy0Rwj/DSBZC9ZeD3buPYHgWSv11z5RdrSw/qTQLLX20Z4o0toSxyBxJdsKrVmq79NM2ECKa/3XPltC9fgXwgkW81zpVX35fSVS3HahEB6SqZK9hjXujeJOgLJTrLG19qos1OrLALJSLL+eLFx7SL8cRaZIJCSVrrSfnVL8qHtJoFkoy3ablibQeWz849ZZaZfgUHIfg/Z97EkIs5xLR2OQNLv2u5x0Ttt5UShV1wfj91glRVP01xp8UVTBRiyuOFFheJYQpKVzNrKwQErXPyDA2SF+5k8MhsykCnwPdfzaA3ZYy6nREyCX4Cfd/EPs+nV0RoEUlqWsx1eCie9Bkc2nW5wOa87Dg3Ipy75bWXntSd1yIcHDK1RT3KzTIcOBif6AqOo3d42HX/I0tZW3zIXWgnp68chmfaQjZxyoKac0bXNRxghlpCN2m1dpj/btXEfpD0uqYaua89Luq3dx8TKN3AeE1vt4mLrAohACIQiEAKhCIRAKAIhEIpACq7IqROKJYRA+AoIhCIQAqEIhEAoAiEQikCKrQcCDABHPgH2w7NQdAAAAABJRU5ErkJggg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA5LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDksMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbD0iI0RENEIzOCIgZD0iTTIxLjA0MSwyOXY5Ljg0NGMwLDUuNTA4LDQuNjkxLDkuOTczLDEwLjQ3OSw5Ljk3M2M1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTczVjI5SDIxLjA0MXoiLz4NCjxwYXRoIGZpbGw9IiNERDRCMzgiIGQ9Ik0yNi41NTgsMjl2LTcuNjg5YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MlYyOWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNFYyOUgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjEuMDQxLDI4LjIwNnY5Ljg0NWMwLDUuNTA2LDQuNjkxLDkuOTcxLDEwLjQ3OSw5Ljk3MWM1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTcxdi05Ljg0NUgyMS4wNDF6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjYuNTU4LDI4LjA0VjIwLjM1YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MnY3LjY4OWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNHY4LjA1NEgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRjA4RjgyIiBkPSJNMzQsMzYuMzY1YzAtMS4yODctMS4wNDQtMi4zMzEtMi4zMzEtMi4zMzFjLTEuMjg4LDAtMi4zMzIsMS4wNDQtMi4zMzIsMi4zMzENCgljMCwwLjk3MSwwLjU5NCwxLjgwMiwxLjQzOCwyLjE1MnY0LjQ2N2gxLjkxdi00LjUyOUMzMy40NjEsMzguMDc2LDM0LDM3LjI4NywzNCwzNi4zNjV6Ii8+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA4LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDgsMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik01OS42NDYsMzFoLTMuMjkzQzU2LjE1OCwzMSw1NiwzMS40NDgsNTYsMzINCgljMCwwLjU1MywwLjE1OCwxLDAuMzU0LDFoMy4yOTNDNTkuODQyLDMzLDYwLDMyLjU1Myw2MCwzMkM2MCwzMS40NDgsNTkuODQyLDMxLDU5LjY0NiwzMXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjREQ0QjM4IiBkPSJNNi42NDcsMzFIMy4zNTNDMy4xNTgsMzEsMywzMS40NDgsMywzMmMwLDAuNTUzLDAuMTU4LDEsMC4zNTMsMQ0KCWgzLjI5NEM2Ljg0MiwzMyw3LDMyLjU1Myw3LDMyQzcsMzEuNDQ4LDYuODQyLDMxLDYuNjQ3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik0zMSw4YzAuNTUzLDAsMS0wLjE1OCwxLTAuMzUzVjQuMzUzQzMyLDQuMTU4LDMxLjU1Myw0LDMxLDQNCgljLTAuNTUyLDAtMSwwLjE1OC0xLDAuMzUzdjMuMjk0QzMwLDcuODQyLDMwLjQ0OCw4LDMxLDh6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTMxLDU2Yy0wLjU1MiwwLTEsMC4xNTgtMSwwLjM1NHYzLjI5M0MzMCw1OS44NDIsMzAuNDQ4LDYwLDMxLDYwDQoJYzAuNTUzLDAsMS0wLjE1OCwxLTAuMzU0di0zLjI5M0MzMiw1Ni4xNTgsMzEuNTUzLDU2LDMxLDU2eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik00Ny42NjgsMzFoLTEyLjgxQzM0LjQ5NiwyOS42LDMzLjQsMjguNTA1LDMyLDI4LjE0Mg0KCWMwLDAtMC4xNzItMC4xNDItMS0wLjE0MmMtMC44MjksMC0yLDAuNTU1LTIsMC41NTVjLTEuMTksMC42OTMtMiwxLjk2OS0yLDMuNDQ1YzAsMi4yMDksMS43OTEsNCw0LDRjMS40NzcsMCwyLjc1Mi0wLjgwOSwzLjQ0NS0yDQoJaDEzLjIyM0M0OC40MDQsMzQsNDksMzMuMzI4LDQ5LDMyLjVDNDksMzEuNjcyLDQ4LjQwNCwzMSw0Ny42NjgsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTI3LjAxOCwyOS43NDhjMC41OTIsMS4wMjUsMS42NTIsMS41MiwyLjM3LDEuMTA2bDAsMA0KCWMwLjcxNy0wLjQxNSwwLjgxOS0xLjU4MSwwLjIyOC0yLjYwNmwtNy44NTctMTMuNjA5Yy0wLjU5Mi0xLjAyNC0xLjY1My0xLjUyLTIuMzcxLTEuMTA2bDAsMGMtMC43MTcsMC40MTUtMC44MTgsMS41ODEtMC4yMjgsMi42MDUNCglMMjcuMDE4LDI5Ljc0OHoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMjcuMDE4LDI4LjM2MWMwLjU5MiwxLjAyNSwxLjY1MiwxLjUyLDIuMzcsMS4xMDZsMCwwDQoJYzAuNzE3LTAuNDE1LDAuODE5LTEuNTgxLDAuMjI4LTIuNjA2bC03Ljg1Ny0xMy42MDljLTAuNTkyLTEuMDI0LTEuNjUzLTEuNTItMi4zNzEtMS4xMDZsMCwwYy0wLjcxNywwLjQxNS0wLjgxOCwxLjU4MS0wLjIyOCwyLjYwNQ0KCUwyNy4wMTgsMjguMzYxeiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgY3g9IjMxIiBjeT0iMzEiIHI9IjQiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNjAsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzU0LDFoLTMuMjkzQzU2LjE1OCwzMiw1NiwzMS41NTIsNTYsMzENCglsMCwwYzAtMC41NTIsMC4xNTgtMSwwLjM1NC0xaDMuMjkzQzU5Ljg0MiwzMCw2MCwzMC40NDgsNjAsMzFMNjAsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTcsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzUzLDFIMy4zNTNDMy4xNTgsMzIsMywzMS41NTIsMywzMWwwLDANCgljMC0wLjU1MiwwLjE1OC0xLDAuMzUzLTFoMy4yOTRDNi44NDIsMzAsNywzMC40NDgsNywzMUw3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0zMSwzYzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDYuODQyLDMxLjU1Myw3LDMxLDdsMCwwDQoJYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1M1YzLjM1M0MzMCwzLjE1OCwzMC40NDgsMywzMSwzTDMxLDN6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTMxLDU1YzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDU4Ljg0MiwzMS41NTMsNTksMzEsNTkNCglsMCwwYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1NHYtMy4yOTRDMzAsNTUuMTU4LDMwLjQ0OCw1NSwzMSw1NUwzMSw1NXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNDksMzEuNDk5QzQ5LDMwLjY3Miw0OC40MDQsMzAsNDcuNjY4LDMwSDM0LjMzMw0KCUMzMy41OTYsMzAsMzMsMzAuNjcxLDMzLDMxLjVsMCwwYzAsMC44MjgsMC41OTYsMS41LDEuMzMzLDEuNWgxMy4zMzVDNDguNDA0LDMzLDQ5LDMyLjMyOCw0OSwzMS40OTlMNDksMzEuNDk5eiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YxNjE1NSIgY3g9IjMxIiBjeT0iMzEiIHI9IjIiLz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjM2MzgxNDQiPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgzNjAiIGNsYXNzPSJmaWwwIiBkPSJNNi43NzM1IDMuOTc5bDAgLTMuNDQyNDVjMCwtMC4yOTUxMTkgLTAuMjQxNDMzLC0wLjUzNjU1MiAtMC41MzY1NTIsLTAuNTM2NTUybC02LjIzNjk1IDAgMCA0LjUxNTU1IDYuMjM2OTUgMGMwLjI5NTExOSwwIDAuNTM2NTUyLC0wLjI0MTQzMyAwLjUzNjU1MiwtMC41MzY1NTJ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMzYzODEyMCIgY2xhc3M9ImZpbDEiIGQ9Ik0zLjE4NzUgMS4yMzAyMWwtMC4zMzU1NTIgMC4zMzU1MTQgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAtMC4yMjM2NjQgMC4yMjM2NjQgMC40NDczNjUgMC40NDczNjUgLTAuMzM1NTE0IDAuMzM1NTUyIDAuODk0NzMgMCAwIC0wLjg5NDczem0wLjI2NTY0MSAyLjA1NTFsMC4zMzU1MTQgLTAuMzM1NTE0IDAuNDQ3MzY1IDAuNDQ3MzY1IDAuMjIzNzAxIC0wLjIyMzcwMSAtMC40NDczNjUgLTAuNDQ3MzY1IDAuMzM1NTE0IC0wLjMzNTUxNCAtMC44OTQ3MyAwIDAgMC44OTQ3M3oiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDojRkVGRUZFO2ZpbGwtb3BhY2l0eTowLjEwMTk2MX0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIzNjM4MTQ0Ij4NCiAgIDxwYXRoIGlkPSJfMTIzNjM4MzYwIiBjbGFzcz0iZmlsMCIgZD0iTTYuNzczNSAzLjk3OWwwIC0zLjQ0MjQ1YzAsLTAuMjk1MTE5IC0wLjI0MTQzMywtMC41MzY1NTIgLTAuNTM2NTUyLC0wLjUzNjU1MmwtNi4yMzY5NSAwIDAgNC41MTU1NSA2LjIzNjk1IDBjMC4yOTUxMTksMCAwLjUzNjU1MiwtMC4yNDE0MzMgMC41MzY1NTIsLTAuNTM2NTUyeiIvPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgxMjAiIGNsYXNzPSJmaWwxIiBkPSJNMy4xODc1IDEuMjMwMjFsLTAuMzM1NTUyIDAuMzM1NTE0IC0wLjQ0NzM2NSAtMC40NDczNjUgLTAuMjIzNjY0IDAuMjIzNjY0IDAuNDQ3MzY1IDAuNDQ3MzY1IC0wLjMzNTUxNCAwLjMzNTU1MiAwLjg5NDczIDAgMCAtMC44OTQ3M3ptMC4yNjU2NDEgMi4wNTUxbDAuMzM1NTE0IC0wLjMzNTUxNCAwLjQ0NzM2NSAwLjQ0NzM2NSAwLjIyMzcwMSAtMC4yMjM3MDEgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAwLjMzNTUxNCAtMC4zMzU1MTQgLTAuODk0NzMgMCAwIDAuODk0NzN6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDojRkVGRUZFO2ZpbGwtb3BhY2l0eTowLjA1MDk4MH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIzNjM4MTQ0Ij4NCiAgIDxwYXRoIGlkPSJfMTIzNjM4MzYwIiBjbGFzcz0iZmlsMCIgZD0iTTYuNzczNSAzLjk3OWwwIC0zLjQ0MjQ1YzAsLTAuMjk1MTE5IC0wLjI0MTQzMywtMC41MzY1NTIgLTAuNTM2NTUyLC0wLjUzNjU1MmwtNi4yMzY5NSAwIDAgNC41MTU1NSA2LjIzNjk1IDBjMC4yOTUxMTksMCAwLjUzNjU1MiwtMC4yNDE0MzMgMC41MzY1NTIsLTAuNTM2NTUyeiIvPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgxMjAiIGNsYXNzPSJmaWwxIiBkPSJNMy4xODc1IDEuMjMwMjFsLTAuMzM1NTUyIDAuMzM1NTE0IC0wLjQ0NzM2NSAtMC40NDczNjUgLTAuMjIzNjY0IDAuMjIzNjY0IDAuNDQ3MzY1IDAuNDQ3MzY1IC0wLjMzNTUxNCAwLjMzNTU1MiAwLjg5NDczIDAgMCAtMC44OTQ3M3ptMC4yNjU2NDEgMi4wNTUxbDAuMzM1NTE0IC0wLjMzNTUxNCAwLjQ0NzM2NSAwLjQ0NzM2NSAwLjIyMzcwMSAtMC4yMjM3MDEgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAwLjMzNTUxNCAtMC4zMzU1MTQgLTAuODk0NzMgMCAwIDAuODk0NzN6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACHDwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKNWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAASMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEoqGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAGeIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gzSZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25qbc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9CvjcM4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjKuLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqxOPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIWiAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFVSAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAyrA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYghUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7rh2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SEdJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3JaSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQtlHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJy5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hopb2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsyu21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCccNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527PYS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOwEaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6sfaznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy+rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVsS1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9UxlfeqXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/wjowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9Vt1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503rm10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7Pnl/eriQvLDwG/eE8/s6uL5TAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAAGnRFWHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS4xMDD0cqEAAABfSURBVChTY/j//z8DMZgoRSCD4ApLK6rYgLgDiJ9CMYjNBrMNWWHnvAUL/3/4+BGMQWygwk5sCp+CFMDAhw8fQAqfYlcIlCRGYeeceQv+g0wCYRAbl9XEeYZQWBIdjgCVaiC8JN1udgAAAABJRU5ErkJggg== data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAACuSURBVHicY/n//z8DCLh7+/sAqWIgNmGAgDNA3Ltz68YtIA4LVFELkKpmQAUOIAyUawUqrmEBMnyxKEIG1UA1J0EmFsFELC3MGfJzssDsSVOnMxw7fgImVQRSaAzjgRQJCgqA2XnZmcgKjVnwWIkCWKC+cwRxJk6eypCfm80AYyOBMyCF/TCFx0+eAmMsoJ8F6PXNoCBgwO1zUPBsBrsRFE5AxSCXFzKgBng/LMABrBM9cyiwScIAAAAASUVORK5CYII= data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAZCAYAAABtnU33AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAETSURBVHic7ZgxCsJAFAUXSaeIpScQDyCCguA5rEUQEbWzsvACKhICaquHUQu18hxi6vgebCSgwSb5C2sGhpBkIX+aZIkTBIHS1OAI1mFR2cEDHuEKnnnB0TeGcAlzZuZKjTKswA4cwzWDW8rO2ChsY+OFwVNld2wIG6cMbpqeRJAmg0umpxCk5PxeYxdZsO1kwbaTBdvOXwb7MG96ECF8Bt9gw/QkQlwZ7Kr/CXYZvIdt2DU7S+rs4CF8afXgCU5g1dhI6XCHC7jlSRjM/zwbbUGbJDPY/7HGg/OEn/vUvvn2WfpYlAADfYyL9vSaIOZ+Ykh9hxkSFy0WSyQ3Ht+iRWOJ9E4rGq2UcCwxsbWMRovGkhc6FTEV3QXLmAAAAABJRU5ErkJggg== data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAElJREFUSEvt0qERAEAIA0H6b5rXL1ecI5qQOcIsanB+3TC5egZOyJm9B2Zgw0EnF+AeekPC+S3tGTjhoJMLcA+9IeG89+6L04QHtFKarLFAHLUAAAAASUVORK5CYII= data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAFBJREFUSEvtkjEKADAIA/PpQunnWzo63nBbBDdjOGPWPpd0yPCf5YLo5TNgB52Z54AZsKDQygVwDr5A4RxLfQbsUGjlAjgHX6Bw9r394KjDAzeSX574b7LUAAAAAElFTkSuQmCC data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAyMCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik03LjE3MDI1IDMuMDkxODJDOC4wNzEzMiAyLjY5OTkyIDkuMDMyNDkgMi41IDEwIDIuNUMxMC45Njc1IDIuNSAxMS45Mjg3IDIuNjk5OTIgMTIuODI5NyAzLjA5MTgyQzEzLjczMTIgMy40ODM4NyAxNC41NTgzIDQuMDYyMDIgMTUuMjYwNyA0Ljc5OTUyQzE1Ljk2MzQgNS41MzcyOCAxNi41MjY4IDYuNDE5NjcgMTYuOTEzMiA3LjM5OTI0QzE3LjI5OTcgOC4zNzg5NyAxNy41IDkuNDMyOTUgMTcuNSAxMC41SDIwQzIwIDkuMTIxMTIgMTkuNzQxMyA3Ljc1NTc0IDE5LjIzODggNi40ODE4MkMxOC43MzYyIDUuMjA3OSAxNy45OTk2IDQuMDUwMzkgMTcuMDcxMSAzLjA3NTM4QzE2LjE0MjUgMi4xMDAzNiAxNS4wNDAxIDEuMzI2OTQgMTMuODI2OCAwLjc5OTI2NUMxMi42MTM2IDAuMjcxNTg5IDExLjMxMzIgMCAxMCAwQzguNjg2NzggMCA3LjM4NjQyIDAuMjcxNTg5IDYuMTczMTcgMC43OTkyNjVDNC45NTk5MiAxLjMyNjk0IDMuODU3NTIgMi4xMDAzNiAyLjkyODkzIDMuMDc1MzhDMi4wMDAzNSA0LjA1MDM5IDEuMjYzNzUgNS4yMDc5IDAuNzYxMjA0IDYuNDgxODJDMC4yNTg2NTggNy43NTU3NCAwIDkuMTIxMTIgMCAxMC41SDIuNUMyLjUgOS40MzI5NSAyLjcwMDMgOC4zNzg5NyAzLjA4Njc5IDcuMzk5MjRDMy40NzMyMiA2LjQxOTY3IDQuMDM2NjUgNS41MzcyOCA0LjczOTI4IDQuNzk5NTJDNS40NDE2NiA0LjA2MjAyIDYuMjY4ODUgMy40ODM4NyA3LjE3MDI1IDMuMDkxODJaTTEwLjU3MSA3LjU4MzM1QzEwLjY4NDMgNy40OTI4MyAxMC43OTY2IDcuNDA0NSAxMC45MDcxIDcuMzE4ODNDMTEuMzUxNyA2Ljk3NDAzIDExLjc2NTggNi42NzI0MyAxMi4wODY4IDYuNDQ0OTlDMTIuMTcxNyA2LjM4NDgxIDEyLjI1MDEgNi4zMjk4MSAxMi4zMjA5IDYuMjgwNThDMTIuNDkgNi4xNjI5MiAxMi43MTIgNi4yOTExIDEyLjY5NDYgNi40OTYzOEMxMi42ODc0IDYuNTgyMjYgMTIuNjc5IDYuNjc3NjggMTIuNjY5MyA2Ljc4MTM0QzEyLjYzMjkgNy4xNzMwNCAxMi41Nzg3IDcuNjgyNDcgMTIuNTAyNCA4LjIzOTg4QzEyLjQ4MzQgOC4zNzgzNyAxMi40NjMxIDguNTE5ODIgMTIuNDQxMyA4LjY2MzE2QzEyLjI0NjggOS45NDQxNSAxMS45Mzc1IDExLjM3NjIgMTEuNDY0MSAxMi4xOTYyQzExLjA3MzYgMTIuODcyNiAxMC4wMzExIDEzLjY3ODIgOC43MzIwNSAxMi45MjgyQzcuNDMzMDEgMTIuMTc4MiA3LjYwOTQ4IDEwLjg3MjYgOCAxMC4xOTYyQzguNDczMzcgOS4zNzYyNSA5LjU1ODk0IDguMzkyMzEgMTAuNTcxIDcuNTgzMzVaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NzA3MjgiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjMzNjc2NjQiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjkxNDI4IDAuNjkxNDI4LDAuNjkxNDI4IDAuNjkxNDI4LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTcwNzA0IiBjbGFzcz0iZmlsMSIgZD0iTTAuMzQ1NzM2IDAuMTU3MTg4bC0wLjEyNTcyMiAwLjA5NDI2NDkgLTAuMDk0MzAwNiAwIDAgMC4xODg1ODMgMC4wOTQzMDA2IDAgMC4xMjU3MjIgMC4wOTQyNjQ5IDAgLTAuMzc3MTEzem0wLjE1NzExNyAtMi42NzI2N2UtMDA1bDAuMDMxNDMwNiAwIDAgMC4zNzcxNCAtMC4wMzE0MzA2IDAgMCAtMC4zNzcxNHptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjI1MTQwOSAtMC4wMzE0MzA2IDAgMCAtMC4yNTE0MDl6bS0wLjA2Mjg0MzMgMC4wNjI4NjExbDAuMDMxNDMwNiAwIDAgMC4xMjU2ODcgLTAuMDMxNDMwNiAwIDAgLTAuMTI1Njg3eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NjkwMjQiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjE5NjkyNDAiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjQzNjE2IDAuNjQzNjE2LDAuNjQzNjE2IDAuNjQzNjE2LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY5MDAwIiBjbGFzcz0iZmlsMSIgZD0iTTAuMzIxODM3IDAuMTQ2MzAybC0wLjExNzAyOSAwLjA4Nzc0NjYgLTAuMDg3Nzc5NyAwIDAgMC4xNzU1NDMgMC4wODc3Nzk3IDAgMC4xMTcwMjkgMC4wODc3NDY2IDAgLTAuMzUxMDM2em0wLjI3NzkwMSAwLjI1MDcyNmwtMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjA5MzA4NzIgLTAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjAyMDY5MDYgLTAuMDIwNjkwNiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAwLjAyMDY5MDYgLTAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MnoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTggM0MxOS4xMDQ2IDMgMjAgMy44OTU0MyAyMCA1VjE1QzIwIDE2LjEwNDYgMTkuMTA0NiAxNyAxOCAxN0gyQzAuODk1NDMxIDE3IDAgMTYuMTA0NiAwIDE1VjVDMCAzLjg5NTQzIDAuODk1NDMxIDMgMiAzSDE4Wk02LjU4MDA4IDcuMDA0ODhDNS41OTgzIDcuMDA0ODggNC44MjYwMSA3LjMyMDE1IDQuMjYzMTggNy45NTA2OEMzLjcwMDM1IDguNTgxMjIgMy40MTg5NSA5LjQyNTQ1IDMuNDE4OTUgMTAuNDgzNFYxMC42MDRDMy40MTg5NSAxMS43MDQzIDMuNzAyNDcgMTIuNTY2NSA0LjI2OTUzIDEzLjE5MDdDNC44MzY1OSAxMy44MTQ5IDUuNjExIDE0LjEyNyA2LjU5Mjc3IDE0LjEyN0M3LjExNzUyIDE0LjEyNyA3LjU5Njc2IDE0LjAyMDEgOC4wMzA1MiAxMy44MDY0QzguNDY0MjggMTMuNTkyNyA4LjgwNTk5IDEzLjI5MjIgOS4wNTU2NiAxMi45MDVDOS4zMDUzNCAxMi41MTc4IDkuNDMyMjkgMTIuMDkxNSA5LjQzNjUyIDExLjYyNkg3LjcxNjMxQzcuNzA3ODQgMTEuOTM0OSA3LjU5NzgyIDEyLjE4MjUgNy4zODYyMyAxMi4zNjg3QzcuMTc0NjQgMTIuNTU0OSA2Ljg5OTU4IDEyLjY0NzkgNi41NjEwNCAxMi42NDc5QzYuMTIwOTMgMTIuNjQ3OSA1Ljc5Mjk3IDEyLjQ5MzUgNS41NzcxNSAxMi4xODQ2QzUuMzYxMzMgMTEuODc1NiA1LjI1MzQyIDExLjM2NzggNS4yNTM0MiAxMC42NjExVjEwLjQ3MDdDNS4yNTM0MiA5Ljc3MjQ2IDUuMzYyMzkgOS4yNjc4MiA1LjU4MDMyIDguOTU2NzlDNS43OTgyNiA4LjY0NTc1IDYuMTIwOTMgOC40OTAyMyA2LjU0ODM0IDguNDkwMjNDNi44OTUzNSA4LjQ5MDIzIDcuMTc0NjQgOC42MDEzMiA3LjM4NjIzIDguODIzNDlDNy41OTc4MiA5LjA0NTY2IDcuNzA3ODQgOS4zMzQ0NyA3LjcxNjMxIDkuNjg5OTRIOS40MzY1MkM5LjQyODA2IDguODc3NDQgOS4xNjQ2NCA4LjIyNjgxIDguNjQ2MjQgNy43MzgwNEM4LjEyNzg1IDcuMjQ5MjcgNy40MzkxMyA3LjAwNDg4IDYuNTgwMDggNy4wMDQ4OFpNMTMuMzU5NCA3LjAwNDg4QzEyLjM3NzYgNy4wMDQ4OCAxMS42MDUzIDcuMzIwMTUgMTEuMDQyNSA3Ljk1MDY4QzEwLjQ3OTcgOC41ODEyMiAxMC4xOTgyIDkuNDI1NDUgMTAuMTk4MiAxMC40ODM0VjEwLjYwNEMxMC4xOTgyIDExLjcwNDMgMTAuNDgxOCAxMi41NjY1IDExLjA0ODggMTMuMTkwN0MxMS42MTU5IDEzLjgxNDkgMTIuMzkwMyAxNC4xMjcgMTMuMzcyMSAxNC4xMjdDMTMuODk2OCAxNC4xMjcgMTQuMzc2MSAxNC4wMjAxIDE0LjgwOTggMTMuODA2NEMxNS4yNDM2IDEzLjU5MjcgMTUuNTg1MyAxMy4yOTIyIDE1LjgzNSAxMi45MDVDMTYuMDg0NiAxMi41MTc4IDE2LjIxMTYgMTIuMDkxNSAxNi4yMTU4IDExLjYyNkgxNC40OTU2QzE0LjQ4NzEgMTEuOTM0OSAxNC4zNzcxIDEyLjE4MjUgMTQuMTY1NSAxMi4zNjg3QzEzLjk1MzkgMTIuNTU0OSAxMy42Nzg5IDEyLjY0NzkgMTMuMzQwMyAxMi42NDc5QzEyLjkwMDIgMTIuNjQ3OSAxMi41NzIzIDEyLjQ5MzUgMTIuMzU2NCAxMi4xODQ2QzEyLjE0MDYgMTEuODc1NiAxMi4wMzI3IDExLjM2NzggMTIuMDMyNyAxMC42NjExVjEwLjQ3MDdDMTIuMDMyNyA5Ljc3MjQ2IDEyLjE0MTcgOS4yNjc4MiAxMi4zNTk2IDguOTU2NzlDMTIuNTc3NiA4LjY0NTc1IDEyLjkwMDIgOC40OTAyMyAxMy4zMjc2IDguNDkwMjNDMTMuNjc0NiA4LjQ5MDIzIDEzLjk1MzkgOC42MDEzMiAxNC4xNjU1IDguODIzNDlDMTQuMzc3MSA5LjA0NTY2IDE0LjQ4NzEgOS4zMzQ0NyAxNC40OTU2IDkuNjg5OTRIMTYuMjE1OEMxNi4yMDc0IDguODc3NDQgMTUuOTQzOSA4LjIyNjgxIDE1LjQyNTUgNy43MzgwNEMxNC45MDcxIDcuMjQ5MjcgMTQuMjE4NCA3LjAwNDg4IDEzLjM1OTQgNy4wMDQ4OFoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxwYXRoIGNsYXNzPSJmaWwwIiBkPSJNLTAgMC4yNzExMDFsMCAxLjczOTM1YzAsMC4xNDkxMTMgMC4xMjE5ODgsMC4yNzExMDEgMC4yNzExMDEsMC4yNzExMDFsMy4xNTEzMSAwIDAgLTIuMjgxNTUgLTMuMTUxMzEgMGMtMC4xNDkxMTMsMCAtMC4yNzExMDEsMC4xMjE5ODggLTAuMjcxMTAxLDAuMjcxMTAxeiIvPg0KICA8cG9seWdvbiBjbGFzcz0iZmlsMSIgcG9pbnRzPSIxLjQwOTIsMC42NzEwMzggMi4wODAyOCwxLjE0MDc3IDEuNDA5MiwxLjYxMDUxICIvPg0KIDwvZz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIxOTY2NTUyIj4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NzY4IiBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMzIzOTU2bDAgMi4wNzg0NmMwLDAuMTc4MTg1IDAuMTQ1NzcxLDAuMzIzOTU2IDAuMzIzOTU2LDAuMzIzOTU2bDMuNzY1NzEgMCAwIC0yLjcyNjM4IC0zLjc2NTcxIDBjLTAuMTc4MTg1LDAgLTAuMzIzOTU2LDAuMTQ1NzcxIC0wLjMyMzk1NiwwLjMyMzk1NnoiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NTI4IiBjbGFzcz0iZmlsMSIgZD0iTTEuNjAzOCAwLjg4MjAzOGwwLjMyMDc1MSAwIDAgMC45NjIyNTQgLTAuMzIwNzUxIDAgMCAtMC45NjIyNTR6bTAuNTYxMzMyIDBsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAhCAYAAAAYucG/AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAA+SURBVHicY/H09pViYQACFi4uLgYWbm5uOAHncsG4/Pz8xKv79u0bA8vXr1/hBJz7Dcb9+PEjIXVzZs18BgAgpy6CcHz1VgAAAABJRU5ErkJggg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsLW9wYWNpdHk9IjAiIGQ9Ik01MSw0LjA0MXYyNS45MThDNTEsMzIuMTgyLDQ5LjE4MiwzNCw0Ni45NiwzNEgwVjBoNDYuOTZDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDENCgkJCUw1MSw0LjA0MXoiLz4NCgkJPHBhdGggaWQ9Il8xMjMzNzQxNDQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xOCwxNS43MzdsMi41MjYtMi41MjZsMy4zNjksMy4zNjlsMS42ODQtMS42ODVsLTMuMzY4LTMuMzY4TDI0LjczNiw5aC01LjA1M0gxOHYxLjY4NA0KCQkJVjE1LjczN3ogTTM0LDE4LjI2NGwtMi41MjcsMi41MjVsLTMuMzY4LTMuMzY4bC0xLjY4NSwxLjY4NWwzLjM2OSwzLjM2N0wyNy4yNjMsMjVoNS4wNTNIMzR2LTEuNjg1VjE4LjI2NHoiLz4NCgk8L2c+DQo8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMTAyIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjRkVGRUZFIiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMDUxIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjOTY5Njk2IiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTRweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgMTQgMTUiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDU4ICg4NDY2MykgLSBodHRwczovL3NrZXRjaC5jb20gLS0+CiAgICA8dGl0bGU+dGljay1jb21ib2JveDwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJQRC0zNzQ0LeKAlC0yIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNzkwLjAwMDAwMCwgLTQzMS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgaWQ9InRpY2stY29tYm9ib3giIHRyYW5zZm9ybT0idHJhbnNsYXRlKDc4OS4wMDAwMDAsIDQzMC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMy4zNDQ3NjY4LDEuNjU5MzMyNTIgTDUuOCwxMi41ODY3MjE4IEw1LjgsMTIuNTg2NzIxOCBMMi42MDU2MzE3Nyw4LjkzNDE5NjUyIEMyLjM1MzE1MjQxLDguNjQ1NTA0OTMgMS45MTQ0NDY2Nyw4LjYxNjE0OTExIDEuNjI1NzU1MDcsOC44Njg2Mjg0OCBDMS41NzczMDU0Miw4LjkxMTAwMDgyIDEuNTM0OTgxOTMsOC45NTk5MDMyNiAxLjUsOS4wMTM5MzE0OCBDMS4yMDYzNDk0OSw5LjQ2NzQ2MzE2IDEuMjYwMDExMDgsMTAuMDYyODI2MyAxLjYzMDAyNTk4LDEwLjQ1NjU0MDEgTDUuNDc5NzMxMTgsMTQuNTUyODEzNSBDNS42Njg4NDMyLDE0Ljc1NDAzNzkgNS45ODUyNzMzOSwxNC43NjM4NTY5IDYuMTg2NDk3NzcsMTQuNTc0NzQ0OSBDNi4yMTEyMjc0NywxNC41NTE1MDM4IDYuMjMzNTI2NzQsMTQuNTI1ODA1MyA2LjI1MzA1MDY3LDE0LjQ5ODA0NyBMMTQuNTM5MDU1MywyLjcxNzM0NDAzIEMxNC44MDE1Mjc3LDIuMzQ0MTcxNDggMTQuNzQxNjUzNywxLjgzMzM1NzAzIDE0LjQsMS41MzA5OTU4NyBDMTQuMTA2MjM3OCwxLjI3MTAxODMyIDEzLjY1NzM0MywxLjI5ODQwNjIyIDEzLjM5NzM2NTUsMS41OTIxNjg0NCBDMTMuMzc4NTAyNywxLjYxMzQ4MjQgMTMuMzYwOTM4MiwxLjYzNTkxMDg3IDEzLjM0NDc2NjgsMS42NTkzMzI1MiBaIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cG9seWxpbmUgaWQ9IlBhdGgtMiIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjIiIHBvaW50cz0iMiA5LjY1NjUyODE3IDUuODYxNjc5NzcgMTQgMTQgMiI+PC9wb2x5bGluZT4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+ data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjIsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9ItCh0LvQvtC5XzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMzVweCIgaGVpZ2h0PSIzNXB4IiB2aWV3Qm94PSIwIDAgMzUgMzUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDM1IDM1IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMTcuNSwzNUMyNy4xMzksMzUsMzUsMjcuMTM4LDM1LDE3LjVDMzUsNy44NjEsMjcuMTM5LDAsMTcuNSwwDQoJQzcuODYxLDAsMCw3Ljg2MSwwLDE3LjVDMCwyNy4xMzgsNy44NjEsMzUsMTcuNSwzNXoiLz4NCjxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTcuNTAwNSIgeTE9IjIuNjQ5OSIgeDI9IjE3LjUwMDUiIHkyPSIzMi4zNDkiPg0KCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiM1Q0IwRkYiLz4NCgk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMTI5MEZGIi8+DQo8L2xpbmVhckdyYWRpZW50Pg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9InVybCgjU1ZHSURfMV8pIiBkPSJNMTcuNSwzMy45OTljOS4wODgsMCwxNi41LTcuNDEyLDE2LjUtMTYuNDk5DQoJUzI2LjU4NywxLDE3LjUsMUM4LjQxMywxLDEuMDAxLDguNDEzLDEuMDAxLDE3LjVTOC40MTMsMzMuOTk5LDE3LjUsMzMuOTk5eiIvPg0KPHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTE4LjM2OCwyMi41aC0zYy0wLjAwOC0wLjQ2MywwLTAuODk3LDAtMWMwLTEuMDM3LDAuMDU1LTEuODgxLDAuMzk2LTIuNTUNCgljMC4zNDQtMC42NzMsMS4wMzMtMS40MjMsMi4wNjMtMi4yNjRjMS4wMjgtMC44MzUsMS42NDYtMS4zODQsMS44NDMtMS42NDZjMC4zMTMtMC40MDcsMC40NjgtMC44NjIsMC40NjgtMS4zNTQNCgljMC0wLjY4Ni0wLjI3NS0xLjI3My0wLjgyNC0xLjc2NmMtMC41NDktMC40ODktMS4yODUtMC43MzMtMi4yMTUtMC43MzNjLTAuODk2LDAtMS42NDYsMC4yNTctMi4yNTEsMC43NjcNCgljLTAuNjAxLDAuNTEtMS4wMTYsMS4yOTEtMS4yNDMsMi4zMzZsLTMuMjM2LTAuNDAzYzAuMDktMS41LDAuNzI5LTIuNzczLDEuOTEyLTMuODE5QzEzLjQ2Nyw5LjAyMiwxNS4wMTgsOC41LDE2Ljk0OCw4LjUNCgljMi4wMjMsMCwzLjYzNSwwLjUzMSw0LjgzNSwxLjU5YzEuMTk2LDEuMDU5LDEuNzk2LDIuMjg5LDEuNzk2LDMuNjk5YzAsMC43NzYtMC4yMjMsMS41MTQtMC42NiwyLjIwOA0KCWMtMC40NDEsMC42OTQtMS40NjEsMS41NS0yLjgyLDIuODM3QzE4Ljg2OCwyMCwxOC4zNjgsMjAuNSwxOC4zNjgsMjIuNUwxOC4zNjgsMjIuNXogTTE1LjM2OCwyNy40OTl2LTNoM3YzSDE1LjM2OHoiLz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjIsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9ItCh0LvQvtC5XzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMzVweCIgaGVpZ2h0PSIzNXB4IiB2aWV3Qm94PSIwIDAgMzUgMzUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDM1IDM1IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMTcuNSwzNUMyNy4xMzgsMzUsMzUsMjcuMTQsMzUsMTcuNUMzNSw3Ljg2MiwyNy4xMzgsMCwxNy41LDANCglDNy44NjEsMCwwLDcuODYyLDAsMTcuNUMwLDI3LjE0LDcuODYxLDM1LDE3LjUsMzV6Ii8+DQo8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE3LjQ5OTUiIHkxPSIyLjY1MDQiIHgyPSIxNy40OTk1IiB5Mj0iMzIuMzUwNCI+DQoJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGODI1QyIvPg0KCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRjREMTIiLz4NCjwvbGluZWFyR3JhZGllbnQ+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0idXJsKCNTVkdJRF8xXykiIGQ9Ik0xNy41LDM0YzkuMDg3LDAsMTYuNS03LjQxMiwxNi41LTE2LjUNCgljMC05LjA4OC03LjQxMi0xNi41LTE2LjUtMTYuNVMxLDguNDEzLDEsMTcuNUMxLDI2LjU4OCw4LjQxMiwzNCwxNy41LDM0eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xNS41LDkuMDAxYzAtMiwzLjk5OS0yLDMuOTk5LDBMMTguOTk5LDIxDQoJYy0wLjA2MSwxLjQ5OC0yLjkzNywxLjUtMywwTDE1LjUsOS4wMDF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTE3LjUsMjhjMS4xMDIsMCwyLTAuODk3LDItMmMwLTEuMTAyLTAuODk3LTItMi0yDQoJYy0xLjEwMiwwLTEuOTk5LDAuODk4LTEuOTk5LDJDMTUuNSwyNy4xMDMsMTYuMzk4LDI4LDE3LjUsMjh6Ii8+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTNweCIgaGVpZ2h0PSIyMXB4IiB2aWV3Qm94PSIwIDAgMTMgMjEiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5CYWNrLUFycm93PC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9ImlQaG9uZS1YLUNvdXJzZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyLjAwMDAwMCwgLTU2LjAwMDAwMCkiIGZpbGw9IiMzREEwRTEiPgogICAgICAgICAgICA8cGF0aCBkPSJNMjEuOTA2MzgyOCw1Ni45ODk5NDk1IEwxMiw2Ni41IEwyMS45MDYzODI4LDc2LjAxMDA1MDUgQzIyLjQ4MjU4NSw3Ni41NjMyMDAyIDIzLjM5MjU5Miw3Ni41NjMyMDAyIDIzLjk2ODc5NDMsNzYuMDEwMDUwNSBMMjMuOTY4Nzk0Myw3Ni4wMTAwNTA1IEMyNC41MTU1MjgzLDc1LjQ4NTE5MDEgMjQuNTMzMjYwMyw3NC42MTY0OTEyIDI0LjAwODM5OTksNzQuMDY5NzU3MiBDMjMuOTk1NDY4OSw3NC4wNTYyODcyIDIzLjk4MjI2NDIsNzQuMDQzMDgyNiAyMy45Njg3OTQzLDc0LjAzMDE1MTUgTDE2LjEyNDgyMjksNjYuNSBMMjMuOTY4Nzk0Myw1OC45Njk4NDg1IEMyNC41MTU1MjgzLDU4LjQ0NDk4ODEgMjQuNTMzMjYwMyw1Ny41NzYyODkyIDI0LjAwODM5OTksNTcuMDI5NTU1MiBDMjMuOTk1NDY4OSw1Ny4wMTYwODUyIDIzLjk4MjI2NDIsNTcuMDAyODgwNiAyMy45Njg3OTQzLDU2Ljk4OTk0OTUgTDIzLjk2ODc5NDMsNTYuOTg5OTQ5NSBDMjMuMzkyNTkyLDU2LjQzNjc5OTggMjIuNDgyNTg1LDU2LjQzNjc5OTggMjEuOTA2MzgyOCw1Ni45ODk5NDk1IFoiIGlkPSJCYWNrLUFycm93Ij48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4= data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPgo8cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHJ4PSI2IiBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIwLjciLz4KPGcgb3BhY2l0eT0iMC44Ij4KPHBhdGggZD0iTTUzLjUgMjVINTJDNTEuNjAyMiAyNSA1MS4yMjA2IDI1LjE1OCA1MC45MzkzIDI1LjQzOTNDNTAuNjU4IDI1LjcyMDYgNTAuNSAyNi4xMDIyIDUwLjUgMjYuNUM1MC41IDI2Ljg5NzggNTAuNjU4IDI3LjI3OTQgNTAuOTM5MyAyNy41NjA3QzUxLjIyMDYgMjcuODQyIDUxLjYwMjIgMjggNTIgMjhINTMuNUM1My44OTc4IDI4IDU0LjI3OTQgMjguMTU4IDU0LjU2MDcgMjguNDM5M0M1NC44NDIgMjguNzIwNiA1NSAyOS4xMDIyIDU1IDI5LjVWNDEuNTM3NUM1My43MDkzIDQwLjU0NTMgNTIuMTI4IDQwLjAwNSA1MC41IDQwQzQ5LjI3MTcgNDAuMDAwNiA0OC4wNjI0IDQwLjMwMjkgNDYuOTc4MyA0MC44ODAzQzQ1Ljg5NDIgNDEuNDU3NiA0NC45Njg1IDQyLjI5MjQgNDQuMjgyNSA0My4zMTEzQzQzLjcyNjEgNDIuNzM4NCA0My4wNjAzIDQyLjI4MjkgNDIuMzI0OCA0MS45NzE5QzQxLjU4OTIgNDEuNjYwOSA0MC43OTg2IDQxLjUwMDcgNDAgNDEuNTAwN0MzOS4yMDE0IDQxLjUwMDcgMzguNDEwOCA0MS42NjA5IDM3LjY3NTIgNDEuOTcxOUMzNi45Mzk3IDQyLjI4MjkgMzYuMjczOSA0Mi43Mzg0IDM1LjcxNzUgNDMuMzExM0MzNS4wMzE1IDQyLjI5MjQgMzQuMTA1OCA0MS40NTc2IDMzLjAyMTcgNDAuODgwM0MzMS45Mzc2IDQwLjMwMjkgMzAuNzI4MyA0MC4wMDA2IDI5LjUgNDBDMjcuODcyIDQwLjAwNSAyNi4yOTA3IDQwLjU0NTMgMjUgNDEuNTM3NVYyOS41QzI1IDI5LjEwMjIgMjUuMTU4IDI4LjcyMDYgMjUuNDM5MyAyOC40MzkzQzI1LjcyMDYgMjguMTU4IDI2LjEwMjIgMjggMjYuNSAyOEgyOEMyOC4zOTc4IDI4IDI4Ljc3OTQgMjcuODQyIDI5LjA2MDcgMjcuNTYwN0MyOS4zNDIgMjcuMjc5NCAyOS41IDI2Ljg5NzggMjkuNSAyNi41QzI5LjUgMjYuMTAyMiAyOS4zNDIgMjUuNzIwNiAyOS4wNjA3IDI1LjQzOTNDMjguNzc5NCAyNS4xNTggMjguMzk3OCAyNSAyOCAyNUgyNi41QzI1LjMwNjUgMjUgMjQuMTYxOSAyNS40NzQxIDIzLjMxOCAyNi4zMThDMjIuNDc0MSAyNy4xNjE5IDIyIDI4LjMwNjUgMjIgMjkuNVY0Ny41QzIyIDQ5LjQ4OTEgMjIuNzkwMiA1MS4zOTY4IDI0LjE5NjcgNTIuODAzM0MyNS42MDMyIDU0LjIwOTggMjcuNTEwOSA1NSAyOS41IDU1QzMxLjQ4OTEgNTUgMzMuMzk2OCA1NC4yMDk4IDM0LjgwMzMgNTIuODAzM0MzNi4yMDk4IDUxLjM5NjggMzcgNDkuNDg5MSAzNyA0Ny41QzM3IDQ2LjcwNDQgMzcuMzE2MSA0NS45NDEzIDM3Ljg3ODcgNDUuMzc4N0MzOC40NDEzIDQ0LjgxNjEgMzkuMjA0NCA0NC41IDQwIDQ0LjVDNDAuNzk1NiA0NC41IDQxLjU1ODcgNDQuODE2MSA0Mi4xMjEzIDQ1LjM3ODdDNDIuNjgzOSA0NS45NDEzIDQzIDQ2LjcwNDQgNDMgNDcuNUM0MyA0OS40ODkxIDQzLjc5MDIgNTEuMzk2OCA0NS4xOTY3IDUyLjgwMzNDNDYuNjAzMiA1NC4yMDk4IDQ4LjUxMDkgNTUgNTAuNSA1NUM1Mi40ODkxIDU1IDU0LjM5NjggNTQuMjA5OCA1NS44MDMzIDUyLjgwMzNDNTcuMjA5OCA1MS4zOTY4IDU4IDQ5LjQ4OTEgNTggNDcuNVYyOS41QzU4IDI4LjMwNjUgNTcuNTI1OSAyNy4xNjE5IDU2LjY4MiAyNi4zMThDNTUuODM4MSAyNS40NzQxIDU0LjY5MzUgMjUgNTMuNSAyNVpNMjkuNSA1MkMyOC42MSA1MiAyNy43NCA1MS43MzYxIDI2Ljk5OTkgNTEuMjQxNkMyNi4yNTk5IDUwLjc0NzEgMjUuNjgzMSA1MC4wNDQzIDI1LjM0MjUgNDkuMjIyMUMyNS4wMDE5IDQ4LjM5OTggMjQuOTEyOCA0Ny40OTUgMjUuMDg2NSA0Ni42MjIxQzI1LjI2MDEgNDUuNzQ5MiAyNS42ODg3IDQ0Ljk0NzQgMjYuMzE4IDQ0LjMxOEMyNi45NDc0IDQzLjY4ODcgMjcuNzQ5MiA0My4yNjAxIDI4LjYyMjEgNDMuMDg2NUMyOS40OTUgNDIuOTEyOCAzMC4zOTk4IDQzLjAwMTkgMzEuMjIyMSA0My4zNDI1QzMyLjA0NDMgNDMuNjgzMSAzMi43NDcxIDQ0LjI1OTkgMzMuMjQxNiA0NC45OTk5QzMzLjczNjEgNDUuNzQgMzQgNDYuNjEgMzQgNDcuNUMzNCA0OC42OTM1IDMzLjUyNTkgNDkuODM4MSAzMi42ODIgNTAuNjgyQzMxLjgzODEgNTEuNTI1OSAzMC42OTM1IDUyIDI5LjUgNTJaTTUwLjUgNTJDNDkuNjEgNTIgNDguNzQgNTEuNzM2MSA0Ny45OTk5IDUxLjI0MTZDNDcuMjU5OSA1MC43NDcxIDQ2LjY4MzEgNTAuMDQ0MyA0Ni4zNDI1IDQ5LjIyMjFDNDYuMDAxOSA0OC4zOTk4IDQ1LjkxMjggNDcuNDk1IDQ2LjA4NjUgNDYuNjIyMUM0Ni4yNjAxIDQ1Ljc0OTIgNDYuNjg4NyA0NC45NDc0IDQ3LjMxOCA0NC4zMThDNDcuOTQ3NCA0My42ODg3IDQ4Ljc0OTIgNDMuMjYwMSA0OS42MjIxIDQzLjA4NjVDNTAuNDk1IDQyLjkxMjggNTEuMzk5OCA0My4wMDE5IDUyLjIyMjEgNDMuMzQyNUM1My4wNDQzIDQzLjY4MzEgNTMuNzQ3MSA0NC4yNTk5IDU0LjI0MTYgNDQuOTk5OUM1NC43MzYxIDQ1Ljc0IDU1IDQ2LjYxIDU1IDQ3LjVDNTUgNDguNjkzNSA1NC41MjU5IDQ5LjgzODEgNTMuNjgyIDUwLjY4MkM1Mi44MzgxIDUxLjUyNTkgNTEuNjkzNSA1MiA1MC41IDUyWiIgZmlsbD0id2hpdGUiLz4KPC9nPgo8L2c+CjxkZWZzPgo8ZmlsdGVyIGlkPSJmaWx0ZXIwX2QiIHg9IjAiIHk9IjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSI4MCIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgo8ZmVDb2xvck1hdHJpeCBpbj0iU291cmNlQWxwaGEiIHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMCIvPgo8ZmVPZmZzZXQvPgo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0Ii8+CjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwLjI1IDAiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3ciLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3ciIHJlc3VsdD0ic2hhcGUiLz4KPC9maWx0ZXI+CjwvZGVmcz4KPC9zdmc+Cg== data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPgo8cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHJ4PSI2IiBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIwLjgiLz4KPHBhdGggZD0iTTUzLjUgMjVINTJDNTEuNjAyMiAyNSA1MS4yMjA2IDI1LjE1OCA1MC45MzkzIDI1LjQzOTNDNTAuNjU4IDI1LjcyMDYgNTAuNSAyNi4xMDIyIDUwLjUgMjYuNUM1MC41IDI2Ljg5NzggNTAuNjU4IDI3LjI3OTQgNTAuOTM5MyAyNy41NjA3QzUxLjIyMDYgMjcuODQyIDUxLjYwMjIgMjggNTIgMjhINTMuNUM1My44OTc4IDI4IDU0LjI3OTQgMjguMTU4IDU0LjU2MDcgMjguNDM5M0M1NC44NDIgMjguNzIwNiA1NSAyOS4xMDIyIDU1IDI5LjVWNDEuNTM3NUM1My43MDkzIDQwLjU0NTMgNTIuMTI4IDQwLjAwNSA1MC41IDQwQzQ5LjI3MTcgNDAuMDAwNiA0OC4wNjI0IDQwLjMwMjkgNDYuOTc4MyA0MC44ODAzQzQ1Ljg5NDIgNDEuNDU3NiA0NC45Njg1IDQyLjI5MjQgNDQuMjgyNSA0My4zMTEzQzQzLjcyNjEgNDIuNzM4NCA0My4wNjAzIDQyLjI4MjkgNDIuMzI0OCA0MS45NzE5QzQxLjU4OTIgNDEuNjYwOSA0MC43OTg2IDQxLjUwMDcgNDAgNDEuNTAwN0MzOS4yMDE0IDQxLjUwMDcgMzguNDEwOCA0MS42NjA5IDM3LjY3NTIgNDEuOTcxOUMzNi45Mzk3IDQyLjI4MjkgMzYuMjczOSA0Mi43Mzg0IDM1LjcxNzUgNDMuMzExM0MzNS4wMzE1IDQyLjI5MjQgMzQuMTA1OCA0MS40NTc2IDMzLjAyMTcgNDAuODgwM0MzMS45Mzc2IDQwLjMwMjkgMzAuNzI4MyA0MC4wMDA2IDI5LjUgNDBDMjcuODcyIDQwLjAwNSAyNi4yOTA3IDQwLjU0NTMgMjUgNDEuNTM3NVYyOS41QzI1IDI5LjEwMjIgMjUuMTU4IDI4LjcyMDYgMjUuNDM5MyAyOC40MzkzQzI1LjcyMDYgMjguMTU4IDI2LjEwMjIgMjggMjYuNSAyOEgyOEMyOC4zOTc4IDI4IDI4Ljc3OTQgMjcuODQyIDI5LjA2MDcgMjcuNTYwN0MyOS4zNDIgMjcuMjc5NCAyOS41IDI2Ljg5NzggMjkuNSAyNi41QzI5LjUgMjYuMTAyMiAyOS4zNDIgMjUuNzIwNiAyOS4wNjA3IDI1LjQzOTNDMjguNzc5NCAyNS4xNTggMjguMzk3OCAyNSAyOCAyNUgyNi41QzI1LjMwNjUgMjUgMjQuMTYxOSAyNS40NzQxIDIzLjMxOCAyNi4zMThDMjIuNDc0MSAyNy4xNjE5IDIyIDI4LjMwNjUgMjIgMjkuNVY0Ny41QzIyIDQ5LjQ4OTEgMjIuNzkwMiA1MS4zOTY4IDI0LjE5NjcgNTIuODAzM0MyNS42MDMyIDU0LjIwOTggMjcuNTEwOSA1NSAyOS41IDU1QzMxLjQ4OTEgNTUgMzMuMzk2OCA1NC4yMDk4IDM0LjgwMzMgNTIuODAzM0MzNi4yMDk4IDUxLjM5NjggMzcgNDkuNDg5MSAzNyA0Ny41QzM3IDQ2LjcwNDQgMzcuMzE2MSA0NS45NDEzIDM3Ljg3ODcgNDUuMzc4N0MzOC40NDEzIDQ0LjgxNjEgMzkuMjA0NCA0NC41IDQwIDQ0LjVDNDAuNzk1NiA0NC41IDQxLjU1ODcgNDQuODE2MSA0Mi4xMjEzIDQ1LjM3ODdDNDIuNjgzOSA0NS45NDEzIDQzIDQ2LjcwNDQgNDMgNDcuNUM0MyA0OS40ODkxIDQzLjc5MDIgNTEuMzk2OCA0NS4xOTY3IDUyLjgwMzNDNDYuNjAzMiA1NC4yMDk4IDQ4LjUxMDkgNTUgNTAuNSA1NUM1Mi40ODkxIDU1IDU0LjM5NjggNTQuMjA5OCA1NS44MDMzIDUyLjgwMzNDNTcuMjA5OCA1MS4zOTY4IDU4IDQ5LjQ4OTEgNTggNDcuNVYyOS41QzU4IDI4LjMwNjUgNTcuNTI1OSAyNy4xNjE5IDU2LjY4MiAyNi4zMThDNTUuODM4MSAyNS40NzQxIDU0LjY5MzUgMjUgNTMuNSAyNVpNMjkuNSA1MkMyOC42MSA1MiAyNy43NCA1MS43MzYxIDI2Ljk5OTkgNTEuMjQxNkMyNi4yNTk5IDUwLjc0NzEgMjUuNjgzMSA1MC4wNDQzIDI1LjM0MjUgNDkuMjIyMUMyNS4wMDE5IDQ4LjM5OTggMjQuOTEyOCA0Ny40OTUgMjUuMDg2NSA0Ni42MjIxQzI1LjI2MDEgNDUuNzQ5MiAyNS42ODg3IDQ0Ljk0NzQgMjYuMzE4IDQ0LjMxOEMyNi45NDc0IDQzLjY4ODcgMjcuNzQ5MiA0My4yNjAxIDI4LjYyMjEgNDMuMDg2NUMyOS40OTUgNDIuOTEyOCAzMC4zOTk4IDQzLjAwMTkgMzEuMjIyMSA0My4zNDI1QzMyLjA0NDMgNDMuNjgzMSAzMi43NDcxIDQ0LjI1OTkgMzMuMjQxNiA0NC45OTk5QzMzLjczNjEgNDUuNzQgMzQgNDYuNjEgMzQgNDcuNUMzNCA0OC42OTM1IDMzLjUyNTkgNDkuODM4MSAzMi42ODIgNTAuNjgyQzMxLjgzODEgNTEuNTI1OSAzMC42OTM1IDUyIDI5LjUgNTJaTTUwLjUgNTJDNDkuNjEgNTIgNDguNzQgNTEuNzM2MSA0Ny45OTk5IDUxLjI0MTZDNDcuMjU5OSA1MC43NDcxIDQ2LjY4MzEgNTAuMDQ0MyA0Ni4zNDI1IDQ5LjIyMjFDNDYuMDAxOSA0OC4zOTk4IDQ1LjkxMjggNDcuNDk1IDQ2LjA4NjUgNDYuNjIyMUM0Ni4yNjAxIDQ1Ljc0OTIgNDYuNjg4NyA0NC45NDc0IDQ3LjMxOCA0NC4zMThDNDcuOTQ3NCA0My42ODg3IDQ4Ljc0OTIgNDMuMjYwMSA0OS42MjIxIDQzLjA4NjVDNTAuNDk1IDQyLjkxMjggNTEuMzk5OCA0My4wMDE5IDUyLjIyMjEgNDMuMzQyNUM1My4wNDQzIDQzLjY4MzEgNTMuNzQ3MSA0NC4yNTk5IDU0LjI0MTYgNDQuOTk5OUM1NC43MzYxIDQ1Ljc0IDU1IDQ2LjYxIDU1IDQ3LjVDNTUgNDguNjkzNSA1NC41MjU5IDQ5LjgzODEgNTMuNjgyIDUwLjY4MkM1Mi44MzgxIDUxLjUyNTkgNTEuNjkzNSA1MiA1MC41IDUyWiIgZmlsbD0id2hpdGUiLz4KPC9nPgo8ZGVmcz4KPGZpbHRlciBpZD0iZmlsdGVyMF9kIiB4PSIwIiB5PSIwIiB3aWR0aD0iODAiIGhlaWdodD0iODAiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLz4KPGZlT2Zmc2V0Lz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIvPgo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4yNSAwIi8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93Ii8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9kcm9wU2hhZG93IiByZXN1bHQ9InNoYXBlIi8+CjwvZmlsdGVyPgo8L2RlZnM+Cjwvc3ZnPgo= data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iNiIgZmlsbD0iYmxhY2siIGZpbGwtb3BhY2l0eT0iMC44Ii8+CjxwYXRoIGQ9Ik00NS41IDE3SDQ0QzQzLjYwMjIgMTcgNDMuMjIwNiAxNy4xNTggNDIuOTM5MyAxNy40MzkzQzQyLjY1OCAxNy43MjA2IDQyLjUgMTguMTAyMiA0Mi41IDE4LjVDNDIuNSAxOC44OTc4IDQyLjY1OCAxOS4yNzk0IDQyLjkzOTMgMTkuNTYwN0M0My4yMjA2IDE5Ljg0MiA0My42MDIyIDIwIDQ0IDIwSDQ1LjVDNDUuODk3OCAyMCA0Ni4yNzk0IDIwLjE1OCA0Ni41NjA3IDIwLjQzOTNDNDYuODQyIDIwLjcyMDYgNDcgMjEuMTAyMiA0NyAyMS41VjMzLjUzNzVDNDUuNzA5MyAzMi41NDUzIDQ0LjEyOCAzMi4wMDUgNDIuNSAzMkM0MS4yNzE3IDMyLjAwMDYgNDAuMDYyNCAzMi4zMDI5IDM4Ljk3ODMgMzIuODgwM0MzNy44OTQyIDMzLjQ1NzYgMzYuOTY4NSAzNC4yOTI0IDM2LjI4MjUgMzUuMzExM0MzNS43MjYxIDM0LjczODQgMzUuMDYwMyAzNC4yODI5IDM0LjMyNDggMzMuOTcxOUMzMy41ODkyIDMzLjY2MDkgMzIuNzk4NiAzMy41MDA3IDMyIDMzLjUwMDdDMzEuMjAxNCAzMy41MDA3IDMwLjQxMDggMzMuNjYwOSAyOS42NzUyIDMzLjk3MTlDMjguOTM5NyAzNC4yODI5IDI4LjI3MzkgMzQuNzM4NCAyNy43MTc1IDM1LjMxMTNDMjcuMDMxNSAzNC4yOTI0IDI2LjEwNTggMzMuNDU3NiAyNS4wMjE3IDMyLjg4MDNDMjMuOTM3NiAzMi4zMDI5IDIyLjcyODMgMzIuMDAwNiAyMS41IDMyQzE5Ljg3MiAzMi4wMDUgMTguMjkwNyAzMi41NDUzIDE3IDMzLjUzNzVWMjEuNUMxNyAyMS4xMDIyIDE3LjE1OCAyMC43MjA2IDE3LjQzOTMgMjAuNDM5M0MxNy43MjA2IDIwLjE1OCAxOC4xMDIyIDIwIDE4LjUgMjBIMjBDMjAuMzk3OCAyMCAyMC43Nzk0IDE5Ljg0MiAyMS4wNjA3IDE5LjU2MDdDMjEuMzQyIDE5LjI3OTQgMjEuNSAxOC44OTc4IDIxLjUgMTguNUMyMS41IDE4LjEwMjIgMjEuMzQyIDE3LjcyMDYgMjEuMDYwNyAxNy40MzkzQzIwLjc3OTQgMTcuMTU4IDIwLjM5NzggMTcgMjAgMTdIMTguNUMxNy4zMDY1IDE3IDE2LjE2MTkgMTcuNDc0MSAxNS4zMTggMTguMzE4QzE0LjQ3NDEgMTkuMTYxOSAxNCAyMC4zMDY1IDE0IDIxLjVWMzkuNUMxNCA0MS40ODkxIDE0Ljc5MDIgNDMuMzk2OCAxNi4xOTY3IDQ0LjgwMzNDMTcuNjAzMiA0Ni4yMDk4IDE5LjUxMDkgNDcgMjEuNSA0N0MyMy40ODkxIDQ3IDI1LjM5NjggNDYuMjA5OCAyNi44MDMzIDQ0LjgwMzNDMjguMjA5OCA0My4zOTY4IDI5IDQxLjQ4OTEgMjkgMzkuNUMyOSAzOC43MDQ0IDI5LjMxNjEgMzcuOTQxMyAyOS44Nzg3IDM3LjM3ODdDMzAuNDQxMyAzNi44MTYxIDMxLjIwNDQgMzYuNSAzMiAzNi41QzMyLjc5NTYgMzYuNSAzMy41NTg3IDM2LjgxNjEgMzQuMTIxMyAzNy4zNzg3QzM0LjY4MzkgMzcuOTQxMyAzNSAzOC43MDQ0IDM1IDM5LjVDMzUgNDEuNDg5MSAzNS43OTAyIDQzLjM5NjggMzcuMTk2NyA0NC44MDMzQzM4LjYwMzIgNDYuMjA5OCA0MC41MTA5IDQ3IDQyLjUgNDdDNDQuNDg5MSA0NyA0Ni4zOTY4IDQ2LjIwOTggNDcuODAzMyA0NC44MDMzQzQ5LjIwOTggNDMuMzk2OCA1MCA0MS40ODkxIDUwIDM5LjVWMjEuNUM1MCAyMC4zMDY1IDQ5LjUyNTkgMTkuMTYxOSA0OC42ODIgMTguMzE4QzQ3LjgzODEgMTcuNDc0MSA0Ni42OTM1IDE3IDQ1LjUgMTdaTTIxLjUgNDRDMjAuNjEgNDQgMTkuNzQgNDMuNzM2MSAxOC45OTk5IDQzLjI0MTZDMTguMjU5OSA0Mi43NDcxIDE3LjY4MzEgNDIuMDQ0MyAxNy4zNDI1IDQxLjIyMjFDMTcuMDAxOSA0MC4zOTk4IDE2LjkxMjggMzkuNDk1IDE3LjA4NjUgMzguNjIyMUMxNy4yNjAxIDM3Ljc0OTIgMTcuNjg4NyAzNi45NDc0IDE4LjMxOCAzNi4zMThDMTguOTQ3NCAzNS42ODg3IDE5Ljc0OTIgMzUuMjYwMSAyMC42MjIxIDM1LjA4NjVDMjEuNDk1IDM0LjkxMjggMjIuMzk5OCAzNS4wMDE5IDIzLjIyMjEgMzUuMzQyNUMyNC4wNDQzIDM1LjY4MzEgMjQuNzQ3MSAzNi4yNTk5IDI1LjI0MTYgMzYuOTk5OUMyNS43MzYxIDM3Ljc0IDI2IDM4LjYxIDI2IDM5LjVDMjYgNDAuNjkzNSAyNS41MjU5IDQxLjgzODEgMjQuNjgyIDQyLjY4MkMyMy44MzgxIDQzLjUyNTkgMjIuNjkzNSA0NCAyMS41IDQ0Wk00Mi41IDQ0QzQxLjYxIDQ0IDQwLjc0IDQzLjczNjEgMzkuOTk5OSA0My4yNDE2QzM5LjI1OTkgNDIuNzQ3MSAzOC42ODMxIDQyLjA0NDMgMzguMzQyNSA0MS4yMjIxQzM4LjAwMTkgNDAuMzk5OCAzNy45MTI4IDM5LjQ5NSAzOC4wODY1IDM4LjYyMjFDMzguMjYwMSAzNy43NDkyIDM4LjY4ODcgMzYuOTQ3NCAzOS4zMTggMzYuMzE4QzM5Ljk0NzQgMzUuNjg4NyA0MC43NDkyIDM1LjI2MDEgNDEuNjIyMSAzNS4wODY1QzQyLjQ5NSAzNC45MTI4IDQzLjM5OTggMzUuMDAxOSA0NC4yMjIxIDM1LjM0MjVDNDUuMDQ0MyAzNS42ODMxIDQ1Ljc0NzEgMzYuMjU5OSA0Ni4yNDE2IDM2Ljk5OTlDNDYuNzM2MSAzNy43NCA0NyAzOC42MSA0NyAzOS41QzQ3IDQwLjY5MzUgNDYuNTI1OSA0MS44MzgxIDQ1LjY4MiA0Mi42ODJDNDQuODM4MSA0My41MjU5IDQzLjY5MzUgNDQgNDIuNSA0NFoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo=".split(" "); +c=":root {--text-color: __playerText__;--panel-color: __asideBackground__;--button-background-color: __primaryButtonBackground__;--button-text-color: __primaryButtonText__;--button-hover-background-color: __primaryButtonBackgroundHover__;--button-hover-text-color: __primaryButtonTextHover__;--button-border-color: __primaryButtonBorder__;--button-hover-border-color: __primaryButtonBorderHover__;--page-background-color: __pageBackground__;--font-family-bold: nPFnb;--font-family-bold-italic: nPFnbi;--font-family-italic: nPFni;--font-family-normal: nPFn;--font-family-semibold: nPFnsb, nPFn;--font-family-semibold-italic: nPFnsbi, nPFni;--button-border-radius: __borderRadius__;--popup-border: __popupBorder__; }.none {position: absolute; } .none .launch-screen {z-index: 100;position: fixed;top: 0;right: 0;bottom: 0;left: 0;background-color: rgba(0, 0, 0, 0.48); } .none .launch-screen .launch-screen-button {top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 96px;height: 96px;position: absolute; } .none .launch-screen .launch-screen-button__play-icon {background-color: #FFFFFF;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 90px;height: 90px;box-shadow: 0 12px 50px 0 rgba(0, 0, 0, 0.2);transition: 0.3s ease-in-out; } .none .launch-screen .launch-screen-button__icon {background: url("+ +c[0]+") no-repeat center;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 6px;width: 90px;height: 90px; } .none .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__play-icon {width: 96px;height: 96px; } .none .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__icon {background: url("+c[1]+") no-repeat center; } .none .playerView .preloader {width: 50px;height: 50px;position: absolute;top: 0;left: 0;bottom: 0;right: 0;margin: auto;border-radius: 10px;background-color: rgba(0, 0, 0, 0.5); } .none .playerView .preloader::after {content: '';position: absolute;background: url("+ +c[2]+");background-size: cover;top: 0;left: 0;bottom: 0;right: 0;animation: preloader_spin 1s infinite linear; } .none .title-panel {width: 100%;background: var(--panel-color);position: absolute;box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);height: 46px; } .none.none_landscape .title-panel {display: none; }.android_default * {text-rendering: auto !important; }body {margin: 0;padding: 0;overflow: hidden;cursor: default;-ms-touch-action: pan-y;touch-action: pan-y;-webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body .password_form, body .info_panel {position: absolute;background: #F7F7F7;border-radius: 4px;width: 513px;height: 210px;font-family: Arial; } body .password_form *, body .info_panel * {box-sizing: border-box; } body .password_form .password_label {position: absolute;color: #3A3A3A;font-size: 15px;top: 63px;left: 55px; } body .password_form .wrong_password_label {position: absolute;color: #DD4A37;font-size: 12px;top: 131px;left: 55px; } body .password_form input {position: absolute;width: 330px;height: 32px;background: #FFFFFF;border: 1px solid #D1D2D4;padding: 1px;border-radius: 2px;font-size: 18px;color: #231F20;left: 54px;top: 94px;padding-left: 8px; } body .password_form button {border: transparent;background: transparent;color: #343434;font-family: Arial;font-size: 15px;text-shadow: 0 1px 0 rgba(255, 255, 255, 0.4); } body .password_form button::before {background: linear-gradient(to bottom, #D3D3D3, #BABABA);position: absolute;content: '';top: 0;right: 0;bottom: 0;left: 0;border-radius: 4px;z-index: -1; } body .password_form button::after {background: linear-gradient(to bottom, #DCDCDC, #D1D1D1);position: absolute;content: '';top: 1px;right: 1px;bottom: 1px;left: 1px;border-radius: 4px;z-index: -1; } body .password_form .btn_ok {position: absolute;top: 94px;right: 55px;width: 60px;height: 32px;opacity: 0.99; } body .info_panel {display: table; } body .info_panel .label {position: static;display: table-cell;vertical-align: middle;width: 100%;padding-left: 120px;padding-right: 40px;color: #3A3A3A;font-size: 15px; } body .info_panel::after {position: absolute;content: '';width: 63px;height: 63px;top: 73px;left: 46px; } body .info_panel.domain::after {background: transparent url("+ +c[3]+"); } body .info_panel.time::after {background: transparent url("+c[4]+"); }.component_base,.component_container {position: absolute; }:focus {outline: none; }::-moz-focus-inner {border: 0; }input {-webkit-appearance: none;appearance: none; }button {cursor: pointer;margin: 0;border: 0; }button[disabled] {cursor: default; }.__player_view_id__ {position: absolute; } .__player_view_id__ > * {position: absolute; } .__player_view_id__ .slide {white-space: nowrap;font-size: 0; } .__player_view_id__ .slide a {text-decoration: none;cursor: pointer; } .__player_view_id__ .slide a img {border: 0; } .__player_view_id__ .slide * {-ms-transform-origin: 0 0;transform-origin: 0 0; } .__player_view_id__ .slide.relpos, .__player_view_id__ .slide .relpos {position: relative !important;vertical-align: top; } .__player_view_id__ .slide.kern, .__player_view_id__ .slide .kern {text-rendering: optimizeLegibility;font-feature-settings: 'kern' 1, 'liga' 0; } .__player_view_id__ .slide.nokern, .__player_view_id__ .slide .nokern {text-rendering: optimizeSpeed;font-feature-settings: 'kern' 0, 'liga' 0; } .__player_view_id__ .fullscreen {-ms-transform: none !important;transform: none !important;top: 0 !important;left: 0 !important; } .__player_view_id__ .fullscreen > video, .__player_view_id__ .fullscreen .video_player {background-color: black;width: __slide_width__ !important;height: __slide_height__ !important;z-index: 100;-ms-transform: none !important;transform: none !important; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen {background: url("+ +c[5]+") no-repeat; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen:hover {background: url("+c[6]+") no-repeat; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen:active {background: url("+c[7]+") no-repeat; } .__player_view_id__ .video_player video {width: 100%;height: 100%;margin: auto;top: 0;right: 0;bottom: 0;left: 0; } .__player_view_id__ .video_player video::cue {color: #FFFFFF;background-color: rgba(8, 8, 8, 0.75);border-radius: 4px;font-family: Helvetica, Roboto, Arial, sans-serif;line-height: 1.1; } .__player_view_id__ .video_player.poster_frame_hide_video video {display: none; } .__player_view_id__ .video_player.poster_frame video {opacity: 0; } .__player_view_id__ .video_player.poster_frame_hide_video .poster, .__player_view_id__ .video_player.poster_frame .poster {position: absolute;width: 100%;height: 100%; } .__player_view_id__ .video_player .controls {height: 36px;background: rgba(45, 50, 55, 0.85098);border: 1px solid #444648;cursor: default;border-radius: 4px; } .__player_view_id__ .video_player .controls, .__player_view_id__ .video_player .controls * {-webkit-backface-visibility: hidden;backface-visibility: hidden; } .__player_view_id__ .video_player .controls .progress {background-color: #75787A;height: 14px;left: 64px;top: 0;bottom: 0;margin-top: auto;margin-bottom: auto;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark {width: 10px;height: 10px;margin-top: -5px;margin-left: -5px;top: 50%;background: url("+ +c[8]+") no-repeat;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark:hover, .__player_view_id__ .video_player .controls .progress .bookmark:active {background: url("+c[9]+") no-repeat; } .__player_view_id__ .video_player .controls .progress .loading {background-color: #B1B3B5;height: 100%; } .__player_view_id__ .video_player .controls .progress .playing {background-color: #FFFFFF;height: 100%; } .__player_view_id__ .video_player .controls .progress .tooltip {background: url("+ +c[10]+") no-repeat;width: 60px;height: 25px;top: -33px;margin-left: -30px;font-family: Arial;font-size: 12px;padding-top: 2px;text-align: center; } .__player_view_id__ .video_player .controls .volume_popup {border-radius: 3px;background: rgba(45, 50, 55, 0.85098);top: -67px;right: 65px;padding: 8px;box-sizing: border-box;width: 28px;height: 64px; } .__player_view_id__ .video_player .controls .volume_popup .volume {background: url("+c[11]+");position: relative;cursor: pointer;width: 12px;height: 48px; } .__player_view_id__ .video_player .controls .volume_popup .volume .back {background: url("+ +c[12]+");width: 100%; } .__player_view_id__ .video_player .controls button {width: 100%;height: 100%; } .__player_view_id__ .video_player .controls button.rate {background: url("+c[13]+") no-repeat center; } .__player_view_id__ .video_player .controls button.rate.selected {background-color: rgba(255, 255, 255, 0.1); } .__player_view_id__ .video_player .controls button.mute {background: url("+c[14]+"); } .__player_view_id__ .video_player .controls button.mute:hover {background: url("+ +c[15]+"); } .__player_view_id__ .video_player .controls button.mute:active {background: url("+c[16]+"); } .__player_view_id__ .video_player .controls button.mute.selected {background: url("+c[17]+"); } .__player_view_id__ .video_player .controls button.mute.selected:hover {background: url("+c[18]+"); } .__player_view_id__ .video_player .controls button.mute.selected:active {background: url("+c[19]+"); } .__player_view_id__ .video_player .controls button.subtitles {background: url("+ +c[20]+") no-repeat center; } .__player_view_id__ .video_player .controls button.subtitles.selected {background-color: rgba(255, 255, 255, 0.1); } .__player_view_id__ .video_player .controls button.play {background: url("+c[21]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:hover {background: url("+c[22]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:active {background: url("+c[23]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected {background: url("+ +c[24]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:hover {background: url("+c[25]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:active {background: url("+c[26]+") no-repeat; } .__player_view_id__ .video_player .controls button.play::after {background: url("+c[27]+");width: 1px;height: 32px;right: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls button.toggle_fullscreen {background: url("+ +c[28]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:hover {background: url("+c[29]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:active {background: url("+c[30]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen::before {background: url("+c[27]+") no-repeat;width: 1px;height: 32px;left: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls .subtitles-list {width: 195px;right: 0;border-radius: 4px;border: solid 1px #444648;background-color: rgba(45, 50, 55, 0.85);font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;font-weight: normal;font-stretch: normal;font-style: normal;line-height: normal;letter-spacing: normal;padding: 3px 0;bottom: 37px; } .__player_view_id__ .video_player .controls .subtitles-list__caption {position: relative !important;padding: 12px 0 22px 0;color: #b8b8b8;text-align: center; } .__player_view_id__ .video_player .controls .subtitles-list__caption::after {position: absolute;content: '';width: calc(100% - 20px);left: 0;right: 0;bottom: 5px;margin: auto;border-bottom: 1px solid #444648; } .__player_view_id__ .video_player .controls .subtitles-list__item {color: #b8b8b8;position: relative !important;padding: 10px 2px 10px 35px;cursor: pointer;overflow: hidden;text-overflow: ellipsis; } .__player_view_id__ .video_player .controls .subtitles-list__item.subtitles-list__item_active {background-color: rgba(255, 255, 255, 0.1);color: #FFFFFF; } .__player_view_id__ .video_player .controls .subtitles-list__item[aria-selected='true'] {background-color: rgba(0, 0, 0, 0.24);color: #FFFFFF;padding-left: 12px; } .__player_view_id__ .video_player .controls .subtitles-list__item[aria-selected='true']::before {background: url("+ +c[31]+") no-repeat;width: 14px;height: 15px;padding-right: 23px;content: ''; } .__player_view_id__ .video_player .controls .toggle_fullscreen {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .play {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .rate {width: 32px;height: 34px;right: 95px;top: 0; } .__player_view_id__ .video_player .controls .rate.rate_subtitle-button-next {right: 127px; } .__player_view_id__ .video_player .controls .playback-rate-menu {width: 120px;right: 51px;border-radius: 4px;border: solid 1px #444648;background-color: rgba(45, 50, 55, 0.85);font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;font-weight: normal;font-stretch: normal;font-style: normal;line-height: normal;letter-spacing: normal;padding: 3px 0;bottom: 37px; } .__player_view_id__ .video_player .controls .playback-rate-menu.playback-rate-menu_subtitle-button-next {right: 83px; } .__player_view_id__ .video_player .controls .playback-rate-menu__caption {position: relative !important;padding: 12px 0 22px 0;color: #b8b8b8;text-align: center; } .__player_view_id__ .video_player .controls .playback-rate-menu__caption::after {position: absolute;content: '';width: calc(100% - 20px);left: 0;right: 0;bottom: 5px;margin: auto;border-bottom: 1px solid #444648; } .__player_view_id__ .video_player .controls .playback-rate-menu__item {color: #b8b8b8;position: relative !important;padding: 10px 2px 10px 35px;cursor: pointer;overflow: hidden;text-overflow: ellipsis; } .__player_view_id__ .video_player .controls .playback-rate-menu__item.playback-rate-menu__item_active {background-color: rgba(255, 255, 255, 0.1);color: #FFFFFF; } .__player_view_id__ .video_player .controls .playback-rate-menu__item[aria-selected='true'] {background-color: rgba(0, 0, 0, 0.24);color: #FFFFFF;padding-left: 12px; } .__player_view_id__ .video_player .controls .playback-rate-menu__item[aria-selected='true']::before {background: url("+ +c[31]+") no-repeat;width: 14px;height: 15px;padding-right: 23px;content: ''; } .__player_view_id__ .video_player .controls .subtitles {width: 32px;height: 34px;right: 95px;top: 0; } .__player_view_id__ .video_player .controls .toggle_fullscreen {right: -1px; } .__player_view_id__ .video_player .controls .mute {width: 22px;height: 22px;right: 67px;top: 6px; }.popup_layer {position: absolute; } .popup_layer .modal_layer {background: #000000;opacity: 0.4;z-index: 10;width: 100%;height: 100%; } .popup_layer .message_box, .popup_layer .confirm_window {background: #FFFFFF;border-radius: 5px;border: 1px solid rgba(0, 0, 0, 0.75);width: 357px;height: 150px;position: absolute;top: 0;right: 0;bottom: 0;left: 0;margin: auto;z-index: 10; } .popup_layer .message_box::after, .popup_layer .confirm_window::after {background-color: #E6E6E6;width: 100%;height: 1px;top: 30px;position: absolute;content: ''; } .popup_layer .message_box .title, .popup_layer .message_box .message, .popup_layer .confirm_window .title, .popup_layer .confirm_window .message {font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;color: #323232; } .popup_layer .message_box .title, .popup_layer .confirm_window .title {position: absolute;left: 13px;top: 7px;font-weight: bold;background: transparent; } .popup_layer .message_box .message, .popup_layer .confirm_window .message {position: absolute;top: 47px;left: 69px;margin-right: 25px; } .popup_layer .message_box .message::before, .popup_layer .confirm_window .message::before {background-color: #E6E6E6;width: 35px;height: 35px;left: -45px;position: absolute;content: ''; } .popup_layer .message_box button, .popup_layer .confirm_window button {font-size: 14px;border-radius: 5px;color: #323232;width: 68px;height: 30px; } .popup_layer .message_box button, .popup_layer .message_box button.mobile:hover, .popup_layer .message_box button.mobile:active, .popup_layer .confirm_window button, .popup_layer .confirm_window button.mobile:hover, .popup_layer .confirm_window button.mobile:active {background: #D4D4D4; } .popup_layer .message_box button:hover, .popup_layer .message_box button:active, .popup_layer .message_box button.mobile.active, .popup_layer .confirm_window button:hover, .popup_layer .confirm_window button:active, .popup_layer .confirm_window button.mobile.active {background: #B8B8B8; } .popup_layer .confirm_window button.btn_yes {left: 101px;top: 98px; } .popup_layer .confirm_window button.btn_no {left: 181px;top: 98px; } .popup_layer .confirm_window .message::before {background: url("+ +c[32]+"); } .popup_layer .message_box button.btn_ok {left: 141px;top: 98px; } .popup_layer .message_box .message::before {background: url("+c[33]+"); }.transitionSlide.paused * {animation-play-state: paused !important; }.framesLayer .video_player {-ms-transform-origin: 0 0;transform-origin: 0 0; }.framesLayer *:not(.framesLayerContent) {pointer-events: all; }.framesLayer .framesLayerContent {position: absolute; } .framesLayer .framesLayerContent > div {pointer-events: all; }.trial_banner {position: relative;transform: translateZ(0); } .trial_banner .banner-content, .trial_banner .banner-content_hover {position: absolute;left: 0;right: 0;top: 0;bottom: 0;width: 100%;height: 100%; } .trial_banner .banner-content {visibility: visible;z-index: 1; } .trial_banner .banner-content_hover {visibility: hidden;z-index: 0; } .trial_banner .days_remaining {position: absolute;font-family: 'Open Sans', Arial, sans-serif;font-weight: normal;font-size: 13px;left: 65px;top: 41px;color: #7C1645;z-index: 1; } .trial_banner:hover .banner-content {visibility: hidden;z-index: 0; } .trial_banner:hover .banner-content_hover {visibility: visible;z-index: 1; }.back_to_app {height: 100%;position: absolute;left: 0; } .back_to_app__text {color: #3DA0E1;font-size: 16px;font-family: Helvetica Neue, Helvetica, Roboto, Arial;text-overflow: ellipsis;overflow: hidden;position: absolute;bottom: 0;top: 0;height: 24px;line-height: 24px;margin: auto;padding-left: 25px;max-width: 80px; } .back_to_app__text::before {content: '';background: url("+ +c[34]+") no-repeat center;height: 24px;width: 14px;left: 8px;position: absolute; }.popup-layer {top: 0;right: 0;bottom: 0;left: 0;z-index: 1;position: absolute;border-radius: inherit; }.modal-layer {background: #000000;opacity: 0.4;position: absolute;width: 100%;height: 100%;border-radius: inherit; }.uikit-primary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-primary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-primary-button.uikit-primary-button_size_medium {padding: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:first-child {margin-left: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:last-child {margin-right: 10px; } .uikit-primary-button.uikit-primary-button_size_small {padding: 6px 12px; } .uikit-primary-button.uikit-primary-button_size_small .uikit-primary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-primary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__button-text {margin-right: 8px; } .uikit-primary-button__left-icon {margin-right: 8px; } .uikit-primary-button__button-text:first-child {margin-left: 0; } .uikit-primary-button__button-text:last-child {margin-right: 0; } .uikit-primary-button__left-icon:first-child {margin-left: 0; } .uikit-primary-button__left-icon:last-child {margin-right: 0; } .uikit-primary-button__right-icon:first-child {margin-left: 0; } .uikit-primary-button__right-icon:last-child {margin-right: 0; } .uikit-primary-button[disabled] {opacity: 0.4; } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-secondary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-secondary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-secondary-button.uikit-secondary-button_size_medium {padding: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:first-child {margin-left: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:last-child {margin-right: 10px; } .uikit-secondary-button.uikit-secondary-button_size_small {padding: 6px 12px; } .uikit-secondary-button.uikit-secondary-button_size_small .uikit-secondary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-secondary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__button-text {margin-right: 8px; } .uikit-secondary-button__left-icon {margin-right: 8px; } .uikit-secondary-button__button-text:first-child {margin-left: 0; } .uikit-secondary-button__button-text:last-child {margin-right: 0; } .uikit-secondary-button__left-icon:first-child {margin-left: 0; } .uikit-secondary-button__left-icon:last-child {margin-right: 0; } .uikit-secondary-button__right-icon:first-child {margin-left: 0; } .uikit-secondary-button__right-icon:last-child {margin-right: 0; } .uikit-secondary-button[disabled] {opacity: 0.4; } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-link-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-link-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-link-button.uikit-link-button_size_medium {padding: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text {font-size: 17px;line-height: 20px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:first-child {margin-left: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:last-child {margin-right: 10px; } .uikit-link-button.uikit-link-button_size_small {padding: 6px 12px; } .uikit-link-button.uikit-link-button_size_small .uikit-link-button__button-text {font-size: 14px;line-height: 20px; } .uikit-link-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__button-text {margin-right: 8px; } .uikit-link-button__left-icon {margin-right: 8px; } .uikit-link-button__button-text:first-child {margin-left: 0; } .uikit-link-button__button-text:last-child {margin-right: 0; } .uikit-link-button__left-icon:first-child {margin-left: 0; } .uikit-link-button__left-icon:last-child {margin-right: 0; } .uikit-link-button__right-icon:first-child {margin-left: 0; } .uikit-link-button__right-icon:last-child {margin-right: 0; } .uikit-link-button[disabled] {opacity: 0.4; } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-primary-button {background: var(--button-background-color);color: var(--button-text-color); } .uikit-primary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--button-border-color);background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-primary-button__button-text {font-family: var(--font-family-normal);font-weight: 700; } .uikit-primary-button.uikit-primary-button_active, .uikit-primary-button[aria-pressed='true'], .uikit-primary-button:focus {background: var(--button-hover-background-color);color: var(--button-hover-text-color); } .uikit-primary-button.uikit-primary-button_active::after, .uikit-primary-button[aria-pressed='true']::after, .uikit-primary-button:focus::after {background: var(--button-hover-border-color);background-origin: border-box; }.message-box {background: var(--panel-color);position: absolute;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;border-radius: 7px;min-width: 280px;padding: 40px;box-shadow: 0 8px 16px rgba(0, 0, 0, 0.08); } .message-box::after {content: '';box-sizing: border-box;border: 1px solid var(--popup-border);width: 100%;height: 100%;position: absolute;left: 0;top: 0;border-radius: 7px;pointer-events: none; } .message-box__content {position: relative;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-direction: column;flex-direction: column; } .message-box__icon {width: 24px;height: 24px;margin-bottom: 24px;position: relative;display: inline-block;color: var(--text-color);opacity: 0.72; } .message-box .message-box-buttons {position: relative;width: 100%;height: 36px; } .message-box .message-box-buttons__buttons {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center; } .message-box .message-box-buttons__window-button {margin: 0 4px; } .message-box .vertical-scrollbar {top: 40px; } .message-box__message-container {overflow: hidden;display: inline-block;max-width: 480px;vertical-align: top;position: relative; } .message-box__message {text-align: center;font-size: 16px;color: var(--text-color);text-overflow: ellipsis;overflow: hidden;position: relative;font-family: var(--font-family-normal); } .message-box__buttons {margin-top: 28px; }.container-top-shadow {background: __verticalGradient(#FFFFFF, rgba(255, 255, 255, 0));background: linear-gradient(to bottom, #FFFFFF, rgba(255, 255, 255, 0));position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; }.container-bottom-shadow {background: __verticalGradient(rgba(255, 255, 255, 0), #FFFFFF);background: linear-gradient(to bottom, rgba(255, 255, 255, 0), #FFFFFF);position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; }.vertical-scrollbar {position: absolute;right: 0;top: 4px;bottom: 4px;width: 14px;transition: opacity 0.2s ease; } .vertical-scrollbar .thumb {position: absolute;width: 8px;right: 3px;padding: 1px;border-radius: 5px; } .vertical-scrollbar .thumb__background {height: 100%;border-radius: 4px;background-color: rgba(0, 0, 0, 0.32);border: 1px solid rgba(255, 255, 255, 0.12); }.vertical-scrollbar {transition: none;opacity: 0.5 !important; }.presentation-view-mode-switch-control {width: 64px;height: 64px;position: fixed;left: 16px;top: 16px;cursor: pointer;border: none;background: url("+ +c[35]+") no-repeat center; } .presentation-view-mode-switch-control:not([disabled]):hover {background: url("+c[36]+") no-repeat center; } .presentation-view-mode-switch-control:not([disabled]):active {background: url("+c[37]+") no-repeat center; } .presentation-view-mode-switch-control:not([disabled]):focus {outline: none; } .presentation-view-mode-switch-control:not([disabled]):focus::before {content: '';position: absolute;top: 3px;bottom: 3px;left: 3px;right: 3px;border: 1px dotted #FFFFFF;opacity: 0.6; }"; +let d;for(const [f,g]of Object.entries(null!=(d=a)?d:{}))a=`__${f.replace(RegExp("\\.","g"),"_")}__`,c=c.replace(new RegExp(a,"g"),g);let e;for(const [f,g]of Object.entries(null!=(e=b)?e:{}))c=c.replace(new RegExp(f,"g"),g);c=c.replace(/__verticalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.Pk);c=c.replace(/__horizontalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.Ok);return gn(c)}Pk(a,b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}Ok(a, +b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}};class IG{Yo(a,b){var c=sh("PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMTA2cHgiIGhlaWdodD0iMTM0cHgiIHZpZXdCb3g9IjAgMCAxMDYgMTM0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDYgMTM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGw9Int0ZXh0fSIgZD0iTTUzLDE5Yy0xNi43MDYsMC0zMC4yNSwxNS4yMjctMzAuMjUsMzQuMDMxYzAsMTguNzk0LDEzLjU0NCwzNC4wMzEsMzAuMjUsMzQuMDMxDQoJYzE2LjcxMywwLDMwLjI1LTE1LjIzNywzMC4yNS0zNC4wMzFDODMuMjUsMzQuMjI3LDY5LjcxMywxOSw1MywxOXoiLz4NCjxwYXRoIGZpbGw9Int0ZXh0fSIgZD0iTTc0LjExOSw4OC42MjVjLTYuMjkzLDUuMDUzLTEzLjQ4Niw3Ljk2Mi0yMS4xMjIsNy45NjJjLTcuNjMsMC0xNC44MjMtMi45MDQtMjEuMTIyLTcuOTYyDQoJQzE4LjI4Niw5My45ODQsNy42MjEsMTA2LjY4OCwyLjczOSwxMzRoMTAwLjUyMUM5OC4zNzksMTA2LjY4OCw4Ny43MjMsOTMuOTcxLDc0LjExOSw4OC42MjV6Ii8+DQo8L3N2Zz4NCg=="); +let d;for(const [g,h]of Object.entries(null!=(d=a)?d:{}))c=c.replace(new RegExp(`{${g}}`,"g"),h);c=["data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICB3aWR0aD0iMjhweCIgaGVpZ2h0PSIzM3B4IiB2aWV3Qm94PSIwIDAgMjguMzAyIDMzLjI0MiI+DQoJPHBhdGggZD0iTTAsMS44VjMxLjQ0MmExLjgsMS44LDAsMCwwLDIuNzI2LDEuNTQzbDI0LjctMTQuODJhMS44LDEuOCwwLDAsMCwwLTMuMDg3TDIuNzI2LjI1N0ExLjgsMS44LDAsMCwwLDAsMS44WiIgc3R5bGU9ImZpbGw6IzMzMyIvPg0KPC9zdmc+","data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyOHB4IiBoZWlnaHQ9IjMzcHgiIHZpZXdCb3g9IjAgMCAyOC4zMDIgMzMuMjQyIj4NCgk8cGF0aCBkPSJNMCwxLjhWMzEuNDQyYTEuOCwxLjgsMCwwLDAsMi43MjYsMS41NDNsMjQuNy0xNC44MmExLjgsMS44LDAsMCwwLDAtMy4wODdMMi43MjYuMjU3QTEuOCwxLjgsMCwwLDAsMCwxLjhaIiBzdHlsZT0iZmlsbDojNTI4YmRmIi8+DQo8L3N2Zz4=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMnB4IiB2aWV3Qm94PSIwIDAgMjAgMjIiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5TV0FQLUlDT048L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iaVBob25lLTgtUGx1cy1ALUNvdXJzZS1sYW5kc2NhcGUtU1dBUCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQ2Mi4wMDAwMDAsIC0xMTAuMDAwMDAwKSIgZmlsbD0iI0ZGRkZGRiIgZmlsbC1ydWxlPSJub256ZXJvIj4KICAgICAgICAgICAgPGcgaWQ9IlNXQVAtQlVUVE9OIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0NTAuMDAwMDAwLCA5OS4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNS45MTQyMTM2LDE2IEwyNCwxNiBDMjQuNTUyMjg0NywxNiAyNSwxNi40NDc3MTUzIDI1LDE3IEMyNSwxNy41NTIyODQ3IDI0LjU1MjI4NDcsMTggMjQsMTggTDE1LjkxNDIxMzYsMTggTDE4LjcwNzEwNjgsMjAuNzkyODkzMiBDMTkuMDk3NjMxMSwyMS4xODM0MTc1IDE5LjA5NzYzMTEsMjEuODE2NTgyNSAxOC43MDcxMDY4LDIyLjIwNzEwNjggQzE4LjMxNjU4MjUsMjIuNTk3NjMxMSAxNy42ODM0MTc1LDIyLjU5NzYzMTEgMTcuMjkyODkzMiwyMi4yMDcxMDY4IEwxMi43OTI4OTMyLDE3LjcwNzEwNjggQzEyLjQwMjM2ODksMTcuMzE2NTgyNSAxMi40MDIzNjg5LDE2LjY4MzQxNzUgMTIuNzkyODkzMiwxNi4yOTI4OTMyIEwxNy4yOTI4OTMyLDExLjc5Mjg5MzIgQzE3LjY4MzQxNzUsMTEuNDAyMzY4OSAxOC4zMTY1ODI1LDExLjQwMjM2ODkgMTguNzA3MTA2OCwxMS43OTI4OTMyIEMxOS4wOTc2MzExLDEyLjE4MzQxNzUgMTkuMDk3NjMxMSwxMi44MTY1ODI1IDE4LjcwNzEwNjgsMTMuMjA3MTA2OCBMMTUuOTE0MjEzNiwxNiBaIE0yOC4wODU3ODY0LDI4IEwyMCwyOCBDMTkuNDQ3NzE1MywyOCAxOSwyNy41NTIyODQ3IDE5LDI3IEMxOSwyNi40NDc3MTUzIDE5LjQ0NzcxNTMsMjYgMjAsMjYgTDI4LjA4NTc4NjQsMjYgTDI1LjI5Mjg5MzIsMjMuMjA3MTA2OCBDMjQuOTAyMzY4OSwyMi44MTY1ODI1IDI0LjkwMjM2ODksMjIuMTgzNDE3NSAyNS4yOTI4OTMyLDIxLjc5Mjg5MzIgQzI1LjY4MzQxNzUsMjEuNDAyMzY4OSAyNi4zMTY1ODI1LDIxLjQwMjM2ODkgMjYuNzA3MTA2OCwyMS43OTI4OTMyIEwzMS4yMDcxMDY4LDI2LjI5Mjg5MzIgQzMxLjU5NzYzMTEsMjYuNjgzNDE3NSAzMS41OTc2MzExLDI3LjMxNjU4MjUgMzEuMjA3MTA2OCwyNy43MDcxMDY4IEwyNi43MDcxMDY4LDMyLjIwNzEwNjggQzI2LjMxNjU4MjUsMzIuNTk3NjMxMSAyNS42ODM0MTc1LDMyLjU5NzYzMTEgMjUuMjkyODkzMiwzMi4yMDcxMDY4IEMyNC45MDIzNjg5LDMxLjgxNjU4MjUgMjQuOTAyMzY4OSwzMS4xODM0MTc1IDI1LjI5Mjg5MzIsMzAuNzkyODkzMiBMMjguMDg1Nzg2NCwyOCBaIiBpZD0iU1dBUC1JQ09OIj48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAADcmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmFjOGVjNDFhLTZkYWItODQ0Ni04YzkzLWU1Mjk3N2YwMmE4NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFRThCNzU3NDYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFRThCNzU3MzYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cykiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0OWFlZmI1OC00ZWFmLWQ3NDgtYTI0ZS0zNmNhNGQ2M2QwNTYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6N0MwQkFBM0M2MjAxMTFFNUI4QjBERTk4MjY5MjQwQjUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6MGSVVAAAE3klEQVR42uycW4hWVRiG15Q4eYzGQySSQlriEQ9BF2mE4iSdESRRIb0RD+mNmHgICjqQEGUe6sqgCy1i0iRinAzELrooQhHLGQURUTzMiM7omCLj+/F/czX/t/890z6s9e/3hZcZ1l6z19r7mXXca62arq4uR/mjh/gKCIQiEAKhCIRAKAIhEIpACIQiEIpACIQiEAKhCIRAKAIhEMoX9Yu62NbWxjcUobq6OpaQQpcQz/QwPBOeDU+Fx8Oj4UfhoRrnJnwDvgC3wCfgY/Bf8P0QHrImahmQB1VWLfwGvAieqy+/LxJIR+Dv4QPwf75WWb4CGQavg9fo70mqFd4F79DfCSRCA+HN8Hp4cMppdcBfwB/Bt9mo99Sr8Cl4SwYwnKYhaf2jaXMconoE/hL+CR6TQ/pPato7NS+FbtSfgH+Gp8eMfwv+HT6qpakZvqzVT/d//ePw0/BEeI72ygbFvP/f8MvwpSK2IfLSGuGxFeJ1aby98CG4s5fpDNAqaTlcL89cIf45jddcpDZknI4PKsFo0NKzQLusnX1Iq1P/doHe60CF+GM1b+OK0obIYO5XeGREnLPwfHghfDzBtOVeb+q9z0bEG6njltHVDqQ2RuP9HTwDbkoxH02axv4YjX1tNQP5LKIBl7ZiK/yWToGkLUljsaZpNaTTNc9VCeR1eHUEjHfgD3OoQiXNVRFQVmveqwrIEHh3xPXNOp2Rl77WPFiSvA+tJiCb4FHGNanHP/FggCp52Gdck7y/Wy0Dw2Hatx9s9KZmZNRmxC3JMjh8qsy1Du0St4Y+DomaKFzlEQxRu+apnOQZ1oVeZfWPeMCGlLu2/6dL3BDRwPcPGYiMjocbvaoPnL963+h1DddnChbIMiP8cMIj8KQln34be/lM3gOREW69cW2v81/fGOH1aY7e0wTyrNGYyxT6wQCAHNS8lmvcZ4UIZL4RLt8z7gQA5I7mtZyeCxHIS0b4UReOrLw+EyIQqxScDAiIldcJIQLZYTTmvwUEpMUIHxMikB/gta40PXIF/lwHVrcCAnLVCH8srQR9X7mYt2RUbq1yrOFia390N9SReugaYoR3EEg+GmGEtxNIPhpvhJ8nkHw02Qj/l0Dy0Rwj/DSBZC9ZeD3buPYHgWSv11z5RdrSw/qTQLLX20Z4o0toSxyBxJdsKrVmq79NM2ECKa/3XPltC9fgXwgkW81zpVX35fSVS3HahEB6SqZK9hjXujeJOgLJTrLG19qos1OrLALJSLL+eLFx7SL8cRaZIJCSVrrSfnVL8qHtJoFkoy3ablibQeWz849ZZaZfgUHIfg/Z97EkIs5xLR2OQNLv2u5x0Ttt5UShV1wfj91glRVP01xp8UVTBRiyuOFFheJYQpKVzNrKwQErXPyDA2SF+5k8MhsykCnwPdfzaA3ZYy6nREyCX4Cfd/EPs+nV0RoEUlqWsx1eCie9Bkc2nW5wOa87Dg3Ipy75bWXntSd1yIcHDK1RT3KzTIcOBif6AqOo3d42HX/I0tZW3zIXWgnp68chmfaQjZxyoKac0bXNRxghlpCN2m1dpj/btXEfpD0uqYaua89Luq3dx8TKN3AeE1vt4mLrAohACIQiEAKhCIRAKAIhEIpACq7IqROKJYRA+AoIhCIQAqEIhEAoAiEQikCKrQcCDABHPgH2w7NQdAAAAABJRU5ErkJggg==", +"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4IDEyIiB3aWR0aD0iOCIgaGVpZ2h0PSIxMiI+DQoJPHRpdGxlPlRvLXF1aXo8L3RpdGxlPg0KCTxwYXRoIGQ9Ik0xLDEyYTEsMSwwLDAsMS0uNzA3LTEuNzA3TDQuNTg2LDYsLjI5MywxLjcwN0ExLDEsMCwwLDEsMS43MDcuMjkzTDcuNDE0LDYsMS43MDcsMTEuNzA3QTEsMSwwLDAsMSwxLDEyWiIgc3R5bGU9ImZpbGw6IzllYWViOSIvPg0KPC9zdmc+","data:image/svg+xml;base64,"+qh(c),"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA5LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDksMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbD0iI0RENEIzOCIgZD0iTTIxLjA0MSwyOXY5Ljg0NGMwLDUuNTA4LDQuNjkxLDkuOTczLDEwLjQ3OSw5Ljk3M2M1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTczVjI5SDIxLjA0MXoiLz4NCjxwYXRoIGZpbGw9IiNERDRCMzgiIGQ9Ik0yNi41NTgsMjl2LTcuNjg5YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MlYyOWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNFYyOUgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjEuMDQxLDI4LjIwNnY5Ljg0NWMwLDUuNTA2LDQuNjkxLDkuOTcxLDEwLjQ3OSw5Ljk3MWM1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTcxdi05Ljg0NUgyMS4wNDF6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjYuNTU4LDI4LjA0VjIwLjM1YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MnY3LjY4OWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNHY4LjA1NEgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRjA4RjgyIiBkPSJNMzQsMzYuMzY1YzAtMS4yODctMS4wNDQtMi4zMzEtMi4zMzEtMi4zMzFjLTEuMjg4LDAtMi4zMzIsMS4wNDQtMi4zMzIsMi4zMzENCgljMCwwLjk3MSwwLjU5NCwxLjgwMiwxLjQzOCwyLjE1MnY0LjQ2N2gxLjkxdi00LjUyOUMzMy40NjEsMzguMDc2LDM0LDM3LjI4NywzNCwzNi4zNjV6Ii8+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA4LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDgsMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik01OS42NDYsMzFoLTMuMjkzQzU2LjE1OCwzMSw1NiwzMS40NDgsNTYsMzINCgljMCwwLjU1MywwLjE1OCwxLDAuMzU0LDFoMy4yOTNDNTkuODQyLDMzLDYwLDMyLjU1Myw2MCwzMkM2MCwzMS40NDgsNTkuODQyLDMxLDU5LjY0NiwzMXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjREQ0QjM4IiBkPSJNNi42NDcsMzFIMy4zNTNDMy4xNTgsMzEsMywzMS40NDgsMywzMmMwLDAuNTUzLDAuMTU4LDEsMC4zNTMsMQ0KCWgzLjI5NEM2Ljg0MiwzMyw3LDMyLjU1Myw3LDMyQzcsMzEuNDQ4LDYuODQyLDMxLDYuNjQ3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik0zMSw4YzAuNTUzLDAsMS0wLjE1OCwxLTAuMzUzVjQuMzUzQzMyLDQuMTU4LDMxLjU1Myw0LDMxLDQNCgljLTAuNTUyLDAtMSwwLjE1OC0xLDAuMzUzdjMuMjk0QzMwLDcuODQyLDMwLjQ0OCw4LDMxLDh6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTMxLDU2Yy0wLjU1MiwwLTEsMC4xNTgtMSwwLjM1NHYzLjI5M0MzMCw1OS44NDIsMzAuNDQ4LDYwLDMxLDYwDQoJYzAuNTUzLDAsMS0wLjE1OCwxLTAuMzU0di0zLjI5M0MzMiw1Ni4xNTgsMzEuNTUzLDU2LDMxLDU2eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik00Ny42NjgsMzFoLTEyLjgxQzM0LjQ5NiwyOS42LDMzLjQsMjguNTA1LDMyLDI4LjE0Mg0KCWMwLDAtMC4xNzItMC4xNDItMS0wLjE0MmMtMC44MjksMC0yLDAuNTU1LTIsMC41NTVjLTEuMTksMC42OTMtMiwxLjk2OS0yLDMuNDQ1YzAsMi4yMDksMS43OTEsNCw0LDRjMS40NzcsMCwyLjc1Mi0wLjgwOSwzLjQ0NS0yDQoJaDEzLjIyM0M0OC40MDQsMzQsNDksMzMuMzI4LDQ5LDMyLjVDNDksMzEuNjcyLDQ4LjQwNCwzMSw0Ny42NjgsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTI3LjAxOCwyOS43NDhjMC41OTIsMS4wMjUsMS42NTIsMS41MiwyLjM3LDEuMTA2bDAsMA0KCWMwLjcxNy0wLjQxNSwwLjgxOS0xLjU4MSwwLjIyOC0yLjYwNmwtNy44NTctMTMuNjA5Yy0wLjU5Mi0xLjAyNC0xLjY1My0xLjUyLTIuMzcxLTEuMTA2bDAsMGMtMC43MTcsMC40MTUtMC44MTgsMS41ODEtMC4yMjgsMi42MDUNCglMMjcuMDE4LDI5Ljc0OHoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMjcuMDE4LDI4LjM2MWMwLjU5MiwxLjAyNSwxLjY1MiwxLjUyLDIuMzcsMS4xMDZsMCwwDQoJYzAuNzE3LTAuNDE1LDAuODE5LTEuNTgxLDAuMjI4LTIuNjA2bC03Ljg1Ny0xMy42MDljLTAuNTkyLTEuMDI0LTEuNjUzLTEuNTItMi4zNzEtMS4xMDZsMCwwYy0wLjcxNywwLjQxNS0wLjgxOCwxLjU4MS0wLjIyOCwyLjYwNQ0KCUwyNy4wMTgsMjguMzYxeiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgY3g9IjMxIiBjeT0iMzEiIHI9IjQiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNjAsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzU0LDFoLTMuMjkzQzU2LjE1OCwzMiw1NiwzMS41NTIsNTYsMzENCglsMCwwYzAtMC41NTIsMC4xNTgtMSwwLjM1NC0xaDMuMjkzQzU5Ljg0MiwzMCw2MCwzMC40NDgsNjAsMzFMNjAsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTcsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzUzLDFIMy4zNTNDMy4xNTgsMzIsMywzMS41NTIsMywzMWwwLDANCgljMC0wLjU1MiwwLjE1OC0xLDAuMzUzLTFoMy4yOTRDNi44NDIsMzAsNywzMC40NDgsNywzMUw3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0zMSwzYzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDYuODQyLDMxLjU1Myw3LDMxLDdsMCwwDQoJYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1M1YzLjM1M0MzMCwzLjE1OCwzMC40NDgsMywzMSwzTDMxLDN6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTMxLDU1YzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDU4Ljg0MiwzMS41NTMsNTksMzEsNTkNCglsMCwwYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1NHYtMy4yOTRDMzAsNTUuMTU4LDMwLjQ0OCw1NSwzMSw1NUwzMSw1NXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNDksMzEuNDk5QzQ5LDMwLjY3Miw0OC40MDQsMzAsNDcuNjY4LDMwSDM0LjMzMw0KCUMzMy41OTYsMzAsMzMsMzAuNjcxLDMzLDMxLjVsMCwwYzAsMC44MjgsMC41OTYsMS41LDEuMzMzLDEuNWgxMy4zMzVDNDguNDA0LDMzLDQ5LDMyLjMyOCw0OSwzMS40OTlMNDksMzEuNDk5eiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YxNjE1NSIgY3g9IjMxIiBjeT0iMzEiIHI9IjIiLz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRjhCNDUwIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGQ0U2RCIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA4LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDgsMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGNEE2M0MiIGQ9Ik0zMS41MTQsMTNDMjUuNzA0LDEzLDIxLDE3Ljc0NiwyMSwyMy42MTMNCgljMCw0LjY2LDIuOTc2LDguNjI5LDcuMTEzLDEwLjAzOHYxOS4yMTRMMzEuNDg2LDU2TDM0LDUzdi0xbC0xLjA5OC0xLjQzN0wzNSw0OXYtMWwtMi0ydi0xbDItMXYtMWwtMi0xbDItNHYtNA0KCWM0LjA1My0xLjQ2Nyw3LTUuNzg0LDctMTAuMzg3QzQyLDE3Ljc0NiwzNy4yOTUsMTMsMzEuNTE0LDEzeiBNMjksNTFWMzRoMXYxOEwyOSw1MXogTTMxLjUsMjNjLTEuOTIxLDAtMy41LTEuNTUyLTMuNS0zLjQ4Mw0KCUMyOCwxNy41NTIsMjkuNTc4LDE2LDMxLjUsMTZjMS45MjIsMCwzLjUsMS41NTIsMy41LDMuNTE3QzM1LDIxLjQ0OCwzMy40MjIsMjMsMzEuNSwyM3oiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMzEuNTE0LDEyQzI1LjcwNCwxMiwyMSwxNi43NDYsMjEsMjIuNjEzDQoJYzAsNC42NiwyLjk3Niw4LjYyOSw3LjExMywxMC4wMzh2MTkuMjE0TDMxLjQ4Niw1NUwzNCw1MnYtMWwtMS4wOTgtMS40MzdMMzUsNDh2LTFsLTItMnYtMWwyLTF2LTFsLTItMWwyLTR2LTQNCgljNC4wNTMtMS40NjcsNy01Ljc4NCw3LTEwLjM4N0M0MiwxNi43NDYsMzcuMjk1LDEyLDMxLjUxNCwxMnogTTI5LDUwVjMzaDF2MThMMjksNTB6IE0zMS41LDIyYy0xLjkyMSwwLTMuNS0xLjU1Mi0zLjUtMy40ODMNCglDMjgsMTYuNTUyLDI5LjU3OCwxNSwzMS41LDE1YzEuOTIyLDAsMy41LDEuNTUyLDMuNSwzLjUxN0MzNSwyMC40NDgsMzMuNDIyLDIyLDMxLjUsMjJ6Ii8+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNzJweCIgaGVpZ2h0PSI3MnB4IiB2aWV3Qm94PSIwIDAgMTQyLjIyIDE0Mi4yMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTQyLjIyIDE0Mi4yMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8Y2lyY2xlIG9wYWNpdHk9IjAuNDMiIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBjeD0iNzEuMTEiIGN5PSI3MS4xMSIgcj0iNzEuMTEiLz4NCjxwb2x5Z29uIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBwb2ludHM9IjU0LjQyMywxMDQuNTk0IDEwNS43OTgsNzAuNzc0IDU0LjQyMywzNy42MjYgIi8+DQo8L3N2Zz4=", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACHDwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKNWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAASMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEoqGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAGeIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gzSZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25qbc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9CvjcM4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjKuLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqxOPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIWiAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFVSAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAyrA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYghUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7rh2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SEdJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3JaSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQtlHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJy5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hopb2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsyu21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCccNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527PYS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOwEaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6sfaznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy+rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVsS1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9UxlfeqXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/wjowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9Vt1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503rm10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7Pnl/eriQvLDwG/eE8/s6uL5TAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAAGnRFWHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS4xMDD0cqEAAABfSURBVChTY/j//z8DMZgoRSCD4ApLK6rYgLgDiJ9CMYjNBrMNWWHnvAUL/3/4+BGMQWygwk5sCp+CFMDAhw8fQAqfYlcIlCRGYeeceQv+g0wCYRAbl9XEeYZQWBIdjgCVaiC8JN1udgAAAABJRU5ErkJggg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAACuSURBVHicY/n//z8DCLh7+/sAqWIgNmGAgDNA3Ltz68YtIA4LVFELkKpmQAUOIAyUawUqrmEBMnyxKEIG1UA1J0EmFsFELC3MGfJzssDsSVOnMxw7fgImVQRSaAzjgRQJCgqA2XnZmcgKjVnwWIkCWKC+cwRxJk6eypCfm80AYyOBMyCF/TCFx0+eAmMsoJ8F6PXNoCBgwO1zUPBsBrsRFE5AxSCXFzKgBng/LMABrBM9cyiwScIAAAAASUVORK5CYII=", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAZCAYAAABtnU33AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAETSURBVHic7ZgxCsJAFAUXSaeIpScQDyCCguA5rEUQEbWzsvACKhICaquHUQu18hxi6vgebCSgwSb5C2sGhpBkIX+aZIkTBIHS1OAI1mFR2cEDHuEKnnnB0TeGcAlzZuZKjTKswA4cwzWDW8rO2ChsY+OFwVNld2wIG6cMbpqeRJAmg0umpxCk5PxeYxdZsO1kwbaTBdvOXwb7MG96ECF8Bt9gw/QkQlwZ7Kr/CXYZvIdt2DU7S+rs4CF8afXgCU5g1dhI6XCHC7jlSRjM/zwbbUGbJDPY/7HGg/OEn/vUvvn2WfpYlAADfYyL9vSaIOZ+Ykh9hxkSFy0WSyQ3Ht+iRWOJ9E4rGq2UcCwxsbWMRovGkhc6FTEV3QXLmAAAAABJRU5ErkJggg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAElJREFUSEvt0qERAEAIA0H6b5rXL1ecI5qQOcIsanB+3TC5egZOyJm9B2Zgw0EnF+AeekPC+S3tGTjhoJMLcA+9IeG89+6L04QHtFKarLFAHLUAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAFBJREFUSEvtkjEKADAIA/PpQunnWzo63nBbBDdjOGPWPpd0yPCf5YLo5TNgB52Z54AZsKDQygVwDr5A4RxLfQbsUGjlAjgHX6Bw9r394KjDAzeSX574b7LUAAAAAElFTkSuQmCC", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NzA3MjgiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjMzNjc2NjQiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjkxNDI4IDAuNjkxNDI4LDAuNjkxNDI4IDAuNjkxNDI4LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTcwNzA0IiBjbGFzcz0iZmlsMSIgZD0iTTAuMzQ1NzM2IDAuMTU3MTg4bC0wLjEyNTcyMiAwLjA5NDI2NDkgLTAuMDk0MzAwNiAwIDAgMC4xODg1ODMgMC4wOTQzMDA2IDAgMC4xMjU3MjIgMC4wOTQyNjQ5IDAgLTAuMzc3MTEzem0wLjE1NzExNyAtMi42NzI2N2UtMDA1bDAuMDMxNDMwNiAwIDAgMC4zNzcxNCAtMC4wMzE0MzA2IDAgMCAtMC4zNzcxNHptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjI1MTQwOSAtMC4wMzE0MzA2IDAgMCAtMC4yNTE0MDl6bS0wLjA2Mjg0MzMgMC4wNjI4NjExbDAuMDMxNDMwNiAwIDAgMC4xMjU2ODcgLTAuMDMxNDMwNiAwIDAgLTAuMTI1Njg3eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NjkwMjQiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjE5NjkyNDAiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjQzNjE2IDAuNjQzNjE2LDAuNjQzNjE2IDAuNjQzNjE2LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY5MDAwIiBjbGFzcz0iZmlsMSIgZD0iTTAuMzIxODM3IDAuMTQ2MzAybC0wLjExNzAyOSAwLjA4Nzc0NjYgLTAuMDg3Nzc5NyAwIDAgMC4xNzU1NDMgMC4wODc3Nzk3IDAgMC4xMTcwMjkgMC4wODc3NDY2IDAgLTAuMzUxMDM2em0wLjI3NzkwMSAwLjI1MDcyNmwtMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjA5MzA4NzIgLTAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjAyMDY5MDYgLTAuMDIwNjkwNiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAwLjAyMDY5MDYgLTAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MnoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxwYXRoIGNsYXNzPSJmaWwwIiBkPSJNLTAgMC4yNzExMDFsMCAxLjczOTM1YzAsMC4xNDkxMTMgMC4xMjE5ODgsMC4yNzExMDEgMC4yNzExMDEsMC4yNzExMDFsMy4xNTEzMSAwIDAgLTIuMjgxNTUgLTMuMTUxMzEgMGMtMC4xNDkxMTMsMCAtMC4yNzExMDEsMC4xMjE5ODggLTAuMjcxMTAxLDAuMjcxMTAxeiIvPg0KICA8cG9seWdvbiBjbGFzcz0iZmlsMSIgcG9pbnRzPSIxLjQwOTIsMC42NzEwMzggMi4wODAyOCwxLjE0MDc3IDEuNDA5MiwxLjYxMDUxICIvPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIxOTY2NTUyIj4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NzY4IiBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMzIzOTU2bDAgMi4wNzg0NmMwLDAuMTc4MTg1IDAuMTQ1NzcxLDAuMzIzOTU2IDAuMzIzOTU2LDAuMzIzOTU2bDMuNzY1NzEgMCAwIC0yLjcyNjM4IC0zLjc2NTcxIDBjLTAuMTc4MTg1LDAgLTAuMzIzOTU2LDAuMTQ1NzcxIC0wLjMyMzk1NiwwLjMyMzk1NnoiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NTI4IiBjbGFzcz0iZmlsMSIgZD0iTTEuNjAzOCAwLjg4MjAzOGwwLjMyMDc1MSAwIDAgMC45NjIyNTQgLTAuMzIwNzUxIDAgMCAtMC45NjIyNTR6bTAuNTYxMzMyIDBsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAhCAYAAAAYucG/AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAA+SURBVHicY/H09pViYQACFi4uLgYWbm5uOAHncsG4/Pz8xKv79u0bA8vXr1/hBJz7Dcb9+PEjIXVzZs18BgAgpy6CcHz1VgAAAABJRU5ErkJggg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsLW9wYWNpdHk9IjAiIGQ9Ik01MSw0LjA0MXYyNS45MThDNTEsMzIuMTgyLDQ5LjE4MiwzNCw0Ni45NiwzNEgwVjBoNDYuOTZDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDENCgkJCUw1MSw0LjA0MXoiLz4NCgkJPHBhdGggaWQ9Il8xMjMzNzQxNDQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xOCwxNS43MzdsMi41MjYtMi41MjZsMy4zNjksMy4zNjlsMS42ODQtMS42ODVsLTMuMzY4LTMuMzY4TDI0LjczNiw5aC01LjA1M0gxOHYxLjY4NA0KCQkJVjE1LjczN3ogTTM0LDE4LjI2NGwtMi41MjcsMi41MjVsLTMuMzY4LTMuMzY4bC0xLjY4NSwxLjY4NWwzLjM2OSwzLjM2N0wyNy4yNjMsMjVoNS4wNTNIMzR2LTEuNjg1VjE4LjI2NHoiLz4NCgk8L2c+DQo8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMTAyIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjRkVGRUZFIiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMDUxIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjOTY5Njk2IiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTNweCIgaGVpZ2h0PSIyMXB4IiB2aWV3Qm94PSIwIDAgMTMgMjEiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5CYWNrLUFycm93PC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9ImlQaG9uZS1YLUNvdXJzZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyLjAwMDAwMCwgLTU2LjAwMDAwMCkiIGZpbGw9IiMzREEwRTEiPgogICAgICAgICAgICA8cGF0aCBkPSJNMjEuOTA2MzgyOCw1Ni45ODk5NDk1IEwxMiw2Ni41IEwyMS45MDYzODI4LDc2LjAxMDA1MDUgQzIyLjQ4MjU4NSw3Ni41NjMyMDAyIDIzLjM5MjU5Miw3Ni41NjMyMDAyIDIzLjk2ODc5NDMsNzYuMDEwMDUwNSBMMjMuOTY4Nzk0Myw3Ni4wMTAwNTA1IEMyNC41MTU1MjgzLDc1LjQ4NTE5MDEgMjQuNTMzMjYwMyw3NC42MTY0OTEyIDI0LjAwODM5OTksNzQuMDY5NzU3MiBDMjMuOTk1NDY4OSw3NC4wNTYyODcyIDIzLjk4MjI2NDIsNzQuMDQzMDgyNiAyMy45Njg3OTQzLDc0LjAzMDE1MTUgTDE2LjEyNDgyMjksNjYuNSBMMjMuOTY4Nzk0Myw1OC45Njk4NDg1IEMyNC41MTU1MjgzLDU4LjQ0NDk4ODEgMjQuNTMzMjYwMyw1Ny41NzYyODkyIDI0LjAwODM5OTksNTcuMDI5NTU1MiBDMjMuOTk1NDY4OSw1Ny4wMTYwODUyIDIzLjk4MjI2NDIsNTcuMDAyODgwNiAyMy45Njg3OTQzLDU2Ljk4OTk0OTUgTDIzLjk2ODc5NDMsNTYuOTg5OTQ5NSBDMjMuMzkyNTkyLDU2LjQzNjc5OTggMjIuNDgyNTg1LDU2LjQzNjc5OTggMjEuOTA2MzgyOCw1Ni45ODk5NDk1IFoiIGlkPSJCYWNrLUFycm93Ij48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4="]; +c=".popup-layer {top: 0;right: 0;bottom: 0;left: 0;z-index: 1;position: absolute;border-radius: inherit; }.modal-layer {background: #000000;opacity: 0.4;position: absolute;width: 100%;height: 100%;border-radius: inherit; }:root {--page-background-color: __pageBackground__;--button-background-color: __primaryButtonBackground__;--button-hover-background-color: __primaryButtonBackgroundHover__;--button-hover-text-color: __primaryButtonTextHover__;--button-text-color: __primaryButtonText__;--company-logo-background-color: __asideLogoBackground__;--font-family-bold: PFnb;--font-family-bold-italic: PFnbi;--font-family-italic: PFni;--font-family-normal: PFn;--font-family-semibold: PFnsb, PFn;--font-family-semibold-italic: PFnsbi, PFni;--hyperlink-text-color: __hyperlink__;--list-item-background-hover-color: __asideElementBackgroundHover__;--list-item-background-pressed-color: __asideElementBackgroundActive__;--list-item-text-hover-color: __asideElementTextHover__;--list-item-text-pressed-color: __asideElementTextActive__;--list-item-text-visited-color: __asideElementTextVisited__;--panel-color: __asideBackground__;--panel-text-color: __asideElementText__;--panel-video-stub-background-color: __panelVideoStubBackgroundColor__;--panel-video-stub-color: __panelVideoStubColor__;--player-background-color: __playerBackground__;--progressbar-background-color: __progressBackground__;--progressbar-playback-color: __progressPlayback__;--slide-border-color: __slideBorder__;--text-color: __playerText__;--topbar-hover-background-color: __secondaryButtonBackgroundHover__;--topbar-text-color: __secondaryButtonText__;--primary-button-text-color: __primaryButtonText__;--primary-button-text-color-active: __primaryButtonTextHover__;--primary-button-background-color-active: __primaryButtonBackgroundHover__;--primary-button-background-color: __primaryButtonBackground__;--primary-button-border-color: __primaryButtonBorder__;--primary-button-border-color-active: __primaryButtonBorderHover__;--secondary-button-background-color: __secondaryButtonBackground__;--secondary-button-background-color-active: __secondaryButtonBackgroundHover__;--secondary-button-text-color: __secondaryButtonText__;--secondary-button-text-color-active: __secondaryButtonTextHover__;--secondary-button-border-color: __secondaryButtonBorder__;--secondary-button-border-color-active: __secondaryButtonBorderHover__;--volume-control-background-color: __volumeControlBackgroundColor__;--volume-control-playback-color: __volumeControlPlaybackColor__;--volume-control-thumb-color: __volumeControlThumbColor__;--more-menu-volume-control-background-color: __moreMenuVolumeControlBackgroundColor__;--more-menu-volume-control-playbackColor: __moreMenuVolumeControlPlaybackColor__;--more-menu-volume-control-thumb-color: __moreMenuVolumeControlThumbColor__;--popup-background-color: __popupBackground__;--popup-transparent-background-color: __transparentPopupBackground__;--popup-border: __popupBorder__;--popup-background-hover-color: __popupBackgroundHover__;--popup-text-color: __popupText__;--popup-text-hover-color: __popupTextHover__;--link-button-background-color: transparent;--link-button-text-color: __linkButtonTextColor__;--player-text: __playerText__;--button-border-radius: __borderRadius__;--presenter-info-link-border-color: __presenterInfoLinkBorderColor__;--search-field-background-color: __searchFieldBackgroundColor__;--hovered-tab-background-color: __hoveredTabBackgroundColor__;--selected-tab-background-color: __selectedTabBackgroundColor__;--top-panel-icon-container-color: __topPanelIconContainerColor__;--mini-skin-menu-button-text: __miniSkinMenuButtonText__;--mini-skin-menu-button-background-active: __miniSkinMenuButtonBackgroundActive__;--mini-skin-top-bottom-panel-border: __miniSkinTopBottomPanelBorder__;--mini-skin-presenter-delimiter-color: __miniSkinPresenterDelimiterColor__;--top-bottom-panel-border-color: __topBottomPanelBorderColor__; }:root {--page-background-color: __pageBackground__;--button-background-color: __primaryButtonBackground__;--button-hover-background-color: __primaryButtonBackgroundHover__;--button-hover-text-color: __primaryButtonTextHover__;--button-text-color: __primaryButtonText__;--company-logo-background-color: __asideLogoBackground__;--font-family-bold: PFnb;--font-family-bold-italic: PFnbi;--font-family-italic: PFni;--font-family-normal: PFn;--font-family-semibold: PFnsb, PFn;--font-family-semibold-italic: PFnsbi, PFni;--hyperlink-text-color: __hyperlink__;--list-item-background-hover-color: __asideElementBackgroundHover__;--list-item-background-pressed-color: __asideElementBackgroundActive__;--list-item-text-hover-color: __asideElementTextHover__;--list-item-text-pressed-color: __asideElementTextActive__;--list-item-text-visited-color: __asideElementTextVisited__;--panel-color: __asideBackground__;--panel-text-color: __asideElementText__;--panel-video-stub-background-color: __panelVideoStubBackgroundColor__;--panel-video-stub-color: __panelVideoStubColor__;--player-background-color: __playerBackground__;--progressbar-background-color: __progressBackground__;--progressbar-playback-color: __progressPlayback__;--slide-border-color: __slideBorder__;--text-color: __playerText__;--topbar-hover-background-color: __secondaryButtonBackgroundHover__;--topbar-text-color: __secondaryButtonText__;--primary-button-text-color: __primaryButtonText__;--primary-button-text-color-active: __primaryButtonTextHover__;--primary-button-background-color-active: __primaryButtonBackgroundHover__;--primary-button-background-color: __primaryButtonBackground__;--primary-button-border-color: __primaryButtonBorder__;--primary-button-border-color-active: __primaryButtonBorderHover__;--secondary-button-background-color: __secondaryButtonBackground__;--secondary-button-background-color-active: __secondaryButtonBackgroundHover__;--secondary-button-text-color: __secondaryButtonText__;--secondary-button-text-color-active: __secondaryButtonTextHover__;--secondary-button-border-color: __secondaryButtonBorder__;--secondary-button-border-color-active: __secondaryButtonBorderHover__;--volume-control-background-color: __volumeControlBackgroundColor__;--volume-control-playback-color: __volumeControlPlaybackColor__;--volume-control-thumb-color: __volumeControlThumbColor__;--more-menu-volume-control-background-color: __moreMenuVolumeControlBackgroundColor__;--more-menu-volume-control-playbackColor: __moreMenuVolumeControlPlaybackColor__;--more-menu-volume-control-thumb-color: __moreMenuVolumeControlThumbColor__;--popup-background-color: __popupBackground__;--popup-transparent-background-color: __transparentPopupBackground__;--popup-border: __popupBorder__;--popup-background-hover-color: __popupBackgroundHover__;--popup-text-color: __popupText__;--popup-text-hover-color: __popupTextHover__;--link-button-background-color: transparent;--link-button-text-color: __linkButtonTextColor__;--player-text: __playerText__;--button-border-radius: __borderRadius__;--presenter-info-link-border-color: __presenterInfoLinkBorderColor__;--search-field-background-color: __searchFieldBackgroundColor__;--hovered-tab-background-color: __hoveredTabBackgroundColor__;--selected-tab-background-color: __selectedTabBackgroundColor__;--top-panel-icon-container-color: __topPanelIconContainerColor__;--mini-skin-menu-button-text: __miniSkinMenuButtonText__;--mini-skin-menu-button-background-active: __miniSkinMenuButtonBackgroundActive__;--mini-skin-top-bottom-panel-border: __miniSkinTopBottomPanelBorder__;--mini-skin-presenter-delimiter-color: __miniSkinPresenterDelimiterColor__;--top-bottom-panel-border-color: __topBottomPanelBorderColor__; }@keyframes preloader_spin {0% {transform: rotate(0deg); } 100% {transform: rotate(360deg); } }html,body {background-color: var(--page-background-color) !important; }.universal_mini {overflow: hidden;background: var(--player-background-color); } .universal_mini div {-webkit-tap-highlight-color: rgba(0, 0, 0, 0);-webkit-user-select: none;-ms-user-select: none;user-select: none;-webkit-touch-callout: none;-webkit-user-drag: none; } .universal_mini .launch-screen {z-index: 100;position: fixed;top: 0;right: 0;bottom: 0;left: 0;background-color: rgba(0, 0, 0, 0.48); } .universal_mini .launch-screen .launch-screen-button {top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 96px;height: 96px;position: absolute; } .universal_mini .launch-screen .launch-screen-button__play-icon {background-color: #FFFFFF;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 90px;height: 90px;box-shadow: 0 12px 50px 0 rgba(0, 0, 0, 0.2);transition: 0.3s ease-in-out; } .universal_mini .launch-screen .launch-screen-button__icon {background: url("+ +c[0]+") no-repeat center;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 6px;width: 90px;height: 90px; } .universal_mini .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__play-icon {width: 96px;height: 96px; } .universal_mini .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__icon {background: url("+c[1]+") no-repeat center; } .universal_mini .playerView {-ms-transform: translateX(0);transform: translateX(0); } .universal_mini.not_loaded .top-panel, .universal_mini.not_loaded .bottom-panel, .universal_mini.not_loaded .landscape-bottom-panel {display: none; } .universal_mini:not(.landscape) .landscape-bottom-panel {display: none; } .universal_mini.landscape > .bottom-panel {display: none; } .universal_mini.landscape > .top-panel {display: none !important; } .universal_mini.landscape.quiz_mode .top-panel, .universal_mini.landscape.quiz_mode .landscape-bottom-panel {display: initial; } .universal_mini.landscape.quiz_mode > .bottom-panel {display: none; } .universal_mini > .top-panel {width: 100%;background: var(--player-background-color);position: absolute;box-sizing: border-box;box-shadow: 0 1px 0 var(--mini-skin-top-bottom-panel-border);height: 52px;top: 0; } .universal_mini > .top-panel::before, .universal_mini > .top-panel::after {top: 100%; } .universal_mini > .top-panel .menu {cursor: pointer;position: absolute;top: 6px;right: 12px;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: center;align-items: center;padding: 8px;background: transparent;color: var(--mini-skin-menu-button-text);border-radius: var(--button-border-radius); } .universal_mini > .top-panel .menu.menu_active {background: var(--mini-skin-menu-button-background-active);color: var(--text-color); } .universal_mini > .top-panel .slide-info {font-family: var(--font-family-bold);width: 100%;position: absolute;font-size: 17px;line-height: 52px;text-align: center;color: var(--text-color);text-overflow: ellipsis;overflow: hidden;white-space: nowrap;z-index: 1;pointer-events: none; } .universal_mini > .bottom-panel {width: 100%;background: var(--player-background-color);position: absolute;box-sizing: border-box;bottom: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;padding: 0 12px;height: 56px;top: auto; } .universal_mini > .bottom-panel .navigation-controls {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .universal_mini > .bottom-panel > button:not(:first-child) {margin-left: 12px; } .universal_mini > .bottom-panel .navigation-controls {margin-left: auto; } .universal_mini > .bottom-panel .navigation-controls button:not(:first-child) {margin-left: 12px; } .universal_mini > .bottom-panel.bottom-panel_with-border {border-top: 1px solid var(--mini-skin-top-bottom-panel-border); } .universal_mini > .bottom-panel .rate-menu-popup {background: var(--popup-background-color);border: 1px solid var(--popup-border);box-shadow: 0 20px 32px rgba(0, 0, 0, 0.16);-webkit-backdrop-filter: blur(8px);backdrop-filter: blur(8px);border-radius: 10px;position: absolute; } .universal_mini > .progress {position: absolute;top: auto;left: 0;height: 2px;background: var(--progressbar-background-color); } .universal_mini > .progress > .playback-progress {position: absolute;top: 0;left: 0;width: 0;height: 100%;background: var(--progressbar-playback-color); } .universal_mini > .landscape-bottom-panel {width: 100%;background: var(--player-background-color);position: absolute;box-sizing: border-box;bottom: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;right: 0;top: 0;width: 52px;-ms-flex-direction: column;flex-direction: column;align-items: center;padding: 16px 0;border-left: 1px solid rgba(97, 104, 112, 0.1); } .universal_mini > .landscape-bottom-panel .navigation-controls {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .universal_mini > .landscape-bottom-panel > button:not(:last-child) {margin-bottom: 12px; } .universal_mini > .landscape-bottom-panel .navigation-controls {margin-top: auto;-ms-flex-direction: column;flex-direction: column; } .universal_mini > .landscape-bottom-panel .navigation-controls button:not(:first-child) {margin-top: 12px; } .universal_mini > .landscape-bottom-panel .rate-menu-popup {background: var(--popup-background-color);border: 1px solid var(--popup-border);box-shadow: 0 20px 32px rgba(0, 0, 0, 0.16);-webkit-backdrop-filter: blur(8px);backdrop-filter: blur(8px);border-radius: 10px;position: absolute; } .universal_mini #playerView {border: 1px solid rgba(0, 0, 0, 0.04); } .universal_mini.quiz_mode {overflow: visible;height: auto !important; } .universal_mini.quiz_mode #playerView, .universal_mini.quiz_mode .video-container {display: none; } .universal_mini.quiz_mode.interaction_slide .bottom-panel {box-shadow: 0 -2px 12px 0 rgba(0, 0, 0, 0.1);position: fixed;bottom: 0 !important; } .universal_mini.quiz_mode.interaction_slide .bottom-panel .play, .universal_mini.quiz_mode.interaction_slide .bottom-panel .progress-bar {display: none; } .universal_mini.quiz_mode .top-panel {position: fixed;top: -1px;height: 52px; } .universal_mini.quiz_mode .top-panel .slide-info {top: 1px; } .universal_mini.quiz_mode .top-panel .menu.component_container {top: 1px;height: 52px; } .universal_mini, .universal_mini > div {position: absolute;top: 0; } .universal_mini .launch_layer {width: 100%;height: 100%;background: url("+ +c[0]+") no-repeat center;background-color: rgba(0, 0, 0, 0.75); } .universal_mini .launch_layer:active {background-image: url("+c[1]+"); } .universal_mini .launch_layer[disabled], .universal_mini .launch_layer:active[disabled] {background-image: none; } .universal_mini .video-container video {position: absolute; } .universal_mini .change-layout-button {width: 44px;height: 44px;border-radius: 100%;background: #333333;position: absolute;left: 10px;bottom: 10px;border: 1px solid rgba(255, 255, 255, 0.3);box-sizing: border-box; } .universal_mini .change-layout-button::after {content: '';position: absolute;width: 20px;height: 20px;background: url("+ +c[2]+");background-size: cover;margin: auto;top: 0;left: 0;bottom: 0;right: 0; } .universal_mini .preloader {width: 50px;height: 50px;position: absolute;top: 0;left: 0;bottom: 0;right: 0;margin: auto;border-radius: 10px;background-color: rgba(0, 0, 0, 0.5); } .universal_mini .preloader::after {content: '';position: absolute;background: url("+c[3]+");background-size: cover;top: 0;left: 0;bottom: 0;right: 0;animation: preloader_spin 1s infinite linear; } .universal_mini .menu_layer {position: absolute;background: var(--panel-color);z-index: 10; } .universal_mini .menu_layer .menu-layer-top-panel {position: absolute;height: 52px;background: var(--panel-color);display: block;z-index: 1; } .universal_mini .menu_layer .menu-layer-top-panel .tab-title {font-family: var(--font-family-bold);position: absolute;color: var(--panel-text-color);left: 0;top: 0;width: 100%;height: 52px;font-size: 18px;line-height: 52px;text-align: center;text-overflow: ellipsis;overflow: hidden;white-space: nowrap;pointer-events: none; } .universal_mini .menu_layer .menu-layer-top-panel .search-button, .universal_mini .menu_layer .menu-layer-top-panel .close-button, .universal_mini .menu_layer .menu-layer-top-panel .back-button {position: absolute;top: 0;cursor: pointer; } .universal_mini .menu_layer .menu-layer-top-panel > .search-button, .universal_mini .menu_layer .menu-layer-top-panel > .close-button, .universal_mini .menu_layer .menu-layer-top-panel > .back-button {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;padding: 8px 8px;color: var(--panel-text-color);background: transparent; } .universal_mini .menu_layer .menu-layer-top-panel > .search-button {top: 6px;left: 12px; } .universal_mini .menu_layer .menu-layer-top-panel > .close-button {top: 6px;right: 12px; } .universal_mini .menu_layer .menu-layer-top-panel > .back-button {top: 6px;left: 12px; } .universal_mini .menu_layer .menu-layer-top-panel.with_search .back {right: 44px; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel {position: absolute;background: var(--player-background-color);top: 0;right: 0;bottom: 0;left: 0;z-index: 1;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;padding: 8px 12px;box-shadow: 0 1px 0 var(--mini-skin-top-bottom-panel-border); } .universal_mini .menu_layer .menu-layer-top-panel .search_panel__cancel-button {cursor: pointer; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel__search-icon {width: 24px;height: 24px;margin: 6px 8px;color: var(--text-color);-ms-flex-negative: 0;flex-shrink: 0; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel__cancel-button {width: 24px;height: 24px;margin: 6px 8px;color: var(--text-color);-ms-flex-negative: 0;flex-shrink: 0; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel .search_input {font-family: var(--font-family-normal);-ms-flex-positive: 1;flex-grow: 1;border: none;height: 100%;font-size: 15px;line-height: 20px;color: var(--text-color);background: transparent;min-width: 0; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel .search_input:-ms-input-placeholder {opacity: 0.4; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel .search_input::placeholder {opacity: 0.4; } .universal_mini .menu_layer.tab_control .content.component_container {bottom: 56px; } .universal_mini .menu_layer.tab_control .bottom-panel {position: absolute;bottom: 0;height: 56px;background: var(--player-background-color);box-shadow: 0 -1px 0 var(--mini-skin-top-bottom-panel-border);box-sizing: border-box;padding: 7px 12px;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .universal_mini .menu_layer.tab_control .bottom-panel .menu-tab-button {font-family: var(--font-family-normal);cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: center;align-items: center;background: transparent;color: var(--text-color);font-size: 12px;line-height: 16px;opacity: 0.4; } .universal_mini .menu_layer.tab_control .bottom-panel .menu-tab-button[aria-selected='true'] {opacity: 1; } .universal_mini .menu_layer.tab_control .bottom-panel .menu-tab-button__text {margin-top: 2px; } .universal_mini .menu_layer .content.component_container {position: absolute;top: 64px;bottom: 0;width: 100%; } .universal_mini .menu_layer .content.component_container.animation .content.component_base > div {position: absolute; } .universal_mini .menu_layer .content.component_container .content.component_base {width: 100%;position: relative; } .universal_mini .menu_layer .content.component_container .content.component_base .search-result-layout .result-label {font-family: var(--font-family-bold);margin-top: 28px;margin-left: 20px;font-size: 16px;line-height: 22px;color: var(--panel-text-color); } .universal_mini .menu_layer .content.component_container .content.component_base .search-result-layout .no-matches-label {font-family: var(--font-family-normal);font-size: 15px;line-height: 20px;color: var(--panel-text-color);opacity: 0.6;text-align: center;margin-top: 80px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .separator {background: rgba(0, 0, 0, 0.08);position: relative;width: calc(100% - 20px);height: 1px;left: 10px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .separator:first-child {position: absolute;top: -1px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .separator:last-child {position: absolute;bottom: -1px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list {position: relative; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list.slides_list_highlight-visited .item.visited:not(.active):not(.selected) {color: var(--list-item-text-visited-color); } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative;min-height: 76px;color: var(--panel-text-color);margin-bottom: 1px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.level1 {padding-left: 24px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.level2 {padding-left: 48px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.level3 {padding-left: 72px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.level4 {padding-left: 96px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item .image {float: left;margin: 10px 16px 10px 20px;border-radius: 4px;border: 1px solid rgba(0, 0, 0, 0.04);box-sizing: content-box;max-height: 56px;max-width: 100px;-ms-flex-negative: 0;flex-shrink: 0; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item .text {font-family: var(--font-family-normal);position: relative;margin: 0;padding-right: 10px;padding-bottom: 1px;font-size: 14px;line-height: 18px;word-break: break-word;max-height: 54px;overflow: hidden;text-overflow: ellipsis;flex-grow: 1;display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item .text .highlighted {font-family: var(--font-family-bold); } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item .text .search-context {opacity: 0.6; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.text_only .text {padding-left: 13px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.active, .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.selected {background: var(--list-item-background-pressed-color);color: var(--list-item-text-pressed-color); } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.parent::before {content: '';position: absolute;top: 0;bottom: 0;right: 19px;width: 8px;height: 12px;margin: auto;background: url("+ +c[4]+");background-size: contain;background-repeat: no-repeat; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.parent .text {padding-right: 25px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: center;align-items: center; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .top-container {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: center;align-items: center;background-color: transparent;padding: 8px 24px 28px;margin: 0 24px;width: 100%;box-sizing: border-box; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .top-container .name, .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .top-container .job {word-wrap: break-word;position: relative;text-align: center; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .top-container .name {font-family: var(--font-family-bold);color: var(--panel-text-color);font-size: 24px;line-height: 28px;margin-bottom: 8px;margin-top: 16px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .top-container .job {font-family: var(--font-family-normal);color: var(--panel-text-color);opacity: 0.72;font-size: 14px;line-height: 18px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bottom-container {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: center;align-items: center;padding: 28px 0;margin: 0 24px;color: var(--panel-text-color);box-sizing: border-box;width: calc(100% - 48px);border-top: 1px solid var(--mini-skin-presenter-delimiter-color); } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bottom-container a {color: var(--panel-text-color); } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bottom-container .item {font-family: var(--font-family-normal);display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: flex-start;width: 100%;color: var(--panel-text-color); } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bottom-container .item .item-icon {margin-right: 8px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bottom-container .item .bottom-container-text {font-size: 15px;line-height: 20px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bottom-container .item:not(:last-child) {margin-bottom: 16px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .photo_container {position: relative;width: 80px;height: 80px;border-radius: 100%; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .name_photo_container {width: 75px;height: 75px;background: #9EAEB9;border-radius: 100%;left: 0;right: 0;margin: auto;margin-bottom: 10px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .name_photo_container .letter {font-size: 24px;line-height: 75px;text-align: center;color: #FFFFFF;font-family: Helvetica Neue, Helvetica, Roboto, Arial; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .no_presenter_container {margin-bottom: 10px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .no_presenter_photo {width: 106px;height: 134px;background: url("+ +c[5]+"); } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .no_presenter_label {position: relative;font-family: Helvetica Neue, Helvetica, Roboto, Arial;font-size: 15px;color: var(--panel-text-color);padding: 0 40px;text-align: center; } .universal_mini .menu_layer .content.component_container .content.component_base .notes {font-family: var(--font-family-normal);padding: 12px 24px;font-size: 15px;line-height: 20px;color: var(--panel-text-color);width: auto !important;white-space: pre-wrap;word-wrap: break-word; }body {margin: 0;padding: 0;cursor: default;-ms-touch-action: pan-y;touch-action: pan-y;overflow-y: auto; } body .info_panel {position: relative;top: 0;background: #FFFFFF;font-family: Helvetica, Roboto, Arial;padding-top: 161px;padding-bottom: 50px; } body .info_panel, body .info_panel * {box-sizing: border-box; } body .info_panel.domain::before {background: transparent url("+ +c[6]+") no-repeat center; } body .info_panel.time::before {background: transparent url("+c[7]+") no-repeat center; } body .info_panel.password::before {background: transparent url("+c[8]+") no-repeat center; } body .info_panel::before {position: absolute;width: 100%;top: 55px;height: 63px;content: ''; } body .info_panel .message {position: relative;color: #414A5B;font-size: 16px;padding-left: 15px;padding-right: 15px;text-align: center; } body .password .password_field {position: relative;margin-left: 20px;margin-right: 20px;padding-top: 23px;padding-bottom: 26px; } body .password .password_field input {position: relative;width: 100%;height: 34px;border: 1px solid #D6D6D6;border-top: 1px solid #BABABA;padding-left: 8px;font-size: 20px; } body .password .wrong_password_label {position: absolute;font-size: 12px;color: #DD4A37;left: 22px;right: 22px;margin-top: -21px; } body .ok.component_container {position: fixed;bottom: 0;height: 50px;background: #434E50; } body .ok.component_container.active {background: #637375; } body .ok.component_container button {top: 0;bottom: 0;left: 0;width: 100%;position: absolute;background: transparent;border: 0;line-height: 50px;color: #E2E2E2;font-size: 16px; } body .ok.component_container button[disabled] {color: #647577; }.launch-screen {z-index: 999 !important; }.component_base,.component_container {position: absolute; }:focus {outline: none; }::-moz-focus-inner {border: 0; }input {-webkit-appearance: none;appearance: none; }button {cursor: pointer;margin: 0;border: 0; }button[disabled] {cursor: default; }.__player_view_id__ > * {position: absolute; }.__player_view_id__ .slide {white-space: nowrap;font-size: 0; } .__player_view_id__ .slide a {text-decoration: none;cursor: pointer; } .__player_view_id__ .slide a img {border: 0; } .__player_view_id__ .slide * {-ms-transform-origin: 0 0;transform-origin: 0 0; } .__player_view_id__ .slide.relpos, .__player_view_id__ .slide .relpos {position: relative !important;vertical-align: top; } .__player_view_id__ .slide.kern, .__player_view_id__ .slide .kern {text-rendering: optimizeLegibility;font-feature-settings: 'kern' 1, 'liga' 0; } .__player_view_id__ .slide.nokern, .__player_view_id__ .slide .nokern {text-rendering: optimizeSpeed;font-feature-settings: 'kern' 0, 'liga' 0; }.__player_view_id__ .fullscreen {-ms-transform: none !important;transform: none !important;top: 0 !important;left: 0 !important; } .__player_view_id__ .fullscreen > video {background-color: black;width: __slide_width__ !important;height: __slide_height__ !important;z-index: 100; }.__player_view_id__ .video_player video {width: 100%;height: 100%; } .__player_view_id__ .video_player video::cue {color: #FFFFFF;background-color: rgba(8, 8, 8, 0.75);border-radius: 4px;font-family: Helvetica, Roboto, Arial;line-height: 1.1; }.__player_view_id__ .video_player.iphone::after {background: rgba(0, 0, 0, 0) url("+ +c[9]+") no-repeat center;position: absolute;width: 100%;height: 100%;top: 0;right: 0;content: ''; }.__player_view_id__ .video_player.iphone video {opacity: 0; }.__player_view_id__ .video_player.iphone.without_controls video {display: none; }.__player_view_id__ .video_player .controls {height: 36px;background: rgba(45, 50, 55, 0.85098);border: 1px solid #444648;cursor: default;border-radius: 4px; } .__player_view_id__ .video_player .controls .progress {background-color: #75787A;height: 14px;left: 62px;top: 0;bottom: 0;margin-top: auto;margin-bottom: auto;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark {width: 10px;height: 10px;margin-top: -5px;margin-left: -5px;top: 50%;background: url("+ +c[10]+") no-repeat;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark:hover, .__player_view_id__ .video_player .controls .progress .bookmark:active {background: url("+c[11]+") no-repeat; } .__player_view_id__ .video_player .controls .progress .loading {background-color: #B1B3B5;height: 100%; } .__player_view_id__ .video_player .controls .progress .playing {background-color: #FFFFFF;height: 100%; } .__player_view_id__ .video_player .controls .progress .tooltip {background: url("+ +c[12]+") no-repeat;width: 60px;height: 25px;top: -33px;margin-left: -30px;font-family: Helvetica, Roboto, Arial;font-size: 12px;padding-top: 2px;text-align: center; } .__player_view_id__ .video_player .controls .volume_popup {border-radius: 3px;background: rgba(45, 50, 55, 0.85098);top: -67px;right: 55px;padding: 8px; } .__player_view_id__ .video_player .controls .volume_popup .volume {background: url("+c[13]+");position: relative;cursor: pointer;width: 12px;height: 48px; } .__player_view_id__ .video_player .controls .volume_popup .volume .back {background: url("+ +c[14]+");width: 100%; } .__player_view_id__ .video_player .controls button {width: 100%;height: 100%; } .__player_view_id__ .video_player .controls button.mute {background: url("+c[15]+"); } .__player_view_id__ .video_player .controls button.mute:hover {background: url("+c[16]+"); } .__player_view_id__ .video_player .controls button.mute:active {background: url("+c[17]+"); } .__player_view_id__ .video_player .controls button.mute.selected {background: url("+c[18]+"); } .__player_view_id__ .video_player .controls button.mute.selected:hover {background: url("+ +c[19]+"); } .__player_view_id__ .video_player .controls button.mute.selected:active {background: url("+c[20]+"); } .__player_view_id__ .video_player .controls button.play {background: url("+c[21]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:hover {background: url("+c[22]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:active {background: url("+c[23]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected {background: url("+ +c[24]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:hover {background: url("+c[25]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:active {background: url("+c[26]+") no-repeat; } .__player_view_id__ .video_player .controls button.play::after {background: url("+c[27]+");width: 1px;height: 32px;right: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls button.toggle_fullscreen {background: url("+ +c[28]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:hover {background: url("+c[29]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:active {background: url("+c[30]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen::before {background: url("+c[27]+") no-repeat;width: 1px;height: 32px;left: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls .component_container.toggle_fullscreen, .__player_view_id__ .video_player .controls .component_container.play {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .component_container.toggle_fullscreen {right: -1px; } .__player_view_id__ .video_player .controls .component_container.mute {width: 22px;height: 22px;right: 58px;top: 6px; }.modal_layer {background: #000000;opacity: 0.7;z-index: 1;width: 100%;height: 100%; }.message_box,.confirm_window {border-radius: 4px;min-height: 150px;min-width: 300px;z-index: 1;background: #FFFFFF;position: absolute;width: 300px;top: 0;right: 0;bottom: 0;left: 0;margin: auto; } .message_box .title, .confirm_window .title {display: none !important; } .message_box .message, .confirm_window .message {padding: 34px 34px 24px 34px;font-size: 14px;line-height: 18px;color: #231F20;font-family: Helvetica, Roboto, Arial; }.message_box .btn_ok.component_container {padding-bottom: 24px;position: relative;text-align: center;height: 44px;width: 100%; } .message_box .btn_ok.component_container button {vertical-align: middle;line-height: 44px;height: 44px;padding-left: 20px;padding-right: 20px;min-width: 110px;margin-left: 5px;margin-right: 5px;position: static;-webkit-appearance: none;appearance: none;border: 0;border-radius: 4px;font-size: 16px;background: #339BE0;color: #FFFFFF; } .message_box .btn_ok.component_container button.active {background: #058ACC; }.confirm_window .buttons_panel {text-align: center;position: relative;padding-bottom: 24px;height: 44px;width: 100%; } .confirm_window .buttons_panel > div {width: 50%;float: right;position: relative; } .confirm_window .buttons_panel > div button {vertical-align: middle;line-height: 44px;height: 44px;padding-left: 20px;padding-right: 20px;min-width: 110px;margin-left: 5px;margin-right: 5px;position: static;-webkit-appearance: none;appearance: none;border: 0;border-radius: 4px;font-size: 16px;background: #339BE0;color: #FFFFFF; } .confirm_window .buttons_panel > div.active button {background: #058ACC; } .confirm_window .buttons_panel > div:only-child {width: 100%;text-align: center !important; } .confirm_window .buttons_panel > div:nth-child(1) {text-align: left; } .confirm_window .buttons_panel > div:nth-child(2) {text-align: right; }.back_to_app {height: 100%;position: absolute;left: 0; } .back_to_app__text {color: #3DA0E1;font-size: 16px;font-family: Helvetica Neue, Helvetica, Roboto, Arial;text-overflow: ellipsis;overflow: hidden;position: absolute;bottom: 0;top: 0;height: 24px;line-height: 24px;margin: auto;padding-left: 25px;max-width: 80px; } .back_to_app__text::before {content: '';background: url("+ +c[31]+") no-repeat center;height: 24px;width: 14px;left: 8px;position: absolute; }.trial_banner {position: relative;transform: translateZ(0); } .trial_banner .banner-content, .trial_banner .banner-content_hover {position: absolute;left: 0;right: 0;top: 0;bottom: 0;width: 100%;height: 100%; } .trial_banner .banner-content {visibility: visible;z-index: 1; } .trial_banner .banner-content_hover {visibility: hidden;z-index: 0; } .trial_banner .days_remaining {position: absolute;font-family: 'Open Sans', Arial, sans-serif;font-weight: normal;font-size: 13px;left: 65px;top: 41px;color: #7C1645;z-index: 1; } .trial_banner:hover .banner-content {visibility: hidden;z-index: 0; } .trial_banner:hover .banner-content_hover {visibility: visible;z-index: 1; }.popup_layer {z-index: 1; } .popup_layer .modal_layer {z-index: initial; }.framesLayer iframe {pointer-events: all; }.slide-transiting .quiz-uikit-primary-button {transition: none; }.slide-transiting .quiz-uikit-secondary-button {transition: none; }.slide-transiting .quiz-uikit-link-button {transition: none; }.slide-transiting .visuals-uikit-primary-button {transition: none; }.slide-transiting .visuals-uikit-secondary-button {transition: none; }.slide-transiting .visuals-uikit-link-button {transition: none; }.uikit-primary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-primary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-primary-button.uikit-primary-button_size_medium {padding: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:first-child {margin-left: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:last-child {margin-right: 10px; } .uikit-primary-button.uikit-primary-button_size_small {padding: 6px 12px; } .uikit-primary-button.uikit-primary-button_size_small .uikit-primary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-primary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__button-text {margin-right: 8px; } .uikit-primary-button__left-icon {margin-right: 8px; } .uikit-primary-button__button-text:first-child {margin-left: 0; } .uikit-primary-button__button-text:last-child {margin-right: 0; } .uikit-primary-button__left-icon:first-child {margin-left: 0; } .uikit-primary-button__left-icon:last-child {margin-right: 0; } .uikit-primary-button__right-icon:first-child {margin-left: 0; } .uikit-primary-button__right-icon:last-child {margin-right: 0; } .uikit-primary-button[disabled] {opacity: 0.4; } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-secondary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-secondary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-secondary-button.uikit-secondary-button_size_medium {padding: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:first-child {margin-left: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:last-child {margin-right: 10px; } .uikit-secondary-button.uikit-secondary-button_size_small {padding: 6px 12px; } .uikit-secondary-button.uikit-secondary-button_size_small .uikit-secondary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-secondary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__button-text {margin-right: 8px; } .uikit-secondary-button__left-icon {margin-right: 8px; } .uikit-secondary-button__button-text:first-child {margin-left: 0; } .uikit-secondary-button__button-text:last-child {margin-right: 0; } .uikit-secondary-button__left-icon:first-child {margin-left: 0; } .uikit-secondary-button__left-icon:last-child {margin-right: 0; } .uikit-secondary-button__right-icon:first-child {margin-left: 0; } .uikit-secondary-button__right-icon:last-child {margin-right: 0; } .uikit-secondary-button[disabled] {opacity: 0.4; } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-link-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-link-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-link-button.uikit-link-button_size_medium {padding: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text {font-size: 17px;line-height: 20px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:first-child {margin-left: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:last-child {margin-right: 10px; } .uikit-link-button.uikit-link-button_size_small {padding: 6px 12px; } .uikit-link-button.uikit-link-button_size_small .uikit-link-button__button-text {font-size: 14px;line-height: 20px; } .uikit-link-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__button-text {margin-right: 8px; } .uikit-link-button__left-icon {margin-right: 8px; } .uikit-link-button__button-text:first-child {margin-left: 0; } .uikit-link-button__button-text:last-child {margin-right: 0; } .uikit-link-button__left-icon:first-child {margin-left: 0; } .uikit-link-button__left-icon:last-child {margin-right: 0; } .uikit-link-button__right-icon:first-child {margin-left: 0; } .uikit-link-button__right-icon:last-child {margin-right: 0; } .uikit-link-button[disabled] {opacity: 0.4; } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-primary-button {background: var(--primary-button-background-color);color: var(--primary-button-text-color); } .uikit-primary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--primary-button-border-color);background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-primary-button__button-text {font-family: var(--font-family-bold);font-weight: 700; } .uikit-primary-button.uikit-primary-button_active, .uikit-primary-button[aria-pressed='true'], .uikit-primary-button:focus {background: var(--primary-button-background-color-active);color: var(--primary-button-text-color-active); } .uikit-primary-button.uikit-primary-button_active::after, .uikit-primary-button[aria-pressed='true']::after, .uikit-primary-button:focus::after {background: var(--primary-button-border-color-active);background-origin: border-box; }.uikit-secondary-button {background: var(--secondary-button-background-color);color: var(--secondary-button-text-color); } .uikit-secondary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--secondary-button-border-color);background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-secondary-button__button-text {font-family: var(--font-family-normal); } .uikit-secondary-button.uikit-secondary-button_active, .uikit-secondary-button[aria-pressed='true'], .uikit-secondary-button:focus {background: var(--secondary-button-background-color-active);color: var(--secondary-button-text-color-active); } .uikit-secondary-button.uikit-secondary-button_active::after, .uikit-secondary-button[aria-pressed='true']::after, .uikit-secondary-button:focus::after {background: var(--secondary-button-border-color-active);background-origin: border-box; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 15px; }.uikit-link-button {background: var(--link-button-background-color);color: var(--link-button-text-color);border: none; } .uikit-link-button.uikit-link-button_active, .uikit-link-button[aria-pressed='true'] {background: var(--link-button-background-color); }.uikit-collapsed-control {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;position: relative;overflow: hidden;padding: 10px;border: none;border-radius: var(--button-border-radius);background: var(--secondary-button-background-color-active);color: var(--secondary-button-text-color-active);transition-property: background, color;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-collapsed-control::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--secondary-button-border-color-active);background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-collapsed-control__collapsed-component {cursor: pointer;display: -ms-flexbox;display: flex; } .uikit-collapsed-control__expanded-component {margin-left: 8px;opacity: 1;transition-property: width, opacity;transition-duration: 300ms;transition-timing-function: ease; } .uikit-collapsed-control.uikit-collapsed-control_collapsed {background: var(--secondary-button-background-color);color: var(--secondary-button-text-color);padding-right: 2px; } .uikit-collapsed-control.uikit-collapsed-control_collapsed::after {background: var(--secondary-button-border-color);background-origin: border-box; } .uikit-collapsed-control.uikit-collapsed-control_collapsed .uikit-collapsed-control__expanded-component {width: 0;opacity: 0; } .uikit-collapsed-control[data-tooltip]::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 0; } .uikit-collapsed-control[data-tooltip]:hover::before {opacity: 1;visibility: visible; }.menu-base {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: start;align-items: start;font-family: var(--font-family-normal); }.menu-base-item {width: 100%;box-sizing: border-box;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;height: 44px;padding: 0 20px;color: var(--popup-text-color); } .menu-base-item__label {-ms-flex-positive: 1;flex-grow: 1;font-size: 15px;line-height: 20px;margin-left: 12px; } .menu-base-item__icon {width: 20px;height: 20px;-ms-flex-negative: 0;flex-shrink: 0;color: var(--popup-text-color); } .menu-base-item__value {-ms-flex-negative: 0;flex-shrink: 0;margin-left: 16px; } .menu-base-item.menu-base-item_clickable:hover {cursor: pointer;background: var(--popup-background-hover-color);color: var(--popup-text-hover-color); } .menu-base-item.menu-base-item_clickable:hover .menu-base-item__icon {color: var(--popup-text-hover-color); }.rate-menu {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;width: 100%;padding: 12px 0; } .rate-menu__caption {padding: 8px 20px;color: var(--popup-text-color);font-size: 16px;line-height: 22px;font-family: var(--font-family-bold);font-weight: 700; } .rate-menu__delimiter {width: 100%;height: 1px;background: var(--popup-text-color);opacity: 0.08;margin: 8px 0; }.presenter-info {font-family: var(--font-family-normal);box-sizing: border-box;position: relative;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;color: var(--panel-text-color); } .presenter-info__main {display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: start; } .presenter-info__info {display: inline-block;-ms-flex-positive: 1;flex-grow: 1; } .presenter-info__photo {width: 64px;height: 64px;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;overflow: hidden;border-radius: 50%;-ms-flex-negative: 0;flex-shrink: 0;background-repeat: no-repeat;background-position: center;margin-right: 20px; } .presenter-info__photo img {width: auto;height: auto; } .presenter-info__name {font-family: var(--font-family-bold);font-weight: 700;word-wrap: break-word;overflow: hidden;font-size: 16px;line-height: 22px;margin-bottom: 8px;max-height: 53px; } .presenter-info__job {word-wrap: break-word;overflow: hidden;font-size: 14px;line-height: 18px;margin-bottom: 8px; } .presenter-info__phone {word-wrap: break-word;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;font-size: 15px;line-height: 20px; } .presenter-info__links {display: -ms-flexbox;display: flex;margin-top: 8px; } .presenter-info__link {border: 1px solid var(--presenter-info-link-border-color);border-radius: 10px;width: 36px;height: 28px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;position: relative;color: var(--panel-text-color); } .presenter-info__link:not(:last-child) {margin-right: 8px; } .presenter-info__link::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 6px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .presenter-info__link:hover::before {opacity: 1;visibility: visible; } .presenter-info__link-icon {width: 20px;height: 20px; } .presenter-info .bio-container {position: relative;display: -webkit-box;white-space: normal;text-overflow: ellipsis;margin-right: -20px;margin-top: 20px;padding-right: 10px;font-size: 14px;line-height: 20px;-ms-flex-positive: 1;flex-grow: 1;height: 100%;max-height: 120px;overflow: hidden; } .presenter-info .bio-container.bio-container_collapsed {max-height: 60px; } .presenter-info .bio-container.bio-container_collapsed .scroll-area__bio {display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .presenter-info .bio-container .scroll-area {word-break: break-word;overflow: hidden; } .presenter-info .bio-container .container-top-shadow {background: __verticalGradient(var(--panel-color), transparent);background: linear-gradient(to bottom, var(--panel-color), transparent);position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; } .presenter-info .bio-container .container-bottom-shadow {background: __verticalGradient(transparent, var(--panel-color));background: linear-gradient(to bottom, transparent, var(--panel-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; } .presenter-info__show-more {font-size: 14px;line-height: 20px;height: 20px;opacity: 0.6;text-decoration: underline; } .presenter-info__show-more:hover {cursor: pointer;opacity: 0.8; } .presenter-info.presenter-info_popup {margin-bottom: 0; } .presenter-info.presenter-info_no-photo .presenter-info__info {width: 100%; }.attachments-info {font-family: var(--font-family-normal);position: relative;width: 100%;overflow: hidden;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column; } .attachments-info__scroll-area {height: 100%;overflow: hidden; } .attachments-info__delimiter {height: 1px;margin: 8px 20px 8px 62px;background: var(--popup-text-color);opacity: 0.08; } .attachments-info .container-top-shadow {background: __verticalGradient(var(--panel-color), transparent);background: linear-gradient(to bottom, var(--panel-color), transparent);position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; } .attachments-info .container-bottom-shadow {background: __verticalGradient(transparent, var(--panel-color));background: linear-gradient(to bottom, transparent, var(--panel-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; }.attach-item {padding: 8px 20px;box-sizing: border-box;display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: start;cursor: pointer; } .attach-item__icon-container {width: 36px;height: 36px;border-radius: 50%;background: var(--top-panel-icon-container-color);display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;-ms-flex-negative: 0;flex-shrink: 0;margin-right: 6px; } .attach-item__icon {width: 20px;height: 20px;color: var(--popup-text-color);opacity: 0.72; } .attach-item__info-container {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-positive: 1;flex-grow: 1;padding-left: 6px; } .attach-item__title {font-size: 15px;line-height: 20px;margin-bottom: 4px;color: var(--popup-text-color);word-break: break-word;max-height: 60px;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .attach-item__subtitle {font-size: 14px;line-height: 18px;color: var(--popup-text-color);opacity: 0.6; } .attach-item:hover {background: var(--list-item-background-hover-color); } .attach-item:hover .attach-item__title {color: var(--popup-text-hover-color); } .attach-item:hover .attach-item__subtitle {color: var(--popup-text-hover-color); } .attach-item:hover .attach-item__icon {color: var(--popup-text-hover-color); }.message-box {background: var(--player-background-color);position: absolute;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;border-radius: 7px;min-width: 280px;padding: 40px;box-shadow: 0 8px 16px rgba(0, 0, 0, 0.08); } .message-box::after {content: '';box-sizing: border-box;border: 1px solid var(--popup-border);width: 100%;height: 100%;position: absolute;left: 0;top: 0;border-radius: 7px;pointer-events: none; } .message-box__content {position: relative;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-direction: column;flex-direction: column; } .message-box__icon {width: 24px;height: 24px;margin-bottom: 24px;position: relative;display: inline-block;color: var(--text-color);opacity: 0.72; } .message-box .message-box-buttons {position: relative;width: 100%;height: 36px; } .message-box .message-box-buttons__buttons {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center; } .message-box .message-box-buttons__window-button {margin: 0 4px; } .message-box .vertical-scrollbar {top: 40px; } .message-box__message-container {overflow: hidden;display: inline-block;max-width: 480px;vertical-align: top;position: relative; } .message-box__message {text-align: center;font-size: 15px;color: var(--text-color);text-overflow: ellipsis;overflow: hidden;position: relative;font-family: Helvetica Neue, Helvetica, Roboto, Arial; } .message-box__buttons {margin-top: 28px; }.back-to-app-button {position: absolute;top: 6px;left: 12px;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;width: 40px;height: 40px; } .back-to-app-button svg path {fill: var(--text-color); }.quiz-tablet-skin {background: var(--player-background-color); } .quiz-tablet-skin .smartphone-top-panel.smartphone-top-panel_mode_reviewing .smartphone-top-panel__button.smartphone-top-panel__button_outline {-ms-grid-column: 1;grid-column: 1; }.smartphone-slide-list-slides * {box-sizing: border-box; }.universal_mini.mobile .playerView {background-color: var(--player-background-color); }.universal_mini.mobile:not(.landscape) .slide-list-header__awarded-points-cell {display: none; }.universal_mini.mobile:not(.landscape) .slide-list-header__max-points-cell {display: none; }.universal_mini.mobile:not(.landscape) .slide-state-list-row__awarded-points {display: none; }.universal_mini.mobile:not(.landscape) .slide-state-list-row__points {display: none; }.menu_layer .component_base.content {min-height: 100%; }.menu_layer .smartphone-slide-list-slides {height: 100%; }"; +let e;for(const [g,h]of Object.entries(null!=(e=a)?e:{}))a=`__${g.replace(RegExp("\\.","g"),"_")}__`,c=c.replace(new RegExp(a,"g"),h);let f;for(const [g,h]of Object.entries(null!=(f=b)?f:{}))c=c.replace(new RegExp(g,"g"),h);c=c.replace(/__verticalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.Pk);c=c.replace(/__horizontalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.Ok);return gn(c)}Pk(a,b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}Ok(a, +b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}};class JG{Yo(a,b){const c=g=>{g=sh(g);let h;for(const [l,n]of Object.entries(null!=(h=a)?h:{}))g=g.replace(new RegExp(`{${l}}`,"g"),n);return qh(g)};let d=function(){var g=["data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA5LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDksMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbD0iI0RENEIzOCIgZD0iTTIxLjA0MSwyOXY5Ljg0NGMwLDUuNTA4LDQuNjkxLDkuOTczLDEwLjQ3OSw5Ljk3M2M1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTczVjI5SDIxLjA0MXoiLz4NCjxwYXRoIGZpbGw9IiNERDRCMzgiIGQ9Ik0yNi41NTgsMjl2LTcuNjg5YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MlYyOWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNFYyOUgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjEuMDQxLDI4LjIwNnY5Ljg0NWMwLDUuNTA2LDQuNjkxLDkuOTcxLDEwLjQ3OSw5Ljk3MWM1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTcxdi05Ljg0NUgyMS4wNDF6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjYuNTU4LDI4LjA0VjIwLjM1YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MnY3LjY4OWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNHY4LjA1NEgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRjA4RjgyIiBkPSJNMzQsMzYuMzY1YzAtMS4yODctMS4wNDQtMi4zMzEtMi4zMzEtMi4zMzFjLTEuMjg4LDAtMi4zMzIsMS4wNDQtMi4zMzIsMi4zMzENCgljMCwwLjk3MSwwLjU5NCwxLjgwMiwxLjQzOCwyLjE1MnY0LjQ2N2gxLjkxdi00LjUyOUMzMy40NjEsMzguMDc2LDM0LDM3LjI4NywzNCwzNi4zNjV6Ii8+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA4LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDgsMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik01OS42NDYsMzFoLTMuMjkzQzU2LjE1OCwzMSw1NiwzMS40NDgsNTYsMzINCgljMCwwLjU1MywwLjE1OCwxLDAuMzU0LDFoMy4yOTNDNTkuODQyLDMzLDYwLDMyLjU1Myw2MCwzMkM2MCwzMS40NDgsNTkuODQyLDMxLDU5LjY0NiwzMXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjREQ0QjM4IiBkPSJNNi42NDcsMzFIMy4zNTNDMy4xNTgsMzEsMywzMS40NDgsMywzMmMwLDAuNTUzLDAuMTU4LDEsMC4zNTMsMQ0KCWgzLjI5NEM2Ljg0MiwzMyw3LDMyLjU1Myw3LDMyQzcsMzEuNDQ4LDYuODQyLDMxLDYuNjQ3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik0zMSw4YzAuNTUzLDAsMS0wLjE1OCwxLTAuMzUzVjQuMzUzQzMyLDQuMTU4LDMxLjU1Myw0LDMxLDQNCgljLTAuNTUyLDAtMSwwLjE1OC0xLDAuMzUzdjMuMjk0QzMwLDcuODQyLDMwLjQ0OCw4LDMxLDh6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTMxLDU2Yy0wLjU1MiwwLTEsMC4xNTgtMSwwLjM1NHYzLjI5M0MzMCw1OS44NDIsMzAuNDQ4LDYwLDMxLDYwDQoJYzAuNTUzLDAsMS0wLjE1OCwxLTAuMzU0di0zLjI5M0MzMiw1Ni4xNTgsMzEuNTUzLDU2LDMxLDU2eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik00Ny42NjgsMzFoLTEyLjgxQzM0LjQ5NiwyOS42LDMzLjQsMjguNTA1LDMyLDI4LjE0Mg0KCWMwLDAtMC4xNzItMC4xNDItMS0wLjE0MmMtMC44MjksMC0yLDAuNTU1LTIsMC41NTVjLTEuMTksMC42OTMtMiwxLjk2OS0yLDMuNDQ1YzAsMi4yMDksMS43OTEsNCw0LDRjMS40NzcsMCwyLjc1Mi0wLjgwOSwzLjQ0NS0yDQoJaDEzLjIyM0M0OC40MDQsMzQsNDksMzMuMzI4LDQ5LDMyLjVDNDksMzEuNjcyLDQ4LjQwNCwzMSw0Ny42NjgsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTI3LjAxOCwyOS43NDhjMC41OTIsMS4wMjUsMS42NTIsMS41MiwyLjM3LDEuMTA2bDAsMA0KCWMwLjcxNy0wLjQxNSwwLjgxOS0xLjU4MSwwLjIyOC0yLjYwNmwtNy44NTctMTMuNjA5Yy0wLjU5Mi0xLjAyNC0xLjY1My0xLjUyLTIuMzcxLTEuMTA2bDAsMGMtMC43MTcsMC40MTUtMC44MTgsMS41ODEtMC4yMjgsMi42MDUNCglMMjcuMDE4LDI5Ljc0OHoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMjcuMDE4LDI4LjM2MWMwLjU5MiwxLjAyNSwxLjY1MiwxLjUyLDIuMzcsMS4xMDZsMCwwDQoJYzAuNzE3LTAuNDE1LDAuODE5LTEuNTgxLDAuMjI4LTIuNjA2bC03Ljg1Ny0xMy42MDljLTAuNTkyLTEuMDI0LTEuNjUzLTEuNTItMi4zNzEtMS4xMDZsMCwwYy0wLjcxNywwLjQxNS0wLjgxOCwxLjU4MS0wLjIyOCwyLjYwNQ0KCUwyNy4wMTgsMjguMzYxeiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgY3g9IjMxIiBjeT0iMzEiIHI9IjQiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNjAsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzU0LDFoLTMuMjkzQzU2LjE1OCwzMiw1NiwzMS41NTIsNTYsMzENCglsMCwwYzAtMC41NTIsMC4xNTgtMSwwLjM1NC0xaDMuMjkzQzU5Ljg0MiwzMCw2MCwzMC40NDgsNjAsMzFMNjAsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTcsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzUzLDFIMy4zNTNDMy4xNTgsMzIsMywzMS41NTIsMywzMWwwLDANCgljMC0wLjU1MiwwLjE1OC0xLDAuMzUzLTFoMy4yOTRDNi44NDIsMzAsNywzMC40NDgsNywzMUw3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0zMSwzYzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDYuODQyLDMxLjU1Myw3LDMxLDdsMCwwDQoJYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1M1YzLjM1M0MzMCwzLjE1OCwzMC40NDgsMywzMSwzTDMxLDN6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTMxLDU1YzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDU4Ljg0MiwzMS41NTMsNTksMzEsNTkNCglsMCwwYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1NHYtMy4yOTRDMzAsNTUuMTU4LDMwLjQ0OCw1NSwzMSw1NUwzMSw1NXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNDksMzEuNDk5QzQ5LDMwLjY3Miw0OC40MDQsMzAsNDcuNjY4LDMwSDM0LjMzMw0KCUMzMy41OTYsMzAsMzMsMzAuNjcxLDMzLDMxLjVsMCwwYzAsMC44MjgsMC41OTYsMS41LDEuMzMzLDEuNWgxMy4zMzVDNDguNDA0LDMzLDQ5LDMyLjMyOCw0OSwzMS40OTlMNDksMzEuNDk5eiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YxNjE1NSIgY3g9IjMxIiBjeT0iMzEiIHI9IjIiLz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjM2MzgxNDQiPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgzNjAiIGNsYXNzPSJmaWwwIiBkPSJNNi43NzM1IDMuOTc5bDAgLTMuNDQyNDVjMCwtMC4yOTUxMTkgLTAuMjQxNDMzLC0wLjUzNjU1MiAtMC41MzY1NTIsLTAuNTM2NTUybC02LjIzNjk1IDAgMCA0LjUxNTU1IDYuMjM2OTUgMGMwLjI5NTExOSwwIDAuNTM2NTUyLC0wLjI0MTQzMyAwLjUzNjU1MiwtMC41MzY1NTJ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMzYzODEyMCIgY2xhc3M9ImZpbDEiIGQ9Ik0zLjE4NzUgMS4yMzAyMWwtMC4zMzU1NTIgMC4zMzU1MTQgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAtMC4yMjM2NjQgMC4yMjM2NjQgMC40NDczNjUgMC40NDczNjUgLTAuMzM1NTE0IDAuMzM1NTUyIDAuODk0NzMgMCAwIC0wLjg5NDczem0wLjI2NTY0MSAyLjA1NTFsMC4zMzU1MTQgLTAuMzM1NTE0IDAuNDQ3MzY1IDAuNDQ3MzY1IDAuMjIzNzAxIC0wLjIyMzcwMSAtMC40NDczNjUgLTAuNDQ3MzY1IDAuMzM1NTE0IC0wLjMzNTUxNCAtMC44OTQ3MyAwIDAgMC44OTQ3M3oiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDojRkVGRUZFO2ZpbGwtb3BhY2l0eTowLjEwMTk2MX0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIzNjM4MTQ0Ij4NCiAgIDxwYXRoIGlkPSJfMTIzNjM4MzYwIiBjbGFzcz0iZmlsMCIgZD0iTTYuNzczNSAzLjk3OWwwIC0zLjQ0MjQ1YzAsLTAuMjk1MTE5IC0wLjI0MTQzMywtMC41MzY1NTIgLTAuNTM2NTUyLC0wLjUzNjU1MmwtNi4yMzY5NSAwIDAgNC41MTU1NSA2LjIzNjk1IDBjMC4yOTUxMTksMCAwLjUzNjU1MiwtMC4yNDE0MzMgMC41MzY1NTIsLTAuNTM2NTUyeiIvPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgxMjAiIGNsYXNzPSJmaWwxIiBkPSJNMy4xODc1IDEuMjMwMjFsLTAuMzM1NTUyIDAuMzM1NTE0IC0wLjQ0NzM2NSAtMC40NDczNjUgLTAuMjIzNjY0IDAuMjIzNjY0IDAuNDQ3MzY1IDAuNDQ3MzY1IC0wLjMzNTUxNCAwLjMzNTU1MiAwLjg5NDczIDAgMCAtMC44OTQ3M3ptMC4yNjU2NDEgMi4wNTUxbDAuMzM1NTE0IC0wLjMzNTUxNCAwLjQ0NzM2NSAwLjQ0NzM2NSAwLjIyMzcwMSAtMC4yMjM3MDEgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAwLjMzNTUxNCAtMC4zMzU1MTQgLTAuODk0NzMgMCAwIDAuODk0NzN6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDojRkVGRUZFO2ZpbGwtb3BhY2l0eTowLjA1MDk4MH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIzNjM4MTQ0Ij4NCiAgIDxwYXRoIGlkPSJfMTIzNjM4MzYwIiBjbGFzcz0iZmlsMCIgZD0iTTYuNzczNSAzLjk3OWwwIC0zLjQ0MjQ1YzAsLTAuMjk1MTE5IC0wLjI0MTQzMywtMC41MzY1NTIgLTAuNTM2NTUyLC0wLjUzNjU1MmwtNi4yMzY5NSAwIDAgNC41MTU1NSA2LjIzNjk1IDBjMC4yOTUxMTksMCAwLjUzNjU1MiwtMC4yNDE0MzMgMC41MzY1NTIsLTAuNTM2NTUyeiIvPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgxMjAiIGNsYXNzPSJmaWwxIiBkPSJNMy4xODc1IDEuMjMwMjFsLTAuMzM1NTUyIDAuMzM1NTE0IC0wLjQ0NzM2NSAtMC40NDczNjUgLTAuMjIzNjY0IDAuMjIzNjY0IDAuNDQ3MzY1IDAuNDQ3MzY1IC0wLjMzNTUxNCAwLjMzNTU1MiAwLjg5NDczIDAgMCAtMC44OTQ3M3ptMC4yNjU2NDEgMi4wNTUxbDAuMzM1NTE0IC0wLjMzNTUxNCAwLjQ0NzM2NSAwLjQ0NzM2NSAwLjIyMzcwMSAtMC4yMjM3MDEgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAwLjMzNTUxNCAtMC4zMzU1MTQgLTAuODk0NzMgMCAwIDAuODk0NzN6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACHDwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKNWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAASMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEoqGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAGeIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gzSZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25qbc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9CvjcM4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjKuLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqxOPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIWiAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFVSAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAyrA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYghUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7rh2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SEdJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3JaSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQtlHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJy5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hopb2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsyu21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCccNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527PYS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOwEaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6sfaznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy+rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVsS1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9UxlfeqXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/wjowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9Vt1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503rm10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7Pnl/eriQvLDwG/eE8/s6uL5TAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAAGnRFWHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS4xMDD0cqEAAABfSURBVChTY/j//z8DMZgoRSCD4ApLK6rYgLgDiJ9CMYjNBrMNWWHnvAUL/3/4+BGMQWygwk5sCp+CFMDAhw8fQAqfYlcIlCRGYeeceQv+g0wCYRAbl9XEeYZQWBIdjgCVaiC8JN1udgAAAABJRU5ErkJggg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAACuSURBVHicY/n//z8DCLh7+/sAqWIgNmGAgDNA3Ltz68YtIA4LVFELkKpmQAUOIAyUawUqrmEBMnyxKEIG1UA1J0EmFsFELC3MGfJzssDsSVOnMxw7fgImVQRSaAzjgRQJCgqA2XnZmcgKjVnwWIkCWKC+cwRxJk6eypCfm80AYyOBMyCF/TCFx0+eAmMsoJ8F6PXNoCBgwO1zUPBsBrsRFE5AxSCXFzKgBng/LMABrBM9cyiwScIAAAAASUVORK5CYII=", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAZCAYAAABtnU33AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAETSURBVHic7ZgxCsJAFAUXSaeIpScQDyCCguA5rEUQEbWzsvACKhICaquHUQu18hxi6vgebCSgwSb5C2sGhpBkIX+aZIkTBIHS1OAI1mFR2cEDHuEKnnnB0TeGcAlzZuZKjTKswA4cwzWDW8rO2ChsY+OFwVNld2wIG6cMbpqeRJAmg0umpxCk5PxeYxdZsO1kwbaTBdvOXwb7MG96ECF8Bt9gw/QkQlwZ7Kr/CXYZvIdt2DU7S+rs4CF8afXgCU5g1dhI6XCHC7jlSRjM/zwbbUGbJDPY/7HGg/OEn/vUvvn2WfpYlAADfYyL9vSaIOZ+Ykh9hxkSFy0WSyQ3Ht+iRWOJ9E4rGq2UcCwxsbWMRovGkhc6FTEV3QXLmAAAAABJRU5ErkJggg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAElJREFUSEvt0qERAEAIA0H6b5rXL1ecI5qQOcIsanB+3TC5egZOyJm9B2Zgw0EnF+AeekPC+S3tGTjhoJMLcA+9IeG89+6L04QHtFKarLFAHLUAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAFBJREFUSEvtkjEKADAIA/PpQunnWzo63nBbBDdjOGPWPpd0yPCf5YLo5TNgB52Z54AZsKDQygVwDr5A4RxLfQbsUGjlAjgHX6Bw9r394KjDAzeSX574b7LUAAAAAElFTkSuQmCC", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAyMCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik03LjE3MDI1IDMuMDkxODJDOC4wNzEzMiAyLjY5OTkyIDkuMDMyNDkgMi41IDEwIDIuNUMxMC45Njc1IDIuNSAxMS45Mjg3IDIuNjk5OTIgMTIuODI5NyAzLjA5MTgyQzEzLjczMTIgMy40ODM4NyAxNC41NTgzIDQuMDYyMDIgMTUuMjYwNyA0Ljc5OTUyQzE1Ljk2MzQgNS41MzcyOCAxNi41MjY4IDYuNDE5NjcgMTYuOTEzMiA3LjM5OTI0QzE3LjI5OTcgOC4zNzg5NyAxNy41IDkuNDMyOTUgMTcuNSAxMC41SDIwQzIwIDkuMTIxMTIgMTkuNzQxMyA3Ljc1NTc0IDE5LjIzODggNi40ODE4MkMxOC43MzYyIDUuMjA3OSAxNy45OTk2IDQuMDUwMzkgMTcuMDcxMSAzLjA3NTM4QzE2LjE0MjUgMi4xMDAzNiAxNS4wNDAxIDEuMzI2OTQgMTMuODI2OCAwLjc5OTI2NUMxMi42MTM2IDAuMjcxNTg5IDExLjMxMzIgMCAxMCAwQzguNjg2NzggMCA3LjM4NjQyIDAuMjcxNTg5IDYuMTczMTcgMC43OTkyNjVDNC45NTk5MiAxLjMyNjk0IDMuODU3NTIgMi4xMDAzNiAyLjkyODkzIDMuMDc1MzhDMi4wMDAzNSA0LjA1MDM5IDEuMjYzNzUgNS4yMDc5IDAuNzYxMjA0IDYuNDgxODJDMC4yNTg2NTggNy43NTU3NCAwIDkuMTIxMTIgMCAxMC41SDIuNUMyLjUgOS40MzI5NSAyLjcwMDMgOC4zNzg5NyAzLjA4Njc5IDcuMzk5MjRDMy40NzMyMiA2LjQxOTY3IDQuMDM2NjUgNS41MzcyOCA0LjczOTI4IDQuNzk5NTJDNS40NDE2NiA0LjA2MjAyIDYuMjY4ODUgMy40ODM4NyA3LjE3MDI1IDMuMDkxODJaTTEwLjU3MSA3LjU4MzM1QzEwLjY4NDMgNy40OTI4MyAxMC43OTY2IDcuNDA0NSAxMC45MDcxIDcuMzE4ODNDMTEuMzUxNyA2Ljk3NDAzIDExLjc2NTggNi42NzI0MyAxMi4wODY4IDYuNDQ0OTlDMTIuMTcxNyA2LjM4NDgxIDEyLjI1MDEgNi4zMjk4MSAxMi4zMjA5IDYuMjgwNThDMTIuNDkgNi4xNjI5MiAxMi43MTIgNi4yOTExIDEyLjY5NDYgNi40OTYzOEMxMi42ODc0IDYuNTgyMjYgMTIuNjc5IDYuNjc3NjggMTIuNjY5MyA2Ljc4MTM0QzEyLjYzMjkgNy4xNzMwNCAxMi41Nzg3IDcuNjgyNDcgMTIuNTAyNCA4LjIzOTg4QzEyLjQ4MzQgOC4zNzgzNyAxMi40NjMxIDguNTE5ODIgMTIuNDQxMyA4LjY2MzE2QzEyLjI0NjggOS45NDQxNSAxMS45Mzc1IDExLjM3NjIgMTEuNDY0MSAxMi4xOTYyQzExLjA3MzYgMTIuODcyNiAxMC4wMzExIDEzLjY3ODIgOC43MzIwNSAxMi45MjgyQzcuNDMzMDEgMTIuMTc4MiA3LjYwOTQ4IDEwLjg3MjYgOCAxMC4xOTYyQzguNDczMzcgOS4zNzYyNSA5LjU1ODk0IDguMzkyMzEgMTAuNTcxIDcuNTgzMzVaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NzA3MjgiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjMzNjc2NjQiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjkxNDI4IDAuNjkxNDI4LDAuNjkxNDI4IDAuNjkxNDI4LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTcwNzA0IiBjbGFzcz0iZmlsMSIgZD0iTTAuMzQ1NzM2IDAuMTU3MTg4bC0wLjEyNTcyMiAwLjA5NDI2NDkgLTAuMDk0MzAwNiAwIDAgMC4xODg1ODMgMC4wOTQzMDA2IDAgMC4xMjU3MjIgMC4wOTQyNjQ5IDAgLTAuMzc3MTEzem0wLjE1NzExNyAtMi42NzI2N2UtMDA1bDAuMDMxNDMwNiAwIDAgMC4zNzcxNCAtMC4wMzE0MzA2IDAgMCAtMC4zNzcxNHptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjI1MTQwOSAtMC4wMzE0MzA2IDAgMCAtMC4yNTE0MDl6bS0wLjA2Mjg0MzMgMC4wNjI4NjExbDAuMDMxNDMwNiAwIDAgMC4xMjU2ODcgLTAuMDMxNDMwNiAwIDAgLTAuMTI1Njg3eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NjkwMjQiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjE5NjkyNDAiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjQzNjE2IDAuNjQzNjE2LDAuNjQzNjE2IDAuNjQzNjE2LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY5MDAwIiBjbGFzcz0iZmlsMSIgZD0iTTAuMzIxODM3IDAuMTQ2MzAybC0wLjExNzAyOSAwLjA4Nzc0NjYgLTAuMDg3Nzc5NyAwIDAgMC4xNzU1NDMgMC4wODc3Nzk3IDAgMC4xMTcwMjkgMC4wODc3NDY2IDAgLTAuMzUxMDM2em0wLjI3NzkwMSAwLjI1MDcyNmwtMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjA5MzA4NzIgLTAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjAyMDY5MDYgLTAuMDIwNjkwNiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAwLjAyMDY5MDYgLTAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MnoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTggM0MxOS4xMDQ2IDMgMjAgMy44OTU0MyAyMCA1VjE1QzIwIDE2LjEwNDYgMTkuMTA0NiAxNyAxOCAxN0gyQzAuODk1NDMxIDE3IDAgMTYuMTA0NiAwIDE1VjVDMCAzLjg5NTQzIDAuODk1NDMxIDMgMiAzSDE4Wk02LjU4MDA4IDcuMDA0ODhDNS41OTgzIDcuMDA0ODggNC44MjYwMSA3LjMyMDE1IDQuMjYzMTggNy45NTA2OEMzLjcwMDM1IDguNTgxMjIgMy40MTg5NSA5LjQyNTQ1IDMuNDE4OTUgMTAuNDgzNFYxMC42MDRDMy40MTg5NSAxMS43MDQzIDMuNzAyNDcgMTIuNTY2NSA0LjI2OTUzIDEzLjE5MDdDNC44MzY1OSAxMy44MTQ5IDUuNjExIDE0LjEyNyA2LjU5Mjc3IDE0LjEyN0M3LjExNzUyIDE0LjEyNyA3LjU5Njc2IDE0LjAyMDEgOC4wMzA1MiAxMy44MDY0QzguNDY0MjggMTMuNTkyNyA4LjgwNTk5IDEzLjI5MjIgOS4wNTU2NiAxMi45MDVDOS4zMDUzNCAxMi41MTc4IDkuNDMyMjkgMTIuMDkxNSA5LjQzNjUyIDExLjYyNkg3LjcxNjMxQzcuNzA3ODQgMTEuOTM0OSA3LjU5NzgyIDEyLjE4MjUgNy4zODYyMyAxMi4zNjg3QzcuMTc0NjQgMTIuNTU0OSA2Ljg5OTU4IDEyLjY0NzkgNi41NjEwNCAxMi42NDc5QzYuMTIwOTMgMTIuNjQ3OSA1Ljc5Mjk3IDEyLjQ5MzUgNS41NzcxNSAxMi4xODQ2QzUuMzYxMzMgMTEuODc1NiA1LjI1MzQyIDExLjM2NzggNS4yNTM0MiAxMC42NjExVjEwLjQ3MDdDNS4yNTM0MiA5Ljc3MjQ2IDUuMzYyMzkgOS4yNjc4MiA1LjU4MDMyIDguOTU2NzlDNS43OTgyNiA4LjY0NTc1IDYuMTIwOTMgOC40OTAyMyA2LjU0ODM0IDguNDkwMjNDNi44OTUzNSA4LjQ5MDIzIDcuMTc0NjQgOC42MDEzMiA3LjM4NjIzIDguODIzNDlDNy41OTc4MiA5LjA0NTY2IDcuNzA3ODQgOS4zMzQ0NyA3LjcxNjMxIDkuNjg5OTRIOS40MzY1MkM5LjQyODA2IDguODc3NDQgOS4xNjQ2NCA4LjIyNjgxIDguNjQ2MjQgNy43MzgwNEM4LjEyNzg1IDcuMjQ5MjcgNy40MzkxMyA3LjAwNDg4IDYuNTgwMDggNy4wMDQ4OFpNMTMuMzU5NCA3LjAwNDg4QzEyLjM3NzYgNy4wMDQ4OCAxMS42MDUzIDcuMzIwMTUgMTEuMDQyNSA3Ljk1MDY4QzEwLjQ3OTcgOC41ODEyMiAxMC4xOTgyIDkuNDI1NDUgMTAuMTk4MiAxMC40ODM0VjEwLjYwNEMxMC4xOTgyIDExLjcwNDMgMTAuNDgxOCAxMi41NjY1IDExLjA0ODggMTMuMTkwN0MxMS42MTU5IDEzLjgxNDkgMTIuMzkwMyAxNC4xMjcgMTMuMzcyMSAxNC4xMjdDMTMuODk2OCAxNC4xMjcgMTQuMzc2MSAxNC4wMjAxIDE0LjgwOTggMTMuODA2NEMxNS4yNDM2IDEzLjU5MjcgMTUuNTg1MyAxMy4yOTIyIDE1LjgzNSAxMi45MDVDMTYuMDg0NiAxMi41MTc4IDE2LjIxMTYgMTIuMDkxNSAxNi4yMTU4IDExLjYyNkgxNC40OTU2QzE0LjQ4NzEgMTEuOTM0OSAxNC4zNzcxIDEyLjE4MjUgMTQuMTY1NSAxMi4zNjg3QzEzLjk1MzkgMTIuNTU0OSAxMy42Nzg5IDEyLjY0NzkgMTMuMzQwMyAxMi42NDc5QzEyLjkwMDIgMTIuNjQ3OSAxMi41NzIzIDEyLjQ5MzUgMTIuMzU2NCAxMi4xODQ2QzEyLjE0MDYgMTEuODc1NiAxMi4wMzI3IDExLjM2NzggMTIuMDMyNyAxMC42NjExVjEwLjQ3MDdDMTIuMDMyNyA5Ljc3MjQ2IDEyLjE0MTcgOS4yNjc4MiAxMi4zNTk2IDguOTU2NzlDMTIuNTc3NiA4LjY0NTc1IDEyLjkwMDIgOC40OTAyMyAxMy4zMjc2IDguNDkwMjNDMTMuNjc0NiA4LjQ5MDIzIDEzLjk1MzkgOC42MDEzMiAxNC4xNjU1IDguODIzNDlDMTQuMzc3MSA5LjA0NTY2IDE0LjQ4NzEgOS4zMzQ0NyAxNC40OTU2IDkuNjg5OTRIMTYuMjE1OEMxNi4yMDc0IDguODc3NDQgMTUuOTQzOSA4LjIyNjgxIDE1LjQyNTUgNy43MzgwNEMxNC45MDcxIDcuMjQ5MjcgMTQuMjE4NCA3LjAwNDg4IDEzLjM1OTQgNy4wMDQ4OFoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxwYXRoIGNsYXNzPSJmaWwwIiBkPSJNLTAgMC4yNzExMDFsMCAxLjczOTM1YzAsMC4xNDkxMTMgMC4xMjE5ODgsMC4yNzExMDEgMC4yNzExMDEsMC4yNzExMDFsMy4xNTEzMSAwIDAgLTIuMjgxNTUgLTMuMTUxMzEgMGMtMC4xNDkxMTMsMCAtMC4yNzExMDEsMC4xMjE5ODggLTAuMjcxMTAxLDAuMjcxMTAxeiIvPg0KICA8cG9seWdvbiBjbGFzcz0iZmlsMSIgcG9pbnRzPSIxLjQwOTIsMC42NzEwMzggMi4wODAyOCwxLjE0MDc3IDEuNDA5MiwxLjYxMDUxICIvPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIxOTY2NTUyIj4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NzY4IiBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMzIzOTU2bDAgMi4wNzg0NmMwLDAuMTc4MTg1IDAuMTQ1NzcxLDAuMzIzOTU2IDAuMzIzOTU2LDAuMzIzOTU2bDMuNzY1NzEgMCAwIC0yLjcyNjM4IC0zLjc2NTcxIDBjLTAuMTc4MTg1LDAgLTAuMzIzOTU2LDAuMTQ1NzcxIC0wLjMyMzk1NiwwLjMyMzk1NnoiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NTI4IiBjbGFzcz0iZmlsMSIgZD0iTTEuNjAzOCAwLjg4MjAzOGwwLjMyMDc1MSAwIDAgMC45NjIyNTQgLTAuMzIwNzUxIDAgMCAtMC45NjIyNTR6bTAuNTYxMzMyIDBsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAhCAYAAAAYucG/AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAA+SURBVHicY/H09pViYQACFi4uLgYWbm5uOAHncsG4/Pz8xKv79u0bA8vXr1/hBJz7Dcb9+PEjIXVzZs18BgAgpy6CcHz1VgAAAABJRU5ErkJggg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsLW9wYWNpdHk9IjAiIGQ9Ik01MSw0LjA0MXYyNS45MThDNTEsMzIuMTgyLDQ5LjE4MiwzNCw0Ni45NiwzNEgwVjBoNDYuOTZDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDENCgkJCUw1MSw0LjA0MXoiLz4NCgkJPHBhdGggaWQ9Il8xMjMzNzQxNDQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xOCwxNS43MzdsMi41MjYtMi41MjZsMy4zNjksMy4zNjlsMS42ODQtMS42ODVsLTMuMzY4LTMuMzY4TDI0LjczNiw5aC01LjA1M0gxOHYxLjY4NA0KCQkJVjE1LjczN3ogTTM0LDE4LjI2NGwtMi41MjcsMi41MjVsLTMuMzY4LTMuMzY4bC0xLjY4NSwxLjY4NWwzLjM2OSwzLjM2N0wyNy4yNjMsMjVoNS4wNTNIMzR2LTEuNjg1VjE4LjI2NHoiLz4NCgk8L2c+DQo8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMTAyIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjRkVGRUZFIiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMDUxIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjOTY5Njk2IiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTRweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgMTQgMTUiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDU4ICg4NDY2MykgLSBodHRwczovL3NrZXRjaC5jb20gLS0+CiAgICA8dGl0bGU+dGljay1jb21ib2JveDwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJQRC0zNzQ0LeKAlC0yIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNzkwLjAwMDAwMCwgLTQzMS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgaWQ9InRpY2stY29tYm9ib3giIHRyYW5zZm9ybT0idHJhbnNsYXRlKDc4OS4wMDAwMDAsIDQzMC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMy4zNDQ3NjY4LDEuNjU5MzMyNTIgTDUuOCwxMi41ODY3MjE4IEw1LjgsMTIuNTg2NzIxOCBMMi42MDU2MzE3Nyw4LjkzNDE5NjUyIEMyLjM1MzE1MjQxLDguNjQ1NTA0OTMgMS45MTQ0NDY2Nyw4LjYxNjE0OTExIDEuNjI1NzU1MDcsOC44Njg2Mjg0OCBDMS41NzczMDU0Miw4LjkxMTAwMDgyIDEuNTM0OTgxOTMsOC45NTk5MDMyNiAxLjUsOS4wMTM5MzE0OCBDMS4yMDYzNDk0OSw5LjQ2NzQ2MzE2IDEuMjYwMDExMDgsMTAuMDYyODI2MyAxLjYzMDAyNTk4LDEwLjQ1NjU0MDEgTDUuNDc5NzMxMTgsMTQuNTUyODEzNSBDNS42Njg4NDMyLDE0Ljc1NDAzNzkgNS45ODUyNzMzOSwxNC43NjM4NTY5IDYuMTg2NDk3NzcsMTQuNTc0NzQ0OSBDNi4yMTEyMjc0NywxNC41NTE1MDM4IDYuMjMzNTI2NzQsMTQuNTI1ODA1MyA2LjI1MzA1MDY3LDE0LjQ5ODA0NyBMMTQuNTM5MDU1MywyLjcxNzM0NDAzIEMxNC44MDE1Mjc3LDIuMzQ0MTcxNDggMTQuNzQxNjUzNywxLjgzMzM1NzAzIDE0LjQsMS41MzA5OTU4NyBDMTQuMTA2MjM3OCwxLjI3MTAxODMyIDEzLjY1NzM0MywxLjI5ODQwNjIyIDEzLjM5NzM2NTUsMS41OTIxNjg0NCBDMTMuMzc4NTAyNywxLjYxMzQ4MjQgMTMuMzYwOTM4MiwxLjYzNTkxMDg3IDEzLjM0NDc2NjgsMS42NTkzMzI1MiBaIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cG9seWxpbmUgaWQ9IlBhdGgtMiIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjIiIHBvaW50cz0iMiA5LjY1NjUyODE3IDUuODYxNjc5NzcgMTQgMTQgMiI+PC9wb2x5bGluZT4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjIsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9ItCh0LvQvtC5XzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMzVweCIgaGVpZ2h0PSIzNXB4IiB2aWV3Qm94PSIwIDAgMzUgMzUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDM1IDM1IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMTcuNSwzNUMyNy4xMzksMzUsMzUsMjcuMTM4LDM1LDE3LjVDMzUsNy44NjEsMjcuMTM5LDAsMTcuNSwwDQoJQzcuODYxLDAsMCw3Ljg2MSwwLDE3LjVDMCwyNy4xMzgsNy44NjEsMzUsMTcuNSwzNXoiLz4NCjxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTcuNTAwNSIgeTE9IjIuNjQ5OSIgeDI9IjE3LjUwMDUiIHkyPSIzMi4zNDkiPg0KCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiM1Q0IwRkYiLz4NCgk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMTI5MEZGIi8+DQo8L2xpbmVhckdyYWRpZW50Pg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9InVybCgjU1ZHSURfMV8pIiBkPSJNMTcuNSwzMy45OTljOS4wODgsMCwxNi41LTcuNDEyLDE2LjUtMTYuNDk5DQoJUzI2LjU4NywxLDE3LjUsMUM4LjQxMywxLDEuMDAxLDguNDEzLDEuMDAxLDE3LjVTOC40MTMsMzMuOTk5LDE3LjUsMzMuOTk5eiIvPg0KPHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTE4LjM2OCwyMi41aC0zYy0wLjAwOC0wLjQ2MywwLTAuODk3LDAtMWMwLTEuMDM3LDAuMDU1LTEuODgxLDAuMzk2LTIuNTUNCgljMC4zNDQtMC42NzMsMS4wMzMtMS40MjMsMi4wNjMtMi4yNjRjMS4wMjgtMC44MzUsMS42NDYtMS4zODQsMS44NDMtMS42NDZjMC4zMTMtMC40MDcsMC40NjgtMC44NjIsMC40NjgtMS4zNTQNCgljMC0wLjY4Ni0wLjI3NS0xLjI3My0wLjgyNC0xLjc2NmMtMC41NDktMC40ODktMS4yODUtMC43MzMtMi4yMTUtMC43MzNjLTAuODk2LDAtMS42NDYsMC4yNTctMi4yNTEsMC43NjcNCgljLTAuNjAxLDAuNTEtMS4wMTYsMS4yOTEtMS4yNDMsMi4zMzZsLTMuMjM2LTAuNDAzYzAuMDktMS41LDAuNzI5LTIuNzczLDEuOTEyLTMuODE5QzEzLjQ2Nyw5LjAyMiwxNS4wMTgsOC41LDE2Ljk0OCw4LjUNCgljMi4wMjMsMCwzLjYzNSwwLjUzMSw0LjgzNSwxLjU5YzEuMTk2LDEuMDU5LDEuNzk2LDIuMjg5LDEuNzk2LDMuNjk5YzAsMC43NzYtMC4yMjMsMS41MTQtMC42NiwyLjIwOA0KCWMtMC40NDEsMC42OTQtMS40NjEsMS41NS0yLjgyLDIuODM3QzE4Ljg2OCwyMCwxOC4zNjgsMjAuNSwxOC4zNjgsMjIuNUwxOC4zNjgsMjIuNXogTTE1LjM2OCwyNy40OTl2LTNoM3YzSDE1LjM2OHoiLz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjIsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9ItCh0LvQvtC5XzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMzVweCIgaGVpZ2h0PSIzNXB4IiB2aWV3Qm94PSIwIDAgMzUgMzUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDM1IDM1IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMTcuNSwzNUMyNy4xMzgsMzUsMzUsMjcuMTQsMzUsMTcuNUMzNSw3Ljg2MiwyNy4xMzgsMCwxNy41LDANCglDNy44NjEsMCwwLDcuODYyLDAsMTcuNUMwLDI3LjE0LDcuODYxLDM1LDE3LjUsMzV6Ii8+DQo8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE3LjQ5OTUiIHkxPSIyLjY1MDQiIHgyPSIxNy40OTk1IiB5Mj0iMzIuMzUwNCI+DQoJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGODI1QyIvPg0KCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRjREMTIiLz4NCjwvbGluZWFyR3JhZGllbnQ+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0idXJsKCNTVkdJRF8xXykiIGQ9Ik0xNy41LDM0YzkuMDg3LDAsMTYuNS03LjQxMiwxNi41LTE2LjUNCgljMC05LjA4OC03LjQxMi0xNi41LTE2LjUtMTYuNVMxLDguNDEzLDEsMTcuNUMxLDI2LjU4OCw4LjQxMiwzNCwxNy41LDM0eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xNS41LDkuMDAxYzAtMiwzLjk5OS0yLDMuOTk5LDBMMTguOTk5LDIxDQoJYy0wLjA2MSwxLjQ5OC0yLjkzNywxLjUtMywwTDE1LjUsOS4wMDF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTE3LjUsMjhjMS4xMDIsMCwyLTAuODk3LDItMmMwLTEuMTAyLTAuODk3LTItMi0yDQoJYy0xLjEwMiwwLTEuOTk5LDAuODk4LTEuOTk5LDJDMTUuNSwyNy4xMDMsMTYuMzk4LDI4LDE3LjUsMjh6Ii8+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkNPUlJFQ1QtSUNPTiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IgoJIHk9IjBweCIgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNCAyNDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNGRkZGRkY7fQoJLnN0MXtmaWxsOiM3Q0I5MTE7fQo8L3N0eWxlPgo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPgo8cGF0aCBpZD0iU2hhcGVfM19jb3B5IiBjbGFzcz0ic3QxIiBkPSJNMTIsMkM2LjUsMiwyLDYuNSwyLDEyczQuNSwxMCwxMCwxMHMxMC00LjUsMTAtMTBTMTcuNSwyLDEyLDJ6IE0xNy45LDguOWwtNy43LDcuNwoJYy0wLjQsMC40LTAuOSwwLjQtMS4zLDBsLTMuMi0zLjJjLTAuNC0wLjQtMC40LTAuOSwwLTEuM3MwLjktMC40LDEuMywwbDIuNSwyLjVsNy4xLTcuMWMwLjMtMC40LDAuOS0wLjQsMS4zLDAKCUMxOC4yLDcuOSwxOC4yLDguNSwxNy45LDguOUMxNy45LDguOSwxNy45LDguOSwxNy45LDguOXoiLz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIKCSB5PSIwcHgiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjQgMjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGNpcmNsZSBmaWxsPSIjRkZGRkZGIiBjeD0iMTIiIGN5PSIxMiIgcj0iMTIiLz4KPHBhdGggZmlsbD0iI2Y3YjQ0NSIgZD0iTTEyLDJDNi41LDIsMiw2LjUsMiwxMnM0LjUsMTAsMTAsMTBzMTAtNC41LDEwLTEwUzE3LjUsMiwxMiwyeiBNMTcuOSw4LjlsLTcuNyw3LjcKCWMtMC40LDAuNC0wLjksMC40LTEuMywwbC0zLjItMy4yYy0wLjQtMC40LTAuNC0wLjksMC0xLjNzMC45LTAuNCwxLjMsMGwyLjUsMi41bDcuMS03LjFjMC4zLTAuNCwwLjktMC40LDEuMywwCglDMTguMiw3LjksMTguMiw4LjUsMTcuOSw4LjlDMTcuOSw4LjksMTcuOSw4LjksMTcuOSw4Ljl6Ii8+Cjwvc3ZnPgo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IklOQ09SUkVDVC1JQ09OIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiCgkgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDI0IDI0OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6I0ZGRkZGRjt9Cgkuc3Qxe2ZpbGw6I0Y5NjAzRDt9Cjwvc3R5bGU+CjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjEyIiBjeT0iMTIiIHI9IjEyIi8+CjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0xMiwyQzYuNSwyLDIsNi41LDIsMTJzNC41LDEwLDEwLDEwczEwLTQuNSwxMC0xMFMxNy41LDIsMTIsMnogTTE2LjQsOC44TDEzLjIsMTJsMi45LDIuOQoJYzAuMywwLjMsMC4zLDAuOSwwLDEuMmMtMC4zLDAuMy0wLjksMC4zLTEuMiwwbDAsMEwxMiwxMy4ybC0zLjIsMy4yYy0wLjMsMC4zLTAuOSwwLjMtMS4yLDBzLTAuMy0wLjksMC0xLjJsMy4yLTMuMkw3LjksOS4xCgljLTAuMy0wLjMtMC4zLTAuOSwwLTEuMnMwLjktMC4zLDEuMiwwbDIuOSwyLjlsMy4yLTMuMmMwLjMtMC4zLDAuOS0wLjMsMS4yLDBDMTYuNyw3LjksMTYuOCw4LjQsMTYuNCw4LjgKCUMxNi40LDguOCwxNi40LDguOCwxNi40LDguOHoiLz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkFOU1dFUkVELUlDT04iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIKCSB5PSIwcHgiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjQgMjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbDojRkZGRkZGO30KCS5zdDF7ZmlsbDojNTI4QkRGO30KPC9zdHlsZT4KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMTIiIGN5PSIxMiIgcj0iMTIiLz4KPHBhdGggY2xhc3M9InN0MSIgZD0iTTEyLDIyQzYuNSwyMiwyLDE3LjUsMiwxMlM2LjUsMiwxMiwyczEwLDQuNSwxMCwxMFMxNy41LDIyLDEyLDIyeiBNOSwxMUg3djJoMlYxMXogTTEzLDExaC0ydjJoMlYxMXogTTE3LDExCgloLTJ2MmgyVjExeiIvPgo8L3N2Zz4K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkNPUlJFQ1QtSUNPTiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IgoJIHk9IjBweCIgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNCAyNDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNGRkZGRkY7fQoJLnN0MXtmaWxsOiM1MjhCREY7fQo8L3N0eWxlPgo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPgo8cGF0aCBpZD0iU2hhcGVfM19jb3B5IiBjbGFzcz0ic3QxIiBkPSJNMTIsMkM2LjUsMiwyLDYuNSwyLDEyczQuNSwxMCwxMCwxMHMxMC00LjUsMTAtMTBTMTcuNSwyLDEyLDJ6IE0xNy45LDguOWwtNy43LDcuNwoJYy0wLjQsMC40LTAuOSwwLjQtMS4zLDBsLTMuMi0zLjJjLTAuNC0wLjQtMC40LTAuOSwwLTEuM3MwLjktMC40LDEuMywwbDIuNSwyLjVsNy4xLTcuMWMwLjMtMC40LDAuOS0wLjQsMS4zLDAKCUMxOC4yLDcuOSwxOC4yLDguNSwxNy45LDguOUMxNy45LDguOSwxNy45LDguOSwxNy45LDguOXoiLz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,"+c("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMiAxOCIgd2lkdGg9IjEycHgiIGhlaWdodD0iMTZweCI+DQoJPGRlZnM+DQoJCTxzdHlsZT4NCgkJCS5ub3JtYWwgew0KCQkJCWZpbGw6IHt0ZXh0fTsNCgkJCQlvcGFjaXR5OiAwLjc7DQoJCQkJaXNvbGF0aW9uOmlzb2xhdGU7DQoJCQl9DQoJCTwvc3R5bGU+DQoJPC9kZWZzPg0KCTxwYXRoIGNsYXNzPSJub3JtYWwiIGQ9Ik0xMCwwSDJBMiwyLDAsMCwwLDAsMlYxOGwyLS4yMiw0LTMuNjYsNCwzLjY2TDEyLDE4VjJBMiwyLDAsMCwwLDEwLDBaTTIsMmg4VjE0LjQ5bC00LTMtNCwzWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCkiLz4NCjwvc3ZnPg=="), +"data:image/svg+xml;base64,"+c("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMiAxOCIgd2lkdGg9IjEycHgiIGhlaWdodD0iMTZweCI+DQoJPGRlZnM+DQoJCTxzdHlsZT4NCgkJCS5vdmVyIHsNCgkJCQlmaWxsOiB7bGlzdEl0ZW0ubGFiZWwub3Zlcn07DQoJCQkJb3BhY2l0eTogMC43Ow0KCQkJCWlzb2xhdGlvbjppc29sYXRlOw0KCQkJfQ0KCQk8L3N0eWxlPg0KCTwvZGVmcz4NCgk8cGF0aCBjbGFzcz0ib3ZlciIgZD0iTTEwLDBIMkEyLDIsMCwwLDAsMCwyVjE4bDItLjIyLDQtMy42Niw0LDMuNjZMMTIsMThWMkEyLDIsMCwwLDAsMTAsMFpNMiwyaDhWMTQuNDlsLTQtMy00LDNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwKSIvPg0KPC9zdmc+"), +"data:image/svg+xml;base64,"+c("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMiAxOCIgd2lkdGg9IjEycHgiIGhlaWdodD0iMTZweCI+DQoJPGRlZnM+DQoJCTxzdHlsZT4NCgkJCS5zZWxlY3RlZCB7DQoJCQkJZmlsbDoge2xpc3RJdGVtLmxhYmVsLnByZXNzZWR9Ow0KCQkJCW9wYWNpdHk6IDAuNzsNCgkJCQlpc29sYXRpb246aXNvbGF0ZTsNCgkJCX0NCgkJPC9zdHlsZT4NCgk8L2RlZnM+DQoJPHBhdGggY2xhc3M9InNlbGVjdGVkIiBkPSJNMTAsMEgyQTIsMiwwLDAsMCwwLDJWMThsMi0uMjIsNC0zLjY2LDQsMy42NkwxMiwxOFYyQTIsMiwwLDAsMCwxMCwwWk0yLDJoOFYxNC40OWwtNC0zLTQsM1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDApIi8+DQo8L3N2Zz4="), +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAADcmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmFjOGVjNDFhLTZkYWItODQ0Ni04YzkzLWU1Mjk3N2YwMmE4NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFRThCNzU3NDYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFRThCNzU3MzYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cykiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0OWFlZmI1OC00ZWFmLWQ3NDgtYTI0ZS0zNmNhNGQ2M2QwNTYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6N0MwQkFBM0M2MjAxMTFFNUI4QjBERTk4MjY5MjQwQjUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6MGSVVAAAE3klEQVR42uycW4hWVRiG15Q4eYzGQySSQlriEQ9BF2mE4iSdESRRIb0RD+mNmHgICjqQEGUe6sqgCy1i0iRinAzELrooQhHLGQURUTzMiM7omCLj+/F/czX/t/890z6s9e/3hZcZ1l6z19r7mXXca62arq4uR/mjh/gKCIQiEAKhCIRAKAIhEIpACIQiEIpACIQiEAKhCIRAKAIhEMoX9Yu62NbWxjcUobq6OpaQQpcQz/QwPBOeDU+Fx8Oj4UfhoRrnJnwDvgC3wCfgY/Bf8P0QHrImahmQB1VWLfwGvAieqy+/LxJIR+Dv4QPwf75WWb4CGQavg9fo70mqFd4F79DfCSRCA+HN8Hp4cMppdcBfwB/Bt9mo99Sr8Cl4SwYwnKYhaf2jaXMconoE/hL+CR6TQ/pPato7NS+FbtSfgH+Gp8eMfwv+HT6qpakZvqzVT/d//ePw0/BEeI72ygbFvP/f8MvwpSK2IfLSGuGxFeJ1aby98CG4s5fpDNAqaTlcL89cIf45jddcpDZknI4PKsFo0NKzQLusnX1Iq1P/doHe60CF+GM1b+OK0obIYO5XeGREnLPwfHghfDzBtOVeb+q9z0bEG6njltHVDqQ2RuP9HTwDbkoxH02axv4YjX1tNQP5LKIBl7ZiK/yWToGkLUljsaZpNaTTNc9VCeR1eHUEjHfgD3OoQiXNVRFQVmveqwrIEHh3xPXNOp2Rl77WPFiSvA+tJiCb4FHGNanHP/FggCp52Gdck7y/Wy0Dw2Hatx9s9KZmZNRmxC3JMjh8qsy1Du0St4Y+DomaKFzlEQxRu+apnOQZ1oVeZfWPeMCGlLu2/6dL3BDRwPcPGYiMjocbvaoPnL963+h1DddnChbIMiP8cMIj8KQln34be/lM3gOREW69cW2v81/fGOH1aY7e0wTyrNGYyxT6wQCAHNS8lmvcZ4UIZL4RLt8z7gQA5I7mtZyeCxHIS0b4UReOrLw+EyIQqxScDAiIldcJIQLZYTTmvwUEpMUIHxMikB/gta40PXIF/lwHVrcCAnLVCH8srQR9X7mYt2RUbq1yrOFia390N9SReugaYoR3EEg+GmGEtxNIPhpvhJ8nkHw02Qj/l0Dy0Rwj/DSBZC9ZeD3buPYHgWSv11z5RdrSw/qTQLLX20Z4o0toSxyBxJdsKrVmq79NM2ECKa/3XPltC9fgXwgkW81zpVX35fSVS3HahEB6SqZK9hjXujeJOgLJTrLG19qos1OrLALJSLL+eLFx7SL8cRaZIJCSVrrSfnVL8qHtJoFkoy3ablibQeWz849ZZaZfgUHIfg/Z97EkIs5xLR2OQNLv2u5x0Ttt5UShV1wfj91glRVP01xp8UVTBRiyuOFFheJYQpKVzNrKwQErXPyDA2SF+5k8MhsykCnwPdfzaA3ZYy6nREyCX4Cfd/EPs+nV0RoEUlqWsx1eCie9Bkc2nW5wOa87Dg3Ipy75bWXntSd1yIcHDK1RT3KzTIcOBif6AqOo3d42HX/I0tZW3zIXWgnp68chmfaQjZxyoKac0bXNRxghlpCN2m1dpj/btXEfpD0uqYaua89Luq3dx8TKN3AeE1vt4mLrAohACIQiEAKhCIRAKAIhEIpACq7IqROKJYRA+AoIhCIQAqEIhEAoAiEQikCKrQcCDABHPgH2w7NQdAAAAABJRU5ErkJggg==", +"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxOSIgdmlld0JveD0iMCAwIDE3IDE5Ij4KICA8bWV0YWRhdGE+PD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIi8+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PjwvbWV0YWRhdGE+CjxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgICAgZmlsbC1ydWxlOiBldmVub2RkOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBpZD0iU2hhcGVfMTUwMF9jb3B5XzciIGRhdGEtbmFtZT0iU2hhcGUgMTUwMCBjb3B5IDciIGNsYXNzPSJjbHMtMSIgZD0iTTY3NDUsNjc3bC01LTUsNS01djNoMTB2NGgtMTB2M1ptNy0xLDUsNS01LDV2LTNoLTEwdi00aDEwdi0zWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTY3NDAgLTY2NykiLz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOSIgaGVpZ2h0PSIxNyIgdmlld0JveD0iMCAwIDE5IDE3Ij4KICA8bWV0YWRhdGE+PD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIi8+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PjwvbWV0YWRhdGE+CjxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgICAgZmlsbC1ydWxlOiBldmVub2RkOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBpZD0iU2hhcGVfMTUwMF9jb3B5XzciIGRhdGEtbmFtZT0iU2hhcGUgMTUwMCBjb3B5IDciIGNsYXNzPSJjbHMtMSIgZD0iTTY3NDksNjgwbC01LDUtNS01aDNWNjcwaDR2MTBoM1ptLTEtNyw1LTUsNSw1aC0zdjEwaC00VjY3M2gtM1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02NzM5IC02NjgpIi8+Cjwvc3ZnPgo=", +"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICB3aWR0aD0iMjhweCIgaGVpZ2h0PSIzM3B4IiB2aWV3Qm94PSIwIDAgMjguMzAyIDMzLjI0MiI+DQoJPHBhdGggZD0iTTAsMS44VjMxLjQ0MmExLjgsMS44LDAsMCwwLDIuNzI2LDEuNTQzbDI0LjctMTQuODJhMS44LDEuOCwwLDAsMCwwLTMuMDg3TDIuNzI2LjI1N0ExLjgsMS44LDAsMCwwLDAsMS44WiIgc3R5bGU9ImZpbGw6IzMzMyIvPg0KPC9zdmc+","data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyOHB4IiBoZWlnaHQ9IjMzcHgiIHZpZXdCb3g9IjAgMCAyOC4zMDIgMzMuMjQyIj4NCgk8cGF0aCBkPSJNMCwxLjhWMzEuNDQyYTEuOCwxLjgsMCwwLDAsMi43MjYsMS41NDNsMjQuNy0xNC44MmExLjgsMS44LDAsMCwwLDAtMy4wODdMMi43MjYuMjU3QTEuOCwxLjgsMCwwLDAsMCwxLjhaIiBzdHlsZT0iZmlsbDojNTI4YmRmIi8+DQo8L3N2Zz4="]; +return"/* reset styles */* {box-sizing: border-box;-webkit-touch-callout: none;-webkit-user-select: none;-ms-user-select: none;user-select: none; }input,textarea {-webkit-user-select: text;-ms-user-select: text;user-select: text; }html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video {margin: 0;padding: 0;border: 0; }/* HTML5 display-role reset for older browsers */article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section {display: block; }ol,ul {list-style: none; }table {border-collapse: collapse;border-spacing: 0; }div {-webkit-tap-highlight-color: rgba(0, 0, 0, 0);-webkit-user-drag: none; }input {-webkit-appearance: none;-moz-appearance: none; } input::-ms-clear {display: none; }.clear {clear: both; }*::-moz-focus-inner {border: 0; }body {margin: 0;padding: 0;overflow: hidden;cursor: default;-ms-touch-action: pan-y;touch-action: pan-y;-webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body .password_form, body .info_panel {position: absolute;background: #F7F7F7;border-radius: 4px;width: 513px;height: 210px;font-family: Arial; } body .password_form *, body .info_panel * {box-sizing: border-box; } body .password_form .password_label {position: absolute;color: #3A3A3A;font-size: 15px;top: 63px;left: 55px; } body .password_form .wrong_password_label {position: absolute;color: #DD4A37;font-size: 12px;top: 131px;left: 55px; } body .password_form input {position: absolute;width: 330px;height: 32px;background: #FFFFFF;border: 1px solid #D1D2D4;padding: 1px;border-radius: 2px;font-size: 18px;color: #231F20;left: 54px;top: 94px;padding-left: 8px; } body .password_form button {border: transparent;background: transparent;color: #343434;font-family: Arial;font-size: 15px;text-shadow: 0 1px 0 rgba(255, 255, 255, 0.4); } body .password_form button::before {background: linear-gradient(to bottom, #D3D3D3, #BABABA);position: absolute;content: '';top: 0;right: 0;bottom: 0;left: 0;border-radius: 4px;z-index: -1; } body .password_form button::after {background: linear-gradient(to bottom, #DCDCDC, #D1D1D1);position: absolute;content: '';top: 1px;right: 1px;bottom: 1px;left: 1px;border-radius: 4px;z-index: -1; } body .password_form .btn_ok {position: absolute;top: 94px;right: 55px;width: 60px;height: 32px;opacity: 0.99; } body .info_panel {display: table; } body .info_panel .label {position: static;display: table-cell;vertical-align: middle;width: 100%;padding-left: 120px;padding-right: 40px;color: #3A3A3A;font-size: 15px; } body .info_panel::after {position: absolute;content: '';width: 63px;height: 63px;top: 73px;left: 46px; } body .info_panel.domain::after {background: transparent url("+ +g[0]+"); } body .info_panel.time::after {background: transparent url("+g[1]+"); }.component_base,.component_container {position: absolute; }:focus {outline: none; }::-moz-focus-inner {border: 0; }input {-webkit-appearance: none;appearance: none; }button {cursor: pointer;margin: 0;border: 0; }button[disabled] {cursor: default; }.__player_view_id__ {position: absolute; } .__player_view_id__ > * {position: absolute; } .__player_view_id__ .slide {white-space: nowrap;font-size: 0; } .__player_view_id__ .slide a {text-decoration: none;cursor: pointer; } .__player_view_id__ .slide a img {border: 0; } .__player_view_id__ .slide * {-ms-transform-origin: 0 0;transform-origin: 0 0; } .__player_view_id__ .slide.relpos, .__player_view_id__ .slide .relpos {position: relative !important;vertical-align: top; } .__player_view_id__ .slide.kern, .__player_view_id__ .slide .kern {text-rendering: optimizeLegibility;font-feature-settings: 'kern' 1, 'liga' 0; } .__player_view_id__ .slide.nokern, .__player_view_id__ .slide .nokern {text-rendering: optimizeSpeed;font-feature-settings: 'kern' 0, 'liga' 0; } .__player_view_id__ .fullscreen {-ms-transform: none !important;transform: none !important;top: 0 !important;left: 0 !important; } .__player_view_id__ .fullscreen > video, .__player_view_id__ .fullscreen .video_player {background-color: black;width: __slide_width__ !important;height: __slide_height__ !important;z-index: 100;-ms-transform: none !important;transform: none !important; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen {background: url("+ +g[2]+") no-repeat; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen:hover {background: url("+g[3]+") no-repeat; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen:active {background: url("+g[4]+") no-repeat; } .__player_view_id__ .video_player video {width: 100%;height: 100%;margin: auto;top: 0;right: 0;bottom: 0;left: 0; } .__player_view_id__ .video_player video::cue {color: #FFFFFF;background-color: rgba(8, 8, 8, 0.75);border-radius: 4px;font-family: Helvetica, Roboto, Arial, sans-serif;line-height: 1.1; } .__player_view_id__ .video_player.poster_frame_hide_video video {display: none; } .__player_view_id__ .video_player.poster_frame video {opacity: 0; } .__player_view_id__ .video_player.poster_frame_hide_video .poster, .__player_view_id__ .video_player.poster_frame .poster {position: absolute;width: 100%;height: 100%; } .__player_view_id__ .video_player .controls {height: 36px;background: rgba(45, 50, 55, 0.85098);border: 1px solid #444648;cursor: default;border-radius: 4px; } .__player_view_id__ .video_player .controls, .__player_view_id__ .video_player .controls * {-webkit-backface-visibility: hidden;backface-visibility: hidden; } .__player_view_id__ .video_player .controls .progress {background-color: #75787A;height: 14px;left: 64px;top: 0;bottom: 0;margin-top: auto;margin-bottom: auto;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark {width: 10px;height: 10px;margin-top: -5px;margin-left: -5px;top: 50%;background: url("+ +g[5]+") no-repeat;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark:hover, .__player_view_id__ .video_player .controls .progress .bookmark:active {background: url("+g[6]+") no-repeat; } .__player_view_id__ .video_player .controls .progress .loading {background-color: #B1B3B5;height: 100%; } .__player_view_id__ .video_player .controls .progress .playing {background-color: #FFFFFF;height: 100%; } .__player_view_id__ .video_player .controls .progress .tooltip {background: url("+ +g[7]+") no-repeat;width: 60px;height: 25px;top: -33px;margin-left: -30px;font-family: Arial;font-size: 12px;padding-top: 2px;text-align: center; } .__player_view_id__ .video_player .controls .volume_popup {border-radius: 3px;background: rgba(45, 50, 55, 0.85098);top: -67px;right: 65px;padding: 8px;box-sizing: border-box;width: 28px;height: 64px; } .__player_view_id__ .video_player .controls .volume_popup .volume {background: url("+g[8]+");position: relative;cursor: pointer;width: 12px;height: 48px; } .__player_view_id__ .video_player .controls .volume_popup .volume .back {background: url("+ +g[9]+");width: 100%; } .__player_view_id__ .video_player .controls button {width: 100%;height: 100%; } .__player_view_id__ .video_player .controls button.rate {background: url("+g[10]+") no-repeat center; } .__player_view_id__ .video_player .controls button.rate.selected {background-color: rgba(255, 255, 255, 0.1); } .__player_view_id__ .video_player .controls button.mute {background: url("+g[11]+"); } .__player_view_id__ .video_player .controls button.mute:hover {background: url("+ +g[12]+"); } .__player_view_id__ .video_player .controls button.mute:active {background: url("+g[13]+"); } .__player_view_id__ .video_player .controls button.mute.selected {background: url("+g[14]+"); } .__player_view_id__ .video_player .controls button.mute.selected:hover {background: url("+g[15]+"); } .__player_view_id__ .video_player .controls button.mute.selected:active {background: url("+g[16]+"); } .__player_view_id__ .video_player .controls button.subtitles {background: url("+ +g[17]+") no-repeat center; } .__player_view_id__ .video_player .controls button.subtitles.selected {background-color: rgba(255, 255, 255, 0.1); } .__player_view_id__ .video_player .controls button.play {background: url("+g[18]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:hover {background: url("+g[19]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:active {background: url("+g[20]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected {background: url("+ +g[21]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:hover {background: url("+g[22]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:active {background: url("+g[23]+") no-repeat; } .__player_view_id__ .video_player .controls button.play::after {background: url("+g[24]+");width: 1px;height: 32px;right: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls button.toggle_fullscreen {background: url("+ +g[25]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:hover {background: url("+g[26]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:active {background: url("+g[27]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen::before {background: url("+g[24]+") no-repeat;width: 1px;height: 32px;left: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls .subtitles-list {width: 195px;right: 0;border-radius: 4px;border: solid 1px #444648;background-color: rgba(45, 50, 55, 0.85);font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;font-weight: normal;font-stretch: normal;font-style: normal;line-height: normal;letter-spacing: normal;padding: 3px 0;bottom: 37px; } .__player_view_id__ .video_player .controls .subtitles-list__caption {position: relative !important;padding: 12px 0 22px 0;color: #b8b8b8;text-align: center; } .__player_view_id__ .video_player .controls .subtitles-list__caption::after {position: absolute;content: '';width: calc(100% - 20px);left: 0;right: 0;bottom: 5px;margin: auto;border-bottom: 1px solid #444648; } .__player_view_id__ .video_player .controls .subtitles-list__item {color: #b8b8b8;position: relative !important;padding: 10px 2px 10px 35px;cursor: pointer;overflow: hidden;text-overflow: ellipsis; } .__player_view_id__ .video_player .controls .subtitles-list__item.subtitles-list__item_active {background-color: rgba(255, 255, 255, 0.1);color: #FFFFFF; } .__player_view_id__ .video_player .controls .subtitles-list__item[aria-selected='true'] {background-color: rgba(0, 0, 0, 0.24);color: #FFFFFF;padding-left: 12px; } .__player_view_id__ .video_player .controls .subtitles-list__item[aria-selected='true']::before {background: url("+ +g[28]+") no-repeat;width: 14px;height: 15px;padding-right: 23px;content: ''; } .__player_view_id__ .video_player .controls .toggle_fullscreen {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .play {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .rate {width: 32px;height: 34px;right: 95px;top: 0; } .__player_view_id__ .video_player .controls .rate.rate_subtitle-button-next {right: 127px; } .__player_view_id__ .video_player .controls .playback-rate-menu {width: 120px;right: 51px;border-radius: 4px;border: solid 1px #444648;background-color: rgba(45, 50, 55, 0.85);font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;font-weight: normal;font-stretch: normal;font-style: normal;line-height: normal;letter-spacing: normal;padding: 3px 0;bottom: 37px; } .__player_view_id__ .video_player .controls .playback-rate-menu.playback-rate-menu_subtitle-button-next {right: 83px; } .__player_view_id__ .video_player .controls .playback-rate-menu__caption {position: relative !important;padding: 12px 0 22px 0;color: #b8b8b8;text-align: center; } .__player_view_id__ .video_player .controls .playback-rate-menu__caption::after {position: absolute;content: '';width: calc(100% - 20px);left: 0;right: 0;bottom: 5px;margin: auto;border-bottom: 1px solid #444648; } .__player_view_id__ .video_player .controls .playback-rate-menu__item {color: #b8b8b8;position: relative !important;padding: 10px 2px 10px 35px;cursor: pointer;overflow: hidden;text-overflow: ellipsis; } .__player_view_id__ .video_player .controls .playback-rate-menu__item.playback-rate-menu__item_active {background-color: rgba(255, 255, 255, 0.1);color: #FFFFFF; } .__player_view_id__ .video_player .controls .playback-rate-menu__item[aria-selected='true'] {background-color: rgba(0, 0, 0, 0.24);color: #FFFFFF;padding-left: 12px; } .__player_view_id__ .video_player .controls .playback-rate-menu__item[aria-selected='true']::before {background: url("+ +g[28]+") no-repeat;width: 14px;height: 15px;padding-right: 23px;content: ''; } .__player_view_id__ .video_player .controls .subtitles {width: 32px;height: 34px;right: 95px;top: 0; } .__player_view_id__ .video_player .controls .toggle_fullscreen {right: -1px; } .__player_view_id__ .video_player .controls .mute {width: 22px;height: 22px;right: 67px;top: 6px; }.popup_layer {position: absolute; } .popup_layer .modal_layer {background: #000000;opacity: 0.4;z-index: 10;width: 100%;height: 100%; } .popup_layer .message_box, .popup_layer .confirm_window {background: #FFFFFF;border-radius: 5px;border: 1px solid rgba(0, 0, 0, 0.75);width: 357px;height: 150px;position: absolute;top: 0;right: 0;bottom: 0;left: 0;margin: auto;z-index: 10; } .popup_layer .message_box::after, .popup_layer .confirm_window::after {background-color: #E6E6E6;width: 100%;height: 1px;top: 30px;position: absolute;content: ''; } .popup_layer .message_box .title, .popup_layer .message_box .message, .popup_layer .confirm_window .title, .popup_layer .confirm_window .message {font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;color: #323232; } .popup_layer .message_box .title, .popup_layer .confirm_window .title {position: absolute;left: 13px;top: 7px;font-weight: bold;background: transparent; } .popup_layer .message_box .message, .popup_layer .confirm_window .message {position: absolute;top: 47px;left: 69px;margin-right: 25px; } .popup_layer .message_box .message::before, .popup_layer .confirm_window .message::before {background-color: #E6E6E6;width: 35px;height: 35px;left: -45px;position: absolute;content: ''; } .popup_layer .message_box button, .popup_layer .confirm_window button {font-size: 14px;border-radius: 5px;color: #323232;width: 68px;height: 30px; } .popup_layer .message_box button, .popup_layer .message_box button.mobile:hover, .popup_layer .message_box button.mobile:active, .popup_layer .confirm_window button, .popup_layer .confirm_window button.mobile:hover, .popup_layer .confirm_window button.mobile:active {background: #D4D4D4; } .popup_layer .message_box button:hover, .popup_layer .message_box button:active, .popup_layer .message_box button.mobile.active, .popup_layer .confirm_window button:hover, .popup_layer .confirm_window button:active, .popup_layer .confirm_window button.mobile.active {background: #B8B8B8; } .popup_layer .confirm_window button.btn_yes {left: 101px;top: 98px; } .popup_layer .confirm_window button.btn_no {left: 181px;top: 98px; } .popup_layer .confirm_window .message::before {background: url("+ +g[29]+"); } .popup_layer .message_box button.btn_ok {left: 141px;top: 98px; } .popup_layer .message_box .message::before {background: url("+g[30]+"); }.transitionSlide.paused * {animation-play-state: paused !important; }.framesLayer .video_player {-ms-transform-origin: 0 0;transform-origin: 0 0; }.framesLayer *:not(.framesLayerContent) {pointer-events: all; }.framesLayer .framesLayerContent {position: absolute; } .framesLayer .framesLayerContent > div {pointer-events: all; }.trial_banner {position: relative;transform: translateZ(0); } .trial_banner .banner-content, .trial_banner .banner-content_hover {position: absolute;left: 0;right: 0;top: 0;bottom: 0;width: 100%;height: 100%; } .trial_banner .banner-content {visibility: visible;z-index: 1; } .trial_banner .banner-content_hover {visibility: hidden;z-index: 0; } .trial_banner .days_remaining {position: absolute;font-family: 'Open Sans', Arial, sans-serif;font-weight: normal;font-size: 13px;left: 65px;top: 41px;color: #7C1645;z-index: 1; } .trial_banner:hover .banner-content {visibility: hidden;z-index: 0; } .trial_banner:hover .banner-content_hover {visibility: visible;z-index: 1; }.popup-layer {top: 0;right: 0;bottom: 0;left: 0;z-index: 1;position: absolute;border-radius: inherit; }.modal-layer {background: #000000;opacity: 0.4;position: absolute;width: 100%;height: 100%;border-radius: inherit; }.slide-transiting .quiz-uikit-primary-button {transition: none; }.slide-transiting .quiz-uikit-secondary-button {transition: none; }.slide-transiting .quiz-uikit-link-button {transition: none; }.slide-transiting .visuals-uikit-primary-button {transition: none; }.slide-transiting .visuals-uikit-secondary-button {transition: none; }.slide-transiting .visuals-uikit-link-button {transition: none; }.uikit-primary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-primary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-primary-button.uikit-primary-button_size_medium {padding: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:first-child {margin-left: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:last-child {margin-right: 10px; } .uikit-primary-button.uikit-primary-button_size_small {padding: 6px 12px; } .uikit-primary-button.uikit-primary-button_size_small .uikit-primary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-primary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__button-text {margin-right: 8px; } .uikit-primary-button__left-icon {margin-right: 8px; } .uikit-primary-button__button-text:first-child {margin-left: 0; } .uikit-primary-button__button-text:last-child {margin-right: 0; } .uikit-primary-button__left-icon:first-child {margin-left: 0; } .uikit-primary-button__left-icon:last-child {margin-right: 0; } .uikit-primary-button__right-icon:first-child {margin-left: 0; } .uikit-primary-button__right-icon:last-child {margin-right: 0; } .uikit-primary-button[disabled] {opacity: 0.4; } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-secondary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-secondary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-secondary-button.uikit-secondary-button_size_medium {padding: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:first-child {margin-left: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:last-child {margin-right: 10px; } .uikit-secondary-button.uikit-secondary-button_size_small {padding: 6px 12px; } .uikit-secondary-button.uikit-secondary-button_size_small .uikit-secondary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-secondary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__button-text {margin-right: 8px; } .uikit-secondary-button__left-icon {margin-right: 8px; } .uikit-secondary-button__button-text:first-child {margin-left: 0; } .uikit-secondary-button__button-text:last-child {margin-right: 0; } .uikit-secondary-button__left-icon:first-child {margin-left: 0; } .uikit-secondary-button__left-icon:last-child {margin-right: 0; } .uikit-secondary-button__right-icon:first-child {margin-left: 0; } .uikit-secondary-button__right-icon:last-child {margin-right: 0; } .uikit-secondary-button[disabled] {opacity: 0.4; } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-link-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-link-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-link-button.uikit-link-button_size_medium {padding: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text {font-size: 17px;line-height: 20px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:first-child {margin-left: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:last-child {margin-right: 10px; } .uikit-link-button.uikit-link-button_size_small {padding: 6px 12px; } .uikit-link-button.uikit-link-button_size_small .uikit-link-button__button-text {font-size: 14px;line-height: 20px; } .uikit-link-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__button-text {margin-right: 8px; } .uikit-link-button__left-icon {margin-right: 8px; } .uikit-link-button__button-text:first-child {margin-left: 0; } .uikit-link-button__button-text:last-child {margin-right: 0; } .uikit-link-button__left-icon:first-child {margin-left: 0; } .uikit-link-button__left-icon:last-child {margin-right: 0; } .uikit-link-button__right-icon:first-child {margin-left: 0; } .uikit-link-button__right-icon:last-child {margin-right: 0; } .uikit-link-button[disabled] {opacity: 0.4; } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-primary-button {background: var(--primary-button-background-color);color: var(--primary-button-text-color); } .uikit-primary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--primary-button-border-color);background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-primary-button__button-text {font-family: var(--font-family-bold);font-weight: 700; } .uikit-primary-button.uikit-primary-button_active, .uikit-primary-button[aria-pressed='true'], .uikit-primary-button:focus {background: var(--primary-button-background-color-active);color: var(--primary-button-text-color-active); } .uikit-primary-button.uikit-primary-button_active::after, .uikit-primary-button[aria-pressed='true']::after, .uikit-primary-button:focus::after {background: var(--primary-button-border-color-active);background-origin: border-box; }.uikit-secondary-button {background: var(--secondary-button-background-color);color: var(--secondary-button-text-color); } .uikit-secondary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--secondary-button-border-color);background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-secondary-button__button-text {font-family: var(--font-family-normal); } .uikit-secondary-button.uikit-secondary-button_active, .uikit-secondary-button[aria-pressed='true'], .uikit-secondary-button:focus {background: var(--secondary-button-background-color-active);color: var(--secondary-button-text-color-active); } .uikit-secondary-button.uikit-secondary-button_active::after, .uikit-secondary-button[aria-pressed='true']::after, .uikit-secondary-button:focus::after {background: var(--secondary-button-border-color-active);background-origin: border-box; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 15px; }.uikit-link-button {background: var(--link-button-background-color);color: var(--link-button-text-color);border: none; } .uikit-link-button.uikit-link-button_active, .uikit-link-button[aria-pressed='true'] {background: var(--link-button-background-color); }.uikit-collapsed-control {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;position: relative;overflow: hidden;padding: 10px;border: none;border-radius: var(--button-border-radius);background: var(--secondary-button-background-color-active);color: var(--secondary-button-text-color-active);transition-property: background, color;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-collapsed-control::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--secondary-button-border-color-active);background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-collapsed-control__collapsed-component {cursor: pointer;display: -ms-flexbox;display: flex; } .uikit-collapsed-control__expanded-component {margin-left: 8px;opacity: 1;transition-property: width, opacity;transition-duration: 300ms;transition-timing-function: ease; } .uikit-collapsed-control.uikit-collapsed-control_collapsed {background: var(--secondary-button-background-color);color: var(--secondary-button-text-color);padding-right: 2px; } .uikit-collapsed-control.uikit-collapsed-control_collapsed::after {background: var(--secondary-button-border-color);background-origin: border-box; } .uikit-collapsed-control.uikit-collapsed-control_collapsed .uikit-collapsed-control__expanded-component {width: 0;opacity: 0; } .uikit-collapsed-control[data-tooltip]::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 0; } .uikit-collapsed-control[data-tooltip]:hover::before {opacity: 1;visibility: visible; }.menu-base {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: start;align-items: start;font-family: var(--font-family-normal); }.menu-base-item {width: 100%;box-sizing: border-box;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;height: 44px;padding: 0 20px;color: var(--popup-text-color); } .menu-base-item__label {-ms-flex-positive: 1;flex-grow: 1;font-size: 15px;line-height: 20px;margin-left: 12px; } .menu-base-item__icon {width: 20px;height: 20px;-ms-flex-negative: 0;flex-shrink: 0;color: var(--popup-text-color); } .menu-base-item__value {-ms-flex-negative: 0;flex-shrink: 0;margin-left: 16px; } .menu-base-item.menu-base-item_clickable:hover {cursor: pointer;background: var(--popup-background-hover-color);color: var(--popup-text-hover-color); } .menu-base-item.menu-base-item_clickable:hover .menu-base-item__icon {color: var(--popup-text-hover-color); }.rate-menu {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;width: 100%;padding: 12px 0; } .rate-menu__caption {padding: 8px 20px;color: var(--popup-text-color);font-size: 16px;line-height: 22px;font-family: var(--font-family-bold);font-weight: 700; } .rate-menu__delimiter {width: 100%;height: 1px;background: var(--popup-text-color);opacity: 0.08;margin: 8px 0; }.presenter-info {font-family: var(--font-family-normal);box-sizing: border-box;position: relative;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;color: var(--panel-text-color); } .presenter-info__main {display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: start; } .presenter-info__info {display: inline-block;-ms-flex-positive: 1;flex-grow: 1; } .presenter-info__photo {width: 64px;height: 64px;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;overflow: hidden;border-radius: 50%;-ms-flex-negative: 0;flex-shrink: 0;background-repeat: no-repeat;background-position: center;margin-right: 20px; } .presenter-info__photo img {width: auto;height: auto; } .presenter-info__name {font-family: var(--font-family-bold);font-weight: 700;word-wrap: break-word;overflow: hidden;font-size: 16px;line-height: 22px;margin-bottom: 8px;max-height: 53px; } .presenter-info__job {word-wrap: break-word;overflow: hidden;font-size: 14px;line-height: 18px;margin-bottom: 8px; } .presenter-info__phone {word-wrap: break-word;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;font-size: 15px;line-height: 20px; } .presenter-info__links {display: -ms-flexbox;display: flex;margin-top: 8px; } .presenter-info__link {border: 1px solid var(--presenter-info-link-border-color);border-radius: 10px;width: 36px;height: 28px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;position: relative;color: var(--panel-text-color); } .presenter-info__link:not(:last-child) {margin-right: 8px; } .presenter-info__link::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 6px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .presenter-info__link:hover::before {opacity: 1;visibility: visible; } .presenter-info__link-icon {width: 20px;height: 20px; } .presenter-info .bio-container {position: relative;display: -webkit-box;white-space: normal;text-overflow: ellipsis;margin-right: -20px;margin-top: 20px;padding-right: 10px;font-size: 14px;line-height: 20px;-ms-flex-positive: 1;flex-grow: 1;height: 100%;max-height: 120px;overflow: hidden; } .presenter-info .bio-container.bio-container_collapsed {max-height: 60px; } .presenter-info .bio-container.bio-container_collapsed .scroll-area__bio {display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .presenter-info .bio-container .scroll-area {word-break: break-word;overflow: hidden; } .presenter-info .bio-container .container-top-shadow {background: __verticalGradient(var(--panel-color), transparent);background: linear-gradient(to bottom, var(--panel-color), transparent);position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; } .presenter-info .bio-container .container-bottom-shadow {background: __verticalGradient(transparent, var(--panel-color));background: linear-gradient(to bottom, transparent, var(--panel-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; } .presenter-info__show-more {font-size: 14px;line-height: 20px;height: 20px;opacity: 0.6;text-decoration: underline; } .presenter-info__show-more:hover {cursor: pointer;opacity: 0.8; } .presenter-info.presenter-info_popup {margin-bottom: 0; } .presenter-info.presenter-info_no-photo .presenter-info__info {width: 100%; }.attachments-info {font-family: var(--font-family-normal);position: relative;width: 100%;overflow: hidden;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column; } .attachments-info__scroll-area {height: 100%;overflow: hidden; } .attachments-info__delimiter {height: 1px;margin: 8px 20px 8px 62px;background: var(--popup-text-color);opacity: 0.08; } .attachments-info .container-top-shadow {background: __verticalGradient(var(--panel-color), transparent);background: linear-gradient(to bottom, var(--panel-color), transparent);position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; } .attachments-info .container-bottom-shadow {background: __verticalGradient(transparent, var(--panel-color));background: linear-gradient(to bottom, transparent, var(--panel-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; }.attach-item {padding: 8px 20px;box-sizing: border-box;display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: start;cursor: pointer; } .attach-item__icon-container {width: 36px;height: 36px;border-radius: 50%;background: var(--top-panel-icon-container-color);display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;-ms-flex-negative: 0;flex-shrink: 0;margin-right: 6px; } .attach-item__icon {width: 20px;height: 20px;color: var(--popup-text-color);opacity: 0.72; } .attach-item__info-container {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-positive: 1;flex-grow: 1;padding-left: 6px; } .attach-item__title {font-size: 15px;line-height: 20px;margin-bottom: 4px;color: var(--popup-text-color);word-break: break-word;max-height: 60px;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .attach-item__subtitle {font-size: 14px;line-height: 18px;color: var(--popup-text-color);opacity: 0.6; } .attach-item:hover {background: var(--list-item-background-hover-color); } .attach-item:hover .attach-item__title {color: var(--popup-text-hover-color); } .attach-item:hover .attach-item__subtitle {color: var(--popup-text-hover-color); } .attach-item:hover .attach-item__icon {color: var(--popup-text-hover-color); }:root {--page-background-color: __pageBackground__;--button-background-color: __primaryButtonBackground__;--button-hover-background-color: __primaryButtonBackgroundHover__;--button-hover-text-color: __primaryButtonTextHover__;--button-text-color: __primaryButtonText__;--company-logo-background-color: __asideLogoBackground__;--font-family-bold: PFnb;--font-family-bold-italic: PFnbi;--font-family-italic: PFni;--font-family-normal: PFn;--font-family-semibold: PFnsb, PFn;--font-family-semibold-italic: PFnsbi, PFni;--hyperlink-text-color: __hyperlink__;--list-item-background-hover-color: __asideElementBackgroundHover__;--list-item-background-pressed-color: __asideElementBackgroundActive__;--list-item-text-hover-color: __asideElementTextHover__;--list-item-text-pressed-color: __asideElementTextActive__;--list-item-text-visited-color: __asideElementTextVisited__;--panel-color: __asideBackground__;--panel-text-color: __asideElementText__;--panel-video-stub-background-color: __panelVideoStubBackgroundColor__;--panel-video-stub-color: __panelVideoStubColor__;--player-background-color: __playerBackground__;--progressbar-background-color: __progressBackground__;--progressbar-playback-color: __progressPlayback__;--slide-border-color: __slideBorder__;--text-color: __playerText__;--topbar-hover-background-color: __secondaryButtonBackgroundHover__;--topbar-text-color: __secondaryButtonText__;--primary-button-text-color: __primaryButtonText__;--primary-button-text-color-active: __primaryButtonTextHover__;--primary-button-background-color-active: __primaryButtonBackgroundHover__;--primary-button-background-color: __primaryButtonBackground__;--primary-button-border-color: __primaryButtonBorder__;--primary-button-border-color-active: __primaryButtonBorderHover__;--secondary-button-background-color: __secondaryButtonBackground__;--secondary-button-background-color-active: __secondaryButtonBackgroundHover__;--secondary-button-text-color: __secondaryButtonText__;--secondary-button-text-color-active: __secondaryButtonTextHover__;--secondary-button-border-color: __secondaryButtonBorder__;--secondary-button-border-color-active: __secondaryButtonBorderHover__;--volume-control-background-color: __volumeControlBackgroundColor__;--volume-control-playback-color: __volumeControlPlaybackColor__;--volume-control-thumb-color: __volumeControlThumbColor__;--more-menu-volume-control-background-color: __moreMenuVolumeControlBackgroundColor__;--more-menu-volume-control-playbackColor: __moreMenuVolumeControlPlaybackColor__;--more-menu-volume-control-thumb-color: __moreMenuVolumeControlThumbColor__;--popup-background-color: __popupBackground__;--popup-transparent-background-color: __transparentPopupBackground__;--popup-border: __popupBorder__;--popup-background-hover-color: __popupBackgroundHover__;--popup-text-color: __popupText__;--popup-text-hover-color: __popupTextHover__;--link-button-background-color: transparent;--link-button-text-color: __linkButtonTextColor__;--player-text: __playerText__;--button-border-radius: __borderRadius__;--presenter-info-link-border-color: __presenterInfoLinkBorderColor__;--search-field-background-color: __searchFieldBackgroundColor__;--hovered-tab-background-color: __hoveredTabBackgroundColor__;--selected-tab-background-color: __selectedTabBackgroundColor__;--top-panel-icon-container-color: __topPanelIconContainerColor__;--mini-skin-menu-button-text: __miniSkinMenuButtonText__;--mini-skin-menu-button-background-active: __miniSkinMenuButtonBackgroundActive__;--mini-skin-top-bottom-panel-border: __miniSkinTopBottomPanelBorder__;--mini-skin-presenter-delimiter-color: __miniSkinPresenterDelimiterColor__;--top-bottom-panel-border-color: __topBottomPanelBorderColor__; }.universal-side-panel {width: 280px;height: 100%;overflow: hidden;z-index: 0;position: relative;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-transform-origin: left center;transform-origin: left center;background: var(--panel-color);color: var(--panel-text-color);vertical-align: top;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel__presenter-info {padding: 24px 20px;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel__presenter-info.universal-side-panel__presenter-info_with-delimiter::after {content: '';height: 1px;width: 240px;background: var(--popup-text-color);opacity: 0.08;position: absolute;bottom: 0;left: 20px; } .universal-side-panel .logo {width: 100%;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;-ms-flex-negative: 0;flex-shrink: 0;position: relative;background: var(--company-logo-background-color); } .universal-side-panel .logo.logo_has-logo {padding: 12px 0;min-height: 75px;max-height: 180px;max-width: 280px; } .universal-side-panel .logo a {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;height: 100%; } .universal-side-panel .logo a canvas {max-height: 156px;max-width: 280px; } .universal-side-panel .logo.logo_with-delimiter::after {content: '';height: 1px;width: 240px;background: var(--popup-text-color);opacity: 0.08;position: absolute;bottom: 0;left: 20px; } .universal-side-panel .video-container {box-sizing: border-box;overflow: hidden;margin-bottom: 12px;position: relative;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel .video-container::before {content: '';box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.04);position: absolute;z-index: 1;left: 0;top: 0;width: 100%;height: 100%;pointer-events: none; } .universal-side-panel__video-stub {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;box-sizing: border-box;-ms-flex-negative: 0;flex-shrink: 0;height: 158px;margin-bottom: 12px;background: var(--panel-video-stub-background-color);color: var(--panel-video-stub-color); } .universal-side-panel .playerView {box-sizing: border-box;overflow: hidden;position: relative;margin-bottom: 12px;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel .playerView::before {content: '';box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.04);position: absolute;z-index: 1;left: 0;top: 0;width: 100%;height: 100%;pointer-events: none; } .universal-side-panel__maximized {margin: 0;position: absolute;width: 36px;height: 36px;background: rgba(69, 69, 69, 0.84);color: #FFFFFF;border-radius: 10px;-webkit-backdrop-filter: blur(8px);backdrop-filter: blur(8px);left: 8px;bottom: 5px;z-index: 3;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center; } .universal-side-panel__maximized.universal-side-panel__maximized_at-left {right: 8px;left: auto; } .universal-side-panel__maximized.universal-side-panel__maximized_active {background: #454545; } .universal-side-panel__panel-title {color: var(--text-color);padding: 5px 8px 12px 8px; }.outline-info-panel {font-family: var(--font-family-normal);-ms-flex-positive: 1;flex-grow: 1;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;border-radius: inherit;height: 100%; } .outline-info-panel .outline-panel-header {display: -ms-flexbox;display: flex;-ms-flex-negative: 0;flex-shrink: 0;-ms-flex-align: center;align-items: center;width: 100%;height: 68px;padding: 16px 16px 16px 20px; } .outline-info-panel .outline-panel-header__switcher {display: -ms-flexbox;display: flex;-ms-flex-negative: 0;flex-shrink: 0;-ms-flex-positive: 1;flex-grow: 1; } .outline-info-panel .outline-panel-header__panel-title {font-family: var(--font-family-bold);font-size: 16px;line-height: 20px;color: var(--panel-text-color);-ms-flex-negative: 0;flex-shrink: 0;-ms-flex-positive: 1;flex-grow: 1; } .outline-info-panel .search-button {width: 36px;height: 36px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;color: var(--popup-text-color);cursor: pointer; } .outline-info-panel .search-button svg {width: 20px;height: 20px; } .outline-info-panel .clear-button {width: 36px;height: 36px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;color: var(--popup-text-color);cursor: pointer; } .outline-info-panel .clear-button svg {width: 20px;height: 20px; } .outline-info-panel .search-button {opacity: 0.72; } .outline-info-panel .clear-button {position: absolute;right: 4px;top: 2px;opacity: 0.6; } .outline-info-panel .search-wrapper {-ms-flex-positive: 1;flex-grow: 1;position: relative; } .outline-info-panel .search-field {position: relative;height: 40px;width: 100%;background: var(--search-field-background-color);border-radius: 8px;padding: 10px 44px 10px 16px;font-size: 15px;line-height: 20px;color: var(--panel-text-color);border: none;outline: none; } .outline-info-panel .search-field:-ms-input-placeholder {opacity: 0.4; } .outline-info-panel .search-field::placeholder {opacity: 0.4; } .outline-info-panel .panel-tab-button {font-family: var(--font-family-bold);display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;height: 36px;padding: 0 16px;border-radius: var(--button-border-radius);color: var(--panel-text-color);background: transparent;opacity: 0.72;transition: background 0.3s ease, color 0.3s ease, opacity 0.3s ease; } .outline-info-panel .panel-tab-button.panel-tab-button_active {background: var(--hovered-tab-background-color);color: var(--list-item-text-hover-color);opacity: 1; } .outline-info-panel .panel-tab-button.panel-tab-button_chosen {background: var(--selected-tab-background-color);color: var(--list-item-text-pressed-color);opacity: 1; } .outline-info-panel .panel-tab-button:not(:last-child) {margin-right: 4px; } .outline-info-panel.outline-info-panel_mode_notes .outline-info-panel__outline-container {display: none; } .outline-info-panel__notes-container {-ms-flex-positive: 1;flex-grow: 1;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;height: 100%; } .outline-info-panel__outline-container {-ms-flex-positive: 1;flex-grow: 1;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;height: 100%; } .outline-info-panel__outline-container {border-radius: inherit;border-top-left-radius: 0;border-top-right-radius: 0;height: 100%; } .outline-info-panel__notes-container {padding-bottom: 10px; } .outline-info-panel .outline {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;border-radius: inherit;height: 100%; } .outline-info-panel .notes {height: 100%;position: relative;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;padding-left: 12px; } .outline-info-panel .notes .notes-text {word-wrap: break-word;padding-right: 10px; } .outline-info-panel .notes .notes-text p {margin-top: 0;margin-bottom: 0;white-space: pre-wrap; } .outline-info-panel .notes .notes-text p, .outline-info-panel .notes .notes-text span {color: var(--panel-text-color) !important; } .outline-info-panel .notes .notes-text p:first-child {margin-top: 0; } .outline-info-panel .notes .notes-text p:last-child {margin-bottom: 0; } .outline-info-panel .notes .notes-text p, .outline-info-panel .notes .notes-text p.bold span.nobold, .outline-info-panel .notes .notes-text p.italic span.noitalic, .outline-info-panel .notes .notes-text p.bold.italic span.nobold.noitalic {font-family: var(--font-family-normal); } .outline-info-panel .notes .notes-text p span.bold, .outline-info-panel .notes .notes-text p.bold, .outline-info-panel .notes .notes-text p.italic span.bold.noitalic, .outline-info-panel .notes .notes-text p.bold.italic span.noitalic {font-family: var(--font-family-bold); } .outline-info-panel .notes .notes-text p span.italic, .outline-info-panel .notes .notes-text p.bold span.nobold.italic, .outline-info-panel .notes .notes-text p.italic, .outline-info-panel .notes .notes-text p.bold.italic span.nobold {font-family: var(--font-family-italic); } .outline-info-panel .notes .notes-text p span.bold.italic, .outline-info-panel .notes .notes-text p.bold span.italic, .outline-info-panel .notes .notes-text p.italic span.bold, .outline-info-panel .notes .notes-text p.bold.italic {font-family: var(--font-family-bold-italic); } .outline-info-panel .notes__scroll-area {overflow: hidden; } .outline-info-panel.outline-info-panel_mode_outline .outline-info-panel__notes-container {display: none; }.logo-container {display: -ms-flexbox;display: flex; } .logo-container > a {display: -ms-flexbox;display: flex; }.top-panel {display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;-ms-flex-pack: justify;justify-content: space-between;height: 52px;padding: 0 16px;border-bottom: 1px solid var(--top-bottom-panel-border-color);box-sizing: border-box;will-change: transform; } .top-panel.top-panel_reversed {-ms-flex-direction: row-reverse;flex-direction: row-reverse; } .top-panel__container {display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;-ms-flex-align: center;align-items: center; } .top-panel__presenter-info {max-width: 400px;padding: 32px 28px; }.top-main-container {display: -ms-flexbox;display: flex;-ms-flex-positive: 1;flex-grow: 1;-ms-flex-pack: justify;justify-content: space-between;max-height: 100%; } .top-main-container .info-container {margin-left: auto; } .top-main-container .info-container__item:first-child {margin-right: 20px; } .top-main-container .info-container__item:last-child {margin-right: 0; } .top-main-container.top-main-container_reversed {-ms-flex-direction: row-reverse;flex-direction: row-reverse; } .top-main-container.top-main-container_reversed .info-container {margin-right: auto;margin-left: 0;-ms-flex-direction: row-reverse;flex-direction: row-reverse; } .top-main-container.top-main-container_reversed .info-container__item:first-child {margin-right: 0; } .top-main-container.top-main-container_reversed .info-container__item:last-child {margin-right: 20px; }.buttons-container {-ms-flex-negative: 0;flex-shrink: 0; } .buttons-container__button {margin-right: 8px; }.info-container {overflow: hidden; } .info-container__title {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;overflow: hidden;color: var(--text-color);max-width: 480px; } .info-container__title > div {font-family: var(--font-family-normal);font-size: 14px;line-height: 20px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; }:root {--page-background-color: __pageBackground__;--button-background-color: __primaryButtonBackground__;--button-hover-background-color: __primaryButtonBackgroundHover__;--button-hover-text-color: __primaryButtonTextHover__;--button-text-color: __primaryButtonText__;--company-logo-background-color: __asideLogoBackground__;--font-family-bold: PFnb;--font-family-bold-italic: PFnbi;--font-family-italic: PFni;--font-family-normal: PFn;--font-family-semibold: PFnsb, PFn;--font-family-semibold-italic: PFnsbi, PFni;--hyperlink-text-color: __hyperlink__;--list-item-background-hover-color: __asideElementBackgroundHover__;--list-item-background-pressed-color: __asideElementBackgroundActive__;--list-item-text-hover-color: __asideElementTextHover__;--list-item-text-pressed-color: __asideElementTextActive__;--list-item-text-visited-color: __asideElementTextVisited__;--panel-color: __asideBackground__;--panel-text-color: __asideElementText__;--panel-video-stub-background-color: __panelVideoStubBackgroundColor__;--panel-video-stub-color: __panelVideoStubColor__;--player-background-color: __playerBackground__;--progressbar-background-color: __progressBackground__;--progressbar-playback-color: __progressPlayback__;--slide-border-color: __slideBorder__;--text-color: __playerText__;--topbar-hover-background-color: __secondaryButtonBackgroundHover__;--topbar-text-color: __secondaryButtonText__;--primary-button-text-color: __primaryButtonText__;--primary-button-text-color-active: __primaryButtonTextHover__;--primary-button-background-color-active: __primaryButtonBackgroundHover__;--primary-button-background-color: __primaryButtonBackground__;--primary-button-border-color: __primaryButtonBorder__;--primary-button-border-color-active: __primaryButtonBorderHover__;--secondary-button-background-color: __secondaryButtonBackground__;--secondary-button-background-color-active: __secondaryButtonBackgroundHover__;--secondary-button-text-color: __secondaryButtonText__;--secondary-button-text-color-active: __secondaryButtonTextHover__;--secondary-button-border-color: __secondaryButtonBorder__;--secondary-button-border-color-active: __secondaryButtonBorderHover__;--volume-control-background-color: __volumeControlBackgroundColor__;--volume-control-playback-color: __volumeControlPlaybackColor__;--volume-control-thumb-color: __volumeControlThumbColor__;--more-menu-volume-control-background-color: __moreMenuVolumeControlBackgroundColor__;--more-menu-volume-control-playbackColor: __moreMenuVolumeControlPlaybackColor__;--more-menu-volume-control-thumb-color: __moreMenuVolumeControlThumbColor__;--popup-background-color: __popupBackground__;--popup-transparent-background-color: __transparentPopupBackground__;--popup-border: __popupBorder__;--popup-background-hover-color: __popupBackgroundHover__;--popup-text-color: __popupText__;--popup-text-hover-color: __popupTextHover__;--link-button-background-color: transparent;--link-button-text-color: __linkButtonTextColor__;--player-text: __playerText__;--button-border-radius: __borderRadius__;--presenter-info-link-border-color: __presenterInfoLinkBorderColor__;--search-field-background-color: __searchFieldBackgroundColor__;--hovered-tab-background-color: __hoveredTabBackgroundColor__;--selected-tab-background-color: __selectedTabBackgroundColor__;--top-panel-icon-container-color: __topPanelIconContainerColor__;--mini-skin-menu-button-text: __miniSkinMenuButtonText__;--mini-skin-menu-button-background-active: __miniSkinMenuButtonBackgroundActive__;--mini-skin-top-bottom-panel-border: __miniSkinTopBottomPanelBorder__;--mini-skin-presenter-delimiter-color: __miniSkinPresenterDelimiterColor__;--top-bottom-panel-border-color: __topBottomPanelBorderColor__; }.more-menu-popup {padding: 12px 0; } .more-menu-popup .volume-slider-wrapper {width: 86px; } .more-menu-popup .volume-slider {position: relative;width: 80px;height: 3px; } .more-menu-popup .volume-slider__enlarged-click-area {position: absolute;cursor: pointer;width: 100%;height: 40px;top: 50%;-ms-transform: translateY(-50%);transform: translateY(-50%); } .more-menu-popup .volume-slider__background {position: absolute;width: 100%;height: 100%;background: var(--more-menu-volume-control-background-color); } .more-menu-popup .volume-slider__volume {position: absolute;background: var(--more-menu-volume-control-playbackColor);bottom: 0;left: 0;height: 100%;border-radius: 4px; } .more-menu-popup .volume-slider__track {position: relative;height: 100%; } .more-menu-popup .volume-slider__thumb {position: absolute;width: 12px;height: 12px;border-radius: 50%;background: var(--more-menu-volume-control-thumb-color);bottom: -4.5px;margin-left: -6px; }.collapsable-buttons-group {vertical-align: middle;display: -ms-inline-flexbox;display: inline-flex;-ms-flex-align: center;align-items: center;overflow: hidden;-ms-flex-positive: 1;flex-grow: 1;-ms-flex-negative: 1;flex-shrink: 1; } .collapsable-buttons-group__collapsable-button {margin-right: 8px; }.navigation-controls {display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;-ms-flex-align: center;align-items: center;position: relative; } .navigation-controls__button.navigation-controls__button_next {margin-left: 8px; } .navigation-controls__button.navigation-controls__button_prev {margin-left: 20px; } .navigation-controls__button.navigation-controls__button_locked {pointer-events: auto;cursor: url(data/lock.cur), no-drop; } .navigation-controls__label {font-size: 14px;color: var(--text-color);opacity: 0.72; }.play-controls-container {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative;-ms-flex-positive: 1;flex-grow: 1;-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;margin: 14px 16px; } .play-controls-container::before {content: '';display: inline-block;height: 100%;vertical-align: middle; } .play-controls-container__play-pause-button {margin-right: 8px; } .play-controls-container__outline-button {margin-right: 8px; }.universal-control-panel {font-family: var(--font-family-normal);display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;width: 100%;position: relative;-ms-transform-origin: 0 0;transform-origin: 0 0;min-height: 66px;will-change: transform; } .universal-control-panel .volume-slider-wrapper {width: 86px; } .universal-control-panel .volume-slider {position: relative;width: 80px;height: 3px; } .universal-control-panel .volume-slider__enlarged-click-area {position: absolute;cursor: pointer;width: 100%;height: 40px;top: 50%;-ms-transform: translateY(-50%);transform: translateY(-50%); } .universal-control-panel .volume-slider__background {position: absolute;width: 100%;height: 100%;background: var(--volume-control-background-color); } .universal-control-panel .volume-slider__volume {position: absolute;background: var(--volume-control-playback-color);bottom: 0;left: 0;height: 100%;border-radius: 4px; } .universal-control-panel .volume-slider__track {position: relative;height: 100%; } .universal-control-panel .volume-slider__thumb {position: absolute;width: 12px;height: 12px;border-radius: 50%;background: var(--volume-control-thumb-color);bottom: -4.5px;margin-left: -6px; } .universal-control-panel__navigation-controls {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;margin: 14px 16px 14px auto; } .universal-control-panel.universal-control-panel_interaction-mode .universal-control-panel__play-controls-container {display: none; } .universal-control-panel.universal-control-panel_hide-controls {visibility: hidden; }.progress-tooltip {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;z-index: 1; } .progress-tooltip__thumbnail-tooltip {border: 2px var(--top-bottom-bar-background-color) solid;border-radius: 3px;width: 140px;height: 80px;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out; } .progress-tooltip__timing-tooltip {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: 4px; }.universal-skin-separator {position: relative;width: 100%;padding-top: 1px; } .universal-skin-separator::after {content: '';display: block;height: 1px;background: var(--top-bottom-panel-border-color); }.progressbar {position: relative;height: 2px;width: 100%; } .progressbar__progress {position: absolute;top: 0;left: 0;width: 100%;height: 100%;background-color: var(--progressbar-background-color);transition: transform 0.3s ease-in-out; } .progressbar__progress-background {position: absolute;background: var(--progressbar-playback-color);top: 0;left: 0;height: 100%;transition: transform 0.3s ease-in-out; } .progressbar__thumb {width: 12px;height: 12px;border-radius: 50%;background: var(--progressbar-playback-color);bottom: -5px;position: absolute;left: -6px;cursor: pointer; } .progressbar__progress-tooltip {position: absolute;top: -14px;-ms-transform: translateY(-100%);transform: translateY(-100%); }.show-side-panel-button {position: absolute;top: 6px;z-index: 1001; } .show-side-panel-button.show-side-panel-button_side_left {left: 0; } .show-side-panel-button.show-side-panel-button_side_left .show-side-panel-button__button {left: -9px;border-radius: 0 25px 25px 0; } .show-side-panel-button.show-side-panel-button_side_right {right: 0; } .show-side-panel-button.show-side-panel-button_side_right .show-side-panel-button__button {left: 9px;border-radius: 25px 0 0 25px; } .show-side-panel-button.show-side-panel-button_side_right .show-side-panel-button__button.show-side-panel-button__button_active, .show-side-panel-button.show-side-panel-button_side_right .show-side-panel-button__button[aria-pressed='true'], .show-side-panel-button.show-side-panel-button_side_left .show-side-panel-button__button.show-side-panel-button__button_active, .show-side-panel-button.show-side-panel-button_side_left .show-side-panel-button__button[aria-pressed='true'] {background: var(--player-background-color);left: 0; } .show-side-panel-button__button {background: var(--player-background-color);box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.2);transition-property: left; }.popups-layer {position: absolute;margin-left: 0 !important;left: 0;top: 0;width: 100%; } .popups-layer .popup {background: var(--popup-background-color);border: 1px solid var(--popup-border);box-shadow: 0 20px 32px rgba(0, 0, 0, 0.16);-webkit-backdrop-filter: blur(8px);backdrop-filter: blur(8px);border-radius: 10px;position: absolute;top: 0;left: 0; } .popups-layer .popup.popup_outline-popup {width: 280px; } .popups-layer .popup.popup_presenter .mask {width: calc(100% - 2px);left: 1px;bottom: 12px; } .popups-layer .popup.popup_attachments {width: 368px;box-sizing: border-box; }.notes-popup {position: relative;font-size: 15px;line-height: 20px;word-wrap: break-word;width: 372px;padding: 16px;border-radius: inherit; } .notes-popup__scroll-area {overflow: hidden;height: 100%; } .notes-popup .notes-text {word-wrap: break-word; } .notes-popup .notes-text p {margin-top: 0;margin-bottom: 0;white-space: pre-wrap; } .notes-popup .notes-text p, .notes-popup .notes-text span {color: var(--panel-text-color) !important; } .notes-popup .notes-text p:first-child {margin-top: 0; } .notes-popup .notes-text p:last-child {margin-bottom: 0; } .notes-popup .notes-text p, .notes-popup .notes-text p.bold span.nobold, .notes-popup .notes-text p.italic span.noitalic, .notes-popup .notes-text p.bold.italic span.nobold.noitalic {font-family: var(--font-family-normal); } .notes-popup .notes-text p span.bold, .notes-popup .notes-text p.bold, .notes-popup .notes-text p.italic span.bold.noitalic, .notes-popup .notes-text p.bold.italic span.noitalic {font-family: var(--font-family-bold); } .notes-popup .notes-text p span.italic, .notes-popup .notes-text p.bold span.nobold.italic, .notes-popup .notes-text p.italic, .notes-popup .notes-text p.bold.italic span.nobold {font-family: var(--font-family-italic); } .notes-popup .notes-text p span.bold.italic, .notes-popup .notes-text p.bold span.italic, .notes-popup .notes-text p.italic span.bold, .notes-popup .notes-text p.bold.italic {font-family: var(--font-family-bold-italic); }.attachments-popup {padding: 12px 0;border-radius: inherit; }.marker-panel {font-family: var(--font-family-normal);padding: 12px 0;width: 260px; } .marker-panel__separator {position: relative;background: var(--popup-text-color);opacity: 0.08;height: 1px;margin: 3px 0; }.marker-panel-button {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative;padding: 4px 20px;opacity: 1;background-color: transparent;transition: background-color 0.28s ease-in-out;width: 100%; } .marker-panel-button__text {font-size: 15px;text-align: left;color: var(--popup-text-color); } .marker-panel-button.marker-panel-button_type_eraseAll, .marker-panel-button.marker-panel-button_type_endDrawing {padding: 14px 20px 14px 24px; } .marker-panel-button:focus, .marker-panel-button:hover {background-color: var(--list-item-background-hover-color); } .marker-panel-button:focus .marker-panel-button__text, .marker-panel-button:hover .marker-panel-button__text {color: var(--popup-text-hover-color); } .marker-panel-button:focus .marker-panel-button__item-icon, .marker-panel-button:hover .marker-panel-button__item-icon {color: var(--popup-text-hover-color); } .marker-panel-button[disabled] {opacity: 0.5;color: var(--popup-text-color);pointer-events: none; } .marker-panel-button[aria-selected='true'] {background-color: var(--list-item-background-pressed-color);color: var(--list-item-text-pressed-color); }.item-icon {width: 40px;height: 40px;background-color: var(--top-panel-icon-container-color);border-radius: 50%;margin-right: 10px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;color: var(--popup-text-color); } .item-icon__item-icon-image {width: 28px;height: 28px;color: inherit; }.outline {font-family: var(--font-family-normal);position: relative; }.search-result {font-family: var(--font-family-bold);padding: 16px 0 8px 20px;position: relative;font-size: 15px;line-height: 20px;color: var(--popup-text-color); } .search-result.search-result_no-results {font-family: var(--font-family-normal);height: 100%;text-align: center;padding: 60px 0 0;opacity: 0.6; }.slide-item-view {position: relative;overflow: hidden;display: table;width: 100%;color: var(--panel-text-color);transition: background 0.28s ease; } .slide-item-view__content {height: 100%;display: table-row; } .slide-item-view__content > * {display: table-cell;vertical-align: middle; } .slide-item-view__open-button {width: 12px;height: 12px;margin: 0 8px 0 12px;opacity: 0.6;padding: 0;color: var(--popup-text-color);transition: transform 0.3s ease;background: transparent; } .slide-item-view__open-button[aria-pressed='true'] {-ms-transform: rotate(90deg);transform: rotate(90deg); } .slide-item-view__thumb {max-width: 100px;max-height: 60px;vertical-align: middle;margin-top: 1px;border: 1px solid rgba(0, 0, 0, 0.04);border-radius: 4px;background-color: var(--player-background-color); } .slide-item-view__status {position: absolute;width: 18px;height: 18px;background-size: 18px 18px; } .slide-item-view__status.slide-item-view__status_status_correct {background-image: url("+ +g[31]+"); } .slide-item-view__status.slide-item-view__status_status_partially {background-image: url("+g[32]+"); } .slide-item-view__status.slide-item-view__status_status_incorrect {background-image: url("+g[33]+"); } .slide-item-view__status.slide-item-view__status_status_answered {background-image: url("+g[34]+"); } .slide-item-view__status.slide-item-view__status_answered {background-image: url("+g[35]+"); } .slide-item-view__mark {position: absolute;width: 12px;height: 18px;top: 0;bottom: 0;margin: auto;background-image: url("+ +g[36]+");background-size: 12px 18px;background-repeat: no-repeat;margin-left: -40px; } .slide-item-view__mark.slide-item-view__mark_with-status {left: 8px; } .slide-item-view__title-container {width: 100%; } .slide-item-view__title {padding: 0 16px;font-size: 14px;line-height: 18px;max-height: 60px;word-break: break-word;overflow: hidden;display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .slide-item-view__title.slide-item-view__title_minimized {max-height: 70px; } .slide-item-view.slide-item-view_with-thumbnail .slide-item-view__title {padding-left: 11px; } .slide-item-view.slide-item-view_with-thumbnail .slide-item-view__mark {margin-left: -20px; } .slide-item-view.slide-item-view_active {background: var(--list-item-background-hover-color);color: var(--list-item-text-hover-color); } .slide-item-view.slide-item-view_active .slide-item-view__mark {background-image: url("+ +g[37]+"); } .slide-item-view[aria-selected='true'] {background: var(--list-item-background-pressed-color);color: var(--list-item-text-pressed-color); } .slide-item-view[aria-selected='true'] .slide-item-view__mark {background-image: url("+g[38]+"); }.treecontrol.treecontrol_highlight-viewed .slide-item-view.slide-item-view_viewed {color: var(--list-item-text-visited-color); }.treecontrol.treecontrol_highlight-viewed .slide-item-view.slide-item-view_viewed.slide-item-view_active {background: var(--list-item-background-hover-color);color: var(--list-item-text-hover-color); }.treecontrol.treecontrol_highlight-viewed .slide-item-view.slide-item-view_viewed[aria-selected='true'] {background: var(--list-item-background-pressed-color);color: var(--list-item-text-pressed-color); }.highlighted {font-family: var(--font-family-bold);padding: 2px 3px;margin: -2px -3px;font-size: 14px;line-height: 18px;color: var(--popup-text-color);opacity: 1; }.search-context {font-size: 14px;line-height: 18px;color: var(--popup-text-color);opacity: 0.6; }@keyframes preloader_spin {0% {transform: rotate(0deg); } 100% {transform: rotate(360deg); } }.message-box {background: var(--player-background-color);position: absolute;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;border-radius: 7px;min-width: 280px;padding: 40px;box-shadow: 0 8px 16px rgba(0, 0, 0, 0.08); } .message-box::after {content: '';box-sizing: border-box;border: 1px solid var(--popup-border);width: 100%;height: 100%;position: absolute;left: 0;top: 0;border-radius: 7px;pointer-events: none; } .message-box__content {position: relative;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-direction: column;flex-direction: column; } .message-box__icon {width: 24px;height: 24px;margin-bottom: 24px;position: relative;display: inline-block;color: var(--text-color);opacity: 0.72; } .message-box .message-box-buttons {position: relative;width: 100%;height: 36px; } .message-box .message-box-buttons__buttons {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center; } .message-box .message-box-buttons__window-button {margin: 0 4px; } .message-box .vertical-scrollbar {top: 40px; } .message-box__message-container {overflow: hidden;display: inline-block;max-width: 480px;vertical-align: top;position: relative; } .message-box__message {text-align: center;font-size: 16px;color: var(--text-color);text-overflow: ellipsis;overflow: hidden;position: relative;font-family: var(--font-family-normal); } .message-box__buttons {margin-top: 28px; }.universal-tablet {font-family: var(--font-family-normal);position: relative;background: var(--player-background-color); } .universal-tablet__popups-layer {position: absolute;top: 0;left: 0;z-index: 1; } .universal-tablet__popup-layer {z-index: 1; }.universal-layout {width: 100%;height: 100%;display: -ms-flexbox;display: flex;overflow: hidden; } .universal-layout.universal-layout_left-panel {-ms-flex-direction: row-reverse;flex-direction: row-reverse; }.universal-content-area {position: relative;-ms-flex-positive: 1;flex-grow: 1;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden; } .universal-content-area__cc {font-family: var(--font-family-normal);width: 100%;height: 110px;margin-top: -110px;background: rgba(41, 41, 41, 0.56);z-index: 1;overflow-x: hidden;overflow-y: auto;-webkit-overflow-scrolling: touch;padding: 0 34px 0 14px;border-width: 13px 0 7px 0;border-style: solid;border-color: transparent;color: #FFFFFF;font-size: 14px;text-shadow: -1.4px 1.4px 2px rgba(0, 0, 0, 0.48);word-wrap: break-word;white-space: pre-wrap; }.video-narration-view {position: relative;top: 0;left: 0;margin-right: 12px;margin-bottom: 12px;border: 1px solid rgba(0, 0, 0, 0.14); } .video-narration-view video {background-color: #000000; } .video-narration-view.video-narration-view_draggable {position: absolute;box-shadow: 0 1px 8px 0 rgba(0, 0, 0, 0.24); } .video-narration-view.video-narration-view_maximized {margin: 12px; }.content-area {-ms-flex-positive: 1;flex-grow: 1;overflow: hidden;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative; } .content-area__items-container {display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: flex-start;-ms-grid-column-align: center;justify-items: center;overflow: hidden;margin: auto; } .content-area .playerView {z-index: 0;position: relative;margin: 0 12px;top: 0;left: 0; } .content-area .playerView.draggable {position: absolute;box-shadow: 0 1px 8px 0 rgba(0, 0, 0, 0.24); } .content-area .playerView .with-border::after {content: '';position: absolute;top: 0;bottom: 0;left: 0;right: 0;border: 1px solid var(--slide-border-color);pointer-events: none; } .content-area.content-area_portrait .content-area__items-container {flex-direction: column-reverse;align-items: flex-end;/* autoprefixer: off */ -webkit-box-orient: vertical;-webkit-box-direction: reverse;/* autoprefixer: on */ } .content-area.content-area_presentation-minimized .playerView {margin: 0 12px 12px 0; } .content-area.content-area_presentation-minimized .content-area__narration-view {margin: 0 12px; } .content-area .preloader {width: 50px;height: 50px;position: absolute;top: 0;left: 0;bottom: 0;right: 0;margin: auto;border-radius: 10px;background-color: rgba(0, 0, 0, 0.5); } .content-area .preloader::after {content: '';position: absolute;background: url("+ +g[39]+");background-size: cover;top: 0;left: 0;bottom: 0;right: 0;animation: preloader_spin 1s infinite linear; }.maximize-button {width: 38px;height: 38px;border: 1px solid #FFFFFF;border-radius: 19px;background: url("+g[40]+") no-repeat center;background-size: 13px 15px;background-color: #4D4D4D;position: absolute;top: 0;left: 0; } .maximize-button.maximize-button_portrait {background-image: url("+g[41]+");background-size: 15px 13px; }.launch-screen {z-index: 100;position: fixed;top: 0;right: 0;bottom: 0;left: 0;background-color: rgba(0, 0, 0, 0.48); } .launch-screen .launch-screen-button {top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 96px;height: 96px;position: absolute; } .launch-screen .launch-screen-button__play-icon {background-color: #FFFFFF;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 90px;height: 90px;box-shadow: 0 12px 50px 0 rgba(0, 0, 0, 0.2);transition: 0.3s ease-in-out; } .launch-screen .launch-screen-button__icon {background: url("+ +g[42]+") no-repeat center;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 6px;width: 90px;height: 90px; } .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__play-icon {width: 96px;height: 96px; } .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__icon {background: url("+g[43]+") no-repeat center; }.marker-tool-container {position: absolute;top: 0; }.draw-control {position: absolute; }.treecontrol {background-color: var(--panel-color);position: relative;overflow-y: hidden;border-radius: inherit; }.container-top-shadow {background: __verticalGradient(var(--popup-background-color), var(--popup-transparent-background-color));background: linear-gradient(to bottom, var(--popup-background-color), var(--popup-transparent-background-color));position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; }.container-bottom-shadow {background: __verticalGradient(var(--popup-transparent-background-color), var(--popup-background-color));background: linear-gradient(to bottom, var(--popup-transparent-background-color), var(--popup-background-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; }.mobile-vertical-scrollbar {position: absolute;width: 10px;top: 6px;bottom: 6px;right: 0;opacity: 0; } .mobile-vertical-scrollbar__thumb {position: absolute;width: 3px !important;right: 3px;padding: 1px;border-radius: 5px;background-color: rgba(0, 0, 0, 0.5); }"}(); +var e;for(const [g,h]of Object.entries(null!=(e=a)?e:{}))e=`__${g.replace(RegExp("\\.","g"),"_")}__`,d=d.replace(new RegExp(e,"g"),h);let f;for(const [g,h]of Object.entries(null!=(f=b)?f:{}))d=d.replace(new RegExp(g,"g"),h);d=d.replace(/__verticalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.Pk);d=d.replace(/__horizontalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.Ok);return gn(d)}Pk(a,b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}Ok(a, +b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}};class KG extends lt{constructor(a){super(a);this.og=new C}};class LG extends P{constructor(a){super({F:a});a=this.displayObject();document.body.appendChild(a);this.Nf();x(this,window,"resize",this.Nf,this)}Nf(){var a=document.documentElement.clientWidth,b=document.documentElement.clientHeight;const c=Math.min(1,(document.documentElement.clientWidth-20)/this.width());wn(this.displayObject(),c);yi(this.displayObject(),"0 0");a=Math.max(10,Math.round((a-this.width()*c)/2));b=Math.max(0,Math.round((b-this.height()*c)/2));this.move(a,b)}vd(){super.vd();Fd(this.displayObject())}} +;class MG extends LG{constructor(a,b){super("info_panel");Gt(this,b);b=new P({F:"label"});b.ha(a);b.vf("alert");b.wf("live","assertive");M(this,b)}};class NG extends Mt{constructor(a){super(a,"input");this.za().type="password"}value(){return this.za().value}};function OG(a,b,c,d=!0){a=new P({Yb:a,F:b});a.ha(c);a.J(d);return a}function PG(a){x(a,a.ko.za(),"input",()=>{a.kT.qa(!!a.ko.value())});x(a,a.ko.za(),"keypress",b=>{13==b.keyCode&&a.dG()})} +class QG extends LG{constructor(a,b,c,d){super("password_form");this.vf("dialog");this.setAttribute("tabindex","-1");this.dG=this.dG.bind(this,d);this.nM=OG("LABEL","password_label",a);M(this,this.nM);this.ko=new NG("password_field");M(this,this.ko);this.xF=OG("DIV","wrong_password_label",b,!1);M(this,this.xF);this.kT=this.Ae("btn_ok",c,this.dG);M(this,this.kT);a=ld();b=ld();this.nM.setAttribute("id",a);this.nM.setAttribute("for",b);this.ko.setAttribute("id",b);this.ko.wf("labelledby",a);this.ko.wf("required", +!0);this.xF.vf("alert");this.xF.wf("live","assertive");PG(this);Ii||this.ko.displayObject().focus()}Ae(a,b,c){a=new ZC({F:a});a.ha(b);a.qa(!1);z(this,a.ja,c,this);return a}dG(...a){a=a[0];const b=this.ko.value();b&&(a(b),this.xF.J(!0))}};function RG(a,b,c){Ii&&(this.ri=wd("DIV"),mn(this.ri,"tap_area"));Jt.call(this,b);this.ri&&this.O(this.ri);this.BH=!0;this.g5=c?!0:!1;c&&this.Dc(!1);a&&this.ja.addHandler(this.DA,this);Ii&&(a=this.za(),mn(a,"mobile"));this.oy(0);this.za().setAttribute("tabindex","-1");this.Ky()}r(RG,Jt);k=RG.prototype;k.zt=!1;k.Hb=!0;k.KT=function(a){a=wd("BUTTON",a);Ib&&8>=Vb||(a.type="button");return a};k.selected=function(){return this.zt}; +k.Eh=function(a){if(a){var b=this.za();mn(b,"selected")}else b=this.za(),nn(b,"selected");this.g5&&this.Dc(a);this.zt=a};k.enabled=function(){return this.Hb};k.qa=function(a){RG.Mb.qa.call(this,a);const b=this.za();b.disabled=a?"":"disabled";if(a){var c=this.displayObject();nn(c,"disabled")}else c=this.displayObject(),mn(c,"disabled");!a&&b.blur&&b.blur();this.Hb=a};k.Dc=function(a){this.za().setAttribute("aria-pressed",a)};k.DA=function(){this.Eh(!this.zt)}; +k.hj=function(a){RG.Mb.hj.call(this,a);-1==this.vs&&this.za().blur()};k.wy=function(){return RG.Mb.wy.call(this)};k.Rp=function(a){this.enabled()&&RG.Mb.Rp.call(this,a)};k.vk=function(a){this.BH=!1;RG.Mb.vk.call(this,a);this.BH=!0};function SG(a,b,c,d){Mt.call(this,"info_panel "+a);this.NF=c;this.ra=Ki();a=new Mt("message");a.ha(b);this.O(a);b=this.displayObject();document.body.appendChild(b);this.NF&&(this.Xn=new RG(!1,"ok"),this.Xn.ha(d),d=this.Xn.displayObject(),document.body.appendChild(d));yi(this.displayObject(),"0 0");wn(this.displayObject(),this.ra);this.NF&&(yi(this.Xn.displayObject(),"0 100%"),wn(this.Xn.displayObject(),this.ra));this.Nf();ve(window,"resize",this.Nf,!1,this)}r(SG,Mt); +SG.prototype.gd=function(){Fd(this.displayObject());this.NF&&Fd(this.Xn.displayObject());De(window,"resize",this.Nf,!1,this)};SG.prototype.Nf=function(){const a=document.documentElement.clientWidth/this.ra;let b=document.documentElement.clientHeight/this.ra;this.Kb(a);this.NF&&this.Xn.Kb(a);ij&&(b+=2);Lt(this,"min-height",b+"px")};function TG(a,b,c,d){SG.call(this,"password",a,!0,c);a=new Mt("password_field");this.O(a);this.Xn.qa(!1);const e=new NG("");a.O(e);const f=new Mt("wrong_password_label");f.ha(b);f.J(!1);this.O(f);const g=()=>{const h=e.value();h&&(d(h),f.J(!0))};ve(e.za(),"input",()=>{this.Xn.qa(!!e.value())},!1,this);ve(e.za(),"keypress",h=>{13==h.keyCode&&g()},!1,this);this.Xn.ja.addHandler(g,this)}r(TG,SG);class UG extends lv{Ir(){super.Ir();F(this.background(),"display","none");F(this.content(),"display","none")}};function VG(a){const b=Object.assign({},a),c={};for(const d in b)"object"==typeof b[d]&&(b[d]=VG(b[d]),a=b[d],a._d&&(c[a._d]=a));b.toString=()=>b._;b.uia=d=>c[d];return b};const WG={type:"t",id:"i",url:"u",target:"g",kD:"S",mJ:"s",nJ:"n",gJ:"r"};var XG={fJ:{_:"s",text:{_:"t"},t2:{_:"f",$ba:{_:"p",Gi:"s",length:"l",fu:"b",ZI:{_:"r",Gi:"s",length:"l",bold:"b",italic:"i",mda:"u",Ox:Object.assign({_:"h"},WG)}}},j0:{_:"a"},Ox:Object.assign({_:"h"},WG),Z1:{_:"b"},xk:{_:"s"},Li:{_:"v"},nba:{_:"T"}}};const YG={};for(const a in XG)XG.hasOwnProperty(a)&&(YG[a]=VG(XG[a]));var ZG=class{constructor(a,b,c){this.type=a;this.id=b;this.gJ=this.nJ=this.mJ=this.target=this.url=this.kD=void 0;this.iba=c}};const $G=new Map;function aH(a,b,c){c=new ZG(a[b.type],a[b.id],c);c.kD=a[b.kD];c.url=a[b.url];c.target=a[b.target];c.mJ=a[b.mJ];c.nJ=a[b.nJ];a=a[b.gJ];"boolean"===typeof a&&(c.gJ=a.toString());a=$G.get(c.type);if(void 0===a)throw Error("unknown hyperlink type");return a(c)}function bH(a,b){return`${a.iba||""}`}$G.set("u",function(a){return bH(a,"return document.getElementById('$coreSprPlaceholder').getCore().gotoLink(this);")}); +$G.set("N",function(a){return bH(a,`document.getElementById('$coreSprPlaceholder').getCore().gotoSlide(${a.mJ}, this);return false;`)});$G.set("f",function(a){return bH(a,"document.getElementById('$coreSprPlaceholder').getCore().gotoFirstSlide(this);return false;")});$G.set("l",function(a){return bH(a,"document.getElementById('$coreSprPlaceholder').getCore().gotoLastSlide(this);return false;")});$G.set("v",function(a){return bH(a,"document.getElementById('$coreSprPlaceholder').getCore().gotoLastViewedSlide(this);return false;")}); +$G.set("n",function(a){return bH(a,"document.getElementById('$coreSprPlaceholder').getCore().gotoNextSlide(this);return false;")});$G.set("p",function(a){return bH(a,"document.getElementById('$coreSprPlaceholder').getCore().gotoPreviousSlide(this);return false;")});$G.set("s",function(a){return bH(a,`document.getElementById('$coreSprPlaceholder').getCore().startSlideshow(this, '${a.nJ}', ${a.gJ});return false;`)});$G.set("e",function(a){return bH(a,"document.getElementById('$coreSprPlaceholder').getCore().endSlideshow(this);return false;")});function cH(a,b){a:switch(b[0].fu){case "n":var c="ol";break a;case "u":c="ul";break a;default:c="p"}"p"==c?b.forEach(d=>{a+=`

    ${d.J1}

    `}):(a+=`<${c}>`,b.forEach(d=>{a+=`
  • ${d.J1}
  • `}),a+=``);return a}function dH(a){let b="";const c=[];a.forEach(d=>{d.fu!=b&&(c.push([]),b=d.fu);c[c.length-1].push(d)});return c};class eH{constructor(a){this.Ag=a}then(a){this.Ag=a(this.Ag);return this}result(){return this.Ag}};function fH(a,b){const c=a[b.text];a=a[b.t2];if(!c||!a)return c?`${c}`:"";const d=b.t2.$ba;b=a[d].map(e=>gH(c,e,d));return dH(b).reduce(cH,"")}function gH(a,b,c){const {Gi:d,length:e,fu:f,ZI:g,Eca:h}={Gi:b[c.Gi],length:b[c.length],fu:b[c.fu],ZI:b[c.ZI],Eca:c.ZI},l=a.substr(d,e);return{J1:g.map(n=>hH(l,n,h)).join(""),fu:f}} +function hH(a,b,c){var d=b[c.Gi],e=b[c.length],f=b[c.bold]||!1,g=b[c.italic]||!1,h=b[c.mda]||!1,l=b[c.Ox],n=c.Ox;return(new eH(a)).then(m=>m.substr(d,e)).then(m=>m.replace(/\u000b/g,"
    ")).then(m=>iH(m)).then(m=>{g&&(m=`<${"i"}>${m}`);return m}).then(m=>{f&&(m=`<${"b"}>${m}`);return m}).then(m=>{h&&(m=`<${"u"}>${m}`);return m}).then(m=>{l&&(m=aH(l,n,m));return m}).result()} +function iH(a){return(new eH(a)).then(b=>b.replace(/(\r\n|\r|\n)+/g," ")).then(b=>b.replace(/\xa0|[ \t]+/g," ")).result()};function jH(a,b){return a[b.nba]?(new eH(fH(a,b))).then(c=>c?`

    ${c}

    `:"").result():""};function kH(a,b,c){return a.map(d=>{var e=d[b.xk]||d[b.Li];if(!(e=e?c.get(e):""))if(d[b.Z1]&&(d[b.text]||d[b.j0]||d[b.Ox])){e=`${d[b.j0]||d[b.text]||`;const f=d[b.Ox];e=f?aH(f,b.Ox,e):e}else e="";return e||jH(d,b)||fH(d,b)}).join("")};function lH(a){a=[...a.Dd().Mc(),...a.ie().Mc()];return new Map(a.map(b=>{var c=b.Ni;c=c.wi()||mH(c);return[b.id(),nH(c)]}))}function mH(a){a=document.getElementById(a.id());return Od(a)}function nH(a){return(new eH(a)).then(b=>b.includes("controls")?b:b.replace(">"," controls>")).then(b=>oH(b,"width")).then(b=>oH(b,"height")).then(b=>b.replace(RegExp('id="\\w+"'),"")).result()}function oH(a,b){return a.includes(b)?a.replace(new RegExp(`${b}="\\d*\\.*\\d+px"`),""):a};function pH(a,b){b.uf()?qH(a,b):Qe(a,b.ql,()=>qH(a,b))}function rH(a){a.ya&&(Fd(a.yb),Fd(a.dT),Fd(a.ya),a.ya=null)}function qH(a,b){var c=b.Gy;b=lH(b.slide());c=JSON.parse(c);const d=YG.fJ;b=kH(c[d],d,b).replace(/\$coreSprPlaceholder/g,a.Oq);b=Ad(Kc(b));a.yb.appendChild(b);it(a.yb,"main");(b=a.yb.querySelector("h2"))?(b.id=ld(),jt(a.yb,"labelledby",b.id)):jt(a.yb,"label",a.pg.PB_ACCESSIBLE_ARIA_LABEL_SLIDE)} +class sH extends wg{constructor(a,b,c){super();this.Ni=a;this.pg=b;this.Oq=c;this.DZ=ld();b=zd("DIV");td(b,{"class":"ppt-accessible-slide-display"});this.pl=b;this.ya=null;b=zd("DIV");td(b,{"class":"ppt-accessible-slide-content"});b.setAttribute("tabindex","-1");b.id=this.DZ;this.yb=b;b=zd("A");td(b,{"class":"ppt-accessible-skip-link"});b.innerText=this.pg.PB_ACCESSIBLE_ARIA_LABEL_BACK_TO_BEGIN;b.href=`#${this.DZ}`;c=zd("DIV");td(c,{"class":"ppt-accessible-skip-link-container"});c.appendChild(b); +this.dT=c;pH(this,a)}Ig(){}Cu(a){Th(this.ya,a)}width(){return 0}height(){return 0}slide(){return this.ya}content(){return this.yb}background(){throw Error("no background in accessible mode");}resize(){}Ir(){rH(this);this.ya=zd("DIV");td(this.ya,{"class":"ppt-accessible-slide"});this.ya.appendChild(this.yb);this.ya.appendChild(this.dT);this.pl.appendChild(this.ya)}Uc(){rH(this)}$0(){}clone(){throw Error("no clone in accessible mode");}rI(){throw Error("no background in accessible mode");}};class tH extends Sq{constructor(a,b,c,d,e,f){super(a,b,c,d,e,f);f&&f.uf()&&u((f.yb||document).getElementsByTagName("IMG"),g=>{g.style.transform=""})}};function uH(a){const b=document.createElement("div");b.style.width=`${a.width()}px`;b.style.height=`${a.height()}px`;b.style.backgroundColor=a.x3;b.style.position="relative";return b}class vH extends Sq{constructor(a,b,c,d){super(a,-1,b,c);this.x3=d||"#000000";Oq(this,uH(this),uH(this))}};function wH(a,b){a.Gp=b;a.YO.appendChild(b.pl)}function xH(a){a.M.splice(0,a.M.length)}class yH{constructor(a){this.M=[];this.YO=a;this.Gp=null}};class zH extends nv{constructor(a){super(a);this.ph=null;this.qV=E(this)}fb(){return this.ph}TR(a){this.ph=a;this.qV.C(this.ph)}};class AH extends nv{constructor(a){super(a);this.Bb=null;this.uY=E(this)}Oa(){return this.Bb}cS(a){this.Bb=a;this.uY.C()}};function Vs(a,b){return a.Gd[b]}function BH(a){F(a.FB,"position","normal"==a.Ib?"absolute":"")}function CH(a){a.UD.forEach(b=>{b.uf()?a.WY(b):Qe(a,b.ql,a.WY,a)})} +function DH(a){Se(a,...a.Gd);a.Gd.splice(0,a.Gd.length);Cd(a.FB);xH(a.Fk);wH(a.Fk,a.Gp);EH(a);FH(a);a.UD.forEach(b=>{if(b instanceof AH)GH(a,new mv(a.Fk,a.Gd.length,a.Va,a.Na,a.sA,b,a.Ib));else if(b instanceof zH){a:switch(a.Ib){case "normal":b=new lv(a.Fk,a.Gd.length,a.Va,a.Na,a.sA,b,a.Ib);break a;case "accessible":b=new UG(a.Fk,a.Gd.length,a.Va,a.Na,a.sA,b,a.Ib);break a;default:throw Error("unknown presentation view mode");}GH(a,b)}else if(b instanceof ov)GH(a,new pv(a.Fk,a.Gd.length,a.Va,a.Na, +a.sA,b,a.Ib));else{a:switch(a.Ib){case "normal":b=new tH(a.Fk,a.Gd.length,a.Va,a.Na,a.sA,b);break a;case "accessible":b=new sH(b,a.pg,a.Oq);break a;default:throw Error("unknown presentation view mode");}GH(a,b)}})}function EH(a){a.SK.forEach((b,c)=>{yi(c,`${b.origin.x}px ${b.origin.y}px`);on(c,b.transform)})}function FH(a){Array.from(a.SK.keys()).forEach(b=>{b.style.width="";b.style.height=""})}function GH(a,b){B(a,b);var c=a.Fk;c.M.push(b);c.YO.appendChild(b.pl);a.Gd.push(b)} +class HH extends wg{constructor({mS:a,Zt:b,width:c,height:d,Aba:e,qJ:f,backgroundColor:g,FS:h,messages:l}){super();this.UD=b;this.Va=c;this.Na=d;this.sA=e;this.Oq=f;this.Ib=h;this.pg=l;this.SK=new Map;this.Gd=[];this.FB=zd("DIV");mn(this.FB,"slide-displays-root");a.appendChild(this.FB);BH(this);this.Fk=new yH(this.FB);this.Gp=new vH(this.Fk,c,d,g);CH(this);DH(this)}width(){return this.Va}height(){return this.Na}background(){return this.Gp}resize(a,b){if(this.Va!=a||this.Na!=b)this.Va=a,this.Na=b, +this.Gp.resize(a,b),this.Gd.forEach(c=>c.resize(a,b))}fn(a){this.Ib!=a&&(this.Ib=a,BH(this),DH(this))}WY(a){const b=Array.from(sd("IMG",null,a.yb));a=Array.from(sd("IMG",null,a.slideBackground()));b.concat(a).forEach(c=>{const d=sn(c)||new gm,e=tn(c)||new Xc;this.SK.set(c,{transform:d,origin:e})})}};class IH{constructor(a,b,c,d){this.ya=a;this.zg=b;this.yg=c;this.Ve=d;this.Hf=this.ph=this.Bb=this.Gy=this.yb=null}slide(){return this.ya}slideWidth(){return this.zg}slideHeight(){return this.yg}Oa(){return this.Bb}cS(a){this.Bb=a}fb(){return this.ph}TR(a){this.ph=a}tb(){return this.Hf}dS(a){this.Hf=a}tr(){return this.Ve}};class JH{constructor(a){this.pe=0;this.x$=void 0!==a?a:0;this.nA=new C;this.pA=new C;this.eO=new C;this.Lh=null}weight(){return this.x$}progress(){return this.pe}context(){return this.Lh}start(a){this.Lh=a}Ar(){return this.nA}XC(){return this.pA}Ct(a){this.pe!=a&&(this.pe=a,this.eO.C(this))}Xh(){this.pe=1;this.nA.C(this)}oA(){this.pA.C(this)}};class KH extends JH{constructor(a){super();this.sK=a}start(a){super.start(a);const b=rd(document,this.sK);b?(a.yb=b,this.Xh()):this.oA()}};var LH,MH,NH=[],OH=new C,PH=new C,QH=new C;q("iSpring.InteractionPlayerFactory.registerCreateQuizPlayerFunction",function(a){LH=a;OH.C()});q("iSpring.InteractionPlayerFactory.registerCreateScenarioPlayerFunction",function(a){MH=a;PH.C()});q("iSpring.InteractionPlayerFactory.registerCreateInteractionPlayerFunction",function(a,b){NH[a]=b;QH.C(a)});function RH(a,b,c,d,e,f,g,h,l,n,m,p){const t=LH;if(!t)throw Error("quiz player is not loaded");t(a,b,c,d,e,f,g,h,l,n,m,p)} +function SH(a,b,c,d,e,f,g,h,l,n,m,p){const t=NH[a];if(!t)throw Error(a+" player is not loaded");t(b,c,d,e,f,g,h,l,n,m,p)}function TH(a,b,c,d,e,f,g,h,l,n,m,p,t,w,y,D,I){const A=MH;if(!A)throw Error("scenario player is not loaded");A(a,b,c,d,e,f,g,h,l,n,m,p,t,w,y,D,I)};function UH(a,b,c){VH[b]=c;a="q_"+a;window[a]||(window[a]=function(d,e,f,g,h){(0,VH[d])(e,f,g,h);VH[d]=null})}function WH(a,b,c){VH[b]=c;a="i_"+a;window[a]||(window[a]=function(d,e,f,g){const h=VH[d];h&&(h(e,f,g),VH[d]=null)})}function XH(a,b,c){VH[b]=c;a="s_"+a;window[a]||(window[a]=function(d,e,f,g,h,l,n,m){const p=VH[d];p&&(p(e,f,g,h,l,n,m),VH[d]=null)})}function YH(a,b,c){VH[b]=c;a="sl_"+a;window[a]||(window[a]=function(d,e,f){const g=VH[d];g&&(g(e,f||null),VH[d]=null)})} +function ZH(a){Fd(a.aZ);a.aZ=void 0}function $H(a,b,c,d){const e=a.os.substr(0,a.os.lastIndexOf("/")+1);var f=wd("div");const g=wd("div");var h=new P;const l=a.context();h.resize(l.slideWidth(),l.slideHeight());f.appendChild(h.displayObject());f.appendChild(g);l.yb=f;f=aI(a);h=l.slide();const n=h.YQ(),m=bI(a.H.cF,a.H.ga()),p=SH.bind(void 0,n,b,c,d,g,f,l.slideWidth(),l.slideHeight(),a.P4.bind(a),e,h.index(),m);void 0!==NH[n]?p():(QH.addHandler(t=>{t==n&&p()}),Ui(h.rp()))} +function cI(a,b,c,d,e,f,g,h){const l=a.os.substr(0,a.os.lastIndexOf("/")+1);var n=wd("div");const m=wd("div");var p=new P;const t=a.context();p.resize(t.slideWidth(),t.slideHeight());n.appendChild(p.displayObject());n.appendChild(m);t.yb=n;n=aI(a);p=t.slide();const w=dI(a.H.cF),y=TH.bind(void 0,b,c,d,e,m,n,t.slideWidth(),t.slideHeight(),a.R4.bind(a),l,p.index(),f,g,h,a.H.Yt().enabled(),w);void 0!==MH?y():(PH.addHandler(()=>{y()}),Ui(p.rp()))} +function aI(a){const b=wd("div");a.context().tr().appendChild(b);mn(b,"framesLayerContent");return b} +class eI extends JH{constructor(a,b,c,d){super(70);this.CG=a;this.Ld=b;this.os=c;this.H=d}start(a){super.start(a);const b=a.slide()instanceof cr,c=a.slide()instanceof tq;a=a.slide()instanceof Bq;b?UH(this.CG,this.Ld,this.T6.bind(this)):c?WH(this.CG,this.Ld,this.z6.bind(this)):a?XH(this.CG,this.Ld,this.b7.bind(this)):YH(this.CG,this.Ld,this.r7.bind(this));this.aZ=Ui(this.os)}r7(a,b){a=ij&&fj&&navigator.connection&&navigator.connection.saveData?a.replace(/{this.ss=gn(b.response());this.ke.C(this.ss)});b.send(a,"GET",{})}};let oI=null,pI=0;function qI(a,b){if(sj)if(a=`@import "${b}";`,!oI||30<=pI)oI=gn(a).styleSheet,pI=1;else{var c=a;a=oI;b=void 0;if(void 0==b||0>b)b=fn(a).length;if(a.insertRule)a.insertRule(c,b);else if(c=/^([^\{]+)\{([^\{]+)\}/.exec(c),3==c.length)a.addRule(c[1],c[2],b);else throw Error("Your CSSRule appears to be ill-formatted.");++pI}else a.lA=wd("link",{rel:"stylesheet",type:"text/css",href:b}),sd("head")[0].appendChild(a.lA)} +class rI{constructor(){this.lA=null;this.ke=new C}load(a){const b=Ib||Hb?dn:en,c=b().length;qI(this,a);const d=this,e=setInterval(()=>{try{if(null!=d.lA&&null!=d.lA.sheet||b().length!=c)clearInterval(e),d.ke.C(this.lA)}catch(f){}},100)}};class sI extends JH{constructor(a){super(30);this.b4=a;this.ss=null}get maa(){return this.ss}start(a){super.start(a);a=Vi()||sj?new rI:new nI;a.ke.addHandler(b=>{this.ss=b;this.Xh()},this);a.load(this.b4)}};class tI extends JH{constructor(){super();this.lE=this.kE=0;this.y$=1}weight(){return this.y$*this.kE}start(a){super.start(a);var b=a.yb;if(b){a={};b=b.querySelectorAll("span");for(var c=0;c=b.charCodeAt(c)){c=!0;break a}c=!1}TB(h,c?b.substr(0,1):"0",g,a)}this.gk()}else this.Xh()}s6(){++this.lE;this.gk()}r6(){++this.lE;this.gk()}gk(){this.lE==this.kE?this.Xh():this.Ct(this.lE/this.kE)}};class uI extends JH{constructor(){super();this.z$=1;this.mv=0;this.qA=[];this.yU={};this.HE=-1}weight(){return this.z$*this.mv}start(a){super.start(a);if(a=a.yb){a=a.querySelectorAll("img");this.mv=a.length;for(let b=0;b=a.Mn.length)a.Xh();else{var b=a.context(),c=a.Mn[a.Zy];vI(a,c);c.start(b)}}class BI extends xI{constructor(a){super(a)}start(a){super.start(a);AI(this)}sw(a){super.sw(a);AI(this)}};class CI{constructor(a){this.sK=a}qj(){return this.sK}};class DI{constructor(a,b){this.N4=a;this.ST=b}};const EI=Ii?[0,1,2,-1,3,4,-2,5]:[0,1,2,-1,3,4,-2,5,6,7,8,9,10]; +function FI(a,b){a.yF=b;const c=a.$G[b];c.Pa=1;const d=c.slide();var e=a.y3;const f=[],g=d.src();if(!g)throw Error("slide src can't be null");let h=null;g instanceof DI?(b=new eI(a.G.Ou(),b,e+g.N4,a.G.settings()),g.ST?(h=new sI(e+g.ST),f.push(new yI([h,b],20))):f.push(b)):(e=g.qj(),f.push(new KH(e)));"slide"==d.type()&&f.push(new zI);e=new IH(d,a.G.slideWidth(),a.G.slideHeight(),a.Ve);const l=new BI(f);z(a,l.Ar(),n=>{Ue(a,l);var m=n.context();d.yV=!0;n=m.yb;const p=Hd(n);c.yr(p[1],p[0],m.Gy);c instanceof +AH?(m=m.Oa(),c.cS(m)):c instanceof zH?(m=m.fb(),c.TR(m)):c instanceof ov&&(m=m.tb(),c.dS(m));d instanceof Am&&(n=a.aP.create(d,n,h?h.maa:null),GI(n.i8.Sw,n.p9),n.lP&&n.MX());HI(a);a.ql.C(d)});z(a,l.XC(),()=>{Ue(a,l);HI(a);a.r9.C(d)});l.start(e)}function rF(a){kh(a.w5,100,a)}function HI(a){a.SV[a.yF]=!0;a.yF=void 0;rF(a)} +class II extends wg{constructor(a,b){super();this.G=a;this.aP=b;this.y3="";a=a.slides();b=[];for(let d=0;d{d==b&&(c.gd(),MI(a))})}function MI(a){var b=new JI(new II(a.G,a.aP),a.G.settings().qJ(),a.G.settings().ga()||{});b=new FF(a.G,a.e8,b);a.xw.C(b)} +class NI extends wg{constructor(a,b,c){super();this.G=a;this.e8=b;this.aP=c;this.xw=E(this)}sr(){var a=this.G.settings().gy(),b=a.fI(),c;if(c=b){a:{c=window.location.hostname;for(var d=0;dTr(b, +d),f=0>=Tr(c,b);if(0>Tr(c,d)){b=e&&f;break a}if(0>Tr(d,c)){b=e||f;break a}}b=c&&0>Tr(b,c)?!1:!(d&&0<=Tr(b,d))}b=!b}b?(a=KI(this,"PB_TIME_RESTRICTION","Sorry, the presentation's creator disabled viewing the presentation at the moment"),uj?new SG("time",a,!1):new MG(a,"time")):a.GN?LI(this,a.password()):MI(this)}}};function OI(a){a=a.querySelectorAll("*");const b=[];for(const c of a)/^txt\w*/.test(c.id)&&b.push(c);return b}function PI(a,b){const c=new Map;OI(a).forEach(d=>{var e=b.find(f=>!!f.selectorText.match(d.id));(e=e?e.style:null)&&c.set(d,e)});return c}function GI(a,b){a.forEach(c=>{rm(c).forEach(d=>{const e=b.querySelector("#"+d.id);Gh(e,0,0);let f=jm(d.Ya.left,d.Ya.top);f=hm(d.zk.clone(),hm(f,d.yj));on(e,f)})})};function QI(a,b){const c=[];a.fda.forEach((d,e)=>{b(d)&&c.push({element:e,E0:d})});return c}class RI{constructor(a,b,c){this.i8=a;this.p9=b;this.ss=c;this.lP=null;if(c&&c.sheet)try{this.lP=PI(b,Array.from(c.sheet.cssRules))}catch(d){}}get styleSheet(){return this.ss.sheet}get fda(){return this.lP}};function SI(a){return QI(a,b=>/text-decoration-line: underline/.test(b.cssText))} +class TI extends RI{MX(){for(const {element:e,E0:f}of SI(this)){var a=e,b={},c=f.cssText.match(/text-decoration-.*?(?=;)/g);if(c)for(const g of c){const [h,l]=g.split(": ");b[h]=l}a:{var d=b;c=["solid","dashed","dotted","double"];if(d.hasOwnProperty("text-decoration-style")&&(d=d["text-decoration-style"],-1!=c.indexOf(d))){c=d;break a}c="solid"}if((d=b["text-decoration-thickness"]||"")&&"double"==c){const g=2*parseFloat(d);isNaN(g)||(d=`${g}px`)}a.style.borderBottom=`${c} ${d} ${b["text-decoration-color"]|| +""}`}for(const {element:e}of this.yL())e.style.textDecoration="line-through"}yL(){return QI(this,a=>/text-decoration-line: underline line-through/.test(a.cssText))}};class UI extends RI{MX(){this.yL().forEach(({element:a,E0:b})=>{b.removeProperty("text-decoration-line");b.setProperty("text-decoration-line","underline");const c=b.getPropertyValue("text-decoration-thickness");b=b.getPropertyValue("color")||"black";this.styleSheet.insertRule(`#${a.id}::after { + position: absolute; + content: ''; + width: 100%; + height: 0; + border-top: ${c} solid ${b}; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; + }`)})}yL(){return QI(this,a=>/text-decoration-line: underline line-through/.test(a.cssText))}};class VI{create(a,b,c){return Ib?new TI(a,b,c):new UI(a,b,c)}};class WI extends wg{constructor(){super();this.Cf=null;this.px="";this.$P="_blank";this.vM=E(this)}logo(){return this.Cf}td(){return this.px}jS(a){this.px=a}HD(){return this.$P}isEqual(a){if(a.td()!==this.px||a.HD()!==this.$P)return!1;a=a.logo();return this.Cf||a?!!this.Cf&&!!a&&this.Cf.path()===a.path():!0}}WI.prototype.webSiteTarget=WI.prototype.HD;WI.prototype.webSiteUrl=WI.prototype.td;WI.prototype.logo=WI.prototype.logo;class XI{constructor(){this.lt=this.Zl=this.px=this.hT=this.FV=this.$h="";this.OX=this.Cb=null}name(){return this.$h}ip(){return this.FV}Nm(){return this.hT}td(){return this.px}jS(a){this.px=a}email(){return this.Zl}phone(){return this.lt}Zd(){return this.Cb}yu(a){this.Cb=a}Cr(){return this.OX}}XI.prototype.photo=XI.prototype.Cr;XI.prototype.company=XI.prototype.Zd;XI.prototype.phone=XI.prototype.phone;XI.prototype.email=XI.prototype.email;XI.prototype.webSiteUrl=XI.prototype.td; +XI.prototype.biography=XI.prototype.Nm;XI.prototype.jobTitle=XI.prototype.ip;XI.prototype.name=XI.prototype.name;class YI extends wg{constructor(){super();this.Rv=this.Sv=!1;this.pe=0;this.nA=E(this);this.pA=E(this);this.QV=E(this)}uf(){return this.Sv}progress(){return this.pe}load(){this.Sv||this.Rv||(this.Rv=!0,this.Yh())}Yh(){}t_(){}nda(){if(this.Sv||this.Rv)this.t_(),this.Rv=this.Sv=!1,this.Ct(0)}Ct(a){this.pe!=a&&(this.pe=a,this.QV.C(this))}Ar(){return this.nA}XC(){return this.pA}vba(){return this.QV}}YI.prototype.loadProgressEvent=YI.prototype.vba;YI.prototype.loadFailedEvent=YI.prototype.XC; +YI.prototype.loadCompleteEvent=YI.prototype.Ar;YI.prototype.unload=YI.prototype.nda;YI.prototype.load=YI.prototype.load;YI.prototype.progress=YI.prototype.progress;YI.prototype.isLoaded=YI.prototype.uf;function ZI(a){a.Rg&&(a.Rg.onload=null,a.Rg.onerror=null)}function $I(a){if(!a.uf())throw Error("asset not loaded");} +class aJ extends YI{constructor(a,b,c){var d,e,f;super();this.Rg=null;var g=a.startsWith("data:")?null:void 0;this.TA=g=a;this.Va=b;this.Na=c}Yh(){this.Rg=new Image;this.Rg.onload=this.SF.bind(this);this.Rg.onerror=this.v6.bind(this);this.Rg.src=this.TA}SF(){ZI(this);this.Rv=!1;this.Sv=!0;this.Ct(1);this.nA.C(this)}v6(){ZI(this);this.Rv=this.Sv=!1;this.pA.C(this);this.Ct(0)}t_(){this.Rg&&(ZI(this),this.Rg.src="",this.Rg=null)}path(){return this.TA}width(){if(null!=this.Va)return this.Va;if(!this.Rg)return 0; +$I(this);return this.Rg.width}height(){if(null!=this.Na)return this.Na;if(!this.Rg)return 0;$I(this);return this.Rg.height}CC(){$I(this);const a=zd("canvas");a.width=this.width();a.height=this.height();a.getContext("2d").drawImage(this.Rg,0,0);return a}kaa(){$I(this);return this.Rg.cloneNode(!0)}}aJ.prototype.createImgInstance=aJ.prototype.kaa;aJ.prototype.createInstance=aJ.prototype.CC;aJ.prototype.height=aJ.prototype.height;aJ.prototype.width=aJ.prototype.width;aJ.prototype.path=aJ.prototype.path;class bJ extends aJ{url(){return this.TA}}bJ.prototype.url=bJ.prototype.url;function cJ(a,b){const c=a.Ta.actions,d=new rg(dJ(a,b));b[c.Eu].forEach(e=>{d.kZ.push(new qg(e[c.Eu.key],v(e,c.Eu.bI,!1),v(e,c.Eu.shift,!1)))});return d} +function dJ(a,b){a=a.Ta.actions.name;switch(b[a]){case a.cca+"":return"playPause";case a.CI+"":return"nextSlide";case a.lca+"":return"previousSlide";case a.Kba+"":return"nextStep";case a.mca+"":return"previousStep";case a.Lca+"":return"seekForward";case a.Kca+"":return"seekBackward";case a.Laa+"":return"firstSlide";case a.rba+"":return"lastSlide";case a.cR+"":return"lastViewedSlide";case a.Wca+"":return"slideStart";case a.Tca+"":return"slideEnd";case a.wda+"":return"volumeUp";case a.vda+"":return"volumeDown"; +case a.hda+"":return"toggleFullscreen"}throw Error("unknown action type");}class eJ{constructor(a){this.Ta=a}eR(a,b){a.qa(v(b,this.Ta.enabled,!1));const c=a.actions();c.nc.length=0;a.enabled()&&b[this.Ta.actions].forEach(d=>{c.Ah(cJ(this,d))})}};function fJ(a){this.Fa=a}r(fJ,El);fJ.prototype.Fa=0;fJ.prototype.duration=function(){return this.Fa};fJ.prototype.xe=function(){};fJ.prototype.tk=function(){};function gJ(a){this.nc=a||[]}r(gJ,Fl);k=gJ.prototype;k.NM=null;k.Fa=-1;k.Ah=function(a){if(0<=this.Fa)throw Error("ParallelActions was already initialized");this.nc.push(a)};k.hK=function(){let a=0;for(let b=0;bthis.Fa&&(this.Fa=this.hK());return this.Fa}; +function hJ(a){if(a.NM)return a.NM;const b=[],c=a.duration(),d=a.nc.length;for(let e=0;e=this.JK.duration()?a.complete(this.JK,c,d):a.xe(this.JK,b,c,d)}};k.Kh=function(a,b,c){a.complete(this.GV,b,c)};function nJ(a){this.Rl=a}r(nJ,Fl);k=nJ.prototype;k.duration=function(){return Gl(this.Rl)};k.xe=function(a,b,c){a=this.Xi(a);this.yc(Ml(),a,b,c)};k.complete=function(a,b){this.Kh(Ml(),a,b)};k.tk=function(a,b,c){a=this.Xi(a,!0);this.yc(Jl(),a,b,c)};k.gD=function(a,b){this.Kh(Jl(),a,b)};k.yc=function(a,b,c,d){if(b==this.duration())this.Kh(a,c,d);else{if(!(this.Rl instanceof El))throw Error("can't run not prolonged action");a.xe(this.Rl,b,c,d)}};k.Kh=function(a,b,c){a.complete(this.Rl,b,c)};function oJ(a){this.jb=a;this.i_=[];let b=0;for(let c=0;cthis.Fa)return!1;if(0==a&&b>=this.Fa)return!0;const c=this.jb.length;for(let d=0;dthis.Fa)return!1;if(0==a&&b>=this.Fa)return!0;const c=this.st,d=this.Rl.duration();var e=Math.floor(a/(d+c));const f=Math.floor(b/(d+c));if(1=g&&this.Rl.SC(Math.max(a-g,0),b-g))return!0}return!1};pJ.prototype.yS=function(){return[this.Fa]};function qJ(a,b,c,d){this.fi="__mediaTransforms";this.Jb=a;this.iG=b;this.sO=c;this.Wh=d}qJ.prototype.Wm=function(){return this.iG};qJ.prototype.xe=function(a,b){a.Fd.add(new Tp(this.fi,this.Jb,new Wp(this.iG,this.Wh,b)))};function rJ(){}k=rJ.prototype;k.Ta=null;k.ZB=0;k.Pg=0;k.f_=0;k.initialize=function(a,b,c,d){this.Ta=a;this.ZB=b;this.Pg=c;this.f_=d}; +k.load=function(a){const b=this.Ta;var c=this.Ta;if(a[c.xk]||a[c.Li]){c=this.Ta;const e=a[c.xk]||a[c.Li];a:{var d=this.Ta;switch(a[d.Wm]){case d.Wm.play+"":d=yp;break a;case d.Wm.pause+"":d=zp;break a;case d.Wm.stop+"":d=Ap;break a}throw Error("unknown media operation");}c=new xp(e,d,c.Gi in a?a[c.Gi]:null)}else c=new Bp;return new qJ(b.Li in a?"video":"sound",c,a[b.timing][b.timing.start]*this.ZB+this.Pg,this.f_)};function sJ(){}k=sJ.prototype;k.Ta=null;k.uP=0;k.My=null;k.Wh=0;k.initialize=function(a,b,c,d){this.Ta=a;this.uP=c;this.My=b;this.Wh=d};k.ta=function(){if(!this.Ta)throw Error("BehaviorLoader isn't initialized");return this.Ta};function tJ(a){if(!a.My)throw Error("BehaviorLoader isn't initialized");return a.My}function uJ(a){if(!a.My)throw Error("BehaviorLoader isn't initialized");return a.My.id()}k.level=function(){return this.Wh}; +k.load=function(a){const b=this.RV(a);let c=this.Yh(a,b);c=this.OJ(c,a,b);b.Bi()&&(a=ma(c)+"_rewind",c=new Nl([new kJ(uJ(this),a),c,new lJ(uJ(this),a)]));return 0=a.Fa?1:b/a.Fa}wJ.prototype.xe=function(a,b,c){const d=this.Xi(a);this.yc(d>=this.Fa?1:d/this.Fa,b,c,!1,a==this.Fa)};wJ.prototype.tk=function(a,b,c){const d=this.Xi(a,!0);this.yc(1-(d>=this.Fa?1:d/this.Fa),b,c,!0,a==this.Fa)};function yJ(a,b,c,d){b.Fd.add(new Tp(a.fi,c,d))} +function zJ(a,b,c,d){const e=ma(a),f=b.Dv.get(e);f?d=f.value:(a=b.o8.get(a.fi),d=d(a),b.Dv.set(e,{value:d,oia:tk(c)}));return d};function AJ(a,b,c){wJ.call(this,a,b);this.t4=c}r(AJ,wJ);AJ.prototype.yc=function(a,b,c,d,e){if(d=zJ(this,b,c,f=>(f=ul(f))?"font-size"in f.ji?f.ji["font-size"]:"":""))a=Yk("font-size",(this.t4-d)*a+d,c,e),yJ(this,b,"cssTextProperties",a)};function BJ(){}r(BJ,sJ);BJ.prototype.RV=function(a){const b=this.ta().timing;return new CJ(this.uP,a[b],b)};function DJ(a){return eval("("+a+")")}BJ.prototype.OJ=function(a,b,c){if(0f&&(e-=360)}return[(e-f)*c+f,(b[1]-a[1])*c+a[1],(b[2]-a[2])*c+a[2]]};function HJ(a,b,c,d){this.je=a;this.E9=b;this.eL=c;this.Bq=d}HJ.prototype.getTransform=function(a,b,c,d,e,f){return new Wk(new Tk(this.je,GJ(this.E9,this.eL,b,this.je)),this.Bq,!0,d,f)};function IJ(a,b,c,d){this.Jb=a;this.je=b;this.eL=c;this.Bq=d}IJ.prototype.getTransform=function(a,b,c,d,e,f){const g=this.Jb;a=zJ(a,c,d,h=>{let l=null;switch(g){case "textColor":l=kl(h,"textColor");break;case "strokeColor":l=kl(h,"strokeColor");break;case "fillColor":l=kl(h,"fillColor");break;case "imgColor":l=kl(h,"imgColor")}return l?l.color():null});if(!a)return null;a=a.Mc(this.je);return new Wk(new Tk(this.je,GJ(a,this.eL,b,this.je)),this.Bq,!0,d,f)};function JJ(a,b,c,d){wJ.call(this,a,b);this.Jb=c;this.Rk=d}r(JJ,wJ);JJ.prototype.yc=function(a,b,c,d,e){(a=this.Rk.getTransform(this,a,b,c,d,e))&&yJ(this,b,this.Jb,a)};function KJ(){}r(KJ,BJ); +KJ.prototype.Yh=function(a,b){var c=this.ta();c=LJ(this,a[c.target]);const d=[];for(let p=0;pa||1=this.no&&(b=this.hY,c=this.iY);let d=null;for(;ba){d=e.MI((a-c)/(f-c));break}c=f}this.no=a;this.hY=b;this.iY=c;return d?d:this.end()};function UJ(a){this.Fa=a}UJ.prototype.duration=function(){return this.Fa};function QJ(a){this.Fa=0;this.yq=a}r(QJ,UJ);QJ.prototype.end=function(){return this.yq}; +function RJ(a,b,c){this.Fa=a;this.KE=b;this.wH=c}r(RJ,UJ);RJ.prototype.end=function(){return this.wH};RJ.prototype.MI=function(a){const b=this.KE,c=this.wH;return new Xc((c.x-b.x)*a+b.x,(c.y-b.y)*a+b.y)};function TJ(a,b,c,d,e){this.Fa=a;this.cL=e;this.C3=new Un(b.x,b.y,c.x,c.y,d.x,d.y,e.x,e.y)}r(TJ,UJ);TJ.prototype.end=function(){return this.cL}; +TJ.prototype.MI=function(a){var b=this.C3;if(0==a)var c=b.ID;else if(1==a)c=b.JD;else{c=Wc(b.ID,b.x1,a);var d=Wc(b.x1,b.x2,a),e=Wc(b.x2,b.JD,a);c=Wc(c,d,a);d=Wc(d,e,a);c=Wc(c,d,a)}0==a?a=b.KD:1==a?a=b.LD:(d=Wc(b.KD,b.y1,a),e=Wc(b.y1,b.y2,a),b=Wc(b.y2,b.LD,a),d=Wc(d,e,a),e=Wc(e,b,a),a=Wc(d,e,a));return new Xc(c,a)};function VJ(a,b,c){wJ.call(this,a,b);this.TA=c}r(VJ,wJ);VJ.prototype.yc=function(a,b,c,d,e){a=this.TA.MI(a);yJ(this,b,"moveX",new bl(a.x,!0,c,e));yJ(this,b,"moveY",new bl(a.y,!0,c,e))};function WJ(){}r(WJ,BJ);WJ.prototype.Yh=function(a,b){const c=this.ta();return new VJ(uJ(this),b.duration(),XJ(this,a[c.path]))}; +function XJ(a,b){function c(){return new Xc(d()+f,d()+g)}function d(){const h=b.match(/^\s*([-0-9\.]+)/);if(h)return b=b.substr(h[0].length),parseFloat(h[1]);throw Error("incorrect path");}function e(){const h=b.match(/^\s*([m|l|c])/i);return h?(b=b.substr(h[0].length),h[1].toLowerCase()):null}a=tJ(a);const f=a.Ya().left,g=a.Ya().top;b=b.replace(/,/g," ");for(a=new PJ;;){const h=e();if(!h)break;switch(h){case "m":a.moveTo(c());break;case "l":a.lineTo(d(),c());break;case "c":SJ(a,d(),c(),c(),c())}}return a} +;function YJ(a,b){this.rt=a;this.qO=b}YJ.prototype.getTransform=function(a,b,c,d,e,f){b=this.ih(b,d,f);this.rt&&e&&this.qO&&(a=this.ih(xJ(a),d,f),b=b.add(a.pu()));return b};function ZJ(a,b,c){YJ.call(this,b,c);this.d8=a}r(ZJ,YJ);ZJ.prototype.ih=function(a,b,c){return new bl(this.d8(a),!this.rt,b,c)};function $J(a,b){YJ.call(this,!0,b);this.d4=a}r($J,YJ);$J.prototype.ih=function(a,b,c){return new bl(this.d4*a,!1,b,c)};function aK(a,b,c,d){YJ.call(this,c,d);this.KE=a;this.wH=b}r(aK,YJ);aK.prototype.ih=function(a,b,c){return new bl((this.wH-this.KE)*a+this.KE,!this.rt,b,c)};function bK(a,b){this.u4=a;this.Jb=b}bK.prototype.getTransform=function(a,b,c,d,e,f){const g=this.Jb;a=zJ(a,c,d,h=>"moveX"==g?nl(h).xc:ol(h).xc);return null===a?null:new bl((this.u4-a)*b+a,!0,d,f)};function cK(a,b,c,d){wJ.call(this,a,b);this.Jb=c;this.Rk=d}r(cK,wJ);cK.prototype.yc=function(a,b,c,d,e){(a=this.Rk.getTransform(this,a,b,c,d,e))&&yJ(this,b,this.Jb,a)};function dK(a){this.Jb=a}r(dK,BJ);dK.prototype.Yh=function(a,b){const c=this.ta();if(c.Uo in a){var d=uJ(this),e=b.duration();b=!b.Bi();a=new cK(d,e,this.Jb,new $J(a[c.Uo],b))}else if(c.iI in a){d=uJ(this);e=b.duration();var f=DJ(a[c.iI]);b=!b.Bi();a=new cK(d,e,this.Jb,new ZJ(f,v(a,c.TI,!1),b))}else c.from in a?(d=uJ(this),e=b.duration(),b=!b.Bi(),a=new cK(d,e,this.Jb,new aK(a[c.from],a[c.Hh],v(a,c.TI,!1),b))):(d=uJ(this),b=b.duration(),e=this.Jb,a=new cK(d,b,e,new bK(a[c.Hh],e)));return a}; +function eK(){this.Jb="moveX"}r(eK,dK);function fK(){this.Jb="moveY"}r(fK,dK);function gK(a,b,c){this.MZ=a;this.dL=b;this.Wh=c}gK.prototype.getTransform=function(a,b,c,d,e,f){return new ip((this.dL-this.MZ)*b+this.MZ,this.Wh,d,f)};function hK(a,b){this.dL=a;this.Wh=b}hK.prototype.getTransform=function(a,b,c,d,e,f){a=zJ(a,c,d,g=>(g=kl(g,"filter"))&&g instanceof ip?g.alpha():1);return null===a?null:new ip((this.dL-a)*b+a,this.Wh,d,f)};function iK(a,b,c){wJ.call(this,a,b);this.Rk=c}r(iK,wJ);iK.prototype.yc=function(a,b,c,d,e){(a=this.Rk.getTransform(this,a,b,c,d,e))&&yJ(this,b,"filter",a)};function jK(){}r(jK,BJ);jK.prototype.Yh=function(a,b){const c=this.ta();if(c.Uo in a)throw uJ(this),b.duration(),this.level(),Error("not implemented");if(c.from in a){var d=uJ(this);b=b.duration();var e=this.level();a=new iK(d,b,new gK(a[c.from],a[c.Hh],e))}else d=uJ(this),b=b.duration(),e=this.level(),a=new iK(d,b,new hK(a[c.Hh],e));return a};function kK(a,b){this.Wf=a;this.rO=b}kK.prototype.ih=function(a,b,c){return new cl(this.Wf*a,!1,b,c)};kK.prototype.getTransform=function(a,b,c,d,e,f){b=this.ih(b,d,f);e&&this.rO&&(a=this.ih(xJ(a),d,f),b=b.add(a.pu()));return b};function lK(a,b){this.GU=a;this.R9=b}lK.prototype.getTransform=function(a,b,c,d,e,f){return new cl((this.R9-this.GU)*b+this.GU,!0,d,f)};function mK(a){this.Wf=a}mK.prototype.getTransform=function(a,b,c,d,e,f){a=zJ(a,c,d,g=>ll(g).angle()+ml(g).angle());return null===a?null:new cl((this.Wf-a)*b+a,!0,d,f)};function nK(a,b,c,d){wJ.call(this,a,b);this.Jb=c;this.Rk=d}r(nK,wJ);nK.prototype.yc=function(a,b,c,d,e){(a=this.Rk.getTransform(this,a,b,c,d,e))&&yJ(this,b,this.Jb,a)};function oK(){}r(oK,BJ);oK.prototype.Yh=function(a,b){const c=this.ta();if(c.Uo in a){var d=uJ(this),e=b.duration();b=!b.Bi();a=new nK(d,e,"rotateBy",new kK(a[c.Uo]*Math.PI/180,b))}else c.from in a?(d=uJ(this),b=b.duration(),a=new nK(d,b,"rotateTo",new lK(a[c.from]*Math.PI/180,a[c.Hh]*Math.PI/180))):(d=uJ(this),b=b.duration(),a=new nK(d,b,"rotateTo",new mK(a[c.Hh]*Math.PI/180)));return a};function pK(a,b){this.rt=a;this.qO=b}pK.prototype.getTransform=function(a,b,c,d,e,f){b=this.ih(b,d,f);this.rt&&e&&this.qO&&(a=this.ih(xJ(a),d,f),b=b.add(a.pu()));return b};function qK(a,b,c){pK.call(this,b,c);this.J8=a}r(qK,pK);qK.prototype.ih=function(a,b,c){return new dl(this.J8(a),!this.rt,b,c)};function rK(a,b){pK.call(this,!0,b);this.ra=a}r(rK,pK);rK.prototype.ih=function(a,b,c){return new dl((this.ra-1)*a+1,!1,b,c)};function sK(a,b,c,d){pK.call(this,c,d);this.eT=a;this.fL=b}r(sK,pK);sK.prototype.ih=function(a,b,c){return new dl((this.fL-this.eT)*a+this.eT,!this.rt,b,c)};function tK(a,b){this.fL=a;this.Jb=b}tK.prototype.getTransform=function(a,b,c,d,e,f){const g=this.Jb;a=zJ(a,c,d,h=>{switch(g){case "scaleX":return pl(h).scale();case "scaleX2":return ql(h).scale();case "scaleY":return rl(h).scale();case "scaleY2":return sl(h).scale()}return null});return null===a?null:new dl((this.fL-a)*b+a,!0,d,f)};function uK(a,b,c,d){wJ.call(this,a,b);this.Jb=c;this.Rk=d}r(uK,wJ);uK.prototype.yc=function(a,b,c,d,e){(a=this.Rk.getTransform(this,a,b,c,d,e))&&yJ(this,b,this.Jb,a)};function vK(a){this.Jb=a}r(vK,BJ);vK.prototype.Yh=function(a,b){const c=this.ta();if(c.Uo in a){var d=uJ(this),e=b.duration();b=!b.Bi();a=new uK(d,e,this.Jb,new rK(a[c.Uo],b))}else if(c.iI in a){d=uJ(this);e=b.duration();var f=DJ(a[c.iI]);b=!b.Bi();a=new uK(d,e,this.Jb,new qK(f,v(a,c.TI,!1),b))}else c.from in a?(d=uJ(this),e=b.duration(),b=!b.Bi(),a=new uK(d,e,this.Jb,new sK(a[c.from],a[c.Hh],v(a,c.TI,!1),b))):(d=uJ(this),b=b.duration(),e=this.Jb,a=new uK(d,b,e,new tK(a[c.Hh],e)));return a}; +function wK(){this.Jb="scaleX"}r(wK,vK);function xK(){this.Jb="scaleY"}r(xK,vK);function yK(){this.Jb="scaleX2"}r(yK,vK);function zK(){this.Jb="scaleY2"}r(zK,vK);function AK(a,b,c,d){this.fi=a;this.p8=b;this.q8=c;this.Jb=d?"cssTextProperties":"cssProperties"}r(AK,Al);AK.prototype.xe=function(a,b){b=Yk(this.p8,this.q8,b,!0);a.Fd.add(new Tp(this.fi,this.Jb,b))};AK.prototype.tk=function(){};function BK(){}r(BK,sJ);BK.prototype.Yh=function(a){const b=this.ta(),c=a[b.pca],d=a[b.mba];if(d){var e=tJ(this);Pa(e.RJ,c)||e.RJ.push(c)}else e=tJ(this),Pa(e.QJ,c)||e.QJ.push(c);return new AK(uJ(this),c,a[b.Hh],d)};function CK(a,b){this.NZ=a;this.gL=b}CK.prototype.getTransform=function(a,b,c,d,e,f){return new el((this.gL-this.NZ)*b+this.NZ,d,f)};function DK(a){this.gL=a}DK.prototype.getTransform=function(a,b,c,d,e,f){a=zJ(a,c,d,g=>tl(g).shift());return null===a?null:new el((this.gL-a)*b+a,d,f)};function EK(a,b,c){wJ.call(this,a,b);this.Rk=c}r(EK,wJ);EK.prototype.yc=function(a,b,c,d,e){(a=this.Rk.getTransform(this,a,b,c,d,e))&&yJ(this,b,"shiftX",a)};function FK(){}r(FK,BJ);FK.prototype.Yh=function(a,b){const c=this.ta();if(c.from in a){var d=uJ(this);b=b.duration();a=new EK(d,b,new CK(a[c.from],a[c.Hh]))}else d=uJ(this),b=b.duration(),a=new EK(d,b,new DK(a[c.Hh]));return a};function GK(a,b){this.fi=a;this.Ra=b}r(GK,Al);GK.prototype.xe=function(a,b){this.yc(this.Ra,a,b)};GK.prototype.tk=function(a,b){this.yc(!this.Ra,a,b)};GK.prototype.yc=function(a,b,c){b.Fd.add(new Tp(this.fi,"visibility",new il(a,c)))};function HK(){}r(HK,sJ);HK.prototype.Yh=function(a){const b=this.ta();return new GK(uJ(this),a[b.Hh])};function IK(a){this.Xg=a;this.vl=1;this.F9=0}var JK; +IK.prototype.load=function(a,b){var c=this.ta();c.iQ in b&&KK(this,a,b[c.iQ]);var d=this.ta(),e=null;d.gR in b&&d.Hi in b[d.gR]&&(e=b[d.gR]);var f=e?e[d.Hi].length:0,g=a.sb().count(),h=!1;if(g==f+1)f=a.Uv,g=a.sb().sc(0),f.Bh(Tl(this.Xg,"__step",!0)),Vl(f,new fJ(1E3*g.duration())),h=!0;else if(g!==f)throw Error("count of slide animation steps must be equal to steps in mainSequence");e&&LK(this,a,a.Tu,a.Uv,0,e[d.Hi],new MK(a,this,h));if(c.ZQ in b)for(b=b[c.ZQ],c=0;cp?p/(D+.001):1;D>m.F9&&(m.vl=p);m=p;p=new gJ;w=!1;n=n[h.hk];for(t=0;t{const w=new tm(p[m.type],e(p[m.Mm]),t),y=m.item;p[m.Tc]&&(w.Tc=f(p[m.Tc],y),w.o0= +p[m.Tc][m.aba]);u(p[m.Nl],D=>{D=f(D,y);w.Nl.push(D)});u(p[m.pr]||[],D=>{D=new l(D[m.type],D[m.text],D[m.vj]);w.pr.push(D)});w.text=p[m.text];w.zr=p[m.zr]||0;w.rotation=p[m.rotation]/180*Math.PI;w.Dl=p[m.Dl];w.Pl=p[m.Pl];w.vj=p[m.vj];t=w.Fx;t.line=p[m.line];t.fill=p[m.fill];t.iu=p[m.iu];t.uu=p[m.uu];t.Du=p[m.Du];t.Iu=p[m.Iu];t.Ju=p[m.Ju];sm(w);p[m.se]&&(w.se=g(p[m.se],m.se));b.Sw.push(w)},a)}} +function cL(a,b,c){function d(f){switch(f[e.action.type]){case e.action.type.Lba+"":return new RK;case e.action.type.ue+"":return new fs(f[e.action.L])}throw Error("unknown branching action");}const e=a.ta().slides.pj;e.kp in c&&Pf(b,d(c[e.kp]));e.ey in c&&Qf(b,d(c[e.ey]))}function dL(a,b,c){function d(f){return new as(f[e.link.url],f[e.link.target])}const e=a.ta().settings.Qu;Zr(b,e.kJ in c?d(c[e.kJ]):null);$r(b,e.NI in c?d(c[e.NI]):null)} +function eL(a,b,c){function d(e){return e?new Qr(new Date(1E3*e)):null}a=a.ta().settings.gy;a.password in c&&(b.GN=c[a.password]);if(a.yy in c){const e=c[a.yy];Wr(b,new Ur(d(e[a.yy.vaa]),d(e[a.yy.waa])))}a.fI in c&&(b.dU=c[a.fI])}function YK(a,b){if(!a)return 1;if("number"===typeof a)return a;switch(a){case b.repeat.z2+"":return"untilNextClick";case b.repeat.A2+"":return"untilNextSlide";case b.repeat.B2+"":return"untilNextSound"}return 1} +function ZK(a,b,c){if(c.ik in b){b=b[c.ik];for(let e=0;e{d.push(a.fP.Wu[e]||null)});return new pf(d,c)} +function XK(a,b,c){const d=a.ta();if(d.qd in c){const e=b.qd();c=c[d.qd];if(d.qd.Lm in c){const f=b.fP,g=e.Lm();fL(a,c[d.qd.Lm],(h,l,n,m)=>{g.d0(new sr(f.Wu[h]||null,n,m,l))})}if(d.qd.Vf in c){const f=b.P_,g=e.Vf();fL(a,c[d.qd.Vf],(h,l,n,m)=>{g.f0(new vr(f.Wu[h]||null,n,m,l))})}}}function fL(a,b,c){const d=a.ta().qd.track;for(let f=0;fn;++n)l.push(m),m+=1<<(n>>1);for(n=0;3>n;++n)d.push(n+16);for(n=0;7>=n;++n)d.push((8-n)%8),d.push(8+n);for(n=1;3>n;++n)e.push(n);for(n=0;28>n;++n){var p=n>>1<<16;m=n%8;p+=(l[m]<< +(n-m)/2)+1;e.push(p)}for(n=3;7>n;++n)f.push(n);m=7;for(n=0;24>n;++n)l=n>>2,p=(l<<16)+m,m+=1<n;++n)f.push(258)})();c.prototype.CQ=function(l){var n=this.XH,m=n?n.length:0;if(l>l; +this.AC=n-l;this.vx=t;return m&(1<>16;m&=65535;(0==l||l>n;this.AC=l-n;this.vx=w;return m};c.prototype.JC=function(l){for(var n=l.length,m=0,p=0;pm&&(m=l[p]);for(var t=1<>=1;for(p=J;p< +t;p+=I)w[p]=y<<16|A;++D}return[w,m]};c.prototype.vca=function(){function l(J,T,U,X,aa){for(J=J.ur(U)+X;0>=1;if(0==n){var m=this.nQ,p=this.vx,t;b(t=m[p++])&&a();var w=t;b(t=m[p++])&&a();w|=t<<8;b(t=m[p++])&&a();n=t;b(t=m[p++])&&a();(n|t<<8)!=(~w&65535)&&a();this.AC=this.zC=0;t=this.vC;n=this.CQ(t+w);this.vC=w=t+w;for(var y=t;y=D;++D)m[D]=8; +for(;255>=D;++D)m[D]=9;for(;279>=D;++D)m[D]=7;for(;287>=D;++D)m[D]=8;g=this.JC(m);n=Array(31);for(D=0;32>D;++D)n[D]=5;h=this.JC(n);h[0][15]=0;h[0][31]=0}p=g;t=h}else if(2==n){n=this.ur(5)+257;t=this.ur(5)+1;p=this.ur(4)+4;m=Array(d.length);for(D=0;DI)y+1>=w&&(n=this.CQ(y+1),w=n.length),n[y++]=I;else{if(256==I){this.vC=y;break}I-=257;I=f[I];var A=I>>16;0>16;0=w&&(n=this.CQ(y+m),w=n.length);for(A=0;Ae?(c[++h]=String.fromCharCode(e),++d):191e?(f=a[d+1],c[++h]=String.fromCharCode((e&31)<<6|f&63),d+=2):(f=a[d+1],g=a[d+2],c[++h]=String.fromCharCode((e&15)<<12|(f&63)<<6|g&63),d+=3):++d;b(c.join(""))};function jL(a,b,c,d){var e=(new SK(c)).load(b);b=parseInt(v(b,c.hca,"2007"),10);c=new VI;a.dY.C(e);e=new NI(e,b,c);Qe(a,e.xw,f=>{f.view().Fi().id=d;mn(f.view().displayObject(),d);a.xw.C(f)});e.sr()}function kL(a,b,c,d){iL(b,e=>{e=JSON.parse(e);if(!e)throw Error("invalid presentation json!");jL(a,e,c,d)})}class lL extends wg{constructor(){super();this.xw=E(this);this.dY=E(this)}sr(a,b,c){la(a)?jL(this,a,b,c):kL(this,a,b,c)}};function mL(){return nL()||void 0===window.orientation?window.innerWidth>window.innerHeight:!!(window.orientation%180)}function nL(){return 0<=window.location.search.indexOf("ispringpreview=1")};function oL(a,b){z(a,b.TV,a.rM,a);z(a,b.u_,a.CP,a);b=b.rD();z(a,b.Mu(),a.rM,a);z(a,b.wJ(),a.CP,a)}function pL(a,b){z(a,b.ll,a.rM,a);z(a,b.Qk,a.CP,a)}class qL extends wg{constructor(a){super();this.GJ=a;a=Oi();this.Ib=a.hasOwnProperty("accessibility")&&"1"==a.accessibility&&this.Km()?"accessible":"normal";this.TP=!1;this.fY=E(this);this.VV=E(this);this.v_=E(this)}mode(){return this.Ib}Km(){return this.GJ&&!Ii&&!nL()}rM(){this.TP=!0;this.VV.C()}CP(){this.TP=!1;this.v_.C()}};function rL(a,b,c,d){if(a.Km()){const e=new P({Yb:"SECTION"});e.vf("region");e.vp(d.PB_ACCESSIBLE_ARIA_LABEL_SETTINGS);d=rd(document,c);c=e.displayObject();d.appendChild(c);c=new ZC({F:"presentation-view-mode-switch-control",tabIndex:0});M(e,c);sL(c,a);tL(c,a);uL(c,b);return c}return null} +function sL(a,b){a.ja.addHandler(()=>{if(b.TP)Ga("view mode change is locked");else{const d="normal"==b.Ib?"accessible":"normal";a:switch(d){case "normal":var c=!0;break a;case "accessible":c=b.Km();break a;default:throw Error("unknown presentation view mode");}c&&(b.Ib=d,b.fY.C(d))}})}function tL(a,b){let c=!1;b.VV.addHandler(()=>{document.activeElement==a.displayObject()&&(c=!0);a.qa(!1)});b.v_.addHandler(()=>{a.qa(!0);c&&(a.focus(),c=!1)})} +function uL(a,b){b.Jn.addHandler(()=>{a.focus()});b.US.addHandler(c=>{"normal"==c&&a.focus()})};function vL(a,b){var c=Mo(a).concat(b);a=c[0];b=c[1];var d=c[2];c=c[3];if(isNaN(a)||0>a||255b||255d||255c||1vL(b.color,b.opacity)).join(", ");return`linear-gradient(${this.nz}deg, ${a})`}jd(a){return zL({sj:this.nz,tj:this.Hz.map(b=>({color:b,opacity:b.opacity*a}))})}Om(){return zL({sj:this.nz,tj:this.Hz.map(a=>({color:a.color,opacity:a.opacity}))})}};function BL(a){const b={};Object.keys(a).forEach(c=>{const d=a[c];"SOLID"===d.type?b[c]=xL({color:d.color,opacity:d.opacity}):"GRADIENT"===d.type&&(b[c]=zL({sj:d.degree,tj:d.gradient}))});return b}function CL(a){const b={};for(const [c,d]of Object.entries(a))b[c]=d.tJ();return b};class DL{constructor(){var a=new gG;this.Nba=new pG;this.mC=a;this.RC=iG}};class EL{constructor({Ca:a,DR:b,colors:c,Zm:d}){this.G=a;this.RN=b;this.Sb=c;this.ut=d;this.$f=null;(a=this.Sb)&&(a.popupBorder=a.playerText.jd(.08))}dQ(a){Fd(this.$f);this.$f=null;if("normal"==a){a=this.ut.Nba;const b={__slide_width__:`${this.G.slideWidth()}px`,__slide_height__:`${this.G.slideHeight()}px`,__player_view_id__:this.RN,__borderRadius__:`${this.G.settings().skin().borderRadius}px`};this.$f=a.Yo(this.Sb&&CL(this.Sb),b)}else if("accessible"==a)this.KJ();else throw Error("unknown presentation view mode"); +}KJ(){this.$f=this.ut.mC.Yo()}};function Z(a,b){if(a.Ud.hasOwnProperty(b))a=a.Ud[b];else throw Error("unknown template id: "+b);a=Ad(Kc(a));return a instanceof DocumentFragment?a.firstChild:a}class FL{constructor(a){this.Ud=a}JU(a){return"{"+a+"}"}};class GL extends FL{};function HL(a){if(a.na&&a.na.visible()){a.na.focus();var b=!0}else b=!1;b||(a.qh&&a.qh.isActive()?(a.qh.focus(),b=!0):b=!1);!b&&(a=a.zc.Gd[a.B.ma()].content(),a=void 0!==a.firstElementChild?a.firstElementChild:Id(a.firstChild))&&(a.setAttribute("tabindex",0),a.focus())}function IL(a,{H2:b,pia:c=200}){if(a.tF()||a.bA())b?setTimeout(()=>HL(a),c):HL(a)} +class JL extends wg{constructor({V:a,kn:b}){super();this.B=a;this.zc=b;this.qh=this.na=null}tF(){return-1!=this.B.ma()&&this.B.fa()instanceof Am}bA(){return-1!=this.B.ma()&&this.B.fa()instanceof Bq}};function KL(a){if(0NL(a,b)).map(b=>b.audio())}function OL(a){return a.qh.Vf().Mc().filter(b=>NL(a,b)).map(b=>b.video())}function NL(a,b){return a.W()>=b.Lb().L()&&a.W()<=b.qf().L()}function LL(a,b){return a.I.ia(b instanceof HTMLAudioElement?"PB_ACCESSIBLE_AUDIO_NARRATION_LABEL":"PB_ACCESSIBLE_VIDEO_NARRATION_LABEL")} +class PL extends P{constructor({qd:a,V:b,ga:c}){super({Yb:"SECTION",F:"ppt-accessible-narration"});this.qh=a;this.B=b;this.I=c;this.Lj=[];this.oW=new Map;z(this,this.B.vc(),this.h$,this)}isActive(){return 0Fd(b));this.Lj.splice(0,this.Lj.length);[...ML(this),...OL(this)].forEach(b=>{var c=this.Lj,d=c.push,e;if(!(e=this.oW.get(b.id()))){e=nH(b.wi()||mH(b));e=Ad(Kc(e));const f=LL(this,e);jt(e, +"label",f);e=this.oW.set(b.id(),e).get(b.id())}d.call(c,e)});this.Lj.forEach(b=>{!a.includes(b)&&b.readyState&&(b.currentTime=0)});this.Lj.forEach(b=>this.O(b));this.J(!!this.Lj.length);KL(this)}W(){return this.B.ma()}};class QL extends P{constructor({V:a,eca:b,ga:c}){super({Yb:"NAV",F:"simple-navigation-panel"});this.vf("navigation");this.vp(c.ia("PB_ACCESSIBLE_ARIA_LABEL_NAVIGATION_BUTTONS"));this.B=a;this.ON=b;this.I=c;this.PU=E(this);this.NU=E(this);const {Z$:d,X$:e}=this.nv();M(this,e);M(this,d);z(this,this.B.vc(),()=>{setTimeout(()=>{var f=d.qa,g=!this.B.nf("switchToPreviousSlide"),h=-1!=this.B.gh();f.call(d,g&&h);f=e.qa;g=!this.B.nf("switchToNextSlide");h=-1!=this.B.fh();f.call(e,g&&h||this.B.ma()==this.B.Sm()&& +this.ON.Tm())},200)})}nv(){const a=this.Ae({caption:this.I.ia("PB_ACCESSIBLE_NAVIGATION_PREV_BUTTON"),w0:()=>this.PU.C()}),b=this.Ae({caption:this.I.ia("PB_ACCESSIBLE_NAVIGATION_NEXT_BUTTON"),w0:()=>this.NU.C()});return{Z$:a,X$:b}}Ae({caption:a,w0:b}){const c=new ZC({ka:O(this,"button")});c.ha(a);z(this,c.ja,b,this);return c}};function RL(a){a.pb.C()}class SL extends wg{constructor(){super();this.Ra=!1;this.KO=this.Hb=!0;this.Yv=TL;this.pb=E(this);this.Cc=E(this)}get visible(){return this.Ra}set visible(a){this.Ra!=a&&(this.Ra=a,this.Cc.C())}get enabled(){return this.Hb}set enabled(a){this.Hb!=a&&(this.Hb=a,RL(this))}get Lr(){return this.KO}set Lr(a){this.KO!=a&&(this.KO=a,RL(this))}get mode(){return this.Yv}set mode(a){this.Yv!=a&&(this.Yv=a,RL(this))}}var TL="presentationTimeline";class UL extends wg{constructor(){super();this.Et=this.Vb=this.Ra=!1;this.va=new SL;this.wo=this.yo=this.UO=this.Ft=this.GO=this.WO=this.QO=!1;this.De=VL;this.VO=!1;this.pb=E(this);this.Cc=E(this)}get visible(){return this.Ra}set visible(a){this.Ra!=a&&(this.Ra=a,this.Cc.C())}get showOutline(){return this.Vb}set showOutline(a){this.Vb!=a&&(this.Vb=a,RL(this))}get xf(){return this.Et}set xf(a){this.Et!=a&&(this.Et=a,RL(this))}get lc(){return this.va}get sy(){return this.QO}set sy(a){this.QO!=a&&(this.QO= +a,RL(this))}get Mr(){return this.WO}set Mr(a){this.WO!=a&&(this.WO=a,RL(this))}get Ll(){return this.GO}set Ll(a){this.GO!=a&&(this.GO=a,RL(this))}get Qd(){return this.Ft}set Qd(a){this.Ft!=a&&(this.Ft=a,RL(this))}get Hu(){return this.UO}set Hu(a){this.UO!=a&&(this.UO=a,RL(this))}get yf(){return this.yo}set yf(a){this.yo!=a&&(this.yo=a,RL(this))}get Re(){return this.wo}set Re(a){this.wo!=a&&(this.wo=a,RL(this))}get $g(){return this.De}set $g(a){this.De!=a&&(this.De=a,RL(this))}get zp(){return this.VO}set zp(a){this.VO!= +a&&(this.VO=a,RL(this))}}var VL="bySlides";function WL(a){return("presentationNavigationType"!=a.up()||"presentationSeeking"==a.lR())&&"quizNavigationSettings"!=a.up()&&"scenarioNavigationSettings"!=a.up()} +class XL extends wg{constructor(a,b){super();this.B=a;this.De=b}Ec(){return this.B.$().Ec()}isNextAvailable(){const a=this.B.nf(this.De==VL?"switchToNextSlide":"switchToNextStep");return!(a&&WL(a))}isPrevAvailable(){const a=this.B.nf(this.De?"switchToPreviousSlide":"switchToPreviousStep");return!(a&&WL(a))}prev(){this.De==VL?this.B.vi():"bySteps"==this.De&&this.B.ju()}next(){this.De==VL?this.B.sf():"bySteps"==this.De&&this.B.fp()}};class YL extends wg{constructor(a,b,c){super();this.B=a;this.vg=b;this.sF=c;z(this,this.vg.Ec(),()=>{this.B.invalidate()})}isNextAvailable(){return this.sF?this.vg.isNextAvailable():this.B.isNextAvailable()||this.vg.isNextAvailable()}isPrevAvailable(){return this.sF?this.vg.isPrevAvailable():this.B.isPrevAvailable()||this.vg.isPrevAvailable()}prev(){this.sF?this.vg.prev():this.B.isPrevAvailable()?this.B.prev():this.vg.prev()}next(){this.sF?this.vg.next():this.B.isNextAvailable()?this.B.next():this.vg.next()}} +;function ZL(a,b,c){const d=a.rd().type();var e=b.settings().navigation().navigationType();c=c.fa();if(e=$L(d,e,c)){c={};b=b.slides();a=a.rd().Pd();if(a=null!=a?`${b.la(a).Mi()+1}`:"")b=c,"precedingQuizFailed precedingQuizNotPassed precedingQuizNotCompleted precedingScenarioNotPassed precedingScenarioFailed precedingScenarioNotCompleted".split(" ").includes(d)&&(b.SLIDE_INDEX=a);return{Jg:e,o1:c}}return null} +function $L(a,b,c){switch(a){case "currentSlideIsNotCompleted":return"PB_CURRENT_SLIDE_IS_NOT_COMPLETED";case "backwardNavigationIsRestricted":case "forwardNavigationIsRestricted":return"sequential"==b?"PB_NAVIGATION_IS_SEQUENTIAL":"PB_NAVIGATION_IS_RESTRICTED";case "interactionNotCompleted":return c instanceof Bq?"PB_SCENARIO_SLIDE_WINDOW_TEXT":c instanceof tq?"PB_INTERACTION_SLIDE_WINDOW_TEXT":"PB_QUIZ_SLIDE_WINDOW_TEXT";case "precedingQuizFailed":return"PB_PRECEDING_QUIZ_FAILED_WINDOW_TEXT";case "precedingQuizNotPassed":return"PB_PRECEDING_QUIZ_NOT_PASSED_WINDOW_TEXT"; +case "precedingQuizNotCompleted":return"PB_PRECEDING_QUIZ_NOT_COMPLETED_WINDOW_TEXT";case "precedingScenarioNotPassed":return"PB_PRECEDING_SCENARIO_NOT_PASSED_WINDOW_TEXT";case "precedingScenarioFailed":return"PB_PRECEDING_SCENARIO_FAILED_WINDOW_TEXT";case "precedingScenarioNotCompleted":return"PB_PRECEDING_SCENARIO_NOT_COMPLETED_WINDOW_TEXT";default:return""}};function aM(a){const b=a.B;z(a,a.D.uy(),a.fo,a);z(a,a.R.Cd().Yx(),a.$n,a);z(a,b.vc(),a.oe,a);z(a,b.XJ,a.z3,a);z(a,b.Wr,a.PJ,a);Qe(a,a.D.Qx(),a.y6,a);z(a,a.zA.PU,()=>{bM(a,a.B.vi.bind(a.B,!1))});z(a,a.zA.NU,()=>{bM(a,a.B.sf.bind(a.B,!1))})}function bM(a,b){const c=cM(a);c&&a.wf("busy","true");b();c&&setTimeout(()=>a.wf("busy","false"),200)}function cM(a){return a.fH?"slide"==a.fH.oaa&&"slide"==a.fH.Jba:!1} +class dM extends P{constructor({F:a,kc:b,messages:c,skinSettings:d}){super({F:a});this.D=b;this.Xa=d;this.I=new KG(c);this.G=b.Ca();this.R=b.view();this.B=this.R.V();this.rc=this.R.Cd();this.Da=this.B.$();this.rn=this.R.rn;this.vg=B(this,new XL(this.rc,VL));this.Bz=B(this,new JL({V:this.B,kn:this.R.kn()}));this.zA=new QL({V:this.rc,eca:this.G.settings().Vc(),ga:this.I});a=this.G.qd();this.qh=a.Lm().count()||a.Vf().count()?new PL({qd:a,V:this.B,ga:this.I}):null;a=new P({Yb:"SECTION",F:"ppt-accessible-footer"}); +a.vf("region");a.vp(this.I.ia("PB_ACCESSIBLE_ARIA_LABEL_BOTTOM_PANEL"));this.Fj=a;this.fH=null;cv(this.rn,this.displayObject());aM(this);this.Kb(this.G.slideWidth());-1==this.B.ma()&&this.J(!1);x(this,window,"resize",this.C_,this);this.C_()}fo(a){var b=a.action(),c=this.G.settings().Vc().wu();"resumePlayback"==b&&"prompt"==c&&(a.xu("delayStartup"),b=a.Zw,c=this.I.ia("PB_RESUME_PRESENTATION_WINDOW_TEXT"),confirm(c)?b.resume(a.L(),!0):b.start(this.B.Pf(),!0))}y6(){this.J(!0);IL(this.Bz,{H2:!1})}oe(){if(this.Gc()instanceof +tq){var a=this.B.fb(),b=this.Gc(),c=a,d=c.setExternalNavigationController;a=new YL(a.playerController(),this.vg,2==b.Qn);d.call(c,a)}this.zA.J(this.tF()||this.bA())}z3(a,b){this.Gc()instanceof cr?this.B.Oa().skin().bottomPanel().setExternalParent(null):this.Gc()instanceof tq?this.B.fb().setExternalParentForAccessibleNavigationControls(null):this.bA()&&this.B.tb().setExternalParentForAccessibleBottomPanel(null);this.fH={oaa:a,Jba:b}}PJ(){if(this.Gc()instanceof cr){var a=this.Fj;this.B.Oa().skin().bottomPanel().setExternalParent(a? +a.displayObject():null)}else this.Gc()instanceof tq?(a=this.Fj,this.B.fb().setExternalParentForAccessibleNavigationControls(a?a.displayObject():null)):this.bA()&&(a=this.Fj,this.B.tb().setExternalParentForAccessibleBottomPanel(a?a.displayObject():null));IL(this.Bz,{H2:cM(this)})}Gc(){return-1!=this.B.ma()?this.B.fa():null}tF(){return this.Gc()instanceof Am}bA(){return this.Gc()instanceof Bq}$n(a){(a=ZL(a,this.G,this.B))&&this.vo(a)}vo({Jg:a,o1:b}){const c=this.B.$().suspended();Ws(this.Da,!0);alert(this.I.ia(a, +b));Ws(this.Da,c)}C_(){L(this,"min-height",`${window.innerHeight}px`)}};class eM extends dM{constructor({kc:a,messages:b,skinSettings:c}){super({F:"accessible-null-skin",kc:a,messages:b,skinSettings:c});(a=this.qh)&&M(this,a);this.O(this.R.displayObject());(a=this.zA)&&M(this.Fj,a);(a=this.Fj)&&M(this,a);this.Bz.qh=this.qh}};class fM extends P{constructor(){super({F:"launch-screen"});const a=new P({F:"launch-screen-button"});Ii||z(this,a.ja,()=>this.ja.C());const b=new P({ka:O(a,"play-icon")}),c=new P({ka:O(a,"icon")});a.O(b);a.O(c);this.O(a)}};function gM(a){return a.Hc?new P({za:a.Hc.element,ka:O(a,`${a.Hc.Ne}-icon`)}):null}function hM(a){if(a.Ag){const b=new P({Yb:"SPAN",ka:O(a,"button-text")});b.ha(a.Ag);return b}return null} +class iM extends P{constructor({icon:a,type:b,size:c="medium",text:d,prefix:e}){super({F:`${e?e:""}${b}`,Yb:"BUTTON"});this.lo=!1;this.Ag=d||null;this.Hc=a||null;this.Fs=gM(this);(this.Vq=hM(this))&&M(this,this.Vq,this.Hc?"right"===this.Hc.Ne?0:1:0);this.Fs&&M(this,this.Fs,this.Hc?"right"===this.Hc.Ne?1:0:0);this.s4=E(this);this.X("size",c);this.Ky()}pressed(){return this.lo}Dc(a){this.lo=a;this.wf("pressed",a);this.X("withTooltip",!this.lo)}ha(a){(this.Ag=a)?this.Vq?this.Vq.ha(a):(this.Vq=hM(this), +M(this,this.Vq,this.Hc?"right"===this.Hc.Ne?0:1:0)):(Se(this,this.Vq),this.Vq=null)}on(a){this.Fs&&Se(this,this.Fs);this.Hc={element:a,Ne:"left"};(this.Fs=gM(this))&&M(this,this.Fs,this.Hc?"right"===this.Hc.Ne?1:0:0)}qa(a){super.qa(a);this.s4.C(a)}};function jM(a,b){He.call(this);this.FC=a;a=Jd(this.FC)?this.FC:this.FC?this.FC.body:null;this.lba=!!a&&Uh(a);this.h1=ve(this.FC,Lb?"DOMMouseScroll":"mousewheel",this,b)}r(jM,He); +jM.prototype.handleEvent=function(a){var b=0,c=0,d=a.te;"mousewheel"==d.type?(a=kM(-d.wheelDelta),void 0!==d.wheelDeltaX?(b=kM(-d.wheelDeltaX),c=kM(-d.wheelDeltaY)):c=a):(a=d.detail,100a&&(a=-3),void 0!==d.axis&&d.axis===d.HORIZONTAL_AXIS?b=a:c=a);"number"===typeof this.l1&&(b=Vc(b,-this.l1,this.l1));"number"===typeof this.m1&&(c=Vc(c,-this.m1,this.m1));this.lba&&(b=-b);b=new lM(a,d,b,c);this.dispatchEvent(b)};function kM(a){return Mb&&(Nb||Pb)&&0!=a%40?a:a/40} +jM.prototype.pf=function(){jM.Mb.pf.call(this);Ee(this.h1);this.h1=null};function lM(a,b,c,d){ie.call(this,b);this.type="mousewheel";this.detail=a;this.deltaX=c;this.deltaY=d}r(lM,ie);function mM(a){return a.Kj-a.Vi} +class nM extends P{constructor(a){super({F:a.F,zf:!0});this.DF=15;this.Eb=this.Kj=this.Vi=this.$k=0;this.kA=a.Oe||1;this.KG=this.jt=0;this.y8=100;this.kf=B(this,new P({ka:O(this,"up")}));this.O(this.kf);this.La=B(this,new P({F:"thumb"}));this.O(this.La);this.La.O(B(this,new P({ka:O(this.La,"background")})));this.mh=B(this,new P({ka:O(this,"down")}));this.O(this.mh);this.Hq=this.vm=null;this.jj=E(this);this.XB=E(this);this.ij=new jh(this.y8);x(this,this.ij,"tick",this.rN,this);x(this,this,Km,this.hx, +this,Om);x(this,this.kf,Km,this.zN,this,Om);x(this,this.La,Km,this.MA,this,Om);x(this,this.mh,Km,this.$M,this,Om);x(this,document.body,Lm,this.RF,this)}Sf(a){this.Dt(a)}Oe(){return this.kA}scale(){return this.kt}setScale(a){this.setParentScale(a)}Ci(a,b,c,d=0){this.$k=a;this.Vi=b;this.Kj=c;this.jt=d;this.Ls();this.Sf(this.Eb)}Dt(a){a=xv(a,this.Vi,this.Kj);this.Eb!=a&&(this.Eb=a,this.fq(),this.jj.C())}xt(a){this.Dt(this.Eb+a)}hx(){}zN(a){a.preventDefault();this.xt(-this.Oe());this.MB(this.kf,-this.Oe())}$M(a){a.preventDefault(); +this.xt(this.Oe());this.MB(this.mh,this.Oe())}MB(a,b){this.vm=a;x(this,this.vm,"mouseover",this.JA,this);x(this,this.vm,"mouseout",this.IA,this);x(this,document,Lm,this.jB,this);this.ij.stop();this.Hq=function(){this.xt(this.KG)};this.KG=b;this.ij.start()}jB(){Ne(this,this.vm,"mouseover",this.JA,this);Ne(this,this.vm,"mouseout",this.IA,this);Ne(this,document,Lm,this.jB,this);this.ij.stop();this.Hq=null}JA(){this.ij.start()}IA(){this.ij.stop()}rN(){this.Hq&&this.Hq()}MA(a){this.XB.C();a.preventDefault(); +x(this,document.body,Mm,this.mm,this);this.LP(!0)}LP(a){this.La.X("active",a)}RF(){Ne(this,document.body,Mm,this.mm,this);this.LP(!1)}mm(){}Qa(){this.Ls()}};class oM extends nM{constructor(a){super(a);this.kW=0}Ls(){const a=this.height()-this.kf.height()-this.mh.height();this.La.Wc(0==mM(this)?a:Math.max(this.DF,Math.ceil(this.$k/(mM(this)+this.$k)*a)));this.fq()}fq(){const a=this.si();0==mM(this)?this.La.Tf(a.top):this.La.Tf(a.top+Math.round((this.Eb-this.Vi)/mM(this)*a.height));this.kf.qa(!!this.Eb);this.mh.qa(this.Eb!=this.Kj)}si(){const a=new Wf(0,0,0,0);a.top=this.kf.height();a.height=this.height()-this.mh.height()-this.La.height()-a.top;a.left= +this.La.x();return a}oP(){return this.si()}hx(a){var b;if(b=!a.defaultPrevented)b=this.La.displayObject().getBoundingClientRect(),b=!(a.clientY>=b.top&&a.clientY<=b.top+b.height);if(b){b=this.displayObject().getBoundingClientRect();var c=this.si(),d=0==this.jt?this.$k:this.jt;a=(a.clientY-(b.top-c.top))/this.kt<=this.La.y()?-d:d;this.Sf(this.Eb+a)}}MA(a){super.MA(a);const b=this.La.displayObject().getBoundingClientRect();this.kW=a.clientY-Math.round(b.top);this.mm(a)}mm(a){const b=this.displayObject().getBoundingClientRect(), +c=this.si();this.Dt((a.clientY-b.top-c.top*this.kt-this.kW)/(c.height*this.kt)*mM(this)+this.Vi)}};var pM=new ae;function qM(a){a.L4&&a.Rf(a.c_||a.CM?.5:0)}function rM(a,b){x(a,new jM(b.displayObject(),{passive:!0}),pM,c=>{!ih(c.te)&&c.deltaY&&(c=0{c.displayObject().scrollTop=this.Eb});x(this,c,"scroll",()=>{this.Sf(c.displayObject().scrollTop)},this);this.qB?rM(this,this.qB):(rM(this,this.Fw),rM(this,this));d?(this.Rf(0),this.qB?(x(this,this.qB,"mouseenter",this.sq,this),x(this,this.qB,"mouseleave",this.km,this)):(x(this,this.Fw,"mouseover",this.sq,this),x(this,this, +"mouseover",this.sq,this),x(this,this.Fw,"mouseout",this.km,this),x(this,this,"mouseout",this.km,this))):this.Rf(1)}Ci(a,b,c,d=0){this.J(0{this.LA.C()})}scrollY(){return this.U.scrollTop}FI(){return this.LA}ny(a){this.U.scrollTop=a}} +class wM extends wg{constructor({F:a="vertical-scrollbar",via:b="mobile-vertical-scrollbar",Gr:c,Aia:d,mQ:e,U1:f=null,Oe:g=20,preventDefault:h=!0}){super();this.ua=this.wd=null;this.m_=d||null;this.iT=e||null;this.Kj=0;if(Ii){const l=E(this);a={fadeScrollbars:!0,scrollX:!1,scrollY:!0,bounce:!1,deceleration:.006,useTransition:!1,preventDefault:h,disablePointer:!0,disableTouch:!1,disableMouse:!1,onScrollHandler:()=>{l.C()}};b=new tM(b);a.indicators={el:b.displayObject(),shrink:"scale"};this.wd=new IScroll(c.displayObject(), +a);this.li=new uM(this.wd,l)}else this.ua=B(this,new sM({F:a,Oe:g,Gr:c,bba:!0,U1:f})),this.li=new vM(c.displayObject()),b=this.ua;z(this,this.li.FI(),this.yY,this);this.W8=b}jk(){return this.W8}Ci(a,b){this.Kj=Math.max(0,b-a);this.wd?this.wd.setScrollHeight(b):this.ua&&this.ua.Ci(a,0,Math.max(this.Kj,0));this.yY()}setParentScale(a){this.ua&&this.ua.setParentScale(a)}Tx(){this.ua&&this.ua.Tx()}yY(){if(this.m_){var a=Math.min(this.li.scrollY(),60);Ph(this.m_,a)}this.iT&&(a=this.Kj-this.li.scrollY(), +Ph(this.iT,Math.min(a,60)))}vd(){super.vd();this.wd&&this.wd.destroy()}};class xM extends P{constructor(){super({F:"message-box"});this.vf("alertdialog");this.AN=E(this);this.gE=E(this);this.hG=!1}open(){this.hG=!0;this.OA();this.AN.C(this)}close(){this.hG=!1;this.J(!1);this.gE.C(this);Ne(this,document,"keydown",this.lY,this)}J(a){super.J(a);this.lq&&this.lq.J(a)}qr(){return this.gE}lY(a){const b=a.target.nodeName;"INPUT"!=b&&"TEXTAREA"!=b&&a.preventDefault()}OA(){this.J(!0);x(this,document,"keydown",this.lY,this)}};class yM extends RC{constructor(a){super(null,[0],[1],75,b=>b*b);this.l4=a}Bp(){this.l4.Rf(this.coords[0])}};class zM extends xM{constructor(){super();this.RK=this.tE=void 0}OA(){Ii&&super.OA();this.tE&&this.tE.stop();this.J(!0);!Ii&&this.RK&&this.RK.focus();this.tE=new yM(this);this.tE.play()}};function AM(a){var b=a.lq;const c=Math.floor(.5*(b.width()-a.width()));b=Math.floor(.5*(b.height()-a.height()));a.move(c,b)} +class BM extends zM{constructor({mn:a,icon:b,buttons:c,ga:d,Kx:e}){super();if(this.lq)throw Error("already modal");this.lq=new P({F:"modal-layer"});this.I=d;this.sa=new P({ka:O(this,"content")});this.Hc=null;b&&(this.Hc=new P({za:b,ka:O(this,"icon")}),this.sa.O(this.Hc));this.Tl=new P({ka:O(this,"message-container")});this.Xv=new P({ka:O(this,"message"),tabIndex:-1});It(this.Xv,this.I,a,e);M(this.sa,this.Tl);this.O(this.sa);this.RK=this.Xv.displayObject();this.cZ=new P({});M(this.cZ,this.Xv);M(this.Tl, +this.cZ);this.Ed=new P({F:"message-box-buttons"});Gt(this.Ed,O(this,"buttons"));M(this,this.Ed);this.nv(c);this.ua=new wM({Gr:this.Tl});this.sa.O(this.ua.jk());B(this,this.ua);this.GY=""}GA(){super.GA();this.ua.setParentScale(this.kt)}OA(){super.OA();this.xb();Gi(()=>{AM(this)},this,0)}nv(a){const b=new P({ka:O(this.Ed,"buttons")});a.forEach(({Jg:c,result:d})=>{const e=new iM({type:"uikit-primary-button"});Gt(e,O(this.Ed,"window-button"));It(e,this.I,c);M(b,e);z(this,e.ja,()=>{this.GY=d;this.close()})}); +this.Ed.O(b)}Qa(){var a=$h(this.sa.displayObject()),b=this.Hc?$h(this.Hc.displayObject()):null;b=this.Hc?this.Hc.width()+b.left+b.right:0;L(this.Tl,"max-width",Math.min(screen.width-b-a.right-a.left-80,480)+"px");L(this.Tl,"height","");a=this.lq;b=$h(this.Tl.displayObject());const c=$h(this.Ed.displayObject());a=.9*a.height()-b.top-b.bottom-this.Ed.height()-c.top-c.bottom;b=Math.min(a,this.Xv.height());a=Vb||yi(this.Ro.displayObject(),"0 0");x(this,a,"touchstart",c=>{for(let d=0;d{const g=new BM({mn:b,icon:c,buttons:d,ga:a.I,Kx:e});CM(a.Gg,g);g.open();z(a,g.qr(),()=>{var h=a.Gg,l=Ia(h.NH,g);0<=l&&(Sa(h.NH,l),g.hG&&g.close(),Ue(h,g),Fd(g.displayObject()),(l=g.lq)&&Fd(l.displayObject()));h.Ro.J(0{Ni&&uj?setTimeout(()=>{KM(this)},100):KM(this)})).observe(this.U);window.invalidatePlayerSize=()=> +{};window.setPlayerSize=()=>{};window.removeResizeListeners=()=>{};document.addEventListener("touchend",c=>{0==c.touches.length&&(this.xH=!1,setTimeout(()=>{KM(this,!1,!1)},100))},!0);document.addEventListener("touchstart",c=>{1==window.event.touches.length&&(this.xH=!0);1{b&&b();KM(this)};a.onorientationchange=()=>{const c=Ud();c&&Ii&&(Ni?setTimeout(()=>{c.blur();rj&&KM(this)},800):c.blur())};dj&&window.frameElement&&window.frameElement.setAttribute("scrolling", +"no")}JM.prototype.IC=function(){KM(this,!0)}; +function KM(a,b=!1,c=!0){function d(m,p){if(b||n.mz!=m||n.LK!=p){const t=n.mz;n.mz=m;n.LK=p;n.LB.C(n.mz,n.LK);t!=n.mz&&Ni&&!n.xH&&setTimeout(()=>{e(0,0)},100)}}const e=HM;if(b||!a.xH){var f=Ni?2*a.U.clientHeight:a.U.clientHeight;if(aj||!(ij&&.7>f/screen.height||ah&&.7>window.innerHeight/f)){var g=1,h=a.U.clientWidth;c&&dj&&window.frameElement&&(h=0,g=h/window.innerWidth);var l=window.innerHeight*g,n=a;d(h,l);c&&dj&&window.frameElement&&setTimeout(()=>{h=window.frameElement.clientWidth;g=h/window.innerWidth; +l=window.innerHeight*g;d(h,l)},0)}}};function LM(a,b,c){null==a.oi&&(a.oi=new JM,a.oi.LB.addHandler(a.u7,a));a.QE=b;a.Lh=c}class MM{constructor(){this.Lh=this.QE=this.oi=null}IC(){this.oi&&this.oi.IC()}u7(a,b){this.QE&&this.QE.apply(this.Lh,[a,b])}};const NM=[{Cx:Ib,F:"ie"},{Cx:Ji,F:"android_default"},{Cx:Mb,F:"webkit"},{Cx:Hb,F:"opera"},{Cx:Lb,F:"gecko"}];function OM(a){Gt(a,Ii?"mobile":"desktop");NM.find(b=>{b.Cx&&Gt(a,b.F);return b.Cx})};class PM{constructor(a){this.dA=a;this.Fo=!1;this.MK=void 0}suspend(){this.MK=this.dA.kM;aC(this.dA,!1);this.Fo=!0}resume(){aC(this.dA,this.MK);this.MK=void 0;this.Fo=!1}};function QM(a,b){if(a.Zk){var c=a.Lv;a=a.D.view();b=b||a.displayObject();b.appendChild(c.displayObject())}}function RM(a,b){Me(a,b,"click",a.Aq,a);setTimeout(()=>{Ne(a,b,"click",a.Aq,a)},500)} +class SM extends wg{constructor(a,b){super();this.D=a;this.Lv=b;this.VA=E(this);this.Zk=!1;B(this,this.Lv)}show(a){const b=this.Lv;b.qa(!1);const c=this.D.view(),d=c.V().$();this.Zk=!0;QM(this,a);c.setOverlayDisplayed(!0);z(this,d.Ml(),this.$F,this);b.qa(!0);z(this,b.ja,this.$F,this)}$F(){const a=this.D.view();var b=a.V().$();this.ks(b);this.ks(this.Lv);(Ji||yj)&&(b=Ld(this.Lv.displayObject()))&&RM(this,b);Fd(this.Lv.displayObject());a.setOverlayDisplayed(!1);this.Zk=!1;this.VA.C()}Aq(a){a.preventDefault()}} +;class TM extends P{constructor(){super({F:"preloader"});this.OZ=0;this.Ao=!1;this.J(!1)}show(){this.Ao||(this.Ao=!0,clearTimeout(this.Mz),clearTimeout(this.BB),this.BB=Gi(this.c9,this,800))}Uc(){if(this.Ao&&(this.Ao=!1,clearTimeout(this.Mz),clearTimeout(this.BB),this.visible())){var a=500-(this.Bn()-this.OZ);0{h?(f=new fM,f=new SM(a,f),Qe(this,f.VA,()=>{this.Is();this.B.play()}),f.show()):this.Is()});e?LM(e,this.Jj,this):(this.oi=new JM,z(this,this.oi.LB,this.Jj,this),Gi(this.oi.IC,this.oi));this.Ln=new PM(this.B.lu());this.ll=E(this);this.Qk=E(this);this.Jn=E(this);this.Is()}fz(){const a=new TM;this.R.displayObject().appendChild(a.displayObject());return a}Is(){this.fC();z(this,this.B.$().wC(),this.fC,this)}fC(){this.B.$().nd()? +this.Ff.show():this.Ff.Uc()}Jj(a,b){const c=this.u$?170:0,d=a-c,e=b-c;this.SN{this.Ln.resume();this.R.setOverlayDisplayed(!1);this.Qk.C();this.Jn.C();"yes"==e?d.resume(c,!0):d.start(b,!0)});this.Ln.suspend();this.R.setOverlayDisplayed(!0);this.ll.C()}}$n(a){(a=ZL(a,this.G,this.B))&&this.vo(a)}vo({Jg:a,o1:b}){const c=this.B.$().suspended();this.Ln.suspend(); +this.R.setOverlayDisplayed(!0);this.ll.C();FM(this.Gk,{mn:a,icon:Z(this.K,"mb_warning_icon"),buttons:[{Jg:"PB_MESSAGE_BOX_OK",result:"ok"}],Kx:()=>b}).then(()=>{this.Ln.resume();this.R.setOverlayDisplayed(!1);this.Qk.C();this.FA(c)})}FA(a){Ws(this.Da,a)}vd(){super.vd();jt(this.R.displayObject(),"hidden",!1)}};class VM extends wg{constructor({sk:a,messages:b,qj:c}){super();this.Bw=a;this.pg=b;this.oi=new MM;this.l9=rd(document,c);this.nl=null;this.ll=E(this);this.Qk=E(this);this.Jn=E(this);this.US=E(this)}D(){return this.Bw}};class WM extends P{constructor({F:a="back_to_app",label:b,eda:c}){super({F:a});b&&(a=new P({ka:O(this,"text")}),a.ha(b),this.O(a));c&&this.O(c);z(this,this.ja,()=>ISPlayer.backToApp())}};class XM extends P{constructor({ga:a}){super({F:"title-panel"});this.Xu=new WM({label:a.ia("PB_BACK_TO_APP_BUTTON_LABEL")});this.O(this.Xu)}};class YM extends UM{constructor(a,b,c){super(a,b,c,!1);this.wb=new XM({ga:this.I});this.O(this.wb);ISPlayer.initWithData(vh({version:9.3}))}Jj(a,b){this.X("landscape",a>b);super.Jj(a,b)}};function ZM(a){if(Dj)return new YM(a.D(),a.K,a.pg);const b=new UM(a.D(),a.K,a.pg,a.b3,a.oi);z(a,b.ll,()=>a.ll.C());z(a,b.Qk,()=>a.Qk.C());z(a,b.Jn,()=>a.Jn.C());return b} +class $M extends VM{constructor({sk:a,messages:b,qj:c,Zm:d,Km:e}){super({sk:a,messages:b,qj:c});this.b3=e;this.K=this.HK(d)}HK(a){return new GL(a.RC)}QT(a){"normal"==a?this.nl=ZM(this):"accessible"==a&&(this.nl=new eM({kc:this.Bw,messages:this.pg,skinSettings:this.wK()}));B(this,this.nl)}wK(){return{f2:!1,showSlideList:!1,ye:!1,e2:!1,d2:!1}}};class aN{constructor({sk:a,skinSettings:b,ga:c}){this.D=a;this.Xa=b;this.I=c}sk(){return this.D}skinSettings(){return this.Xa}ga(){return this.I}};class bN{constructor(a){this.tQ=a.tQ;this.uS=a.uS;this.jR=a.jR;this.mC=a.mC;this.RC=a.RC;this.kR=a.kR}};function cN(a){const b="SOLID"===a.type?a:null;if(!b)return a.Om();a=Mo(b.color.toUpperCase());return 60Math.min(c+10,255))),opacity:.8}):xL({color:Uk(...a.map(c=>Math.max(c-10,0))),opacity:.8})};class dN{constructor({Ca:a,DR:b,colors:c,Zm:d}){this.G=a;this.RN=b;this.Sb=c;this.ut=d;this.$f=null;if(a=this.Sb)a.transparentPopupBackground=a.asideBackground.jd(0),a.progressBackground=a.playerText.jd(.1),c=a.playerBackground,b=a.primaryButtonBackground,b=b instanceof yL&&c instanceof yL&&b.color==c.color||c instanceof yL&&0==c.opacity?a.primaryButtonText.Om():a.primaryButtonBackground.Om(),a.progressPlayback=b,a.slideBorder=xL({color:"#000000",opacity:.06}),a.asideElementTextVisited=a.asideElementBackgroundActive.jd(.4), +a.hyperlink=a.asideElementText.jd(.6),a.popupBackground=a.asideBackground.jd(.92),a.popupBackgroundHover=a.asideElementBackgroundHover.Om(),a.popupText=a.asideElementText.Om(),a.popupTextHover=a.asideElementTextHover.Om(),a.popupBorder=a.asideBackground.jd(.08),a.linkButtonTextColor=a.playerText.jd(.72),a.presenterInfoLinkBorderColor=a.asideElementText.jd(.16),a.searchFieldBackgroundColor=a.asideElementBackgroundActive.jd(.6),a.hoveredTabBackgroundColor=a.asideElementBackgroundHover.jd(.8),a.selectedTabBackgroundColor= +a.asideElementBackgroundActive.jd(.8),a.topPanelIconContainerColor=cN(a.asideBackground),a.volumeControlBackgroundColor=a.secondaryButtonTextHover.jd(.2),a.volumeControlPlaybackColor=a.secondaryButtonTextHover.jd(.8),a.volumeControlThumbColor=a.secondaryButtonTextHover.Om(),a.moreMenuVolumeControlBackgroundColor=a.popupText.jd(.2),a.moreMenuVolumeControlPlaybackColor=a.popupText.jd(.8),a.moreMenuVolumeControlThumbColor=a.popupText.Om(),a.moreMenuVolumeControlBackgroundColor=a.asideElementText.jd(.2), +a.moreMenuVolumeControlPlaybackColor=a.asideElementText.jd(.8),a.moreMenuVolumeControlThumbColor=a.asideElementText.Om(),a.miniSkinMenuButtonText=a.playerText.jd(.72),a.miniSkinMenuButtonBackgroundActive=a.playerText.jd(.1),a.miniSkinTopBottomPanelBorder=a.playerText.jd(.1),a.miniSkinPresenterDelimiterColor=a.popupText.jd(.08),a.panelVideoStubColor=a.asideElementTextActive.jd(.6),a.panelVideoStubBackgroundColor=a.asideElementBackgroundActive.jd(.4),a.topBottomPanelBorderColor=a.playerText.jd(.1)}dQ(a){if("normal"== +a)Fd(this.$f),this.$f=null,a={__slide_width__:`${this.G.slideWidth()}px`,__slide_height__:`${this.G.slideHeight()}px`,__player_view_id__:this.RN,__borderRadius__:`${this.G.settings().skin().borderRadius}px`},this.Sb&&this.Sb.contentBackground&&Object.assign(a,{__skin_background__:this.Sb.contentBackground.tJ()}),this.$f=(uj?this.ut.jR:Ii?this.ut.uS:this.ut.tQ).Yo(this.Sb&&CL(this.Sb),a);else if("accessible"==a)this.KJ();else throw Error("unknown presentation view mode");}KJ(){Fd(this.$f);this.$f= +null;this.$f=this.ut.mC.Yo()}};class eN extends P{constructor({F:a,title:b}){super({Yb:"DETAILS",F:a});a=new P({Yb:"SUMMARY",ka:O(this,"summary")});a.ha(b);this.oH=a;M(this,this.oH);x(this,this,"toggle",this.w_,this);this.w_()}w_(){const a=this.displayObject().hasAttribute("open");this.wf("expanded",a)}};class fN extends eN{constructor(a){super({F:"ppt-accessible-slide-notes",title:a.ia("PB_TAB_NOTES_LABEL")});this.wW=new P({ka:O(this,"notes-container")});M(this,this.wW)}ZR(a){this.wW.wp(fH(a.a3,YG.fJ))}};function gN(a){if(a){const b=new P({Yb:"P"});b.ha(a);return b}return null}function hN({uba:a="",link:b,title:c,text:d}){if(b){const e=new P({Yb:"A"});e.setAttribute("href",`${a}${b}`);e.setAttribute("title",c||b);e.ha(d);return e}return null} +class iN extends eN{constructor({Qf:a,ga:b}){super({F:"ppt-accessible-presenter",title:b.ia("PB_ACCESSIBLE_PRESENTER_INFO")});this.Ub=a;this.I=b;this.AK().forEach(c=>c&&M(this,c))}AK(){const a=[];var b=this.Ub.Cr();var c=this.I.ia("PB_ACCESSIBLE_SKIN_PRESENTER_PHOTO");if(b){const d=new P({Yb:"IMG"});d.setAttribute("src",b.path());d.setAttribute("alt",c);b=d}else b=null;b&&a.push(b);(b=gN(this.Ub.name()))&&a.push(b);(b=gN(this.Ub.ip()))&&a.push(b);(b=hN({link:this.Ub.td(),title:this.Ub.td(),text:this.I.ia("PB_PRESENTER_WEBSITE")}))&& +a.push(b);(b=hN({uba:"mailto:",link:this.Ub.email(),title:this.Ub.email(),text:this.I.ia("PB_PRESENTER_EMAIL")}))&&a.push(b);(b=gN(this.Ub.phone()))&&a.push(b);(b=gN(this.Ub.Nm()))&&a.push(b);return a}};const jN={image:[".jpg","jpeg",".png",".gif"],video:[".mp4"],document:[".doc",".docx",".xls",".xlsx",".pdf"]};function kN(a){let b=a.url();try{if("attachment"==a.type()){const c=b.lastIndexOf("/");b=b.substring(0,c+1)+encodeURIComponent(b.substring(c+1))}}catch(c){b=""}return b} +function lN(a){const b=a.title(),c=a.type(),d=kN(a);a=a.target();if("webLink"==c)return{type:"link",title:b,N0:null,href:d,target:a};const e=b.substring(b.lastIndexOf("."));return{type:Object.keys(jN).find(f=>jN[f].includes(e))||"file",title:b,N0:e,href:d,target:a}}function mN(a){const b=nN(a);if(!b)return null;a=new P({ka:O(a,"subtitle")});a.ha(b);return a} +function oN(a){switch(a.Yr.type){case "file":return Z(a.K,"attachment-unknown");case "image":return Z(a.K,"attachment-image");case "link":return Z(a.K,"attachment-link");case "video":return Z(a.K,"attachment-video");case "document":return Z(a.K,"attachment-doc")}return null} +function nN(a){const b=a.Yr.N0;switch(a.Yr.type){case "file":return a.I.ia(a.$j.file,{EXTENSION:b});case "document":return a.I.ia(a.$j.document,{EXTENSION:b});case "image":return a.I.ia(a.$j.image);case "link":return a.I.ia(a.$j.link);case "video":return a.I.ia(a.$j.video)}return null} +class pN extends P{constructor(a,b,c,d){super({F:"attach-item",tabIndex:0});this.K=b;this.I=c;this.$j=d;this.Yr=lN(a);(a=this.zn())&&M(this,a);a=this.zK();M(this,a);b=this.sv();M(a,b);(this.nH=mN(this))&&M(a,this.nH);this.vf("row");const e=this.CK();z(this,this.ja,()=>e.click());z(this,this.I.og,this.Eg,this)}zn(){var a=oN(this);if(!a)return null;const b=new P({ka:O(this,"icon-container")});a=new P({za:a,ka:O(this,"icon")});M(b,a);return b}sv(){const a=new P({ka:O(this,"title")});a.ha(this.Yr.title); +return a}zK(){return new P({ka:O(this,"info-container")})}CK(){const a=wd("A");a.setAttribute("title",this.Yr.href);a.setAttribute("href",this.Yr.href);a.setAttribute("target",this.Yr.target);return a}Eg(a){switch(a){case this.$j.file:case this.$j.document:case this.$j.image:case this.$j.link:case this.$j.video:(a=nN(this))&&this.nH&&this.nH.ha(a)}}}function qN(a,b){b=new pN(b,a.K,a.I,a.$j);z(a,b.ja,()=>{Gi(()=>{a.aT.C()},a,1E3)},a);return b} +function rN(a){a.ua.Ci(a.ro.height(),a.cA.height());a.ua.Tx()} +var sN=class extends P{constructor(a,b,c){super({F:"attachments-info",tabIndex:-1});this.aT=E(this);this.K=b;this.I=c;this.$j={file:"PB_ATTACHMENT_FILE_SUBTITLE",document:"PB_ATTACHMENT_DOCUMENT_SUBTITLE",link:"PB_ATTACHMENT_LINK_SUBTITLE",video:"PB_ATTACHMENT_VIDEO_SUBTITLE",image:"PB_ATTACHMENT_IMAGE_SUBTITLE"};this.ro=new P({ka:O(this,"scroll-area")});M(this,this.ro);this.cA=new P;M(this.ro,this.cA);b=new P({F:"container-bottom-shadow"});M(this,b);this.ua=new wM({Gr:this.ro,mQ:b.displayObject()}); +B(this,this.ua);this.O(this.ua.jk());this.DK(a);this.vf("region");this.vp("Resources")}DK(a){const b=a.count();for(let d=0;dM(this.OV,d))}DK(){return new P({Yb:"UL"})}};class wN extends vN{constructor({resources:a,ga:b}){super({F:"ppt-accessible-resources",title:b.ia("PB_ACCESSIBLE_TITLE_PANEL_ATTACHMENTS"),g1:a})}NT(a){return a.Ai().Mc().map(b=>this.EK(b))}EK(a){const b=uN(this,!1);a=this.CK(a);M(b,a);return b}CK(a){const b=new P({Yb:"A"});b.setAttribute("title",a.url());b.setAttribute("href",kN(a));b.setAttribute("target",a.target());b.ha(a.title());return b}};class xN extends vN{constructor({slides:a,ga:b}){super({F:"ppt-accessible-slide-list",title:b.ia("PB_ACCESSIBLE_SLIDES"),g1:a});this.vf("navigation");this.oH.vf("heading");this.oH.setAttribute("aria-level","2");a=this.oH;a.U.id||a.SR(ld());this.wf("labelledby",a.U.id);this.eZ=E(this)}NT(a){return a.iC.map(b=>this.EK(b))}EK(a){const b=uN(this),c=a.title()?a.title():"---";b.ha(`${a.index()+1}. ${c}`);z(this,b.ja,()=>{this.eZ.C(a)});return b}};class yN extends P{constructor(a){super({Yb:"SECTION",F:"ppt-accessible-top-panel",tabIndex:-1});this.vf("region");this.vp(a.ia("PB_ACCESSIBLE_ARIA_LABEL_TOP_PANEL"));this.I=a;this.GZ=new P({Yb:"H1",ka:O(this,"slide-status")});M(this,this.GZ)}};function zN(a){a.GB&&z(a,a.GB.eZ,b=>{a.rc.ue(b.index())})} +class AN extends dM{constructor({kc:a,messages:b,skinSettings:c}){super({F:"ppt-accessible-skin",kc:a,messages:b,skinSettings:c});this.na=this.Op();this.GB=this.Xa.showSlideList?new xN({slides:this.G.slides(),ga:this.I}):null;this.qg=this.Xa.ye?new fN(this.I):null;this.Hw=this.Xa.e2&&this.G.resources().Ai().count()?new wN({resources:this.G.resources(),ga:this.I}):null;this.Ub=null;this.aF()}Op(){return this.Xa.f2?new yN(this.I):null}aF(){var a=this.zA;a&&M(this.Fj,a);this.GB&&(Ib||Jb)?(a=new P({F:"ppt-accessible-slide-list-wrapper"}), +M(a,this.GB)):a=this.GB;a&&M(this.Fj,a);(a=this.qg)&&M(this.Fj,a);(a=this.Hw)&&M(this.Fj,a);(a=this.na)&&M(this,a);(a=this.qh)&&M(this,a);this.O(this.R.displayObject());(a=this.Fj)&&M(this,a);this.Bz.na=this.na;this.Bz.qh=this.qh;zN(this)}oe(){super.oe();if(this.na)if(this.tF()){var a=-1!=this.B.ma()&&this.B.fa().visible()?`${this.B.fa().Mi()+1}`:"-";const c=this.G.slides().Cp();var b=this.na;a=b.I.ia("PB_ACCESSIBLE_SLIDE_N_OF_COUNT",{SLIDE_NUMBER:a,TOTAL_SLIDES:c});b.GZ.ha(a);this.na.J(!0)}else this.na.J(!1); +this.Xa.ye&&this.qg&&((b=(b=this.Gc())?b.Ei():null)&&b.text()?(this.qg.ZR(b),this.qg.J(!0)):this.qg.J(!1));this.GP()}GP(){this.Ub&&(Se(this.Fj,this.Ub),this.Ub=null);const a=this.Gc().Qf();this.Xa.d2&&a&&(this.Ub=new iN({Qf:a,ga:this.I}),M(this.Fj,this.Ub))}};function BN(a){const b=[],c=[];let d=-1;for(let f=0;fd?d+=1:e{var d=a[c];var e="SOLID"===d.type?d:null;d="GRADIENT"===d.type?d:null;if(e)d={type:"solid",value:{color:IN(e.color),alpha:e.opacity}};else if(!d||2!==d.tj.length||180!==d.sj&&90!==d.sj)d=null;else{e=d.sj;const f=d.tj[0];d=d.tj[1];d={type:"gradient",value:{firstColor:{color:IN(f.color),alpha:f.opacity},secondColor:{color:IN(d.color),alpha:d.opacity},direction:180===e?"vertical":"horizontal"}}}b[c]=d;return b},{})};function MN(a,b){var c=0-1!=b.indexOf(c))} +class SN extends wg{constructor({Ca:a,V:b,settings:c,ga:d,view:e,sidePanelController:f}){super();this.G=a;this.B=b;z(this,this.B.vc(),this.oe,this);this.H=c;this.I=d;this.pa=e;this.Fb=f;z(this,this.pa.Qe(),this.Q6,this);z(this,this.pa.np(),this.lw,this);this.Bb=null}ES(a){this.Fb=a}oe(){this.Bb&&(Pe(this,this.Bb.showTopPanelPopupEvent(),this.fX,this),Pe(this,this.Bb.showOutlineEvent(),this.eX,this),this.lw());if(this.Bb=this.B.Oa()){z(this,this.Bb.showTopPanelPopupEvent(),this.fX,this);z(this,this.Bb.showOutlineEvent(), +this.eX,this);var a=this.B.fa(),b=this.MU(a),c=b&&this.oZ()?b.logo():null;a=this.Bb.skin();var d=a.setPresentationContext,e=this.Fb,f=RN(this),g=!!this.G.resources().Ai().count();c=c?c.path():null;var h=b?b.td():"";b=b?b.HD():"";var l=this.HO(),n=this.G.courseTitle(),m;m=(m=this.H.Aa.Lc||null)&&m.visible&&DN(m,"outline")?!0:(m=this.H.Aa.Xc||null)&&m.visible&&m.showOutline?!0:(m=this.H.Aa.controlPanel||null)&&m.visible&&m.showOutline?!0:!1;d.call(a,{sidePanelController:e,buttonsOrder:f,resourcesButtonEnabled:g, +logo:c,logoUrl:h,logoTarget:b,showTitle:l,courseTitle:n,hasOutline:m})}}Q6(){this.Bb&&this.Bb.setPanelScale(this.pa.scale())}MU(a){return(a=a.Qf())&&a.Zd()?a.Zd():this.G.Zd()}oZ(){const a=this.H.Aa.Lc;return a?a.visible&&a.sd:!1}HO(){const a=this.H.Aa.Lc||null;return a?a.visible&&a.rr:!1}fX(a){this.pa.g2(a)}eX(a){this.pa.pD(a)}lw(){this.Bb&&(this.Bb.onTopPanelPopupClosed(),this.Bb.outlinePopupClosed())}};function TN(a,b,c){return(a-2/3*c)/(b+c/3)}function UN(a){if(1>=a)return a;a=1+(a-1)/3;return Ib?zv(a,4):a};function VN(a,b){this.Ac=a;this.Hn=b}VN.prototype.getData=function(a){return null==this.Ud?null:this.Ud[a]};VN.prototype.setData=function(a,b){null==this.Ud&&(this.Ud={});this.Ud[a]=b};function WN(a,b){F(a.Ac,"pointer-events",b)}function XN(a,b){for(const c in b)a.Ac.setAttribute(c,b[c])}VN.prototype.remove=function(){var a=this.Hn;const b=a.Lp.indexOf(this);if(-1==b)throw Error();a.Lp.splice(b,1);a.Ac.removeChild(this.Ac)};function YN(a){x(a,a.xh.Ac,Km,a.uN,a,Nm);x(a,a.Qo,Lm,a.v7,a)} +class ZN extends wg{constructor(a){super();this.xh=a;this.PD=null;this.ra=1;this.Qo=window;this.yv=E(this);this.xv=E(this)}setScale(a){this.ra=a}Dz(a){a=Lh(a,this.xh.Ac);return new Xc(a.x/this.ra,a.y/this.ra)}uN(a){this.yv.C();a.preventDefault();a.stopPropagation();a=this.Dz(a);this.PD.H1(a.x,a.y);x(this,this.Qo,Mm,this.jX,this)}jX(a){const b=this.Dz(a);this.PD.EI(b.x,b.y);a.preventDefault()}v7(){Ne(this,this.Qo,Mm,this.jX,this);this.xv.C()}};function $N(a,b,c){VN.call(this,a,b);this.Ac.setAttribute("d",c)}r($N,VN);function aO(a,b){VN.call(this,a,b);this.Lp=[]}r(aO,VN);function bO(a,b){const c=document.createElementNS("http://www.w3.org/2000/svg","path");b=new $N(c,a,b);a.Ac.appendChild(c);a.Lp.push(b);return b}function cO(a){const b=document.createElementNS("http://www.w3.org/2000/svg","g"),c=new aO(b,a);a.Ac.appendChild(b);a.Lp.push(c);return c}aO.prototype.forEach=function(a){for(let b=0;b{d.Ac===b&&(c=d)});return c}aO.prototype.Hr=function(){this.Lp=[];Cd(this.Ac)};function eO(a,b,c){const d=document.createElementNS("http://www.w3.org/2000/svg","svg");d.setAttribute("width",b);d.setAttribute("height",c);d.setAttribute("version","1.1");F(d,{overflow:"hidden",position:"relative"});a.appendChild(d);aO.call(this,d,this)}r(eO,aO);function fO(a,b){a.Hn.forEach(c=>{c!==a.xh&&b(c)})}function gO(a){x(a,a.xh.Ac,Km,a.vN,a,Nm);x(a,a.Qo,Lm,a.kX,a);fO(a,b=>{WN(b,"painted");x(a,b.Ac,Km,a.WF,a,Nm)})}function hO(a){Ne(a,a.xh.Ac,Km,a.vN,a);Ne(a,a.Qo,Lm,a.kX,a);fO(a,b=>{WN(b,"none");Ne(a,b.Ac,Km,a.WF,a)})} +function iO(a,b){if(b&&b!==a.xh.Ac&&b instanceof SVGElement&&(b=dO(a.Hn,b))){var c=b.getData("drawingId");if(c){const d=[];a.Hn.forEach(e=>{e.getData("drawingId")===c&&d.push(e)});for(b=0;bd?[["M",c-5,",",d-10],["L",c+5,",",d-10],["L",e+5,",",f-10],["L",e+5,",",f+10],["L",e-5,",",f+10],["L",c-5,",",d+10]]:[["M",c-5,",",d-10],["L",e-5,",",f-10],["L",e+5,",",f-10],["L",e+5,",", +f+10],["L",c+5,",",d+10],["L",c-5,",",d+10]];for(d=0;d"g"==f.nodeName);c.removeAttribute("opacity");var d=zd("div");d.appendChild(b);Fd(c);const e=d.innerHTML;Cd(b);b.appendChild(c);b={ignoreMouse:!0,ignoreAnimation:!0};canvg(a.wM,d.innerHTML,b);canvg(a.qM,e,b);if(d=a.Pi.getContext("2d"))d.clearRect(0,0,a.Pi.width,a.Pi.height),d.globalAlpha=.4,d.drawImage(a.wM,0,0),d.globalAlpha=1,d.drawImage(a.qM,0,0)} +function nO(a,b){a.EO=b;a.yA("nothing"!=b);switch(b){case "nothing":b=a.Yl;Ne(b,b.xh.Ac,Km,b.uN,b);hO(a.zs);break;case "line":b=a.Yl;b.PD=a.u5;YN(b);hO(a.zs);break;case "marker":b=a.Yl;b.PD=a.A5;YN(b);hO(a.zs);break;case "eraser":b=a.Yl,Ne(b,b.xh.Ac,Km,b.uN,b),gO(a.zs)}} +class oO extends P{constructor(a,b){super({F:"draw-control"});this.qM=this.wM=this.Pi=null;var c=this.hi=new eO(this.displayObject(),a,b);const d=document.createElementNS("http://www.w3.org/2000/svg","rect"),e=new VN(d,c);XN(e,{x:0,y:0,width:a,height:b});c.Ac.appendChild(d);c.Lp.push(e);this.xh=e;XN(this.xh,{opacity:0});this.Yl=new ZN(this.xh);this.xM=cO(this.hi);XN(this.xM,{opacity:.4});this.t5=cO(this.hi);this.u5=new kO(this.t5);this.A5=new lO(this.xM,new Wf(0,0,a,b));this.zs=new jO({group:this.hi, +Xca:this.xh,Zba:this.hi,Bda:void 0});this.EO="nothing";if(eh||Ni)this.Pi=zd("canvas"),F(this.Pi,"position","relative"),this.Pi.width=a,this.Pi.height=b,this.wM=zd("canvas"),this.qM=zd("canvas");this.yv=E(this,[this.Yl.yv,this.zs.yv]);this.xv=E(this,[this.Yl.xv,this.zs.xv]);this.yA(!1)}setScale(a,b){super.setScale(a,b);this.Yl.setScale(a);this.zs.setScale(a)}yA(a){L(this,"pointer-events",a?"all":"none");if(eh||Ni){const b=null!=this.hi.Ac.parentNode;a&&!b?Gd(this.hi.Ac,this.Pi):!a&&b&&(mO(this),Gd(this.Pi, +this.hi.Ac))}}hI(){this.xM.Hr();const a=[];this.hi.forEach(b=>{b!==this.xh&&a.push(b)});for(let b=0;b{a++});return 1==a}};class pO{constructor(a){this.Sd=a;a instanceof YB&&(this.JG=this.width()/this.height())}O(a){a=a.displayObject();(this.Sd instanceof Element?this.Sd:this.Sd.displayObject()).appendChild(a)}removeChild(a){a=a.displayObject();this.EL(a)&&this.displayObject().removeChild(a)}EL(a){return a.parentNode==this.displayObject()}displayObject(){return this.Sd instanceof Element?this.Sd:this.Sd.displayObject()}ratio(){return this.JG}width(){return this.Sd instanceof Element?this.Sd.offsetWidth:this.Sd.width()}Kb(a){const b= +Math.round(a/this.JG);this.Sd instanceof Element?Nh(this.Sd,a,b):this.Sd.resize(a,b)}height(){return this.Sd instanceof Element?this.Sd.offsetHeight:this.Sd.height()}Wc(a){const b=Math.round(a*this.JG);this.Sd instanceof Element?Nh(this.Sd,b,a):this.Sd.resize(b,a)}resize(a,b){this.Sd instanceof YB&&this.Sd.resize(a||this.Sd.width(),b||this.Sd.height())}Jl(a,b){a/b>this.JG?this.resize(a,b):this.Kb(a)}};function qO(a){a.tf(a.R.displayObject())&&a.R.resize(a.width(),a.height());a.Iq()}function rO(a,b){"nothing"!=b&&(a.vb||a.QL());a.Xe&&a.Xe.X("tool",b);a.vb&&nO(a.vb,b)} +class sO extends P{constructor(a){super({F:"content-area"});this.vb=null;this.G=a.Ca();a=a.view();this.rc=a.Cd();this.B=a.V();z(this,this.B.vc(),this.oe,this);this.R=new pO(a);z(this,a.Qe(),this.HA,this);this.O(this.R.displayObject());B(this,this.R);this.Xe=this.FK();this.uz=[];this.ra=1;this.aO=new cd(this.R.width(),this.R.height())}setScale(a){this.ra=a;qO(this)}hI(){this.vb&&this.vb.hI()}invalidate(a,b){this.zz=b;this.resize(a.width,a.height)}$x(){return this.R}HA(a,b,c,d){this.ZN=a/this.R.width(); +this.Aw=new Xc(c,d);this.Iq()}Iq(){if(this.vb){this.vb.move(this.Aw.x,this.Aw.y);const a=this.R.width()/this.aO.width*this.ZN;this.vb.setScale(a);this.vb.setParentScale(a)}}oe(){this.Xe&&this.IO()}IO(){let a="nothing";this.vb&&(a=this.B.Oa()||this.B.tb()||this.B.fb()?"nothing":this.vb.EO,nO(this.vb,"nothing"));const b=this.B.ma();Cd(this.Xe.displayObject());const c=d=>{-1!=d.timestamp().Ba()&&(Pe(this,d.Zb(),c,this),this.vb&&this.Xe.O(this.vb),rO(this,a))};this.vb=this.uz[b];z(this,this.B.$().Zb(), +c,this);this.Iq()}FK(){const a=new P({F:"marker-tool-container"});this.R.O(a);return a}QL(){this.vb=new oO(this.aO.width,this.aO.height);this.Xe.O(this.vb);this.vb.setParentScale(this.ra);this.uz[this.B.ma()]=this.vb;this.Iq()}vd(){super.vd();this.R.removeChild(this.Xe)}};function tO(a,b,c,d){eu.call(this,a,b,c,d);this.B3=new C;this.j3=new C;this.oU=new C}r(tO,eu);function uO(a,b){a.Vu=b}tO.prototype.DI=function(){this.Vu&&this.Vu.animate(this.coords);this.j3.C()};tO.prototype.C1=function(){};tO.prototype.Hl=function(){this.Vu&&this.Vu.animate(this.coords);this.oU.C()};tO.prototype.mp=function(){this.B3.C();this.Vu&&this.Vu.animate(this.coords)};function vO(a,b){const c=b.displayObject();yi(c,"0 0");a.U.O(c);a.fr=b}function wO(a,b,c){a.SP=new cd(b,c);a.zF&&a.lF()} +class xO{constructor(a){this.l$=a||!1;this.zF=!1;this.Wk=this.jq=this.Na=this.Va=0;this.SP=new cd(0,0);this.fr=null;this.Ra=!0;this.Ff=new TM;this.U=new P({F:"video-container"});this.U.O(this.Ff);this.U.X("force-fit-video",Ib||Jb)}displayObject(){return this.U.displayObject()}visible(){return this.Ra}J(a){this.Ra=a;this.l$?(G(this.displayObject(),a?1:0),F(this.displayObject(),"pointer-events",a?"":"none")):Th(this.displayObject(),a)}width(){return this.Va}height(){return this.Na}Jl(a,b){this.hZ(a); +this.Wk=b;this.lF();this.zF=!0}hZ(a){this.jq=a}lF(){const a=this.SP.width/this.SP.height,b=this.jq;this.resize(Math.round(b),Math.round(this.jq/this.Wk>a||isNaN(a)?this.Wk:b/a));this.zF=!0}resize(a,b){this.Va=a;this.Na=b;this.fr&&this.fr.resize(a,b);this.U.resize(a,b);this.zF=!1}O(a){a=a.displayObject();this.displayObject().appendChild(a)}removeChild(a){a=a.displayObject();this.EL(a)&&this.displayObject().removeChild(a)}EL(a){return a.parentNode==this.displayObject()}};class yO extends P{constructor({ka:a,F:b,C2:c=!0,zf:d=!0,oda:e=!0}){super({ka:a,F:b,zf:d});this.m$=c;this.n$=e;this.XE=this.Pt=!1;this.e$=E(this)}Qa(a,b){super.Qa(a,b);this.XE=!0;a=this.Pt;const c=this.displayObject().textContent;this.jZ(c,Jb||Ib?b+1:b);this.XE=!1;a!=this.Pt&&(this.m$&&this.setAttribute("title",this.Pt?kt(this.U,"label"):""),this.e$.C())}jZ(a,b){function c(){g=f=e)&&(this.Pt=!0,this.n$)){var f=Math.floor(b/d.displayObject().scrollHeight*a.length),g="";for(c();d.displayObject().scrollHeight<=b;)f+=10,c();for(;0b;)c(),--f;c()}}}ha(a){super.ha(a);this.XE||(this.vp(a),this.xb())}wp(){throw Error("html text is not supported");}};function zO(a,b){const c=a instanceof Jt?a.za():a instanceof P?a.displayObject():a;b&&"slideNavigationSettings"==b.up()?a instanceof P?a.X("locked",!0):mn(c,"locked"):a instanceof P?a.X("locked",!1):nn(c,"locked");b=b&&("presentationNavigationType"!=b.up()||"presentationSeeking"==b.lR())&&"quizNavigationSettings"!=b.up()&&"scenarioNavigationSettings"!=b.up();a instanceof Jt||a instanceof P?a.qa(!b):b?c.setAttribute("disabled",""):c.removeAttribute("disabled")};function AO(a){if(a.H.Hu){const b=new yO({ka:O(a,"label")});It(b,a.I,"PB_CONTROL_PANEL_SLIDE_COUNTER",a.G4.bind(a));return b}return null}function BO(a){if(a.Wj){const b=-1!=a.B.ma()&&a.B.fa().visible();a.Wj.J(b);a=a.Wj;a.WL?a.WL():Ga("bindI18nMessage is required")}} +class CO extends P{constructor({ga:a,V:b,settings:c,xa:d,rJ:e}){super({F:"navigation-controls"});this.I=a;this.K=d;this.B=b;this.H=c;this.De=c.$g;this.kz=this.vg=new XL(this.B,this.De);this.w9=e;(this.Wj=AO(this))&&M(this,this.Wj);(this.rb=this.rv())&&M(this,this.rb);(this.gb=this.pv())&&M(this,this.gb);z(this,this.B.$().Zb(),this.Ab,this);z(this,this.B.vc(),this.io,this);z(this,this.I.og,this.DP,this)}yo(a){a&&!this.rb&&(this.rb=this.rv())&&M(this,this.rb,this.fm("prevButton"));this.rb&&this.rb.J(a)}wo(a){a&& +!this.gb&&(this.gb=this.pv())&&M(this,this.gb,this.fm("nextButton"));this.gb&&this.gb.J(a)}Qa(){var a=this.B.fb();this.yo(this.H.visible&&this.H.yf||!!a);this.wo(this.H.visible&&this.H.Re||!!a);a=this.H.visible&&this.H.Hu;this.Wj?this.Wj.J(a):a&&((this.Wj=AO(this))&&M(this,this.Wj,this.fm("slidesCounterLabel")),BO(this))}fm(a){const b=[this.Wj,this.rb,this.gb].filter(c=>c);switch(a){case "slidesCounterLabel":return b.indexOf(this.Wj);case "prevButton":return b.indexOf(this.rb);case "nextButton":return b.indexOf(this.gb); +default:return-1}}pv(){var a=this.B.fb();return this.H.Re||a?(a=new iM({type:"uikit-primary-button",icon:{element:Z(this.K,"chevron_right"),Ne:"right"},text:this.I.ia("PB_CONTROL_PANEL_NEXT")}),Gt(a,O(this,"button")),a.X("next",!0),z(this,a.ja,this.jN,this),a):null}rv(){var a=this.B.fb();return this.H.yf||a?(a=new iM({type:"uikit-secondary-button",icon:{element:Z(this.K,"chevron_left"),Ne:"left"},text:this.I.ia("PB_CONTROL_PANEL_PREV")}),Gt(a,O(this,"button")),a.X("prev",!0),z(this,a.ja,this.nN,this), +a):null}jN(){this.enabled()&&this.kz.next()}nN(){this.enabled()&&this.kz.prev()}io(){BO(this);const a=this.B.fb();if(a){const b=this.B.fa();this.kz=new YL(a.playerController(),this.vg,2==b.Qn);a.setExternalNavigationController(this.kz)}else this.kz=this.vg}Ab(){if(this.rb){var a=this.B.nf(this.De==VL?"switchToPreviousSlide":"switchToPreviousStep");zO(this.rb,a)}this.gb&&(a=this.B.nf(this.De==VL?"switchToNextSlide":"switchToNextStep"),zO(this.gb,a));var b=this.B.tb();this.gb&&b&&(a=this.B.fa(),b=b.currentSession().completed(), +a="atAnyTime"!=a.Im,!b&&a&&this.gb.qa(!1));a=this.B.fb();(this.rb||this.gb)&&a&&1==this.B.fa().navigationType()&&(a=a.playerController(),this.rb&&this.rb.qa(this.rb.enabled()||a.isPrevAvailable()),this.gb&&this.gb.qa(this.gb.enabled()||a.isNextAvailable()))}G4(){let a="-";-1!=this.B.ma()&&this.B.fa().visible()&&(a=this.B.fa().Mi()+1);return{SLIDE_NUMBER:a,TOTAL_SLIDES:this.w9}}DP(a){switch(a){case "PB_CONTROL_PANEL_NEXT":this.gb&&this.gb.ha(this.I.ia(a));break;case "PB_CONTROL_PANEL_PREV":this.rb&& +this.rb.ha(this.I.ia(a))}}};function DO(a){a.ua.Ci(a.displayObject().offsetHeight-2*a.N_,a.gm.height());a.ua.Tx()} +class EO extends P{constructor({F:a,V:b}){super({F:a,zf:!0});this.B=b;this.N_=0;this.ro=new P({ka:O(this,"scroll-area")});M(this,this.ro);this.gm=new P({F:"notes-text"});M(this.ro,this.gm);a=new P({F:"container-bottom-shadow"});M(this,a);this.ua=new wM({Gr:this.ro,mQ:a.displayObject()});B(this,this.ua);this.O(this.ua.jk());this.qg=null;this.vf("tabpanel");z(this,this.B.vc(),this.ZF,this);-1!=this.B.ma()&&this.ZF();DO(this)}Qa(a,b){super.Qa(a,b);a=Zh(this.displayObject());a=a.top+a.bottom;this.ro.Wc(this.height()- +a);DO(this)}ZF(){var a=this.B.fa().Ei();this.qg!=a&&(this.qg=a,this.gm.J(!!this.qg),this.qg&&(a=this.qg.wi().replace(//g,"
    "),this.gm.wp(a)),DO(this),this.ua.li.ny(0),this.ua.Tx())}};class FO extends P{constructor({ka:a,F:b,prompt:c}){super({ka:a,F:b,Yb:"INPUT"});c&&this.setAttribute("placeholder",c);this.rL=!1;this.dE=E(this);x(this,this,"change",()=>{this.dE.C()});this.bF=E(this);x(this,this,"input",()=>{this.bF.C()});this.A4=E(this);x(this,this,"focus",()=>{this.rL=!0;this.A4.C()});this.E3=E(this);x(this,this,"blur",()=>{this.rL=!1;this.E3.C()});x(this,this,"keydown",this.nw,this)}focused(){return this.rL}value(){return this.displayObject().value}gn(a){a!=this.value()&&(this.displayObject().value= +a)}nw(a){switch(a.keyCode){case 46:this.focused()&&a.stopPropagation();break;case 13:this.focused()&&this.displayObject().blur()}}};class GO extends P{constructor({selected:a}){super({F:"panel-tab-button",Yb:"BUTTON"});this.X("chosen",a)}selected(){return this.OC("chosen")}Eh(a){this.X("chosen",a)}}function HO(a){if(a.zd&&!a.Vb||!a.zd&&a.Vb){const b=new P({ka:O(a,"panel-title")}),c=a.Vb?"PB_TAB_OUTLINE_LABEL":"PB_TAB_NOTES_LABEL";b.ha(a.I.ia(c));It(b,a.I,c);return b}return null} +function IO(a){a.Uj=new P({F:"search-wrapper"});M(a,a.Uj);a.xg=new FO({F:"search-field",prompt:a.I.ia("PB_SEARCH_PANEL_DEFAULT_TEXT")});M(a.Uj,a.xg);const b=new P({F:"clear-button"}),c=new P({za:Z(a.K,"erase_search")});M(b,c);z(a,b.ja,a.c6,a);a.Qi=b;M(a.Uj,a.Qi);a.qe=a.pE();M(a,a.qe);z(a,a.xg.bF,a.J4,a)}function JO(a){a.Jc&&a.Jc.J(!a.so);a.fl&&a.fl.J(!a.so);a.qe&&a.qe.J(!a.so);a.Uj&&a.Uj.J(a.so);a.xg&&a.xg.J(a.so);a.Qi&&a.Qi.J(a.so)} +class KO extends P{constructor({ga:a,Fu:b,Gu:c,rk:d,xa:e}){super({F:"outline-panel-header"});this.K=e;this.I=a;this.so=!1;this.sg=d;this.xA=E(this);this.xO=E(this);this.Qi=this.qe=this.xg=this.Uj=null;this.Vb=c;this.zd=b;(this.Jc=this.Np())&&M(this,this.Jc);(this.fl=HO(this))&&M(this,this.fl);this.sg.search&&this.Vb&&IO(this);z(this,this.I.og,this.Eg,this);z(this,this.sg.pb,this.B_,this);JO(this)}fS(a){this.Vb=a}eS(a){this.zd=a}qa(a){super.qa(a);this.xg&&this.xg.qa(a)}B_(){!this.sg.search||!this.Vb|| +this.xg||this.qe||this.Qi||this.Uj||IO(this);(!this.sg.search||!this.Vb)&&this.xg&&this.qe&&this.Qi&&this.Uj&&(Se(this.Uj,this.xg),Se(this.Uj,this.Qi),Se(this,this.Uj),Se(this,this.qe),this.Uj=this.Qi=this.qe=this.xg=null,this.so=!1);JO(this)}J4(){this.xO.C(this.xg.value())}pE(){const a=new P({F:"search-button"}),b=new P({za:Z(this.K,"search")});M(a,b);z(this,a.ja,this.f7,this);return a}f7(){this.so=!0;this.xA.C("outline");JO(this);this.xg.displayObject().focus()}c6(){this.so=!1;this.xg.gn("");this.xg.displayObject().blur(); +JO(this);this.xO.C("")}Np(){if(this.Vb&&this.zd){const a=new P({ka:O(this,"switcher")}),b=new GO({selected:!0});It(b,this.I,"PB_TAB_OUTLINE_LABEL");M(a,b);const c=new GO({selected:!1});It(c,this.I,"PB_TAB_NOTES_LABEL");M(a,c);z(this,this.xA,d=>{b.Eh("outline"===d);c.Eh("notes"===d)});z(this,b.ja,()=>{this.xA.C("outline")});z(this,c.ja,()=>{this.xA.C("notes")});return a}return null}Eg(){this.xg&&this.xg.setAttribute("placeholder",this.I.ia("PB_SEARCH_PANEL_DEFAULT_TEXT"))}};class LO extends wg{constructor(){super();this.Bs="";this.nL=E(this)}};class MO extends wg{constructor(a){super();this.U=a;this.LA=E(this);x(this,this.U,"scroll",()=>{this.LA.C()})}scrollY(){return this.U.scrollTop}FI(){return this.LA}ny(a){this.U.scrollTop=a}}function NO(a,b){Se(a,a.li);a.li=b;B(a,a.li);z(a,a.li.FI(),()=>{document.body.contains(a.displayObject())&&a.G.Sf(a.li.scrollY())})} +function OO(a){const b=PO(a.G);a.Vt.forEach((c,d)=>{0>b.indexOf(d)&&(a.Vt.delete(d),a.sa.removeChild(c),Se(a,c))});for(let c=0;cthis.G.gr);this.sa.Wc(this.G.Nt);this.li.ny(this.G.Eb);L(this.sa,"padding-top",this.G.GL+"px");OO(this)}};function PO(a){return a.jb.slice(a.GE,a.GE+a.DV)}function SO(a){a.Eb=xv(a.Eb,0,Math.max(a.Nt-a.gr,0));a.Js()} +class TO extends wg{constructor(){super();this.Uk=this.Nt=this.gr=this.Eb=0;this.jb=[];this.DV=this.GE=this.GL=0;this.dE=E(this)}invalidate(){this.Js()}bR(){return this.Uk}Sf(a){void 0!==this.gr&&this.Eb!=a&&(this.Eb=a,SO(this))}Js(){this.GE=Math.floor(Math.max(0,this.Eb-(Ii?this.gr:0))/this.Uk);this.GL=this.Uk*this.GE;this.DV=Math.ceil((Math.min(this.Nt,this.Eb+this.gr+(Ii?this.gr:0))-this.GL)/this.Uk);this.dE.C()}};class UO extends P{constructor(a){super({F:"slide-item-view",aJ:!0});this.i5=a}item(){return this.i5}};function VO(a){a.Ku()?a=Promise.resolve(a.Ku()):(a.id(),a=Promise.resolve(null));return a};function WO(a,b){const c=Math.round(a.width());let d=b.toLocaleLowerCase().indexOf(a.Lh),e=d+a.Lh.length;const f=(g,h)=>`${0{const g=f(d-1,e+1).split(" ");for(let h=0;2>h;++h){let l=c;for(;l&&g.length;){const n=7*g[0].length+4;n<=l?(l-=n,g.shift()):l=0}}return!g.length};f(d,e)!=b&&a();)--d,++e;return{Yca:d,Daa:e}} +class XO extends yO{constructor({ka:a,F:b,C2:c}){super({ka:a,F:b,C2:c});this.Lh="";this.YA=0}ha(a){if(this.Lh){const b=a.slice(0,this.YA)+a.slice(this.YA).replace(new RegExp(`(${this.Lh})`,"gi"),"$1");this.displayObject().innerHTML=b}else super.ha(a);this.XE||(this.vp(a),this.xb())}jZ(a,b){if(b){this.Pt=!1;var c=this;c.ha(a);var d=a.substr(0,this.YA);a=a.substr(this.YA);if(void 0!==b&&this.displayObject().parentNode&&(c.displayObject().style.height="",!(b>=c.displayObject().scrollHeight))){var {Yca:e, +Daa:f}=WO(this,a),g=()=>{c.ha(`${d}${0{var h=this.Pa,l=!this.uq.pressed();h.wz!=l&&(h.wz=l,h.CE.C())});z(this,this.Pa.CE,this.uV,this);this.uV();this.uq.J(a.RE&&!g.Bs);a.zo&& +(this.Ad=new P({ka:O(this,"thumb"),Yb:"IMG"}),cP(this,this.Ad),this.Ad.J(!1),VO(a.slide()).then(h=>{if(h){const l=An({width:h.width(),height:h.height(),boundingWidth:d,boundingHeight:e,oC:!1});this.Ad.resize(l.width,l.height);this.Ad.setAttribute("src",h.url().replace(/\\/g,"/"));this.Ad.J(!0);this.X("with-thumbnail",!0)}}));this.re=this.sv(a);b=cP(this,this.re,"title-container");this.Cs=new XO({ka:O(this,"title")});this.Cs.X("minimized",!a.zo);M(b,this.Cs);z(this,this.Pa.sT,this.yW,this);this.yW(); +z(this,this.Pa.uT,this.zW,this);this.zW();z(this,g.nL,()=>{this.uq.J(a.RE&&!g.Bs);dP(this);eP(this)});z(this,this.I.og,this.Eg,this);eP(this);dP(this);this.qa(a.enabled());rt(()=>{this.re.visible()?this.re.xb():this.Cs.xb()})}zW(){this.X("viewed",this.Pa.LH)}yW(){this.Eh(this.Pa.selected())}uV(){this.uq.Dc(this.Pa.Qm())}sv(a){const b=new yO({ka:O(this,"title"),oda:!1});b.X("minimized",!a.zo);b.ha(this.Ud.prefix()+a.title());b.vp(a.title());return b}iK(a,b,c,d){let e=null,f=null;b.some(g=>{if(0>g.toLocaleLowerCase().indexOf(a))return!1; +e=g;f=`${this.I.ia(d)}
    `+c;return!0});return e&&f?{text:e,Iba:f}:null}aM(){if(this.yh)if(this.yh.X("answered",!1),this.wg.submitted()){if(this.Sj.WK||this.Sj.zV){var a=this.wg.review();a=a?a.status():"answered";this.yh.X("status",a)}}else"allAtOnce"==this.Sj.submitType()&&(a=this.wg.hasBeenVisited()&&(this.wg.submitted()||this.wg.initiated()),this.yh.X("answered",a));this.Nn&&this.Nn.X("with-status",this.wg.submitted())}c5(){this.wg&&this.Nn&&this.Nn.J(this.wg.isMarked())}Qa(a, +b){super.Qa(a,b);if(this.yh)if(a=this.yh.U.getBoundingClientRect().width/this.yh.width(),b=this.U.getBoundingClientRect(),this.Ad){var c=this.Ad.U.getBoundingClientRect(),d=(c.bottom-b.top)/a;this.yh.move((c.left-b.left)/a-this.yh.width()/2,d-this.yh.height()+2)}else{c=this.re.U.getBoundingClientRect();d=(c.top-b.top)/a;const e=c.height/a;this.yh.move((c.left-b.left)/a-this.yh.width()-7,d+(e-this.yh.height())/2)}this.Nn&&this.wg&&this.Nn.X("with-status",this.wg.submitted())}Eg(a){"PB_SEARCH_RESULT_IN_TEXT_LABEL"!== +a&&"PB_SEARCH_RESULT_IN_NOTES"!==a||eP(this)}};class gP{constructor(){this.L=-1;this.lp=this.text=this.title=0}}var hP={value:1E4,name:"title"},iP={value:100,name:"text"},jP={value:1,name:"notes"};function kP(a){const b=[];for(let c=0;c({id:e.id,slide:e.slide,location:e.location}))} +class nP{R3(a,b){function c(d,e){return d.L>e.L?-1:d.Lb.title?1:a.titleb.text?1:a.textb.lp?1:a.lp{a.enabled()&&!e.defaultPrevented&&(d=b.cD(),void 0!==d?a.Wg.slidePoolState().activeSlideIndex()!=d&&a.Wg.slidePoolState().setActiveSlideIndex(d):(a.B.ue(b.slide().index()),a.Vz()))});return c}function pP(a,b){return Oa(a.Wi,c=>c.slide().index()==b)} +function qP(a,b,c,d){if(!(0>c||c>=a.Wi.length)){b=b||a.Wi[c];var e=rP(a,b.Ou());if(e){e.Eh(d);if(d)for(e=Number.MAX_VALUE;0<=c;--c){const f=a.Wi[c];f.hwa)){a*=b.Uk;var c=a+b.Uk;a>=b.Eb&&c<=b.Eb+b.gr||(b.Eb=a{0==d.tc()&&(d=vP(a,b,e,c+"."),a.oK.push(d),++c)});a.QB.clear();u(a.Wi,d=>{a.QB.set(d.Ou(),d.state())});u(a.oK,()=>{})}function wP(a,b){a.Wi=[];a.oK=[];uP(a,b);a.Wi.sort((c,d)=>c.id()-d.id());a.Vz();a.Js()}function rP(a,b){return a.QB.has(b)?a.QB.get(b):null} +function vP(a,b,c,d,e=!1){var f=[];const g=b[c];for(var h=c+1;hb)return b;a=a.M.la(b);return a.visible()?a.Mi():-1} +class yP extends RO{constructor(a,b,c,d,e,f){const g=a.Vm,h=a.gp,l=a.nn,n=a.locked,m=a.zi,p=a.bR,t=a.qba,w=a.pba,y=a.xS,D=a.wS,I=new TO;a=new P;super({zf:!0,F:"treecontrol",Ca:I,iaa:a});B(this,I);M(this,a);this.hg=n;this.X("locked",this.hg);this.M=b;this.B=c;this.Kk=d;this.Wg=this.Bb=null;this.Ts=m;this.zo=l;this.$p=h;this.zH=!1;this.MO=g;this.I=e;this.K=f;this.Uk=p;this.k5=t;this.j5=w;this.P9=y;this.O9=D;this.QB=new Map;this.ZO=new Map;this.Wi=[];this.oK=[];this.mi=0;this.UG=null;z(this,this.Kk.nL, +this.Js,this);this.gF();z(this,c.vc(),this.sR,this);z(this,b.HZ,this.t7,this);this.X("highlight-viewed",this.$p);b=new P({F:"container-bottom-shadow"});M(this,b);this.ua=new wM({Gr:a,mQ:b.displayObject()});B(this,this.ua);this.O(this.ua.jk());(b=this.ua.li)&&NO(this,b);Ft(a,{height:"inherit"})}xi(){return 0==this.G.Nt}t7(a){if(a=pP(this,a))a=a.state(),1!=a.LH&&(a.LH=!0,a.uT.C())}reset(){}Js(){const a=[];if(this.Kk.Bs){var b=mP(this.M,this.Kk.Bs);for(var c of b)b=c.slide.index(),b=pP(this,b),b.state().XZ= +c.location,a.push(b)}else{c=Number.MAX_VALUE;for(b of this.Wi){const d=rP(this,b.Ou());b.hw<=c&&d&&(a.push(b),c=d.Qm()?Number.MAX_VALUE:b.hw)}}c=this.G;if(b=this.zo?this.k5:this.Uk)c.Uk=b;c.jb=a;c.Nt=c.Uk*a.length;c.Js();this.kF()}Iv(a){wP(this,a)}gF(){const a=this.Wg&&"completed"!=this.Wg.sessionMode()&&this.Wg.slidePoolState().slides(),b=xP(this),c=[];for(let e=0;e{const n=h.slide().description().text(),m=this.Bb.skinSettings().questionListInfo().displayQuestionStatus(),p="free"==this.Bb.navigationType(),t=this.Wg.settings().submitType(),w="reviewing"==this.Wg.sessionMode();c.push(new ZO(n,g+1,f,l,p,new YO(h,m,t,w)))})}}this.Iv(c);this.Vz()}sR(){Ue(this,this.Bb);(this.Bb=this.B.Oa())&&z(this,this.Bb.currentSessionChangedEvent(),this.dX,this);this.dX(); +this.Vz()}GA(){super.GA();this.ua.setParentScale(this.kt)}dX(){const a=this.Wg,b=this.B.Oa();this.Wg=this.B.fa().visible()&&b&&b.skinSettings().questionListInfo().showSlideList()?b.currentSession()&&b.currentSession().started()?b.currentSession():null:null;a!=this.Wg&&(a&&Ue(this,a,a.slidePoolState()),this.gF(),this.Wg&&(z(this,this.Wg.slidePoolState().activeSlideChangedEvent(),this.Vz,this),z(this,this.Wg.sessionModeChangedEvent(),this.gF,this)))}Vz(){const a=xP(this);if(this.Wg&&"completed"!=this.Wg.sessionMode()){const b= +this.Wg.slidePoolState().activeSlideIndex()+1;tP(this,this.Wi[a+b],a+b)}else tP(this,this.Wi[a],a)}Qa(a,b){super.Qa(a,b);this.kF();sP(this)}kF(){const a=this.height();this.ua&&a&&this.ua.Ci(a,this.G.Nt)}};function zP(a){return a.H.search?(a=new P({F:"search-result"}),a.J(!1),a):null}function AP(a){if(a.gl&&a.gl.visible()){const b=a.Ko.xi();a.gl.ha(a.I.ia(b?"PB_SEARCH_NO_RESULTS_LABEL":"PB_SEARCH_RESULTS_LABEL"));a.gl.X("no-results",b)}} +class BP extends P{constructor(a,b,c,d,e){super({F:"outline",zf:!0});this.vf("tabpanel");this.M=a;this.B=b;this.H=c;this.I=d;this.K=e;(this.gl=zP(this))&&M(this,this.gl);this.Kk=new LO;this.Ko=new yP({locked:this.H.locked,zi:this.H.zi,Vm:this.H.Vm,nn:this.H.nn,gp:this.H.gp,bR:60,qba:76,pba:20,wS:56,xS:120},a,b,this.Kk,this.I,this.K);M(this,this.Ko);z(this,this.B.vc(),this.ZF,this);z(this,this.H.pb,this.J6,this);z(this,this.I.og,this.Eg,this)}invalidate(){Ga("deprecated");this.xb()}J6(){this.H.search&& +!this.gl&&(this.gl=zP(this))&&M(this,this.gl,0);var a=this.Ko,b=this.H.nn,c=this.H.Vm,d=this.H.gp,e=this.H.zi;if(b!==a.zo||c!==a.MO||e!==a.Ts)a.zo=b,a.MO=c,a.Ts=e,a.ZO.clear(),a.gF();a.$p!==d&&(a.$p=d,a.X("highlight-viewed",a.$p))}ZF(){for(let f=0;fc.gB===b?(Se(a,c),!1):!0)}function MP(a,b,c,d){NP(a,b,c,d);c.Rf(0);c.G1();a.Db.O(c);a.kh=c;a.lZ="top"===d.jn;a.$X.C()}function OP(a,b,c,d={jn:"top",align:"center"}){JP(a);b&&(b=a.AG.find(e=>e.gB===c))&&MP(a,c,b,d)} +function LP(a){if(a.wh){var b=150;1==a.wh.Yc&&(b*=a.kL.progress,a.wh.stop(!1),a.wh.gd());var c=Sh(a.kh.displayObject());"number"!==typeof c&&(c=1);var d=Dh(a.kh.displayObject(),"top");d=Number(d.substr(0,d.length-2));a.wh=new GP;var e=new TC(a.kh.displayObject(),c,0,b);a.wh.add(e);c=[a.yw.x,d];d=[a.yw.x,a.yw.y+(a.lZ?10:-10)];b=new SC(a.kh.displayObject(),c,d,b);a.wh.add(b);a.wh.play();var f=a.kh,g=()=>{e.zD("finish",g,!1,a);e.zD("stop",g,!1,a);a.Db.removeChild(f)};e.Fl("finish",g,!1,a);e.Fl("stop", +g,!1,a);a.kh=void 0;a.CT.C()}}function PP(a,b){!a.kh||Md(a.kh.displayObject(),b)||Md(a.kh.gB,b)||JP(a)} +function NP(a,b,c,d){Gi(()=>{c.PR(1,a.Wk);var e="top"===d.jn?a.FJ:a.YJ,f=QP(a,b,c,d.align);const g=b.getBoundingClientRect(),h=a.Db.displayObject().getBoundingClientRect(),{x:l,y:n}=RP(a,new Xc(f,(g.top-h.top)/e),c,{relativeElement:b,jn:d.jn||"top",Oba:0});a.yw=new Xc(l,n);e=c.displayObject();f=d.jn||"bottom";a.wh&&(a.wh.stop(!1),a.wh.gd());a.wh=new GP;a.kL=new TC(e,0,1,150);a.wh.add(a.kL);e=new SC(e,[l,n+("top"===f?10:-10)],[l,n],150);a.wh.add(e);a.wh.play()})} +function QP(a,b,c,d="center"){if(void 0!==c.yw)c=c.yw;else a:{b=b.getBoundingClientRect();a=a.Db.displayObject().getBoundingClientRect();a=b.left-a.left;const e=a+b.width;b=a+b.width/2;switch(d){case "center":c=b-c.width()/2;break a;case "left":c=a;break a;case "right":c=e-c.width();break a;default:throw Error(`unknown horizontal align: ${d}`);}}return c} +function RP(a,b,c,{relativeElement:d,jn:e,Oba:f}){e="top"===e;let g=b.x;b=b.y;d=d.getBoundingClientRect();const h=e?a.FJ:a.YJ,l=Ii?Math.min(1,a.Wk/c.height()):h;c.PR(l,a.Wk);yi(c.displayObject(),"0 0");b=e?b-(c.height()+(6+f)*l):b+(d.height/h+(12+f));g+=(h-l)*c.width()/2;g=Math.round(xv(g,a.KV*h,a.MY*h-c.width()*l));b=Math.round(b*h);e&&(b+=Math.round((h-l)*c.height()));return new Xc(g,b)} +class SP extends wg{constructor(a){super();this.Db=a;this.AG=[];this.kh=void 0;this.YJ=this.FJ=this.Wk=this.MY=this.KV=0;this.wh=null;this.lZ=!0;this.kL=this.yw=void 0;this.CT=E(this);this.$X=E(this);x(this,document,Km,this.DA,this,Nm);x(this,document,"keydown",this.nw,this,!0);x(this,document,"focus",this.l6,this,!0)}np(){return this.CT}Jl(a,b,c){this.KV=a;this.MY=b;this.Wk=c}setScale(a,b){this.YJ=a;this.FJ=b}createPopup(a,b,c){a=new HP(a);a.ky(b);a.X(c,!0);IP(this,a);return a}DA(a){this.kh&&PP(this, +a.target)}nw(a){this.kh&&27==a.keyCode&&(a=this.kh.gB,JP(this),a.focus())}l6(a){Ib&&a.target==document.body||this.kh&&PP(this,a.target)}};class TP extends iM{constructor({xa:a,wj:b}){super({type:"uikit-primary-button",icon:{element:Z(a,"outline"),Ne:"left"}});this.AY=E(this);z(this,this.ja,this.Iz,this);z(this,b.np(),this.lw,this)}Iz(){this.Dc(!this.lo);this.AY.C(this.lo)}lw(){this.Dc(!1)}};class UP extends iM{constructor({xa:a,V:b,slides:c}){super({type:"uikit-primary-button",icon:{element:Z(a,"play"),Ne:"left"}});this.K=a;this.B=b;this.M=c;this.KN=!1;z(this,this.ja,this.Iz,this);-1==this.B.ma()&&(this.qa(!1),Qe(this,this.B.vc(),()=>{this.qa(!0)}));z(this,this.B.$().Ec(),this.Tz,this);z(this,this.B.$().Zb(),this.Ab,this);this.Tz()}Iz(){const a=this.B.$().state();"stopped"===a||"suspended"===a?this.B.play():this.B.pause()}Ab(){if(-1!=this.B.ma()){var a=this.B.fa(),b=a.startTime()+a.duration(); +const c=this.M.ti(this.B.$().timestamp());a=a.type();"interaction"!=a&&"quiz"!=a&&"scenario"!=a||c!=b?(b=this.B.nf("playPauseControl"),zO(this,b)):this.qa(!1)}}Tz(){var a=this.B.$().state();a=!("started"==a||"buffering"==a);if(this.KN!=a){const b=Z(this.K,a?"play":"pause");this.on(b);this.KN=!this.KN}a||zO(this,null)}};function VP(a){a.Dc(!1);OP(a.Ja,!1,a.displayObject(),a.jU)}class WP extends iM{constructor({Y$:a,Aaa:b,wj:c,Baa:d}){super({icon:a.icon,type:a.type,size:a.size,text:a.text,toggle:!0});this.Ja=c;this.q4=b;this.jU=d;this.Ja.createPopup(this.displayObject(),this.q4,"");z(this,this.ja,this.Iz,this);z(this,this.Ja.np(),()=>this.Dc(!1))}Iz(){this.Dc(!this.lo);OP(this.Ja,this.lo,this.displayObject(),this.jU)}};class XP extends P{constructor({id:a,icon:b,textContent:c,value:d,x0:e=!0}){super({F:"menu-base-item"});this.Tb=a;(this.Hc=this.zn(b))&&M(this,this.Hc);this.gm=this.BK(c);M(this,this.gm);(this.Hm=this.rE(d))&&M(this,this.Hm);this.X(a,!0);this.X("clickable",e)}get id(){return this.Tb}UR(a){this.gm.ha(a)}gn(a){this.Hm&&Se(this,this.Hm);(this.Hm=this.rE(a))&&M(this,this.Hm,2)}zn(a){return new P({za:a,ka:O(this,"icon")})}BK(a){const b=new P({ka:O(this,"label")});b.ha(a);return b}rE(a){return a?(Gt(a, +O(this,"value")),a):null}}function YP(a,b,c){a.to(b,d=>{Se(d,d.Hc);d.Hc=d.zn(c);M(d,d.Hc,0)})} +class ZP extends P{constructor(){super({F:"menu-base"});this.jb=new Map;this.uA=E(this)}nu(){return this.uA}X1(a,b){this.to(a,c=>c.J(b))}my(a,b){this.to(a,c=>c.UR(b))}W1(a,b){this.to(a,c=>c.qa(b))}tx({id:a,textContent:b,icon:c,value:d,x0:e}){if(!this.jb.has(a)){const f=new XP({id:a,textContent:b,icon:c,value:d,x0:e});this.jb.set(a,f);M(this,f);z(this,f.ja,()=>this.uA.C(this.vF(f)))}}vF(a){return a.id}to(a,b){this.jb.has(a)&&b(this.jb.get(a))}};function $P(a,{id:b,value:c}){a.tx({id:b,textContent:c,icon:(new P).displayObject()})}class aQ extends ZP{constructor({xa:a}){super();this.tB=null;this.Q9=Z(a,"tick")}};function bQ(a,b){const c=new P({ka:O(a,"caption")});It(c,b,a.I3);return c}function cQ(a,b,c){const d=new aQ({xa:b});a.Dw.forEach((e,f)=>{$P(d,{id:String(e),value:f})});z(a,c.og,e=>{e==a.XT&&(e=c.ia(e),d.my("1",e))});return d} +class dQ extends P{constructor(a,b){super({F:"rate-menu"});this.XT="PB_RATE_MENU_DEFAULT_RATE";this.I3="PB_RATE_MENU_CAPTION";this.Dw=new Map(xg.map(d=>{const e=String(d);return 1===d?[a.ia(this.XT),e]:[e,e]}));var c=bQ(this,a);M(this,c);c=new P({ka:O(this,"delimiter")});M(this,c);this.BO=cQ(this,b,a);M(this,this.BO)}$I(a){var b=this.BO;a=String(a);b.tB&&YP(b,b.tB,(new P).displayObject());b.tB=a;b.tB&&YP(b,b.tB,b.Q9)}nu(){return this.BO.nu()}};function eQ(a,b,c){b=b instanceof P?b:new P({za:b});Gt(b,O(a,"collapsed"===c?"collapsed-component":"expanded-component"));M(a,b)}function fQ(a){a.OC("active")||a.X("collapsed",!0)}class gQ extends P{constructor({eaa:a,Kaa:b}){super({F:"uikit-collapsed-control"});eQ(this,a,"collapsed");eQ(this,b,"expanded");x(this,this.displayObject(),"mouseenter",()=>{this.X("collapsed",!1)});x(this,this.displayObject(),"mouseleave",()=>fQ(this));fQ(this)}};class hQ extends P{constructor({ka:a,volume:b}){super({ka:a,jI:!0});this.setVolume(b)}setVolume(a){this.Lo(a)}Lo(a){L(this,"left",`${Math.round(100*a)}%`)}};var iQ=class extends P{constructor(){super({F:"volume-slider"});this.Le=1;this.zl=E(this);this.Pn=!1;this.mq=E(this);this.Gp=new P({ka:O(this,"background")});M(this,this.Gp);this.V_=new P({ka:O(this,"volume")});M(this,this.V_);this.pP=new P({ka:O(this,"track")});M(this,this.pP);this.La=new hQ({ka:O(this,"thumb"),volume:this.Le});M(this.pP,this.La);this.pU=new P({ka:O(this,"enlarged-click-area")});M(this,this.pU);this.rz=E(this);this.qz=E(this);x(this,this.pU.displayObject(),Km,this.w7,this,Nm);this.Lo()}pn(){return this.zl}Xx(){return this.mq}setVolume(a){this.Le!== +a&&(this.Le=a,this.zl.C(a),this.Lo())}volume(){return this.Le}zu(a){this.Pn!==a&&(this.Pn=a,this.mq.C(a),this.Lo())}muted(){return this.Pn}w7(a){this.rz.C();this.aN(a);x(this,document,Mm,this.aN,this);x(this,document,Lm,this.GW,this)}aN(a){a=a.clientX-this.displayObject().getBoundingClientRect().x;const b=this.pP.width();a=parseFloat(xv(xv(a,0,b)/b,0,1).toFixed(2));isNaN(a)||(this.zu(!1),this.setVolume(a))}GW(){this.qz.C();Ne(this,document,Mm,this.aN,this);Ne(this,document,Lm,this.GW,this)}Lo(){const a= +this.Pn?0:this.Le;L(this.V_,"width",`${Math.round(100*a)}%`);this.La.setVolume(a)}};class jQ extends P{constructor(){super({F:"volume-slider-wrapper"});this.zl=E(this);this.mq=E(this);this.rz=E(this);this.qz=E(this);this.Bd=new iQ;df(this.Bd.pn(),this.zl);df(this.Bd.Xx(),this.mq);df(this.Bd.rz,this.rz);df(this.Bd.qz,this.qz);M(this,this.Bd)}pn(){return this.zl}Xx(){return this.mq}setVolume(a){this.Bd.setVolume(a)}volume(){return this.Bd.volume()}zu(a){this.Bd.zu(a)}muted(){return this.Bd.muted()}} +class kQ extends P{constructor({GS:a}){super();a=this.zn(a.high);M(this,a)}on(a){this.tp();a=this.zn(a);M(this,a)}zn(a){return new P({za:a})}}function lQ(a){const b=a.zL(a.Bd.volume(),a.Bd.muted());a.U_.on(b)} +class mQ extends gQ{constructor({GS:a}){const b=new jQ,c=new kQ({GS:a});super({eaa:c,Kaa:b});this.ZP=a;this.zl=E(this);this.mq=E(this);this.Bd=b;df(this.Bd.pn(),this.zl);df(this.Bd.Xx(),this.mq);this.U_=c;z(this,this.U_.ja,this.P7,this);z(this,this.Bd.rz,this.k6,this);z(this,this.Bd.qz,this.j6,this)}setVolume(a){this.Bd.setVolume(a);lQ(this)}zu(a){this.Bd.zu(a);lQ(this)}pn(){return this.zl}Xx(){return this.mq}P7(){this.zu(!this.Bd.muted())}k6(){this.X("active",!0)}j6(){this.X("active",!1)}zL(a,b){if(0=== +a||b)return this.ZP.qk;if(0=a)return this.ZP.Bba;if(.5=a)return this.ZP.high;throw Error(`incorrect volume ${a}`);}};const nQ=["volume","fullscreen"];function oQ(a){a.U.tp();a.sn.filter(b=>nQ.includes(b.type)).forEach(b=>a.U.O(b.jk));pQ(a)}function qQ(a){a.U.tp();3a.U.O(b.jk));pQ(a)}function pQ(a){a.lT.C(new Map(a.sn.map(b=>[b.type,a.U.tf(b.jk)])))}function rQ(a){var b=3;--b;for(let c=0;c=b);++c)a.U.O(a.sn[c].jk);a.U.O(a.Zv.jk)} +var sQ=class extends wg{constructor(a){super();this.U=a;this.sn=[];this.Zv=null;this.lT=E(this)}get $$(){return this.lT}cQ(a){"more"==a.type?this.Zv=a:this.sn.push(a)}Mg(a){a?oQ(this):qQ(this)}};function tQ(a){const b=new iQ;z(a,b.pn(),c=>a.hc.setVolume(c));return b} +var uQ=class extends P{constructor({oba:a,ga:b,xa:c,soundController:d}){super({F:"more-menu-popup"});this.Rs=new ZP;M(this,this.Rs);this.hc=d;this.Bd=null;this.MJ(a,b,c);z(this,b.og,()=>{this.Rs.my("volume",b.ia("PB_CONTROL_PANEL_VOLUME_CONTROL"));this.Rs.my("replay",b.ia("PB_CONTROL_PANEL_REPLAY"))})}get Pe(){return this.Rs}MJ(a,b,c){a.includes("replay")&&this.Rs.tx({id:"replay",textContent:b.ia("PB_CONTROL_PANEL_REPLAY"),icon:Z(c,"replay")});a.includes("fullscreen")&&this.Rs.tx({id:"fullscreen", +textContent:b.ia("PB_CONTROL_PANEL_FULL_SCREEN"),icon:Z(c,"fullscreen")});a.includes("volume")&&(this.Bd=tQ(this),this.Rs.tx({id:"volume",textContent:b.ia("PB_CONTROL_PANEL_VOLUME_CONTROL"),icon:Z(c,"volume_high"),value:this.Bd}))}};const vQ=["replay","fullscreen","volume"];function wQ(a,b,c){a.hE.cQ({type:c,jk:b})} +function xQ(a){a.Kc||(a.Kc=a.gz());if(!a.nb){if(a.H.Qd&&a.Kc){var b=a.fj.playbackRate();b=yQ(a,Z(a.K,`rate-${b}x`),a.Kc)}else b=null;a.nb=b}a.ms||(a.ms=zQ(a));a.LG||(a.H.sy?(b=a.Ae(Z(a.K,"replay")),z(a,b.ja,a.aX,a)):b=null,a.LG=b);a.Wp||(a.Wp=a.yK());a.hr||(a.hr=AQ(a));b=a.hE;b.sn.splice(0,b.sn.length);a.H.Qd&&a.nb&&wQ(a,a.nb,"rate");a.H.Ll&&a.ms&&wQ(a,a.ms,"cc");a.H.sy&&a.LG&&wQ(a,a.LG,"replay");a.H.zp&&a.Wp&&wQ(a,a.Wp,"fullscreen");a.H.Mr&&a.hr&&wQ(a,a.hr,"volume")} +function zQ(a){if(a.H.Ll){const b=a.Ae(BQ(a));z(a,b.ja,a.d6,a);z(a,a.Ek.Yy,()=>{a.ms&&a.ms.on(BQ(a))});return b}return null}function AQ(a){if(a.H.Mr){const b=new mQ({GS:{qk:Z(a.K,"volume_mute"),Bba:Z(a.K,"volume_middle"),high:Z(a.K,"volume_high")}});Gt(b,O(a,"collapsable-button"));z(a,b.pn(),c=>a.hc.setVolume(c));z(a,b.Xx(),c=>a.hc.qk(c));return B(a,b)}return null}function BQ(a){return a.Ek.kd.visible()?Z(a.K,"cc_on"):Z(a.K,"cc")} +function yQ(a,b,c,d){b=new WP({Y$:{type:"uikit-secondary-button",icon:{Ne:"left",element:b}},wj:a.Ja,Aaa:c,Baa:{jn:"top",align:d}});Gt(b,O(a,"collapsable-button"));return B(a,b)}function CQ(a){var b=a.zL(a.hc.volume(),a.hc.muted());YP(a.Ss.Pe,"volume",b);b=a.Ss;a=a.hc.volume();b.Bd&&b.Bd.setVolume(a)}function DQ(a){const b=jC()?"PB_CONTROL_PANEL_EXIT_FULL_SCREEN":"PB_CONTROL_PANEL_FULL_SCREEN";a.Ss.Pe.my("fullscreen",a.I.ia(b));YP(a.Ss.Pe,"fullscreen",EQ(a))} +function EQ(a){return jC()?Z(a.K,"exit_fullscreen"):Z(a.K,"fullscreen")}function FQ(a){z(a,a.hc.p1(),()=>{a.hr&&a.hr.zu(a.hc.muted())});z(a,a.hc.pn(),()=>{a.hr&&(a.hr.setVolume(a.hc.volume()),CQ(a))})}function GQ(a){z(a,a.fj.Qj,()=>{a.jx();if(a.nb){var b=a.fj.playbackRate();b=Z(a.K,`rate-${b}x`);a.nb.on(b)}})}function HQ(a){z(a,a.Qg.tL,()=>{a.Wp&&(a.Wp.on(EQ(a)),DQ(a))})}function IQ(a){z(a,a.I.og,()=>{DQ(a)})} +class JQ extends P{constructor({settings:a,wj:b,soundController:c,ica:d,ga:e,kk:f,wx:g,xa:h}){super({F:"collapsable-buttons-group"});this.H=a;this.Ja=b;this.hc=c;this.h8=d;this.I=e;this.Qg=f;this.Ek=g;this.K=h;this.hW=!1;this.fj=d.Il();this.hE=new sQ(this);this.LG=this.Wp=this.hr=this.ms=this.nb=this.Kc=null;a=new uQ({oba:vQ,ga:this.I,xa:this.K,soundController:this.hc});z(this,a.Pe.nu(),this.D6,this);this.Ss=a;B(this,this.Ss);this.Zv=yQ(this,Z(this.K,"more"),this.Ss,"left");wQ(this,this.Zv,"more"); +xQ(this);FQ(this);GQ(this);HQ(this);z(this,this.hE.$$,this.b6,this);IQ(this);this.jx();CQ(this);DQ(this)}XR(a){this.hW=a;this.Qa()}Qt(){!this.H.Ll&&this.Ek.kd.visible()&&KQ(this.Ek)}Qa(){this.nb&&this.nb.lo&&VP(this.nb);this.Zv.lo&&VP(this.Zv);this.hE.Mg(this.hW)}yK(){if(this.H.zp&&kC()){const a=this.Ae(Z(this.K,"fullscreen"));z(this,a.ja,this.qT,this);return a}return null}d6(){this.enabled()&&this.ms&&(this.Ek.kd.visible()?KQ(this.Ek):this.Ek.c2())}gz(){if(this.H.Qd){const a=new dQ(this.I,this.K); +z(this,a.nu(),this.pN,this);return a}return null}pN(a){this.fj.wk(Number(a));JP(this.Ja)}jx(){this.Kc&&this.Kc.$I(this.fj.playbackRate())}D6(a){switch(a){case "replay":JP(this.Ja);this.aX();break;case "fullscreen":this.qT()}}zL(a,b){if(0===a||b)return Z(this.K,"volume_mute");if(0=a)return Z(this.K,"volume_middle");if(.5=a)return Z(this.K,"volume_high");throw Error(`incorrect volume ${a}`);}Ae(a){a=new iM({type:"uikit-secondary-button",icon:{Ne:"left",element:a}});Gt(a,O(this,"collapsable-button")); +return B(this,a)}b6(a){(new Map(vQ.map(b=>[b,a.has(b)?!a.get(b):!1]))).forEach((b,c)=>this.Ss.Pe.X1(c,b))}qT(){kC()&&(jC()?iC():hC())}aX(){this.enabled()&&this.h8.JR()}};class LQ extends HP{PR(a,b){const c=this.content();b/=a;c&&c.Wc(b);this.Wc(b);this.xb();wn(this.displayObject(),a)}};class MQ extends LQ{constructor(a,b){super(a);this.fc=b;this.ky(this.fc)}G1(){var a=this.fc.ht;a.Ko&&sP(a.Ko)}};function NQ(a){if(a.Ul.showOutline){const b=new TP({xa:a.K,wj:a.Ja});Gt(b,O(a,"outline-button"));z(a,b.AY,a.NO,a);a.fc=new EP({Fu:!1,Gu:!0,rk:a.sg,xa:a.K,ga:a.I,V:a.B,slides:a.M});a.mG=new MQ(b.displayObject(),a.fc);a.mG.X("outline-popup",!0);IP(a.Ja,a.mG);return b}return null}function OQ(a){return PQ(a)?new JQ({settings:a.Ul,wj:a.Ja,soundController:a.hc,ica:a.B,ga:a.I,kk:a.Qg,wx:a.Ek,xa:a.K}):null}function PQ(a){return a.Ul.sy||a.Ul.Mr||a.Ul.Ll||a.Ul.Qd||a.Ul.zp} +class QQ extends P{constructor({jaa:a,rk:b,wj:c,ga:d,xa:e,V:f,slides:g,kk:h,soundController:l,wx:n}){super({F:"play-controls-container"});this.Ul=a;this.B=f;this.Ja=c;this.I=d;this.K=e;this.M=g;this.Qg=h;this.hc=l;this.Ek=n;this.sg=b;this.Eq=this.mG=this.fc=null;this.Yk=NQ(this);this.hb=this.qv();this.Jh=OQ(this);this.Yk&&M(this,this.Yk);this.hb&&M(this,this.hb);this.Jh&&M(this,this.Jh)}eJ(a){this.mG&&this.fc&&this.fc.resize(void 0,a)}qa(a){this.Jh&&this.Jh.qa(a)}XR(a){this.hb&&this.hb.J(!a);this.Jh&& +this.Jh.XR(a)}Qa(){var a=this.Ul.xf;a&&!this.hb&&(this.hb=this.qv())&&M(this,this.hb,this.fm("playButton"));this.hb&&this.hb.J(a);(a=this.Ul.showOutline)&&!this.Yk&&(this.Yk=NQ(this))&&M(this,this.Yk,this.fm("outlineButton"));this.Yk&&this.Yk.J(a);PQ(this)&&!this.Jh&&(this.Jh=OQ(this))&&M(this,this.Jh,this.fm("collapsableButtons"));this.Jh&&(a=this.Jh,xQ(a),a.Qa(),a.Qt(),a.jx(),CQ(a),DQ(a))}fm(a){const b=[this.Yk,this.hb,this.Jh].filter(c=>c);switch(a){case "outlineButton":return b.indexOf(this.Yk); +case "playButton":return b.indexOf(this.hb);case "collapsableButtons":return b.indexOf(this.Jh);default:return-1}}qv(){if(this.Ul.xf){const a=new UP({xa:this.K,V:this.B,slides:this.M});Gt(a,O(this,"play-pause-button"));return a}return null}NO(a){OP(this.Ja,a,this.Yk.displayObject())}};function RQ(a){let b=!1,c=!1,d=!1;for(let e=0;e=a?"":b.I.ia("PB_CONTROL_PANEL_NEXT"),b.gb.ha(a))}}$y(){var a=this.H.visible&&(this.H.Re||this.H.yf||this.H.Hu);return this.Lz||a?(a=new CO({ga:this.I,V:this.B,xa:this.K,settings:this.H,rJ:this.M.Cp()}),Gt(a,O(this,"navigation-controls")),a):null}Qa(){TQ(this);UQ(this)}io(){var a=this.B.fb();const b=this.B.tb();a=!!a||!!b;UQ(this);this.Df&&this.Df.XR(a);this.Df&&(a=this.Df,a.Eq&&KP(a.Ja,a.Eq.relativeElement),a.Eq=null)}};class WQ extends P{constructor({Yb:a,ka:b}){super({Yb:a,ka:b});this.VK=!1;x(this,this.displayObject(),he,()=>{this.VK&&this.J(!1)})}show(){this.J(!0);this.VK=!1;requestAnimationFrame(()=>{Ft(this,{opacity:1})})}Uc(){this.VK=!0;requestAnimationFrame(()=>{Ft(this,{opacity:0})})}} +class XQ extends P{constructor(){super({F:"progress-tooltip"});this.Pv=0;this.rP=this.tH=!1;var a=new WQ({Yb:"img",ka:O(this,"thumbnail-tooltip")});a.Uc();this.ex=a;M(this,this.ex);a=new WQ({ka:O(this,"timing-tooltip")});a.Uc();this.gx=a;M(this,this.gx)}show(){this.tH&&this.ex.show();this.rP&&this.gx.show()}Uc(){this.ex&&this.ex.Uc();this.gx&&this.gx.Uc()}};function YQ(a,b,c,d,e){if(2!=b.length||2!=c.length)throw Error("Start and end points must be 2D");RC.call(this,null,b,c,d,e);this.Y8=a}r(YQ,RC);YQ.prototype.Bp=function(){this.Y8(this.coords[0],this.coords[1])};function ZQ(a){const b=d=>1-Math.pow(1-d,2),c=d=>{a.ra=d;a.Nf()};Gi(()=>{var d=6/a.height(),e=new YQ(c,[d,d],[1,1],200,b);const f=new XC(a.displayObject(),200);a.Kt=new GP;a.Kt.add(e);a.Kt.add(f);d=new YQ(c,[1,1],[d,d],400,b);e=new WC(a.displayObject(),400);a.Lt=new GP;a.Lt.add(d);a.Lt.add(e)},a)} +class $Q extends P{constructor(a){super();this.QM=0;this.ra=1;this.Io=this.Lt=this.Kt=null;(Ii||sj)&&a||this.Rf(0);sj||(ZQ(this),this.Io=new jh(500),this.Io.Fl("tick",this.x7,!1,this))}offset(){return this.QM}qa(a){Ii&&!sj?a?this.show():this.Uc():sj&&this.Rf(a?1:0)}show(){this.Io&&this.Lt&&this.Kt&&(this.Io.enabled?this.Io.stop():(this.Lt.stop(),1!=Dh(this.displayObject(),"opacity")&&this.Kt.play()))}Uc(){var a;if(a=this.Io)a=Sh(this.displayObject()),a=0!==("number"===typeof a?a:1);a&&this.Io.start()}Nf(){const a= +new gm;a.translate(this.QM,0);a.scale(this.ra,this.ra);on(this.displayObject(),a)}x7(){this.Io&&this.Lt&&this.Kt&&(this.Io.stop(),this.Kt.stop(),this.Lt.play())}};function bR(a){a=a.toString();1==a.length&&(a="0"+a);return a};class qR extends wg{constructor(a){super();this.S3=a;this.gM=!1;this.QY=E(this);this.lW=E(this);this.PY=E(this);a.forEach(b=>{x(this,b,"mouseover",this.sq,this);x(this,b,Mm,this.XF,this);x(this,b,"mouseout",this.km,this)},this)}sq(a){this.gM||(this.gM=!0,this.QY.C(a))}XF(a){this.lW.C(a)}km(a){-1==Ia(this.S3,a.relatedTarget)&&(this.gM=!1,this.PY.C(a))}};function BR(a,b){Ii||(b?(z(a,a.NG.QY,a.Z6,a),z(a,a.NG.lW,a.G6,a),z(a,a.NG.PY,a.Y6,a)):a.ks(a.NG))}function CR(a){L(a,"cursor",a.rB?"pointer":"default")}function FR(a){return a.B.fa().sb().duration()}function GR(a,b){const c=a.displayObject().getBoundingClientRect();a=Lh(b,a.displayObject());return Vc(a.x/c.width,0,1)}function HR(a,b){b=a.M.Xo(b*a.M.Pu(),!1,!0);a=a.M.la(b.L());return VO(a)} +function IR(a,b){b=b.target===a.La.displayObject()?a.La.offset():b.offsetX;var c=a.width(),d=b/c;a.H.mode===TL&&JR(a,d);if(a.H.Lr){d="slideTimeline"===a.H.mode?d*FR(a):d*a.M.Pu();d=Math.round(d);if(3600<=d){const e=Math.floor(d/3600);d-=3600*e;d=e+":"+bR(Math.floor(d/60))+":"+bR(d%60)}else d=Math.floor(d/60)+":"+bR(d%60);a.Cq.gx.ha(d)}a=a.Cq;a.Pv=b-a.width()/2;d=a.tH?a.ex.width():a.gx.width();c-=b+d/2;b-=d/2;0>c&&(a.Pv-=Math.abs(c));0>b&&(a.Pv+=Math.abs(b));L(a,"left",`${a.Pv}px`)} +function JR(a,b){HR(a,b).then(c=>{c=c.url();a.Cq.ex.setAttribute("src",c)})} +class KR extends P{constructor({settings:a,slides:b,V:c}){super({F:"progressbar",zf:!0});this.M=b;this.B=c;this.H=a;this.An=0;this.rB=this.H.enabled;this.PK=null;this.qY=E(this);this.rY=E(this);this.pY=E(this);this.pe=new P({ka:O(this,"progress")});this.NK=new P({ka:O(this,"progress-background")});a=new $Q(this.rB);Gt(a,O(this,"thumb"));this.La=a;a=new XQ;a.tH=this.H.mode===TL;a.rP=this.H.Lr;Gt(a,O(this,"progress-tooltip"));this.Cq=a;this.NG=new qR([this.pe.displayObject(),this.NK.displayObject(), +this.La.displayObject()]);M(this,this.pe);M(this,this.La);M(this,this.Cq);M(this.pe,this.NK);BR(this,this.H.enabled);x(this,this.pe.displayObject(),Km,this.rw,this,Nm);x(this,this.La.displayObject(),Km,this.rw,this,Nm);z(this,this.H.pb,this.sN,this);CR(this)}Lg(a){this.width()&&(this.An=xv(a,0,1),this.xb())}progress(){return this.An}finished(){return 1===Vc(this.An,0,1)}Qa(a,b){super.Qa(a,b);a*=this.An;this.NK.Kb(a);b=this.La;b.QM=a;b.Nf()}sN(){const a=(this.rB=this.H.enabled)&&this.H.Lr;this.Cq.tH= +this.H.enabled&&this.H.mode===TL;this.Cq.rP=a;this.H.enabled||wn(this.pe.displayObject(),1,1);this.H.enabled?this.La.qa(!0):this.La.Uc();CR(this);BR(this,this.rB)}rw(a){this.rB&&this.enabled()&&(x(this,document,Mm,this.XF,this),x(this,document,Lm,this.YF,this),this.Lg(GR(this,a)),this.rY.C())}XF(a){this.Lg(GR(this,a));this.qY.C()}YF(a){Ne(this,document,Mm,this.XF,this);Ne(this,document,Lm,this.YF,this);this.Lg(GR(this,a));this.pY.C();if(Ii)return yn(this.displayObject())}Z6(a){clearTimeout(this.PK); +this.H.enabled&&(IR(this,a),this.Cq.show());this.La.show();a=6/this.height();wn(this.pe.displayObject(),1,a)}G6(a){this.H.enabled&&IR(this,a)}Y6(){clearTimeout(this.PK);this.La.Uc();this.PK=setTimeout(()=>{this.Cq.Uc();wn(this.pe.displayObject(),1,1)},400)}};function LR(a,b){if(-1!==a.B.ma()){var c=b&&a.om;a.AO.C(!0);var d=a.va.progress();"slideTimeline"===a.uH?(b=a.B.fa(),d*=FR(a),d=b.Xo(d,!1),a.B.lk(d.L(),d.Ba(),d.ib(),c)):(d*=a.M.Pu(),d=a.M.Xo(d,!1,!0),(b||"slide"===a.M.la(d.L()).type())&&a.B.lk(d.L(),d.Ba(),d.ib(),c));if(c=a.B.nf("presentationSeeking",d.L(),d)){c=c.rd().Pd();if(null==c)return;d=a.M.la(c).sb();b=d.count()-1;d=d.sc(b).duration();a.B.lk(c,b,d,!1)}a.AO.C(!1)}} +function MR(a){var b=a.B.$().timestamp();a=a.B.fa().sb();b=0<=b.Ba()?a.getTime(b.Ba(),b.ib()):0;a=a.duration();return 0{LR(this,!1)},100)}sN(){this.uH=this.gj.mode;this.gk()}Ab(){if(!this.bB&&this.va){const a=-1===this.B.$().timestamp().Ba()&&!!this.va.An,b=this.va.finished()&&MR(this)*FR(this)===FR(this);a||b||this.gk()}}gk(){if("slideTimeline"===this.uH)-1!==this.B.ma()&&this.va.Lg(MR(this));else{var a=this.B.$().timestamp();a=this.M.ti(a,!1,!0);this.va.Lg(a/this.M.Pu())}}Uz(){var a=this.B.nf("slideTimeline"===this.uH?"slideSeeking":"presentationSeeking"); +zO(this.va.displayObject(),a)}};class OR{constructor(a){this.Hc=a}animate(a){this.Hc.Rf(a[0]);wn(this.Hc.displayObject(),a[1])}}function PR(a){a.ob=new xO;a.ob.J(!1);yi(a.ob.displayObject(),"left top");vO(a.ob,a.D.Tr().view());const b=a.G.qd().Vf();for(let c=0;c{a.ob.removeChild(b)},a);return c} +class RR extends wg{constructor({kc:a,xa:b,controlPanel:c,oca:d}){super();this.D=a;this.K=b;this.ub=c;this.um=d;this.G=this.D.Ca();this.B=this.D.view().V();this.rc=this.D.view().Cd();this.ls=null;this.Ph=void 0;this.hf=!1;this.ww=null;this.$T=!1;this.Gb=void 0;this.QP=E(this);PR(this);this.um&&z(this,this.um.AO,e=>{this.$T=e})}invalidate(){const a=this.uL();void 0!==a?(this.hf=!0,wO(this.ob,a.width(),a.height())):this.hf=!1}vX(){const a=this.rc;a.$().Kg()?a.pause():a.play()}EW(a){if(!this.$T){var b= +this.ls;this.ls=a.state();a="started"==this.ls||"buffering"==this.ls;if("suspended"!=b&&"suspended"!=this.ls&&"rewinding"!=this.ls&&(!b||("started"==b||"buffering"==b)!=a)){a=!a;this.ww&&1==this.ww.Yc&&this.ww.stop(!0);b=new P;a?b.O(Z(this.K,"btn_pause_big.svg")):b.O(Z(this.K,"btn_play_big.svg"));b.resize(104,76);L(b,"position","absolute");L(b,"pointer-events","none");var c=this.ob;a=(c.width()-b.width())/2;c=(c.height()-b.height())/2;b.move(a,c);this.ob.O(b);Ue(this,this.ww);this.ww=QR(this,b);this.ww.play()}}}uL(){let a= +this.Ph;const b=this.G.qd().Vf();if(!a)for(let c=0;c=this.B.ma()){a=d;break}}return a}N6(a){"activated"==a.playbackState()?this.Ph!=a&&(this.Ph=a,wO(this.ob,a.width(),a.height()),this.QP.C()):"deactivated"==a.playbackState()&&(this.Ph=void 0,this.QP.C())}video(){return this.ob}};function SR(a,b,c){const d=new P({ka:O(a,"link"),Yb:"A",jI:!0,OI:!1});d.setAttribute("target","_blank");d.setAttribute("data-tooltip",c);a=new P({ka:O(a,"link-icon"),za:b});M(d,a);return d}function TR(a){const b=a.Dk.displayObject().offsetHeight;a.ua.Ci(b,b)}function UR(a){const b=new P({ka:O(a,"show-more")});b.ha(a.I.ia(a.Ho.GQ));z(a,b.ja,()=>VR(a));return b}function VR(a){var b=!a.Qm();a.Dk.X("collapsed",!b);a.Qm()?a.Lq.ha(a.I.ia(a.Ho.y0)):a.Lq.ha(a.I.ia(a.Ho.GQ));a.tU.C();WR(a)} +function WR(a){a.Qm()?(a.ua.Ci(a.Dk.height(),a.aE.height()),a.ua.Tx()):TR(a)} +class YR extends P{constructor(a,b,c){super({F:"presenter-info",zf:!0});this.I=a;this.Ho={L0:"PB_PRESENTER_EMAIL",G2:"PB_PRESENTER_WEBSITE",y0:"PB_PRESENTER_COLLAPSE_BIO",GQ:"PB_PRESENTER_EXPAND_BIO"};this.YG=c;this.X("popup",this.YG);this.Ub=null;this.Ga=new P({ka:O(this,"main")});M(this,this.Ga);this.pt=new P({ka:O(this,"photo")});M(this.Ga,this.pt);c=new P({ka:O(this,"info")});M(this.Ga,c);this.$h=new yO({ka:O(this,"name")});M(c,this.$h);const d=new yO({ka:O(this,"job")});$g&&L(d,"line-height", +"20px");this.jM=d;M(c,this.jM);this.lt=new P({ka:O(this,"phone"),Yb:Ii?"A":"DIV",jI:!0,OI:!Ii});M(c,this.lt);this.mA=new P({ka:O(this,"links")});M(c,this.mA);this.Zl=SR(this,Z(b,"mail-link"),this.I.ia(this.Ho.L0));B(this,this.Zl);this.Xt=SR(this,Z(b,"external-link"),this.I.ia(this.Ho.G2));B(this,this.Xt);this.Dk=new P({F:"bio-container"});M(this,this.Dk);b=new P({F:"scroll-area"});M(this.Dk,b);this.aE=new P({ka:O(b,"bio")});M(b,this.aE);this.ua=new wM({Gr:b});this.Dk.O(this.ua.jk());TR(this);this.YG|| +this.Dk.X("collapsed",!0);this.Lq=UR(this);M(this,this.Lq);this.J(!1);this.tU=E(this);this.R5=E(this);this.oL=!0;z(this,this.pt.Qe(),this.R5.C,this);z(this,a.og,this.Eg,this)}Qm(){return!this.Dk.OC("collapsed")}nD(a){this.Ub!=a&&((this.Ub=a)?(this.J(!0),a=this.Ub.Cr(),this.X("no-photo",!a),this.pt.J(!!a),this.pt.tp(),a&&(a.uf()?this.SU(a):(a.load(),z(this,a.Ar(),this.SU,this))),a=this.Ub.name(),this.$h.J(!!a),a&&this.$h.ha(a),a=this.Ub.ip(),this.jM.J(!!a),a&&this.jM.ha(a),a=this.Ub.phone(),this.lt.J(!!a), +a&&(this.lt.ha(a),this.lt.setAttribute("href",`tel:${a}`)),(a=this.Ub.email())?(this.Zl.setAttribute("href",`mailto:${a}`),this.Zl.setAttribute("title",a),this.mA.O(this.Zl)):this.mA.removeChild(this.Zl),(a=this.Ub.td())?(this.Xt.setAttribute("href",a),this.Xt.setAttribute("title",a),this.mA.O(this.Xt)):this.mA.removeChild(this.Xt),a=this.Ub.Nm(),this.Dk.J(!!a),a&&this.aE.ha(a),this.oL=!0,this.YG?this.Lq.J(!1):(this.Lq.J(this.Dk.visible()),!this.Dk.visible()&&this.Qm()&&VR(this)),this.ua.li.ny(0), +WR(this)):this.J(!1))}SU(a){const b=a.width(),c=a.height();L(this.pt,"background-image",Pi(a.path()));bc.offsetHeight);this.oL=!1}WR(this)}}Eg(a){switch(a){case this.Ho.y0:this.Qm()&&this.Lq.ha(this.I.ia(a));break;case this.Ho.GQ:this.Qm()||this.Lq.ha(this.I.ia(a)); +break;case this.Ho.L0:this.Zl&&this.Zl.setAttribute("data-tooltip",this.I.ia(a));break;case this.Ho.G2:this.Xt&&this.Xt.setAttribute("data-tooltip",this.I.ia(a))}}};class ZR extends P{constructor(){super({F:"logo"});this.jq=280;this.uM=this.Cf=this.Cb=null;E(this)}yu(a){this.Cb!=a&&(this.X("has-logo",!1),this.Cb&&Ue(this,this.Cb.logo(),this.Cb),(this.Cb=a)?(z(this,this.Cb.vM,this.eC,this),this.eC()):this.cN(null))}eC(){if(this.Cb){var a=this.Cb.logo();a.uf()?this.cN(a):(a.load(),z(this,a.Ar(),this.cN,this))}}cN(a){a?(Cd(this.displayObject()),this.Cf=new P({Yb:"A"}),this.Cb&&this.Cb.td()&&""!=this.Cb.td()?(this.Cf.setAttribute("href",this.Cb.td()),this.Cf.setAttribute("target", +"_blank"),this.Cf.setAttribute("title",this.Cb.td())):(this.Cf.removeAttribute("title"),this.Cf.removeAttribute("href"),this.Cf.removeAttribute("target")),this.uM=a.CC(),this.O(this.Cf),this.Cf.O(this.uM),this.X("has-logo",!0)):this.Cf&&(this.removeChild(this.Cf),this.uM=null)}};function $R(a){const b=new ZC({ka:O(a,"maximized")}),c=new P({za:Z(a.K,"video_maximize")});M(b,c);b.X("at-left",a.Ua.he);b.Rf(0);z(a,b.ja,()=>a.dN.C());return b}function aS(a){if(a.Ua.sd){const b=new ZR;z(a,a.G.qK,a.fZ,a);z(a,b.Qe(),()=>{bS(a)});a.Me(b,0);return b}return null} +function cS(a){if(a.Ua.hh){const b=new YR(a.I,a.K,!1);Gt(b,O(a,"presenter-info"));b.J(!1);z(a,b.tU,()=>{if(a.Rc&&a.Rc.visible())if(a.Rc.Qm()){var c=Zh(a.displayObject());c=a.height()-a.Rc.y()-c.bottom;L(a.Rc,"max-height",`${c}px`)}else L(a.Rc,"max-height","");a.xb()});return b}return null}function dS(a){return a.Ua.showOutline||a.Ua.ye?new EP({Gu:a.Ua.showOutline,Fu:a.Ua.ye,rk:a.sg,V:a.B,slides:a.G.slides(),xa:a.K,ga:a.I}):null} +function bS(a){if(a.ic){var b=Zh(a.displayObject());b=a.fc?Math.max(.2*a.height(),156)+b.bottom:0;b=a.height()-b;if(!a.ud||0>=a.ud.height())var c=0;else c=$h(a.ud.displayObject()),c=a.ud.height()+c.top+c.bottom;b-=c;a.ic.Jl(a.width(),b)}}function eS(a){let b=Sh(a.kq.displayObject());"number"!==typeof b&&(b=0);a.xU=new TC(a.kq.displayObject(),b,0,250,c=>Math.max(0,250*c)/250);a.xU.play()} +function fS(a){a.Rc&&(a.ic?a.tf(a.Rc)&&a.removeChild(a.Rc):a.ud?Dd(a.Rc.displayObject(),a.ud.displayObject()):a.Me(a.Rc,0))} +function gS(a,b){a.HH&&a.HH&&a.tf(a.HH.displayObject())&&a.removeChild(a.HH.displayObject());a.ic&&a.ic&&(a.tf(a.ic.displayObject())&&a.removeChild(a.ic.displayObject()),a.ic.removeChild(a.kq),a.ic.removeChild(a.JE),Ne(a,a.ic.displayObject(),"mouseover",a.sq,a),Ne(a,a.ic.displayObject(),"mouseout",a.km,a));a.ic=b;a.ic&&(a.ud?Dd(a.ic.displayObject(),a.ud.displayObject()):a.Me(a.ic.displayObject(),0),x(a,a.ic.displayObject(),"mouseover",a.sq,a),x(a,a.ic.displayObject(),"mouseout",a.km,a),a.ic.O(a.kq), +a.ic.O(a.JE));bS(a);fS(a);a.xb()} +class hS extends P{constructor(a,b,c,d,e,f=!0){super({F:"universal-side-panel",Yb:"ASIDE"});this.G=b;this.B=c;this.I=d;this.K=e;this.Ua=a.Aa.Xc;this.sg=a.outline;this.xU=this.wU=void 0;this.ra=1;this.ic=void 0;this.HH=null;this.vZ=f;this.kq=$R(this);B(this,this.kq);this.JE=new P({F:"float-panel-overlay"});B(this,this.JE);(this.ud=aS(this))&&B(this,this.ud);(this.Rc=cS(this))&&B(this,this.Rc);(this.fc=dS(this))&&M(this,this.fc);this.dN=E(this);this.wZ=E(this);z(this,this.B.vc(),this.oe,this);z(this, +this.Ua.pb,this.i$,this);this.oe()}show(a){this.vZ=a;L(this,"transition","margin 300ms ease-in-out");Gi(()=>L(this,"transition",""),this,300);this.wZ.C()}showed(){return this.vZ}showedStateChanged(){return this.wZ}setScale(a,b){this.ra=a;super.setScale(a,b)}J(a){this.visible()!=a&&(super.J(a),a&&this.xb())}qa(a){super.qa(a);this.fc&&this.fc.qa(a)}i$(){this.Ua.sd?this.ud||(this.ud=aS(this),B(this,this.ud)):this.ud&&(this.removeChild(this.ud.displayObject()),Se(this,this.ud),this.ud=null);this.Ua.hh? +this.Rc||(this.Rc=cS(this),B(this,this.Rc)):this.Rc&&(this.removeChild(this.Rc.displayObject()),Se(this,this.Rc),this.Rc=null);var a=this.Ua.showOutline,b=this.Ua.ye;if(a||b)if(this.fc){this.fc.fS(a);this.fc.eS(b);a=this.fc;if(a.Vb||a.zd)if(a.Yi){a.Yi.fS(a.Vb);a.Yi.eS(a.zd);b=a.Yi;if(b.Vb&&b.zd)b.Jc||(b.Jc=b.Np(),b.Jc&&M(b,b.Jc,0)),b.fl&&(Se(b,b.fl),b.fl=null);else if(b.Vb||b.zd)b.fl||(b.fl=HO(b),b.fl&&M(b,b.fl,0)),b.Jc&&(Se(b,b.Jc),b.Jc=null);b.B_()}else a.Yi=CP(a),a.Yi&&M(a,a.Yi);else Se(a,a.Yi), +a.Yi=null;a.zd?(a.Ws||DP(a),a.X("mode","notes"),a.LF.xb()):a.Ws&&(Se(a,a.Ws),a.Ws=null);a.Vb?(a.it||a.ez(),a.X("mode","outline")):a.it&&(Se(a,a.it),a.it=null)}else(this.fc=dS(this))&&M(this,this.fc);else Se(this,this.fc),this.fc=null;this.oe()}sq(a){a.relatedTarget&&Md(this.ic.displayObject(),a.relatedTarget)||(a=Sh(this.kq.displayObject()),"number"!==typeof a&&(a=0),this.wU=new TC(this.kq.displayObject(),a,1,150),this.wU.play())}km(a){a.relatedTarget&&Md(this.ic.displayObject(),a.relatedTarget)|| +eS(this)}oe(){-1!=this.B.ma()&&(fS(this),this.GP(),this.fZ(),this.xb())}fZ(){if(this.ud&&-1!=this.B.ma()){var a=this.B.fa().Qf();a?(a=a.Zd())&&a.logo()?this.ud.yu(a):this.uB():this.uB()}}uB(){const a=this.G.Zd();a&&a.logo()?this.ud.yu(a):this.ud.yu(null)}GP(){if(this.Rc&&-1!=this.B.ma()){var a=this.B.fa();this.Rc.nD(a.Qf())}}Qa(){if(this.visible()){var a=!!this.ud&&this.ud.visible(),b=!!this.Rc&&this.Rc.visible(),c=!!this.fc&&this.fc.visible(),d=!!this.ic&&!!this.tf(this.ic.displayObject());a&&this.ud.X("with-delimiter", +b||!b&&!d&&c);b&&this.Rc.X("with-delimiter",c);this.Rc&&this.Rc.xb()}}vd(){super.vd();Fd(this.JE.displayObject());Fd(this.kq.displayObject())}};function iS({sd:a,fa:b,Ca:c,Qf:d}){const e=d&&d.Zd(),f=e&&e.logo(),g=(c=c.Zd())&&c.logo();return a&&(!!b&&!!d&&!!e&&!!f||!!c&&!!g)}function jS({V:a,Ap:b,Ca:c,CD:d}){let e=null;0<=a.ma()&&(e=a.fa());a=e&&e.Qf();c=iS({sd:b.sd,Qf:a,Ca:c,fa:e});return!!(b.ye||b.showOutline||c||b.hh&&e&&a||d&&d.hf)};function kS(a,b){a.Gb=b;b=a.Fg;b.Gb=a.Gb;a=b.B.$().Ec();const c=b.ob.displayObject();Ne(b,c,Km,b.vX,b);Pe(b,a,b.EW,b);"MaximizedVideo"==b.Gb&&(x(b,c,Km,b.vX,b),b.ls=null,z(b,a,b.EW,b))}function lS(a,b){const c=a.G.slides().la(b).jp();let d;for(let e=0;e{this.x_()});Gt(a,O(this,"button"));L(a,"padding","9px 10px");z(this,a.ja,()=>{this.Fb.show(!this.Fb.showed())});return a}};function tS(a){return(a=a.B.Oa())?a.skin().controlPanel().displayObject():null} +class uS extends wg{constructor({V:a,u2:b,A0:c}){super();this.B=a;this.g8=this.tv=c;this.l8=this.us=b;z(this,a.vc(),this.I9,this);this.JX=E(this)}I9(){var a,b=this.B.Oa();(a=(b=b&&b.skin().topPanel())?b.displayObject():null)&&F(a,"height",`${this.us.offsetHeight}px`);(b=tS(this))&&F(b,"height",`${this.tv.offsetHeight}px`);b=!1;a=a||this.l8;a!=this.us&&(Gd(a,this.us),this.us=a,b=!0);a=tS(this)||this.g8;a!=this.tv&&(Gd(a,this.tv),this.tv=a,b=!0);b&&this.JX.C()}};function vS(a,b){switch(b){case "pen":return Z(a.K,"marker_pen");case "highlighter":return Z(a.K,"marker_highlighter");case "eraser":return Z(a.K,"marker_eraser");default:return null}} +class wS extends P{constructor({type:a,ga:b,Jg:c,xa:d}){super({F:"marker-panel-button",tabIndex:0});this.K=d;this.X("mobile",Ii);this.X("type",a);a=this.zn(a);d=new P({ka:O(this,"text")});It(d,b,c);a&&M(this,a);M(this,d)}zn(a){var b=vS(this,a);if(!b)return null;a=new P({F:"item-icon"});Gt(a,O(this,"item-icon"));b=new P({ka:O(a,"item-icon-image"),za:b});M(a,b);return a}} +function xS(a,b,c){c=new wS({type:b,ga:a.I,Jg:c,xa:a.K});z(a,c.ja,()=>a.rq(b),a);x(a,c.displayObject(),"keydown",d=>{if(13==d.keyCode||32==d.keyCode)a.rq(b),d.stopPropagation(),d.preventDefault()},a);M(a,c);return c}function yS(a,b){a.nU=b;a.Xf.has("endDrawing")&&a.Xf.get("endDrawing").qa(b)} +class zS extends P{constructor(a,b){super({F:"marker-panel"});this.Xf=new Map;this.qU=this.nU=!0;this.k_=E(this);this.rU=E(this);this.Cz=[];this.I=a;this.K=b}open(){for(const a of this.Xf.values())a&&Se(this,a);this.tp();this.AK();this.Cz=[]}AK(){var a=xS(this,"pen","PB_DRAWING_TOOLS_PEN");this.Xf.set("pen",a);a=xS(this,"highlighter","PB_DRAWING_TOOLS_HIGHLIGHTER");this.Xf.set("highlighter",a);a=xS(this,"eraser","PB_DRAWING_TOOLS_ERASER");this.Xf.set("eraser",a);a=new P({ka:O(this,"separator")}); +this.O(a);a=xS(this,"eraseAll","PB_DRAWING_TOOLS_ERASE_ALL");this.Xf.set("eraseAll",a);a.qa(this.qU);a=xS(this,"endDrawing","PB_DRAWING_TOOLS_END_DRAWING");this.Xf.set("endDrawing",a);a.qa(this.nU)}rq(a){(a={pen:"line",highlighter:"marker",eraser:"eraser",endDrawing:"nothing"}[a])?this.k_.C(a):this.rU.C()}freeze(){this.Cz=[];for(const a of this.Xf.values())a.enabled()&&(a.qa(!1),this.Cz.push(a))}};class AS extends EO{constructor({F:a,V:b}){super({F:a,V:b});this.N_=16}};class BS extends LQ{constructor(a,b){super(a);this.nq=b;L(this.nq,"height","100%");this.ky(this.nq)}};const CS={markerTools:"PB_TITLE_PANEL_MARKER_TOOLS",attachments:"PB_TITLE_PANEL_ATTACHMENTS",marker:"PB_DRAWING_TOOLS_PEN",highlighter:"PB_DRAWING_TOOLS_HIGHLIGHTER",eraser:"PB_DRAWING_TOOLS_ERASER",presenterInfo:"PB_TITLE_PANEL_PRESENTER_INFO",notes:"PB_TITLE_PANEL_NOTES",outline:"PB_TITLE_PANEL_OUTLINE"};function DS(a,b,c,d){b&&(a=d?"":a.I.ia(CS[c]),b.ha(a))}function ES(a){a.buttons().forEach(b=>b.Dc(!1))} +function FS(a,{xba:b,Mba:c,jca:d,P$:e}){var f=a.yd;f&&f.qa(b);(b=a.Vj)&&b.qa(c);(c=a.xm)&&c.qa(d);(a=a.kl)&&a.qa(e)} +class GS extends P{constructor({settings:a,xa:b,ga:c}){super({F:"buttons-container"});this.K=b;this.I=c;this.mZ=E(this);this.pZ=E(this);this.tZ=E(this);this.qZ=E(this);this.rZ=E(this);this.ml=this.Vj=this.xm=this.yd=this.kl=null;this.tn={};this.H=a;this.Nw="nothing";a=Z(b,"attachments_button_icon");const d=Z(b,"marker_panel_button_icon"),e=Z(b,"presenter_info_button_icon"),f=Z(b,"notes_button_icon");b=Z(b,"outline_button_icon");this.tn.attachments={icon:a,label:c.ia("PB_TITLE_PANEL_ATTACHMENTS")}; +this.tn.markerTools={icon:d,label:c.ia("PB_TITLE_PANEL_MARKER_TOOLS")};this.tn.marker={icon:d,label:c.ia("PB_DRAWING_TOOLS_PEN")};this.tn.highlighter={icon:d,label:c.ia("PB_DRAWING_TOOLS_HIGHLIGHTER")};this.tn.eraser={icon:d,label:c.ia("PB_DRAWING_TOOLS_ERASER")};this.tn.presenterInfo={icon:e,label:c.ia("PB_TITLE_PANEL_PRESENTER_INFO")};this.tn.notes={icon:f,label:c.ia("PB_TITLE_PANEL_NOTES")};this.tn.outline={icon:b,label:c.ia("PB_TITLE_PANEL_OUTLINE")};this.nv();z(this,this.I.og,this.DP,this)}buttons(){return[this.kl, +this.yd,this.xm,this.Vj,this.ml].filter(a=>!!a)}invalidate(){Se(this,this.yd);Se(this,this.Vj);Se(this,this.xm);Se(this,this.kl);Se(this,this.ml);this.nv()}nv(){if(this.H.visible){var a=this.H.buttonsOrder;for(let b=0;bc);switch(a){case "logo":return b.indexOf(this.le);case "courseTitle":return b.indexOf(this.Mh);default:return-1}}eC(){if(this.Cb){var a=this.Cb.logo();a&&(a.uf()?this.UW(a):(a.load(),z(this,a.Ar(),this.UW,this)))}}uB(){const a=this.G.Zd(),b=a&&a.logo();a&&b?(this.le&&this.le.J(!0),this.Cb!=a&&OS(this,a)):(this.Cb=null,this.le&&(this.le.J(!1),HS(this.le)))}UW(a){if(this.le){var b=this.le;b.hm.tp();const c=a.CC();b.hm.O(c);const d=Ni?a.width():c.width;a=Ni?a.height():c.height; +b=Math.min(1,Math.min(b.jq/d,b.Wk/a));Nh(c,d*b,a*b)}}};function QS(a){const b=new GS({parent:a,settings:a.Qb,xa:a.K,ga:a.I});Gt(b,O(a,"container"));var c=0!=a.G.resources().Ai().count(),d=b.kl;d&&d.qa(c);z(a,b.tZ,a.xo,a);z(a,b.mZ,a.xB,a);z(a,b.rZ,a.Vb,a);z(a,b.qZ,a.zd,a);z(a,b.pZ,a.d9,a);return b}function RS(a){return a.Ed.Vj?new AS({F:"notes-popup",V:a.B}):null}function SS(a){a=new MQ(a.Ed.ml.displayObject(),a.fc);a.X("outline-popup",!0);return a} +function TS(a){if(a.Ed.yd){const b=new zS(a.I,a.K);yS(b,!1);z(a,b.k_,a.rq,a);z(a,b.rU,a.o6,a);return b}return null}function US(a){a.Ed.buttons().forEach(b=>{KP(a.Ja,b.displayObject())})}function VS(a){const b=!!a.B.fa().Qf(),c=!a.B.Oa()&&!a.B.tb()&&!a.B.fb(),d=WS(a);FS(a.Ed,{Mba:d,xba:c,jca:b,P$:!!a.G.resources().Ai().count()});c||a.rq("nothing")}function XS(a){a.Pb&&a.Pb.on(a.Ua.he?YS(a):ZS(a))} +function $S(a,b){switch(b.buttonType){case "attachments":const c=b.pressed;b=b.relativeElement;const d=aT(a,b);OP(a.Ja,c,b,{jn:"bottom"});d.focus();break;case "outline":a.NO(b)}}function ZS(a){return a.Fb.showed()?Z(a.K,"arrows_right"):Z(a.K,"arrows_left")}function YS(a){return a.Fb.showed()?Z(a.K,"arrows_left"):Z(a.K,"arrows_right")}function WS(a){return(a=a.B.fa().Ei())&&""!=a.text().replace(/[\s\xa0]+/g," ").replace(/^\s+|\s+$/g,"")} +function aT(a,b){b=new LQ(b);b.ky(bT(a));b.X("attachments",!0);IP(a.Ja,b);return b}function bT(a){const b=new sN(a.G.resources().Ai(),a.K,a.I);Gt(b,"attachments-popup");z(a,b.aT,()=>{JP(a.Ja)},a);return b}function cT(a,b){OP(a.Ja,b.pressed(),b.displayObject(),{jn:"bottom",align:"left"})} +class dT extends P{constructor({Lu:a,rk:b,Ap:c,Ca:d,V:e,wj:f,xa:g,ga:h,sidePanelController:l}){super({F:"top-panel",zf:!0});this.Qb=a;this.sg=b;this.Ua=c;this.Fb=l;this.G=d;this.B=e;this.Ja=f;this.K=g;this.I=h;this.dB=this.cO=this.gw=this.Cb=null;this.yM=E(this);this.XV=E(this);this.iL=E(this);this.Ga=new P({F:"top-main-container"});M(this,this.Ga);this.X("reversed",this.Ua.he);this.Ga.X("reversed",!this.Qb.gu);this.Ed=QS(this);M(this.Ga,this.Ed);this.ZE=this.zK();M(this.Ga,this.ZE);(this.Pb=this.hz())&& +M(this,this.Pb);this.fc=this.ez();this.nq=RS(this);this.fc&&(B(this,this.fc),a=SS(this),IP(this.Ja,a));(this.Sg=TS(this))&&B(this,this.Sg);z(this,this.Qb.pb,this.ho,this);z(this,this.G.qK,()=>NS(this.ZE),this);z(this,this.B.vc(),this.io,this);z(this,this.B.Mu(),this.B7,this);z(this,this.B.zS(),this.A7,this);z(this,this.Ja.np(),this.lw,this);z(this,this.Ua.pb,this.p7,this)}ho(){JP(this.Ja);US(this);this.ZE.invalidate();this.Ga.X("reversed",!this.Qb.gu);this.Ed.invalidate();VS(this);this.xb()}p7(){this.X("reversed", +this.Ua.he);XS(this)}yp(a){this.Fb=a;this.Ua.visible&&this.Fb&&this.Fb.visible()?this.Pb||(this.Pb=this.hz())&&M(this,this.Pb):(Se(this,this.Pb),this.Pb=null)}qa(a){super.qa(a);this.Ed.qa(a)}hz(){if(this.Fb&&this.Fb.visible()){const a=new iM({type:"uikit-link-button",size:"small",icon:{element:this.Ua.he?YS(this):ZS(this),Ne:"left"}});L(a,"padding","4px");z(this,this.Fb.showedStateChanged(),()=>{XS(this)});z(this,a.ja,()=>{this.Fb.show(!this.Fb.showed())});return a}return null}zK(){const a=new PS({Lu:this.Qb, +Ca:this.G,V:this.B});Gt(a,O(this,"container"));a.X("reversed",this.Ua.he);return a}io(){if(-1!=this.B.ma()){this.dB=null;var a=WS(this);this.gw&&this.gw.visible()&&!a&&JP(this.Ja);VS(this);a=this.B.fa().Qf();const b=!!a;this.cO&&this.cO.visible()&&(b?this.cO.content().nD(a):JP(this.Ja));NS(this.ZE)}}NO(a){const b=a.pressed;a=a.relativeElement;if(!this.dB){const c=new EP({Fu:!1,Gu:!0,rk:this.sg,xa:this.K,ga:this.I,V:this.B,slides:this.G.slides()});c.ht.Ko.sR();this.dB=new MQ(a,c);this.dB.X("outline-popup", +!0);IP(this.Ja,this.dB)}OP(this.Ja,b,a,{jn:"bottom"})}ez(){return this.Ed.ml?new EP({Fu:!1,Gu:!0,rk:this.sg,xa:this.K,ga:this.I,V:this.B,slides:this.G.slides()}):null}Vb(a){a.Dc(!a.pressed());this.fc||(this.fc=this.ez())&&B(this,this.fc);const b=a.pressed(),c=SS(this);IP(this.Ja,c);b!=a.pressed()&&a.Dc(b);cT(this,a)}xB(a){a.Dc(!a.pressed());const b=a.pressed(),c=aT(this,a.displayObject());b!=a.pressed()&&a.Dc(b);cT(this,a);c.focus()}zd(a){this.nq||(this.nq=RS(this))&&B(this,this.nq);if(!this.gw){var b= +new BS(this.Ed.Vj.displayObject(),this.nq);b.X("notes-popup",!0);this.gw=b;IP(this.Ja,this.gw)}b=a.pressed();a.Dc(!b);cT(this,a)}d9(a){var b=!a.pressed();a.Dc(b);if(b){this.Sg||(this.Sg=TS(this))&&B(this,this.Sg);b&&this.Sg.open();b=a.pressed();var c=this.Ja.createPopup(a.displayObject(),this.Sg,"marker");b!=a.pressed()&&a.Dc(b);cT(this,a);this.XV.C();c.focus()}else JP(this.Ja)}xo(a){const b=this.B.fa().Qf();a.Dc(!a.pressed());const c=new YR(this.I,this.K,!0);Gt(c,O(this,"presenter-info"));const d= +a.pressed();this.bO=this.Ja.createPopup(a.displayObject(),c,"presenter");d!=a.pressed()&&a.Dc(d);cT(this,a);c.nD(b);c.xb();this.bO&&this.bO.focus()}rq(a){if(this.Sg){var b=this.Ed;if(b.yd)switch(b.Nw=a,b.Nw){case "nothing":b.yd.ha(b.I.ia("PB_TITLE_PANEL_MARKER_TOOLS"));break;case "line":b.yd.ha(b.I.ia("PB_DRAWING_TOOLS_PEN"));break;case "marker":b.yd.ha(b.I.ia("PB_DRAWING_TOOLS_HIGHLIGHTER"));break;case "eraser":b.yd.ha(b.I.ia("PB_DRAWING_TOOLS_ERASER"))}this.yM.C(a);JP(this.Ja);yS(this.Sg,"nothing"!= +a)}}o6(){this.iL.C();JP(this.Ja)}lw(){ES(this.Ed);this.bO=this.gw=null}B7(){const a=this.Ed.yd;a&&this.Sg&&(a.qa(!1),this.Sg.freeze())}A7(){var a=this.Ed.yd;if(a&&this.Sg){a.qa(!0);a=this.Sg;for(const b of a.Cz)b.qa(!0);a.Cz=[]}}Qa(a){var b=this.Pb?`calc(100% - ${this.Pb.width()}px)`:"100%";L(this.Ga,"width",b);b=this.displayObject();const c=qn().getTransform(b);b=this.Ed;a=480>a*(c?c.pd:1);DS(b,b.kl,"attachments",a);DS(b,b.yd,"markerTools",a);DS(b,b.xm,"presenterInfo",a);DS(b,b.Vj,"notes",a);DS(b, +b.ml,"outline",a)}};function eT(a,b,c,d){var e,f=d=null!=(e=d)?e:fT(a);e=a.OE();var g=new cd(a.EB()+24,gT(a)+16);var h=new cd(b,c);e.width+g.width=c?c:Math.min(TN(b.width,a.width,d.width),TN(b.height,a.height,d.height))}function jT(a){a=iT(a);return UN(a)}function hT(a){return jC()||a.C4} +function gT(a){let b=0;if(a.Jc){const c=a.Jc.us,d=a.Jc.tv;c&&(b+=Vh(c).height);b+=Vh(d).height}else b+=a.wb&&a.wb.visible()?a.wb.height():0,b+=a.ub&&a.ub.visible()?a.ub.height():0;b+=a.va&&a.va.visible()?a.va.height():0;return b+=a.Xd&&a.Xd.visible()?a.Xd.height():0}function fT(a){if(hT(a)||a.zz)return!0;const b=eT(a,a.Yw,a.Xw,!1);return b.width>a.Yw||b.height>a.Xw} +class kT{constructor({Ca:a,kk:b,Yba:c,Lc:d,controlPanel:e,Xc:f,lc:g,separator:h}){this.G=a;this.Qg=b;this.Jc=c;this.wb=d;this.ub=e;this.Z=f;this.va=g;this.Xd=h;this.zz=this.G.settings().kr().fitToWindow();this.C4=1==Oi().fit_content;this.Xw=this.Yw=0}oD(a,b){this.Yw=a;this.Xw=b}OE(){let a=this.G.slideWidth(),b=this.G.slideHeight(),c=Math.max(540/a,540/b);c=Math.max(c,1);return new cd(a*c,b*c)}EB(){return this.Z?280:0}};class lT extends P{constructor(){super({F:"closed-caption-panel"});x(this,this.displayObject(),"click",this.UZ,this);x(this,this.displayObject(),Km,this.UZ,this,Nm);const a=new P({ka:O(this,"scroll-area")});M(this,a);this.qg=new P({F:"closed-captions"});M(a,this.qg);this.ua=new wM({Gr:a});B(this,this.ua);this.O(this.ua.jk())}UZ(a){a.stopPropagation()}ZR(a){this.qg.ha(a)}Qa(a,b){super.Qa(a,b);a=Zh(this.displayObject());a=a.top&&a.bottom?a.top+a.bottom:0;this.ua.Ci(this.height()-a,this.qg.height())}} +;function KQ(a){a.kd.visible()&&(a.kd.J(!1),a.Yy.C())}function mT(a){const b=new SP(a.aY);B(a,b);z(a,b.$X,()=>{a.vk(!0)},a);z(a,b.np(),()=>{a.vk(!1)},a);return b}function nT(a){const b=new RR({kc:a.D,xa:a.K,controlPanel:a.ub,oca:a.um});B(a,b);z(a,b.QP,a.E7,a);return b}function oT(a){return new kT({Ca:a.G,kk:a.Qg,Yba:a.Jc,Lc:a.wb,controlPanel:a.ub,Xc:a.Z,lc:a.va,separator:a.Xd})}function pT(a,b){a.wb&&a.wb.qa(b);a.ub&&a.ub.qa(b);a.Z&&a.Z.qa(b)} +function qT(a,b){var c=a.Ov;c="MaximizedVideo"==c.Gb?c.Fg.video().width():c.R.width();a.kd.Kb(c/b);const d=new gm;d.translate((c-c/b)/2,110*(1-b)/2);d.scale(b,b);on(a.kd.displayObject(),d);a.kd.xb()}function rT(a){a.Qb.visible||!a.Ua.visible||a.Es||a.Pb?(a.Qb.visible||!a.Ua.visible||a.Es)&&a.Pb&&a.Pb&&(a.Ga.removeChild(a.Pb),Se(a,a.Pb),a.Pb=null):a.hz();a.Pb&&a.Ga.Me(a.Pb,0)} +function sT(a){(a.FL||a.Lz||a.ps.visible)&&!a.ub?(a.ub=a.MT(),B(a,a.ub)):a.FL||a.Lz||a.ps.visible||!a.ub||a.zY();a.ub&&a.Ga.O(a.ub)}function tT(a){a.Xd=new P({F:"universal-skin-separator"});B(a,a.Xd)}function uT(a){a.wb=new dT({Lu:a.Qb,rk:a.H.outline,Ap:a.Ua,sidePanelController:a.Z,Ca:a.G,V:a.rc,wj:a.Ja,xa:a.K,ga:a.I});a.wb.X("hide-controls",!a.Qb.visible);B(a,a.wb);z(a,a.wb.XV,a.B6,a);z(a,a.wb.iL,a.n6,a);DN(a.Qb,"markerTools")&&z(a,a.wb.yM,b=>rO(a.zb,b))} +class vT extends P{constructor({kc:a,settings:b,ga:c,xa:d}){super({F:"universal"});Ib?(this.X("ie",!0),sj&&this.X("ie9",!0)):Mb?this.X("webkit",!0):Hb?this.X("opera",!0):Lb&&this.X("gecko",!0);L(this,"opacity",0);this.X("embedded-mode",Kj);this.D=a;this.H=b;this.I=c;this.K=d;this.md=new cd(0,0);this.G=this.D.Ca();this.R=this.D.view();this.rc=this.R.Cd();this.B=this.R.V();this.Qg=this.D.kk();this.aY=new P({F:"popups-layer"});this.Ja=mT(this);this.Nv=E(this);this.YM=E(this,this.Ja.np());this.Yy=E(this); +this.y_=E(this);a=new P({F:"main-container"});M(this,a);this.Ga=a;M(this,this.aY);this.kd=new lT;B(this,this.kd);this.kd.J(!1);const {V0:e,W0:f,WQ:g}=RQ(this.G.slides());this.FL=e;this.Es=f;this.Lz=g;this.Qb=this.H.Aa.Lc;this.ps=this.H.Aa.controlPanel;this.gj=this.ps.lc;this.Ua=this.H.Aa.Xc;this.zb=this.xK();a=new P({F:"presentation-container"});M(this.Ga,a);this.YN=a;M(this.YN,this.zb);this.um=this.Xd=this.va=this.Z=this.ub=this.Pb=this.wb=null;this.Fg=nT(this);this.Tk();a=new pS({kc:this.D,settings:this.H, +CD:this.Fg,BC:this.zb,Xc:this.Z});B(this,a);z(this,a.Nv,this.EA,this);this.Ov=a;this.Jc=this.Np();this.Sa=oT(this);z(this,this.D.BY,this.W6,this);z(this,this.B.vc(),this.io,this);z(this,this.Qg.tL,this.HW,this);z(this,this.Qb.Cc,this.z7,this);z(this,this.ps.Cc,this.ho,this);z(this,this.gj.Cc,this.ho,this);z(this,this.Ua.Cc,this.ho,this);z(this,this.Ua.pb,this.ho,this);this.HW()}scale(){var a=this.Sa;({scale:a}=eT(a,a.Yw,a.Xw));return a}np(){return this.YM}initialize(a){lS(this.Ov,a)}resize(a,b){if(a&& +b){this.md=new cd(a,b);Mb&&Nh(document.body,`${a}px`,`${b}px`);var c=Kj||hT(this.Sa)?new Wf(0,0,a,b):new Wf(16,16,a-32,b-32);this.H.accessibilityModeEnabled&&!jC()&&(c.width-=150);this.Sa.oD(c.width,c.height);hT(this.Sa)?(super.resize(a,b),this.move(0,0)):({LI:c}=eT(this.Sa,c.width,c.height),this.move(Math.floor((a-c.width)/2),Math.floor((b-c.height)/2)),super.resize(c.width,c.height));L(this,"opacity","")}}pD(a){this.ub&&this.ub.pD(a)}g2(a){this.wb&&$S(this.wb,a)}Qa(a,b){this.Ui(a,b);this.Ov.invalidate()}Ui(a){var b= +iT(this.Sa);const c=jT(this.Sa);var d=this.Sa;({LI:g}=eT(d,d.Yw,d.Xw));var e=jT(d),f=gT(d)*e;e*=d.EB();d=iT(d);var g=(new cd(g.width-(e+24*d),g.height-(f+16*d))).round();f=g.height/b;d="100%";this.Z&&this.Z.showed()&&(d=`calc(100% - ${this.Z.width()*c}px)`);L(this.Ga,"width",d);this.Uz(c);if(this.Jc){if(d=this.Jc.us)wn(d,c),yi(d,"0 0"),F(d,"width",`calc(100% / ${c})`);d=this.Jc.tv;wn(d,c);yi(d,"0 0");F(d,"width",`calc(100% / ${c})`);F(d,"top","")}this.wb&&!this.Jc&&(wn(this.wb.displayObject(),c), +yi(this.wb.displayObject(),"0 0"),F(this.wb.displayObject(),"width",`calc(100% / ${c})`));this.zb.invalidate(g,fT(this.Sa));this.zb.setScale(b);d=this.Jc?this.Jc.us:this.wb&&this.wb.displayObject();e=8*b;const h=12*b;L(this.YN,"margin-top",`${-(d?Vh(d).height:0)*(1-c)}px`);L(this.YN,"padding",`${e}px ${h}px`);this.ub&&(this.ub.eJ(f-20),this.ub.xb());this.Z&&this.Z.visible()&&(this.Z.setScale(c),L(this.Z,"height",`calc(100% / ${c})`),this.Z.xb(),this.Ua.he?this.JP(c):this.KP(c));f=this.scale();a={left:12+ +(this.Z&&this.Z.showed()&&this.Ua.he?this.Z.width():0),right:a/f-12};const {left:l,right:n}=a;this.Ja.Jl(l,n,g.height);this.Ja.setScale(b,b);JP(this.Ja);b=Kj?0:Math.round(7*c);L(this,"-webkit-border-radius",`${b}px`);L(this,"-moz-border-radius",`${b}px`);L(this,"border-radius",`${b}px`);qT(this,c)}JP(a){this.Z.showed()?L(this.Z,"margin-left",""):L(this.Z,"margin-left",`${-280*a}px`);L(this.Z,"margin-right",`${-280*(1-a)}px`)}KP(a){this.Z.showed()?L(this.Z,"margin-right",`${-280*(1-a)}px`):L(this.Z, +"margin-right","-280px");L(this.Z,"margin-left","")}Uz(a){if(this.va){const b=this.va.displayObject();wn(b,a);yi(b,"0 0");F(b,"width",`calc(100% / ${a})`);F(b,"top","")}}E7(){this.Z&&this.Z.xb()}EA(){this.X("side-panel-hidden",!this.Z||!this.Z.visible());this.resize(this.md.width,this.md.height);this.kd.visible()&&mS(this.Ov).appendChild(this.kd.displayObject());qT(this,this.scale());this.Nv.C()}W6(a){const {LI:b}=eT(this.Sa,a.width,a.height);a.width=b.width;a.height=b.height;a.q0=!0}io(){var a=this.B.Oa(), +b=this.B.fb();const c=this.B.tb();this.va&&this.va.J(!a&&!b&&!c);this.Xd&&this.Xd.J(!this.va||!this.va.visible());(a||b||c)&&KQ(this);JP(this.Ja);this.Wz();Se(this,this.Sa);this.Sa=oT(this);a=this.Ov;b=this.Z;a.Z!==b&&(a.Z=b,a.Z&&a.Z.dN.addHandler(a.YZ,a),kS(a,a.Z?"Full":"NoSidebar"),a.Ui());this.Qt();this.EA();this.wb&&this.wb.yp(this.Z);this.Pb&&this.Pb.yp(this.Z)}Qt(){if(this.kd){const a=this.B.fa().Ei();this.kd.ZR(a?a.text():"")}}HW(){document.body.style.overflow=fT(this.Sa)?"hidden":"auto";sj|| +requestAnimationFrame(()=>{this.resize(this.md.width,this.md.height)})}xK(){return new sO(this.D)}Tk(){this.Wz();this.bM();rT(this);this.Jv();sT(this)}Jv(){!this.Xd&&tT(this);this.gj.visible?(!this.va&&this.rs(),this.Xd.J(!1)):(this.va&&this.iB(),this.Xd.J(!0));this.va&&M(this.Ga,this.va);this.Xd&&M(this.Ga,this.Xd)}iB(){Se(this.Ga,this.va);this.um=this.va=null}rs(){this.va=new KR({slides:this.G.slides(),settings:this.gj,V:this.rc});this.um=new NR({lc:this.va,V:this.rc,Ca:this.G,settings:this.gj}); +B(this,this.va)}bM(){this.HM()?uT(this):this.IM()&&(this.Ga.removeChild(this.wb),Se(this,this.wb),this.wb=null);this.wb&&this.Ga.Me(this.wb,0)}HM(){return(this.Es||this.Qb.visible)&&!this.wb}IM(){return!(this.Es||this.Qb.visible)&&!!this.wb}hz(){this.Pb=new sS({Lu:this.Qb,Ap:this.Ua,xa:this.K,sidePanelController:this.Z});B(this,this.Pb)}MT(){return new VQ({skinSettings:this.H,Ca:this.G,V:this.rc,soundController:this.R.soundController(),wj:this.Ja,ga:this.I,xa:this.K,kk:this.Qg,wx:this})}zY(){this.Ga.removeChild(this.ub); +Se(this,this.ub);this.ub=null}Wz(){!this.Z&&this.Kz()&&this.Ua.visible?this.GK():!this.Z||this.Kz()&&this.Ua.visible||this.iO();this.Z&&this.Me(this.Z,1);this.y_.C(this.Z)}Kz(){return jS({Ca:this.G,V:this.B,CD:this.Fg,Ap:this.Ua})}GK(){this.Z=new hS(this.H,this.G,this.rc,this.I,this.K);B(this,this.Z);this.X("left-panel",this.Ua.he);z(this,this.Z.showedStateChanged(),()=>this.xb())}iO(){Se(this,this.Z);this.Z=null}Np(){if(this.ub){const a=new uS({V:this.B,u2:this.wb&&this.wb.displayObject(),A0:this.ub.displayObject()}); +B(this,a);z(this,a.JX,this.xb,this);return a}return null}B6(){var a=this.wb;var b=this.zb;b=b.vb?b.vb.xi():!0;a.Sg&&(a=a.Sg,b=!b,a.qU=b,a.Xf.has("eraseAll")&&a.Xf.get("eraseAll").qa(b))}n6(){this.zb.hI()}ho(){this.Tk();Se(this,this.Jc);this.Jc=this.Np();Se(this,this.Sa);this.Sa=oT(this);Se(this,this.Fg);this.Fg=nT(this);this.EA();this.X("left-panel",this.Ua.he);this.wb&&this.wb.yp(this.Z);this.Pb&&this.Pb.yp(this.Z)}z7(){this.ho();this.wb&&(VS(this.wb),this.wb.X("hide-controls",!this.Qb.visible))}vd(){super.vd(); +Fd(this.kd.displayObject())}c2(){this.kd.visible()||(this.kd.J(!0),this.Qt(),mS(this.Ov).appendChild(this.kd.displayObject()),this.kd.xb(),this.Yy.C())}};function wT(a,b){const c=a.R,d=b.Zw,e=b.L();a.Ln.suspend();c.setOverlayDisplayed(!0);a.ll.C();FM(a.Gk,{mn:"PB_RESUME_PRESENTATION_WINDOW_TEXT",icon:Z(a.K,"mb_question_icon"),buttons:[{Jg:"PB_MESSAGE_BOX_YES",result:"yes"},{Jg:"PB_MESSAGE_BOX_NO",result:"no"}]}).then(f=>{a.Ln.resume();c.setOverlayDisplayed(!1);a.Qk.C();a.Jn.C();"yes"==f?(a.pa.initialize(e),d.resume(e,!0)):(f=a.B.Pf(),d.start(f,!0))})} +class xT extends wg{constructor(a,b,c,d,e){super();e&&LM(e,this.resize,this);a.kk();var f=b.Aa;e=f.Lc;const g=f.controlPanel;f=f.Xc;e.sd&&f.visible&&(e.sd=!1,f.sd=!0);g.visible&&!kC()&&(g.zp=!1);this.D=a;z(this,this.D.uy(),this.fo,this);z(this,this.D.Qx(),this.x6,this);this.H=b;this.I=c;this.K=d;this.G=this.D.Ca();this.R=this.D.view();this.rc=this.R.Cd();z(this,this.rc.Yx(),this.$n,this);this.B=this.R.V();this.Ff=this.fz();this.wF=new SM(this.D,new fM);B(this,this.wF);a=B(this,new vT({kc:this.D,settings:this.H, +ga:this.I,xa:this.K}));a.Ga.vk(!0);a.Z&&a.Z.vk(!0);z(this,a.Qe(),this.K7,this);z(this,a.Nv,this.EA,this);this.pa=a;this.Gg=B(this,new EM(this.pa.displayObject()));this.Gk=new GM({ga:this.I,zJ:this.Gg});this.Cw=new SN({Ca:this.G,V:this.B,settings:this.H,ga:this.I,view:this.pa,sidePanelController:null});B(this,this.Cw);this.Ln=new PM(this.B.lu());this.ll=E(this);this.Qk=E(this);this.Jn=E(this);this.Is(this.Ff,this.D.Tr());z(this,this.pa.y_,this.Cw.ES,this.Cw)}resize(a,b){this.pa.resize(a,b)}displayObject(){return this.pa.displayObject()}fz(){const a= +new TM;this.R.displayObject().appendChild(a.displayObject());return a}K7(){const a=this.pa.scale();wn(this.Ff.displayObject(),this.pa.scale(),this.pa.scale());this.Gg.Jl(this.pa.width()/a,this.pa.height()/a);this.Gg.setScale(a)}EA(){let a;null==(a=this.wF)||QM(a)}x6(a,b,c){c?(pT(this.pa,!1),Qe(this,this.wF.VA,()=>{pT(this.pa,!0);this.Is(this.Ff,this.D.Tr());this.B.play()},this),this.wF.show(this.displayObject())):this.Is(this.Ff,this.D.Tr())}Is(a,b){this.fC(a,b);z(this,this.B.$().wC(),()=>{this.fC(a, +b)},this)}fC(a,b){const c=this.B.$().nd();b=b.TC()&&this.pa.Fg.video().visible();c&&!b?a.show():a.Uc();a=this.pa.Fg.video();b?a.Ff.show():a.Ff.Uc()}fo(a){if("resumePlayback"==a.action()){const b=this.B.Pf();this.pa.initialize(b);"prompt"==this.G.settings().Vc().wu()&&(a.xu("delayStartup"),wT(this,a))}else"gotoSlide"==a.action()&&this.pa.initialize(a.L())}vo(a,b){if(!(0b}).then(()=>{this.Ln.resume();c.setOverlayDisplayed(!1);Ws(d,e);this.Qk.C()})}}$n(a){const b={},c=this.G.slides(),d=f=>{f=c.la(f).Mi();if(this.H.outline.zi){const g=BN(c);b.SLIDE_INDEX=g[f]}else b.SLIDE_INDEX=f+1};let e="";switch(a.rd().type()){case "currentSlideIsNotCompleted":e="PB_CURRENT_SLIDE_IS_NOT_COMPLETED";break;case "backwardNavigationIsRestricted":case "forwardNavigationIsRestricted":e= +"sequential"==this.G.settings().navigation().navigationType()?"PB_NAVIGATION_IS_SEQUENTIAL":"PB_NAVIGATION_IS_RESTRICTED";break;case "interactionNotCompleted":e="PB_QUIZ_SLIDE_WINDOW_TEXT";a=this.B.fa();a instanceof Bq?e="PB_SCENARIO_SLIDE_WINDOW_TEXT":a instanceof tq&&(e="PB_INTERACTION_SLIDE_WINDOW_TEXT");break;case "precedingQuizFailed":e="PB_PRECEDING_QUIZ_FAILED_WINDOW_TEXT";d.call(this,a.rd().Pd());break;case "precedingQuizNotPassed":e="PB_PRECEDING_QUIZ_NOT_PASSED_WINDOW_TEXT";d.call(this, +a.rd().Pd());break;case "precedingQuizNotCompleted":e="PB_PRECEDING_QUIZ_NOT_COMPLETED_WINDOW_TEXT";d.call(this,a.rd().Pd());break;case "precedingScenarioNotPassed":e="PB_PRECEDING_SCENARIO_NOT_PASSED_WINDOW_TEXT";d.call(this,a.rd().Pd());break;case "precedingScenarioFailed":e="PB_PRECEDING_SCENARIO_FAILED_WINDOW_TEXT";d.call(this,a.rd().Pd());break;case "precedingScenarioNotCompleted":e="PB_PRECEDING_SCENARIO_NOT_COMPLETED_WINDOW_TEXT";d.call(this,a.rd().Pd());break;default:return}this.vo(e,b)}vd(){super.vd(); +Fd(this.Ff.displayObject())}};class yT{constructor(a){this.Xa=a}create(){return{f2:this.Xa.Aa.controlPanel.visible&&this.Xa.Aa.controlPanel.lc.visible&&this.Xa.Aa.controlPanel.lc.Lr,showSlideList:this.DB()&&this.Xa.Aa.Xc.showOutline||this.Xa.Aa.Lc.visible&&DN(this.Xa.Aa.Lc,"outline")||this.Xa.Aa.controlPanel.visible&&this.Xa.Aa.controlPanel.showOutline,ye:this.DB()&&this.Xa.Aa.Xc.ye||this.Xa.Aa.Lc.visible&&DN(this.Xa.Aa.Lc,"notes")||this.Xa.Aa.controlPanel.visible&&this.Xa.Aa.controlPanel.Ll,e2:this.Xa.Aa.Lc.visible&&DN(this.Xa.Aa.Lc, +"attachments"),d2:this.Xa.Aa.Lc.visible&&DN(this.Xa.Aa.Lc,"presenterInfo")||this.DB()&&this.Xa.Aa.Xc.hh}}DB(){return this.Xa.Aa.Xc.visible}};class zT extends wg{constructor(){super();this.wo=this.yo=this.Et=this.Ra=!1;this.De="";this.Ft=!1;this.pb=E(this);this.Cc=E(this)}set visible(a){this.Ra!==a&&(this.Ra=a,this.Cc.C())}get visible(){return this.Ra}set xf(a){this.Et!==a&&(this.Et=a,this.pb.C())}get xf(){return this.Et}set yf(a){this.yo!==a&&(this.yo=a,this.pb.C())}get yf(){return this.yo}set Re(a){this.wo!==a&&(this.wo=a,this.pb.C())}get Re(){return this.wo}set $g(a){this.De!==a&&(this.De=a,this.pb.C())}get $g(){return this.De}set Qd(a){this.Ft!== +a&&(this.Ft=a,this.pb.C())}get Qd(){return this.Ft}};class AT extends wg{constructor(a){super();this.S7=a;this.zd=this.Vb=this.xo=this.xB=!1;this.pb=E(this);this.Cc=E(this)}get outline(){return this.S7}set hJ(a){this.xB!==a&&(this.xB=a,this.pb.C())}get hJ(){return this.xB}set hh(a){this.xo!==a&&(this.xo=a,this.pb.C())}get hh(){return this.xo}set showOutline(a){this.Vb!==a&&(this.Vb=a,this.pb.C())}get showOutline(){return this.Vb}set ye(a){this.zd!==a&&(this.zd=a,this.pb.C())}get ye(){return this.zd}};class BT extends wg{constructor(){super();this.dO=this.Ra=!1;this.pb=E(this);this.Cc=E(this)}get visible(){return this.Ra}set visible(a){this.Ra!==a&&(this.Ra=a,this.Cc.C())}get QI(){return this.dO}set QI(a){this.dO!==a&&(this.dO=a,this.pb.C())}};class CT extends wg{constructor(){super();this.LO=this.Ra=!1;this.pb=E(this);this.Cc=E(this)}set visible(a){this.Ra!==a&&(this.Ra=a,this.Cc.C())}get visible(){return this.Ra}set Di(a){this.LO!==a&&(this.LO=a,this.pb.C())}get Di(){return this.LO}};class DT extends wg{constructor(a,b){super();this.G=a;this.H=b;a:{for(a=0;aa.height}function FT(a){return ET(a)?a.DB()?new Vf(0,a.EB(),0,0):new Vf(0,0,0,0):new Vf(a.Xa.topPanel.visible?a.Xa.ui?52:46:0,0,a.Xa.bottomPanel.visible?a.Xa.ui?55:66:0,0)}function GT(a){const b=FT(a);return new Wf(b.left,b.top,a.md.width-b.right-b.left,a.md.height-b.top-b.bottom)}function HT(a,b){a=b?a.wA:GT(a);return new cd(a.width,a.height)} +class IT{constructor(a){this.Xa=a;this.wA=this.md=null}oD(a){this.md=a}Fn(a){a=a?this.wA:GT(this);return new Xc(a.left,a.top)}DB(){return this.Xa.topPanel.visible||this.Xa.bottomPanel.visible?this.Xa.topPanel.Di||this.Xa.bottomPanel.Re||this.Xa.bottomPanel.yf||this.Xa.bottomPanel.xf:!1}EB(){return this.Xa.ui?52:56}};function JT(){let a=Ii?"mobile":"desktop";Ib?a+=" ie":Ji?a+=" android_default":Mb?a+=" webkit":Hb?a+=" opera":Lb&&(a+=" gecko");return a} +class KT extends P{constructor({kc:a,xa:b,ga:c,F:d,Q$:e}){super({F:d});JT().split(" ").forEach(f=>Gt(this,f));this.D=a;this.R=a.view();this.G=a.Ca();this.B=a.view().V();this.Da=this.B.$();this.rc=a.view().Cd();this.Gg=new EM(this.displayObject());this.I=c;this.K=b;this.Gk=new GM({ga:this.I,zJ:this.Gg});if(e){const f=new JM;z(this,f.LB,(g,h)=>this.Jj(g,h));setTimeout(()=>f.IC())}z(this,a.uy(),this.fo,this);z(this,a.view().Cd().Yx(),this.$n,this)}Jj(a,b){this.resize(a,b);this.Gg.Jl(a,b)}fo(a){if("resumePlayback"== +a.action()&&"prompt"==this.G.settings().Vc().wu()){const b=this.B.Pf(),c=a.L();a.xu("delayStartup");const d=a.Zw;(()=>{FM(this.Gk,{mn:"PB_RESUME_PRESENTATION_WINDOW_TEXT",icon:Z(this.K,"mb_question_icon"),buttons:[{Jg:"PB_MESSAGE_BOX_YES",result:"yes"},{Jg:"PB_MESSAGE_BOX_NO",result:"no"}]}).then(e=>{this.R.setOverlayDisplayed(!1);"yes"==e?d.resume(c,!0):d.start(b,!0)});this.R.setOverlayDisplayed(!0)})()}}nh(a,b){return(a.la(b).Mi()+1).toString()}$n(a){const b={},c=this.G.slides();let d;switch(a.rd().type()){case "currentSlideIsNotCompleted":d= +"PB_CURRENT_SLIDE_IS_NOT_COMPLETED";break;case "backwardNavigationIsRestricted":case "forwardNavigationIsRestricted":d="sequential"==this.G.settings().navigation().navigationType()?"PB_NAVIGATION_IS_SEQUENTIAL":"PB_NAVIGATION_IS_RESTRICTED";break;case "interactionNotCompleted":d="PB_QUIZ_SLIDE_WINDOW_TEXT";a=this.B.fa();a instanceof Bq?d="PB_SCENARIO_SLIDE_WINDOW_TEXT":a instanceof tq&&(d="PB_INTERACTION_SLIDE_WINDOW_TEXT");break;case "precedingQuizFailed":d="PB_PRECEDING_QUIZ_FAILED_WINDOW_TEXT"; +b.SLIDE_INDEX=this.nh(c,a.rd().Pd());break;case "precedingQuizNotPassed":d="PB_PRECEDING_QUIZ_NOT_PASSED_WINDOW_TEXT";b.SLIDE_INDEX=this.nh(c,a.rd().Pd());break;case "precedingQuizNotCompleted":d="PB_PRECEDING_QUIZ_NOT_COMPLETED_WINDOW_TEXT";b.SLIDE_INDEX=this.nh(c,a.rd().Pd());break;case "precedingScenarioNotPassed":d="PB_PRECEDING_SCENARIO_NOT_PASSED_WINDOW_TEXT";b.SLIDE_INDEX=this.nh(c,a.rd().Pd());break;case "precedingScenarioFailed":d="PB_PRECEDING_SCENARIO_FAILED_WINDOW_TEXT";b.SLIDE_INDEX= +this.nh(c,a.rd().Pd());break;case "precedingScenarioNotCompleted":d="PB_PRECEDING_SCENARIO_NOT_COMPLETED_WINDOW_TEXT";b.SLIDE_INDEX=this.nh(c,a.rd().Pd());break;default:return}this.vo(d,b)}FA(a){Ws(this.Da,a)}vo(a,b){const c=this.B.$().suspended(),d=this.R;Ws(this.Da,!0);FM(this.Gk,{mn:a,icon:Z(this.K,"mb_warning_icon"),buttons:[{Jg:"PB_MESSAGE_BOX_OK",result:"ok"}],Kx:()=>b}).then(()=>{d.setOverlayDisplayed(!1);this.FA(c)});d.setOverlayDisplayed(!0)}};function LT(a){var b=a.B.ma();-1!=b&&(b=Vs(a.R.kn(),b),b instanceof mv?b.Oa().resize(a.width(),a.height()):b instanceof lv?b.fb().resize(a.width(),a.height()):b instanceof pv&&b.tb().resize(a.width(),a.height()))}function MT(a){a.hM()?(a=a.displayObject(),mn(a,"quiz_mode")):(a=a.displayObject(),nn(a,"quiz_mode"))} +class NT extends KT{constructor(a,b,c){super({kc:a,ga:b,xa:c,F:"universal_mini",Q$:!0});this.G=a.Ca();this.ra=Ki();this.dW=new C;b=a.view();this.O(b.displayObject());z(this,this.B.Wr,this.oe,this);z(this,a.HC(),this.VF,this)}VF(){}ZL(a,b){this.R.resize(a,b)}Jj(a,b){L(this,"min-height",`${b+0}px`);this.ZL(a,b,0);super.Jj(a,b);LT(this)}oe(){var a=this.B.ma();const b=-1!=a?this.B.fa():null;this.vE&&(this.vE.mr(),this.vE=void 0);this.uE&&(this.uE.mr(),this.uE=void 0);this.wE&&(this.wE.mr(),this.wE=void 0); +var c=this.displayObject();nn(c,"interaction_slide");b instanceof cr?(this.Dq=!0,this.IJ(Vs(this.R.kn(),a)),LT(this),MT(this)):b instanceof tq?(this.Dq=!0,this.HJ(Vs(this.R.kn(),a)),LT(this),MT(this),a=this.displayObject(),mn(a,"interaction_slide")):b instanceof Bq?(this.Dq=!0,this.JJ(Vs(this.R.kn(),a)),LT(this),MT(this)):(this.Dq=!1,MT(this),this.J(!0));0{if((a instanceof Node||a.enabled())&&!(1{1{1{var d=a.Sa.wA;d=new Xc(d.left,d.top);a.Dn||(a.sm=d.x,a.tm=d.y);b=a.sm;c=a.tm},D1:d=>{a.Dn=!0;var e=a.Sa.md;a.sm=xv(b+d.x,0,e.width-FT(a.Sa).right-a.Zc.width());a.tm=xv(c+d.y,0,e.height-a.Zc.height());d=a.Zc.width();e=a.Zc.height();a.Sa.wA=new Wf(a.sm,a.tm,d,e);vn(a.Zc.displayObject(),a.sm,a.tm)},Pba:()=>{}});B(a,a.Ik)}}else VT(a)} +function XT(a){var b=a.Zc==a.ob;var c=a.Sa;var d=c.md;if(ET(c)){c=Math.floor(.4*d.width);var e=Math.floor(.4*d.height);d=b?new cd(c,e):new cd(d.width,d.height)}else d=new cd(d.width,Math.floor((d.height-48)*(1-.8)));a.ob.Jl(d.width,d.height);!a.Dn&&b&&(b=a.Sa,d=a.Zc.width(),a=a.Zc.height(),c=FT(b),b.wA=new Wf(Math.floor(b.md.width-c.right-d),c.top,d,a))} +class ZT extends wg{constructor({rda:a,$x:b,pQ:c}){super();this.dM=!1;this.Sa=c;this.ob=a;this.R=b;this.Zc=a;this.hf=!1;ST(this,!1);this.sm=1;this.tm=0;this.Ik=null;this.Dn=!1;this.js=new P({F:"change-layout-button"});B(this,this.js);this.ob.O(this.js);z(this,this.js.ja,()=>{this.xp(this.Zc==this.ob?this.R:this.ob)},this);this.vA=E(this);TT(this,!1)}Br(){return this.Zc}xp(a){VT(this);const b=this.Zc!=a;this.Zc=a;this.vA.C(b);UT(this);WT(this)}El(){this.jF();this.XL()}VR(a){this.dM="MaximizedVideo"== +a;this.xp(this.dM?this.R:this.ob)}jF(){var a=this.hf?this.Zc==this.R:!1;var b=this.Sa;if(ET(b))var c=HT(b,a);else this.hf?(c=b.md,b=FT(b),c=new cd(c.width,Math.floor(.8*(c.height-b.bottom-b.top)))):(c=GT(b),c=new cd(c.width,c.height));b=this.Sa;var d=this.hf;const e=FT(b);a=ET(b)?b.Fn(a):d?new Xc(e.left,e.top+Math.floor((b.md.height-e.bottom-e.top)*(1-.8))-24):new Xc(e.left,e.top);this.R.resize(c.width,c.height);this.Bt(this.R.displayObject(),a);!ET(this.Sa)&&this.hf&&(b=this.R.Fi().getBoundingClientRect(), +a.y+=c.height-b.height,this.R.resize(b.width,b.height),this.Bt(this.R.displayObject(),a))}XL(){var a=this.Zc==this.ob;var b=this.Sa;if(ET(b))var c=HT(b,a);else c=b.md,b=FT(b),c=new cd(c.width,Math.floor(.5*(c.height-b.bottom-b.top)));b=this.Sa;const d=FT(b);a=ET(b)?b.Fn(a):new Xc(d.left,d.top);this.ob.resize(c.width,c.height);this.Bt(this.ob.displayObject(),a);!ET(this.Sa)&&this.hf&&(a=FT(this.Sa),this.ob.resize(c.width,Math.floor(this.Sa.md.height-a.bottom-a.top-this.R.height()-24)))}Bt(a,b){F(a, +"transform",`translate(${b.x}px, ${b.y}px)`)}oD(a){const b=this.Sa.md;!a||b&&b.width==a.width&&b.height==a.height||(this.Sa.oD(a),WT(this));XT(this)}};function $T(a){var b=a.oc.$g===VL;const c=a.B.nf(b?"switchToNextSlide":"switchToNextStep");b=a.B.nf(b?"switchToPreviousSlide":"switchToPreviousStep");var d=a.Ka;d.gb&&zO(d.gb.displayObject(),c);a=a.Ka;a.rb&&zO(a.rb.displayObject(),b)} +class aU extends wg{constructor({Of:a,Uf:b,V:c,bottomPanel:d}){super();this.oc=a;this.Xq=b;this.B=c;this.Ka=d;this.vG=void 0;z(this,this.B.$().Ec(),this.Tz,this);z(this,this.B.$().Zb(),this.Ab,this);$T(this);this.Tz();z(this,this.Ka.lN,this.K6,this);z(this,this.Ka.kN,this.jN,this);z(this,this.Ka.oN,this.nN,this);z(this,this.Ka.qN,this.pN,this)}K6(){const a=this.B.$().state();"started"===a||"buffering"===a?this.B.pause():this.B.play()}nN(){this.Ka.enabled()&&(this.oc.$g===VL?this.B.vi():"bySteps"=== +this.oc.$g&&this.B.ju())}jN(){this.Ka.enabled()&&(this.oc.$g===VL?this.B.sf():"bySteps"===this.oc.$g&&this.B.fp())}pN(a){this.B.Il().wk(a);this.Ka.Nx()}Ab(){if(!this.B.$().Kg()&&-1!=this.B.ma()){const a=this.B.nf("playPauseControl");bU(this.Ka,a)}$T(this)}Tz(){var a=this.B.$().state();const b="started"===a||"buffering"===a;this.vG&&(clearTimeout(this.vG),this.vG=void 0);this.vG=setTimeout(()=>this.Ka.CS(b),50);-1!==this.B.ma()&&(a=this.B.nf("playPauseControl"),bU(this.Ka,a))}};function bU(a,b){a.hb&&zO(a.hb.displayObject(),b)} +class cU extends P{constructor({F:a,xa:b,Of:c,Uf:d,V:e,ga:f}){super({F:a});this.oc=c;this.Xq=d;this.B=e;this.I=f;this.K=b;this.Ic=this.qs();this.hb=this.qv();this.nb=this.oE();this.gb=this.pv();this.rb=this.rv();this.ra=Ki();wn(this.displayObject(),this.ra);yi(this.displayObject(),"0 100%");this.lN=E(this);this.oN=E(this);this.kN=E(this);this.qN=E(this);B(this,new aU({Of:c,Uf:d,V:e,bottomPanel:this}));z(this,this.oc.pb,this.Ki,this);z(this,this.Xq.pb,this.Ki,this)}jr(){return!this.oc.Re&&!this.oc.yf&& +!this.oc.xf&&!this.oc.Qd}Ki(){this.Xq.Di&&!this.Ic&&(this.Ic=this.qs());this.Ic&&this.Ic.J(this.Xq.Di);this.oc.xf&&!this.hb&&(this.hb=this.qv());this.hb&&this.hb.J(this.oc.xf);this.oc.Qd&&!this.nb&&(this.nb=this.oE());this.nb&&this.nb.J(this.oc.Qd);this.oc.Qd||this.Nx();this.oc.yf&&!this.rb&&(this.rb=this.rv());this.rb&&this.rb.J(this.oc.yf);this.oc.Re&&!this.gb&&(this.gb=this.pv());this.gb&&this.gb.J(this.oc.Re);this.Sy()}Nx(){}qy(){}CS(){}Sx(){}qs(){return null}Sy(){}};class dU extends P{constructor(a,b,c){super({F:c});this.Tb=a;this.gm=this.BK(b);M(this,this.gm);this.Hm=this.rE();M(this,this.Hm);this.X(a,!0)}get id(){return this.Tb}UR(a){this.gm.ha(a)}gn(a){this.Hm.ha(a)}BK(a){const b=new P({ka:O(this,"label")});b.ha(a);return b}rE(){return new P({ka:O(this,"value")})}}function eU(a,b,c){a.to(b,d=>d.X("selected",c))}function fU(a,b,c){if(!a.jb.has(b)){const d=new dU(b,c,a.CV());a.jb.set(b,d);M(a,d);z(a,d.ja,()=>a.uA.C(a.vF(d)))}} +class gU extends P{constructor(){super({F:"rate-menu"});this.jb=new Map;this.uA=E(this)}get nu(){return this.uA}X1(a,b){this.to(a,c=>c.J(b))}my(a,b){this.to(a,c=>c.UR(b))}W1(a,b){this.to(a,c=>c.qa(b))}CV(){}vF(a){return a.id}to(a,b){this.jb.has(a)&&b(this.jb.get(a))}};var hU=class extends gU{constructor(a){super();this.I=a;this.Dw=new Map(xg.map(b=>[`${b}x`,b]));this.MJ();z(this,this.I.og,this.Eg,this)}$I(a){this.Dw.forEach((b,c)=>eU(this,c,b==a))}CV(){return"rate-menu-item"}vF(a){return this.Dw.has(a.id)?this.Dw.get(a.id):a.id}MJ(){fU(this,"caption",this.I.ia("PB_RATE_MENU_CAPTION"));this.Dw.forEach((a,b)=>fU(this,b,b))}Eg(a){"PB_RATE_MENU_CAPTION"===a&&this.my("caption",this.I.ia("PB_RATE_MENU_CAPTION"))}};function iU(a,b){a&&b.forEach(c=>{a&&a.X(c,!1)})} +class jU extends cU{constructor({F:a,Uf:b,xa:c,Of:d,V:e,ga:f}){super({F:a,Of:d,Uf:b,V:e,ga:f,xa:c});this.hb&&M(this,this.hb);this.nb&&M(this,this.nb);this.rb&&M(this,this.rb);this.gb&&M(this,this.gb);(this.Kc=this.gz())&&M(this,this.Kc);this.nb&&(this.NJ(),z(this,this.B.Il().Qj,this.jx,this));this.jx()}Ki(){super.Ki();this.hb&&!this.tf(this.hb)&&M(this,this.hb);this.nb&&!this.tf(this.nb)&&M(this,this.nb);this.gb&&!this.tf(this.gb)&&M(this,this.gb);this.rb&&!this.tf(this.rb)&&M(this,this.rb)}Nx(){this.Kc&& +this.Kc.J(!1)}CS(a){this.hb&&this.hb.X("is-playing",a)}qv(){if(this.oc.xf){const a=new ZC({F:"play"});z(this,a.ja,()=>this.lN.C(),this);-1==this.B.ma()&&(a.qa(!1),Qe(this,this.B.vc(),()=>a.qa(!0)));return a}return null}oE(){if(this.oc.Qd){const a=new ZC({F:"rate"});z(this,a.ja,this.bG,this);return a}return null}rv(){if(this.oc.yf){const a=new ZC({F:"prev"});z(this,a.ja,()=>this.oN.C(),this);return a}return null}pv(){if(this.oc.Re){const a=new ZC({F:"next"});z(this,a.ja,()=>this.kN.C(),this);return a}return null}gz(){const a= +new hU(this.I);a.W1("caption",!1);a.J(!1);z(this,a.nu,b=>this.qN.C(Number(b)),this);return a}NJ(){x(this,document,Km,a=>{this.Kc.visible()&&(a=a.target,Md(this.nb.displayObject(),a)||Md(this.Kc.displayObject(),a)||this.Kc.J(!1))})}jx(){this.Kc&&this.Kc.$I(this.B.Il().playbackRate())}bG(){this.Kc&&this.Kc.J(!this.Kc.visible())}};class kU extends jU{constructor({V:a,Uf:b,xa:c,slides:d,Of:e,ga:f}){super({F:"bottom-panel",Of:e,Uf:b,V:a,ga:f,xa:c});this.M=d;this.jr()&&this.Wc(0);this.dC()}Ki(){super.Ki();this.dC()}Kb(a){super.Kb(a/this.ra)}dC(){const a=["first","second"];iU(this.hb,a);iU(this.nb,a);this.hb&&this.hb.visible()&&this.hb.X(a.shift(),!0);this.nb&&this.nb.visible()&&this.nb.X(a.shift(),!0);this.nb&&this.nb.visible()&&this.Kc&&this.Kc.X("rate-button-first",this.nb.OC("first"));this.rb&&this.rb.X("next-button-hidden", +!this.gb||!this.gb.visible())}};class lU extends jU{constructor({Of:a,xa:b,Uf:c,V:d,ga:e}){super({F:"landscape-bottom-panel",Of:a,Uf:c,V:d,ga:e,xa:b});this.Ic&&M(this,this.Ic);this.dC();this.Sy()}Ki(){super.Ki();this.Ic&&!this.tf(this.Ic)&&M(this,this.Ic);this.dC()}jr(){return!this.Xq.Di&&super.jr()}qy(){return this.Ic?this.Ic.ja:new C}Wc(a){super.Wc(a/this.ra)}Sy(){this.jr()?this.Kb(0):L(this,"width","")}qs(){return this.Xq.Di?new ZC({F:"menu"}):null}dC(){const a=["first","second","third"];iU(this.hb,a);iU(this.nb,a);iU(this.Ic, +a);this.Ic&&this.Ic.visible()&&this.Ic.X(a.shift(),!0);this.hb&&this.hb.visible()&&this.hb.X(a.shift(),!0);this.nb&&this.nb.visible()&&this.nb.X(a.shift(),!0);this.Kc&&this.Kc.X("landscape",!0);this.rb&&this.rb.X("next-button-hidden",!this.gb||!this.gb.visible())}};class mU extends P{constructor(){super({F:"progress"});this.An=0;this.ra=Ki();wn(this.displayObject(),this.ra);yi(this.displayObject(),"0 100%")}Lg(a){this.An=xv(a,0,1);this.xb()}Kb(a){super.Kb(a/this.ra)}};class nU extends mU{Qa(a,b){super.Qa(a,b);a=this.displayObject();b=(b=`${100*this.An}%`)?b+"":"";var c=a.style.getPropertyValue("--play-progress");b!=c&&a.style.setProperty("--play-progress",b)}};class oU extends mU{constructor(){super();this.UX=new P({F:"playback-progress"});M(this,this.UX)}Qa(a,b){super.Qa(a,b);this.UX.Kb(a*this.An)}};class pU extends cU{constructor({F:a,Uf:b,Of:c,V:d,ga:e,xa:f}){super({F:a,Of:c,Uf:b,V:d,ga:e,xa:f});this.hb&&M(this,this.hb);this.nb&&M(this,this.nb);this.Kd=this.$y();this.Tj=new P({F:"rate-menu-popup"});M(this,this.Tj);this.Kc=this.gz();M(this.Tj,this.Kc);this.nb&&(this.NJ(),z(this,this.B.Il().Qj,this.AH,this),this.AH())}Ki(){super.Ki();this.hb&&!this.tf(this.hb)&&M(this,this.hb,1);this.nb&&!this.tf(this.nb)&&M(this,this.nb,2);!this.rb&&!this.gb||this.Kd||(this.Kd=this.$y())&&M(this,this.Kd);this.Kd&& +(this.Kd.J(!!this.rb||!!this.gb),this.rb&&!this.Kd.tf(this.rb)&&M(this.Kd,this.rb,0),this.gb&&!this.Kd.tf(this.gb)&&M(this.Kd,this.gb,1))}Nx(){this.Tj.J(!1)}CS(a){this.hb&&this.hb.on(Z(this.K,a?"pause":"play"))}AH(){const a=this.B.Il().playbackRate();this.Kc.$I(a)}bG(){const a=!this.Tj.visible();a&&this.Sx();this.Tj.J(a)}$y(){if(this.rb||this.gb){const a=new P({F:"navigation-controls"});M(this,a);this.rb&&M(a,this.rb);this.gb&&M(a,this.gb);return a}return null}qv(){if(this.oc.xf){const a=new iM({type:"uikit-secondary-button", +icon:{element:Z(this.K,"play"),Ne:"left"}});z(this,a.ja,()=>this.lN.C(),this);-1==this.B.ma()&&(a.qa(!1),Qe(this,this.B.vc(),()=>a.qa(!0)));return a}return null}rv(){if(this.oc.yf){const a=new iM({type:"uikit-secondary-button",icon:{element:Z(this.K,"prev"),Ne:"left"}});z(this,a.ja,()=>this.oN.C(),this);this.oc.Re||a.X("next-button-hidden",!0);return a}return null}pv(){if(this.oc.Re){const a=new iM({type:"uikit-primary-button",icon:{element:Z(this.K,"next"),Ne:"left"}});z(this,a.ja,()=>this.kN.C(), +this);return a}return null}gz(){const a=new dQ(this.I,this.K);z(this,a.nu(),b=>this.qN.C(Number(b)),this);return a}NJ(){x(this,document,Km,a=>{this.Tj.visible()&&(a=a.target,Md(this.nb.displayObject(),a)||Md(this.Tj.displayObject(),a)||this.Tj.J(!1))})}};class qU extends pU{constructor({V:a,Uf:b,slides:c,Of:d,ga:e,xa:f}){super({F:"bottom-panel",Of:d,Uf:b,V:a,ga:e,xa:f});this.M=c;this.jr()&&this.Wc(0);this.Sx()}Ki(){super.Ki();this.Sx()}Kb(a){super.Kb(a/this.ra)}Sx(){if(this.nb){const a=this.nb.displayObject().offsetLeft;L(this.Tj,"left",`${a}px`);L(this.Tj,"bottom","56px")}}oE(){if(this.oc.Qd){var a=Z(this.K,`rate-${this.B.Il().playbackRate()}x`);a=new iM({type:"uikit-secondary-button",icon:{element:a,Ne:"left"}});z(this,a.ja,this.bG,this);return a}return null}AH(){const a= +this.B.Il().playbackRate();this.nb.on(Z(this.K,`rate-${a}x`));super.AH()}};class rU extends pU{constructor({Of:a,Uf:b,V:c,ga:d,xa:e}){super({F:"landscape-bottom-panel",Of:a,Uf:b,V:c,ga:d,xa:e});this.Ic&&M(this,this.Ic,0);this.Kc&&this.Kc.X("landscape",!0);this.Sy();this.Sx();this.AB=E(this)}Ki(){super.Ki();this.Ic&&!this.tf(this.Ic)&&M(this,this.Ic,0)}jr(){return!this.Xq.Di&&super.jr()}qy(){return this.AB}Wc(a){super.Wc(a/this.ra)}Sx(){this.nb&&(L(this.Tj,"right","56px"),L(this.Tj,"top","8px"))}Sy(){this.jr()?this.Kb(0):L(this,"width","")}qs(){if(this.Xq.Di){const a=new iM({type:"uikit-secondary-button", +icon:{element:Z(this.K,"outline_landscape"),Ne:"left"}});z(this,a.ja,()=>this.AB.C(),this);return a}return null}oE(){if(this.oc.Qd){const a=new iM({type:"uikit-secondary-button",icon:{element:Z(this.K,"rate"),Ne:"left"}});z(this,a.ja,this.bG,this);return a}return null}};class sU extends P{constructor(a){super({F:"item"});"attachment"==a.type()?this.O(new P({F:"attachment-icon"})):"webLink"==a.type()&&this.O(new P({F:"url-icon"}));const b=new P({F:"text"});b.ha(a.title());this.O(b);this.ja.addHandler(()=>{try{let c=a.url();if("attachment"==a.type()){const d=c.lastIndexOf("/");c=c.substring(0,d+1)+encodeURIComponent(c.substring(d+1))}Ri(c,a.target())}catch(c){}},this)}} +class tU extends P{constructor(a){super({F:"resources"});this.O(new P({F:"separator"}));for(let b=0;bthis.Y0)if(this.dispatchEvent(new BU("start",this,a.clientX,a.clientY,a)))this.hu=!0;else{this.Bx||this.gI(a);return}}c=EU(this,b,c);b=c.x;c=c.y;this.hu&&this.dispatchEvent(new BU("beforedrag",this,a.clientX,a.clientY,a,b,c))&& +(FU(this,a,b,c),a.preventDefault())}};function EU(a,b,c){var d=vd(od(a.od).od);b+=d.x-a.vR.x;c+=d.y-a.vR.y;a.vR=d;a.deltaX+=b;a.deltaY+=c;return new Xc(CU(a,a.deltaX),DU(a,a.deltaY))}k.Vba=function(a){var b=EU(this,0,0);a.clientX=this.clientX;a.clientY=this.clientY;FU(this,a,b.x,b.y)};function FU(a,b,c,d){a.AD&&AU(a)?a.target.style.right=c+"px":a.target.style.left=c+"px";a.target.style.top=d+"px";a.dispatchEvent(new BU("drag",a,b.clientX,b.clientY,b,c,d))} +function CU(a,b){var c=a.f1;a=isNaN(c.left)?null:c.left;c=isNaN(c.width)?0:c.width;return Math.min(null!=a?a+c:Infinity,Math.max(null!=a?a:-Infinity,b))}function DU(a,b){var c=a.f1;a=isNaN(c.top)?null:c.top;c=isNaN(c.height)?0:c.height;return Math.min(null!=a?a+c:Infinity,Math.max(null!=a?a:-Infinity,b))}function BU(a,b,c,d,e,f,g){be.call(this,a);this.clientX=c;this.clientY=d;this.eu=e;this.left=void 0!==f?f:b.deltaX;this.top=void 0!==g?g:b.deltaY}r(BU,be);function GU(a,b,c,d,e){Jt.call(this,a);void 0===e&&(e={});void 0!==d&&(e.snap=d);HU(this,e,b,c);this.jj=new C}r(GU,Jt); +function HU(a,b,c,d){d=d||"auto";c=c||"auto";if(Ii){Lt(a,"overflow","hidden");a.sa=new Jt(a.za());let e=!1;b.hideScrollbar=void 0!==b.hideScrollbar?b.hideScrollbar:!0;b.onBeforeScrollEnd=function(f){e&&(f.preventDefault(),f instanceof ie&&(f=f.te),gh||(gh=new WeakMap),gh.set(f,!0))};b.vScroll="hidden"!=d;b.hScroll="hidden"!=c;b.scrollbarClass="scrollbar";b.onBeforeScrollMove=function(f){f.preventDefault()};b.onBeforeScrollStart=function(f){e=!1;f.target&&"INPUT"!=f.target.nodeName&&"A"!=f.target.nodeName&& +f.preventDefault()};a.wd=new iScroll(a.displayObject(),b);a.wd.options.onScrollMove=function(){e=!0;a.jj.C()};a.wd.options.onScrollEnd=function(){a.jj.C()}}else F(a.za(),"overflow","hidden"),F(a.za(),"width","100%"),F(a.za(),"height","100%"),a.sa=new Mt,a.sa.displayObject().className=a.za().className,Bd(a.za(),a.sa.displayObject()),"hidden"!=d&&(a.ua=IU(a),a.ua.XB.addHandler(a.mX,a),a.O(a.ua)),"hidden"!=c&&(a.Nc=JU(a),a.Nc.XB.addHandler(a.mX,a),a.O(a.Nc)),b=new jM(a.displayObject()),a.V8=!0,ve(a.displayObject(), +"mouseover",a.h9,!1,a),ve(a.displayObject(),"mouseout",a.km,!1,a),ve(b,"mousewheel",a.F6,!1,a),ve(document,Lm,a.YF,!1,a),ve(a.za(),"scroll",a.e7,!1,a)}k=GU.prototype;k.eM=!1;k.pF=!1;k.invalidate=function(){const a=this;setTimeout(()=>{a.wd?a.wd.refresh():KU(a)},0)};k.mX=function(){this.pF=!0};k.YF=function(a){this.pF&&(a.te.stopImmediatePropagation(),this.pF=!1,!this.eM&&this.V8&&LU(this))}; +k.F6=function(a){if(this.ua&&a.deltaY){var b=0c)throw Error("minScrollPosition must be less or equal than maxScrollPosition");this.$k=a;this.Vi=b;this.Kj=c;this.jt=d;this.Ls();this.Sf(this.Eb)}; +k.Ls=function(){};k.fq=function(){};k.Dt=function(a){a=xv(a,this.Vi,this.Kj);this.Eb!=a&&(this.Eb=a,this.jj.C())};k.xt=function(a){this.Sf(this.Eb+a)};k.hx=function(){};k.zN=function(a){a.stopPropagation();this.xt(-this.Oe());this.MB(this.kf,-this.Oe())};k.$M=function(a){a.stopPropagation();this.xt(this.Oe());this.MB(this.mh,this.Oe())}; +k.MB=function(a,b){this.vm=a;ve(this.vm.displayObject(),"mouseover",this.JA,!1,this);ve(this.vm.displayObject(),"mouseout",this.IA,!1,this);ve(document,Lm,this.jB,!1,this);this.ij.stop();this.Hq=function(){this.xt(this.KG)};this.KG=b;this.ij.start()};k.jB=function(){De(this.vm.displayObject(),"mouseover",this.JA,!1,this);De(this.vm.displayObject(),"mouseout",this.IA,!1,this);De(document,Lm,this.jB,!1,this);this.ij.stop();this.Hq=null};k.JA=function(){this.ij.start()};k.IA=function(){this.ij.stop()}; +k.rN=function(){this.Hq&&this.Hq()};k.MA=function(a){this.XB.C();a.stopPropagation();const b=this.oP();this.ts=new yU(this.La.displayObject(),null,b);this.ts.nS(a);this.ts.deltaY=this.La.displayObject().offsetTop-this.kf.height();this.ts.deltaX=this.La.displayObject().offsetLeft-this.kf.width();ve(this.ts,"drag",this.mm,!1,this);a=this.La.displayObject();mn(a,"active")};k.RF=function(a){this.ts&&(a.preventDefault(),this.ts.gd(),this.ts=void 0,a=this.La.displayObject(),nn(a,"active"))};k.mm=function(){}; +k.resize=function(a,b){TU.Mb.resize.call(this,a,b);this.Ls()};k.gd=function(){Te(this.La);Te(this.mh);Te(this.kf)};function OU(){TU.call(this,"vscrollbar")}r(OU,TU);k=OU.prototype;k.Ls=function(){const a=this.height()-this.kf.height()-this.mh.height();0==mM(this)?this.La.Wc(a):this.La.Wc(Math.max(this.DF,Math.ceil(this.$k/(mM(this)+this.$k)*a)));this.fq()};k.fq=function(){const a=this.si();0==mM(this)?this.La.Tf(a.top):this.La.Tf(Math.round((this.Eb-this.Vi)/mM(this)*a.height))}; +k.si=function(){const a=new Wf(0,0,0,0);a.top=this.kf.height();a.height=this.height()-this.mh.height()-this.La.height()-a.top;a.left=this.La.x();return a};k.oP=function(){const a=this.si();a.top=0;return a};k.hx=function(a){var b=this.si();a=a.offsetY-this.kf.height()-this.La.height()/2;a=xv(a,0,b.height);b=0!=this.jt?this.jt:this.$k;b=a<=this.La.y()?-b:b;this.Sf(this.Eb+b);this.mm()};k.mm=function(){var a=this.si();a=parseFloat(this.La.displayObject().style.top)/a.height;this.Dt(a*mM(this)+this.Vi)}; +function QU(){TU.call(this,"hscrollbar")}r(QU,TU);k=QU.prototype;k.Ls=function(){const a=this.width()-this.kf.width()-this.mh.width();0==mM(this)?this.La.Kb(a):this.La.Kb(Math.max(this.DF,Math.ceil(this.$k/(mM(this)+this.$k)*a)));this.fq()};k.fq=function(){const a=this.si();0==mM(this)?this.La.xj(a.left):this.La.xj(Math.round((this.Eb-this.Vi)/mM(this)*a.width))}; +k.si=function(){const a=new Wf(0,0,0,0);a.left=this.kf.width();a.width=this.width()-this.mh.width()-this.La.width()-a.left;a.top=this.La.y();return a};k.oP=function(){const a=this.si();a.left=0;return a};k.hx=function(a){const b=this.si();a=a.offsetX-this.kf.width()-this.La.width()/2;a=xv(a,0,b.width);this.La.xj(a);this.mm()};k.mm=function(){var a=this.si();a=parseFloat(this.La.displayObject().style.left)/a.width;this.Dt(a*mM(this)+this.Vi)};function UU(a){a.tw=[a.H.showOutline&&"outline",a.H.ye&&"notes",a.H.hh&&"presenterInfo",a.H.hJ&&"attachments"].filter(b=>!!b);VU(a)}function WU(a,b,c){const d=b&&a.tw.includes(b)?b:a.tw[0];if(c||a.Qp!=b)a.Qp=d,a.na.VR(d),a.Ka&&XU(a.Ka,d),(b=a.LU(d))&&YU(a,b)} +function VU(a){var b=a.displayObject();nn(b,"tab_control");Se(a,a.Ka);a.Ka=null;if(1d||(d=f,fb.top?e=b.top:c+lb.left?f=b.left:d+h{var d=this.sa.displayObject();nn(d,"animation");this.Oj&&this.sa.content().removeChild(this.Oj);this.Oj=c;RU(this.sa, +0,0);this.vq=a;this.fF()},!1,this);b.play()}aU(){this.qr().C()}f9(){this.SO(void 0,!0)}fF(){var a=this.na;a.vq=this.vq;a.xb();this.sa.invalidate();this.na.xb()}};function XU(a,b){Object.keys(a.Xf).forEach(c=>{a.Xf[c].Eh(b===c)})}function cV(a,b){switch(b){case "outline":return a.I.ia("PB_TITLE_PANEL_OUTLINE");case "notes":return a.I.ia("PB_TITLE_PANEL_NOTES");case "attachments":return a.I.ia("PB_TITLE_PANEL_ATTACHMENTS");case "presenterInfo":return a.I.ia("PB_TITLE_PANEL_PRESENTER_INFO")}throw Error("unknown page type");} +function dV(a){switch(a){case "PB_TITLE_PANEL_OUTLINE":return"outline";case "PB_TITLE_PANEL_NOTES":return"notes";case "PB_TITLE_PANEL_PRESENTER_INFO":return"presenterInfo";case "PB_TITLE_PANEL_ATTACHMENTS":return"attachments"}throw Error("unexpected message id");} +class eV extends P{constructor(a){super({F:"bottom-panel"});this.I=a;this.Xf={};this.un=[];this.sZ=new C;z(this,this.I.og,this.X4,this)}cQ(a){const b=this.Ae(a);this.O(b);z(this,b.ja,()=>this.sZ.C(a));this.Xf[a]=b;this.un.push(a)}resize(a,b){super.resize(a,b);b=Math.floor(a);a=Math.floor(b/this.un.length);b-=this.un.length*a;for(let c=0;c{a.hp?this.nZ.C(this):this.uZ.C(this)})}slide(){return this.ya}$Q(){}mO(){}};class nV{constructor(a,b,c){this.slide=a;this.tc=b;this.ku=c||"";this.selected=this.hp=!1}};class oV extends mV{constructor(a,b){super({selected:a.selected,tc:a.tc,hp:a.hp,slide:a.slide},b);this.Vh=a;this.Cm.ha(this.ME())}$Q(){var a=parseFloat(Eh(this.displayObject(),"min-height"));const b=lV(this),c=this.Cm?this.Cm.height():0;a=Math.max(a,b,c);this.Cm&&this.Cm.Tf(a>c?Math.floor((a-c)/2):0);this.Wc(a)}ME(){let a=this.ya.title()||"---";this.Vh.ku&&(a=this.Vh.ku+". "+a);return a}mO(){const a=Math.min(1,77/this.Ad.width(),58/this.Ad.height());this.Zi.resize(Math.round(this.Ad.width()*a),Math.round(this.Ad.height()* +a))}};class pV extends kV{constructor(a,b){super();this.O(new P({F:"separator"}));a.forEach(c=>jV(this,new oV(c,b)))}};class qV extends P{constructor(a){super({F:"search_panel"});this.I=a;this.yt=new C;this.Gs=!1;this.SG=new P({F:"search_container"});M(this,this.SG);this.He=new FO({F:"search_input",prompt:a.ia("PB_SEARCH_PANEL_DEFAULT_TEXT")});M(this.SG,this.He);this.Qi=new RG(!1,"clear");M(this.SG,this.Qi);this.jv=new RG(!1,"cancel");this.jv.ha(a.ia("PB_SEARCH_CANCEL"));this.O(this.jv);z(this,this.He.bF,this.eG,this);z(this,this.Qi.ja,this.DA,this);z(this,a.og,this.Eg,this)}UI(){this.He.displayObject().blur()}J(a){super.J(a); +a?(this.xb(),this.Qi.J(""!=this.He.value())):(this.Gs=!0,this.He.gn(""),this.Gs=!1)}Bu(a){this.He.gn(a)}Qa(){L(this.SG,"right",this.jv.width()+"px")}DA(){this.He.gn("");this.eG()}eG(){this.Qi.J(""!=this.He.value());this.Gs||this.yt.C(this.He.value())}Eg(a){"PB_SEARCH_PANEL_DEFAULT_TEXT"===a&&this.He.setAttribute("placeholder",this.I.ia("PB_SEARCH_PANEL_DEFAULT_TEXT"))}};function rV(a){let b;"outline"==a.Gb&&void 0!==a.vq?(b=a.KX,a.Xu.J(!0),sV(a,!1)):(a.Xu.J(!1),"outline"===a.Gb&&a.H.outline.search&&sV(a,!0));void 0===b&&(b=tV(a,a.Gb));a.re.ha(b)}function sV(a,b){a.qe&&a.qe.J(b)}function uV(a){return a.H.outline.search&&"outline"===a.Gb&&(!a.Sc||!a.Sc.visible())} +function tV(a,b){switch(b){case "outline":return a.I.ia("PB_TITLE_PANEL_OUTLINE");case "notes":return a.I.ia("PB_TITLE_PANEL_NOTES");case "attachments":return a.I.ia("PB_TITLE_PANEL_ATTACHMENTS");case "presenterInfo":return a.I.ia("PB_TITLE_PANEL_PRESENTER_INFO")}throw Error("unknown page type");} +class vV extends P{constructor(a,b,c){super({F:"menu-layer-top-panel"});this.I=a;this.K=b;this.H=c;this.vq=void 0;this.KX="";this.Gb="outline";this.yt=E(this);this.cT=E(this);this.gE=E(this);this.re=this.sv();M(this,this.re);this.fE=this.LT();z(this,this.fE.ja,()=>this.qr().C());M(this,this.fE);this.Sc=this.qe=null;this.xV();this.Xu=this.JT();z(this,this.Xu.ja,()=>this.cT.C());M(this,this.Xu);z(this,this.H.outline.pb,this.xV,this);z(this,this.I.og,this.d5,this)}qr(){return this.gE}VR(a){this.Gb=a; +rV(this);"outline"==this.Gb&&this.H.outline.search?sV(this,!0):(sV(this,!1),this.HL())}UI(){this.Sc&&this.Sc.UI()}Bu(a){this.Sc&&(this.Sc.Bu(a),a&&this.RO(!1))}xV(){!this.H.outline.search||this.qe||this.Sc||(this.qe=this.pE(),this.qe.J(uV(this)),M(this,this.qe),z(this,this.qe.ja,this.RO,this),this.Sc=this.PT(),this.Sc.J(!1),z(this,this.qe.ja,this.g7,this),M(this,this.Sc),z(this,this.Sc.jv.ja,this.xW));this.Sc&&this.Sc.visible()&&!(this.H.outline.search&&"outline"===this.Gb&&this.Sc&&this.Sc.visible())&& +this.xW();this.qe&&this.qe.J(uV(this))}g7(a){this.yt.C(a)}xW(){this.yt.C("");this.HL()}Qa(){rV(this);this.Sc&&this.Sc.visible()&&this.Sc.xb()}$R(a){this.KX=a}d5(a){switch(a){case "PB_TITLE_PANEL_OUTLINE":case "PB_TITLE_PANEL_NOTES":case "PB_TITLE_PANEL_ATTACHMENTS":case "PB_TITLE_PANEL_PRESENTER_INFO":rV(this)}}};class wV extends vV{LT(){return new ZC({F:"close"})}pE(){return new ZC({F:"search"})}PT(){return new qV(this.I)}JT(){return new ZC({F:"back"})}sv(){return new P({F:"tab-title"})}RO(a){this.H.outline.search&&(void 0===a&&(a=!0),this.Sc.J(!0),a&&this.Sc.He.focus())}HL(){let a;null==(a=this.Sc)||a.J(!1)}};class xV extends aV{constructor({ga:a,xa:b,slides:c,resources:d,settings:e}){super({ga:a,xa:b,slides:c,resources:d,settings:e})}Op(){return new wV(this.I,this.K,this.H)}nE(){return new gV(this.I)}LU(a){if("outline"==a){if(this.kj){this.na.Bu(this.kj);return}return ZU(this,this.vq)&&this.Gf?new P({za:this.Gf.displayObject()}):this.qE()}if("attachments"==a)return new tU(this.Hw);if("presenterInfo"==a)return new iV(this.I,this.K,this.hl.Qf());if("notes"==a){a=new P({F:"notes"});const b=this.hl.Ei(); +b&&b.text()&&a.ha(b.text());return a}throw Error("unknown page type");}qE(){const a=[];for(let c=0;c{if(0>g.toLocaleLowerCase().indexOf(a))return!1;e=g.replace(new RegExp(`(${a.toLocaleLowerCase()})`,"gi"),"$1");f=`${this.I.ia(d)}
    `+c;return!0});return e&&f?f+e:null}ME(){const a=this.Vh.ku?this.Vh.ku+". ":"";if(this.Vh.jy&&this.Vh.location&&(-1$1"),a+(b||"---")):a+(b||"---")}Eg(a){switch(a){case "PB_SEARCH_RESULT_IN_TEXT_LABEL":case "PB_SEARCH_RESULT_IN_NOTES":this.Cm.wp(this.ME())}}};class EV extends kV{constructor(a,b,c){super();a.forEach(d=>jV(this,new DV(d,b,c)))}};class FV extends P{constructor(a,b){super({F:"search_panel"});this.I=a;this.yt=new C;this.Gs=!1;this.K=b;b=new P({za:Z(this.K,"search"),ka:O(this,"search-icon")});M(this,b);this.He=new FO({F:"search_input",prompt:a.ia("PB_SEARCH_PANEL_DEFAULT_TEXT")});M(this,this.He);b=new P({ka:O(this,"cancel-button")});const c=new P({za:Z(this.K,"close")});M(b,c);this.jv=b;M(this,this.jv);z(this,this.He.bF,this.eG,this);z(this,a.og,this.Eg,this)}UI(){this.He.displayObject().blur()}J(a){super.J(a);a||(this.Gs=!0, +this.He.gn(""),this.Gs=!1)}Bu(a){this.He.gn(a)}eG(){this.Gs||this.yt.C(this.He.value())}Eg(a){"PB_SEARCH_PANEL_DEFAULT_TEXT"===a&&this.He.setAttribute("placeholder",this.I.ia("PB_SEARCH_PANEL_DEFAULT_TEXT"))}};class GV extends vV{LT(){return this.Ae(Z(this.K,"close"),"close-button")}pE(){return this.Ae(Z(this.K,"search"),"search-button")}PT(){return new FV(this.I,this.K)}JT(){return this.Ae(Z(this.K,"back"),"back-button")}sv(){return new P({F:"tab-title"})}Ae(a,b){b=new P({F:b});a=new P({za:a});M(b,a);return b}RO(a){void 0===a&&(a=!0);this.Sc.J(!0);this.qe.J(!1);this.fE.J(!1);this.re.J(!1);a&&this.Sc.He.focus()}HL(){this.Sc&&(this.Sc.J(!1),this.fE.J(!0),this.re.J(!0),"outline"===this.Gb&&this.H.outline.search&& +this.qe.J(!0))}};class HV extends aV{constructor({ga:a,xa:b,slides:c,resources:d,settings:e}){super({ga:a,xa:b,slides:c,resources:d,settings:e})}Op(){return new GV(this.I,this.K,this.H)}nE(){return new AV(this.I,this.K)}LU(a){if("outline"==a){if(this.kj){this.na.Bu(this.kj);return}return ZU(this,this.vq)&&this.Gf?new P({za:this.Gf.displayObject()}):this.qE()}if("attachments"==a)return new sN(this.Hw,this.K,this.I);if("presenterInfo"==a)return new BV(this.I,this.K,this.hl.Qf());if("notes"==a){a=new P({F:"notes"}); +const b=this.hl.Ei();b&&b.text()&&a.ha(b.text());return a}throw Error("unknown page type");}qE(){const a=[];for(let c=0;cthis.jz(a.slide,!0,$U(this,a.slide),a.location))}};function IV(a,b){a.EZ.wp(b)}function JV(a){a.Ic&&z(a,a.Ic.ja,()=>a.AB.C(),a)} +class KV extends P{constructor(a,b,c){super({F:"top-panel"});this.K=a;this.B=b;this.H=c;this.AB=E(this);this.ra=Ki();this.EZ=new P({F:"slide-info"});M(this,this.EZ);this.Ic=null;this.vV();wn(this.displayObject(),this.ra);yi(this.displayObject(),"0 0");z(this,this.H.pb,this.vV,this)}qy(){return this.AB}Kb(a){super.Kb(a/this.ra)}vV(){this.H.Di&&!this.Ic&&(this.Ic=this.qs(),JV(this),M(this,this.Ic));this.Ic&&this.Ic.J(this.H.Di)}};class LV extends KV{constructor(a,b,c,d){super(a,b,c);Dj&&this.O(new WM({label:d.ia("PB_BACK_TO_APP_BUTTON_LABEL")}))}qs(){return new ZC({F:"menu"})}};class MV extends KV{constructor(a,b,c){super(a,b,c);Dj&&this.O(new WM({F:"back-to-app-button",eda:Z(a,"back_to_app")}))}qs(){const a=new P({F:"menu-button"});Gt(a,"menu");z(this,a.ja,()=>this.qy().C(),this);const b=new P({za:Z(this.K,"outline")});M(a,b);return a}};function NV(a,b){a.ob=new RT(!Mi);a.ob.J(!1);yi(a.ob.displayObject(),"left top");a.O(a.ob.displayObject());x(a,a.ob.displayObject(),"click",a.tN,a,!0);z(a,a.B.$().Ec(),()=>{const c="buffering"==a.B.$().state();var d=a.ob;c?d.Ff.show():d.Ff.Uc()});vO(a.ob,b.Tr().view());b=a.G.qd().Vf();for(let c=0;c{"activated"==e.playbackState()?(wO(a.ob,e.width(),e.height()),XT(a.ld),a.Ph!=e&&(a.Ph=e)):"deactivated"==e.playbackState()&&(a.Ph=void 0); +a.Xz()})}a.ld=new ZT({rda:a.ob,$x:a.R,pQ:new IT(a.H)});z(a,a.ld.vA,a.xN,a)}function OV(a){if(a.va){const b=a.Ka?a.Ka.height()*a.ra:0;L(a.va,"bottom",`${b}px`)}}function PV(a,b){z(a,b.yZ,(c,d,e)=>{QV(a)&&(e.preventAction(),a.tN())})} +function RV(a){if(a.H.topPanel.Di){var b=a.D.Ca().resources().Ai();b={ga:a.I,xa:a.K,slides:a.D.Ca().slides(),resources:b,settings:a.H.Pe};a.Jd=a.H.ui?new HV(b):new xV(b);a.Jd.J(!1);B(a,a.Jd);z(a,a.Jd.qr(),a.O3,a);z(a,a.Jd.RU,c=>{a.Xy();a.R.Cd().ue(c.index(),!0)});1a.zB())}function TV(a){if(a.H.lc.QI)return!0;if(-1===a.B.ma())return!1;a=a.B.fa().sb();return 1{xt(this.displayObject(),"not_loaded");OV(this);g&&(e=new fM,e=new SM(a,e),Qe(this,e.VA,()=>this.B.play()),e.show(this.displayObject()))});b=this.fz();this.R.displayObject().appendChild(b.displayObject());PV(this,a.view().Rr());x(this,this.R.displayObject(), +"click",this.tN,this,!0);z(this,this.B.$().Zb(),this.Uz,this);z(this,this.H.topPanel.Cc,this.Tk,this);z(this,this.H.topPanel.pb,this.Tk,this);z(this,this.H.bottomPanel.Cc,this.Tk,this);z(this,this.H.lc.Cc,this.Tk,this)}Tk(){this.H.topPanel.visible&&!this.na?this.Op():!this.H.topPanel.visible&&this.na&&this.jO();this.na&&this.O(this.na);this.H.bottomPanel.visible&&!this.Ka?this.nE():!this.H.bottomPanel.visible&&this.Ka&&(Se(this,this.Ka),this.Ka=null);this.Ka&&this.O(this.Ka);this.Jv();!this.H.bottomPanel.visible&& +!this.H.topPanel.visible||this.xd?this.H.bottomPanel.visible||this.H.topPanel.visible||!this.xd||(Se(this,this.xd),this.xd=null):SV(this);this.xd&&this.O(this.xd);this.H.topPanel.Di&&!this.Jd?RV(this):!this.H.topPanel.Di&&this.Jd&&(this.Jd.visible()&&this.Xy(),Se(this,this.Jd),this.Jd=null);this.Jd&&this.O(this.Jd);this.Jj(this.md.width,this.md.height);this.H.ui&&this.Ka&&this.Ka.X("with-border",!this.va)}jO(){Se(this,this.na);this.na=null}Op(){this.H.topPanel.visible&&(this.na=this.H.ui?new MV(this.K, +this.rc,this.H.topPanel):new LV(this.K,this.rc,this.H.topPanel,this.I),z(this,this.na.ja,()=>this.Ui()),z(this,this.na.qy(),()=>this.zB()),B(this,this.na))}nE(){this.H.bottomPanel.visible&&(this.Ka=this.H.ui?new qU({V:this.R.Cd(),slides:this.D.Ca().slides(),Of:this.H.bottomPanel,Uf:this.H.topPanel,ga:this.I,xa:this.K}):new kU({V:this.R.Cd(),slides:this.D.Ca().slides(),Of:this.H.bottomPanel,Uf:this.H.topPanel,ga:this.I,xa:this.K}),B(this,this.Ka),z(this,this.Ka.ja,()=>this.Ui()))}Jv(){(this.H.ui?this.H.lc.visible&& +TV(this)&&!this.va:this.H.lc.visible&&!this.va)?this.rs():(this.H.ui?this.H.lc.visible&&TV(this)||!this.va:this.H.lc.visible||!this.va)||this.iB();this.va&&this.O(this.va)}iB(){Se(this,this.va);this.va=null}rs(){this.H.lc.visible&&(this.va=this.H.ui?new oU:new nU,B(this,this.va))}Uz(){if(this.va){var a=this.D.Ca().slides();if(this.H.lc.QI){var b=this.B.$().timestamp();a=a.ti(b,!1,!0)/a.Pu()}else{var c=this.B;if(-1==c.ma())a=0;else{var d=c.fa();b=c.$().timestamp();b=a.ti(b,!1,!1);c=-1==c.ma()?0:c.fa().sb().duration(); +d=new gf(d.index(),0,0);a=a.ti(d,!1,!1);a=0a.J(b.nd()));return a}zB(a,b){super.zB(a,b);this.Jd&&(this.Jd.$R(b||""),this.Jd.show(this.B.fa(),a));this.na&&this.na.J(!1);this.Ka&&this.Ka.J(!1);this.xd&&this.xd.J(!1)}Xy(){this.Jd&&this.Jd.Uc();const a=this.Dq;this.na&&this.na.J(!a);this.Ka&&this.Ka.J(!a);this.xd&&this.xd.J(!a);super.Xy()}VF(a){"changeLayout"==a.name()&&(a=a.params().type,this.ld.VR(a), +this.Ui())}Jj(a,b){this.md=new cd(a,b);a>b?(wt(this.displayObject(),"landscape"),this.ob&&wt(this.ob.displayObject(),"landscape")):(xt(this.displayObject(),"landscape"),this.ob&&xt(this.ob.displayObject(),"landscape"));this.xd&&this.xd.Nx();this.Ka&&this.Ka.Nx();this.ld.oD(this.md);super.Jj(a,b)}ZL(a,b,c){var d=QV(this);var e=0;if(this.na&&!QV(this)){var f=parseFloat(Eh(this.na.displayObject(),"height"));isNaN(f)||(e+=f)}this.Dq&&(e=0);a:{if(this.Ka&&!QV(this)&&(f=parseFloat(Eh(this.Ka.displayObject(), +"height")),!isNaN(f)))break a;f=0}e+=f;f=0;this.xd&&d&&(d=this.xd.width(),f+=d*this.ra,this.xd.Wc(b),this.xd.Tf(-(b/this.ra)+b),L(this.xd,"right",`${-d*(1-this.ra)}px`));d=a-f;super.ZL(d,b-e,c);UV(this,!0);this.Xz();OV(this);this.Jd&&(e=this.H.ui?1:this.ra,this.Jd.resize(a/e,b/e),this.Jd.visible()&&this.Jd.xb());this.va&&this.va.Kb(d);this.na&&this.na.Kb(a);this.Ka&&(L(this.Ka,"bottom",`${c}px`),this.Ka.Kb(a))}Xz(){ST(this.ld,this.hf&&!!this.Ph);this.ld.El();QV(this)||this.ld.xp(this.ob)}xN(a){this.ld.El(); +a&&(this.ld.Br()==this.R?this.displayObject().insertBefore(this.ob.displayObject(),this.R.displayObject()):this.displayObject().insertBefore(this.R.displayObject(),this.ob.displayObject()))}oe(){super.oe();var a=this.Ph,b=this.G.qd().Vf();if(!a)for(var c=0;c=this.B.ma()){a=e;break}}this.hf=!!a;ST(this.ld,this.hf);a=-1!=this.B.ma()?this.B.fa():null;this.na&&(b="-",a&&a.visible()&&(b=this.B.fa().Mi()+1),IV(this.na,b+"/"+this.G.slides().Cp())); +const d=this.Dq;[this.na,this.Ka,this.va,this.xd].forEach(e=>e&&e.J(!d));if(a=this.B.fb())b=this.B.fa(),c=new XL(this.rc,VL),b=new YL(a.playerController(),c,2==b.Qn),a.setExternalNavigationController(b);this.Ui();UV(this);this.Jv();this.Jj(this.md.width,this.md.height);this.ld.El()}Ui(){yj&&this.hf&&yn(this.ob.displayObject())}tN(a){if(QV(this)){var b=!1,c=this.B.$d();a&&a.target&&(b=c.view(),b=null===b.Gv?!1:-1!=Ia(b.Gv,Ld(a.target)));a=!1;this.na&&(a=0==this.na.opacity());b&&a||WV(this,a)}}showTopPanel(a){this.na&& +L(this.na,"z-index",a?"99":"")}showBottomPanel(a){this.Ka&&L(this.Ka,"z-index",a?"99":"");this.xd&&L(this.xd,"z-index",a?"99":"")}}XV.prototype.showBottomPanel=XV.prototype.showBottomPanel;XV.prototype.showTopPanel=XV.prototype.showTopPanel;class YV extends P{constructor({F:a,kc:b,ga:c,xa:d}){super({F:a,zf:!0});this.D=b;this.R=b.view();this.G=b.Ca();this.I=c;this.K=d;this.B=b.view().V();this.Da=this.B.$();this.rc=b.view().Cd();this.Gg=new EM(this.displayObject(),"popup-layer");Gt(this.Gg.Ro,O(this,"popup-layer"));this.Gk=new GM({ga:this.I,zJ:this.Gg});this.ra=1;z(this,b.uy(),this.fo,this);z(this,b.view().Cd().Yx(),this.$n,this);z(this,b.Qx(),(e,f,g)=>{if(g){e=new fM;e=new SM(b,e);var h=z(this,e.VA,()=>{Ke(this,h);this.B.play()},this); +e.show(this.displayObject())}},this)}Qa(a,b){a&&b&&this.Gg.Jl(a,b)}fo(a){if("resumePlayback"==a.action()&&"prompt"==this.G.settings().Vc().wu()){const b=this.B.Pf();this.TL(b);const c=a.L();a.xu("delayStartup");const d=a.Zw;(()=>{FM(this.Gk,{mn:"PB_RESUME_PRESENTATION_WINDOW_TEXT",icon:Z(this.K,"mb_question_icon"),buttons:[{Jg:"PB_MESSAGE_BOX_YES",result:"yes"},{Jg:"PB_MESSAGE_BOX_NO",result:"no"}]}).then(e=>{this.R.setOverlayDisplayed(!1);"yes"==e?d.resume(c,!0):d.start(b,!0)});this.R.setOverlayDisplayed(!0)})()}else"gotoSlide"== +a.action()&&this.TL(a.L())}TL(){}nh(a,b){return(a.la(b).Mi()+1).toString()}$n(a){const b={},c=this.G.slides();let d;switch(a.rd().type()){case "currentSlideIsNotCompleted":d="PB_CURRENT_SLIDE_IS_NOT_COMPLETED";break;case "backwardNavigationIsRestricted":case "forwardNavigationIsRestricted":d="sequential"==this.G.settings().navigation().navigationType()?"PB_NAVIGATION_IS_SEQUENTIAL":"PB_NAVIGATION_IS_RESTRICTED";break;case "interactionNotCompleted":d="PB_QUIZ_SLIDE_WINDOW_TEXT";a=this.B.fa();a instanceof +Bq?d="PB_SCENARIO_SLIDE_WINDOW_TEXT":a instanceof tq&&(d="PB_INTERACTION_SLIDE_WINDOW_TEXT");break;case "precedingQuizFailed":d="PB_PRECEDING_QUIZ_FAILED_WINDOW_TEXT";b.SLIDE_INDEX=this.nh(c,a.rd().Pd());break;case "precedingQuizNotPassed":d="PB_PRECEDING_QUIZ_NOT_PASSED_WINDOW_TEXT";b.SLIDE_INDEX=this.nh(c,a.rd().Pd());break;case "precedingQuizNotCompleted":d="PB_PRECEDING_QUIZ_NOT_COMPLETED_WINDOW_TEXT";b.SLIDE_INDEX=this.nh(c,a.rd().Pd());break;case "precedingScenarioNotPassed":d="PB_PRECEDING_SCENARIO_NOT_PASSED_WINDOW_TEXT"; +b.SLIDE_INDEX=this.nh(c,a.rd().Pd());break;case "precedingScenarioFailed":d="PB_PRECEDING_SCENARIO_FAILED_WINDOW_TEXT";b.SLIDE_INDEX=this.nh(c,a.rd().Pd());break;case "precedingScenarioNotCompleted":d="PB_PRECEDING_SCENARIO_NOT_COMPLETED_WINDOW_TEXT";b.SLIDE_INDEX=this.nh(c,a.rd().Pd());break;default:return}this.vo(d,b)}FA(a){Ws(this.Da,a)}vo(a,b){const c=this.B.$().suspended();this.R.setOverlayDisplayed(!0);FM(this.Gk,{mn:a,icon:Z(this.K,"mb_warning_icon"),buttons:[{Jg:"PB_MESSAGE_BOX_OK",result:"ok"}], +Kx:()=>b}).then(()=>{this.R.setOverlayDisplayed(!1);this.FA(c)})}};class ZV extends P{constructor(){super({F:"preloader"});this.a9=800;this.L5=500;this.Ao=!1;this.b9=E(this);this.K4=E(this);this.J(!1)}show(){this.Ao||(this.Ao=!0,clearTimeout(this.Mz),clearTimeout(this.BB),this.BB=Gi(this.o7,this,this.a9))}Uc(){if(this.Ao&&(this.Ao=!1,clearTimeout(this.Mz),clearTimeout(this.BB),this.visible())){var a=this.L5-((new Date).getTime()-this.g9);0{this.im.contains(g.target)||(this.Ze.contains(g.target)||!this.R.displayObject().contains(g.target)? +(eW(this,!this.im.visible()),fW(this),g.preventDefault()):eW(this,!1))},Nm)}Br(){return this.Zc}AI(){return this.Zc==this.Ze?this.R:this.Ze}El(){this.jF();this.XL();var a=this.zb;if($V(this.Sa))a.Ze.X("draggable",!1),hW(a,!1);else{const b=a.ld.Br();a.Ze.X("draggable",b==a.Ze);hW(a,b==a.R)}fW(this)}jF(){const a=this.OE(),b=this.Fn(this.R);this.R.resize(a.width,a.height);this.Bt(this.R.displayObject(),b)}OE(){if(this.Zc==this.R){var a=this.Sa;var b=a.G.slideWidth();var c=a.G.slideHeight();a=bW(a);const {width:d, +height:e}=An({width:b,height:c,boundingWidth:a.width,boundingHeight:a.height,oC:!0});b=new cd(d,e)}else b=this.Sa,a=null,c=b.B,-1!=c.ma()&&(c.Oa()&&(a=c.Oa().quiz().quizSize(),a=new cd(a.width,a.height)),c.fb()&&(a=c.fb().currentSession().interaction().interactionSize(),a=new cd(a.width,a.height)),c.tb()),c=a||new cd(b.G.slideWidth(),b.G.slideHeight()),b=cW(b,c.width,c.height);return b}XL(){if(this.Zc==this.Ze)var a=bW(this.Sa);else a=this.Sa,a=a.Cn?cW(a,a.Cn.width(),a.Cn.height()):new cd(0,0);this.Ze.resize(a.width, +a.height);const b=ci(this.Ze.displayObject());this.fr.resize(a.width-b.left-b.right,a.height-b.top-b.bottom);this.Xz()}Xz(){const a=this.Fn(this.Ze);this.Bt(this.Ze.displayObject(),a)}Fn(a){a=this.Zc!=a;return $V(this.Sa)||a?new Xc(0,0):this.Dn?new Xc(this.sm,this.tm):aW(this.Sa)}Bt(a,b){F(a,"transform",`translate(${b.x}px, ${b.y}px)`)}gX(){this.El();this.Ik&&Se(this,this.Ik);this.Dn=!1;eW(this,!1);if(mL()&&this.Fb&&this.Fb.showed()){let a=0,b=0;this.Ik=new QT(this.Zc.displayObject(),{E1:()=>{if(!this.Dn){const c= +aW(this.Sa);this.sm=c.x;this.tm=c.y}a=this.sm;b=this.tm},D1:c=>{this.Dn=!0;this.sm=xv(a+c.x,0,this.zb.width()-this.Zc.width());this.tm=xv(b+c.y,0,this.zb.height()-this.Zc.height());this.jF();this.Xz()},Pba:()=>{}});B(this,this.Ik)}}xN(){this.xp(this.AI())}xp(a){this.Zc=a;eW(this,!1);this.vA.C()}};function iW(a){const b=new P({F:"video-narration-view"});Gt(b,O(a,"narration-view"));b.J(!1);b.O(a.fr);M(a.Ri,b);return b}function jW(a,b){return new dW({BC:a,sidePanelController:a.Fb,Ca:b.Ca(),V:b.view().V()})}function kW(a){const b=new gW({BC:a,pQ:a.Sa,Gba:a.Ze,$x:a.R,sidePanelController:a.Fb,sda:a.fr});B(a,b);z(a,b.vA,a.WW,a);return b}function lW(a){const b=a.uL(),c=void 0!==b;mW(a,c);c?a.Sa.Cn=b:(a.Sa.Cn=null,a.ld.xp(a.Ze))} +function nW(a,b){for(let c=0;c{"activated"==e.playbackState()?a.Ph!=e&&(a.Ph=e,mW(a,!0),a.Sa.Cn=e):"deactivated"==e.playbackState()&&(a.Ph=void 0,lW(a));a.ld.El()},a)}}function oW(a,b){const c=a.G.slides().la(b).jp();let d;for(let e=0;e{var f=this.ld;f.El();f.gX();eW(f,!1)},this);z(this,this.B.$().wC(),this.b5,this);z(this,this.B.vc(),()=>{lW(this);this.ld.El()}, +this);nW(this,d);this.WW();this.X("portrait",!mL())}xn(a){"MaximizedVideo"==a&&this.ld.xp(this.R)}Br(){return this.ld.Br()}AI(){return this.ld.AI()}uL(){let a=this.Ph;const b=this.G.qd().Vf();if(!a)for(let c=0;c=this.B.ma()){a=d;break}}return a}Qa(a,b){super.Qa(a,b);this.ld.El();this.X("portrait",!mL())}b5(){this.B.$().nd()?this.Ff.show():this.Ff.Uc()}WW(){this.ld.El();const a=this.ld.Br()==this.R;this.X("presentation-minimized", +a);a?this.Ri.Me(this.Ze,0):this.Ri.Me(this.R,0)}};function qW(a){a=new P({ka:O(a.Ga,"cc")});a.J(!1);return a}function rW(a){const b=new SN({Ca:a.G,V:a.R.V(),settings:a.H,ga:a.I,view:a,sidePanelController:a.Z});B(a,b);return b}function sW(a){a.H.Aa.Xc.he?a.JP():a.KP()} +class tW extends YV{constructor(a,b,c,d){super({F:"universal-tablet",kc:a,ga:c,xa:d});this.H=b;this.Qg=a.kk();this.Yy=E(this);this.Aw=new Xc(0,0);this.ZN=1;this.vb=this.Xe=null;this.uz=[];this.Xd=this.um=this.va=this.Pb=this.ub=this.na=this.Z=null;const {WQ:e,V0:f,W0:g}=RQ(this.G.slides());this.FL=f;this.Es=g;this.Lz=e;this.Qb=this.H.Aa.Lc;this.ps=this.H.Aa.controlPanel;this.gj=this.ps.lc;this.Ua=this.H.Aa.Xc;this.Mv=new P({F:"universal-layout",zf:!0});this.Mv.X("left-panel",this.Ua.he);M(this,this.Mv, +0);this.Ga=new P({F:"universal-content-area"});M(this.Mv,this.Ga);b=new P({F:"popups-layer"});Gt(b,O(this,"popups-layer"));M(this,b);this.Ja=new SP(b);this.Ja.setScale(1,1);this.YM=E(this,this.Ja.np());a.view();this.zb=this.xK();M(this.Ga,this.zb);this.kd=qW(this);M(this.Ga,this.kd);this.Cw=rW(this);this.Tk();this.Jc=this.Np();z(this,this.R.Qe(),this.HA,this);z(this,this.B.vc(),this.oe,this);z(this,this.Ua.pb,this.tq,this);z(this,this.Ua.Cc,this.tq,this);z(this,this.Qb.Cc,this.tq,this);z(this,this.ps.Cc, +this.tq,this);z(this,this.gj.Cc,this.tq,this);a=new JM;z(this,a.LB,(h,l)=>this.resize(h,l))}TL(a){oW(this.zb,a)}g2(a){this.na&&$S(this.na,a)}pD(a){this.ub&&this.ub.pD(a)}np(){return this.YM}scale(){return 1}tq(){this.Tk();Se(this,this.Jc);this.Jc=this.Np();this.Mv.X("left-panel",this.Ua.he);this.na&&this.na.yp(this.Z);this.Pb&&this.Pb.yp(this.Z);this.xb()}Tk(){this.Wz();this.bM();this.Jv();sT(this);rT(this)}zY(){Se(this.Ga,this.ub);this.ub=null}MT(){return new VQ({skinSettings:this.H,Ca:this.G,V:this.R.Cd(), +soundController:this.R.soundController(),wj:this.Ja,ga:this.I,xa:this.K,kk:this.Qg,wx:this})}Kz(){return jS({Ca:this.G,V:this.B,CD:null,Ap:this.Ua})}Wz(){!this.Z&&this.Kz()&&this.Ua.visible?this.GK():!this.Z||this.Kz()&&this.Ua.visible||this.iO();this.Z&&this.Mv.Me(this.Z,1);this.Cw.ES(this.Z)}iO(){Se(this.Mv,this.Z);this.Z=null}GK(){this.Z=new hS(this.H,this.G,this.rc,this.I,this.K,!1);B(this,this.Z);sW(this);z(this,this.Z.showedStateChanged(),this.xb,this);this.Cw.ES(this.Z)}bM(){this.HM()?this.Op(): +this.IM()&&this.jO();this.na&&this.Ga.Me(this.na,0)}HM(){return(this.Es||this.Qb.visible)&&!this.na}IM(){return!(this.Es||this.Qb.visible)&&!!this.na}jO(){Se(this.Ga,this.na);this.na=null}Op(){this.na=new dT({Lu:this.Qb,rk:this.H.outline,Ap:this.Ua,Ca:this.G,V:this.rc,wj:this.Ja,ga:this.I,xa:this.K,sidePanelController:this.Z});B(this,this.na);z(this,this.na.yM,this.rq,this);z(this,this.na.iL,this.m6,this)}hz(){this.Pb=new sS({Lu:this.Qb,Ap:this.Ua,xa:this.K,sidePanelController:this.Z});B(this,this.Pb)}xK(){return new pW({V:this.B, +kc:this.D,sidePanelController:this.Z,Ca:this.G,Vf:this.G.qd().Vf()})}Np(){if(this.ub){const a=new uS({V:this.B,u2:this.na&&this.na.displayObject(),A0:this.ub.displayObject()});B(this,a);return a}return null}Jv(){!this.Xd&&tT(this);this.gj.visible?(!this.va&&this.rs(),this.Xd.J(!1)):(this.va&&this.iB(),this.Xd.J(!0));this.va&&M(this.Ga,this.va);this.Xd&&M(this.Ga,this.Xd)}iB(){Se(this.Ga,this.va);this.um=this.va=null}rs(){this.gj.visible&&(this.va=new KR({slides:this.G.slides(),settings:this.gj,V:this.rc}), +this.um=new NR({lc:this.va,V:this.rc,Ca:this.G,settings:this.gj}),B(this,this.va),B(this,this.um))}Qa(a,b){super.Qa(a,b);a&&b&&(a=(a=this.H.Aa.Xc)&&a.visible&&a.he,a=this.Z&&this.Z.showed()&&a?this.Z.width():0,this.Ja.Jl(12+a,this.width()-12,this.zb.height()),JP(this.Ja),a=0+(this.na&&this.na.visible()?this.na.height():12),a+=this.ub&&this.ub.visible()?this.ub.height():12,b-=a,this.na&&this.na.xb(),this.ub&&(this.ub.eJ(b-40),this.ub.xb()),this.Z&&(sW(this),this.Z.xb()),this.zb.xb())}JP(){this.Z.showed()? +L(this.Z,"margin-left",""):L(this.Z,"margin-left","-280px");L(this.Z,"margin-right","")}KP(){this.Z.showed()?L(this.Z,"margin-right",""):L(this.Z,"margin-right","-280px");L(this.Z,"margin-left","")}oZ(){const a=this.H.Aa.Lc;return a?a.visible&&a.sd:!1}MU(a){return(a=a.Qf())&&a.Zd()?a.Zd():this.G.Zd()}m6(){this.vb&&this.vb.hI()}rq(a){"nothing"!=a&&(this.Xe||this.FK(),this.vb||this.QL());this.Xe&&this.Xe.X("tool",a);this.vb&&nO(this.vb,a)}FK(){this.Xe=new P({F:"marker-tool-container"});this.Xe.Tf(0); +this.R.displayObject().appendChild(this.Xe.displayObject())}QL(){this.vb=new oO(this.R.Fi().offsetWidth,this.R.Fi().offsetHeight);this.Xe.O(this.vb);this.vb.setScale(1);this.uz[this.B.ma()]=this.vb;this.Iq()}Iq(){if(this.vb){this.vb.move(this.Aw.x,this.Aw.y);const a=this.R.scale();this.vb.setScale(a)}}HA(a,b,c,d){this.ZN=a/this.R.width();this.Aw=new Xc(c,d);this.Iq()}oe(){var a=this.B.Oa(),b=this.B.fb();a||b?xn(this.R.Fi(),"with-border")&&(a=this.R.Fi(),nn(a,"with-border")):(a=this.R.Fi(),mn(a,"with-border")); +JP(this.Ja);a=this.B.Oa();b=this.B.fb();const c=this.B.tb();this.va&&this.va.J(!a&&!b&&!c);this.Xd&&this.Xd.J(!this.va||!this.va.visible());this.Qt();this.Xe&&this.IO();this.ub&&(a=!!this.B.fb()||!!this.B.tb(),this.ub.X("minimize",a));this.Wz();this.na&&this.na.yp(this.Z);this.Pb&&this.Pb.yp(this.Z)}IO(){let a="nothing";this.vb&&(a=this.vb.EO,nO(this.vb,"nothing"));const b=this.B.ma();Cd(this.Xe.displayObject());this.vb=this.uz[b];const c=this.B.$(),d=z(this,c.Zb(),()=>{-1!=c.timestamp().Ba()&&(Ke(this, +d),this.vb&&this.Xe&&this.Xe.O(this.vb),this.rq(a))},this);this.Iq()}nh(a,b){b=a.la(b).Mi();return this.H.outline.zi?BN(a)[b]:(b+1).toString()}Qt(){if(this.kd.visible()){const a=this.B.fa().Ei();this.kd.ha(a?a.text():"")}}c2(){this.kd.visible()||(this.kd.J(!0),this.Qt(),this.Yy.C())}};function uW(a){const b=new xT(a.D(),a.Xa,a.I,a.K,a.oi);z(a,b.ll,()=>a.ll.C());z(a,b.Qk,()=>a.Qk.C());z(a,b.Jn,()=>a.Jn.C());return b} +class vW extends VM{constructor({sk:a,skinSettings:b,messages:c,ga:d,qj:e,Zm:f}){super({sk:a,messages:c,qj:e});this.Xa=b;this.I=d;this.K=this.HK(f)}HK(a){return new GL(uj?a.kR:a.RC)}QT(a){if("normal"==a){if(uj){a=this.D();var b=this.Xa,c=this.I,d=this.K;try{window.isLearn()}catch(e){}a=new XV(a,b,c,d)}else a=Ii?new tW(this.D(),this.Xa,this.I,this.K):uW(this);this.nl=a}else"accessible"==a&&(this.nl=new AN({kc:this.Bw,messages:this.pg,skinSettings:this.wK()}));B(this,this.nl)}wK(){return(new yT(this.Xa)).create()}} +;var wW=class{constructor(){const a={colors:{A:"colors"},controlPanel:{A:"controlPanel",visible:{A:"visible"},showOutline:{A:"showOutline"},xf:{A:"showPlayPause"},lc:{A:"progressBar",visible:{A:"visible"},enabled:{A:"enabled"},Lr:{A:"showLabels"},mode:{A:"mode"}},Sca:{A:"showRewind"},Mr:{A:"showVolumeControl"},Ll:{A:"showCCButton"},zp:{A:"showSlideOnlyButton"},Hu:{A:"showSlideNumbers"},yf:{A:"showPrevButton"},Re:{A:"showNextButton"},$g:{A:"navigationMode"},Qd:{A:"showPlaybackRateButton"}},Xc:{A:"sidePanel", +visible:{A:"visible"},he:{A:"showAtLeft"},sd:{A:"showLogo"},hh:{A:"showPresenterInfo"},jJ:{A:"showPresenterVideo"},ye:{A:"showNotes"},showOutline:{A:"showOutline"}},Lc:{A:"titlePanel",rr:{A:"courseTitleVisible"},gu:{A:"buttonsAtLeft"},sd:{A:"showLogo"},buttons:{A:"buttons"},visible:{A:"visible"}},tR:{A:"outlinePanel",Vm:{A:"numberEntries"},gp:{A:"highlightViewedEntries"},nn:{A:"thumbnails"},search:{A:"search"},zi:{A:"multilevel"}},miniskinCustomizationEnabled:{A:"miniskinCustomizationEnabled"},fontFamily:{A:"fontFamily"}, +borderRadius:{A:"borderRadius"}},b=eG();cG(a,b);this.Ta=a}eR(a={}){const b=new QN;a[this.Ta.colors]&&(b.colors=BL(a[this.Ta.colors]));if(a[this.Ta.Lc]){var c=a[this.Ta.Lc],d=b.Aa.Lc,e=this.Ta.Lc;d.sd=c[e.sd];d.rr=c[e.rr];d.gu=c[e.gu];d.buttonsOrder=c[e.buttons];d.visible=c[e.visible]}a[this.Ta.Xc]&&(c=a[this.Ta.Xc],d=b.Aa.Xc,e=this.Ta.Xc,d.visible=c[e.visible],d.he=c[e.he],d.sd=c[e.sd],d.hh=c[e.hh],d.jJ=c[e.jJ],d.ye=c[e.ye],d.showOutline=c[e.showOutline]);if(a[this.Ta.controlPanel]){c=a[this.Ta.controlPanel]; +e=b.Aa.controlPanel;const f=this.Ta.controlPanel;e.visible=c[f.visible];e.showOutline=c[f.showOutline];e.xf=c[f.xf];e.Ll=c[f.Ll];e.Qd=c[f.Qd];e.zp=c[f.zp];e.sy=c[f.Sca];e.$g=c[f.$g];if(c[f.lc]){d=c[f.lc];const g=b.Aa.controlPanel.lc,h=this.Ta.controlPanel.lc;g.visible=d[h.visible];g.enabled=d[h.enabled];g.Lr=d[h.Lr];g.mode=d[h.mode]}e.Mr=!Ii&&c[f.Mr];e.Hu=c[f.Hu];e.yf=c[f.yf];e.Re=c[f.Re]}a[this.Ta.tR]&&(c=a[this.Ta.tR],d=b.outline,e=this.Ta.tR,d.Vm=c[e.Vm],d.gp=c[e.gp],d.nn=c[e.nn],d.search=c[e.search], +d.zi=c[e.zi]);void 0!==a[this.Ta.miniskinCustomizationEnabled]&&(b.miniskinCustomizationEnabled=a[this.Ta.miniskinCustomizationEnabled]);a[this.Ta.fontFamily]&&(b.fontFamily=a[this.Ta.fontFamily]);null!==a[this.Ta.borderRadius]&&(b.borderRadius=a[this.Ta.borderRadius]);return b}};function xW(a,b,c,d,e){return new Promise(f=>{const g=new lL;e&&g.xw.addHandler(e);let h=null,l=null,n,m=!1,p,t;g.dY.addHandler(w=>{l=w;w=new wW;const y=l.settings();p=new qL(y.Yt().enabled());h=w.eR(y.skin());h.accessibilityModeEnabled=p.Km();l.settings().cF=h;m=MN(Ii&&!h.Aa.Xc.visible&&!h.Aa.Lc.visible&&!h.Aa.controlPanel.visible,l);w=h.colors;m?(n=new DL,t=new EL({Ca:l,DR:d,colors:w,Zm:n})):(n=new bN({tQ:new hG,uS:new JG,jR:h.miniskinCustomizationEnabled?new IG:new jG,mC:new gG,RC:iG,kR:kG}),t= +new dN({Ca:l,DR:d,colors:w,Zm:n}));t.dQ(p.mode())});g.xw.addHandler(w=>{const y=yW(l),D=new KG(y),I=w.view().V();I.Il().lx=h.Aa.controlPanel.Qd;oL(p,I);const A=zW({sk:w,skinSettings:h,messages:y,ga:D,qj:c,Rca:m,Zm:n,Km:p.Km()});pL(p,A);const J=rL(p,A,c,y),T=U=>{w.fn(U);if(A.nl){Fd(A.nl.displayObject());var X=A.oi;X.QE=null;X.Lh=null;Se(A,A.nl);A.nl=null}A.QT(U);X=A.nl.displayObject();A.l9.appendChild(X);A.oi.IC();X=A.Bw.view().V();const aa=X.ma();-1!=aa&&(X.vc().C(aa),ok(X.$d()),A.Bw.m0().F0(),A.Bw.Tr().F0(), +X.Wr.C());"accessible"==U&&document.body.removeAttribute("style");A.US.C(U);J&&("accessible"==U?(J.setAttribute("title",y.PB_ACCESSIBLE_SKIN_ENABLE_NORMAL_MODE),J.oy(-1),J.wf("hidden",!0)):(J.setAttribute("title",y.PB_ACCESSIBLE_SKIN_ENABLE_ACCESSIBILITY_MODE),J.oy(0),J.displayObject().removeAttribute("aria-hidden")))};T(p.mode());p.fY.addHandler(U=>{t.dQ(U);T(U)});f(new aN({sk:w,skinSettings:h,ga:D}))});g.sr(a,b,d)})} +function yW(a){a=qc(a.settings().ga());a.PB_ACCESSIBLE_SLIDES=a.PB_TAB_OUTLINE_LABEL;a.PB_ACCESSIBLE_PRESENTER_INFO=a.PB_TITLE_PANEL_PRESENTER_INFO;a.PB_ACCESSIBLE_TITLE_PANEL_ATTACHMENTS=a.PB_TITLE_PANEL_ATTACHMENTS;return a}function zW(a){const b=a.sk,c=a.skinSettings,d=a.messages,e=a.ga,f=a.qj,g=a.Km;return a.Rca?new $M({sk:b,messages:d,qj:f,Km:g,Zm:a.Zm}):new vW({sk:b,skinSettings:c,messages:d,ga:e,qj:f,Zm:a.Zm,Km:g})};q("PresentationPlayer.start",function(a,b,c,d,e){xW(a,fG(),b,c,d).then(f=>{bG(f,e)})});let Pj=()=>!1;function Te(a){a&&("function"===typeof a.gd&&a.gd(),a.disposed=!0)}function AW(a,b){Pj()&&(b?ia.console.error(a):ia.console.warn(a))}function ef(a,b){const c=a.stack||a.toString();0>String(c).indexOf(a.message)&&AW(a.message,b);AW(c,b)}window.onerror=function(...a){const [b,,,,c]=a;c?ef(c,!0):AW(b,!0);return!0};Ea=a=>{try{throw Error(a.message);}catch(b){ef(b,!1)}}; +ia.console||(window._log="",ia.console={log:function(a){window._log+="\n"+a},warn:function(a){window._log+="\nwarn: "+a},error:function(a){window._log+="\nerror: "+a}});})(); +/*! iScroll v5.2.0-snapshot ~ (c) 2008-2018 Matteo Spinelli ~ http://cubiq.org/license */ +!function(t,i,s){function e(s,e){this.wrapper="string"==typeof s?i.querySelector(s):s,this.scroller=this.wrapper.children[0],this.scrollerStyle=this.scroller.style,this.options={resizeScrollbars:!0,mouseWheelSpeed:20,snapThreshold:.334,disablePointer:!h.hasPointer,disableTouch:h.hasPointer||!h.hasTouch,disableMouse:h.hasPointer||h.hasTouch,startX:0,startY:0,scrollY:!0,directionLockThreshold:5,momentum:!0,onScrollHandler:Function.prototype,bounce:!0,bounceTime:600,bounceEasing:"",preventDefault:!0,preventDefaultException:{tagName:/^(A|INPUT|TEXTAREA|BUTTON|SELECT)$/},HWCompositing:!0,useTransition:!0,useTransform:!0,bindToWrapper:"undefined"==typeof t.onmousedown};for(var o in e)this.options[o]=e[o];this.translateZ=this.options.HWCompositing&&h.hasPerspective?" translateZ(0)":"",this.options.useTransition=h.hasTransition&&this.options.useTransition,this.options.useTransform=h.hasTransform&&this.options.useTransform,this.options.eventPassthrough=this.options.eventPassthrough===!0?"vertical":this.options.eventPassthrough,this.options.preventDefault=!this.options.eventPassthrough&&this.options.preventDefault,this.options.scrollY="vertical"!=this.options.eventPassthrough&&this.options.scrollY,this.options.scrollX="horizontal"!=this.options.eventPassthrough&&this.options.scrollX,this.options.freeScroll=this.options.freeScroll&&!this.options.eventPassthrough,this.options.directionLockThreshold=this.options.eventPassthrough?0:this.options.directionLockThreshold,this.options.bounceEasing="string"==typeof this.options.bounceEasing?h.ease[this.options.bounceEasing]||h.ease.circular:this.options.bounceEasing,this.options.resizePolling=void 0===this.options.resizePolling?60:this.options.resizePolling,this.options.tap===!0&&(this.options.tap="tap"),this.options.useTransition||this.options.useTransform||/relative|absolute/i.test(this.scrollerStyle.position)||(this.scrollerStyle.position="relative"),"scale"==this.options.shrinkScrollbars&&(this.options.useTransition=!1),this.options.invertWheelDirection=this.options.invertWheelDirection?-1:1,this.x=0,this.y=0,this.directionX=0,this.directionY=0,this._events={},this._init(),this.refresh(),this.scrollTo(this.options.startX,this.options.startY),this.enable()}function o(t,s,e){var o=i.createElement("div"),n=i.createElement("div");return e===!0&&(o.style.cssText="position:absolute;z-index:9999",n.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:absolute;background:rgba(0,0,0,0.5);border:1px solid rgba(255,255,255,0.9);border-radius:3px"),n.className="iScrollIndicator","h"==t?(e===!0&&(o.style.cssText+=";height:7px;left:2px;right:2px;bottom:0",n.style.height="100%"),o.className="iScrollHorizontalScrollbar"):(e===!0&&(o.style.cssText+=";width:7px;bottom:2px;top:2px;right:1px",n.style.width="100%"),o.className="iScrollVerticalScrollbar"),o.style.cssText+=";overflow:hidden",s||(o.style.pointerEvents="none"),o.appendChild(n),o}function n(s,e){this.wrapper="string"==typeof e.el?i.querySelector(e.el):e.el,this.wrapperStyle=this.wrapper.style,this.indicator=this.wrapper.children[0],this.indicatorStyle=this.indicator.style,this.scroller=s,this.options={listenX:!0,listenY:!0,interactive:!1,resize:!0,defaultScrollbars:!1,shrink:!1,fade:!1,speedRatioX:0,speedRatioY:0};for(var o in e)this.options[o]=e[o];if(this.sizeRatioX=1,this.sizeRatioY=1,this.maxPosX=0,this.maxPosY=0,this.options.interactive&&(this.options.disableTouch||(h.addEvent(this.indicator,"touchstart",this),h.addEvent(t,"touchend",this)),this.options.disablePointer||(h.addEvent(this.indicator,h.prefixPointerEvent("pointerdown"),this),h.addEvent(t,h.prefixPointerEvent("pointerup"),this)),this.options.disableMouse||(h.addEvent(this.indicator,"mousedown",this),h.addEvent(t,"mouseup",this))),this.options.fade){this.wrapperStyle[h.style.transform]=this.scroller.translateZ;var n=h.style.transitionDuration;if(!n)return;this.wrapperStyle[n]=h.isBadAndroid?"0.0001ms":"0ms";var a=this;h.isBadAndroid&&r(function(){"0.0001ms"===a.wrapperStyle[n]&&(a.wrapperStyle[n]="0s")}),this.wrapperStyle.opacity="0"}}var r=t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||t.msRequestAnimationFrame||function(i){t.setTimeout(i,1e3/60)},h=function(){function e(t){return r!==!1&&(""===r?t:r+t.charAt(0).toUpperCase()+t.substr(1))}var o={},n=i.createElement("div").style,r=function(){for(var t,i=["t","webkitT","MozT","msT","OT"],s=0,e=i.length;s0&&(h=n?n/2.5*(c/8):0,l=s.abs(t)+h,a=l/c),{destination:s.round(h),duration:a}};var h=e("transform");return o.extend(o,{hasTransform:h!==!1,hasPerspective:e("perspective")in n,hasTouch:"ontouchstart"in t,hasPointer:!(!t.PointerEvent&&!t.MSPointerEvent),hasTransition:e("transition")in n}),o.isBadAndroid=function(){var i=t.navigator.appVersion;if(/Android/.test(i)&&!/Chrome\/\d/.test(i)){var s=i.match(/Safari\/(\d+.\d)/);return!(s&&"object"==typeof s&&s.length>=2)||parseFloat(s[1])<535.19}return!1}(),o.extend(o.style={},{transform:h,transitionTimingFunction:e("transitionTimingFunction"),transitionDuration:e("transitionDuration"),transitionDelay:e("transitionDelay"),transformOrigin:e("transformOrigin"),touchAction:e("touchAction")}),o.hasClass=function(t,i){var s=new RegExp("(^|\\s)"+i+"(\\s|$)");return s.test(t.className)},o.addClass=function(t,i){if(!o.hasClass(t,i)){var s=t.className.split(" ");s.push(i),t.className=s.join(" ")}},o.removeClass=function(t,i){if(o.hasClass(t,i)){var s=new RegExp("(^|\\s)"+i+"(\\s|$)","g");t.className=t.className.replace(s," ")}},o.offset=function(t){for(var i=-t.offsetLeft,s=-t.offsetTop;t=t.offsetParent;)i-=t.offsetLeft,s-=t.offsetTop;return{left:i,top:s}},o.isHyperlink=function(t){if(!t)return!1;for(;t;){if("A"==t.nodeName.toLocaleUpperCase())return!0;t=t.parentNode}return!1},o.preventDefaultException=function(t,i){if(o.isHyperlink(t))return!0;for(var s in i)if(i[s].test(t[s]))return!0;return!1},o.extend(o.eventType={},{touchstart:1,touchmove:1,touchend:1,mousedown:2,mousemove:2,mouseup:2,pointerdown:3,pointermove:3,pointerup:3,MSPointerDown:3,MSPointerMove:3,MSPointerUp:3}),o.extend(o.ease={},{quadratic:{style:"cubic-bezier(0.25, 0.46, 0.45, 0.94)",fn:function(t){return t*(2-t)}},circular:{style:"cubic-bezier(0.1, 0.57, 0.1, 1)",fn:function(t){return s.sqrt(1- --t*t)}},back:{style:"cubic-bezier(0.175, 0.885, 0.32, 1.275)",fn:function(t){var i=4;return(t-=1)*t*((i+1)*t+i)+1}},bounce:{style:"",fn:function(t){return(t/=1)<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}},elastic:{style:"",fn:function(t){var i=.22,e=.4;return 0===t?0:1==t?1:e*s.pow(2,-10*t)*s.sin((t-i/4)*(2*s.PI)/i)+1}}}),o.tap=function(t,s){var e=i.createEvent("Event");e.initEvent(s,!0,!0),e.pageX=t.pageX,e.pageY=t.pageY,t.target.dispatchEvent(e)},o.click=function(s){var e,o=s.target;/(SELECT|INPUT|TEXTAREA)/i.test(o.tagName)||(e=i.createEvent(t.MouseEvent?"MouseEvents":"Event"),e.initEvent("click",!0,!0),e.view=s.view||t,e.detail=1,e.screenX=o.screenX||0,e.screenY=o.screenY||0,e.clientX=o.clientX||0,e.clientY=o.clientY||0,e.ctrlKey=!!s.ctrlKey,e.altKey=!!s.altKey,e.shiftKey=!!s.shiftKey,e.metaKey=!!s.metaKey,e.button=0,e.relatedTarget=null,e._constructed=!0,o.dispatchEvent(e))},o.getTouchAction=function(t,i){var s="none";return"vertical"===t?s="pan-y":"horizontal"===t&&(s="pan-x"),i&&"none"!=s&&(s+=" pinch-zoom"),s},o.getRect=function(t){if(t instanceof SVGElement){var i=t.getBoundingClientRect();return{top:i.top,left:i.left,width:i.width,height:i.height}}return{top:t.offsetTop,left:t.offsetLeft,width:t.offsetWidth,height:t.offsetHeight}},o}();e.prototype={version:"5.2.0-snapshot",_init:function(){this._initEvents(),(this.options.scrollbars||this.options.indicators)&&this._initIndicators(),this.options.mouseWheel&&this._initWheel(),this.options.snap&&this._initSnap(),this.options.keyBindings&&this._initKeys()},destroy:function(){this._initEvents(!0),clearTimeout(this.resizeTimeout),this.resizeTimeout=null,this._execEvent("destroy")},setScrollHeight:function(t){this.scrollHeight=t,this.refresh()},_transitionEnd:function(t){t.target==this.scroller&&this.isInTransition&&(this._transitionTime(),this.resetPosition(this.options.bounceTime)||(this.isInTransition=!1,this._execEvent("scrollEnd")))},_start:function(t){if(1!=h.eventType[t.type]){var i;if(i=t.which?t.button:t.button<2?0:4==t.button?1:2,0!==i)return}if(this.enabled&&(!this.initiated||h.eventType[t.type]===this.initiated)){!this.options.preventDefault||h.isBadAndroid||h.preventDefaultException(t.target,this.options.preventDefaultException)||t.preventDefault();var e,o=t.touches?t.touches[0]:t;this.initiated=h.eventType[t.type],this.moved=!1,this.distX=0,this.distY=0,this.directionX=0,this.directionY=0,this.directionLocked=0,this.startTime=h.getTime(),this.options.useTransition&&this.isInTransition?(this._transitionTime(),this.isInTransition=!1,e=this.getComputedPosition(),this._translate(s.round(e.x),s.round(e.y)),this._execEvent("scrollEnd")):!this.options.useTransition&&this.isAnimating&&(this.isAnimating=!1,this._execEvent("scrollEnd")),this.startX=this.x,this.startY=this.y,this.absStartX=this.x,this.absStartY=this.y,this.pointX=o.pageX,this.pointY=o.pageY,this._execEvent("beforeScrollStart")}},_move:function(t){if(this.enabled&&h.eventType[t.type]===this.initiated){this.options.preventDefault&&!h.preventDefaultException(t.target,this.options.preventDefaultException)&&t.preventDefault();var i,e,o,n,r=t.touches?t.touches[0]:t,a=r.pageX-this.pointX,l=r.pageY-this.pointY,c=h.getTime();if(this.pointX=r.pageX,this.pointY=r.pageY,this.distX+=a,this.distY+=l,o=s.abs(this.distX),n=s.abs(this.distY),!(c-this.endTime>300&&o<10&&n<10)){if(this.directionLocked||this.options.freeScroll||(o>n+this.options.directionLockThreshold?this.directionLocked="h":n>=o+this.options.directionLockThreshold?this.directionLocked="v":this.directionLocked="n"),"h"==this.directionLocked){if("vertical"==this.options.eventPassthrough)t.preventDefault();else if("horizontal"==this.options.eventPassthrough)return void(this.initiated=!1);l=0}else if("v"==this.directionLocked){if("horizontal"==this.options.eventPassthrough)t.preventDefault();else if("vertical"==this.options.eventPassthrough)return void(this.initiated=!1);a=0}a=this.hasHorizontalScroll?a:0,l=this.hasVerticalScroll?l:0,i=this.x+a,e=this.y+l,(i>0||i0?0:this.maxScrollX),(e>0||e0?0:this.maxScrollY),this.directionX=a>0?-1:a<0?1:0,this.directionY=l>0?-1:l<0?1:0,this.moved||this._execEvent("scrollStart"),this.moved=!0,this._translate(i,e),c-this.startTime>300&&(this.startTime=c,this.startX=this.x,this.startY=this.y)}}},_end:function(t){if(this.enabled&&h.eventType[t.type]===this.initiated){this.options.preventDefault&&!h.preventDefaultException(t.target,this.options.preventDefaultException)&&t.preventDefault();var i,e,o=(t.changedTouches?t.changedTouches[0]:t,h.getTime()-this.startTime),n=s.round(this.x),r=s.round(this.y),a=s.abs(n-this.startX),l=s.abs(r-this.startY),c=0,p="";if(this.isInTransition=0,this.initiated=0,this.endTime=h.getTime(),!this.resetPosition(this.options.bounceTime)){if(this.scrollTo(n,r),!this.moved)return this.options.tap&&h.tap(t,this.options.tap),this.options.click&&h.click(t),void this._execEvent("scrollCancel");if(this._events.flick&&o<200&&a<100&&l<100)return void this._execEvent("flick");if(this.options.momentum&&o<300&&(i=this.hasHorizontalScroll?h.momentum(this.x,this.startX,o,this.maxScrollX,this.options.bounce?this.wrapperWidth:0,this.options.deceleration):{destination:n,duration:0},e=this.hasVerticalScroll?h.momentum(this.y,this.startY,o,this.maxScrollY,this.options.bounce?this.wrapperHeight:0,this.options.deceleration):{destination:r,duration:0},n=i.destination,r=e.destination,c=s.max(i.duration,e.duration),this.isInTransition=1),this.options.snap){var d=this._nearestSnap(n,r);this.currentPage=d,c=this.options.snapSpeed||s.max(s.max(s.min(s.abs(n-d.x),1e3),s.min(s.abs(r-d.y),1e3)),300),n=d.x,r=d.y,this.directionX=0,this.directionY=0,p=this.options.bounceEasing}return n!=this.x||r!=this.y?((n>0||n0||r0?i=0:this.x0?s=0:this.y-1&&this._events[t].splice(s,1)}},_execEvent:function(t){if(this._events[t]){var i=0,s=this._events[t].length;if(s)for(;i0;var o=this.options.useTransition&&e.style;!s||o?(o&&(this._transitionTimingFunction(e.style),this._transitionTime(s)),this._translate(t,i)):this._animate(t,i,s,e.fn)},scrollToElement:function(t,i,e,o,n){if(t=t.nodeType?t:this.scroller.querySelector(t)){var r=h.offset(t);r.left-=this.wrapperOffset.left,r.top-=this.wrapperOffset.top;var a=h.getRect(t),l=h.getRect(this.wrapper);e===!0&&(e=s.round(a.width/2-l.width/2)),o===!0&&(o=s.round(a.height/2-l.height/2)),r.left-=e||0,r.top-=o||0,r.left=r.left>0?0:r.left0?0:r.top0?o--:i<0&&o++,e>0?n--:e<0&&n++,void this.goToPage(o,n);o=this.x+s.round(this.hasHorizontalScroll?i:0),n=this.y+s.round(this.hasVerticalScroll?e:0),this.directionX=i>0?-1:i<0?1:0,this.directionY=e>0?-1:e<0?1:0,o>0?o=0:o0?n=0:n-this.scrollerWidth;){for(this.pages[l]=[],t=0,n=0;n>-this.scrollerHeight;)this.pages[l][t]={x:s.max(p,this.maxScrollX),y:s.max(n,this.maxScrollY),width:d,height:u,cx:p-e,cy:n-o},n-=u,t++;p-=d,l++}else for(r=this.options.snap,t=r.length,i=-1;lthis.maxScrollX&&c++;this.goToPage(this.currentPage.pageX||0,this.currentPage.pageY||0,0),this.options.snapThreshold%1===0?(this.snapThresholdX=this.options.snapThreshold,this.snapThresholdY=this.options.snapThreshold):(this.snapThresholdX=s.round(this.pages[this.currentPage.pageX][this.currentPage.pageY].width*this.options.snapThreshold),this.snapThresholdY=s.round(this.pages[this.currentPage.pageX][this.currentPage.pageY].height*this.options.snapThreshold))}}),this.on("flick",function(){var t=this.options.snapSpeed||s.max(s.max(s.min(s.abs(this.x-this.startX),1e3),s.min(s.abs(this.y-this.startY),1e3)),300);this.goToPage(this.currentPage.pageX+this.directionX,this.currentPage.pageY+this.directionY,t)})},_nearestSnap:function(t,i){if(!this.pages.length)return{x:0,y:0,pageX:0,pageY:0};var e=0,o=this.pages.length,n=0;if(s.abs(t-this.absStartX)0?t=0:t0?i=0:i=this.pages[e][0].cx){t=this.pages[e][0].x;break}for(o=this.pages[e].length;n=this.pages[0][n].cy){i=this.pages[0][n].y;break}return e==this.currentPage.pageX&&(e+=this.directionX,e<0?e=0:e>=this.pages.length&&(e=this.pages.length-1),t=this.pages[e][0].x),n==this.currentPage.pageY&&(n+=this.directionY,n<0?n=0:n>=this.pages[0].length&&(n=this.pages[0].length-1),i=this.pages[0][n].y),{x:t,y:i,pageX:e,pageY:n}},goToPage:function(t,i,e,o){o=o||this.options.bounceEasing,t>=this.pages.length?t=this.pages.length-1:t<0&&(t=0),i>=this.pages[t].length?i=this.pages[t].length-1:i<0&&(i=0);var n=this.pages[t][i].x,r=this.pages[t][i].y;e=void 0===e?this.options.snapSpeed||s.max(s.max(s.min(s.abs(n-this.x),1e3),s.min(s.abs(r-this.y),1e3)),300):e,this.currentPage={x:n,y:r,pageX:t,pageY:i},this.scrollTo(n,r,e,o)},next:function(t,i){var s=this.currentPage.pageX,e=this.currentPage.pageY;s++,s>=this.pages.length&&this.hasVerticalScroll&&(s=0,e++),this.goToPage(s,e,t,i)},prev:function(t,i){var s=this.currentPage.pageX,e=this.currentPage.pageY;s--,s<0&&this.hasVerticalScroll&&(s=0,e--),this.goToPage(s,e,t,i)},_initKeys:function(i){var s,e={pageUp:33,pageDown:34,end:35,home:36,left:37,up:38,right:39,down:40};if("object"==typeof this.options.keyBindings)for(s in this.options.keyBindings)"string"==typeof this.options.keyBindings[s]&&(this.options.keyBindings[s]=this.options.keyBindings[s].toUpperCase().charCodeAt(0));else this.options.keyBindings={};for(s in e)this.options.keyBindings[s]=this.options.keyBindings[s]||e[s];h.addEvent(t,"keydown",this),this.on("destroy",function(){h.removeEvent(t,"keydown",this)})},_key:function(t){if(this.enabled){var i,e=this.options.snap,o=e?this.currentPage.pageX:this.x,n=e?this.currentPage.pageY:this.y,r=h.getTime(),a=this.keyTime||0,l=.25;switch(this.options.useTransition&&this.isInTransition&&(i=this.getComputedPosition(),this._translate(s.round(i.x),s.round(i.y)),this.isInTransition=!1),this.keyAcceleration=r-a<200?s.min(this.keyAcceleration+l,50):0,t.keyCode){case this.options.keyBindings.pageUp:this.hasHorizontalScroll&&!this.hasVerticalScroll?o+=e?1:this.wrapperWidth:n+=e?1:this.wrapperHeight;break;case this.options.keyBindings.pageDown:this.hasHorizontalScroll&&!this.hasVerticalScroll?o-=e?1:this.wrapperWidth:n-=e?1:this.wrapperHeight;break;case this.options.keyBindings.end:o=e?this.pages.length-1:this.maxScrollX,n=e?this.pages[0].length-1:this.maxScrollY;break;case this.options.keyBindings.home:o=0,n=0;break;case this.options.keyBindings.left:o+=e?-1:5+this.keyAcceleration>>0;break;case this.options.keyBindings.up:n+=e?1:5+this.keyAcceleration>>0;break;case this.options.keyBindings.right:o-=e?-1:5+this.keyAcceleration>>0;break;case this.options.keyBindings.down:n-=e?1:5+this.keyAcceleration>>0;break;default:return}if(e)return void this.goToPage(o,n);o>0?(o=0,this.keyAcceleration=0):o0?(n=0,this.keyAcceleration=0):n=p?(n.isAnimating=!1,n._translate(t,i),void(n.resetPosition(n.options.bounceTime)||n._execEvent("scrollEnd"))):(f=(f-c)/s,m=e(f),d=(t-a)*m+a,u=(i-l)*m+l,n._translate(d,u),void(n.isAnimating&&r(o)))}var n=this,a=this.x,l=this.y,c=h.getTime(),p=c+s;this.isAnimating=!0,o()},handleEvent:function(t){switch(t.type){case"touchstart":case"pointerdown":case"MSPointerDown":case"mousedown":t.defaultPrevented||this._start(t);break;case"touchmove":case"pointermove":case"MSPointerMove":case"mousemove":t.defaultPrevented||this._move(t);break;case"touchend":case"pointerup":case"MSPointerUp":case"mouseup":case"touchcancel":case"pointercancel":case"MSPointerCancel":case"mousecancel":this._end(t);break;case"orientationchange":case"resize":this._resize();break;case"transitionend":case"webkitTransitionEnd":case"oTransitionEnd":case"MSTransitionEnd":this._transitionEnd(t);break;case"wheel":case"DOMMouseScroll":case"mousewheel":this._wheel(t);break;case"keydown":this._key(t);break;case"click":this.enabled&&!t._constructed}}},n.prototype={handleEvent:function(t){switch(t.type){case"touchstart":case"pointerdown":case"MSPointerDown":case"mousedown":this._start(t);break;case"touchmove":case"pointermove":case"MSPointerMove":case"mousemove":this._move(t);break;case"touchend":case"pointerup":case"MSPointerUp":case"mouseup":case"touchcancel":case"pointercancel":case"MSPointerCancel":case"mousecancel":this._end(t)}},destroy:function(){this.options.fadeScrollbars&&(clearTimeout(this.fadeTimeout),this.fadeTimeout=null),this.options.interactive&&(h.removeEvent(this.indicator,"touchstart",this),h.removeEvent(this.indicator,h.prefixPointerEvent("pointerdown"),this),h.removeEvent(this.indicator,"mousedown",this),h.removeEvent(t,"touchmove",this),h.removeEvent(t,h.prefixPointerEvent("pointermove"),this),h.removeEvent(t,"mousemove",this),h.removeEvent(t,"touchend",this),h.removeEvent(t,h.prefixPointerEvent("pointerup"),this),h.removeEvent(t,"mouseup",this)),this.options.defaultScrollbars&&this.wrapper.parentNode&&this.wrapper.parentNode.removeChild(this.wrapper)},_start:function(i){var s=i.touches?i.touches[0]:i;i.preventDefault(),i.stopPropagation(),this.transitionTime(),this.initiated=!0,this.moved=!1,this.lastPointX=s.pageX,this.lastPointY=s.pageY,this.startTime=h.getTime(),this.options.disableTouch||h.addEvent(t,"touchmove",this),this.options.disablePointer||h.addEvent(t,h.prefixPointerEvent("pointermove"),this),this.options.disableMouse||h.addEvent(t,"mousemove",this),this.scroller._execEvent("beforeScrollStart")},_move:function(t){var i,s,e,o,n=t.touches?t.touches[0]:t;h.getTime();this.moved||this.scroller._execEvent("scrollStart"),this.moved=!0,i=n.pageX-this.lastPointX,this.lastPointX=n.pageX,s=n.pageY-this.lastPointY,this.lastPointY=n.pageY,e=this.x+i,o=this.y+s,this._pos(e,o),t.preventDefault(),t.stopPropagation()},_end:function(i){if(this.initiated){if(this.initiated=!1,i.preventDefault(),i.stopPropagation(),h.removeEvent(t,"touchmove",this),h.removeEvent(t,h.prefixPointerEvent("pointermove"),this),h.removeEvent(t,"mousemove",this),this.scroller.options.snap){var e=this.scroller._nearestSnap(this.scroller.x,this.scroller.y),o=this.options.snapSpeed||s.max(s.max(s.min(s.abs(this.scroller.x-e.x),1e3),s.min(s.abs(this.scroller.y-e.y),1e3)),300);this.scroller.x==e.x&&this.scroller.y==e.y||(this.scroller.directionX=0,this.scroller.directionY=0,this.scroller.currentPage=e,this.scroller.scrollTo(e.x,e.y,o,this.scroller.options.bounceEasing))}this.moved&&this.scroller._execEvent("scrollEnd")}},transitionTime:function(t){t=t||0;var i=h.style.transitionDuration;if(i&&(this.indicatorStyle[i]=t+"ms",!t&&h.isBadAndroid)){this.indicatorStyle[i]="0.0001ms";var s=this;r(function(){"0.0001ms"===s.indicatorStyle[i]&&(s.indicatorStyle[i]="0s")})}},transitionTimingFunction:function(t){this.indicatorStyle[h.style.transitionTimingFunction]=t},refresh:function(){this.transitionTime(),this.options.listenX&&!this.options.listenY?this.indicatorStyle.display=this.scroller.hasHorizontalScroll?"block":"none":this.options.listenY&&!this.options.listenX?this.indicatorStyle.display=this.scroller.hasVerticalScroll?"block":"none":this.indicatorStyle.display=this.scroller.hasHorizontalScroll||this.scroller.hasVerticalScroll?"block":"none",this.scroller.hasHorizontalScroll&&this.scroller.hasVerticalScroll?(h.addClass(this.wrapper,"iScrollBothScrollbars"),h.removeClass(this.wrapper,"iScrollLoneScrollbar"),this.options.defaultScrollbars&&this.options.customStyle&&(this.options.listenX?this.wrapper.style.right="8px":this.wrapper.style.bottom="8px")):(h.removeClass(this.wrapper,"iScrollBothScrollbars"),h.addClass(this.wrapper,"iScrollLoneScrollbar"),this.options.defaultScrollbars&&this.options.customStyle&&(this.options.listenX?this.wrapper.style.right="2px":this.wrapper.style.bottom="2px")),h.getRect(this.wrapper),this.options.listenX&&(this.wrapperWidth=this.wrapper.clientWidth,this.options.resize?(this.indicatorWidth=s.max(s.round(this.wrapperWidth*this.wrapperWidth/(this.scroller.scrollerWidth||this.wrapperWidth||1)),8),this.indicatorStyle.width=this.indicatorWidth+"px"):this.indicatorWidth=this.indicator.clientWidth,this.maxPosX=this.wrapperWidth-this.indicatorWidth,"clip"==this.options.shrink?(this.minBoundaryX=-this.indicatorWidth+8,this.maxBoundaryX=this.wrapperWidth-8):(this.minBoundaryX=0,this.maxBoundaryX=this.maxPosX),this.sizeRatioX=this.options.speedRatioX||this.scroller.maxScrollX&&this.maxPosX/this.scroller.maxScrollX),this.options.listenY&&(this.wrapperHeight=this.wrapper.clientHeight,this.options.resize?(this.indicatorHeight=s.max(s.round(this.wrapperHeight*this.wrapperHeight/(this.scroller.scrollerHeight||this.wrapperHeight||1)),8),this.indicatorStyle.height=this.indicatorHeight+"px"):this.indicatorHeight=this.indicator.clientHeight,this.maxPosY=this.wrapperHeight-this.indicatorHeight,"clip"==this.options.shrink?(this.minBoundaryY=-this.indicatorHeight+8,this.maxBoundaryY=this.wrapperHeight-8):(this.minBoundaryY=0,this.maxBoundaryY=this.maxPosY), +this.maxPosY=this.wrapperHeight-this.indicatorHeight,this.sizeRatioY=this.options.speedRatioY||this.scroller.maxScrollY&&this.maxPosY/this.scroller.maxScrollY),this.updatePosition()},updatePosition:function(){var t=this.options.listenX&&s.round(this.sizeRatioX*this.scroller.x)||0,i=this.options.listenY&&s.round(this.sizeRatioY*this.scroller.y)||0;this.options.ignoreBoundaries||(tthis.maxBoundaryX?"scale"==this.options.shrink?(this.width=s.max(this.indicatorWidth-(t-this.maxPosX),8),this.indicatorStyle.width=this.width+"px",t=this.maxPosX+this.indicatorWidth-this.width):t=this.maxBoundaryX:"scale"==this.options.shrink&&this.width!=this.indicatorWidth&&(this.width=this.indicatorWidth,this.indicatorStyle.width=this.width+"px"),ithis.maxBoundaryY?"scale"==this.options.shrink?(this.height=s.max(this.indicatorHeight-3*(i-this.maxPosY),8),this.indicatorStyle.height=this.height+"px",i=this.maxPosY+this.indicatorHeight-this.height):i=this.maxBoundaryY:"scale"==this.options.shrink&&this.height!=this.indicatorHeight&&(this.height=this.indicatorHeight,this.indicatorStyle.height=this.height+"px")),this.x=t,this.y=i,this.scroller.options.useTransform?this.indicatorStyle[h.style.transform]="translate("+t+"px,"+i+"px)"+this.scroller.translateZ:(this.indicatorStyle.left=t+"px",this.indicatorStyle.top=i+"px")},_pos:function(t,i){t<0?t=0:t>this.maxPosX&&(t=this.maxPosX),i<0?i=0:i>this.maxPosY&&(i=this.maxPosY),t=this.options.listenX?s.round(t/this.sizeRatioX):this.scroller.x,i=this.options.listenY?s.round(i/this.sizeRatioY):this.scroller.y,this.scroller.scrollTo(t,i)},fade:function(t,i){if(!i||this.visible){clearTimeout(this.fadeTimeout),this.fadeTimeout=null;var s=t?250:500,e=t?0:300;t=t?"1":"0",this.wrapperStyle[h.style.transitionDuration]=s+"ms",this.fadeTimeout=setTimeout(function(t){this.wrapperStyle.opacity=t,this.visible=+t}.bind(this,t),e)}}},e.utils=h,"undefined"!=typeof module&&module.exports?module.exports=e:"function"==typeof define&&define.amd?define(function(){return e}):t.IScroll=e}(window,document,Math);(function(){var r=Math,d=function(m){return m>>0},v=(/webkit/i).test(navigator.appVersion)?"webkit":(/firefox/i).test(navigator.userAgent)?"Moz":(/trident/i).test(navigator.userAgent)?"ms":"opera" in window?"O":"",w=(/android/gi).test(navigator.appVersion),i=(/iphone|ipad/gi).test(navigator.appVersion),c=(/playbook/gi).test(navigator.appVersion),n=(/hp-tablet/gi).test(navigator.appVersion),k=false,u="ontouchstart" in window&&!n,f=v+"Transform" in document.documentElement.style,g=i||c,o=(function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(m){return setTimeout(m,1)}})(),l=(function(){return window.cancelRequestAnimationFrame||window.webkitCancelAnimationFrame||window.webkitCancelRequestAnimationFrame||window.mozCancelRequestAnimationFrame||window.oCancelRequestAnimationFrame||window.msCancelRequestAnimationFrame||clearTimeout})(),h="onorientationchange" in window?"orientationchange":"resize",b=u?"touchstart":"mousedown",p=u?"touchmove":"mousemove",e=u?"touchend":"mouseup",t=u?"touchcancel":"mouseup",q=v=="Moz"?"DOMMouseScroll":"mousewheel",a="translate"+(k?"3d(":"("),j=k?",0)":")",s=function(y,m){var z=this,A=document,x;z.wrapper=typeof y=="object"?y:A.getElementById(y);z.wrapper.style.overflow="hidden";z.scroller=z.wrapper.children[0];z.options={hScroll:true,vScroll:true,x:0,y:0,bounce:true,bounceLock:false,momentum:true,lockDirection:true,useTransform:true,useTransition:false,topOffset:0,checkDOMChanges:false,handleClick:true,ignoreEmptyScroll:false,minThumbSize:16,hScrollbar:true,vScrollbar:true,fixedScrollbar:w,hideScrollbar:i,fadeScrollbar:i&&k,scrollbarClass:"",zoom:false,zoomMin:1,zoomMax:4,doubleTapZoom:2,wheelAction:"scroll",snap:false,snapThreshold:1,onRefresh:null,onBeforeScrollStart:function(B){B.preventDefault()},onScrollStart:null,onBeforeScrollMove:null,onScrollMove:null,onBeforeScrollEnd:null,onScrollEnd:null,onTouchEnd:null,onDestroy:null,onZoomStart:null,onZoom:null,onZoomEnd:null};for(x in m){z.options[x]=m[x]}z.x=z.options.x;z.y=z.options.y;z.options.useTransform=f?z.options.useTransform:false;z.options.hScrollbar=z.options.hScroll&&z.options.hScrollbar;z.options.vScrollbar=z.options.vScroll&&z.options.vScrollbar;z.options.zoom=z.options.useTransform&&z.options.zoom;z.options.useTransition=g&&z.options.useTransition;if(z.options.zoom&&w){a="translate(";j=")"}z.scroller.style[v+"TransformOrigin"]="0 0";if(z.options.useTransition){z.scroller.style[v+"TransitionProperty"]=z.options.useTransform?"-"+v.toLowerCase()+"-transform":"top left";z.scroller.style[v+"TransitionDuration"]="0";z.scroller.style[v+"TransitionTimingFunction"]="cubic-bezier(0.33,0.66,0.66,1)"}if(z.options.useTransform){z.scroller.style[v+"Transform"]=a+z.x+"px,"+z.y+"px"+j}else{z.scroller.style.cssText+=";position:absolute;top:"+z.y+"px;left:"+z.x+"px"}if(z.options.useTransition){z.options.fixedScrollbar=true}z.refresh();z._bind(h,window);z._bind(b);if(!u){z._bind("mouseout",z.wrapper);if(z.options.wheelAction!="none"){z._bind(q)}}if(z.options.checkDOMChanges){z.checkDOMTime=setInterval(function(){z._checkDOMChanges()},500)}};s.prototype={enabled:true,x:0,y:0,steps:[],scale:1,currPageX:0,currPageY:0,pagesX:[],pagesY:[],aniTime:null,wheelZoomCount:0,handleEvent:function(x){var m=this;switch(x.type){case b:if(!u&&x.button!==0){return}m._start(x);break;case p:m._move(x);break;case e:case t:m._end(x);break;case h:m._resize();break;case q:m._wheel(x);break;case"mouseout":m._mouseout(x);break;case"webkitTransitionEnd":m._transitionEnd(x);break}},_checkDOMChanges:function(){if(this.moved||this.zoomed||this.animating||(this.scrollerW==this.scroller.offsetWidth*this.scale&&this.scrollerH==this.scroller.offsetHeight*this.scale)){return}this.refresh()},_scrollbar:function(m){var y=this,z=document,x;if(!y[m+"Scrollbar"]){if(y[m+"ScrollbarWrapper"]){if(f){y[m+"ScrollbarIndicator"].style[v+"Transform"]=""}y[m+"ScrollbarWrapper"].parentNode.removeChild(y[m+"ScrollbarWrapper"]);y[m+"ScrollbarWrapper"]=null;y[m+"ScrollbarIndicator"]=null}return}if(!y[m+"ScrollbarWrapper"]){x=z.createElement("div");if(y.options.scrollbarClass){x.className=m+y.options.scrollbarClass}else{x.style.cssText="position:absolute;z-index:100;"+(m=="h"?"height:7px;bottom:1px;left:2px;right:"+(y.vScrollbar?"7":"2")+"px":"width:7px;bottom:"+(y.hScrollbar?"7":"2")+"px;top:2px;right:1px")}x.style.cssText+=";pointer-events:none;opacity:"+(y.options.hideScrollbar?"0":"1");y.wrapper.appendChild(x);y[m+"ScrollbarWrapper"]=x;x=z.createElement("div");x.id=m+"Thumb";x.className="thumb";if(!y.options.scrollbarClass){x.style.cssText="position:absolute;z-index:100;background:rgba(0,0,0,0.5);border:1px solid rgba(255,255,255,0.5);-"+v+"-background-clip:border-box;-"+v+"-box-sizing:content-box;"+(m=="h"?"height:100%":"width:100%")+";-"+v+"-border-radius:4px;border-radius:4px;"+(m=="h"?"bottom":"right")+":2px;"}x.style.cssText+=";pointer-events:none;-"+v+"-transform:"+a+"0,0"+j;if(y.options.useTransition){x.style.cssText+=";-"+v+"-transition-timing-function:cubic-bezier(0.33,0.66,0.66,1)"}y[m+"ScrollbarWrapper"].appendChild(x);y[m+"ScrollbarIndicator"]=x}if(m=="h"){y.hScrollbarSize=y.hScrollbarWrapper.clientWidth;y.hScrollbarIndicatorSize=r.max(d(y.hScrollbarSize*y.hScrollbarSize/y.scrollerW),y.options.minThumbSize);y.hScrollbarIndicator.style.width=y.hScrollbarIndicatorSize+"px";y.hScrollbarMaxScroll=y.hScrollbarSize-y.hScrollbarIndicatorSize;y.hScrollbarProp=y.hScrollbarMaxScroll/y.maxScrollX}else{y.vScrollbarSize=y.vScrollbarWrapper.clientHeight;y.vScrollbarIndicatorSize=r.max(d(y.vScrollbarSize*y.vScrollbarSize/y.scrollerH),y.options.minThumbSize);y.vScrollbarIndicator.style.height=y.vScrollbarIndicatorSize+"px";y.vScrollbarMaxScroll=y.vScrollbarSize-y.vScrollbarIndicatorSize;y.vScrollbarProp=y.vScrollbarMaxScroll/y.maxScrollY}y._scrollbarPos(m,true)},_resize:function(){var m=this;setTimeout(function(){m.refresh()},w?200:0)},_pos:function(m,z){this._posImpl(m,z);this._scrollbarPos("h");this._scrollbarPos("v")},_posImpl:function(m,z){if(this.zoomed){return}m=this.hScroll?m:0;z=this.vScroll?z:0;if(this.options.useTransform){this.scroller.style[v+"Transform"]=a+m+"px,"+z+"px"+j+" scale("+this.scale+")"}else{m=d(m);z=d(z);this.scroller.style.left=m+"px";this.scroller.style.top=z+"px"}this.x=m;this.y=z;if(this.options.onScrollMove){this.options.onScrollMove.call(this)}},_scrollbarPos:function(m,z){var y=this,A=m=="h"?y.x:y.y,x;if(!y[m+"Scrollbar"]){return}A=y[m+"ScrollbarProp"]*A;if(A<0){if(!y.options.fixedScrollbar){x=y[m+"ScrollbarIndicatorSize"]+d(A*3);if(x<8){x=8}y[m+"ScrollbarIndicator"].style[m=="h"?"width":"height"]=x+"px"}A=0}else{if(A>y[m+"ScrollbarMaxScroll"]){if(!y.options.fixedScrollbar){x=y[m+"ScrollbarIndicatorSize"]-d((A-y[m+"ScrollbarMaxScroll"])*3);if(x<8){x=8}y[m+"ScrollbarIndicator"].style[m=="h"?"width":"height"]=x+"px";A=y[m+"ScrollbarMaxScroll"]+(y[m+"ScrollbarIndicatorSize"]-x)}else{A=y[m+"ScrollbarMaxScroll"]}}}y[m+"ScrollbarWrapper"].style.opacity=z&&y.options.hideScrollbar?"0":"1";y[m+"ScrollbarIndicator"].style[v+"Transform"]=a+(m=="h"?A+"px,0":"0,"+A+"px")+j},_start:function(E){var D=this,z=u?E.touches[0]:E,A,m,F,C,B;if(!D.enabled){return}if(D.options.onBeforeScrollStart){D.options.onBeforeScrollStart.call(D,E)}if(D.options.useTransition||D.options.zoom){D._transitionTime(0)}D.moved=false;D.animating=false;D.zoomed=false;D.distX=0;D.distY=0;D.absDistX=0;D.absDistY=0;D.dirX=0;D.dirY=0;if(D.options.zoom&&u&&E.touches.length>1){C=r.abs(E.touches[0].pageX-E.touches[1].pageX);B=r.abs(E.touches[0].pageY-E.touches[1].pageY);D.touchesDistStart=r.sqrt(C*C+B*B);D.originX=r.abs(E.touches[0].pageX+E.touches[1].pageX-D.wrapperOffsetLeft*2)/2-D.x;D.originY=r.abs(E.touches[0].pageY+E.touches[1].pageY-D.wrapperOffsetTop*2)/2-D.y;if(D.options.onZoomStart){D.options.onZoomStart.call(D,E)}}if(D.options.momentum){if(D.options.useTransform){A=getComputedStyle(D.scroller,null)[v+"Transform"].replace(/[^0-9-.,]/g,"").split(",");m=A[4]*1;F=A[5]*1}else{m=getComputedStyle(D.scroller,null).left.replace(/[^0-9-]/g,"")*1;F=getComputedStyle(D.scroller,null).top.replace(/[^0-9-]/g,"")*1}if(m!=D.x||F!=D.y){if(D.options.useTransition){D._unbind("webkitTransitionEnd")}else{l(D.aniTime)}D.steps=[];D._pos(m,F)}}D.absStartX=D.x;D.absStartY=D.y;D.startX=D.x;D.startY=D.y;D.pointX=z.pageX;D.pointY=z.pageY;D.startTime=E.timeStamp||Date.now();if(D.options.onScrollStart){D.options.onScrollStart.call(D,E)}D._bind(p);D._bind(e);D._bind(t)},_move:function(E){var C=this,F=u?E.touches[0]:E,A=F.pageX-C.pointX,y=F.pageY-C.pointY,m=C.x+A,G=C.y+y,B,z,x,D=E.timeStamp||Date.now();if(C.options.ignoreEmptyScroll){if(C.maxScrollY==C.minScrollY){y=0}if(C.maxScrollX==0){A=0}}if(C.options.onBeforeScrollMove){C.options.onBeforeScrollMove.call(C,E)}if(C.options.zoom&&u&&E.touches.length>1){B=r.abs(E.touches[0].pageX-E.touches[1].pageX);z=r.abs(E.touches[0].pageY-E.touches[1].pageY);C.touchesDist=r.sqrt(B*B+z*z);C.zoomed=true;x=1/C.touchesDistStart*C.touchesDist*this.scale;if(xC.options.zoomMax){x=2*C.options.zoomMax*Math.pow(0.5,C.options.zoomMax/x)}}C.lastScale=x/this.scale;m=this.originX-this.originX*C.lastScale+this.x,G=this.originY-this.originY*C.lastScale+this.y;this.scroller.style[v+"Transform"]=a+m+"px,"+G+"px"+j+" scale("+x+")";if(C.options.onZoom){C.options.onZoom.call(C,E)}return}C.pointX=F.pageX;C.pointY=F.pageY;if(m>0||m=0||C.maxScrollX>=0?0:C.maxScrollX}if(G>C.minScrollY||G=C.minScrollY||C.maxScrollY>=0?C.minScrollY:C.maxScrollY}C.distX+=A;C.distY+=y;C.absDistX=r.abs(C.distX);C.absDistY=r.abs(C.distY);if(C.absDistX<6&&C.absDistY<6){return}if(C.options.lockDirection){if(C.absDistX>C.absDistY+5){G=C.y;y=0}else{if(C.absDistY>C.absDistX+5){m=C.x;A=0}}}C.moved=true;C._pos(m,G);C.dirX=A>0?-1:A<0?1:0;C.dirY=y>0?-1:y<0?1:0;if(D-C.startTime>300){C.startTime=D;C.startX=C.x;C.startY=C.y}if(C.options.onScrollMove){C.options.onScrollMove.call(C,E)}},_end:function(E){if(u&&E.touches.length!=0){return}var C=this,K=u?E.changedTouches[0]:E,F,J,y={dist:0,time:0},m={dist:0,time:0},B=(E.timeStamp||Date.now())-C.startTime,G=C.x,D=C.y,I,H,x,A,z;C._unbind(p);C._unbind(e);C._unbind(t);if(C.options.onBeforeScrollEnd){C.options.onBeforeScrollEnd.call(C,E)}if(C.zoomed){z=C.scale*C.lastScale;z=Math.max(C.options.zoomMin,z);z=Math.min(C.options.zoomMax,z);C.lastScale=z/C.scale;C.scale=z;C.x=C.originX-C.originX*C.lastScale+C.x;C.y=C.originY-C.originY*C.lastScale+C.y;C.scroller.style[v+"TransitionDuration"]="200ms";C.scroller.style[v+"Transform"]=a+C.x+"px,"+C.y+"px"+j+" scale("+C.scale+")";C.zoomed=false;C.refresh();if(C.options.onZoomEnd){C.options.onZoomEnd.call(C,E)}return}if(!C.moved){if(u){if(C.doubleTapTimer&&C.options.zoom){clearTimeout(C.doubleTapTimer);C.doubleTapTimer=null;if(C.options.onZoomStart){C.options.onZoomStart.call(C,E)}C.zoom(C.pointX,C.pointY,C.scale==1?C.options.doubleTapZoom:1);if(C.options.onZoomEnd){setTimeout(function(){C.options.onZoomEnd.call(C,E)},200)}}else{if(this.options.handleClick){C.doubleTapTimer=setTimeout(function(){C.doubleTapTimer=null;F=K.target;while(F.nodeType!=1){F=F.parentNode}if(F.tagName!="SELECT"&&F.tagName!="INPUT"&&F.tagName!="TEXTAREA"){J=document.createEvent("MouseEvents");J.initMouseEvent("click",true,true,E.view,1,K.screenX,K.screenY,K.clientX,K.clientY,E.ctrlKey,E.altKey,E.shiftKey,E.metaKey,0,null);J._fake=true;F.dispatchEvent(J)}},C.options.zoom?250:0)}}}C._resetPos(200);if(C.options.onTouchEnd){C.options.onTouchEnd.call(C,E)}return}if(B<300&&C.options.momentum){y=G?C._momentum(G-C.startX,B,-C.x,C.scrollerW-C.wrapperW+C.x,C.options.bounce?C.wrapperW:0):y;m=D?C._momentum(D-C.startY,B,-C.y,(C.maxScrollY<0?C.scrollerH-C.wrapperH+C.y-C.minScrollY:0),C.options.bounce?C.wrapperH:0):m;G=C.x+y.dist;D=C.y+m.dist;if((C.x>0&&G>0)||(C.xC.minScrollY&&D>C.minScrollY)||(C.y=0?0:m.x=m.minScrollY||m.maxScrollY>0?m.minScrollY:m.yz.options.zoomMax){C=z.options.zoomMax}if(C!=z.scale){if(!z.wheelZoomCount&&z.options.onZoomStart){z.options.onZoomStart.call(z,B)}z.wheelZoomCount++;z.zoom(B.pageX,B.pageY,C,400);setTimeout(function(){z.wheelZoomCount--;if(!z.wheelZoomCount&&z.options.onZoomEnd){z.options.onZoomEnd.call(z,B)}},400)}return}x=z.x+A;m=z.y+y;if(x>0){x=0}else{if(xz.minScrollY){m=z.minScrollY}else{if(m=A+B.time){C._pos(B.x,B.y);C.animating=false;if(C.options.onAnimationEnd){C.options.onAnimationEnd.call(C)}C._startAni();return}D=(D-A)/B.time-1;z=r.sqrt(1-D*D);F=(B.x-x)*z+x;E=(B.y-m)*z+m;C._pos(F,E);if(C.animating){C.aniTime=o(y)}};y()},_transitionTime:function(m){m+="ms";this.scroller.style[v+"TransitionDuration"]=m;if(this.hScrollbar){this.hScrollbarIndicator.style[v+"TransitionDuration"]=m}if(this.vScrollbar){this.vScrollbarIndicator.style[v+"TransitionDuration"]=m}},_momentum:function(D,x,B,m,F){var C=0.0006,y=r.abs(D)/x,z=(y*y)/(2*C),E=0,A=0;if(D>0&&z>B){A=F/(6/(z/y*C));B=B+A;y=y*B/z;z=B}else{if(D<0&&z>m){A=F/(6/(z/y*C));m=m+A;y=y*m/z;z=m}}z=z*(D<0?-1:1);E=y/C;return{dist:z,time:d(E)}},_offset:function(m){var y=-m.offsetLeft,x=-m.offsetTop;while(m=m.offsetParent){y-=m.offsetLeft;x-=m.offsetTop}if(m!=this.wrapper){y*=this.scale;x*=this.scale}return{left:y,top:x}},_snap:function(G,F){var D=this,C,B,E,A,z,m;E=D.pagesX.length-1;for(C=0,B=D.pagesX.length;C=D.pagesX[C]){E=C;break}}if(E==D.currPageX&&E>0&&D.dirX<0){E--}G=D.pagesX[E];z=r.abs(G-D.pagesX[D.currPageX]);z=z?r.abs(D.x-G)/z*500:0;D.currPageX=E;E=D.pagesY.length-1;for(C=0;C=D.pagesY[C]){E=C;break}}if(E==D.currPageY&&E>0&&D.dirY<0){E--}F=D.pagesY[E];m=r.abs(F-D.pagesY[D.currPageY]);m=m?r.abs(D.y-F)/m*500:0;D.currPageY=E;A=200;return{x:G,y:F,time:A}},_bind:function(y,x,m){(x||this.scroller).addEventListener(y,this,!!m)},_unbind:function(y,x,m){(x||this.scroller).removeEventListener(y,this,!!m)},resize:function(x,m){if(x){this.wrapperWidth=x}if(m){this.wrapperHeight=m}this.refresh()},destroy:function(){var m=this;m.scroller.style[v+"Transform"]="";m.hScrollbar=false;m.vScrollbar=false;m._scrollbar("h");m._scrollbar("v");m._unbind(h,window);m._unbind(b);m._unbind(p);m._unbind(e);m._unbind(t);if(!m.options.hasTouch){m._unbind("mouseout",m.wrapper);m._unbind(q)}if(m.options.useTransition){m._unbind("webkitTransitionEnd")}if(m.options.checkDOMChanges){clearInterval(m.checkDOMTime)}if(m.options.onDestroy){m.options.onDestroy.call(m)}},refresh:function(){var B=this,y,A,x,z,D=0,C=0;if(B.scaleB.wrapperH);B.hScrollbar=B.hScroll&&B.options.hScrollbar&&B.maxScrollX<0;B.vScrollbar=B.vScroll&&B.options.vScrollbar&&B.maxScrollY<0;y=B._offset(B.wrapper);B.wrapperOffsetLeft=-y.left;B.wrapperOffsetTop=-y.top;var E=document.defaultView.getComputedStyle(B.scroller,null);B.wrapperOffsetTop+=parseInt(E["padding-top"]);if(typeof B.options.snap=="string"){B.pagesX=[];B.pagesY=[];z=B.scroller.querySelectorAll(B.options.snap);for(A=0,x=z.length;A=B.maxScrollX){B.pagesX[C]=D;D=D-B.wrapperW;C++}if(B.maxScrollX%B.wrapperW){B.pagesX[B.pagesX.length]=B.maxScrollX-B.pagesX[B.pagesX.length-1]+B.pagesX[B.pagesX.length-1]}D=0;C=0;B.pagesY=[];while(D>=B.maxScrollY){B.pagesY[C]=D;D=D-B.wrapperH;C++}if(B.maxScrollY%B.wrapperH){B.pagesY[B.pagesY.length]=B.maxScrollY-B.pagesY[B.pagesY.length-1]+B.pagesY[B.pagesY.length-1]}}}B._scrollbar("h");B._scrollbar("v");if(!B.zoomed){B._resetPos(200)}},scrollTo:function(m,F,E,D){var C=this,B=m,A,z;if(!E){C._posImpl(m,F);return}C.stop();if(!B.length){B=[{x:m,y:F,time:E,relative:D}]}for(A=0,z=B.length;A=x.y-x.wrapper.clientHeight){return}else{if(z.topx.x-x.wrapper.clientWidth){return}else{if(z.left0?0:z.leftx.minScrollY?x.minScrollY:z.topB.pagesX.length-1?B.pagesX.length-1:A;z=z<0?0:z>B.pagesY.length-1?B.pagesY.length-1:z;B.currPageX=A;B.currPageY=z;m=B.pagesX[A];D=B.pagesY[z]}else{m=-B.wrapperW*A;D=-B.wrapperH*z;if(m0?0:z.xz.minScrollY?z.minScrollY:z.yi;i++){var r=g[i],f=r.toUpperCase()+"_"+t;if(f in a)return"@-"+r.toLowerCase()+"-"+n}return!1};l.atRule=m;var g=l._config.usePrefixes?" -webkit- -moz- -o- -ms- ".split(" "):["",""];l._prefixes=g,o(),a(r),delete l.addTest,delete l.addAsyncTest;for(var v=0;v255?255:this.r,this.g=this.g<0||isNaN(this.g)?0:this.g>255?255:this.g,this.b=this.b<0||isNaN(this.b)?0:this.b>255?255:this.b,this.toRGB=function(){return"rgb("+this.r+", "+this.g+", "+this.b+")"},this.toHex=function(){var e=this.r.toString(16),t=this.g.toString(16),n=this.b.toString(16);return e.length==1&&(e="0"+e),t.length==1&&(t="0"+t),n.length==1&&(n="0"+n),"#"+e+t+n},this.getHelpXML=function(){var e=new Array;for(var r=0;r "+f.toRGB()+" -> "+f.toHex());a.appendChild(l),a.appendChild(c),u.appendChild(a)}catch(h){}return u}}canvg=function(){function t(){var e={};return e.FRAMERATE=30,e.MAX_VIRTUAL_PIXELS=3e4,e.init=function(t){e.Definitions={},e.Styles={},e.Animations=[],e.Images=[],e.ctx=t,e.ViewPort=new function(){this.viewPorts=[],this.Clear=function(){this.viewPorts=[]},this.SetCurrent=function(e,t){this.viewPorts.push({width:e,height:t})},this.RemoveCurrent=function(){this.viewPorts.pop()},this.Current=function(){return this.viewPorts[this.viewPorts.length-1]},this.width=function(){return this.Current().width},this.height=function(){return this.Current().height},this.ComputeSize=function(e){return e!=null&&typeof e=="number"?e:e=="x"?this.width():e=="y"?this.height():Math.sqrt(Math.pow(this.width(),2)+Math.pow(this.height(),2))/Math.sqrt(2)}}},e.init(),e.ImagesLoaded=function(){for(var t=0;t]*>/,"");var n=new ActiveXObject("Microsoft.XMLDOM");return n.async="false",n.loadXML(e),n},e.Property=function(t,n){this.name=t,this.value=n,this.hasValue=function(){return this.value!=null&&this.value!==""},this.numValue=function(){if(!this.hasValue())return 0;var e=parseFloat(this.value);return(this.value+"").match(/%$/)&&(e/=100),e},this.valueOrDefault=function(e){return this.hasValue()?this.value:e},this.numValueOrDefault=function(e){return this.hasValue()?this.numValue():e};var r=this;this.Color={addOpacity:function(t){var n=r.value;if(t!=null&&t!=""){var i=new RGBColor_(r.value);i.ok&&(n="rgba("+i.r+", "+i.g+", "+i.b+", "+t+")")}return new e.Property(r.name,n)}},this.Definition={getDefinition:function(){var t=r.value.replace(/^(url\()?#([^\)]+)\)?$/,"$2");return e.Definitions[t]},isUrl:function(){return r.value.indexOf("url(")==0},getFillStyle:function(t){var n=this.getDefinition();return n!=null&&n.createGradient?n.createGradient(e.ctx,t):n!=null&&n.createPattern?n.createPattern(e.ctx,t):null}},this.Length={DPI:function(e){return 96},EM:function(t){var n=12,r=new e.Property("fontSize",e.Font.Parse(e.ctx.font).fontSize);return r.hasValue()&&(n=r.Length.toPixels(t)),n},toPixels:function(t){if(!r.hasValue())return 0;var n=r.value+"";return n.match(/em$/)?r.numValue()*this.EM(t):n.match(/ex$/)?r.numValue()*this.EM(t)/2:n.match(/px$/)?r.numValue():n.match(/pt$/)?r.numValue()*1.25:n.match(/pc$/)?r.numValue()*15:n.match(/cm$/)?r.numValue()*this.DPI(t)/2.54:n.match(/mm$/)?r.numValue()*this.DPI(t)/25.4:n.match(/in$/)?r.numValue()*this.DPI(t):n.match(/%$/)?r.numValue()*e.ViewPort.ComputeSize(t):r.numValue()}},this.Time={toMilliseconds:function(){if(!r.hasValue())return 0;var e=r.value+"";return e.match(/s$/)?r.numValue()*1e3:e.match(/ms$/)?r.numValue():r.numValue()}},this.Angle={toRadians:function(){if(!r.hasValue())return 0;var e=r.value+"";return e.match(/deg$/)?r.numValue()*(Math.PI/180):e.match(/grad$/)?r.numValue()*(Math.PI/200):e.match(/rad$/)?r.numValue():r.numValue()*(Math.PI/180)}}},e.Font=new function(){this.Styles=["normal","italic","oblique","inherit"],this.Variants=["normal","small-caps","inherit"],this.Weights=["normal","bold","bolder","lighter","100","200","300","400","500","600","700","800","900","inherit"],this.CreateFont=function(t,n,r,i,s,o){var u=o!=null?this.Parse(o):this.CreateFont("","","","","",e.ctx.font);return{fontFamily:s||u.fontFamily,fontSize:i||u.fontSize,fontStyle:t||u.fontStyle,fontWeight:r||u.fontWeight,fontVariant:n||u.fontVariant,toString:function(){return[this.fontStyle,this.fontVariant,this.fontWeight,this.fontSize,this.fontFamily].join(" ")}}};var t=this;this.Parse=function(n){var r={},i=e.trim(e.compressSpaces(n||"")).split(" "),s={fontSize:!1,fontStyle:!1,fontWeight:!1,fontVariant:!1},o="";for(var u=0;uthis.x2&&(this.x2=e)}if(t!=null){if(isNaN(this.y1)||isNaN(this.y2))this.y1=t,this.y2=t;tthis.y2&&(this.y2=t)}},this.addX=function(e){this.addPoint(e,null)},this.addY=function(e){this.addPoint(null,e)},this.addBoundingBox=function(e){this.addPoint(e.x1,e.y1),this.addPoint(e.x2,e.y2)},this.addQuadraticCurve=function(e,t,n,r,i,s){var o=e+2/3*(n-e),u=t+2/3*(r-t),a=o+1/3*(i-e),f=u+1/3*(s-t);this.addBezierCurve(e,t,o,a,u,f,i,s)},this.addBezierCurve=function(e,t,n,r,i,s,o,u){var a=[e,t],f=[n,r],l=[i,s],c=[o,u];this.addPoint(a[0],a[1]),this.addPoint(c[0],c[1]);for(var h=0;h<=1;h++){var p=function(e){return Math.pow(1-e,3)*a[h]+3*Math.pow(1-e,2)*e*f[h]+3*(1-e)*Math.pow(e,2)*l[h]+Math.pow(e,3)*c[h]},d=6*a[h]-12*f[h]+6*l[h],v=-3*a[h]+9*f[h]-9*l[h]+3*c[h],m=3*f[h]-3*a[h];if(v==0){if(d==0)continue;var g=-m/d;0=this.tokens.length-1},this.isCommandOrEnd=function(){return this.isEnd()?!0:this.tokens[this.i+1].match(/^[A-Za-z]$/)!=null},this.isRelativeCommand=function(){return this.command==this.command.toLowerCase()},this.getToken=function(){return this.i=this.i+1,this.tokens[this.i]},this.getScalar=function(){return parseFloat(this.getToken())},this.nextCommand=function(){this.previousCommand=this.command,this.command=this.getToken()},this.getPoint=function(){var t=new e.Point(this.getScalar(),this.getScalar());return this.makeAbsolute(t)},this.getAsControlPoint=function(){var e=this.getPoint();return this.control=e,e},this.getAsCurrentPoint=function(){var e=this.getPoint();return this.current=e,e},this.getReflectedControlPoint=function(){if(this.previousCommand.toLowerCase()!="c"&&this.previousCommand.toLowerCase()!="s")return this.current;var t=new e.Point(2*this.current.x-this.control.x,2*this.current.y-this.control.y);return t},this.makeAbsolute=function(e){return this.isRelativeCommand()&&(e.x=this.current.x+e.x,e.y=this.current.y+e.y),e},this.addMarker=function(e,t,n){n!=null&&this.angles.length>0&&this.angles[this.angles.length-1]==null&&(this.angles[this.angles.length-1]=this.points[this.points.length-1].angleTo(n)),this.addMarkerAngle(e,t==null?null:t.angleTo(e))},this.addMarkerAngle=function(e,t){this.points.push(e),this.angles.push(t)},this.getMarkerPoints=function(){return this.points},this.getMarkerAngles=function(){for(var e=0;e1&&(c*=Math.sqrt(g),h*=Math.sqrt(g));var y=(d==v?-1:1)*Math.sqrt((Math.pow(c,2)*Math.pow(h,2)-Math.pow(c,2)*Math.pow(m.y,2)-Math.pow(h,2)*Math.pow(m.x,2))/(Math.pow(c,2)*Math.pow(m.y,2)+Math.pow(h,2)*Math.pow(m.x,2)));isNaN(y)&&(y=0);var b=new e.Point(y*c*m.y/h,y*-h*m.x/c),w=new e.Point((u.x+l.x)/2+Math.cos(p)*b.x-Math.sin(p)*b.y,(u.y+l.y)/2+Math.sin(p)*b.x+Math.cos(p)*b.y),E=function(e){return Math.sqrt(Math.pow(e[0],2)+Math.pow(e[1],2))},S=function(e,t){return(e[0]*t[0]+e[1]*t[1])/(E(e)*E(t))},x=function(e,t){return(e[0]*t[1]=1&&(k=0),v==0&&k>0&&(k-=2*Math.PI),v==1&&k<0&&(k+=2*Math.PI);var L=new e.Point(w.x-c*Math.cos((T+k)/2),w.y-h*Math.sin((T+k)/2));n.addMarkerAngle(L,(T+k)/2+(v==0?1:-1)*Math.PI/2),n.addMarkerAngle(l,k+(v==0?1:-1)*Math.PI/2),r.addPoint(l.x,l.y);if(t!=null){S=c>h?c:h;var A=c>h?1:c/h,O=c>h?h/c:1;t.translate(w.x,w.y),t.rotate(p),t.scale(A,O),t.arc(0,0,S,T,T+k,1-v),t.scale(1/A,1/O),t.rotate(-p),t.translate(-w.x,-w.y)}}break;case"Z":t!=null&&t.closePath(),n.current=n.start}}return r},this.getMarkers=function(){var e=this.PathParser.getMarkerPoints(),t=this.PathParser.getMarkerAngles(),n=[];for(var r=0;rthis.maxDuration){if(this.attribute("repeatCount").value!="indefinite")return this.attribute("fill").valueOrDefault("remove")=="remove"&&!this.removed?(this.removed=!0,this.getProperty().value=this.initialValue,!0):!1;this.duration=0}this.duration=this.duration+e;var t=!1;if(this.begin0&&t[n-1]!=" "&&n0&&t[n-1]!=" "&&(n==t.length-1||t[n+1]==" ")&&(s="initial"),typeof e.glyphs[r]!="undefined"&&(i=e.glyphs[r][s],i==null&&e.glyphs[r].type=="glyph"&&(i=e.glyphs[r]))}else i=e.glyphs[r];return i==null&&(i=e.missingGlyph),i},this.renderChildren=function(t){var n=this.parent.style("font-family").Definition.getDefinition();if(n!=null){var r=this.parent.style("font-size").numValueOrDefault(e.Font.Parse(e.ctx.font).fontSize),i=this.parent.style("font-style").valueOrDefault(e.Font.Parse(e.ctx.font).fontStyle),s=this.getText();n.isRTL&&(s=s.split("").reverse().join(""));var o=e.ToNumberArray(this.parent.attribute("dx").value);for(var u=0;u0?t.childNodes[0].value:t.text,this.getText=function(){return this.text}},e.Element.tspan.prototype=new e.Element.TextElementBase,e.Element.tspan=e.Element.tspan,e.Element.tref=function(t){this.base=e.Element.TextElementBase,this.base(t),this.getText=function(){var e=this.attribute("xlink:href").Definition.getDefinition();if(e!=null)return e.children[0].getText()}},e.Element.tref.prototype=new e.Element.TextElementBase,e.Element.tref=e.Element.tref,e.Element.a=function(t){this.base=e.Element.TextElementBase,this.base(t),this.hasText=!0;for(var n=0;n0){var y=m[g].indexOf("url"),b=m[g].indexOf(")",y),w=m[g].substr(y+5,b-y-6),E=e.parseXml(e.ajax(w)),S=E.getElementsByTagName("font");for(var x=0;x1?n-1:0),i=1;i=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var u=a,c=t["padding-"+u];r[u]=e(c)}return r}function i(t,e,n,r){return{width:t,height:e,top:n,right:t+r,bottom:e+n,left:r}}function o(t){var e=t.getBBox();return i(e.width,e.height,0,0)}function s(){var n=t(document.documentElement),r=e(n.width),o=e(n.height);return i(r,o,0,0)}function a(o){var s=o.clientWidth,a=o.clientHeight;if(!s&&!a)return O;var u=t(o),c=r(u),h=c.left+c.right,f=c.top+c.bottom,l=e(u.width),p=e(u.height);"border-box"===u.boxSizing&&(Math.round(l+h)!==s&&(l-=n(u,"left","right")+h),Math.round(p+f)!==a&&(p-=n(u,"top","bottom")+f));var d=Math.round(l+h)-s,_=Math.round(p+f)-a;return 1!==Math.abs(d)&&(l-=d),1!==Math.abs(_)&&(p-=_),i(l,p,c.top,c.left)}function u(t){return t instanceof window.SVGElement}function c(t){return t===document.documentElement}function h(t){return u(t)?o(t):c(t)?s():a(t)}function f(t,e){for(var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r={configurable:n.configurable||!1,writable:n.writable||!1,enumerable:n.enumerable||!1},i=Object.keys(e),o=Array.isArray(i),s=0,i=o?i:i[Symbol.iterator]();;){var a;if(o){if(s>=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var u=a;r.value=e[u],Object.defineProperty(t,u,r)}return t}var l=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},p=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:null,n=this.__entries__,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;t.call(e,s[1],s[0])}},p(e,[{key:"size",get:function(){return this.__entries__.length}}]),e}(v)}(),w=function(){return"function"==typeof window.requestAnimationFrame?window.requestAnimationFrame:function(t){return setTimeout(function(){return t(Date.now())},1e3/60)}}(),g=function(t){function e(){t.apply.apply(t,s),s=null,a&&(r.apply.apply(r,a),a=null)}function n(){o?w(e):e()}function r(){for(var t=arguments.length,e=Array(t),r=0;r1&&void 0!==arguments[1]?arguments[1]:0,o=arguments.length>2&&void 0!==arguments[2]&&arguments[2],s=null,a=null;return r},m="function"==typeof window.MutationObserver,E=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];l(this,t),this._isCycleContinuous=!m||e,this._listenersEnabled=!1,this._mutationsObserver=null,this._observers=[],this.refresh=g(this.refresh.bind(this),30,!0),this._continuousUpdateHandler=g(this.refresh,70)}return t.prototype.connect=function(t){this.isConnected(t)||this._observers.push(t),this._listenersEnabled||this._addListeners()},t.prototype.disconnect=function(t){var e=this._observers,n=e.indexOf(t);~n&&e.splice(n,1),!e.length&&this._listenersEnabled&&this._removeListeners()},t.prototype.isConnected=function(t){return!!~this._observers.indexOf(t)},t.prototype.refresh=function(){var t=this._updateObservers();t?this.refresh():this._isCycleContinuous&&this._listenersEnabled&&this._continuousUpdateHandler()},t.prototype._updateObservers=function(){for(var t=!1,e=this._observers,n=Array.isArray(e),r=0,e=n?e:e[Symbol.iterator]();;){var i;if(n){if(r>=e.length)break;i=e[r++]}else{if(r=e.next(),r.done)break;i=r.value}var o=i;o.gatherActive(),o.hasActive()&&(t=!0,o.broadcastActive())}return t},t.prototype._addListeners=function(){this._listenersEnabled||(window.addEventListener("resize",this.refresh),m&&(this._mutationsObserver=new MutationObserver(this.refresh),this._mutationsObserver.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})),this._listenersEnabled=!0,this._isCycleContinuous&&this.refresh())},t.prototype._removeListeners=function(){this._listenersEnabled&&(window.removeEventListener("resize",this.refresh),this._mutationsObserver&&this._mutationsObserver.disconnect(),this._mutationsObserver=null,this._listenersEnabled=!1)},p(t,[{key:"continuousUpdates",get:function(){return this._isCycleContinuous},set:function(t){m&&(this._isCycleContinuous=t,this._listenersEnabled&&t&&this.refresh())}}]),t}(),O=i(0,0,0,0),A=function(){function t(e){l(this,t),this.target=e,this._contentRect=O,this.broadcastWidth=0,this.broadcastHeight=0}return t.prototype.broadcastRect=function(){var t=this._contentRect;return this.broadcastWidth=t.width,this.broadcastHeight=t.height,t},t.prototype.isActive=function(){var t=h(this.target);return this._contentRect=t,t.width!==this.broadcastWidth||t.height!==this.broadcastHeight},t}(),ResizeObserverEntry=function ResizeObserverEntry(t,e){l(this,ResizeObserverEntry);var n=window.ClientRect||Object,r=Object.create(n.prototype);f(r,e,{configurable:!0}),f(this,{target:t,contentRect:r},{configurable:!0})},k=function(){function ResizeObserver(t,e,n){if(l(this,ResizeObserver),"function"!=typeof t)throw new TypeError("The callback provided as parameter 1 is not a function.");this._callback=t,this._targets=new y,this._activeTargets=[],this._controller=e,this._publicObserver=n}return ResizeObserver.prototype.observe=function(t){if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");if(!(t instanceof Element))throw new TypeError('parameter 1 is not of type "Element".');var e=this._targets;e.has(t)||(e.set(t,new A(t)),this._controller.isConnected(this)||this._controller.connect(this),this._controller.refresh())},ResizeObserver.prototype.unobserve=function(t){if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");if(!(t instanceof Element))throw new TypeError('parameter 1 is not of type "Element".');var e=this._targets;e.has(t)&&(e.delete(t),e.size||this.disconnect())},ResizeObserver.prototype.disconnect=function(){this.clearActive(),this._targets.clear(),this._controller.disconnect(this)},ResizeObserver.prototype.gatherActive=function(){this.clearActive();var t=this._activeTargets;this._targets.forEach(function(e){e.isActive()&&t.push(e)})},ResizeObserver.prototype.broadcastActive=function(){if(this.hasActive()){var t=this._publicObserver,e=this._activeTargets.map(function(t){return new ResizeObserverEntry(t.target,t.broadcastRect())});this.clearActive(),this._callback.call(t,e,t)}},ResizeObserver.prototype.clearActive=function(){this._activeTargets.splice(0)},ResizeObserver.prototype.hasActive=function(){return!!this._activeTargets.length},ResizeObserver}(),T=new E,C=new v,ResizeObserver=function(){function ResizeObserver(t){if(l(this,ResizeObserver),!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var e=new k(t,T,this);C.set(this,e)}return p(ResizeObserver,null,[{key:"continuousUpdates",get:function(){return T.continuousUpdates},set:function(t){if("boolean"!=typeof t)throw new TypeError('type of "continuousUpdates" value must be boolean.');T.continuousUpdates=t}}]),ResizeObserver}();["observe","unobserve","disconnect"].forEach(function(t){ResizeObserver.prototype[t]=function(){var e;return(e=C.get(this))[t].apply(e,arguments)}}),"function"!=typeof window.ResizeObserver&&Object.defineProperty(window,"ResizeObserver",{value:ResizeObserver,writable:!0,configurable:!0});var x=window.ResizeObserver;return x}); + diff --git a/experiment/simulation/EE5/iframes/data/slide1.css b/experiment/simulation/EE5/iframes/data/slide1.css new file mode 100644 index 0000000..37841fc --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide1.css @@ -0,0 +1 @@ +#spr1_1d6d53 {clip:rect(0px,960px,540px,0px);}#spr4_1d6d53,#spr5_1d6d53,#spr6_1d6d53,#spr7_1d6d53,#spr8_1d6d53,#spr9_1d6d53,#spr10_1d6d53,#spr11_1d6d53,#spr12_1d6d53,#spr13_1d6d53,#spr14_1d6d53,#spr15_1d6d53,#spr16_1d6d53,#spr17_1d6d53,#spr18_1d6d53,#spr19_1d6d53,#spr20_1d6d53,#spr21_1d6d53,#spr22_1d6d53,#spr23_1d6d53,#spr24_1d6d53,#spr25_1d6d53,#spr26_1d6d53,#spr27_1d6d53,#spr28_1d6d53,#spr29_1d6d53,#spr30_1d6d53,#spr31_1d6d53,#spr32_1d6d53,#spr33_1d6d53,#spr34_1d6d53,#spr35_1d6d53 {display:none;}#txt0_1d6d53,#txt2_1d6d53,#txt4_1d6d53,#txt6_1d6d53,#txt8_1d6d53,#txt9_1d6d53,#txt12_1d6d53,#txt14_1d6d53,#txt16_1d6d53,#txt18_1d6d53,#txt20_1d6d53,#txt22_1d6d53,#txt24_1d6d53,#txt26_1d6d53 {font-family:fnt4; font-size:25px; line-height:33px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt1_1d6d53,#txt3_1d6d53,#txt5_1d6d53,#txt7_1d6d53,#txt10_1d6d53,#txt11_1d6d53,#txt13_1d6d53,#txt15_1d6d53,#txt17_1d6d53,#txt19_1d6d53,#txt21_1d6d53,#txt23_1d6d53,#txt25_1d6d53,#txt27_1d6d53 {font-family:fnt4; font-size:25px; line-height:33px; font-weight:bold; color:#ffffff;}#svg0_1d6d53,#svg1_1d6d53 {-webkit-transform-origin:6.256px 6.256px; -moz-transform-origin:6.256px 6.256px; -o-transform-origin:6.256px 6.256px; -ms-transform-origin:6.256px 6.256px; transform-origin:6.256px 6.256px; display:none;}#txt28_1d6d53,#txt29_1d6d53,#txt32_1d6d53 {font-family:fnt4; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt30_1d6d53,#txt31_1d6d53,#txt33_1d6d53 {font-family:fnt4; font-size:22px; line-height:29px; font-weight:bold; color:#ffffff;}#txt34_1d6d53 {font-family:fnt5; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt35_1d6d53 {font-family:fnt5; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt36_1d6d53 {font-family:fnt5; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt37_1d6d53 {font-family:fnt5; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#txt38_1d6d53,#txt39_1d6d53 {font-family:fnt6; font-size:19px; line-height:25px; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt40_1d6d53,#txt41_1d6d53 {font-family:fnt6; font-size:19px; line-height:25px; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/slide1.js b/experiment/simulation/EE5/iframes/data/slide1.js new file mode 100644 index 0000000..dbcb4c1 --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide1.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{F270C438-1F41-4C24-9FF7-B0C25641C25F}'];loadHandler&&loadHandler(0, '
    Drain
    Drain
    (D)
    (D)
    Source
    Source
    (S)
    (S)
    Body
    Diode
    Body
    Diode
    Gate
    Gate
    (G)
    (G)
    Gate
    Gate
    (G)
    (G)
    Drain
    Drain
    (D)
    (D)
    Source
    Source
    (S)
    (S)
    Symbolic 
    representation
    Symbolic 
    representation
    A typical MOSFET (TO220 Package)
    A typical MOSFET (TO220 Package)
    Representation of MOSFET
    Representation of MOSFET
    Representation of MOSFET
    Representation of MOSFET
    The visual representation of MOSFET used in circuit formulation is shown here. On the right side device
    appearance is shown.
    The visual representation of MOSFET used in circuit formulation is shown here. On the right side device
    appearance is shown.
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/slide10.css b/experiment/simulation/EE5/iframes/data/slide10.css new file mode 100644 index 0000000..3d27a9f --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide10.css @@ -0,0 +1 @@ +#spr1_1df55f {clip:rect(0px,960px,540px,0px);}#spr3_1df55f,#spr4_1df55f,#spr6_1df55f,#spr7_1df55f,#spr8_1df55f,#spr9_1df55f,#spr10_1df55f,#spr11_1df55f,#spr12_1df55f,#spr13_1df55f,#spr14_1df55f,#spr15_1df55f,#spr16_1df55f,#spr17_1df55f,#spr19_1df55f,#spr20_1df55f,#spr21_1df55f,#spr22_1df55f,#spr23_1df55f,#spr24_1df55f,#spr25_1df55f,#spr26_1df55f,#spr27_1df55f,#spr28_1df55f,#spr29_1df55f,#spr30_1df55f,#spr31_1df55f,#spr38_1df55f {display:none;}#svg0_1df55f {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#txt0_1df55f,#txt1_1df55f {font-family:fnt6; font-size:24px; line-height:32px; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt2_1df55f,#txt3_1df55f {font-family:fnt6; font-size:24px; line-height:32px; color:#c00000;}#spr18_1df55f {-webkit-transform:matrix(0,-1,1,0,0,0); -o-transform:matrix(0,-1,1,0,0,0); -ms-transform:matrix(0,-1,1,0,0,0); -moz-transform:matrix(0,-1,1,0,0,0); transform:matrix(0,-1,1,0,0,0); display:none;}#txt4_1df55f {font-family:fnt6; font-size:22px; line-height:29px; color:#000000;}#txt5_1df55f {font-family:fnt6; font-size:14.667px; line-height:20px; color:#000000;}#txt6_1df55f,#txt8_1df55f,#txt10_1df55f,#txt11_1df55f,#txt12_1df55f,#txt13_1df55f {font-family:fnt6; font-size:16px; line-height:21px; color:#000000;}#txt7_1df55f,#txt9_1df55f {font-family:fnt6; font-size:10.667px; line-height:14px; color:#000000;}#txt14_1df55f {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt15_1df55f,#txt16_1df55f {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt17_1df55f {font-family:fnt5; font-size:20px; line-height:23px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt18_1df55f {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt19_1df55f,#txt20_1df55f {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#ffffff;}#txt21_1df55f {font-family:fnt5; font-size:20px; line-height:23px; font-weight:bold; color:#ffffff;}#txt22_1df55f,#txt23_1df55f {font-family:fnt6; font-size:19px; line-height:25px; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt24_1df55f,#txt25_1df55f {font-family:fnt6; font-size:19px; line-height:25px; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/slide10.js b/experiment/simulation/EE5/iframes/data/slide10.js new file mode 100644 index 0000000..6c0f816 --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide10.js @@ -0,0 +1,5 @@ +(function(){var loadHandler=window['sl_{F270C438-1F41-4C24-9FF7-B0C25641C25F}'];loadHandler&&loadHandler(9, '
    The main circuit is a series circuit containing an AC supply (vin), SCR and a resistive load (R).\
+\
+Differential voltage probe is connected in parallel to the SCR (anode and cathode) while a Current Probe measures the current through SCR.\
+\
+The Gate circuit is a series circuit comprising a DC battery, a rheostat and a DC ammeter as shown in the figure.
    Instruments  :
    Instruments  :
    v in
    V g
    R g
    A
    K
    G
    R
    Circuit Diagram To Plot Output Characteristics 
    Circuit Diagram To Plot Output Characteristics  of SCR  (Method-2: Using Oscilloscope)
    Circuit Diagram To Plot Output Characteristics 
    Circuit Diagram To Plot Output Characteristics  of SCR  (Method-2: Using Oscilloscope)
    The circuit formulation is shown here to observe the v-i characteristics on the using digital storage
    oscilloscope.
    The circuit formulation is shown here to observe the v-i characteristics on the using digital storage
    oscilloscope.
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/slide11.css b/experiment/simulation/EE5/iframes/data/slide11.css new file mode 100644 index 0000000..1621743 --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide11.css @@ -0,0 +1 @@ +#spr1_1e0a1f {clip:rect(0px,960px,540px,0px);}#spr17_1e0a1f {-webkit-transform:matrix(0,-1,1,0,0,0); -o-transform:matrix(0,-1,1,0,0,0); -ms-transform:matrix(0,-1,1,0,0,0); -moz-transform:matrix(0,-1,1,0,0,0); transform:matrix(0,-1,1,0,0,0);}#svg0_1e0a1f,#svg1_1e0a1f,#svg2_1e0a1f,#svg3_1e0a1f,#svg4_1e0a1f,#svg5_1e0a1f,#svg6_1e0a1f,#svg46_1e0a1f,#svg47_1e0a1f {pointer-events:none;}#txt0_1e0a1f {font-family:fnt6; font-size:22px; line-height:29px; color:#000000;}#txt1_1e0a1f {font-family:fnt6; font-size:14.667px; line-height:20px; color:#000000;}#txt2_1e0a1f,#txt4_1e0a1f,#txt6_1e0a1f,#txt7_1e0a1f,#txt8_1e0a1f,#txt9_1e0a1f {font-family:fnt6; font-size:16px; line-height:21px; color:#000000;}#txt3_1e0a1f,#txt5_1e0a1f {font-family:fnt6; font-size:10.667px; line-height:14px; color:#000000;}#txt10_1e0a1f {font-family:fnt5; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt11_1e0a1f {font-family:fnt5; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#spr34_1e0a1f,#spr35_1e0a1f,#spr38_1e0a1f,#spr39_1e0a1f,#spr40_1e0a1f,#spr41_1e0a1f {display:none;}#svg17_1e0a1f,#svg28_1e0a1f,#svg39_1e0a1f {-webkit-transform-origin:12px 9px; -moz-transform-origin:12px 9px; -o-transform-origin:12px 9px; -ms-transform-origin:12px 9px; transform-origin:12px 9px;}#svg40_1e0a1f {-webkit-transform-origin:3.824px 3.935px; -moz-transform-origin:3.824px 3.935px; -o-transform-origin:3.824px 3.935px; -ms-transform-origin:3.824px 3.935px; transform-origin:3.824px 3.935px;}#txt12_1e0a1f,#txt16_1e0a1f {font-family:fnt8; font-size:18px; line-height:21px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt13_1e0a1f,#txt17_1e0a1f {font-family:fnt8; font-size:12px; line-height:14px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt14_1e0a1f,#txt18_1e0a1f {font-family:fnt8; font-size:18px; line-height:21px; font-weight:bold; font-style:italic; color:#000000;}#txt15_1e0a1f,#txt19_1e0a1f {font-family:fnt8; font-size:12px; line-height:14px; font-weight:bold; font-style:italic; color:#000000;}#txt20_1e0a1f,#txt24_1e0a1f {font-family:fnt4; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt21_1e0a1f,#txt25_1e0a1f {font-family:fnt4; font-size:14.667px; line-height:20px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt22_1e0a1f,#txt26_1e0a1f {font-family:fnt4; font-size:22px; line-height:29px; font-weight:bold; color:#000066;}#txt23_1e0a1f,#txt27_1e0a1f {font-family:fnt4; font-size:14.667px; line-height:20px; font-weight:bold; color:#000066;} \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/slide11.js b/experiment/simulation/EE5/iframes/data/slide11.js new file mode 100644 index 0000000..d600b0d --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide11.js @@ -0,0 +1,6 @@ +(function(){var loadHandler=window['sl_{F270C438-1F41-4C24-9FF7-B0C25641C25F}'];loadHandler&&loadHandler(10, '
    v in
    V g
    R g
    A
    K
    G
    R
    Circuit Diagram Formulation (Method-2: Using Oscilloscope)
    Circuit Diagram Formulation (Method-2: Using Oscilloscope)
    Firstly the DSO should be  set to “X-Y mode”. Connect the voltage probe (vAK ) to Ch-1 (x-axis) and current probe (iA) to Ch-2 (y-axis).\
+\
+Adjust ‘Rg’ to pass desired “Ig” in the gate circuit and change the input AC supply voltage gradually. \
+\
+The v-i  characteristics is displayed on the screen of the digital oscilloscope (DSO).\
+
    V in_1
    V in_1
    V in_n
    V in_n
    V AK
    V AK
    I D
    I D
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/slide2.css b/experiment/simulation/EE5/iframes/data/slide2.css new file mode 100644 index 0000000..83c5cea --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide2.css @@ -0,0 +1 @@ +#spr1_1d7d8f {clip:rect(0px,960px,540px,0px);}#spr3_1d7d8f,#spr4_1d7d8f,#spr5_1d7d8f,#spr6_1d7d8f,#spr10_1d7d8f,#spr11_1d7d8f,#spr12_1d7d8f,#spr13_1d7d8f,#spr14_1d7d8f,#spr15_1d7d8f,#spr16_1d7d8f,#spr17_1d7d8f,#spr19_1d7d8f,#spr20_1d7d8f,#spr21_1d7d8f,#spr22_1d7d8f,#spr23_1d7d8f,#spr24_1d7d8f,#spr25_1d7d8f,#spr26_1d7d8f,#spr27_1d7d8f,#spr28_1d7d8f,#spr29_1d7d8f {display:none;}#txt0_1d7d8f {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt1_1d7d8f,#txt2_1d7d8f {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt3_1d7d8f {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt4_1d7d8f,#txt5_1d7d8f {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#ffffff;}#svg0_1d7d8f {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#txt6_1d7d8f,#txt7_1d7d8f {font-family:fnt6; font-size:24px; line-height:32px; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt8_1d7d8f,#txt9_1d7d8f {font-family:fnt6; font-size:24px; line-height:32px; color:#c00000;}#txt10_1d7d8f,#txt15_1d7d8f,#txt16_1d7d8f,#txt17_1d7d8f {font-family:fnt6; font-size:16px; line-height:21px; color:#000000;}#txt11_1d7d8f {font-family:fnt6; font-size:15px; line-height:20px; color:#000000;}#txt12_1d7d8f {font-family:fnt6; font-size:10px; line-height:13px; color:#000000;}#txt13_1d7d8f {font-family:fnt6; font-size:22px; line-height:29px; color:#000000;}#txt14_1d7d8f {font-family:fnt6; font-size:14.667px; line-height:20px; color:#000000;}#txt18_1d7d8f,#txt19_1d7d8f {font-family:fnt6; font-size:19px; line-height:25px; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt20_1d7d8f,#txt21_1d7d8f {font-family:fnt6; font-size:19px; line-height:25px; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/slide2.js b/experiment/simulation/EE5/iframes/data/slide2.js new file mode 100644 index 0000000..891c2a9 --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide2.js @@ -0,0 +1,5 @@ +(function(){var loadHandler=window['sl_{F270C438-1F41-4C24-9FF7-B0C25641C25F}'];loadHandler&&loadHandler(1, '
    Circuit Diagram To Plot Output Characteristics 
    Circuit Diagram To Plot Output Characteristics  of MOSFET
    Circuit Diagram To Plot Output Characteristics 
    Circuit Diagram To Plot Output Characteristics  of MOSFET
    Instruments  :
    Instruments  :
    R
    The main circuit is a series circuit containing a variable DC supply (Vin), MOSFET and a resistive load (R).\
+\
+Differential voltage probe is connected in parallel to the IGBT (collector and emitter) while a Current Probe measures the current through the MOSFET.\
+\
+The Gate circuit contains a DC supply connected between the gate and emitter of the MOSFET.
    V GS
    V in
    S
    G
    D
    The circuit formulation is shown here to observe the output characteristics on the screen of a digital storage
    oscilloscope.
    The circuit formulation is shown here to observe the output characteristics on the screen of a digital storage
    oscilloscope.
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/slide3.css b/experiment/simulation/EE5/iframes/data/slide3.css new file mode 100644 index 0000000..967a801 --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide3.css @@ -0,0 +1 @@ +#spr1_1d90aa {clip:rect(0px,960px,540px,0px);}#spr4_1d90aa,#spr7_1d90aa,#spr8_1d90aa,#spr9_1d90aa,#spr10_1d90aa,#spr11_1d90aa {display:none;}#svg10_1d90aa,#svg21_1d90aa,#svg32_1d90aa {-webkit-transform-origin:12px 9px; -moz-transform-origin:12px 9px; -o-transform-origin:12px 9px; -ms-transform-origin:12px 9px; transform-origin:12px 9px;}#svg33_1d90aa {-webkit-transform-origin:3.824px 3.935px; -moz-transform-origin:3.824px 3.935px; -o-transform-origin:3.824px 3.935px; -ms-transform-origin:3.824px 3.935px; transform-origin:3.824px 3.935px;}#svg39_1d90aa,#svg40_1d90aa {pointer-events:none;}#txt0_1d90aa,#txt4_1d90aa {font-family:fnt7; font-size:18px; line-height:24px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt1_1d90aa,#txt5_1d90aa {font-family:fnt7; font-size:12px; line-height:16px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt2_1d90aa,#txt6_1d90aa {font-family:fnt7; font-size:18px; line-height:24px; font-weight:bold; font-style:italic; color:#000000;}#txt3_1d90aa,#txt7_1d90aa {font-family:fnt7; font-size:12px; line-height:16px; font-weight:bold; font-style:italic; color:#000000;}#txt8_1d90aa,#txt12_1d90aa {font-family:fnt4; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt9_1d90aa,#txt13_1d90aa {font-family:fnt4; font-size:14.667px; line-height:20px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt10_1d90aa,#txt14_1d90aa {font-family:fnt4; font-size:22px; line-height:29px; font-weight:bold; color:#000066;}#txt11_1d90aa,#txt15_1d90aa {font-family:fnt4; font-size:14.667px; line-height:20px; font-weight:bold; color:#000066;}#txt16_1d90aa {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt17_1d90aa,#txt18_1d90aa {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt19_1d90aa {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt20_1d90aa,#txt21_1d90aa {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#ffffff;}#txt22_1d90aa,#txt23_1d90aa {font-family:fnt6; font-size:19px; line-height:25px; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt24_1d90aa,#txt25_1d90aa {font-family:fnt6; font-size:19px; line-height:25px; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/slide3.js b/experiment/simulation/EE5/iframes/data/slide3.js new file mode 100644 index 0000000..bf3979e --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide3.js @@ -0,0 +1,6 @@ +(function(){var loadHandler=window['sl_{F270C438-1F41-4C24-9FF7-B0C25641C25F}'];loadHandler&&loadHandler(2, '
    V in_1
    V in_1
    V in_n
    V in_n
    V DS
    V DS
    I D
    I D
    Firstly the DSO should be  set to “X-Y mode”. Connect the voltage probe (VDS ) to Ch-1 (x-axis) and current probe (ID ) to Ch-2 (y-axis).\
+\
+Adjust ‘VGS’ to a desired value and change the input supply voltage (Vin) gradually. \
+\
+The output  characteristics is displayed on the screen of the digital oscilloscope (DSO).\
+
    Circuit Diagram To Plot Output Characteristics 
    Circuit Diagram To Plot Output Characteristics  of MOSFET
    Circuit Diagram To Plot Output Characteristics 
    Circuit Diagram To Plot Output Characteristics  of MOSFET
    In this method the input DC supply is varied gradually. The changing drain current and drain to source voltage
    are sensed by the probes and the characteristics are seen on the oscilloscope screen.
    In this method the input DC supply is varied gradually. The changing drain current and drain to source voltage
    are sensed by the probes and the characteristics are seen on the oscilloscope screen.
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/slide4.css b/experiment/simulation/EE5/iframes/data/slide4.css new file mode 100644 index 0000000..53c8bce --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide4.css @@ -0,0 +1 @@ +#spr1_1d98f7 {clip:rect(0px,960px,540px,0px);}#spr3_1d98f7,#spr5_1d98f7,#spr6_1d98f7,#spr7_1d98f7,#spr8_1d98f7,#spr9_1d98f7,#spr10_1d98f7,#spr11_1d98f7,#spr12_1d98f7,#spr13_1d98f7,#spr14_1d98f7,#spr15_1d98f7,#spr16_1d98f7,#spr17_1d98f7,#spr18_1d98f7,#spr19_1d98f7,#spr20_1d98f7,#spr21_1d98f7,#spr22_1d98f7,#spr23_1d98f7,#spr24_1d98f7,#spr25_1d98f7,#spr26_1d98f7,#spr27_1d98f7,#spr28_1d98f7,#spr29_1d98f7,#spr30_1d98f7,#spr31_1d98f7,#spr32_1d98f7 {display:none;}#txt0_1d98f7,#txt2_1d98f7,#txt4_1d98f7,#txt6_1d98f7,#txt8_1d98f7,#txt10_1d98f7 {font-family:fnt4; font-size:25px; line-height:33px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt1_1d98f7,#txt3_1d98f7,#txt5_1d98f7,#txt7_1d98f7,#txt9_1d98f7,#txt11_1d98f7 {font-family:fnt4; font-size:25px; line-height:33px; font-weight:bold; color:#ffffff;}#svg0_1d98f7,#svg1_1d98f7 {-webkit-transform-origin:6.256px 6.256px; -moz-transform-origin:6.256px 6.256px; -o-transform-origin:6.256px 6.256px; -ms-transform-origin:6.256px 6.256px; transform-origin:6.256px 6.256px; display:none;}#txt12_1d98f7,#txt13_1d98f7,#txt16_1d98f7 {font-family:fnt4; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt14_1d98f7,#txt15_1d98f7,#txt17_1d98f7 {font-family:fnt4; font-size:22px; line-height:29px; font-weight:bold; color:#ffffff;}#txt18_1d98f7,#txt19_1d98f7 {font-family:fnt6; font-size:19px; line-height:25px; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt20_1d98f7,#txt21_1d98f7 {font-family:fnt6; font-size:19px; line-height:25px; color:#ffffff;}#txt22_1d98f7 {font-family:fnt5; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt23_1d98f7 {font-family:fnt5; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt24_1d98f7 {font-family:fnt5; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt25_1d98f7 {font-family:fnt5; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/slide4.js b/experiment/simulation/EE5/iframes/data/slide4.js new file mode 100644 index 0000000..e0388e9 --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide4.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{F270C438-1F41-4C24-9FF7-B0C25641C25F}'];loadHandler&&loadHandler(3, '
    Collector
    Collector
    Emitter
    Emitter
    Gate
    Gate
    Gate
    Gate
    Collector
    Collector
    Emitter
    Emitter
    Symbolic 
    representation of IGBT
    Symbolic 
    representation of IGBT
    A typical IGBT package
    A typical IGBT package
    The visual representation of IGBT used in circuit formulation is shown here. On the right side device
    appearance is shown.
    The visual representation of IGBT used in circuit formulation is shown here. On the right side device
    appearance is shown.
    Representation of IGBT
    Representation of IGBT
    Representation of IGBT
    Representation of IGBT
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/slide5.css b/experiment/simulation/EE5/iframes/data/slide5.css new file mode 100644 index 0000000..d945977 --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide5.css @@ -0,0 +1 @@ +#spr1_1da626 {clip:rect(0px,960px,540px,0px);}#spr3_1da626,#spr4_1da626,#spr5_1da626,#spr9_1da626,#spr10_1da626,#spr11_1da626,#spr12_1da626,#spr13_1da626,#spr14_1da626,#spr15_1da626,#spr16_1da626,#spr18_1da626,#spr19_1da626,#spr20_1da626,#spr21_1da626,#spr22_1da626,#spr23_1da626,#spr24_1da626,#spr25_1da626,#spr26_1da626,#spr27_1da626,#spr28_1da626,#spr29_1da626 {display:none;}#txt0_1da626 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt1_1da626,#txt2_1da626 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt3_1da626 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt4_1da626,#txt5_1da626 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#ffffff;}#svg0_1da626 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#txt6_1da626,#txt7_1da626 {font-family:fnt6; font-size:24px; line-height:32px; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt8_1da626,#txt9_1da626 {font-family:fnt6; font-size:24px; line-height:32px; color:#c00000;}#txt10_1da626,#txt15_1da626,#txt16_1da626,#txt17_1da626 {font-family:fnt6; font-size:16px; line-height:21px; color:#000000;}#txt11_1da626 {font-family:fnt6; font-size:15px; line-height:20px; color:#000000;}#txt12_1da626 {font-family:fnt6; font-size:10px; line-height:13px; color:#000000;}#txt13_1da626 {font-family:fnt6; font-size:22px; line-height:29px; color:#000000;}#txt14_1da626 {font-family:fnt6; font-size:14.667px; line-height:20px; color:#000000;}#txt18_1da626,#txt19_1da626 {font-family:fnt6; font-size:19px; line-height:25px; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt20_1da626,#txt21_1da626 {font-family:fnt6; font-size:19px; line-height:25px; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/slide5.js b/experiment/simulation/EE5/iframes/data/slide5.js new file mode 100644 index 0000000..ea825dc --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide5.js @@ -0,0 +1,5 @@ +(function(){var loadHandler=window['sl_{F270C438-1F41-4C24-9FF7-B0C25641C25F}'];loadHandler&&loadHandler(4, '
    Circuit Diagram To Plot Output Characteristics 
    Circuit Diagram To Plot Output Characteristics  of IGBT
    Circuit Diagram To Plot Output Characteristics 
    Circuit Diagram To Plot Output Characteristics  of IGBT
    Instruments  :
    Instruments  :
    R
    The main circuit is a series circuit containing a variable DC supply (Vin), IGBT and a resistive load (R).\
+\
+Differential voltage probe is connected in parallel to the IGBT (collector and emitter) while a Current Probe measures the current through the IGBT.\
+\
+The Gate circuit contains a DC supply connected between the gate and emitter of the IGBT.
    V GE
    V in
    E
    G
    C
    The circuit formulation is shown here to observe the output characteristics on the screen of a digital storage
    oscilloscope.
    The circuit formulation is shown here to observe the output characteristics on the screen of a digital storage
    oscilloscope.
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/slide6.css b/experiment/simulation/EE5/iframes/data/slide6.css new file mode 100644 index 0000000..2ff8696 --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide6.css @@ -0,0 +1 @@ +#spr1_1db70e {clip:rect(0px,960px,540px,0px);}#svg0_1db70e,#svg1_1db70e,#svg2_1db70e,#svg3_1db70e,#svg4_1db70e,#svg5_1db70e,#svg45_1db70e,#svg46_1db70e {pointer-events:none;}#txt0_1db70e,#txt5_1db70e,#txt6_1db70e,#txt7_1db70e {font-family:fnt6; font-size:16px; line-height:21px; color:#000000;}#txt1_1db70e {font-family:fnt6; font-size:15px; line-height:20px; color:#000000;}#txt2_1db70e {font-family:fnt6; font-size:10px; line-height:13px; color:#000000;}#txt3_1db70e {font-family:fnt6; font-size:22px; line-height:29px; color:#000000;}#txt4_1db70e {font-family:fnt6; font-size:14.667px; line-height:20px; color:#000000;}#spr26_1db70e,#spr29_1db70e,#spr30_1db70e,#spr31_1db70e,#spr32_1db70e,#spr33_1db70e {display:none;}#svg16_1db70e,#svg27_1db70e,#svg38_1db70e {-webkit-transform-origin:12px 9px; -moz-transform-origin:12px 9px; -o-transform-origin:12px 9px; -ms-transform-origin:12px 9px; transform-origin:12px 9px;}#svg39_1db70e {-webkit-transform-origin:3.824px 3.935px; -moz-transform-origin:3.824px 3.935px; -o-transform-origin:3.824px 3.935px; -ms-transform-origin:3.824px 3.935px; transform-origin:3.824px 3.935px;}#txt8_1db70e,#txt12_1db70e {font-family:fnt7; font-size:18px; line-height:24px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt9_1db70e,#txt13_1db70e {font-family:fnt7; font-size:12px; line-height:16px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt10_1db70e,#txt14_1db70e {font-family:fnt7; font-size:18px; line-height:24px; font-weight:bold; font-style:italic; color:#000000;}#txt11_1db70e,#txt15_1db70e {font-family:fnt7; font-size:12px; line-height:16px; font-weight:bold; font-style:italic; color:#000000;}#txt16_1db70e,#txt20_1db70e {font-family:fnt4; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt17_1db70e,#txt21_1db70e {font-family:fnt4; font-size:14.667px; line-height:20px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt18_1db70e,#txt22_1db70e {font-family:fnt4; font-size:22px; line-height:29px; font-weight:bold; color:#000066;}#txt19_1db70e,#txt23_1db70e {font-family:fnt4; font-size:14.667px; line-height:20px; font-weight:bold; color:#000066;}#txt24_1db70e {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt25_1db70e,#txt26_1db70e {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt27_1db70e {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt28_1db70e,#txt29_1db70e {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#ffffff;}#txt30_1db70e,#txt31_1db70e {font-family:fnt6; font-size:19px; line-height:25px; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt32_1db70e,#txt33_1db70e {font-family:fnt6; font-size:19px; line-height:25px; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/slide6.js b/experiment/simulation/EE5/iframes/data/slide6.js new file mode 100644 index 0000000..c21cb2a --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide6.js @@ -0,0 +1,6 @@ +(function(){var loadHandler=window['sl_{F270C438-1F41-4C24-9FF7-B0C25641C25F}'];loadHandler&&loadHandler(5, '
    R
    V GE
    V in
    G
    C
    E
    V in_1
    V in_1
    V in_n
    V in_n
    V CE
    V CE
    I C
    I C
    Firstly the DSO should be  set to “X-Y mode”. Connect the voltage probe (VCE ) to Ch-1 (x-axis) and current probe (IC ) to Ch-2 (y-axis).\
+\
+Adjust ‘VGE’ to a desired value and change the input supply voltage (Vin) gradually. \
+\
+The output  characteristics is displayed on the screen of the digital oscilloscope (DSO).\
+
    Circuit Diagram To Plot Output Characteristics 
    Circuit Diagram To Plot Output Characteristics  of IGBT
    Circuit Diagram To Plot Output Characteristics 
    Circuit Diagram To Plot Output Characteristics  of IGBT
    In this method the input DC supply is varied gradually. The changing collector current and collector to emitter
    voltage are sensed by the probes and the characteristics are seen on the oscilloscope screen.
    In this method the input DC supply is varied gradually. The changing collector current and collector to emitter
    voltage are sensed by the probes and the characteristics are seen on the oscilloscope screen.
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/slide7.css b/experiment/simulation/EE5/iframes/data/slide7.css new file mode 100644 index 0000000..580ba97 --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide7.css @@ -0,0 +1 @@ +#spr1_1dc75a {clip:rect(0px,960px,540px,0px);}#spr3_1dc75a,#spr5_1dc75a,#spr6_1dc75a,#spr7_1dc75a,#spr8_1dc75a,#spr9_1dc75a,#spr10_1dc75a,#spr11_1dc75a,#spr12_1dc75a,#spr13_1dc75a,#spr14_1dc75a,#spr15_1dc75a,#spr16_1dc75a,#spr17_1dc75a,#spr18_1dc75a,#spr19_1dc75a,#spr20_1dc75a,#spr21_1dc75a,#spr22_1dc75a,#spr23_1dc75a,#spr24_1dc75a,#spr25_1dc75a,#spr29_1dc75a,#spr30_1dc75a,#spr31_1dc75a {display:none;}#txt0_1dc75a,#txt2_1dc75a,#txt4_1dc75a,#txt6_1dc75a,#txt8_1dc75a,#txt10_1dc75a {font-family:fnt4; font-size:25px; line-height:33px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt1_1dc75a,#txt3_1dc75a,#txt5_1dc75a,#txt7_1dc75a,#txt9_1dc75a,#txt11_1dc75a {font-family:fnt4; font-size:25px; line-height:33px; font-weight:bold; color:#ffffff;}#txt12_1dc75a {font-family:fnt5; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt13_1dc75a {font-family:fnt5; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt14_1dc75a {font-family:fnt5; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt15_1dc75a {font-family:fnt5; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#svg0_1dc75a,#svg1_1dc75a {-webkit-transform-origin:6.256px 6.256px; -moz-transform-origin:6.256px 6.256px; -o-transform-origin:6.256px 6.256px; -ms-transform-origin:6.256px 6.256px; transform-origin:6.256px 6.256px; display:none;}#txt16_1dc75a,#txt17_1dc75a {font-family:fnt6; font-size:19px; line-height:25px; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt18_1dc75a,#txt19_1dc75a {font-family:fnt6; font-size:19px; line-height:25px; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/slide7.js b/experiment/simulation/EE5/iframes/data/slide7.js new file mode 100644 index 0000000..20dd029 --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide7.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{F270C438-1F41-4C24-9FF7-B0C25641C25F}'];loadHandler&&loadHandler(6, '
    Gate
    Gate
    Cathode
    Cathode
    Cathode
    Cathode
    Anode
    Anode
    Gate
    Gate
    Anode
    Anode
    Representation of SCR
    Representation of SCR
    Representation of SCR
    Representation of SCR
    Symbolic representation
    A typical SCR
    The visual representation of SCR used in circuit formulation is shown here. On the right side device
    appearance is shown.
    The visual representation of SCR used in circuit formulation is shown here. On the right side device
    appearance is shown.
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/slide8.css b/experiment/simulation/EE5/iframes/data/slide8.css new file mode 100644 index 0000000..b375fa6 --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide8.css @@ -0,0 +1 @@ +#spr1_1dd4e6 {clip:rect(0px,960px,540px,0px);}#txt0_1dd4e6 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt1_1dd4e6,#txt2_1dd4e6 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt3_1dd4e6 {font-family:fnt5; font-size:20px; line-height:23px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt4_1dd4e6 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt5_1dd4e6,#txt6_1dd4e6 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#ffffff;}#txt7_1dd4e6 {font-family:fnt5; font-size:20px; line-height:23px; font-weight:bold; color:#ffffff;}#spr6_1dd4e6,#spr7_1dd4e6,#spr9_1dd4e6,#spr10_1dd4e6,#spr11_1dd4e6,#spr12_1dd4e6,#spr13_1dd4e6,#spr14_1dd4e6,#spr15_1dd4e6,#spr16_1dd4e6,#spr17_1dd4e6,#spr18_1dd4e6,#spr19_1dd4e6,#spr20_1dd4e6,#spr21_1dd4e6,#spr22_1dd4e6,#spr23_1dd4e6,#spr24_1dd4e6,#spr26_1dd4e6,#spr27_1dd4e6,#spr28_1dd4e6,#spr29_1dd4e6,#spr30_1dd4e6,#spr31_1dd4e6,#spr32_1dd4e6,#spr36_1dd4e6 {display:none;}#svg0_1dd4e6 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#txt8_1dd4e6,#txt9_1dd4e6 {font-family:fnt6; font-size:24px; line-height:32px; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt10_1dd4e6,#txt11_1dd4e6 {font-family:fnt6; font-size:24px; line-height:32px; color:#c00000;}#spr25_1dd4e6 {-webkit-transform:matrix(0,-1,1,0,0,0); -o-transform:matrix(0,-1,1,0,0,0); -ms-transform:matrix(0,-1,1,0,0,0); -moz-transform:matrix(0,-1,1,0,0,0); transform:matrix(0,-1,1,0,0,0); display:none;}#txt12_1dd4e6 {font-family:fnt6; font-size:22px; line-height:29px; color:#000000;}#txt13_1dd4e6 {font-family:fnt6; font-size:14.667px; line-height:20px; color:#000000;}#txt14_1dd4e6,#txt16_1dd4e6,#txt18_1dd4e6,#txt19_1dd4e6,#txt20_1dd4e6,#txt21_1dd4e6 {font-family:fnt6; font-size:16px; line-height:21px; color:#000000;}#txt15_1dd4e6,#txt17_1dd4e6 {font-family:fnt6; font-size:10.667px; line-height:14px; color:#000000;}#txt22_1dd4e6 {font-family:fnt6; font-size:19px; line-height:25px; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt23_1dd4e6 {font-family:fnt6; font-size:19px; line-height:25px; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/slide8.js b/experiment/simulation/EE5/iframes/data/slide8.js new file mode 100644 index 0000000..76e5020 --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide8.js @@ -0,0 +1,5 @@ +(function(){var loadHandler=window['sl_{F270C438-1F41-4C24-9FF7-B0C25641C25F}'];loadHandler&&loadHandler(7, '
    Circuit Diagram To Plot Output Characteristics 
    Circuit Diagram To Plot Output Characteristics  of SCR  (Method-1: Using Meters)
    Circuit Diagram To Plot Output Characteristics 
    Circuit Diagram To Plot Output Characteristics  of SCR  (Method-1: Using Meters)
    The main circuit is a series circuit containing an AC supply (vin), SCR and a resistive load (R).\
+\
+An AC voltmeter is connected in parallel to the SCR (anode (A) and cathode (K)) while an AC ammeter is connected in series with SCR.\
+\
+The Gate circuit is a series circuit comprising a DC battery, a rheostat and a DC ammeter as shown in the figure.
    Instruments  :
    Instruments  :
    v in
    V g
    R g
    A
    K
    G
    R
    The circuit formulation is shown here to observe the v-i characteristics on the using voltmeter and ammeter
    The circuit formulation is shown here to observe the v-i characteristics on the using voltmeter and ammeter
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/slide9.css b/experiment/simulation/EE5/iframes/data/slide9.css new file mode 100644 index 0000000..33a2f0e --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide9.css @@ -0,0 +1 @@ +#spr1_1de84f {clip:rect(0px,960px,540px,0px);}#spr19_1de84f {-webkit-transform:matrix(0,-1,1,0,0,0); -o-transform:matrix(0,-1,1,0,0,0); -ms-transform:matrix(0,-1,1,0,0,0); -moz-transform:matrix(0,-1,1,0,0,0); transform:matrix(0,-1,1,0,0,0);}#svg0_1de84f,#svg1_1de84f,#svg2_1de84f,#svg3_1de84f,#svg4_1de84f,#svg5_1de84f,#svg6_1de84f,#svg40_1de84f,#svg41_1de84f {pointer-events:none;}#txt0_1de84f {font-family:fnt6; font-size:22px; line-height:29px; color:#000000;}#txt1_1de84f {font-family:fnt6; font-size:14.667px; line-height:20px; color:#000000;}#txt2_1de84f,#txt4_1de84f,#txt6_1de84f,#txt7_1de84f,#txt8_1de84f,#txt9_1de84f {font-family:fnt6; font-size:16px; line-height:21px; color:#000000;}#txt3_1de84f,#txt5_1de84f {font-family:fnt6; font-size:10.667px; line-height:14px; color:#000000;}#txt10_1de84f {font-family:fnt5; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt11_1de84f {font-family:fnt5; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#spr34_1de84f,#spr37_1de84f,#spr38_1de84f,#spr39_1de84f,#spr40_1de84f {display:none;}#svg17_1de84f,#svg28_1de84f,#svg39_1de84f {-webkit-transform-origin:12px 9px; -moz-transform-origin:12px 9px; -o-transform-origin:12px 9px; -ms-transform-origin:12px 9px; transform-origin:12px 9px;}#txt12_1de84f,#txt16_1de84f {font-family:fnt7; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt13_1de84f,#txt17_1de84f {font-family:fnt7; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt14_1de84f,#txt18_1de84f {font-family:fnt7; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:#000000;}#txt15_1de84f,#txt19_1de84f {font-family:fnt7; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:#000000;}#txt20_1de84f,#txt24_1de84f {font-family:fnt4; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt21_1de84f,#txt25_1de84f {font-family:fnt4; font-size:14.667px; line-height:20px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt22_1de84f,#txt26_1de84f {font-family:fnt4; font-size:22px; line-height:29px; font-weight:bold; color:#000066;}#txt23_1de84f,#txt27_1de84f {font-family:fnt4; font-size:14.667px; line-height:20px; font-weight:bold; color:#000066;} \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/slide9.js b/experiment/simulation/EE5/iframes/data/slide9.js new file mode 100644 index 0000000..170db16 --- /dev/null +++ b/experiment/simulation/EE5/iframes/data/slide9.js @@ -0,0 +1,4 @@ +(function(){var loadHandler=window['sl_{F270C438-1F41-4C24-9FF7-B0C25641C25F}'];loadHandler&&loadHandler(8, '
    v in
    V g
    R g
    A
    K
    G
    R
    Circuit Diagram Formulation (Method-1: Using Meters)
    Circuit Diagram Formulation (Method-1: Using Meters)
    The characteristics can easily be plotted on a graph paper by observing the Anode-to-Cathode voltage (vAK )  and  Anode current (iA).\
+\
+\
+Alternatively, use the data logging option of the meters.
    v in_1
    v in_1
    v in_n
    v in_n
    V AK
    V AK
    I D
    I D
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/data/thmb1.png b/experiment/simulation/EE5/iframes/data/thmb1.png new file mode 100644 index 0000000..8e26aa3 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/thmb1.png differ diff --git a/experiment/simulation/EE5/iframes/data/thmb10.png b/experiment/simulation/EE5/iframes/data/thmb10.png new file mode 100644 index 0000000..185bd21 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/thmb10.png differ diff --git a/experiment/simulation/EE5/iframes/data/thmb11.png b/experiment/simulation/EE5/iframes/data/thmb11.png new file mode 100644 index 0000000..1f5a661 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/thmb11.png differ diff --git a/experiment/simulation/EE5/iframes/data/thmb2.png b/experiment/simulation/EE5/iframes/data/thmb2.png new file mode 100644 index 0000000..34150e6 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/thmb2.png differ diff --git a/experiment/simulation/EE5/iframes/data/thmb3.png b/experiment/simulation/EE5/iframes/data/thmb3.png new file mode 100644 index 0000000..4d9d4f9 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/thmb3.png differ diff --git a/experiment/simulation/EE5/iframes/data/thmb4.png b/experiment/simulation/EE5/iframes/data/thmb4.png new file mode 100644 index 0000000..1fd3a96 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/thmb4.png differ diff --git a/experiment/simulation/EE5/iframes/data/thmb5.png b/experiment/simulation/EE5/iframes/data/thmb5.png new file mode 100644 index 0000000..1dafaa6 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/thmb5.png differ diff --git a/experiment/simulation/EE5/iframes/data/thmb6.png b/experiment/simulation/EE5/iframes/data/thmb6.png new file mode 100644 index 0000000..f3c6a01 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/thmb6.png differ diff --git a/experiment/simulation/EE5/iframes/data/thmb7.png b/experiment/simulation/EE5/iframes/data/thmb7.png new file mode 100644 index 0000000..07fe6b6 Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/thmb7.png differ diff --git a/experiment/simulation/EE5/iframes/data/thmb8.png b/experiment/simulation/EE5/iframes/data/thmb8.png new file mode 100644 index 0000000..9938ccd Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/thmb8.png differ diff --git a/experiment/simulation/EE5/iframes/data/thmb9.png b/experiment/simulation/EE5/iframes/data/thmb9.png new file mode 100644 index 0000000..0db0c5d Binary files /dev/null and b/experiment/simulation/EE5/iframes/data/thmb9.png differ diff --git a/experiment/simulation/EE5/iframes/index.html b/experiment/simulation/EE5/iframes/index.html new file mode 100644 index 0000000..ec13384 --- /dev/null +++ b/experiment/simulation/EE5/iframes/index.html @@ -0,0 +1,119 @@ + + + + + EE5 merge cd combined_concept + + + + + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/experiment/simulation/EE5/iframes/overplayer.js b/experiment/simulation/EE5/iframes/overplayer.js new file mode 100644 index 0000000..7826fe8 --- /dev/null +++ b/experiment/simulation/EE5/iframes/overplayer.js @@ -0,0 +1,138 @@ +const overPlayer = { + trial_banner: null, + playBtn: null, + playerNextBtn: null, + headTitle: null, + sliderIsPlaying: false, + + init() { + this.trial_banner = document.querySelector(".trial_banner") + this.playBtn = document.querySelector(".play-controls-container__play-pause-button") + this.playerNextBtn = document.querySelector(".navigation-controls__button_next") + this.headTitle = document.querySelector(".info-container__title div") + + this.hideTrialBanner(); + this.updateTitle(); + + // * Hide player next btn + this.playerNextBtn.style.opacity = 0 + + // * slide is running state + localStorage.setItem("isSlideEnded",false) + + + // remove wher do you left + for(let key in localStorage){ + if(key.indexOf("ispring")!=-1){ + localStorage.removeItem(key) + break + } + } + }, + + slidePlay() { + const touchStartOn = function (el, x, y) { + var e, err; + if (x == null) { + x = 0; + } + if (y == null) { + y = 0; + } + try { + e = document.createEvent("TouchEvent"); + e.initTouchEvent("touchstart", true, true); + } catch (error) { + err = error; + try { + e = document.createEvent("UIEvent"); + e.initUIEvent("touchstart", true, true); + } catch (error) { + err = error; + e = document.createEvent("Event"); + e.initEvent("touchstart", true, true); + } + } + e.targetTouches = [ + { + pageX: x, + pageY: y, + }, + ]; + console.log(e) + return el.dispatchEvent(e); + }; + + let btn = $(this.playBtn) + let btnOffset = btn.offset() + + touchStartOn(this.playBtn, btnOffset.left + 5, btnOffset.top + 5) + }, + slidePause() {}, + hideTrialBanner() { + this.trial_banner.style.opacity = 0; + }, + updateTitle() { + this.headTitle.innerHTML = "Buck Converter"; + }, + isSlidePlaying() { + let playBtnPath = document.querySelector( + ".play-controls-container__play-pause-button svg path" + ); + // if playing then the path.d[1] == 5 else == 7 pause + // ! playing + if (playBtnPath.attributes.d.value[1] == 5) { + return true; + } + // ! pause + return false; + }, + addClassNameListener(elemId, callback) { + var elem = document.getElementById(elemId); + var lastClassName = elem.className; + window.setInterval( function() { + var className = elem.className; + if (className !== lastClassName) { + callback(); + lastClassName = className; + } + },10) + }, + onPlayBtn(){ + window.setInterval(()=>{ + let pauseBtnName = 7 + let playBtnName = 5 + let btnName = this.playBtn.firstChild.firstChild.attributes.d.value[1] + if(btnName == pauseBtnName){ + // capturing pause + console.log(btnName,"pause") + }else{ + // capturing play + console.log(btnName,"Play") + } + },1000) + }, + onSlidesEnd(){ + // * Capture the slides end + + var interval = window.setInterval(()=>{ + let isSlideEnded = localStorage.getItem("isSlideEnded") + if(isSlideEnded=="false"){ + if(this.playerNextBtn.disabled == true){ + localStorage.setItem("isSlideEnded",true) + } + }else{ + window.clearInterval(interval) + } + + },1000) + }, +}; + +overPlayer.init() +window.setTimeout(()=>{ + overPlayer.onSlidesEnd() + console.log("work") +},2000) +// overPlayer.onPlayBtn() + diff --git a/experiment/simulation/EE5/index.html b/experiment/simulation/EE5/index.html new file mode 100644 index 0000000..ac44cd3 --- /dev/null +++ b/experiment/simulation/EE5/index.html @@ -0,0 +1,1199 @@ + + + + + + +Document + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +

    For Better User Experience, reset zoom to 100%
    (by pressing 'Ctrl + 0')
    and refresh the page (by pressing 'Ctrl + R')

    +
    + + + + +
    + + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    + +
    +
    +

    Characteristics of switching devices

    + + +
    + +
    +Objective: +

    To Set the Beam and Slab using Flex System.

    +Apparatus Materials: +

    + Tripod Stand, CT prop, fourway head, Aluminium Beam, Timber Beam, Plywood Sheathing, Beam Forming support. +

    +
    + +
    +

    Step 1

    +

    + Calculation of cross-sectional area: +

    +
    + +
      + +
    + + +
    + + +
    + +
    +Welcome to +Foundation in Beam Formwork Experiment +of Formwork Technology in Civil Engineering Virtual + Lab +developed by Prof. K. N. Jha, Department of Civil + Engineering, IIT Delhi. +
    +
    +Prof. K. N. Jha Image +Prof. K. N. Jha +IIT Delhi +
    +
    + +
    +

    Enter your name:

    + +

    Please enter your name before start

    + +
    + + + + + + + + + + + + + + + + + + + +
    Calculations:
    Total Length(m)
    Weight(kg)
    + Cross-sectional area (mm2) +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    S.No.Vin(V)R(Ω)DV0(V)MIin(A)I0(A)P0(W)
    1
    2
    3
    4
    5
    6
    7
    8
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    VGS = 4VVGS = 6VVGS = 8VVGS = 10VVGS = 15V
    VDS(V)ID(A)ID(A)ID(A)ID(A)ID(A)
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    VDS = 50 V
    VGS(V)ID(A)
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FromP1SA2R2P2N2V1V2
    ToDA1R1N1GSDS
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FromP1SR1P2N2DVPCPA1V1v2
    ToDR2N1GSCH1CH2WireDS
    + + +
    + +
    +From +To +
    + + + + + + + + + + +
    + +
    + +
    +From +To +
    + + + + + + + + + + + +
    + +
    + +
    +From +To +
    + + + + + + + + + + +
    + + + + + +
    + +
    + +
    + +

    + +
    + +
    + +
    +
    +
    +

    Question text

    + +
    +
      +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • +

      India

      +
    • +
    +
    + +
    + +
    +
    + +Certificate of Completion +
    +
    +
    +Utkarsh Sharma +
    +
    +has succesfully performed Virtaul Lab Experiment on + +Foundation in foamwork +
    +
    + +Date 10-10-2023 +
    +
    +which is developed by + VIRTUAL LABS - IIT Delhi + +
    +
    +
    + + + + + + + + + +
    + Record +
    +
    + Reset +
    +
    + Delete +
    +
    + Check Connections +
    +
    + Circuit Diagram +
    + +
    + Check +
    +
    + Reset +
    +
    + Hint +
    + + + + + + + + +arrow + +laerrow +laerrow2 +logo +man +measurearrow +measurearrow2 +redsize +speech_off_btn +speech_on_btn +talk_cloud +iit-delhi-logo + + + + + + + + +btn_connections.png +btn_connectons_completed.png +btn_instructions.png +btn_nomenclature.png + + +btn_procedure.png +btn_reset.png +btn_start_experiment.png +part_1_slide_3_compo_1_off.png +part_1_slide_3_compo_1_on.png +part_1_slide_3_compo_1_text.png +part_1_slide_3_compo_2_off.png +part_1_slide_3_compo_2_on.png +part_1_slide_3_compo_2_text.png +part_1_incomplete_connection.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +Title + +
    +
    + +
    ?
    +
    ?
    +
    ?
    +
    ?
    +
    ?
    +
    ?
    + +
    + +

    Image Box

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    +
    + +
    +
    + + +
    + +
    +
    + + + + + + + + + + + diff --git a/experiment/simulation/EE5/js/Anime.js b/experiment/simulation/EE5/js/Anime.js new file mode 100644 index 0000000..ceec66f --- /dev/null +++ b/experiment/simulation/EE5/js/Anime.js @@ -0,0 +1,62 @@ +const Anime = { + // time in second + fade(target,duration=1,endDelay=10,complete=null,begin=null){ + duration = duration * 1000 + endDelay = endDelay * 1000 + anime({ + targets: target, + duration: duration, + easing: "linear", + delay: 2000, + opacity: [0,1], + complete(){ + if(complete) + complete() + if(begin) + begin() + + setTimeout(()=>{ + anime({ + targets: target, + duration: duration, + easing: "linear", + opacity: 0, + }) + },endDelay) + } + }) + }, + fadeIn(target,duration=1,endDelay=10,complete=null,begin=null){ + duration = duration * 1000 + endDelay = endDelay * 1000 + anime({ + targets: target, + duration: duration, + easing: "linear", + delay: 2000, + opacity: [0,1], + complete(){ + if(complete) + complete() + if(begin) + begin() + } + }) + }, + moveLeft(target,leftPixel,duration=1,complete=null,begin=null){ + anime({ + targets: target, + easing: "easeInOutExpo", + left: leftPixel, + duration: duration*1000, + begin(){ + if(begin) + begin() + }, + complete(){ + if(complete) + complete() + } + }) + }, +} \ No newline at end of file diff --git a/experiment/simulation/EE5/js/Dom.js b/experiment/simulation/EE5/js/Dom.js new file mode 100644 index 0000000..4f68dc5 --- /dev/null +++ b/experiment/simulation/EE5/js/Dom.js @@ -0,0 +1,240 @@ + +// global for document object +const get = (query) => { + return document.querySelector(query); +}; + +const getAll = (query) => { + return document.querySelectorAll(query); +}; + +class Dom { + constructor(selector) { + this.item = null; + if (selector[0] == "." || selector[0] == "#") { + this.item = get(selector); + } else if (selector instanceof HTMLElement) { + this.item = selector; + } else { + this.item = src.get(selector); + } + this.selector = selector; + // push + } + getValue(){ + return this.item.attributes['value'].value + } + setValue(val){ + this.item.attributes['value'].value = val; + } + setAttribute(attribute,value){ + this.item.attributes[attribute] = value + } + getAttribute(attribute){ + this.item.attributes[attribute].value + } + hidden(isHidden) { + if (isHidden == false) this.item.style.visibility = "visible"; + else this.item.style.visibility = "hidden"; + } + setContent(text) { + this.item.innerHTML = text; + return this; + } + zIndex(idx) { + this.item.style.zIndex = idx; + return this; + } + opacity(val = 1) { + this.item.style.opacity = val; + return this; + } + rotate(deg) { + this.item.style.transform = `rotate(${deg}deg)`; + return this; + } + addClass(className) { + this.item.classList.add(className); + return this; + } + removeClass(className) { + this.item.classList.remove(className); + return this; + } + borderRadius(amount) { + amount += "px"; + this.styles({ + borderRadius: amount, + }); + } + scale(val = 1) { + this.item.style.scale = val; + return this; + } + get() { + return this.item; + } + set( + left = null, + top = null, + height = null, + width = null, + bottom = null, + right = null, + disp = "block" + ) { + // coordinates + this.left = left; + this.top = top; + this.bottom = bottom; + this.right = right; + this.height = height; + this.width = width; + this.item.style.opacity = 1; + this.item.style.transform = "translateX(0) translateY(0)"; + + if (this.left !== null) this.item.style.left = String(this.left) + "px"; + if (this.top !== null) this.item.style.top = String(this.top) + "px"; + if (this.bottom !== null) + this.item.style.bottom = String(this.bottom) + "px"; + if (this.right !== null) this.item.style.right = String(this.right) + "px"; + if (this.height !== null) + this.item.style.height = String(this.height) + "px"; + if (this.width !== null) this.item.style.width = String(this.width) + "px"; + this.show(disp); + return this; + } + show(disp = "block") { + //! push for every element + this.push(); + + this.item.style.display = disp; + // this.opacity(); + return this; + } + hide() { + this.item.style.display = "none"; + return this; + } + play(speed = 1) { + this.item.play(); + this.item.playbackRate = speed; + return this; + } + // for setting styles + styles(props) { + for (let property in props) { + this.item.style[property] = props[property]; + } + return this; + } + // * static elements/objects of anime + static arrayOfAnimes = []; + static arrayOfItems = []; + static animePush(animeObj) { + Dom.arrayOfAnimes.push(animeObj); + } + static resetAnimeItems() { + Dom.arrayOfAnimes = []; + } + static hideAll() { + //to empty the setCC + setCC(""); + // to delete all content of content adder menu + Scenes.items.contentAdderBox.setContent(""); + for (let i of Dom.arrayOfItems) { + i.hide(); + i.opacity(); + } + // * reset animes + for (let i of Dom.arrayOfAnimes) { + // to reset each anime after back btn pressed + i.reset(); + } + Dom.resetItems(); + } + static resetItems() { + Dom.arrayOfItems = []; + } + static setBlinkArrowRed( + isX = true, + left = null, + top = null, + height = 30, + width = null, + rotate = 0 + ) { + let blinkArrow = new Dom(".blinkArrowRed") + .set(left, top, height, width) + .rotate(rotate) + .zIndex(10000); + if (isX === -1) { + blinkArrow.hide(); + return; + } + let x = 0, + y = 0; + if (isX) { + x = 20; + } else { + y = 20; + } + var blink = anime({ + targets: blinkArrow.item, + easing: "easeInOutQuad", + opacity: 1, + translateX: x, + translateY: y, + direction: "alternate", + loop: true, + autoplay: false, + duration: 300, + }); + + return blink; + } + static setBlinkArrow( + isX = true, + left = null, + top = null, + height = 60, + width = 60, + rotate = 0 + ) { + // because we added the blinkArrow image out of the anime-main + top += 130; + let blinkArrow = new Dom(".blinkArrow") + .set(left, top, height, width) + .rotate(rotate) + .zIndex(10000); + if (isX === -1) { + blinkArrow.hide(); + return; + } + let x = 0, + y = 0; + if (isX) { + x = 20; + } else { + y = 20; + } + var blink = anime({ + targets: blinkArrow.item, + easing: "easeInOutQuad", + opacity: 1, + translateX: x, + translateY: y, + direction: "alternate", + loop: true, + autoplay: false, + duration: 300, + }); + + return blink; + } + push() { + if (this.selector != ".anime-header") Dom.arrayOfItems.push(this); + return this; + } + forMathematicalExpressionBtn = 0; + } \ No newline at end of file diff --git a/experiment/simulation/EE5/js/cables.js b/experiment/simulation/EE5/js/cables.js new file mode 100644 index 0000000..a9e77d2 --- /dev/null +++ b/experiment/simulation/EE5/js/cables.js @@ -0,0 +1,262 @@ +(function () { + // todo change this check with yours + // var yy = document.getElementById("check"); + // yy.onclick = checkk; + + // ! check + function checkk() { + if (connections.length == 0) { + alert("Please make the connections first"); + return false; + } + + if (connections.length < 6) { + alert("Wrong Connections\nPlease go through the instructions once"); + return false; + } + let isConnectionRight = false + if (connections.length >= 6) { + let matrixForCheckGraph = [ + // 0 1 2 3 4 5 6 7 8 9 10 + [0,0,0,0,0,0,0,0,0,0,0], // 0 + [0,0,0,1,0,0,0,0,0,0,0], // 1 + [0,0,0,0,0,0,1,0,1,0,0], // 2 + [0,1,0,0,0,0,0,0,0,0,0], // 3 + [0,0,0,0,0,0,0,1,0,1,0], // 4 + [0,0,0,0,0,0,0,0,0,0,1], // 5 + [0,0,1,0,0,0,0,0,1,0,0], // 6 + [0,0,0,0,1,0,0,0,0,1,0], // 7 + [0,0,1,0,0,0,1,0,0,0,0], // 8 + [0,0,0,0,1,0,0,1,0,0,0], // 9 + [0,0,0,0,0,1,0,0,0,0,0], // 10 + ] + var listDiv = []; + for (var j = 0; j < connections.length; j++) { + let pos = [connections[j].targetId,connections[j].sourceId] + listDiv.push(pos) + } + for(let i=0;i 0) { + var listDiv = []; + for (var j = 0; j < connections.length; j++) { + let pos = [connections[j].targetId,connections[j].sourceId] + listDiv.push(pos) + } + showConnectionInfo(listDiv); + } + }); + + jsPlumb.ready(function () { + var instance = jsPlumb.getInstance(); + + // suspend drawing and initialise. + instance.batch(function () { + // bind to connection/connectionDetached events, and update the list of connections on screen. + instance.bind("connection", function (info, originalEvent) { + updateConnections(info.connection); + }); + instance.bind("connectionDetached", function (info, originalEvent) { + updateConnections(info.connection, true); + }); + + instance.bind("connectionMoved", function (info, originalEvent) { + // only remove here, because a 'connection' event is also fired. + // in a future release of jsplumb this extra connection event will not + // be fired. + updateConnections(info.connection, true); + }); + + // configure some drop options for use by all endpoints. + var exampleDropOptions = { + tolerance: "touch", + hoverClass: "dropHover", + activeClass: "dragActive", + }; + let radius = 14 + var exampleEndpoint1 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "pink" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "pink", strokeWidth: 6 }, + connector: ["Bezier", { curviness: 10 }], + maxConnections: 1, + isTarget: true, + dropOptions: exampleDropOptions, + }; + var exampleEndpoint2 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "black" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "black", strokeWidth: 6 }, + connector: ["Bezier", { curviness: -50 }], + maxConnections: 3, + isTarget: true, + dropOptions: exampleDropOptions, + }; + var exampleEndpoint3 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "red" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "red", strokeWidth: 6 }, + connector: ["Bezier", { curviness: -30 }], + maxConnections: 3, + isTarget: true, + dropOptions: exampleDropOptions, + }; + var exampleEndpoint4 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "green" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "green", strokeWidth: 6 }, + connector: ["Bezier", { curviness: -50 }], + maxConnections: 1, + isTarget: true, + dropOptions: exampleDropOptions, + }; + // conn 1 + instance.addEndpoint( + "vertex1", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint1 + ); + instance.addEndpoint( + "vertex3", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint1 + ); + + // conn 2 + instance.addEndpoint( + "vertex4", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint2 + ); + instance.addEndpoint( + "vertex7", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint2 + ); + instance.addEndpoint( + "vertex9", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint2 + ); + + // conn 3 + instance.addEndpoint( + "vertex8", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint3 + ); + instance.addEndpoint( + "vertex6", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint3 + ); + instance.addEndpoint( + "vertex2", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint3 + ); + + // conn 4 + instance.addEndpoint( + "vertex10", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint4 + ); + instance.addEndpoint( + "vertex5", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint4 + ); + /*instance.addEndpoint("vertex9", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint4); + instance.addEndpoint("vertex10", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint4); + instance.addEndpoint("vertex11", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint3); + instance.addEndpoint("vertex12", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint3);*/ + + instance.draggable(jsPlumb.getSelector(".drag-drop-demo .window")); + + var hideLinks = jsPlumb.getSelector(".drag-drop-demo .hide"); + instance.on(hideLinks, "click", function (e) { + instance.toggleVisible(this.getAttribute("rel")); + jsPlumbUtil.consume(e); + }); + + var dragLinks = jsPlumb.getSelector(".drag-drop-demo .drag"); + instance.on(dragLinks, "click", function (e) { + var s = instance.toggleDraggable(this.getAttribute("rel")); + this.innerHTML = s ? "disable dragging" : "enable dragging"; + jsPlumbUtil.consume(e); + }); + + var detachLinks = jsPlumb.getSelector(".drag-drop-demo .detach"); + instance.on(detachLinks, "click", function (e) { + instance.deleteConnectionsForElement(this.getAttribute("rel")); + jsPlumbUtil.consume(e); + }); + + // ! reset + instance.on(document.getElementById("reset"), "click", function (e) { + // instance.detachEveryConnection(); + instance.deleteEveryConnection() + showConnectionInfo(""); + jsPlumbUtil.consume(e); + }); + }); + + jsPlumb.fire("jsPlumbDemoLoaded", instance); + }); + +})(); diff --git a/experiment/simulation/EE5/js/formulas.js b/experiment/simulation/EE5/js/formulas.js new file mode 100644 index 0000000..e03a476 --- /dev/null +++ b/experiment/simulation/EE5/js/formulas.js @@ -0,0 +1,76 @@ +const Formulas = { + using:{ + + iD(values,colIdx,vDS_idx){ + + const + Kn_values = [3,0.64,0.425,0.3188,0.2119], + lambda_values = [0.0138,0.25,0.1765,0.0858,0.0259], + Mn_values = [3,1.0827,0.7111,0.3607,0.1681], + gama_values = [0.0138,0.0087,0.025,0.0592,0.0543] + + colIdx = colIdx - 1 + let Kn = Kn_values[colIdx], + lambda = lambda_values[colIdx], + Mn = Mn_values[colIdx], + gama = gama_values[colIdx], + vT = 7, //change it + vGS = values.vGS, + vDS = this.vDS(vDS_idx) + + let ans = 0 + if(0 <= vDS && vDS <= (vGS - vT)){ + let a = Kn * ( 2*(vGS - vT) * vDS - Math.pow(vDS,2)) + let b = (1 + lambda * vDS) + ans = a * b + }else + if( vDS >= (vGS - vT)){ + let a = Mn * Math.pow((vGS - vT),2) + let b = (1 + gama * vDS) + ans = a * b + } + return Number(ans.toFixed(2)) + }, + vDS(vDS_idx){ + const vDS_values = [0,10,20,30,40,50] + return vDS_values[vDS_idx] + }, + }, + transferCharacteristics:{ + iD(values,colIdx,vDS_idx){ + + let vT = 6, // change its value + vGS = values.vGS, + vDS = this.vDS(vDS_idx) + + let ans = 0 + if(0 <= vDS && vDS <= 3){ + ans = 0 + }else + if(3 <= vDS && vDS <= 4){ + ans = 0.7 * Math.pow((vGS - vT),2) + }else{ + ans = 3.3 * ( Math.pow((vGS-vT), 2) - 0.79) + } + return Number(ans.toFixed(2)) + }, + vDS(vDS_idx){ + const vDS_values = [0,10,20,30,40,50] + return vDS_values[vDS_idx] + }, + } +} + +let values = { + vIn:0, + vGS:0, + R:0, +} + +function updateValues(vIn,vGS,R){ + values = { + vIn:vIn, + vGS:vGS, + R:R, + } +} \ No newline at end of file diff --git a/experiment/simulation/EE5/js/graph.js b/experiment/simulation/EE5/js/graph.js new file mode 100644 index 0000000..e69de29 diff --git a/experiment/simulation/EE5/js/jsplumb.js b/experiment/simulation/EE5/js/jsplumb.js new file mode 100644 index 0000000..5c66789 --- /dev/null +++ b/experiment/simulation/EE5/js/jsplumb.js @@ -0,0 +1,15949 @@ +/** + * jsBezier + * + * Copyright (c) 2010 - 2017 jsPlumb (hello@jsplumbtoolkit.com) + * + * licensed under the MIT license. + * + * a set of Bezier curve functions that deal with Beziers, used by jsPlumb, and perhaps useful for other people. These functions work with Bezier + * curves of arbitrary degree. + * + * - functions are all in the 'jsBezier' namespace. + * + * - all input points should be in the format {x:.., y:..}. all output points are in this format too. + * + * - all input curves should be in the format [ {x:.., y:..}, {x:.., y:..}, {x:.., y:..}, {x:.., y:..} ] + * + * - 'location' as used as an input here refers to a decimal in the range 0-1 inclusive, which indicates a point some proportion along the length + * of the curve. location as output has the same format and meaning. + * + * + * Function List: + * -------------- + * + * distanceFromCurve(point, curve) + * + * Calculates the distance that the given point lies from the given Bezier. Note that it is computed relative to the center of the Bezier, + * so if you have stroked the curve with a wide pen you may wish to take that into account! The distance returned is relative to the values + * of the curve and the point - it will most likely be pixels. + * + * gradientAtPoint(curve, location) + * + * Calculates the gradient to the curve at the given location, as a decimal between 0 and 1 inclusive. + * + * gradientAtPointAlongCurveFrom (curve, location) + * + * Calculates the gradient at the point on the given curve that is 'distance' units from location. + * + * nearestPointOnCurve(point, curve) + * + * Calculates the nearest point to the given point on the given curve. The return value of this is a JS object literal, containing both the + *point's coordinates and also the 'location' of the point (see above), for example: { point:{x:551,y:150}, location:0.263365 }. + * + * pointOnCurve(curve, location) + * + * Calculates the coordinates of the point on the given Bezier curve at the given location. + * + * pointAlongCurveFrom(curve, location, distance) + * + * Calculates the coordinates of the point on the given curve that is 'distance' units from location. 'distance' should be in the same coordinate + * space as that used to construct the Bezier curve. For an HTML Canvas usage, for example, distance would be a measure of pixels. + * + * locationAlongCurveFrom(curve, location, distance) + * + * Calculates the location on the given curve that is 'distance' units from location. 'distance' should be in the same coordinate + * space as that used to construct the Bezier curve. For an HTML Canvas usage, for example, distance would be a measure of pixels. + * + * perpendicularToCurveAt(curve, location, length, distance) + * + * Calculates the perpendicular to the given curve at the given location. length is the length of the line you wish for (it will be centered + * on the point at 'location'). distance is optional, and allows you to specify a point along the path from the given location as the center of + * the perpendicular returned. The return value of this is an array of two points: [ {x:...,y:...}, {x:...,y:...} ]. + * + * + */ + + (function() { + + var root = this; + + if(typeof Math.sgn == "undefined") { + Math.sgn = function(x) { return x == 0 ? 0 : x > 0 ? 1 :-1; }; + } + + var Vectors = { + subtract : function(v1, v2) { return {x:v1.x - v2.x, y:v1.y - v2.y }; }, + dotProduct : function(v1, v2) { return (v1.x * v2.x) + (v1.y * v2.y); }, + square : function(v) { return Math.sqrt((v.x * v.x) + (v.y * v.y)); }, + scale : function(v, s) { return {x:v.x * s, y:v.y * s }; } + }, + + maxRecursion = 64, + flatnessTolerance = Math.pow(2.0,-maxRecursion-1); + + /** + * Calculates the distance that the point lies from the curve. + * + * @param point a point in the form {x:567, y:3342} + * @param curve a Bezier curve in the form [{x:..., y:...}, {x:..., y:...}, {x:..., y:...}, {x:..., y:...}]. note that this is currently + * hardcoded to assume cubiz beziers, but would be better off supporting any degree. + * @return a JS object literal containing location and distance, for example: {location:0.35, distance:10}. Location is analogous to the location + * argument you pass to the pointOnPath function: it is a ratio of distance travelled along the curve. Distance is the distance in pixels from + * the point to the curve. + */ + var _distanceFromCurve = function(point, curve) { + var candidates = [], + w = _convertToBezier(point, curve), + degree = curve.length - 1, higherDegree = (2 * degree) - 1, + numSolutions = _findRoots(w, higherDegree, candidates, 0), + v = Vectors.subtract(point, curve[0]), dist = Vectors.square(v), t = 0.0; + + for (var i = 0; i < numSolutions; i++) { + v = Vectors.subtract(point, _bezier(curve, degree, candidates[i], null, null)); + var newDist = Vectors.square(v); + if (newDist < dist) { + dist = newDist; + t = candidates[i]; + } + } + v = Vectors.subtract(point, curve[degree]); + newDist = Vectors.square(v); + if (newDist < dist) { + dist = newDist; + t = 1.0; + } + return {location:t, distance:dist}; + }; + /** + * finds the nearest point on the curve to the given point. + */ + var _nearestPointOnCurve = function(point, curve) { + var td = _distanceFromCurve(point, curve); + return {point:_bezier(curve, curve.length - 1, td.location, null, null), location:td.location}; + }; + var _convertToBezier = function(point, curve) { + var degree = curve.length - 1, higherDegree = (2 * degree) - 1, + c = [], d = [], cdTable = [], w = [], + z = [ [1.0, 0.6, 0.3, 0.1], [0.4, 0.6, 0.6, 0.4], [0.1, 0.3, 0.6, 1.0] ]; + + for (var i = 0; i <= degree; i++) c[i] = Vectors.subtract(curve[i], point); + for (var i = 0; i <= degree - 1; i++) { + d[i] = Vectors.subtract(curve[i+1], curve[i]); + d[i] = Vectors.scale(d[i], 3.0); + } + for (var row = 0; row <= degree - 1; row++) { + for (var column = 0; column <= degree; column++) { + if (!cdTable[row]) cdTable[row] = []; + cdTable[row][column] = Vectors.dotProduct(d[row], c[column]); + } + } + for (i = 0; i <= higherDegree; i++) { + if (!w[i]) w[i] = []; + w[i].y = 0.0; + w[i].x = parseFloat(i) / higherDegree; + } + var n = degree, m = degree-1; + for (var k = 0; k <= n + m; k++) { + var lb = Math.max(0, k - m), + ub = Math.min(k, n); + for (i = lb; i <= ub; i++) { + var j = k - i; + w[i+j].y += cdTable[j][i] * z[j][i]; + } + } + return w; + }; + /** + * counts how many roots there are. + */ + var _findRoots = function(w, degree, t, depth) { + var left = [], right = [], + left_count, right_count, + left_t = [], right_t = []; + + switch (_getCrossingCount(w, degree)) { + case 0 : { + return 0; + } + case 1 : { + if (depth >= maxRecursion) { + t[0] = (w[0].x + w[degree].x) / 2.0; + return 1; + } + if (_isFlatEnough(w, degree)) { + t[0] = _computeXIntercept(w, degree); + return 1; + } + break; + } + } + _bezier(w, degree, 0.5, left, right); + left_count = _findRoots(left, degree, left_t, depth+1); + right_count = _findRoots(right, degree, right_t, depth+1); + for (var i = 0; i < left_count; i++) t[i] = left_t[i]; + for (var i = 0; i < right_count; i++) t[i+left_count] = right_t[i]; + return (left_count+right_count); + }; + var _getCrossingCount = function(curve, degree) { + var n_crossings = 0, sign, old_sign; + sign = old_sign = Math.sgn(curve[0].y); + for (var i = 1; i <= degree; i++) { + sign = Math.sgn(curve[i].y); + if (sign != old_sign) n_crossings++; + old_sign = sign; + } + return n_crossings; + }; + var _isFlatEnough = function(curve, degree) { + var error, + intercept_1, intercept_2, left_intercept, right_intercept, + a, b, c, det, dInv, a1, b1, c1, a2, b2, c2; + a = curve[0].y - curve[degree].y; + b = curve[degree].x - curve[0].x; + c = curve[0].x * curve[degree].y - curve[degree].x * curve[0].y; + + var max_distance_above, max_distance_below; + max_distance_above = max_distance_below = 0.0; + + for (var i = 1; i < degree; i++) { + var value = a * curve[i].x + b * curve[i].y + c; + if (value > max_distance_above) + max_distance_above = value; + else if (value < max_distance_below) + max_distance_below = value; + } + + a1 = 0.0; b1 = 1.0; c1 = 0.0; a2 = a; b2 = b; + c2 = c - max_distance_above; + det = a1 * b2 - a2 * b1; + dInv = 1.0/det; + intercept_1 = (b1 * c2 - b2 * c1) * dInv; + a2 = a; b2 = b; c2 = c - max_distance_below; + det = a1 * b2 - a2 * b1; + dInv = 1.0/det; + intercept_2 = (b1 * c2 - b2 * c1) * dInv; + left_intercept = Math.min(intercept_1, intercept_2); + right_intercept = Math.max(intercept_1, intercept_2); + error = right_intercept - left_intercept; + return (error < flatnessTolerance)? 1 : 0; + }; + var _computeXIntercept = function(curve, degree) { + var XLK = 1.0, YLK = 0.0, + XNM = curve[degree].x - curve[0].x, YNM = curve[degree].y - curve[0].y, + XMK = curve[0].x - 0.0, YMK = curve[0].y - 0.0, + det = XNM*YLK - YNM*XLK, detInv = 1.0/det, + S = (XNM*YMK - YNM*XMK) * detInv; + return 0.0 + XLK * S; + }; + var _bezier = function(curve, degree, t, left, right) { + var temp = [[]]; + for (var j =0; j <= degree; j++) temp[0][j] = curve[j]; + for (var i = 1; i <= degree; i++) { + for (var j =0 ; j <= degree - i; j++) { + if (!temp[i]) temp[i] = []; + if (!temp[i][j]) temp[i][j] = {}; + temp[i][j].x = (1.0 - t) * temp[i-1][j].x + t * temp[i-1][j+1].x; + temp[i][j].y = (1.0 - t) * temp[i-1][j].y + t * temp[i-1][j+1].y; + } + } + if (left != null) + for (j = 0; j <= degree; j++) left[j] = temp[j][0]; + if (right != null) + for (j = 0; j <= degree; j++) right[j] = temp[degree-j][j]; + + return (temp[degree][0]); + }; + + var _curveFunctionCache = {}; + var _getCurveFunctions = function(order) { + var fns = _curveFunctionCache[order]; + if (!fns) { + fns = []; + var f_term = function() { return function(t) { return Math.pow(t, order); }; }, + l_term = function() { return function(t) { return Math.pow((1-t), order); }; }, + c_term = function(c) { return function(t) { return c; }; }, + t_term = function() { return function(t) { return t; }; }, + one_minus_t_term = function() { return function(t) { return 1-t; }; }, + _termFunc = function(terms) { + return function(t) { + var p = 1; + for (var i = 0; i < terms.length; i++) p = p * terms[i](t); + return p; + }; + }; + + fns.push(new f_term()); // first is t to the power of the curve order + for (var i = 1; i < order; i++) { + var terms = [new c_term(order)]; + for (var j = 0 ; j < (order - i); j++) terms.push(new t_term()); + for (var j = 0 ; j < i; j++) terms.push(new one_minus_t_term()); + fns.push(new _termFunc(terms)); + } + fns.push(new l_term()); // last is (1-t) to the power of the curve order + + _curveFunctionCache[order] = fns; + } + + return fns; + }; + + + /** + * calculates a point on the curve, for a Bezier of arbitrary order. + * @param curve an array of control points, eg [{x:10,y:20}, {x:50,y:50}, {x:100,y:100}, {x:120,y:100}]. For a cubic bezier this should have four points. + * @param location a decimal indicating the distance along the curve the point should be located at. this is the distance along the curve as it travels, taking the way it bends into account. should be a number from 0 to 1, inclusive. + */ + var _pointOnPath = function(curve, location) { + var cc = _getCurveFunctions(curve.length - 1), + _x = 0, _y = 0; + for (var i = 0; i < curve.length ; i++) { + _x = _x + (curve[i].x * cc[i](location)); + _y = _y + (curve[i].y * cc[i](location)); + } + + return {x:_x, y:_y}; + }; + + var _dist = function(p1,p2) { + return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2)); + }; + + var _isPoint = function(curve) { + return curve[0].x === curve[1].x && curve[0].y === curve[1].y; + }; + + /** + * finds the point that is 'distance' along the path from 'location'. this method returns both the x,y location of the point and also + * its 'location' (proportion of travel along the path); the method below - _pointAlongPathFrom - calls this method and just returns the + * point. + */ + var _pointAlongPath = function(curve, location, distance) { + + if (_isPoint(curve)) { + return { + point:curve[0], + location:location + }; + } + + var prev = _pointOnPath(curve, location), + tally = 0, + curLoc = location, + direction = distance > 0 ? 1 : -1, + cur = null; + + while (tally < Math.abs(distance)) { + curLoc += (0.005 * direction); + cur = _pointOnPath(curve, curLoc); + tally += _dist(cur, prev); + prev = cur; + } + + return {point:cur, location:curLoc}; + }; + + var _length = function(curve) { + + var d = new Date().getTime(); + + if (_isPoint(curve)) return 0; + + var prev = _pointOnPath(curve, 0), + tally = 0, + curLoc = 0, + direction = 1, + cur = null; + + while (curLoc < 1) { + curLoc += (0.005 * direction); + cur = _pointOnPath(curve, curLoc); + tally += _dist(cur, prev); + prev = cur; + } + console.log("length", new Date().getTime() - d); + + return tally; + }; + + /** + * finds the point that is 'distance' along the path from 'location'. + */ + var _pointAlongPathFrom = function(curve, location, distance) { + return _pointAlongPath(curve, location, distance).point; + }; + + /** + * finds the location that is 'distance' along the path from 'location'. + */ + var _locationAlongPathFrom = function(curve, location, distance) { + return _pointAlongPath(curve, location, distance).location; + }; + + /** + * returns the gradient of the curve at the given location, which is a decimal between 0 and 1 inclusive. + * + * thanks // http://bimixual.org/AnimationLibrary/beziertangents.html + */ + var _gradientAtPoint = function(curve, location) { + + var p1 = _pointOnPath(curve, location), + p2 = _pointOnPath(curve.slice(0, curve.length - 1), location), + dy = p2.y - p1.y, dx = p2.x - p1.x; + + return dy === 0 ? Infinity : Math.atan(dy / dx); + }; + + /** + returns the gradient of the curve at the point which is 'distance' from the given location. + if this point is greater than location 1, the gradient at location 1 is returned. + if this point is less than location 0, the gradient at location 0 is returned. + */ + var _gradientAtPointAlongPathFrom = function(curve, location, distance) { + var p = _pointAlongPath(curve, location, distance); + if (p.location > 1) p.location = 1; + if (p.location < 0) p.location = 0; + return _gradientAtPoint(curve, p.location); + }; + + /** + * calculates a line that is 'length' pixels long, perpendicular to, and centered on, the path at 'distance' pixels from the given location. + * if distance is not supplied, the perpendicular for the given location is computed (ie. we set distance to zero). + */ + var _perpendicularToPathAt = function(curve, location, length, distance) { + distance = distance == null ? 0 : distance; + var p = _pointAlongPath(curve, location, distance), + m = _gradientAtPoint(curve, p.location), + _theta2 = Math.atan(-1 / m), + y = length / 2 * Math.sin(_theta2), + x = length / 2 * Math.cos(_theta2); + return [{x:p.point.x + x, y:p.point.y + y}, {x:p.point.x - x, y:p.point.y - y}]; + }; + + /** + * Calculates all intersections of the given line with the given curve. + * @param x1 + * @param y1 + * @param x2 + * @param y2 + * @param curve + * @returns {Array} + */ + var _lineIntersection = function(x1, y1, x2, y2, curve) { + var a = y2 - y1, + b = x1 - x2, + c = (x1 * (y1 - y2)) + (y1 * (x2-x1)), + coeffs = _computeCoefficients(curve), + p = [ + (a*coeffs[0][0]) + (b * coeffs[1][0]), + (a*coeffs[0][1])+(b*coeffs[1][1]), + (a*coeffs[0][2])+(b*coeffs[1][2]), + (a*coeffs[0][3])+(b*coeffs[1][3]) + c + ], + r = _cubicRoots.apply(null, p), + intersections = []; + + if (r != null) { + + for (var i = 0; i < 3; i++) { + var t = r[i], + t2 = Math.pow(t, 2), + t3 = Math.pow(t, 3), + x = [ + (coeffs[0][0] * t3) + (coeffs[0][1] * t2) + (coeffs[0][2] * t) + coeffs[0][3], + (coeffs[1][0] * t3) + (coeffs[1][1] * t2) + (coeffs[1][2] * t) + coeffs[1][3] + ]; + + // check bounds of the line + var s; + if ((x2 - x1) !== 0) { + s = (x[0] - x1) / (x2 - x1); + } + else { + s = (x[1] - y1) / (y2 - y1); + } + + if (t >= 0 && t <= 1.0 && s >= 0 && s <= 1.0) { + intersections.push(x); + } + } + } + + return intersections; + }; + + /** + * Calculates all intersections of the given box with the given curve. + * @param x X position of top left corner of box + * @param y Y position of top left corner of box + * @param w width of box + * @param h height of box + * @param curve + * @returns {Array} + */ + var _boxIntersection = function(x, y, w, h, curve) { + var i = []; + i.push.apply(i, _lineIntersection(x, y, x + w, y, curve)); + i.push.apply(i, _lineIntersection(x + w, y, x + w, y + h, curve)); + i.push.apply(i, _lineIntersection(x + w, y + h, x, y + h, curve)); + i.push.apply(i, _lineIntersection(x, y + h, x, y, curve)); + return i; + }; + + /** + * Calculates all intersections of the given bounding box with the given curve. + * @param boundingBox Bounding box, in { x:.., y:..., w:..., h:... } format. + * @param curve + * @returns {Array} + */ + var _boundingBoxIntersection = function(boundingBox, curve) { + var i = []; + i.push.apply(i, _lineIntersection(boundingBox.x, boundingBox.y, boundingBox.x + boundingBox.w, boundingBox.y, curve)); + i.push.apply(i, _lineIntersection(boundingBox.x + boundingBox.w, boundingBox.y, boundingBox.x + boundingBox.w, boundingBox.y + boundingBox.h, curve)); + i.push.apply(i, _lineIntersection(boundingBox.x + boundingBox.w, boundingBox.y + boundingBox.h, boundingBox.x, boundingBox.y + boundingBox.h, curve)); + i.push.apply(i, _lineIntersection(boundingBox.x, boundingBox.y + boundingBox.h, boundingBox.x, boundingBox.y, curve)); + return i; + }; + + + function _computeCoefficientsForAxis(curve, axis) { + return [ + -(curve[0][axis]) + (3*curve[1][axis]) + (-3 * curve[2][axis]) + curve[3][axis], + (3*(curve[0][axis])) - (6*(curve[1][axis])) + (3*(curve[2][axis])), + -3*curve[0][axis] + 3*curve[1][axis], + curve[0][axis] + ]; + } + + function _computeCoefficients(curve) + { + return [ + _computeCoefficientsForAxis(curve, "x"), + _computeCoefficientsForAxis(curve, "y") + ]; + } + + function sgn(x) { + return x < 0 ? -1 : x > 0 ? 1 : 0; + } + + function _cubicRoots(a, b, c, d) { + var A = b / a, + B = c / a, + C = d / a, + Q = (3*B - Math.pow(A, 2))/9, + R = (9*A*B - 27*C - 2*Math.pow(A, 3))/54, + D = Math.pow(Q, 3) + Math.pow(R, 2), + S, + T, + t = []; + + if (D >= 0) // complex or duplicate roots + { + S = sgn(R + Math.sqrt(D))*Math.pow(Math.abs(R + Math.sqrt(D)),(1/3)); + T = sgn(R - Math.sqrt(D))*Math.pow(Math.abs(R - Math.sqrt(D)),(1/3)); + + t[0] = -A/3 + (S + T); + t[1] = -A/3 - (S + T)/2; + t[2] = -A/3 - (S + T)/2; + + /*discard complex roots*/ + if (Math.abs(Math.sqrt(3)*(S - T)/2) !== 0) { + t[1] = -1; + t[2] = -1; + } + } + else // distinct real roots + { + var th = Math.acos(R/Math.sqrt(-Math.pow(Q, 3))); + t[0] = 2*Math.sqrt(-Q)*Math.cos(th/3) - A/3; + t[1] = 2*Math.sqrt(-Q)*Math.cos((th + 2*Math.PI)/3) - A/3; + t[2] = 2*Math.sqrt(-Q)*Math.cos((th + 4*Math.PI)/3) - A/3; + } + + // discard out of spec roots + for (var i = 0; i < 3; i++) { + if (t[i] < 0 || t[i] > 1.0) { + t[i] = -1; + } + } + + return t; + } + + var jsBezier = this.jsBezier = { + distanceFromCurve : _distanceFromCurve, + gradientAtPoint : _gradientAtPoint, + gradientAtPointAlongCurveFrom : _gradientAtPointAlongPathFrom, + nearestPointOnCurve : _nearestPointOnCurve, + pointOnCurve : _pointOnPath, + pointAlongCurveFrom : _pointAlongPathFrom, + perpendicularToCurveAt : _perpendicularToPathAt, + locationAlongCurveFrom:_locationAlongPathFrom, + getLength:_length, + lineIntersection:_lineIntersection, + boxIntersection:_boxIntersection, + boundingBoxIntersection:_boundingBoxIntersection, + version:"0.9.0" + }; + + if (typeof exports !== "undefined") { + exports.jsBezier = jsBezier; + } + +}).call(typeof window !== 'undefined' ? window : this); + +/** + * Biltong v0.4.0 + * + * Various geometry functions written as part of jsPlumb and perhaps useful for others. + * + * Copyright (c) 2017 jsPlumb + * https://jsplumbtoolkit.com + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +;(function() { + + "use strict"; + var root = this; + + var Biltong = root.Biltong = { + version:"0.4.0" + }; + + if (typeof exports !== "undefined") { + exports.Biltong = Biltong; + } + + var _isa = function(a) { return Object.prototype.toString.call(a) === "[object Array]"; }, + _pointHelper = function(p1, p2, fn) { + p1 = _isa(p1) ? p1 : [p1.x, p1.y]; + p2 = _isa(p2) ? p2 : [p2.x, p2.y]; + return fn(p1, p2); + }, + /** + * @name Biltong.gradient + * @function + * @desc Calculates the gradient of a line between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The gradient of a line between the two points. + */ + _gradient = Biltong.gradient = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + if (_p2[0] == _p1[0]) + return _p2[1] > _p1[1] ? Infinity : -Infinity; + else if (_p2[1] == _p1[1]) + return _p2[0] > _p1[0] ? 0 : -0; + else + return (_p2[1] - _p1[1]) / (_p2[0] - _p1[0]); + }); + }, + /** + * @name Biltong.normal + * @function + * @desc Calculates the gradient of a normal to a line between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The gradient of a normal to a line between the two points. + */ + _normal = Biltong.normal = function(p1, p2) { + return -1 / _gradient(p1, p2); + }, + /** + * @name Biltong.lineLength + * @function + * @desc Calculates the length of a line between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The length of a line between the two points. + */ + _lineLength = Biltong.lineLength = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + return Math.sqrt(Math.pow(_p2[1] - _p1[1], 2) + Math.pow(_p2[0] - _p1[0], 2)); + }); + }, + /** + * @name Biltong.quadrant + * @function + * @desc Calculates the quadrant in which the angle between the two points lies. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Integer} The quadrant - 1 for upper right, 2 for lower right, 3 for lower left, 4 for upper left. + */ + _quadrant = Biltong.quadrant = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + if (_p2[0] > _p1[0]) { + return (_p2[1] > _p1[1]) ? 2 : 1; + } + else if (_p2[0] == _p1[0]) { + return _p2[1] > _p1[1] ? 2 : 1; + } + else { + return (_p2[1] > _p1[1]) ? 3 : 4; + } + }); + }, + /** + * @name Biltong.theta + * @function + * @desc Calculates the angle between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The angle between the two points. + */ + _theta = Biltong.theta = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + var m = _gradient(_p1, _p2), + t = Math.atan(m), + s = _quadrant(_p1, _p2); + if ((s == 4 || s== 3)) t += Math.PI; + if (t < 0) t += (2 * Math.PI); + + return t; + }); + }, + /** + * @name Biltong.intersects + * @function + * @desc Calculates whether or not the two rectangles intersect. + * @param {Rectangle} r1 First rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @param {Rectangle} r2 Second rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @return {Boolean} True if the rectangles intersect, false otherwise. + */ + _intersects = Biltong.intersects = function(r1, r2) { + var x1 = r1.x, x2 = r1.x + r1.w, y1 = r1.y, y2 = r1.y + r1.h, + a1 = r2.x, a2 = r2.x + r2.w, b1 = r2.y, b2 = r2.y + r2.h; + + return ( (x1 <= a1 && a1 <= x2) && (y1 <= b1 && b1 <= y2) ) || + ( (x1 <= a2 && a2 <= x2) && (y1 <= b1 && b1 <= y2) ) || + ( (x1 <= a1 && a1 <= x2) && (y1 <= b2 && b2 <= y2) ) || + ( (x1 <= a2 && a1 <= x2) && (y1 <= b2 && b2 <= y2) ) || + ( (a1 <= x1 && x1 <= a2) && (b1 <= y1 && y1 <= b2) ) || + ( (a1 <= x2 && x2 <= a2) && (b1 <= y1 && y1 <= b2) ) || + ( (a1 <= x1 && x1 <= a2) && (b1 <= y2 && y2 <= b2) ) || + ( (a1 <= x2 && x1 <= a2) && (b1 <= y2 && y2 <= b2) ); + }, + /** + * @name Biltong.encloses + * @function + * @desc Calculates whether or not r2 is completely enclosed by r1. + * @param {Rectangle} r1 First rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @param {Rectangle} r2 Second rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @param {Boolean} [allowSharedEdges=false] If true, the concept of enclosure allows for one or more edges to be shared by the two rectangles. + * @return {Boolean} True if r1 encloses r2, false otherwise. + */ + _encloses = Biltong.encloses = function(r1, r2, allowSharedEdges) { + var x1 = r1.x, x2 = r1.x + r1.w, y1 = r1.y, y2 = r1.y + r1.h, + a1 = r2.x, a2 = r2.x + r2.w, b1 = r2.y, b2 = r2.y + r2.h, + c = function(v1, v2, v3, v4) { return allowSharedEdges ? v1 <= v2 && v3>= v4 : v1 < v2 && v3 > v4; }; + + return c(x1,a1,x2,a2) && c(y1,b1,y2,b2); + }, + _segmentMultipliers = [null, [1, -1], [1, 1], [-1, 1], [-1, -1] ], + _inverseSegmentMultipliers = [null, [-1, -1], [-1, 1], [1, 1], [1, -1] ], + /** + * @name Biltong.pointOnLine + * @function + * @desc Calculates a point on the line from `fromPoint` to `toPoint` that is `distance` units along the length of the line. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Point} Point on the line, in the form `{ x:..., y:... }`. + */ + _pointOnLine = Biltong.pointOnLine = function(fromPoint, toPoint, distance) { + var m = _gradient(fromPoint, toPoint), + s = _quadrant(fromPoint, toPoint), + segmentMultiplier = distance > 0 ? _segmentMultipliers[s] : _inverseSegmentMultipliers[s], + theta = Math.atan(m), + y = Math.abs(distance * Math.sin(theta)) * segmentMultiplier[1], + x = Math.abs(distance * Math.cos(theta)) * segmentMultiplier[0]; + return { x:fromPoint.x + x, y:fromPoint.y + y }; + }, + /** + * @name Biltong.perpendicularLineTo + * @function + * @desc Calculates a line of length `length` that is perpendicular to the line from `fromPoint` to `toPoint` and passes through `toPoint`. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Line} Perpendicular line, in the form `[ { x:..., y:... }, { x:..., y:... } ]`. + */ + _perpendicularLineTo = Biltong.perpendicularLineTo = function(fromPoint, toPoint, length) { + var m = _gradient(fromPoint, toPoint), + theta2 = Math.atan(-1 / m), + y = length / 2 * Math.sin(theta2), + x = length / 2 * Math.cos(theta2); + return [{x:toPoint.x + x, y:toPoint.y + y}, {x:toPoint.x - x, y:toPoint.y - y}]; + }; +}).call(typeof window !== 'undefined' ? window : this); +; +(function () { + + "use strict"; + + /** + * Creates a Touch object. + * @param view + * @param target + * @param pageX + * @param pageY + * @param screenX + * @param screenY + * @param clientX + * @param clientY + * @returns {Touch} + * @private + */ + function _touch(view, target, pageX, pageY, screenX, screenY, clientX, clientY) { + + return new Touch({ + target:target, + identifier:_uuid(), + pageX: pageX, + pageY: pageY, + screenX: screenX, + screenY: screenY, + clientX: clientX || screenX, + clientY: clientY || screenY + }); + } + + /** + * Create a synthetic touch list from the given list of Touch objects. + * @returns {Array} + * @private + */ + function _touchList() { + var list = []; + Array.prototype.push.apply(list, arguments); + list.item = function(index) { return this[index]; }; + return list; + } + + /** + * Create a Touch object and then insert it into a synthetic touch list, returning the list.s + * @param view + * @param target + * @param pageX + * @param pageY + * @param screenX + * @param screenY + * @param clientX + * @param clientY + * @returns {Array} + * @private + */ + function _touchAndList(view, target, pageX, pageY, screenX, screenY, clientX, clientY) { + return _touchList(_touch.apply(null, arguments)); + } + + var root = this, + matchesSelector = function (el, selector, ctx) { + ctx = ctx || el.parentNode; + var possibles = ctx.querySelectorAll(selector); + for (var i = 0; i < possibles.length; i++) { + if (possibles[i] === el) { + return true; + } + } + return false; + }, + _gel = function (el) { + return (typeof el == "string" || el.constructor === String) ? document.getElementById(el) : el; + }, + _t = function (e) { + return e.srcElement || e.target; + }, + // + // gets path info for the given event - the path from target to obj, in the event's bubble chain. if doCompute + // is false we just return target for the path. + // + _pi = function(e, target, obj, doCompute) { + if (!doCompute) return { path:[target], end:1 }; + else if (typeof e.path !== "undefined" && e.path.indexOf) { + return { path: e.path, end: e.path.indexOf(obj) }; + } else { + var out = { path:[], end:-1 }, _one = function(el) { + out.path.push(el); + if (el === obj) { + out.end = out.path.length - 1; + } + else if (el.parentNode != null) { + _one(el.parentNode) + } + }; + _one(target); + return out; + } + }, + _d = function (l, fn) { + for (var i = 0, j = l.length; i < j; i++) { + if (l[i] == fn) break; + } + if (i < l.length) l.splice(i, 1); + }, + guid = 1, + // + // this function generates a guid for every handler, sets it on the handler, then adds + // it to the associated object's map of handlers for the given event. this is what enables us + // to unbind all events of some type, or all events (the second of which can be requested by the user, + // but it also used by Mottle when an element is removed.) + _store = function (obj, event, fn) { + var g = guid++; + obj.__ta = obj.__ta || {}; + obj.__ta[event] = obj.__ta[event] || {}; + // store each handler with a unique guid. + obj.__ta[event][g] = fn; + // set the guid on the handler. + fn.__tauid = g; + return g; + }, + _unstore = function (obj, event, fn) { + obj.__ta && obj.__ta[event] && delete obj.__ta[event][fn.__tauid]; + // a handler might have attached extra functions, so we unbind those too. + if (fn.__taExtra) { + for (var i = 0; i < fn.__taExtra.length; i++) { + _unbind(obj, fn.__taExtra[i][0], fn.__taExtra[i][1]); + } + fn.__taExtra.length = 0; + } + // a handler might have attached an unstore callback + fn.__taUnstore && fn.__taUnstore(); + }, + _curryChildFilter = function (children, obj, fn, evt) { + if (children == null) return fn; + else { + var c = children.split(","), + _fn = function (e) { + _fn.__tauid = fn.__tauid; + var t = _t(e), target = t; // t is the target element on which the event occurred. it is the + // element we will wish to pass to any callbacks. + var pathInfo = _pi(e, t, obj, children != null) + if (pathInfo.end != -1) { + for (var p = 0; p < pathInfo.end; p++) { + target = pathInfo.path[p]; + for (var i = 0; i < c.length; i++) { + if (matchesSelector(target, c[i], obj)) { + fn.apply(target, arguments); + } + } + } + } + }; + registerExtraFunction(fn, evt, _fn); + return _fn; + } + }, + // + // registers an 'extra' function on some event listener function we were given - a function that we + // created and bound to the element as part of our housekeeping, and which we want to unbind and remove + // whenever the given function is unbound. + registerExtraFunction = function (fn, evt, newFn) { + fn.__taExtra = fn.__taExtra || []; + fn.__taExtra.push([evt, newFn]); + }, + DefaultHandler = function (obj, evt, fn, children) { + if (isTouchDevice && touchMap[evt]) { + var tfn = _curryChildFilter(children, obj, fn, touchMap[evt]); + _bind(obj, touchMap[evt], tfn , fn); + } + if (evt === "focus" && obj.getAttribute("tabindex") == null) { + obj.setAttribute("tabindex", "1"); + } + _bind(obj, evt, _curryChildFilter(children, obj, fn, evt), fn); + }, + SmartClickHandler = function (obj, evt, fn, children) { + if (obj.__taSmartClicks == null) { + var down = function (e) { + obj.__tad = _pageLocation(e); + }, + up = function (e) { + obj.__tau = _pageLocation(e); + }, + click = function (e) { + if (obj.__tad && obj.__tau && obj.__tad[0] === obj.__tau[0] && obj.__tad[1] === obj.__tau[1]) { + for (var i = 0; i < obj.__taSmartClicks.length; i++) + obj.__taSmartClicks[i].apply(_t(e), [ e ]); + } + }; + DefaultHandler(obj, "mousedown", down, children); + DefaultHandler(obj, "mouseup", up, children); + DefaultHandler(obj, "click", click, children); + obj.__taSmartClicks = []; + } + + // store in the list of callbacks + obj.__taSmartClicks.push(fn); + // the unstore function removes this function from the object's listener list for this type. + fn.__taUnstore = function () { + _d(obj.__taSmartClicks, fn); + }; + }, + _tapProfiles = { + "tap": {touches: 1, taps: 1}, + "dbltap": {touches: 1, taps: 2}, + "contextmenu": {touches: 2, taps: 1} + }, + TapHandler = function (clickThreshold, dblClickThreshold) { + return function (obj, evt, fn, children) { + // if event is contextmenu, for devices which are mouse only, we want to + // use the default bind. + if (evt == "contextmenu" && isMouseDevice) + DefaultHandler(obj, evt, fn, children); + else { + // the issue here is that this down handler gets registered only for the + // child nodes in the first registration. in fact it should be registered with + // no child selector and then on down we should cycle through the registered + // functions to see if one of them matches. on mouseup we should execute ALL of + // the functions whose children are either null or match the element. + if (obj.__taTapHandler == null) { + var tt = obj.__taTapHandler = { + tap: [], + dbltap: [], + contextmenu: [], + down: false, + taps: 0, + downSelectors: [] + }; + var down = function (e) { + var target = _t(e), pathInfo = _pi(e, target, obj, children != null), finished = false; + for (var p = 0; p < pathInfo.end; p++) { + if (finished) return; + target = pathInfo.path[p]; + for (var i = 0; i < tt.downSelectors.length; i++) { + if (tt.downSelectors[i] == null || matchesSelector(target, tt.downSelectors[i], obj)) { + tt.down = true; + setTimeout(clearSingle, clickThreshold); + setTimeout(clearDouble, dblClickThreshold); + finished = true; + break; // we only need one match on mousedown + } + } + } + }, + up = function (e) { + if (tt.down) { + var target = _t(e), currentTarget, pathInfo; + tt.taps++; + var tc = _touchCount(e); + for (var eventId in _tapProfiles) { + if (_tapProfiles.hasOwnProperty(eventId)) { + var p = _tapProfiles[eventId]; + if (p.touches === tc && (p.taps === 1 || p.taps === tt.taps)) { + for (var i = 0; i < tt[eventId].length; i++) { + pathInfo = _pi(e, target, obj, tt[eventId][i][1] != null); + for (var pLoop = 0; pLoop < pathInfo.end; pLoop++) { + currentTarget = pathInfo.path[pLoop]; + // this is a single event registration handler. + if (tt[eventId][i][1] == null || matchesSelector(currentTarget, tt[eventId][i][1], obj)) { + tt[eventId][i][0].apply(currentTarget, [ e ]); + break; + } + } + } + } + } + } + } + }, + clearSingle = function () { + tt.down = false; + }, + clearDouble = function () { + tt.taps = 0; + }; + + DefaultHandler(obj, "mousedown", down); + DefaultHandler(obj, "mouseup", up); + } + // add this child selector (it can be null, that's fine). + obj.__taTapHandler.downSelectors.push(children); + + obj.__taTapHandler[evt].push([fn, children]); + // the unstore function removes this function from the object's listener list for this type. + fn.__taUnstore = function () { + _d(obj.__taTapHandler[evt], fn); + }; + } + }; + }, + meeHelper = function (type, evt, obj, target) { + for (var i in obj.__tamee[type]) { + if (obj.__tamee[type].hasOwnProperty(i)) { + obj.__tamee[type][i].apply(target, [ evt ]); + } + } + }, + MouseEnterExitHandler = function () { + var activeElements = []; + return function (obj, evt, fn, children) { + if (!obj.__tamee) { + // __tamee holds a flag saying whether the mouse is currently "in" the element, and a list of + // both mouseenter and mouseexit functions. + obj.__tamee = { over: false, mouseenter: [], mouseexit: [] }; + // register over and out functions + var over = function (e) { + var t = _t(e); + if ((children == null && (t == obj && !obj.__tamee.over)) || (matchesSelector(t, children, obj) && (t.__tamee == null || !t.__tamee.over))) { + meeHelper("mouseenter", e, obj, t); + t.__tamee = t.__tamee || {}; + t.__tamee.over = true; + activeElements.push(t); + } + }, + out = function (e) { + var t = _t(e); + // is the current target one of the activeElements? and is the + // related target NOT a descendant of it? + for (var i = 0; i < activeElements.length; i++) { + if (t == activeElements[i] && !matchesSelector((e.relatedTarget || e.toElement), "*", t)) { + t.__tamee.over = false; + activeElements.splice(i, 1); + meeHelper("mouseexit", e, obj, t); + } + } + }; + + _bind(obj, "mouseover", _curryChildFilter(children, obj, over, "mouseover"), over); + _bind(obj, "mouseout", _curryChildFilter(children, obj, out, "mouseout"), out); + } + + fn.__taUnstore = function () { + delete obj.__tamee[evt][fn.__tauid]; + }; + + _store(obj, evt, fn); + obj.__tamee[evt][fn.__tauid] = fn; + }; + }, + isTouchDevice = "ontouchstart" in document.documentElement || navigator.maxTouchPoints, + isMouseDevice = "onmousedown" in document.documentElement, + touchMap = { "mousedown": "touchstart", "mouseup": "touchend", "mousemove": "touchmove" }, + touchstart = "touchstart", touchend = "touchend", touchmove = "touchmove", + iev = (function () { + var rv = -1; + if (navigator.appName == 'Microsoft Internet Explorer') { + var ua = navigator.userAgent, + re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); + if (re.exec(ua) != null) + rv = parseFloat(RegExp.$1); + } + return rv; + })(), + isIELT9 = iev > -1 && iev < 9, + _genLoc = function (e, prefix) { + if (e == null) return [ 0, 0 ]; + var ts = _touches(e), t = _getTouch(ts, 0); + return [t[prefix + "X"], t[prefix + "Y"]]; + }, + _pageLocation = function (e) { + if (e == null) return [ 0, 0 ]; + if (isIELT9) { + return [ e.clientX + document.documentElement.scrollLeft, e.clientY + document.documentElement.scrollTop ]; + } + else { + return _genLoc(e, "page"); + } + }, + _screenLocation = function (e) { + return _genLoc(e, "screen"); + }, + _clientLocation = function (e) { + return _genLoc(e, "client"); + }, + _getTouch = function (touches, idx) { + return touches.item ? touches.item(idx) : touches[idx]; + }, + _touches = function (e) { + return e.touches && e.touches.length > 0 ? e.touches : + e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches : + e.targetTouches && e.targetTouches.length > 0 ? e.targetTouches : + [ e ]; + }, + _touchCount = function (e) { + return _touches(e).length; + }, + //http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html + _bind = function (obj, type, fn, originalFn) { + _store(obj, type, fn); + originalFn.__tauid = fn.__tauid; + if (obj.addEventListener) + obj.addEventListener(type, fn, false); + else if (obj.attachEvent) { + var key = type + fn.__tauid; + obj["e" + key] = fn; + // TODO look at replacing with .call(..) + obj[key] = function () { + obj["e" + key] && obj["e" + key](window.event); + }; + obj.attachEvent("on" + type, obj[key]); + } + }, + _unbind = function (obj, type, fn) { + if (fn == null) return; + _each(obj, function () { + var _el = _gel(this); + _unstore(_el, type, fn); + // it has been bound if there is a tauid. otherwise it was not bound and we can ignore it. + if (fn.__tauid != null) { + if (_el.removeEventListener) { + _el.removeEventListener(type, fn, false); + if (isTouchDevice && touchMap[type]) _el.removeEventListener(touchMap[type], fn, false); + } + else if (this.detachEvent) { + var key = type + fn.__tauid; + _el[key] && _el.detachEvent("on" + type, _el[key]); + _el[key] = null; + _el["e" + key] = null; + } + } + + // if a touch event was also registered, deregister now. + if (fn.__taTouchProxy) { + _unbind(obj, fn.__taTouchProxy[1], fn.__taTouchProxy[0]); + } + }); + }, + _each = function (obj, fn) { + if (obj == null) return; + // if a list (or list-like), use it. if a string, get a list + // by running the string through querySelectorAll. else, assume + // it's an Element. + // obj.top is "unknown" in IE8. + obj = (typeof Window !== "undefined" && (typeof obj.top !== "unknown" && obj == obj.top)) ? [ obj ] : + (typeof obj !== "string") && (obj.tagName == null && obj.length != null) ? obj : + typeof obj === "string" ? document.querySelectorAll(obj) + : [ obj ]; + + for (var i = 0; i < obj.length; i++) + fn.apply(obj[i]); + }, + _uuid = function () { + return ('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + })); + }; + + /** + * Mottle offers support for abstracting out the differences + * between touch and mouse devices, plus "smart click" functionality + * (don't fire click if the mouse has moved between mousedown and mouseup), + * and synthesized click/tap events. + * @class Mottle + * @constructor + * @param {Object} params Constructor params + * @param {Number} [params.clickThreshold=250] Threshold, in milliseconds beyond which a touchstart followed by a touchend is not considered to be a click. + * @param {Number} [params.dblClickThreshold=450] Threshold, in milliseconds beyond which two successive tap events are not considered to be a click. + * @param {Boolean} [params.smartClicks=false] If true, won't fire click events if the mouse has moved between mousedown and mouseup. Note that this functionality + * requires that Mottle consume the mousedown event, and so may not be viable in all use cases. + */ + root.Mottle = function (params) { + params = params || {}; + var clickThreshold = params.clickThreshold || 250, + dblClickThreshold = params.dblClickThreshold || 450, + mouseEnterExitHandler = new MouseEnterExitHandler(), + tapHandler = new TapHandler(clickThreshold, dblClickThreshold), + _smartClicks = params.smartClicks, + _doBind = function (obj, evt, fn, children) { + if (fn == null) return; + _each(obj, function () { + var _el = _gel(this); + if (_smartClicks && evt === "click") + SmartClickHandler(_el, evt, fn, children); + else if (evt === "tap" || evt === "dbltap" || evt === "contextmenu") { + tapHandler(_el, evt, fn, children); + } + else if (evt === "mouseenter" || evt == "mouseexit") + mouseEnterExitHandler(_el, evt, fn, children); + else + DefaultHandler(_el, evt, fn, children); + }); + }; + + /** + * Removes an element from the DOM, and deregisters all event handlers for it. You should use this + * to ensure you don't leak memory. + * @method remove + * @param {String|Element} el Element, or id of the element, to remove. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.remove = function (el) { + _each(el, function () { + var _el = _gel(this); + if (_el.__ta) { + for (var evt in _el.__ta) { + if (_el.__ta.hasOwnProperty(evt)) { + for (var h in _el.__ta[evt]) { + if (_el.__ta[evt].hasOwnProperty(h)) + _unbind(_el, evt, _el.__ta[evt][h]); + } + } + } + } + _el.parentNode && _el.parentNode.removeChild(_el); + }); + return this; + }; + + /** + * Register an event handler, optionally as a delegate for some set of descendant elements. Note + * that this method takes either 3 or 4 arguments - if you supply 3 arguments it is assumed you have + * omitted the `children` parameter, and that the event handler should be bound directly to the given element. + * @method on + * @param {Element[]|Element|String} el Either an Element, or a CSS spec for a list of elements, or an array of Elements. + * @param {String} [children] Comma-delimited list of selectors identifying allowed children. + * @param {String} event Event ID. + * @param {Function} fn Event handler function. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.on = function (el, event, children, fn) { + var _el = arguments[0], + _c = arguments.length == 4 ? arguments[2] : null, + _e = arguments[1], + _f = arguments[arguments.length - 1]; + + _doBind(_el, _e, _f, _c); + return this; + }; + + /** + * Cancel delegate event handling for the given function. Note that unlike with 'on' you do not supply + * a list of child selectors here: it removes event delegation from all of the child selectors for which the + * given function was registered (if any). + * @method off + * @param {Element[]|Element|String} el Element - or ID of element - from which to remove event listener. + * @param {String} event Event ID. + * @param {Function} fn Event handler function. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.off = function (el, event, fn) { + _unbind(el, event, fn); + return this; + }; + + /** + * Triggers some event for a given element. + * @method trigger + * @param {Element} el Element for which to trigger the event. + * @param {String} event Event ID. + * @param {Event} originalEvent The original event. Should be optional of course, but currently is not, due + * to the jsPlumb use case that caused this method to be added. + * @param {Object} [payload] Optional object to set as `payload` on the generated event; useful for message passing. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.trigger = function (el, event, originalEvent, payload) { + // MouseEvent undefined in old IE; that's how we know it's a mouse event. A fine Microsoft paradox. + var originalIsMouse = isMouseDevice && (typeof MouseEvent === "undefined" || originalEvent == null || originalEvent.constructor === MouseEvent); + + var eventToBind = (isTouchDevice && !isMouseDevice && touchMap[event]) ? touchMap[event] : event, + bindingAMouseEvent = !(isTouchDevice && !isMouseDevice && touchMap[event]); + + var pl = _pageLocation(originalEvent), sl = _screenLocation(originalEvent), cl = _clientLocation(originalEvent); + _each(el, function () { + var _el = _gel(this), evt; + originalEvent = originalEvent || { + screenX: sl[0], + screenY: sl[1], + clientX: cl[0], + clientY: cl[1] + }; + + var _decorate = function (_evt) { + if (payload) _evt.payload = payload; + }; + + var eventGenerators = { + "TouchEvent": function (evt) { + + var touchList = _touchAndList(window, _el, 0, pl[0], pl[1], sl[0], sl[1], cl[0], cl[1]), + init = evt.initTouchEvent || evt.initEvent; + + init(eventToBind, true, true, window, null, sl[0], sl[1], + cl[0], cl[1], false, false, false, false, + touchList, touchList, touchList, 1, 0); + }, + "MouseEvents": function (evt) { + evt.initMouseEvent(eventToBind, true, true, window, 0, + sl[0], sl[1], + cl[0], cl[1], + false, false, false, false, 1, _el); + } + }; + + if (document.createEvent) { + + var ite = !bindingAMouseEvent && !originalIsMouse && (isTouchDevice && touchMap[event]), + evtName = ite ? "TouchEvent" : "MouseEvents"; + + evt = document.createEvent(evtName); + eventGenerators[evtName](evt); + _decorate(evt); + _el.dispatchEvent(evt); + } + else if (document.createEventObject) { + evt = document.createEventObject(); + evt.eventType = evt.eventName = eventToBind; + evt.screenX = sl[0]; + evt.screenY = sl[1]; + evt.clientX = cl[0]; + evt.clientY = cl[1]; + _decorate(evt); + _el.fireEvent('on' + eventToBind, evt); + } + }); + return this; + } + }; + + /** + * Static method to assist in 'consuming' an element: uses `stopPropagation` where available, or sets + * `e.returnValue=false` where it is not. + * @method Mottle.consume + * @param {Event} e Event to consume + * @param {Boolean} [doNotPreventDefault=false] If true, does not call `preventDefault()` on the event. + */ + root.Mottle.consume = function (e, doNotPreventDefault) { + if (e.stopPropagation) + e.stopPropagation(); + else + e.returnValue = false; + + if (!doNotPreventDefault && e.preventDefault) + e.preventDefault(); + }; + + /** + * Gets the page location corresponding to the given event. For touch events this means get the page location of the first touch. + * @method Mottle.pageLocation + * @param {Event} e Event to get page location for. + * @return {Number[]} [left, top] for the given event. + */ + root.Mottle.pageLocation = _pageLocation; + + /** + * Forces touch events to be turned "on". Useful for testing: even if you don't have a touch device, you can still + * trigger a touch event when this is switched on and it will be captured and acted on. + * @method setForceTouchEvents + * @param {Boolean} value If true, force touch events to be on. + */ + root.Mottle.setForceTouchEvents = function (value) { + isTouchDevice = value; + }; + + /** + * Forces mouse events to be turned "on". Useful for testing: even if you don't have a mouse, you can still + * trigger a mouse event when this is switched on and it will be captured and acted on. + * @method setForceMouseEvents + * @param {Boolean} value If true, force mouse events to be on. + */ + root.Mottle.setForceMouseEvents = function (value) { + isMouseDevice = value; + }; + + root.Mottle.version = "0.8.0"; + + if (typeof exports !== "undefined") { + exports.Mottle = root.Mottle; + } + +}).call(typeof window === "undefined" ? this : window); + +/** + drag/drop functionality for use with jsPlumb but with + no knowledge of jsPlumb. supports multiple scopes (separated by whitespace), dragging + multiple elements, constrain to parent, drop filters, drag start filters, custom + css classes. + + a lot of the functionality of this script is expected to be plugged in: + + addClass + removeClass + + addEvent + removeEvent + + getPosition + setPosition + getSize + + indexOf + intersects + + the name came from here: + + http://mrsharpoblunto.github.io/foswig.js/ + + copyright 2016 jsPlumb + */ + +;(function() { + + "use strict"; + var root = this; + + var _suggest = function(list, item, head) { + if (list.indexOf(item) === -1) { + head ? list.unshift(item) : list.push(item); + return true; + } + return false; + }; + + var _vanquish = function(list, item) { + var idx = list.indexOf(item); + if (idx !== -1) list.splice(idx, 1); + }; + + var _difference = function(l1, l2) { + var d = []; + for (var i = 0; i < l1.length; i++) { + if (l2.indexOf(l1[i]) === -1) + d.push(l1[i]); + } + return d; + }; + + var _isString = function(f) { + return f == null ? false : (typeof f === "string" || f.constructor === String); + }; + + var getOffsetRect = function (elem) { + // (1) + var box = elem.getBoundingClientRect(), + body = document.body, + docElem = document.documentElement, + // (2) + scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop, + scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft, + // (3) + clientTop = docElem.clientTop || body.clientTop || 0, + clientLeft = docElem.clientLeft || body.clientLeft || 0, + // (4) + top = box.top + scrollTop - clientTop, + left = box.left + scrollLeft - clientLeft; + + return { top: Math.round(top), left: Math.round(left) }; + }; + + var matchesSelector = function(el, selector, ctx) { + ctx = ctx || el.parentNode; + var possibles = ctx.querySelectorAll(selector); + for (var i = 0; i < possibles.length; i++) { + if (possibles[i] === el) + return true; + } + return false; + }; + + var findDelegateElement = function(parentElement, childElement, selector) { + if (matchesSelector(childElement, selector, parentElement)) { + return childElement; + } else { + var currentParent = childElement.parentNode; + while (currentParent != null && currentParent !== parentElement) { + if (matchesSelector(currentParent, selector, parentElement)) { + return currentParent; + } else { + currentParent = currentParent.parentNode; + } + } + } + }; + + /** + * Finds all elements matching the given selector, for the given parent. In order to support "scoped root" selectors, + * ie. things like "> .someClass", that is .someClass elements that are direct children of `parentElement`, we have to + * jump through a small hoop here: when a delegate draggable is registered, we write a `katavorio-draggable` attribute + * on the element on which the draggable is registered. Then when this method runs, we grab the value of that attribute and + * prepend it as part of the selector we're looking for. So "> .someClass" ends up being written as + * "[katavorio-draggable='...' > .someClass]", which works with querySelectorAll. + * + * @param availableSelectors + * @param parentElement + * @param childElement + * @returns {*} + */ + var findMatchingSelector = function(availableSelectors, parentElement, childElement) { + var el = null; + var draggableId = parentElement.getAttribute("katavorio-draggable"), + prefix = draggableId != null ? "[katavorio-draggable='" + draggableId + "'] " : ""; + + for (var i = 0; i < availableSelectors.length; i++) { + el = findDelegateElement(parentElement, childElement, prefix + availableSelectors[i].selector); + if (el != null) { + if (availableSelectors[i].filter) { + var matches = matchesSelector(childElement, availableSelectors[i].filter, el), + exclude = availableSelectors[i].filterExclude === true; + + if ( (exclude && !matches) || matches) { + return null; + } + + } + return [ availableSelectors[i], el ]; + } + } + return null; + }; + + var iev = (function() { + var rv = -1; + if (navigator.appName === 'Microsoft Internet Explorer') { + var ua = navigator.userAgent, + re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); + if (re.exec(ua) != null) + rv = parseFloat(RegExp.$1); + } + return rv; + })(), + DEFAULT_GRID_X = 10, + DEFAULT_GRID_Y = 10, + isIELT9 = iev > -1 && iev < 9, + isIE9 = iev === 9, + _pl = function(e) { + if (isIELT9) { + return [ e.clientX + document.documentElement.scrollLeft, e.clientY + document.documentElement.scrollTop ]; + } + else { + var ts = _touches(e), t = _getTouch(ts, 0); + // for IE9 pageX might be null if the event was synthesized. We try for pageX/pageY first, + // falling back to clientX/clientY if necessary. In every other browser we want to use pageX/pageY. + return isIE9 ? [t.pageX || t.clientX, t.pageY || t.clientY] : [t.pageX, t.pageY]; + } + }, + _getTouch = function(touches, idx) { return touches.item ? touches.item(idx) : touches[idx]; }, + _touches = function(e) { + return e.touches && e.touches.length > 0 ? e.touches : + e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches : + e.targetTouches && e.targetTouches.length > 0 ? e.targetTouches : + [ e ]; + }, + _classes = { + delegatedDraggable:"katavorio-delegated-draggable", // elements that are the delegated drag handler for a bunch of other elements + draggable:"katavorio-draggable", // draggable elements + droppable:"katavorio-droppable", // droppable elements + drag : "katavorio-drag", // elements currently being dragged + selected:"katavorio-drag-selected", // elements in current drag selection + active : "katavorio-drag-active", // droppables that are targets of a currently dragged element + hover : "katavorio-drag-hover", // droppables over which a matching drag element is hovering + noSelect : "katavorio-drag-no-select", // added to the body to provide a hook to suppress text selection + ghostProxy:"katavorio-ghost-proxy", // added to a ghost proxy element in use when a drag has exited the bounds of its parent. + clonedDrag:"katavorio-clone-drag" // added to a node that is a clone of an element created at the start of a drag + }, + _defaultScope = "katavorio-drag-scope", + _events = [ "stop", "start", "drag", "drop", "over", "out", "beforeStart" ], + _devNull = function() {}, + _true = function() { return true; }, + _foreach = function(l, fn, from) { + for (var i = 0; i < l.length; i++) { + if (l[i] != from) + fn(l[i]); + } + }, + _setDroppablesActive = function(dd, val, andHover, drag) { + _foreach(dd, function(e) { + e.setActive(val); + if (val) e.updatePosition(); + if (andHover) e.setHover(drag, val); + }); + }, + _each = function(obj, fn) { + if (obj == null) return; + obj = !_isString(obj) && (obj.tagName == null && obj.length != null) ? obj : [ obj ]; + for (var i = 0; i < obj.length; i++) + fn.apply(obj[i], [ obj[i] ]); + }, + _consume = function(e) { + if (e.stopPropagation) { + e.stopPropagation(); + e.preventDefault(); + } + else { + e.returnValue = false; + } + }, + _defaultInputFilterSelector = "input,textarea,select,button,option", + // + // filters out events on all input elements, like textarea, checkbox, input, select. + _inputFilter = function(e, el, _katavorio) { + var t = e.srcElement || e.target; + return !matchesSelector(t, _katavorio.getInputFilterSelector(), el); + }; + + var Super = function(el, params, css, scope) { + this.params = params || {}; + this.el = el; + this.params.addClass(this.el, this._class); + this.uuid = _uuid(); + var enabled = true; + this.setEnabled = function(e) { enabled = e; }; + this.isEnabled = function() { return enabled; }; + this.toggleEnabled = function() { enabled = !enabled; }; + this.setScope = function(scopes) { + this.scopes = scopes ? scopes.split(/\s+/) : [ scope ]; + }; + this.addScope = function(scopes) { + var m = {}; + _each(this.scopes, function(s) { m[s] = true;}); + _each(scopes ? scopes.split(/\s+/) : [], function(s) { m[s] = true;}); + this.scopes = []; + for (var i in m) this.scopes.push(i); + }; + this.removeScope = function(scopes) { + var m = {}; + _each(this.scopes, function(s) { m[s] = true;}); + _each(scopes ? scopes.split(/\s+/) : [], function(s) { delete m[s];}); + this.scopes = []; + for (var i in m) this.scopes.push(i); + }; + this.toggleScope = function(scopes) { + var m = {}; + _each(this.scopes, function(s) { m[s] = true;}); + _each(scopes ? scopes.split(/\s+/) : [], function(s) { + if (m[s]) delete m[s]; + else m[s] = true; + }); + this.scopes = []; + for (var i in m) this.scopes.push(i); + }; + this.setScope(params.scope); + this.k = params.katavorio; + return params.katavorio; + }; + + var TRUE = function() { return true; }; + var FALSE = function() { return false; }; + + var Drag = function(el, params, css, scope) { + this._class = css.draggable; + var k = Super.apply(this, arguments); + this.rightButtonCanDrag = this.params.rightButtonCanDrag; + var downAt = [0,0], posAtDown = null, pagePosAtDown = null, pageDelta = [0,0], moving = false, initialScroll = [0,0], + consumeStartEvent = this.params.consumeStartEvent !== false, + dragEl = this.el, + clone = this.params.clone, + scroll = this.params.scroll, + _multipleDrop = params.multipleDrop !== false, + isConstrained = false, + useGhostProxy = params.ghostProxy === true ? TRUE : params.ghostProxy && typeof params.ghostProxy === "function" ? params.ghostProxy : FALSE, + ghostProxy = function(el) { return el.cloneNode(true); }, + elementToDrag = null, + availableSelectors = [], + activeSelectorParams = null, // which, if any, selector config is currently active. + ghostProxyParent = params.ghostProxyParent, + currentParentPosition, + ghostParentPosition, + ghostDx, + ghostDy; + + // if an initial selector was provided, push the entire set of params as a selector config. + if (params.selector) { + var draggableId = el.getAttribute("katavorio-draggable"); + if (draggableId == null) { + draggableId = "" + new Date().getTime(); + el.setAttribute("katavorio-draggable", draggableId); + } + + availableSelectors.push(params); + } + + var snapThreshold = params.snapThreshold, + _snap = function(pos, gridX, gridY, thresholdX, thresholdY) { + var _dx = Math.floor(pos[0] / gridX), + _dxl = gridX * _dx, + _dxt = _dxl + gridX, + _x = Math.abs(pos[0] - _dxl) <= thresholdX ? _dxl : Math.abs(_dxt - pos[0]) <= thresholdX ? _dxt : pos[0]; + + var _dy = Math.floor(pos[1] / gridY), + _dyl = gridY * _dy, + _dyt = _dyl + gridY, + _y = Math.abs(pos[1] - _dyl) <= thresholdY ? _dyl : Math.abs(_dyt - pos[1]) <= thresholdY ? _dyt : pos[1]; + + return [ _x, _y]; + }; + + this.posses = []; + this.posseRoles = {}; + + this.toGrid = function(pos) { + if (this.params.grid == null) { + return pos; + } + else { + var tx = this.params.grid ? this.params.grid[0] / 2 : snapThreshold ? snapThreshold : DEFAULT_GRID_X / 2, + ty = this.params.grid ? this.params.grid[1] / 2 : snapThreshold ? snapThreshold : DEFAULT_GRID_Y / 2; + + return _snap(pos, this.params.grid[0], this.params.grid[1], tx, ty); + } + }; + + this.snap = function(x, y) { + if (dragEl == null) return; + x = x || (this.params.grid ? this.params.grid[0] : DEFAULT_GRID_X); + y = y || (this.params.grid ? this.params.grid[1] : DEFAULT_GRID_Y); + var p = this.params.getPosition(dragEl), + tx = this.params.grid ? this.params.grid[0] / 2 : snapThreshold, + ty = this.params.grid ? this.params.grid[1] / 2 : snapThreshold, + snapped = _snap(p, x, y, tx, ty); + + this.params.setPosition(dragEl, snapped); + return snapped; + }; + + this.setUseGhostProxy = function(val) { + useGhostProxy = val ? TRUE : FALSE; + }; + + var constrain; + var negativeFilter = function(pos) { + return (params.allowNegative === false) ? [ Math.max (0, pos[0]), Math.max(0, pos[1]) ] : pos; + }; + + var _setConstrain = function(value) { + constrain = typeof value === "function" ? value : value ? function(pos, dragEl, _constrainRect, _size) { + return negativeFilter([ + Math.max(0, Math.min(_constrainRect.w - _size[0], pos[0])), + Math.max(0, Math.min(_constrainRect.h - _size[1], pos[1])) + ]); + }.bind(this) : function(pos) { return negativeFilter(pos); }; + }.bind(this); + + _setConstrain(typeof this.params.constrain === "function" ? this.params.constrain : (this.params.constrain || this.params.containment)); + + + /** + * Sets whether or not the Drag is constrained. A value of 'true' means constrain to parent bounds; a function + * will be executed and returns true if the position is allowed. + * @param value + */ + this.setConstrain = function(value) { + _setConstrain(value); + }; + + var revertFunction; + /** + * Sets a function to call on drag stop, which, if it returns true, indicates that the given element should + * revert to its position before the previous drag. + * @param fn + */ + this.setRevert = function(fn) { + revertFunction = fn; + }; + + if (this.params.revert) { + revertFunction = this.params.revert; + } + + var _assignId = function(obj) { + if (typeof obj === "function") { + obj._katavorioId = _uuid(); + return obj._katavorioId; + } else { + return obj; + } + }, + // a map of { spec -> [ fn, exclusion ] } entries. + _filters = {}, + _testFilter = function(e) { + for (var key in _filters) { + var f = _filters[key]; + var rv = f[0](e); + if (f[1]) rv = !rv; + if (!rv) return false; + } + return true; + }, + _setFilter = this.setFilter = function(f, _exclude) { + if (f) { + var key = _assignId(f); + _filters[key] = [ + function(e) { + var t = e.srcElement || e.target, m; + if (_isString(f)) { + m = matchesSelector(t, f, el); + } + else if (typeof f === "function") { + m = f(e, el); + } + return m; + }, + _exclude !== false + ]; + + } + }, + _addFilter = this.addFilter = _setFilter, + _removeFilter = this.removeFilter = function(f) { + var key = typeof f === "function" ? f._katavorioId : f; + delete _filters[key]; + }; + + this.clearAllFilters = function() { + _filters = {}; + }; + + this.canDrag = this.params.canDrag || _true; + + var constrainRect, + matchingDroppables = [], + intersectingDroppables = []; + + this.addSelector = function(params) { + if (params.selector) { + availableSelectors.push(params); + } + }; + + this.downListener = function(e) { + if (e.defaultPrevented) { return; } + var isNotRightClick = this.rightButtonCanDrag || (e.which !== 3 && e.button !== 2); + if (isNotRightClick && this.isEnabled() && this.canDrag()) { + + var _f = _testFilter(e) && _inputFilter(e, this.el, this.k); + if (_f) { + + activeSelectorParams = null; + elementToDrag = null; + + // if (selector) { + // elementToDrag = findDelegateElement(this.el, e.target || e.srcElement, selector); + // if(elementToDrag == null) { + // return; + // } + // } + if (availableSelectors.length > 0) { + var match = findMatchingSelector(availableSelectors, this.el, e.target || e.srcElement); + if (match != null) { + activeSelectorParams = match[0]; + elementToDrag = match[1]; + } + // elementToDrag = findDelegateElement(this.el, e.target || e.srcElement, selector); + if(elementToDrag == null) { + return; + } + } + else { + elementToDrag = this.el; + } + + if (clone) { + dragEl = elementToDrag.cloneNode(true); + this.params.addClass(dragEl, _classes.clonedDrag); + + dragEl.setAttribute("id", null); + dragEl.style.position = "absolute"; + + if (this.params.parent != null) { + var p = this.params.getPosition(this.el); + dragEl.style.left = p[0] + "px"; + dragEl.style.top = p[1] + "px"; + this.params.parent.appendChild(dragEl); + } else { + // the clone node is added to the body; getOffsetRect gives us a value + // relative to the body. + var b = getOffsetRect(elementToDrag); + dragEl.style.left = b.left + "px"; + dragEl.style.top = b.top + "px"; + + document.body.appendChild(dragEl); + } + + } else { + dragEl = elementToDrag; + } + + consumeStartEvent && _consume(e); + downAt = _pl(e); + if (dragEl && dragEl.parentNode) + { + initialScroll = [dragEl.parentNode.scrollLeft, dragEl.parentNode.scrollTop]; + } + // + this.params.bind(document, "mousemove", this.moveListener); + this.params.bind(document, "mouseup", this.upListener); + k.markSelection(this); + k.markPosses(this); + this.params.addClass(document.body, css.noSelect); + _dispatch("beforeStart", {el:this.el, pos:posAtDown, e:e, drag:this}); + } + else if (this.params.consumeFilteredEvents) { + _consume(e); + } + } + }.bind(this); + + this.moveListener = function(e) { + if (downAt) { + if (!moving) { + var _continue = _dispatch("start", {el:this.el, pos:posAtDown, e:e, drag:this}); + if (_continue !== false) { + if (!downAt) { + return; + } + this.mark(true); + moving = true; + } else { + this.abort(); + } + } + + // it is possible that the start event caused the drag to be aborted. So we check + // again that we are currently dragging. + if (downAt) { + intersectingDroppables.length = 0; + var pos = _pl(e), dx = pos[0] - downAt[0], dy = pos[1] - downAt[1], + z = this.params.ignoreZoom ? 1 : k.getZoom(); + if (dragEl && dragEl.parentNode) + { + dx += dragEl.parentNode.scrollLeft - initialScroll[0]; + dy += dragEl.parentNode.scrollTop - initialScroll[1]; + } + dx /= z; + dy /= z; + this.moveBy(dx, dy, e); + k.updateSelection(dx, dy, this); + k.updatePosses(dx, dy, this); + } + } + }.bind(this); + + this.upListener = function(e) { + if (downAt) { + downAt = null; + this.params.unbind(document, "mousemove", this.moveListener); + this.params.unbind(document, "mouseup", this.upListener); + this.params.removeClass(document.body, css.noSelect); + this.unmark(e); + k.unmarkSelection(this, e); + k.unmarkPosses(this, e); + this.stop(e); + + k.notifyPosseDragStop(this, e); + moving = false; + intersectingDroppables.length = 0; + + if (clone) { + dragEl && dragEl.parentNode && dragEl.parentNode.removeChild(dragEl); + dragEl = null; + } else { + if (revertFunction && revertFunction(dragEl, this.params.getPosition(dragEl)) === true) { + this.params.setPosition(dragEl, posAtDown); + _dispatch("revert", dragEl); + } + } + + } + }.bind(this); + + this.getFilters = function() { return _filters; }; + + this.abort = function() { + if (downAt != null) { + this.upListener(); + } + }; + + /** + * Returns the element that was last dragged. This may be some original element from the DOM, or if `clone` is + * set, then its actually a copy of some original DOM element. In some client calls to this method, it is the + * actual element that was dragged that is desired. In others, it is the original DOM element that the user + * wishes to get - in which case, pass true for `retrieveOriginalElement`. + * + * @returns {*} + */ + this.getDragElement = function(retrieveOriginalElement) { + return retrieveOriginalElement ? elementToDrag || this.el : dragEl || this.el; + }; + + var listeners = {"start":[], "drag":[], "stop":[], "over":[], "out":[], "beforeStart":[], "revert":[] }; + if (params.events.start) listeners.start.push(params.events.start); + if (params.events.beforeStart) listeners.beforeStart.push(params.events.beforeStart); + if (params.events.stop) listeners.stop.push(params.events.stop); + if (params.events.drag) listeners.drag.push(params.events.drag); + if (params.events.revert) listeners.revert.push(params.events.revert); + + this.on = function(evt, fn) { + if (listeners[evt]) listeners[evt].push(fn); + }; + + this.off = function(evt, fn) { + if (listeners[evt]) { + var l = []; + for (var i = 0; i < listeners[evt].length; i++) { + if (listeners[evt][i] !== fn) l.push(listeners[evt][i]); + } + listeners[evt] = l; + } + }; + + var _dispatch = function(evt, value) { + var result = null; + if (activeSelectorParams && activeSelectorParams[evt]) { + result = activeSelectorParams[evt](value); + } else if (listeners[evt]) { + for (var i = 0; i < listeners[evt].length; i++) { + try { + var v = listeners[evt][i](value); + if (v != null) { + result = v; + } + } + catch (e) { } + } + } + return result; + }; + + this.notifyStart = function(e) { + _dispatch("start", {el:this.el, pos:this.params.getPosition(dragEl), e:e, drag:this}); + }; + + this.stop = function(e, force) { + if (force || moving) { + var positions = [], + sel = k.getSelection(), + dPos = this.params.getPosition(dragEl); + + if (sel.length > 0) { + for (var i = 0; i < sel.length; i++) { + var p = this.params.getPosition(sel[i].el); + positions.push([ sel[i].el, { left: p[0], top: p[1] }, sel[i] ]); + } + } + else { + positions.push([ dragEl, {left:dPos[0], top:dPos[1]}, this ]); + } + + _dispatch("stop", { + el: dragEl, + pos: ghostProxyOffsets || dPos, + finalPos:dPos, + e: e, + drag: this, + selection:positions + }); + } + }; + + this.mark = function(andNotify) { + posAtDown = this.params.getPosition(dragEl); + pagePosAtDown = this.params.getPosition(dragEl, true); + pageDelta = [pagePosAtDown[0] - posAtDown[0], pagePosAtDown[1] - posAtDown[1]]; + this.size = this.params.getSize(dragEl); + matchingDroppables = k.getMatchingDroppables(this); + _setDroppablesActive(matchingDroppables, true, false, this); + this.params.addClass(dragEl, this.params.dragClass || css.drag); + + var cs; + if (this.params.getConstrainingRectangle) { + cs = this.params.getConstrainingRectangle(dragEl) + } else { + cs = this.params.getSize(dragEl.parentNode); + } + constrainRect = {w: cs[0], h: cs[1]}; + + ghostDx = 0; + ghostDy = 0; + + if (andNotify) { + k.notifySelectionDragStart(this); + } + }; + var ghostProxyOffsets; + this.unmark = function(e, doNotCheckDroppables) { + _setDroppablesActive(matchingDroppables, false, true, this); + + if (isConstrained && useGhostProxy(elementToDrag, dragEl)) { + ghostProxyOffsets = [dragEl.offsetLeft - ghostDx, dragEl.offsetTop - ghostDy]; + dragEl.parentNode.removeChild(dragEl); + dragEl = elementToDrag; + } + else { + ghostProxyOffsets = null; + } + + this.params.removeClass(dragEl, this.params.dragClass || css.drag); + matchingDroppables.length = 0; + isConstrained = false; + if (!doNotCheckDroppables) { + if (intersectingDroppables.length > 0 && ghostProxyOffsets) { + params.setPosition(elementToDrag, ghostProxyOffsets); + } + intersectingDroppables.sort(_rankSort); + for (var i = 0; i < intersectingDroppables.length; i++) { + var retVal = intersectingDroppables[i].drop(this, e); + if (retVal === true) break; + } + } + }; + this.moveBy = function(dx, dy, e) { + intersectingDroppables.length = 0; + + var desiredLoc = this.toGrid([posAtDown[0] + dx, posAtDown[1] + dy]), + cPos = constrain(desiredLoc, dragEl, constrainRect, this.size); + + // if we should use a ghost proxy... + if (useGhostProxy(this.el, dragEl)) { + // and the element has been dragged outside of its parent bounds + if (desiredLoc[0] !== cPos[0] || desiredLoc[1] !== cPos[1]) { + + // ...if ghost proxy not yet created + if (!isConstrained) { + // create it + var gp = ghostProxy(elementToDrag); + params.addClass(gp, _classes.ghostProxy); + + if (ghostProxyParent) { + ghostProxyParent.appendChild(gp); + // find offset between drag el's parent the ghost parent + currentParentPosition = params.getPosition(elementToDrag.parentNode, true); + ghostParentPosition = params.getPosition(params.ghostProxyParent, true); + ghostDx = currentParentPosition[0] - ghostParentPosition[0]; + ghostDy = currentParentPosition[1] - ghostParentPosition[1]; + + } else { + elementToDrag.parentNode.appendChild(gp); + } + + // the ghost proxy is the drag element + dragEl = gp; + // set this flag so we dont recreate the ghost proxy + isConstrained = true; + } + // now the drag position can be the desired position, as the ghost proxy can support it. + cPos = desiredLoc; + } + else { + // if the element is not outside of its parent bounds, and ghost proxy is in place, + if (isConstrained) { + // remove the ghost proxy from the dom + dragEl.parentNode.removeChild(dragEl); + // reset the drag element to the original element + dragEl = elementToDrag; + // clear this flag. + isConstrained = false; + currentParentPosition = null; + ghostParentPosition = null; + ghostDx = 0; + ghostDy = 0; + } + } + } + + var rect = { x:cPos[0], y:cPos[1], w:this.size[0], h:this.size[1]}, + pageRect = { x:rect.x + pageDelta[0], y:rect.y + pageDelta[1], w:rect.w, h:rect.h}, + focusDropElement = null; + + this.params.setPosition(dragEl, [cPos[0] + ghostDx, cPos[1] + ghostDy]); + + for (var i = 0; i < matchingDroppables.length; i++) { + var r2 = { x:matchingDroppables[i].pagePosition[0], y:matchingDroppables[i].pagePosition[1], w:matchingDroppables[i].size[0], h:matchingDroppables[i].size[1]}; + if (this.params.intersects(pageRect, r2) && (_multipleDrop || focusDropElement == null || focusDropElement === matchingDroppables[i].el) && matchingDroppables[i].canDrop(this)) { + if (!focusDropElement) focusDropElement = matchingDroppables[i].el; + intersectingDroppables.push(matchingDroppables[i]); + matchingDroppables[i].setHover(this, true, e); + } + else if (matchingDroppables[i].isHover()) { + matchingDroppables[i].setHover(this, false, e); + } + } + + _dispatch("drag", {el:this.el, pos:cPos, e:e, drag:this}); + + /* test to see if the parent needs to be scrolled (future) + if (scroll) { + var pnsl = dragEl.parentNode.scrollLeft, pnst = dragEl.parentNode.scrollTop; + console.log("scroll!", pnsl, pnst); + }*/ + }; + this.destroy = function() { + this.params.unbind(this.el, "mousedown", this.downListener); + this.params.unbind(document, "mousemove", this.moveListener); + this.params.unbind(document, "mouseup", this.upListener); + this.downListener = null; + this.upListener = null; + this.moveListener = null; + }; + + // init:register mousedown, and perhaps set a filter + this.params.bind(this.el, "mousedown", this.downListener); + + // if handle provided, use that. otherwise, try to set a filter. + // note that a `handle` selector always results in filterExclude being set to false, ie. + // the selector defines the handle element(s). + if (this.params.handle) + _setFilter(this.params.handle, false); + else + _setFilter(this.params.filter, this.params.filterExclude); + }; + + var Drop = function(el, params, css, scope) { + this._class = css.droppable; + this.params = params || {}; + this.rank = params.rank || 0; + this._activeClass = this.params.activeClass || css.active; + this._hoverClass = this.params.hoverClass || css.hover; + Super.apply(this, arguments); + var hover = false; + this.allowLoopback = this.params.allowLoopback !== false; + + this.setActive = function(val) { + this.params[val ? "addClass" : "removeClass"](this.el, this._activeClass); + }; + + this.updatePosition = function() { + this.position = this.params.getPosition(this.el); + this.pagePosition = this.params.getPosition(this.el, true); + this.size = this.params.getSize(this.el); + }; + + this.canDrop = this.params.canDrop || function(drag) { + return true; + }; + + this.isHover = function() { return hover; }; + + this.setHover = function(drag, val, e) { + // if turning off hover but this was not the drag that caused the hover, ignore. + if (val || this.el._katavorioDragHover == null || this.el._katavorioDragHover === drag.el._katavorio) { + this.params[val ? "addClass" : "removeClass"](this.el, this._hoverClass); + this.el._katavorioDragHover = val ? drag.el._katavorio : null; + if (hover !== val) { + this.params.events[val ? "over" : "out"]({el: this.el, e: e, drag: drag, drop: this}); + } + hover = val; + } + }; + + /** + * A drop event. `drag` is the corresponding Drag object, which may be a Drag for some specific element, or it + * may be a Drag on some element acting as a delegate for elements contained within it. + * @param drag + * @param event + * @returns {*} + */ + this.drop = function(drag, event) { + return this.params.events["drop"]({ drag:drag, e:event, drop:this }); + }; + + this.destroy = function() { + this._class = null; + this._activeClass = null; + this._hoverClass = null; + hover = null; + }; + }; + + var _uuid = function() { + return ('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = Math.random()*16|0, v = c === 'x' ? r : (r&0x3|0x8); + return v.toString(16); + })); + }; + + var _rankSort = function(a,b) { + return a.rank < b.rank ? 1 : a.rank > b.rank ? -1 : 0; + }; + + var _gel = function(el) { + if (el == null) return null; + el = (typeof el === "string" || el.constructor === String) ? document.getElementById(el) : el; + if (el == null) return null; + el._katavorio = el._katavorio || _uuid(); + return el; + }; + + root.Katavorio = function(katavorioParams) { + + var _selection = [], + _selectionMap = {}; + + this._dragsByScope = {}; + this._dropsByScope = {}; + var _zoom = 1, + _reg = function(obj, map) { + _each(obj, function(_obj) { + for(var i = 0; i < _obj.scopes.length; i++) { + map[_obj.scopes[i]] = map[_obj.scopes[i]] || []; + map[_obj.scopes[i]].push(_obj); + } + }); + }, + _unreg = function(obj, map) { + var c = 0; + _each(obj, function(_obj) { + for(var i = 0; i < _obj.scopes.length; i++) { + if (map[_obj.scopes[i]]) { + var idx = katavorioParams.indexOf(map[_obj.scopes[i]], _obj); + if (idx !== -1) { + map[_obj.scopes[i]].splice(idx, 1); + c++; + } + } + } + }); + + return c > 0 ; + }, + _getMatchingDroppables = this.getMatchingDroppables = function(drag) { + var dd = [], _m = {}; + for (var i = 0; i < drag.scopes.length; i++) { + var _dd = this._dropsByScope[drag.scopes[i]]; + if (_dd) { + for (var j = 0; j < _dd.length; j++) { + if (_dd[j].canDrop(drag) && !_m[_dd[j].uuid] && (_dd[j].allowLoopback || _dd[j].el !== drag.el)) { + _m[_dd[j].uuid] = true; + dd.push(_dd[j]); + } + } + } + } + dd.sort(_rankSort); + return dd; + }, + _prepareParams = function(p) { + p = p || {}; + var _p = { + events:{} + }, i; + for (i in katavorioParams) _p[i] = katavorioParams[i]; + for (i in p) _p[i] = p[i]; + // events + + for (i = 0; i < _events.length; i++) { + _p.events[_events[i]] = p[_events[i]] || _devNull; + } + _p.katavorio = this; + return _p; + }.bind(this), + _mistletoe = function(existingDrag, params) { + for (var i = 0; i < _events.length; i++) { + if (params[_events[i]]) { + existingDrag.on(_events[i], params[_events[i]]); + } + } + }.bind(this), + _css = {}, + overrideCss = katavorioParams.css || {}, + _scope = katavorioParams.scope || _defaultScope; + + // prepare map of css classes based on defaults frst, then optional overrides + for (var i in _classes) _css[i] = _classes[i]; + for (var i in overrideCss) _css[i] = overrideCss[i]; + + var inputFilterSelector = katavorioParams.inputFilterSelector || _defaultInputFilterSelector; + /** + * Gets the selector identifying which input elements to filter from drag events. + * @method getInputFilterSelector + * @return {String} Current input filter selector. + */ + this.getInputFilterSelector = function() { return inputFilterSelector; }; + + /** + * Sets the selector identifying which input elements to filter from drag events. + * @method setInputFilterSelector + * @param {String} selector Input filter selector to set. + * @return {Katavorio} Current instance; method may be chained. + */ + this.setInputFilterSelector = function(selector) { + inputFilterSelector = selector; + return this; + }; + + /** + * Either makes the given element draggable, or identifies it as an element inside which some identified list + * of elements may be draggable. + * @param el + * @param params + * @returns {Array} + */ + this.draggable = function(el, params) { + var o = []; + _each(el, function (_el) { + _el = _gel(_el); + if (_el != null) { + if (_el._katavorioDrag == null) { + var p = _prepareParams(params); + _el._katavorioDrag = new Drag(_el, p, _css, _scope); + _reg(_el._katavorioDrag, this._dragsByScope); + o.push(_el._katavorioDrag); + katavorioParams.addClass(_el, p.selector ? _css.delegatedDraggable : _css.draggable); + } + else { + _mistletoe(_el._katavorioDrag, params); + } + } + }.bind(this)); + return o; + }; + + this.droppable = function(el, params) { + var o = []; + _each(el, function(_el) { + _el = _gel(_el); + if (_el != null) { + var drop = new Drop(_el, _prepareParams(params), _css, _scope); + _el._katavorioDrop = _el._katavorioDrop || []; + _el._katavorioDrop.push(drop); + _reg(drop, this._dropsByScope); + o.push(drop); + katavorioParams.addClass(_el, _css.droppable); + } + }.bind(this)); + return o; + }; + + /** + * @name Katavorio#select + * @function + * @desc Adds an element to the current selection (for multiple node drag) + * @param {Element|String} DOM element - or id of the element - to add. + */ + this.select = function(el) { + _each(el, function() { + var _el = _gel(this); + if (_el && _el._katavorioDrag) { + if (!_selectionMap[_el._katavorio]) { + _selection.push(_el._katavorioDrag); + _selectionMap[_el._katavorio] = [ _el, _selection.length - 1 ]; + katavorioParams.addClass(_el, _css.selected); + } + } + }); + return this; + }; + + /** + * @name Katavorio#deselect + * @function + * @desc Removes an element from the current selection (for multiple node drag) + * @param {Element|String} DOM element - or id of the element - to remove. + */ + this.deselect = function(el) { + _each(el, function() { + var _el = _gel(this); + if (_el && _el._katavorio) { + var e = _selectionMap[_el._katavorio]; + if (e) { + var _s = []; + for (var i = 0; i < _selection.length; i++) + if (_selection[i].el !== _el) _s.push(_selection[i]); + _selection = _s; + delete _selectionMap[_el._katavorio]; + katavorioParams.removeClass(_el, _css.selected); + } + } + }); + return this; + }; + + this.deselectAll = function() { + for (var i in _selectionMap) { + var d = _selectionMap[i]; + katavorioParams.removeClass(d[0], _css.selected); + } + + _selection.length = 0; + _selectionMap = {}; + }; + + this.markSelection = function(drag) { + _foreach(_selection, function(e) { e.mark(); }, drag); + }; + + this.markPosses = function(drag) { + if (drag.posses) { + _each(drag.posses, function(p) { + if (drag.posseRoles[p] && _posses[p]) { + _foreach(_posses[p].members, function (d) { + d.mark(); + }, drag); + } + }) + } + }; + + this.unmarkSelection = function(drag, event) { + _foreach(_selection, function(e) { e.unmark(event); }, drag); + }; + + this.unmarkPosses = function(drag, event) { + if (drag.posses) { + _each(drag.posses, function(p) { + if (drag.posseRoles[p] && _posses[p]) { + _foreach(_posses[p].members, function (d) { + d.unmark(event, true); + }, drag); + } + }); + } + }; + + this.getSelection = function() { return _selection.slice(0); }; + + this.updateSelection = function(dx, dy, drag) { + _foreach(_selection, function(e) { e.moveBy(dx, dy); }, drag); + }; + + var _posseAction = function(fn, drag) { + if (drag.posses) { + _each(drag.posses, function(p) { + if (drag.posseRoles[p] && _posses[p]) { + _foreach(_posses[p].members, function (e) { + fn(e); + }, drag); + } + }); + } + }; + + this.updatePosses = function(dx, dy, drag) { + _posseAction(function(e) { e.moveBy(dx, dy); }, drag); + }; + + this.notifyPosseDragStop = function(drag, evt) { + _posseAction(function(e) { e.stop(evt, true); }, drag); + }; + + this.notifySelectionDragStop = function(drag, evt) { + _foreach(_selection, function(e) { e.stop(evt, true); }, drag); + }; + + this.notifySelectionDragStart = function(drag, evt) { + _foreach(_selection, function(e) { e.notifyStart(evt);}, drag); + }; + + this.setZoom = function(z) { _zoom = z; }; + this.getZoom = function() { return _zoom; }; + + // does the work of changing scopes + var _scopeManip = function(kObj, scopes, map, fn) { + _each(kObj, function(_kObj) { + _unreg(_kObj, map); // deregister existing scopes + _kObj[fn](scopes); // set scopes + _reg(_kObj, map); // register new ones + }); + }; + + _each([ "set", "add", "remove", "toggle"], function(v) { + this[v + "Scope"] = function(el, scopes) { + _scopeManip(el._katavorioDrag, scopes, this._dragsByScope, v + "Scope"); + _scopeManip(el._katavorioDrop, scopes, this._dropsByScope, v + "Scope"); + }.bind(this); + this[v + "DragScope"] = function(el, scopes) { + _scopeManip(el.constructor === Drag ? el : el._katavorioDrag, scopes, this._dragsByScope, v + "Scope"); + }.bind(this); + this[v + "DropScope"] = function(el, scopes) { + _scopeManip(el.constructor === Drop ? el : el._katavorioDrop, scopes, this._dropsByScope, v + "Scope"); + }.bind(this); + }.bind(this)); + + this.snapToGrid = function(x, y) { + for (var s in this._dragsByScope) { + _foreach(this._dragsByScope[s], function(d) { d.snap(x, y); }); + } + }; + + this.getDragsForScope = function(s) { return this._dragsByScope[s]; }; + this.getDropsForScope = function(s) { return this._dropsByScope[s]; }; + + var _destroy = function(el, type, map) { + el = _gel(el); + if (el[type]) { + + // remove from selection, if present. + var selIdx = _selection.indexOf(el[type]); + if (selIdx >= 0) { + _selection.splice(selIdx, 1); + } + + if (_unreg(el[type], map)) { + _each(el[type], function(kObj) { kObj.destroy() }); + } + + delete el[type]; + } + }; + + var _removeListener = function(el, type, evt, fn) { + el = _gel(el); + if (el[type]) { + el[type].off(evt, fn); + } + }; + + this.elementRemoved = function(el) { + this.destroyDraggable(el); + this.destroyDroppable(el); + }; + + /** + * Either completely remove drag functionality from the given element, or remove a specific event handler. If you + * call this method with a single argument - the element - all drag functionality is removed from it. Otherwise, if + * you provide an event name and listener function, this function is de-registered (if found). + * @param el Element to update + * @param {string} [evt] Optional event name to unsubscribe + * @param {Function} [fn] Optional function to unsubscribe + */ + this.destroyDraggable = function(el, evt, fn) { + if (arguments.length === 1) { + _destroy(el, "_katavorioDrag", this._dragsByScope); + } else { + _removeListener(el, "_katavorioDrag", evt, fn); + } + }; + + /** + * Either completely remove drop functionality from the given element, or remove a specific event handler. If you + * call this method with a single argument - the element - all drop functionality is removed from it. Otherwise, if + * you provide an event name and listener function, this function is de-registered (if found). + * @param el Element to update + * @param {string} [evt] Optional event name to unsubscribe + * @param {Function} [fn] Optional function to unsubscribe + */ + this.destroyDroppable = function(el, evt, fn) { + if (arguments.length === 1) { + _destroy(el, "_katavorioDrop", this._dropsByScope); + } else { + _removeListener(el, "_katavorioDrop", evt, fn); + } + }; + + this.reset = function() { + this._dragsByScope = {}; + this._dropsByScope = {}; + _selection = []; + _selectionMap = {}; + _posses = {}; + }; + + // ----- groups + var _posses = {}; + + var _processOneSpec = function(el, _spec, dontAddExisting) { + var posseId = _isString(_spec) ? _spec : _spec.id; + var active = _isString(_spec) ? true : _spec.active !== false; + var posse = _posses[posseId] || (function() { + var g = {name:posseId, members:[]}; + _posses[posseId] = g; + return g; + })(); + _each(el, function(_el) { + if (_el._katavorioDrag) { + + if (dontAddExisting && _el._katavorioDrag.posseRoles[posse.name] != null) return; + + _suggest(posse.members, _el._katavorioDrag); + _suggest(_el._katavorioDrag.posses, posse.name); + _el._katavorioDrag.posseRoles[posse.name] = active; + } + }); + return posse; + }; + + /** + * Add the given element to the posse with the given id, creating the group if it at first does not exist. + * @method addToPosse + * @param {Element} el Element to add. + * @param {String...|Object...} spec Variable args parameters. Each argument can be a either a String, indicating + * the ID of a Posse to which the element should be added as an active participant, or an Object containing + * `{ id:"posseId", active:false/true}`. In the latter case, if `active` is not provided it is assumed to be + * true. + * @returns {Posse|Posse[]} The Posse(s) to which the element(s) was/were added. + */ + this.addToPosse = function(el, spec) { + + var posses = []; + + for (var i = 1; i < arguments.length; i++) { + posses.push(_processOneSpec(el, arguments[i])); + } + + return posses.length === 1 ? posses[0] : posses; + }; + + /** + * Sets the posse(s) for the element with the given id, creating those that do not yet exist, and removing from + * the element any current Posses that are not specified by this method call. This method will not change the + * active/passive state if it is given a posse in which the element is already a member. + * @method setPosse + * @param {Element} el Element to set posse(s) on. + * @param {String...|Object...} spec Variable args parameters. Each argument can be a either a String, indicating + * the ID of a Posse to which the element should be added as an active participant, or an Object containing + * `{ id:"posseId", active:false/true}`. In the latter case, if `active` is not provided it is assumed to be + * true. + * @returns {Posse|Posse[]} The Posse(s) to which the element(s) now belongs. + */ + this.setPosse = function(el, spec) { + + var posses = []; + + for (var i = 1; i < arguments.length; i++) { + posses.push(_processOneSpec(el, arguments[i], true).name); + } + + _each(el, function(_el) { + if (_el._katavorioDrag) { + var diff = _difference(_el._katavorioDrag.posses, posses); + var p = []; + Array.prototype.push.apply(p, _el._katavorioDrag.posses); + for (var i = 0; i < diff.length; i++) { + this.removeFromPosse(_el, diff[i]); + } + } + }.bind(this)); + + return posses.length === 1 ? posses[0] : posses; + }; + + /** + * Remove the given element from the given posse(s). + * @method removeFromPosse + * @param {Element} el Element to remove. + * @param {String...} posseId Varargs parameter: one value for each posse to remove the element from. + */ + this.removeFromPosse = function(el, posseId) { + if (arguments.length < 2) throw new TypeError("No posse id provided for remove operation"); + for(var i = 1; i < arguments.length; i++) { + posseId = arguments[i]; + _each(el, function (_el) { + if (_el._katavorioDrag && _el._katavorioDrag.posses) { + var d = _el._katavorioDrag; + _each(posseId, function (p) { + _vanquish(_posses[p].members, d); + _vanquish(d.posses, p); + delete d.posseRoles[p]; + }); + } + }); + } + }; + + /** + * Remove the given element from all Posses to which it belongs. + * @method removeFromAllPosses + * @param {Element|Element[]} el Element to remove from Posses. + */ + this.removeFromAllPosses = function(el) { + _each(el, function(_el) { + if (_el._katavorioDrag && _el._katavorioDrag.posses) { + var d = _el._katavorioDrag; + _each(d.posses, function(p) { + _vanquish(_posses[p].members, d); + }); + d.posses.length = 0; + d.posseRoles = {}; + } + }); + }; + + /** + * Changes the participation state for the element in the Posse with the given ID. + * @param {Element|Element[]} el Element(s) to change state for. + * @param {String} posseId ID of the Posse to change element state for. + * @param {Boolean} state True to make active, false to make passive. + */ + this.setPosseState = function(el, posseId, state) { + var posse = _posses[posseId]; + if (posse) { + _each(el, function(_el) { + if (_el._katavorioDrag && _el._katavorioDrag.posses) { + _el._katavorioDrag.posseRoles[posse.name] = state; + } + }); + } + }; + + }; + + root.Katavorio.version = "1.0.0"; + + if (typeof exports !== "undefined") { + exports.Katavorio = root.Katavorio; + } + +}).call(typeof window !== 'undefined' ? window : this); + + +(function() { + + var root = this; + root.jsPlumbUtil = root.jsPlumbUtil || {}; + var jsPlumbUtil = root.jsPlumbUtil; + + if (typeof exports !=='undefined') { exports.jsPlumbUtil = jsPlumbUtil;} + + + /** + * Tests if the given object is an Array. + * @param a + */ + function isArray(a) { + return Object.prototype.toString.call(a) === "[object Array]"; + } + jsPlumbUtil.isArray = isArray; + /** + * Tests if the given object is a Number. + * @param n + */ + function isNumber(n) { + return Object.prototype.toString.call(n) === "[object Number]"; + } + jsPlumbUtil.isNumber = isNumber; + function isString(s) { + return typeof s === "string"; + } + jsPlumbUtil.isString = isString; + function isBoolean(s) { + return typeof s === "boolean"; + } + jsPlumbUtil.isBoolean = isBoolean; + function isNull(s) { + return s == null; + } + jsPlumbUtil.isNull = isNull; + function isObject(o) { + return o == null ? false : Object.prototype.toString.call(o) === "[object Object]"; + } + jsPlumbUtil.isObject = isObject; + function isDate(o) { + return Object.prototype.toString.call(o) === "[object Date]"; + } + jsPlumbUtil.isDate = isDate; + function isFunction(o) { + return Object.prototype.toString.call(o) === "[object Function]"; + } + jsPlumbUtil.isFunction = isFunction; + function isNamedFunction(o) { + return isFunction(o) && o.name != null && o.name.length > 0; + } + jsPlumbUtil.isNamedFunction = isNamedFunction; + function isEmpty(o) { + for (var i in o) { + if (o.hasOwnProperty(i)) { + return false; + } + } + return true; + } + jsPlumbUtil.isEmpty = isEmpty; + function clone(a) { + if (isString(a)) { + return "" + a; + } + else if (isBoolean(a)) { + return !!a; + } + else if (isDate(a)) { + return new Date(a.getTime()); + } + else if (isFunction(a)) { + return a; + } + else if (isArray(a)) { + var b = []; + for (var i = 0; i < a.length; i++) { + b.push(clone(a[i])); + } + return b; + } + else if (isObject(a)) { + var c = {}; + for (var j in a) { + c[j] = clone(a[j]); + } + return c; + } + else { + return a; + } + } + jsPlumbUtil.clone = clone; + function merge(a, b, collations, overwrites) { + // first change the collations array - if present - into a lookup table, because its faster. + var cMap = {}, ar, i, oMap = {}; + collations = collations || []; + overwrites = overwrites || []; + for (i = 0; i < collations.length; i++) { + cMap[collations[i]] = true; + } + for (i = 0; i < overwrites.length; i++) { + oMap[overwrites[i]] = true; + } + var c = clone(a); + for (i in b) { + if (c[i] == null || oMap[i]) { + c[i] = b[i]; + } + else if (isString(b[i]) || isBoolean(b[i])) { + if (!cMap[i]) { + c[i] = b[i]; // if we dont want to collate, just copy it in. + } + else { + ar = []; + // if c's object is also an array we can keep its values. + ar.push.apply(ar, isArray(c[i]) ? c[i] : [c[i]]); + ar.push.apply(ar, isBoolean(b[i]) ? b[i] : [b[i]]); + c[i] = ar; + } + } + else { + if (isArray(b[i])) { + ar = []; + // if c's object is also an array we can keep its values. + if (isArray(c[i])) { + ar.push.apply(ar, c[i]); + } + ar.push.apply(ar, b[i]); + c[i] = ar; + } + else if (isObject(b[i])) { + // overwrite c's value with an object if it is not already one. + if (!isObject(c[i])) { + c[i] = {}; + } + for (var j in b[i]) { + c[i][j] = b[i][j]; + } + } + } + } + return c; + } + jsPlumbUtil.merge = merge; + function replace(inObj, path, value) { + if (inObj == null) { + return; + } + var q = inObj, t = q; + path.replace(/([^\.])+/g, function (term, lc, pos, str) { + var array = term.match(/([^\[0-9]+){1}(\[)([0-9+])/), last = pos + term.length >= str.length, _getArray = function () { + return t[array[1]] || (function () { + t[array[1]] = []; + return t[array[1]]; + })(); + }; + if (last) { + // set term = value on current t, creating term as array if necessary. + if (array) { + _getArray()[array[3]] = value; + } + else { + t[term] = value; + } + } + else { + // set to current t[term], creating t[term] if necessary. + if (array) { + var a_1 = _getArray(); + t = a_1[array[3]] || (function () { + a_1[array[3]] = {}; + return a_1[array[3]]; + })(); + } + else { + t = t[term] || (function () { + t[term] = {}; + return t[term]; + })(); + } + } + return ""; + }); + return inObj; + } + jsPlumbUtil.replace = replace; + // + // chain a list of functions, supplied by [ object, method name, args ], and return on the first + // one that returns the failValue. if none return the failValue, return the successValue. + // + function functionChain(successValue, failValue, fns) { + for (var i = 0; i < fns.length; i++) { + var o = fns[i][0][fns[i][1]].apply(fns[i][0], fns[i][2]); + if (o === failValue) { + return o; + } + } + return successValue; + } + jsPlumbUtil.functionChain = functionChain; + /** + * + * Take the given model and expand out any parameters. 'functionPrefix' is optional, and if present, helps jsplumb figure out what to do if a value is a Function. + * if you do not provide it (and doNotExpandFunctions is null, or false), jsplumb will run the given values through any functions it finds, and use the function's + * output as the value in the result. if you do provide the prefix, only functions that are named and have this prefix + * will be executed; other functions will be passed as values to the output. + * + * @param model + * @param values + * @param functionPrefix + * @param doNotExpandFunctions + * @returns {any} + */ + function populate(model, values, functionPrefix, doNotExpandFunctions) { + // for a string, see if it has parameter matches, and if so, try to make the substitutions. + var getValue = function (fromString) { + var matches = fromString.match(/(\${.*?})/g); + if (matches != null) { + for (var i = 0; i < matches.length; i++) { + var val = values[matches[i].substring(2, matches[i].length - 1)] || ""; + if (val != null) { + fromString = fromString.replace(matches[i], val); + } + } + } + return fromString; + }; + // process one entry. + var _one = function (d) { + if (d != null) { + if (isString(d)) { + return getValue(d); + } + else if (isFunction(d) && !doNotExpandFunctions && (functionPrefix == null || (d.name || "").indexOf(functionPrefix) === 0)) { + return d(values); + } + else if (isArray(d)) { + var r = []; + for (var i = 0; i < d.length; i++) { + r.push(_one(d[i])); + } + return r; + } + else if (isObject(d)) { + var s = {}; + for (var j in d) { + s[j] = _one(d[j]); + } + return s; + } + else { + return d; + } + } + }; + return _one(model); + } + jsPlumbUtil.populate = populate; + /** + * Find the index of a given object in an array. + * @param a The array to search + * @param f The function to run on each element. Return true if the element matches. + * @returns {number} -1 if not found, otherwise the index in the array. + */ + function findWithFunction(a, f) { + if (a) { + for (var i = 0; i < a.length; i++) { + if (f(a[i])) { + return i; + } + } + } + return -1; + } + jsPlumbUtil.findWithFunction = findWithFunction; + /** + * Remove some element from an array by matching each element in the array against some predicate function. Note that this + * is an in-place removal; the array is altered. + * @param a The array to search + * @param f The function to run on each element. Return true if the element matches. + * @returns {boolean} true if removed, false otherwise. + */ + function removeWithFunction(a, f) { + var idx = findWithFunction(a, f); + if (idx > -1) { + a.splice(idx, 1); + } + return idx !== -1; + } + jsPlumbUtil.removeWithFunction = removeWithFunction; + /** + * Remove some element from an array by simple lookup in the array for the given element. Note that this + * is an in-place removal; the array is altered. + * @param l The array to search + * @param v The value to remove. + * @returns {boolean} true if removed, false otherwise. + */ + function remove(l, v) { + var idx = l.indexOf(v); + if (idx > -1) { + l.splice(idx, 1); + } + return idx !== -1; + } + jsPlumbUtil.remove = remove; + /** + * Add some element to the given array, unless it is determined that it is already in the array. + * @param list The array to add the element to. + * @param item The item to add. + * @param hashFunction A function to use to determine if the given item already exists in the array. + */ + function addWithFunction(list, item, hashFunction) { + if (findWithFunction(list, hashFunction) === -1) { + list.push(item); + } + } + jsPlumbUtil.addWithFunction = addWithFunction; + /** + * Add some element to a list that is contained in a map of lists. + * @param map The map of [ key -> list ] entries + * @param key The name of the list to insert into + * @param value The value to insert + * @param insertAtStart Whether or not to insert at the start; defaults to false. + */ + function addToList(map, key, value, insertAtStart) { + var l = map[key]; + if (l == null) { + l = []; + map[key] = l; + } + l[insertAtStart ? "unshift" : "push"](value); + return l; + } + jsPlumbUtil.addToList = addToList; + /** + * Add an item to a list, unless it is already in the list. The test for pre-existence is a simple list lookup. + * If you want to do something more complex, perhaps #addWithFunction might help. + * @param list List to add the item to + * @param item Item to add + * @param insertAtHead Whether or not to insert at the start; defaults to false. + */ + function suggest(list, item, insertAtHead) { + if (list.indexOf(item) === -1) { + if (insertAtHead) { + list.unshift(item); + } + else { + list.push(item); + } + return true; + } + return false; + } + jsPlumbUtil.suggest = suggest; + /** + * Extends the given obj (which can be an array) with the given constructor function, prototype functions, and class members, any of which may be null. + * @param child + * @param parent + * @param _protoFn + */ + function extend(child, parent, _protoFn) { + var i; + parent = isArray(parent) ? parent : [parent]; + var _copyProtoChain = function (focus) { + var proto = focus.__proto__; + while (proto != null) { + if (proto.prototype != null) { + for (var j in proto.prototype) { + if (proto.prototype.hasOwnProperty(j) && !child.prototype.hasOwnProperty(j)) { + child.prototype[j] = proto.prototype[j]; + } + } + proto = proto.prototype.__proto__; + } + else { + proto = null; + } + } + }; + for (i = 0; i < parent.length; i++) { + for (var j in parent[i].prototype) { + if (parent[i].prototype.hasOwnProperty(j) && !child.prototype.hasOwnProperty(j)) { + child.prototype[j] = parent[i].prototype[j]; + } + } + _copyProtoChain(parent[i]); + } + var _makeFn = function (name, protoFn) { + return function () { + for (i = 0; i < parent.length; i++) { + if (parent[i].prototype[name]) { + parent[i].prototype[name].apply(this, arguments); + } + } + return protoFn.apply(this, arguments); + }; + }; + var _oneSet = function (fns) { + for (var k in fns) { + child.prototype[k] = _makeFn(k, fns[k]); + } + }; + if (arguments.length > 2) { + for (i = 2; i < arguments.length; i++) { + _oneSet(arguments[i]); + } + } + return child; + } + jsPlumbUtil.extend = extend; + /** + * Generate a UUID. + */ + // export function uuid(): string { + // return ('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + // let r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8); + // return v.toString(16); + // })); + // } + var lut = []; + for (var i = 0; i < 256; i++) { + lut[i] = (i < 16 ? '0' : '') + (i).toString(16); + } + function uuid() { + var d0 = Math.random() * 0xffffffff | 0; + var d1 = Math.random() * 0xffffffff | 0; + var d2 = Math.random() * 0xffffffff | 0; + var d3 = Math.random() * 0xffffffff | 0; + return lut[d0 & 0xff] + lut[d0 >> 8 & 0xff] + lut[d0 >> 16 & 0xff] + lut[d0 >> 24 & 0xff] + '-' + + lut[d1 & 0xff] + lut[d1 >> 8 & 0xff] + '-' + lut[d1 >> 16 & 0x0f | 0x40] + lut[d1 >> 24 & 0xff] + '-' + + lut[d2 & 0x3f | 0x80] + lut[d2 >> 8 & 0xff] + '-' + lut[d2 >> 16 & 0xff] + lut[d2 >> 24 & 0xff] + + lut[d3 & 0xff] + lut[d3 >> 8 & 0xff] + lut[d3 >> 16 & 0xff] + lut[d3 >> 24 & 0xff]; + } + jsPlumbUtil.uuid = uuid; + /** + * Trim a string. + * @param s String to trim + * @returns the String with leading and trailing whitespace removed. + */ + function fastTrim(s) { + if (s == null) { + return null; + } + var str = s.replace(/^\s\s*/, ''), ws = /\s/, i = str.length; + while (ws.test(str.charAt(--i))) { + } + return str.slice(0, i + 1); + } + jsPlumbUtil.fastTrim = fastTrim; + function each(obj, fn) { + obj = obj.length == null || typeof obj === "string" ? [obj] : obj; + for (var i = 0; i < obj.length; i++) { + fn(obj[i]); + } + } + jsPlumbUtil.each = each; + function map(obj, fn) { + var o = []; + for (var i = 0; i < obj.length; i++) { + o.push(fn(obj[i])); + } + return o; + } + jsPlumbUtil.map = map; + function mergeWithParents(type, map, parentAttribute) { + parentAttribute = parentAttribute || "parent"; + var _def = function (id) { + return id ? map[id] : null; + }; + var _parent = function (def) { + return def ? _def(def[parentAttribute]) : null; + }; + var _one = function (parent, def) { + if (parent == null) { + return def; + } + else { + var overrides = ["anchor", "anchors", "cssClass", "connector", "paintStyle", "hoverPaintStyle", "endpoint", "endpoints"]; + if (def.mergeStrategy === "override") { + Array.prototype.push.apply(overrides, ["events", "overlays"]); + } + var d_1 = merge(parent, def, [], overrides); + return _one(_parent(parent), d_1); + } + }; + var _getDef = function (t) { + if (t == null) { + return {}; + } + if (typeof t === "string") { + return _def(t); + } + else if (t.length) { + var done = false, i = 0, _dd = void 0; + while (!done && i < t.length) { + _dd = _getDef(t[i]); + if (_dd) { + done = true; + } + else { + i++; + } + } + return _dd; + } + }; + var d = _getDef(type); + if (d) { + return _one(_parent(d), d); + } + else { + return {}; + } + } + jsPlumbUtil.mergeWithParents = mergeWithParents; + jsPlumbUtil.logEnabled = true; + function log() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (jsPlumbUtil.logEnabled && typeof console !== "undefined") { + try { + var msg = arguments[arguments.length - 1]; + console.log(msg); + } + catch (e) { + } + } + } + jsPlumbUtil.log = log; + /** + * Wraps one function with another, creating a placeholder for the + * wrapped function if it was null. this is used to wrap the various + * drag/drop event functions - to allow jsPlumb to be notified of + * important lifecycle events without imposing itself on the user's + * drag/drop functionality. + * @method jsPlumbUtil.wrap + * @param {Function} wrappedFunction original function to wrap; may be null. + * @param {Function} newFunction function to wrap the original with. + * @param {Object} [returnOnThisValue] Optional. Indicates that the wrappedFunction should + * not be executed if the newFunction returns a value matching 'returnOnThisValue'. + * note that this is a simple comparison and only works for primitives right now. + */ + function wrap(wrappedFunction, newFunction, returnOnThisValue) { + return function () { + var r = null; + try { + if (newFunction != null) { + r = newFunction.apply(this, arguments); + } + } + catch (e) { + log("jsPlumb function failed : " + e); + } + if ((wrappedFunction != null) && (returnOnThisValue == null || (r !== returnOnThisValue))) { + try { + r = wrappedFunction.apply(this, arguments); + } + catch (e) { + log("wrapped function failed : " + e); + } + } + return r; + }; + } + jsPlumbUtil.wrap = wrap; + var EventGenerator = /** @class */ (function () { + function EventGenerator() { + var _this = this; + this._listeners = {}; + this.eventsSuspended = false; + this.tick = false; + // this is a list of events that should re-throw any errors that occur during their dispatch. + this.eventsToDieOn = { "ready": true }; + this.queue = []; + this.bind = function (event, listener, insertAtStart) { + var _one = function (evt) { + addToList(_this._listeners, evt, listener, insertAtStart); + listener.__jsPlumb = listener.__jsPlumb || {}; + listener.__jsPlumb[uuid()] = evt; + }; + if (typeof event === "string") { + _one(event); + } + else if (event.length != null) { + for (var i = 0; i < event.length; i++) { + _one(event[i]); + } + } + return _this; + }; + this.fire = function (event, value, originalEvent) { + if (!this.tick) { + this.tick = true; + if (!this.eventsSuspended && this._listeners[event]) { + var l = this._listeners[event].length, i = 0, _gone = false, ret = null; + if (!this.shouldFireEvent || this.shouldFireEvent(event, value, originalEvent)) { + while (!_gone && i < l && ret !== false) { + // doing it this way rather than catching and then possibly re-throwing means that an error propagated by this + // method will have the whole call stack available in the debugger. + if (this.eventsToDieOn[event]) { + this._listeners[event][i].apply(this, [value, originalEvent]); + } + else { + try { + ret = this._listeners[event][i].apply(this, [value, originalEvent]); + } + catch (e) { + log("jsPlumb: fire failed for event " + event + " : " + e); + } + } + i++; + if (this._listeners == null || this._listeners[event] == null) { + _gone = true; + } + } + } + } + this.tick = false; + this._drain(); + } + else { + this.queue.unshift(arguments); + } + return this; + }; + this._drain = function () { + var n = _this.queue.pop(); + if (n) { + _this.fire.apply(_this, n); + } + }; + this.unbind = function (eventOrListener, listener) { + if (arguments.length === 0) { + this._listeners = {}; + } + else if (arguments.length === 1) { + if (typeof eventOrListener === "string") { + delete this._listeners[eventOrListener]; + } + else if (eventOrListener.__jsPlumb) { + var evt = void 0; + for (var i in eventOrListener.__jsPlumb) { + evt = eventOrListener.__jsPlumb[i]; + remove(this._listeners[evt] || [], eventOrListener); + } + } + } + else if (arguments.length === 2) { + remove(this._listeners[eventOrListener] || [], listener); + } + return this; + }; + this.getListener = function (forEvent) { + return _this._listeners[forEvent]; + }; + this.setSuspendEvents = function (val) { + _this.eventsSuspended = val; + }; + this.isSuspendEvents = function () { + return _this.eventsSuspended; + }; + this.silently = function (fn) { + _this.setSuspendEvents(true); + try { + fn(); + } + catch (e) { + log("Cannot execute silent function " + e); + } + _this.setSuspendEvents(false); + }; + this.cleanupListeners = function () { + for (var i in _this._listeners) { + _this._listeners[i] = null; + } + }; + } + return EventGenerator; + }()); + jsPlumbUtil.EventGenerator = EventGenerator; + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains utility functions that run in browsers only. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ + ;(function() { + + "use strict"; + + var root = this; + + root.jsPlumbUtil.matchesSelector = function(el, selector, ctx) { + ctx = ctx || el.parentNode; + var possibles = ctx.querySelectorAll(selector); + for (var i = 0; i < possibles.length; i++) { + if (possibles[i] === el) { + return true; + } + } + return false; + }; + + root.jsPlumbUtil.consume = function(e, doNotPreventDefault) { + if (e.stopPropagation) { + e.stopPropagation(); + } + else { + e.returnValue = false; + } + + if (!doNotPreventDefault && e.preventDefault){ + e.preventDefault(); + } + }; + + /* + * Function: sizeElement + * Helper to size and position an element. You would typically use + * this when writing your own Connector or Endpoint implementation. + * + * Parameters: + * x - [int] x position for the element origin + * y - [int] y position for the element origin + * w - [int] width of the element + * h - [int] height of the element + * + */ + root.jsPlumbUtil.sizeElement = function(el, x, y, w, h) { + if (el) { + el.style.height = h + "px"; + el.height = h; + el.style.width = w + "px"; + el.width = w; + el.style.left = x + "px"; + el.style.top = y + "px"; + } + }; + + }).call(typeof window !== 'undefined' ? window : this); + +;(function() { + + var DEFAULT_OPTIONS = { + deriveAnchor:function(edge, index, ep, conn) { + return { + top:["TopRight", "TopLeft"], + bottom:["BottomRight", "BottomLeft"] + }[edge][index]; + } + }; + + var root = this; + + var ListManager = function(jsPlumbInstance, params) { + + this.count = 0; + this.instance = jsPlumbInstance; + this.lists = {}; + this.options = params || {}; + + this.instance.addList = function(el, options) { + return this.listManager.addList(el, options); + }; + + this.instance.removeList = function(el) { + this.listManager.removeList(el); + }; + + this.instance.bind("manageElement", function(p) { + + //look for [jtk-scrollable-list] elements and attach scroll listeners if necessary + var scrollableLists = this.instance.getSelector(p.el, "[jtk-scrollable-list]"); + for (var i = 0; i < scrollableLists.length; i++) { + this.addList(scrollableLists[i]); + } + + }.bind(this)); + + this.instance.bind("unmanageElement", function(p) { + this.removeList(p.el); + }); + + + this.instance.bind("connection", function(c, evt) { + if (evt == null) { + // not added by mouse. look for an ancestor of the source and/or target element that is a scrollable list, and run + // its scroll method. + this._maybeUpdateParentList(c.source); + this._maybeUpdateParentList(c.target); + } + }.bind(this)); + }; + + root.jsPlumbListManager = ListManager; + + ListManager.prototype = { + + addList : function(el, options) { + var dp = this.instance.extend({}, DEFAULT_OPTIONS); + this.instance.extend(dp, this.options); + options = this.instance.extend(dp, options || {}); + var id = [this.instance.getInstanceIndex(), this.count++].join("_"); + this.lists[id] = new List(this.instance, el, options, id); + }, + + removeList:function(el) { + var list = this.lists[el._jsPlumbList]; + if (list) { + list.destroy(); + delete this.lists[el._jsPlumbList]; + } + }, + + _maybeUpdateParentList:function (el) { + var parent = el.parentNode, container = this.instance.getContainer(); + while(parent != null && parent !== container) { + if (parent._jsPlumbList != null && this.lists[parent._jsPlumbList] != null) { + parent._jsPlumbScrollHandler(); + return + } + parent = parent.parentNode; + } + } + + + }; + + var List = function(instance, el, options, id) { + + el["_jsPlumbList"] = id; + + // + // Derive an anchor to use for the current situation. In contrast to the way we derive an endpoint, here we use `anchor` from the options, if present, as + // our first choice, and then `deriveAnchor` as our next choice. There is a default `deriveAnchor` implementation that uses TopRight/TopLeft for top and + // BottomRight/BottomLeft for bottom. + // + // edge - "top" or "bottom" + // index - 0 when endpoint is connection source, 1 when endpoint is connection target + // ep - the endpoint that is being proxied + // conn - the connection that is being proxied + // + function deriveAnchor(edge, index, ep, conn) { + return options.anchor ? options.anchor : options.deriveAnchor(edge, index, ep, conn); + } + + // + // Derive an endpoint to use for the current situation. We'll use a `deriveEndpoint` function passed in to the options as our first choice, + // followed by `endpoint` (an endpoint spec) from the options, and failing either of those we just use the `type` of the endpoint that is being proxied. + // + // edge - "top" or "bottom" + // index - 0 when endpoint is connection source, 1 when endpoint is connection target + // endpoint - the endpoint that is being proxied + // connection - the connection that is being proxied + // + function deriveEndpoint(edge, index, ep, conn) { + return options.deriveEndpoint ? options.deriveEndpoint(edge, index, ep, conn) : options.endpoint ? options.endpoint : ep.type; + } + + // + // look for a parent of the given scrollable list that is draggable, and then update the child offsets for it. this should not + // be necessary in the delegated drag stuff from the upcoming 3.0.0 release. + // + function _maybeUpdateDraggable(el) { + var parent = el.parentNode, container = instance.getContainer(); + while(parent != null && parent !== container) { + if (instance.hasClass(parent, "jtk-managed")) { + instance.recalculateOffsets(parent); + return + } + parent = parent.parentNode; + } + } + + var scrollHandler = function(e) { + + var children = instance.getSelector(el, ".jtk-managed"); + var elId = instance.getId(el); + + for (var i = 0; i < children.length; i++) { + + if (children[i].offsetTop < el.scrollTop) { + if (!children[i]._jsPlumbProxies) { + children[i]._jsPlumbProxies = children[i]._jsPlumbProxies || []; + instance.select({source: children[i]}).each(function (c) { + + + instance.proxyConnection(c, 0, el, elId, function () { + return deriveEndpoint("top", 0, c.endpoints[0], c); + }, function () { + return deriveAnchor("top", 0, c.endpoints[0], c); + }); + children[i]._jsPlumbProxies.push([c, 0]); + }); + + instance.select({target: children[i]}).each(function (c) { + instance.proxyConnection(c, 1, el, elId, function () { + return deriveEndpoint("top", 1, c.endpoints[1], c); + }, function () { + return deriveAnchor("top", 1, c.endpoints[1], c); + }); + children[i]._jsPlumbProxies.push([c, 1]); + }); + } + } + // + else if (children[i].offsetTop + children[i].offsetHeight > el.scrollTop + el.offsetHeight) { + if (!children[i]._jsPlumbProxies) { + children[i]._jsPlumbProxies = children[i]._jsPlumbProxies || []; + + instance.select({source: children[i]}).each(function (c) { + instance.proxyConnection(c, 0, el, elId, function () { + return deriveEndpoint("bottom", 0, c.endpoints[0], c); + }, function () { + return deriveAnchor("bottom", 0, c.endpoints[0], c); + }); + children[i]._jsPlumbProxies.push([c, 0]); + }); + + instance.select({target: children[i]}).each(function (c) { + instance.proxyConnection(c, 1, el, elId, function () { + return deriveEndpoint("bottom", 1, c.endpoints[1], c); + }, function () { + return deriveAnchor("bottom", 1, c.endpoints[1], c); + }); + children[i]._jsPlumbProxies.push([c, 1]); + }); + } + } else if (children[i]._jsPlumbProxies) { + for (var j = 0; j < children[i]._jsPlumbProxies.length; j++) { + instance.unproxyConnection(children[i]._jsPlumbProxies[j][0], children[i]._jsPlumbProxies[j][1], elId); + } + + delete children[i]._jsPlumbProxies; + } + + instance.revalidate(children[i]); + } + + _maybeUpdateDraggable(el); + }; + + instance.setAttribute(el, "jtk-scrollable-list", "true"); + el._jsPlumbScrollHandler = scrollHandler; + instance.on(el, "scroll", scrollHandler); + scrollHandler(); // run it once; there may be connections already. + + this.destroy = function() { + instance.off(el, "scroll", scrollHandler); + delete el._jsPlumbScrollHandler; + + var children = instance.getSelector(el, ".jtk-managed"); + var elId = instance.getId(el); + + for (var i = 0; i < children.length; i++) { + if (children[i]._jsPlumbProxies) { + for (var j = 0; j < children[i]._jsPlumbProxies.length; j++) { + instance.unproxyConnection(children[i]._jsPlumbProxies[j][0], children[i]._jsPlumbProxies[j][1], elId); + } + + delete children[i]._jsPlumbProxies; + } + } + }; + }; + + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the core code. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function () { + + "use strict"; + + var root = this; + + var _ju = root.jsPlumbUtil, + + /** + * creates a timestamp, using milliseconds since 1970, but as a string. + */ + _timestamp = function () { + return "" + (new Date()).getTime(); + }, + + // helper method to update the hover style whenever it, or paintStyle, changes. + // we use paintStyle as the foundation and merge hoverPaintStyle over the + // top. + _updateHoverStyle = function (component) { + if (component._jsPlumb.paintStyle && component._jsPlumb.hoverPaintStyle) { + var mergedHoverStyle = {}; + jsPlumb.extend(mergedHoverStyle, component._jsPlumb.paintStyle); + jsPlumb.extend(mergedHoverStyle, component._jsPlumb.hoverPaintStyle); + delete component._jsPlumb.hoverPaintStyle; + // we want the fill of paintStyle to override a gradient, if possible. + if (mergedHoverStyle.gradient && component._jsPlumb.paintStyle.fill) { + delete mergedHoverStyle.gradient; + } + component._jsPlumb.hoverPaintStyle = mergedHoverStyle; + } + }, + events = ["tap", "dbltap", "click", "dblclick", "mouseover", "mouseout", "mousemove", "mousedown", "mouseup", "contextmenu" ], + eventFilters = { "mouseout": "mouseleave", "mouseexit": "mouseleave" }, + _updateAttachedElements = function (component, state, timestamp, sourceElement) { + var affectedElements = component.getAttachedElements(); + if (affectedElements) { + for (var i = 0, j = affectedElements.length; i < j; i++) { + if (!sourceElement || sourceElement !== affectedElements[i]) { + affectedElements[i].setHover(state, true, timestamp); // tell the attached elements not to inform their own attached elements. + } + } + } + }, + _splitType = function (t) { + return t == null ? null : t.split(" "); + }, + _mapType = function(map, obj, typeId) { + for (var i in obj) { + map[i] = typeId; + } + }, + _each = function(fn, obj) { + obj = _ju.isArray(obj) || (obj.length != null && !_ju.isString(obj)) ? obj : [ obj ]; + for (var i = 0; i < obj.length; i++) { + try { + fn.apply(obj[i], [ obj[i] ]); + } + catch (e) { + _ju.log(".each iteration failed : " + e); + } + } + }, + _applyTypes = function (component, params, doNotRepaint) { + if (component.getDefaultType) { + var td = component.getTypeDescriptor(), map = {}; + var defType = component.getDefaultType(); + var o = _ju.merge({}, defType); + _mapType(map, defType, "__default"); + for (var i = 0, j = component._jsPlumb.types.length; i < j; i++) { + var tid = component._jsPlumb.types[i]; + if (tid !== "__default") { + var _t = component._jsPlumb.instance.getType(tid, td); + if (_t != null) { + + var overrides = ["anchor", "anchors", "connector", "paintStyle", "hoverPaintStyle", "endpoint", "endpoints", "connectorOverlays", "connectorStyle", "connectorHoverStyle", "endpointStyle", "endpointHoverStyle"]; + var collations = [ ]; + + if (_t.mergeStrategy === "override") { + Array.prototype.push.apply(overrides, ["events", "overlays", "cssClass"]); + } else { + collations.push("cssClass"); + } + + o = _ju.merge(o, _t, collations, overrides); + _mapType(map, _t, tid); + } + } + } + + if (params) { + o = _ju.populate(o, params, "_"); + } + + component.applyType(o, doNotRepaint, map); + if (!doNotRepaint) { + component.repaint(); + } + } + }, + +// ------------------------------ BEGIN jsPlumbUIComponent -------------------------------------------- + + jsPlumbUIComponent = root.jsPlumbUIComponent = function (params) { + + _ju.EventGenerator.apply(this, arguments); + + var self = this, + a = arguments, + idPrefix = self.idPrefix, + id = idPrefix + (new Date()).getTime(); + + this._jsPlumb = { + instance: params._jsPlumb, + parameters: params.parameters || {}, + paintStyle: null, + hoverPaintStyle: null, + paintStyleInUse: null, + hover: false, + beforeDetach: params.beforeDetach, + beforeDrop: params.beforeDrop, + overlayPlacements: [], + hoverClass: params.hoverClass || params._jsPlumb.Defaults.HoverClass, + types: [], + typeCache:{} + }; + + this.cacheTypeItem = function(key, item, typeId) { + this._jsPlumb.typeCache[typeId] = this._jsPlumb.typeCache[typeId] || {}; + this._jsPlumb.typeCache[typeId][key] = item; + }; + this.getCachedTypeItem = function(key, typeId) { + return this._jsPlumb.typeCache[typeId] ? this._jsPlumb.typeCache[typeId][key] : null; + }; + + this.getId = function () { + return id; + }; + +// ----------------------------- default type -------------------------------------------- + + + var o = params.overlays || [], oo = {}; + if (this.defaultOverlayKeys) { + for (var i = 0; i < this.defaultOverlayKeys.length; i++) { + Array.prototype.push.apply(o, this._jsPlumb.instance.Defaults[this.defaultOverlayKeys[i]] || []); + } + + for (i = 0; i < o.length; i++) { + // if a string, convert to object representation so that we can store the typeid on it. + // also assign an id. + var fo = jsPlumb.convertToFullOverlaySpec(o[i]); + oo[fo[1].id] = fo; + } + } + + var _defaultType = { + overlays:oo, + parameters: params.parameters || {}, + scope: params.scope || this._jsPlumb.instance.getDefaultScope() + }; + this.getDefaultType = function() { + return _defaultType; + }; + this.appendToDefaultType = function(obj) { + for (var i in obj) { + _defaultType[i] = obj[i]; + } + }; + +// ----------------------------- end default type -------------------------------------------- + + // all components can generate events + + if (params.events) { + for (var evtName in params.events) { + self.bind(evtName, params.events[evtName]); + } + } + + // all components get this clone function. + // TODO issue 116 showed a problem with this - it seems 'a' that is in + // the clone function's scope is shared by all invocations of it, the classic + // JS closure problem. for now, jsPlumb does a version of this inline where + // it used to call clone. but it would be nice to find some time to look + // further at this. + this.clone = function () { + var o = Object.create(this.constructor.prototype); + this.constructor.apply(o, a); + return o; + }.bind(this); + + // user can supply a beforeDetach callback, which will be executed before a detach + // is performed; returning false prevents the detach. + this.isDetachAllowed = function (connection) { + var r = true; + if (this._jsPlumb.beforeDetach) { + try { + r = this._jsPlumb.beforeDetach(connection); + } + catch (e) { + _ju.log("jsPlumb: beforeDetach callback failed", e); + } + } + return r; + }; + + // user can supply a beforeDrop callback, which will be executed before a dropped + // connection is confirmed. user can return false to reject connection. + this.isDropAllowed = function (sourceId, targetId, scope, connection, dropEndpoint, source, target) { + var r = this._jsPlumb.instance.checkCondition("beforeDrop", { + sourceId: sourceId, + targetId: targetId, + scope: scope, + connection: connection, + dropEndpoint: dropEndpoint, + source: source, target: target + }); + if (this._jsPlumb.beforeDrop) { + try { + r = this._jsPlumb.beforeDrop({ + sourceId: sourceId, + targetId: targetId, + scope: scope, + connection: connection, + dropEndpoint: dropEndpoint, + source: source, target: target + }); + } + catch (e) { + _ju.log("jsPlumb: beforeDrop callback failed", e); + } + } + return r; + }; + + var domListeners = []; + + // sets the component associated with listener events. for instance, an overlay delegates + // its events back to a connector. but if the connector is swapped on the underlying connection, + // then this component must be changed. This is called by setConnector in the Connection class. + this.setListenerComponent = function (c) { + for (var i = 0; i < domListeners.length; i++) { + domListeners[i][3] = c; + } + }; + + + }; + + var _removeTypeCssHelper = function (component, typeIndex) { + var typeId = component._jsPlumb.types[typeIndex], + type = component._jsPlumb.instance.getType(typeId, component.getTypeDescriptor()); + + if (type != null && type.cssClass && component.canvas) { + component._jsPlumb.instance.removeClass(component.canvas, type.cssClass); + } + }; + + _ju.extend(root.jsPlumbUIComponent, _ju.EventGenerator, { + + getParameter: function (name) { + return this._jsPlumb.parameters[name]; + }, + + setParameter: function (name, value) { + this._jsPlumb.parameters[name] = value; + }, + + getParameters: function () { + return this._jsPlumb.parameters; + }, + + setParameters: function (p) { + this._jsPlumb.parameters = p; + }, + + getClass:function() { + return jsPlumb.getClass(this.canvas); + }, + + hasClass:function(clazz) { + return jsPlumb.hasClass(this.canvas, clazz); + }, + + addClass: function (clazz) { + jsPlumb.addClass(this.canvas, clazz); + }, + + removeClass: function (clazz) { + jsPlumb.removeClass(this.canvas, clazz); + }, + + updateClasses: function (classesToAdd, classesToRemove) { + jsPlumb.updateClasses(this.canvas, classesToAdd, classesToRemove); + }, + + setType: function (typeId, params, doNotRepaint) { + this.clearTypes(); + this._jsPlumb.types = _splitType(typeId) || []; + _applyTypes(this, params, doNotRepaint); + }, + + getType: function () { + return this._jsPlumb.types; + }, + + reapplyTypes: function (params, doNotRepaint) { + _applyTypes(this, params, doNotRepaint); + }, + + hasType: function (typeId) { + return this._jsPlumb.types.indexOf(typeId) !== -1; + }, + + addType: function (typeId, params, doNotRepaint) { + var t = _splitType(typeId), _cont = false; + if (t != null) { + for (var i = 0, j = t.length; i < j; i++) { + if (!this.hasType(t[i])) { + this._jsPlumb.types.push(t[i]); + _cont = true; + } + } + if (_cont) { + _applyTypes(this, params, doNotRepaint); + } + } + }, + + removeType: function (typeId, params, doNotRepaint) { + var t = _splitType(typeId), _cont = false, _one = function (tt) { + var idx = this._jsPlumb.types.indexOf(tt); + if (idx !== -1) { + // remove css class if necessary + _removeTypeCssHelper(this, idx); + this._jsPlumb.types.splice(idx, 1); + return true; + } + return false; + }.bind(this); + + if (t != null) { + for (var i = 0, j = t.length; i < j; i++) { + _cont = _one(t[i]) || _cont; + } + if (_cont) { + _applyTypes(this, params, doNotRepaint); + } + } + }, + clearTypes: function (params, doNotRepaint) { + var i = this._jsPlumb.types.length; + for (var j = 0; j < i; j++) { + _removeTypeCssHelper(this, 0); + this._jsPlumb.types.splice(0, 1); + } + _applyTypes(this, params, doNotRepaint); + }, + + toggleType: function (typeId, params, doNotRepaint) { + var t = _splitType(typeId); + if (t != null) { + for (var i = 0, j = t.length; i < j; i++) { + var idx = this._jsPlumb.types.indexOf(t[i]); + if (idx !== -1) { + _removeTypeCssHelper(this, idx); + this._jsPlumb.types.splice(idx, 1); + } + else { + this._jsPlumb.types.push(t[i]); + } + } + + _applyTypes(this, params, doNotRepaint); + } + }, + applyType: function (t, doNotRepaint) { + this.setPaintStyle(t.paintStyle, doNotRepaint); + this.setHoverPaintStyle(t.hoverPaintStyle, doNotRepaint); + if (t.parameters) { + for (var i in t.parameters) { + this.setParameter(i, t.parameters[i]); + } + } + this._jsPlumb.paintStyleInUse = this.getPaintStyle(); + }, + setPaintStyle: function (style, doNotRepaint) { + // this._jsPlumb.paintStyle = jsPlumb.extend({}, style); + // TODO figure out if we want components to clone paintStyle so as not to share it. + this._jsPlumb.paintStyle = style; + this._jsPlumb.paintStyleInUse = this._jsPlumb.paintStyle; + _updateHoverStyle(this); + if (!doNotRepaint) { + this.repaint(); + } + }, + getPaintStyle: function () { + return this._jsPlumb.paintStyle; + }, + setHoverPaintStyle: function (style, doNotRepaint) { + //this._jsPlumb.hoverPaintStyle = jsPlumb.extend({}, style); + // TODO figure out if we want components to clone paintStyle so as not to share it. + this._jsPlumb.hoverPaintStyle = style; + _updateHoverStyle(this); + if (!doNotRepaint) { + this.repaint(); + } + }, + getHoverPaintStyle: function () { + return this._jsPlumb.hoverPaintStyle; + }, + destroy: function (force) { + if (force || this.typeId == null) { + this.cleanupListeners(); // this is on EventGenerator + this.clone = null; + this._jsPlumb = null; + } + }, + + isHover: function () { + return this._jsPlumb.hover; + }, + + setHover: function (hover, ignoreAttachedElements, timestamp) { + // while dragging, we ignore these events. this keeps the UI from flashing and + // swishing and whatevering. + if (this._jsPlumb && !this._jsPlumb.instance.currentlyDragging && !this._jsPlumb.instance.isHoverSuspended()) { + + this._jsPlumb.hover = hover; + var method = hover ? "addClass" : "removeClass"; + + if (this.canvas != null) { + if (this._jsPlumb.instance.hoverClass != null) { + this._jsPlumb.instance[method](this.canvas, this._jsPlumb.instance.hoverClass); + } + if (this._jsPlumb.hoverClass != null) { + this._jsPlumb.instance[method](this.canvas, this._jsPlumb.hoverClass); + } + } + if (this._jsPlumb.hoverPaintStyle != null) { + this._jsPlumb.paintStyleInUse = hover ? this._jsPlumb.hoverPaintStyle : this._jsPlumb.paintStyle; + if (!this._jsPlumb.instance.isSuspendDrawing()) { + timestamp = timestamp || _timestamp(); + this.repaint({timestamp: timestamp, recalc: false}); + } + } + // get the list of other affected elements, if supported by this component. + // for a connection, its the endpoints. for an endpoint, its the connections! surprise. + if (this.getAttachedElements && !ignoreAttachedElements) { + _updateAttachedElements(this, hover, _timestamp(), this); + } + } + } + }); + +// ------------------------------ END jsPlumbUIComponent -------------------------------------------- + + var _jsPlumbInstanceIndex = 0, + getInstanceIndex = function () { + var i = _jsPlumbInstanceIndex + 1; + _jsPlumbInstanceIndex++; + return i; + }; + + var jsPlumbInstance = root.jsPlumbInstance = function (_defaults) { + + this.version = "2.13.2"; + + this.Defaults = { + Anchor: "Bottom", + Anchors: [ null, null ], + ConnectionsDetachable: true, + ConnectionOverlays: [ ], + Connector: "Bezier", + Container: null, + DoNotThrowErrors: false, + DragOptions: { }, + DropOptions: { }, + Endpoint: "Dot", + EndpointOverlays: [ ], + Endpoints: [ null, null ], + EndpointStyle: { fill: "#456" }, + EndpointStyles: [ null, null ], + EndpointHoverStyle: null, + EndpointHoverStyles: [ null, null ], + HoverPaintStyle: null, + LabelStyle: { color: "black" }, + ListStyle: { }, + LogEnabled: false, + Overlays: [ ], + MaxConnections: 1, + PaintStyle: { "stroke-width": 4, stroke: "#456" }, + ReattachConnections: false, + RenderMode: "svg", + Scope: "jsPlumb_DefaultScope" + }; + + if (_defaults) { + jsPlumb.extend(this.Defaults, _defaults); + } + + this.logEnabled = this.Defaults.LogEnabled; + this._connectionTypes = {}; + this._endpointTypes = {}; + + _ju.EventGenerator.apply(this); + + var _currentInstance = this, + _instanceIndex = getInstanceIndex(), + _bb = _currentInstance.bind, + _initialDefaults = {}, + _zoom = 1, + _info = function (el) { + if (el == null) { + return null; + } + else if (el.nodeType === 3 || el.nodeType === 8) { + return { el:el, text:true }; + } + else { + var _el = _currentInstance.getElement(el); + return { el: _el, id: (_ju.isString(el) && _el == null) ? el : _getId(_el) }; + } + }; + + this.getInstanceIndex = function () { + return _instanceIndex; + }; + + // CONVERTED + this.setZoom = function (z, repaintEverything) { + _zoom = z; + _currentInstance.fire("zoom", _zoom); + if (repaintEverything) { + _currentInstance.repaintEverything(); + } + return true; + }; + // CONVERTED + this.getZoom = function () { + return _zoom; + }; + + for (var i in this.Defaults) { + _initialDefaults[i] = this.Defaults[i]; + } + + var _container, _containerDelegations = []; + this.unbindContainer = function() { + if (_container != null && _containerDelegations.length > 0) { + for (var i = 0; i < _containerDelegations.length; i++) { + _currentInstance.off(_container, _containerDelegations[i][0], _containerDelegations[i][1]); + } + } + }; + this.setContainer = function (c) { + + this.unbindContainer(); + + // get container as dom element. + c = this.getElement(c); + // move existing connections and endpoints, if any. + this.select().each(function (conn) { + conn.moveParent(c); + }); + this.selectEndpoints().each(function (ep) { + ep.moveParent(c); + }); + + // set container. + var previousContainer = _container; + _container = c; + _containerDelegations.length = 0; + var eventAliases = { + "endpointclick":"endpointClick", + "endpointdblclick":"endpointDblClick" + }; + + var _oneDelegateHandler = function (id, e, componentType) { + var t = e.srcElement || e.target, + jp = (t && t.parentNode ? t.parentNode._jsPlumb : null) || (t ? t._jsPlumb : null) || (t && t.parentNode && t.parentNode.parentNode ? t.parentNode.parentNode._jsPlumb : null); + if (jp) { + jp.fire(id, jp, e); + var alias = componentType ? eventAliases[componentType + id] || id : id; + // jsplumb also fires every event coming from components/overlays. That's what the test for `jp.component` is for. + _currentInstance.fire(alias, jp.component || jp, e); + } + }; + + var _addOneDelegate = function(eventId, selector, fn) { + _containerDelegations.push([eventId, fn]); + _currentInstance.on(_container, eventId, selector, fn); + }; + + // delegate one event on the container to jsplumb elements. it might be possible to + // abstract this out: each of endpoint, connection and overlay could register themselves with + // jsplumb as "component types" or whatever, and provide a suitable selector. this would be + // done by the renderer (although admittedly from 2.0 onwards we're not supporting vml anymore) + var _oneDelegate = function (id) { + // connections. + _addOneDelegate(id, ".jtk-connector", function (e) { + _oneDelegateHandler(id, e); + }); + // endpoints. note they can have an enclosing div, or not. + _addOneDelegate(id, ".jtk-endpoint", function (e) { + _oneDelegateHandler(id, e, "endpoint"); + }); + // overlays + _addOneDelegate(id, ".jtk-overlay", function (e) { + _oneDelegateHandler(id, e); + }); + }; + + for (var i = 0; i < events.length; i++) { + _oneDelegate(events[i]); + } + + // managed elements + for (var elId in managedElements) { + var el = managedElements[elId].el; + if (el.parentNode === previousContainer) { + previousContainer.removeChild(el); + _container.appendChild(el); + } + } + + }; + this.getContainer = function () { + return _container; + }; + + this.bind = function (event, fn) { + if ("ready" === event && initialized) { + fn(); + } + else { + _bb.apply(_currentInstance, [event, fn]); + } + }; + + _currentInstance.importDefaults = function (d) { + for (var i in d) { + _currentInstance.Defaults[i] = d[i]; + } + if (d.Container) { + _currentInstance.setContainer(d.Container); + } + + return _currentInstance; + }; + + _currentInstance.restoreDefaults = function () { + _currentInstance.Defaults = jsPlumb.extend({}, _initialDefaults); + return _currentInstance; + }; + + var log = null, + initialized = false, + // TODO remove from window scope + connections = [], + // map of element id -> endpoint lists. an element can have an arbitrary + // number of endpoints on it, and not all of them have to be connected + // to anything. + endpointsByElement = {}, + endpointsByUUID = {}, + managedElements = {}, + offsets = {}, + offsetTimestamps = {}, + draggableStates = {}, + connectionBeingDragged = false, + sizes = [], + _suspendDrawing = false, + _suspendedAt = null, + DEFAULT_SCOPE = this.Defaults.Scope, + _curIdStamp = 1, + _idstamp = function () { + return "" + _curIdStamp++; + }, + + // + // appends an element to some other element, which is calculated as follows: + // + // 1. if Container exists, use that element. + // 2. if the 'parent' parameter exists, use that. + // 3. otherwise just use the root element. + // + // + _appendElement = function (el, parent) { + if (_container) { + _container.appendChild(el); + } + else if (!parent) { + this.appendToRoot(el); + } + else { + this.getElement(parent).appendChild(el); + } + }.bind(this), + + // + // Draws an endpoint and its connections. this is the main entry point into drawing connections as well + // as endpoints, since jsPlumb is endpoint-centric under the hood. + // + // @param element element to draw (of type library specific element object) + // @param ui UI object from current library's event system. optional. + // @param timestamp timestamp for this paint cycle. used to speed things up a little by cutting down the amount of offset calculations we do. + // @param clearEdits defaults to false; indicates that mouse edits for connectors should be cleared + /// + _draw = function (element, ui, timestamp, clearEdits) { + + if (!_suspendDrawing) { + + element = _currentInstance.getElement(element); + + if (element != null) { + + var id = _getId(element), + repaintEls = element.querySelectorAll(".jtk-managed"); + + if (timestamp == null) { + timestamp = _timestamp(); + } + + // update the offset of everything _before_ we try to draw anything. + var o = _updateOffset({elId: id, offset: ui, recalc: false, timestamp: timestamp}); + + for (var i = 0; i < repaintEls.length; i++) { + _updateOffset({ + elId: repaintEls[i].getAttribute("id"), + // offset: { + // left: o.o.left + repaintEls[i].offset.left, + // top: o.o.top + repaintEls[i].offset.top + // }, + recalc: true, + timestamp: timestamp + }); + } + + _currentInstance.anchorManager.redraw(id, ui, timestamp, null, clearEdits); + + if (repaintEls) { + for (var j = 0; j < repaintEls.length; j++) { + _currentInstance.anchorManager.redraw(repaintEls[j].getAttribute("id"), null, timestamp, null, clearEdits, true); + } + } + } + } + }, + + // + // gets an Endpoint by uuid. + // + _getEndpoint = function (uuid) { + return endpointsByUUID[uuid]; + }, + + /** + * inits a draggable if it's not already initialised. + * TODO: somehow abstract this to the adapter, because the concept of "draggable" has no + * place on the server. + */ + + + _scopeMatch = function (e1, e2) { + var s1 = e1.scope.split(/\s/), s2 = e2.scope.split(/\s/); + for (var i = 0; i < s1.length; i++) { + for (var j = 0; j < s2.length; j++) { + if (s2[j] === s1[i]) { + return true; + } + } + } + + return false; + }, + + _mergeOverrides = function (def, values) { + var m = jsPlumb.extend({}, def); + for (var i in values) { + if (values[i]) { + m[i] = values[i]; + } + } + return m; + }, + + /* + * prepares a final params object that can be passed to _newConnection, taking into account defaults, events, etc. + */ + _prepareConnectionParams = function (params, referenceParams) { + var _p = jsPlumb.extend({ }, params); + if (referenceParams) { + jsPlumb.extend(_p, referenceParams); + } + + // hotwire endpoints passed as source or target to sourceEndpoint/targetEndpoint, respectively. + if (_p.source) { + if (_p.source.endpoint) { + _p.sourceEndpoint = _p.source; + } + else { + _p.source = _currentInstance.getElement(_p.source); + } + } + if (_p.target) { + if (_p.target.endpoint) { + _p.targetEndpoint = _p.target; + } + else { + _p.target = _currentInstance.getElement(_p.target); + } + } + + // test for endpoint uuids to connect + if (params.uuids) { + _p.sourceEndpoint = _getEndpoint(params.uuids[0]); + _p.targetEndpoint = _getEndpoint(params.uuids[1]); + } + + // now ensure that if we do have Endpoints already, they're not full. + // source: + if (_p.sourceEndpoint && _p.sourceEndpoint.isFull()) { + _ju.log(_currentInstance, "could not add connection; source endpoint is full"); + return; + } + + // target: + if (_p.targetEndpoint && _p.targetEndpoint.isFull()) { + _ju.log(_currentInstance, "could not add connection; target endpoint is full"); + return; + } + + // if source endpoint mandates connection type and nothing specified in our params, use it. + if (!_p.type && _p.sourceEndpoint) { + _p.type = _p.sourceEndpoint.connectionType; + } + + // copy in any connectorOverlays that were specified on the source endpoint. + // it doesnt copy target endpoint overlays. i'm not sure if we want it to or not. + if (_p.sourceEndpoint && _p.sourceEndpoint.connectorOverlays) { + _p.overlays = _p.overlays || []; + for (var i = 0, j = _p.sourceEndpoint.connectorOverlays.length; i < j; i++) { + _p.overlays.push(_p.sourceEndpoint.connectorOverlays[i]); + } + } + + // scope + if (_p.sourceEndpoint && _p.sourceEndpoint.scope) { + _p.scope = _p.sourceEndpoint.scope; + } + + // pointer events + if (!_p["pointer-events"] && _p.sourceEndpoint && _p.sourceEndpoint.connectorPointerEvents) { + _p["pointer-events"] = _p.sourceEndpoint.connectorPointerEvents; + } + + + var _addEndpoint = function (el, def, idx) { + var params = _mergeOverrides(def, { + anchor: _p.anchors ? _p.anchors[idx] : _p.anchor, + endpoint: _p.endpoints ? _p.endpoints[idx] : _p.endpoint, + paintStyle: _p.endpointStyles ? _p.endpointStyles[idx] : _p.endpointStyle, + hoverPaintStyle: _p.endpointHoverStyles ? _p.endpointHoverStyles[idx] : _p.endpointHoverStyle + }); + return _currentInstance.addEndpoint(el, params); + }; + + // check for makeSource/makeTarget specs. + + var _oneElementDef = function (type, idx, defs, matchType) { + if (_p[type] && !_p[type].endpoint && !_p[type + "Endpoint"] && !_p.newConnection) { + var tid = _getId(_p[type]), tep = defs[tid]; + + tep = tep ? tep[matchType] : null; + + if (tep) { + // if not enabled, return. + if (!tep.enabled) { + return false; + } + + var epDef = jsPlumb.extend({}, tep.def); + delete epDef.label; + + var newEndpoint = tep.endpoint != null && tep.endpoint._jsPlumb ? tep.endpoint : _addEndpoint(_p[type], epDef, idx); + if (newEndpoint.isFull()) { + return false; + } + _p[type + "Endpoint"] = newEndpoint; + if (!_p.scope && epDef.scope) { + _p.scope = epDef.scope; + } // provide scope if not already provided and endpoint def has one. + if (tep.uniqueEndpoint) { + if (!tep.endpoint) { + tep.endpoint = newEndpoint; + newEndpoint.setDeleteOnEmpty(false); + } + else { + newEndpoint.finalEndpoint = tep.endpoint; + } + } else { + newEndpoint.setDeleteOnEmpty(true); + } + + // + // copy in connector overlays if present on the source definition. + // + if (idx === 0 && tep.def.connectorOverlays) { + _p.overlays = _p.overlays || []; + Array.prototype.push.apply(_p.overlays, tep.def.connectorOverlays); + } + } + } + }; + + if (_oneElementDef("source", 0, this.sourceEndpointDefinitions, _p.type || "default") === false) { + return; + } + if (_oneElementDef("target", 1, this.targetEndpointDefinitions, _p.type || "default") === false) { + return; + } + + // last, ensure scopes match + if (_p.sourceEndpoint && _p.targetEndpoint) { + if (!_scopeMatch(_p.sourceEndpoint, _p.targetEndpoint)) { + _p = null; + } + } + + return _p; + }.bind(_currentInstance), + + _newConnection = function (params) { + var connectionFunc = _currentInstance.Defaults.ConnectionType || _currentInstance.getDefaultConnectionType(); + + params._jsPlumb = _currentInstance; + params.newConnection = _newConnection; + params.newEndpoint = _newEndpoint; + params.endpointsByUUID = endpointsByUUID; + params.endpointsByElement = endpointsByElement; + params.finaliseConnection = _finaliseConnection; + params.id = "con_" + _idstamp(); + var con = new connectionFunc(params); + + // if the connection is draggable, then maybe we need to tell the target endpoint to init the + // dragging code. it won't run again if it already configured to be draggable. + if (con.isDetachable()) { + con.endpoints[0].initDraggable("_jsPlumbSource"); + con.endpoints[1].initDraggable("_jsPlumbTarget"); + } + + return con; + }, + + // + // adds the connection to the backing model, fires an event if necessary and then redraws + // + _finaliseConnection = _currentInstance.finaliseConnection = function (jpc, params, originalEvent, doInformAnchorManager) { + params = params || {}; + // add to list of connections (by scope). + if (!jpc.suspendedEndpoint) { + connections.push(jpc); + } + + jpc.pending = null; + + // turn off isTemporarySource on the source endpoint (only viable on first draw) + jpc.endpoints[0].isTemporarySource = false; + + // always inform the anchor manager + // except that if jpc has a suspended endpoint it's not true to say the + // connection is new; it has just (possibly) moved. the question is whether + // to make that call here or in the anchor manager. i think perhaps here. + if (doInformAnchorManager !== false) { + _currentInstance.anchorManager.newConnection(jpc); + } + + // force a paint + _draw(jpc.source); + + // fire an event + if (!params.doNotFireConnectionEvent && params.fireEvent !== false) { + + var eventArgs = { + connection: jpc, + source: jpc.source, target: jpc.target, + sourceId: jpc.sourceId, targetId: jpc.targetId, + sourceEndpoint: jpc.endpoints[0], targetEndpoint: jpc.endpoints[1] + }; + + _currentInstance.fire("connection", eventArgs, originalEvent); + } + }, + + /* + factory method to prepare a new endpoint. this should always be used instead of creating Endpoints + manually, since this method attaches event listeners and an id. + */ + _newEndpoint = function (params, id) { + var endpointFunc = _currentInstance.Defaults.EndpointType || jsPlumb.Endpoint; + var _p = jsPlumb.extend({}, params); + //delete _p.label; // not supported by endpoint. + _p._jsPlumb = _currentInstance; + _p.newConnection = _newConnection; + _p.newEndpoint = _newEndpoint; + _p.endpointsByUUID = endpointsByUUID; + _p.endpointsByElement = endpointsByElement; + _p.fireDetachEvent = fireDetachEvent; + _p.elementId = id || _getId(_p.source); + var ep = new endpointFunc(_p); + ep.id = "ep_" + _idstamp(); + _manage(_p.elementId, _p.source); + + if (!jsPlumb.headless) { + _currentInstance.getDragManager().endpointAdded(_p.source, id); + } + + return ep; + }, + + /* + * performs the given function operation on all the connections found + * for the given element id; this means we find all the endpoints for + * the given element, and then for each endpoint find the connectors + * connected to it. then we pass each connection in to the given + * function. + */ + _operation = function (elId, func, endpointFunc) { + var endpoints = endpointsByElement[elId]; + if (endpoints && endpoints.length) { + for (var i = 0, ii = endpoints.length; i < ii; i++) { + for (var j = 0, jj = endpoints[i].connections.length; j < jj; j++) { + var retVal = func(endpoints[i].connections[j]); + // if the function passed in returns true, we exit. + // most functions return false. + if (retVal) { + return; + } + } + if (endpointFunc) { + endpointFunc(endpoints[i]); + } + } + } + }, + + _setDraggable = function (element, draggable) { + return jsPlumb.each(element, function (el) { + if (_currentInstance.isDragSupported(el)) { + draggableStates[_currentInstance.getAttribute(el, "id")] = draggable; + _currentInstance.setElementDraggable(el, draggable); + } + }); + }, + /* + * private method to do the business of hiding/showing. + * + * @param el + * either Id of the element in question or a library specific + * object for the element. + * @param state + * String specifying a value for the css 'display' property + * ('block' or 'none'). + */ + _setVisible = function (el, state, alsoChangeEndpoints) { + state = state === "block"; + var endpointFunc = null; + if (alsoChangeEndpoints) { + endpointFunc = function (ep) { + ep.setVisible(state, true, true); + }; + } + var info = _info(el); + _operation(info.id, function (jpc) { + if (state && alsoChangeEndpoints) { + // this test is necessary because this functionality is new, and i wanted to maintain backwards compatibility. + // this block will only set a connection to be visible if the other endpoint in the connection is also visible. + var oidx = jpc.sourceId === info.id ? 1 : 0; + if (jpc.endpoints[oidx].isVisible()) { + jpc.setVisible(true); + } + } + else { // the default behaviour for show, and what always happens for hide, is to just set the visibility without getting clever. + jpc.setVisible(state); + } + }, endpointFunc); + }, + /** + * private method to do the business of toggling hiding/showing. + */ + _toggleVisible = function (elId, changeEndpoints) { + var endpointFunc = null; + if (changeEndpoints) { + endpointFunc = function (ep) { + var state = ep.isVisible(); + ep.setVisible(!state); + }; + } + _operation(elId, function (jpc) { + var state = jpc.isVisible(); + jpc.setVisible(!state); + }, endpointFunc); + }, + + // TODO comparison performance + _getCachedData = function (elId) { + var o = offsets[elId]; + if (!o) { + return _updateOffset({elId: elId}); + } + else { + return {o: o, s: sizes[elId]}; + } + }, + + /** + * gets an id for the given element, creating and setting one if + * necessary. the id is of the form + * + * jsPlumb__ + * + * where "index in instance" is a monotonically increasing integer that starts at 0, + * for each instance. this method is used not only to assign ids to elements that do not + * have them but also to connections and endpoints. + */ + _getId = function (element, uuid, doNotCreateIfNotFound) { + if (_ju.isString(element)) { + return element; + } + if (element == null) { + return null; + } + var id = _currentInstance.getAttribute(element, "id"); + if (!id || id === "undefined") { + // check if fixed uuid parameter is given + if (arguments.length === 2 && arguments[1] !== undefined) { + id = uuid; + } + else if (arguments.length === 1 || (arguments.length === 3 && !arguments[2])) { + id = "jsPlumb_" + _instanceIndex + "_" + _idstamp(); + } + + if (!doNotCreateIfNotFound) { + _currentInstance.setAttribute(element, "id", id); + } + } + return id; + }; + + this.setConnectionBeingDragged = function (v) { + connectionBeingDragged = v; + }; + this.isConnectionBeingDragged = function () { + return connectionBeingDragged; + }; + + /** + * Returns a map of all the elements this jsPlumbInstance is currently managing. + * @returns {Object} Map of [id-> {el, endpoint[], connection, position}] information. + */ + this.getManagedElements = function() { + return managedElements; + }; + + this.connectorClass = "jtk-connector"; + this.connectorOutlineClass = "jtk-connector-outline"; + this.connectedClass = "jtk-connected"; + this.hoverClass = "jtk-hover"; + this.endpointClass = "jtk-endpoint"; + this.endpointConnectedClass = "jtk-endpoint-connected"; + this.endpointFullClass = "jtk-endpoint-full"; + this.endpointDropAllowedClass = "jtk-endpoint-drop-allowed"; + this.endpointDropForbiddenClass = "jtk-endpoint-drop-forbidden"; + this.overlayClass = "jtk-overlay"; + this.draggingClass = "jtk-dragging";// CONVERTED + this.elementDraggingClass = "jtk-element-dragging";// CONVERTED + this.sourceElementDraggingClass = "jtk-source-element-dragging"; // CONVERTED + this.targetElementDraggingClass = "jtk-target-element-dragging";// CONVERTED + this.endpointAnchorClassPrefix = "jtk-endpoint-anchor"; + this.hoverSourceClass = "jtk-source-hover"; + this.hoverTargetClass = "jtk-target-hover"; + this.dragSelectClass = "jtk-drag-select"; + + this.Anchors = {}; + this.Connectors = { "svg": {} }; + this.Endpoints = { "svg": {} }; + this.Overlays = { "svg": {} } ; + this.ConnectorRenderers = {}; + this.SVG = "svg"; + +// --------------------------- jsPlumbInstance public API --------------------------------------------------------- + + + this.addEndpoint = function (el, params, referenceParams) { + referenceParams = referenceParams || {}; + var p = jsPlumb.extend({}, referenceParams); + jsPlumb.extend(p, params); + p.endpoint = p.endpoint || _currentInstance.Defaults.Endpoint; + p.paintStyle = p.paintStyle || _currentInstance.Defaults.EndpointStyle; + + var results = [], + inputs = (_ju.isArray(el) || (el.length != null && !_ju.isString(el))) ? el : [ el ]; + + for (var i = 0, j = inputs.length; i < j; i++) { + p.source = _currentInstance.getElement(inputs[i]); + _ensureContainer(p.source); + + var id = _getId(p.source), e = _newEndpoint(p, id); + + // ensure element is managed. force a recalc if drawing not suspended, to ensure the cached value is fresh + var myOffset = _manage(id, p.source, null, !_suspendDrawing).info.o; + _ju.addToList(endpointsByElement, id, e); + + if (!_suspendDrawing) { + e.paint({ + anchorLoc: e.anchor.compute({ xy: [ myOffset.left, myOffset.top ], wh: sizes[id], element: e, timestamp: _suspendedAt }), + timestamp: _suspendedAt + }); + } + + results.push(e); + } + + return results.length === 1 ? results[0] : results; + }; + + this.addEndpoints = function (el, endpoints, referenceParams) { + var results = []; + for (var i = 0, j = endpoints.length; i < j; i++) { + var e = _currentInstance.addEndpoint(el, endpoints[i], referenceParams); + if (_ju.isArray(e)) { + Array.prototype.push.apply(results, e); + } + else { + results.push(e); + } + } + return results; + }; + + this.animate = function (el, properties, options) { + if (!this.animationSupported) { + return false; + } + + options = options || {}; + var del = _currentInstance.getElement(el), + id = _getId(del), + stepFunction = jsPlumb.animEvents.step, + completeFunction = jsPlumb.animEvents.complete; + + options[stepFunction] = _ju.wrap(options[stepFunction], function () { + _currentInstance.revalidate(id); + }); + + // onComplete repaints, just to make sure everything looks good at the end of the animation. + options[completeFunction] = _ju.wrap(options[completeFunction], function () { + _currentInstance.revalidate(id); + }); + + _currentInstance.doAnimate(del, properties, options); + }; + + /** + * checks for a listener for the given condition, executing it if found, passing in the given value. + * condition listeners would have been attached using "bind" (which is, you could argue, now overloaded, since + * firing click events etc is a bit different to what this does). i thought about adding a "bindCondition" + * or something, but decided against it, for the sake of simplicity. jsPlumb will never fire one of these + * condition events anyway. + */ + this.checkCondition = function (conditionName, args) { + var l = _currentInstance.getListener(conditionName), + r = true; + + if (l && l.length > 0) { + var values = Array.prototype.slice.call(arguments, 1); + try { + for (var i = 0, j = l.length; i < j; i++) { + r = r && l[i].apply(l[i], values); + } + } + catch (e) { + _ju.log(_currentInstance, "cannot check condition [" + conditionName + "]" + e); + } + } + return r; + }; + + this.connect = function (params, referenceParams) { + // prepare a final set of parameters to create connection with + var _p = _prepareConnectionParams(params, referenceParams), jpc; + // TODO probably a nicer return value if the connection was not made. _prepareConnectionParams + // will return null (and log something) if either endpoint was full. what would be nicer is to + // create a dedicated 'error' object. + if (_p) { + if (_p.source == null && _p.sourceEndpoint == null) { + _ju.log("Cannot establish connection - source does not exist"); + return; + } + if (_p.target == null && _p.targetEndpoint == null) { + _ju.log("Cannot establish connection - target does not exist"); + return; + } + _ensureContainer(_p.source); + // create the connection. it is not yet registered + jpc = _newConnection(_p); + // now add it the model, fire an event, and redraw + _finaliseConnection(jpc, _p); + } + return jpc; + }; + + var stTypes = [ + { el: "source", elId: "sourceId", epDefs: "sourceEndpointDefinitions" }, + { el: "target", elId: "targetId", epDefs: "targetEndpointDefinitions" } + ]; + + var _set = function (c, el, idx, doNotRepaint) { + var ep, _st = stTypes[idx], cId = c[_st.elId], cEl = c[_st.el], sid, sep, + oldEndpoint = c.endpoints[idx]; + + var evtParams = { + index: idx, + originalSourceId: idx === 0 ? cId : c.sourceId, + newSourceId: c.sourceId, + originalTargetId: idx === 1 ? cId : c.targetId, + newTargetId: c.targetId, + connection: c + }; + + if (el.constructor === jsPlumb.Endpoint) { + ep = el; + ep.addConnection(c); + el = ep.element; + } + else { + sid = _getId(el); + sep = this[_st.epDefs][sid]; + + if (sid === c[_st.elId]) { + ep = null; // dont change source/target if the element is already the one given. + } + else if (sep) { + for (var t in sep) { + if (!sep[t].enabled) { + return; + } + ep = sep[t].endpoint != null && sep[t].endpoint._jsPlumb ? sep[t].endpoint : this.addEndpoint(el, sep[t].def); + if (sep[t].uniqueEndpoint) { + sep[t].endpoint = ep; + } + ep.addConnection(c); + } + } + else { + ep = c.makeEndpoint(idx === 0, el, sid); + } + } + + if (ep != null) { + oldEndpoint.detachFromConnection(c); + c.endpoints[idx] = ep; + c[_st.el] = ep.element; + c[_st.elId] = ep.elementId; + evtParams[idx === 0 ? "newSourceId" : "newTargetId"] = ep.elementId; + + fireMoveEvent(evtParams); + + if (!doNotRepaint) { + c.repaint(); + } + } + + evtParams.element = el; + return evtParams; + + }.bind(this); + + this.setSource = function (connection, el, doNotRepaint) { + var p = _set(connection, el, 0, doNotRepaint); + this.anchorManager.sourceChanged(p.originalSourceId, p.newSourceId, connection, p.el); + }; + this.setTarget = function (connection, el, doNotRepaint) { + var p = _set(connection, el, 1, doNotRepaint); + this.anchorManager.updateOtherEndpoint(p.originalSourceId, p.originalTargetId, p.newTargetId, connection); + }; + + this.deleteEndpoint = function (object, dontUpdateHover, deleteAttachedObjects) { + var endpoint = (typeof object === "string") ? endpointsByUUID[object] : object; + if (endpoint) { + _currentInstance.deleteObject({ endpoint: endpoint, dontUpdateHover: dontUpdateHover, deleteAttachedObjects:deleteAttachedObjects }); + } + return _currentInstance; + }; + + this.deleteEveryEndpoint = function () { + var _is = _currentInstance.setSuspendDrawing(true); + for (var id in endpointsByElement) { + var endpoints = endpointsByElement[id]; + if (endpoints && endpoints.length) { + for (var i = 0, j = endpoints.length; i < j; i++) { + _currentInstance.deleteEndpoint(endpoints[i], true); + } + } + } + endpointsByElement = {}; + managedElements = {}; + endpointsByUUID = {}; + offsets = {}; + offsetTimestamps = {}; + _currentInstance.anchorManager.reset(); + var dm = _currentInstance.getDragManager(); + if (dm) { + dm.reset(); + } + if (!_is) { + _currentInstance.setSuspendDrawing(false); + } + return _currentInstance; + }; + + var fireDetachEvent = function (jpc, doFireEvent, originalEvent) { + // may have been given a connection, or in special cases, an object + var connType = _currentInstance.Defaults.ConnectionType || _currentInstance.getDefaultConnectionType(), + argIsConnection = jpc.constructor === connType, + params = argIsConnection ? { + connection: jpc, + source: jpc.source, target: jpc.target, + sourceId: jpc.sourceId, targetId: jpc.targetId, + sourceEndpoint: jpc.endpoints[0], targetEndpoint: jpc.endpoints[1] + } : jpc; + + if (doFireEvent) { + _currentInstance.fire("connectionDetached", params, originalEvent); + } + + // always fire this. used by internal jsplumb stuff. + _currentInstance.fire("internal.connectionDetached", params, originalEvent); + + _currentInstance.anchorManager.connectionDetached(params); + }; + + var fireMoveEvent = _currentInstance.fireMoveEvent = function (params, evt) { + _currentInstance.fire("connectionMoved", params, evt); + }; + + this.unregisterEndpoint = function (endpoint) { + if (endpoint._jsPlumb.uuid) { + endpointsByUUID[endpoint._jsPlumb.uuid] = null; + } + _currentInstance.anchorManager.deleteEndpoint(endpoint); + // TODO at least replace this with a removeWithFunction call. + for (var e in endpointsByElement) { + var endpoints = endpointsByElement[e]; + if (endpoints) { + var newEndpoints = []; + for (var i = 0, j = endpoints.length; i < j; i++) { + if (endpoints[i] !== endpoint) { + newEndpoints.push(endpoints[i]); + } + } + + endpointsByElement[e] = newEndpoints; + } + if (endpointsByElement[e].length < 1) { + delete endpointsByElement[e]; + } + } + }; + + var IS_DETACH_ALLOWED = "isDetachAllowed"; + var BEFORE_DETACH = "beforeDetach"; + var CHECK_CONDITION = "checkCondition"; + + /** + * Deletes a Connection. + * @method deleteConnection + * @param connection Connection to delete + * @param {Object} [params] Optional delete parameters + * @param {Boolean} [params.doNotFireEvent=false] If true, a connection detached event will not be fired. Otherwise one will. + * @param {Boolean} [params.force=false] If true, the connection will be deleted even if a beforeDetach interceptor tries to stop the deletion. + * @returns {Boolean} True if the connection was deleted, false otherwise. + */ + this.deleteConnection = function(connection, params) { + + if (connection != null) { + params = params || {}; + + if (params.force || _ju.functionChain(true, false, [ + [ connection.endpoints[0], IS_DETACH_ALLOWED, [ connection ] ], + [ connection.endpoints[1], IS_DETACH_ALLOWED, [ connection ] ], + [ connection, IS_DETACH_ALLOWED, [ connection ] ], + [ _currentInstance, CHECK_CONDITION, [ BEFORE_DETACH, connection ] ] + ])) { + + connection.setHover(false); + fireDetachEvent(connection, !connection.pending && params.fireEvent !== false, params.originalEvent); + + connection.endpoints[0].detachFromConnection(connection); + connection.endpoints[1].detachFromConnection(connection); + _ju.removeWithFunction(connections, function (_c) { + return connection.id === _c.id; + }); + + connection.cleanup(); + connection.destroy(); + return true; + } + } + return false; + }; + + /** + * Remove all Connections from all elements, but leaves Endpoints in place ((unless a connection is set to auto delete its Endpoints). + * @method deleteEveryConnection + * @param {Object} [params] optional params object for the call + * @param {Boolean} [params.fireEvent=true] Whether or not to fire detach events + * @param {Boolean} [params.forceDetach=false] If true, this call will ignore any `beforeDetach` interceptors. + * @returns {Number} The number of connections that were deleted. + */ + this.deleteEveryConnection = function (params) { + params = params || {}; + var count = connections.length, deletedCount = 0; + _currentInstance.batch(function () { + for (var i = 0; i < count; i++) { + deletedCount += _currentInstance.deleteConnection(connections[0], params) ? 1 : 0; + } + }); + return deletedCount; + }; + + /** + * Removes all an element's Connections. + * @method deleteConnectionsForElement + * @param {Object} el Either the id of the element, or a selector for the element. + * @param {Object} [params] Optional parameters. + * @param {Boolean} [params.fireEvent=true] Whether or not to fire the detach event. + * @param {Boolean} [params.forceDetach=false] If true, this call will ignore any `beforeDetach` interceptors. + * @return {jsPlumbInstance} The current jsPlumb instance. + */ + this.deleteConnectionsForElement = function (el, params) { + params = params || {}; + el = _currentInstance.getElement(el); + var id = _getId(el), endpoints = endpointsByElement[id]; + if (endpoints && endpoints.length) { + for (var i = 0, j = endpoints.length; i < j; i++) { + endpoints[i].deleteEveryConnection(params); + } + } + return _currentInstance; + }; + + /// not public. but of course its exposed. how to change this. + this.deleteObject = function (params) { + var result = { + endpoints: {}, + connections: {}, + endpointCount: 0, + connectionCount: 0 + }, + deleteAttachedObjects = params.deleteAttachedObjects !== false; + + var unravelConnection = function (connection) { + if (connection != null && result.connections[connection.id] == null) { + if (!params.dontUpdateHover && connection._jsPlumb != null) { + connection.setHover(false); + } + result.connections[connection.id] = connection; + result.connectionCount++; + } + }; + var unravelEndpoint = function (endpoint) { + if (endpoint != null && result.endpoints[endpoint.id] == null) { + if (!params.dontUpdateHover && endpoint._jsPlumb != null) { + endpoint.setHover(false); + } + result.endpoints[endpoint.id] = endpoint; + result.endpointCount++; + + if (deleteAttachedObjects) { + for (var i = 0; i < endpoint.connections.length; i++) { + var c = endpoint.connections[i]; + unravelConnection(c); + } + } + } + }; + + if (params.connection) { + unravelConnection(params.connection); + } + else { + unravelEndpoint(params.endpoint); + } + + // loop through connections + for (var i in result.connections) { + var c = result.connections[i]; + if (c._jsPlumb) { + _ju.removeWithFunction(connections, function (_c) { + return c.id === _c.id; + }); + + fireDetachEvent(c, params.fireEvent === false ? false : !c.pending, params.originalEvent); + var doNotCleanup = params.deleteAttachedObjects == null ? null : !params.deleteAttachedObjects; + + c.endpoints[0].detachFromConnection(c, null, doNotCleanup); + c.endpoints[1].detachFromConnection(c, null, doNotCleanup); + + c.cleanup(true); + c.destroy(true); + } + } + + // loop through endpoints + for (var j in result.endpoints) { + var e = result.endpoints[j]; + if (e._jsPlumb) { + _currentInstance.unregisterEndpoint(e); + // FIRE some endpoint deleted event? + e.cleanup(true); + e.destroy(true); + } + } + + return result; + }; + + + // helpers for select/selectEndpoints + var _setOperation = function (list, func, args, selector) { + for (var i = 0, j = list.length; i < j; i++) { + list[i][func].apply(list[i], args); + } + return selector(list); + }, + _getOperation = function (list, func, args) { + var out = []; + for (var i = 0, j = list.length; i < j; i++) { + out.push([ list[i][func].apply(list[i], args), list[i] ]); + } + return out; + }, + setter = function (list, func, selector) { + return function () { + return _setOperation(list, func, arguments, selector); + }; + }, + getter = function (list, func) { + return function () { + return _getOperation(list, func, arguments); + }; + }, + prepareList = function (input, doNotGetIds) { + var r = []; + if (input) { + if (typeof input === 'string') { + if (input === "*") { + return input; + } + r.push(input); + } + else { + if (doNotGetIds) { + r = input; + } + else { + if (input.length) { + for (var i = 0, j = input.length; i < j; i++) { + r.push(_info(input[i]).id); + } + } + else { + r.push(_info(input).id); + } + } + } + } + return r; + }, + filterList = function (list, value, missingIsFalse) { + if (list === "*") { + return true; + } + return list.length > 0 ? list.indexOf(value) !== -1 : !missingIsFalse; + }; + + // get some connections, specifying source/target/scope + this.getConnections = function (options, flat) { + if (!options) { + options = {}; + } else if (options.constructor === String) { + options = { "scope": options }; + } + var scope = options.scope || _currentInstance.getDefaultScope(), + scopes = prepareList(scope, true), + sources = prepareList(options.source), + targets = prepareList(options.target), + results = (!flat && scopes.length > 1) ? {} : [], + _addOne = function (scope, obj) { + if (!flat && scopes.length > 1) { + var ss = results[scope]; + if (ss == null) { + ss = results[scope] = []; + } + ss.push(obj); + } else { + results.push(obj); + } + }; + + for (var j = 0, jj = connections.length; j < jj; j++) { + var c = connections[j], + sourceId = c.proxies && c.proxies[0] ? c.proxies[0].originalEp.elementId : c.sourceId, + targetId = c.proxies && c.proxies[1] ? c.proxies[1].originalEp.elementId : c.targetId; + + if (filterList(scopes, c.scope) && filterList(sources, sourceId) && filterList(targets, targetId)) { + _addOne(c.scope, c); + } + } + + return results; + }; + + var _curryEach = function (list, executor) { + return function (f) { + for (var i = 0, ii = list.length; i < ii; i++) { + f(list[i]); + } + return executor(list); + }; + }, + _curryGet = function (list) { + return function (idx) { + return list[idx]; + }; + }; + + var _makeCommonSelectHandler = function (list, executor) { + var out = { + length: list.length, + each: _curryEach(list, executor), + get: _curryGet(list) + }, + setters = ["setHover", "removeAllOverlays", "setLabel", "addClass", "addOverlay", "removeOverlay", + "removeOverlays", "showOverlay", "hideOverlay", "showOverlays", "hideOverlays", "setPaintStyle", + "setHoverPaintStyle", "setSuspendEvents", "setParameter", "setParameters", "setVisible", + "repaint", "addType", "toggleType", "removeType", "removeClass", "setType", "bind", "unbind" ], + + getters = ["getLabel", "getOverlay", "isHover", "getParameter", "getParameters", "getPaintStyle", + "getHoverPaintStyle", "isVisible", "hasType", "getType", "isSuspendEvents" ], + i, ii; + + for (i = 0, ii = setters.length; i < ii; i++) { + out[setters[i]] = setter(list, setters[i], executor); + } + + for (i = 0, ii = getters.length; i < ii; i++) { + out[getters[i]] = getter(list, getters[i]); + } + + return out; + }; + + var _makeConnectionSelectHandler = function (list) { + var common = _makeCommonSelectHandler(list, _makeConnectionSelectHandler); + return jsPlumb.extend(common, { + // setters + setDetachable: setter(list, "setDetachable", _makeConnectionSelectHandler), + setReattach: setter(list, "setReattach", _makeConnectionSelectHandler), + setConnector: setter(list, "setConnector", _makeConnectionSelectHandler), + delete: function () { + for (var i = 0, ii = list.length; i < ii; i++) { + _currentInstance.deleteConnection(list[i]); + } + }, + // getters + isDetachable: getter(list, "isDetachable"), + isReattach: getter(list, "isReattach") + }); + }; + + var _makeEndpointSelectHandler = function (list) { + var common = _makeCommonSelectHandler(list, _makeEndpointSelectHandler); + return jsPlumb.extend(common, { + setEnabled: setter(list, "setEnabled", _makeEndpointSelectHandler), + setAnchor: setter(list, "setAnchor", _makeEndpointSelectHandler), + isEnabled: getter(list, "isEnabled"), + deleteEveryConnection: function () { + for (var i = 0, ii = list.length; i < ii; i++) { + list[i].deleteEveryConnection(); + } + }, + "delete": function () { + for (var i = 0, ii = list.length; i < ii; i++) { + _currentInstance.deleteEndpoint(list[i]); + } + } + }); + }; + + this.select = function (params) { + params = params || {}; + params.scope = params.scope || "*"; + return _makeConnectionSelectHandler(params.connections || _currentInstance.getConnections(params, true)); + }; + + this.selectEndpoints = function (params) { + params = params || {}; + params.scope = params.scope || "*"; + var noElementFilters = !params.element && !params.source && !params.target, + elements = noElementFilters ? "*" : prepareList(params.element), + sources = noElementFilters ? "*" : prepareList(params.source), + targets = noElementFilters ? "*" : prepareList(params.target), + scopes = prepareList(params.scope, true); + + var ep = []; + + for (var el in endpointsByElement) { + var either = filterList(elements, el, true), + source = filterList(sources, el, true), + sourceMatchExact = sources !== "*", + target = filterList(targets, el, true), + targetMatchExact = targets !== "*"; + + // if they requested 'either' then just match scope. otherwise if they requested 'source' (not as a wildcard) then we have to match only endpoints that have isSource set to to true, and the same thing with isTarget. + if (either || source || target) { + inner: + for (var i = 0, ii = endpointsByElement[el].length; i < ii; i++) { + var _ep = endpointsByElement[el][i]; + if (filterList(scopes, _ep.scope, true)) { + + var noMatchSource = (sourceMatchExact && sources.length > 0 && !_ep.isSource), + noMatchTarget = (targetMatchExact && targets.length > 0 && !_ep.isTarget); + + if (noMatchSource || noMatchTarget) { + continue inner; + } + + ep.push(_ep); + } + } + } + } + + return _makeEndpointSelectHandler(ep); + }; + + // get all connections managed by the instance of jsplumb. + this.getAllConnections = function () { + return connections; + }; + this.getDefaultScope = function () { + return DEFAULT_SCOPE; + }; + // get an endpoint by uuid. + this.getEndpoint = _getEndpoint; + /** + * Gets the list of Endpoints for a given element. + * @method getEndpoints + * @param {String|Element|Selector} el The element to get endpoints for. + * @return {Endpoint[]} An array of Endpoints for the specified element. + */ + this.getEndpoints = function (el) { + return endpointsByElement[_info(el).id] || []; + }; + // gets the default endpoint type. used when subclassing. see wiki. + this.getDefaultEndpointType = function () { + return jsPlumb.Endpoint; + }; + // gets the default connection type. used when subclassing. see wiki. + this.getDefaultConnectionType = function () { + return jsPlumb.Connection; + }; + /* + * Gets an element's id, creating one if necessary. really only exposed + * for the lib-specific functionality to access; would be better to pass + * the current instance into the lib-specific code (even though this is + * a static call. i just don't want to expose it to the public API). + */ + this.getId = _getId; + this.draw = _draw; + this.info = _info; + + this.appendElement = _appendElement; + + var _hoverSuspended = false; + this.isHoverSuspended = function () { + return _hoverSuspended; + }; + this.setHoverSuspended = function (s) { + _hoverSuspended = s; + }; + + // set an element's connections to be hidden + this.hide = function (el, changeEndpoints) { + _setVisible(el, "none", changeEndpoints); + return _currentInstance; + }; + + // exposed for other objects to use to get a unique id. + this.idstamp = _idstamp; + + // ensure that, if the current container exists, it is a DOM element and not a selector. + // if it does not exist and `candidate` is supplied, the offset parent of that element will be set as the Container. + // this is used to do a better default behaviour for the case that the user has not set a container: + // addEndpoint, makeSource, makeTarget and connect all call this method with the offsetParent of the + // element in question (for connect it is the source element). So if no container is set, it is inferred + // to be the offsetParent of the first element the user tries to connect. + var _ensureContainer = function (candidate) { + if (!_container && candidate) { + var can = _currentInstance.getElement(candidate); + if (can.offsetParent) { + _currentInstance.setContainer(can.offsetParent); + } + } + }; + + var _getContainerFromDefaults = function () { + if (_currentInstance.Defaults.Container) { + _currentInstance.setContainer(_currentInstance.Defaults.Container); + } + }; + + // check if a given element is managed or not. if not, add to our map. if drawing is not suspended then + // we'll also stash its dimensions; otherwise we'll do this in a lazy way through updateOffset. + var _manage = _currentInstance.manage = function (id, element, _transient, _recalc) { + if (!managedElements[id]) { + managedElements[id] = { + el: element, + endpoints: [], + connections: [] + }; + + managedElements[id].info = _updateOffset({ elId: id, timestamp: _suspendedAt }); + _currentInstance.addClass(element, "jtk-managed"); + + if (!_transient) { + _currentInstance.fire("manageElement", { id:id, info:managedElements[id].info, el:element }); + } + } else { + if (_recalc) { + managedElements[id].info = _updateOffset({ elId: id, timestamp: _suspendedAt, recalc:true }); + } + } + + return managedElements[id]; + }; + + var _unmanage = _currentInstance.unmanage = function(id) { + if (managedElements[id]) { + var el = managedElements[id].el; + _currentInstance.removeClass(el, "jtk-managed"); + delete managedElements[id]; + _currentInstance.fire("unmanageElement", {id:id, el:el}); + } + }; + + /** + * updates the offset and size for a given element, and stores the + * values. if 'offset' is not null we use that (it would have been + * passed in from a drag call) because it's faster; but if it is null, + * or if 'recalc' is true in order to force a recalculation, we get the current values. + * @method updateOffset + */ + var _updateOffset = function (params) { + + var timestamp = params.timestamp, recalc = params.recalc, offset = params.offset, elId = params.elId, s; + if (_suspendDrawing && !timestamp) { + timestamp = _suspendedAt; + } + if (!recalc) { + if (timestamp && timestamp === offsetTimestamps[elId]) { + return {o: params.offset || offsets[elId], s: sizes[elId]}; + } + } + if (recalc || (!offset && offsets[elId] == null)) { // if forced repaint or no offset available, we recalculate. + + // get the current size and offset, and store them + s = managedElements[elId] ? managedElements[elId].el : null; + if (s != null) { + sizes[elId] = _currentInstance.getSize(s); + offsets[elId] = _currentInstance.getOffset(s); + offsetTimestamps[elId] = timestamp; + } + } else { + offsets[elId] = offset || offsets[elId]; + if (sizes[elId] == null) { + s = managedElements[elId].el; + if (s != null) { + sizes[elId] = _currentInstance.getSize(s); + } + } + offsetTimestamps[elId] = timestamp; + } + + if (offsets[elId] && !offsets[elId].right) { + offsets[elId].right = offsets[elId].left + sizes[elId][0]; + offsets[elId].bottom = offsets[elId].top + sizes[elId][1]; + offsets[elId].width = sizes[elId][0]; + offsets[elId].height = sizes[elId][1]; + offsets[elId].centerx = offsets[elId].left + (offsets[elId].width / 2); + offsets[elId].centery = offsets[elId].top + (offsets[elId].height / 2); + } + + return {o: offsets[elId], s: sizes[elId]}; + }; + + this.updateOffset = _updateOffset; + + /** + * callback from the current library to tell us to prepare ourselves (attach + * mouse listeners etc; can't do that until the library has provided a bind method) + */ + this.init = function () { + if (!initialized) { + _getContainerFromDefaults(); + _currentInstance.anchorManager = new root.jsPlumb.AnchorManager({jsPlumbInstance: _currentInstance}); + initialized = true; + _currentInstance.fire("ready", _currentInstance); + } + }.bind(this); + + this.log = log; + this.jsPlumbUIComponent = jsPlumbUIComponent; + + /* + * Creates an anchor with the given params. + * + * + * Returns: The newly created Anchor. + * Throws: an error if a named anchor was not found. + */ + this.makeAnchor = function () { + var pp, _a = function (t, p) { + if (root.jsPlumb.Anchors[t]) { + return new root.jsPlumb.Anchors[t](p); + } + if (!_currentInstance.Defaults.DoNotThrowErrors) { + throw { msg: "jsPlumb: unknown anchor type '" + t + "'" }; + } + }; + if (arguments.length === 0) { + return null; + } + var specimen = arguments[0], elementId = arguments[1], jsPlumbInstance = arguments[2], newAnchor = null; + // if it appears to be an anchor already... + if (specimen.compute && specimen.getOrientation) { + return specimen; + } //TODO hazy here about whether it should be added or is already added somehow. + // is it the name of an anchor type? + else if (typeof specimen === "string") { + newAnchor = _a(arguments[0], {elementId: elementId, jsPlumbInstance: _currentInstance}); + } + // is it an array? it will be one of: + // an array of [spec, params] - this defines a single anchor, which may be dynamic, but has parameters. + // an array of arrays - this defines some dynamic anchors + // an array of numbers - this defines a single anchor. + else if (_ju.isArray(specimen)) { + if (_ju.isArray(specimen[0]) || _ju.isString(specimen[0])) { + // if [spec, params] format + if (specimen.length === 2 && _ju.isObject(specimen[1])) { + // if first arg is a string, its a named anchor with params + if (_ju.isString(specimen[0])) { + pp = root.jsPlumb.extend({elementId: elementId, jsPlumbInstance: _currentInstance}, specimen[1]); + newAnchor = _a(specimen[0], pp); + } + // otherwise first arg is array, second is params. we treat as a dynamic anchor, which is fine + // even if the first arg has only one entry. you could argue all anchors should be implicitly dynamic in fact. + else { + pp = root.jsPlumb.extend({elementId: elementId, jsPlumbInstance: _currentInstance, anchors: specimen[0]}, specimen[1]); + newAnchor = new root.jsPlumb.DynamicAnchor(pp); + } + } + else { + newAnchor = new jsPlumb.DynamicAnchor({anchors: specimen, selector: null, elementId: elementId, jsPlumbInstance: _currentInstance}); + } + + } + else { + var anchorParams = { + x: specimen[0], y: specimen[1], + orientation: (specimen.length >= 4) ? [ specimen[2], specimen[3] ] : [0, 0], + offsets: (specimen.length >= 6) ? [ specimen[4], specimen[5] ] : [ 0, 0 ], + elementId: elementId, + jsPlumbInstance: _currentInstance, + cssClass: specimen.length === 7 ? specimen[6] : null + }; + newAnchor = new root.jsPlumb.Anchor(anchorParams); + newAnchor.clone = function () { + return new root.jsPlumb.Anchor(anchorParams); + }; + } + } + + if (!newAnchor.id) { + newAnchor.id = "anchor_" + _idstamp(); + } + return newAnchor; + }; + + /** + * makes a list of anchors from the given list of types or coords, eg + * ["TopCenter", "RightMiddle", "BottomCenter", [0, 1, -1, -1] ] + */ + this.makeAnchors = function (types, elementId, jsPlumbInstance) { + var r = []; + for (var i = 0, ii = types.length; i < ii; i++) { + if (typeof types[i] === "string") { + r.push(root.jsPlumb.Anchors[types[i]]({elementId: elementId, jsPlumbInstance: jsPlumbInstance})); + } + else if (_ju.isArray(types[i])) { + r.push(_currentInstance.makeAnchor(types[i], elementId, jsPlumbInstance)); + } + } + return r; + }; + + /** + * Makes a dynamic anchor from the given list of anchors (which may be in shorthand notation as strings or dimension arrays, or Anchor + * objects themselves) and the given, optional, anchorSelector function (jsPlumb uses a default if this is not provided; most people will + * not need to provide this - i think). + */ + this.makeDynamicAnchor = function (anchors, anchorSelector) { + return new root.jsPlumb.DynamicAnchor({anchors: anchors, selector: anchorSelector, elementId: null, jsPlumbInstance: _currentInstance}); + }; + +// --------------------- makeSource/makeTarget ---------------------------------------------- + + this.targetEndpointDefinitions = {}; + this.sourceEndpointDefinitions = {}; + + var selectorFilter = function (evt, _el, selector, _instance, negate) { + var t = evt.target || evt.srcElement, ok = false, + sel = _instance.getSelector(_el, selector); + for (var j = 0; j < sel.length; j++) { + if (sel[j] === t) { + ok = true; + break; + } + } + return negate ? !ok : ok; + }; + + var _makeElementDropHandler = function (elInfo, p, dropOptions, isSource, isTarget) { + var proxyComponent = new jsPlumbUIComponent(p); + var _drop = p._jsPlumb.EndpointDropHandler({ + jsPlumb: _currentInstance, + enabled: function () { + return elInfo.def.enabled; + }, + isFull: function () { + var targetCount = _currentInstance.select({target: elInfo.id}).length; + return elInfo.def.maxConnections > 0 && targetCount >= elInfo.def.maxConnections; + }, + element: elInfo.el, + elementId: elInfo.id, + isSource: isSource, + isTarget: isTarget, + addClass: function (clazz) { + _currentInstance.addClass(elInfo.el, clazz); + }, + removeClass: function (clazz) { + _currentInstance.removeClass(elInfo.el, clazz); + }, + onDrop: function (jpc) { + var source = jpc.endpoints[0]; + source.anchor.unlock(); + }, + isDropAllowed: function () { + return proxyComponent.isDropAllowed.apply(proxyComponent, arguments); + }, + isRedrop:function(jpc) { + return (jpc.suspendedElement != null && jpc.suspendedEndpoint != null && jpc.suspendedEndpoint.element === elInfo.el); + }, + getEndpoint: function (jpc) { + + // make a new Endpoint for the target, or get it from the cache if uniqueEndpoint + // is set. if its a redrop the new endpoint will be immediately cleaned up. + + var newEndpoint = elInfo.def.endpoint; + + // if no cached endpoint, or there was one but it has been cleaned up + // (ie. detached), create a new one + if (newEndpoint == null || newEndpoint._jsPlumb == null) { + var eps = _currentInstance.deriveEndpointAndAnchorSpec(jpc.getType().join(" "), true); + var pp = eps.endpoints ? root.jsPlumb.extend(p, { + endpoint:elInfo.def.def.endpoint || eps.endpoints[1] + }) :p; + if (eps.anchors) { + pp = root.jsPlumb.extend(pp, { + anchor:elInfo.def.def.anchor || eps.anchors[1] + }); + } + newEndpoint = _currentInstance.addEndpoint(elInfo.el, pp); + newEndpoint._mtNew = true; + } + + if (p.uniqueEndpoint) { + elInfo.def.endpoint = newEndpoint; + } + + newEndpoint.setDeleteOnEmpty(true); + + // if connection is detachable, init the new endpoint to be draggable, to support that happening. + if (jpc.isDetachable()) { + newEndpoint.initDraggable(); + } + + // if the anchor has a 'positionFinder' set, then delegate to that function to find + // out where to locate the anchor. + if (newEndpoint.anchor.positionFinder != null) { + var dropPosition = _currentInstance.getUIPosition(arguments, _currentInstance.getZoom()), + elPosition = _currentInstance.getOffset(elInfo.el), + elSize = _currentInstance.getSize(elInfo.el), + ap = dropPosition == null ? [0,0] : newEndpoint.anchor.positionFinder(dropPosition, elPosition, elSize, newEndpoint.anchor.constructorParams); + + newEndpoint.anchor.x = ap[0]; + newEndpoint.anchor.y = ap[1]; + // now figure an orientation for it..kind of hard to know what to do actually. probably the best thing i can do is to + // support specifying an orientation in the anchor's spec. if one is not supplied then i will make the orientation + // be what will cause the most natural link to the source: it will be pointing at the source, but it needs to be + // specified in one axis only, and so how to make that choice? i think i will use whichever axis is the one in which + // the target is furthest away from the source. + } + + return newEndpoint; + }, + maybeCleanup: function (ep) { + if (ep._mtNew && ep.connections.length === 0) { + _currentInstance.deleteObject({endpoint: ep}); + } + else { + delete ep._mtNew; + } + } + }); + + // wrap drop events as needed and initialise droppable + var dropEvent = root.jsPlumb.dragEvents.drop; + dropOptions.scope = dropOptions.scope || (p.scope || _currentInstance.Defaults.Scope); + dropOptions[dropEvent] = _ju.wrap(dropOptions[dropEvent], _drop, true); + dropOptions.rank = p.rank || 0; + + // if target, return true from the over event. this will cause katavorio to stop setting drops to hover + // if multipleDrop is set to false. + if (isTarget) { + dropOptions[root.jsPlumb.dragEvents.over] = function () { return true; }; + } + + // vanilla jsplumb only + if (p.allowLoopback === false) { + dropOptions.canDrop = function (_drag) { + var de = _drag.getDragElement()._jsPlumbRelatedElement; + return de !== elInfo.el; + }; + } + _currentInstance.initDroppable(elInfo.el, dropOptions, "internal"); + + return _drop; + + }; + + // see API docs + this.makeTarget = function (el, params, referenceParams) { + + // put jsplumb ref into params without altering the params passed in + var p = root.jsPlumb.extend({_jsPlumb: this}, referenceParams); + root.jsPlumb.extend(p, params); + + var maxConnections = p.maxConnections || -1, + + _doOne = function (el) { + + // get the element's id and store the endpoint definition for it. jsPlumb.connect calls will look for one of these, + // and use the endpoint definition if found. + // decode the info for this element (id and element) + var elInfo = _info(el), + elid = elInfo.id, + dropOptions = root.jsPlumb.extend({}, p.dropOptions || {}), + type = p.connectionType || "default"; + + this.targetEndpointDefinitions[elid] = this.targetEndpointDefinitions[elid] || {}; + + _ensureContainer(elid); + + // if this is a group and the user has not mandated a rank, set to -1 so that Nodes takes + // precedence. + if (elInfo.el._isJsPlumbGroup && dropOptions.rank == null) { + dropOptions.rank = -1; + } + + // store the definition + var _def = { + def: root.jsPlumb.extend({}, p), + uniqueEndpoint: p.uniqueEndpoint, + maxConnections: maxConnections, + enabled: true + }; + + if (p.createEndpoint) { + _def.uniqueEndpoint = true; + _def.endpoint = _currentInstance.addEndpoint(el, _def.def); + _def.endpoint.setDeleteOnEmpty(false); + } + + elInfo.def = _def; + this.targetEndpointDefinitions[elid][type] = _def; + _makeElementDropHandler(elInfo, p, dropOptions, p.isSource === true, true); + // stash the definition on the drop + elInfo.el._katavorioDrop[elInfo.el._katavorioDrop.length - 1].targetDef = _def; + + }.bind(this); + + // make an array if only given one element + var inputs = el.length && el.constructor !== String ? el : [ el ]; + + // register each one in the list. + for (var i = 0, ii = inputs.length; i < ii; i++) { + _doOne(inputs[i]); + } + + return this; + }; + + // see api docs + this.unmakeTarget = function (el, doNotClearArrays) { + var info = _info(el); + _currentInstance.destroyDroppable(info.el, "internal"); + if (!doNotClearArrays) { + delete this.targetEndpointDefinitions[info.id]; + } + + return this; + }; + + // see api docs + this.makeSource = function (el, params, referenceParams) { + var p = root.jsPlumb.extend({_jsPlumb: this}, referenceParams); + root.jsPlumb.extend(p, params); + var type = p.connectionType || "default"; + var aae = _currentInstance.deriveEndpointAndAnchorSpec(type); + p.endpoint = p.endpoint || aae.endpoints[0]; + p.anchor = p.anchor || aae.anchors[0]; + var maxConnections = p.maxConnections || -1, + onMaxConnections = p.onMaxConnections, + _doOne = function (elInfo) { + // get the element's id and store the endpoint definition for it. jsPlumb.connect calls will look for one of these, + // and use the endpoint definition if found. + var elid = elInfo.id, + _del = this.getElement(elInfo.el); + + this.sourceEndpointDefinitions[elid] = this.sourceEndpointDefinitions[elid] || {}; + _ensureContainer(elid); + + var _def = { + def:root.jsPlumb.extend({}, p), + uniqueEndpoint: p.uniqueEndpoint, + maxConnections: maxConnections, + enabled: true + }; + + if (p.createEndpoint) { + _def.uniqueEndpoint = true; + _def.endpoint = _currentInstance.addEndpoint(el, _def.def); + _def.endpoint.setDeleteOnEmpty(false); + } + + this.sourceEndpointDefinitions[elid][type] = _def; + elInfo.def = _def; + + var stopEvent = root.jsPlumb.dragEvents.stop, + dragEvent = root.jsPlumb.dragEvents.drag, + dragOptions = root.jsPlumb.extend({ }, p.dragOptions || {}), + existingDrag = dragOptions.drag, + existingStop = dragOptions.stop, + ep = null, + endpointAddedButNoDragYet = false; + + // set scope if its not set in dragOptions but was passed in in params + dragOptions.scope = dragOptions.scope || p.scope; + + dragOptions[dragEvent] = _ju.wrap(dragOptions[dragEvent], function () { + if (existingDrag) { + existingDrag.apply(this, arguments); + } + endpointAddedButNoDragYet = false; + }); + + dragOptions[stopEvent] = _ju.wrap(dragOptions[stopEvent], function () { + + if (existingStop) { + existingStop.apply(this, arguments); + } + this.currentlyDragging = false; + if (ep._jsPlumb != null) { // if not cleaned up... + + // reset the anchor to the anchor that was initially provided. the one we were using to drag + // the connection was just a placeholder that was located at the place the user pressed the + // mouse button to initiate the drag. + var anchorDef = p.anchor || this.Defaults.Anchor, + oldAnchor = ep.anchor, + oldConnection = ep.connections[0]; + + var newAnchor = this.makeAnchor(anchorDef, elid, this), + _el = ep.element; + + // if the anchor has a 'positionFinder' set, then delegate to that function to find + // out where to locate the anchor. issue 117. + if (newAnchor.positionFinder != null) { + var elPosition = _currentInstance.getOffset(_el), + elSize = this.getSize(_el), + dropPosition = { left: elPosition.left + (oldAnchor.x * elSize[0]), top: elPosition.top + (oldAnchor.y * elSize[1]) }, + ap = newAnchor.positionFinder(dropPosition, elPosition, elSize, newAnchor.constructorParams); + + newAnchor.x = ap[0]; + newAnchor.y = ap[1]; + } + + ep.setAnchor(newAnchor, true); + ep.repaint(); + this.repaint(ep.elementId); + if (oldConnection != null) { + this.repaint(oldConnection.targetId); + } + } + }.bind(this)); + + // when the user presses the mouse, add an Endpoint, if we are enabled. + var mouseDownListener = function (e) { + // on right mouse button, abort. + if (e.which === 3 || e.button === 2) { + return; + } + + elid = this.getId(this.getElement(elInfo.el)); // elid might have changed since this method was called to configure the element. + + // TODO store def on element. + var def = this.sourceEndpointDefinitions[elid][type]; + + // if disabled, return. + if (!def.enabled) { + return; + } + + // if a filter was given, run it, and return if it says no. + if (p.filter) { + var r = _ju.isString(p.filter) ? selectorFilter(e, elInfo.el, p.filter, this, p.filterExclude) : p.filter(e, elInfo.el); + if (r === false) { + return; + } + } + + // if maxConnections reached + var sourceCount = this.select({source: elid}).length; + if (def.maxConnections >= 0 && (sourceCount >= def.maxConnections)) { + if (onMaxConnections) { + onMaxConnections({ + element: elInfo.el, + maxConnections: maxConnections + }, e); + } + return false; + } + + // find the position on the element at which the mouse was pressed; this is where the endpoint + // will be located. + var elxy = root.jsPlumb.getPositionOnElement(e, _del, _zoom); + + // we need to override the anchor in here, and force 'isSource', but we don't want to mess with + // the params passed in, because after a connection is established we're going to reset the endpoint + // to have the anchor we were given. + var tempEndpointParams = {}; + root.jsPlumb.extend(tempEndpointParams, def.def); + tempEndpointParams.isTemporarySource = true; + tempEndpointParams.anchor = [ elxy[0], elxy[1] , 0, 0]; + tempEndpointParams.dragOptions = dragOptions; + + if (def.def.scope) { + tempEndpointParams.scope = def.def.scope; + } + + ep = this.addEndpoint(elid, tempEndpointParams); + endpointAddedButNoDragYet = true; + ep.setDeleteOnEmpty(true); + + // if unique endpoint and it's already been created, push it onto the endpoint we create. at the end + // of a successful connection we'll switch to that endpoint. + // TODO this is the same code as the programmatic endpoints create on line 1050 ish + if (def.uniqueEndpoint) { + if (!def.endpoint) { + def.endpoint = ep; + ep.setDeleteOnEmpty(false); + } + else { + ep.finalEndpoint = def.endpoint; + } + } + + var _delTempEndpoint = function () { + // this mouseup event is fired only if no dragging occurred, by jquery and yui, but for mootools + // it is fired even if dragging has occurred, in which case we would blow away a perfectly + // legitimate endpoint, were it not for this check. the flag is set after adding an + // endpoint and cleared in a drag listener we set in the dragOptions above. + _currentInstance.off(ep.canvas, "mouseup", _delTempEndpoint); + _currentInstance.off(elInfo.el, "mouseup", _delTempEndpoint); + if (endpointAddedButNoDragYet) { + endpointAddedButNoDragYet = false; + _currentInstance.deleteEndpoint(ep); + } + }; + + _currentInstance.on(ep.canvas, "mouseup", _delTempEndpoint); + _currentInstance.on(elInfo.el, "mouseup", _delTempEndpoint); + + // optionally check for attributes to extract from the source element + var payload = {}; + if (def.def.extract) { + for (var att in def.def.extract) { + var v = (e.srcElement || e.target).getAttribute(att); + if (v) { + payload[def.def.extract[att]] = v; + } + } + } + + // and then trigger its mousedown event, which will kick off a drag, which will start dragging + // a new connection from this endpoint. + _currentInstance.trigger(ep.canvas, "mousedown", e, payload); + + _ju.consume(e); + + }.bind(this); + + this.on(elInfo.el, "mousedown", mouseDownListener); + _def.trigger = mouseDownListener; + + // if a filter was provided, set it as a dragFilter on the element, + // to prevent the element drag function from kicking in when we want to + // drag a new connection + if (p.filter && (_ju.isString(p.filter) || _ju.isFunction(p.filter))) { + _currentInstance.setDragFilter(elInfo.el, p.filter); + } + + var dropOptions = root.jsPlumb.extend({}, p.dropOptions || {}); + + _makeElementDropHandler(elInfo, p, dropOptions, true, p.isTarget === true); + + }.bind(this); + + var inputs = el.length && el.constructor !== String ? el : [ el ]; + for (var i = 0, ii = inputs.length; i < ii; i++) { + _doOne(_info(inputs[i])); + } + + return this; + }; + + // see api docs + this.unmakeSource = function (el, connectionType, doNotClearArrays) { + var info = _info(el); + _currentInstance.destroyDroppable(info.el, "internal"); + var eldefs = this.sourceEndpointDefinitions[info.id]; + if (eldefs) { + for (var def in eldefs) { + if (connectionType == null || connectionType === def) { + var mouseDownListener = eldefs[def].trigger; + if (mouseDownListener) { + _currentInstance.off(info.el, "mousedown", mouseDownListener); + } + if (!doNotClearArrays) { + delete this.sourceEndpointDefinitions[info.id][def]; + } + } + } + } + + return this; + }; + + // see api docs + this.unmakeEverySource = function () { + for (var i in this.sourceEndpointDefinitions) { + _currentInstance.unmakeSource(i, null, true); + } + + this.sourceEndpointDefinitions = {}; + return this; + }; + + var _getScope = function (el, types, connectionType) { + types = _ju.isArray(types) ? types : [ types ]; + var id = _getId(el); + connectionType = connectionType || "default"; + for (var i = 0; i < types.length; i++) { + var eldefs = this[types[i]][id]; + if (eldefs && eldefs[connectionType]) { + return eldefs[connectionType].def.scope || this.Defaults.Scope; + } + } + }.bind(this); + + var _setScope = function (el, scope, types, connectionType) { + types = _ju.isArray(types) ? types : [ types ]; + var id = _getId(el); + connectionType = connectionType || "default"; + for (var i = 0; i < types.length; i++) { + var eldefs = this[types[i]][id]; + if (eldefs && eldefs[connectionType]) { + eldefs[connectionType].def.scope = scope; + } + } + + }.bind(this); + + this.getScope = function (el, scope) { + return _getScope(el, [ "sourceEndpointDefinitions", "targetEndpointDefinitions" ]); + }; + this.getSourceScope = function (el) { + return _getScope(el, "sourceEndpointDefinitions"); + }; + this.getTargetScope = function (el) { + return _getScope(el, "targetEndpointDefinitions"); + }; + this.setScope = function (el, scope, connectionType) { + this.setSourceScope(el, scope, connectionType); + this.setTargetScope(el, scope, connectionType); + }; + this.setSourceScope = function (el, scope, connectionType) { + _setScope(el, scope, "sourceEndpointDefinitions", connectionType); + // we get the source scope during the mousedown event, but we also want to set this. + this.setDragScope(el, scope); + }; + this.setTargetScope = function (el, scope, connectionType) { + _setScope(el, scope, "targetEndpointDefinitions", connectionType); + this.setDropScope(el, scope); + }; + + // see api docs + this.unmakeEveryTarget = function () { + for (var i in this.targetEndpointDefinitions) { + _currentInstance.unmakeTarget(i, true); + } + + this.targetEndpointDefinitions = {}; + return this; + }; + + // does the work of setting a source enabled or disabled. + var _setEnabled = function (type, el, state, toggle, connectionType) { + var a = type === "source" ? this.sourceEndpointDefinitions : this.targetEndpointDefinitions, + originalState, info, newState; + + connectionType = connectionType || "default"; + + // a selector or an array + if (el.length && !_ju.isString(el)) { + originalState = []; + for (var i = 0, ii = el.length; i < ii; i++) { + info = _info(el[i]); + if (a[info.id] && a[info.id][connectionType]) { + originalState[i] = a[info.id][connectionType].enabled; + newState = toggle ? !originalState[i] : state; + a[info.id][connectionType].enabled = newState; + _currentInstance[newState ? "removeClass" : "addClass"](info.el, "jtk-" + type + "-disabled"); + } + } + } + // otherwise a DOM element or a String ID. + else { + info = _info(el); + var id = info.id; + if (a[id] && a[id][connectionType]) { + originalState = a[id][connectionType].enabled; + newState = toggle ? !originalState : state; + a[id][connectionType].enabled = newState; + _currentInstance[newState ? "removeClass" : "addClass"](info.el, "jtk-" + type + "-disabled"); + } + } + return originalState; + }.bind(this); + + var _first = function (el, fn) { + if (_ju.isString(el) || !el.length) { + return fn.apply(this, [ el ]); + } + else if (el.length) { + return fn.apply(this, [ el[0] ]); + } + + }.bind(this); + + this.toggleSourceEnabled = function (el, connectionType) { + _setEnabled("source", el, null, true, connectionType); + return this.isSourceEnabled(el, connectionType); + }; + + this.setSourceEnabled = function (el, state, connectionType) { + return _setEnabled("source", el, state, null, connectionType); + }; + this.isSource = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var eldefs = this.sourceEndpointDefinitions[_info(_el).id]; + return eldefs != null && eldefs[connectionType] != null; + }.bind(this)); + }; + this.isSourceEnabled = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var sep = this.sourceEndpointDefinitions[_info(_el).id]; + return sep && sep[connectionType] && sep[connectionType].enabled === true; + }.bind(this)); + }; + + this.toggleTargetEnabled = function (el, connectionType) { + _setEnabled("target", el, null, true, connectionType); + return this.isTargetEnabled(el, connectionType); + }; + + this.isTarget = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var eldefs = this.targetEndpointDefinitions[_info(_el).id]; + return eldefs != null && eldefs[connectionType] != null; + }.bind(this)); + }; + this.isTargetEnabled = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var tep = this.targetEndpointDefinitions[_info(_el).id]; + return tep && tep[connectionType] && tep[connectionType].enabled === true; + }.bind(this)); + }; + this.setTargetEnabled = function (el, state, connectionType) { + return _setEnabled("target", el, state, null, connectionType); + }; + +// --------------------- end makeSource/makeTarget ---------------------------------------------- + + this.ready = function (fn) { + _currentInstance.bind("ready", fn); + }; + + var _elEach = function(el, fn) { + // support both lists... + if (typeof el === 'object' && el.length) { + for (var i = 0, ii = el.length; i < ii; i++) { + fn(el[i]); + } + } + else {// ...and single strings or elements. + fn(el); + } + + return _currentInstance; + }; + + // repaint some element's endpoints and connections + this.repaint = function (el, ui, timestamp) { + return _elEach(el, function(_el) { + _draw(_el, ui, timestamp); + }); + }; + + this.revalidate = function (el, timestamp, isIdAlready) { + return _elEach(el, function(_el) { + var elId = isIdAlready ? _el : _currentInstance.getId(_el); + _currentInstance.updateOffset({ elId: elId, recalc: true, timestamp:timestamp }); + var dm = _currentInstance.getDragManager(); + if (dm) { + dm.updateOffsets(elId); + } + _currentInstance.repaint(_el); + }); + }; + + // repaint every endpoint and connection. + this.repaintEverything = function () { + // TODO this timestamp causes continuous anchors to not repaint properly. + // fix this. do not just take out the timestamp. it runs a lot faster with + // the timestamp included. + var timestamp = _timestamp(), elId; + + for (elId in endpointsByElement) { + _currentInstance.updateOffset({ elId: elId, recalc: true, timestamp: timestamp }); + } + + for (elId in endpointsByElement) { + _draw(elId, null, timestamp); + } + + return this; + }; + + this.removeAllEndpoints = function (el, recurse, affectedElements) { + affectedElements = affectedElements || []; + var _one = function (_el) { + var info = _info(_el), + ebe = endpointsByElement[info.id], + i, ii; + + if (ebe) { + affectedElements.push(info); + for (i = 0, ii = ebe.length; i < ii; i++) { + _currentInstance.deleteEndpoint(ebe[i], false); + } + } + delete endpointsByElement[info.id]; + + if (recurse) { + if (info.el && info.el.nodeType !== 3 && info.el.nodeType !== 8) { + for (i = 0, ii = info.el.childNodes.length; i < ii; i++) { + _one(info.el.childNodes[i]); + } + } + } + + }; + _one(el); + return this; + }; + + var _doRemove = function(info, affectedElements) { + _currentInstance.removeAllEndpoints(info.id, true, affectedElements); + var dm = _currentInstance.getDragManager(); + var _one = function(_info) { + + if (dm) { + dm.elementRemoved(_info.id); + } + _currentInstance.anchorManager.clearFor(_info.id); + _currentInstance.anchorManager.removeFloatingConnection(_info.id); + + if (_currentInstance.isSource(_info.el)) { + _currentInstance.unmakeSource(_info.el); + } + if (_currentInstance.isTarget(_info.el)) { + _currentInstance.unmakeTarget(_info.el); + } + _currentInstance.destroyDraggable(_info.el); + _currentInstance.destroyDroppable(_info.el); + + + delete _currentInstance.floatingConnections[_info.id]; + delete managedElements[_info.id]; + delete offsets[_info.id]; + if (_info.el) { + _currentInstance.removeElement(_info.el); + _info.el._jsPlumb = null; + } + }; + + // remove all affected child elements + for (var ae = 1; ae < affectedElements.length; ae++) { + _one(affectedElements[ae]); + } + // and always remove the requested one from the dom. + _one(info); + }; + + /** + * Remove the given element, including cleaning up all endpoints registered for it. + * This is exposed in the public API but also used internally by jsPlumb when removing the + * element associated with a connection drag. + */ + this.remove = function (el, doNotRepaint) { + var info = _info(el), affectedElements = []; + if (info.text && info.el.parentNode) { + info.el.parentNode.removeChild(info.el); + } + else if (info.id) { + _currentInstance.batch(function () { + _doRemove(info, affectedElements); + }, doNotRepaint === true); + } + return _currentInstance; + }; + + this.empty = function (el, doNotRepaint) { + var affectedElements = []; + var _one = function(el, dontRemoveFocus) { + var info = _info(el); + if (info.text) { + info.el.parentNode.removeChild(info.el); + } + else if (info.el) { + while(info.el.childNodes.length > 0) { + _one(info.el.childNodes[0]); + } + if (!dontRemoveFocus) { + _doRemove(info, affectedElements); + } + } + }; + + _currentInstance.batch(function() { + _one(el, true); + }, doNotRepaint === false); + + return _currentInstance; + }; + + this.reset = function (doNotUnbindInstanceEventListeners) { + _currentInstance.silently(function() { + _hoverSuspended = false; + _currentInstance.removeAllGroups(); + _currentInstance.removeGroupManager(); + _currentInstance.deleteEveryEndpoint(); + if (!doNotUnbindInstanceEventListeners) { + _currentInstance.unbind(); + } + this.targetEndpointDefinitions = {}; + this.sourceEndpointDefinitions = {}; + connections.length = 0; + if (this.doReset) { + this.doReset(); + } + }.bind(this)); + }; + + var _clearObject = function (obj) { + if (obj.canvas && obj.canvas.parentNode) { + obj.canvas.parentNode.removeChild(obj.canvas); + } + obj.cleanup(); + obj.destroy(); + }; + + this.clear = function () { + _currentInstance.select().each(_clearObject); + _currentInstance.selectEndpoints().each(_clearObject); + + endpointsByElement = {}; + endpointsByUUID = {}; + }; + + this.setDefaultScope = function (scope) { + DEFAULT_SCOPE = scope; + return _currentInstance; + }; + + this.deriveEndpointAndAnchorSpec = function(type, dontPrependDefault) { + var bits = ((dontPrependDefault ? "" : "default ") + type).split(/[\s]/), eps = null, ep = null, a = null, as = null; + for (var i = 0; i < bits.length; i++) { + var _t = _currentInstance.getType(bits[i], "connection"); + if (_t) { + if (_t.endpoints) { + eps = _t.endpoints; + } + if (_t.endpoint) { + ep = _t.endpoint; + } + if (_t.anchors) { + as = _t.anchors; + } + if (_t.anchor) { + a = _t.anchor; + } + } + } + return { endpoints: eps ? eps : [ ep, ep ], anchors: as ? as : [a, a ]}; + }; + + // sets the id of some element, changing whatever we need to to keep track. + this.setId = function (el, newId, doNotSetAttribute) { + // + var id; + + if (_ju.isString(el)) { + id = el; + } + else { + el = this.getElement(el); + id = this.getId(el); + } + + var sConns = this.getConnections({source: id, scope: '*'}, true), + tConns = this.getConnections({target: id, scope: '*'}, true); + + newId = "" + newId; + + if (!doNotSetAttribute) { + el = this.getElement(id); + this.setAttribute(el, "id", newId); + } + else { + el = this.getElement(newId); + } + + endpointsByElement[newId] = endpointsByElement[id] || []; + for (var i = 0, ii = endpointsByElement[newId].length; i < ii; i++) { + endpointsByElement[newId][i].setElementId(newId); + endpointsByElement[newId][i].setReferenceElement(el); + } + delete endpointsByElement[id]; + + this.sourceEndpointDefinitions[newId] = this.sourceEndpointDefinitions[id]; + delete this.sourceEndpointDefinitions[id]; + this.targetEndpointDefinitions[newId] = this.targetEndpointDefinitions[id]; + delete this.targetEndpointDefinitions[id]; + + this.anchorManager.changeId(id, newId); + var dm = this.getDragManager(); + if (dm) { + dm.changeId(id, newId); + } + managedElements[newId] = managedElements[id]; + delete managedElements[id]; + + var _conns = function (list, epIdx, type) { + for (var i = 0, ii = list.length; i < ii; i++) { + list[i].endpoints[epIdx].setElementId(newId); + list[i].endpoints[epIdx].setReferenceElement(el); + list[i][type + "Id"] = newId; + list[i][type] = el; + } + }; + _conns(sConns, 0, "source"); + _conns(tConns, 1, "target"); + + this.repaint(newId); + }; + + this.setDebugLog = function (debugLog) { + log = debugLog; + }; + + this.setSuspendDrawing = function (val, repaintAfterwards) { + var curVal = _suspendDrawing; + _suspendDrawing = val; + if (val) { + _suspendedAt = new Date().getTime(); + } else { + _suspendedAt = null; + } + if (repaintAfterwards) { + this.repaintEverything(); + } + return curVal; + }; + + // returns whether or not drawing is currently suspended. + this.isSuspendDrawing = function () { + return _suspendDrawing; + }; + + // return timestamp for when drawing was suspended. + this.getSuspendedAt = function () { + return _suspendedAt; + }; + + this.batch = function (fn, doNotRepaintAfterwards) { + var _wasSuspended = this.isSuspendDrawing(); + if (!_wasSuspended) { + this.setSuspendDrawing(true); + } + try { + fn(); + } + catch (e) { + _ju.log("Function run while suspended failed", e); + } + if (!_wasSuspended) { + this.setSuspendDrawing(false, !doNotRepaintAfterwards); + } + }; + + this.doWhileSuspended = this.batch; + + this.getCachedData = _getCachedData; + this.timestamp = _timestamp; + this.show = function (el, changeEndpoints) { + _setVisible(el, "block", changeEndpoints); + return _currentInstance; + }; + + // TODO: update this method to return the current state. + this.toggleVisible = _toggleVisible; + this.addListener = this.bind; + + var floatingConnections = []; + this.registerFloatingConnection = function(info, conn, ep) { + floatingConnections[info.id] = conn; + // only register for the target endpoint; we will not be dragging the source at any time + // before this connection is either discarded or made into a permanent connection. + _ju.addToList(endpointsByElement, info.id, ep); + }; + this.getFloatingConnectionFor = function(id) { + return floatingConnections[id]; + }; + + this.listManager = new root.jsPlumbListManager(this, this.Defaults.ListStyle); + }; + + _ju.extend(root.jsPlumbInstance, _ju.EventGenerator, { + setAttribute: function (el, a, v) { + this.setAttribute(el, a, v); + }, + getAttribute: function (el, a) { + return this.getAttribute(root.jsPlumb.getElement(el), a); + }, + convertToFullOverlaySpec: function(spec) { + if (_ju.isString(spec)) { + spec = [ spec, { } ]; + } + spec[1].id = spec[1].id || _ju.uuid(); + return spec; + }, + registerConnectionType: function (id, type) { + this._connectionTypes[id] = root.jsPlumb.extend({}, type); + if (type.overlays) { + var to = {}; + for (var i = 0; i < type.overlays.length; i++) { + // if a string, convert to object representation so that we can store the typeid on it. + // also assign an id. + var fo = this.convertToFullOverlaySpec(type.overlays[i]); + to[fo[1].id] = fo; + } + this._connectionTypes[id].overlays = to; + } + }, + registerConnectionTypes: function (types) { + for (var i in types) { + this.registerConnectionType(i, types[i]); + } + }, + registerEndpointType: function (id, type) { + this._endpointTypes[id] = root.jsPlumb.extend({}, type); + if (type.overlays) { + var to = {}; + for (var i = 0; i < type.overlays.length; i++) { + // if a string, convert to object representation so that we can store the typeid on it. + // also assign an id. + var fo = this.convertToFullOverlaySpec(type.overlays[i]); + to[fo[1].id] = fo; + } + this._endpointTypes[id].overlays = to; + } + }, + registerEndpointTypes: function (types) { + for (var i in types) { + this.registerEndpointType(i, types[i]); + } + }, + getType: function (id, typeDescriptor) { + return typeDescriptor === "connection" ? this._connectionTypes[id] : this._endpointTypes[id]; + }, + setIdChanged: function (oldId, newId) { + this.setId(oldId, newId, true); + }, + // set parent: change the parent for some node and update all the registrations we need to. + setParent: function (el, newParent) { + var _dom = this.getElement(el), + _id = this.getId(_dom), + _pdom = this.getElement(newParent), + _pid = this.getId(_pdom), + dm = this.getDragManager(); + + _dom.parentNode.removeChild(_dom); + _pdom.appendChild(_dom); + if (dm) { + dm.setParent(_dom, _id, _pdom, _pid); + } + }, + extend: function (o1, o2, names) { + var i; + if (names) { + for (i = 0; i < names.length; i++) { + o1[names[i]] = o2[names[i]]; + } + } + else { + for (i in o2) { + o1[i] = o2[i]; + } + } + + return o1; + }, + floatingConnections: {}, + getFloatingAnchorIndex: function (jpc) { + return jpc.endpoints[0].isFloating() ? 0 : jpc.endpoints[1].isFloating() ? 1 : -1; + }, + proxyConnection :function(connection, index, proxyEl, proxyElId, endpointGenerator, anchorGenerator) { + var proxyEp, + originalElementId = connection.endpoints[index].elementId, + originalEndpoint = connection.endpoints[index]; + + connection.proxies = connection.proxies || []; + if(connection.proxies[index]) { + proxyEp = connection.proxies[index].ep; + }else { + proxyEp = this.addEndpoint(proxyEl, { + endpoint:endpointGenerator(connection, index), + anchor:anchorGenerator(connection, index), + parameters:{ + isProxyEndpoint:true + } + }); + } + proxyEp.setDeleteOnEmpty(true); + + // for this index, stash proxy info: the new EP, the original EP. + connection.proxies[index] = { ep:proxyEp, originalEp: originalEndpoint }; + + // and advise the anchor manager + if (index === 0) { + // TODO why are there two differently named methods? Why is there not one method that says "some end of this + // connection changed (you give the index), and here's the new element and element id." + this.anchorManager.sourceChanged(originalElementId, proxyElId, connection, proxyEl); + } + else { + this.anchorManager.updateOtherEndpoint(connection.endpoints[0].elementId, originalElementId, proxyElId, connection); + connection.target = proxyEl; + connection.targetId = proxyElId; + } + + // detach the original EP from the connection. + originalEndpoint.detachFromConnection(connection, null, true); + + // set the proxy as the new ep + proxyEp.connections = [ connection ]; + connection.endpoints[index] = proxyEp; + + originalEndpoint.setVisible(false); + + connection.setVisible(true); + + this.revalidate(proxyEl); + }, + unproxyConnection : function(connection, index, proxyElId) { + // if connection cleaned up, no proxies, or none for this end of the connection, abort. + if (connection._jsPlumb == null || connection.proxies == null || connection.proxies[index] == null) { + return; + } + + var originalElement = connection.proxies[index].originalEp.element, + originalElementId = connection.proxies[index].originalEp.elementId; + + connection.endpoints[index] = connection.proxies[index].originalEp; + // and advise the anchor manager + if (index === 0) { + // TODO why are there two differently named methods? Why is there not one method that says "some end of this + // connection changed (you give the index), and here's the new element and element id." + this.anchorManager.sourceChanged(proxyElId, originalElementId, connection, originalElement); + } + else { + this.anchorManager.updateOtherEndpoint(connection.endpoints[0].elementId, proxyElId, originalElementId, connection); + connection.target = originalElement; + connection.targetId = originalElementId; + } + + // detach the proxy EP from the connection (which will cause it to be removed as we no longer need it) + connection.proxies[index].ep.detachFromConnection(connection, null); + + connection.proxies[index].originalEp.addConnection(connection); + if(connection.isVisible()) { + connection.proxies[index].originalEp.setVisible(true); + } + + // cleanup + delete connection.proxies[index]; + } + }); + +// --------------------- static instance + module registration ------------------------------------------- + +// create static instance and assign to window if window exists. + var jsPlumb = new jsPlumbInstance(); + // register on 'root' (lets us run on server or browser) + root.jsPlumb = jsPlumb; + // add 'getInstance' method to static instance + jsPlumb.getInstance = function (_defaults, overrideFns) { + var j = new jsPlumbInstance(_defaults); + if (overrideFns) { + for (var ovf in overrideFns) { + j[ovf] = overrideFns[ovf]; + } + } + j.init(); + return j; + }; + jsPlumb.each = function (spec, fn) { + if (spec == null) { + return; + } + if (typeof spec === "string") { + fn(jsPlumb.getElement(spec)); + } + else if (spec.length != null) { + for (var i = 0; i < spec.length; i++) { + fn(jsPlumb.getElement(spec[i])); + } + } + else { + fn(spec); + } // assume it's an element. + }; + + // CommonJS + if (typeof exports !== 'undefined') { + exports.jsPlumb = jsPlumb; + } + +// --------------------- end static instance + AMD registration ------------------------------------------- + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function() { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + // ------------------------------ BEGIN OverlayCapablejsPlumbUIComponent -------------------------------------------- + + var _internalLabelOverlayId = "__label", + // this is a shortcut helper method to let people add a label as + // overlay. + _makeLabelOverlay = function (component, params) { + + var _params = { + cssClass: params.cssClass, + labelStyle: component.labelStyle, + id: _internalLabelOverlayId, + component: component, + _jsPlumb: component._jsPlumb.instance // TODO not necessary, since the instance can be accessed through the component. + }, + mergedParams = _jp.extend(_params, params); + + return new _jp.Overlays[component._jsPlumb.instance.getRenderMode()].Label(mergedParams); + }, + _processOverlay = function (component, o) { + var _newOverlay = null; + if (_ju.isArray(o)) { // this is for the shorthand ["Arrow", { width:50 }] syntax + // there's also a three arg version: + // ["Arrow", { width:50 }, {location:0.7}] + // which merges the 3rd arg into the 2nd. + var type = o[0], + // make a copy of the object so as not to mess up anyone else's reference... + p = _jp.extend({component: component, _jsPlumb: component._jsPlumb.instance}, o[1]); + if (o.length === 3) { + _jp.extend(p, o[2]); + } + _newOverlay = new _jp.Overlays[component._jsPlumb.instance.getRenderMode()][type](p); + } else if (o.constructor === String) { + _newOverlay = new _jp.Overlays[component._jsPlumb.instance.getRenderMode()][o]({component: component, _jsPlumb: component._jsPlumb.instance}); + } else { + _newOverlay = o; + } + + _newOverlay.id = _newOverlay.id || _ju.uuid(); + component.cacheTypeItem("overlay", _newOverlay, _newOverlay.id); + component._jsPlumb.overlays[_newOverlay.id] = _newOverlay; + + return _newOverlay; + }; + + _jp.OverlayCapableJsPlumbUIComponent = function (params) { + + root.jsPlumbUIComponent.apply(this, arguments); + this._jsPlumb.overlays = {}; + this._jsPlumb.overlayPositions = {}; + + if (params.label) { + this.getDefaultType().overlays[_internalLabelOverlayId] = ["Label", { + label: params.label, + location: params.labelLocation || this.defaultLabelLocation || 0.5, + labelStyle: params.labelStyle || this._jsPlumb.instance.Defaults.LabelStyle, + id:_internalLabelOverlayId + }]; + } + + this.setListenerComponent = function (c) { + if (this._jsPlumb) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].setListenerComponent(c); + } + } + }; + }; + + _jp.OverlayCapableJsPlumbUIComponent.applyType = function (component, t) { + if (t.overlays) { + // loop through the ones in the type. if already present on the component, + // dont remove or re-add. + var keep = {}, i; + + for (i in t.overlays) { + + var existing = component._jsPlumb.overlays[t.overlays[i][1].id]; + if (existing) { + // maybe update from data, if there were parameterised values for instance. + existing.updateFrom(t.overlays[i][1]); + keep[t.overlays[i][1].id] = true; + + existing.reattach(component._jsPlumb.instance, component); + } + else { + var c = component.getCachedTypeItem("overlay", t.overlays[i][1].id); + if (c != null) { + c.reattach(component._jsPlumb.instance, component); + c.setVisible(true); + // maybe update from data, if there were parameterised values for instance. + c.updateFrom(t.overlays[i][1]); + component._jsPlumb.overlays[c.id] = c; + } + else { + c = component.addOverlay(t.overlays[i], true); + } + keep[c.id] = true; + } + } + + // now loop through the full overlays and remove those that we dont want to keep + for (i in component._jsPlumb.overlays) { + if (keep[component._jsPlumb.overlays[i].id] == null) { + component.removeOverlay(component._jsPlumb.overlays[i].id, true); // remove overlay but dont clean it up. + // that would remove event listeners etc; overlays are never discarded by the types stuff, they are + // just detached/reattached. + } + } + } + }; + + _ju.extend(_jp.OverlayCapableJsPlumbUIComponent, root.jsPlumbUIComponent, { + + setHover: function (hover, ignoreAttachedElements) { + if (this._jsPlumb && !this._jsPlumb.instance.isConnectionBeingDragged()) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i][hover ? "addClass" : "removeClass"](this._jsPlumb.instance.hoverClass); + } + } + }, + addOverlay: function (overlay, doNotRepaint) { + var o = _processOverlay(this, overlay); + + if (this.getData && o.type === "Label" && _ju.isArray(overlay)) { + // + // component data might contain label location - look for it here. + var d = this.getData(), p = overlay[1]; + if (d) { + var locationAttribute = p.labelLocationAttribute || "labelLocation"; + var loc = d ? d[locationAttribute] : null; + + if (loc) { + o.loc = loc; + } + } + } + + if (!doNotRepaint) { + this.repaint(); + } + return o; + }, + getOverlay: function (id) { + return this._jsPlumb.overlays[id]; + }, + getOverlays: function () { + return this._jsPlumb.overlays; + }, + hideOverlay: function (id) { + var o = this.getOverlay(id); + if (o) { + o.hide(); + } + }, + hideOverlays: function () { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].hide(); + } + }, + showOverlay: function (id) { + var o = this.getOverlay(id); + if (o) { + o.show(); + } + }, + showOverlays: function () { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].show(); + } + }, + removeAllOverlays: function (doNotRepaint) { + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays[i].cleanup) { + this._jsPlumb.overlays[i].cleanup(); + } + } + + this._jsPlumb.overlays = {}; + this._jsPlumb.overlayPositions = null; + this._jsPlumb.overlayPlacements= {}; + if (!doNotRepaint) { + this.repaint(); + } + }, + removeOverlay: function (overlayId, dontCleanup) { + var o = this._jsPlumb.overlays[overlayId]; + if (o) { + o.setVisible(false); + if (!dontCleanup && o.cleanup) { + o.cleanup(); + } + delete this._jsPlumb.overlays[overlayId]; + if (this._jsPlumb.overlayPositions) { + delete this._jsPlumb.overlayPositions[overlayId]; + } + + if (this._jsPlumb.overlayPlacements) { + delete this._jsPlumb.overlayPlacements[overlayId]; + } + } + }, + removeOverlays: function () { + for (var i = 0, j = arguments.length; i < j; i++) { + this.removeOverlay(arguments[i]); + } + }, + moveParent: function (newParent) { + if (this.bgCanvas) { + this.bgCanvas.parentNode.removeChild(this.bgCanvas); + newParent.appendChild(this.bgCanvas); + } + + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + newParent.appendChild(this.canvas); + + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays[i].isAppendedAtTopLevel) { + var el = this._jsPlumb.overlays[i].getElement(); + el.parentNode.removeChild(el); + newParent.appendChild(el); + } + } + } + }, + getLabel: function () { + var lo = this.getOverlay(_internalLabelOverlayId); + return lo != null ? lo.getLabel() : null; + }, + getLabelOverlay: function () { + return this.getOverlay(_internalLabelOverlayId); + }, + setLabel: function (l) { + var lo = this.getOverlay(_internalLabelOverlayId); + if (!lo) { + var params = l.constructor === String || l.constructor === Function ? { label: l } : l; + lo = _makeLabelOverlay(this, params); + this._jsPlumb.overlays[_internalLabelOverlayId] = lo; + } + else { + if (l.constructor === String || l.constructor === Function) { + lo.setLabel(l); + } + else { + if (l.label) { + lo.setLabel(l.label); + } + if (l.location) { + lo.setLocation(l.location); + } + } + } + + if (!this._jsPlumb.instance.isSuspendDrawing()) { + this.repaint(); + } + }, + cleanup: function (force) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].cleanup(force); + this._jsPlumb.overlays[i].destroy(force); + } + if (force) { + this._jsPlumb.overlays = {}; + this._jsPlumb.overlayPositions = null; + } + }, + setVisible: function (v) { + this[v ? "showOverlays" : "hideOverlays"](); + }, + setAbsoluteOverlayPosition: function (overlay, xy) { + this._jsPlumb.overlayPositions[overlay.id] = xy; + }, + getAbsoluteOverlayPosition: function (overlay) { + return this._jsPlumb.overlayPositions ? this._jsPlumb.overlayPositions[overlay.id] : null; + }, + _clazzManip:function(action, clazz, dontUpdateOverlays) { + if (!dontUpdateOverlays) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i][action + "Class"](clazz); + } + } + }, + addClass:function(clazz, dontUpdateOverlays) { + this._clazzManip("add", clazz, dontUpdateOverlays); + }, + removeClass:function(clazz, dontUpdateOverlays) { + this._clazzManip("remove", clazz, dontUpdateOverlays); + } + }); + +// ------------------------------ END OverlayCapablejsPlumbUIComponent -------------------------------------------- + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the code for Endpoints. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + // create the drag handler for a connection + var _makeConnectionDragHandler = function (endpoint, placeholder, _jsPlumb) { + var stopped = false; + return { + drag: function () { + if (stopped) { + stopped = false; + return true; + } + + if (placeholder.element) { + var _ui = _jsPlumb.getUIPosition(arguments, _jsPlumb.getZoom()); + if (_ui != null) { + _jsPlumb.setPosition(placeholder.element, _ui); + } + _jsPlumb.repaint(placeholder.element, _ui); + // always repaint the source endpoint, because only continuous/dynamic anchors cause the endpoint + // to be repainted, so static anchors need to be told (or the endpoint gets dragged around) + endpoint.paint({anchorPoint:endpoint.anchor.getCurrentLocation({element:endpoint})}); + } + }, + stopDrag: function () { + stopped = true; + } + }; + }; + + // creates a placeholder div for dragging purposes, adds it, and pre-computes its offset. + var _makeDraggablePlaceholder = function (placeholder, _jsPlumb, ipco, ips) { + var n = _jsPlumb.createElement("div", { position : "absolute" }); + _jsPlumb.appendElement(n); + var id = _jsPlumb.getId(n); + _jsPlumb.setPosition(n, ipco); + n.style.width = ips[0] + "px"; + n.style.height = ips[1] + "px"; + _jsPlumb.manage(id, n, true); // TRANSIENT MANAGE + // create and assign an id, and initialize the offset. + placeholder.id = id; + placeholder.element = n; + }; + + // create a floating endpoint (for drag connections) + var _makeFloatingEndpoint = function (paintStyle, referenceAnchor, endpoint, referenceCanvas, sourceElement, _jsPlumb, _newEndpoint, scope) { + var floatingAnchor = new _jp.FloatingAnchor({ reference: referenceAnchor, referenceCanvas: referenceCanvas, jsPlumbInstance: _jsPlumb }); + //setting the scope here should not be the way to fix that mootools issue. it should be fixed by not + // adding the floating endpoint as a droppable. that makes more sense anyway! + // TRANSIENT MANAGE + return _newEndpoint({ + paintStyle: paintStyle, + endpoint: endpoint, + anchor: floatingAnchor, + source: sourceElement, + scope: scope + }); + }; + + var typeParameters = [ "connectorStyle", "connectorHoverStyle", "connectorOverlays", + "connector", "connectionType", "connectorClass", "connectorHoverClass" ]; + + // a helper function that tries to find a connection to the given element, and returns it if so. if elementWithPrecedence is null, + // or no connection to it is found, we return the first connection in our list. + var findConnectionToUseForDynamicAnchor = function (ep, elementWithPrecedence) { + var idx = 0; + if (elementWithPrecedence != null) { + for (var i = 0; i < ep.connections.length; i++) { + if (ep.connections[i].sourceId === elementWithPrecedence || ep.connections[i].targetId === elementWithPrecedence) { + idx = i; + break; + } + } + } + + return ep.connections[idx]; + }; + + _jp.Endpoint = function (params) { + var _jsPlumb = params._jsPlumb, + _newConnection = params.newConnection, + _newEndpoint = params.newEndpoint; + + this.idPrefix = "_jsplumb_e_"; + this.defaultLabelLocation = [ 0.5, 0.5 ]; + this.defaultOverlayKeys = ["Overlays", "EndpointOverlays"]; + _jp.OverlayCapableJsPlumbUIComponent.apply(this, arguments); + +// TYPE + + this.appendToDefaultType({ + connectionType:params.connectionType, + maxConnections: params.maxConnections == null ? this._jsPlumb.instance.Defaults.MaxConnections : params.maxConnections, // maximum number of connections this endpoint can be the source of., + paintStyle: params.endpointStyle || params.paintStyle || params.style || this._jsPlumb.instance.Defaults.EndpointStyle || _jp.Defaults.EndpointStyle, + hoverPaintStyle: params.endpointHoverStyle || params.hoverPaintStyle || this._jsPlumb.instance.Defaults.EndpointHoverStyle || _jp.Defaults.EndpointHoverStyle, + connectorStyle: params.connectorStyle, + connectorHoverStyle: params.connectorHoverStyle, + connectorClass: params.connectorClass, + connectorHoverClass: params.connectorHoverClass, + connectorOverlays: params.connectorOverlays, + connector: params.connector, + connectorTooltip: params.connectorTooltip + }); + +// END TYPE + + this._jsPlumb.enabled = !(params.enabled === false); + this._jsPlumb.visible = true; + this.element = _jp.getElement(params.source); + this._jsPlumb.uuid = params.uuid; + this._jsPlumb.floatingEndpoint = null; + var inPlaceCopy = null; + if (this._jsPlumb.uuid) { + params.endpointsByUUID[this._jsPlumb.uuid] = this; + } + this.elementId = params.elementId; + this.dragProxy = params.dragProxy; + + this._jsPlumb.connectionCost = params.connectionCost; + this._jsPlumb.connectionsDirected = params.connectionsDirected; + this._jsPlumb.currentAnchorClass = ""; + this._jsPlumb.events = {}; + + var deleteOnEmpty = params.deleteOnEmpty === true; + this.setDeleteOnEmpty = function(d) { + deleteOnEmpty = d; + }; + + var _updateAnchorClass = function () { + // stash old, get new + var oldAnchorClass = _jsPlumb.endpointAnchorClassPrefix + "-" + this._jsPlumb.currentAnchorClass; + this._jsPlumb.currentAnchorClass = this.anchor.getCssClass(); + var anchorClass = _jsPlumb.endpointAnchorClassPrefix + (this._jsPlumb.currentAnchorClass ? "-" + this._jsPlumb.currentAnchorClass : ""); + + this.removeClass(oldAnchorClass); + this.addClass(anchorClass); + // add and remove at the same time to reduce the number of reflows. + _jp.updateClasses(this.element, anchorClass, oldAnchorClass); + }.bind(this); + + this.prepareAnchor = function(anchorParams) { + var a = this._jsPlumb.instance.makeAnchor(anchorParams, this.elementId, _jsPlumb); + a.bind("anchorChanged", function (currentAnchor) { + this.fire("anchorChanged", {endpoint: this, anchor: currentAnchor}); + _updateAnchorClass(); + }.bind(this)); + return a; + }; + + this.setPreparedAnchor = function(anchor, doNotRepaint) { + this._jsPlumb.instance.continuousAnchorFactory.clear(this.elementId); + this.anchor = anchor; + _updateAnchorClass(); + + if (!doNotRepaint) { + this._jsPlumb.instance.repaint(this.elementId); + } + + return this; + }; + + this.setAnchor = function (anchorParams, doNotRepaint) { + var a = this.prepareAnchor(anchorParams); + this.setPreparedAnchor(a, doNotRepaint); + return this; + }; + + var internalHover = function (state) { + if (this.connections.length > 0) { + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].setHover(state, false); + } + } + else { + this.setHover(state); + } + }.bind(this); + + this.bind("mouseover", function () { + internalHover(true); + }); + this.bind("mouseout", function () { + internalHover(false); + }); + + // ANCHOR MANAGER + if (!params._transient) { // in place copies, for example, are transient. they will never need to be retrieved during a paint cycle, because they dont move, and then they are deleted. + this._jsPlumb.instance.anchorManager.add(this, this.elementId); + } + + this.prepareEndpoint = function(ep, typeId) { + var _e = function (t, p) { + var rm = _jsPlumb.getRenderMode(); + if (_jp.Endpoints[rm][t]) { + return new _jp.Endpoints[rm][t](p); + } + if (!_jsPlumb.Defaults.DoNotThrowErrors) { + throw { msg: "jsPlumb: unknown endpoint type '" + t + "'" }; + } + }; + + var endpointArgs = { + _jsPlumb: this._jsPlumb.instance, + cssClass: params.cssClass, + container: params.container, + tooltip: params.tooltip, + connectorTooltip: params.connectorTooltip, + endpoint: this + }; + + var endpoint; + + if (_ju.isString(ep)) { + endpoint = _e(ep, endpointArgs); + } + else if (_ju.isArray(ep)) { + endpointArgs = _ju.merge(ep[1], endpointArgs); + endpoint = _e(ep[0], endpointArgs); + } + else { + endpoint = ep.clone(); + } + + // assign a clone function using a copy of endpointArgs. this is used when a drag starts: the endpoint that was dragged is cloned, + // and the clone is left in its place while the original one goes off on a magical journey. + // the copy is to get around a closure problem, in which endpointArgs ends up getting shared by + // the whole world. + //var argsForClone = jsPlumb.extend({}, endpointArgs); + endpoint.clone = function () { + // TODO this, and the code above, can be refactored to be more dry. + if (_ju.isString(ep)) { + return _e(ep, endpointArgs); + } + else if (_ju.isArray(ep)) { + endpointArgs = _ju.merge(ep[1], endpointArgs); + return _e(ep[0], endpointArgs); + } + }.bind(this); + + endpoint.typeId = typeId; + return endpoint; + }; + + this.setEndpoint = function(ep, doNotRepaint) { + var _ep = this.prepareEndpoint(ep); + this.setPreparedEndpoint(_ep, true); + }; + + this.setPreparedEndpoint = function (ep, doNotRepaint) { + if (this.endpoint != null) { + this.endpoint.cleanup(); + this.endpoint.destroy(); + } + this.endpoint = ep; + this.type = this.endpoint.type; + this.canvas = this.endpoint.canvas; + }; + + _jp.extend(this, params, typeParameters); + + this.isSource = params.isSource || false; + this.isTemporarySource = params.isTemporarySource || false; + this.isTarget = params.isTarget || false; + + this.connections = params.connections || []; + this.connectorPointerEvents = params["connector-pointer-events"]; + + this.scope = params.scope || _jsPlumb.getDefaultScope(); + this.timestamp = null; + this.reattachConnections = params.reattach || _jsPlumb.Defaults.ReattachConnections; + this.connectionsDetachable = _jsPlumb.Defaults.ConnectionsDetachable; + if (params.connectionsDetachable === false || params.detachable === false) { + this.connectionsDetachable = false; + } + this.dragAllowedWhenFull = params.dragAllowedWhenFull !== false; + + if (params.onMaxConnections) { + this.bind("maxConnections", params.onMaxConnections); + } + + // + // add a connection. not part of public API. + // + this.addConnection = function (connection) { + this.connections.push(connection); + this[(this.connections.length > 0 ? "add" : "remove") + "Class"](_jsPlumb.endpointConnectedClass); + this[(this.isFull() ? "add" : "remove") + "Class"](_jsPlumb.endpointFullClass); + }; + + this.detachFromConnection = function (connection, idx, doNotCleanup) { + idx = idx == null ? this.connections.indexOf(connection) : idx; + if (idx >= 0) { + this.connections.splice(idx, 1); + this[(this.connections.length > 0 ? "add" : "remove") + "Class"](_jsPlumb.endpointConnectedClass); + this[(this.isFull() ? "add" : "remove") + "Class"](_jsPlumb.endpointFullClass); + } + + if (!doNotCleanup && deleteOnEmpty && this.connections.length === 0) { + _jsPlumb.deleteObject({ + endpoint: this, + fireEvent: false, + deleteAttachedObjects: doNotCleanup !== true + }); + } + }; + + this.deleteEveryConnection = function(params) { + var c = this.connections.length; + for (var i = 0; i < c; i++) { + _jsPlumb.deleteConnection(this.connections[0], params); + } + }; + + this.detachFrom = function (targetEndpoint, fireEvent, originalEvent) { + var c = []; + for (var i = 0; i < this.connections.length; i++) { + if (this.connections[i].endpoints[1] === targetEndpoint || this.connections[i].endpoints[0] === targetEndpoint) { + c.push(this.connections[i]); + } + } + for (var j = 0, count = c.length; j < count; j++) { + _jsPlumb.deleteConnection(c[0]); + } + return this; + }; + + this.getElement = function () { + return this.element; + }; + + this.setElement = function (el) { + var parentId = this._jsPlumb.instance.getId(el), + curId = this.elementId; + // remove the endpoint from the list for the current endpoint's element + _ju.removeWithFunction(params.endpointsByElement[this.elementId], function (e) { + return e.id === this.id; + }.bind(this)); + this.element = _jp.getElement(el); + this.elementId = _jsPlumb.getId(this.element); + _jsPlumb.anchorManager.rehomeEndpoint(this, curId, this.element); + _jsPlumb.dragManager.endpointAdded(this.element); + _ju.addToList(params.endpointsByElement, parentId, this); + return this; + }; + + /** + * private but must be exposed. + */ + this.makeInPlaceCopy = function () { + var loc = this.anchor.getCurrentLocation({element: this}), + o = this.anchor.getOrientation(this), + acc = this.anchor.getCssClass(), + inPlaceAnchor = { + bind: function () { + }, + compute: function () { + return [ loc[0], loc[1] ]; + }, + getCurrentLocation: function () { + return [ loc[0], loc[1] ]; + }, + getOrientation: function () { + return o; + }, + getCssClass: function () { + return acc; + } + }; + + return _newEndpoint({ + dropOptions: params.dropOptions, + anchor: inPlaceAnchor, + source: this.element, + paintStyle: this.getPaintStyle(), + endpoint: params.hideOnDrag ? "Blank" : this.endpoint, + _transient: true, + scope: this.scope, + reference:this + }); + }; + + /** + * returns a connection from the pool; used when dragging starts. just gets the head of the array if it can. + */ + this.connectorSelector = function () { + return this.connections[0]; + }; + + this.setStyle = this.setPaintStyle; + + this.paint = function (params) { + params = params || {}; + var timestamp = params.timestamp, recalc = !(params.recalc === false); + if (!timestamp || this.timestamp !== timestamp) { + + var info = _jsPlumb.updateOffset({ elId: this.elementId, timestamp: timestamp }); + + var xy = params.offset ? params.offset.o : info.o; + if (xy != null) { + var ap = params.anchorPoint, connectorPaintStyle = params.connectorPaintStyle; + if (ap == null) { + var wh = params.dimensions || info.s, + anchorParams = { xy: [ xy.left, xy.top ], wh: wh, element: this, timestamp: timestamp }; + if (recalc && this.anchor.isDynamic && this.connections.length > 0) { + var c = findConnectionToUseForDynamicAnchor(this, params.elementWithPrecedence), + oIdx = c.endpoints[0] === this ? 1 : 0, + oId = oIdx === 0 ? c.sourceId : c.targetId, + oInfo = _jsPlumb.getCachedData(oId), + oOffset = oInfo.o, oWH = oInfo.s; + + anchorParams.index = oIdx === 0 ? 1 : 0; + anchorParams.connection = c; + anchorParams.txy = [ oOffset.left, oOffset.top ]; + anchorParams.twh = oWH; + anchorParams.tElement = c.endpoints[oIdx]; + } else if (this.connections.length > 0) { + anchorParams.connection = this.connections[0]; + } + ap = this.anchor.compute(anchorParams); + } + + this.endpoint.compute(ap, this.anchor.getOrientation(this), this._jsPlumb.paintStyleInUse, connectorPaintStyle || this.paintStyleInUse); + this.endpoint.paint(this._jsPlumb.paintStyleInUse, this.anchor); + this.timestamp = timestamp; + + // paint overlays + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays.hasOwnProperty(i)) { + var o = this._jsPlumb.overlays[i]; + if (o.isVisible()) { + this._jsPlumb.overlayPlacements[i] = o.draw(this.endpoint, this._jsPlumb.paintStyleInUse); + o.paint(this._jsPlumb.overlayPlacements[i]); + } + } + } + } + } + }; + + this.getTypeDescriptor = function () { + return "endpoint"; + }; + this.isVisible = function () { + return this._jsPlumb.visible; + }; + + this.repaint = this.paint; + + var draggingInitialised = false; + this.initDraggable = function () { + + // is this a connection source? we make it draggable and have the + // drag listener maintain a connection with a floating endpoint. + if (!draggingInitialised && _jp.isDragSupported(this.element)) { + var placeholderInfo = { id: null, element: null }, + jpc = null, + existingJpc = false, + existingJpcParams = null, + _dragHandler = _makeConnectionDragHandler(this, placeholderInfo, _jsPlumb), + dragOptions = params.dragOptions || {}, + defaultOpts = {}, + startEvent = _jp.dragEvents.start, + stopEvent = _jp.dragEvents.stop, + dragEvent = _jp.dragEvents.drag, + beforeStartEvent = _jp.dragEvents.beforeStart, + payload; + + // respond to beforeStart from katavorio; this will have, optionally, a payload of attribute values + // that were placed there by the makeSource mousedown listener. + var beforeStart = function(beforeStartParams) { + payload = beforeStartParams.e.payload || {}; + }; + + var start = function (startParams) { + +// ------------- first, get a connection to drag. this may be null, in which case we are dragging a new one. + + jpc = this.connectorSelector(); + +// -------------------------------- now a bunch of tests about whether or not to proceed ------------------------- + + var _continue = true; + // if not enabled, return + if (!this.isEnabled()) { + _continue = false; + } + // if no connection and we're not a source - or temporarily a source, as is the case with makeSource - return. + if (jpc == null && !this.isSource && !this.isTemporarySource) { + _continue = false; + } + // otherwise if we're full and not allowed to drag, also return false. + if (this.isSource && this.isFull() && !(jpc != null && this.dragAllowedWhenFull)) { + _continue = false; + } + // if the connection was setup as not detachable or one of its endpoints + // was setup as connectionsDetachable = false, or Defaults.ConnectionsDetachable + // is set to false... + if (jpc != null && !jpc.isDetachable(this)) { + // .. and the endpoint is full + if (this.isFull()) { + _continue = false; + } else { + // otherwise, if not full, set the connection to null, and we will now proceed + // to drag a new connection. + jpc = null; + } + } + + var beforeDrag = _jsPlumb.checkCondition(jpc == null ? "beforeDrag" : "beforeStartDetach", { + endpoint:this, + source:this.element, + sourceId:this.elementId, + connection:jpc + }); + if (beforeDrag === false) { + _continue = false; + } + // else we might have been given some data. we'll pass it in to a new connection as 'data'. + // here we also merge in the optional payload we were given on mousedown. + else if (typeof beforeDrag === "object") { + _jp.extend(beforeDrag, payload || {}); + } + else { + // or if no beforeDrag data, maybe use the payload on its own. + beforeDrag = payload || {}; + } + + if (_continue === false) { + // this is for mootools and yui. returning false from this causes jquery to stop drag. + // the events are wrapped in both mootools and yui anyway, but i don't think returning + // false from the start callback would stop a drag. + if (_jsPlumb.stopDrag) { + _jsPlumb.stopDrag(this.canvas); + } + _dragHandler.stopDrag(); + return false; + } + +// --------------------------------------------------------------------------------------------------------------------- + + // ok to proceed. + + // clear hover for all connections for this endpoint before continuing. + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].setHover(false); + } + + this.addClass("endpointDrag"); + _jsPlumb.setConnectionBeingDragged(true); + + // if we're not full but there was a connection, make it null. we'll create a new one. + if (jpc && !this.isFull() && this.isSource) { + jpc = null; + } + + _jsPlumb.updateOffset({ elId: this.elementId }); + +// ---------------- make the element we will drag around, and position it ----------------------------- + + var ipco = this._jsPlumb.instance.getOffset(this.canvas), + canvasElement = this.canvas, + ips = this._jsPlumb.instance.getSize(this.canvas); + + _makeDraggablePlaceholder(placeholderInfo, _jsPlumb, ipco, ips); + + // store the id of the dragging div and the source element. the drop function will pick these up. + _jsPlumb.setAttributes(this.canvas, { + "dragId": placeholderInfo.id, + "elId": this.elementId + }); + +// ------------------- create an endpoint that will be our floating endpoint ------------------------------------ + + var endpointToFloat = this.dragProxy || this.endpoint; + if (this.dragProxy == null && this.connectionType != null) { + var aae = this._jsPlumb.instance.deriveEndpointAndAnchorSpec(this.connectionType); + if (aae.endpoints[1]) { + endpointToFloat = aae.endpoints[1]; + } + } + var centerAnchor = this._jsPlumb.instance.makeAnchor("Center"); + centerAnchor.isFloating = true; + this._jsPlumb.floatingEndpoint = _makeFloatingEndpoint(this.getPaintStyle(), centerAnchor, endpointToFloat, this.canvas, placeholderInfo.element, _jsPlumb, _newEndpoint, this.scope); + var _savedAnchor = this._jsPlumb.floatingEndpoint.anchor; + + + if (jpc == null) { + + this.setHover(false, false); + // create a connection. one end is this endpoint, the other is a floating endpoint. + jpc = _newConnection({ + sourceEndpoint: this, + targetEndpoint: this._jsPlumb.floatingEndpoint, + source: this.element, // for makeSource with parent option. ensure source element is represented correctly. + target: placeholderInfo.element, + anchors: [ this.anchor, this._jsPlumb.floatingEndpoint.anchor ], + paintStyle: params.connectorStyle, // this can be null. Connection will use the default. + hoverPaintStyle: params.connectorHoverStyle, + connector: params.connector, // this can also be null. Connection will use the default. + overlays: params.connectorOverlays, + type: this.connectionType, + cssClass: this.connectorClass, + hoverClass: this.connectorHoverClass, + scope:params.scope, + data:beforeDrag + }); + jpc.pending = true; + jpc.addClass(_jsPlumb.draggingClass); + this._jsPlumb.floatingEndpoint.addClass(_jsPlumb.draggingClass); + this._jsPlumb.floatingEndpoint.anchor = _savedAnchor; + // fire an event that informs that a connection is being dragged + _jsPlumb.fire("connectionDrag", jpc); + + // register the new connection on the drag manager. This connection, at this point, is 'pending', + // and has as its target a temporary element (the 'placeholder'). If the connection subsequently + // becomes established, the anchor manager is informed that the target of the connection has + // changed. + + _jsPlumb.anchorManager.newConnection(jpc); + + } else { + existingJpc = true; + jpc.setHover(false); + // new anchor idx + var anchorIdx = jpc.endpoints[0].id === this.id ? 0 : 1; + this.detachFromConnection(jpc, null, true); // detach from the connection while dragging is occurring. but dont cleanup automatically. + + // store the original scope (issue 57) + var dragScope = _jsPlumb.getDragScope(canvasElement); + _jsPlumb.setAttribute(this.canvas, "originalScope", dragScope); + + // fire an event that informs that a connection is being dragged. we do this before + // replacing the original target with the floating element info. + _jsPlumb.fire("connectionDrag", jpc); + + // now we replace ourselves with the temporary div we created above: + if (anchorIdx === 0) { + existingJpcParams = [ jpc.source, jpc.sourceId, canvasElement, dragScope ]; + _jsPlumb.anchorManager.sourceChanged(jpc.endpoints[anchorIdx].elementId, placeholderInfo.id, jpc, placeholderInfo.element); + + } else { + existingJpcParams = [ jpc.target, jpc.targetId, canvasElement, dragScope ]; + jpc.target = placeholderInfo.element; + jpc.targetId = placeholderInfo.id; + + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.endpoints[anchorIdx].elementId, jpc.targetId, jpc); + } + + // store the original endpoint and assign the new floating endpoint for the drag. + jpc.suspendedEndpoint = jpc.endpoints[anchorIdx]; + + // PROVIDE THE SUSPENDED ELEMENT, BE IT A SOURCE OR TARGET (ISSUE 39) + jpc.suspendedElement = jpc.endpoints[anchorIdx].getElement(); + jpc.suspendedElementId = jpc.endpoints[anchorIdx].elementId; + jpc.suspendedElementType = anchorIdx === 0 ? "source" : "target"; + + jpc.suspendedEndpoint.setHover(false); + this._jsPlumb.floatingEndpoint.referenceEndpoint = jpc.suspendedEndpoint; + jpc.endpoints[anchorIdx] = this._jsPlumb.floatingEndpoint; + + jpc.addClass(_jsPlumb.draggingClass); + this._jsPlumb.floatingEndpoint.addClass(_jsPlumb.draggingClass); + } + + _jsPlumb.registerFloatingConnection(placeholderInfo, jpc, this._jsPlumb.floatingEndpoint); + + // // register it and register connection on it. + // _jsPlumb.floatingConnections[placeholderInfo.id] = jpc; + // + // // only register for the target endpoint; we will not be dragging the source at any time + // // before this connection is either discarded or made into a permanent connection. + // _ju.addToList(params.endpointsByElement, placeholderInfo.id, this._jsPlumb.floatingEndpoint); + + + // tell jsplumb about it + _jsPlumb.currentlyDragging = true; + }.bind(this); + + var stop = function () { + _jsPlumb.setConnectionBeingDragged(false); + + if (jpc && jpc.endpoints != null) { + // get the actual drop event (decode from library args to stop function) + var originalEvent = _jsPlumb.getDropEvent(arguments); + // unlock the other endpoint (if it is dynamic, it would have been locked at drag start) + var idx = _jsPlumb.getFloatingAnchorIndex(jpc); + jpc.endpoints[idx === 0 ? 1 : 0].anchor.unlock(); + // TODO: Dont want to know about css classes inside jsplumb, ideally. + jpc.removeClass(_jsPlumb.draggingClass); + + // if we have the floating endpoint then the connection has not been dropped + // on another endpoint. If it is a new connection we throw it away. If it is an + // existing connection we check to see if we should reattach it, throwing it away + // if not. + if (this._jsPlumb && (jpc.deleteConnectionNow || jpc.endpoints[idx] === this._jsPlumb.floatingEndpoint)) { + // 6a. if the connection was an existing one... + if (existingJpc && jpc.suspendedEndpoint) { + // fix for issue35, thanks Sylvain Gizard: when firing the detach event make sure the + // floating endpoint has been replaced. + if (idx === 0) { + jpc.floatingElement = jpc.source; + jpc.floatingId = jpc.sourceId; + jpc.floatingEndpoint = jpc.endpoints[0]; + jpc.floatingIndex = 0; + jpc.source = existingJpcParams[0]; + jpc.sourceId = existingJpcParams[1]; + } else { + // keep a copy of the floating element; the anchor manager will want to clean up. + jpc.floatingElement = jpc.target; + jpc.floatingId = jpc.targetId; + jpc.floatingEndpoint = jpc.endpoints[1]; + jpc.floatingIndex = 1; + jpc.target = existingJpcParams[0]; + jpc.targetId = existingJpcParams[1]; + } + + var fe = this._jsPlumb.floatingEndpoint; // store for later removal. + // restore the original scope (issue 57) + _jsPlumb.setDragScope(existingJpcParams[2], existingJpcParams[3]); + jpc.endpoints[idx] = jpc.suspendedEndpoint; + // if the connection should be reattached, or the other endpoint refuses detach, then + // reset the connection to its original state + if (jpc.isReattach() || jpc._forceReattach || jpc._forceDetach || !_jsPlumb.deleteConnection(jpc, {originalEvent: originalEvent})) { + + jpc.setHover(false); + jpc._forceDetach = null; + jpc._forceReattach = null; + this._jsPlumb.floatingEndpoint.detachFromConnection(jpc); + jpc.suspendedEndpoint.addConnection(jpc); + + // TODO this code is duplicated in lots of places...and there is nothing external + // in the code; it all refers to the connection itself. we could add a + // `checkSanity(connection)` method to anchorManager that did this. + if (idx === 1) { + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.floatingId, jpc.targetId, jpc); + } + else { + _jsPlumb.anchorManager.sourceChanged(jpc.floatingId, jpc.sourceId, jpc, jpc.source); + } + + _jsPlumb.repaint(existingJpcParams[1]); + } + else { + _jsPlumb.deleteObject({endpoint: fe}); + } + } + } + + // makeTargets sets this flag, to tell us we have been replaced and should delete this object. + if (this.deleteAfterDragStop) { + _jsPlumb.deleteObject({endpoint: this}); + } + else { + if (this._jsPlumb) { + this.paint({recalc: false}); + } + } + + // although the connection is no longer valid, there are use cases where this is useful. + _jsPlumb.fire("connectionDragStop", jpc, originalEvent); + // fire this event to give people more fine-grained control (connectionDragStop fires a lot) + if (jpc.pending) { + _jsPlumb.fire("connectionAborted", jpc, originalEvent); + } + // tell jsplumb that dragging is finished. + _jsPlumb.currentlyDragging = false; + jpc.suspendedElement = null; + jpc.suspendedEndpoint = null; + jpc = null; + } + + // if no endpoints, jpc already cleaned up. but still we want to ensure we're reset properly. + // remove the element associated with the floating endpoint + // (and its associated floating endpoint and visual artefacts) + if (placeholderInfo && placeholderInfo.element) { + _jsPlumb.remove(placeholderInfo.element, false, false); + } + // remove the inplace copy + if (inPlaceCopy) { + _jsPlumb.deleteObject({endpoint: inPlaceCopy}); + } + + if (this._jsPlumb) { + // make our canvas visible (TODO: hand off to library; we should not know about DOM) + this.canvas.style.visibility = "visible"; + // unlock our anchor + this.anchor.unlock(); + // clear floating anchor. + this._jsPlumb.floatingEndpoint = null; + } + + }.bind(this); + + dragOptions = _jp.extend(defaultOpts, dragOptions); + dragOptions.scope = this.scope || dragOptions.scope; + dragOptions[beforeStartEvent] = _ju.wrap(dragOptions[beforeStartEvent], beforeStart, false); + dragOptions[startEvent] = _ju.wrap(dragOptions[startEvent], start, false); + // extracted drag handler function so can be used by makeSource + dragOptions[dragEvent] = _ju.wrap(dragOptions[dragEvent], _dragHandler.drag); + dragOptions[stopEvent] = _ju.wrap(dragOptions[stopEvent], stop); + dragOptions.multipleDrop = false; + + dragOptions.canDrag = function () { + return this.isSource || this.isTemporarySource || (this.connections.length > 0 && this.connectionsDetachable !== false); + }.bind(this); + + _jsPlumb.initDraggable(this.canvas, dragOptions, "internal"); + + this.canvas._jsPlumbRelatedElement = this.element; + + draggingInitialised = true; + } + }; + + var ep = params.endpoint || this._jsPlumb.instance.Defaults.Endpoint || _jp.Defaults.Endpoint; + this.setEndpoint(ep, true); + var anchorParamsToUse = params.anchor ? params.anchor : params.anchors ? params.anchors : (_jsPlumb.Defaults.Anchor || "Top"); + this.setAnchor(anchorParamsToUse, true); + + // finally, set type if it was provided + var type = [ "default", (params.type || "")].join(" "); + this.addType(type, params.data, true); + this.canvas = this.endpoint.canvas; + this.canvas._jsPlumb = this; + + this.initDraggable(); + + // pulled this out into a function so we can reuse it for the inPlaceCopy canvas; you can now drop detached connections + // back onto the endpoint you detached it from. + var _initDropTarget = function (canvas, isTransient, endpoint, referenceEndpoint) { + + if (_jp.isDropSupported(this.element)) { + var dropOptions = params.dropOptions || _jsPlumb.Defaults.DropOptions || _jp.Defaults.DropOptions; + dropOptions = _jp.extend({}, dropOptions); + dropOptions.scope = dropOptions.scope || this.scope; + var dropEvent = _jp.dragEvents.drop, + overEvent = _jp.dragEvents.over, + outEvent = _jp.dragEvents.out, + _ep = this, + drop = _jsPlumb.EndpointDropHandler({ + getEndpoint: function () { + return _ep; + }, + jsPlumb: _jsPlumb, + enabled: function () { + return endpoint != null ? endpoint.isEnabled() : true; + }, + isFull: function () { + return endpoint.isFull(); + }, + element: this.element, + elementId: this.elementId, + isSource: this.isSource, + isTarget: this.isTarget, + addClass: function (clazz) { + _ep.addClass(clazz); + }, + removeClass: function (clazz) { + _ep.removeClass(clazz); + }, + isDropAllowed: function () { + return _ep.isDropAllowed.apply(_ep, arguments); + }, + reference:referenceEndpoint, + isRedrop:function(jpc, dhParams) { + return jpc.suspendedEndpoint && dhParams.reference && (jpc.suspendedEndpoint.id === dhParams.reference.id); + } + }); + + dropOptions[dropEvent] = _ju.wrap(dropOptions[dropEvent], drop, true); + dropOptions[overEvent] = _ju.wrap(dropOptions[overEvent], function () { + var draggable = _jp.getDragObject(arguments), + id = _jsPlumb.getAttribute(_jp.getElement(draggable), "dragId"), + _jpc = _jsPlumb.getFloatingConnectionFor(id);//_jsPlumb.floatingConnections[id]; + + if (_jpc != null) { + var idx = _jsPlumb.getFloatingAnchorIndex(_jpc); + // here we should fire the 'over' event if we are a target and this is a new connection, + // or we are the same as the floating endpoint. + var _cont = (this.isTarget && idx !== 0) || (_jpc.suspendedEndpoint && this.referenceEndpoint && this.referenceEndpoint.id === _jpc.suspendedEndpoint.id); + if (_cont) { + var bb = _jsPlumb.checkCondition("checkDropAllowed", { + sourceEndpoint: _jpc.endpoints[idx], + targetEndpoint: this, + connection: _jpc + }); + this[(bb ? "add" : "remove") + "Class"](_jsPlumb.endpointDropAllowedClass); + this[(bb ? "remove" : "add") + "Class"](_jsPlumb.endpointDropForbiddenClass); + _jpc.endpoints[idx].anchor.over(this.anchor, this); + } + } + }.bind(this)); + + dropOptions[outEvent] = _ju.wrap(dropOptions[outEvent], function () { + var draggable = _jp.getDragObject(arguments), + id = draggable == null ? null : _jsPlumb.getAttribute(_jp.getElement(draggable), "dragId"), + _jpc = id ? _jsPlumb.getFloatingConnectionFor(id) : null; + + if (_jpc != null) { + var idx = _jsPlumb.getFloatingAnchorIndex(_jpc); + var _cont = (this.isTarget && idx !== 0) || (_jpc.suspendedEndpoint && this.referenceEndpoint && this.referenceEndpoint.id === _jpc.suspendedEndpoint.id); + if (_cont) { + this.removeClass(_jsPlumb.endpointDropAllowedClass); + this.removeClass(_jsPlumb.endpointDropForbiddenClass); + _jpc.endpoints[idx].anchor.out(); + } + } + }.bind(this)); + + _jsPlumb.initDroppable(canvas, dropOptions, "internal", isTransient); + } + }.bind(this); + + // Initialise the endpoint's canvas as a drop target. The drop handler will take care of the logic of whether + // something can actually be dropped. + if (!this.anchor.isFloating) { + _initDropTarget(this.canvas, !(params._transient || this.anchor.isFloating), this, params.reference); + } + + return this; + }; + + _ju.extend(_jp.Endpoint, _jp.OverlayCapableJsPlumbUIComponent, { + + setVisible: function (v, doNotChangeConnections, doNotNotifyOtherEndpoint) { + this._jsPlumb.visible = v; + if (this.canvas) { + this.canvas.style.display = v ? "block" : "none"; + } + this[v ? "showOverlays" : "hideOverlays"](); + if (!doNotChangeConnections) { + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].setVisible(v); + if (!doNotNotifyOtherEndpoint) { + var oIdx = this === this.connections[i].endpoints[0] ? 1 : 0; + // only change the other endpoint if this is its only connection. + if (this.connections[i].endpoints[oIdx].connections.length === 1) { + this.connections[i].endpoints[oIdx].setVisible(v, true, true); + } + } + } + } + }, + getAttachedElements: function () { + return this.connections; + }, + applyType: function (t, doNotRepaint) { + this.setPaintStyle(t.endpointStyle || t.paintStyle, doNotRepaint); + this.setHoverPaintStyle(t.endpointHoverStyle || t.hoverPaintStyle, doNotRepaint); + if (t.maxConnections != null) { + this._jsPlumb.maxConnections = t.maxConnections; + } + if (t.scope) { + this.scope = t.scope; + } + _jp.extend(this, t, typeParameters); + if (t.cssClass != null && this.canvas) { + this._jsPlumb.instance.addClass(this.canvas, t.cssClass); + } + _jp.OverlayCapableJsPlumbUIComponent.applyType(this, t); + }, + isEnabled: function () { + return this._jsPlumb.enabled; + }, + setEnabled: function (e) { + this._jsPlumb.enabled = e; + }, + cleanup: function () { + var anchorClass = this._jsPlumb.instance.endpointAnchorClassPrefix + (this._jsPlumb.currentAnchorClass ? "-" + this._jsPlumb.currentAnchorClass : ""); + _jp.removeClass(this.element, anchorClass); + this.anchor = null; + this.endpoint.cleanup(true); + this.endpoint.destroy(); + this.endpoint = null; + // drag/drop + this._jsPlumb.instance.destroyDraggable(this.canvas, "internal"); + this._jsPlumb.instance.destroyDroppable(this.canvas, "internal"); + }, + setHover: function (h) { + if (this.endpoint && this._jsPlumb && !this._jsPlumb.instance.isConnectionBeingDragged()) { + this.endpoint.setHover(h); + } + }, + isFull: function () { + return this._jsPlumb.maxConnections === 0 ? true : !(this.isFloating() || this._jsPlumb.maxConnections < 0 || this.connections.length < this._jsPlumb.maxConnections); + }, + /** + * private but needs to be exposed. + */ + isFloating: function () { + return this.anchor != null && this.anchor.isFloating; + }, + isConnectedTo: function (endpoint) { + var found = false; + if (endpoint) { + for (var i = 0; i < this.connections.length; i++) { + if (this.connections[i].endpoints[1] === endpoint || this.connections[i].endpoints[0] === endpoint) { + found = true; + break; + } + } + } + return found; + }, + getConnectionCost: function () { + return this._jsPlumb.connectionCost; + }, + setConnectionCost: function (c) { + this._jsPlumb.connectionCost = c; + }, + areConnectionsDirected: function () { + return this._jsPlumb.connectionsDirected; + }, + setConnectionsDirected: function (b) { + this._jsPlumb.connectionsDirected = b; + }, + setElementId: function (_elId) { + this.elementId = _elId; + this.anchor.elementId = _elId; + }, + setReferenceElement: function (_el) { + this.element = _jp.getElement(_el); + }, + setDragAllowedWhenFull: function (allowed) { + this.dragAllowedWhenFull = allowed; + }, + equals: function (endpoint) { + return this.anchor.equals(endpoint.anchor); + }, + getUuid: function () { + return this._jsPlumb.uuid; + }, + computeAnchor: function (params) { + return this.anchor.compute(params); + } + }); + + root.jsPlumbInstance.prototype.EndpointDropHandler = function (dhParams) { + return function (e) { + + var _jsPlumb = dhParams.jsPlumb; + + // remove the classes that are added dynamically. drop is neither forbidden nor allowed now that + // the drop is finishing. + dhParams.removeClass(_jsPlumb.endpointDropAllowedClass); + dhParams.removeClass(_jsPlumb.endpointDropForbiddenClass); + + var originalEvent = _jsPlumb.getDropEvent(arguments), + draggable = _jsPlumb.getDragObject(arguments), + id = _jsPlumb.getAttribute(draggable, "dragId"), + elId = _jsPlumb.getAttribute(draggable, "elId"), + scope = _jsPlumb.getAttribute(draggable, "originalScope"), + jpc = _jsPlumb.getFloatingConnectionFor(id); + + // if no active connection, bail. + if (jpc == null) { + return; + } + + // calculate if this is an existing connection. + var existingConnection = jpc.suspendedEndpoint != null; + + // if suspended endpoint exists but has been cleaned up, bail. This means it's an existing connection + // that has been detached and will shortly be discarded. + if (existingConnection && jpc.suspendedEndpoint._jsPlumb == null) { + return; + } + + // get the drop endpoint. for a normal connection this is just the one that would replace the currently + // floating endpoint. for a makeTarget this is a new endpoint that is created on drop. But we leave that to + // the handler to figure out. + var _ep = dhParams.getEndpoint(jpc); + + // If we're not given an endpoint to use, bail. + if (_ep == null) { + return; + } + + // if this is a drop back where the connection came from, mark it force reattach and + // return; the stop handler will reattach. without firing an event. + if (dhParams.isRedrop(jpc, dhParams)) { + jpc._forceReattach = true; + jpc.setHover(false); + if (dhParams.maybeCleanup) { + dhParams.maybeCleanup(_ep); + } + return; + } + + // ensure we dont bother trying to drop sources on non-source eps, and same for target. + var idx = _jsPlumb.getFloatingAnchorIndex(jpc); + if ((idx === 0 && !dhParams.isSource)|| (idx === 1 && !dhParams.isTarget)){ + if (dhParams.maybeCleanup) { + dhParams.maybeCleanup(_ep); + } + return; + } + + if (dhParams.onDrop) { + dhParams.onDrop(jpc); + } + + // restore the original scope if necessary (issue 57) + if (scope) { + _jsPlumb.setDragScope(draggable, scope); + } + + // if the target of the drop is full, fire an event (we abort below) + // makeTarget: keep. + var isFull = dhParams.isFull(e); + if (isFull) { + _ep.fire("maxConnections", { + endpoint: this, + connection: jpc, + maxConnections: _ep._jsPlumb.maxConnections + }, originalEvent); + } + // + // if endpoint enabled, not full, and matches the index of the floating endpoint... + if (!isFull && dhParams.enabled()) { + var _doContinue = true; + + // before testing for beforeDrop, reset the connection's source/target to be the actual DOM elements + // involved (that is, stash any temporary stuff used for dragging. but we need to keep it around in + // order that the anchor manager can clean things up properly). + if (idx === 0) { + jpc.floatingElement = jpc.source; + jpc.floatingId = jpc.sourceId; + jpc.floatingEndpoint = jpc.endpoints[0]; + jpc.floatingIndex = 0; + jpc.source = dhParams.element; + jpc.sourceId = _jsPlumb.getId(dhParams.element); + } else { + jpc.floatingElement = jpc.target; + jpc.floatingId = jpc.targetId; + jpc.floatingEndpoint = jpc.endpoints[1]; + jpc.floatingIndex = 1; + jpc.target = dhParams.element; + jpc.targetId = _jsPlumb.getId(dhParams.element); + } + + // if this is an existing connection and detach is not allowed we won't continue. The connection's + // endpoints have been reinstated; everything is back to how it was. + if (existingConnection && jpc.suspendedEndpoint.id !== _ep.id) { + if (!jpc.isDetachAllowed(jpc) || !jpc.endpoints[idx].isDetachAllowed(jpc) || !jpc.suspendedEndpoint.isDetachAllowed(jpc) || !_jsPlumb.checkCondition("beforeDetach", jpc)) { + _doContinue = false; + } + } + +// ------------ wrap the execution path in a function so we can support asynchronous beforeDrop + + var continueFunction = function (optionalData) { + // remove this jpc from the current endpoint, which is a floating endpoint that we will + // subsequently discard. + jpc.endpoints[idx].detachFromConnection(jpc); + + // if there's a suspended endpoint, detach it from the connection. + if (jpc.suspendedEndpoint) { + jpc.suspendedEndpoint.detachFromConnection(jpc); + } + + jpc.endpoints[idx] = _ep; + _ep.addConnection(jpc); + + // copy our parameters in to the connection: + var params = _ep.getParameters(); + for (var aParam in params) { + jpc.setParameter(aParam, params[aParam]); + } + + if (!existingConnection) { + // if not an existing connection and + if (params.draggable) { + _jsPlumb.initDraggable(this.element, dhParams.dragOptions, "internal", _jsPlumb); + } + } + else { + var suspendedElementId = jpc.suspendedEndpoint.elementId; + _jsPlumb.fireMoveEvent({ + index: idx, + originalSourceId: idx === 0 ? suspendedElementId : jpc.sourceId, + newSourceId: idx === 0 ? _ep.elementId : jpc.sourceId, + originalTargetId: idx === 1 ? suspendedElementId : jpc.targetId, + newTargetId: idx === 1 ? _ep.elementId : jpc.targetId, + originalSourceEndpoint: idx === 0 ? jpc.suspendedEndpoint : jpc.endpoints[0], + newSourceEndpoint: idx === 0 ? _ep : jpc.endpoints[0], + originalTargetEndpoint: idx === 1 ? jpc.suspendedEndpoint : jpc.endpoints[1], + newTargetEndpoint: idx === 1 ? _ep : jpc.endpoints[1], + connection: jpc + }, originalEvent); + } + + if (idx === 1) { + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.floatingId, jpc.targetId, jpc); + } + else { + _jsPlumb.anchorManager.sourceChanged(jpc.floatingId, jpc.sourceId, jpc, jpc.source); + } + + // when makeSource has uniqueEndpoint:true, we want to create connections with new endpoints + // that are subsequently deleted. So makeSource sets `finalEndpoint`, which is the Endpoint to + // which the connection should be attached. The `detachFromConnection` call below results in the + // temporary endpoint being cleaned up. + if (jpc.endpoints[0].finalEndpoint) { + var _toDelete = jpc.endpoints[0]; + _toDelete.detachFromConnection(jpc); + jpc.endpoints[0] = jpc.endpoints[0].finalEndpoint; + jpc.endpoints[0].addConnection(jpc); + } + + // if optionalData was given, merge it onto the connection's data. + if (_ju.isObject(optionalData)) { + jpc.mergeData(optionalData); + } + // finalise will inform the anchor manager and also add to + // connectionsByScope if necessary. + _jsPlumb.finaliseConnection(jpc, null, originalEvent, false); + jpc.setHover(false); + + // SP continuous anchor flush + _jsPlumb.revalidate(jpc.endpoints[0].element); + + }.bind(this); + + var dontContinueFunction = function () { + // otherwise just put it back on the endpoint it was on before the drag. + if (jpc.suspendedEndpoint) { + jpc.endpoints[idx] = jpc.suspendedEndpoint; + jpc.setHover(false); + jpc._forceDetach = true; + if (idx === 0) { + jpc.source = jpc.suspendedEndpoint.element; + jpc.sourceId = jpc.suspendedEndpoint.elementId; + } else { + jpc.target = jpc.suspendedEndpoint.element; + jpc.targetId = jpc.suspendedEndpoint.elementId; + } + jpc.suspendedEndpoint.addConnection(jpc); + + // TODO checkSanity + if (idx === 1) { + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.floatingId, jpc.targetId, jpc); + } + else { + _jsPlumb.anchorManager.sourceChanged(jpc.floatingId, jpc.sourceId, jpc, jpc.source); + } + + _jsPlumb.repaint(jpc.sourceId); + jpc._forceDetach = false; + } + }; + +// -------------------------------------- + // now check beforeDrop. this will be available only on Endpoints that are setup to + // have a beforeDrop condition (although, secretly, under the hood all Endpoints and + // the Connection have them, because they are on jsPlumbUIComponent. shhh!), because + // it only makes sense to have it on a target endpoint. + _doContinue = _doContinue && dhParams.isDropAllowed(jpc.sourceId, jpc.targetId, jpc.scope, jpc, _ep);// && jpc.pending; + + if (_doContinue) { + continueFunction(_doContinue); + return true; + } + else { + dontContinueFunction(); + } + } + + if (dhParams.maybeCleanup) { + dhParams.maybeCleanup(_ep); + } + + _jsPlumb.currentlyDragging = false; + }; + }; +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the code for Connections. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, + _jp = root.jsPlumb, + _ju = root.jsPlumbUtil; + + var makeConnector = function (_jsPlumb, renderMode, connectorName, connectorArgs, forComponent) { + // first make sure we have a cache for the specified renderer + _jp.Connectors[renderMode] = _jp.Connectors[renderMode] || {}; + + // now see if the one we want exists; if not we will try to make it + if (_jp.Connectors[renderMode][connectorName] == null) { + + if (_jp.Connectors[connectorName] == null) { + if (!_jsPlumb.Defaults.DoNotThrowErrors) { + throw new TypeError("jsPlumb: unknown connector type '" + connectorName + "'"); + } else { + return null; + } + } + + _jp.Connectors[renderMode][connectorName] = function() { + _jp.Connectors[connectorName].apply(this, arguments); + _jp.ConnectorRenderers[renderMode].apply(this, arguments); + }; + + _ju.extend(_jp.Connectors[renderMode][connectorName], [ _jp.Connectors[connectorName], _jp.ConnectorRenderers[renderMode]]); + + } + + return new _jp.Connectors[renderMode][connectorName](connectorArgs, forComponent); + }, + _makeAnchor = function (anchorParams, elementId, _jsPlumb) { + return (anchorParams) ? _jsPlumb.makeAnchor(anchorParams, elementId, _jsPlumb) : null; + }, + _updateConnectedClass = function (conn, element, _jsPlumb, remove) { + if (element != null) { + element._jsPlumbConnections = element._jsPlumbConnections || {}; + if (remove) { + delete element._jsPlumbConnections[conn.id]; + } + else { + element._jsPlumbConnections[conn.id] = true; + } + + if (_ju.isEmpty(element._jsPlumbConnections)) { + _jsPlumb.removeClass(element, _jsPlumb.connectedClass); + } + else { + _jsPlumb.addClass(element, _jsPlumb.connectedClass); + } + } + }; + + _jp.Connection = function (params) { + var _newEndpoint = params.newEndpoint; + + this.id = params.id; + this.connector = null; + this.idPrefix = "_jsplumb_c_"; + this.defaultLabelLocation = 0.5; + this.defaultOverlayKeys = ["Overlays", "ConnectionOverlays"]; + // if a new connection is the result of moving some existing connection, params.previousConnection + // will have that Connection in it. listeners for the jsPlumbConnection event can look for that + // member and take action if they need to. + this.previousConnection = params.previousConnection; + this.source = _jp.getElement(params.source); + this.target = _jp.getElement(params.target); + + + _jp.OverlayCapableJsPlumbUIComponent.apply(this, arguments); + + // sourceEndpoint and targetEndpoint override source/target, if they are present. but + // source is not overridden if the Endpoint has declared it is not the final target of a connection; + // instead we use the source that the Endpoint declares will be the final source element. + if (params.sourceEndpoint) { + this.source = params.sourceEndpoint.getElement(); + this.sourceId = params.sourceEndpoint.elementId; + } else { + this.sourceId = this._jsPlumb.instance.getId(this.source); + } + + if (params.targetEndpoint) { + this.target = params.targetEndpoint.getElement(); + this.targetId = params.targetEndpoint.elementId; + } else { + this.targetId = this._jsPlumb.instance.getId(this.target); + } + + + this.scope = params.scope; // scope may have been passed in to the connect call. if it wasn't, we will pull it from the source endpoint, after having initialised the endpoints. + this.endpoints = []; + this.endpointStyles = []; + + var _jsPlumb = this._jsPlumb.instance; + + _jsPlumb.manage(this.sourceId, this.source); + _jsPlumb.manage(this.targetId, this.target); + + this._jsPlumb.visible = true; + + this._jsPlumb.params = { + cssClass: params.cssClass, + container: params.container, + "pointer-events": params["pointer-events"], + editorParams: params.editorParams, + overlays: params.overlays + }; + this._jsPlumb.lastPaintedAt = null; + + // listen to mouseover and mouseout events passed from the container delegate. + this.bind("mouseover", function () { + this.setHover(true); + }.bind(this)); + this.bind("mouseout", function () { + this.setHover(false); + }.bind(this)); + + +// INITIALISATION CODE + + this.makeEndpoint = function (isSource, el, elId, ep, definition) { + elId = elId || this._jsPlumb.instance.getId(el); + return this.prepareEndpoint(_jsPlumb, _newEndpoint, this, ep, isSource ? 0 : 1, params, el, elId, definition); + }; + + // if type given, get the endpoint definitions mapping to that type from the jsplumb instance, and use those. + // we apply types at the end of this constructor but endpoints are only honoured in a type definition at + // create time. + if (params.type) { + params.endpoints = params.endpoints || this._jsPlumb.instance.deriveEndpointAndAnchorSpec(params.type).endpoints; + } + + var eS = this.makeEndpoint(true, this.source, this.sourceId, params.sourceEndpoint), + eT = this.makeEndpoint(false, this.target, this.targetId, params.targetEndpoint); + + if (eS) { + _ju.addToList(params.endpointsByElement, this.sourceId, eS); + } + if (eT) { + _ju.addToList(params.endpointsByElement, this.targetId, eT); + } + // if scope not set, set it to be the scope for the source endpoint. + if (!this.scope) { + this.scope = this.endpoints[0].scope; + } + + // if explicitly told to (or not to) delete endpoints when empty, override endpoint's preferences + if (params.deleteEndpointsOnEmpty != null) { + this.endpoints[0].setDeleteOnEmpty(params.deleteEndpointsOnEmpty); + this.endpoints[1].setDeleteOnEmpty(params.deleteEndpointsOnEmpty); + } + +// -------------------------- DEFAULT TYPE --------------------------------------------- + + // DETACHABLE + var _detachable = _jsPlumb.Defaults.ConnectionsDetachable; + if (params.detachable === false) { + _detachable = false; + } + if (this.endpoints[0].connectionsDetachable === false) { + _detachable = false; + } + if (this.endpoints[1].connectionsDetachable === false) { + _detachable = false; + } + // REATTACH + var _reattach = params.reattach || this.endpoints[0].reattachConnections || this.endpoints[1].reattachConnections || _jsPlumb.Defaults.ReattachConnections; + + this.appendToDefaultType({ + detachable: _detachable, + reattach: _reattach, + paintStyle:this.endpoints[0].connectorStyle || this.endpoints[1].connectorStyle || params.paintStyle || _jsPlumb.Defaults.PaintStyle || _jp.Defaults.PaintStyle, + hoverPaintStyle:this.endpoints[0].connectorHoverStyle || this.endpoints[1].connectorHoverStyle || params.hoverPaintStyle || _jsPlumb.Defaults.HoverPaintStyle || _jp.Defaults.HoverPaintStyle + }); + + var _suspendedAt = _jsPlumb.getSuspendedAt(); + if (!_jsPlumb.isSuspendDrawing()) { + // paint the endpoints + var myInfo = _jsPlumb.getCachedData(this.sourceId), + myOffset = myInfo.o, myWH = myInfo.s, + otherInfo = _jsPlumb.getCachedData(this.targetId), + otherOffset = otherInfo.o, + otherWH = otherInfo.s, + initialTimestamp = _suspendedAt || _jsPlumb.timestamp(), + anchorLoc = this.endpoints[0].anchor.compute({ + xy: [ myOffset.left, myOffset.top ], wh: myWH, element: this.endpoints[0], + elementId: this.endpoints[0].elementId, + txy: [ otherOffset.left, otherOffset.top ], twh: otherWH, tElement: this.endpoints[1], + timestamp: initialTimestamp + }); + + this.endpoints[0].paint({ anchorLoc: anchorLoc, timestamp: initialTimestamp }); + + anchorLoc = this.endpoints[1].anchor.compute({ + xy: [ otherOffset.left, otherOffset.top ], wh: otherWH, element: this.endpoints[1], + elementId: this.endpoints[1].elementId, + txy: [ myOffset.left, myOffset.top ], twh: myWH, tElement: this.endpoints[0], + timestamp: initialTimestamp + }); + this.endpoints[1].paint({ anchorLoc: anchorLoc, timestamp: initialTimestamp }); + } + + this.getTypeDescriptor = function () { + return "connection"; + }; + this.getAttachedElements = function () { + return this.endpoints; + }; + + this.isDetachable = function (ep) { + return this._jsPlumb.detachable === false ? false : ep != null ? ep.connectionsDetachable === true : this._jsPlumb.detachable === true; + }; + this.setDetachable = function (detachable) { + this._jsPlumb.detachable = detachable === true; + }; + this.isReattach = function () { + return this._jsPlumb.reattach === true || this.endpoints[0].reattachConnections === true || this.endpoints[1].reattachConnections === true; + }; + this.setReattach = function (reattach) { + this._jsPlumb.reattach = reattach === true; + }; + +// END INITIALISATION CODE + + +// COST + DIRECTIONALITY + // if cost not supplied, try to inherit from source endpoint + this._jsPlumb.cost = params.cost || this.endpoints[0].getConnectionCost(); + this._jsPlumb.directed = params.directed; + // inherit directed flag if set no source endpoint + if (params.directed == null) { + this._jsPlumb.directed = this.endpoints[0].areConnectionsDirected(); + } +// END COST + DIRECTIONALITY + +// PARAMETERS + // merge all the parameters objects into the connection. parameters set + // on the connection take precedence; then source endpoint params, then + // finally target endpoint params. + var _p = _jp.extend({}, this.endpoints[1].getParameters()); + _jp.extend(_p, this.endpoints[0].getParameters()); + _jp.extend(_p, this.getParameters()); + this.setParameters(_p); +// END PARAMETERS + +// PAINTING + + this.setConnector(this.endpoints[0].connector || this.endpoints[1].connector || params.connector || _jsPlumb.Defaults.Connector || _jp.Defaults.Connector, true); + var data = params.data == null || !_ju.isObject(params.data) ? {} : params.data; + this.getData = function() { return data; }; + this.setData = function(d) { data = d || {}; }; + this.mergeData = function(d) { data = _jp.extend(data, d); }; + + // the very last thing we do is apply types, if there are any. + var _types = [ "default", this.endpoints[0].connectionType, this.endpoints[1].connectionType, params.type ].join(" "); + if (/[^\s]/.test(_types)) { + this.addType(_types, params.data, true); + } + + this.updateConnectedClass(); + +// END PAINTING + }; + + _ju.extend(_jp.Connection, _jp.OverlayCapableJsPlumbUIComponent, { + applyType: function (t, doNotRepaint, typeMap) { + + var _connector = null; + if (t.connector != null) { + _connector = this.getCachedTypeItem("connector", typeMap.connector); + if (_connector == null) { + _connector = this.prepareConnector(t.connector, typeMap.connector); + this.cacheTypeItem("connector", _connector, typeMap.connector); + } + this.setPreparedConnector(_connector); + } + + // none of these things result in the creation of objects so can be ignored. + if (t.detachable != null) { + this.setDetachable(t.detachable); + } + if (t.reattach != null) { + this.setReattach(t.reattach); + } + if (t.scope) { + this.scope = t.scope; + } + + if (t.cssClass != null && this.canvas) { + this._jsPlumb.instance.addClass(this.canvas, t.cssClass); + } + + var _anchors = null; + // this also results in the creation of objects. + if (t.anchor) { + // note that even if the param was anchor, we store `anchors`. + _anchors = this.getCachedTypeItem("anchors", typeMap.anchor); + if (_anchors == null) { + _anchors = [ this._jsPlumb.instance.makeAnchor(t.anchor), this._jsPlumb.instance.makeAnchor(t.anchor) ]; + this.cacheTypeItem("anchors", _anchors, typeMap.anchor); + } + } + else if (t.anchors) { + _anchors = this.getCachedTypeItem("anchors", typeMap.anchors); + if (_anchors == null) { + _anchors = [ + this._jsPlumb.instance.makeAnchor(t.anchors[0]), + this._jsPlumb.instance.makeAnchor(t.anchors[1]) + ]; + this.cacheTypeItem("anchors", _anchors, typeMap.anchors); + } + } + if (_anchors != null) { + this.endpoints[0].anchor = _anchors[0]; + this.endpoints[1].anchor = _anchors[1]; + if (this.endpoints[1].anchor.isDynamic) { + this._jsPlumb.instance.repaint(this.endpoints[1].elementId); + } + } + + _jp.OverlayCapableJsPlumbUIComponent.applyType(this, t); + }, + addClass: function (c, informEndpoints) { + if (informEndpoints) { + this.endpoints[0].addClass(c); + this.endpoints[1].addClass(c); + if (this.suspendedEndpoint) { + this.suspendedEndpoint.addClass(c); + } + } + if (this.connector) { + this.connector.addClass(c); + } + }, + removeClass: function (c, informEndpoints) { + if (informEndpoints) { + this.endpoints[0].removeClass(c); + this.endpoints[1].removeClass(c); + if (this.suspendedEndpoint) { + this.suspendedEndpoint.removeClass(c); + } + } + if (this.connector) { + this.connector.removeClass(c); + } + }, + isVisible: function () { + return this._jsPlumb.visible; + }, + setVisible: function (v) { + this._jsPlumb.visible = v; + if (this.connector) { + this.connector.setVisible(v); + } + this.repaint(); + }, + cleanup: function () { + this.updateConnectedClass(true); + this.endpoints = null; + this.source = null; + this.target = null; + if (this.connector != null) { + this.connector.cleanup(true); + this.connector.destroy(true); + } + this.connector = null; + }, + updateConnectedClass:function(remove) { + if (this._jsPlumb) { + _updateConnectedClass(this, this.source, this._jsPlumb.instance, remove); + _updateConnectedClass(this, this.target, this._jsPlumb.instance, remove); + } + }, + setHover: function (state) { + if (this.connector && this._jsPlumb && !this._jsPlumb.instance.isConnectionBeingDragged()) { + this.connector.setHover(state); + root.jsPlumb[state ? "addClass" : "removeClass"](this.source, this._jsPlumb.instance.hoverSourceClass); + root.jsPlumb[state ? "addClass" : "removeClass"](this.target, this._jsPlumb.instance.hoverTargetClass); + } + }, + getUuids:function() { + return [ this.endpoints[0].getUuid(), this.endpoints[1].getUuid() ]; + }, + getCost: function () { + return this._jsPlumb ? this._jsPlumb.cost : -Infinity; + }, + setCost: function (c) { + this._jsPlumb.cost = c; + }, + isDirected: function () { + return this._jsPlumb.directed; + }, + getConnector: function () { + return this.connector; + }, + prepareConnector:function(connectorSpec, typeId) { + var connectorArgs = { + _jsPlumb: this._jsPlumb.instance, + cssClass: this._jsPlumb.params.cssClass, + container: this._jsPlumb.params.container, + "pointer-events": this._jsPlumb.params["pointer-events"] + }, + renderMode = this._jsPlumb.instance.getRenderMode(), + connector; + + if (_ju.isString(connectorSpec)) { + connector = makeConnector(this._jsPlumb.instance, renderMode, connectorSpec, connectorArgs, this); + } // lets you use a string as shorthand. + else if (_ju.isArray(connectorSpec)) { + if (connectorSpec.length === 1) { + connector = makeConnector(this._jsPlumb.instance, renderMode, connectorSpec[0], connectorArgs, this); + } + else { + connector = makeConnector(this._jsPlumb.instance, renderMode, connectorSpec[0], _ju.merge(connectorSpec[1], connectorArgs), this); + } + } + if (typeId != null) { + connector.typeId = typeId; + } + return connector; + }, + setPreparedConnector: function(connector, doNotRepaint, doNotChangeListenerComponent, typeId) { + + if (this.connector !== connector) { + + var previous, previousClasses = ""; + // the connector will not be cleaned up if it was set as part of a type, because `typeId` will be set on it + // and we havent passed in `true` for "force" here. + if (this.connector != null) { + previous = this.connector; + previousClasses = previous.getClass(); + this.connector.cleanup(); + this.connector.destroy(); + } + + this.connector = connector; + if (typeId) { + this.cacheTypeItem("connector", connector, typeId); + } + + this.canvas = this.connector.canvas; + this.bgCanvas = this.connector.bgCanvas; + + this.connector.reattach(this._jsPlumb.instance); + + // put classes from prior connector onto the canvas + this.addClass(previousClasses); + + // new: instead of binding listeners per connector, we now just have one delegate on the container. + // so for that handler we set the connection as the '_jsPlumb' member of the canvas element, and + // bgCanvas, if it exists, which it does right now in the VML renderer, so it won't from v 2.0.0 onwards. + if (this.canvas) { + this.canvas._jsPlumb = this; + } + if (this.bgCanvas) { + this.bgCanvas._jsPlumb = this; + } + + if (previous != null) { + var o = this.getOverlays(); + for (var i = 0; i < o.length; i++) { + if (o[i].transfer) { + o[i].transfer(this.connector); + } + } + } + + if (!doNotChangeListenerComponent) { + this.setListenerComponent(this.connector); + } + if (!doNotRepaint) { + this.repaint(); + } + } + }, + setConnector: function (connectorSpec, doNotRepaint, doNotChangeListenerComponent, typeId) { + var connector = this.prepareConnector(connectorSpec, typeId); + this.setPreparedConnector(connector, doNotRepaint, doNotChangeListenerComponent, typeId); + }, + paint: function (params) { + + if (!this._jsPlumb.instance.isSuspendDrawing() && this._jsPlumb.visible) { + params = params || {}; + var timestamp = params.timestamp, + // if the moving object is not the source we must transpose the two references. + swap = false, + tId = swap ? this.sourceId : this.targetId, sId = swap ? this.targetId : this.sourceId, + tIdx = swap ? 0 : 1, sIdx = swap ? 1 : 0; + + if (timestamp == null || timestamp !== this._jsPlumb.lastPaintedAt) { + var sourceInfo = this._jsPlumb.instance.updateOffset({elId:sId}).o, + targetInfo = this._jsPlumb.instance.updateOffset({elId:tId}).o, + sE = this.endpoints[sIdx], tE = this.endpoints[tIdx]; + + var sAnchorP = sE.anchor.getCurrentLocation({xy: [sourceInfo.left, sourceInfo.top], wh: [sourceInfo.width, sourceInfo.height], element: sE, timestamp: timestamp}), + tAnchorP = tE.anchor.getCurrentLocation({xy: [targetInfo.left, targetInfo.top], wh: [targetInfo.width, targetInfo.height], element: tE, timestamp: timestamp}); + + this.connector.resetBounds(); + + this.connector.compute({ + sourcePos: sAnchorP, + targetPos: tAnchorP, + sourceOrientation:sE.anchor.getOrientation(sE), + targetOrientation:tE.anchor.getOrientation(tE), + sourceEndpoint: this.endpoints[sIdx], + targetEndpoint: this.endpoints[tIdx], + "stroke-width": this._jsPlumb.paintStyleInUse.strokeWidth, + sourceInfo: sourceInfo, + targetInfo: targetInfo + }); + + var overlayExtents = { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity }; + + // compute overlays. we do this first so we can get their placements, and adjust the + // container if needs be (if an overlay would be clipped) + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays.hasOwnProperty(i)) { + var o = this._jsPlumb.overlays[i]; + if (o.isVisible()) { + this._jsPlumb.overlayPlacements[i] = o.draw(this.connector, this._jsPlumb.paintStyleInUse, this.getAbsoluteOverlayPosition(o)); + overlayExtents.minX = Math.min(overlayExtents.minX, this._jsPlumb.overlayPlacements[i].minX); + overlayExtents.maxX = Math.max(overlayExtents.maxX, this._jsPlumb.overlayPlacements[i].maxX); + overlayExtents.minY = Math.min(overlayExtents.minY, this._jsPlumb.overlayPlacements[i].minY); + overlayExtents.maxY = Math.max(overlayExtents.maxY, this._jsPlumb.overlayPlacements[i].maxY); + } + } + } + + var lineWidth = parseFloat(this._jsPlumb.paintStyleInUse.strokeWidth || 1) / 2, + outlineWidth = parseFloat(this._jsPlumb.paintStyleInUse.strokeWidth || 0), + extents = { + xmin: Math.min(this.connector.bounds.minX - (lineWidth + outlineWidth), overlayExtents.minX), + ymin: Math.min(this.connector.bounds.minY - (lineWidth + outlineWidth), overlayExtents.minY), + xmax: Math.max(this.connector.bounds.maxX + (lineWidth + outlineWidth), overlayExtents.maxX), + ymax: Math.max(this.connector.bounds.maxY + (lineWidth + outlineWidth), overlayExtents.maxY) + }; + // paint the connector. + this.connector.paintExtents = extents; + this.connector.paint(this._jsPlumb.paintStyleInUse, null, extents); + // and then the overlays + for (var j in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays.hasOwnProperty(j)) { + var p = this._jsPlumb.overlays[j]; + if (p.isVisible()) { + p.paint(this._jsPlumb.overlayPlacements[j], extents); + } + } + } + } + this._jsPlumb.lastPaintedAt = timestamp; + } + }, + repaint: function (params) { + var p = jsPlumb.extend(params || {}, {}); + p.elId = this.sourceId; + this.paint(p); + }, + prepareEndpoint: function (_jsPlumb, _newEndpoint, conn, existing, index, params, element, elementId, definition) { + var e; + if (existing) { + conn.endpoints[index] = existing; + existing.addConnection(conn); + } else { + if (!params.endpoints) { + params.endpoints = [ null, null ]; + } + var ep = definition || params.endpoints[index] || params.endpoint || _jsPlumb.Defaults.Endpoints[index] || _jp.Defaults.Endpoints[index] || _jsPlumb.Defaults.Endpoint || _jp.Defaults.Endpoint; + if (!params.endpointStyles) { + params.endpointStyles = [ null, null ]; + } + if (!params.endpointHoverStyles) { + params.endpointHoverStyles = [ null, null ]; + } + var es = params.endpointStyles[index] || params.endpointStyle || _jsPlumb.Defaults.EndpointStyles[index] || _jp.Defaults.EndpointStyles[index] || _jsPlumb.Defaults.EndpointStyle || _jp.Defaults.EndpointStyle; + // Endpoints derive their fill from the connector's stroke, if no fill was specified. + if (es.fill == null && params.paintStyle != null) { + es.fill = params.paintStyle.stroke; + } + + if (es.outlineStroke == null && params.paintStyle != null) { + es.outlineStroke = params.paintStyle.outlineStroke; + } + if (es.outlineWidth == null && params.paintStyle != null) { + es.outlineWidth = params.paintStyle.outlineWidth; + } + + var ehs = params.endpointHoverStyles[index] || params.endpointHoverStyle || _jsPlumb.Defaults.EndpointHoverStyles[index] || _jp.Defaults.EndpointHoverStyles[index] || _jsPlumb.Defaults.EndpointHoverStyle || _jp.Defaults.EndpointHoverStyle; + // endpoint hover fill style is derived from connector's hover stroke style + if (params.hoverPaintStyle != null) { + if (ehs == null) { + ehs = {}; + } + if (ehs.fill == null) { + ehs.fill = params.hoverPaintStyle.stroke; + } + } + var a = params.anchors ? params.anchors[index] : + params.anchor ? params.anchor : + _makeAnchor(_jsPlumb.Defaults.Anchors[index], elementId, _jsPlumb) || + _makeAnchor(_jp.Defaults.Anchors[index], elementId, _jsPlumb) || + _makeAnchor(_jsPlumb.Defaults.Anchor, elementId, _jsPlumb) || + _makeAnchor(_jp.Defaults.Anchor, elementId, _jsPlumb), + u = params.uuids ? params.uuids[index] : null; + + e = _newEndpoint({ + paintStyle: es, hoverPaintStyle: ehs, endpoint: ep, connections: [ conn ], + uuid: u, anchor: a, source: element, scope: params.scope, + reattach: params.reattach || _jsPlumb.Defaults.ReattachConnections, + detachable: params.detachable || _jsPlumb.Defaults.ConnectionsDetachable + }); + if (existing == null) { + e.setDeleteOnEmpty(true); + } + conn.endpoints[index] = e; + + if (params.drawEndpoints === false) { + e.setVisible(false, true, true); + } + + } + return e; + }, + replaceEndpoint:function(idx, endpointDef) { + + var current = this.endpoints[idx], + elId = current.elementId, + ebe = this._jsPlumb.instance.getEndpoints(elId), + _idx = ebe.indexOf(current), + _new = this.makeEndpoint(idx === 0, current.element, elId, null, endpointDef); + + this.endpoints[idx] = _new; + + ebe.splice(_idx, 1, _new); + this._jsPlumb.instance.deleteObject({endpoint:current, deleteAttachedObjects:false}); + this._jsPlumb.instance.fire("endpointReplaced", {previous:current, current:_new}); + + this._jsPlumb.instance.anchorManager.updateOtherEndpoint(this.endpoints[0].elementId, this.endpoints[1].elementId, this.endpoints[1].elementId, this); + + } + + }); // END Connection class +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the code for creating and manipulating anchors. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + + var root = this, + _ju = root.jsPlumbUtil, + _jp = root.jsPlumb; + + // + // manages anchors for all elements. + // + _jp.AnchorManager = function (params) { + var _amEndpoints = {}, + continuousAnchorLocations = {}, + continuousAnchorOrientations = {}, + connectionsByElementId = {}, + self = this, + anchorLists = {}, + jsPlumbInstance = params.jsPlumbInstance, + floatingConnections = {}, + // used by placeAnchors function + placeAnchorsOnLine = function (desc, elementDimensions, elementPosition, connections, horizontal, otherMultiplier, reverse) { + var a = [], step = elementDimensions[horizontal ? 0 : 1] / (connections.length + 1); + + for (var i = 0; i < connections.length; i++) { + var val = (i + 1) * step, other = otherMultiplier * elementDimensions[horizontal ? 1 : 0]; + if (reverse) { + val = elementDimensions[horizontal ? 0 : 1] - val; + } + + var dx = (horizontal ? val : other), x = elementPosition[0] + dx, xp = dx / elementDimensions[0], + dy = (horizontal ? other : val), y = elementPosition[1] + dy, yp = dy / elementDimensions[1]; + + a.push([ x, y, xp, yp, connections[i][1], connections[i][2] ]); + } + + return a; + }, + rightAndBottomSort = function(a, b) { + return b[0][0] - a[0][0]; + }, + // used by edgeSortFunctions + leftAndTopSort = function (a, b) { + var p1 = a[0][0] < 0 ? -Math.PI - a[0][0] : Math.PI - a[0][0], + p2 = b[0][0] < 0 ? -Math.PI - b[0][0] : Math.PI - b[0][0]; + + return p1 - p2; + }, + // used by placeAnchors + edgeSortFunctions = { + "top":leftAndTopSort, + "right": rightAndBottomSort, + "bottom": rightAndBottomSort, + "left": leftAndTopSort + }, + // used by placeAnchors + _sortHelper = function (_array, _fn) { + return _array.sort(_fn); + }, + // used by AnchorManager.redraw + placeAnchors = function (elementId, _anchorLists) { + var cd = jsPlumbInstance.getCachedData(elementId), sS = cd.s, sO = cd.o, + placeSomeAnchors = function (desc, elementDimensions, elementPosition, unsortedConnections, isHorizontal, otherMultiplier, orientation) { + if (unsortedConnections.length > 0) { + var sc = _sortHelper(unsortedConnections, edgeSortFunctions[desc]), // puts them in order based on the target element's pos on screen + reverse = desc === "right" || desc === "top", + anchors = placeAnchorsOnLine(desc, elementDimensions, + elementPosition, sc, + isHorizontal, otherMultiplier, reverse); + + // takes a computed anchor position and adjusts it for parent offset and scroll, then stores it. + var _setAnchorLocation = function (endpoint, anchorPos) { + continuousAnchorLocations[endpoint.id] = [ anchorPos[0], anchorPos[1], anchorPos[2], anchorPos[3] ]; + continuousAnchorOrientations[endpoint.id] = orientation; + }; + + for (var i = 0; i < anchors.length; i++) { + var c = anchors[i][4], weAreSource = c.endpoints[0].elementId === elementId, weAreTarget = c.endpoints[1].elementId === elementId; + if (weAreSource) { + _setAnchorLocation(c.endpoints[0], anchors[i]); + } + if (weAreTarget) { + _setAnchorLocation(c.endpoints[1], anchors[i]); + } + } + } + }; + + placeSomeAnchors("bottom", sS, [sO.left, sO.top], _anchorLists.bottom, true, 1, [0, 1]); + placeSomeAnchors("top", sS, [sO.left, sO.top], _anchorLists.top, true, 0, [0, -1]); + placeSomeAnchors("left", sS, [sO.left, sO.top], _anchorLists.left, false, 0, [-1, 0]); + placeSomeAnchors("right", sS, [sO.left, sO.top], _anchorLists.right, false, 1, [1, 0]); + }; + + this.reset = function () { + _amEndpoints = {}; + connectionsByElementId = {}; + anchorLists = {}; + }; + this.addFloatingConnection = function (key, conn) { + floatingConnections[key] = conn; + }; + this.removeFloatingConnection = function (key) { + delete floatingConnections[key]; + }; + this.newConnection = function (conn) { + var sourceId = conn.sourceId, targetId = conn.targetId, + ep = conn.endpoints, + doRegisterTarget = true, + registerConnection = function (otherIndex, otherEndpoint, otherAnchor, elId, c) { + if ((sourceId === targetId) && otherAnchor.isContinuous) { + // remove the target endpoint's canvas. we dont need it. + conn._jsPlumb.instance.removeElement(ep[1].canvas); + doRegisterTarget = false; + } + _ju.addToList(connectionsByElementId, elId, [c, otherEndpoint, otherAnchor.constructor === _jp.DynamicAnchor]); + }; + + registerConnection(0, ep[0], ep[0].anchor, targetId, conn); + if (doRegisterTarget) { + registerConnection(1, ep[1], ep[1].anchor, sourceId, conn); + } + }; + var removeEndpointFromAnchorLists = function (endpoint) { + (function (list, eId) { + if (list) { // transient anchors dont get entries in this list. + var f = function (e) { + return e[4] === eId; + }; + _ju.removeWithFunction(list.top, f); + _ju.removeWithFunction(list.left, f); + _ju.removeWithFunction(list.bottom, f); + _ju.removeWithFunction(list.right, f); + } + })(anchorLists[endpoint.elementId], endpoint.id); + }; + this.connectionDetached = function (connInfo, doNotRedraw) { + var connection = connInfo.connection || connInfo, + sourceId = connInfo.sourceId, + targetId = connInfo.targetId, + ep = connection.endpoints, + removeConnection = function (otherIndex, otherEndpoint, otherAnchor, elId, c) { + _ju.removeWithFunction(connectionsByElementId[elId], function (_c) { + return _c[0].id === c.id; + }); + }; + + removeConnection(1, ep[1], ep[1].anchor, sourceId, connection); + removeConnection(0, ep[0], ep[0].anchor, targetId, connection); + if (connection.floatingId) { + removeConnection(connection.floatingIndex, connection.floatingEndpoint, connection.floatingEndpoint.anchor, connection.floatingId, connection); + removeEndpointFromAnchorLists(connection.floatingEndpoint); + } + + // remove from anchorLists + removeEndpointFromAnchorLists(connection.endpoints[0]); + removeEndpointFromAnchorLists(connection.endpoints[1]); + + if (!doNotRedraw) { + self.redraw(connection.sourceId); + if (connection.targetId !== connection.sourceId) { + self.redraw(connection.targetId); + } + } + }; + this.add = function (endpoint, elementId) { + _ju.addToList(_amEndpoints, elementId, endpoint); + }; + this.changeId = function (oldId, newId) { + connectionsByElementId[newId] = connectionsByElementId[oldId]; + _amEndpoints[newId] = _amEndpoints[oldId]; + delete connectionsByElementId[oldId]; + delete _amEndpoints[oldId]; + }; + this.getConnectionsFor = function (elementId) { + return connectionsByElementId[elementId] || []; + }; + this.getEndpointsFor = function (elementId) { + return _amEndpoints[elementId] || []; + }; + this.deleteEndpoint = function (endpoint) { + _ju.removeWithFunction(_amEndpoints[endpoint.elementId], function (e) { + return e.id === endpoint.id; + }); + removeEndpointFromAnchorLists(endpoint); + }; + this.clearFor = function (elementId) { + delete _amEndpoints[elementId]; + _amEndpoints[elementId] = []; + }; + // updates the given anchor list by either updating an existing anchor's info, or adding it. this function + // also removes the anchor from its previous list, if the edge it is on has changed. + // all connections found along the way (those that are connected to one of the faces this function + // operates on) are added to the connsToPaint list, as are their endpoints. in this way we know to repaint + // them wthout having to calculate anything else about them. + var _updateAnchorList = function (lists, theta, order, conn, aBoolean, otherElId, idx, reverse, edgeId, elId, connsToPaint, endpointsToPaint) { + // first try to find the exact match, but keep track of the first index of a matching element id along the way.s + var exactIdx = -1, + firstMatchingElIdx = -1, + endpoint = conn.endpoints[idx], + endpointId = endpoint.id, + oIdx = [1, 0][idx], + values = [ + [ theta, order ], + conn, + aBoolean, + otherElId, + endpointId + ], + listToAddTo = lists[edgeId], + listToRemoveFrom = endpoint._continuousAnchorEdge ? lists[endpoint._continuousAnchorEdge] : null, + i, + candidate; + + if (listToRemoveFrom) { + var rIdx = _ju.findWithFunction(listToRemoveFrom, function (e) { + return e[4] === endpointId; + }); + if (rIdx !== -1) { + listToRemoveFrom.splice(rIdx, 1); + // get all connections from this list + for (i = 0; i < listToRemoveFrom.length; i++) { + candidate = listToRemoveFrom[i][1]; + _ju.addWithFunction(connsToPaint, candidate, function (c) { + return c.id === candidate.id; + }); + _ju.addWithFunction(endpointsToPaint, listToRemoveFrom[i][1].endpoints[idx], function (e) { + return e.id === candidate.endpoints[idx].id; + }); + _ju.addWithFunction(endpointsToPaint, listToRemoveFrom[i][1].endpoints[oIdx], function (e) { + return e.id === candidate.endpoints[oIdx].id; + }); + } + } + } + + for (i = 0; i < listToAddTo.length; i++) { + candidate = listToAddTo[i][1]; + if (params.idx === 1 && listToAddTo[i][3] === otherElId && firstMatchingElIdx === -1) { + firstMatchingElIdx = i; + } + _ju.addWithFunction(connsToPaint, candidate, function (c) { + return c.id === candidate.id; + }); + _ju.addWithFunction(endpointsToPaint, listToAddTo[i][1].endpoints[idx], function (e) { + return e.id === candidate.endpoints[idx].id; + }); + _ju.addWithFunction(endpointsToPaint, listToAddTo[i][1].endpoints[oIdx], function (e) { + return e.id === candidate.endpoints[oIdx].id; + }); + } + if (exactIdx !== -1) { + listToAddTo[exactIdx] = values; + } + else { + var insertIdx = reverse ? firstMatchingElIdx !== -1 ? firstMatchingElIdx : 0 : listToAddTo.length; // of course we will get this from having looked through the array shortly. + listToAddTo.splice(insertIdx, 0, values); + } + + // store this for next time. + endpoint._continuousAnchorEdge = edgeId; + }; + + // + // find the entry in an endpoint's list for this connection and update its target endpoint + // with the current target in the connection. + // This method and sourceChanged need to be folder into one. + // + this.updateOtherEndpoint = function (sourceElId, oldTargetId, newTargetId, connection) { + var sIndex = _ju.findWithFunction(connectionsByElementId[sourceElId], function (i) { + return i[0].id === connection.id; + }), + tIndex = _ju.findWithFunction(connectionsByElementId[oldTargetId], function (i) { + return i[0].id === connection.id; + }); + + // update or add data for source + if (sIndex !== -1) { + connectionsByElementId[sourceElId][sIndex][0] = connection; + connectionsByElementId[sourceElId][sIndex][1] = connection.endpoints[1]; + connectionsByElementId[sourceElId][sIndex][2] = connection.endpoints[1].anchor.constructor === _jp.DynamicAnchor; + } + + // remove entry for previous target (if there) + if (tIndex > -1) { + connectionsByElementId[oldTargetId].splice(tIndex, 1); + // add entry for new target + _ju.addToList(connectionsByElementId, newTargetId, [connection, connection.endpoints[0], connection.endpoints[0].anchor.constructor === _jp.DynamicAnchor]); + } + + connection.updateConnectedClass(); + }; + + // + // notification that the connection given has changed source from the originalId to the newId. + // This involves: + // 1. removing the connection from the list of connections stored for the originalId + // 2. updating the source information for the target of the connection + // 3. re-registering the connection in connectionsByElementId with the newId + // + this.sourceChanged = function (originalId, newId, connection, newElement) { + if (originalId !== newId) { + + connection.sourceId = newId; + connection.source = newElement; + + // remove the entry that points from the old source to the target + _ju.removeWithFunction(connectionsByElementId[originalId], function (info) { + return info[0].id === connection.id; + }); + // find entry for target and update it + var tIdx = _ju.findWithFunction(connectionsByElementId[connection.targetId], function (i) { + return i[0].id === connection.id; + }); + if (tIdx > -1) { + connectionsByElementId[connection.targetId][tIdx][0] = connection; + connectionsByElementId[connection.targetId][tIdx][1] = connection.endpoints[0]; + connectionsByElementId[connection.targetId][tIdx][2] = connection.endpoints[0].anchor.constructor === _jp.DynamicAnchor; + } + // add entry for new source + _ju.addToList(connectionsByElementId, newId, [connection, connection.endpoints[1], connection.endpoints[1].anchor.constructor === _jp.DynamicAnchor]); + + // TODO SP not final on this yet. when a user drags an existing connection and it turns into a self + // loop, then this code hides the target endpoint (by removing it from the DOM) But I think this should + // occur only if the anchor is Continuous + if (connection.endpoints[1].anchor.isContinuous) { + if (connection.source === connection.target) { + connection._jsPlumb.instance.removeElement(connection.endpoints[1].canvas); + } + else { + if (connection.endpoints[1].canvas.parentNode == null) { + connection._jsPlumb.instance.appendElement(connection.endpoints[1].canvas); + } + } + } + + connection.updateConnectedClass(); + } + }; + + // + // moves the given endpoint from `currentId` to `element`. + // This involves: + // + // 1. changing the key in _amEndpoints under which the endpoint is stored + // 2. changing the source or target values in all of the endpoint's connections + // 3. changing the array in connectionsByElementId in which the endpoint's connections + // are stored (done by either sourceChanged or updateOtherEndpoint) + // + this.rehomeEndpoint = function (ep, currentId, element) { + var eps = _amEndpoints[currentId] || [], + elementId = jsPlumbInstance.getId(element); + + if (elementId !== currentId) { + var idx = eps.indexOf(ep); + if (idx > -1) { + var _ep = eps.splice(idx, 1)[0]; + self.add(_ep, elementId); + } + } + + for (var i = 0; i < ep.connections.length; i++) { + if (ep.connections[i].sourceId === currentId) { + self.sourceChanged(currentId, ep.elementId, ep.connections[i], ep.element); + } + else if (ep.connections[i].targetId === currentId) { + ep.connections[i].targetId = ep.elementId; + ep.connections[i].target = ep.element; + self.updateOtherEndpoint(ep.connections[i].sourceId, currentId, ep.elementId, ep.connections[i]); + } + } + }; + + this.redraw = function (elementId, ui, timestamp, offsetToUI, clearEdits, doNotRecalcEndpoint) { + + if (!jsPlumbInstance.isSuspendDrawing()) { + // get all the endpoints for this element + var ep = _amEndpoints[elementId] || [], + endpointConnections = connectionsByElementId[elementId] || [], + connectionsToPaint = [], + endpointsToPaint = [], + anchorsToUpdate = []; + + timestamp = timestamp || jsPlumbInstance.timestamp(); + // offsetToUI are values that would have been calculated in the dragManager when registering + // an endpoint for an element that had a parent (somewhere in the hierarchy) that had been + // registered as draggable. + offsetToUI = offsetToUI || {left: 0, top: 0}; + if (ui) { + ui = { + left: ui.left + offsetToUI.left, + top: ui.top + offsetToUI.top + }; + } + + // valid for one paint cycle. + var myOffset = jsPlumbInstance.updateOffset({ elId: elementId, offset: ui, recalc: false, timestamp: timestamp }), + orientationCache = {}; + + // actually, first we should compute the orientation of this element to all other elements to which + // this element is connected with a continuous anchor (whether both ends of the connection have + // a continuous anchor or just one) + + for (var i = 0; i < endpointConnections.length; i++) { + var conn = endpointConnections[i][0], + sourceId = conn.sourceId, + targetId = conn.targetId, + sourceContinuous = conn.endpoints[0].anchor.isContinuous, + targetContinuous = conn.endpoints[1].anchor.isContinuous; + + if (sourceContinuous || targetContinuous) { + var oKey = sourceId + "_" + targetId, + o = orientationCache[oKey], + oIdx = conn.sourceId === elementId ? 1 : 0; + + if (sourceContinuous && !anchorLists[sourceId]) { + anchorLists[sourceId] = { top: [], right: [], bottom: [], left: [] }; + } + if (targetContinuous && !anchorLists[targetId]) { + anchorLists[targetId] = { top: [], right: [], bottom: [], left: [] }; + } + + if (elementId !== targetId) { + jsPlumbInstance.updateOffset({ elId: targetId, timestamp: timestamp }); + } + if (elementId !== sourceId) { + jsPlumbInstance.updateOffset({ elId: sourceId, timestamp: timestamp }); + } + + var td = jsPlumbInstance.getCachedData(targetId), + sd = jsPlumbInstance.getCachedData(sourceId); + + if (targetId === sourceId && (sourceContinuous || targetContinuous)) { + // here we may want to improve this by somehow determining the face we'd like + // to put the connector on. ideally, when drawing, the face should be calculated + // by determining which face is closest to the point at which the mouse button + // was released. for now, we're putting it on the top face. + _updateAnchorList( anchorLists[sourceId], -Math.PI / 2, 0, conn, false, targetId, 0, false, "top", sourceId, connectionsToPaint, endpointsToPaint); + _updateAnchorList( anchorLists[targetId], -Math.PI / 2, 0, conn, false, sourceId, 1, false, "top", targetId, connectionsToPaint, endpointsToPaint); + } + else { + if (!o) { + o = this.calculateOrientation(sourceId, targetId, sd.o, td.o, conn.endpoints[0].anchor, conn.endpoints[1].anchor, conn); + orientationCache[oKey] = o; + // this would be a performance enhancement, but the computed angles need to be clamped to + //the (-PI/2 -> PI/2) range in order for the sorting to work properly. + /* orientationCache[oKey2] = { + orientation:o.orientation, + a:[o.a[1], o.a[0]], + theta:o.theta + Math.PI, + theta2:o.theta2 + Math.PI + };*/ + } + if (sourceContinuous) { + _updateAnchorList(anchorLists[sourceId], o.theta, 0, conn, false, targetId, 0, false, o.a[0], sourceId, connectionsToPaint, endpointsToPaint); + } + if (targetContinuous) { + _updateAnchorList(anchorLists[targetId], o.theta2, -1, conn, true, sourceId, 1, true, o.a[1], targetId, connectionsToPaint, endpointsToPaint); + } + } + + if (sourceContinuous) { + _ju.addWithFunction(anchorsToUpdate, sourceId, function (a) { + return a === sourceId; + }); + } + if (targetContinuous) { + _ju.addWithFunction(anchorsToUpdate, targetId, function (a) { + return a === targetId; + }); + } + _ju.addWithFunction(connectionsToPaint, conn, function (c) { + return c.id === conn.id; + }); + if ((sourceContinuous && oIdx === 0) || (targetContinuous && oIdx === 1)) { + _ju.addWithFunction(endpointsToPaint, conn.endpoints[oIdx], function (e) { + return e.id === conn.endpoints[oIdx].id; + }); + } + } + } + + // place Endpoints whose anchors are continuous but have no Connections + for (i = 0; i < ep.length; i++) { + if (ep[i].connections.length === 0 && ep[i].anchor.isContinuous) { + if (!anchorLists[elementId]) { + anchorLists[elementId] = { top: [], right: [], bottom: [], left: [] }; + } + _updateAnchorList(anchorLists[elementId], -Math.PI / 2, 0, {endpoints: [ep[i], ep[i]], paint: function () { + }}, false, elementId, 0, false, ep[i].anchor.getDefaultFace(), elementId, connectionsToPaint, endpointsToPaint); + _ju.addWithFunction(anchorsToUpdate, elementId, function (a) { + return a === elementId; + }); + } + } + + // now place all the continuous anchors we need to; + for (i = 0; i < anchorsToUpdate.length; i++) { + placeAnchors(anchorsToUpdate[i], anchorLists[anchorsToUpdate[i]]); + } + + // now that continuous anchors have been placed, paint all the endpoints for this element + for (i = 0; i < ep.length; i++) { + ep[i].paint({ timestamp: timestamp, offset: myOffset, dimensions: myOffset.s, recalc: doNotRecalcEndpoint !== true }); + } + + // ... and any other endpoints we came across as a result of the continuous anchors. + for (i = 0; i < endpointsToPaint.length; i++) { + var cd = jsPlumbInstance.getCachedData(endpointsToPaint[i].elementId); + //endpointsToPaint[i].paint({ timestamp: timestamp, offset: cd, dimensions: cd.s }); + endpointsToPaint[i].paint({ timestamp: null, offset: cd, dimensions: cd.s }); + } + + // paint all the standard and "dynamic connections", which are connections whose other anchor is + // static and therefore does need to be recomputed; we make sure that happens only one time. + + // TODO we could have compiled a list of these in the first pass through connections; might save some time. + for (i = 0; i < endpointConnections.length; i++) { + var otherEndpoint = endpointConnections[i][1]; + if (otherEndpoint.anchor.constructor === _jp.DynamicAnchor) { + otherEndpoint.paint({ elementWithPrecedence: elementId, timestamp: timestamp }); + _ju.addWithFunction(connectionsToPaint, endpointConnections[i][0], function (c) { + return c.id === endpointConnections[i][0].id; + }); + // all the connections for the other endpoint now need to be repainted + for (var k = 0; k < otherEndpoint.connections.length; k++) { + if (otherEndpoint.connections[k] !== endpointConnections[i][0]) { + _ju.addWithFunction(connectionsToPaint, otherEndpoint.connections[k], function (c) { + return c.id === otherEndpoint.connections[k].id; + }); + } + } + } else { + _ju.addWithFunction(connectionsToPaint, endpointConnections[i][0], function (c) { + return c.id === endpointConnections[i][0].id; + }); + } + } + + // paint current floating connection for this element, if there is one. + var fc = floatingConnections[elementId]; + if (fc) { + fc.paint({timestamp: timestamp, recalc: false, elId: elementId}); + } + + // paint all the connections + for (i = 0; i < connectionsToPaint.length; i++) { + connectionsToPaint[i].paint({elId: elementId, timestamp: null, recalc: false, clearEdits: clearEdits}); + } + } + }; + + var ContinuousAnchor = function (anchorParams) { + _ju.EventGenerator.apply(this); + this.type = "Continuous"; + this.isDynamic = true; + this.isContinuous = true; + var faces = anchorParams.faces || ["top", "right", "bottom", "left"], + clockwise = !(anchorParams.clockwise === false), + availableFaces = { }, + opposites = { "top": "bottom", "right": "left", "left": "right", "bottom": "top" }, + clockwiseOptions = { "top": "right", "right": "bottom", "left": "top", "bottom": "left" }, + antiClockwiseOptions = { "top": "left", "right": "top", "left": "bottom", "bottom": "right" }, + secondBest = clockwise ? clockwiseOptions : antiClockwiseOptions, + lastChoice = clockwise ? antiClockwiseOptions : clockwiseOptions, + cssClass = anchorParams.cssClass || "", + _currentFace = null, _lockedFace = null, X_AXIS_FACES = ["left", "right"], Y_AXIS_FACES = ["top", "bottom"], + _lockedAxis = null; + + for (var i = 0; i < faces.length; i++) { + availableFaces[faces[i]] = true; + } + + this.getDefaultFace = function () { + return faces.length === 0 ? "top" : faces[0]; + }; + + this.isRelocatable = function() { return true; }; + this.isSnapOnRelocate = function() { return true; }; + + // if the given edge is supported, returns it. otherwise looks for a substitute that _is_ + // supported. if none supported we also return the request edge. + this.verifyEdge = function (edge) { + if (availableFaces[edge]) { + return edge; + } + else if (availableFaces[opposites[edge]]) { + return opposites[edge]; + } + else if (availableFaces[secondBest[edge]]) { + return secondBest[edge]; + } + else if (availableFaces[lastChoice[edge]]) { + return lastChoice[edge]; + } + return edge; // we have to give them something. + }; + + this.isEdgeSupported = function (edge) { + return _lockedAxis == null ? + + (_lockedFace == null ? availableFaces[edge] === true : _lockedFace === edge) + + : _lockedAxis.indexOf(edge) !== -1; + }; + + this.setCurrentFace = function(face, overrideLock) { + _currentFace = face; + // if currently locked, and the user wants to override, do that. + if (overrideLock && _lockedFace != null) { + _lockedFace = _currentFace; + } + }; + + this.getCurrentFace = function() { return _currentFace; }; + this.getSupportedFaces = function() { + var af = []; + for (var k in availableFaces) { + if (availableFaces[k]) { + af.push(k); + } + } + return af; + }; + + this.lock = function() { + _lockedFace = _currentFace; + }; + this.unlock = function() { + _lockedFace = null; + }; + this.isLocked = function() { + return _lockedFace != null; + }; + + this.lockCurrentAxis = function() { + if (_currentFace != null) { + _lockedAxis = (_currentFace === "left" || _currentFace === "right") ? X_AXIS_FACES : Y_AXIS_FACES; + } + }; + + this.unlockCurrentAxis = function() { + _lockedAxis = null; + }; + + this.compute = function (params) { + return continuousAnchorLocations[params.element.id] || [0, 0]; + }; + this.getCurrentLocation = function (params) { + return continuousAnchorLocations[params.element.id] || [0, 0]; + }; + this.getOrientation = function (endpoint) { + return continuousAnchorOrientations[endpoint.id] || [0, 0]; + }; + this.getCssClass = function () { + return cssClass; + }; + }; + + // continuous anchors + jsPlumbInstance.continuousAnchorFactory = { + get: function (params) { + return new ContinuousAnchor(params); + }, + clear: function (elementId) { + delete continuousAnchorLocations[elementId]; + } + }; + }; + + _jp.AnchorManager.prototype.calculateOrientation = function (sourceId, targetId, sd, td, sourceAnchor, targetAnchor) { + + var Orientation = { HORIZONTAL: "horizontal", VERTICAL: "vertical", DIAGONAL: "diagonal", IDENTITY: "identity" }, + axes = ["left", "top", "right", "bottom"]; + + if (sourceId === targetId) { + return { + orientation: Orientation.IDENTITY, + a: ["top", "top"] + }; + } + + var theta = Math.atan2((td.centery - sd.centery), (td.centerx - sd.centerx)), + theta2 = Math.atan2((sd.centery - td.centery), (sd.centerx - td.centerx)); + +// -------------------------------------------------------------------------------------- + + // improved face calculation. get midpoints of each face for source and target, then put in an array with all combinations of + // source/target faces. sort this array by distance between midpoints. the entry at index 0 is our preferred option. we can + // go through the array one by one until we find an entry in which each requested face is supported. + var candidates = [], midpoints = { }; + (function (types, dim) { + for (var i = 0; i < types.length; i++) { + midpoints[types[i]] = { + "left": [ dim[i].left, dim[i].centery ], + "right": [ dim[i].right, dim[i].centery ], + "top": [ dim[i].centerx, dim[i].top ], + "bottom": [ dim[i].centerx , dim[i].bottom] + }; + } + })([ "source", "target" ], [ sd, td ]); + + for (var sf = 0; sf < axes.length; sf++) { + for (var tf = 0; tf < axes.length; tf++) { + candidates.push({ + source: axes[sf], + target: axes[tf], + dist: Biltong.lineLength(midpoints.source[axes[sf]], midpoints.target[axes[tf]]) + }); + } + } + + candidates.sort(function (a, b) { + return a.dist < b.dist ? -1 : a.dist > b.dist ? 1 : 0; + }); + + // now go through this list and try to get an entry that satisfies both (there will be one, unless one of the anchors + // declares no available faces) + var sourceEdge = candidates[0].source, targetEdge = candidates[0].target; + for (var i = 0; i < candidates.length; i++) { + + if (!sourceAnchor.isContinuous || sourceAnchor.isEdgeSupported(candidates[i].source)) { + sourceEdge = candidates[i].source; + } + else { + sourceEdge = null; + } + + if (!targetAnchor.isContinuous || targetAnchor.isEdgeSupported(candidates[i].target)) { + targetEdge = candidates[i].target; + } + else { + targetEdge = null; + } + + if (sourceEdge != null && targetEdge != null) { + break; + } + } + + if (sourceAnchor.isContinuous) { + sourceAnchor.setCurrentFace(sourceEdge); + } + + if (targetAnchor.isContinuous) { + targetAnchor.setCurrentFace(targetEdge); + } + +// -------------------------------------------------------------------------------------- + + return { + a: [ sourceEdge, targetEdge ], + theta: theta, + theta2: theta2 + }; + }; + + /** + * Anchors model a position on some element at which an Endpoint may be located. They began as a first class citizen of jsPlumb, ie. a user + * was required to create these themselves, but over time this has been replaced by the concept of referring to them either by name (eg. "TopMiddle"), + * or by an array describing their coordinates (eg. [ 0, 0.5, 0, -1 ], which is the same as "TopMiddle"). jsPlumb now handles all of the + * creation of Anchors without user intervention. + */ + _jp.Anchor = function (params) { + this.x = params.x || 0; + this.y = params.y || 0; + this.elementId = params.elementId; + this.cssClass = params.cssClass || ""; + this.userDefinedLocation = null; + this.orientation = params.orientation || [ 0, 0 ]; + this.lastReturnValue = null; + this.offsets = params.offsets || [ 0, 0 ]; + this.timestamp = null; + + var relocatable = params.relocatable !== false; + this.isRelocatable = function() { return relocatable; }; + this.setRelocatable = function(_relocatable) { relocatable = _relocatable; }; + var snapOnRelocate = params.snapOnRelocate !== false; + this.isSnapOnRelocate = function() { return snapOnRelocate; }; + + var locked = false; + this.lock = function() { locked = true; }; + this.unlock = function() { locked = false; }; + this.isLocked = function() { return locked; }; + + _ju.EventGenerator.apply(this); + + this.compute = function (params) { + + var xy = params.xy, wh = params.wh, timestamp = params.timestamp; + + if (params.clearUserDefinedLocation) { + this.userDefinedLocation = null; + } + + if (timestamp && timestamp === this.timestamp) { + return this.lastReturnValue; + } + + if (this.userDefinedLocation != null) { + this.lastReturnValue = this.userDefinedLocation; + } + else { + this.lastReturnValue = [ xy[0] + (this.x * wh[0]) + this.offsets[0], xy[1] + (this.y * wh[1]) + this.offsets[1], this.x, this.y ]; + } + + this.timestamp = timestamp; + return this.lastReturnValue; + }; + + this.getCurrentLocation = function (params) { + params = params || {}; + return (this.lastReturnValue == null || (params.timestamp != null && this.timestamp !== params.timestamp)) ? this.compute(params) : this.lastReturnValue; + }; + + this.setPosition = function(x, y, ox, oy, overrideLock) { + if (!locked || overrideLock) { + this.x = x; + this.y = y; + this.orientation = [ ox, oy ]; + this.lastReturnValue = null; + } + }; + }; + _ju.extend(_jp.Anchor, _ju.EventGenerator, { + equals: function (anchor) { + if (!anchor) { + return false; + } + var ao = anchor.getOrientation(), + o = this.getOrientation(); + return this.x === anchor.x && this.y === anchor.y && this.offsets[0] === anchor.offsets[0] && this.offsets[1] === anchor.offsets[1] && o[0] === ao[0] && o[1] === ao[1]; + }, + getUserDefinedLocation: function () { + return this.userDefinedLocation; + }, + setUserDefinedLocation: function (l) { + this.userDefinedLocation = l; + }, + clearUserDefinedLocation: function () { + this.userDefinedLocation = null; + }, + getOrientation: function () { + return this.orientation; + }, + getCssClass: function () { + return this.cssClass; + } + }); + + /** + * An Anchor that floats. its orientation is computed dynamically from + * its position relative to the anchor it is floating relative to. It is used when creating + * a connection through drag and drop. + * + * TODO FloatingAnchor could totally be refactored to extend Anchor just slightly. + */ + _jp.FloatingAnchor = function (params) { + + _jp.Anchor.apply(this, arguments); + + // this is the anchor that this floating anchor is referenced to for + // purposes of calculating the orientation. + var ref = params.reference, + // the canvas this refers to. + refCanvas = params.referenceCanvas, + size = _jp.getSize(refCanvas), + // these are used to store the current relative position of our + // anchor wrt the reference anchor. they only indicate + // direction, so have a value of 1 or -1 (or, very rarely, 0). these + // values are written by the compute method, and read + // by the getOrientation method. + xDir = 0, yDir = 0, + // temporary member used to store an orientation when the floating + // anchor is hovering over another anchor. + orientation = null, + _lastResult = null; + + // clear from parent. we want floating anchor orientation to always be computed. + this.orientation = null; + + // set these to 0 each; they are used by certain types of connectors in the loopback case, + // when the connector is trying to clear the element it is on. but for floating anchor it's not + // very important. + this.x = 0; + this.y = 0; + + this.isFloating = true; + + this.compute = function (params) { + var xy = params.xy, + result = [ xy[0] + (size[0] / 2), xy[1] + (size[1] / 2) ]; // return origin of the element. we may wish to improve this so that any object can be the drag proxy. + _lastResult = result; + return result; + }; + + this.getOrientation = function (_endpoint) { + if (orientation) { + return orientation; + } + else { + var o = ref.getOrientation(_endpoint); + // here we take into account the orientation of the other + // anchor: if it declares zero for some direction, we declare zero too. this might not be the most awesome. perhaps we can come + // up with a better way. it's just so that the line we draw looks like it makes sense. maybe this wont make sense. + return [ Math.abs(o[0]) * xDir * -1, + Math.abs(o[1]) * yDir * -1 ]; + } + }; + + /** + * notification the endpoint associated with this anchor is hovering + * over another anchor; we want to assume that anchor's orientation + * for the duration of the hover. + */ + this.over = function (anchor, endpoint) { + orientation = anchor.getOrientation(endpoint); + }; + + /** + * notification the endpoint associated with this anchor is no + * longer hovering over another anchor; we should resume calculating + * orientation as we normally do. + */ + this.out = function () { + orientation = null; + }; + + this.getCurrentLocation = function (params) { + return _lastResult == null ? this.compute(params) : _lastResult; + }; + }; + _ju.extend(_jp.FloatingAnchor, _jp.Anchor); + + var _convertAnchor = function (anchor, jsPlumbInstance, elementId) { + return anchor.constructor === _jp.Anchor ? anchor : jsPlumbInstance.makeAnchor(anchor, elementId, jsPlumbInstance); + }; + + /* + * A DynamicAnchor is an Anchor that contains a list of other Anchors, which it cycles + * through at compute time to find the one that is located closest to + * the center of the target element, and returns that Anchor's compute + * method result. this causes endpoints to follow each other with + * respect to the orientation of their target elements, which is a useful + * feature for some applications. + * + */ + _jp.DynamicAnchor = function (params) { + _jp.Anchor.apply(this, arguments); + + this.isDynamic = true; + this.anchors = []; + this.elementId = params.elementId; + this.jsPlumbInstance = params.jsPlumbInstance; + + for (var i = 0; i < params.anchors.length; i++) { + this.anchors[i] = _convertAnchor(params.anchors[i], this.jsPlumbInstance, this.elementId); + } + + this.getAnchors = function () { + return this.anchors; + }; + + var _curAnchor = this.anchors.length > 0 ? this.anchors[0] : null, + _lastAnchor = _curAnchor, + self = this, + + // helper method to calculate the distance between the centers of the two elements. + _distance = function (anchor, cx, cy, xy, wh) { + var ax = xy[0] + (anchor.x * wh[0]), ay = xy[1] + (anchor.y * wh[1]), + acx = xy[0] + (wh[0] / 2), acy = xy[1] + (wh[1] / 2); + return (Math.sqrt(Math.pow(cx - ax, 2) + Math.pow(cy - ay, 2)) + + Math.sqrt(Math.pow(acx - ax, 2) + Math.pow(acy - ay, 2))); + }, + // default method uses distance between element centers. you can provide your own method in the dynamic anchor + // constructor (and also to jsPlumb.makeDynamicAnchor). the arguments to it are four arrays: + // xy - xy loc of the anchor's element + // wh - anchor's element's dimensions + // txy - xy loc of the element of the other anchor in the connection + // twh - dimensions of the element of the other anchor in the connection. + // anchors - the list of selectable anchors + _anchorSelector = params.selector || function (xy, wh, txy, twh, anchors) { + var cx = txy[0] + (twh[0] / 2), cy = txy[1] + (twh[1] / 2); + var minIdx = -1, minDist = Infinity; + for (var i = 0; i < anchors.length; i++) { + var d = _distance(anchors[i], cx, cy, xy, wh); + if (d < minDist) { + minIdx = i + 0; + minDist = d; + } + } + return anchors[minIdx]; + }; + + this.compute = function (params) { + var xy = params.xy, wh = params.wh, txy = params.txy, twh = params.twh; + + this.timestamp = params.timestamp; + + var udl = self.getUserDefinedLocation(); + if (udl != null) { + return udl; + } + + // if anchor is locked or an opposite element was not given, we + // maintain our state. anchor will be locked + // if it is the source of a drag and drop. + if (this.isLocked() || txy == null || twh == null) { + return _curAnchor.compute(params); + } + else { + params.timestamp = null; // otherwise clear this, i think. we want the anchor to compute. + } + + _curAnchor = _anchorSelector(xy, wh, txy, twh, this.anchors); + this.x = _curAnchor.x; + this.y = _curAnchor.y; + + if (_curAnchor !== _lastAnchor) { + this.fire("anchorChanged", _curAnchor); + } + + _lastAnchor = _curAnchor; + + return _curAnchor.compute(params); + }; + + this.getCurrentLocation = function (params) { + return this.getUserDefinedLocation() || (_curAnchor != null ? _curAnchor.getCurrentLocation(params) : null); + }; + + this.getOrientation = function (_endpoint) { + return _curAnchor != null ? _curAnchor.getOrientation(_endpoint) : [ 0, 0 ]; + }; + this.over = function (anchor, endpoint) { + if (_curAnchor != null) { + _curAnchor.over(anchor, endpoint); + } + }; + this.out = function () { + if (_curAnchor != null) { + _curAnchor.out(); + } + }; + + this.setAnchor = function(a) { + _curAnchor = a; + }; + + this.getCssClass = function () { + return (_curAnchor && _curAnchor.getCssClass()) || ""; + }; + + /** + * Attempt to match an anchor with the given coordinates and then set it. + * @param coords + * @returns true if matching anchor found, false otherwise. + */ + this.setAnchorCoordinates = function(coords) { + var idx = jsPlumbUtil.findWithFunction(this.anchors, function(a) { + return a.x === coords[0] && a.y === coords[1]; + }); + if (idx !== -1) { + this.setAnchor(this.anchors[idx]); + return true; + } else { + return false; + } + }; + }; + _ju.extend(_jp.DynamicAnchor, _jp.Anchor); + +// -------- basic anchors ------------------ + var _curryAnchor = function (x, y, ox, oy, type, fnInit) { + _jp.Anchors[type] = function (params) { + var a = params.jsPlumbInstance.makeAnchor([ x, y, ox, oy, 0, 0 ], params.elementId, params.jsPlumbInstance); + a.type = type; + if (fnInit) { + fnInit(a, params); + } + return a; + }; + }; + + _curryAnchor(0.5, 0, 0, -1, "TopCenter"); + _curryAnchor(0.5, 1, 0, 1, "BottomCenter"); + _curryAnchor(0, 0.5, -1, 0, "LeftMiddle"); + _curryAnchor(1, 0.5, 1, 0, "RightMiddle"); + + _curryAnchor(0.5, 0, 0, -1, "Top"); + _curryAnchor(0.5, 1, 0, 1, "Bottom"); + _curryAnchor(0, 0.5, -1, 0, "Left"); + _curryAnchor(1, 0.5, 1, 0, "Right"); + _curryAnchor(0.5, 0.5, 0, 0, "Center"); + _curryAnchor(1, 0, 0, -1, "TopRight"); + _curryAnchor(1, 1, 0, 1, "BottomRight"); + _curryAnchor(0, 0, 0, -1, "TopLeft"); + _curryAnchor(0, 1, 0, 1, "BottomLeft"); + +// ------- dynamic anchors ------------------- + + // default dynamic anchors chooses from Top, Right, Bottom, Left + _jp.Defaults.DynamicAnchors = function (params) { + return params.jsPlumbInstance.makeAnchors(["TopCenter", "RightMiddle", "BottomCenter", "LeftMiddle"], params.elementId, params.jsPlumbInstance); + }; + + // default dynamic anchors bound to name 'AutoDefault' + _jp.Anchors.AutoDefault = function (params) { + var a = params.jsPlumbInstance.makeDynamicAnchor(_jp.Defaults.DynamicAnchors(params)); + a.type = "AutoDefault"; + return a; + }; + +// ------- continuous anchors ------------------- + + var _curryContinuousAnchor = function (type, faces) { + _jp.Anchors[type] = function (params) { + var a = params.jsPlumbInstance.makeAnchor(["Continuous", { faces: faces }], params.elementId, params.jsPlumbInstance); + a.type = type; + return a; + }; + }; + + _jp.Anchors.Continuous = function (params) { + return params.jsPlumbInstance.continuousAnchorFactory.get(params); + }; + + _curryContinuousAnchor("ContinuousLeft", ["left"]); + _curryContinuousAnchor("ContinuousTop", ["top"]); + _curryContinuousAnchor("ContinuousBottom", ["bottom"]); + _curryContinuousAnchor("ContinuousRight", ["right"]); + +// ------- position assign anchors ------------------- + + // this anchor type lets you assign the position at connection time. + _curryAnchor(0, 0, 0, 0, "Assign", function (anchor, params) { + // find what to use as the "position finder". the user may have supplied a String which represents + // the id of a position finder in jsPlumb.AnchorPositionFinders, or the user may have supplied the + // position finder as a function. we find out what to use and then set it on the anchor. + var pf = params.position || "Fixed"; + anchor.positionFinder = pf.constructor === String ? params.jsPlumbInstance.AnchorPositionFinders[pf] : pf; + // always set the constructor params; the position finder might need them later (the Grid one does, + // for example) + anchor.constructorParams = params; + }); + + // these are the default anchor positions finders, which are used by the makeTarget function. supplying + // a position finder argument to that function allows you to specify where the resulting anchor will + // be located + root.jsPlumbInstance.prototype.AnchorPositionFinders = { + "Fixed": function (dp, ep, es) { + return [ (dp.left - ep.left) / es[0], (dp.top - ep.top) / es[1] ]; + }, + "Grid": function (dp, ep, es, params) { + var dx = dp.left - ep.left, dy = dp.top - ep.top, + gx = es[0] / (params.grid[0]), gy = es[1] / (params.grid[1]), + mx = Math.floor(dx / gx), my = Math.floor(dy / gy); + return [ ((mx * gx) + (gx / 2)) / es[0], ((my * gy) + (gy / 2)) / es[1] ]; + } + }; + +// ------- perimeter anchors ------------------- + + _jp.Anchors.Perimeter = function (params) { + params = params || {}; + var anchorCount = params.anchorCount || 60, + shape = params.shape; + + if (!shape) { + throw new Error("no shape supplied to Perimeter Anchor type"); + } + + var _circle = function () { + var r = 0.5, step = Math.PI * 2 / anchorCount, current = 0, a = []; + for (var i = 0; i < anchorCount; i++) { + var x = r + (r * Math.sin(current)), + y = r + (r * Math.cos(current)); + a.push([ x, y, 0, 0 ]); + current += step; + } + return a; + }, + _path = function (segments) { + var anchorsPerFace = anchorCount / segments.length, a = [], + _computeFace = function (x1, y1, x2, y2, fractionalLength, ox, oy) { + anchorsPerFace = anchorCount * fractionalLength; + var dx = (x2 - x1) / anchorsPerFace, dy = (y2 - y1) / anchorsPerFace; + for (var i = 0; i < anchorsPerFace; i++) { + a.push([ + x1 + (dx * i), + y1 + (dy * i), + ox == null ? 0 : ox, + oy == null ? 0 : oy + ]); + } + }; + + for (var i = 0; i < segments.length; i++) { + _computeFace.apply(null, segments[i]); + } + + return a; + }, + _shape = function (faces) { + var s = []; + for (var i = 0; i < faces.length; i++) { + s.push([faces[i][0], faces[i][1], faces[i][2], faces[i][3], 1 / faces.length, faces[i][4], faces[i][5]]); + } + return _path(s); + }, + _rectangle = function () { + return _shape([ + [ 0, 0, 1, 0, 0, -1 ], + [ 1, 0, 1, 1, 1, 0 ], + [ 1, 1, 0, 1, 0, 1 ], + [ 0, 1, 0, 0, -1, 0 ] + ]); + }; + + var _shapes = { + "Circle": _circle, + "Ellipse": _circle, + "Diamond": function () { + return _shape([ + [ 0.5, 0, 1, 0.5 ], + [ 1, 0.5, 0.5, 1 ], + [ 0.5, 1, 0, 0.5 ], + [ 0, 0.5, 0.5, 0 ] + ]); + }, + "Rectangle": _rectangle, + "Square": _rectangle, + "Triangle": function () { + return _shape([ + [ 0.5, 0, 1, 1 ], + [ 1, 1, 0, 1 ], + [ 0, 1, 0.5, 0] + ]); + }, + "Path": function (params) { + var points = params.points, p = [], tl = 0; + for (var i = 0; i < points.length - 1; i++) { + var l = Math.sqrt(Math.pow(points[i][2] - points[i][0]) + Math.pow(points[i][3] - points[i][1])); + tl += l; + p.push([points[i][0], points[i][1], points[i + 1][0], points[i + 1][1], l]); + } + for (var j = 0; j < p.length; j++) { + p[j][4] = p[j][4] / tl; + } + return _path(p); + } + }, + _rotate = function (points, amountInDegrees) { + var o = [], theta = amountInDegrees / 180 * Math.PI; + for (var i = 0; i < points.length; i++) { + var _x = points[i][0] - 0.5, + _y = points[i][1] - 0.5; + + o.push([ + 0.5 + ((_x * Math.cos(theta)) - (_y * Math.sin(theta))), + 0.5 + ((_x * Math.sin(theta)) + (_y * Math.cos(theta))), + points[i][2], + points[i][3] + ]); + } + return o; + }; + + if (!_shapes[shape]) { + throw new Error("Shape [" + shape + "] is unknown by Perimeter Anchor type"); + } + + var da = _shapes[shape](params); + if (params.rotation) { + da = _rotate(da, params.rotation); + } + var a = params.jsPlumbInstance.makeDynamicAnchor(da); + a.type = "Perimeter"; + return a; + }; +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the default Connectors, Endpoint and Overlay definitions. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil, _jg = root.Biltong; + + _jp.Segments = { + + /* + * Class: AbstractSegment + * A Connector is made up of 1..N Segments, each of which has a Type, such as 'Straight', 'Arc', + * 'Bezier'. This is new from 1.4.2, and gives us a lot more flexibility when drawing connections: things such + * as rounded corners for flowchart connectors, for example, or a straight line stub for Bezier connections, are + * much easier to do now. + * + * A Segment is responsible for providing coordinates for painting it, and also must be able to report its length. + * + */ + AbstractSegment: function (params) { + this.params = params; + + /** + * Function: findClosestPointOnPath + * Finds the closest point on this segment to the given [x, y], + * returning both the x and y of the point plus its distance from + * the supplied point, and its location along the length of the + * path inscribed by the segment. This implementation returns + * Infinity for distance and null values for everything else; + * subclasses are expected to override. + */ + this.findClosestPointOnPath = function (x, y) { + return { + d: Infinity, + x: null, + y: null, + l: null + }; + }; + + this.getBounds = function () { + return { + minX: Math.min(params.x1, params.x2), + minY: Math.min(params.y1, params.y2), + maxX: Math.max(params.x1, params.x2), + maxY: Math.max(params.y1, params.y2) + }; + }; + + /** + * Computes the list of points on the segment that intersect the given line. + * @method lineIntersection + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @returns {Array<[number, number]>} + */ + this.lineIntersection = function(x1, y1, x2, y2) { + return []; + }; + + /** + * Computes the list of points on the segment that intersect the box with the given origin and size. + * @method boxIntersection + * @param {number} x1 + * @param {number} y1 + * @param {number} w + * @param {number} h + * @returns {Array<[number, number]>} + */ + this.boxIntersection = function(x, y, w, h) { + var a = []; + a.push.apply(a, this.lineIntersection(x, y, x + w, y)); + a.push.apply(a, this.lineIntersection(x + w, y, x + w, y + h)); + a.push.apply(a, this.lineIntersection(x + w, y + h, x, y + h)); + a.push.apply(a, this.lineIntersection(x, y + h, x, y)); + return a; + }; + + /** + * Computes the list of points on the segment that intersect the given bounding box, which is an object of the form { x:.., y:.., w:.., h:.. }. + * @method lineIntersection + * @param {BoundingRectangle} box + * @returns {Array<[number, number]>} + */ + this.boundingBoxIntersection = function(box) { + return this.boxIntersection(box.x, box.y, box.w, box.y); + }; + }, + Straight: function (params) { + var _super = _jp.Segments.AbstractSegment.apply(this, arguments), + length, m, m2, x1, x2, y1, y2, + _recalc = function () { + length = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); + m = _jg.gradient({x: x1, y: y1}, {x: x2, y: y2}); + m2 = -1 / m; + }; + + this.type = "Straight"; + + this.getLength = function () { + return length; + }; + this.getGradient = function () { + return m; + }; + + this.getCoordinates = function () { + return { x1: x1, y1: y1, x2: x2, y2: y2 }; + }; + this.setCoordinates = function (coords) { + x1 = coords.x1; + y1 = coords.y1; + x2 = coords.x2; + y2 = coords.y2; + _recalc(); + }; + this.setCoordinates({x1: params.x1, y1: params.y1, x2: params.x2, y2: params.y2}); + + this.getBounds = function () { + return { + minX: Math.min(x1, x2), + minY: Math.min(y1, y2), + maxX: Math.max(x1, x2), + maxY: Math.max(y1, y2) + }; + }; + + /** + * returns the point on the segment's path that is 'location' along the length of the path, where 'location' is a decimal from + * 0 to 1 inclusive. for the straight line segment this is simple maths. + */ + this.pointOnPath = function (location, absolute) { + if (location === 0 && !absolute) { + return { x: x1, y: y1 }; + } + else if (location === 1 && !absolute) { + return { x: x2, y: y2 }; + } + else { + var l = absolute ? location > 0 ? location : length + location : location * length; + return _jg.pointOnLine({x: x1, y: y1}, {x: x2, y: y2}, l); + } + }; + + /** + * returns the gradient of the segment at the given point - which for us is constant. + */ + this.gradientAtPoint = function (_) { + return m; + }; + + /** + * returns the point on the segment's path that is 'distance' along the length of the path from 'location', where + * 'location' is a decimal from 0 to 1 inclusive, and 'distance' is a number of pixels. + * this hands off to jsPlumbUtil to do the maths, supplying two points and the distance. + */ + this.pointAlongPathFrom = function (location, distance, absolute) { + var p = this.pointOnPath(location, absolute), + farAwayPoint = distance <= 0 ? {x: x1, y: y1} : {x: x2, y: y2 }; + + /* + location == 1 ? { + x:x1 + ((x2 - x1) * 10), + y:y1 + ((y1 - y2) * 10) + } : + */ + + if (distance <= 0 && Math.abs(distance) > 1) { + distance *= -1; + } + + return _jg.pointOnLine(p, farAwayPoint, distance); + }; + + // is c between a and b? + var within = function (a, b, c) { + return c >= Math.min(a, b) && c <= Math.max(a, b); + }; + // find which of a and b is closest to c + var closest = function (a, b, c) { + return Math.abs(c - a) < Math.abs(c - b) ? a : b; + }; + + /** + Function: findClosestPointOnPath + Finds the closest point on this segment to [x,y]. See + notes on this method in AbstractSegment. + */ + this.findClosestPointOnPath = function (x, y) { + var out = { + d: Infinity, + x: null, + y: null, + l: null, + x1: x1, + x2: x2, + y1: y1, + y2: y2 + }; + + if (m === 0) { + out.y = y1; + out.x = within(x1, x2, x) ? x : closest(x1, x2, x); + } + else if (m === Infinity || m === -Infinity) { + out.x = x1; + out.y = within(y1, y2, y) ? y : closest(y1, y2, y); + } + else { + // closest point lies on normal from given point to this line. + var b = y1 - (m * x1), + b2 = y - (m2 * x), + // y1 = m.x1 + b and y1 = m2.x1 + b2 + // so m.x1 + b = m2.x1 + b2 + // x1(m - m2) = b2 - b + // x1 = (b2 - b) / (m - m2) + _x1 = (b2 - b) / (m - m2), + _y1 = (m * _x1) + b; + + out.x = within(x1, x2, _x1) ? _x1 : closest(x1, x2, _x1);//_x1; + out.y = within(y1, y2, _y1) ? _y1 : closest(y1, y2, _y1);//_y1; + } + + var fractionInSegment = _jg.lineLength([ out.x, out.y ], [ x1, y1 ]); + out.d = _jg.lineLength([x, y], [out.x, out.y]); + out.l = fractionInSegment / length; + return out; + }; + + var _pointLiesBetween = function(q, p1, p2) { + return (p2 > p1) ? (p1 <= q && q <= p2) : (p1 >= q && q >= p2); + }, _plb = _pointLiesBetween; + + /** + * Calculates all intersections of the given line with this segment. + * @param _x1 + * @param _y1 + * @param _x2 + * @param _y2 + * @returns {Array} + */ + this.lineIntersection = function(_x1, _y1, _x2, _y2) { + var m2 = Math.abs(_jg.gradient({x: _x1, y: _y1}, {x: _x2, y: _y2})), + m1 = Math.abs(m), + b = m1 === Infinity ? x1 : y1 - (m1 * x1), + out = [], + b2 = m2 === Infinity ? _x1 : _y1 - (m2 * _x1); + + // if lines parallel, no intersection + if (m2 !== m1) { + // perpendicular, segment horizontal + if(m2 === Infinity && m1 === 0) { + if (_plb(_x1, x1, x2) && _plb(y1, _y1, _y2)) { + out = [ _x1, y1 ]; // we return X on the incident line and Y from the segment + } + } else if(m2 === 0 && m1 === Infinity) { + // perpendicular, segment vertical + if(_plb(_y1, y1, y2) && _plb(x1, _x1, _x2)) { + out = [x1, _y1]; // we return X on the segment and Y from the incident line + } + } else { + var X, Y; + if (m2 === Infinity) { + // test line is a vertical line. where does it cross the segment? + X = _x1; + if (_plb(X, x1, x2)) { + Y = (m1 * _x1) + b; + if (_plb(Y, _y1, _y2)) { + out = [ X, Y ]; + } + } + } else if (m2 === 0) { + Y = _y1; + // test line is a horizontal line. where does it cross the segment? + if (_plb(Y, y1, y2)) { + X = (_y1 - b) / m1; + if (_plb(X, _x1, _x2)) { + out = [ X, Y ]; + } + } + } else { + // mX + b = m2X + b2 + // mX - m2X = b2 - b + // X(m - m2) = b2 - b + // X = (b2 - b) / (m - m2) + // Y = mX + b + X = (b2 - b) / (m1 - m2); + Y = (m1 * X) + b; + if(_plb(X, x1, x2) && _plb(Y, y1, y2)) { + out = [ X, Y]; + } + } + } + } + + return out; + }; + + /** + * Calculates all intersections of the given box with this segment. By default this method simply calls `lineIntersection` with each of the four + * faces of the box; subclasses can override this if they think there's a faster way to compute the entire box at once. + * @param x X position of top left corner of box + * @param y Y position of top left corner of box + * @param w width of box + * @param h height of box + * @returns {Array} + */ + this.boxIntersection = function(x, y, w, h) { + var a = []; + a.push.apply(a, this.lineIntersection(x, y, x + w, y)); + a.push.apply(a, this.lineIntersection(x + w, y, x + w, y + h)); + a.push.apply(a, this.lineIntersection(x + w, y + h, x, y + h)); + a.push.apply(a, this.lineIntersection(x, y + h, x, y)); + return a; + }; + + /** + * Calculates all intersections of the given bounding box with this segment. By default this method simply calls `lineIntersection` with each of the four + * faces of the box; subclasses can override this if they think there's a faster way to compute the entire box at once. + * @param box Bounding box, in { x:.., y:..., w:..., h:... } format. + * @returns {Array} + */ + this.boundingBoxIntersection = function(box) { + return this.boxIntersection(box.x, box.y, box.w, box.h); + }; + }, + + /* + Arc Segment. You need to supply: + + r - radius + cx - center x for the arc + cy - center y for the arc + ac - whether the arc is anticlockwise or not. default is clockwise. + + and then either: + + startAngle - startAngle for the arc. + endAngle - endAngle for the arc. + + or: + + x1 - x for start point + y1 - y for start point + x2 - x for end point + y2 - y for end point + + */ + Arc: function (params) { + var _super = _jp.Segments.AbstractSegment.apply(this, arguments), + _calcAngle = function (_x, _y) { + return _jg.theta([params.cx, params.cy], [_x, _y]); + }, + _calcAngleForLocation = function (segment, location) { + if (segment.anticlockwise) { + var sa = segment.startAngle < segment.endAngle ? segment.startAngle + TWO_PI : segment.startAngle, + s = Math.abs(sa - segment.endAngle); + return sa - (s * location); + } + else { + var ea = segment.endAngle < segment.startAngle ? segment.endAngle + TWO_PI : segment.endAngle, + ss = Math.abs(ea - segment.startAngle); + + return segment.startAngle + (ss * location); + } + }, + TWO_PI = 2 * Math.PI; + + this.radius = params.r; + this.anticlockwise = params.ac; + this.type = "Arc"; + + if (params.startAngle && params.endAngle) { + this.startAngle = params.startAngle; + this.endAngle = params.endAngle; + this.x1 = params.cx + (this.radius * Math.cos(params.startAngle)); + this.y1 = params.cy + (this.radius * Math.sin(params.startAngle)); + this.x2 = params.cx + (this.radius * Math.cos(params.endAngle)); + this.y2 = params.cy + (this.radius * Math.sin(params.endAngle)); + } + else { + this.startAngle = _calcAngle(params.x1, params.y1); + this.endAngle = _calcAngle(params.x2, params.y2); + this.x1 = params.x1; + this.y1 = params.y1; + this.x2 = params.x2; + this.y2 = params.y2; + } + + if (this.endAngle < 0) { + this.endAngle += TWO_PI; + } + if (this.startAngle < 0) { + this.startAngle += TWO_PI; + } + + // segment is used by vml + //this.segment = _jg.quadrant([this.x1, this.y1], [this.x2, this.y2]); + + // we now have startAngle and endAngle as positive numbers, meaning the + // absolute difference (|d|) between them is the sweep (s) of this arc, unless the + // arc is 'anticlockwise' in which case 's' is given by 2PI - |d|. + + var ea = this.endAngle < this.startAngle ? this.endAngle + TWO_PI : this.endAngle; + this.sweep = Math.abs(ea - this.startAngle); + if (this.anticlockwise) { + this.sweep = TWO_PI - this.sweep; + } + var circumference = 2 * Math.PI * this.radius, + frac = this.sweep / TWO_PI, + length = circumference * frac; + + this.getLength = function () { + return length; + }; + + this.getBounds = function () { + return { + minX: params.cx - params.r, + maxX: params.cx + params.r, + minY: params.cy - params.r, + maxY: params.cy + params.r + }; + }; + + var VERY_SMALL_VALUE = 0.0000000001, + gentleRound = function (n) { + var f = Math.floor(n), r = Math.ceil(n); + if (n - f < VERY_SMALL_VALUE) { + return f; + } + else if (r - n < VERY_SMALL_VALUE) { + return r; + } + return n; + }; + + /** + * returns the point on the segment's path that is 'location' along the length of the path, where 'location' is a decimal from + * 0 to 1 inclusive. + */ + this.pointOnPath = function (location, absolute) { + + if (location === 0) { + return { x: this.x1, y: this.y1, theta: this.startAngle }; + } + else if (location === 1) { + return { x: this.x2, y: this.y2, theta: this.endAngle }; + } + + if (absolute) { + location = location / length; + } + + var angle = _calcAngleForLocation(this, location), + _x = params.cx + (params.r * Math.cos(angle)), + _y = params.cy + (params.r * Math.sin(angle)); + + return { x: gentleRound(_x), y: gentleRound(_y), theta: angle }; + }; + + /** + * returns the gradient of the segment at the given point. + */ + this.gradientAtPoint = function (location, absolute) { + var p = this.pointOnPath(location, absolute); + var m = _jg.normal([ params.cx, params.cy ], [p.x, p.y ]); + if (!this.anticlockwise && (m === Infinity || m === -Infinity)) { + m *= -1; + } + return m; + }; + + this.pointAlongPathFrom = function (location, distance, absolute) { + var p = this.pointOnPath(location, absolute), + arcSpan = distance / circumference * 2 * Math.PI, + dir = this.anticlockwise ? -1 : 1, + startAngle = p.theta + (dir * arcSpan), + startX = params.cx + (this.radius * Math.cos(startAngle)), + startY = params.cy + (this.radius * Math.sin(startAngle)); + + return {x: startX, y: startY}; + }; + + // TODO: lineIntersection + }, + + Bezier: function (params) { + this.curve = [ + { x: params.x1, y: params.y1}, + { x: params.cp1x, y: params.cp1y }, + { x: params.cp2x, y: params.cp2y }, + { x: params.x2, y: params.y2 } + ]; + + var _isPoint = function(c) { + return c[0].x === c[1].x && c[0].y === c[1].y; + }; + + var _dist = function(p1, p2 ) { + return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2)); + }; + + var _compute = function(loc) { + + var EMPTY_POINT = {x:0, y:0}; + + if (loc === 0) { + return this.curve[0]; + } + + var degree = this.curve.length - 1; + + if (loc === 1) { + return this.curve[degree]; + } + + var o = this.curve; + var s = 1 - loc; + + if (degree === 0) { + return this.curve[0]; + } + + if (degree === 1) { + return { + x: s * o[0].x + loc * o[1].x, + y: s * o[0].y + loc * o[1].y + }; + } + + if (degree < 4) { + + var l = s * s, h = loc * loc, u = 0, m, g, f; + + if (degree === 2) { + o = [o[0], o[1], o[2], EMPTY_POINT]; + m = l; + g = 2 * (s * loc); + f = h; + } else if (degree === 3) { + m = l * s; + g = 3 * (l * loc); + f = 3 * (s * h); + u = loc * h; + } + + return { + x: m * o[0].x + g * o[1].x + f * o[2].x + u * o[3].x, + y: m * o[0].y + g * o[1].y + f * o[2].y + u * o[3].y + }; + } else { + return EMPTY_POINT; // not supported. + } + }.bind(this); + + var _getLUT = function(steps) { + var out = []; + steps--; + for (var n = 0; n <= steps; n++) { + out.push(_compute(n / steps)); + } + return out; + }; + + var _computeLength = function() { + + if (_isPoint(this.curve)) { + this.length = 0; + } + + var steps = 16; + var lut = _getLUT(steps); + this.length = 0; + + for (var i = 0; i < steps - 1; i++) { + var a = lut[i], b = lut[i + 1]; + this.length += _dist(a, b); + } + }.bind(this); + + var _super = _jp.Segments.AbstractSegment.apply(this, arguments); + // although this is not a strictly rigorous determination of bounds + // of a bezier curve, it works for the types of curves that this segment + // type produces. + this.bounds = { + minX: Math.min(params.x1, params.x2, params.cp1x, params.cp2x), + minY: Math.min(params.y1, params.y2, params.cp1y, params.cp2y), + maxX: Math.max(params.x1, params.x2, params.cp1x, params.cp2x), + maxY: Math.max(params.y1, params.y2, params.cp1y, params.cp2y) + }; + + this.type = "Bezier"; + + _computeLength(); + + var _translateLocation = function (_curve, location, absolute) { + if (absolute) { + location = root.jsBezier.locationAlongCurveFrom(_curve, location > 0 ? 0 : 1, location); + } + + return location; + }; + + /** + * returns the point on the segment's path that is 'location' along the length of the path, where 'location' is a decimal from + * 0 to 1 inclusive. + */ + this.pointOnPath = function (location, absolute) { + location = _translateLocation(this.curve, location, absolute); + return root.jsBezier.pointOnCurve(this.curve, location); + }; + + /** + * returns the gradient of the segment at the given point. + */ + this.gradientAtPoint = function (location, absolute) { + location = _translateLocation(this.curve, location, absolute); + return root.jsBezier.gradientAtPoint(this.curve, location); + }; + + this.pointAlongPathFrom = function (location, distance, absolute) { + location = _translateLocation(this.curve, location, absolute); + return root.jsBezier.pointAlongCurveFrom(this.curve, location, distance); + }; + + this.getLength = function () { + return this.length; + }; + + this.getBounds = function () { + return this.bounds; + }; + + this.findClosestPointOnPath = function (x, y) { + var p = root.jsBezier.nearestPointOnCurve({x:x,y:y}, this.curve); + return { + d:Math.sqrt(Math.pow(p.point.x - x, 2) + Math.pow(p.point.y - y, 2)), + x:p.point.x, + y:p.point.y, + l:1 - p.location, + s:this + }; + }; + + this.lineIntersection = function(x1, y1, x2, y2) { + return root.jsBezier.lineIntersection(x1, y1, x2, y2, this.curve); + }; + } + }; + + _jp.SegmentRenderer = { + getPath: function (segment, isFirstSegment) { + return ({ + "Straight": function (isFirstSegment) { + var d = segment.getCoordinates(); + return (isFirstSegment ? "M " + d.x1 + " " + d.y1 + " " : "") + "L " + d.x2 + " " + d.y2; + }, + "Bezier": function (isFirstSegment) { + var d = segment.params; + return (isFirstSegment ? "M " + d.x2 + " " + d.y2 + " " : "") + + "C " + d.cp2x + " " + d.cp2y + " " + d.cp1x + " " + d.cp1y + " " + d.x1 + " " + d.y1; + }, + "Arc": function (isFirstSegment) { + var d = segment.params, + laf = segment.sweep > Math.PI ? 1 : 0, + sf = segment.anticlockwise ? 0 : 1; + + return (isFirstSegment ? "M" + segment.x1 + " " + segment.y1 + " " : "") + "A " + segment.radius + " " + d.r + " 0 " + laf + "," + sf + " " + segment.x2 + " " + segment.y2; + } + })[segment.type](isFirstSegment); + } + }; + + /* + Class: UIComponent + Superclass for Connector and AbstractEndpoint. + */ + var AbstractComponent = function () { + this.resetBounds = function () { + this.bounds = { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity }; + }; + this.resetBounds(); + }; + + /* + * Class: Connector + * Superclass for all Connectors; here is where Segments are managed. This is exposed on jsPlumb just so it + * can be accessed from other files. You should not try to instantiate one of these directly. + * + * When this class is asked for a pointOnPath, or gradient etc, it must first figure out which segment to dispatch + * that request to. This is done by keeping track of the total connector length as segments are added, and also + * their cumulative ratios to the total length. Then when the right segment is found it is a simple case of dispatching + * the request to it (and adjusting 'location' so that it is relative to the beginning of that segment.) + */ + _jp.Connectors.AbstractConnector = function (params) { + + AbstractComponent.apply(this, arguments); + + var segments = [], + totalLength = 0, + segmentProportions = [], + segmentProportionalLengths = [], + stub = params.stub || 0, + sourceStub = _ju.isArray(stub) ? stub[0] : stub, + targetStub = _ju.isArray(stub) ? stub[1] : stub, + gap = params.gap || 0, + sourceGap = _ju.isArray(gap) ? gap[0] : gap, + targetGap = _ju.isArray(gap) ? gap[1] : gap, + userProvidedSegments = null, + paintInfo = null; + + this.getPathData = function() { + var p = ""; + for (var i = 0; i < segments.length; i++) { + p += _jp.SegmentRenderer.getPath(segments[i], i === 0); + p += " "; + } + return p; + }; + + /** + * Function: findSegmentForPoint + * Returns the segment that is closest to the given [x,y], + * null if nothing found. This function returns a JS + * object with: + * + * d - distance from segment + * l - proportional location in segment + * x - x point on the segment + * y - y point on the segment + * s - the segment itself. + * connectorLocation - the location on the connector of the point, expressed as a decimal between 0 and 1 inclusive. + */ + this.findSegmentForPoint = function (x, y) { + var out = { d: Infinity, s: null, x: null, y: null, l: null }; + for (var i = 0; i < segments.length; i++) { + var _s = segments[i].findClosestPointOnPath(x, y); + if (_s.d < out.d) { + out.d = _s.d; + out.l = _s.l; + out.x = _s.x; + out.y = _s.y; + out.s = segments[i]; + out.x1 = _s.x1; + out.x2 = _s.x2; + out.y1 = _s.y1; + out.y2 = _s.y2; + out.index = i; + out.connectorLocation = segmentProportions[i][0] + (_s.l * (segmentProportions[i][1] - segmentProportions[i][0])); + } + } + + return out; + }; + + this.lineIntersection = function(x1, y1, x2, y2) { + var out = []; + for (var i = 0; i < segments.length; i++) { + out.push.apply(out, segments[i].lineIntersection(x1, y1, x2, y2)); + } + return out; + }; + + this.boxIntersection = function(x, y, w, h) { + var out = []; + for (var i = 0; i < segments.length; i++) { + out.push.apply(out, segments[i].boxIntersection(x, y, w, h)); + } + return out; + }; + + this.boundingBoxIntersection = function(box) { + var out = []; + for (var i = 0; i < segments.length; i++) { + out.push.apply(out, segments[i].boundingBoxIntersection(box)); + } + return out; + }; + + var _updateSegmentProportions = function () { + var curLoc = 0; + for (var i = 0; i < segments.length; i++) { + var sl = segments[i].getLength(); + segmentProportionalLengths[i] = sl / totalLength; + segmentProportions[i] = [curLoc, (curLoc += (sl / totalLength)) ]; + } + }, + + /** + * returns [segment, proportion of travel in segment, segment index] for the segment + * that contains the point which is 'location' distance along the entire path, where + * 'location' is a decimal between 0 and 1 inclusive. in this connector type, paths + * are made up of a list of segments, each of which contributes some fraction to + * the total length. + * From 1.3.10 this also supports the 'absolute' property, which lets us specify a location + * as the absolute distance in pixels, rather than a proportion of the total path. + */ + _findSegmentForLocation = function (location, absolute) { + + var idx, i, inSegmentProportion; + + if (absolute) { + location = location > 0 ? location / totalLength : (totalLength + location) / totalLength; + } + + // if location 1 we know its the last segment + if (location === 1) { + idx = segments.length - 1; + inSegmentProportion = 1; + } else if (location === 0) { + // if location 0 we know its the first segment + inSegmentProportion = 0; + idx = 0; + } else { + + // if location >= 0.5, traverse backwards (of course not exact, who knows the segment proportions. but + // an educated guess at least) + if (location >= 0.5) { + + idx = 0; + inSegmentProportion = 0; + for (i = segmentProportions.length - 1; i > -1; i--) { + if (segmentProportions[i][1] >= location && segmentProportions[i][0] <= location) { + idx = i; + inSegmentProportion = (location - segmentProportions[i][0]) / segmentProportionalLengths[i]; + break; + } + } + + } else { + idx = segmentProportions.length - 1; + inSegmentProportion = 1; + for (i = 0; i < segmentProportions.length; i++) { + if (segmentProportions[i][1] >= location) { + idx = i; + inSegmentProportion = (location - segmentProportions[i][0]) / segmentProportionalLengths[i]; + break; + } + } + } + } + + return { segment: segments[idx], proportion: inSegmentProportion, index: idx }; + }, + _addSegment = function (conn, type, params) { + if (params.x1 === params.x2 && params.y1 === params.y2) { + return; + } + var s = new _jp.Segments[type](params); + segments.push(s); + totalLength += s.getLength(); + conn.updateBounds(s); + }, + _clearSegments = function () { + totalLength = segments.length = segmentProportions.length = segmentProportionalLengths.length = 0; + }; + + this.setSegments = function (_segs) { + userProvidedSegments = []; + totalLength = 0; + for (var i = 0; i < _segs.length; i++) { + userProvidedSegments.push(_segs[i]); + totalLength += _segs[i].getLength(); + } + }; + + this.getLength = function() { + return totalLength; + }; + + var _prepareCompute = function (params) { + this.strokeWidth = params.strokeWidth; + var segment = _jg.quadrant(params.sourcePos, params.targetPos), + swapX = params.targetPos[0] < params.sourcePos[0], + swapY = params.targetPos[1] < params.sourcePos[1], + lw = params.strokeWidth || 1, + so = params.sourceEndpoint.anchor.getOrientation(params.sourceEndpoint), + to = params.targetEndpoint.anchor.getOrientation(params.targetEndpoint), + x = swapX ? params.targetPos[0] : params.sourcePos[0], + y = swapY ? params.targetPos[1] : params.sourcePos[1], + w = Math.abs(params.targetPos[0] - params.sourcePos[0]), + h = Math.abs(params.targetPos[1] - params.sourcePos[1]); + + // if either anchor does not have an orientation set, we derive one from their relative + // positions. we fix the axis to be the one in which the two elements are further apart, and + // point each anchor at the other element. this is also used when dragging a new connection. + if (so[0] === 0 && so[1] === 0 || to[0] === 0 && to[1] === 0) { + var index = w > h ? 0 : 1, oIndex = [1, 0][index]; + so = []; + to = []; + so[index] = params.sourcePos[index] > params.targetPos[index] ? -1 : 1; + to[index] = params.sourcePos[index] > params.targetPos[index] ? 1 : -1; + so[oIndex] = 0; + to[oIndex] = 0; + } + + var sx = swapX ? w + (sourceGap * so[0]) : sourceGap * so[0], + sy = swapY ? h + (sourceGap * so[1]) : sourceGap * so[1], + tx = swapX ? targetGap * to[0] : w + (targetGap * to[0]), + ty = swapY ? targetGap * to[1] : h + (targetGap * to[1]), + oProduct = ((so[0] * to[0]) + (so[1] * to[1])); + + var result = { + sx: sx, sy: sy, tx: tx, ty: ty, lw: lw, + xSpan: Math.abs(tx - sx), + ySpan: Math.abs(ty - sy), + mx: (sx + tx) / 2, + my: (sy + ty) / 2, + so: so, to: to, x: x, y: y, w: w, h: h, + segment: segment, + startStubX: sx + (so[0] * sourceStub), + startStubY: sy + (so[1] * sourceStub), + endStubX: tx + (to[0] * targetStub), + endStubY: ty + (to[1] * targetStub), + isXGreaterThanStubTimes2: Math.abs(sx - tx) > (sourceStub + targetStub), + isYGreaterThanStubTimes2: Math.abs(sy - ty) > (sourceStub + targetStub), + opposite: oProduct === -1, + perpendicular: oProduct === 0, + orthogonal: oProduct === 1, + sourceAxis: so[0] === 0 ? "y" : "x", + points: [x, y, w, h, sx, sy, tx, ty ], + stubs:[sourceStub, targetStub] + }; + result.anchorOrientation = result.opposite ? "opposite" : result.orthogonal ? "orthogonal" : "perpendicular"; + return result; + }; + + this.getSegments = function () { + return segments; + }; + + this.updateBounds = function (segment) { + var segBounds = segment.getBounds(); + this.bounds.minX = Math.min(this.bounds.minX, segBounds.minX); + this.bounds.maxX = Math.max(this.bounds.maxX, segBounds.maxX); + this.bounds.minY = Math.min(this.bounds.minY, segBounds.minY); + this.bounds.maxY = Math.max(this.bounds.maxY, segBounds.maxY); + }; + + var dumpSegmentsToConsole = function () { + console.log("SEGMENTS:"); + for (var i = 0; i < segments.length; i++) { + console.log(segments[i].type, segments[i].getLength(), segmentProportions[i]); + } + }; + + this.pointOnPath = function (location, absolute) { + var seg = _findSegmentForLocation(location, absolute); + return seg.segment && seg.segment.pointOnPath(seg.proportion, false) || [0, 0]; + }; + + this.gradientAtPoint = function (location, absolute) { + var seg = _findSegmentForLocation(location, absolute); + return seg.segment && seg.segment.gradientAtPoint(seg.proportion, false) || 0; + }; + + this.pointAlongPathFrom = function (location, distance, absolute) { + var seg = _findSegmentForLocation(location, absolute); + // TODO what happens if this crosses to the next segment? + return seg.segment && seg.segment.pointAlongPathFrom(seg.proportion, distance, false) || [0, 0]; + }; + + this.compute = function (params) { + paintInfo = _prepareCompute.call(this, params); + + _clearSegments(); + this._compute(paintInfo, params); + this.x = paintInfo.points[0]; + this.y = paintInfo.points[1]; + this.w = paintInfo.points[2]; + this.h = paintInfo.points[3]; + this.segment = paintInfo.segment; + _updateSegmentProportions(); + }; + + return { + addSegment: _addSegment, + prepareCompute: _prepareCompute, + sourceStub: sourceStub, + targetStub: targetStub, + maxStub: Math.max(sourceStub, targetStub), + sourceGap: sourceGap, + targetGap: targetGap, + maxGap: Math.max(sourceGap, targetGap) + }; + }; + _ju.extend(_jp.Connectors.AbstractConnector, AbstractComponent); + + + // ********************************* END OF CONNECTOR TYPES ******************************************************************* + + // ********************************* ENDPOINT TYPES ******************************************************************* + + _jp.Endpoints.AbstractEndpoint = function (params) { + AbstractComponent.apply(this, arguments); + var compute = this.compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + var out = this._compute.apply(this, arguments); + this.x = out[0]; + this.y = out[1]; + this.w = out[2]; + this.h = out[3]; + this.bounds.minX = this.x; + this.bounds.minY = this.y; + this.bounds.maxX = this.x + this.w; + this.bounds.maxY = this.y + this.h; + return out; + }; + return { + compute: compute, + cssClass: params.cssClass + }; + }; + _ju.extend(_jp.Endpoints.AbstractEndpoint, AbstractComponent); + + /** + * Class: Endpoints.Dot + * A round endpoint, with default radius 10 pixels. + */ + + /** + * Function: Constructor + * + * Parameters: + * + * radius - radius of the endpoint. defaults to 10 pixels. + */ + _jp.Endpoints.Dot = function (params) { + this.type = "Dot"; + var _super = _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + params = params || {}; + this.radius = params.radius || 10; + this.defaultOffset = 0.5 * this.radius; + this.defaultInnerRadius = this.radius / 3; + + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + this.radius = endpointStyle.radius || this.radius; + var x = anchorPoint[0] - this.radius, + y = anchorPoint[1] - this.radius, + w = this.radius * 2, + h = this.radius * 2; + + if (endpointStyle.stroke) { + var lw = endpointStyle.strokeWidth || 1; + x -= lw; + y -= lw; + w += (lw * 2); + h += (lw * 2); + } + return [ x, y, w, h, this.radius ]; + }; + }; + _ju.extend(_jp.Endpoints.Dot, _jp.Endpoints.AbstractEndpoint); + + _jp.Endpoints.Rectangle = function (params) { + this.type = "Rectangle"; + var _super = _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + params = params || {}; + this.width = params.width || 20; + this.height = params.height || 20; + + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + var width = endpointStyle.width || this.width, + height = endpointStyle.height || this.height, + x = anchorPoint[0] - (width / 2), + y = anchorPoint[1] - (height / 2); + + return [ x, y, width, height]; + }; + }; + _ju.extend(_jp.Endpoints.Rectangle, _jp.Endpoints.AbstractEndpoint); + + var DOMElementEndpoint = function (params) { + _jp.jsPlumbUIComponent.apply(this, arguments); + this._jsPlumb.displayElements = []; + }; + _ju.extend(DOMElementEndpoint, _jp.jsPlumbUIComponent, { + getDisplayElements: function () { + return this._jsPlumb.displayElements; + }, + appendDisplayElement: function (el) { + this._jsPlumb.displayElements.push(el); + } + }); + + /** + * Class: Endpoints.Image + * Draws an image as the Endpoint. + */ + /** + * Function: Constructor + * + * Parameters: + * + * src - location of the image to use. + + TODO: multiple references to self. not sure quite how to get rid of them entirely. perhaps self = null in the cleanup + function will suffice + + TODO this class still might leak memory. + + */ + _jp.Endpoints.Image = function (params) { + + this.type = "Image"; + DOMElementEndpoint.apply(this, arguments); + _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + + var _onload = params.onload, + src = params.src || params.url, + clazz = params.cssClass ? " " + params.cssClass : ""; + + this._jsPlumb.img = new Image(); + this._jsPlumb.ready = false; + this._jsPlumb.initialized = false; + this._jsPlumb.deleted = false; + this._jsPlumb.widthToUse = params.width; + this._jsPlumb.heightToUse = params.height; + this._jsPlumb.endpoint = params.endpoint; + + this._jsPlumb.img.onload = function () { + if (this._jsPlumb != null) { + this._jsPlumb.ready = true; + this._jsPlumb.widthToUse = this._jsPlumb.widthToUse || this._jsPlumb.img.width; + this._jsPlumb.heightToUse = this._jsPlumb.heightToUse || this._jsPlumb.img.height; + if (_onload) { + _onload(this); + } + } + }.bind(this); + + /* + Function: setImage + Sets the Image to use in this Endpoint. + + Parameters: + img - may be a URL or an Image object + onload - optional; a callback to execute once the image has loaded. + */ + this._jsPlumb.endpoint.setImage = function (_img, onload) { + var s = _img.constructor === String ? _img : _img.src; + _onload = onload; + this._jsPlumb.img.src = s; + + if (this.canvas != null) { + this.canvas.setAttribute("src", this._jsPlumb.img.src); + } + }.bind(this); + + this._jsPlumb.endpoint.setImage(src, _onload); + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + this.anchorPoint = anchorPoint; + if (this._jsPlumb.ready) { + return [anchorPoint[0] - this._jsPlumb.widthToUse / 2, anchorPoint[1] - this._jsPlumb.heightToUse / 2, + this._jsPlumb.widthToUse, this._jsPlumb.heightToUse]; + } + else { + return [0, 0, 0, 0]; + } + }; + + this.canvas = _jp.createElement("img", { + position:"absolute", + margin:0, + padding:0, + outline:0 + }, this._jsPlumb.instance.endpointClass + clazz); + + if (this._jsPlumb.widthToUse) { + this.canvas.setAttribute("width", this._jsPlumb.widthToUse); + } + if (this._jsPlumb.heightToUse) { + this.canvas.setAttribute("height", this._jsPlumb.heightToUse); + } + this._jsPlumb.instance.appendElement(this.canvas); + + this.actuallyPaint = function (d, style, anchor) { + if (!this._jsPlumb.deleted) { + if (!this._jsPlumb.initialized) { + this.canvas.setAttribute("src", this._jsPlumb.img.src); + this.appendDisplayElement(this.canvas); + this._jsPlumb.initialized = true; + } + var x = this.anchorPoint[0] - (this._jsPlumb.widthToUse / 2), + y = this.anchorPoint[1] - (this._jsPlumb.heightToUse / 2); + _ju.sizeElement(this.canvas, x, y, this._jsPlumb.widthToUse, this._jsPlumb.heightToUse); + } + }; + + this.paint = function (style, anchor) { + if (this._jsPlumb != null) { // may have been deleted + if (this._jsPlumb.ready) { + this.actuallyPaint(style, anchor); + } + else { + root.setTimeout(function () { + this.paint(style, anchor); + }.bind(this), 200); + } + } + }; + }; + _ju.extend(_jp.Endpoints.Image, [ DOMElementEndpoint, _jp.Endpoints.AbstractEndpoint ], { + cleanup: function (force) { + if (force) { + this._jsPlumb.deleted = true; + if (this.canvas) { + this.canvas.parentNode.removeChild(this.canvas); + } + this.canvas = null; + } + } + }); + + /* + * Class: Endpoints.Blank + * An Endpoint that paints nothing (visible) on the screen. Supports cssClass and hoverClass parameters like all Endpoints. + */ + _jp.Endpoints.Blank = function (params) { + var _super = _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + this.type = "Blank"; + DOMElementEndpoint.apply(this, arguments); + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + return [anchorPoint[0], anchorPoint[1], 10, 0]; + }; + + var clazz = params.cssClass ? " " + params.cssClass : ""; + + this.canvas = _jp.createElement("div", { + display: "block", + width: "1px", + height: "1px", + background: "transparent", + position: "absolute" + }, this._jsPlumb.instance.endpointClass + clazz); + + this._jsPlumb.instance.appendElement(this.canvas); + + this.paint = function (style, anchor) { + _ju.sizeElement(this.canvas, this.x, this.y, this.w, this.h); + }; + }; + _ju.extend(_jp.Endpoints.Blank, [_jp.Endpoints.AbstractEndpoint, DOMElementEndpoint], { + cleanup: function () { + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + } + }); + + /* + * Class: Endpoints.Triangle + * A triangular Endpoint. + */ + /* + * Function: Constructor + * + * Parameters: + * + * width width of the triangle's base. defaults to 55 pixels. + * height height of the triangle from base to apex. defaults to 55 pixels. + */ + _jp.Endpoints.Triangle = function (params) { + this.type = "Triangle"; + _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + var self = this; + params = params || { }; + params.width = params.width || 55; + params.height = params.height || 55; + this.width = params.width; + this.height = params.height; + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + var width = endpointStyle.width || self.width, + height = endpointStyle.height || self.height, + x = anchorPoint[0] - (width / 2), + y = anchorPoint[1] - (height / 2); + return [ x, y, width, height ]; + }; + }; +// ********************************* END OF ENDPOINT TYPES ******************************************************************* + + +// ********************************* OVERLAY DEFINITIONS *********************************************************************** + + var AbstractOverlay = _jp.Overlays.AbstractOverlay = function (params) { + this.visible = true; + this.isAppendedAtTopLevel = true; + this.component = params.component; + this.loc = params.location == null ? 0.5 : params.location; + this.endpointLoc = params.endpointLocation == null ? [ 0.5, 0.5] : params.endpointLocation; + this.visible = params.visible !== false; + }; + AbstractOverlay.prototype = { + cleanup: function (force) { + if (force) { + this.component = null; + this.canvas = null; + this.endpointLoc = null; + } + }, + reattach:function(instance, component) { }, + setVisible: function (val) { + this.visible = val; + this.component.repaint(); + }, + isVisible: function () { + return this.visible; + }, + hide: function () { + this.setVisible(false); + }, + show: function () { + this.setVisible(true); + }, + incrementLocation: function (amount) { + this.loc += amount; + this.component.repaint(); + }, + setLocation: function (l) { + this.loc = l; + this.component.repaint(); + }, + getLocation: function () { + return this.loc; + }, + updateFrom:function() { } + }; + + + /* + * Class: Overlays.Arrow + * + * An arrow overlay, defined by four points: the head, the two sides of the tail, and a 'foldback' point at some distance along the length + * of the arrow that lines from each tail point converge into. The foldback point is defined using a decimal that indicates some fraction + * of the length of the arrow and has a default value of 0.623. A foldback point value of 1 would mean that the arrow had a straight line + * across the tail. + */ + /* + * @constructor + * + * @param {Object} params Constructor params. + * @param {Number} [params.length] Distance in pixels from head to tail baseline. default 20. + * @param {Number} [params.width] Width in pixels of the tail baseline. default 20. + * @param {String} [params.fill] Style to use when filling the arrow. defaults to "black". + * @param {String} [params.stroke] Style to use when stroking the arrow. defaults to null, which means the arrow is not stroked. + * @param {Number} [params.stroke-width] Line width to use when stroking the arrow. defaults to 1, but only used if stroke is not null. + * @param {Number} [params.foldback] Distance (as a decimal from 0 to 1 inclusive) along the length of the arrow marking the point the tail points should fold back to. defaults to 0.623. + * @param {Number} [params.location] Distance (as a decimal from 0 to 1 inclusive) marking where the arrow should sit on the connector. defaults to 0.5. + * @param {NUmber} [params.direction] Indicates the direction the arrow points in. valid values are -1 and 1; 1 is default. + */ + _jp.Overlays.Arrow = function (params) { + this.type = "Arrow"; + AbstractOverlay.apply(this, arguments); + this.isAppendedAtTopLevel = false; + params = params || {}; + var self = this; + + this.length = params.length || 20; + this.width = params.width || 20; + this.id = params.id; + this.direction = (params.direction || 1) < 0 ? -1 : 1; + var paintStyle = params.paintStyle || { "stroke-width": 1 }, + // how far along the arrow the lines folding back in come to. default is 62.3%. + foldback = params.foldback || 0.623; + + this.computeMaxSize = function () { + return self.width * 1.5; + }; + + this.elementCreated = function(p, component) { + this.path = p; + if (params.events) { + for (var i in params.events) { + _jp.on(p, i, params.events[i]); + } + } + }; + + this.draw = function (component, currentConnectionPaintStyle) { + + var hxy, mid, txy, tail, cxy; + if (component.pointAlongPathFrom) { + + if (_ju.isString(this.loc) || this.loc > 1 || this.loc < 0) { + var l = parseInt(this.loc, 10), + fromLoc = this.loc < 0 ? 1 : 0; + hxy = component.pointAlongPathFrom(fromLoc, l, false); + mid = component.pointAlongPathFrom(fromLoc, l - (this.direction * this.length / 2), false); + txy = _jg.pointOnLine(hxy, mid, this.length); + } + else if (this.loc === 1) { + hxy = component.pointOnPath(this.loc); + mid = component.pointAlongPathFrom(this.loc, -(this.length)); + txy = _jg.pointOnLine(hxy, mid, this.length); + + if (this.direction === -1) { + var _ = txy; + txy = hxy; + hxy = _; + } + } + else if (this.loc === 0) { + txy = component.pointOnPath(this.loc); + mid = component.pointAlongPathFrom(this.loc, this.length); + hxy = _jg.pointOnLine(txy, mid, this.length); + if (this.direction === -1) { + var __ = txy; + txy = hxy; + hxy = __; + } + } + else { + hxy = component.pointAlongPathFrom(this.loc, this.direction * this.length / 2); + mid = component.pointOnPath(this.loc); + txy = _jg.pointOnLine(hxy, mid, this.length); + } + + tail = _jg.perpendicularLineTo(hxy, txy, this.width); + cxy = _jg.pointOnLine(hxy, txy, foldback * this.length); + + var d = { hxy: hxy, tail: tail, cxy: cxy }, + stroke = paintStyle.stroke || currentConnectionPaintStyle.stroke, + fill = paintStyle.fill || currentConnectionPaintStyle.stroke, + lineWidth = paintStyle.strokeWidth || currentConnectionPaintStyle.strokeWidth; + + return { + component: component, + d: d, + "stroke-width": lineWidth, + stroke: stroke, + fill: fill, + minX: Math.min(hxy.x, tail[0].x, tail[1].x), + maxX: Math.max(hxy.x, tail[0].x, tail[1].x), + minY: Math.min(hxy.y, tail[0].y, tail[1].y), + maxY: Math.max(hxy.y, tail[0].y, tail[1].y) + }; + } + else { + return {component: component, minX: 0, maxX: 0, minY: 0, maxY: 0}; + } + }; + }; + _ju.extend(_jp.Overlays.Arrow, AbstractOverlay, { + updateFrom:function(d) { + this.length = d.length || this.length; + this.width = d.width|| this.width; + this.direction = d.direction != null ? d.direction : this.direction; + this.foldback = d.foldback|| this.foldback; + }, + cleanup:function() { + if (this.path && this.path.parentNode) { + this.path.parentNode.removeChild(this.path); + } + } + }); + + /* + * Class: Overlays.PlainArrow + * + * A basic arrow. This is in fact just one instance of the more generic case in which the tail folds back on itself to some + * point along the length of the arrow: in this case, that foldback point is the full length of the arrow. so it just does + * a 'call' to Arrow with foldback set appropriately. + */ + /* + * Function: Constructor + * See for allowed parameters for this overlay. + */ + _jp.Overlays.PlainArrow = function (params) { + params = params || {}; + var p = _jp.extend(params, {foldback: 1}); + _jp.Overlays.Arrow.call(this, p); + this.type = "PlainArrow"; + }; + _ju.extend(_jp.Overlays.PlainArrow, _jp.Overlays.Arrow); + + /* + * Class: Overlays.Diamond + * + * A diamond. Like PlainArrow, this is a concrete case of the more generic case of the tail points converging on some point...it just + * happens that in this case, that point is greater than the length of the the arrow. + * + * this could probably do with some help with positioning...due to the way it reuses the Arrow paint code, what Arrow thinks is the + * center is actually 1/4 of the way along for this guy. but we don't have any knowledge of pixels at this point, so we're kind of + * stuck when it comes to helping out the Arrow class. possibly we could pass in a 'transpose' parameter or something. the value + * would be -l/4 in this case - move along one quarter of the total length. + */ + /* + * Function: Constructor + * See for allowed parameters for this overlay. + */ + _jp.Overlays.Diamond = function (params) { + params = params || {}; + var l = params.length || 40, + p = _jp.extend(params, {length: l / 2, foldback: 2}); + _jp.Overlays.Arrow.call(this, p); + this.type = "Diamond"; + }; + _ju.extend(_jp.Overlays.Diamond, _jp.Overlays.Arrow); + + var _getDimensions = function (component, forceRefresh) { + if (component._jsPlumb.cachedDimensions == null || forceRefresh) { + component._jsPlumb.cachedDimensions = component.getDimensions(); + } + return component._jsPlumb.cachedDimensions; + }; + + // abstract superclass for overlays that add an element to the DOM. + var AbstractDOMOverlay = function (params) { + _jp.jsPlumbUIComponent.apply(this, arguments); + AbstractOverlay.apply(this, arguments); + + // hand off fired events to associated component. + var _f = this.fire; + this.fire = function () { + _f.apply(this, arguments); + if (this.component) { + this.component.fire.apply(this.component, arguments); + } + }; + + this.detached=false; + this.id = params.id; + this._jsPlumb.div = null; + this._jsPlumb.initialised = false; + this._jsPlumb.component = params.component; + this._jsPlumb.cachedDimensions = null; + this._jsPlumb.create = params.create; + this._jsPlumb.initiallyInvisible = params.visible === false; + + this.getElement = function () { + if (this._jsPlumb.div == null) { + var div = this._jsPlumb.div = _jp.getElement(this._jsPlumb.create(this._jsPlumb.component)); + div.style.position = "absolute"; + jsPlumb.addClass(div, this._jsPlumb.instance.overlayClass + " " + + (this.cssClass ? this.cssClass : + params.cssClass ? params.cssClass : "")); + this._jsPlumb.instance.appendElement(div); + this._jsPlumb.instance.getId(div); + this.canvas = div; + + // in IE the top left corner is what it placed at the desired location. This will not + // be fixed. IE8 is not going to be supported for much longer. + var ts = "translate(-50%, -50%)"; + div.style.webkitTransform = ts; + div.style.mozTransform = ts; + div.style.msTransform = ts; + div.style.oTransform = ts; + div.style.transform = ts; + + // write the related component into the created element + div._jsPlumb = this; + + if (params.visible === false) { + div.style.display = "none"; + } + } + return this._jsPlumb.div; + }; + + this.draw = function (component, currentConnectionPaintStyle, absolutePosition) { + var td = _getDimensions(this); + if (td != null && td.length === 2) { + var cxy = { x: 0, y: 0 }; + + // absolutePosition would have been set by a call to connection.setAbsoluteOverlayPosition. + if (absolutePosition) { + cxy = { x: absolutePosition[0], y: absolutePosition[1] }; + } + else if (component.pointOnPath) { + var loc = this.loc, absolute = false; + if (_ju.isString(this.loc) || this.loc < 0 || this.loc > 1) { + loc = parseInt(this.loc, 10); + absolute = true; + } + cxy = component.pointOnPath(loc, absolute); // a connection + } + else { + var locToUse = this.loc.constructor === Array ? this.loc : this.endpointLoc; + cxy = { x: locToUse[0] * component.w, + y: locToUse[1] * component.h }; + } + + var minx = cxy.x - (td[0] / 2), + miny = cxy.y - (td[1] / 2); + + return { + component: component, + d: { minx: minx, miny: miny, td: td, cxy: cxy }, + minX: minx, + maxX: minx + td[0], + minY: miny, + maxY: miny + td[1] + }; + } + else { + return {minX: 0, maxX: 0, minY: 0, maxY: 0}; + } + }; + }; + _ju.extend(AbstractDOMOverlay, [_jp.jsPlumbUIComponent, AbstractOverlay], { + getDimensions: function () { + return [1,1]; + }, + setVisible: function (state) { + if (this._jsPlumb.div) { + this._jsPlumb.div.style.display = state ? "block" : "none"; + // if initially invisible, dimensions are 0,0 and never get updated + if (state && this._jsPlumb.initiallyInvisible) { + _getDimensions(this, true); + this.component.repaint(); + this._jsPlumb.initiallyInvisible = false; + } + } + }, + /* + * Function: clearCachedDimensions + * Clears the cached dimensions for the label. As a performance enhancement, label dimensions are + * cached from 1.3.12 onwards. The cache is cleared when you change the label text, of course, but + * there are other reasons why the text dimensions might change - if you make a change through CSS, for + * example, you might change the font size. in that case you should explicitly call this method. + */ + clearCachedDimensions: function () { + this._jsPlumb.cachedDimensions = null; + }, + cleanup: function (force) { + if (force) { + if (this._jsPlumb.div != null) { + this._jsPlumb.div._jsPlumb = null; + this._jsPlumb.instance.removeElement(this._jsPlumb.div); + } + } + else { + // if not a forced cleanup, just detach child from parent for now. + if (this._jsPlumb && this._jsPlumb.div && this._jsPlumb.div.parentNode) { + this._jsPlumb.div.parentNode.removeChild(this._jsPlumb.div); + } + this.detached = true; + } + + }, + reattach:function(instance, component) { + if (this._jsPlumb.div != null) { + instance.getContainer().appendChild(this._jsPlumb.div); + } + this.detached = false; + }, + computeMaxSize: function () { + var td = _getDimensions(this); + return Math.max(td[0], td[1]); + }, + paint: function (p, containerExtents) { + if (!this._jsPlumb.initialised) { + this.getElement(); + p.component.appendDisplayElement(this._jsPlumb.div); + this._jsPlumb.initialised = true; + if (this.detached) { + this._jsPlumb.div.parentNode.removeChild(this._jsPlumb.div); + } + } + this._jsPlumb.div.style.left = (p.component.x + p.d.minx) + "px"; + this._jsPlumb.div.style.top = (p.component.y + p.d.miny) + "px"; + } + }); + + /* + * Class: Overlays.Custom + * A Custom overlay. You supply a 'create' function which returns some DOM element, and jsPlumb positions it. + * The 'create' function is passed a Connection or Endpoint. + */ + /* + * Function: Constructor + * + * Parameters: + * create - function for jsPlumb to call that returns a DOM element. + * location - distance (as a decimal from 0 to 1 inclusive) marking where the label should sit on the connector. defaults to 0.5. + * id - optional id to use for later retrieval of this overlay. + * + */ + _jp.Overlays.Custom = function (params) { + this.type = "Custom"; + AbstractDOMOverlay.apply(this, arguments); + }; + _ju.extend(_jp.Overlays.Custom, AbstractDOMOverlay); + + _jp.Overlays.GuideLines = function () { + var self = this; + self.length = 50; + self.strokeWidth = 5; + this.type = "GuideLines"; + AbstractOverlay.apply(this, arguments); + _jp.jsPlumbUIComponent.apply(this, arguments); + this.draw = function (connector, currentConnectionPaintStyle) { + + var head = connector.pointAlongPathFrom(self.loc, self.length / 2), + mid = connector.pointOnPath(self.loc), + tail = _jg.pointOnLine(head, mid, self.length), + tailLine = _jg.perpendicularLineTo(head, tail, 40), + headLine = _jg.perpendicularLineTo(tail, head, 20); + + return { + connector: connector, + head: head, + tail: tail, + headLine: headLine, + tailLine: tailLine, + minX: Math.min(head.x, tail.x, headLine[0].x, headLine[1].x), + minY: Math.min(head.y, tail.y, headLine[0].y, headLine[1].y), + maxX: Math.max(head.x, tail.x, headLine[0].x, headLine[1].x), + maxY: Math.max(head.y, tail.y, headLine[0].y, headLine[1].y) + }; + }; + + // this.cleanup = function() { }; // nothing to clean up for GuideLines + }; + + /* + * Class: Overlays.Label + + */ + /* + * Function: Constructor + * + * Parameters: + * cssClass - optional css class string to append to css class. This string is appended "as-is", so you can of course have multiple classes + * defined. This parameter is preferred to using labelStyle, borderWidth and borderStyle. + * label - the label to paint. May be a string or a function that returns a string. Nothing will be painted if your label is null or your + * label function returns null. empty strings _will_ be painted. + * location - distance (as a decimal from 0 to 1 inclusive) marking where the label should sit on the connector. defaults to 0.5. + * id - optional id to use for later retrieval of this overlay. + * + * + */ + _jp.Overlays.Label = function (params) { + this.labelStyle = params.labelStyle; + + var labelWidth = null, labelHeight = null, labelText = null, labelPadding = null; + this.cssClass = this.labelStyle != null ? this.labelStyle.cssClass : null; + var p = _jp.extend({ + create: function () { + return _jp.createElement("div"); + }}, params); + _jp.Overlays.Custom.call(this, p); + this.type = "Label"; + this.label = params.label || ""; + this.labelText = null; + if (this.labelStyle) { + var el = this.getElement(); + this.labelStyle.font = this.labelStyle.font || "12px sans-serif"; + el.style.font = this.labelStyle.font; + el.style.color = this.labelStyle.color || "black"; + if (this.labelStyle.fill) { + el.style.background = this.labelStyle.fill; + } + if (this.labelStyle.borderWidth > 0) { + var dStyle = this.labelStyle.borderStyle ? this.labelStyle.borderStyle : "black"; + el.style.border = this.labelStyle.borderWidth + "px solid " + dStyle; + } + if (this.labelStyle.padding) { + el.style.padding = this.labelStyle.padding; + } + } + + }; + _ju.extend(_jp.Overlays.Label, _jp.Overlays.Custom, { + cleanup: function (force) { + if (force) { + this.div = null; + this.label = null; + this.labelText = null; + this.cssClass = null; + this.labelStyle = null; + } + }, + getLabel: function () { + return this.label; + }, + /* + * Function: setLabel + * sets the label's, um, label. you would think i'd call this function + * 'setText', but you can pass either a Function or a String to this, so + * it makes more sense as 'setLabel'. This uses innerHTML on the label div, so keep + * that in mind if you need escaped HTML. + */ + setLabel: function (l) { + this.label = l; + this.labelText = null; + this.clearCachedDimensions(); + this.update(); + this.component.repaint(); + }, + getDimensions: function () { + this.update(); + return AbstractDOMOverlay.prototype.getDimensions.apply(this, arguments); + }, + update: function () { + if (typeof this.label === "function") { + var lt = this.label(this); + this.getElement().innerHTML = lt.replace(/\r\n/g, "
    "); + } + else { + if (this.labelText == null) { + this.labelText = this.label; + this.getElement().innerHTML = this.labelText.replace(/\r\n/g, "
    "); + } + } + }, + updateFrom:function(d) { + if(d.label != null){ + this.setLabel(d.label); + } + } + }); + + // ********************************* END OF OVERLAY DEFINITIONS *********************************************************************** + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * Copyright (c) 2010 - 2020 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function() { + "use strict"; + + var root = this, + _ju = root.jsPlumbUtil, + _jpi = root.jsPlumbInstance; + + var GROUP_COLLAPSED_CLASS = "jtk-group-collapsed"; + var GROUP_EXPANDED_CLASS = "jtk-group-expanded"; + var GROUP_CONTAINER_SELECTOR = "[jtk-group-content]"; + var ELEMENT_DRAGGABLE_EVENT = "elementDraggable"; + var STOP = "stop"; + var REVERT = "revert"; + var GROUP_MANAGER = "_groupManager"; + var GROUP = "_jsPlumbGroup"; + var GROUP_DRAG_SCOPE = "_jsPlumbGroupDrag"; + var EVT_CHILD_ADDED = "group:addMember"; + var EVT_CHILD_REMOVED = "group:removeMember"; + var EVT_GROUP_ADDED = "group:add"; + var EVT_GROUP_REMOVED = "group:remove"; + var EVT_EXPAND = "group:expand"; + var EVT_COLLAPSE = "group:collapse"; + var EVT_GROUP_DRAG_STOP = "groupDragStop"; + var EVT_CONNECTION_MOVED = "connectionMoved"; + var EVT_INTERNAL_CONNECTION_DETACHED = "internal.connectionDetached"; + + var CMD_REMOVE_ALL = "removeAll"; + var CMD_ORPHAN_ALL = "orphanAll"; + var CMD_SHOW = "show"; + var CMD_HIDE = "hide"; + + var GroupManager = function(_jsPlumb) { + var _managedGroups = {}, _connectionSourceMap = {}, _connectionTargetMap = {}, self = this; + + // function findGroupFor(el) { + // var c = _jsPlumb.getContainer(); + // var abort = false, g = null, child = null; + // while (!abort) { + // if (el == null || el === c) { + // abort = true; + // } else { + // if (el[GROUP]) { + // g = el[GROUP]; + // child = el; + // abort = true; + // } else { + // el = el.parentNode; + // } + // } + // } + // return g; + // } + + function isDescendant(el, parentEl) { + var c = _jsPlumb.getContainer(); + var abort = false, g = null, child = null; + while (!abort) { + if (el == null || el === c) { + return false; + } else { + if (el === parentEl) { + return true; + } else { + el = el.parentNode; + } + } + } + } + + _jsPlumb.bind("connection", function(p) { + + var sourceGroup = _jsPlumb.getGroupFor(p.source); + var targetGroup = _jsPlumb.getGroupFor(p.target); + + if (sourceGroup != null && targetGroup != null && sourceGroup === targetGroup) { + _connectionSourceMap[p.connection.id] = sourceGroup; + _connectionTargetMap[p.connection.id] = sourceGroup; + } + else { + if (sourceGroup != null) { + _ju.suggest(sourceGroup.connections.source, p.connection); + _connectionSourceMap[p.connection.id] = sourceGroup; + } + if (targetGroup != null) { + _ju.suggest(targetGroup.connections.target, p.connection); + _connectionTargetMap[p.connection.id] = targetGroup; + } + } + }); + + function _cleanupDetachedConnection(conn) { + delete conn.proxies; + var group = _connectionSourceMap[conn.id], f; + if (group != null) { + f = function(c) { return c.id === conn.id; }; + _ju.removeWithFunction(group.connections.source, f); + _ju.removeWithFunction(group.connections.target, f); + delete _connectionSourceMap[conn.id]; + } + + group = _connectionTargetMap[conn.id]; + if (group != null) { + f = function(c) { return c.id === conn.id; }; + _ju.removeWithFunction(group.connections.source, f); + _ju.removeWithFunction(group.connections.target, f); + delete _connectionTargetMap[conn.id]; + } + } + + _jsPlumb.bind(EVT_INTERNAL_CONNECTION_DETACHED, function(p) { + _cleanupDetachedConnection(p.connection); + }); + + _jsPlumb.bind(EVT_CONNECTION_MOVED, function(p) { + var connMap = p.index === 0 ? _connectionSourceMap : _connectionTargetMap; + var group = connMap[p.connection.id]; + if (group) { + var list = group.connections[p.index === 0 ? "source" : "target"]; + var idx = list.indexOf(p.connection); + if (idx !== -1) { + list.splice(idx, 1); + } + } + }); + + this.addGroup = function(group) { + _jsPlumb.addClass(group.getEl(), GROUP_EXPANDED_CLASS); + _managedGroups[group.id] = group; + group.manager = this; + _updateConnectionsForGroup(group); + _jsPlumb.fire(EVT_GROUP_ADDED, { group:group }); + }; + + this.addToGroup = function(group, el, doNotFireEvent) { + group = this.getGroup(group); + if (group) { + var groupEl = group.getEl(); + + if (el._isJsPlumbGroup) { + return; + } + var currentGroup = el._jsPlumbGroup; + // if already a member of this group, do nothing + if (currentGroup !== group) { + + _jsPlumb.removeFromDragSelection(el); + + var elpos = _jsPlumb.getOffset(el, true); + var cpos = group.collapsed ? _jsPlumb.getOffset(groupEl, true) : _jsPlumb.getOffset(group.getDragArea(), true); + + // otherwise, transfer to this group. + if (currentGroup != null) { + currentGroup.remove(el, false, doNotFireEvent, false, group); + self.updateConnectionsForGroup(currentGroup); + } + group.add(el, doNotFireEvent/*, currentGroup*/); + + var handleDroppedConnections = function (list, index) { + var oidx = index === 0 ? 1 : 0; + list.each(function (c) { + c.setVisible(false); + if (c.endpoints[oidx].element._jsPlumbGroup === group) { + c.endpoints[oidx].setVisible(false); + _expandConnection(c, oidx, group); + } + else { + c.endpoints[index].setVisible(false); + _collapseConnection(c, index, group); + } + }); + }; + + if (group.collapsed) { + handleDroppedConnections(_jsPlumb.select({source: el}), 0); + handleDroppedConnections(_jsPlumb.select({target: el}), 1); + } + + var elId = _jsPlumb.getId(el); + _jsPlumb.dragManager.setParent(el, elId, groupEl, _jsPlumb.getId(groupEl), elpos); + + var newPosition = { left: elpos.left - cpos.left, top: elpos.top - cpos.top }; + + _jsPlumb.setPosition(el, newPosition); + + _jsPlumb.dragManager.revalidateParent(el, elId, elpos); + + self.updateConnectionsForGroup(group); + + _jsPlumb.revalidate(elId); + + if (!doNotFireEvent) { + var p = {group: group, el: el, pos:newPosition}; + if (currentGroup) { + p.sourceGroup = currentGroup; + } + _jsPlumb.fire(EVT_CHILD_ADDED, p); + } + } + } + }; + + this.removeFromGroup = function(group, el, doNotFireEvent) { + group = this.getGroup(group); + if (group) { + + // if this group is currently collapsed then any proxied connections for the given el (or its descendants) need + // to be put back on their original element, and unproxied + if (group.collapsed) { + var _expandSet = function (conns, index) { + for (var i = 0; i < conns.length; i++) { + var c = conns[i]; + if (c.proxies) { + for(var j = 0; j < c.proxies.length; j++) { + if (c.proxies[j] != null) { + var proxiedElement = c.proxies[j].originalEp.element; + if (proxiedElement === el || isDescendant(proxiedElement, el)) { + _expandConnection(c, index, group); + } + } + + } + } + } + }; + + // setup proxies for sources and targets + _expandSet(group.connections.source.slice(), 0); + _expandSet(group.connections.target.slice(), 1); + } + + group.remove(el, null, doNotFireEvent); + } + }; + + this.getGroup = function(groupId) { + var group = groupId; + if (_ju.isString(groupId)) { + group = _managedGroups[groupId]; + if (group == null) { + throw new TypeError("No such group [" + groupId + "]"); + } + } + return group; + }; + + this.getGroups = function() { + var o = []; + for (var g in _managedGroups) { + o.push(_managedGroups[g]); + } + return o; + }; + + this.removeGroup = function(group, deleteMembers, manipulateDOM, doNotFireEvent) { + group = this.getGroup(group); + this.expandGroup(group, true); // this reinstates any original connections and removes all proxies, but does not fire an event. + var newPositions = group[deleteMembers ? CMD_REMOVE_ALL : CMD_ORPHAN_ALL](manipulateDOM, doNotFireEvent); + _jsPlumb.remove(group.getEl()); + delete _managedGroups[group.id]; + delete _jsPlumb._groups[group.id]; + _jsPlumb.fire(EVT_GROUP_REMOVED, { group:group }); + return newPositions; // this will be null in the case or remove, but be a map of {id->[x,y]} in the case of orphan + }; + + this.removeAllGroups = function(deleteMembers, manipulateDOM, doNotFireEvent) { + for (var g in _managedGroups) { + this.removeGroup(_managedGroups[g], deleteMembers, manipulateDOM, doNotFireEvent); + } + }; + + function _setVisible(group, state) { + + // TODO discovering the list of elements would ideally be a pluggable function. + var m = group.getEl().querySelectorAll(".jtk-managed"); + for (var i = 0; i < m.length; i++) { + _jsPlumb[state ? CMD_SHOW : CMD_HIDE](m[i], true); + } + } + + var _collapseConnection = function(c, index, group) { + + var otherEl = c.endpoints[index === 0 ? 1 : 0].element; + if (otherEl[GROUP] && (!otherEl[GROUP].shouldProxy() && otherEl[GROUP].collapsed)) { + return; + } + + var groupEl = group.getEl(), groupElId = _jsPlumb.getId(groupEl); + + _jsPlumb.proxyConnection(c, index, groupEl, groupElId, function(c, index) { return group.getEndpoint(c, index); }, function(c, index) { return group.getAnchor(c, index); }); + }; + + this.collapseGroup = function(group) { + group = this.getGroup(group); + if (group == null || group.collapsed) { + return; + } + var groupEl = group.getEl(); + + // todo remove old proxy endpoints first, just in case? + //group.proxies.length = 0; + + // hide all connections + _setVisible(group, false); + + if (group.shouldProxy()) { + // collapses all connections in a group. + var _collapseSet = function (conns, index) { + for (var i = 0; i < conns.length; i++) { + var c = conns[i]; + _collapseConnection(c, index, group); + } + }; + + // setup proxies for sources and targets + _collapseSet(group.connections.source, 0); + _collapseSet(group.connections.target, 1); + } + + group.collapsed = true; + _jsPlumb.removeClass(groupEl, GROUP_EXPANDED_CLASS); + _jsPlumb.addClass(groupEl, GROUP_COLLAPSED_CLASS); + _jsPlumb.revalidate(groupEl); + _jsPlumb.fire(EVT_COLLAPSE, { group:group }); + }; + + var _expandConnection = function(c, index, group) { + _jsPlumb.unproxyConnection(c, index, _jsPlumb.getId(group.getEl())); + }; + + this.expandGroup = function(group, doNotFireEvent) { + + group = this.getGroup(group); + + if (group == null || !group.collapsed) { + return; + } + var groupEl = group.getEl(); + + _setVisible(group, true); + + if (group.shouldProxy()) { + // expands all connections in a group. + var _expandSet = function (conns, index) { + for (var i = 0; i < conns.length; i++) { + var c = conns[i]; + _expandConnection(c, index, group); + } + }; + + // setup proxies for sources and targets + _expandSet(group.connections.source, 0); + _expandSet(group.connections.target, 1); + } + + group.collapsed = false; + _jsPlumb.addClass(groupEl, GROUP_EXPANDED_CLASS); + _jsPlumb.removeClass(groupEl, GROUP_COLLAPSED_CLASS); + _jsPlumb.revalidate(groupEl); + this.repaintGroup(group); + if (!doNotFireEvent) { + _jsPlumb.fire(EVT_EXPAND, { group: group}); + } + }; + + this.repaintGroup = function(group) { + group = this.getGroup(group); + var m = group.getMembers(); + for (var i = 0; i < m.length; i++) { + _jsPlumb.revalidate(m[i]); + } + }; + + // TODO refactor this with the code that responds to `connection` events. + function _updateConnectionsForGroup(group) { + var members = group.getMembers().slice(); + + var childMembers = []; + for (var i = 0; i < members.length; i++) { + Array.prototype.push.apply(childMembers, members[i].querySelectorAll(".jtk-managed")); + } + Array.prototype.push.apply(members, childMembers); + + var c1 = _jsPlumb.getConnections({source:members, scope:"*"}, true); + var c2 = _jsPlumb.getConnections({target:members, scope:"*"}, true); + + var processed = {}; + group.connections.source.length = 0; + group.connections.target.length = 0; + var oneSet = function(c) { + for (var i = 0; i < c.length; i++) { + if (processed[c[i].id]) { + continue; + } + processed[c[i].id] = true; + var gs = _jsPlumb.getGroupFor(c[i].source), + gt = _jsPlumb.getGroupFor(c[i].target); + + if (gs === group) { + if (gt !== group) { + group.connections.source.push(c[i]); + } + _connectionSourceMap[c[i].id] = group; + } + else if (gt === group) { + group.connections.target.push(c[i]); + _connectionTargetMap[c[i].id] = group; + } + } + }; + oneSet(c1); oneSet(c2); + } + + this.updateConnectionsForGroup = _updateConnectionsForGroup; + this.refreshAllGroups = function() { + for (var g in _managedGroups) { + _updateConnectionsForGroup(_managedGroups[g]); + _jsPlumb.dragManager.updateOffsets(_jsPlumb.getId(_managedGroups[g].getEl())); + } + }; + }; + + /** + * + * @param {jsPlumbInstance} _jsPlumb Associated jsPlumb instance. + * @param {Object} params + * @param {Element} params.el The DOM element representing the Group. + * @param {String} [params.id] Optional ID for the Group. A UUID will be assigned as the Group's ID if you do not provide one. + * @param {Boolean} [params.constrain=false] If true, child elements will not be able to be dragged outside of the Group container. + * @param {Boolean} [params.revert=true] By default, child elements revert to the container if dragged outside. You can change this by setting `revert:false`. This behaviour is also overridden if you set `orphan` or `prune`. + * @param {Boolean} [params.orphan=false] If true, child elements dropped outside of the Group container will be removed from the Group (but not from the DOM). + * @param {Boolean} [params.prune=false] If true, child elements dropped outside of the Group container will be removed from the Group and also from the DOM. + * @param {Boolean} [params.dropOverride=false] If true, a child element that has been dropped onto some other Group will not be subject to the controls imposed by `prune`, `revert` or `orphan`. + * @constructor + */ + var Group = function(_jsPlumb, params) { + var self = this; + var el = params.el; + this.getEl = function() { return el; }; + this.id = params.id || _ju.uuid(); + el._isJsPlumbGroup = true; + + var getDragArea = this.getDragArea = function() { + var da = _jsPlumb.getSelector(el, GROUP_CONTAINER_SELECTOR); + return da && da.length > 0 ? da[0] : el; + }; + + var ghost = params.ghost === true; + var constrain = ghost || (params.constrain === true); + var revert = params.revert !== false; + var orphan = params.orphan === true; + var prune = params.prune === true; + var dropOverride = params.dropOverride === true; + var proxied = params.proxied !== false; + var elements = []; + this.connections = { source:[], target:[], internal:[] }; + + // this function, and getEndpoint below, are stubs for a future setup in which we can choose endpoint + // and anchor based upon the connection and the index (source/target) of the endpoint to be proxied. + this.getAnchor = function(conn, endpointIndex) { + return params.anchor || "Continuous"; + }; + + this.getEndpoint = function(conn, endpointIndex) { + return params.endpoint || [ "Dot", { radius:10 }]; + }; + + this.collapsed = false; + if (params.draggable !== false) { + var opts = { + drag:function() { + for (var i = 0; i < elements.length; i++) { + _jsPlumb.draw(elements[i]); + } + }, + stop:function(params) { + _jsPlumb.fire(EVT_GROUP_DRAG_STOP, jsPlumb.extend(params, {group:self})); + }, + scope:GROUP_DRAG_SCOPE + }; + if (params.dragOptions) { + root.jsPlumb.extend(opts, params.dragOptions); + } + _jsPlumb.draggable(params.el, opts); + } + if (params.droppable !== false) { + _jsPlumb.droppable(params.el, { + drop:function(p) { + var el = p.drag.el; + if (el._isJsPlumbGroup) { + return; + } + var currentGroup = el._jsPlumbGroup; + if (currentGroup !== self) { + if (currentGroup != null) { + if (currentGroup.overrideDrop(el, self)) { + return; + } + } + _jsPlumb.getGroupManager().addToGroup(self, el, false); + } + + } + }); + } + var _each = function(_el, fn) { + var els = _el.nodeType == null ? _el : [ _el ]; + for (var i = 0; i < els.length; i++) { + fn(els[i]); + } + }; + + this.overrideDrop = function(_el, targetGroup) { + return dropOverride && (revert || prune || orphan); + }; + + this.add = function(_el, doNotFireEvent/*, sourceGroup*/) { + var dragArea = getDragArea(); + _each(_el, function(__el) { + + if (__el._jsPlumbGroup != null) { + if (__el._jsPlumbGroup === self) { + return; + } else { + __el._jsPlumbGroup.remove(__el, true, doNotFireEvent, false); + } + } + + __el._jsPlumbGroup = self; + elements.push(__el); + // test if draggable and add handlers if so. + if (_jsPlumb.isAlreadyDraggable(__el)) { + _bindDragHandlers(__el); + } + + if (__el.parentNode !== dragArea) { + dragArea.appendChild(__el); + } + + // if (!doNotFireEvent) { + // var p = {group: self, el: __el}; + // if (sourceGroup) { + // p.sourceGroup = sourceGroup; + // } + // //_jsPlumb.fire(EVT_CHILD_ADDED, p); + // } + }); + + _jsPlumb.getGroupManager().updateConnectionsForGroup(self); + }; + + this.remove = function(el, manipulateDOM, doNotFireEvent, doNotUpdateConnections, targetGroup) { + + _each(el, function(__el) { + if (__el._jsPlumbGroup === self) { + delete __el._jsPlumbGroup; + _ju.removeWithFunction(elements, function (e) { + return e === __el; + }); + + + if (manipulateDOM) { + try { + self.getDragArea().removeChild(__el); + } catch (e) { + jsPlumbUtil.log("Could not remove element from Group " + e); + } + } + _unbindDragHandlers(__el); + + if (!doNotFireEvent) { + var p = {group: self, el: __el}; + if (targetGroup) { + p.targetGroup = targetGroup; + } + _jsPlumb.fire(EVT_CHILD_REMOVED, p); + } + } + }); + if (!doNotUpdateConnections) { + _jsPlumb.getGroupManager().updateConnectionsForGroup(self); + } + }; + this.removeAll = function(manipulateDOM, doNotFireEvent) { + for (var i = 0, l = elements.length; i < l; i++) { + var el = elements[0]; + self.remove(el, manipulateDOM, doNotFireEvent, true); + _jsPlumb.remove(el, true); + } + elements.length = 0; + _jsPlumb.getGroupManager().updateConnectionsForGroup(self); + }; + this.orphanAll = function() { + var orphanedPositions = {}; + for (var i = 0; i < elements.length; i++) { + var newPosition = _orphan(elements[i]); + orphanedPositions[newPosition[0]] = newPosition[1]; + } + elements.length = 0; + + return orphanedPositions; + }; + this.getMembers = function() { return elements; }; + + el[GROUP] = this; + + _jsPlumb.bind(ELEMENT_DRAGGABLE_EVENT, function(dragParams) { + // if its for the current group, + if (dragParams.el._jsPlumbGroup === this) { + _bindDragHandlers(dragParams.el); + } + }.bind(this)); + + function _findParent(_el) { + return _el.offsetParent; + } + + function _isInsideParent(_el, pos) { + var p = _findParent(_el), + s = _jsPlumb.getSize(p), + ss = _jsPlumb.getSize(_el), + leftEdge = pos[0], + rightEdge = leftEdge + ss[0], + topEdge = pos[1], + bottomEdge = topEdge + ss[1]; + + return rightEdge > 0 && leftEdge < s[0] && bottomEdge > 0 && topEdge < s[1]; + } + + // + // orphaning an element means taking it out of the group and adding it to the main jsplumb container. + // we return the new calculated position from this method and the element's id. + // + function _orphan(_el) { + var id = _jsPlumb.getId(_el); + var pos = _jsPlumb.getOffset(_el); + _el.parentNode.removeChild(_el); + _jsPlumb.getContainer().appendChild(_el); + _jsPlumb.setPosition(_el, pos); + _unbindDragHandlers(_el); + _jsPlumb.dragManager.clearParent(_el, id); + return [id, pos]; + } + + // + // remove an element from the group, then either prune it from the jsplumb instance, or just orphan it. + // + function _pruneOrOrphan(p) { + + var out = []; + + function _one(el, left, top) { + var orphanedPosition = null; + if (!_isInsideParent(el, [left, top])) { + var group = el._jsPlumbGroup; + if (prune) { + _jsPlumb.remove(el); + } else { + orphanedPosition = _orphan(el); + } + + group.remove(el); + } + + return orphanedPosition; + } + + for (var i = 0; i < p.selection.length; i++) { + out.push(_one(p.selection[i][0], p.selection[i][1].left, p.selection[i][1].top)); + } + + return out.length === 1 ? out[0] : out; + + } + + // + // redraws the element + // + function _revalidate(_el) { + var id = _jsPlumb.getId(_el); + _jsPlumb.revalidate(_el); + _jsPlumb.dragManager.revalidateParent(_el, id); + } + + // + // unbind the group specific drag/revert handlers. + // + function _unbindDragHandlers(_el) { + if (!_el._katavorioDrag) { + return; + } + if (prune || orphan) { + _el._katavorioDrag.off(STOP, _pruneOrOrphan); + } + if (!prune && !orphan && revert) { + _el._katavorioDrag.off(REVERT, _revalidate); + _el._katavorioDrag.setRevert(null); + } + } + + function _bindDragHandlers(_el) { + if (!_el._katavorioDrag) { + return; + } + if (prune || orphan) { + _el._katavorioDrag.on(STOP, _pruneOrOrphan); + } + + if (constrain) { + _el._katavorioDrag.setConstrain(true); + } + + if (ghost) { + _el._katavorioDrag.setUseGhostProxy(true); + } + + if (!prune && !orphan && revert) { + _el._katavorioDrag.on(REVERT, _revalidate); + _el._katavorioDrag.setRevert(function(__el, pos) { + return !_isInsideParent(__el, pos); + }); + } + } + + this.shouldProxy = function() { + return proxied; + }; + + _jsPlumb.getGroupManager().addGroup(this); + }; + + /** + * Adds a group to the jsPlumb instance. + * @method addGroup + * @param {Object} params + * @return {Group} The newly created Group. + */ + _jpi.prototype.addGroup = function(params) { + var j = this; + j._groups = j._groups || {}; + if (j._groups[params.id] != null) { + throw new TypeError("cannot create Group [" + params.id + "]; a Group with that ID exists"); + } + if (params.el[GROUP] != null) { + throw new TypeError("cannot create Group [" + params.id + "]; the given element is already a Group"); + } + var group = new Group(j, params); + j._groups[group.id] = group; + if (params.collapsed) { + this.collapseGroup(group); + } + return group; + }; + + /** + * Add an element to a group. + * @method addToGroup + * @param {String} group Group, or ID of the group, to add the element to. + * @param {Element} el Element to add to the group. + */ + _jpi.prototype.addToGroup = function(group, el, doNotFireEvent) { + + var _one = function(_el) { + var id = this.getId(_el); + this.manage(id, _el); + this.getGroupManager().addToGroup(group, _el, doNotFireEvent); + }.bind(this); + + if (Array.isArray(el)) { + for (var i = 0; i < el.length; i++) { + _one(el[i]); + } + } else { + _one(el); + } + }; + + /** + * Remove an element from a group, and sets its DOM element to be a child of the container again. ?? + * @method removeFromGroup + * @param {String} group Group, or ID of the group, to remove the element from. + * @param {Element} el Element to add to the group. + */ + _jpi.prototype.removeFromGroup = function(group, el, doNotFireEvent) { + this.getGroupManager().removeFromGroup(group, el, doNotFireEvent); + this.getContainer().appendChild(el); + }; + + /** + * Remove a group, and optionally remove its members from the jsPlumb instance. + * @method removeGroup + * @param {String|Group} group Group to delete, or ID of Group to delete. + * @param {Boolean} [deleteMembers=false] If true, group members will be removed along with the group. Otherwise they will + * just be 'orphaned' (returned to the main container). + * @returns {Map[String, Position}} When deleteMembers is false, this method returns a map of {id->position} + */ + _jpi.prototype.removeGroup = function(group, deleteMembers, manipulateDOM, doNotFireEvent) { + return this.getGroupManager().removeGroup(group, deleteMembers, manipulateDOM, doNotFireEvent); + }; + + /** + * Remove all groups, and optionally remove their members from the jsPlumb instance. + * @method removeAllGroup + * @param {Boolean} [deleteMembers=false] If true, group members will be removed along with the groups. Otherwise they will + * just be 'orphaned' (returned to the main container). + */ + _jpi.prototype.removeAllGroups = function(deleteMembers, manipulateDOM, doNotFireEvent) { + this.getGroupManager().removeAllGroups(deleteMembers, manipulateDOM, doNotFireEvent); + }; + + /** + * Get a Group + * @method getGroup + * @param {String} groupId ID of the group to get + * @return {Group} Group with the given ID, null if not found. + */ + _jpi.prototype.getGroup = function(groupId) { + return this.getGroupManager().getGroup(groupId); + }; + + /** + * Gets all the Groups managed by the jsPlumb instance. + * @returns {Group[]} List of Groups. Empty if none. + */ + _jpi.prototype.getGroups = function() { + return this.getGroupManager().getGroups(); + }; + + /** + * Expands a group element. jsPlumb doesn't do "everything" for you here, because what it means to expand a Group + * will vary from application to application. jsPlumb does these things: + * + * - Hides any connections that are internal to the group (connections between members, and connections from member of + * the group to the group itself) + * - Proxies all connections for which the source or target is a member of the group. + * - Hides the proxied connections. + * - Adds the jtk-group-expanded class to the group's element + * - Removes the jtk-group-collapsed class from the group's element. + * + * @method expandGroup + * @param {String|Group} group Group to expand, or ID of Group to expand. + */ + _jpi.prototype.expandGroup = function(group) { + this.getGroupManager().expandGroup(group); + }; + + /** + * Collapses a group element. jsPlumb doesn't do "everything" for you here, because what it means to collapse a Group + * will vary from application to application. jsPlumb does these things: + * + * - Shows any connections that are internal to the group (connections between members, and connections from member of + * the group to the group itself) + * - Removes proxies for all connections for which the source or target is a member of the group. + * - Shows the previously proxied connections. + * - Adds the jtk-group-collapsed class to the group's element + * - Removes the jtk-group-expanded class from the group's element. + * + * @method expandGroup + * @param {String|Group} group Group to expand, or ID of Group to expand. + */ + _jpi.prototype.collapseGroup = function(groupId) { + this.getGroupManager().collapseGroup(groupId); + }; + + + _jpi.prototype.repaintGroup = function(group) { + this.getGroupManager().repaintGroup(group); + }; + + /** + * Collapses or expands a group element depending on its current state. See notes in the collapseGroup and expandGroup method. + * + * @method toggleGroup + * @param {String|Group} group Group to expand/collapse, or ID of Group to expand/collapse. + */ + _jpi.prototype.toggleGroup = function(group) { + group = this.getGroupManager().getGroup(group); + if (group != null) { + this.getGroupManager()[group.collapsed ? "expandGroup" : "collapseGroup"](group); + } + }; + + // + // lazy init a group manager for the given jsplumb instance. + // + _jpi.prototype.getGroupManager = function() { + var mgr = this[GROUP_MANAGER]; + if (mgr == null) { + mgr = this[GROUP_MANAGER] = new GroupManager(this); + } + return mgr; + }; + + _jpi.prototype.removeGroupManager = function() { + delete this[GROUP_MANAGER]; + }; + + /** + * Gets the Group that the given element belongs to, null if none. + * @method getGroupFor + * @param {String|Element} el Element, or element ID. + * @returns {Group} A Group, if found, or null. + */ + _jpi.prototype.getGroupFor = function(el) { + el = this.getElement(el); + if (el) { + var c = this.getContainer(); + var abort = false, g = null, child = null; + while (!abort) { + if (el == null || el === c) { + abort = true; + } else { + if (el[GROUP]) { + g = el[GROUP]; + child = el; + abort = true; + } else { + el = el.parentNode; + } + } + } + return g; + } + }; + +}).call(typeof window !== 'undefined' ? window : this); + + +/* + * This file contains the 'flowchart' connectors, consisting of vertical and horizontal line segments. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + var STRAIGHT = "Straight"; + var ARC = "Arc"; + + var Flowchart = function (params) { + this.type = "Flowchart"; + params = params || {}; + params.stub = params.stub == null ? 30 : params.stub; + var segments, + _super = _jp.Connectors.AbstractConnector.apply(this, arguments), + midpoint = params.midpoint == null ? 0.5 : params.midpoint, + alwaysRespectStubs = params.alwaysRespectStubs === true, + lastx = null, lasty = null, lastOrientation, + cornerRadius = params.cornerRadius != null ? params.cornerRadius : 0, + + // TODO now common between this and AbstractBezierEditor; refactor into superclass? + loopbackRadius = params.loopbackRadius || 25, + isLoopbackCurrently = false, + + sgn = function (n) { + return n < 0 ? -1 : n === 0 ? 0 : 1; + }, + segmentDirections = function(segment) { + return [ + sgn( segment[2] - segment[0] ), + sgn( segment[3] - segment[1] ) + ]; + }, + /** + * helper method to add a segment. + */ + addSegment = function (segments, x, y, paintInfo) { + if (lastx === x && lasty === y) { + return; + } + var lx = lastx == null ? paintInfo.sx : lastx, + ly = lasty == null ? paintInfo.sy : lasty, + o = lx === x ? "v" : "h"; + + lastx = x; + lasty = y; + segments.push([ lx, ly, x, y, o ]); + }, + segLength = function (s) { + return Math.sqrt(Math.pow(s[0] - s[2], 2) + Math.pow(s[1] - s[3], 2)); + }, + _cloneArray = function (a) { + var _a = []; + _a.push.apply(_a, a); + return _a; + }, + writeSegments = function (conn, segments, paintInfo) { + var current = null, next, currentDirection, nextDirection; + for (var i = 0; i < segments.length - 1; i++) { + + current = current || _cloneArray(segments[i]); + next = _cloneArray(segments[i + 1]); + + currentDirection = segmentDirections(current); + nextDirection = segmentDirections(next); + + if (cornerRadius > 0 && current[4] !== next[4]) { + + var minSegLength = Math.min(segLength(current), segLength(next)); + var radiusToUse = Math.min(cornerRadius, minSegLength / 2); + + current[2] -= currentDirection[0] * radiusToUse; + current[3] -= currentDirection[1] * radiusToUse; + next[0] += nextDirection[0] * radiusToUse; + next[1] += nextDirection[1] * radiusToUse; + + var ac = (currentDirection[1] === nextDirection[0] && nextDirection[0] === 1) || + ((currentDirection[1] === nextDirection[0] && nextDirection[0] === 0) && currentDirection[0] !== nextDirection[1]) || + (currentDirection[1] === nextDirection[0] && nextDirection[0] === -1), + sgny = next[1] > current[3] ? 1 : -1, + sgnx = next[0] > current[2] ? 1 : -1, + sgnEqual = sgny === sgnx, + cx = (sgnEqual && ac || (!sgnEqual && !ac)) ? next[0] : current[2], + cy = (sgnEqual && ac || (!sgnEqual && !ac)) ? current[3] : next[1]; + + _super.addSegment(conn, STRAIGHT, { + x1: current[0], y1: current[1], x2: current[2], y2: current[3] + }); + + _super.addSegment(conn, ARC, { + r: radiusToUse, + x1: current[2], + y1: current[3], + x2: next[0], + y2: next[1], + cx: cx, + cy: cy, + ac: ac + }); + } + else { + // dx + dy are used to adjust for line width. + var dx = (current[2] === current[0]) ? 0 : (current[2] > current[0]) ? (paintInfo.lw / 2) : -(paintInfo.lw / 2), + dy = (current[3] === current[1]) ? 0 : (current[3] > current[1]) ? (paintInfo.lw / 2) : -(paintInfo.lw / 2); + + _super.addSegment(conn, STRAIGHT, { + x1: current[0] - dx, y1: current[1] - dy, x2: current[2] + dx, y2: current[3] + dy + }); + } + current = next; + } + if (next != null) { + // last segment + _super.addSegment(conn, STRAIGHT, { + x1: next[0], y1: next[1], x2: next[2], y2: next[3] + }); + } + }; + + this._compute = function (paintInfo, params) { + + segments = []; + lastx = null; + lasty = null; + lastOrientation = null; + + var commonStubCalculator = function () { + return [paintInfo.startStubX, paintInfo.startStubY, paintInfo.endStubX, paintInfo.endStubY]; + }, + stubCalculators = { + perpendicular: commonStubCalculator, + orthogonal: commonStubCalculator, + opposite: function (axis) { + var pi = paintInfo, + idx = axis === "x" ? 0 : 1, + areInProximity = { + "x": function () { + return ( (pi.so[idx] === 1 && ( + ( (pi.startStubX > pi.endStubX) && (pi.tx > pi.startStubX) ) || + ( (pi.sx > pi.endStubX) && (pi.tx > pi.sx))))) || + + ( (pi.so[idx] === -1 && ( + ( (pi.startStubX < pi.endStubX) && (pi.tx < pi.startStubX) ) || + ( (pi.sx < pi.endStubX) && (pi.tx < pi.sx))))); + }, + "y": function () { + return ( (pi.so[idx] === 1 && ( + ( (pi.startStubY > pi.endStubY) && (pi.ty > pi.startStubY) ) || + ( (pi.sy > pi.endStubY) && (pi.ty > pi.sy))))) || + + ( (pi.so[idx] === -1 && ( + ( (pi.startStubY < pi.endStubY) && (pi.ty < pi.startStubY) ) || + ( (pi.sy < pi.endStubY) && (pi.ty < pi.sy))))); + } + }; + + if (!alwaysRespectStubs && areInProximity[axis]()) { + return { + "x": [(paintInfo.sx + paintInfo.tx) / 2, paintInfo.startStubY, (paintInfo.sx + paintInfo.tx) / 2, paintInfo.endStubY], + "y": [paintInfo.startStubX, (paintInfo.sy + paintInfo.ty) / 2, paintInfo.endStubX, (paintInfo.sy + paintInfo.ty) / 2] + }[axis]; + } + else { + return [paintInfo.startStubX, paintInfo.startStubY, paintInfo.endStubX, paintInfo.endStubY]; + } + } + }; + + // calculate Stubs. + var stubs = stubCalculators[paintInfo.anchorOrientation](paintInfo.sourceAxis), + idx = paintInfo.sourceAxis === "x" ? 0 : 1, + oidx = paintInfo.sourceAxis === "x" ? 1 : 0, + ss = stubs[idx], + oss = stubs[oidx], + es = stubs[idx + 2], + oes = stubs[oidx + 2]; + + // add the start stub segment. use stubs for loopback as it will look better, with the loop spaced + // away from the element. + addSegment(segments, stubs[0], stubs[1], paintInfo); + + // if its a loopback and we should treat it differently. + // if (false && params.sourcePos[0] === params.targetPos[0] && params.sourcePos[1] === params.targetPos[1]) { + // + // // we use loopbackRadius here, as statemachine connectors do. + // // so we go radius to the left from stubs[0], then upwards by 2*radius, to the right by 2*radius, + // // down by 2*radius, left by radius. + // addSegment(segments, stubs[0] - loopbackRadius, stubs[1], paintInfo); + // addSegment(segments, stubs[0] - loopbackRadius, stubs[1] - (2 * loopbackRadius), paintInfo); + // addSegment(segments, stubs[0] + loopbackRadius, stubs[1] - (2 * loopbackRadius), paintInfo); + // addSegment(segments, stubs[0] + loopbackRadius, stubs[1], paintInfo); + // addSegment(segments, stubs[0], stubs[1], paintInfo); + // + // } + // else { + + + var midx = paintInfo.startStubX + ((paintInfo.endStubX - paintInfo.startStubX) * midpoint), + midy = paintInfo.startStubY + ((paintInfo.endStubY - paintInfo.startStubY) * midpoint); + + var orientations = {x: [0, 1], y: [1, 0]}, + lineCalculators = { + perpendicular: function (axis) { + var pi = paintInfo, + sis = { + x: [ + [[1, 2, 3, 4], null, [2, 1, 4, 3]], + null, + [[4, 3, 2, 1], null, [3, 4, 1, 2]] + ], + y: [ + [[3, 2, 1, 4], null, [2, 3, 4, 1]], + null, + [[4, 1, 2, 3], null, [1, 4, 3, 2]] + ] + }, + stubs = { + x: [[pi.startStubX, pi.endStubX], null, [pi.endStubX, pi.startStubX]], + y: [[pi.startStubY, pi.endStubY], null, [pi.endStubY, pi.startStubY]] + }, + midLines = { + x: [[midx, pi.startStubY], [midx, pi.endStubY]], + y: [[pi.startStubX, midy], [pi.endStubX, midy]] + }, + linesToEnd = { + x: [[pi.endStubX, pi.startStubY]], + y: [[pi.startStubX, pi.endStubY]] + }, + startToEnd = { + x: [[pi.startStubX, pi.endStubY], [pi.endStubX, pi.endStubY]], + y: [[pi.endStubX, pi.startStubY], [pi.endStubX, pi.endStubY]] + }, + startToMidToEnd = { + x: [[pi.startStubX, midy], [pi.endStubX, midy], [pi.endStubX, pi.endStubY]], + y: [[midx, pi.startStubY], [midx, pi.endStubY], [pi.endStubX, pi.endStubY]] + }, + otherStubs = { + x: [pi.startStubY, pi.endStubY], + y: [pi.startStubX, pi.endStubX] + }, + soIdx = orientations[axis][0], toIdx = orientations[axis][1], + _so = pi.so[soIdx] + 1, + _to = pi.to[toIdx] + 1, + otherFlipped = (pi.to[toIdx] === -1 && (otherStubs[axis][1] < otherStubs[axis][0])) || (pi.to[toIdx] === 1 && (otherStubs[axis][1] > otherStubs[axis][0])), + stub1 = stubs[axis][_so][0], + stub2 = stubs[axis][_so][1], + segmentIndexes = sis[axis][_so][_to]; + + if (pi.segment === segmentIndexes[3] || (pi.segment === segmentIndexes[2] && otherFlipped)) { + return midLines[axis]; + } + else if (pi.segment === segmentIndexes[2] && stub2 < stub1) { + return linesToEnd[axis]; + } + else if ((pi.segment === segmentIndexes[2] && stub2 >= stub1) || (pi.segment === segmentIndexes[1] && !otherFlipped)) { + return startToMidToEnd[axis]; + } + else if (pi.segment === segmentIndexes[0] || (pi.segment === segmentIndexes[1] && otherFlipped)) { + return startToEnd[axis]; + } + }, + orthogonal: function (axis, startStub, otherStartStub, endStub, otherEndStub) { + var pi = paintInfo, + extent = { + "x": pi.so[0] === -1 ? Math.min(startStub, endStub) : Math.max(startStub, endStub), + "y": pi.so[1] === -1 ? Math.min(startStub, endStub) : Math.max(startStub, endStub) + }[axis]; + + return { + "x": [ + [extent, otherStartStub], + [extent, otherEndStub], + [endStub, otherEndStub] + ], + "y": [ + [otherStartStub, extent], + [otherEndStub, extent], + [otherEndStub, endStub] + ] + }[axis]; + }, + opposite: function (axis, ss, oss, es) { + var pi = paintInfo, + otherAxis = {"x": "y", "y": "x"}[axis], + dim = {"x": "height", "y": "width"}[axis], + comparator = pi["is" + axis.toUpperCase() + "GreaterThanStubTimes2"]; + + if (params.sourceEndpoint.elementId === params.targetEndpoint.elementId) { + var _val = oss + ((1 - params.sourceEndpoint.anchor[otherAxis]) * params.sourceInfo[dim]) + _super.maxStub; + return { + "x": [ + [ss, _val], + [es, _val] + ], + "y": [ + [_val, ss], + [_val, es] + ] + }[axis]; + + } + else if (!comparator || (pi.so[idx] === 1 && ss > es) || (pi.so[idx] === -1 && ss < es)) { + return { + "x": [ + [ss, midy], + [es, midy] + ], + "y": [ + [midx, ss], + [midx, es] + ] + }[axis]; + } + else if ((pi.so[idx] === 1 && ss < es) || (pi.so[idx] === -1 && ss > es)) { + return { + "x": [ + [midx, pi.sy], + [midx, pi.ty] + ], + "y": [ + [pi.sx, midy], + [pi.tx, midy] + ] + }[axis]; + } + } + }; + + // compute the rest of the line + var p = lineCalculators[paintInfo.anchorOrientation](paintInfo.sourceAxis, ss, oss, es, oes); + if (p) { + for (var i = 0; i < p.length; i++) { + addSegment(segments, p[i][0], p[i][1], paintInfo); + } + } + + // line to end stub + addSegment(segments, stubs[2], stubs[3], paintInfo); + + //} + + // end stub to end (common) + addSegment(segments, paintInfo.tx, paintInfo.ty, paintInfo); + + + + // write out the segments. + writeSegments(this, segments, paintInfo); + + }; + }; + + _jp.Connectors.Flowchart = Flowchart; + _ju.extend(_jp.Connectors.Flowchart, _jp.Connectors.AbstractConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the code for the Bezier connector type. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + _jp.Connectors.AbstractBezierConnector = function(params) { + params = params || {}; + var showLoopback = params.showLoopback !== false, + curviness = params.curviness || 10, + margin = params.margin || 5, + proximityLimit = params.proximityLimit || 80, + clockwise = params.orientation && params.orientation === "clockwise", + loopbackRadius = params.loopbackRadius || 25, + isLoopbackCurrently = false, + _super; + + this._compute = function (paintInfo, p) { + + var sp = p.sourcePos, + tp = p.targetPos, + _w = Math.abs(sp[0] - tp[0]), + _h = Math.abs(sp[1] - tp[1]); + + if (!showLoopback || (p.sourceEndpoint.elementId !== p.targetEndpoint.elementId)) { + isLoopbackCurrently = false; + this._computeBezier(paintInfo, p, sp, tp, _w, _h); + } else { + isLoopbackCurrently = true; + // a loopback connector. draw an arc from one anchor to the other. + var x1 = p.sourcePos[0], y1 = p.sourcePos[1] - margin, + cx = x1, cy = y1 - loopbackRadius, + // canvas sizing stuff, to ensure the whole painted area is visible. + _x = cx - loopbackRadius, + _y = cy - loopbackRadius; + + _w = 2 * loopbackRadius; + _h = 2 * loopbackRadius; + + paintInfo.points[0] = _x; + paintInfo.points[1] = _y; + paintInfo.points[2] = _w; + paintInfo.points[3] = _h; + + // ADD AN ARC SEGMENT. + _super.addSegment(this, "Arc", { + loopback: true, + x1: (x1 - _x) + 4, + y1: y1 - _y, + startAngle: 0, + endAngle: 2 * Math.PI, + r: loopbackRadius, + ac: !clockwise, + x2: (x1 - _x) - 4, + y2: y1 - _y, + cx: cx - _x, + cy: cy - _y + }); + } + }; + + _super = _jp.Connectors.AbstractConnector.apply(this, arguments); + return _super; + }; + _ju.extend(_jp.Connectors.AbstractBezierConnector, _jp.Connectors.AbstractConnector); + + var Bezier = function (params) { + params = params || {}; + this.type = "Bezier"; + + var _super = _jp.Connectors.AbstractBezierConnector.apply(this, arguments), + majorAnchor = params.curviness || 150, + minorAnchor = 10; + + this.getCurviness = function () { + return majorAnchor; + }; + + this._findControlPoint = function (point, sourceAnchorPosition, targetAnchorPosition, sourceEndpoint, targetEndpoint, soo, too) { + // determine if the two anchors are perpendicular to each other in their orientation. we swap the control + // points around if so (code could be tightened up) + var perpendicular = soo[0] !== too[0] || soo[1] === too[1], + p = []; + + if (!perpendicular) { + if (soo[0] === 0) { + p.push(sourceAnchorPosition[0] < targetAnchorPosition[0] ? point[0] + minorAnchor : point[0] - minorAnchor); + } + else { + p.push(point[0] - (majorAnchor * soo[0])); + } + + if (soo[1] === 0) { + p.push(sourceAnchorPosition[1] < targetAnchorPosition[1] ? point[1] + minorAnchor : point[1] - minorAnchor); + } + else { + p.push(point[1] + (majorAnchor * too[1])); + } + } + else { + if (too[0] === 0) { + p.push(targetAnchorPosition[0] < sourceAnchorPosition[0] ? point[0] + minorAnchor : point[0] - minorAnchor); + } + else { + p.push(point[0] + (majorAnchor * too[0])); + } + + if (too[1] === 0) { + p.push(targetAnchorPosition[1] < sourceAnchorPosition[1] ? point[1] + minorAnchor : point[1] - minorAnchor); + } + else { + p.push(point[1] + (majorAnchor * soo[1])); + } + } + + return p; + }; + + this._computeBezier = function (paintInfo, p, sp, tp, _w, _h) { + + var _CP, _CP2, + _sx = sp[0] < tp[0] ? _w : 0, + _sy = sp[1] < tp[1] ? _h : 0, + _tx = sp[0] < tp[0] ? 0 : _w, + _ty = sp[1] < tp[1] ? 0 : _h; + + _CP = this._findControlPoint([_sx, _sy], sp, tp, p.sourceEndpoint, p.targetEndpoint, paintInfo.so, paintInfo.to); + _CP2 = this._findControlPoint([_tx, _ty], tp, sp, p.targetEndpoint, p.sourceEndpoint, paintInfo.to, paintInfo.so); + + + _super.addSegment(this, "Bezier", { + x1: _sx, y1: _sy, x2: _tx, y2: _ty, + cp1x: _CP[0], cp1y: _CP[1], cp2x: _CP2[0], cp2y: _CP2[1] + }); + }; + + + }; + + _jp.Connectors.Bezier = Bezier; + _ju.extend(Bezier, _jp.Connectors.AbstractBezierConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the state machine connectors, which extend AbstractBezierConnector. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + var _segment = function (x1, y1, x2, y2) { + if (x1 <= x2 && y2 <= y1) { + return 1; + } + else if (x1 <= x2 && y1 <= y2) { + return 2; + } + else if (x2 <= x1 && y2 >= y1) { + return 3; + } + return 4; + }, + + // the control point we will use depends on the faces to which each end of the connection is assigned, specifically whether or not the + // two faces are parallel or perpendicular. if they are parallel then the control point lies on the midpoint of the axis in which they + // are parellel and varies only in the other axis; this variation is proportional to the distance that the anchor points lie from the + // center of that face. if the two faces are perpendicular then the control point is at some distance from both the midpoints; the amount and + // direction are dependent on the orientation of the two elements. 'seg', passed in to this method, tells you which segment the target element + // lies in with respect to the source: 1 is top right, 2 is bottom right, 3 is bottom left, 4 is top left. + // + // sourcePos and targetPos are arrays of info about where on the source and target each anchor is located. their contents are: + // + // 0 - absolute x + // 1 - absolute y + // 2 - proportional x in element (0 is left edge, 1 is right edge) + // 3 - proportional y in element (0 is top edge, 1 is bottom edge) + // + _findControlPoint = function (midx, midy, segment, sourceEdge, targetEdge, dx, dy, distance, proximityLimit) { + // TODO (maybe) + // - if anchor pos is 0.5, make the control point take into account the relative position of the elements. + if (distance <= proximityLimit) { + return [midx, midy]; + } + + if (segment === 1) { + if (sourceEdge[3] <= 0 && targetEdge[3] >= 1) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] >= 1 && targetEdge[2] <= 0) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + (-1 * dx) , midy + (-1 * dy) ]; + } + } + else if (segment === 2) { + if (sourceEdge[3] >= 1 && targetEdge[3] <= 0) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] >= 1 && targetEdge[2] <= 0) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + dx, midy + (-1 * dy) ]; + } + } + else if (segment === 3) { + if (sourceEdge[3] >= 1 && targetEdge[3] <= 0) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] <= 0 && targetEdge[2] >= 1) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + (-1 * dx) , midy + (-1 * dy) ]; + } + } + else if (segment === 4) { + if (sourceEdge[3] <= 0 && targetEdge[3] >= 1) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] <= 0 && targetEdge[2] >= 1) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + dx , midy + (-1 * dy) ]; + } + } + + }; + + var StateMachine = function (params) { + params = params || {}; + this.type = "StateMachine"; + + var _super = _jp.Connectors.AbstractBezierConnector.apply(this, arguments), + curviness = params.curviness || 10, + margin = params.margin || 5, + proximityLimit = params.proximityLimit || 80, + clockwise = params.orientation && params.orientation === "clockwise", + _controlPoint; + + this._computeBezier = function(paintInfo, params, sp, tp, w, h) { + var _sx = params.sourcePos[0] < params.targetPos[0] ? 0 : w, + _sy = params.sourcePos[1] < params.targetPos[1] ? 0 : h, + _tx = params.sourcePos[0] < params.targetPos[0] ? w : 0, + _ty = params.sourcePos[1] < params.targetPos[1] ? h : 0; + + // now adjust for the margin + if (params.sourcePos[2] === 0) { + _sx -= margin; + } + if (params.sourcePos[2] === 1) { + _sx += margin; + } + if (params.sourcePos[3] === 0) { + _sy -= margin; + } + if (params.sourcePos[3] === 1) { + _sy += margin; + } + if (params.targetPos[2] === 0) { + _tx -= margin; + } + if (params.targetPos[2] === 1) { + _tx += margin; + } + if (params.targetPos[3] === 0) { + _ty -= margin; + } + if (params.targetPos[3] === 1) { + _ty += margin; + } + + // + // these connectors are quadratic bezier curves, having a single control point. if both anchors + // are located at 0.5 on their respective faces, the control point is set to the midpoint and you + // get a straight line. this is also the case if the two anchors are within 'proximityLimit', since + // it seems to make good aesthetic sense to do that. outside of that, the control point is positioned + // at 'curviness' pixels away along the normal to the straight line connecting the two anchors. + // + // there may be two improvements to this. firstly, we might actually support the notion of avoiding nodes + // in the UI, or at least making a good effort at doing so. if a connection would pass underneath some node, + // for example, we might increase the distance the control point is away from the midpoint in a bid to + // steer it around that node. this will work within limits, but i think those limits would also be the likely + // limits for, once again, aesthetic good sense in the layout of a chart using these connectors. + // + // the second possible change is actually two possible changes: firstly, it is possible we should gradually + // decrease the 'curviness' as the distance between the anchors decreases; start tailing it off to 0 at some + // point (which should be configurable). secondly, we might slightly increase the 'curviness' for connectors + // with respect to how far their anchor is from the center of its respective face. this could either look cool, + // or stupid, and may indeed work only in a way that is so subtle as to have been a waste of time. + // + + var _midx = (_sx + _tx) / 2, + _midy = (_sy + _ty) / 2, + segment = _segment(_sx, _sy, _tx, _ty), + distance = Math.sqrt(Math.pow(_tx - _sx, 2) + Math.pow(_ty - _sy, 2)), + cp1x, cp2x, cp1y, cp2y; + + + // calculate the control point. this code will be where we'll put in a rudimentary element avoidance scheme; it + // will work by extending the control point to force the curve to be, um, curvier. + _controlPoint = _findControlPoint(_midx, + _midy, + segment, + params.sourcePos, + params.targetPos, + curviness, curviness, + distance, + proximityLimit); + + cp1x = _controlPoint[0]; + cp2x = _controlPoint[0]; + cp1y = _controlPoint[1]; + cp2y = _controlPoint[1]; + + _super.addSegment(this, "Bezier", { + x1: _tx, y1: _ty, x2: _sx, y2: _sy, + cp1x: cp1x, cp1y: cp1y, + cp2x: cp2x, cp2y: cp2y + }); + }; + }; + + _jp.Connectors.StateMachine = StateMachine; + _ju.extend(StateMachine, _jp.Connectors.AbstractBezierConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the 'flowchart' connectors, consisting of vertical and horizontal line segments. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + var STRAIGHT = "Straight"; + + var Straight = function (params) { + this.type = STRAIGHT; + var _super = _jp.Connectors.AbstractConnector.apply(this, arguments); + + this._compute = function (paintInfo, _) { + _super.addSegment(this, STRAIGHT, {x1: paintInfo.sx, y1: paintInfo.sy, x2: paintInfo.startStubX, y2: paintInfo.startStubY}); + _super.addSegment(this, STRAIGHT, {x1: paintInfo.startStubX, y1: paintInfo.startStubY, x2: paintInfo.endStubX, y2: paintInfo.endStubY}); + _super.addSegment(this, STRAIGHT, {x1: paintInfo.endStubX, y1: paintInfo.endStubY, x2: paintInfo.tx, y2: paintInfo.ty}); + }; + }; + + _jp.Connectors.Straight = Straight; + _ju.extend(Straight, _jp.Connectors.AbstractConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the SVG renderers. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + +// ************************** SVG utility methods ******************************************** + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + var svgAttributeMap = { + "stroke-linejoin": "stroke-linejoin", + "stroke-dashoffset": "stroke-dashoffset", + "stroke-linecap": "stroke-linecap" + }, + STROKE_DASHARRAY = "stroke-dasharray", + DASHSTYLE = "dashstyle", + LINEAR_GRADIENT = "linearGradient", + RADIAL_GRADIENT = "radialGradient", + DEFS = "defs", + FILL = "fill", + STOP = "stop", + STROKE = "stroke", + STROKE_WIDTH = "stroke-width", + STYLE = "style", + NONE = "none", + JSPLUMB_GRADIENT = "jsplumb_gradient_", + LINE_WIDTH = "strokeWidth", + ns = { + svg: "http://www.w3.org/2000/svg" + }, + _attr = function (node, attributes) { + for (var i in attributes) { + node.setAttribute(i, "" + attributes[i]); + } + }, + _node = function (name, attributes) { + attributes = attributes || {}; + attributes.version = "1.1"; + attributes.xmlns = ns.svg; + return _jp.createElementNS(ns.svg, name, null, null, attributes); + }, + _pos = function (d) { + return "position:absolute;left:" + d[0] + "px;top:" + d[1] + "px"; + }, + _clearGradient = function (parent) { + var els = parent.querySelectorAll(" defs,linearGradient,radialGradient"); + for (var i = 0; i < els.length; i++) { + els[i].parentNode.removeChild(els[i]); + } + }, + _updateGradient = function (parent, node, style, dimensions, uiComponent) { + var id = JSPLUMB_GRADIENT + uiComponent._jsPlumb.instance.idstamp(); + // first clear out any existing gradient + _clearGradient(parent); + // this checks for an 'offset' property in the gradient, and in the absence of it, assumes + // we want a linear gradient. if it's there, we create a radial gradient. + // it is possible that a more explicit means of defining the gradient type would be + // better. relying on 'offset' means that we can never have a radial gradient that uses + // some default offset, for instance. + // issue 244 suggested the 'gradientUnits' attribute; without this, straight/flowchart connectors with gradients would + // not show gradients when the line was perfectly horizontal or vertical. + var g; + if (!style.gradient.offset) { + g = _node(LINEAR_GRADIENT, {id: id, gradientUnits: "userSpaceOnUse"}); + } + else { + g = _node(RADIAL_GRADIENT, { id: id }); + } + + var defs = _node(DEFS); + parent.appendChild(defs); + defs.appendChild(g); + + // the svg radial gradient seems to treat stops in the reverse + // order to how canvas does it. so we want to keep all the maths the same, but + // iterate the actual style declarations in reverse order, if the x indexes are not in order. + for (var i = 0; i < style.gradient.stops.length; i++) { + var styleToUse = uiComponent.segment === 1 || uiComponent.segment === 2 ? i : style.gradient.stops.length - 1 - i, + stopColor = style.gradient.stops[styleToUse][1], + s = _node(STOP, {"offset": Math.floor(style.gradient.stops[i][0] * 100) + "%", "stop-color": stopColor}); + + g.appendChild(s); + } + var applyGradientTo = style.stroke ? STROKE : FILL; + node.setAttribute(applyGradientTo, "url(#" + id + ")"); + }, + _applyStyles = function (parent, node, style, dimensions, uiComponent) { + + node.setAttribute(FILL, style.fill ? style.fill : NONE); + node.setAttribute(STROKE, style.stroke ? style.stroke : NONE); + + if (style.gradient) { + _updateGradient(parent, node, style, dimensions, uiComponent); + } + else { + // make sure we clear any existing gradient + _clearGradient(parent); + node.setAttribute(STYLE, ""); + } + + if (style.strokeWidth) { + node.setAttribute(STROKE_WIDTH, style.strokeWidth); + } + + // in SVG there is a stroke-dasharray attribute we can set, and its syntax looks like + // the syntax in VML but is actually kind of nasty: values are given in the pixel + // coordinate space, whereas in VML they are multiples of the width of the stroked + // line, which makes a lot more sense. for that reason, jsPlumb is supporting both + // the native svg 'stroke-dasharray' attribute, and also the 'dashstyle' concept from + // VML, which will be the preferred method. the code below this converts a dashstyle + // attribute given in terms of stroke width into a pixel representation, by using the + // stroke's lineWidth. + if (style[DASHSTYLE] && style[LINE_WIDTH] && !style[STROKE_DASHARRAY]) { + var sep = style[DASHSTYLE].indexOf(",") === -1 ? " " : ",", + parts = style[DASHSTYLE].split(sep), + styleToUse = ""; + parts.forEach(function (p) { + styleToUse += (Math.floor(p * style.strokeWidth) + sep); + }); + node.setAttribute(STROKE_DASHARRAY, styleToUse); + } + else if (style[STROKE_DASHARRAY]) { + node.setAttribute(STROKE_DASHARRAY, style[STROKE_DASHARRAY]); + } + + // extra attributes such as join type, dash offset. + for (var i in svgAttributeMap) { + if (style[i]) { + node.setAttribute(svgAttributeMap[i], style[i]); + } + } + }, + _appendAtIndex = function (svg, path, idx) { + if (svg.childNodes.length > idx) { + svg.insertBefore(path, svg.childNodes[idx]); + } + else { + svg.appendChild(path); + } + }; + + /** + utility methods for other objects to use. + */ + _ju.svg = { + node: _node, + attr: _attr, + pos: _pos + }; + + // ************************** / SVG utility methods ******************************************** + + /* + * Base class for SVG components. + */ + var SvgComponent = function (params) { + var pointerEventsSpec = params.pointerEventsSpec || "all", renderer = {}; + + _jp.jsPlumbUIComponent.apply(this, params.originalArgs); + this.canvas = null; + this.path = null; + this.svg = null; + this.bgCanvas = null; + + var clazz = params.cssClass + " " + (params.originalArgs[0].cssClass || ""), + svgParams = { + "style": "", + "width": 0, + "height": 0, + "pointer-events": pointerEventsSpec, + "position": "absolute" + }; + + this.svg = _node("svg", svgParams); + + if (params.useDivWrapper) { + this.canvas = _jp.createElement("div", { position : "absolute" }); + _ju.sizeElement(this.canvas, 0, 0, 1, 1); + this.canvas.className = clazz; + } + else { + _attr(this.svg, { "class": clazz }); + this.canvas = this.svg; + } + + params._jsPlumb.appendElement(this.canvas, params.originalArgs[0].parent); + if (params.useDivWrapper) { + this.canvas.appendChild(this.svg); + } + + var displayElements = [ this.canvas ]; + this.getDisplayElements = function () { + return displayElements; + }; + + this.appendDisplayElement = function (el) { + displayElements.push(el); + }; + + this.paint = function (style, anchor, extents) { + if (style != null) { + + var xy = [ this.x, this.y ], wh = [ this.w, this.h ], p; + if (extents != null) { + if (extents.xmin < 0) { + xy[0] += extents.xmin; + } + if (extents.ymin < 0) { + xy[1] += extents.ymin; + } + wh[0] = extents.xmax + ((extents.xmin < 0) ? -extents.xmin : 0); + wh[1] = extents.ymax + ((extents.ymin < 0) ? -extents.ymin : 0); + } + + if (params.useDivWrapper) { + _ju.sizeElement(this.canvas, xy[0], xy[1], wh[0], wh[1]); + xy[0] = 0; + xy[1] = 0; + p = _pos([ 0, 0 ]); + } + else { + p = _pos([ xy[0], xy[1] ]); + } + + renderer.paint.apply(this, arguments); + + _attr(this.svg, { + "style": p, + "width": wh[0] || 0, + "height": wh[1] || 0 + }); + } + }; + + return { + renderer: renderer + }; + }; + + _ju.extend(SvgComponent, _jp.jsPlumbUIComponent, { + cleanup: function (force) { + if (force || this.typeId == null) { + if (this.canvas) { + this.canvas._jsPlumb = null; + } + if (this.svg) { + this.svg._jsPlumb = null; + } + if (this.bgCanvas) { + this.bgCanvas._jsPlumb = null; + } + + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + if (this.bgCanvas && this.bgCanvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + + this.svg = null; + this.canvas = null; + this.path = null; + this.group = null; + } + else { + // if not a forced cleanup, just detach from DOM for now. + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + if (this.bgCanvas && this.bgCanvas.parentNode) { + this.bgCanvas.parentNode.removeChild(this.bgCanvas); + } + } + }, + reattach:function(instance) { + var c = instance.getContainer(); + if (this.canvas && this.canvas.parentNode == null) { + c.appendChild(this.canvas); + } + if (this.bgCanvas && this.bgCanvas.parentNode == null) { + c.appendChild(this.bgCanvas); + } + }, + setVisible: function (v) { + if (this.canvas) { + this.canvas.style.display = v ? "block" : "none"; + } + } + }); + + /* + * Base class for SVG connectors. + */ + _jp.ConnectorRenderers.svg = function (params) { + var self = this, + _super = SvgComponent.apply(this, [ + { + cssClass: params._jsPlumb.connectorClass, + originalArgs: arguments, + pointerEventsSpec: "none", + _jsPlumb: params._jsPlumb + } + ]); + + _super.renderer.paint = function (style, anchor, extents) { + + var segments = self.getSegments(), p = "", offset = [0, 0]; + if (extents.xmin < 0) { + offset[0] = -extents.xmin; + } + if (extents.ymin < 0) { + offset[1] = -extents.ymin; + } + + if (segments.length > 0) { + + p = self.getPathData(); + + var a = { + d: p, + transform: "translate(" + offset[0] + "," + offset[1] + ")", + "pointer-events": params["pointer-events"] || "visibleStroke" + }, + outlineStyle = null, + d = [self.x, self.y, self.w, self.h]; + + // outline style. actually means drawing an svg object underneath the main one. + if (style.outlineStroke) { + var outlineWidth = style.outlineWidth || 1, + outlineStrokeWidth = style.strokeWidth + (2 * outlineWidth); + outlineStyle = _jp.extend({}, style); + delete outlineStyle.gradient; + outlineStyle.stroke = style.outlineStroke; + outlineStyle.strokeWidth = outlineStrokeWidth; + + if (self.bgPath == null) { + self.bgPath = _node("path", a); + _jp.addClass(self.bgPath, _jp.connectorOutlineClass); + _appendAtIndex(self.svg, self.bgPath, 0); + } + else { + _attr(self.bgPath, a); + } + + _applyStyles(self.svg, self.bgPath, outlineStyle, d, self); + } + + if (self.path == null) { + self.path = _node("path", a); + _appendAtIndex(self.svg, self.path, style.outlineStroke ? 1 : 0); + } + else { + _attr(self.path, a); + } + + _applyStyles(self.svg, self.path, style, d, self); + } + }; + }; + _ju.extend(_jp.ConnectorRenderers.svg, SvgComponent); + +// ******************************* svg segment renderer ***************************************************** + + +// ******************************* /svg segments ***************************************************** + + /* + * Base class for SVG endpoints. + */ + var SvgEndpoint = _jp.SvgEndpoint = function (params) { + var _super = SvgComponent.apply(this, [ + { + cssClass: params._jsPlumb.endpointClass, + originalArgs: arguments, + pointerEventsSpec: "all", + useDivWrapper: true, + _jsPlumb: params._jsPlumb + } + ]); + + _super.renderer.paint = function (style) { + var s = _jp.extend({}, style); + if (s.outlineStroke) { + s.stroke = s.outlineStroke; + } + + if (this.node == null) { + this.node = this.makeNode(s); + this.svg.appendChild(this.node); + } + else if (this.updateNode != null) { + this.updateNode(this.node); + } + _applyStyles(this.svg, this.node, s, [ this.x, this.y, this.w, this.h ], this); + _pos(this.node, [ this.x, this.y ]); + }.bind(this); + + }; + _ju.extend(SvgEndpoint, SvgComponent); + + /* + * SVG Dot Endpoint + */ + _jp.Endpoints.svg.Dot = function () { + _jp.Endpoints.Dot.apply(this, arguments); + SvgEndpoint.apply(this, arguments); + this.makeNode = function (style) { + return _node("circle", { + "cx": this.w / 2, + "cy": this.h / 2, + "r": this.radius + }); + }; + this.updateNode = function (node) { + _attr(node, { + "cx": this.w / 2, + "cy": this.h / 2, + "r": this.radius + }); + }; + }; + _ju.extend(_jp.Endpoints.svg.Dot, [_jp.Endpoints.Dot, SvgEndpoint]); + + /* + * SVG Rectangle Endpoint + */ + _jp.Endpoints.svg.Rectangle = function () { + _jp.Endpoints.Rectangle.apply(this, arguments); + SvgEndpoint.apply(this, arguments); + this.makeNode = function (style) { + return _node("rect", { + "width": this.w, + "height": this.h + }); + }; + this.updateNode = function (node) { + _attr(node, { + "width": this.w, + "height": this.h + }); + }; + }; + _ju.extend(_jp.Endpoints.svg.Rectangle, [_jp.Endpoints.Rectangle, SvgEndpoint]); + + /* + * SVG Image Endpoint is the default image endpoint. + */ + _jp.Endpoints.svg.Image = _jp.Endpoints.Image; + /* + * Blank endpoint in svg renderer is the default Blank endpoint. + */ + _jp.Endpoints.svg.Blank = _jp.Endpoints.Blank; + /* + * Label overlay in svg renderer is the default Label overlay. + */ + _jp.Overlays.svg.Label = _jp.Overlays.Label; + /* + * Custom overlay in svg renderer is the default Custom overlay. + */ + _jp.Overlays.svg.Custom = _jp.Overlays.Custom; + + var AbstractSvgArrowOverlay = function (superclass, originalArgs) { + superclass.apply(this, originalArgs); + _jp.jsPlumbUIComponent.apply(this, originalArgs); + this.isAppendedAtTopLevel = false; + var self = this; + this.path = null; + this.paint = function (params, containerExtents) { + // only draws on connections, not endpoints. + if (params.component.svg && containerExtents) { + if (this.path == null) { + this.path = _node("path", { + "pointer-events": "all" + }); + params.component.svg.appendChild(this.path); + if (this.elementCreated) { + this.elementCreated(this.path, params.component); + } + + this.canvas = params.component.svg; // for the sake of completeness; this behaves the same as other overlays + } + var clazz = originalArgs && (originalArgs.length === 1) ? (originalArgs[0].cssClass || "") : "", + offset = [0, 0]; + + if (containerExtents.xmin < 0) { + offset[0] = -containerExtents.xmin; + } + if (containerExtents.ymin < 0) { + offset[1] = -containerExtents.ymin; + } + + _attr(this.path, { + "d": makePath(params.d), + "class": clazz, + stroke: params.stroke ? params.stroke : null, + fill: params.fill ? params.fill : null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + } + }; + var makePath = function (d) { + return (isNaN(d.cxy.x) || isNaN(d.cxy.y)) ? "" : "M" + d.hxy.x + "," + d.hxy.y + + " L" + d.tail[0].x + "," + d.tail[0].y + + " L" + d.cxy.x + "," + d.cxy.y + + " L" + d.tail[1].x + "," + d.tail[1].y + + " L" + d.hxy.x + "," + d.hxy.y; + }; + this.transfer = function(target) { + if (target.canvas && this.path && this.path.parentNode) { + this.path.parentNode.removeChild(this.path); + target.canvas.appendChild(this.path); + } + }; + }; + + var svgProtoFunctions = { + cleanup : function (force) { + if (this.path != null) { + if (force) { + this._jsPlumb.instance.removeElement(this.path); + } + else { + if (this.path.parentNode) { + this.path.parentNode.removeChild(this.path); + } + } + } + }, reattach :function(instance, component) { + if (this.path && component.canvas) { + component.canvas.appendChild(this.path); + } + }, + setVisible : function (v) { + if (this.path != null) { + (this.path.style.display = (v ? "block" : "none")); + } + } + }; + + _ju.extend(AbstractSvgArrowOverlay, [_jp.jsPlumbUIComponent, _jp.Overlays.AbstractOverlay]); + + _jp.Overlays.svg.Arrow = function () { + AbstractSvgArrowOverlay.apply(this, [_jp.Overlays.Arrow, arguments]); + }; + _ju.extend(_jp.Overlays.svg.Arrow, [ _jp.Overlays.Arrow, AbstractSvgArrowOverlay ], svgProtoFunctions); + + _jp.Overlays.svg.PlainArrow = function () { + AbstractSvgArrowOverlay.apply(this, [_jp.Overlays.PlainArrow, arguments]); + }; + _ju.extend(_jp.Overlays.svg.PlainArrow, [ _jp.Overlays.PlainArrow, AbstractSvgArrowOverlay ], svgProtoFunctions); + + _jp.Overlays.svg.Diamond = function () { + AbstractSvgArrowOverlay.apply(this, [_jp.Overlays.Diamond, arguments]); + }; + _ju.extend(_jp.Overlays.svg.Diamond, [ _jp.Overlays.Diamond, AbstractSvgArrowOverlay ], svgProtoFunctions); + + // a test + _jp.Overlays.svg.GuideLines = function () { + var path = null, self = this, p1_1, p1_2; + _jp.Overlays.GuideLines.apply(this, arguments); + this.paint = function (params, containerExtents) { + if (path == null) { + path = _node("path"); + params.connector.svg.appendChild(path); + self.attachListeners(path, params.connector); + self.attachListeners(path, self); + + p1_1 = _node("path"); + params.connector.svg.appendChild(p1_1); + self.attachListeners(p1_1, params.connector); + self.attachListeners(p1_1, self); + + p1_2 = _node("path"); + params.connector.svg.appendChild(p1_2); + self.attachListeners(p1_2, params.connector); + self.attachListeners(p1_2, self); + } + + var offset = [0, 0]; + if (containerExtents.xmin < 0) { + offset[0] = -containerExtents.xmin; + } + if (containerExtents.ymin < 0) { + offset[1] = -containerExtents.ymin; + } + + _attr(path, { + "d": makePath(params.head, params.tail), + stroke: "red", + fill: null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + + _attr(p1_1, { + "d": makePath(params.tailLine[0], params.tailLine[1]), + stroke: "blue", + fill: null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + + _attr(p1_2, { + "d": makePath(params.headLine[0], params.headLine[1]), + stroke: "green", + fill: null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + }; + + var makePath = function (d1, d2) { + return "M " + d1.x + "," + d1.y + + " L" + d2.x + "," + d2.y; + }; + }; + _ju.extend(_jp.Overlays.svg.GuideLines, _jp.Overlays.GuideLines); +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains code used when jsPlumb is being rendered in a DOM. + * + * Copyright (c) 2010 - 2019 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil, + _jk = root.Katavorio, _jg = root.Biltong; + + var _getEventManager = function(instance) { + var e = instance._mottle; + if (!e) { + e = instance._mottle = new root.Mottle(); + } + return e; + }; + + var _getDragManager = function (instance, category) { + + category = category || "main"; + var key = "_katavorio_" + category; + var k = instance[key], + e = instance.getEventManager(); + + if (!k) { + k = new _jk({ + bind: e.on, + unbind: e.off, + getSize: _jp.getSize, + getConstrainingRectangle:function(el) { + return [ el.parentNode.scrollWidth, el.parentNode.scrollHeight ]; + }, + getPosition: function (el, relativeToRoot) { + // if this is a nested draggable then compute the offset against its own offsetParent, otherwise + // compute against the Container's origin. see also the getUIPosition method below. + var o = instance.getOffset(el, relativeToRoot, el._katavorioDrag ? el.offsetParent : null); + return [o.left, o.top]; + }, + setPosition: function (el, xy) { + el.style.left = xy[0] + "px"; + el.style.top = xy[1] + "px"; + }, + addClass: _jp.addClass, + removeClass: _jp.removeClass, + intersects: _jg.intersects, + indexOf: function(l, i) { return l.indexOf(i); }, + scope:instance.getDefaultScope(), + css: { + noSelect: instance.dragSelectClass, + droppable: "jtk-droppable", + draggable: "jtk-draggable", + drag: "jtk-drag", + selected: "jtk-drag-selected", + active: "jtk-drag-active", + hover: "jtk-drag-hover", + ghostProxy:"jtk-ghost-proxy" + } + }); + k.setZoom(instance.getZoom()); + instance[key] = k; + instance.bind("zoom", k.setZoom); + } + return k; + }; + + var _dragStart=function(params) { + var options = params.el._jsPlumbDragOptions; + var cont = true; + if (options.canDrag) { + cont = options.canDrag(); + } + if (cont) { + this.setHoverSuspended(true); + this.select({source: params.el}).addClass(this.elementDraggingClass + " " + this.sourceElementDraggingClass, true); + this.select({target: params.el}).addClass(this.elementDraggingClass + " " + this.targetElementDraggingClass, true); + this.setConnectionBeingDragged(true); + } + return cont; + }; + var _dragMove=function(params) { + var ui = this.getUIPosition(arguments, this.getZoom()); + if (ui != null) { + var o = params.el._jsPlumbDragOptions; + this.draw(params.el, ui, null, true); + if (o._dragging) { + this.addClass(params.el, "jtk-dragged"); + } + o._dragging = true; + } + }; + var _dragStop=function(params) { + var elements = params.selection, uip; + + var _one = function (_e) { + if (_e[1] != null) { + // run the reported offset through the code that takes parent containers + // into account, to adjust if necessary (issue 554) + uip = this.getUIPosition([{ + el:_e[2].el, + pos:[_e[1].left, _e[1].top] + }]); + this.draw(_e[2].el, uip); + } + + if (_e[0]._jsPlumbDragOptions != null) { + delete _e[0]._jsPlumbDragOptions._dragging; + } + + this.removeClass(_e[0], "jtk-dragged"); + this.select({source: _e[2].el}).removeClass(this.elementDraggingClass + " " + this.sourceElementDraggingClass, true); + this.select({target: _e[2].el}).removeClass(this.elementDraggingClass + " " + this.targetElementDraggingClass, true); + this.getDragManager().dragEnded(_e[2].el); + }.bind(this); + + for (var i = 0; i < elements.length; i++) { + _one(elements[i]); + } + + this.setHoverSuspended(false); + this.setConnectionBeingDragged(false); + }; + + var _animProps = function (o, p) { + var _one = function (pName) { + if (p[pName] != null) { + if (_ju.isString(p[pName])) { + var m = p[pName].match(/-=/) ? -1 : 1, + v = p[pName].substring(2); + return o[pName] + (m * v); + } + else { + return p[pName]; + } + } + else { + return o[pName]; + } + }; + return [ _one("left"), _one("top") ]; + }; + + var _genLoc = function (prefix, e) { + if (e == null) { + return [ 0, 0 ]; + } + var ts = _touches(e), t = _getTouch(ts, 0); + return [t[prefix + "X"], t[prefix + "Y"]]; + }, + _pageLocation = _genLoc.bind(this, "page"), + _screenLocation = _genLoc.bind(this, "screen"), + _clientLocation = _genLoc.bind(this, "client"), + _getTouch = function (touches, idx) { + return touches.item ? touches.item(idx) : touches[idx]; + }, + _touches = function (e) { + return e.touches && e.touches.length > 0 ? e.touches : + e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches : + e.targetTouches && e.targetTouches.length > 0 ? e.targetTouches : + [ e ]; + }; + + /** + Manages dragging for some instance of jsPlumb. + + TODO instead of this being accessed directly, it should subscribe to events on the jsPlumb instance: every method + in here is called directly by jsPlumb. But what should happen is that we have unpublished events that this listens + to. The only trick is getting one of these instantiated with every jsPlumb instance: it needs to have a hook somehow. + Basically the general idea is to pull ALL the drag code out (prototype method registrations plus this) into a + dedicated drag script), that does not necessarily need to be included. + + + */ + var DragManager = function (_currentInstance) { + var _draggables = {}, _dlist = [], _delements = {}, _elementsWithEndpoints = {}, + // elementids mapped to the draggable to which they belong. + _draggablesForElements = {}; + + /** + register some element as draggable. right now the drag init stuff is done elsewhere, and it is + possible that will continue to be the case. + */ + this.register = function (el) { + var id = _currentInstance.getId(el), + parentOffset; + + if (!_draggables[id]) { + _draggables[id] = el; + _dlist.push(el); + _delements[id] = {}; + } + + // look for child elements that have endpoints and register them against this draggable. + var _oneLevel = function (p) { + if (p) { + for (var i = 0; i < p.childNodes.length; i++) { + if (p.childNodes[i].nodeType !== 3 && p.childNodes[i].nodeType !== 8) { + var cEl = jsPlumb.getElement(p.childNodes[i]), + cid = _currentInstance.getId(p.childNodes[i], null, true); + if (cid && _elementsWithEndpoints[cid] && _elementsWithEndpoints[cid] > 0) { + if (!parentOffset) { + parentOffset = _currentInstance.getOffset(el); + } + var cOff = _currentInstance.getOffset(cEl); + _delements[id][cid] = { + id: cid, + offset: { + left: cOff.left - parentOffset.left, + top: cOff.top - parentOffset.top + } + }; + _draggablesForElements[cid] = id; + } + _oneLevel(p.childNodes[i]); + } + } + } + }; + + _oneLevel(el); + }; + + // refresh the offsets for child elements of this element. + this.updateOffsets = function (elId, childOffsetOverrides) { + if (elId != null) { + childOffsetOverrides = childOffsetOverrides || {}; + var domEl = jsPlumb.getElement(elId), + id = _currentInstance.getId(domEl), + children = _delements[id], + parentOffset; + + if (children) { + for (var i in children) { + if (children.hasOwnProperty(i)) { + var cel = jsPlumb.getElement(i), + cOff = childOffsetOverrides[i] || _currentInstance.getOffset(cel); + + // do not update if we have a value already and we'd just be writing 0,0 + if (cel.offsetParent == null && _delements[id][i] != null) { + continue; + } + + if (!parentOffset) { + parentOffset = _currentInstance.getOffset(domEl); + } + + _delements[id][i] = { + id: i, + offset: { + left: cOff.left - parentOffset.left, + top: cOff.top - parentOffset.top + } + }; + _draggablesForElements[i] = id; + } + } + } + } + }; + + /** + notification that an endpoint was added to the given el. we go up from that el's parent + node, looking for a parent that has been registered as a draggable. if we find one, we add this + el to that parent's list of elements to update on drag (if it is not there already) + */ + this.endpointAdded = function (el, id) { + + id = id || _currentInstance.getId(el); + + var b = document.body, + p = el.parentNode; + + _elementsWithEndpoints[id] = _elementsWithEndpoints[id] ? _elementsWithEndpoints[id] + 1 : 1; + + while (p != null && p !== b) { + var pid = _currentInstance.getId(p, null, true); + if (pid && _draggables[pid]) { + var pLoc = _currentInstance.getOffset(p); + + if (_delements[pid][id] == null) { + var cLoc = _currentInstance.getOffset(el); + _delements[pid][id] = { + id: id, + offset: { + left: cLoc.left - pLoc.left, + top: cLoc.top - pLoc.top + } + }; + _draggablesForElements[id] = pid; + } + break; + } + p = p.parentNode; + } + }; + + this.endpointDeleted = function (endpoint) { + if (_elementsWithEndpoints[endpoint.elementId]) { + _elementsWithEndpoints[endpoint.elementId]--; + if (_elementsWithEndpoints[endpoint.elementId] <= 0) { + for (var i in _delements) { + if (_delements.hasOwnProperty(i) && _delements[i]) { + delete _delements[i][endpoint.elementId]; + delete _draggablesForElements[endpoint.elementId]; + } + } + } + } + }; + + this.changeId = function (oldId, newId) { + _delements[newId] = _delements[oldId]; + _delements[oldId] = {}; + _draggablesForElements[newId] = _draggablesForElements[oldId]; + _draggablesForElements[oldId] = null; + }; + + this.getElementsForDraggable = function (id) { + return _delements[id]; + }; + + this.elementRemoved = function (elementId) { + var elId = _draggablesForElements[elementId]; + if (elId) { + delete _delements[elId][elementId]; + delete _draggablesForElements[elementId]; + } + }; + + this.reset = function () { + _draggables = {}; + _dlist = []; + _delements = {}; + _elementsWithEndpoints = {}; + }; + + // + // notification drag ended. We check automatically if need to update some + // ancestor's offsets. + // + this.dragEnded = function (el) { + if (el.offsetParent != null) { + var id = _currentInstance.getId(el), + ancestor = _draggablesForElements[id]; + + if (ancestor) { + this.updateOffsets(ancestor); + } + } + }; + + this.setParent = function (el, elId, p, pId, currentChildLocation) { + var current = _draggablesForElements[elId]; + if (!_delements[pId]) { + _delements[pId] = {}; + } + var pLoc = _currentInstance.getOffset(p), + cLoc = currentChildLocation || _currentInstance.getOffset(el); + + if (current && _delements[current]) { + delete _delements[current][elId]; + } + + _delements[pId][elId] = { + id:elId, + offset : { + left: cLoc.left - pLoc.left, + top: cLoc.top - pLoc.top + } + }; + _draggablesForElements[elId] = pId; + }; + + this.clearParent = function(el, elId) { + var current = _draggablesForElements[elId]; + if (current) { + delete _delements[current][elId]; + delete _draggablesForElements[elId]; + } + }; + + this.revalidateParent = function(el, elId, childOffset) { + var current = _draggablesForElements[elId]; + if (current) { + var co = {}; + co[elId] = childOffset; + this.updateOffsets(current, co); + _currentInstance.revalidate(current); + } + }; + + this.getDragAncestor = function (el) { + var de = jsPlumb.getElement(el), + id = _currentInstance.getId(de), + aid = _draggablesForElements[id]; + + if (aid) { + return jsPlumb.getElement(aid); + } + else { + return null; + } + }; + + }; + + var _setClassName = function (el, cn, classList) { + cn = _ju.fastTrim(cn); + if (typeof el.className.baseVal !== "undefined") { + el.className.baseVal = cn; + } + else { + el.className = cn; + } + + // recent (i currently have 61.0.3163.100) version of chrome do not update classList when you set the base val + // of an svg element's className. in the long run we'd like to move to just using classList anyway + try { + var cl = el.classList; + if (cl != null) { + while (cl.length > 0) { + cl.remove(cl.item(0)); + } + for (var i = 0; i < classList.length; i++) { + if (classList[i]) { + cl.add(classList[i]); + } + } + } + } + catch(e) { + // not fatal + _ju.log("JSPLUMB: cannot set class list", e); + } + }, + _getClassName = function (el) { + return (typeof el.className.baseVal === "undefined") ? el.className : el.className.baseVal; + }, + _classManip = function (el, classesToAdd, classesToRemove) { + classesToAdd = classesToAdd == null ? [] : _ju.isArray(classesToAdd) ? classesToAdd : classesToAdd.split(/\s+/); + classesToRemove = classesToRemove == null ? [] : _ju.isArray(classesToRemove) ? classesToRemove : classesToRemove.split(/\s+/); + + var className = _getClassName(el), + curClasses = className.split(/\s+/); + + var _oneSet = function (add, classes) { + for (var i = 0; i < classes.length; i++) { + if (add) { + if (curClasses.indexOf(classes[i]) === -1) { + curClasses.push(classes[i]); + } + } + else { + var idx = curClasses.indexOf(classes[i]); + if (idx !== -1) { + curClasses.splice(idx, 1); + } + } + } + }; + + _oneSet(true, classesToAdd); + _oneSet(false, classesToRemove); + + _setClassName(el, curClasses.join(" "), curClasses); + }; + + root.jsPlumb.extend(root.jsPlumbInstance.prototype, { + + headless: false, + + pageLocation: _pageLocation, + screenLocation: _screenLocation, + clientLocation: _clientLocation, + + getDragManager:function() { + if (this.dragManager == null) { + this.dragManager = new DragManager(this); + } + + return this.dragManager; + }, + + recalculateOffsets:function(elId) { + this.getDragManager().updateOffsets(elId); + }, + + createElement:function(tag, style, clazz, atts) { + return this.createElementNS(null, tag, style, clazz, atts); + }, + + createElementNS:function(ns, tag, style, clazz, atts) { + var e = ns == null ? document.createElement(tag) : document.createElementNS(ns, tag); + var i; + style = style || {}; + for (i in style) { + e.style[i] = style[i]; + } + + if (clazz) { + e.className = clazz; + } + + atts = atts || {}; + for (i in atts) { + e.setAttribute(i, "" + atts[i]); + } + + return e; + }, + + getAttribute: function (el, attName) { + return el.getAttribute != null ? el.getAttribute(attName) : null; + }, + + setAttribute: function (el, a, v) { + if (el.setAttribute != null) { + el.setAttribute(a, v); + } + }, + + setAttributes: function (el, atts) { + for (var i in atts) { + if (atts.hasOwnProperty(i)) { + el.setAttribute(i, atts[i]); + } + } + }, + appendToRoot: function (node) { + document.body.appendChild(node); + }, + getRenderModes: function () { + return [ "svg" ]; + }, + getClass:_getClassName, + addClass: function (el, clazz) { + jsPlumb.each(el, function (e) { + _classManip(e, clazz); + }); + }, + hasClass: function (el, clazz) { + el = jsPlumb.getElement(el); + if (el.classList) { + return el.classList.contains(clazz); + } + else { + return _getClassName(el).indexOf(clazz) !== -1; + } + }, + removeClass: function (el, clazz) { + jsPlumb.each(el, function (e) { + _classManip(e, null, clazz); + }); + }, + toggleClass:function(el, clazz) { + if (jsPlumb.hasClass(el, clazz)) { + jsPlumb.removeClass(el, clazz); + } else { + jsPlumb.addClass(el, clazz); + } + }, + updateClasses: function (el, toAdd, toRemove) { + jsPlumb.each(el, function (e) { + _classManip(e, toAdd, toRemove); + }); + }, + setClass: function (el, clazz) { + if (clazz != null) { + jsPlumb.each(el, function (e) { + _setClassName(e, clazz, clazz.split(/\s+/)); + }); + } + }, + setPosition: function (el, p) { + el.style.left = p.left + "px"; + el.style.top = p.top + "px"; + }, + getPosition: function (el) { + var _one = function (prop) { + var v = el.style[prop]; + return v ? v.substring(0, v.length - 2) : 0; + }; + return { + left: _one("left"), + top: _one("top") + }; + }, + getStyle:function(el, prop) { + if (typeof window.getComputedStyle !== 'undefined') { + return getComputedStyle(el, null).getPropertyValue(prop); + } else { + return el.currentStyle[prop]; + } + }, + getSelector: function (ctx, spec) { + var sel = null; + if (arguments.length === 1) { + sel = ctx.nodeType != null ? ctx : document.querySelectorAll(ctx); + } + else { + sel = ctx.querySelectorAll(spec); + } + + return sel; + }, + getOffset:function(el, relativeToRoot, container) { + el = jsPlumb.getElement(el); + container = container || this.getContainer(); + var out = { + left: el.offsetLeft, + top: el.offsetTop + }, + op = (relativeToRoot || (container != null && (el !== container && el.offsetParent !== container))) ? el.offsetParent : null, + _maybeAdjustScroll = function(offsetParent) { + if (offsetParent != null && offsetParent !== document.body && (offsetParent.scrollTop > 0 || offsetParent.scrollLeft > 0)) { + out.left -= offsetParent.scrollLeft; + out.top -= offsetParent.scrollTop; + } + }.bind(this); + + while (op != null) { + out.left += op.offsetLeft; + out.top += op.offsetTop; + _maybeAdjustScroll(op); + op = relativeToRoot ? op.offsetParent : + op.offsetParent === container ? null : op.offsetParent; + } + + // if container is scrolled and the element (or its offset parent) is not absolute or fixed, adjust accordingly. + if (container != null && !relativeToRoot && (container.scrollTop > 0 || container.scrollLeft > 0)) { + var pp = el.offsetParent != null ? this.getStyle(el.offsetParent, "position") : "static", + p = this.getStyle(el, "position"); + if (p !== "absolute" && p !== "fixed" && pp !== "absolute" && pp !== "fixed") { + out.left -= container.scrollLeft; + out.top -= container.scrollTop; + } + } + return out; + }, + // + // return x+y proportion of the given element's size corresponding to the location of the given event. + // + getPositionOnElement: function (evt, el, zoom) { + var box = typeof el.getBoundingClientRect !== "undefined" ? el.getBoundingClientRect() : { left: 0, top: 0, width: 0, height: 0 }, + body = document.body, + docElem = document.documentElement, + scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop, + scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft, + clientTop = docElem.clientTop || body.clientTop || 0, + clientLeft = docElem.clientLeft || body.clientLeft || 0, + pst = 0, + psl = 0, + top = box.top + scrollTop - clientTop + (pst * zoom), + left = box.left + scrollLeft - clientLeft + (psl * zoom), + cl = jsPlumb.pageLocation(evt), + w = box.width || (el.offsetWidth * zoom), + h = box.height || (el.offsetHeight * zoom), + x = (cl[0] - left) / w, + y = (cl[1] - top) / h; + + return [ x, y ]; + }, + + /** + * Gets the absolute position of some element as read from the left/top properties in its style. + * @method getAbsolutePosition + * @param {Element} el The element to retrieve the absolute coordinates from. **Note** this is a DOM element, not a selector from the underlying library. + * @return {Number[]} [left, top] pixel values. + */ + getAbsolutePosition: function (el) { + var _one = function (s) { + var ss = el.style[s]; + if (ss) { + return parseFloat(ss.substring(0, ss.length - 2)); + } + }; + return [ _one("left"), _one("top") ]; + }, + + /** + * Sets the absolute position of some element by setting the left/top properties in its style. + * @method setAbsolutePosition + * @param {Element} el The element to set the absolute coordinates on. **Note** this is a DOM element, not a selector from the underlying library. + * @param {Number[]} xy x and y coordinates + * @param {Number[]} [animateFrom] Optional previous xy to animate from. + * @param {Object} [animateOptions] Options for the animation. + */ + setAbsolutePosition: function (el, xy, animateFrom, animateOptions) { + if (animateFrom) { + this.animate(el, { + left: "+=" + (xy[0] - animateFrom[0]), + top: "+=" + (xy[1] - animateFrom[1]) + }, animateOptions); + } + else { + el.style.left = xy[0] + "px"; + el.style.top = xy[1] + "px"; + } + }, + /** + * gets the size for the element, in an array : [ width, height ]. + */ + getSize: function (el) { + return [ el.offsetWidth, el.offsetHeight ]; + }, + getWidth: function (el) { + return el.offsetWidth; + }, + getHeight: function (el) { + return el.offsetHeight; + }, + getRenderMode : function() { return "svg"; }, + draggable : function (el, options) { + var info; + el = _ju.isArray(el) || (el.length != null && !_ju.isString(el)) ? el: [ el ]; + Array.prototype.slice.call(el).forEach(function(_el) { + info = this.info(_el); + if (info.el) { + this._initDraggableIfNecessary(info.el, true, options, info.id, true); + } + }.bind(this)); + return this; + }, + snapToGrid : function(el, x, y) { + var out = []; + var _oneEl = function(_el) { + var info = this.info(_el); + if (info.el != null && info.el._katavorioDrag) { + var snapped = info.el._katavorioDrag.snap(x, y); + this.revalidate(info.el); + out.push([info.el, snapped]); + } + }.bind(this); + + // if you call this method with 0 arguments or 2 arguments it is assumed you want to snap all managed elements to + // a grid. if you supply one argument or 3, then you are assumed to be specifying one element. + if(arguments.length === 1 || arguments.length === 3) { + _oneEl(el, x, y); + } else { + var _me = this.getManagedElements(); + for (var mel in _me) { + _oneEl(mel, arguments[0], arguments[1]); + } + } + + return out; + }, + initDraggable: function (el, options, category) { + _getDragManager(this, category).draggable(el, options); + el._jsPlumbDragOptions = options; + }, + destroyDraggable: function (el, category) { + _getDragManager(this, category).destroyDraggable(el); + delete el._jsPlumbDragOptions; + }, + unbindDraggable: function (el, evt, fn, category) { + _getDragManager(this, category).destroyDraggable(el, evt, fn); + }, + setDraggable : function (element, draggable) { + return jsPlumb.each(element, function (el) { + if (this.isDragSupported(el)) { + this._draggableStates[this.getAttribute(el, "id")] = draggable; + this.setElementDraggable(el, draggable); + } + }.bind(this)); + }, + _draggableStates : {}, + /* + * toggles the draggable state of the given element(s). + * el is either an id, or an element object, or a list of ids/element objects. + */ + toggleDraggable : function (el) { + var state; + jsPlumb.each(el, function (el) { + var elId = this.getAttribute(el, "id"); + state = this._draggableStates[elId] == null ? false : this._draggableStates[elId]; + state = !state; + this._draggableStates[elId] = state; + this.setDraggable(el, state); + return state; + }.bind(this)); + return state; + }, + _initDraggableIfNecessary : function (element, isDraggable, dragOptions, id, fireEvent) { + // TODO FIRST: move to DragManager. including as much of the decision to init dragging as possible. + if (!jsPlumb.headless) { + var _draggable = isDraggable == null ? false : isDraggable; + if (_draggable) { + if (jsPlumb.isDragSupported(element, this)) { + var options = dragOptions || this.Defaults.DragOptions; + options = jsPlumb.extend({}, options); // make a copy. + if (!jsPlumb.isAlreadyDraggable(element, this)) { + var dragEvent = jsPlumb.dragEvents.drag, + stopEvent = jsPlumb.dragEvents.stop, + startEvent = jsPlumb.dragEvents.start; + + this.manage(id, element); + + options[startEvent] = _ju.wrap(options[startEvent], _dragStart.bind(this)); + + options[dragEvent] = _ju.wrap(options[dragEvent], _dragMove.bind(this)); + + options[stopEvent] = _ju.wrap(options[stopEvent], _dragStop.bind(this)); + + var elId = this.getId(element); // need ID + + this._draggableStates[elId] = true; + var draggable = this._draggableStates[elId]; + + options.disabled = draggable == null ? false : !draggable; + this.initDraggable(element, options); + this.getDragManager().register(element); + if (fireEvent) { + this.fire("elementDraggable", {el:element, options:options}); + } + } + else { + // already draggable. attach any start, drag or stop listeners to the current Drag. + if (dragOptions.force) { + this.initDraggable(element, options); + } + } + } + } + } + }, + animationSupported:true, + getElement: function (el) { + if (el == null) { + return null; + } + // here we pluck the first entry if el was a list of entries. + // this is not my favourite thing to do, but previous versions of + // jsplumb supported jquery selectors, and it is possible a selector + // will be passed in here. + el = typeof el === "string" ? el : el.length != null && el.enctype == null ? el[0] : el; + return typeof el === "string" ? document.getElementById(el) : el; + }, + removeElement: function (element) { + _getDragManager(this).elementRemoved(element); + this.getEventManager().remove(element); + }, + // + // this adapter supports a rudimentary animation function. no easing is supported. only + // left/top properties are supported. property delta args are expected to be in the form + // + // +=x.xxxx + // + // or + // + // -=x.xxxx + // + doAnimate: function (el, properties, options) { + options = options || {}; + var o = this.getOffset(el), + ap = _animProps(o, properties), + ldist = ap[0] - o.left, + tdist = ap[1] - o.top, + d = options.duration || 250, + step = 15, steps = d / step, + linc = (step / d) * ldist, + tinc = (step / d) * tdist, + idx = 0, + _int = setInterval(function () { + _jp.setPosition(el, { + left: o.left + (linc * (idx + 1)), + top: o.top + (tinc * (idx + 1)) + }); + if (options.step != null) { + options.step(idx, Math.ceil(steps)); + } + idx++; + if (idx >= steps) { + window.clearInterval(_int); + if (options.complete != null) { + options.complete(); + } + } + }, step); + }, + // DRAG/DROP + + + destroyDroppable: function (el, category) { + _getDragManager(this, category).destroyDroppable(el); + }, + unbindDroppable: function (el, evt, fn, category) { + _getDragManager(this, category).destroyDroppable(el, evt, fn); + }, + + droppable :function(el, options) { + el = _ju.isArray(el) || (el.length != null && !_ju.isString(el)) ? el: [ el ]; + var info; + options = options || {}; + options.allowLoopback = false; + Array.prototype.slice.call(el).forEach(function(_el) { + info = this.info(_el); + if (info.el) { + this.initDroppable(info.el, options); + } + }.bind(this)); + return this; + }, + + initDroppable: function (el, options, category) { + _getDragManager(this, category).droppable(el, options); + }, + isAlreadyDraggable: function (el) { + return el._katavorioDrag != null; + }, + isDragSupported: function (el, options) { + return true; + }, + isDropSupported: function (el, options) { + return true; + }, + isElementDraggable: function (el) { + el = _jp.getElement(el); + return el._katavorioDrag && el._katavorioDrag.isEnabled(); + }, + getDragObject: function (eventArgs) { + return eventArgs[0].drag.getDragElement(); + }, + getDragScope: function (el) { + return el._katavorioDrag && el._katavorioDrag.scopes.join(" ") || ""; + }, + getDropEvent: function (args) { + return args[0].e; + }, + getUIPosition: function (eventArgs, zoom) { + // here the position reported to us by Katavorio is relative to the element's offsetParent. For top + // level nodes that is fine, but if we have a nested draggable then its offsetParent is actually + // not going to be the jsplumb container; it's going to be some child of that element. In that case + // we want to adjust the UI position to account for the offsetParent's position relative to the Container + // origin. + var el = eventArgs[0].el; + if (el.offsetParent == null) { + return null; + } + var finalPos = eventArgs[0].finalPos || eventArgs[0].pos; + var p = { left:finalPos[0], top:finalPos[1] }; + if (el._katavorioDrag && el.offsetParent !== this.getContainer()) { + var oc = this.getOffset(el.offsetParent); + p.left += oc.left; + p.top += oc.top; + } + return p; + }, + setDragFilter: function (el, filter, _exclude) { + if (el._katavorioDrag) { + el._katavorioDrag.setFilter(filter, _exclude); + } + }, + setElementDraggable: function (el, draggable) { + el = _jp.getElement(el); + if (el._katavorioDrag) { + el._katavorioDrag.setEnabled(draggable); + } + }, + setDragScope: function (el, scope) { + if (el._katavorioDrag) { + el._katavorioDrag.k.setDragScope(el, scope); + } + }, + setDropScope:function(el, scope) { + if (el._katavorioDrop && el._katavorioDrop.length > 0) { + el._katavorioDrop[0].k.setDropScope(el, scope); + } + }, + addToPosse:function(el, spec) { + var specs = Array.prototype.slice.call(arguments, 1); + var dm = _getDragManager(this); + _jp.each(el, function(_el) { + _el = [ _jp.getElement(_el) ]; + _el.push.apply(_el, specs ); + dm.addToPosse.apply(dm, _el); + }); + }, + setPosse:function(el, spec) { + var specs = Array.prototype.slice.call(arguments, 1); + var dm = _getDragManager(this); + _jp.each(el, function(_el) { + _el = [ _jp.getElement(_el) ]; + _el.push.apply(_el, specs ); + dm.setPosse.apply(dm, _el); + }); + }, + removeFromPosse:function(el, posseId) { + var specs = Array.prototype.slice.call(arguments, 1); + var dm = _getDragManager(this); + _jp.each(el, function(_el) { + _el = [ _jp.getElement(_el) ]; + _el.push.apply(_el, specs ); + dm.removeFromPosse.apply(dm, _el); + }); + }, + removeFromAllPosses:function(el) { + var dm = _getDragManager(this); + _jp.each(el, function(_el) { dm.removeFromAllPosses(_jp.getElement(_el)); }); + }, + setPosseState:function(el, posseId, state) { + var dm = _getDragManager(this); + _jp.each(el, function(_el) { dm.setPosseState(_jp.getElement(_el), posseId, state); }); + }, + dragEvents: { + 'start': 'start', 'stop': 'stop', 'drag': 'drag', 'step': 'step', + 'over': 'over', 'out': 'out', 'drop': 'drop', 'complete': 'complete', + 'beforeStart':'beforeStart' + }, + animEvents: { + 'step': "step", 'complete': 'complete' + }, + stopDrag: function (el) { + if (el._katavorioDrag) { + el._katavorioDrag.abort(); + } + }, + addToDragSelection: function (spec) { + var el = this.getElement(spec); + if (el != null && (el._isJsPlumbGroup || el._jsPlumbGroup == null)) { + _getDragManager(this).select(spec); + } + }, + removeFromDragSelection: function (spec) { + _getDragManager(this).deselect(spec); + }, + getDragSelection:function() { + return _getDragManager(this).getSelection(); + }, + clearDragSelection: function () { + _getDragManager(this).deselectAll(); + }, + trigger: function (el, event, originalEvent, payload) { + this.getEventManager().trigger(el, event, originalEvent, payload); + }, + doReset:function() { + // look for katavorio instances and reset each one if found. + for (var key in this) { + if (key.indexOf("_katavorio_") === 0) { + this[key].reset(); + } + } + }, + getEventManager:function() { + return _getEventManager(this); + }, + on : function(el, event, callback) { + // TODO: here we would like to map the tap event if we know its + // an internal bind to a click. we have to know its internal because only + // then can we be sure that the UP event wont be consumed (tap is a synthesized + // event from a mousedown followed by a mouseup). + //event = { "click":"tap", "dblclick":"dbltap"}[event] || event; + this.getEventManager().on.apply(this, arguments); + return this; + }, + off : function(el, event, callback) { + this.getEventManager().off.apply(this, arguments); + return this; + } + + }); + + var ready = function (f) { + var _do = function () { + if (/complete|loaded|interactive/.test(document.readyState) && typeof(document.body) !== "undefined" && document.body != null) { + f(); + } + else { + setTimeout(_do, 9); + } + }; + + _do(); + }; + ready(_jp.init); + +}).call(typeof window !== 'undefined' ? window : this); diff --git a/experiment/simulation/EE5/js/layout.js b/experiment/simulation/EE5/js/layout.js new file mode 100644 index 0000000..d52e4ff --- /dev/null +++ b/experiment/simulation/EE5/js/layout.js @@ -0,0 +1,30 @@ +let listItems = document.querySelectorAll(".steps ol li"); +let activeIdx = 0; +// handle list items click +// for (const item of listItems) { +// item.addEventListener("click", (event) => { +// event. +// }); +// } +function nextDrawerItem() { + if (activeIdx < listItems.length) { + listItems[activeIdx].classList.add("active"); + if (activeIdx > 0) { + listItems[activeIdx - 1].classList.add("completed"); + listItems[activeIdx - 1].classList.remove("active"); + } + } + activeIdx = activeIdx < listItems.length ? activeIdx + 1 : activeIdx; +} + +function backDrawerItem() { + if (activeIdx <= 1) return; + activeIdx--; + listItems[activeIdx].classList.remove("active"); + listItems[activeIdx].classList.add("completed"); + if (activeIdx > 0) { + listItems[activeIdx - 1].classList.add("active"); + } +} + + diff --git a/experiment/simulation/EE5/js/main.js b/experiment/simulation/EE5/js/main.js new file mode 100644 index 0000000..def5096 --- /dev/null +++ b/experiment/simulation/EE5/js/main.js @@ -0,0 +1,2177 @@ +// * Audio Mute +let isMute = false; + +// * Current Date +let cd = new Date(); +var currentDateGlobal = `${cd.getDate()} - ${ + cd.getMonth() + 1 +} - ${cd.getFullYear()}`; +console.log(currentDateGlobal); + +// * Quiz object +const Quiz = { + quizData: [ + { + question: + "Which of the following machine is used to measure compressive strength?", + a: "Universal testing machine", + b: "Impact testing machine", + c: "Fatigue testing machine", + d: "Erichsen machine", + correct: "a", + }, + { + question: + "Which one of the following, is not a unit of ultimate tensile strength?", + a: "MPa", + b: "N/m2", + c: "Kg/m3", + d: "PSI", + correct: "c", + }, + { + question: "The extensometer can be attached anywhere to the specimen _", + a: "Yes", + b: "No", + c: "No but sometime yes", + d: "None of the above", + correct: "b", + }, + + { + question: + "What is the smallest measurement that is possible by vernier calliper?", + a: "Least count", + b: "Actual reading", + c: "Main scale division", + d: "Vernier scale division", + correct: "a", + }, + { + question: "What is the least count of a standard metric vernier caliper", + a: "0.002mm", + b: "0.02mm", + c: "0.1mm", + d: "0.2mm", + correct: "b", + }, + ], + quiz_contianer: document.querySelector(".quiz-container"), + quiz: document.getElementById("quiz"), + answerEls: document.querySelectorAll(".answer"), + questionEl: document.getElementById("question"), + a_text: document.getElementById("a_text"), + b_text: document.getElementById("b_text"), + c_text: document.getElementById("c_text"), + d_text: document.getElementById("d_text"), + ansDom: document.getElementById("quizAns"), + opsDom: [this.a_text, this.b_text, this.c_text, this.d_text], + loadQuizCallCount: 0, + currentQuiz: 0, + score: 0, + loadQuiz() { + if (this.currentQuiz >= this.quizData.length) { + return; + } + document.querySelector(".transparent-box").style.display = "block"; + this.loadQuizCallCount++; + window.speechSynthesis.cancel(); + setCC("Choose the correct answer."); + this.deselectAnswers(); + this.quiz_contianer.style.display = "block"; + const currentQuizData = this.quizData[this.currentQuiz]; + + this.questionEl.innerText = currentQuizData.question; + this.a_text.innerText = currentQuizData.a; + this.b_text.innerText = currentQuizData.b; + this.c_text.innerText = currentQuizData.c; + this.d_text.innerText = currentQuizData.d; + }, + + getSelected() { + let answer = undefined; + this.answerEls.forEach((answerEl) => { + if (answerEl.checked) { + answer = answerEl.id; + } + }); + this.answerEls.forEach((answerEl) => { + if (answer != undefined) { + answerEl.disabled = true; + } + }); + + return answer; + }, + + deselectAnswers() { + this.answerEls.forEach((answerEl) => { + answerEl.checked = false; + answerEl.disabled = false; + }); + }, + close() { + this.quiz_contianer.style.display = "none"; + for (let od of this.opsDom) { + od.style.color = ""; + } + document.querySelector(".transparent-box").style.display = "none"; + + // this.ansDom.style.display = "none"; + }, + init() { + let okBtn = document.getElementById("quizSubmit"); + okBtn.textContent = "Submit"; + // onclick for quiz close btn + // document.querySelector("#closeQuiz").onclick = () => { + // this.close(); + // }; + // onclick for quiz submit btn + document.getElementById("quizSubmit").onclick = () => { + // for disable multiple submit + if (this.loadQuizCallCount - 1 !== this.currentQuiz) { + return; + } + // subtitle for quiz + const answer = this.getSelected(); + if (answer) { + // this.ansDom.style.display = "block"; + // this.ansDom.innerHTML = "✔ "+ this.quizData[this.currentQuiz][this.quizData[this.currentQuiz].correct]; + + // updating options with the right and wrong emoji + let ops = "abcd"; + for (let o in ops) { + if (ops[o] == this.quizData[this.currentQuiz].correct) { + this.opsDom[o].innerHTML += " ✔️"; + this.opsDom[o].style.color = "green"; + } else { + this.opsDom[o].innerHTML += " ❌"; + this.opsDom[o].style.color = "red"; + } + } + + if (answer === this.quizData[this.currentQuiz].correct) { + this.score++; + } + this.currentQuiz++; + + //for ok button + + okBtn.textContent = "Ok"; + okBtn.onclick = function () { + Quiz.close(); + Quiz.init(); + }; + + // to stop the next question + // if (this.currentQuiz < this.quizData.length) { + // this.loadQuiz(); + // } else { + // this.quiz.innerHTML = `

    You answered correctly at ${this.score}/${this.quizData.length} questions.

    + // + // `; + // todo show above string to certificate + // } + } + // this.close(); + }; + }, +}; + +// * ChartJs +const ChartGraph = { + ctx: document.getElementById("myChart"), + ctxBox: document.querySelector(".chart"), + graphs: [ + (Graph1 = { + labels: [0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07], + datapoints: [0, 100, 185, 260, 360, 435, 452], + }), + (Graph2 = { + labels: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6], + datapoints: [0, 470, 488, 512, 515, 570], + }), + (Graph3 = { + labels: [0, 0.02, 0.04, 0.06, 0.08, 1, 1.2], + datapoints: [0, 480, 520, 560, 602, 535], + }), + (Graph4 = { + labels: [0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07], + datapoints: [0, 100, 185, 260, 360, 435, 452], + }), + ], + currGr: null, + delete: function () { + this.ctxBox.style.display = "none"; + this.currGr.destroy(); + }, + view: function (num, left, top, height = null, width = null) { + if (height != null) this.ctxBox.style.height = height + "px!important"; + if (width != null) this.ctxBox.style.width = width + "px!important"; + this.ctxBox.style.left = left + "px"; + this.ctxBox.style.top = top + "px"; + this.ctxBox.style.display = "block"; + this.currGr = new Chart(this.ctx, { + type: "line", + data: { + labels: this.graphs[num].labels, + datasets: [ + { + label: "Engineering Stress-Strain Curve", + data: this.graphs[num].datapoints, + borderWidth: 1, + tension: 0.4, + }, + // { + // label: "_", + // data: [0, 470], + // borderWidth: 1, + // }, + ], + }, + options: { + borderWidth: 3, + scales: { + y: { + beginAtZero: true, + }, + }, + }, + }); + return this; + }, +}; + +Quiz.init(); + +// for restriction on next button ; +let isPerformNext = false; + +// animation is running +let isRunning = false; +// to set isProcessRunning and also sync the progressbar + drawer +// ! and toggle the next btn active / deactive +function toggleNextBtn() { + let nextBtn = document.querySelector(".btn-next"); + nextBtn.classList.toggle("btn-deactive"); +} +const cancelSpeech = ()=>{ + window.speechSynthesis.cancel() + ccQueue = [] +} + +const setIsProcessRunning = (value) => { + // calling toggle the next + if(value != isRunning){ + toggleNextBtn() + } + + isRunning = value; + if(value){ + cancelSpeech() + Dom.hideAll() + } +}; + +const show = (ele, disp = "block", opa = 1) => { + ele.style.display = disp; + ele.style.opacity = opa; +}; +const opacity = (ele, val = 1) => { + ele.style.opacity = val; +}; +const hide = (ele, disp = "none") => { + ele.style.display = disp; +}; +const hideAll = (elesName, disp = "none") => { + let eles = getAll(elesName); + for (let ele of eles) { + hide(ele); + } +}; +const showAll = (elesName, disp = "none", opa = 1) => { + let eles = getAll(elesName); + for (let ele of eles) { + show(ele, "block", opa); + } +}; + +const set = (ele, l = null, t = null) => { + if (l !== null) { + ele.style.left = l + "px"; + } + if (t !== null) { + ele.style.top = t + "px"; + } + show(ele); +}; + +let student_name = ""; +// let currentDateGlobal = ""; + +// ! text to audio + +const textToSpeach = (text,speak=true) => { + // for filter + text = text.replaceAll(""," ").replaceAll(""," ") + let utterance = new SpeechSynthesisUtterance(); + utterance.text = text; + utterance.voice = window.speechSynthesis.getVoices()[0]; + if(isMute || !speak){ + utterance.volume = 0 + utterance.rate = 10 + } + window.speechSynthesis.speak(utterance); + return utterance; +}; + +//queue for +let ccQueue = []; +// for subtitile +let ccObj = null; +function setCC(text = null, speed = 25, speak = true) { + if (ccObj != null) { + ccObj.destroy(); + } + + let ccDom = get(".steps-subtitle .subtitle"); + ccQueue.push(text); + ccObj = new Typed(ccDom, { + strings: ["", ...ccQueue], + typeSpeed: speed, + onStringTyped(){ + ccQueue.shift() + // if(ccQueue.length != 0){ + // setCC(ccQueue.shift())` + // } + } + }); + let utterance = textToSpeach(text,speak) + return utterance +} + +// ! class Dom{} is send to seperate file +// * for cursor pointer +function cursorPointer(ele) { + ele.style.cursor = "pointer"; +} + +// Img.setBlinkArrow(true,790,444).play(); + +const Scenes = { + items: { + anime_main_dom: new Dom(".anime-main"), + arrowRound: new Dom("arrowRound"), + blinkArrow: new Dom("blinkArrow"), + larrow: new Dom("laerrow"), + larrow2: new Dom("laerrow2"), + logo: new Dom("logo"), + man: new Dom("man"), + arrow: new Dom("measurearrow"), + arrow2: new Dom("measurearrow2"), + redsize: new Dom("redsize"), + speech_off_btn: new Dom("speech_off_btn"), + speech_on_btn: new Dom("speech_on_btn"), + talk_cloud: new Dom("talk_cloud"), + projectIntro: new Dom(".project-intro"), + header: new Dom(".anime-header"), + stepHeading: new Dom(".step-heading"), + stepTitle: new Dom(".step-title"), + stepDescription: new Dom(".step-description"), + tableCalc: new Dom(".measurements"), + tempText: new Dom(".temp-text"), + tempText2: new Dom(".temp-text2"), + tempInputBox: new Dom(".temp-input"), + tempInputBoxInput: new Dom(".temp-input #ipnum"), + tempInputT1: new Dom(".temp-input .text1"), + tempInputT2: new Dom(".temp-input .text2"), + tempInputError: new Dom(".temp-input .error"), + tempInputBtn: new Dom(".temp-input .submit-btn"), + utmBtn: new Dom(".utm-button"), + inputWindow: new Dom(".user-input"), + resultTable: new Dom(".result-table"), + certificate: new Dom(".certificate"), + welcomeBox: new Dom(".welcome-box"), + videoBox: new Dom(".video-box"), + videoBoxSrc: new Dom(".video-box .video"), + videoBoxTitle: new Dom(".video-box .title"), + videoBoxRestartBtn: new Dom(".video-box .controls .restart"), + imageBox: new Dom(".image-box"), + imageBoxSrc: new Dom(".image-box .image"), + imageBoxTitle: new Dom(".image-box .title"), + tempTitle1: new Dom(".temp-title1"), + tempTitle2: new Dom(".temp-title2"), + tempTitle3: new Dom(".temp-title3"), + tempTitle4: new Dom(".temp-title4"), + tempTitle5: new Dom(".temp-title5"), + tempTitle6: new Dom(".temp-title6"), + tempTitle7: new Dom(".temp-title7"), + tempTitle8: new Dom(".temp-title8"), + tempTitle9: new Dom(".temp-title9"), + tempTitle10: new Dom(".temp-title10"), + tempTitle11: new Dom(".temp-title11"), + tempTitle12: new Dom(".temp-title12"), + tempTitle13: new Dom(".temp-title13"), + tempTitle14: new Dom(".temp-title14"), + tempTitle15: new Dom(".temp-title15"), + tempTitle16: new Dom(".temp-title16"), + tempTitle17: new Dom(".temp-title17"), + tempTitle18: new Dom(".temp-title18"), + tempTitle19: new Dom(".temp-title19"), + tempTitle20: new Dom(".temp-title20"), + tempTitle21: new Dom(".temp-title21"), + tempTitle22: new Dom(".temp-title22"), + tempTitle23: new Dom(".temp-title23"), + tempTitle24: new Dom(".temp-title24"), + tempTitle25: new Dom(".temp-title25"), + tempTitle26: new Dom(".temp-title26"), + tempTitle27: new Dom(".temp-title27"), + tempTitle28: new Dom(".temp-title28"), + tempTitle29: new Dom(".temp-title29"), + tempTitle30: new Dom(".temp-title30"), + tempTitle31: new Dom(".temp-title31"), + tempTitle32: new Dom(".temp-title32"), + tempTitle33: new Dom(".temp-title33"), + tempTitle34: new Dom(".temp-title34"), + tempTitle35: new Dom(".temp-title35"), + tempTitle36: new Dom(".temp-title36"), + tempTitle37: new Dom(".temp-title37"), + tempTitle38: new Dom(".temp-title38"), + tempTitle39: new Dom(".temp-title39"), + tempTitle40: new Dom(".temp-title40"), + tempTitle41: new Dom(".temp-title41"), + tempTitle42: new Dom(".temp-title42"), + tempTitle43: new Dom(".temp-title43"), + tempTitle44: new Dom(".temp-title44"), + tempTitle45: new Dom(".temp-title45"), + tempTitle46: new Dom(".temp-title46"), + tempTitle47: new Dom(".temp-title47"), + tempTitle48: new Dom(".temp-title48"), + tempTitle49: new Dom(".temp-title49"), + tempTitle50: new Dom(".temp-title50"), + tempTitle51: new Dom(".temp-title51"), + tempTitle52: new Dom(".temp-title52"), + tempTitle53: new Dom(".temp-title53"), + tempTitle54: new Dom(".temp-title54"), + tempTitle55: new Dom(".temp-title55"), + tempTitle56: new Dom(".temp-title56"), + tempTitle57: new Dom(".temp-title57"), + tempTitle58: new Dom(".temp-title58"), + tempTitle59: new Dom(".temp-title59"), + tempTitle60: new Dom(".temp-title60"), + + concept_development: new Dom(".concept_development"), + + contentAdderBox: new Dom(".content-adder-box"), + btn_save: new Dom(".btn-save"), + btn_next: new Dom(".btn-next"), + graph1: new Dom(".graph1"), + graph2: new Dom(".graph2"), + graph3: new Dom(".graph3"), + graph4: new Dom(".graph4"), + graph5: new Dom(".graph5"), + graph_box_1: new Dom(".graph_box1"), + graph_box_2: new Dom(".graph_box2"), + graph_box_3: new Dom(".graph_box3"), + graph_box_4: new Dom(".graph_box4"), + graph_box_5: new Dom(".graph_box5"), + xLabel: new Dom(".xLabel"), + yLabel: new Dom(".yLabel"), + + part3_table_one: new Dom(".part3_table_one"), + part3_table_two: new Dom(".part3_table_two"), + part3_table_three: new Dom(".part3_table_three"), + part3_table_four: new Dom(".part3_table_four"), + part3_table_four_2: new Dom(".part3_table_four_2"), + + slider_vIn: new Dom(".slider_vIn"), + slider_vGs: new Dom(".slider_vGs"), + slider_R: new Dom(".slider_R"), + + btn_delete: new Dom(".btn-delete"), + btn_reset: new Dom(".btn-reset"), + btn_record: new Dom(".btn-record"), + btn_check_connections: new Dom(".btn-check-connections"), + btn_circuit_diagram: new Dom(".btn-circuit-diagram"), + + btn_transparent: new Dom(".btn-transparent"), + + formulas_component_stress: new Dom("formulas_component_stress"), + formulas_efficiency: new Dom("formulas_efficiency"), + formulas_ideal: new Dom("formulas_ideal"), + formulas_nomenclautre: new Dom("formulas_nomenclautre"), + formulas_non_ideal: new Dom("formulas_non_ideal"), + formulas_procedure: new Dom("formulas_procedure"), + formulas_universal: new Dom("formulas_universal"), + part_3_option_select: new Dom("part_3_option_select"), + part_1_text_for_crrct: new Dom("part_1_text_for_crrct"), + part_1_text_for_wrong: new Dom("part_1_text_for_wrong"), + + + // !EE4 images added + + + + //! EE4 tables added + part_1_table_1: new Dom(".part_1_table_1"), + part_1_table_2: new Dom(".part_1_table_2"), + + part_1_table_1_col_1: new Dom(".part_1_table_1_col_1"), + part_1_table_1_col_2: new Dom(".part_1_table_1_col_2"), + part_1_table_1_col_3: new Dom(".part_1_table_1_col_3"), + part_1_table_1_col_4: new Dom(".part_1_table_1_col_4"), + part_1_table_1_col_5: new Dom(".part_1_table_1_col_5"), + part_1_table_1_col_6: new Dom(".part_1_table_1_col_6"), + part_1_table_1_col_7: new Dom(".part_1_table_1_col_7"), + part_1_table_1_col_8: new Dom(".part_1_table_1_col_8"), + + part_1_table_2_col_1: new Dom(".part_1_table_2_col_1"), + part_1_table_2_col_2: new Dom(".part_1_table_2_col_2"), + part_1_table_2_col_3: new Dom(".part_1_table_2_col_3"), + part_1_table_2_col_4: new Dom(".part_1_table_2_col_4"), + part_1_table_2_col_5: new Dom(".part_1_table_2_col_5"), + part_1_table_2_col_7: new Dom(".part_1_table_2_col_7"), + part_1_table_2_col_8: new Dom(".part_1_table_2_col_8"), + part_1_table_2_col_9: new Dom(".part_1_table_2_col_9"), + part_1_table_2_col_10: new Dom(".part_1_table_2_col_10"), + // ! new items dom + + //part 2 cable added + + + + //* connection box table + part_2_connections_box: new Dom(".part_2_connections_box"), + part_1_1_connections_box: new Dom(".part_1_1_connections_box"), + part_1_2_connections_box: new Dom(".part_1_2_connections_box"), + + //new images added for part1 + + + // part2 calculation + + + + //* 29 feb new imgs + + + //* part3 images added + + + + // * useful images from previous Experiment + + btn_connections: new Dom("btn_connections"), + btn_connectons_completed: new Dom("btn_connectons_completed"), + btn_instructions: new Dom("btn_instructions"), + btn_nomenclature: new Dom("btn_nomenclature"), + // btn_plot: new Dom("btn_plot"), + btn_procedure: new Dom("btn_procedure"), + btn_reset: new Dom("btn_reset"), + btn_start_experiment: new Dom("btn_start_experiment"), + + part_1_slide_3_compo_1_off: new Dom("part_1_slide_3_compo_1_off"), + part_1_slide_3_compo_1_on: new Dom("part_1_slide_3_compo_1_on"), + part_1_slide_3_compo_1_text: new Dom("part_1_slide_3_compo_1_text"), + part_1_slide_3_compo_2_off: new Dom("part_1_slide_3_compo_2_off"), + part_1_slide_3_compo_2_on: new Dom("part_1_slide_3_compo_2_on"), + part_1_slide_3_compo_2_text: new Dom("part_1_slide_3_compo_2_text"), + part_1_incomplete_connection: new Dom("part_1_incomplete_connection"), + part_2_conncection_supply_1_red_button : new Dom("part_2_conncection_supply_1_red_button"), + part_2_conncection_supply_2_red_button : new Dom("part_2_conncection_supply_2_red_button"), + niddle_vGs: new Dom("niddle_vGs"), + niddle_vIn: new Dom("niddle_vIn"), + + + // * for PROCEDURE and instruction NOMENCLATURE + + + + //*EE5 images added + + arrow_black : new Dom("arrow_black"), + btn_plot : new Dom("btn_plot"), + btn_zoomed_in_plot : new Dom("btn_zoomed_in_plot"), + part_1_cable_a2 : new Dom("part_1_cable_a2"), + part_1_cable_ac2 : new Dom("part_1_cable_ac2"), + part_1_cable_k : new Dom("part_1_cable_k"), + part_1_cable_k_ac1 : new Dom("part_1_cable_k_ac1"), + part_1_cable_p : new Dom("part_1_cable_p"), + part_1_cable_p1 : new Dom("part_1_cable_p1"), + part_1_cable_r2 : new Dom("part_1_cable_r2"), + part_1_cable_rg2 : new Dom("part_1_cable_rg2"), + part_1_cable_v1 : new Dom("part_1_cable_v1"), + part_1_cable_v2 : new Dom("part_1_cable_v2"), + part_1_calculations : new Dom("part_1_calculations"), + part_1_components : new Dom("part_1_components"), + part_1_instruction_box : new Dom("part_1_instruction_box"), + part_1_nomenclature_box : new Dom("part_1_nomenclature_box"), + part_1_procedure_box : new Dom("part_1_procedure_box"), + part_2_cable_a2 : new Dom("part_2_cable_a2"), + part_2_cable_ac1 : new Dom("part_2_cable_ac1"), + part_2_cable_cp : new Dom("part_2_cable_cp"), + part_2_cable_dvp : new Dom("part_2_cable_dvp"), + part_2_cable_k : new Dom("part_2_cable_k"), + part_2_cable_k_n : new Dom("part_2_cable_k_n"), + part_2_cable_p : new Dom("part_2_cable_p"), + part_2_cable_p1 : new Dom("part_2_cable_p1"), + part_2_cable_r2 : new Dom("part_2_cable_r2"), + part_2_cable_rg2 : new Dom("part_2_cable_rg2"), + part_2_cable_v1 : new Dom("part_2_cable_v1"), + part_2_cable_v2 : new Dom("part_2_cable_v2"), + part_2_calculation : new Dom("part_2_calculation"), + part_2_components : new Dom("part_2_components"), + part_2_instruction_box : new Dom("part_2_instruction_box"), + part_2_procedure_box : new Dom("part_2_procedure_box"), + select_option_1 : new Dom("select_option_1"), + select_option_2 : new Dom("select_option_2"), + select_option_full : new Dom("select_option_full"), + +// + + new_select_option_1 : new Dom("new_select_option_1"), + new_select_option_2 : new Dom("new_select_option_2"), + new_select_option_3 : new Dom("new_select_option_3"), + new_select_option_full : new Dom("new_select_option_full"), + + // graph images added here + graph_0_initial: new Dom("graph_0_initial"), + graph_1_2500: new Dom("graph_1_2500"), + graph_2_750: new Dom("graph_2_750"), + graph_3_150: new Dom("graph_3_150"), + graph_4_50: new Dom("graph_4_50"), + + //! Experimental section images added + + btn_1: new Dom("btn_1"), + btn_2: new Dom("btn_2"), + btn_click: new Dom("btn_click"), + circle: new Dom("circle"), + frame_1: new Dom("frame_1"), + frame_2: new Dom("frame_2"), + frame_3: new Dom("frame_3"), + menu_page: new Dom("menu_page"), + val_vgs: new Dom("val_vgs"), + val_vin: new Dom("val_vin"), + + + domQs1: new Dom("domQs1"), + domQs2: new Dom("domQs2"), + domQs3: new Dom("domQs3"), + domQs4: new Dom("domQs4"), + domQs5: new Dom("domQs5"), + domQs6: new Dom("domQs6"), + + chart: [ + (graph1 = null), + (graph2 = null), + (graph3 = null), + (graph4 = null), + (graph5 = null), + (graph6 = null), + (graph7 = null), + ], + + chart: { + label1: { + x: "Label 2", + y: "Label 1", + }, + label2: { + x: "Label 2", + y: "Label 1", + }, + label3: { + x: "Label 2", + y: "Label 1", + }, + label4: { + x: "Label 2", + y: "Label 1", + }, + label5: { + x: "Label 2", + y: "Label 1", + }, + label6: { + x: "Label 2", + y: "Label 1", + }, + label7: { + x: "Label 2", + y: "Label 1", + }, + }, + }, + // ! To Plot graph + plotGraph( + ctx, + graphIdx, + data, + dataLabel, + xLabel = null, + yLabel = null, + beginAtZero = false, + startEmpty = false, + ) { + // for label + Scenes.items.yLabel.set(504, 263).setContent(yLabel).styles({ + backgroundColor: "transperant", + textAlign: "center", + color: "black", + width: "170px", + rotate: "-90deg", + zIndex: 10, + }); + Scenes.items.xLabel.set(664, 375).setContent(xLabel).styles({ + backgroundColor: "transperant", + color: "black", + width: "fit-content", + zIndex: 10, + }); + + // ! Destroy old graph + let graphRef = Scenes.items.chart[graphIdx]; + if (graphRef != null) { + graphRef.destroy(); + } + + // temprory dataset + let datasets = [ + { + label: dataLabel, + fill: false, + borderColor: "red", + backgroundColor: "red", + data: data, + display: false, + }, + ] + + if(startEmpty){ + datasets=[] + } + + graphRef = new Chart(ctx, { + type: "scatter", + plugins: [ + { + // afterDraw: chart => { + // var ctx = chart.chart.ctx; + // ctx.save(); + // ctx.textAlign = 'center'; + // ctx.font = '18px Arial'; + // ctx.fillStyle = 'black'; + // ctx.fillText('Output Power (P )', chart.chart.width / 2, chart.chart.height - 24); + // ctx.textAlign = 'left'; + // ctx.font = '10px Arial'; + // ctx.fillText('0', chart.chart.width - 119, chart.chart.height - 12); + // ctx.restore(); + // }, + }, + ], + data: { + datasets: datasets + }, + options: { + responsive: true, + maintainAspectRatio: false, + scales: { + yAxes: [ + { + scaleLabel: { + display: false, + labelString: yLabel, + fontColor: "black", + fontSize: 17, + }, + ticks: { + beginAtZero: beginAtZero, + fontColor: "black", + fontSize: 14, + }, + }, + ], + xAxes: [ + { + scaleLabel: { + display: false, + labelString: xLabel, + fontColor: "black", + fontSize: 17, + }, + ticks: { + beginAtZero: beginAtZero, + fontColor: "black", + fontSize: 14, + }, + }, + ], + }, + }, + }); + + Scenes.items.chart[graphIdx] = graphRef; + return graphRef + }, + + // for adding new datasets to graph + graphFeatures: { + addDataset(chart, label, bgColor, data) { + chart.data.datasets.push({ + label: label, + fill: false, + borderColor: bgColor, + backgroundColor: bgColor, + data: data, + }); + chart.update(); + }, + addData(chart, index, data) { + console.log(data); + if (data.length > 0) { + chart.data.datasets[index].data = data; + } else { + chart.data.datasets[index].data.push(data); + } + chart.update(); + }, + getSizeOfDatasets(chart){ + return chart.data.datasets.length + } + }, + deleteAll() { + for (i in this.img) { + Scenes.img[i].hide(); + } + for (i in this.items) { + if (i == "header" || i == "stepTitle" || i == "stepDescription") { + continue; + } + hide(Scenes.items[i]); + } + }, + // for content adder btn box + contentAdderAddBtn(text) { + Scenes.items.contentAdderBox.item.innerHTML += `
  • ${text}
  • `; + }, + currentStep: 0, + subCurrentStep: 0, + resetSubStep() { + this.subCurrentStep = 0; + }, + incCurrentSubStep() { + this.subCurrentStep++; + }, + setStepHeading(step, description,hide) { + Scenes.items.stepTitle.setContent(step); + Scenes.items.stepDescription.setContent(description); + Scenes.items.stepHeading.show("flex").push(); + if(hide){ + let st={ + visibility: "hidden" + } + Scenes.items.stepTitle.styles(st) + Scenes.items.stepDescription.styles(st) + } + }, + //* for hover on instuction , procedure and nomenclature + + // not done yet + showPopup(step){ + + let instructionBtn = Scenes.items.btn_instructions.zIndex(1000) + let procedureBtn = Scenes.items.btn_procedure.zIndex(1000) + let nomenclatureBtn = Scenes.items.btn_nomenclature.zIndex(1000) + let instructionImg, procedureImg, nomenclatureImg; + + let btn = [ + instructionBtn, + procedureBtn, + nomenclatureBtn, + ] + + switch(step){ + + //scr using meters + case "4_1" : + instructionImg = Scenes.items.part_1_instruction_box.set(70,100, 404, 800).hide(); + procedureImg = Scenes.items.part_1_procedure_box.set(-60, 140,504, 900 ).hide(); + nomenclatureImg = Scenes.items.part_1_nomenclature_box.set(-80, 100, 504, 950).hide(); + break; + + //scr using using oscilloscope + case "4_2" : instructionImg = Scenes.items.part_2_instruction_box.set(70,-60, 404, 800).hide(); + procedureImg = Scenes.items.part_2_procedure_box.set(-180, 90,504, 1000 ).hide(); + nomenclatureImg = Scenes.items.part_1_nomenclature_box .set(-80, 20, 504, 1050).hide(); + break; + + // case "2" : instructionImg = Scenes.items.part_2_instruction; + // procedureImg = Scenes.items.part_2_procedure.set(null,-80).hide(); + // nomenclatureImg = Scenes.items.part_2_nomenclature.set(null,-80).hide(); + + // break; + + // case "3" : + // procedureImg = Scenes.items.part_3_procedure; + // nomenclatureImg = Scenes.items.part_3_nomenclature; + + // break; + } + + let showInstructionImg = function(){ + instructionImg.show().zIndex(40) + } + + let showProcedureImg = function(){ + procedureImg.show().zIndex(40) + + } + + let showNomenclatureImg = function(){ + nomenclatureImg.show().zIndex(40) + + } + + let hideInstructionImg = function(){ + instructionImg.hide() + } + + let hideProcedureImg = function(){ + procedureImg.hide() + + } + + let hideNomenclatureImg = function(){ + nomenclatureImg.hide() + + } + + + btn[0].item.onmouseover = showInstructionImg + btn[0].item.onmouseout = hideInstructionImg + + btn[1].item.onmouseover = showProcedureImg + btn[1].item.onmouseout = hideProcedureImg + + btn[2].item.onmouseover = showNomenclatureImg + btn[2].item.onmouseout = hideNomenclatureImg + + + + + + }, + // for typing hello text + intru: null, + intruVoice: null, + optionsDone: [0, 0, 0, 0], + steps: [ + (intro = () => { + // remove all dom element for back and setProcessRunning + setIsProcessRunning(true); + + // starting elements + + // subtitle + setTimeout(() => { + setCC("Enter your name and click on 'Start' to start the experiment"); + }, 500); + Scenes.items.header.set(0, 120).show("flex"); + let inputWindow = get(".user-input"); + show(inputWindow, "flex"); + let man = new Dom("man").set(650, 80).push(); + + let submitBtn = get("#nameSubmitBtn"); + submitBtn.onclick = () => { + student_name = get("#stuName").value; + let error = get(".user-input .error"); + // todo remove comment + if (student_name.trim() == "") { + show(error); + return; + } + // take only first space + let fName = student_name.slice(0, student_name.indexOf(" ")); + hide(error); + let tl = anime.timeline({ + easing: "easeOutExpo", + duration: 1000, + }); + tl.add({ + targets: ".anime-header", + top: 0, + }) + .add({ + targets: ".user-input", + opacity: 0, + }) + .add({ + targets: man.item, + translateX: -280, + }) + .add({ + targets: Scenes.items.talk_cloud.item, + begin() { + // Scenes.items.tempText.innerHTML = `👋 Hey!
    ${fName}`; + Scenes.items.tempText.item.style.fontWeight = "bold"; + // show(Scenes.items.tempText); + intru = new Typed(Scenes.items.tempText.item, { + strings: ["", `Hey!👋
    ${fName}`], + typeSpeed: 25, + }); + Scenes.items.tempText.set(482, 1); + textToSpeach(`Hey! ${fName}`); + textToSpeach( + "Welcome to Foundation Wall in Foamwork Experiment of Foamwork Technology in Civil Engineering Virtual Lab developed by Prof. K. N. Jha, Department of Civil Engineering, IIT Delhi." + ); + Scenes.items.talk_cloud.set(450, -40, 180).push(); + setCC(""); + }, + endDelay: 2000, + opacity: [0, 1], + }) + .add({ + begin() { + // to hide previous step images + intru.destroy(); + Dom.hideAll(); + Scenes.items.welcomeBox.show("flex"); + }, + }) + .add({ + duration: 12000, + complete() { + setCC("Click 'Next' to go to next step"); + Dom.setBlinkArrow(true, 790, 444).play(); + setIsProcessRunning(false); + }, + }); + }; + return true; + }), + (objective = function () { + setIsProcessRunning(true); + Dom.hideAll(); + + // require + let btn_transparent = Scenes.items.btn_transparent.zIndex(10000).set().item; + + Scenes.items.concept_development.set().styles({ + zIndex: "5000", + scale: "1 0.9", + top: "-140px", + position: "absolute", + }) + + // ! Slide ended enable the button next button + function checkIsSlideEnded(){ + let isSlideEnded = localStorage.getItem("isSlideEnded") + if(isSlideEnded=="true"){ + btn_transparent.disabled = false + setIsProcessRunning(false) + btn_transparent.classList.remove("btn-disabled") + // setCC("Click next to goto next slide.") + Dom.setBlinkArrowRed(true, 866, 420,30,null,-90).play(); + btn_transparent.onclick = ()=>{ + Scenes.next() + localStorage.setItem("isSlideEnded",false) + window.clearInterval(interval) + } + } + } + var interval = window.setInterval(checkIsSlideEnded, 1000) + + return true; + }), + //! EE5 step 1 + + //EE5 step1 + (step1 = function () { + setIsProcessRunning(true) + Scenes.items.btn_next.show() + + // todo all previous elements hide + Dom.hideAll(); + Scenes.items.contentAdderBox.item.innerHTML = ""; + + Scenes.setStepHeading("Step-1", "To Plot Different Characteristics."); + let StepDone = JSON.parse(localStorage.getItem("StepDone")) + if(StepDone.IGBT && StepDone.SCR && StepDone.MOSFET){ + setCC("Simultion Done ✅") + } + else{ + setCC("Click on the 'ICON' to plot the performance characteristics.") + } + + // * remove all previous restrictions + + //! * Required Elements + + Scenes.items.new_select_option_full.set(30,0, 404, 900).zIndex(1) + Scenes.items.new_select_option_1.set(212,28,108,653).zIndex(2) + Scenes.items.new_select_option_2.set(246,150,106,684).zIndex(2) + Scenes.items.new_select_option_3.set(221,270,106,677).zIndex(2) + + + // ! onclicks for all options + let options = [ + Scenes.items.new_select_option_1, + Scenes.items.new_select_option_2, + Scenes.items.new_select_option_3, + ]; + + // ! Destroy Graphs + function destroyGraphs() { + for (let i = 0; i < 7; i++) { + if (Scenes.items.chart[i] != null) { + Scenes.items.chart[i].destroy(); + } + } + } + // destroyGraphs() + + Scenes.forMathematicalExpressionBtn = 0; + + const opOne = () => { + Scenes.optionsDone[0] = 1; + Scenes.forMathematicalExpressionBtn = 1; + console.log("opone") + Scenes.currentStep = 3 + Scenes.next() + }; + const opTwo = () => { + Scenes.mergeProcessHelper("IGBT",false) + console.log("two") + }; + const opThree = () => { + Scenes.mergeProcessHelper("MOSFET",false) + console.log("three") + }; + + options[0].item.onclick = opOne; + options[1].item.onclick = opTwo; + options[2].item.onclick = opThree; + + + + // ! if all options done then exit + let exit = true; + for (let i of Scenes.optionsDone) { + if (i == 0) { + exit = false; + break; + } + } + + if (exit) { + // after complete + // Dom.setBlinkArrow(true, 790, 408).play(); + setCC("Simulation Done"); + } + setIsProcessRunning(false) + + return true; + }), + + //*scr option step + (step2 = function () { + setIsProcessRunning(false); + Scenes.items.btn_next.show(); + + // todo all previous elements hide + Dom.hideAll(); + Scenes.items.contentAdderBox.item.innerHTML = ""; + + Scenes.setStepHeading("Step-1", "To Plot Different Characteristics."); + setCC("Click on the 'ICON' to plot the performance characteristics.") + + // * remove all previous restrictions + + //! * Required Elements + + Scenes.items.select_option_full.set(30,50, 250, 880).zIndex(1) + Scenes.items.select_option_1.set(605,60, 110, 300).zIndex(2) + Scenes.items.select_option_2.set(605,180, 110, 300).zIndex(2) + + + // ! onclicks for all options + let options = [ + Scenes.items.select_option_1, + Scenes.items.select_option_2, + ]; + + // ! Destroy Graphs + function destroyGraphs() { + for (let i = 0; i < 7; i++) { + if (Scenes.items.chart[i] != null) { + Scenes.items.chart[i].destroy(); + } + } + } + // destroyGraphs() + + Scenes.forMathematicalExpressionBtn = 0; + + const opOne = () => { + Scenes.optionsDone[1] = 1; + Scenes.forMathematicalExpressionBtn = 1; + Scenes.currentStep = 4 + Scenes.next() + }; + const opTwo = () => { + Scenes.optionsDone[2] = 1; + Scenes.forMathematicalExpressionBtn = 2; + Scenes.currentStep = 5 + Scenes.next() + }; + + options[0].item.onclick = opOne; + options[1].item.onclick = opTwo; + + + // ! if all options done then exit + let exit = true; + for (let i =1;i<3;i++) { + if (Scenes.optionsDone[i] == 0) { + exit = false; + break; + } + } + + if(Scenes.optionsDone[1] == 1){ + backProgressBar() + backDrawerItem() + } + + if (exit) { + // after complete + // Dom.setBlinkArrow(true, 790, 408).play(); + setCC("Simulation Done"); + // setIsProcessRunning(false); + } + + return true; + }), + + //*scr part_1 + (step3 = function () { + setIsProcessRunning(true); + + Scenes.setStepHeading("", "using meteres",true); + Scenes.items.btn_next.show(); + // ! Step Connection + + // required elements + let btns = [ + Scenes.items.btn_instructions.set(770 + 40, 145, 50).zIndex(13), + Scenes.items.btn_reset.set(850, 200 , 40).zIndex(13), + Scenes.items.btn_connections.set(770 + 40, 190 + 55, 50).zIndex(13), + Scenes.items.btn_connectons_completed + .set(770 + 40, 190 + 110, 50, 147) + .zIndex(13), + Scenes.items.btn_start_experiment + .set(770 + 40, 190 + 165, 50, 147) + .zIndex(13), + ] + + // required images + let images = [ + Scenes.items.part_1_components.set(0,-70,495,975).zIndex(1), + Scenes.items.part_2_conncection_supply_1_red_button.set(178,72,28,25).zIndex(13), + Scenes.items.part_1_1_connections_box, + ] + + let cables = [ + Scenes.items.part_1_cable_p1.set(0,0).zIndex(2).hide(), + Scenes.items.part_1_cable_k_ac1.set(0,0).zIndex(3).hide(), + Scenes.items.part_1_cable_ac2.set(0,0).zIndex(4).hide(), + Scenes.items.part_1_cable_r2.set(0,0).zIndex(5).hide(), + Scenes.items.part_1_cable_p.set(0,0).zIndex(6).hide(), + Scenes.items.part_1_cable_rg2.set(0,0).zIndex(7).hide(), + Scenes.items.part_1_cable_a2.set(0,0).zIndex(8).hide(), + Scenes.items.part_1_cable_k.set(0,0).zIndex(9).hide(), + Scenes.items.part_1_cable_v1.set(0,0).zIndex(10).hide(), + Scenes.items.part_1_cable_v2.set(0,0).zIndex(11).hide(), + ] + + // ! for increasing the size + let l = 0,t = -70, h = 495, w = 975 + Scenes.items.part_1_components.set(l,t,h,w).zIndex(1) + cables.forEach(ele=>{ + ele.set(l,t,h,w).hide() + }) + + let cables_color = [ + "#c20000", + "#223964", + "#ffca00", + "#010101", + "#008000", + "#5a5656", + "#cb5c10", + "#070707", + "#ff46ff", + "#68064c", + ] + + + function hideConnectionStepImgs(){ + let allImages = [ + ...btns,...images,...cables + ] + allImages.forEach(ele=>{ + ele.hide() + }) + Dom.setBlinkArrowRed(-1) + } + + + //! Connection Part + // to enable startExp Button + let partConnectionsIsComplete = false + function partConnections(){ + // Connection Logic + Scenes.items.part_1_1_connections_box.set(414,-70).hide() + + // ! btn_reset onclick + Scenes.items.btn_reset.item.onclick = ()=>{ + let box_buttons_reset = document.querySelectorAll(".part_1_1_connections_box button") + let temps = { + textShadow: "none", + color: "black", + backgroundColor: "transparent" + } + box_buttons_reset.forEach(ele=>{ + let ele_Dom = new Dom(ele) + ele_Dom.styles(temps) + }) + Scenes.steps[3]() + } + + //! connection box onclick + Scenes.items.btn_connections.item.onclick = ()=>{ + Scenes.items.part_1_1_connections_box.show("flex") + // ! connection table arrow move + Dom.setBlinkArrowRed(true,483,5,35,null,90).play() + setCC("") + } + let box_buttons = document.querySelectorAll(".part_1_1_connections_box button") + + //! connection box onclick + let btnClickedCount = 0 + let connectionBtnArrow = 483 + let arrowLeftGap = 46 + box_buttons.forEach((ele,i)=>{ + ele.onclick = ()=>{ + // increasing count of complete connection + if(ele.style.color!="white"){ + btnClickedCount++ + //! move arrow + connectionBtnArrow += arrowLeftGap + Dom.setBlinkArrowRed(true,connectionBtnArrow,5,35,null,90).play() + + if(btnClickedCount==10){ + Dom.setBlinkArrowRed(true,745,305,35,null,180).play() + setCC("Click on Connections Completed") + + Scenes.items.btn_connections.item.onclick = ()=>{} + } + } + + cables[i].show() + ele.style.backgroundColor = cables_color[i] + ele.style.color = "white" + ele.style.textShadow = "1px 1px black" + } + }) + + Dom.setBlinkArrowRed(true,745,250,35,null,180).play() + setCC("Click on Connections") + + //! Onclick for check connections + Scenes.items.btn_connectons_completed.item.onclick = ()=>{ + + if(btnClickedCount==10){ + + //! First red button click + Scenes.items.part_1_slide_3_compo_1_text.set(208,114,50).zIndex(10) + Dom.setBlinkArrowRed(true,206,73).play() + setCC("Switch on Main Supply") + Scenes.items.part_2_conncection_supply_1_red_button.item.onclick = ()=>{ + + Scenes.items.part_2_conncection_supply_1_red_button.hide() + Scenes.items.part_1_slide_3_compo_1_text.hide() + + Dom.setBlinkArrowRed(true,748,360,35,null,180).play() + setCC("Click on Start Experiment") + partConnectionsIsComplete = true + + + //! Second red button click + + // Scenes.items.part_2_conncection_supply_2_red_button.item.onclick = ()=>{ + // Scenes.items.part_2_conncection_supply_2_red_button.hide() + // Scenes.items.part_1_slide_3_compo_2_text.hide() + + // Dom.setBlinkArrowRed(true,748,360,35,null,180).play() + // setCC("Click on Start Experiment") + // } + } + + } + else{ + Scenes.items.part_1_incomplete_connection.set(570,300,50).zIndex(10) + anime({ + targets: Scenes.items.part_1_incomplete_connection.item, + delay: 2000, + complete(){ + Scenes.items.part_1_incomplete_connection.hide() + } + }) + } + } + } + partConnections() + + //! Graph Part + function partCalculation(){ + // for recrod btn + Scenes.items.part_1_calculations.set(0,-70,480,948) + Scenes.items.btn_procedure.set(790+5,-72,37).zIndex(10) + Scenes.items.btn_nomenclature.set(610+5,-72,37,160).zIndex(10) + setTimeout(() => { + Dom.setBlinkArrowRed(-1) + Dom.setBlinkArrow(true, 790, 544).play(); + setCC("Click 'Next' to go to next step"); + setIsProcessRunning(false) + // for going to the second step + Scenes.currentStep = 3 + }, 5000); + } + + // todo remove + // hideConnectionStepImgs() + // partCalculation() + + + //to show btn popup + Scenes.showPopup("4_1") + + //! onclick start btn + Scenes.items.btn_start_experiment.item.onclick = ()=>{ + // to enable the button + if(partConnectionsIsComplete){ + // * Hide preivous + hideConnectionStepImgs() + + Scenes.realCurrentStep = 4 + console.log(`RealCurrentStep: ${Scenes.realCurrentStep}`) + + // * calculation part + partCalculation() + Scenes.showPopup("4_1") + } + } + + return true + }), + + //*scr part_2 + (step4 = function () { + setIsProcessRunning(true); + Scenes.setStepHeading("", "using oscilloscope",true) + Scenes.items.btn_next.show(); + // ! Step Connection + + // required elements + let temp = 16 + let btns = [ + Scenes.items.btn_instructions.set(750 + 75, 10-temp, 40).zIndex(23), + Scenes.items.btn_connections.set(750 + 75, 55-temp, 40).zIndex(23), + Scenes.items.btn_connectons_completed + .set(750 + 75, 100-temp, 50, 120) + .zIndex(23), + Scenes.items.btn_start_experiment + .set(750 + 75, 153-temp, 50, 120) + .zIndex(23), + Scenes.items.btn_reset.set(840, 192, 35, 91).zIndex(23), + ] + + // required images + let images = [ + Scenes.items.part_2_components.set(0,-80,495,975).zIndex(1), + Scenes.items.part_2_conncection_supply_1_red_button.set(150,70,28,25).zIndex(23), + Scenes.items.part_1_2_connections_box, + ] + + let cables = [ + Scenes.items.part_2_cable_p1.set(0,0).zIndex(10).hide(), + Scenes.items.part_2_cable_k.set(0,0).zIndex(11).hide(), + Scenes.items.part_2_cable_r2.set(0,0).zIndex(12).hide(), + Scenes.items.part_2_cable_p.set(0,0).zIndex(13).hide(), + Scenes.items.part_2_cable_rg2.set(0,0).zIndex(14).hide(), + Scenes.items.part_2_cable_a2.set(0,0).zIndex(15).hide(), + Scenes.items.part_2_cable_k_n.set(0,0).zIndex(16).hide(), + Scenes.items.part_2_cable_cp.set(0,0).zIndex(18).hide(), + Scenes.items.part_2_cable_dvp.set(0,0).zIndex(19).hide(), + Scenes.items.part_2_cable_v1.set(0,0).zIndex(20).hide(), + Scenes.items.part_2_cable_v2.set(0,0).zIndex(21).hide(), + ] + + // ! for increasing the size + let l = 0,t = -70, h = 485, w = 945 + Scenes.items.part_2_components.set(l,t,h,w).zIndex(1) + cables.forEach(ele=>{ + ele.set(l,t,h,w).hide() + }) + + let cables_color = [ + "#e40d0d", + "#162848", + "#010101", + "#038403", + "#3e3e3e", + "#82461d", + "#080808", + "#760e58", + "#878787", + "#04aae6", + "#01ff01", + ] + + function hideConnectionStepImgs(){ + let allImages = [ + ...btns,...images,...cables + ] + allImages.forEach(ele=>{ + ele.hide() + }) + Dom.setBlinkArrowRed(-1) + } + + //! Connection Part + // to enable startExp Button + let partConnectionsIsComplete = false + function partConnections(){ + // Connection Logic + Scenes.items.part_1_2_connections_box.set(410,-78).hide() + + // ! btn_reset onclick + Scenes.items.btn_reset.item.onclick = ()=>{ + let box_buttons_reset = document.querySelectorAll(".part_1_2_connections_box button") + let temps = { + textShadow: "none", + color: "black", + backgroundColor: "transparent" + } + box_buttons_reset.forEach(ele=>{ + let ele_Dom = new Dom(ele) + ele_Dom.styles(temps) + }) + Scenes.steps[4]() + } + + //! connection box onclick + Scenes.items.btn_connections.item.onclick = ()=>{ + Scenes.items.part_1_2_connections_box.show("flex") + // ! connection table arrow move + Dom.setBlinkArrowRed(true,470,-4,35,null,90).play() + setCC("") + } + let box_buttons = document.querySelectorAll(".part_1_2_connections_box button") + + //! connection box onclick + let btnClickedCount = 0 + let connectionBtnArrow = 470 + let arrowLeftGap = 43 + box_buttons.forEach((ele,i)=>{ + ele.onclick = ()=>{ + // increasing count of complete connection + if(ele.style.color!="white"){ + btnClickedCount++ + //! move arrow + connectionBtnArrow += arrowLeftGap + Dom.setBlinkArrowRed(true,connectionBtnArrow,-4,35,null,90).play() + + if(btnClickedCount==cables.length){ + Dom.setBlinkArrowRed(true,778,105-temp,35,null,180).play() + setCC("Click on Connections Completed") + + Scenes.items.btn_connections.item.onclick = ()=>{} + } + } + + cables[i].show() + ele.style.backgroundColor = cables_color[i] + ele.style.color = "white" + ele.style.textShadow = "1px 1px black" + } + }) + + Dom.setBlinkArrowRed(true,778,55-temp,35,null,180).play() + setCC("Click on Connections") + + //! Onclick for check connections + Scenes.items.btn_connectons_completed.item.onclick = ()=>{ + + if(btnClickedCount==11){ + + //! First red button click + Scenes.items.part_1_slide_3_compo_1_text.set(178,96,50).zIndex(20) + Dom.setBlinkArrowRed(true,170,65).play() + setCC("Switch on Main Supply") + Scenes.items.part_2_conncection_supply_1_red_button.item.onclick = ()=>{ + + Scenes.items.part_2_conncection_supply_1_red_button.hide() + Scenes.items.part_1_slide_3_compo_1_text.hide() + + Dom.setBlinkArrowRed(true,778,165-temp,35,null,180).play() + setCC("Click on Start Experiment") + partConnectionsIsComplete = true + //! Second red button click + + // Scenes.items.part_1_slide_3_compo_2_text.set(168,338,56).zIndex(20) + // Dom.setBlinkArrowRed(true,166,306).play() + // setCC("Switch on Gate Supply") + + // Scenes.items.part_2_conncection_supply_2_red_button.item.onclick = ()=>{ + // Scenes.items.part_2_conncection_supply_2_red_button.hide() + // Scenes.items.part_1_slide_3_compo_2_text.hide() + + // // Dom.setBlinkArrowRed(true,778,165-temp,35,null,180).play() + // // setCC("Click on Start Experiment") + // // partConnectionsIsComplete = true + // } + } + + } + else{ + Scenes.items.part_1_incomplete_connection.set(660,100,50).zIndex(10) + anime({ + targets: Scenes.items.part_1_incomplete_connection.item, + delay: 2000, + complete(){ + Scenes.items.part_1_incomplete_connection.hide() + } + }) + } + } + } + partConnections() + + //! Graph Part + function partCalculation(){ + // for recrod btn + let plotBtnIdx = 1 + Scenes.items.part_2_calculation.set(-15,-70,480,983) + Scenes.items.btn_procedure.set(790+5,-72,37).zIndex(10) + Scenes.items.btn_nomenclature.set(610+5,-72,37,160).zIndex(10) + Scenes.items.btn_plot.set(512+5,-74,40,85).zIndex(10) + let graph_l = 516, + graph_t = -35, + graph_h = 450, + graph_w = 430 + Scenes.items.graph_0_initial.set(graph_l,graph_t,graph_h,graph_w).zIndex(10) + let graphs = [ + Scenes.items.graph_1_2500.set(graph_l,graph_t,graph_h,graph_w).zIndex(11).hide(), + Scenes.items.graph_2_750.set(graph_l,graph_t,graph_h,graph_w).zIndex(12).hide(), + Scenes.items.graph_3_150.set(graph_l,graph_t,graph_h,graph_w).zIndex(13).hide(), + Scenes.items.graph_4_50.set(graph_l,graph_t,graph_h,graph_w).zIndex(14).hide() + ] + + // step tutorial + Dom.setBlinkArrowRed(true,10,320,35,null,-90).play() + setCC("Click on the Gate resistance slider and set it to 25 kilo ohms") + + // * Calling slider + sliders.showSliderFor("1_2") + + // * assume tempTitle10 as a btn record + let btn_record = sliders.btn_record.item + + // and other blink arrow is on sliders.js + + // ! btn_plot + Scenes.items.btn_plot.item.onclick = ()=>{ + Dom.setBlinkArrowRed(-1) + let vGs_value = sliders.slider_vGs.getValue() + let vIn_value = sliders.slider_vIn.getValue() + let R_value = sliders.slider_R.getValue() + + updateValues(vIn_value,vGs_value,R_value) + console.log(vGs_value) + + switch(Number(vGs_value)){ + case 25: + Dom.setBlinkArrowRed(-1) + Anime.fadeIn(graphs[plotBtnIdx].show().opacity(0).item) + setCC("Reverse blocking and forward blocking characteristics are displayed on the DSO screen. For better visual understanding, zoomed version of the DSO screen is also included just below.") + setTimeout(()=>{ + Dom.setBlinkArrowRed(true,10,320,35,null,-90).play() + setCC("Generate similar type of characteristics with different gate resistances by clicking the gate slider. Set gate resistance to 750 ohms which corresponds to 2 milli ampere gate current.") + },15000) + break; + case 750: + Anime.fadeIn(graphs[plotBtnIdx].show().opacity(0).item) + setTimeout(()=>{ + Dom.setBlinkArrowRed(true,10,320,35,null,-90).play() + setCC("To generate one more characteristics, set gate resistance slider to to 150 ohms and click on the plot icon.") + },5000) + + break + case 150: + Anime.fadeIn(graphs[plotBtnIdx].show().opacity(0).item) + setTimeout(()=>{ + Dom.setBlinkArrowRed(true,10,320,35,null,-90).play() + },5000) + + break + case 50: + Anime.fadeIn(graphs[plotBtnIdx].show().opacity(0).item) + setTimeout(()=>{ + setCC("From this experiment, it is clear that the v i characteristics of SCR depends on the gate current magnitude. Higher the gate current, lesser is the forward breakover voltage.") + // Dom.setBlinkArrowRed(true,10,320,35,null,-90).play() + + + // for going to the second step + + setTimeout(()=>{ + Dom.setBlinkArrowRed(-1) + Dom.setBlinkArrow(true, 790, 544).play(); + setCC("Click 'Next' to go to next step"); + setIsProcessRunning(false); + },12000) + + },5000) + + break + + } + plotBtnIdx++ + } + + // ! btn_record onclick + plotBtnIdx = 0 + btn_record.onclick = ()=>{ + let vGs_value = sliders.slider_vGs.getValue() + let vIn_value = sliders.slider_vIn.getValue() + let R_value = sliders.slider_R.getValue() + + updateValues(vIn_value,vGs_value,R_value) + + // end the slide + if(vGs_value==last_vGs_value){ + Dom.setBlinkArrowRed(-1) + Dom.setBlinkArrow(true, 790, 544).play(); + setCC("Click 'Next' to go to next step"); + setIsProcessRunning(false); + // for going to the second step + Scenes.currentStep = 3 + } + } + } + + // todo remove + // hideConnectionStepImgs() + // partCalculation() + + //to show btn popup + Scenes.showPopup("4_2") + //! onclick start btn + Scenes.items.btn_start_experiment.item.onclick = ()=>{ + // to enable the button + if(partConnectionsIsComplete){ + // * Hide preivous + hideConnectionStepImgs() + + Scenes.realCurrentStep = 5 + console.log(`RealCurrentStep: ${Scenes.realCurrentStep}`) + + // * calculation part + partCalculation() + + //to show btn popup + Scenes.showPopup("4_2") + } + } + + + + return true + }), + + // !Experimental result section + //! R LOAD Waveforms section + (step5 = function () { + setIsProcessRunning(true); + // to hide previous step + + //! Required Items + Scenes.items.btn_next.show(); + + //r load click + let arrowIdx = 0; + let arrows = [ + // () => { + // Dom.setBlinkArrowRed(true, 669, 73, 30, null, 180).play(); + // arrowIdx++; + // }, + () => { + Dom.setBlinkArrowRed(true, 518, 177, 30, null, 180).play(); + arrowIdx++; + }, + () => { + Dom.setBlinkArrowRed(true, 518, 177 + 85, 30, null, 180).play(); + arrowIdx++; + }, + () => { + Dom.setBlinkArrowRed(-1); + }, + ]; + + arrows[arrowIdx](); + // setCC( + // "To View the experimental waveforms select the parameters and proceed further." + // ); + Scenes.items.menu_page.set(10, -45, 490); + // Scenes.items.circle.set(426, 362, 76).hide(); + + let btns = [ + // Scenes.items.btn_input_voltage.set(719, 159 - 92, 47).zIndex(1), + Scenes.items.btn_1.set(558, 166, 52).zIndex(1), + Scenes.items.btn_2.set(558, 166 + 84, 63).zIndex(1), + ]; + + let vals = [ + // Scenes.items.val_v + // .set(719, 35 + 159 - 92, 47) + // .zIndex(1) + // .hide(), + Scenes.items.val_vin.set(763, 169, 47).zIndex(1).hide(), + Scenes.items.val_vgs.set(763, 255, 47).zIndex(1).hide(), + ]; + + let optionsClick = [0, 0]; + let btn_see_waveforms = Scenes.items.btn_click + .set(442, 374, 51) + .zIndex(1); + + btns.forEach((btn, idx) => { + btn.item.onclick = () => { + arrows[arrowIdx](); + vals[idx].show(); + optionsClick[idx] = 1; + if (optionsClick.indexOf(0) == -1) { + Scenes.items.circle.set(426, 362, 76); + btn_see_waveforms.item.classList.add("btn-img"); + let scaleBtn = anime({ + targets: Scenes.items.circle.item, + scale: [1, 1.1], + duration: 1000, + easing: "linear", + loop: true, + }); + btn_see_waveforms.item.onclick = () => { + scaleBtn.reset(); + waveformShow(); + }; + } + }; + }); + + let scenes = [ + Scenes.items.frame_1.set(0, 9, 420).hide(), + Scenes.items.frame_2.set(0, 9, 420).hide(), + Scenes.items.frame_3.set(0, 9, 420).hide(), + ]; + + let waveformShow = () => { + vals.forEach((_, idx) => { + btns[idx].hide(); + vals[idx].hide(); + }); + Scenes.items.circle.set(580, 346, 93).hide(); + Scenes.items.btn_click.hide(); + Scenes.items.menu_page.hide(); + + // Dom.setBlinkArrowRed(true, 555, 162, 30, null, 0).play(); + Dom.setBlinkArrowRed(-1); + + scenes[0].show(); + setCC( + "The purple curves on the DSO screen are the v-i characteristics for different Gate currents." + ); + setCC( + " The x-axis is Anode-to-Cathode voltage while y-axis is the Anode current." + ); + + setTimeout(() => { + // setCC("Click 'Next' to go to next step"); + Dom.setBlinkArrow(true, 790, 415).play(); + setIsProcessRunning(false); + }, 9000); + }; + + return true; + }), + + //! R LOAD CLICK 2 + (step6 = function () { + setIsProcessRunning(true); + + //! Required Items + Scenes.items.btn_next.show(); + // to hide previous step + Scenes.items.frame_2.set(0, 9, 420); + // Dom.setBlinkArrowRed(true, 532, 280, 30, null, 0).play(); + + setCC( + "SCR starts conducting gate current increases to a sufficient value or the gate resistance is reduced sufficiently." + ); + + setTimeout(() => { + // setCC("Click 'Next' to go to next step"); + Dom.setBlinkArrow(true, 790, 415).play(); + setIsProcessRunning(false); + }, 7000); + + //! Required Items + + return true; + }), + + //! R LOAD CLICK 3 + (step7 = function () { + setIsProcessRunning(true); + + //! Required Items + Scenes.items.btn_next.show(); + // Scenes.items.slider_box.hide(); + + // to hide previous step + Scenes.items.frame_3.set(0, 9, 420); + // Dom.setBlinkArrowRed(true, 555, 317, 30, null, 0).play(); + // Dom.setBlinkArrowRed(-1) + + setCC( + "These characteristics clearly indicate three distinct regions: Forward Conducting, Forward Blocking and Reverse Blocking." + ); + + setTimeout(() => { + setCC("SCR Done ✅"); + setIsProcessRunning(false); + + // ! Merge Helper + nextBtn.addEventListener("click", () => { + Scenes.mergeProcessHelper() + }); + setIsProcessRunning(false); + }, 6000); + + //! Required Items + + return true; + }), + ], + // ! For adding realcurrentstep in every step + // ! For tracking the current step accuratly + realCurrentStep: null, + setRealCurrentStep(){ + let count = 0 + this.steps.forEach((step,idx) => { + const constCount = count + let newStep = () => { + this.realCurrentStep = constCount; + console.log(`RealCurrentStep: ${this.realCurrentStep}`) + return step(); + }; + + count++; + let ignoreStepsForAdding = [4,5] + if(ignoreStepsForAdding.indexOf(idx) != -1) return + this.steps[idx] = newStep + }); + }, + back() { + //! animation isRunning + // if (isRunning) { + // return; + // } + if (this.currentStep > 1) { + Scenes.items.btn_next.setContent("Next"); + Scenes.items.btn_next.item.onclick = () => {}; + this.currentStep -= 2; + this.steps[this.currentStep](); + this.currentStep++; + backDrawerItem(); + backProgressBar(); + } + }, + next() { + if(!this.realCurrentStep){ + Scenes.setRealCurrentStep() + } + //! animation isRunning + if (isRunning) { + return; + } + if (this.currentStep < this.steps.length) { + if (this.steps[this.currentStep]()) { + nextDrawerItem(); + nextProgressBar(); + this.currentStep++; + } + } else { + } + }, + // ! For Merge Process Helper + mergeProcessHelper(goto="menu",done=true){ + let StepDone = JSON.parse(localStorage.getItem("StepDone")) + if(goto == "menu") + StepDone.SCR = done + StepDone.goto = goto + localStorage.setItem("StepDone",JSON.stringify(StepDone)) + } +}; + +// * slider +// var rangeSlider = function () { +// var slider = $(".range-slider"), +// range = $(".range-slider__range"), +// value = $(".range-slider__value"); + +// slider.each(function () { +// value.each(function () { +// var value = $(this).prev().attr("value"); +// $(this).html(value); +// }); + +// range.on("input", function () { +// $(this).next(value).html(this.value); +// $(this).next(value).val(this.value); +// }); +// }); +// }; +// $(".resistance-input").on("keyup", () => { +// let slider = $(".slider_R .range-slider__range"); +// let input = document.querySelector(".resistance-input"); + +// let min = 1; +// let max = Number(slider.attr("max")); +// // if (input.value < min) { +// // input.value = min; +// // } +// if (input.value > max) { +// input.value = max; +// } +// slider.val(input.value); +// }); +// rangeSlider(); + +function getStep(){ + let StepDone = JSON.parse(localStorage.getItem("StepDone")) + for(let step in StepDone){ + if(StepDone[step] == true){ + nextDrawerItem(); + nextProgressBar(); + if(StepDone.SCR == true){ + $(".steps ol li").addClass("completed"); + for(let i = 0;i<4;i++){ + nextDrawerItem() + } + } + return 2 + } + } + return 1 +} + +// stepcalling +Scenes.currentStep = getStep() + +Scenes.next() +// Scenes.steps[3]() +// Scenes.next() +// Scenes.next() + +const nextBtn = get(".btn-next"); + +const backBtn = get(".btn-back"); +nextBtn.addEventListener("click", () => { + Scenes.next(); +}); +backBtn.addEventListener("click", () => { + Scenes.back(); +}); + +// print certificate +get(".btn-save").addEventListener("click", () => { + window.print(); +}); + +let muteBtn = get(".btn-mute"); +muteBtn.addEventListener("click", () => { + if (isMute) { + isMute = false; + muteBtn.src = "./src/images/template_imgs/speech_off_btn.png"; + muteBtn.title = "Click to Mute"; + } else { + isMute = true; + muteBtn.src = "./src/images/template_imgs/speech_on_btn.png"; + muteBtn.title = "Click to Unmute"; + } +}); + +// ! Anime Header Hover Buttons +function btnPopupBox() { + let popupBtns = document.querySelectorAll(".btn-popup"); + let popupWindow = document.querySelector(".btn-popup-window"); + + popupBtns[0].onmouseover = () => { + popupWindow.src = Scenes.items.formulas_procedure.item.src; + }; + popupBtns[1].onmouseover = () => { + popupWindow.src = Scenes.items.formulas_nomenclautre.item.src; + }; + popupBtns[2].onmouseover = () => { + switch (Scenes.forMathematicalExpressionBtn) { + case 1: + popupWindow.src = Scenes.items.formulas_ideal.item.src; + break; + + case 2: + popupWindow.src = Scenes.items.formulas_non_ideal.item.src; + break; + + case 3: + popupWindow.src = Scenes.items.formulas_efficiency.item.src; + break; + + case 4: + popupWindow.src = Scenes.items.formulas_component_stress.item.src; + break; + + default: + popupWindow.src = Scenes.items.formulas_universal.item.src; + break; + } + }; +} +// btnPopupBox(); + +// i really enjoyed the voice of keybord +// its amazing + +// mouse position +// function getCursor(event) { +// let x = event.clientX; +// let y = event.clientY; +// let _position = `X: ${x - 419}
    Y: ${y - 169}`; + +// const infoElement = document.getElementById("info"); +// infoElement.innerHTML = _position; +// infoElement.style.top = y + "px"; +// infoElement.style.left = x + 20 + "px"; +// } + diff --git a/experiment/simulation/EE5/js/progressBar.js b/experiment/simulation/EE5/js/progressBar.js new file mode 100644 index 0000000..3bd0277 --- /dev/null +++ b/experiment/simulation/EE5/js/progressBar.js @@ -0,0 +1,39 @@ +// * progress bar +const prevBtns = document.querySelector(".btn-prev"); +const nextBtns = document.querySelector(".btn-next"); +const progress = document.getElementById("progress"); +const progressSteps = document.querySelectorAll(".progress-step"); + + +let currProgressStep = -1; +// total steps from the number of drawer items +let totalProgressSteps = document.querySelectorAll(".step").length; + +const nextProgressBar = () => { + if(currProgressStep < totalProgressSteps - 1){ + currProgressStep++; + updateProgressbar(); + } +}; + +const backProgressBar = () => { + if(currProgressStep > 0){ + currProgressStep--; + updateProgressbar(); + } +}; + +function updateProgressbar() { + progressSteps.forEach((progressStep, idx) => { + if (idx < currProgressStep + 1) { + progressStep.classList.add("progress-step-active"); + } else { + progressStep.classList.remove("progress-step-active"); + } + }); + + const progressActive = document.querySelectorAll(".progress-step-active"); + + progress.style.width = + ((progressActive.length - 1) / (progressSteps.length - 1)) * 100 + "%"; +} diff --git a/experiment/simulation/EE5/js/sliders.js b/experiment/simulation/EE5/js/sliders.js new file mode 100644 index 0000000..066e30f --- /dev/null +++ b/experiment/simulation/EE5/js/sliders.js @@ -0,0 +1,310 @@ +const sliders = { + slider_vIn: new Dom(".slider_vIn"), + slider_vGs: new Dom(".slider_vGs"), + slider_R: new Dom(".slider_R"), + + slider_vIn_label: new Dom(".temp-title5"), + slider_vGs_label: new Dom(".temp-title6"), + slider_R_label: new Dom(".temp-title7"), + + //! we using temptitle10 as a record btn + // show we can update the table according to the button click + btn_record: new Dom(".temp-title10"), + + + init(){ + this.updateLabels() + let styles = { + fontSize: "larger", + padding: "0 5px", + textAlign: "center", + width: "fit-content", + color: "black", + border: "2px solid black", + backgroundColor: "white", + } + this.slider_vIn_label.styles(styles) + this.slider_vGs_label.styles(styles) + this.slider_R_label.styles(styles) + }, + + // part: 1_1, 1_2, 2 + showSliderFor(part){ + switch(part){ + case "1_1": + this.slider_vIn.set(10,-57,23).zIndex(10) + this.slider_vIn_label.set(225,-56) + + this.slider_vGs.set(20,368,23).zIndex(10) + this.slider_vGs_label.set(184,367) + + this.slider_R_label.set(440,349) + + // ! vGs onclick + var differences_vGs = [140,117,85,54]; + var vals_vGs = [25,750,150,50] + var vals_iG = [0,2,10,20] + var currentDifferenceIndex_vGs = 0; + // for the slider vgs + var value_vGs = 0 + var value_iG = 0 + this.slider_vGs.item.onclick = ( )=>{ + if (currentDifferenceIndex_vGs < differences_vGs.length) { + // Get the current difference + var currentDifference = differences_vGs[currentDifferenceIndex_vGs]; + + // setting the value of label + value_vGs = vals_vGs[currentDifferenceIndex_vGs] + value_iG = vals_iG[currentDifferenceIndex_vGs] + + // Animate the translation on each click + this.sliderAnime(this.slider_vGs,null,value_vGs,currentDifference,()=>{ + // for updating side by side Ig + this.slider_R.setValue(value_iG) + }) + currentDifferenceIndex_vGs++; + + // !we using temptitle10 as a record btn + // this.btn_record.item.click() + + // * show arrow for vIn + switch(value_vGs){ + case 25: + setCC("For this 25 kilo ohms gate resistance, the gate current Ig is negligible.") + setTimeout(()=>{ + Dom.setBlinkArrowRed(true,0,-20,35,null,90).play() + setCC("Click on the input voltage vin slider and set the RMS voltage to 15 Volts.") + },7000) + break; + + case 750: + setCC("Now click on the plot icon to see the SCR turn on characteristics. The on state forward voltage drop is very small and current through it is high.") + Dom.setBlinkArrowRed(true,535,-30,35,null,90).play() + break; + + case 150: + Dom.setBlinkArrowRed(true,535,-30,35,null,90).play() + + case 50: + Dom.setBlinkArrowRed(true,535,-30,35,null,90).play() + } + } + } + + // ! vIn onclick + this.slider_vIn.item.onclick = ()=>{ + let value_vIn = 15 + var left = 138 + this.sliderAnime(this.slider_vIn,0,value_vIn,left) + + // * show arrow for vGs + Dom.setBlinkArrowRed(true,535,-30,35,null,90).play() + setCC("Click on the plot icon") + } + + break + + case "1_2": + this.slider_vIn.set(10,-57,23).zIndex(10) + this.slider_vIn_label.set(225,-56) + + this.slider_vGs.set(20,368,23).zIndex(10) + this.slider_vGs_label.set(184,367) + + this.slider_R_label.set(440,349) + + // ! vGs onclick + var differences_vGs = [140,117,85,54]; + var vals_vGs = [25,750,150,50] + var vals_iG = [0,2,10,20] + var currentDifferenceIndex_vGs = 0; + // for the slider vgs + var value_vGs = 0 + var value_iG = 0 + this.slider_vGs.item.onclick = ( )=>{ + if (currentDifferenceIndex_vGs < differences_vGs.length) { + // Get the current difference + var currentDifference = differences_vGs[currentDifferenceIndex_vGs]; + + // setting the value of label + value_vGs = vals_vGs[currentDifferenceIndex_vGs] + value_iG = vals_iG[currentDifferenceIndex_vGs] + + // Animate the translation on each click + this.sliderAnime(this.slider_vGs,null,value_vGs,currentDifference,()=>{ + // for updating side by side Ig + this.slider_R.setValue(value_iG) + }) + currentDifferenceIndex_vGs++; + + // !we using temptitle10 as a record btn + // this.btn_record.item.click() + + // * show arrow for vIn + switch(value_vGs){ + case 25: + setCC("For this 25 kilo ohms gate resistance, the gate current Ig is negligible.") + setTimeout(()=>{ + Dom.setBlinkArrowRed(true,0,-20,35,null,90).play() + setCC("Click on the input voltage vin slider and set the RMS voltage to 15 Volts.") + },7000) + break; + + case 750: + setCC("Now click on the plot icon to see the SCR turn on characteristics. The on state forward voltage drop is very small and current through it is high.") + Dom.setBlinkArrowRed(true,535,-30,35,null,90).play() + break; + + case 150: + Dom.setBlinkArrowRed(true,535,-30,35,null,90).play() + + case 50: + Dom.setBlinkArrowRed(true,535,-30,35,null,90).play() + } + } + } + + // ! vIn onclick + this.slider_vIn.item.onclick = ()=>{ + let value_vIn = 15 + var left = 138 + this.sliderAnime(this.slider_vIn,0,value_vIn,left) + + // * show arrow for vGs + Dom.setBlinkArrowRed(true,535,-30,35,null,90).play() + setCC("Click on the plot icon") + } + + break + + case "2": + this.slider_vIn.set(34,-44,23).zIndex(10) + this.slider_vIn_label.set(185,-10) + + this.slider_vGs.set(4,364-18,23).zIndex(10) + this.slider_vGs_label.set(242,364-18) + + this.slider_R.set(329,362-18,23).zIndex(10) + this.slider_R_label.set(502,364-18) + + + // ! vGs onclick + var differences = [69, 27, 26, 28, 25, 25, 19]; + var currentDifferenceIndex = 0; + // for the slider vgs + var value_vGs = 0 + this.slider_vGs.item.onclick = ( )=>{ + if (currentDifferenceIndex < differences.length) { + // Get the current difference + var currentDifference = differences[currentDifferenceIndex]; + if(currentDifferenceIndex==0) + value_vGs = 4 + else + value_vGs++ + + // Animate the translation on each click + this.sliderAnime(this.slider_vGs,currentDifference,value_vGs) + + if(currentDifferenceIndex==0){ + // * show arrow for vIn + Dom.setBlinkArrowRed(true,22,-90,35,null,-90).play() + setCC("Select Vin") + } + else if(currentDifferenceIndex == differences.length - 1){ + // * show arrow for plot + Dom.setBlinkArrowRed(true,802,30,35,null,-90).play() + setCC("Click on 'Plot'") + } + else{ + // * show arrow for vGs + Dom.setBlinkArrowRed(true,0,302,35,null,-90).play() + setCC("Select VGS") + } + + currentDifferenceIndex++; + + // !we using temptitle10 as a record btn + this.btn_record.item.click() + } + } + + // ! vIn onclick + this.slider_vIn.item.onclick = ()=>{ + let value_vIn = 200 + this.sliderAnime(this.slider_vIn,0,value_vIn,159) + + // * show arrow for vGs + Dom.setBlinkArrowRed(true,0,302,35,null,-90).play() + setCC("Select VGS") + } + + // ! R onclick + this.slider_R.item.onclick = ()=>{ + let value_R = 50 + this.sliderAnime(this.slider_R,0,value_R,376) + + // * show arrow for vGs + Dom.setBlinkArrowRed(true,0,302,35,null,-90).play() + setCC("Select VGS") + } + break + } + }, + sliderAnime(target,translateX,value,left="",complete=null){ + anime({ + targets: target.item, + translateX: `+=${translateX}`, + left: left, + easing: 'easeInOutQuad', + duration: 600, + complete: ()=> { + if(complete!=null){ + complete() + } + this.updateLabels() + } + }); + // set value of slider + target.item.attributes['value'].value = value + }, + updateLabels(){ + this.slider_vIn_label.setContent( + `${this.getVal(this.slider_vIn)} V` + ) + // for 25k ohms + let vgs_val = this.slider_vGs.getValue() + if(vgs_val==25){ + vgs_val = `${vgs_val}K` + } + this.slider_vGs_label.setContent( + `${vgs_val} Ω` + ) + this.slider_R_label.setContent( + `${this.getVal(this.slider_R)} mA` + ) + }, + labelAnime(target,value){ + // let currentValue = Number(target.item.innerHTML.slice(0,target.item.innerHTML.indexOf("<"))) + + // anime({ + // targets: target.item, + // duration: 600, + // easing: "linear", + // innerHTML: [currentValue,] + // }) + }, + getVal(dom){ + return dom.item.attributes['value'].value + }, + showSlider(part){ + setTimeout(() => { + sliders.init() + // Change this for your step + sliders.showSliderFor(part) + }, 1000); + } +} + +sliders.init() + + diff --git a/experiment/simulation/EE5/js/src.js b/experiment/simulation/EE5/js/src.js new file mode 100644 index 0000000..76c1a88 --- /dev/null +++ b/experiment/simulation/EE5/js/src.js @@ -0,0 +1,178 @@ +const src = { + // pick imgs from the dom + + allImgs: [], + allImgsDom: document.querySelectorAll(".main-window-imgs"), + allVideosDom: document.querySelectorAll(".main-window-videos"), + + // ! new added + allQsDom: document.querySelectorAll(".qs"), + + set() { + let index = 0 + this.allItems = { + + // * Tempalte Buttons + arrowRound: this.allImgsDom[index++], + blinkArrow: this.allImgsDom[index++], + laerrow: this.allImgsDom[index++], + laerrow2: this.allImgsDom[index++], + logo: this.allImgsDom[index++], + man: this.allImgsDom[index++], + measurearrow: this.allImgsDom[index++], + measurearrow2: this.allImgsDom[index++], + redsize: this.allImgsDom[index++], + speech_off_btn: this.allImgsDom[index++], + speech_on_btn: this.allImgsDom[index++], + talk_cloud: this.allImgsDom[index++], + iit_delhi_logo: this.allImgsDom[index++], + // * --xx Tempalte Buttons Ended xx-- + + + // !EE 4 images added + + + + // part2 + + + + //* new images added + + + + // part2 calculation + + + + //part3 images added + + + + + // * for PROCEDURE and instruction NOMENCLATURE + + //* useful images from previous experiment + + btn_connections:this.allImgsDom[index++], + btn_connectons_completed:this.allImgsDom[index++], + btn_instructions:this.allImgsDom[index++], + btn_nomenclature:this.allImgsDom[index++], + // btn_plot:this.allImgsDom[index++], + btn_procedure:this.allImgsDom[index++], + btn_reset:this.allImgsDom[index++], + btn_start_experiment:this.allImgsDom[index++], + + part_1_slide_3_compo_1_off:this.allImgsDom[index++], + part_1_slide_3_compo_1_on:this.allImgsDom[index++], + part_1_slide_3_compo_1_text:this.allImgsDom[index++], + part_1_slide_3_compo_2_off:this.allImgsDom[index++], + part_1_slide_3_compo_2_on:this.allImgsDom[index++], + part_1_slide_3_compo_2_text:this.allImgsDom[index++], + + part_1_incomplete_connection:this.allImgsDom[index++], + + part_2_conncection_supply_1_red_button:this.allImgsDom[index++], + part_2_conncection_supply_2_red_button:this.allImgsDom[index++], + + + // ! Slider Thumbs + slider_vGs: this.allImgsDom[index++], + slider_vIn: this.allImgsDom[index++], + slider_R: this.allImgsDom[index++], + + niddle_vGs: this.allImgsDom[index++], + niddle_vIn: this.allImgsDom[index++], + + + //* EE5 images added +arrow_black:this.allImgsDom[index++], +btn_plot:this.allImgsDom[index++], +btn_zoomed_in_plot:this.allImgsDom[index++], +part_1_cable_a2:this.allImgsDom[index++], +part_1_cable_ac2:this.allImgsDom[index++], +part_1_cable_k:this.allImgsDom[index++], +part_1_cable_k_ac1:this.allImgsDom[index++], +part_1_cable_p:this.allImgsDom[index++], +part_1_cable_p1:this.allImgsDom[index++], +part_1_cable_r2:this.allImgsDom[index++], +part_1_cable_rg2:this.allImgsDom[index++], +part_1_cable_v1:this.allImgsDom[index++], +part_1_cable_v2:this.allImgsDom[index++], +part_1_calculations:this.allImgsDom[index++], +part_1_components:this.allImgsDom[index++], +part_1_instruction_box:this.allImgsDom[index++], +part_1_nomenclature_box:this.allImgsDom[index++], +part_1_procedure_box:this.allImgsDom[index++], +part_2_cable_a2:this.allImgsDom[index++], +part_2_cable_ac1:this.allImgsDom[index++], +part_2_cable_cp:this.allImgsDom[index++], +part_2_cable_dvp:this.allImgsDom[index++], +part_2_cable_k:this.allImgsDom[index++], +part_2_cable_k_n:this.allImgsDom[index++], +part_2_cable_p:this.allImgsDom[index++], +part_2_cable_p1:this.allImgsDom[index++], +part_2_cable_r2:this.allImgsDom[index++], +part_2_cable_rg2:this.allImgsDom[index++], +part_2_cable_v1:this.allImgsDom[index++], +part_2_cable_v2:this.allImgsDom[index++], +part_2_calculation:this.allImgsDom[index++], +part_2_components:this.allImgsDom[index++], +part_2_instruction_box:this.allImgsDom[index++], +part_2_procedure_box:this.allImgsDom[index++], +select_option_1:this.allImgsDom[index++], +select_option_2:this.allImgsDom[index++], +select_option_full:this.allImgsDom[index++], + +// + +new_select_option_1:this.allImgsDom[index++], +new_select_option_2:this.allImgsDom[index++], +new_select_option_3:this.allImgsDom[index++], +new_select_option_full:this.allImgsDom[index++], + +graph_0_initial:this.allImgsDom[index++], +graph_1_2500:this.allImgsDom[index++], +graph_2_750:this.allImgsDom[index++], +graph_3_150:this.allImgsDom[index++], +graph_4_50:this.allImgsDom[index++], + + + +//! Experimental section images added here +btn_1: this.allImgsDom[index++], +btn_2: this.allImgsDom[index++], +btn_click: this.allImgsDom[index++], +circle: this.allImgsDom[index++], +frame_1: this.allImgsDom[index++], +frame_2: this.allImgsDom[index++], +frame_3: this.allImgsDom[index++], +menu_page: this.allImgsDom[index++], +val_vgs: this.allImgsDom[index++], +val_vin: this.allImgsDom[index++], + + // * Question Mark + domQs1: this.allQsDom[0], + domQs2: this.allQsDom[1], + domQs3: this.allQsDom[2], + domQs4: this.allQsDom[3], + domQs5: this.allQsDom[4], + domQs6: this.allQsDom[5], + + + // * Videos + // yoke_front_to_back: this.allVideosDom[0], + // yoke_front_to_side: this.allVideosDom[1], + // panel1: this.allVideosDom[2], + // panel2: this.allVideosDom[3], + + bfs_video: this.allVideosDom[0], + }; + }, + allImgsInitialAxis: [], + get(itemName) { + return this.allItems[itemName]; + }, +}; +// setting src +src.set(); diff --git a/experiment/simulation/EE5/js/typed.js b/experiment/simulation/EE5/js/typed.js new file mode 100644 index 0000000..faaac4d --- /dev/null +++ b/experiment/simulation/EE5/js/typed.js @@ -0,0 +1,1045 @@ +/*! + * + * typed.js - A JavaScript Typing Animation Library + * Author: Matt Boldt + * Version: v2.0.9 + * Url: https://github.com/mattboldt/typed.js + * License(s): MIT + * + */ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["Typed"] = factory(); + else + root["Typed"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + var _initializerJs = __webpack_require__(1); + + var _htmlParserJs = __webpack_require__(3); + + /** + * Welcome to Typed.js! + * @param {string} elementId HTML element ID _OR_ HTML element + * @param {object} options options object + * @returns {object} a new Typed object + */ + + var Typed = (function () { + function Typed(elementId, options) { + _classCallCheck(this, Typed); + + // Initialize it up + _initializerJs.initializer.load(this, options, elementId); + // All systems go! + this.begin(); + } + + /** + * Toggle start() and stop() of the Typed instance + * @public + */ + + _createClass(Typed, [{ + key: 'toggle', + value: function toggle() { + this.pause.status ? this.start() : this.stop(); + } + + /** + * Stop typing / backspacing and enable cursor blinking + * @public + */ + }, { + key: 'stop', + value: function stop() { + if (this.typingComplete) return; + if (this.pause.status) return; + this.toggleBlinking(true); + this.pause.status = true; + this.options.onStop(this.arrayPos, this); + } + + /** + * Start typing / backspacing after being stopped + * @public + */ + }, { + key: 'start', + value: function start() { + if (this.typingComplete) return; + if (!this.pause.status) return; + this.pause.status = false; + if (this.pause.typewrite) { + this.typewrite(this.pause.curString, this.pause.curStrPos); + } else { + this.backspace(this.pause.curString, this.pause.curStrPos); + } + this.options.onStart(this.arrayPos, this); + } + + /** + * Destroy this instance of Typed + * @public + */ + }, { + key: 'destroy', + value: function destroy() { + this.reset(false); + this.options.onDestroy(this); + } + + /** + * Reset Typed and optionally restarts + * @param {boolean} restart + * @public + */ + }, { + key: 'reset', + value: function reset() { + var restart = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0]; + + clearInterval(this.timeout); + this.replaceText(''); + if (this.cursor && this.cursor.parentNode) { + this.cursor.parentNode.removeChild(this.cursor); + this.cursor = null; + } + this.strPos = 0; + this.arrayPos = 0; + this.curLoop = 0; + if (restart) { + this.insertCursor(); + this.options.onReset(this); + this.begin(); + } + } + + /** + * Begins the typing animation + * @private + */ + }, { + key: 'begin', + value: function begin() { + var _this = this; + + this.typingComplete = false; + this.shuffleStringsIfNeeded(this); + this.insertCursor(); + if (this.bindInputFocusEvents) this.bindFocusEvents(); + this.timeout = setTimeout(function () { + // Check if there is some text in the element, if yes start by backspacing the default message + if (!_this.currentElContent || _this.currentElContent.length === 0) { + _this.typewrite(_this.strings[_this.sequence[_this.arrayPos]], _this.strPos); + } else { + // Start typing + _this.backspace(_this.currentElContent, _this.currentElContent.length); + } + }, this.startDelay); + } + + /** + * Called for each character typed + * @param {string} curString the current string in the strings array + * @param {number} curStrPos the current position in the curString + * @private + */ + }, { + key: 'typewrite', + value: function typewrite(curString, curStrPos) { + var _this2 = this; + + if (this.fadeOut && this.el.classList.contains(this.fadeOutClass)) { + this.el.classList.remove(this.fadeOutClass); + if (this.cursor) this.cursor.classList.remove(this.fadeOutClass); + } + + var humanize = this.humanizer(this.typeSpeed); + var numChars = 1; + + if (this.pause.status === true) { + this.setPauseStatus(curString, curStrPos, true); + return; + } + + // contain typing function in a timeout humanize'd delay + this.timeout = setTimeout(function () { + // skip over any HTML chars + curStrPos = _htmlParserJs.htmlParser.typeHtmlChars(curString, curStrPos, _this2); + + var pauseTime = 0; + var substr = curString.substr(curStrPos); + // check for an escape character before a pause value + // format: \^\d+ .. eg: ^1000 .. should be able to print the ^ too using ^^ + // single ^ are removed from string + if (substr.charAt(0) === '^') { + if (/^\^\d+/.test(substr)) { + var skip = 1; // skip at least 1 + substr = /\d+/.exec(substr)[0]; + skip += substr.length; + pauseTime = parseInt(substr); + _this2.temporaryPause = true; + _this2.options.onTypingPaused(_this2.arrayPos, _this2); + // strip out the escape character and pause value so they're not printed + curString = curString.substring(0, curStrPos) + curString.substring(curStrPos + skip); + _this2.toggleBlinking(true); + } + } + + // check for skip characters formatted as + // "this is a `string to print NOW` ..." + if (substr.charAt(0) === '`') { + while (curString.substr(curStrPos + numChars).charAt(0) !== '`') { + numChars++; + if (curStrPos + numChars > curString.length) break; + } + // strip out the escape characters and append all the string in between + var stringBeforeSkip = curString.substring(0, curStrPos); + var stringSkipped = curString.substring(stringBeforeSkip.length + 1, curStrPos + numChars); + var stringAfterSkip = curString.substring(curStrPos + numChars + 1); + curString = stringBeforeSkip + stringSkipped + stringAfterSkip; + numChars--; + } + + // timeout for any pause after a character + _this2.timeout = setTimeout(function () { + // Accounts for blinking while paused + _this2.toggleBlinking(false); + + // We're done with this sentence! + if (curStrPos >= curString.length) { + _this2.doneTyping(curString, curStrPos); + } else { + _this2.keepTyping(curString, curStrPos, numChars); + } + // end of character pause + if (_this2.temporaryPause) { + _this2.temporaryPause = false; + _this2.options.onTypingResumed(_this2.arrayPos, _this2); + } + }, pauseTime); + + // humanized value for typing + }, humanize); + } + + /** + * Continue to the next string & begin typing + * @param {string} curString the current string in the strings array + * @param {number} curStrPos the current position in the curString + * @private + */ + }, { + key: 'keepTyping', + value: function keepTyping(curString, curStrPos, numChars) { + // call before functions if applicable + if (curStrPos === 0) { + this.toggleBlinking(false); + this.options.preStringTyped(this.arrayPos, this); + } + // start typing each new char into existing string + // curString: arg, this.el.html: original text inside element + curStrPos += numChars; + var nextString = curString.substr(0, curStrPos); + this.replaceText(nextString); + // loop the function + this.typewrite(curString, curStrPos); + } + + /** + * We're done typing all strings + * @param {string} curString the current string in the strings array + * @param {number} curStrPos the current position in the curString + * @private + */ + }, { + key: 'doneTyping', + value: function doneTyping(curString, curStrPos) { + var _this3 = this; + + // fires callback function + this.options.onStringTyped(this.arrayPos, this); + this.toggleBlinking(true); + // is this the final string + if (this.arrayPos === this.strings.length - 1) { + // callback that occurs on the last typed string + this.complete(); + // quit if we wont loop back + if (this.loop === false || this.curLoop === this.loopCount) { + return; + } + } + this.timeout = setTimeout(function () { + _this3.backspace(curString, curStrPos); + }, this.backDelay); + } + + /** + * Backspaces 1 character at a time + * @param {string} curString the current string in the strings array + * @param {number} curStrPos the current position in the curString + * @private + */ + }, { + key: 'backspace', + value: function backspace(curString, curStrPos) { + var _this4 = this; + + if (this.pause.status === true) { + this.setPauseStatus(curString, curStrPos, true); + return; + } + if (this.fadeOut) return this.initFadeOut(); + + this.toggleBlinking(false); + var humanize = this.humanizer(this.backSpeed); + + this.timeout = setTimeout(function () { + curStrPos = _htmlParserJs.htmlParser.backSpaceHtmlChars(curString, curStrPos, _this4); + // replace text with base text + typed characters + var curStringAtPosition = curString.substr(0, curStrPos); + _this4.replaceText(curStringAtPosition); + + // if smartBack is enabled + if (_this4.smartBackspace) { + // the remaining part of the current string is equal of the same part of the new string + var nextString = _this4.strings[_this4.arrayPos + 1]; + if (nextString && curStringAtPosition === nextString.substr(0, curStrPos)) { + _this4.stopNum = curStrPos; + } else { + _this4.stopNum = 0; + } + } + + // if the number (id of character in current string) is + // less than the stop number, keep going + if (curStrPos > _this4.stopNum) { + // subtract characters one by one + curStrPos--; + // loop the function + _this4.backspace(curString, curStrPos); + } else if (curStrPos <= _this4.stopNum) { + // if the stop number has been reached, increase + // array position to next string + _this4.arrayPos++; + // When looping, begin at the beginning after backspace complete + if (_this4.arrayPos === _this4.strings.length) { + _this4.arrayPos = 0; + _this4.options.onLastStringBackspaced(); + _this4.shuffleStringsIfNeeded(); + _this4.begin(); + } else { + _this4.typewrite(_this4.strings[_this4.sequence[_this4.arrayPos]], curStrPos); + } + } + // humanized value for typing + }, humanize); + } + + /** + * Full animation is complete + * @private + */ + }, { + key: 'complete', + value: function complete() { + this.options.onComplete(this); + if (this.loop) { + this.curLoop++; + } else { + this.typingComplete = true; + } + } + + /** + * Has the typing been stopped + * @param {string} curString the current string in the strings array + * @param {number} curStrPos the current position in the curString + * @param {boolean} isTyping + * @private + */ + }, { + key: 'setPauseStatus', + value: function setPauseStatus(curString, curStrPos, isTyping) { + this.pause.typewrite = isTyping; + this.pause.curString = curString; + this.pause.curStrPos = curStrPos; + } + + /** + * Toggle the blinking cursor + * @param {boolean} isBlinking + * @private + */ + }, { + key: 'toggleBlinking', + value: function toggleBlinking(isBlinking) { + if (!this.cursor) return; + // if in paused state, don't toggle blinking a 2nd time + if (this.pause.status) return; + if (this.cursorBlinking === isBlinking) return; + this.cursorBlinking = isBlinking; + if (isBlinking) { + this.cursor.classList.add('typed-cursor--blink'); + } else { + this.cursor.classList.remove('typed-cursor--blink'); + } + } + + /** + * Speed in MS to type + * @param {number} speed + * @private + */ + }, { + key: 'humanizer', + value: function humanizer(speed) { + return Math.round(Math.random() * speed / 2) + speed; + } + + /** + * Shuffle the sequence of the strings array + * @private + */ + }, { + key: 'shuffleStringsIfNeeded', + value: function shuffleStringsIfNeeded() { + if (!this.shuffle) return; + this.sequence = this.sequence.sort(function () { + return Math.random() - 0.5; + }); + } + + /** + * Adds a CSS class to fade out current string + * @private + */ + }, { + key: 'initFadeOut', + value: function initFadeOut() { + var _this5 = this; + + this.el.className += ' ' + this.fadeOutClass; + if (this.cursor) this.cursor.className += ' ' + this.fadeOutClass; + return setTimeout(function () { + _this5.arrayPos++; + _this5.replaceText(''); + + // Resets current string if end of loop reached + if (_this5.strings.length > _this5.arrayPos) { + _this5.typewrite(_this5.strings[_this5.sequence[_this5.arrayPos]], 0); + } else { + _this5.typewrite(_this5.strings[0], 0); + _this5.arrayPos = 0; + } + }, this.fadeOutDelay); + } + + /** + * Replaces current text in the HTML element + * depending on element type + * @param {string} str + * @private + */ + }, { + key: 'replaceText', + value: function replaceText(str) { + if (this.attr) { + this.el.setAttribute(this.attr, str); + } else { + if (this.isInput) { + this.el.value = str; + } else if (this.contentType === 'html') { + this.el.innerHTML = str; + } else { + this.el.textContent = str; + } + } + } + + /** + * If using input elements, bind focus in order to + * start and stop the animation + * @private + */ + }, { + key: 'bindFocusEvents', + value: function bindFocusEvents() { + var _this6 = this; + + if (!this.isInput) return; + this.el.addEventListener('focus', function (e) { + _this6.stop(); + }); + this.el.addEventListener('blur', function (e) { + if (_this6.el.value && _this6.el.value.length !== 0) { + return; + } + _this6.start(); + }); + } + + /** + * On init, insert the cursor element + * @private + */ + }, { + key: 'insertCursor', + value: function insertCursor() { + if (!this.showCursor) return; + if (this.cursor) return; + this.cursor = document.createElement('span'); + this.cursor.className = 'typed-cursor'; + this.cursor.innerHTML = this.cursorChar; + this.el.parentNode && this.el.parentNode.insertBefore(this.cursor, this.el.nextSibling); + } + }]); + + return Typed; + })(); + + exports['default'] = Typed; + module.exports = exports['default']; + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + var _defaultsJs = __webpack_require__(2); + + var _defaultsJs2 = _interopRequireDefault(_defaultsJs); + + /** + * Initialize the Typed object + */ + + var Initializer = (function () { + function Initializer() { + _classCallCheck(this, Initializer); + } + + _createClass(Initializer, [{ + key: 'load', + + /** + * Load up defaults & options on the Typed instance + * @param {Typed} self instance of Typed + * @param {object} options options object + * @param {string} elementId HTML element ID _OR_ instance of HTML element + * @private + */ + + value: function load(self, options, elementId) { + // chosen element to manipulate text + if (typeof elementId === 'string') { + self.el = document.querySelector(elementId); + } else { + self.el = elementId; + } + + self.options = _extends({}, _defaultsJs2['default'], options); + + // attribute to type into + self.isInput = self.el.tagName.toLowerCase() === 'input'; + self.attr = self.options.attr; + self.bindInputFocusEvents = self.options.bindInputFocusEvents; + + // show cursor + self.showCursor = self.isInput ? false : self.options.showCursor; + + // custom cursor + self.cursorChar = self.options.cursorChar; + + // Is the cursor blinking + self.cursorBlinking = true; + + // text content of element + self.elContent = self.attr ? self.el.getAttribute(self.attr) : self.el.textContent; + + // html or plain text + self.contentType = self.options.contentType; + + // typing speed + self.typeSpeed = self.options.typeSpeed; + + // add a delay before typing starts + self.startDelay = self.options.startDelay; + + // backspacing speed + self.backSpeed = self.options.backSpeed; + + // only backspace what doesn't match the previous string + self.smartBackspace = self.options.smartBackspace; + + // amount of time to wait before backspacing + self.backDelay = self.options.backDelay; + + // Fade out instead of backspace + self.fadeOut = self.options.fadeOut; + self.fadeOutClass = self.options.fadeOutClass; + self.fadeOutDelay = self.options.fadeOutDelay; + + // variable to check whether typing is currently paused + self.isPaused = false; + + // input strings of text + self.strings = self.options.strings.map(function (s) { + return s.trim(); + }); + + // div containing strings + if (typeof self.options.stringsElement === 'string') { + self.stringsElement = document.querySelector(self.options.stringsElement); + } else { + self.stringsElement = self.options.stringsElement; + } + + if (self.stringsElement) { + self.strings = []; + self.stringsElement.style.display = 'none'; + var strings = Array.prototype.slice.apply(self.stringsElement.children); + var stringsLength = strings.length; + + if (stringsLength) { + for (var i = 0; i < stringsLength; i += 1) { + var stringEl = strings[i]; + self.strings.push(stringEl.innerHTML.trim()); + } + } + } + + // character number position of current string + self.strPos = 0; + + // current array position + self.arrayPos = 0; + + // index of string to stop backspacing on + self.stopNum = 0; + + // Looping logic + self.loop = self.options.loop; + self.loopCount = self.options.loopCount; + self.curLoop = 0; + + // shuffle the strings + self.shuffle = self.options.shuffle; + // the order of strings + self.sequence = []; + + self.pause = { + status: false, + typewrite: true, + curString: '', + curStrPos: 0 + }; + + // When the typing is complete (when not looped) + self.typingComplete = false; + + // Set the order in which the strings are typed + for (var i in self.strings) { + self.sequence[i] = i; + } + + // If there is some text in the element + self.currentElContent = this.getCurrentElContent(self); + + self.autoInsertCss = self.options.autoInsertCss; + + this.appendAnimationCss(self); + } + }, { + key: 'getCurrentElContent', + value: function getCurrentElContent(self) { + var elContent = ''; + if (self.attr) { + elContent = self.el.getAttribute(self.attr); + } else if (self.isInput) { + elContent = self.el.value; + } else if (self.contentType === 'html') { + elContent = self.el.innerHTML; + } else { + elContent = self.el.textContent; + } + return elContent; + } + }, { + key: 'appendAnimationCss', + value: function appendAnimationCss(self) { + var cssDataName = 'data-typed-js-css'; + if (!self.autoInsertCss) { + return; + } + if (!self.showCursor && !self.fadeOut) { + return; + } + if (document.querySelector('[' + cssDataName + ']')) { + return; + } + + var css = document.createElement('style'); + css.type = 'text/css'; + css.setAttribute(cssDataName, true); + + var innerCss = ''; + if (self.showCursor) { + innerCss += '\n .typed-cursor{\n opacity: 1;\n }\n .typed-cursor.typed-cursor--blink{\n animation: typedjsBlink 0.7s infinite;\n -webkit-animation: typedjsBlink 0.7s infinite;\n animation: typedjsBlink 0.7s infinite;\n }\n @keyframes typedjsBlink{\n 50% { opacity: 0.0; }\n }\n @-webkit-keyframes typedjsBlink{\n 0% { opacity: 1; }\n 50% { opacity: 0.0; }\n 100% { opacity: 1; }\n }\n '; + } + if (self.fadeOut) { + innerCss += '\n .typed-fade-out{\n opacity: 0;\n transition: opacity .25s;\n }\n .typed-cursor.typed-cursor--blink.typed-fade-out{\n -webkit-animation: 0;\n animation: 0;\n }\n '; + } + if (css.length === 0) { + return; + } + css.innerHTML = innerCss; + document.body.appendChild(css); + } + }]); + + return Initializer; + })(); + + exports['default'] = Initializer; + var initializer = new Initializer(); + exports.initializer = initializer; + +/***/ }), +/* 2 */ +/***/ (function(module, exports) { + + /** + * Defaults & options + * @returns {object} Typed defaults & options + * @public + */ + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + var defaults = { + /** + * @property {array} strings strings to be typed + * @property {string} stringsElement ID of element containing string children + */ + strings: ['These are the default values...', 'You know what you should do?', 'Use your own!', 'Have a great day!'], + stringsElement: null, + + /** + * @property {number} typeSpeed type speed in milliseconds + */ + typeSpeed: 0, + + /** + * @property {number} startDelay time before typing starts in milliseconds + */ + startDelay: 0, + + /** + * @property {number} backSpeed backspacing speed in milliseconds + */ + backSpeed: 0, + + /** + * @property {boolean} smartBackspace only backspace what doesn't match the previous string + */ + smartBackspace: true, + + /** + * @property {boolean} shuffle shuffle the strings + */ + shuffle: false, + + /** + * @property {number} backDelay time before backspacing in milliseconds + */ + backDelay: 700, + + /** + * @property {boolean} fadeOut Fade out instead of backspace + * @property {string} fadeOutClass css class for fade animation + * @property {boolean} fadeOutDelay Fade out delay in milliseconds + */ + fadeOut: false, + fadeOutClass: 'typed-fade-out', + fadeOutDelay: 500, + + /** + * @property {boolean} loop loop strings + * @property {number} loopCount amount of loops + */ + loop: false, + loopCount: Infinity, + + /** + * @property {boolean} showCursor show cursor + * @property {string} cursorChar character for cursor + * @property {boolean} autoInsertCss insert CSS for cursor and fadeOut into HTML + */ + showCursor: true, + cursorChar: '|', + autoInsertCss: true, + + /** + * @property {string} attr attribute for typing + * Ex: input placeholder, value, or just HTML text + */ + attr: null, + + /** + * @property {boolean} bindInputFocusEvents bind to focus and blur if el is text input + */ + bindInputFocusEvents: false, + + /** + * @property {string} contentType 'html' or 'null' for plaintext + */ + contentType: 'html', + + /** + * All typing is complete + * @param {Typed} self + */ + onComplete: function onComplete(self) {}, + + /** + * Before each string is typed + * @param {number} arrayPos + * @param {Typed} self + */ + preStringTyped: function preStringTyped(arrayPos, self) {}, + + /** + * After each string is typed + * @param {number} arrayPos + * @param {Typed} self + */ + onStringTyped: function onStringTyped(arrayPos, self) {}, + + /** + * During looping, after last string is typed + * @param {Typed} self + */ + onLastStringBackspaced: function onLastStringBackspaced(self) {}, + + /** + * Typing has been stopped + * @param {number} arrayPos + * @param {Typed} self + */ + onTypingPaused: function onTypingPaused(arrayPos, self) {}, + + /** + * Typing has been started after being stopped + * @param {number} arrayPos + * @param {Typed} self + */ + onTypingResumed: function onTypingResumed(arrayPos, self) {}, + + /** + * After reset + * @param {Typed} self + */ + onReset: function onReset(self) {}, + + /** + * After stop + * @param {number} arrayPos + * @param {Typed} self + */ + onStop: function onStop(arrayPos, self) {}, + + /** + * After start + * @param {number} arrayPos + * @param {Typed} self + */ + onStart: function onStart(arrayPos, self) {}, + + /** + * After destroy + * @param {Typed} self + */ + onDestroy: function onDestroy(self) {} + }; + + exports['default'] = defaults; + module.exports = exports['default']; + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + + + /** + * TODO: These methods can probably be combined somehow + * Parse HTML tags & HTML Characters + */ + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + var HTMLParser = (function () { + function HTMLParser() { + _classCallCheck(this, HTMLParser); + } + + _createClass(HTMLParser, [{ + key: 'typeHtmlChars', + + /** + * Type HTML tags & HTML Characters + * @param {string} curString Current string + * @param {number} curStrPos Position in current string + * @param {Typed} self instance of Typed + * @returns {number} a new string position + * @private + */ + + value: function typeHtmlChars(curString, curStrPos, self) { + if (self.contentType !== 'html') return curStrPos; + var curChar = curString.substr(curStrPos).charAt(0); + if (curChar === '<' || curChar === '&') { + var endTag = ''; + if (curChar === '<') { + endTag = '>'; + } else { + endTag = ';'; + } + while (curString.substr(curStrPos + 1).charAt(0) !== endTag) { + curStrPos++; + if (curStrPos + 1 > curString.length) { + break; + } + } + curStrPos++; + } + return curStrPos; + } + + /** + * Backspace HTML tags and HTML Characters + * @param {string} curString Current string + * @param {number} curStrPos Position in current string + * @param {Typed} self instance of Typed + * @returns {number} a new string position + * @private + */ + }, { + key: 'backSpaceHtmlChars', + value: function backSpaceHtmlChars(curString, curStrPos, self) { + if (self.contentType !== 'html') return curStrPos; + var curChar = curString.substr(curStrPos).charAt(0); + if (curChar === '>' || curChar === ';') { + var endTag = ''; + if (curChar === '>') { + endTag = '<'; + } else { + endTag = '&'; + } + while (curString.substr(curStrPos - 1).charAt(0) !== endTag) { + curStrPos--; + if (curStrPos < 0) { + break; + } + } + curStrPos--; + } + return curStrPos; + } + }]); + + return HTMLParser; + })(); + + exports['default'] = HTMLParser; + var htmlParser = new HTMLParser(); + exports.htmlParser = htmlParser; + +/***/ }) +/******/ ]) +}); +; \ No newline at end of file diff --git a/experiment/simulation/EE5/src/images/EE5 photoscape/part_1_calculatons.psxprj b/experiment/simulation/EE5/src/images/EE5 photoscape/part_1_calculatons.psxprj new file mode 100644 index 0000000..9a68ad8 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5 photoscape/part_1_calculatons.psxprj differ diff --git a/experiment/simulation/EE5/src/images/EE5 photoscape/part_1_components.psxprj b/experiment/simulation/EE5/src/images/EE5 photoscape/part_1_components.psxprj new file mode 100644 index 0000000..ea8ac02 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5 photoscape/part_1_components.psxprj differ diff --git a/experiment/simulation/EE5/src/images/EE5 photoscape/part_1_full.psxprj b/experiment/simulation/EE5/src/images/EE5 photoscape/part_1_full.psxprj new file mode 100644 index 0000000..825e841 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5 photoscape/part_1_full.psxprj differ diff --git a/experiment/simulation/EE5/src/images/EE5 photoscape/part_2_calculation.psxprj b/experiment/simulation/EE5/src/images/EE5 photoscape/part_2_calculation.psxprj new file mode 100644 index 0000000..5426e4d Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5 photoscape/part_2_calculation.psxprj differ diff --git a/experiment/simulation/EE5/src/images/EE5 photoscape/part_2_components.psxprj b/experiment/simulation/EE5/src/images/EE5 photoscape/part_2_components.psxprj new file mode 100644 index 0000000..a7fbf43 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5 photoscape/part_2_components.psxprj differ diff --git a/experiment/simulation/EE5/src/images/EE5 photoscape/part_2_components_full.psxprj.jpg b/experiment/simulation/EE5/src/images/EE5 photoscape/part_2_components_full.psxprj.jpg new file mode 100644 index 0000000..26d3409 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5 photoscape/part_2_components_full.psxprj.jpg differ diff --git a/experiment/simulation/EE5/src/images/EE5/arrow_black.png b/experiment/simulation/EE5/src/images/EE5/arrow_black.png new file mode 100644 index 0000000..163bb0d Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/arrow_black.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/btn_plot.png b/experiment/simulation/EE5/src/images/EE5/btn_plot.png new file mode 100644 index 0000000..43bbba7 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/btn_plot.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/btn_zoomed_in_plot.png b/experiment/simulation/EE5/src/images/EE5/btn_zoomed_in_plot.png new file mode 100644 index 0000000..16b6d6e Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/btn_zoomed_in_plot.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/graph_0_initial.png b/experiment/simulation/EE5/src/images/EE5/graph_0_initial.png new file mode 100644 index 0000000..8879ca4 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/graph_0_initial.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/graph_1_2500.png b/experiment/simulation/EE5/src/images/EE5/graph_1_2500.png new file mode 100644 index 0000000..f8dd33b Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/graph_1_2500.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/graph_2_750.png b/experiment/simulation/EE5/src/images/EE5/graph_2_750.png new file mode 100644 index 0000000..9865f3d Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/graph_2_750.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/graph_3_150.png b/experiment/simulation/EE5/src/images/EE5/graph_3_150.png new file mode 100644 index 0000000..caa0057 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/graph_3_150.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/graph_4_50.png b/experiment/simulation/EE5/src/images/EE5/graph_4_50.png new file mode 100644 index 0000000..56a9476 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/graph_4_50.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_1_cable_a2.png b/experiment/simulation/EE5/src/images/EE5/part_1_cable_a2.png new file mode 100644 index 0000000..044a3f4 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_1_cable_a2.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_1_cable_ac2.png b/experiment/simulation/EE5/src/images/EE5/part_1_cable_ac2.png new file mode 100644 index 0000000..be5af42 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_1_cable_ac2.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_1_cable_k.png b/experiment/simulation/EE5/src/images/EE5/part_1_cable_k.png new file mode 100644 index 0000000..a308fa0 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_1_cable_k.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_1_cable_k_ac1.png b/experiment/simulation/EE5/src/images/EE5/part_1_cable_k_ac1.png new file mode 100644 index 0000000..e975e6e Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_1_cable_k_ac1.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_1_cable_p.png b/experiment/simulation/EE5/src/images/EE5/part_1_cable_p.png new file mode 100644 index 0000000..b4324fa Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_1_cable_p.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_1_cable_p1.png b/experiment/simulation/EE5/src/images/EE5/part_1_cable_p1.png new file mode 100644 index 0000000..5a5addf Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_1_cable_p1.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_1_cable_r2.png b/experiment/simulation/EE5/src/images/EE5/part_1_cable_r2.png new file mode 100644 index 0000000..96ff920 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_1_cable_r2.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_1_cable_rg2.png b/experiment/simulation/EE5/src/images/EE5/part_1_cable_rg2.png new file mode 100644 index 0000000..ded0501 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_1_cable_rg2.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_1_cable_v1.png b/experiment/simulation/EE5/src/images/EE5/part_1_cable_v1.png new file mode 100644 index 0000000..607ec0f Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_1_cable_v1.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_1_cable_v2.png b/experiment/simulation/EE5/src/images/EE5/part_1_cable_v2.png new file mode 100644 index 0000000..8b1d4e3 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_1_cable_v2.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_1_calculations.png b/experiment/simulation/EE5/src/images/EE5/part_1_calculations.png new file mode 100644 index 0000000..bdc415b Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_1_calculations.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_1_components.png b/experiment/simulation/EE5/src/images/EE5/part_1_components.png new file mode 100644 index 0000000..a672976 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_1_components.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_1_instruction_box.png b/experiment/simulation/EE5/src/images/EE5/part_1_instruction_box.png new file mode 100644 index 0000000..ac8f7b9 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_1_instruction_box.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_1_nomenclature_box.png b/experiment/simulation/EE5/src/images/EE5/part_1_nomenclature_box.png new file mode 100644 index 0000000..2679816 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_1_nomenclature_box.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_1_procedure_box.png b/experiment/simulation/EE5/src/images/EE5/part_1_procedure_box.png new file mode 100644 index 0000000..d2a383b Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_1_procedure_box.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_2_cable_a2.png b/experiment/simulation/EE5/src/images/EE5/part_2_cable_a2.png new file mode 100644 index 0000000..2a568c4 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_2_cable_a2.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_2_cable_ac1.png b/experiment/simulation/EE5/src/images/EE5/part_2_cable_ac1.png new file mode 100644 index 0000000..25cdecc Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_2_cable_ac1.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_2_cable_cp.png b/experiment/simulation/EE5/src/images/EE5/part_2_cable_cp.png new file mode 100644 index 0000000..788a13c Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_2_cable_cp.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_2_cable_dvp.png b/experiment/simulation/EE5/src/images/EE5/part_2_cable_dvp.png new file mode 100644 index 0000000..6c47126 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_2_cable_dvp.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_2_cable_k.png b/experiment/simulation/EE5/src/images/EE5/part_2_cable_k.png new file mode 100644 index 0000000..e624d3a Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_2_cable_k.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_2_cable_k_n.png b/experiment/simulation/EE5/src/images/EE5/part_2_cable_k_n.png new file mode 100644 index 0000000..57ab659 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_2_cable_k_n.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_2_cable_p.png b/experiment/simulation/EE5/src/images/EE5/part_2_cable_p.png new file mode 100644 index 0000000..ea49e4b Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_2_cable_p.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_2_cable_p1.png b/experiment/simulation/EE5/src/images/EE5/part_2_cable_p1.png new file mode 100644 index 0000000..12b3654 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_2_cable_p1.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_2_cable_r2.png b/experiment/simulation/EE5/src/images/EE5/part_2_cable_r2.png new file mode 100644 index 0000000..8aef2fc Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_2_cable_r2.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_2_cable_rg2.png b/experiment/simulation/EE5/src/images/EE5/part_2_cable_rg2.png new file mode 100644 index 0000000..0cfe648 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_2_cable_rg2.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_2_cable_v1.png b/experiment/simulation/EE5/src/images/EE5/part_2_cable_v1.png new file mode 100644 index 0000000..7163acd Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_2_cable_v1.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_2_cable_v2.png b/experiment/simulation/EE5/src/images/EE5/part_2_cable_v2.png new file mode 100644 index 0000000..4dde93d Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_2_cable_v2.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_2_calculation.png b/experiment/simulation/EE5/src/images/EE5/part_2_calculation.png new file mode 100644 index 0000000..916e3ff Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_2_calculation.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_2_components.png b/experiment/simulation/EE5/src/images/EE5/part_2_components.png new file mode 100644 index 0000000..1e7ab5c Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_2_components.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_2_instruction_box.png b/experiment/simulation/EE5/src/images/EE5/part_2_instruction_box.png new file mode 100644 index 0000000..2b58f3c Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_2_instruction_box.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/part_2_procedure_box.png b/experiment/simulation/EE5/src/images/EE5/part_2_procedure_box.png new file mode 100644 index 0000000..a5ca1da Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/part_2_procedure_box.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/select_option_1.png b/experiment/simulation/EE5/src/images/EE5/select_option_1.png new file mode 100644 index 0000000..8e02c54 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/select_option_1.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/select_option_2.png b/experiment/simulation/EE5/src/images/EE5/select_option_2.png new file mode 100644 index 0000000..349189f Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/select_option_2.png differ diff --git a/experiment/simulation/EE5/src/images/EE5/select_option_full.png b/experiment/simulation/EE5/src/images/EE5/select_option_full.png new file mode 100644 index 0000000..f5f2b27 Binary files /dev/null and b/experiment/simulation/EE5/src/images/EE5/select_option_full.png differ diff --git a/experiment/simulation/EE5/src/images/box1.png b/experiment/simulation/EE5/src/images/box1.png new file mode 100644 index 0000000..9d11802 Binary files /dev/null and b/experiment/simulation/EE5/src/images/box1.png differ diff --git a/experiment/simulation/EE5/src/images/box2.png b/experiment/simulation/EE5/src/images/box2.png new file mode 100644 index 0000000..66d9f3d Binary files /dev/null and b/experiment/simulation/EE5/src/images/box2.png differ diff --git a/experiment/simulation/EE5/src/images/box3.png b/experiment/simulation/EE5/src/images/box3.png new file mode 100644 index 0000000..38c94c3 Binary files /dev/null and b/experiment/simulation/EE5/src/images/box3.png differ diff --git a/experiment/simulation/EE5/src/images/box4.png b/experiment/simulation/EE5/src/images/box4.png new file mode 100644 index 0000000..fb0d391 Binary files /dev/null and b/experiment/simulation/EE5/src/images/box4.png differ diff --git a/experiment/simulation/EE5/src/images/box5.png b/experiment/simulation/EE5/src/images/box5.png new file mode 100644 index 0000000..7dbbb83 Binary files /dev/null and b/experiment/simulation/EE5/src/images/box5.png differ diff --git a/experiment/simulation/EE5/src/images/box6.png b/experiment/simulation/EE5/src/images/box6.png new file mode 100644 index 0000000..ea92b72 Binary files /dev/null and b/experiment/simulation/EE5/src/images/box6.png differ diff --git a/experiment/simulation/EE5/src/images/box_img.png b/experiment/simulation/EE5/src/images/box_img.png new file mode 100644 index 0000000..4fa944a Binary files /dev/null and b/experiment/simulation/EE5/src/images/box_img.png differ diff --git a/experiment/simulation/EE5/src/images/btn_connections.png b/experiment/simulation/EE5/src/images/btn_connections.png new file mode 100644 index 0000000..cadcf8e Binary files /dev/null and b/experiment/simulation/EE5/src/images/btn_connections.png differ diff --git a/experiment/simulation/EE5/src/images/btn_connectons_completed.png b/experiment/simulation/EE5/src/images/btn_connectons_completed.png new file mode 100644 index 0000000..abecdff Binary files /dev/null and b/experiment/simulation/EE5/src/images/btn_connectons_completed.png differ diff --git a/experiment/simulation/EE5/src/images/btn_instructions.png b/experiment/simulation/EE5/src/images/btn_instructions.png new file mode 100644 index 0000000..fbf93e9 Binary files /dev/null and b/experiment/simulation/EE5/src/images/btn_instructions.png differ diff --git a/experiment/simulation/EE5/src/images/btn_nomenclature.png b/experiment/simulation/EE5/src/images/btn_nomenclature.png new file mode 100644 index 0000000..91422ca Binary files /dev/null and b/experiment/simulation/EE5/src/images/btn_nomenclature.png differ diff --git a/experiment/simulation/EE5/src/images/btn_plot.png b/experiment/simulation/EE5/src/images/btn_plot.png new file mode 100644 index 0000000..cf77ae7 Binary files /dev/null and b/experiment/simulation/EE5/src/images/btn_plot.png differ diff --git a/experiment/simulation/EE5/src/images/btn_procedure.png b/experiment/simulation/EE5/src/images/btn_procedure.png new file mode 100644 index 0000000..315de4d Binary files /dev/null and b/experiment/simulation/EE5/src/images/btn_procedure.png differ diff --git a/experiment/simulation/EE5/src/images/btn_reset.png b/experiment/simulation/EE5/src/images/btn_reset.png new file mode 100644 index 0000000..45dc15f Binary files /dev/null and b/experiment/simulation/EE5/src/images/btn_reset.png differ diff --git a/experiment/simulation/EE5/src/images/btn_start_experiment.png b/experiment/simulation/EE5/src/images/btn_start_experiment.png new file mode 100644 index 0000000..be6d519 Binary files /dev/null and b/experiment/simulation/EE5/src/images/btn_start_experiment.png differ diff --git a/experiment/simulation/EE5/src/images/circuit_full_2.png b/experiment/simulation/EE5/src/images/circuit_full_2.png new file mode 100644 index 0000000..cd461b3 Binary files /dev/null and b/experiment/simulation/EE5/src/images/circuit_full_2.png differ diff --git a/experiment/simulation/EE5/src/images/circuit_full_3.png b/experiment/simulation/EE5/src/images/circuit_full_3.png new file mode 100644 index 0000000..03005d0 Binary files /dev/null and b/experiment/simulation/EE5/src/images/circuit_full_3.png differ diff --git a/experiment/simulation/EE5/src/images/component_battery.png b/experiment/simulation/EE5/src/images/component_battery.png new file mode 100644 index 0000000..6fe4cee Binary files /dev/null and b/experiment/simulation/EE5/src/images/component_battery.png differ diff --git a/experiment/simulation/EE5/src/images/component_capacitor.png b/experiment/simulation/EE5/src/images/component_capacitor.png new file mode 100644 index 0000000..5509553 Binary files /dev/null and b/experiment/simulation/EE5/src/images/component_capacitor.png differ diff --git a/experiment/simulation/EE5/src/images/component_diode.png b/experiment/simulation/EE5/src/images/component_diode.png new file mode 100644 index 0000000..903cb79 Binary files /dev/null and b/experiment/simulation/EE5/src/images/component_diode.png differ diff --git a/experiment/simulation/EE5/src/images/component_inductor.png b/experiment/simulation/EE5/src/images/component_inductor.png new file mode 100644 index 0000000..197d4fb Binary files /dev/null and b/experiment/simulation/EE5/src/images/component_inductor.png differ diff --git a/experiment/simulation/EE5/src/images/component_mosfet.png b/experiment/simulation/EE5/src/images/component_mosfet.png new file mode 100644 index 0000000..44ab6bb Binary files /dev/null and b/experiment/simulation/EE5/src/images/component_mosfet.png differ diff --git a/experiment/simulation/EE5/src/images/component_register.png b/experiment/simulation/EE5/src/images/component_register.png new file mode 100644 index 0000000..abfc8c2 Binary files /dev/null and b/experiment/simulation/EE5/src/images/component_register.png differ diff --git a/experiment/simulation/EE5/src/images/final_src/new_select_option_1.png b/experiment/simulation/EE5/src/images/final_src/new_select_option_1.png new file mode 100644 index 0000000..9151bbb Binary files /dev/null and b/experiment/simulation/EE5/src/images/final_src/new_select_option_1.png differ diff --git a/experiment/simulation/EE5/src/images/final_src/new_select_option_2.png b/experiment/simulation/EE5/src/images/final_src/new_select_option_2.png new file mode 100644 index 0000000..927a192 Binary files /dev/null and b/experiment/simulation/EE5/src/images/final_src/new_select_option_2.png differ diff --git a/experiment/simulation/EE5/src/images/final_src/new_select_option_3.png b/experiment/simulation/EE5/src/images/final_src/new_select_option_3.png new file mode 100644 index 0000000..50055ed Binary files /dev/null and b/experiment/simulation/EE5/src/images/final_src/new_select_option_3.png differ diff --git a/experiment/simulation/EE5/src/images/final_src/new_select_option_full.png b/experiment/simulation/EE5/src/images/final_src/new_select_option_full.png new file mode 100644 index 0000000..8d4d37d Binary files /dev/null and b/experiment/simulation/EE5/src/images/final_src/new_select_option_full.png differ diff --git a/experiment/simulation/EE5/src/images/formulas_component_stress.png b/experiment/simulation/EE5/src/images/formulas_component_stress.png new file mode 100644 index 0000000..5a1d148 Binary files /dev/null and b/experiment/simulation/EE5/src/images/formulas_component_stress.png differ diff --git a/experiment/simulation/EE5/src/images/formulas_efficiency.png b/experiment/simulation/EE5/src/images/formulas_efficiency.png new file mode 100644 index 0000000..c776c78 Binary files /dev/null and b/experiment/simulation/EE5/src/images/formulas_efficiency.png differ diff --git a/experiment/simulation/EE5/src/images/formulas_ideal.png b/experiment/simulation/EE5/src/images/formulas_ideal.png new file mode 100644 index 0000000..adbd8bc Binary files /dev/null and b/experiment/simulation/EE5/src/images/formulas_ideal.png differ diff --git a/experiment/simulation/EE5/src/images/formulas_nomenclautre.png b/experiment/simulation/EE5/src/images/formulas_nomenclautre.png new file mode 100644 index 0000000..affb964 Binary files /dev/null and b/experiment/simulation/EE5/src/images/formulas_nomenclautre.png differ diff --git a/experiment/simulation/EE5/src/images/formulas_non_ideal.png b/experiment/simulation/EE5/src/images/formulas_non_ideal.png new file mode 100644 index 0000000..a984e3d Binary files /dev/null and b/experiment/simulation/EE5/src/images/formulas_non_ideal.png differ diff --git a/experiment/simulation/EE5/src/images/formulas_procedure.png b/experiment/simulation/EE5/src/images/formulas_procedure.png new file mode 100644 index 0000000..62e92eb Binary files /dev/null and b/experiment/simulation/EE5/src/images/formulas_procedure.png differ diff --git a/experiment/simulation/EE5/src/images/formulas_universal.png b/experiment/simulation/EE5/src/images/formulas_universal.png new file mode 100644 index 0000000..40c4aec Binary files /dev/null and b/experiment/simulation/EE5/src/images/formulas_universal.png differ diff --git a/experiment/simulation/EE5/src/images/full_circuit.png b/experiment/simulation/EE5/src/images/full_circuit.png new file mode 100644 index 0000000..82a7322 Binary files /dev/null and b/experiment/simulation/EE5/src/images/full_circuit.png differ diff --git a/experiment/simulation/EE5/src/images/full_circuit2.png b/experiment/simulation/EE5/src/images/full_circuit2.png new file mode 100644 index 0000000..e546fb1 Binary files /dev/null and b/experiment/simulation/EE5/src/images/full_circuit2.png differ diff --git a/experiment/simulation/EE5/src/images/graph2_arrow.png b/experiment/simulation/EE5/src/images/graph2_arrow.png new file mode 100644 index 0000000..841a8b7 Binary files /dev/null and b/experiment/simulation/EE5/src/images/graph2_arrow.png differ diff --git a/experiment/simulation/EE5/src/images/method_1_cable_black_bottom.png b/experiment/simulation/EE5/src/images/method_1_cable_black_bottom.png new file mode 100644 index 0000000..f520a74 Binary files /dev/null and b/experiment/simulation/EE5/src/images/method_1_cable_black_bottom.png differ diff --git a/experiment/simulation/EE5/src/images/method_1_cable_black_top.png b/experiment/simulation/EE5/src/images/method_1_cable_black_top.png new file mode 100644 index 0000000..878ae2e Binary files /dev/null and b/experiment/simulation/EE5/src/images/method_1_cable_black_top.png differ diff --git a/experiment/simulation/EE5/src/images/method_1_cable_blue.png b/experiment/simulation/EE5/src/images/method_1_cable_blue.png new file mode 100644 index 0000000..892e6e4 Binary files /dev/null and b/experiment/simulation/EE5/src/images/method_1_cable_blue.png differ diff --git a/experiment/simulation/EE5/src/images/method_1_cable_green.png b/experiment/simulation/EE5/src/images/method_1_cable_green.png new file mode 100644 index 0000000..5f10fc9 Binary files /dev/null and b/experiment/simulation/EE5/src/images/method_1_cable_green.png differ diff --git a/experiment/simulation/EE5/src/images/method_1_cable_pink.png b/experiment/simulation/EE5/src/images/method_1_cable_pink.png new file mode 100644 index 0000000..4216909 Binary files /dev/null and b/experiment/simulation/EE5/src/images/method_1_cable_pink.png differ diff --git a/experiment/simulation/EE5/src/images/method_1_cable_purple.png b/experiment/simulation/EE5/src/images/method_1_cable_purple.png new file mode 100644 index 0000000..bdfefb4 Binary files /dev/null and b/experiment/simulation/EE5/src/images/method_1_cable_purple.png differ diff --git a/experiment/simulation/EE5/src/images/method_1_cable_red.png b/experiment/simulation/EE5/src/images/method_1_cable_red.png new file mode 100644 index 0000000..20ab6a0 Binary files /dev/null and b/experiment/simulation/EE5/src/images/method_1_cable_red.png differ diff --git a/experiment/simulation/EE5/src/images/method_1_cable_yellow.png b/experiment/simulation/EE5/src/images/method_1_cable_yellow.png new file mode 100644 index 0000000..0447460 Binary files /dev/null and b/experiment/simulation/EE5/src/images/method_1_cable_yellow.png differ diff --git a/experiment/simulation/EE5/src/images/method_2_cable_green.png b/experiment/simulation/EE5/src/images/method_2_cable_green.png new file mode 100644 index 0000000..fa3a8d2 Binary files /dev/null and b/experiment/simulation/EE5/src/images/method_2_cable_green.png differ diff --git a/experiment/simulation/EE5/src/images/method_2_cable_red.png b/experiment/simulation/EE5/src/images/method_2_cable_red.png new file mode 100644 index 0000000..ba1a5cb Binary files /dev/null and b/experiment/simulation/EE5/src/images/method_2_cable_red.png differ diff --git a/experiment/simulation/EE5/src/images/method_2_cable_yellow.png b/experiment/simulation/EE5/src/images/method_2_cable_yellow.png new file mode 100644 index 0000000..fcca8c1 Binary files /dev/null and b/experiment/simulation/EE5/src/images/method_2_cable_yellow.png differ diff --git a/experiment/simulation/EE5/src/images/new/btn_1.png b/experiment/simulation/EE5/src/images/new/btn_1.png new file mode 100644 index 0000000..427b2ff Binary files /dev/null and b/experiment/simulation/EE5/src/images/new/btn_1.png differ diff --git a/experiment/simulation/EE5/src/images/new/btn_2.png b/experiment/simulation/EE5/src/images/new/btn_2.png new file mode 100644 index 0000000..cc090cc Binary files /dev/null and b/experiment/simulation/EE5/src/images/new/btn_2.png differ diff --git a/experiment/simulation/EE5/src/images/new/btn_click.png b/experiment/simulation/EE5/src/images/new/btn_click.png new file mode 100644 index 0000000..21dabb4 Binary files /dev/null and b/experiment/simulation/EE5/src/images/new/btn_click.png differ diff --git a/experiment/simulation/EE5/src/images/new/circle.png b/experiment/simulation/EE5/src/images/new/circle.png new file mode 100644 index 0000000..b6ca4fa Binary files /dev/null and b/experiment/simulation/EE5/src/images/new/circle.png differ diff --git a/experiment/simulation/EE5/src/images/new/frame_1.png b/experiment/simulation/EE5/src/images/new/frame_1.png new file mode 100644 index 0000000..15db454 Binary files /dev/null and b/experiment/simulation/EE5/src/images/new/frame_1.png differ diff --git a/experiment/simulation/EE5/src/images/new/frame_2.png b/experiment/simulation/EE5/src/images/new/frame_2.png new file mode 100644 index 0000000..62e8ce1 Binary files /dev/null and b/experiment/simulation/EE5/src/images/new/frame_2.png differ diff --git a/experiment/simulation/EE5/src/images/new/frame_3.png b/experiment/simulation/EE5/src/images/new/frame_3.png new file mode 100644 index 0000000..d4824ec Binary files /dev/null and b/experiment/simulation/EE5/src/images/new/frame_3.png differ diff --git a/experiment/simulation/EE5/src/images/new/menu_page.png b/experiment/simulation/EE5/src/images/new/menu_page.png new file mode 100644 index 0000000..8165476 Binary files /dev/null and b/experiment/simulation/EE5/src/images/new/menu_page.png differ diff --git a/experiment/simulation/EE5/src/images/new/val_vgs.png b/experiment/simulation/EE5/src/images/new/val_vgs.png new file mode 100644 index 0000000..c5b32a4 Binary files /dev/null and b/experiment/simulation/EE5/src/images/new/val_vgs.png differ diff --git a/experiment/simulation/EE5/src/images/new/val_vin.png b/experiment/simulation/EE5/src/images/new/val_vin.png new file mode 100644 index 0000000..f48093c Binary files /dev/null and b/experiment/simulation/EE5/src/images/new/val_vin.png differ diff --git a/experiment/simulation/EE5/src/images/niddle.png b/experiment/simulation/EE5/src/images/niddle.png new file mode 100644 index 0000000..ee0612b Binary files /dev/null and b/experiment/simulation/EE5/src/images/niddle.png differ diff --git a/experiment/simulation/EE5/src/images/part1_circuit.png b/experiment/simulation/EE5/src/images/part1_circuit.png new file mode 100644 index 0000000..13ebad3 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part1_circuit.png differ diff --git a/experiment/simulation/EE5/src/images/part1_circuit_ new.png b/experiment/simulation/EE5/src/images/part1_circuit_ new.png new file mode 100644 index 0000000..9c61499 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part1_circuit_ new.png differ diff --git a/experiment/simulation/EE5/src/images/part1_component_capacitor.png b/experiment/simulation/EE5/src/images/part1_component_capacitor.png new file mode 100644 index 0000000..499f8e4 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part1_component_capacitor.png differ diff --git a/experiment/simulation/EE5/src/images/part1_component_diode.png b/experiment/simulation/EE5/src/images/part1_component_diode.png new file mode 100644 index 0000000..e0cda66 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part1_component_diode.png differ diff --git a/experiment/simulation/EE5/src/images/part1_component_inductor.png b/experiment/simulation/EE5/src/images/part1_component_inductor.png new file mode 100644 index 0000000..3d2d353 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part1_component_inductor.png differ diff --git a/experiment/simulation/EE5/src/images/part1_component_mosfet.png b/experiment/simulation/EE5/src/images/part1_component_mosfet.png new file mode 100644 index 0000000..38a55b7 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part1_component_mosfet.png differ diff --git a/experiment/simulation/EE5/src/images/part1_component_resistance.png b/experiment/simulation/EE5/src/images/part1_component_resistance.png new file mode 100644 index 0000000..6ac2f0f Binary files /dev/null and b/experiment/simulation/EE5/src/images/part1_component_resistance.png differ diff --git a/experiment/simulation/EE5/src/images/part1_component_voltage.png b/experiment/simulation/EE5/src/images/part1_component_voltage.png new file mode 100644 index 0000000..010b1c9 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part1_component_voltage.png differ diff --git a/experiment/simulation/EE5/src/images/part1_crrct_circuit.png b/experiment/simulation/EE5/src/images/part1_crrct_circuit.png new file mode 100644 index 0000000..5322909 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part1_crrct_circuit.png differ diff --git a/experiment/simulation/EE5/src/images/part1_crrct_text.png b/experiment/simulation/EE5/src/images/part1_crrct_text.png new file mode 100644 index 0000000..b4c5049 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part1_crrct_text.png differ diff --git a/experiment/simulation/EE5/src/images/part1_incrrct_text.png b/experiment/simulation/EE5/src/images/part1_incrrct_text.png new file mode 100644 index 0000000..ac12e2c Binary files /dev/null and b/experiment/simulation/EE5/src/images/part1_incrrct_text.png differ diff --git a/experiment/simulation/EE5/src/images/part4_table_graph.png b/experiment/simulation/EE5/src/images/part4_table_graph.png new file mode 100644 index 0000000..17f73b9 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part4_table_graph.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_1_cable_a2.png b/experiment/simulation/EE5/src/images/part_1_1_cable_a2.png new file mode 100644 index 0000000..163a93c Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_1_cable_a2.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_1_cable_n2.png b/experiment/simulation/EE5/src/images/part_1_1_cable_n2.png new file mode 100644 index 0000000..35416b0 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_1_cable_n2.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_1_cable_p1.png b/experiment/simulation/EE5/src/images/part_1_1_cable_p1.png new file mode 100644 index 0000000..d8a2031 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_1_cable_p1.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_1_cable_p2.png b/experiment/simulation/EE5/src/images/part_1_1_cable_p2.png new file mode 100644 index 0000000..bac9408 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_1_cable_p2.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_1_cable_r2.png b/experiment/simulation/EE5/src/images/part_1_1_cable_r2.png new file mode 100644 index 0000000..3c52cf1 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_1_cable_r2.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_1_cable_s.png b/experiment/simulation/EE5/src/images/part_1_1_cable_s.png new file mode 100644 index 0000000..52954de Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_1_cable_s.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_1_cable_v1.png b/experiment/simulation/EE5/src/images/part_1_1_cable_v1.png new file mode 100644 index 0000000..7073894 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_1_cable_v1.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_1_cable_v2.png b/experiment/simulation/EE5/src/images/part_1_1_cable_v2.png new file mode 100644 index 0000000..b96745b Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_1_cable_v2.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_1_calculations.png b/experiment/simulation/EE5/src/images/part_1_1_calculations.png new file mode 100644 index 0000000..3b6b98b Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_1_calculations.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_2_cable_a1.png b/experiment/simulation/EE5/src/images/part_1_2_cable_a1.png new file mode 100644 index 0000000..5f06e85 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_2_cable_a1.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_2_cable_cp.png b/experiment/simulation/EE5/src/images/part_1_2_cable_cp.png new file mode 100644 index 0000000..3a2e2cb Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_2_cable_cp.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_2_cable_dvp.png b/experiment/simulation/EE5/src/images/part_1_2_cable_dvp.png new file mode 100644 index 0000000..b9f9bad Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_2_cable_dvp.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_2_cable_n2.png b/experiment/simulation/EE5/src/images/part_1_2_cable_n2.png new file mode 100644 index 0000000..a25ba69 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_2_cable_n2.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_2_cable_p1.png b/experiment/simulation/EE5/src/images/part_1_2_cable_p1.png new file mode 100644 index 0000000..dc90d3c Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_2_cable_p1.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_2_cable_p2.png b/experiment/simulation/EE5/src/images/part_1_2_cable_p2.png new file mode 100644 index 0000000..0d71b32 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_2_cable_p2.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_2_cable_r1.png b/experiment/simulation/EE5/src/images/part_1_2_cable_r1.png new file mode 100644 index 0000000..0e580c4 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_2_cable_r1.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_2_cable_s.png b/experiment/simulation/EE5/src/images/part_1_2_cable_s.png new file mode 100644 index 0000000..9d42133 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_2_cable_s.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_2_cable_v1.png b/experiment/simulation/EE5/src/images/part_1_2_cable_v1.png new file mode 100644 index 0000000..5eee81c Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_2_cable_v1.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_2_cable_v2.png b/experiment/simulation/EE5/src/images/part_1_2_cable_v2.png new file mode 100644 index 0000000..e2d0f7f Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_2_cable_v2.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_2_calculations.png b/experiment/simulation/EE5/src/images/part_1_2_calculations.png new file mode 100644 index 0000000..f72f2b5 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_2_calculations.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_components_1.png b/experiment/simulation/EE5/src/images/part_1_components_1.png new file mode 100644 index 0000000..b9321c3 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_components_1.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_components_2.png b/experiment/simulation/EE5/src/images/part_1_components_2.png new file mode 100644 index 0000000..a798154 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_components_2.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_incomplete_connection.png b/experiment/simulation/EE5/src/images/part_1_incomplete_connection.png new file mode 100644 index 0000000..168284a Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_incomplete_connection.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_instructions_box.png b/experiment/simulation/EE5/src/images/part_1_instructions_box.png new file mode 100644 index 0000000..7475c89 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_instructions_box.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_procedure_box.png b/experiment/simulation/EE5/src/images/part_1_procedure_box.png new file mode 100644 index 0000000..49e5e3c Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_procedure_box.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_procedure_box_2.png b/experiment/simulation/EE5/src/images/part_1_procedure_box_2.png new file mode 100644 index 0000000..529d6ca Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_procedure_box_2.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_select_option_1_1.png b/experiment/simulation/EE5/src/images/part_1_select_option_1_1.png new file mode 100644 index 0000000..9547f34 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_select_option_1_1.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_select_option_1_2.png b/experiment/simulation/EE5/src/images/part_1_select_option_1_2.png new file mode 100644 index 0000000..7b9c5ad Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_select_option_1_2.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_select_option_2.png b/experiment/simulation/EE5/src/images/part_1_select_option_2.png new file mode 100644 index 0000000..ea2d340 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_select_option_2.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_select_option_3.png b/experiment/simulation/EE5/src/images/part_1_select_option_3.png new file mode 100644 index 0000000..284755c Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_select_option_3.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_select_option_full.png b/experiment/simulation/EE5/src/images/part_1_select_option_full.png new file mode 100644 index 0000000..c69f8c3 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_select_option_full.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_slide_1.png b/experiment/simulation/EE5/src/images/part_1_slide_1.png new file mode 100644 index 0000000..75c48bf Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_slide_1.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_slide_2.png b/experiment/simulation/EE5/src/images/part_1_slide_2.png new file mode 100644 index 0000000..09312e2 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_slide_2.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_slide_3.png b/experiment/simulation/EE5/src/images/part_1_slide_3.png new file mode 100644 index 0000000..9500a5a Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_slide_3.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_slide_3_compo_1_off.png b/experiment/simulation/EE5/src/images/part_1_slide_3_compo_1_off.png new file mode 100644 index 0000000..2720f35 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_slide_3_compo_1_off.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_slide_3_compo_1_on.png b/experiment/simulation/EE5/src/images/part_1_slide_3_compo_1_on.png new file mode 100644 index 0000000..58021b9 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_slide_3_compo_1_on.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_slide_3_compo_1_text.png b/experiment/simulation/EE5/src/images/part_1_slide_3_compo_1_text.png new file mode 100644 index 0000000..214e894 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_slide_3_compo_1_text.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_slide_3_compo_2_off.png b/experiment/simulation/EE5/src/images/part_1_slide_3_compo_2_off.png new file mode 100644 index 0000000..6d4ae66 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_slide_3_compo_2_off.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_slide_3_compo_2_on.png b/experiment/simulation/EE5/src/images/part_1_slide_3_compo_2_on.png new file mode 100644 index 0000000..4b2c012 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_slide_3_compo_2_on.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_slide_3_compo_2_text.png b/experiment/simulation/EE5/src/images/part_1_slide_3_compo_2_text.png new file mode 100644 index 0000000..4ae8cd1 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_slide_3_compo_2_text.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_slide_4.png b/experiment/simulation/EE5/src/images/part_1_slide_4.png new file mode 100644 index 0000000..e858a54 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_slide_4.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_text_for_crrct.png b/experiment/simulation/EE5/src/images/part_1_text_for_crrct.png new file mode 100644 index 0000000..5c48952 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_text_for_crrct.png differ diff --git a/experiment/simulation/EE5/src/images/part_1_text_for_wrong.png b/experiment/simulation/EE5/src/images/part_1_text_for_wrong.png new file mode 100644 index 0000000..5731168 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_1_text_for_wrong.png differ diff --git a/experiment/simulation/EE5/src/images/part_2_calculation_components.png b/experiment/simulation/EE5/src/images/part_2_calculation_components.png new file mode 100644 index 0000000..9b69e8a Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_2_calculation_components.png differ diff --git a/experiment/simulation/EE5/src/images/part_2_circuit.png b/experiment/simulation/EE5/src/images/part_2_circuit.png new file mode 100644 index 0000000..22dab95 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_2_circuit.png differ diff --git a/experiment/simulation/EE5/src/images/part_2_conncection_cable_a2.png b/experiment/simulation/EE5/src/images/part_2_conncection_cable_a2.png new file mode 100644 index 0000000..0daaeaf Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_2_conncection_cable_a2.png differ diff --git a/experiment/simulation/EE5/src/images/part_2_conncection_cable_n2.png b/experiment/simulation/EE5/src/images/part_2_conncection_cable_n2.png new file mode 100644 index 0000000..2a2b942 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_2_conncection_cable_n2.png differ diff --git a/experiment/simulation/EE5/src/images/part_2_conncection_cable_p1.png b/experiment/simulation/EE5/src/images/part_2_conncection_cable_p1.png new file mode 100644 index 0000000..7abde0a Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_2_conncection_cable_p1.png differ diff --git a/experiment/simulation/EE5/src/images/part_2_conncection_cable_p2.png b/experiment/simulation/EE5/src/images/part_2_conncection_cable_p2.png new file mode 100644 index 0000000..0167ddf Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_2_conncection_cable_p2.png differ diff --git a/experiment/simulation/EE5/src/images/part_2_conncection_cable_r2.png b/experiment/simulation/EE5/src/images/part_2_conncection_cable_r2.png new file mode 100644 index 0000000..5340155 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_2_conncection_cable_r2.png differ diff --git a/experiment/simulation/EE5/src/images/part_2_conncection_cable_s.png b/experiment/simulation/EE5/src/images/part_2_conncection_cable_s.png new file mode 100644 index 0000000..f43f54e Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_2_conncection_cable_s.png differ diff --git a/experiment/simulation/EE5/src/images/part_2_conncection_cable_v1.png b/experiment/simulation/EE5/src/images/part_2_conncection_cable_v1.png new file mode 100644 index 0000000..26f9d6d Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_2_conncection_cable_v1.png differ diff --git a/experiment/simulation/EE5/src/images/part_2_conncection_cable_v2.png b/experiment/simulation/EE5/src/images/part_2_conncection_cable_v2.png new file mode 100644 index 0000000..adb945f Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_2_conncection_cable_v2.png differ diff --git a/experiment/simulation/EE5/src/images/part_2_conncection_cable_vg1.png b/experiment/simulation/EE5/src/images/part_2_conncection_cable_vg1.png new file mode 100644 index 0000000..94675f8 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_2_conncection_cable_vg1.png differ diff --git a/experiment/simulation/EE5/src/images/part_2_conncection_cable_vg2.png b/experiment/simulation/EE5/src/images/part_2_conncection_cable_vg2.png new file mode 100644 index 0000000..ebfa0a8 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_2_conncection_cable_vg2.png differ diff --git a/experiment/simulation/EE5/src/images/part_2_conncection_supply_1_green_button.png b/experiment/simulation/EE5/src/images/part_2_conncection_supply_1_green_button.png new file mode 100644 index 0000000..b7e9b04 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_2_conncection_supply_1_green_button.png differ diff --git a/experiment/simulation/EE5/src/images/part_2_conncection_supply_1_red_button.png b/experiment/simulation/EE5/src/images/part_2_conncection_supply_1_red_button.png new file mode 100644 index 0000000..7667726 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_2_conncection_supply_1_red_button.png differ diff --git a/experiment/simulation/EE5/src/images/part_2_conncection_supply_2_green_button.png b/experiment/simulation/EE5/src/images/part_2_conncection_supply_2_green_button.png new file mode 100644 index 0000000..607ee36 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_2_conncection_supply_2_green_button.png differ diff --git a/experiment/simulation/EE5/src/images/part_2_conncection_supply_2_red_button.png b/experiment/simulation/EE5/src/images/part_2_conncection_supply_2_red_button.png new file mode 100644 index 0000000..7667726 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_2_conncection_supply_2_red_button.png differ diff --git a/experiment/simulation/EE5/src/images/part_2_connections_components.png b/experiment/simulation/EE5/src/images/part_2_connections_components.png new file mode 100644 index 0000000..b6436e3 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_2_connections_components.png differ diff --git a/experiment/simulation/EE5/src/images/part_2_graph_1.png b/experiment/simulation/EE5/src/images/part_2_graph_1.png new file mode 100644 index 0000000..182163e Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_2_graph_1.png differ diff --git a/experiment/simulation/EE5/src/images/part_2_graph_2.png b/experiment/simulation/EE5/src/images/part_2_graph_2.png new file mode 100644 index 0000000..1ee0caa Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_2_graph_2.png differ diff --git a/experiment/simulation/EE5/src/images/part_2_graph_3.png b/experiment/simulation/EE5/src/images/part_2_graph_3.png new file mode 100644 index 0000000..845d580 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_2_graph_3.png differ diff --git a/experiment/simulation/EE5/src/images/part_2_graph_empty.png b/experiment/simulation/EE5/src/images/part_2_graph_empty.png new file mode 100644 index 0000000..a5f0d6c Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_2_graph_empty.png differ diff --git a/experiment/simulation/EE5/src/images/part_3_components.png b/experiment/simulation/EE5/src/images/part_3_components.png new file mode 100644 index 0000000..f1f098d Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_3_components.png differ diff --git a/experiment/simulation/EE5/src/images/part_3_graph.png b/experiment/simulation/EE5/src/images/part_3_graph.png new file mode 100644 index 0000000..1409ef6 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_3_graph.png differ diff --git a/experiment/simulation/EE5/src/images/part_3_graph_arrow.png b/experiment/simulation/EE5/src/images/part_3_graph_arrow.png new file mode 100644 index 0000000..d56101d Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_3_graph_arrow.png differ diff --git a/experiment/simulation/EE5/src/images/part_3_off_button.png b/experiment/simulation/EE5/src/images/part_3_off_button.png new file mode 100644 index 0000000..b84e493 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_3_off_button.png differ diff --git a/experiment/simulation/EE5/src/images/part_3_option_1.png b/experiment/simulation/EE5/src/images/part_3_option_1.png new file mode 100644 index 0000000..99191c8 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_3_option_1.png differ diff --git a/experiment/simulation/EE5/src/images/part_3_option_2.png b/experiment/simulation/EE5/src/images/part_3_option_2.png new file mode 100644 index 0000000..51034f1 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_3_option_2.png differ diff --git a/experiment/simulation/EE5/src/images/part_3_option_3.png b/experiment/simulation/EE5/src/images/part_3_option_3.png new file mode 100644 index 0000000..8812c14 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_3_option_3.png differ diff --git a/experiment/simulation/EE5/src/images/part_3_option_4.png b/experiment/simulation/EE5/src/images/part_3_option_4.png new file mode 100644 index 0000000..a057dc6 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_3_option_4.png differ diff --git a/experiment/simulation/EE5/src/images/part_3_option_4_graph.png b/experiment/simulation/EE5/src/images/part_3_option_4_graph.png new file mode 100644 index 0000000..d9feb3c Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_3_option_4_graph.png differ diff --git a/experiment/simulation/EE5/src/images/part_3_option_5.png b/experiment/simulation/EE5/src/images/part_3_option_5.png new file mode 100644 index 0000000..864c1d8 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_3_option_5.png differ diff --git a/experiment/simulation/EE5/src/images/part_3_option_select.png b/experiment/simulation/EE5/src/images/part_3_option_select.png new file mode 100644 index 0000000..d9feb3c Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_3_option_select.png differ diff --git a/experiment/simulation/EE5/src/images/part_3_option_select_dummy.png b/experiment/simulation/EE5/src/images/part_3_option_select_dummy.png new file mode 100644 index 0000000..e661a61 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_3_option_select_dummy.png differ diff --git a/experiment/simulation/EE5/src/images/part_3_table_1.png b/experiment/simulation/EE5/src/images/part_3_table_1.png new file mode 100644 index 0000000..62fa932 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_3_table_1.png differ diff --git a/experiment/simulation/EE5/src/images/part_3_table_2.png b/experiment/simulation/EE5/src/images/part_3_table_2.png new file mode 100644 index 0000000..946562c Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_3_table_2.png differ diff --git a/experiment/simulation/EE5/src/images/part_3_table_3.png b/experiment/simulation/EE5/src/images/part_3_table_3.png new file mode 100644 index 0000000..fcd4a72 Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_3_table_3.png differ diff --git a/experiment/simulation/EE5/src/images/part_3_text.png b/experiment/simulation/EE5/src/images/part_3_text.png new file mode 100644 index 0000000..4b7ea1e Binary files /dev/null and b/experiment/simulation/EE5/src/images/part_3_text.png differ diff --git a/experiment/simulation/EE5/src/images/photoscape/exp-4 part1.psxprj b/experiment/simulation/EE5/src/images/photoscape/exp-4 part1.psxprj new file mode 100644 index 0000000..e11112d Binary files /dev/null and b/experiment/simulation/EE5/src/images/photoscape/exp-4 part1.psxprj differ diff --git a/experiment/simulation/EE5/src/images/photoscape/exp-4 part1_cmplt.psxprj b/experiment/simulation/EE5/src/images/photoscape/exp-4 part1_cmplt.psxprj new file mode 100644 index 0000000..b69baf2 Binary files /dev/null and b/experiment/simulation/EE5/src/images/photoscape/exp-4 part1_cmplt.psxprj differ diff --git a/experiment/simulation/EE5/src/images/photoscape/part1_2.psxprj b/experiment/simulation/EE5/src/images/photoscape/part1_2.psxprj new file mode 100644 index 0000000..777ae96 Binary files /dev/null and b/experiment/simulation/EE5/src/images/photoscape/part1_2.psxprj differ diff --git a/experiment/simulation/EE5/src/images/photoscape/part_2_calculation_components.psxprj b/experiment/simulation/EE5/src/images/photoscape/part_2_calculation_components.psxprj new file mode 100644 index 0000000..c8a3634 Binary files /dev/null and b/experiment/simulation/EE5/src/images/photoscape/part_2_calculation_components.psxprj differ diff --git a/experiment/simulation/EE5/src/images/photoscape/part_2_connections.psxprj b/experiment/simulation/EE5/src/images/photoscape/part_2_connections.psxprj new file mode 100644 index 0000000..050c00a Binary files /dev/null and b/experiment/simulation/EE5/src/images/photoscape/part_2_connections.psxprj differ diff --git a/experiment/simulation/EE5/src/images/popup_imgs/nomenclature.png b/experiment/simulation/EE5/src/images/popup_imgs/nomenclature.png new file mode 100644 index 0000000..8306ca7 Binary files /dev/null and b/experiment/simulation/EE5/src/images/popup_imgs/nomenclature.png differ diff --git a/experiment/simulation/EE5/src/images/record_btn.png b/experiment/simulation/EE5/src/images/record_btn.png new file mode 100644 index 0000000..4d621f0 Binary files /dev/null and b/experiment/simulation/EE5/src/images/record_btn.png differ diff --git a/experiment/simulation/EE5/src/images/right_tick.png b/experiment/simulation/EE5/src/images/right_tick.png new file mode 100644 index 0000000..9d81e00 Binary files /dev/null and b/experiment/simulation/EE5/src/images/right_tick.png differ diff --git a/experiment/simulation/EE5/src/images/run_btn.png b/experiment/simulation/EE5/src/images/run_btn.png new file mode 100644 index 0000000..5a52c7a Binary files /dev/null and b/experiment/simulation/EE5/src/images/run_btn.png differ diff --git a/experiment/simulation/EE5/src/images/slider_thumb.png b/experiment/simulation/EE5/src/images/slider_thumb.png new file mode 100644 index 0000000..d0ac3ee Binary files /dev/null and b/experiment/simulation/EE5/src/images/slider_thumb.png differ diff --git a/experiment/simulation/EE5/src/images/symbol_C.png b/experiment/simulation/EE5/src/images/symbol_C.png new file mode 100644 index 0000000..1d7b61d Binary files /dev/null and b/experiment/simulation/EE5/src/images/symbol_C.png differ diff --git a/experiment/simulation/EE5/src/images/symbol_D.png b/experiment/simulation/EE5/src/images/symbol_D.png new file mode 100644 index 0000000..1a487e6 Binary files /dev/null and b/experiment/simulation/EE5/src/images/symbol_D.png differ diff --git a/experiment/simulation/EE5/src/images/symbol_L.png b/experiment/simulation/EE5/src/images/symbol_L.png new file mode 100644 index 0000000..42554b8 Binary files /dev/null and b/experiment/simulation/EE5/src/images/symbol_L.png differ diff --git a/experiment/simulation/EE5/src/images/symbol_R.png b/experiment/simulation/EE5/src/images/symbol_R.png new file mode 100644 index 0000000..58ed73f Binary files /dev/null and b/experiment/simulation/EE5/src/images/symbol_R.png differ diff --git a/experiment/simulation/EE5/src/images/symbol_S.png b/experiment/simulation/EE5/src/images/symbol_S.png new file mode 100644 index 0000000..b2a72fa Binary files /dev/null and b/experiment/simulation/EE5/src/images/symbol_S.png differ diff --git a/experiment/simulation/EE5/src/images/symbol_vIn.png b/experiment/simulation/EE5/src/images/symbol_vIn.png new file mode 100644 index 0000000..267db56 Binary files /dev/null and b/experiment/simulation/EE5/src/images/symbol_vIn.png differ diff --git a/experiment/simulation/EE5/src/images/temp/box_img.png b/experiment/simulation/EE5/src/images/temp/box_img.png new file mode 100644 index 0000000..4fa944a Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/box_img.png differ diff --git a/experiment/simulation/EE5/src/images/temp/changed/part_2_graph_1.png b/experiment/simulation/EE5/src/images/temp/changed/part_2_graph_1.png new file mode 100644 index 0000000..fd17b41 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/changed/part_2_graph_1.png differ diff --git a/experiment/simulation/EE5/src/images/temp/changed/part_2_graph_2.png b/experiment/simulation/EE5/src/images/temp/changed/part_2_graph_2.png new file mode 100644 index 0000000..eb5ab51 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/changed/part_2_graph_2.png differ diff --git a/experiment/simulation/EE5/src/images/temp/changed/part_2_graph_3.png b/experiment/simulation/EE5/src/images/temp/changed/part_2_graph_3.png new file mode 100644 index 0000000..b460f09 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/changed/part_2_graph_3.png differ diff --git a/experiment/simulation/EE5/src/images/temp/changed/part_2_graph_empty.png b/experiment/simulation/EE5/src/images/temp/changed/part_2_graph_empty.png new file mode 100644 index 0000000..279a753 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/changed/part_2_graph_empty.png differ diff --git a/experiment/simulation/EE5/src/images/temp/circuit_full_2.png b/experiment/simulation/EE5/src/images/temp/circuit_full_2.png new file mode 100644 index 0000000..2cc1ed6 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/circuit_full_2.png differ diff --git a/experiment/simulation/EE5/src/images/temp/circuit_full_3.png b/experiment/simulation/EE5/src/images/temp/circuit_full_3.png new file mode 100644 index 0000000..91b7394 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/circuit_full_3.png differ diff --git a/experiment/simulation/EE5/src/images/temp/component_battery.png b/experiment/simulation/EE5/src/images/temp/component_battery.png new file mode 100644 index 0000000..4d20651 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/component_battery.png differ diff --git a/experiment/simulation/EE5/src/images/temp/component_capacitor.png b/experiment/simulation/EE5/src/images/temp/component_capacitor.png new file mode 100644 index 0000000..afdf5f9 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/component_capacitor.png differ diff --git a/experiment/simulation/EE5/src/images/temp/component_diode.png b/experiment/simulation/EE5/src/images/temp/component_diode.png new file mode 100644 index 0000000..856b82d Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/component_diode.png differ diff --git a/experiment/simulation/EE5/src/images/temp/component_inductor.png b/experiment/simulation/EE5/src/images/temp/component_inductor.png new file mode 100644 index 0000000..703bd4a Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/component_inductor.png differ diff --git a/experiment/simulation/EE5/src/images/temp/component_mosfet.png b/experiment/simulation/EE5/src/images/temp/component_mosfet.png new file mode 100644 index 0000000..920b733 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/component_mosfet.png differ diff --git a/experiment/simulation/EE5/src/images/temp/component_register.png b/experiment/simulation/EE5/src/images/temp/component_register.png new file mode 100644 index 0000000..abfc8c2 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/component_register.png differ diff --git a/experiment/simulation/EE5/src/images/temp/full_circuit.png b/experiment/simulation/EE5/src/images/temp/full_circuit.png new file mode 100644 index 0000000..82a7322 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/full_circuit.png differ diff --git a/experiment/simulation/EE5/src/images/temp/full_circuit2.png b/experiment/simulation/EE5/src/images/temp/full_circuit2.png new file mode 100644 index 0000000..e546fb1 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/full_circuit2.png differ diff --git a/experiment/simulation/EE5/src/images/temp/graph2_arrow.png b/experiment/simulation/EE5/src/images/temp/graph2_arrow.png new file mode 100644 index 0000000..841a8b7 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/graph2_arrow.png differ diff --git a/experiment/simulation/EE5/src/images/temp/part_2_circuit.png b/experiment/simulation/EE5/src/images/temp/part_2_circuit.png new file mode 100644 index 0000000..6095e94 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/part_2_circuit.png differ diff --git a/experiment/simulation/EE5/src/images/temp/part_2_graph_1.png b/experiment/simulation/EE5/src/images/temp/part_2_graph_1.png new file mode 100644 index 0000000..c9cc17a Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/part_2_graph_1.png differ diff --git a/experiment/simulation/EE5/src/images/temp/part_2_graph_2.png b/experiment/simulation/EE5/src/images/temp/part_2_graph_2.png new file mode 100644 index 0000000..1e83ca9 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/part_2_graph_2.png differ diff --git a/experiment/simulation/EE5/src/images/temp/part_2_graph_3.png b/experiment/simulation/EE5/src/images/temp/part_2_graph_3.png new file mode 100644 index 0000000..a4ec0bf Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/part_2_graph_3.png differ diff --git a/experiment/simulation/EE5/src/images/temp/part_2_graph_empty.png b/experiment/simulation/EE5/src/images/temp/part_2_graph_empty.png new file mode 100644 index 0000000..1540f5b Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/part_2_graph_empty.png differ diff --git a/experiment/simulation/EE5/src/images/temp/part_3_graph_arrow.png b/experiment/simulation/EE5/src/images/temp/part_3_graph_arrow.png new file mode 100644 index 0000000..d56101d Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/part_3_graph_arrow.png differ diff --git a/experiment/simulation/EE5/src/images/temp/part_3_option_1.png b/experiment/simulation/EE5/src/images/temp/part_3_option_1.png new file mode 100644 index 0000000..c5377ac Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/part_3_option_1.png differ diff --git a/experiment/simulation/EE5/src/images/temp/part_3_option_2.png b/experiment/simulation/EE5/src/images/temp/part_3_option_2.png new file mode 100644 index 0000000..506a3d7 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/part_3_option_2.png differ diff --git a/experiment/simulation/EE5/src/images/temp/part_3_option_3.png b/experiment/simulation/EE5/src/images/temp/part_3_option_3.png new file mode 100644 index 0000000..7477cf2 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/part_3_option_3.png differ diff --git a/experiment/simulation/EE5/src/images/temp/part_3_option_4.png b/experiment/simulation/EE5/src/images/temp/part_3_option_4.png new file mode 100644 index 0000000..d196120 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/part_3_option_4.png differ diff --git a/experiment/simulation/EE5/src/images/temp/part_3_option_4_graph.png b/experiment/simulation/EE5/src/images/temp/part_3_option_4_graph.png new file mode 100644 index 0000000..1a9c6b4 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/part_3_option_4_graph.png differ diff --git a/experiment/simulation/EE5/src/images/temp/record_btn.png b/experiment/simulation/EE5/src/images/temp/record_btn.png new file mode 100644 index 0000000..4d621f0 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/record_btn.png differ diff --git a/experiment/simulation/EE5/src/images/temp/right_tick.png b/experiment/simulation/EE5/src/images/temp/right_tick.png new file mode 100644 index 0000000..9d81e00 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/right_tick.png differ diff --git a/experiment/simulation/EE5/src/images/temp/run_btn.png b/experiment/simulation/EE5/src/images/temp/run_btn.png new file mode 100644 index 0000000..5a52c7a Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/run_btn.png differ diff --git a/experiment/simulation/EE5/src/images/temp/temp23/formulas_component_stress.png b/experiment/simulation/EE5/src/images/temp/temp23/formulas_component_stress.png new file mode 100644 index 0000000..5a1d148 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/temp23/formulas_component_stress.png differ diff --git a/experiment/simulation/EE5/src/images/temp/temp23/formulas_efficiency.png b/experiment/simulation/EE5/src/images/temp/temp23/formulas_efficiency.png new file mode 100644 index 0000000..c776c78 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/temp23/formulas_efficiency.png differ diff --git a/experiment/simulation/EE5/src/images/temp/temp23/formulas_ideal.png b/experiment/simulation/EE5/src/images/temp/temp23/formulas_ideal.png new file mode 100644 index 0000000..adbd8bc Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/temp23/formulas_ideal.png differ diff --git a/experiment/simulation/EE5/src/images/temp/temp23/formulas_nomenclautre.png b/experiment/simulation/EE5/src/images/temp/temp23/formulas_nomenclautre.png new file mode 100644 index 0000000..affb964 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/temp23/formulas_nomenclautre.png differ diff --git a/experiment/simulation/EE5/src/images/temp/temp23/formulas_non_ideal.png b/experiment/simulation/EE5/src/images/temp/temp23/formulas_non_ideal.png new file mode 100644 index 0000000..a984e3d Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/temp23/formulas_non_ideal.png differ diff --git a/experiment/simulation/EE5/src/images/temp/temp23/formulas_procedure.png b/experiment/simulation/EE5/src/images/temp/temp23/formulas_procedure.png new file mode 100644 index 0000000..62e92eb Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/temp23/formulas_procedure.png differ diff --git a/experiment/simulation/EE5/src/images/temp/temp23/formulas_universal.png b/experiment/simulation/EE5/src/images/temp/temp23/formulas_universal.png new file mode 100644 index 0000000..40c4aec Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/temp23/formulas_universal.png differ diff --git a/experiment/simulation/EE5/src/images/temp/temp23/graph2_arrow.png b/experiment/simulation/EE5/src/images/temp/temp23/graph2_arrow.png new file mode 100644 index 0000000..841a8b7 Binary files /dev/null and b/experiment/simulation/EE5/src/images/temp/temp23/graph2_arrow.png differ diff --git a/experiment/simulation/EE5/src/images/template_imgs/arrow.png b/experiment/simulation/EE5/src/images/template_imgs/arrow.png new file mode 100644 index 0000000..6b13356 Binary files /dev/null and b/experiment/simulation/EE5/src/images/template_imgs/arrow.png differ diff --git a/experiment/simulation/EE5/src/images/template_imgs/blinkArrow.webp b/experiment/simulation/EE5/src/images/template_imgs/blinkArrow.webp new file mode 100644 index 0000000..db974c1 Binary files /dev/null and b/experiment/simulation/EE5/src/images/template_imgs/blinkArrow.webp differ diff --git a/experiment/simulation/EE5/src/images/template_imgs/blinkArrowRed.png b/experiment/simulation/EE5/src/images/template_imgs/blinkArrowRed.png new file mode 100644 index 0000000..afb6427 Binary files /dev/null and b/experiment/simulation/EE5/src/images/template_imgs/blinkArrowRed.png differ diff --git a/experiment/simulation/EE5/src/images/template_imgs/iit-delhi-logo.png b/experiment/simulation/EE5/src/images/template_imgs/iit-delhi-logo.png new file mode 100644 index 0000000..0806e3e Binary files /dev/null and b/experiment/simulation/EE5/src/images/template_imgs/iit-delhi-logo.png differ diff --git a/experiment/simulation/EE5/src/images/template_imgs/laerrow.png b/experiment/simulation/EE5/src/images/template_imgs/laerrow.png new file mode 100644 index 0000000..9bd9bea Binary files /dev/null and b/experiment/simulation/EE5/src/images/template_imgs/laerrow.png differ diff --git a/experiment/simulation/EE5/src/images/template_imgs/laerrow2.png b/experiment/simulation/EE5/src/images/template_imgs/laerrow2.png new file mode 100644 index 0000000..d69fb87 Binary files /dev/null and b/experiment/simulation/EE5/src/images/template_imgs/laerrow2.png differ diff --git a/experiment/simulation/EE5/src/images/template_imgs/logo.png b/experiment/simulation/EE5/src/images/template_imgs/logo.png new file mode 100644 index 0000000..ec94212 Binary files /dev/null and b/experiment/simulation/EE5/src/images/template_imgs/logo.png differ diff --git a/experiment/simulation/EE5/src/images/template_imgs/man.png b/experiment/simulation/EE5/src/images/template_imgs/man.png new file mode 100644 index 0000000..e2b1673 Binary files /dev/null and b/experiment/simulation/EE5/src/images/template_imgs/man.png differ diff --git a/experiment/simulation/EE5/src/images/template_imgs/measurearrow.png b/experiment/simulation/EE5/src/images/template_imgs/measurearrow.png new file mode 100644 index 0000000..cbd8709 Binary files /dev/null and b/experiment/simulation/EE5/src/images/template_imgs/measurearrow.png differ diff --git a/experiment/simulation/EE5/src/images/template_imgs/measurearrow2.png b/experiment/simulation/EE5/src/images/template_imgs/measurearrow2.png new file mode 100644 index 0000000..cbd8709 Binary files /dev/null and b/experiment/simulation/EE5/src/images/template_imgs/measurearrow2.png differ diff --git a/experiment/simulation/EE5/src/images/template_imgs/prof_image_kn_jha.jpeg b/experiment/simulation/EE5/src/images/template_imgs/prof_image_kn_jha.jpeg new file mode 100644 index 0000000..a4c5860 Binary files /dev/null and b/experiment/simulation/EE5/src/images/template_imgs/prof_image_kn_jha.jpeg differ diff --git a/experiment/simulation/EE5/src/images/template_imgs/redsize.png b/experiment/simulation/EE5/src/images/template_imgs/redsize.png new file mode 100644 index 0000000..f6c8d4b Binary files /dev/null and b/experiment/simulation/EE5/src/images/template_imgs/redsize.png differ diff --git a/experiment/simulation/EE5/src/images/template_imgs/restart_btn.png b/experiment/simulation/EE5/src/images/template_imgs/restart_btn.png new file mode 100644 index 0000000..ed885ad Binary files /dev/null and b/experiment/simulation/EE5/src/images/template_imgs/restart_btn.png differ diff --git a/experiment/simulation/EE5/src/images/template_imgs/speech_off_btn.png b/experiment/simulation/EE5/src/images/template_imgs/speech_off_btn.png new file mode 100644 index 0000000..3605745 Binary files /dev/null and b/experiment/simulation/EE5/src/images/template_imgs/speech_off_btn.png differ diff --git a/experiment/simulation/EE5/src/images/template_imgs/speech_on_btn.png b/experiment/simulation/EE5/src/images/template_imgs/speech_on_btn.png new file mode 100644 index 0000000..de93bb3 Binary files /dev/null and b/experiment/simulation/EE5/src/images/template_imgs/speech_on_btn.png differ diff --git a/experiment/simulation/EE5/src/images/template_imgs/talk_cloud.png b/experiment/simulation/EE5/src/images/template_imgs/talk_cloud.png new file mode 100644 index 0000000..15a36cd Binary files /dev/null and b/experiment/simulation/EE5/src/images/template_imgs/talk_cloud.png differ diff --git a/experiment/simulation/EE5/src/other/ce2.pdf b/experiment/simulation/EE5/src/other/ce2.pdf new file mode 100644 index 0000000..440c872 Binary files /dev/null and b/experiment/simulation/EE5/src/other/ce2.pdf differ diff --git a/experiment/simulation/EE5/temp2.txt b/experiment/simulation/EE5/temp2.txt new file mode 100644 index 0000000..ab91f33 --- /dev/null +++ b/experiment/simulation/EE5/temp2.txt @@ -0,0 +1,15 @@ +Static Data is not available for: + • PreTest and PostTest not given: + 1. Foundation formwork (PERI) + 2. Formwork for foundation + 3. Formwork for wall- simple and climbing formwork + 4. Formwork for column + 5. Formwork for beam and slab using HD Towers + 6. Beam forming formwork. + 7. Beam and slab using Flex System + 8. Column (PERI) + 9. Wall (PERI) + 10. Monolithic + + • Aim, theory, procedure and reference are not given: + 1. Monolithic \ No newline at end of file diff --git a/experiment/simulation/EE5/toolkit/btn_download.png b/experiment/simulation/EE5/toolkit/btn_download.png new file mode 100644 index 0000000..6873ade Binary files /dev/null and b/experiment/simulation/EE5/toolkit/btn_download.png differ diff --git a/experiment/simulation/EE5/toolkit/fix_styling.css b/experiment/simulation/EE5/toolkit/fix_styling.css new file mode 100644 index 0000000..b3dc4a7 --- /dev/null +++ b/experiment/simulation/EE5/toolkit/fix_styling.css @@ -0,0 +1,15 @@ +body{ + justify-content: unset; +} + +.right-box{ + margin-left: 0; +} + +.main-container{ + margin: auto; +} + +.right-container{ + width: unset; +} diff --git a/experiment/simulation/EE5/toolkit/main_spinner.css b/experiment/simulation/EE5/toolkit/main_spinner.css new file mode 100644 index 0000000..645e96e --- /dev/null +++ b/experiment/simulation/EE5/toolkit/main_spinner.css @@ -0,0 +1,173 @@ +:root { + --light-color: #c9bafc; + --mid-color: #9f91cc; + --dark-color: #3d246c; + --size: 30; + --trans: ease; + } + + .main-spinner { + display: none; + top: 50%; + left: 50%; + transform: translate(-50%,-63%); + width: calc(var(--size) * 1vmin); + height: calc(var(--size) * 1vmin); + position: fixed; + } + + .main-spinner:before { + content: ""; + background: var(--mid-color); + width: 50%; + height: 50%; + position: absolute; + left: 0%; + top: 0%; + transform-origin: right bottom; + animation: shadow 4s var(--trans) 0s infinite; + } + + .main-spinner:after { + content: ""; + background: var(--mid-color); + width: 33.33%; + height: 33.33%; + position: absolute; + left: 50%; + top: 16.66%; + transform-origin: left bottom; + animation: shadow 4s var(--trans) 1s infinite; + transform: scale(0); + z-index: -1; + } + + .main-spinner .loader { + width: calc(var(--size) * 0.5vmin); + height: calc(var(--size) * 0.5vmin); + background: var(--dark-color); + transform-origin: right bottom; + animation: outer 4s var(--trans) 0s infinite; + position: relative; + } + + .main-spinner .loader span { + width: 50%; + height: 50%; + display: block; + background: var(--light-color); + transform-origin: right bottom; + animation: inner 1s ease-in-out 0.5s infinite; + top: 50%; + left: 50%; + position: absolute; + } + + .main-spinner a { + position: absolute; + font-size: 1.5vmin; + text-shadow: 0 0px 0 #000; + bottom: 5vmin; + font-family: Arial, Helvetica, serif; + text-decoration: none; + background: #111; + color: #fff; + padding: 1.25vmin 1.5vmin; + text-transform: uppercase; + } + + .main-spinner a:hover { + background: #999; + color: #222; + text-shadow: -1px 0px 0 #fff8; + } + + .main-spinner a span { + color: #454545; + } + + .main-spinner .text{ + display: none; + left: 50%; + top: 50%; + transform: translate(-50%, -66%); + padding: 7px; + width: 700px; + position: relative; + text-align: center; + z-index: 10; + font-size: 18px; + } + + .main-spinner .text span{ + line-height: 1.4; + color: #500051; + padding: 0 5px; + border-radius: 6px; + background-color: #6b6b6b42; + /* font-style: italic; */ + font-weight: bold; + } + + @keyframes outer { + 0% { + transform: rotate(0deg) scale(1); + } + 12.5% { + transform: rotate(90deg) scale(1); + } + 25% { + transform: rotate(90deg) scale(0.75); + } + 37.5% { + transform: rotate(180deg) scale(0.75); + } + 50% { + transform: rotate(180deg) scale(0.5); + } + 62.5% { + transform: rotate(270deg) scale(0.5); + } + 75% { + transform: rotate(270deg) scale(0.25); + } + 87.5% { + transform: rotate(360deg) scale(0.25); + } + 100% { + transform: rotate(360deg) scale(1); + } + } + + @keyframes inner { + 50%, + 100% { + transform: rotate(360deg); + } + } + + @keyframes shadow { + 0%, + 8.25% { + transform: scale(0); + } + 16.5% { + transform: scale(1); + } + 49.5% { + transform: scale(0); + } + 50% { + transform: scale(0) rotate(180deg); + } + 50.5%, + 58.25% { + transform: scale(0) rotate(180deg); + } + 66.5% { + transform: scale(0.5) rotate(180deg); + } + 100% { + transform: scale(0) rotate(180deg); + } + } \ No newline at end of file diff --git a/experiment/simulation/EE5/toolkit/msg_download.png b/experiment/simulation/EE5/toolkit/msg_download.png new file mode 100644 index 0000000..fec5de6 Binary files /dev/null and b/experiment/simulation/EE5/toolkit/msg_download.png differ diff --git a/experiment/simulation/EE5/toolkit/setBlinkArrowYellow.png b/experiment/simulation/EE5/toolkit/setBlinkArrowYellow.png new file mode 100644 index 0000000..3715942 Binary files /dev/null and b/experiment/simulation/EE5/toolkit/setBlinkArrowYellow.png differ diff --git a/experiment/simulation/EE5/toolkit/toolkit.css b/experiment/simulation/EE5/toolkit/toolkit.css new file mode 100644 index 0000000..b70be09 --- /dev/null +++ b/experiment/simulation/EE5/toolkit/toolkit.css @@ -0,0 +1,150 @@ +/* ! Download Button CSS */ +/* print css */ +@media print { + * { + -webkit-print-color-adjust: exact !important; /* Chrome, Safari 6 – 15.3, Edge */ + color-adjust: exact !important; /* Firefox 48 – 96 */ + print-color-adjust: exact !important; /* Firefox 97+, Safari 15.4+ */ + } + body{ + background-color: white!important; + } + .main-container{ + scale: 1!important; + transform: none!important; + } + + #drawer, + .toolkit, + .progressbar, + .blinkArrow + .blinkArrowRed{ + display: none!important; + visibility: hidden; + } + .anime-header, .anime-footer{ + display: flex!important; + } + .main-window{ + border-radius: 10px; + } + @page { + size: landscape; + } +} + +body{ + /* height: 100vh; */ +} +/* ! Toolkit */ +.toolkit{ + width: 60px; + position: relative; + top: 34px; + background-color: #3d246c; + height: 604px; + /* border-right: 2px solid black; + border-top: 2px solid black; */ + border-top-right-radius: 10px; + border-bottom-right-radius: 10px; +} +.toolkit .btn-group{ + margin: 1px; + padding: 10px; + display: flex; + flex-direction: column; + justify-content: flex-end; + height: 100%; + gap: 10px; +} +.toolkit .btn{ + display: flex; + justify-content: center; + align-items: center; + width: 40px; + height: 40px; + padding: 7px; + margin: 0; +} +.toolkit .btn .title{ + position: absolute; + visibility: hidden; +} +.toolkit .btn-logo{ + height: 20px; + width: 20px; +} +.toolkit +/* for only mute btn */ +.toolkit .mute { + padding: 0; +} +.toolkit .mute img{ + width: 40px; + height: 40px; + padding: 10px; +} +.toolkit .msg-download{ + +} +/* .toolkit .btn:hover .title{ + visibility: visible; + position: relative; +} */ + +/* ! Adding border to containers */ +.main-window{ + border: none; + /* border-left: 2px solid black; + border-top: 2px solid black; + border-bottom: 2px solid black; */ + border-top-left-radius: 10px; + border-bottom-left-radius: 10px; + z-index: 10000; +} + +.anime-footer{ + background-color: #3d246c!important; +} +.toolkit{ + z-index: 9000; +} +.toolkit, .main-window{ + box-shadow: 0px 0px 20px -1px black; +} + +.border-right-radius{ + border-top-right-radius: 10px; + border-bottom-right-radius: 10px; +} +.toolkit .blinkArrowYellow{ + display: none; + height: 30px; + position: absolute; + bottom: 60px; + left: 12px; + rotate: 90deg; +} + +/* ! Universal CSS */ +*{ + user-select: none; +} + +img{ + user-drag: none; + -webkit-user-drag: none; + user-select: none; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; +} + +body{ + background-color: #f8f9fa; +} + +#drawer{ + background-color: #ffffff; +} + diff --git a/experiment/simulation/EE5/toolkit/toolkit.js b/experiment/simulation/EE5/toolkit/toolkit.js new file mode 100644 index 0000000..f9fd5f7 --- /dev/null +++ b/experiment/simulation/EE5/toolkit/toolkit.js @@ -0,0 +1,282 @@ +// Define the function +// to screenshot the div + +const Download = { + btnDownload: null, + btnMute: null, + isMobileUser: false, + isSpinnerVisible: false, + btnDownloadBlinkAnime: null, + isBtnDownloadClicked: false, + mainContainerHeight: 638, + spinnerTimeoutSeconds: 2000, + checkForStepEndIntervalId: null, + previousRealCurrentStep: null, + // 1 step aage + // removeDownloadFromTheseSteps: [], + addDownloadToTheseSteps: [4,5], + init() { + this.setOnClicks(); + this.showTookitForCurrentStep(); + this.setBtnDownloadBlink(); + this.checkForStepEnd(); + this.stopImageDrag(); + this.disableRightClick(); + this.setBtnMuteOnClick(); + this.detectMobileUser(); + this.detectZoomLevel() + // TODO UNCOMMENT + this.setHeightOfMainContainerAuto(); + }, + setOnClicks() { + this.btnDownload = document.querySelector(".btn-download-pdf"); + this.btnMute = document.querySelector(".btn-mute"); + + this.btnDownload.onclick = this.capture; + }, + capture() { + window.print(); + Download.setBlinkArrowYellow(-1) + }, + showTookitForCurrentStep() { + $(".toolkit").hide(); + + let intervalForCheck = null; + const checkForCurrentStepChange = () => { + // ! don't try to understand (this is working) + // * add download to these + if (this.addDownloadToTheseSteps.indexOf(Scenes.realCurrentStep) != -1) { + // clearInterval(intervalForCheck) + $(".toolkit").show("slow"); + $(".main-window").removeClass("border-right-radius"); + } else { + $(".toolkit").hide("slow"); + $(".main-window").addClass("border-right-radius"); + } + }; + + intervalForCheck = setInterval(() => { + checkForCurrentStepChange(); + }, 1000); + }, + checkForStepEnd() { + if(this.checkForStepEndIntervalId != null){ + return + } + + this.checkForStepEndIntervalId = setInterval(() => { + if(this.previousRealCurrentStep == Scenes.realCurrentStep){ + return + } + if ( + this.addDownloadToTheseSteps.indexOf(Scenes.realCurrentStep) != -1 && + !isRunning + ) { + // * For running it only one time + this.setBlinkArrowYellow(true, 12, 495).play(); + this.btnDownloadBlinkAnime.play(); + this.previousRealCurrentStep = Scenes.realCurrentStep + } + + }, 1000); + }, + playDownloadButtonAnime(){ + // ! for remoging check for step end + if(!this.checkForStepEndIntervalId){ + clearInterval(this.checkForStepEndIntervalId) + } + + // * For running it only one time + this.setBlinkArrowYellow(true, 12, 495).play(); + this.btnDownloadBlinkAnime.play(); + setTimeout(() => { + this.setBlinkArrowYellow(-1) + }, 4000); + }, + setBlinkArrowYellow( + isX = true, + left = null, + top = null, + height = 30, + width = null, + rotate = 0 + ) { + let blinkArrow = new Dom(".blinkArrowYellow") + .set(left, top, height, width) + .rotate(rotate) + .zIndex(10000); + if (isX === -1) { + blinkArrow.hide(); + return; + } + let x = 0, + y = 0; + if (isX) { + x = 20; + } else { + y = 20; + } + var blink = anime({ + targets: blinkArrow.item, + easing: "easeInOutQuad", + opacity: 1, + translateX: x, + translateY: y, + direction: "alternate", + loop: true, + autoplay: false, + duration: 300, + }); + + return blink; + }, + setBtnDownloadBlink() { + this.btnDownloadBlinkAnime = anime({ + targets: this.btnDownload, + autoplay: false, + scale: [1, 1.2], + backgroundColor: ["#ffdbc3", "#fff000"], + loop: 4, + duration: 1000, + direction: 'alternate', + complete(anim) { + anim.reset(); + }, + }); + }, + stopImageDrag() { + $("img").on("dragstart", function (event) { + event.preventDefault(); + }); + }, + disableRightClick() { + document.addEventListener("contextmenu", (event) => event.preventDefault()); + }, + setBtnMuteOnClick() { + const btn_mute_old_functionality = () => { + this.btnMute.onclick; + }; + this.btnMute.onclick = () => { + btn_mute_old_functionality(); + window.speechSynthesis.cancel(); + }; + }, + detectMobileUser() { + let ratio = window.innerWidth / window.innerHeight; + if (ratio <= 1) { + this.isMobileUser = true; + } + // alert(`h: ${window.innerHeight}\nw: ${window.innerWidth}`) + }, + // ! set main-container height according to display + setHeightOfMainContainerAuto() { + // ! for mobile resising using width + if (this.isMobileUser) { + return; + } + const windowInnerHeight = parseFloat(window.innerHeight); + const mainContainerHeight = this.mainContainerHeight + let scalePercent = windowInnerHeight / mainContainerHeight; + let translateYValue = + (windowInnerHeight - mainContainerHeight) / 2 / scalePercent; + + // ! scale maxed up to 2x + if(scalePercent > 2){ + scalePercent = 2 + translateYValue = 160.4 + } + + // alert(scalePercent) + document.querySelector( + ".main-container" + ).style.transform = `scale(${scalePercent}) translateY(${translateYValue}px)`; + }, + toggleSpinner() { + $(".main-spinner").show(); + $(".main-container").hide(); + + setTimeout(() => { + $(".main-container").show("slow"); + $(".main-spinner").hide("slow"); + }, this.spinnerTimeoutSeconds); + }, + detectZoomLevel() { + var screenCssPixelRatio = (window.outerWidth - 8) / window.innerWidth; + let zoomLevel = "" + if (screenCssPixelRatio >= 0.46 && screenCssPixelRatio <= 0.54) { + zoomLevel = "-4"; + } else if (screenCssPixelRatio <= 0.64) { + zoomLevel = "-3"; + } else if (screenCssPixelRatio <= 0.76) { + zoomLevel = "-2"; + } else if (screenCssPixelRatio <= 0.92) { + zoomLevel = "-1"; + } else if (screenCssPixelRatio <= 1.1) { + zoomLevel = "0"; + } else if (screenCssPixelRatio <= 1.32) { + zoomLevel = "1"; + } else if (screenCssPixelRatio <= 1.58) { + zoomLevel = "2"; + } else if (screenCssPixelRatio <= 1.9) { + zoomLevel = "3"; + } else if (screenCssPixelRatio <= 2.28) { + zoomLevel = "4"; + } else if (screenCssPixelRatio <= 2.7) { + zoomLevel = "5"; + } else { + zoomLevel = "unknown"; + } + //! if zoom not 100% just show message warning + if(zoomLevel != "0" && !this.isMobileUser){ + $(".main-spinner .text").show(); + this.spinnerTimeoutSeconds = 5000 + } + if(this.isMobileUser){ + $(".main-spinner .text").show(); + $(".main-spinner .text").html("For better user experience use
    🖥️ Desktop Site and"); + this.spinnerTimeoutSeconds = 5000 + } + // alert(zoomLevel) + }, +}; + +setTimeout(() => { + // $(".main-container").hide(); +}, 100); + +$(document).ready(function () { + // TODO uncomment + Download.init(); + // Download.toggleSpinner() + + window.onbeforeprint = () => { + Dom.setBlinkArrowRed(-1); + Dom.setBlinkArrow(-1); + }; +}); + +// * image converter +// capture() { +// let div = document.querySelector(".main-container"); + +// // Use the html2canvas +// // function to take a screenshot +// // and append it +// // to the output div +// html2canvas(div).then(function (canvas) { +// // document.getElementById("output").appendChild(canvas); + +// let image = canvas +// .toDataURL("image/png") +// .replace("image/png", "image/octet-stream"); +// console.log(canvas.toDataURL("image/png")) + +// // location.href = image + +// var a = document.createElement('a') +// a.href = image +// a.download = "Experiment.jpeg" + +// a.click() +// }); +// }, diff --git a/experiment/simulation/EE6/.vscode/settings.json b/experiment/simulation/EE6/.vscode/settings.json new file mode 100644 index 0000000..5b06ac3 --- /dev/null +++ b/experiment/simulation/EE6/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "liveServer.settings.port": 5506 +} \ No newline at end of file diff --git a/experiment/simulation/EE6/css/EE4_styling.css b/experiment/simulation/EE6/css/EE4_styling.css new file mode 100644 index 0000000..9a76a5e --- /dev/null +++ b/experiment/simulation/EE6/css/EE4_styling.css @@ -0,0 +1,92 @@ +.connections-box{ + border: solid 1px black; + display: flex; + width: 504px; + position: absolute; + z-index: 100; + } + .connections-box .btn-box span{ + padding: 5px 10px; + font-weight: bold; + font-size: 16px; + } + .connections-box .head{ + background-color: #ffc000; + width: 70px!important; + } + .connections-box .btn-box{ + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + padding: 0; + width: 44px; + border-radius: none; + cursor: pointer; + } + .connections-box .middle-border{ + border-bottom: 2px solid; + width: 502px; + top: 30px; + position: absolute; + } + + .part_2_connections_box{ + display: none; + } + + .part_1_1_connections_box{ + display: none; + width: auto; + } + .part_1_1_connections_box .middle-border{ + width: 422px; + } + + .part_1_2_connections_box{ + display: none; + } + + +/* Table style */ +.table{ + display: none; + position: absolute; + border: 1px solid black; + border-collapse: collapse; +} + +.table td, .table th { + height: 25px; + padding: 0 20px; + font-weight: bold; + text-align: center; + border: 1px solid black; +} + +.part_2_table th{ + background-color: #002060; + color: white; +} +.part_2_table th, +.part_2_table td{ + height: 23.5px!important; +} + +/* part3 table */ +.part3_table_two{ + width: 447px; +} + +.part3_table_two th, +.part3_table_two td +{ + width: 74px!important; + font-size: 13px; + padding: 0!important; +} + +.part3_table_two th{ + font-size: 15px!important; + height: 15px!important; +} diff --git a/experiment/simulation/EE6/css/certificate.css b/experiment/simulation/EE6/css/certificate.css new file mode 100644 index 0000000..6fbf347 --- /dev/null +++ b/experiment/simulation/EE6/css/certificate.css @@ -0,0 +1,72 @@ +@import url("https://fonts.googleapis.com/css?family=Open+Sans|Pinyon+Script|Rochester|Homemade+Apple"); + +.certificate { + position: absolute; + box-shadow: inset 0px 0px 20px 12px #3d246c; + min-width: 800px; + min-height: 400px; + border: 14px solid #3d246c; + flex-direction: column; + display: none; + padding-top: 35px; +} + +.certificate .header { + transform: translateY(-25px); + display: flex; + align-items: center; + flex-direction: column; +} + +.certificate .student-detail { + display: flex; + flex-direction: column; + gap: 5px; + align-items: center; +} + +.cursive { + font-size: 1.8rem; + font-family: "Pinyon Script", cursive !important; + font-family: "Rochester", cursive !important; + font-style: italic; + /* font-family: "Homemade Apple", cursive !important; */ +} + +.certificate hr { + width: 90%; +} + +.sans { + font-family: "Open Sans", sans-serif; + text-align: center; +} + +.title {} + +.bold { + font-weight: bold; +} + +.red{ + color: red; +} + +.certificate .logo { + height: 80px; + /* transform: translateY(-25px); */ +} + +.certificate .row { + display: flex; + flex-direction: column; +} + +.btn-save{ + display: none; +} + +.certificate #certificateStuName{ + font-size: 1.8rem; + border-bottom: 2px solid black; +} \ No newline at end of file diff --git a/experiment/simulation/EE6/css/chart.css b/experiment/simulation/EE6/css/chart.css new file mode 100644 index 0000000..2fab3e3 --- /dev/null +++ b/experiment/simulation/EE6/css/chart.css @@ -0,0 +1,15 @@ +.chart { + display: none; + position: absolute; + padding: 10px; + width: fit-content; + border-radius: 20px; + box-shadow: 3px 3px 12px 0px; + height: 220px !important; + width: 364px !important; +} + +.chart #myChart { + height: 100%!important; + width: 100%!important; +} \ No newline at end of file diff --git a/experiment/simulation/EE6/css/component_styling.css b/experiment/simulation/EE6/css/component_styling.css new file mode 100644 index 0000000..52abfe2 --- /dev/null +++ b/experiment/simulation/EE6/css/component_styling.css @@ -0,0 +1,620 @@ +@font-face { + font-family: "Cosmic Sans MS"; + src: url(../fonts/ComicSansMS3.ttf); +} + +.qs{ + cursor: pointer; + display: none; + position: absolute; + /* display: flex; */ + text-align: center; + box-shadow: 1px 1px 5px lime; + border-radius: 10px; + font-size: 3.5em; + font-weight: bolder; + color: white; + height: 70px; + width: 70px; + background-color: #05bc57; + justify-content: center; + align-items: center; + align-content: center; +} + +/* * Slider */ +.slider-box{ + /* display: none; */ + position: absolute; + /* user-select: none; */ + } + + +/* table styling */ + +/* part3 table one */ +.part3_table_one{ + display: none; + bottom: 0px; + position: absolute; + right: 10px; + text-align: center; + gap: 20px; + border-collapse: collapse; +} +.part3_table_one td,tr,th{ + border: 1px solid black; +} +.part3_table_one thead{ + background-color: #0000cc; + color: white; +} +.part3_table_one thead tr th{ + width: 64px; +} +.part3_table_one tbody tr{ + height: 29px; +} +.part3_table_one td{ + text-align: center; + font-weight: bold; + width: 100px; + font-size: 1.2em; + padding: 0; + margin: 0; +} +.part3_table_one th{ + font-size: 1.2em; +} +.part3_table_one tbody tr:nth-child(2n){ + background-color: #eaeff7; +} +.part3_table_one tbody tr:nth-child(2n+1){ + background-color: #d2deef; +} +/* +.part3_table_one td:nth-child(2){ + background-color: rgb(194, 194, 194); +} +.part3_table_one td:nth-child(3){ + background-color: rgb(194, 194, 194); +} +.part3_table_one td:nth-child(4){ + background-color: rgb(194, 194, 194); */ +/* } */ +/* .part3_table_one td:nth-child(10){ + background-color: #ffff00; +} +.part3_table_one td:nth-child(11){ + background-color: #ffc000; +} */ + +/* part table two */ +.part3_table_two{ + display: none; + position: absolute; + right: 10px; + width: 500px; + text-align: center; + border-collapse: collapse; +} +.part3_table_two td,tr,th{ + border: 1px solid black; +} +.part3_table_two thead{ + /* background-color: #0000cc; */ + background-color: #660066; + color: white; +} +.part3_table_two thead tr th{ + width: 10px; + font-size: 16px; + padding: 0; + height: 60px; +} + +.part3_table_two tbody tr{ + height: 20px; +} +.part3_table_two td{ + text-align: center; + font-weight: bold; + width: 10px; + font-size: 16px; + padding: 0 14px!important; + margin: 0; +} +/* .part3_table_two tbody tr:nth-child(2n){ + background-color: #eaeff7; +} +.part3_table_two tbody tr:nth-child(2n+1){ + background-color: #d2deef; +} */ +.part3_table_two.v0-bg td:nth-child(5){ + background-color: rgb(194, 194, 194); +} +.part3_table_two.v0-bg td:nth-child(6){ + background-color: rgb(194, 194, 194); +} +.part3_table_two.m-bg td:nth-child(7){ + background-color: rgb(194, 194, 194); +} +.part3_table_two.m-bg td:nth-child(8){ + background-color: rgb(194, 194, 194); +} +.part3_table_two.iIn-bg td:nth-child(9){ + background-color: rgb(194, 194, 194); +} +.part3_table_two.iIn-bg td:nth-child(10){ + background-color: rgb(194, 194, 194); +} + + +/* part3 table three */ +.part3_table_three{ + width: 1000px; + display: none; + bottom: 0px; + position: absolute; + right: 10px; + text-align: center; + gap: 20px; + border-collapse: collapse; +} +.part3_table_three td,tr,th{ + border: 1px solid black; +} +.part3_table_three thead{ + background-color: #0000cc; + color: white; +} +.part3_table_three thead tr th{ + width: 426px; +} +.part3_table_three tbody tr{ + height: 29px; +} +.part3_table_three td{ + text-align: center; + font-weight: bold; + width: 426px; + font-size: 1.2em; + padding: 0; + margin: 0; +} +.part3_table_three th{ + font-size: 1.2em; +} +.part3_table_three tbody tr:nth-child(2n){ + background-color: #eaeff7; +} +.part3_table_three tbody tr:nth-child(2n+1){ + background-color: #d2deef; +} +/* +.part3_table_three td:nth-child(2){ + background-color: rgb(194, 194, 194); +} +.part3_table_three td:nth-child(3){ + background-color: rgb(194, 194, 194); +} +.part3_table_three td:nth-child(4){ + background-color: rgb(194, 194, 194); */ +/* } */ +/* .part3_table_three td:nth-child(10){ + background-color: #ffff00; +} +.part3_table_three td:nth-child(11){ + background-color: #ffc000; +} */ +/* table four */ + +.deactive{ + pointer-events: none; + cursor:not-allowed; + user-select: none; + opacity: 0.9; + box-shadow: none!important; +} +.disabled{ + pointer-events: none; + cursor:not-allowed; + user-select: none; + opacity: 0.9; + box-shadow: none!important; +} + +.graph_box{ + display: none; + padding: 0 0 22px 22px; + width: 377px; + height: 242px; + position: absolute; + right: 10px; + top: -75px; + box-sizing: border-box; + background-color: white; + border-radius: 20px; + box-shadow: 2px 2px 4px; +} + +.graph{ + /* background-color: white; */ + padding: 5px; + /* background-color: #202020; */ + display: none; +} + +/* ! Next Btn Deactive class */ +.btn-deactive{ + transition: 1s; + opacity: 0.7; + cursor: not-allowed; + background-color: rgb(97, 97, 97)!important ; + box-shadow: none!important; + color: black; + pointer-events: none; +} + +.btn-deactive:hover { + box-shadow: none!important; +} + +.btn-deactive:active{ + opacity: none!important; + transform: none!important; +} + +/* * Part 3 table two btns */ +.btn-box1 button{ + background-color: #0000ff; +} + +.btn-box2 button{ + background-color: #d26315; +} +.btn-box3 button{ + background-color: #5d8c3b; +} + +.table-btn{ + color: white; + position: relative; + width: 31.5%; + padding: 5px; + font-size: 1.2em; + font-weight: bold; + z-index: 1000; + border-radius: 10px; + cursor: pointer; + border: 2px solid black +} +.table-btn:hover{ + border-color: white; + transition: 0.2s; +} +.table-btn:active{ + transition: 0s; + border-color: black; + background-color: black; +} + +/* ! Delte reset */ +.btn-delete{ + background-color: #05056f; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; + border-radius: 20px; + font-size: 1.25em; + padding: 12px 7px; + width: 90px; + /* top: 360px; + left: 10px; */ + +} + +.btn-reset{ + background-color: #5d8c3b; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; + border-radius: 20px; + font-size: 1.25em; + padding: 12px 7px; + width: 90px; + /* top: 360px; + left: 120px; */ + +} +.btn-record{ + background-color: #975f52; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; + border-radius: 20px; + font-size: 1.25em; + padding: 12px 0px; + width: 90px; + /* top: 360px; + left: 120px; */ + +} + +/* ! check connection and circuit diagram btn */ +.btn-check-connections{ + background-color: #d26315!important; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; +} + +.btn-circuit-diagram{ + background-color: #7937aa!important; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; +} + +/* ! check reset hint btn for ee3 */ + +.ee3-btn-check{ + background-color: #814141; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; + border-radius: 20px; +} +.ee3-btn-reset{ + background-color: #055794; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; + border-radius: 20px; + +} +.ee3-btn-hint{ + background-color: #385238; + color: white; + font-weight: bold; + display: none; + z-index: 1000; + position: absolute; + border-radius: 20px; +} + + + +.bg-black{ + background-color: black!important; +} + +.theory{ + height: 495px; + width: 950px; + top: -46px; + left: 0; + z-index: 1001; +} + + +.btn-transparent{ + display: none; + position: absolute; + width: 64px; + height: 44px; + bottom: -95px; + right: 3px; + /* background-color: red; */ + z-index: 2001; +} +.btn-transparent { + display: none; + position: absolute; + /* width: 64px; */ + /* height: 48px; */ + bottom: -95px; + right: 1px; + /* background-color: red; */ + font-size: 1.2em; + z-index: 2001; + } + + + .btn-transparent:active { + box-shadow: #422800 2px 2px 0 0; + transform: translate(4px, 4px); + } + + /* Pop window */ + .btn-popup-box{ + display: flex; + position: relative; + left: 23px; + justify-content: center; + align-items: center; + /* background-color: rgba(0, 0, 0, 0.619); */ + padding: 0 2px; + height: 40px; + border-radius: 10px; + z-index: 5000; + } + + .btn-popup{ + padding: 8px 10px; + margin: 0 2px; + font-size: 17px; + font-weight: bold; + cursor:help; + transition: 0.1s; + border-radius: 20px; + box-shadow: 1px 1px 5px white; + } + + .btn-popup:nth-child(1){ + background-color: #8e4311; + } + .btn-popup:nth-child(2){ + background-color: #0505a4; + } + .btn-popup:nth-child(3){ + background-color: #3f5f29; + } + + .btn-popup:hover ~ .btn-popup-window{ + display: block!important; + } + .btn-popup:hover{ + scale: 0.94; + background-color: transparent; + } + + .btn-popup-window{ + display: none; + position: absolute; + left: -422px; + top: 39px; + width: 950px; + height: 495px; + z-index: 5001; + } + + .blur{ + display: none; + top: 45px; + z-index: 5000; + background-color: rgba(0, 0, 0, 0.389); + filter: blur(7px); + -webkit-filter: blur(7px); + } + + /* vertex */ + .vertex-box{ + display: none; + } + .vertex-box .vertex{ + /* display: none; */ + position: absolute; + /* background-color: black; + width: 20px; + height: 20px; + z-index: 2000; + color: white; + border-radius: 100vh; */ + /* left: 10px; + top: 20px; */ + } + + #vertex1{ + left: 124px; + top: 23px; +} + #vertex2{ + left: 124px; + top: 162px; +} +#vertex3{ + left: 205px; + top: 309px; +} +#vertex4{ + left: 341px; + top: 308px; +} +#vertex5{ + left: 684px; + top: 31px; +} + +#vertex6 { + left: 682px; + top: 181px; +} +#vertex7 { + left: 427px; + top: -16px; +} +#vertex8 { + left: 573px; + top: -16px; +} +#vertex9 { + left: 387px; + top: 307px; +} +#vertex10 { + left: 497px; + top: 307px; +} + +/* ! Added Font */ +.main-window{ + font-family: "Cosmic Sans MS"; +} + +/* !added cursor pointer to imgs */ +.ee3-imgs{ + cursor: pointer; +} + +/*! part1 boxes of ee3 exp */ + +.part1_box1{ + height: 90px; + width: 90px; + border-radius: 20px; + background-color: #f5f29e; + position: relative; + top: 75px; + left: -330px; + border: 1px solid #f5f29e; +} + +/* * concept dev */ + +.concept_development{ + display: none; +} + +/*! EE4 images */ +.ee4_imgs { + cursor: pointer; +} + +.exp-4 th{ + background-color: #ffc000; + color: #203864 ; +} + +.exp-4 { + border: 2px solid black; + /* width: fit-content; */ + /* gap: 20px; */ +} + +.exp-4 td{ + border-right: 2px solid black; + border-bottom: 2px solid black; +} +.part_1_table_1{ + position: absolute; + display: none; +} +.part_1_table_2{ + position: absolute; + display: none; +} \ No newline at end of file diff --git a/experiment/simulation/EE6/css/imgs.css b/experiment/simulation/EE6/css/imgs.css new file mode 100644 index 0000000..b0f5aae --- /dev/null +++ b/experiment/simulation/EE6/css/imgs.css @@ -0,0 +1,63 @@ +.anime-main{ + position: relative; + height: 404px; + width: 946px; + /* overflow: hidden!important; */ +} + +.markings{ + /* display: none; */ + opacity: 0; + height: 4.8px; + width: 38px; + height: 10px; + top: -30px; + left: 212px; + z-index: 5; + position: relative; + /* position: absolute; */ + /* visibility: hidden; */ + filter: brightness(0); +} + +.markings2{ + height: 25px; + z-index: 5; + position: relative; + left: -410px; + top: -57px; + opacity: 0; + display: none; +} +.markings3{ + height: 10px; + z-index: 9; + position: absolute; + left: 59px; + filter: brightness(0); + top: 120px; + opacity: 0; + display: none; +} +.main-window-imgs{ + display: none; + position: absolute; + +} +.blinkArrow{ + display: none; + filter:brightness(200); + position: absolute; + z-index: 2000; + +} +.blinkArrowRed{ + display: none; + position: absolute; + z-index: 2000; +} + +.main-window-videos{ + display: none; + position: absolute; +} diff --git a/experiment/simulation/EE6/css/layout.css b/experiment/simulation/EE6/css/layout.css new file mode 100644 index 0000000..2ee9a7c --- /dev/null +++ b/experiment/simulation/EE6/css/layout.css @@ -0,0 +1,398 @@ +/* #drawer */ +@import url('https://fonts.googleapis.com/css?family=Roboto&display=swap'); +body{ + margin: 0; + display: flex; + justify-content: center; + /* padding-top: 70px; */ + font-family: Roboto; +} +#drawer{ + font-family: Roboto,Noto,sans-serif; + min-width: 230px; + max-width: 230px; + padding: 10px; + background-color: #f8f9fa; + height: 638px; + overflow-y: auto; + grid-area: drawer; + grid-column-start: 1; +} + +#drawer ol{ + list-style: none; + margin: 0px auto !important; + padding: 0; +} + +#drawer ol li{ + display: flex; + justify-content: start; + align-items: center; + margin: 6px 0; + padding: 3px 10px; + min-height: 48px; + border-radius: 5px; + border: 1px solid rgb(218, 220, 224); + counter-increment: li-count; + opacity: 0.7; + line-height: 20px; + font-stretch: 100%; +} + +#drawer ol li a .step{ + display: flex; + justify-content: center; + align-items: center; +} +#drawer ol li a .step::before{ + content: counter(li-count); + display: flex; + justify-content: center; + align-items: center; + height: 26px; + min-width: 26px; + border-radius: 50%; + background-color: gray; + margin-right: 8px; + font-size: 14px; + font-weight: bold; + color: white; +} + +.right-container{ + /* overflow: hidden; */ + width: 100%; + display: flex; +} + +.active{ + box-shadow: 2px 2px 4px rgba(0,0,0,.15); + font-weight: bold!important; + opacity: 1!important; +} + +.active .step::before{ + background-color: #2b80ee!important; +} + +.completed{ + opacity: 1!important; + font-weight: 400; +} + +.completed .step::before{ + background-color: #2b80ee!important; +} + +/* Other */ +.main-container{ + display: flex; + /* gap: 25px; */ + /* display: grid; */ + /* grid-template-areas: "drawer progressBar" */ + /* "drawer mainWindow"; */ +} + +.main-window{ + background-color: #f1ece3; + position: relative; + grid-area: mainWindow; + display: flex; + flex-direction: column; + justify-content: space-between; + /* height: calc(100vh - 78px - 60px); */ + min-height: calc(404px + 200px); + width: 950px; + border: 2px solid; + overflow: hidden; +} + +.main-window .anime-header{ + display: flex; + justify-content: center; + align-items: center; + font-size: 2rem; + font-weight: bold; + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + height: 50px; + color: white; + background-color: #3D246C; +} +.main-window .anime-footer{ + display: flex; + align-items: center; + justify-content: space-between; + /* height: 70px; */ + height: 55px; + color: white; + background-color: #5C4B99; +} + +.right-box{ + display: flex; + margin-left: 1%; + flex-direction: column; + overflow: hiddenw1; +} + +.anime-footer .steps-subtitle{ + display: flex; + align-items: center; + gap: 10px; +} +.anime-footer .steps-subtitle .user-name{ + font-size: 1.05rem; + font-weight: bold; + background-color: #fff; + padding: 10px; + border-radius: 10px; +} +.anime-footer .steps-subtitle .subtitle{ + font-size: 1.1rem; + font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif; + font-weight: bold; +} + +/* Steps Title description */ +.step-heading{ + display: none; + gap: 10px; + margin-left: 20px; + align-items: center; +} +.step-heading .step-title{ + background-color: #9F91CC; + border-radius: 20px; + font-weight: bold; + padding: 10px 15px; +} + +.step-heading .step-description{ + font-weight: bold; +} + +.anime-main .measurements{ + position: absolute; + z-index: 300; + /* border: 1px solid; */ + display: none; +} +.anime-main .measurements .cell{ + border: 1px solid; +} + +/* temp text */ +.anime-main .temp-text, .temp-text2{ + position: absolute; + background-color: white; + padding: 5px 10px; + display: none; +} + +/* Project Welcome */ +.welcome-box{ + display: none; + flex-direction: column; + align-items: center; + position: absolute; + } + .welcome-box .title{ + display: flex; + flex-direction: column; + align-items: center; + margin-top: 25px; + gap: 4px; + } + .welcome-box .iit-logo{ + height: 140px; + width: 200px; + } + .welcome-box .prof-img{ + /* margin-top: 20px; */ + height: 120px; + width: 100px; + } + .welcome-box .title span{ + font-size: 1.5rem; + } + .welcome-box .title span:nth-child(2n - 1){ + color: red + } + .welcome-box .title span:nth-child(2n){ + font-weight: bold; + color: black; + font-family: Roboto; + } + .welcome-box .prof-description{ + font-size: 0.8rem; + transform: translate(40px,15px); + display: flex; + flex-direction: column; + align-items: end; + padding: 5px; + font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif; + border: 2px solid; + border-radius: 5px; + align-self: end; + } + + /* Mute Btn */ +.btn-mute{ + z-index: 500; +} + +/* Video box */ +.video-box{ + position: absolute; + display:none ; + /* display: flex; */ + flex-direction: column; + border: 2px solid; + box-shadow: 5px 5px 10px 2px black; + align-items: center; + justify-content: center; + z-index: 10; + width: fit-content; + height: fit-content; + border-radius: 3px; + overflow: hidden; +} + +/* .video-box .video{ + /* height: 150px!important; */ +/* } */ + +.video-box .title{ + background-color: purple; + margin: 0; + text-align: center; + color: white; + padding: 3px; + font-size: 1.2em; + +} + +.video-box .controls{ + display: flex; + background-color: purple; + align-items: center; + justify-content: space-around; + width: 100%; +} +.video-box .controls img{ + height: 26px; + +} + +.video-box .controls .restart{ + padding: 2px; + display: flex; + justify-content: center; + align-items: center; +} + +/* Temp texts/titles */ +.temp{ + display: none; + font-weight: bold; + font-size: 1.0rem; + position: absolute; + text-align: justify; + background-color: black; + color: white; + width: 35px; + padding: 0 1px; + border-radius: 4px; +} + + +/* Content Adder Boxc */ +.content-adder-box{ + padding: 10px 5px; + /* display: flex; */ + display: none; + flex-direction: column; + gap: 5px; + height: fit-content; + width: fit-content; + z-index: 1000; + border-radius: 10px; + background-color: #5c4b99; + box-shadow: 3px 3px 5px ; + position: absolute; + right: 20px; + top: 80px!important; +} + + + /* print */ + @media print{ + #drawer, .progress-bar, .anime-header, .anime-footer{ + display: none!important; + } + .main-window{ + border: none; + } + .certificate{ + display: flex; + transform: translateY(400px) rotate(90deg) scale(1.5,2); + + + } + } + /* for transparent box */ + .transparent-box{ + display: none; + height: 100% ; + width: 950px; + background-color: transparent; + z-index: 500; + position: absolute; + + } + + + .image-box{ + /* display: flex; */ + display: none; + border: 2px solid; + text-align: center; + flex-direction: column; + justify-content: center; + /* background-color: white; */ + height: fit-content; + width: fit-content; + position: absolute; + padding: 3px; + border-radius: 10px; + box-shadow: 5px 5px 14px ; + } + .image-box .title{ + margin: 0; + font-weight: bold; + } + .image-box .image{ + border-radius: 10px; + } + + .pointer{ + cursor: pointer; + } + + .btn-img{ + transition: 0.1s; + } + .btn-img:hover{ + scale: 0.95; + } + .btn-img:active{ + filter: opacity(0.9); + } + + .btn-img-disabled{ + /* filter: grayscale(1); */ + } + + + \ No newline at end of file diff --git a/experiment/simulation/EE6/css/progressBar.css b/experiment/simulation/EE6/css/progressBar.css new file mode 100644 index 0000000..4b55d7e --- /dev/null +++ b/experiment/simulation/EE6/css/progressBar.css @@ -0,0 +1,128 @@ +:root { + --primary-color: rgb(11, 78, 179); + --gray: #e5e5e5; + --gray2: #808080; + --blue: #2183dd; + --primary: #0d6efc; + --green: #009900; + --white: #ffffff; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + + + + + + + +/* Progressbar */ +.progress-bar { + /* width: clamp(320px, 30%, 430px); */ + grid-area: progressBar; + font-family: Roboto; + width: 100%; + margin-bottom: 10px; +} + +.progressbar { + position: relative; + display: flex; + justify-content: space-between; + counter-reset: step; +} + +.progressbar::before, +.progress { + content: ""; + position: absolute; + top: 50%; + transform: translateY(-50%); + height: 5px; + width: 100%; + background-color: var(--gray); + z-index: -1; +} + +.progress { + background-color: var(--primary); + width: 0%; + transition: 0.3s; +} + +.progress-step { + width: 1.5rem; + height: 1.5rem; + /* background-color: var(--gray); */ + background-color: white; + border-radius: 50%; + border: 2px solid var(--gray2); + display: flex; + justify-content: center; + align-items: center; +} + +.progress-step::before { + counter-increment: step; + content: counter(step); + font-weight: bold; + /* content: "\f00c"; */ +} + +.progress-step::after { + display: none; + content: attr(data-title); + position: absolute; + top: calc(100% + 0.5rem); + font-size: 0.85rem; + color: #666; +} + +.progress-step-active { + background-color: var(--primary); + color: #f3f3f3; +} + +/* Form */ + + + +/* Button */ +.btns-group { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 1.5rem; +} + +.btn { + box-shadow: 3px 2px 4px 0px black; + padding: 0.75rem; + display: block; + text-decoration: none; + /* background-color: var(--primary); */ + background-color: #FFDBC3; + color: black; + text-align: center; + border: none; + border-radius: 0.25rem; + cursor: pointer; + transition: 0.1s; + height: fit-content; + margin: 0 10px; + font-family: Roboto; + font-weight: bold; + +} + +.btn:hover { + box-shadow: 0 0 0 2px #fff, 0 0 0 3px var(--green); +} + +.btn:active{ + opacity: 0.8!important; + transform: scale(0.95)!important; +} diff --git a/experiment/simulation/EE6/css/quiz.css b/experiment/simulation/EE6/css/quiz.css new file mode 100644 index 0000000..512981b --- /dev/null +++ b/experiment/simulation/EE6/css/quiz.css @@ -0,0 +1,86 @@ +.quiz-container { + z-index: 501; + top: 0; + position: absolute; + color: #000000; + border-radius: 10px; + box-shadow: 3px 3px 20px 1px black; + overflow: hidden; + width: 350px; + min-height: 350px; + height: fit-content; + max-width: 100%; + /* background-color: #fff5; */ + background-color: #ffffffc2; + backdrop-filter: blur(10px); + padding: 0.9rem; + display: none; + /* border: 2px solid ; */ + } + + + .quiz-container h2 { + padding: 1rem; + font-size: 1.2rem; + text-align: center; + margin: 0; + } + + .quiz-container ul { + list-style-type: none; + padding: 0; + } + + .quiz-container ul li { + font-size: 1.2rem; + margin: 1rem 0; + } + + .quiz-container ul li label { + cursor: pointer; + } + + .quiz-container button { + background-color: #aa84bb; + border: none; + color: white; + cursor: pointer; + display: block; + font-family: inherit; + font-size: 1.1rem; + width: 100%; + padding: 1rem; + border-radius: 5px; + } + + .quiz-container button:hover { + background-color: #732d91; + } + + .quiz-container button:focus { + background-color: #5e3370; + outline: none; + } + + .quiz-container #quizAns{ + display: none; + } + + .quiz-container #closeQuiz{ + margin: 10px; + right: 0; + top: 0; + position: absolute; + font-size: 1rem; + color: white; + padding: 4px 10px; + height: fit-content; + font-weight: bold; + background-color: #732d91; + cursor: pointer; + border-radius: 50%; +} + .quiz-container .title{ + display: flex; + justify-content: space-between; + } \ No newline at end of file diff --git a/experiment/simulation/EE6/css/resultTable.css b/experiment/simulation/EE6/css/resultTable.css new file mode 100644 index 0000000..44aeb3f --- /dev/null +++ b/experiment/simulation/EE6/css/resultTable.css @@ -0,0 +1,142 @@ +/* +Responsive HTML Table With Pure CSS - Web Design/UI Design + +Code written by: +👨🏻‍⚕️ Coding Design (Jeet Saru) + +> You can do whatever you want with the code. However if you love my content, you can **SUBSCRIBED** my YouTube Channel. + +🌎link: www.youtube.com/codingdesign +*/ + + + +main.table { + width: 82vw; + height: 90vh; + background-color: #fff5; + + backdrop-filter: blur(7px); + box-shadow: 0 .4rem .8rem #0005; + border-radius: .8rem; + + overflow: hidden; +} + +main.table__header { + width: 100%; + height: 10%; + background-color: #fff4; + padding: .8rem 1rem; + + display: flex; + justify-content: space-between; + align-items: center; +} + + + + + +main.table__body { + width: 95%; + max-height: calc(89% - 1.6rem); + background-color: #fffb; + + margin: .8rem auto; + border-radius: .6rem; + + overflow: auto; + overflow: overlay; +} + +main.table__body::-webkit-scrollbar{ + width: 0.5rem; + height: 0.5rem; +} + +main.table__body::-webkit-scrollbar-thumb{ + border-radius: .5rem; + background-color: #0004; + visibility: hidden; +} + +main.table__body:hover::-webkit-scrollbar-thumb{ + visibility: visible; +} + +main table { + width: 100%; +} + +main td img { + width: 36px; + height: 36px; + margin-right: .5rem; + border-radius: 50%; + + vertical-align: middle; +} + +main table, th, td { + border-collapse: collapse; + padding: 1rem; + text-align: left; +} + +main thead th { + position: sticky; + top: 0; + left: 0; + background-color: #d5d1defe; + cursor: pointer; + text-transform: capitalize; +} + +main tbody tr:nth-child(even) { + background-color: #0000000b; +} + +main tbody tr { + --delay: .1s; + transition: .5s ease-in-out var(--delay), background-color 0s; +} + +main tbody tr.hide { + opacity: 0; + transform: translateX(100%); +} + +main tbody tr:hover { + background-color: #fff6 !important; +} + +main tbody tr td, +main tbody tr td p, +main tbody tr td img { + transition: .2s ease-in-out; +} + +main tbody tr.hide td, +main tbody tr.hide td p { + padding: 0; + font: 0 / 0 sans-serif; + transition: .2s ease-in-out .5s; +} + +main tbody tr.hide td img { + width: 0; + height: 0; + transition: .2s ease-in-out .5s; +} + + + +main thead th:hover { + color: #6c00bd; +} + +main thead th.active,tbody td.active { + color: #6c00bd; +} + diff --git a/experiment/simulation/EE6/css/scenes.css b/experiment/simulation/EE6/css/scenes.css new file mode 100644 index 0000000..128ec3e --- /dev/null +++ b/experiment/simulation/EE6/css/scenes.css @@ -0,0 +1,116 @@ +.anime-main{ + display: flex; + justify-content: center; + align-items: center; +} + +/* Scene 1 */ +/* step1 */ +.user-input{ + font-size: 1.5rem; + flex-direction: column; + display: none; + gap: 10px; + position: absolute; + left: 200; +} +.user-input p{ + margin: 0; +} +.user-input *{ + padding: 10px; + +} + +.anime-header{ + display: none; + position: relative; + top: 0px; + z-index: 6000; +} + +/* step2 - project intro */ +.project-intro{ + top: 50px; + padding: 10px; + display: none; + position: absolute; +} + +.project-intro .heading{ + font-weight: bold; + font-size: 1.1rem; +} +.project-intro .description{ + margin: 5px 0 15px 0; + color: rgb(48, 48, 48); +} + + + + +/* Mouse position */ + +#demo { + height: 100%; + width: 100%; + background-color: #222831; +} + +#info { + z-index: 200; + padding-left: 10px; + border-radius: 10px; + position: absolute; + user-select: none; + font-size: 2em; + width: 120px; + color: #EEEEEE; + background-color: #FD7013; +} + +/* step3 */ +/* input template */ +.temp-input{ + position: absolute; + font-size: 1.5rem; + display: none; +} +.temp-input span{ + margin: 5px; +} +.error{ + color: red; + font-size: 1rem; + text-align: center; + display: none; +} +.temp-input .input{ + font-size: 1.5rem; + width: 100px; + padding: 5px; +} + +.temp-input .submit-btn{ + margin: 20px 0; +} + +/* step 7 */ +.utm-button{ + cursor: pointer; + background-color: rgb(0, 255, 0); + padding: 4px; + box-shadow: 1px 1px 10px 3px green; + border-radius: 50%; + /* border: 1px solid; */ + left: 251px; + top: 147px; + position: absolute; + z-index: 6; + opacity: 0; +} + +.celebration{ + display: none; + position: absolute; +} \ No newline at end of file diff --git a/experiment/simulation/EE6/css/sliders.css b/experiment/simulation/EE6/css/sliders.css new file mode 100644 index 0000000..b7515ed --- /dev/null +++ b/experiment/simulation/EE6/css/sliders.css @@ -0,0 +1,74 @@ +.slider-box .row1{ + display: flex; + gap: 20px; +} +.slider-box .header{ + color: white; + font-size: 1.2rem; + font-weight: bold; + text-align: center; + padding: 2px; +} +.slider-box .header_v{ + background-color: #0000cc; +} +.slider-box .header_r{ + background-color: #c00000; + +} +.slider-box .header_c{ + background-color: #ff0066; + } +.slider-box .slider{ + width: 155px; + height: 30px; +} +.slider-box .slider_vIn{ + background-color: #fff5cc; +} +.slider-box .slider_R{ + background-color: #f5efff; +} +.slider-box .slider_C{ + background-color: #f5efff; +} +.slider-box .slider { + font-family: 'Times New Roman', Times, serif; + font-weight: bold; + font-size: 1.4rem; + color: #c00000; + +} +.slider-box .slider option:hover{ + background-color: #a8cf40; +} +.slider-box .slider-box-container-4 .header_d{ + height: 10px; + width: fit-content; +} +.slider-box .slider-box-container-4 { + margin-top: 20px; +} +.slider-box .slider_D_input{ + width: 50px; + height: 30px; + font-weight: bold; + font-size: 1.1rem; + text-align: center; + border: 2px solid black; + margin-left: 5px; + border-radius: 12px; +} +.slider-box .slider option:hover{ + background-color: #a8cf40!important ; +} +.slider-box .slider-box-container-4{ + display: flex; + width: fit-content; + padding: 7px 18px; + border-radius: 81px; + background-color: #7030a0; +} +.slider-box .slider_D{ + /* width: 210px; */ +} \ No newline at end of file diff --git a/experiment/simulation/EE6/css/table.css b/experiment/simulation/EE6/css/table.css new file mode 100644 index 0000000..91dbed8 --- /dev/null +++ b/experiment/simulation/EE6/css/table.css @@ -0,0 +1,163 @@ +table { + background-color: #fff5; + + backdrop-filter: blur(7px); + box-shadow: 0 .4rem .8rem #0005; + border-radius: .8rem; + + overflow: hidden; +} + +main.table { + min-width: 600px; + height: 430px; + background-color: #fff5; + + backdrop-filter: blur(7px); + box-shadow: 0 .4rem .8rem #0005; + border-radius: .8rem; + + overflow: overlay; +} +.table__header .input-group { + width: 35%; + height: 100%; + background-color: #fff5; + padding: 0 .8rem; + border-radius: 2rem; + + display: flex; + justify-content: center; + align-items: center; + + transition: .2s; +} + +.table__header .input-group:hover { + width: 45%; + background-color: #fff8; + box-shadow: 0 .0.7rem .4rem #0002; +} + +.table__header .input-group img { + width: 1.2rem; + height: 1.2rem; +} + +.table__header .input-group input { + width: 100%; + padding: 0 .5rem 0 .3rem; + background-color: transparent; + border: none; + outline: none; +} + +main .table__body { + /* width: 95%; */ + /* max-height: calc(89% - 1.6rem); */ + background-color: #fffb; + display: flex; + justify-content: center; + border-radius: .6rem; + + overflow: auto; + /* overflow: overlay!important; */ +} + +.table__body::-webkit-scrollbar{ + width: 0.5rem; + height: 0.5rem; +} + +.table__body::-webkit-scrollbar-thumb{ + border-radius: .5rem; + background-color: #0004; + visibility: hidden; +} + +.table__body:hover::-webkit-scrollbar-thumb{ + visibility: visible; +} + + +td img { + width: 36px; + height: 36px; + margin-right: .5rem; + border-radius: 50%; + + vertical-align: middle; +} + +table, th, td { + border-collapse: collapse; + padding: 0.7rem; + text-align: left; +} +table{ + padding: 0.3rem; +} + +thead th { + position: sticky; + top: 0; + left: 0; + background-color: #d5d1defe; + cursor: pointer; + text-transform: capitalize; +} + +tbody tr:nth-child(even) { + background-color: #0000000b; +} + +tbody tr { + --delay: .1s; + transition: .5s ease-in-out var(--delay), background-color 0s; +} + +tbody tr.hide { + opacity: 0; + transform: translateX(100%); +} + +tbody tr:hover { + background-color: #fff6 !important; +} + +tbody tr td, +tbody tr td p, +tbody tr td img { + transition: .2s ease-in-out; +} + +tbody tr.hide td, +tbody tr.hide td p { + padding: 0; + font: 0 / 0 sans-serif; + transition: .2s ease-in-out .5s; +} + +tbody tr.hide td img { + width: 0; + height: 0; + transition: .2s ease-in-out .5s; +} + + + +.result-table{ + position: absolute; + left: 400; + display: none; +} + +.result-table .table__header{ + height: ""; + min-width: 600px!important; +} +.result-table th{ + display: flex; + align-items: center; +} + diff --git a/experiment/simulation/EE6/fonts/ComicSansMS3.ttf b/experiment/simulation/EE6/fonts/ComicSansMS3.ttf new file mode 100644 index 0000000..da55369 Binary files /dev/null and b/experiment/simulation/EE6/fonts/ComicSansMS3.ttf differ diff --git a/experiment/simulation/EE6/helper/GRAPH/graph.html b/experiment/simulation/EE6/helper/GRAPH/graph.html new file mode 100644 index 0000000..8bd3618 --- /dev/null +++ b/experiment/simulation/EE6/helper/GRAPH/graph.html @@ -0,0 +1,78 @@ + + + + + Horizontal Bar Chart with Rotated Y-axis Labels + + + +
    + +
    + + + + diff --git a/experiment/simulation/EE6/helper/cable/css/simstyle.css b/experiment/simulation/EE6/helper/cable/css/simstyle.css new file mode 100644 index 0000000..eb0fbe5 --- /dev/null +++ b/experiment/simulation/EE6/helper/cable/css/simstyle.css @@ -0,0 +1,150 @@ +.exp { + position: absolute; + top: 0em; + border: 5px; + left: 0%; + height: 48em; + width: 89em; + border-style: groove; + background-color: white; + /* width: 1422px; */ +} +/* input { + background: #228b22; + color: white; + padding: 10px 10px; + border: none; + border-radius: 3px; +} */ + #dragDropWindow1{ + left: 19.9em; + top: 27.6em; + position: fixed; + } + #dragDropWindow6{ + left: 17.5em; + top: 27.6em; + position: fixed; + } + #dragDropWindow8{ + left: 62.1em; + top: 29.3em; + position: fixed; + } + #dragDropWindow4{ + left: 73.55em; + top: 23.1em; + position: fixed; + } + #dragDropWindow5{ + left: 42.5em; + top: 27em; + position: fixed; + } + #dragDropWindow2{ + left: 27.7em; + top: 24em; + position: fixed; + } + #dragDropWindow7{ + left: 71.3em; + top: 23.1em; + position: absolute; + } + #dragDropWindow3{ + left: 62.1em; + top: 25.7em; + position: fixed; + } + .image{ + position:relative; + margin-top:100px; + } + .top{ + position:absolute; + bottom:50px; + right:30px; + /*z-index:10;*/ + } + .instruct{ + float:right; + } + .b1:hover{ + background-color:yellow; + color:red; + cursor:pointer; + } + .b2:hover{ + background-color:red; + color:white; + cursor:pointer; + } + .button{ + display:inline-flex; + margin-right:50px; + } + .modal { + display: none; + position: fixed; + z-index: 1; + padding-top: 100px; + left: 0; + top: 0; + width: 100%; + height: 100%; + overflow: auto; + } + .modal-content { + background-color: #fefefe; + margin: auto; + padding: 20px; + border: 1px solid #888; + width: 80%; + -webkit-animation-name: animatetop; + -webkit-animation-duration: 0.4s; + animation-name: animatetop; + animation-duration: 0.4s + } + @-webkit-keyframes animatetop { + from {top:-300px; opacity:0} + to {top:0; opacity:1} + } + @keyframes animatetop { + from {top:-300px; opacity:0} + to {top:0; opacity:1} + } + .close { + color: #ffffff; + float: right; + font-size: 28px; + font-weight: bold; + } + .close:hover, + .close:focus { + text-decoration: none; + cursor: pointer; + } + .modal-header { + padding: 2px 16px; + background-color: #044ca3; + color: white; + } + .modal-body {padding: 2px 16px;} + .modal-footer { + padding: 2px 16px; + background-color: #044ca3; + color: white; + } + path, .jtk-endpoint { cursor:pointer; } + .cmdLink { font-size:0.80em;} + .drag-drop-demo a, .drag-drop-demo a:visited { + color:#057D9F; + } + .demo { + /* for IE10+ touch devices */ + touch-action:none; + } + body{ + margin-left: 15px!important; + margin-top: -23px!important; + } \ No newline at end of file diff --git a/experiment/simulation/EE6/helper/cable/images/Log.png b/experiment/simulation/EE6/helper/cable/images/Log.png new file mode 100644 index 0000000..33a261a Binary files /dev/null and b/experiment/simulation/EE6/helper/cable/images/Log.png differ diff --git a/experiment/simulation/EE6/helper/cable/images/meter.png b/experiment/simulation/EE6/helper/cable/images/meter.png new file mode 100644 index 0000000..cde49fa Binary files /dev/null and b/experiment/simulation/EE6/helper/cable/images/meter.png differ diff --git a/experiment/simulation/EE6/helper/cable/images/meter2.png b/experiment/simulation/EE6/helper/cable/images/meter2.png new file mode 100644 index 0000000..f6efa4e Binary files /dev/null and b/experiment/simulation/EE6/helper/cable/images/meter2.png differ diff --git a/experiment/simulation/EE6/helper/cable/images/setup.PNG b/experiment/simulation/EE6/helper/cable/images/setup.PNG new file mode 100644 index 0000000..56f5f66 Binary files /dev/null and b/experiment/simulation/EE6/helper/cable/images/setup.PNG differ diff --git a/experiment/simulation/EE6/helper/cable/js/demo.js b/experiment/simulation/EE6/helper/cable/js/demo.js new file mode 100644 index 0000000..cc5ade7 --- /dev/null +++ b/experiment/simulation/EE6/helper/cable/js/demo.js @@ -0,0 +1,261 @@ +(function () { + var yy = document.getElementById("check"); + yy.onclick = checkk; + + // ! check + function checkk() { + if (connections.length == 0) { + alert("Please make the connections first"); + return false; + } + + if (connections.length < 6) { + alert("Wrong Connections\nPlease go through the instructions once"); + return false; + } + let isConnectionRight = false + if (connections.length >= 6) { + let matrixForCheckGraph = [ + // 0 1 2 3 4 5 6 7 8 9 10 + [0,0,0,0,0,0,0,0,0,0,0], // 0 + [0,0,0,1,0,0,0,0,0,0,0], // 1 + [0,0,0,0,0,0,1,0,1,0,0], // 2 + [0,1,0,0,0,0,0,0,0,0,0], // 3 + [0,0,0,0,0,0,0,1,0,1,0], // 4 + [0,0,0,0,0,0,0,0,0,0,1], // 5 + [0,0,1,0,0,0,0,0,1,0,0], // 6 + [0,0,0,0,1,0,0,0,0,1,0], // 7 + [0,0,1,0,0,0,1,0,0,0,0], // 8 + [0,0,0,0,1,0,0,1,0,0,0], // 9 + [0,0,0,0,0,1,0,0,0,0,0], // 10 + ] + var listDiv = []; + for (var j = 0; j < connections.length; j++) { + let pos = [connections[j].targetId,connections[j].sourceId] + listDiv.push(pos) + } + for(let i=0;i 0) { + var listDiv = []; + for (var j = 0; j < connections.length; j++) { + let pos = [connections[j].targetId,connections[j].sourceId] + listDiv.push(pos) + } + showConnectionInfo(listDiv); + } + }); + + jsPlumb.ready(function () { + var instance = jsPlumb.getInstance(); + + // suspend drawing and initialise. + instance.batch(function () { + // bind to connection/connectionDetached events, and update the list of connections on screen. + instance.bind("connection", function (info, originalEvent) { + updateConnections(info.connection); + }); + instance.bind("connectionDetached", function (info, originalEvent) { + updateConnections(info.connection, true); + }); + + instance.bind("connectionMoved", function (info, originalEvent) { + // only remove here, because a 'connection' event is also fired. + // in a future release of jsplumb this extra connection event will not + // be fired. + updateConnections(info.connection, true); + }); + + // configure some drop options for use by all endpoints. + var exampleDropOptions = { + tolerance: "touch", + hoverClass: "dropHover", + activeClass: "dragActive", + }; + let radius = 14 + var exampleEndpoint1 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "pink" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "pink", strokeWidth: 6 }, + connector: ["Bezier", { curviness: 10 }], + maxConnections: 1, + isTarget: true, + dropOptions: exampleDropOptions, + }; + var exampleEndpoint2 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "black" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "black", strokeWidth: 6 }, + connector: ["Bezier", { curviness: -50 }], + maxConnections: 3, + isTarget: true, + dropOptions: exampleDropOptions, + }; + var exampleEndpoint3 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "red" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "red", strokeWidth: 6 }, + connector: ["Bezier", { curviness: -30 }], + maxConnections: 3, + isTarget: true, + dropOptions: exampleDropOptions, + }; + var exampleEndpoint4 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "green" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "green", strokeWidth: 6 }, + connector: ["Bezier", { curviness: -50 }], + maxConnections: 1, + isTarget: true, + dropOptions: exampleDropOptions, + }; + // conn 1 + instance.addEndpoint( + "dragDropWindow1", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint1 + ); + instance.addEndpoint( + "dragDropWindow3", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint1 + ); + + // conn 2 + instance.addEndpoint( + "dragDropWindow4", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint2 + ); + instance.addEndpoint( + "dragDropWindow7", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint2 + ); + instance.addEndpoint( + "dragDropWindow9", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint2 + ); + + // conn 3 + instance.addEndpoint( + "dragDropWindow8", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint3 + ); + instance.addEndpoint( + "dragDropWindow6", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint3 + ); + instance.addEndpoint( + "dragDropWindow2", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint3 + ); + + // conn 4 + instance.addEndpoint( + "dragDropWindow10", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint4 + ); + instance.addEndpoint( + "dragDropWindow5", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint4 + ); + /*instance.addEndpoint("dragDropWindow9", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint4); + instance.addEndpoint("dragDropWindow10", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint4); + instance.addEndpoint("dragDropWindow11", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint3); + instance.addEndpoint("dragDropWindow12", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint3);*/ + + instance.draggable(jsPlumb.getSelector(".drag-drop-demo .window")); + + var hideLinks = jsPlumb.getSelector(".drag-drop-demo .hide"); + instance.on(hideLinks, "click", function (e) { + instance.toggleVisible(this.getAttribute("rel")); + jsPlumbUtil.consume(e); + }); + + var dragLinks = jsPlumb.getSelector(".drag-drop-demo .drag"); + instance.on(dragLinks, "click", function (e) { + var s = instance.toggleDraggable(this.getAttribute("rel")); + this.innerHTML = s ? "disable dragging" : "enable dragging"; + jsPlumbUtil.consume(e); + }); + + var detachLinks = jsPlumb.getSelector(".drag-drop-demo .detach"); + instance.on(detachLinks, "click", function (e) { + instance.deleteConnectionsForElement(this.getAttribute("rel")); + jsPlumbUtil.consume(e); + }); + + // ! reset + instance.on(document.getElementById("reset"), "click", function (e) { + // instance.detachEveryConnection(); + instance.deleteEveryConnection() + showConnectionInfo(""); + jsPlumbUtil.consume(e); + }); + }); + + jsPlumb.fire("jsPlumbDemoLoaded", instance); + }); + +})(); diff --git a/experiment/simulation/EE6/helper/cable/js/jsplumb.js b/experiment/simulation/EE6/helper/cable/js/jsplumb.js new file mode 100644 index 0000000..5c66789 --- /dev/null +++ b/experiment/simulation/EE6/helper/cable/js/jsplumb.js @@ -0,0 +1,15949 @@ +/** + * jsBezier + * + * Copyright (c) 2010 - 2017 jsPlumb (hello@jsplumbtoolkit.com) + * + * licensed under the MIT license. + * + * a set of Bezier curve functions that deal with Beziers, used by jsPlumb, and perhaps useful for other people. These functions work with Bezier + * curves of arbitrary degree. + * + * - functions are all in the 'jsBezier' namespace. + * + * - all input points should be in the format {x:.., y:..}. all output points are in this format too. + * + * - all input curves should be in the format [ {x:.., y:..}, {x:.., y:..}, {x:.., y:..}, {x:.., y:..} ] + * + * - 'location' as used as an input here refers to a decimal in the range 0-1 inclusive, which indicates a point some proportion along the length + * of the curve. location as output has the same format and meaning. + * + * + * Function List: + * -------------- + * + * distanceFromCurve(point, curve) + * + * Calculates the distance that the given point lies from the given Bezier. Note that it is computed relative to the center of the Bezier, + * so if you have stroked the curve with a wide pen you may wish to take that into account! The distance returned is relative to the values + * of the curve and the point - it will most likely be pixels. + * + * gradientAtPoint(curve, location) + * + * Calculates the gradient to the curve at the given location, as a decimal between 0 and 1 inclusive. + * + * gradientAtPointAlongCurveFrom (curve, location) + * + * Calculates the gradient at the point on the given curve that is 'distance' units from location. + * + * nearestPointOnCurve(point, curve) + * + * Calculates the nearest point to the given point on the given curve. The return value of this is a JS object literal, containing both the + *point's coordinates and also the 'location' of the point (see above), for example: { point:{x:551,y:150}, location:0.263365 }. + * + * pointOnCurve(curve, location) + * + * Calculates the coordinates of the point on the given Bezier curve at the given location. + * + * pointAlongCurveFrom(curve, location, distance) + * + * Calculates the coordinates of the point on the given curve that is 'distance' units from location. 'distance' should be in the same coordinate + * space as that used to construct the Bezier curve. For an HTML Canvas usage, for example, distance would be a measure of pixels. + * + * locationAlongCurveFrom(curve, location, distance) + * + * Calculates the location on the given curve that is 'distance' units from location. 'distance' should be in the same coordinate + * space as that used to construct the Bezier curve. For an HTML Canvas usage, for example, distance would be a measure of pixels. + * + * perpendicularToCurveAt(curve, location, length, distance) + * + * Calculates the perpendicular to the given curve at the given location. length is the length of the line you wish for (it will be centered + * on the point at 'location'). distance is optional, and allows you to specify a point along the path from the given location as the center of + * the perpendicular returned. The return value of this is an array of two points: [ {x:...,y:...}, {x:...,y:...} ]. + * + * + */ + + (function() { + + var root = this; + + if(typeof Math.sgn == "undefined") { + Math.sgn = function(x) { return x == 0 ? 0 : x > 0 ? 1 :-1; }; + } + + var Vectors = { + subtract : function(v1, v2) { return {x:v1.x - v2.x, y:v1.y - v2.y }; }, + dotProduct : function(v1, v2) { return (v1.x * v2.x) + (v1.y * v2.y); }, + square : function(v) { return Math.sqrt((v.x * v.x) + (v.y * v.y)); }, + scale : function(v, s) { return {x:v.x * s, y:v.y * s }; } + }, + + maxRecursion = 64, + flatnessTolerance = Math.pow(2.0,-maxRecursion-1); + + /** + * Calculates the distance that the point lies from the curve. + * + * @param point a point in the form {x:567, y:3342} + * @param curve a Bezier curve in the form [{x:..., y:...}, {x:..., y:...}, {x:..., y:...}, {x:..., y:...}]. note that this is currently + * hardcoded to assume cubiz beziers, but would be better off supporting any degree. + * @return a JS object literal containing location and distance, for example: {location:0.35, distance:10}. Location is analogous to the location + * argument you pass to the pointOnPath function: it is a ratio of distance travelled along the curve. Distance is the distance in pixels from + * the point to the curve. + */ + var _distanceFromCurve = function(point, curve) { + var candidates = [], + w = _convertToBezier(point, curve), + degree = curve.length - 1, higherDegree = (2 * degree) - 1, + numSolutions = _findRoots(w, higherDegree, candidates, 0), + v = Vectors.subtract(point, curve[0]), dist = Vectors.square(v), t = 0.0; + + for (var i = 0; i < numSolutions; i++) { + v = Vectors.subtract(point, _bezier(curve, degree, candidates[i], null, null)); + var newDist = Vectors.square(v); + if (newDist < dist) { + dist = newDist; + t = candidates[i]; + } + } + v = Vectors.subtract(point, curve[degree]); + newDist = Vectors.square(v); + if (newDist < dist) { + dist = newDist; + t = 1.0; + } + return {location:t, distance:dist}; + }; + /** + * finds the nearest point on the curve to the given point. + */ + var _nearestPointOnCurve = function(point, curve) { + var td = _distanceFromCurve(point, curve); + return {point:_bezier(curve, curve.length - 1, td.location, null, null), location:td.location}; + }; + var _convertToBezier = function(point, curve) { + var degree = curve.length - 1, higherDegree = (2 * degree) - 1, + c = [], d = [], cdTable = [], w = [], + z = [ [1.0, 0.6, 0.3, 0.1], [0.4, 0.6, 0.6, 0.4], [0.1, 0.3, 0.6, 1.0] ]; + + for (var i = 0; i <= degree; i++) c[i] = Vectors.subtract(curve[i], point); + for (var i = 0; i <= degree - 1; i++) { + d[i] = Vectors.subtract(curve[i+1], curve[i]); + d[i] = Vectors.scale(d[i], 3.0); + } + for (var row = 0; row <= degree - 1; row++) { + for (var column = 0; column <= degree; column++) { + if (!cdTable[row]) cdTable[row] = []; + cdTable[row][column] = Vectors.dotProduct(d[row], c[column]); + } + } + for (i = 0; i <= higherDegree; i++) { + if (!w[i]) w[i] = []; + w[i].y = 0.0; + w[i].x = parseFloat(i) / higherDegree; + } + var n = degree, m = degree-1; + for (var k = 0; k <= n + m; k++) { + var lb = Math.max(0, k - m), + ub = Math.min(k, n); + for (i = lb; i <= ub; i++) { + var j = k - i; + w[i+j].y += cdTable[j][i] * z[j][i]; + } + } + return w; + }; + /** + * counts how many roots there are. + */ + var _findRoots = function(w, degree, t, depth) { + var left = [], right = [], + left_count, right_count, + left_t = [], right_t = []; + + switch (_getCrossingCount(w, degree)) { + case 0 : { + return 0; + } + case 1 : { + if (depth >= maxRecursion) { + t[0] = (w[0].x + w[degree].x) / 2.0; + return 1; + } + if (_isFlatEnough(w, degree)) { + t[0] = _computeXIntercept(w, degree); + return 1; + } + break; + } + } + _bezier(w, degree, 0.5, left, right); + left_count = _findRoots(left, degree, left_t, depth+1); + right_count = _findRoots(right, degree, right_t, depth+1); + for (var i = 0; i < left_count; i++) t[i] = left_t[i]; + for (var i = 0; i < right_count; i++) t[i+left_count] = right_t[i]; + return (left_count+right_count); + }; + var _getCrossingCount = function(curve, degree) { + var n_crossings = 0, sign, old_sign; + sign = old_sign = Math.sgn(curve[0].y); + for (var i = 1; i <= degree; i++) { + sign = Math.sgn(curve[i].y); + if (sign != old_sign) n_crossings++; + old_sign = sign; + } + return n_crossings; + }; + var _isFlatEnough = function(curve, degree) { + var error, + intercept_1, intercept_2, left_intercept, right_intercept, + a, b, c, det, dInv, a1, b1, c1, a2, b2, c2; + a = curve[0].y - curve[degree].y; + b = curve[degree].x - curve[0].x; + c = curve[0].x * curve[degree].y - curve[degree].x * curve[0].y; + + var max_distance_above, max_distance_below; + max_distance_above = max_distance_below = 0.0; + + for (var i = 1; i < degree; i++) { + var value = a * curve[i].x + b * curve[i].y + c; + if (value > max_distance_above) + max_distance_above = value; + else if (value < max_distance_below) + max_distance_below = value; + } + + a1 = 0.0; b1 = 1.0; c1 = 0.0; a2 = a; b2 = b; + c2 = c - max_distance_above; + det = a1 * b2 - a2 * b1; + dInv = 1.0/det; + intercept_1 = (b1 * c2 - b2 * c1) * dInv; + a2 = a; b2 = b; c2 = c - max_distance_below; + det = a1 * b2 - a2 * b1; + dInv = 1.0/det; + intercept_2 = (b1 * c2 - b2 * c1) * dInv; + left_intercept = Math.min(intercept_1, intercept_2); + right_intercept = Math.max(intercept_1, intercept_2); + error = right_intercept - left_intercept; + return (error < flatnessTolerance)? 1 : 0; + }; + var _computeXIntercept = function(curve, degree) { + var XLK = 1.0, YLK = 0.0, + XNM = curve[degree].x - curve[0].x, YNM = curve[degree].y - curve[0].y, + XMK = curve[0].x - 0.0, YMK = curve[0].y - 0.0, + det = XNM*YLK - YNM*XLK, detInv = 1.0/det, + S = (XNM*YMK - YNM*XMK) * detInv; + return 0.0 + XLK * S; + }; + var _bezier = function(curve, degree, t, left, right) { + var temp = [[]]; + for (var j =0; j <= degree; j++) temp[0][j] = curve[j]; + for (var i = 1; i <= degree; i++) { + for (var j =0 ; j <= degree - i; j++) { + if (!temp[i]) temp[i] = []; + if (!temp[i][j]) temp[i][j] = {}; + temp[i][j].x = (1.0 - t) * temp[i-1][j].x + t * temp[i-1][j+1].x; + temp[i][j].y = (1.0 - t) * temp[i-1][j].y + t * temp[i-1][j+1].y; + } + } + if (left != null) + for (j = 0; j <= degree; j++) left[j] = temp[j][0]; + if (right != null) + for (j = 0; j <= degree; j++) right[j] = temp[degree-j][j]; + + return (temp[degree][0]); + }; + + var _curveFunctionCache = {}; + var _getCurveFunctions = function(order) { + var fns = _curveFunctionCache[order]; + if (!fns) { + fns = []; + var f_term = function() { return function(t) { return Math.pow(t, order); }; }, + l_term = function() { return function(t) { return Math.pow((1-t), order); }; }, + c_term = function(c) { return function(t) { return c; }; }, + t_term = function() { return function(t) { return t; }; }, + one_minus_t_term = function() { return function(t) { return 1-t; }; }, + _termFunc = function(terms) { + return function(t) { + var p = 1; + for (var i = 0; i < terms.length; i++) p = p * terms[i](t); + return p; + }; + }; + + fns.push(new f_term()); // first is t to the power of the curve order + for (var i = 1; i < order; i++) { + var terms = [new c_term(order)]; + for (var j = 0 ; j < (order - i); j++) terms.push(new t_term()); + for (var j = 0 ; j < i; j++) terms.push(new one_minus_t_term()); + fns.push(new _termFunc(terms)); + } + fns.push(new l_term()); // last is (1-t) to the power of the curve order + + _curveFunctionCache[order] = fns; + } + + return fns; + }; + + + /** + * calculates a point on the curve, for a Bezier of arbitrary order. + * @param curve an array of control points, eg [{x:10,y:20}, {x:50,y:50}, {x:100,y:100}, {x:120,y:100}]. For a cubic bezier this should have four points. + * @param location a decimal indicating the distance along the curve the point should be located at. this is the distance along the curve as it travels, taking the way it bends into account. should be a number from 0 to 1, inclusive. + */ + var _pointOnPath = function(curve, location) { + var cc = _getCurveFunctions(curve.length - 1), + _x = 0, _y = 0; + for (var i = 0; i < curve.length ; i++) { + _x = _x + (curve[i].x * cc[i](location)); + _y = _y + (curve[i].y * cc[i](location)); + } + + return {x:_x, y:_y}; + }; + + var _dist = function(p1,p2) { + return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2)); + }; + + var _isPoint = function(curve) { + return curve[0].x === curve[1].x && curve[0].y === curve[1].y; + }; + + /** + * finds the point that is 'distance' along the path from 'location'. this method returns both the x,y location of the point and also + * its 'location' (proportion of travel along the path); the method below - _pointAlongPathFrom - calls this method and just returns the + * point. + */ + var _pointAlongPath = function(curve, location, distance) { + + if (_isPoint(curve)) { + return { + point:curve[0], + location:location + }; + } + + var prev = _pointOnPath(curve, location), + tally = 0, + curLoc = location, + direction = distance > 0 ? 1 : -1, + cur = null; + + while (tally < Math.abs(distance)) { + curLoc += (0.005 * direction); + cur = _pointOnPath(curve, curLoc); + tally += _dist(cur, prev); + prev = cur; + } + + return {point:cur, location:curLoc}; + }; + + var _length = function(curve) { + + var d = new Date().getTime(); + + if (_isPoint(curve)) return 0; + + var prev = _pointOnPath(curve, 0), + tally = 0, + curLoc = 0, + direction = 1, + cur = null; + + while (curLoc < 1) { + curLoc += (0.005 * direction); + cur = _pointOnPath(curve, curLoc); + tally += _dist(cur, prev); + prev = cur; + } + console.log("length", new Date().getTime() - d); + + return tally; + }; + + /** + * finds the point that is 'distance' along the path from 'location'. + */ + var _pointAlongPathFrom = function(curve, location, distance) { + return _pointAlongPath(curve, location, distance).point; + }; + + /** + * finds the location that is 'distance' along the path from 'location'. + */ + var _locationAlongPathFrom = function(curve, location, distance) { + return _pointAlongPath(curve, location, distance).location; + }; + + /** + * returns the gradient of the curve at the given location, which is a decimal between 0 and 1 inclusive. + * + * thanks // http://bimixual.org/AnimationLibrary/beziertangents.html + */ + var _gradientAtPoint = function(curve, location) { + + var p1 = _pointOnPath(curve, location), + p2 = _pointOnPath(curve.slice(0, curve.length - 1), location), + dy = p2.y - p1.y, dx = p2.x - p1.x; + + return dy === 0 ? Infinity : Math.atan(dy / dx); + }; + + /** + returns the gradient of the curve at the point which is 'distance' from the given location. + if this point is greater than location 1, the gradient at location 1 is returned. + if this point is less than location 0, the gradient at location 0 is returned. + */ + var _gradientAtPointAlongPathFrom = function(curve, location, distance) { + var p = _pointAlongPath(curve, location, distance); + if (p.location > 1) p.location = 1; + if (p.location < 0) p.location = 0; + return _gradientAtPoint(curve, p.location); + }; + + /** + * calculates a line that is 'length' pixels long, perpendicular to, and centered on, the path at 'distance' pixels from the given location. + * if distance is not supplied, the perpendicular for the given location is computed (ie. we set distance to zero). + */ + var _perpendicularToPathAt = function(curve, location, length, distance) { + distance = distance == null ? 0 : distance; + var p = _pointAlongPath(curve, location, distance), + m = _gradientAtPoint(curve, p.location), + _theta2 = Math.atan(-1 / m), + y = length / 2 * Math.sin(_theta2), + x = length / 2 * Math.cos(_theta2); + return [{x:p.point.x + x, y:p.point.y + y}, {x:p.point.x - x, y:p.point.y - y}]; + }; + + /** + * Calculates all intersections of the given line with the given curve. + * @param x1 + * @param y1 + * @param x2 + * @param y2 + * @param curve + * @returns {Array} + */ + var _lineIntersection = function(x1, y1, x2, y2, curve) { + var a = y2 - y1, + b = x1 - x2, + c = (x1 * (y1 - y2)) + (y1 * (x2-x1)), + coeffs = _computeCoefficients(curve), + p = [ + (a*coeffs[0][0]) + (b * coeffs[1][0]), + (a*coeffs[0][1])+(b*coeffs[1][1]), + (a*coeffs[0][2])+(b*coeffs[1][2]), + (a*coeffs[0][3])+(b*coeffs[1][3]) + c + ], + r = _cubicRoots.apply(null, p), + intersections = []; + + if (r != null) { + + for (var i = 0; i < 3; i++) { + var t = r[i], + t2 = Math.pow(t, 2), + t3 = Math.pow(t, 3), + x = [ + (coeffs[0][0] * t3) + (coeffs[0][1] * t2) + (coeffs[0][2] * t) + coeffs[0][3], + (coeffs[1][0] * t3) + (coeffs[1][1] * t2) + (coeffs[1][2] * t) + coeffs[1][3] + ]; + + // check bounds of the line + var s; + if ((x2 - x1) !== 0) { + s = (x[0] - x1) / (x2 - x1); + } + else { + s = (x[1] - y1) / (y2 - y1); + } + + if (t >= 0 && t <= 1.0 && s >= 0 && s <= 1.0) { + intersections.push(x); + } + } + } + + return intersections; + }; + + /** + * Calculates all intersections of the given box with the given curve. + * @param x X position of top left corner of box + * @param y Y position of top left corner of box + * @param w width of box + * @param h height of box + * @param curve + * @returns {Array} + */ + var _boxIntersection = function(x, y, w, h, curve) { + var i = []; + i.push.apply(i, _lineIntersection(x, y, x + w, y, curve)); + i.push.apply(i, _lineIntersection(x + w, y, x + w, y + h, curve)); + i.push.apply(i, _lineIntersection(x + w, y + h, x, y + h, curve)); + i.push.apply(i, _lineIntersection(x, y + h, x, y, curve)); + return i; + }; + + /** + * Calculates all intersections of the given bounding box with the given curve. + * @param boundingBox Bounding box, in { x:.., y:..., w:..., h:... } format. + * @param curve + * @returns {Array} + */ + var _boundingBoxIntersection = function(boundingBox, curve) { + var i = []; + i.push.apply(i, _lineIntersection(boundingBox.x, boundingBox.y, boundingBox.x + boundingBox.w, boundingBox.y, curve)); + i.push.apply(i, _lineIntersection(boundingBox.x + boundingBox.w, boundingBox.y, boundingBox.x + boundingBox.w, boundingBox.y + boundingBox.h, curve)); + i.push.apply(i, _lineIntersection(boundingBox.x + boundingBox.w, boundingBox.y + boundingBox.h, boundingBox.x, boundingBox.y + boundingBox.h, curve)); + i.push.apply(i, _lineIntersection(boundingBox.x, boundingBox.y + boundingBox.h, boundingBox.x, boundingBox.y, curve)); + return i; + }; + + + function _computeCoefficientsForAxis(curve, axis) { + return [ + -(curve[0][axis]) + (3*curve[1][axis]) + (-3 * curve[2][axis]) + curve[3][axis], + (3*(curve[0][axis])) - (6*(curve[1][axis])) + (3*(curve[2][axis])), + -3*curve[0][axis] + 3*curve[1][axis], + curve[0][axis] + ]; + } + + function _computeCoefficients(curve) + { + return [ + _computeCoefficientsForAxis(curve, "x"), + _computeCoefficientsForAxis(curve, "y") + ]; + } + + function sgn(x) { + return x < 0 ? -1 : x > 0 ? 1 : 0; + } + + function _cubicRoots(a, b, c, d) { + var A = b / a, + B = c / a, + C = d / a, + Q = (3*B - Math.pow(A, 2))/9, + R = (9*A*B - 27*C - 2*Math.pow(A, 3))/54, + D = Math.pow(Q, 3) + Math.pow(R, 2), + S, + T, + t = []; + + if (D >= 0) // complex or duplicate roots + { + S = sgn(R + Math.sqrt(D))*Math.pow(Math.abs(R + Math.sqrt(D)),(1/3)); + T = sgn(R - Math.sqrt(D))*Math.pow(Math.abs(R - Math.sqrt(D)),(1/3)); + + t[0] = -A/3 + (S + T); + t[1] = -A/3 - (S + T)/2; + t[2] = -A/3 - (S + T)/2; + + /*discard complex roots*/ + if (Math.abs(Math.sqrt(3)*(S - T)/2) !== 0) { + t[1] = -1; + t[2] = -1; + } + } + else // distinct real roots + { + var th = Math.acos(R/Math.sqrt(-Math.pow(Q, 3))); + t[0] = 2*Math.sqrt(-Q)*Math.cos(th/3) - A/3; + t[1] = 2*Math.sqrt(-Q)*Math.cos((th + 2*Math.PI)/3) - A/3; + t[2] = 2*Math.sqrt(-Q)*Math.cos((th + 4*Math.PI)/3) - A/3; + } + + // discard out of spec roots + for (var i = 0; i < 3; i++) { + if (t[i] < 0 || t[i] > 1.0) { + t[i] = -1; + } + } + + return t; + } + + var jsBezier = this.jsBezier = { + distanceFromCurve : _distanceFromCurve, + gradientAtPoint : _gradientAtPoint, + gradientAtPointAlongCurveFrom : _gradientAtPointAlongPathFrom, + nearestPointOnCurve : _nearestPointOnCurve, + pointOnCurve : _pointOnPath, + pointAlongCurveFrom : _pointAlongPathFrom, + perpendicularToCurveAt : _perpendicularToPathAt, + locationAlongCurveFrom:_locationAlongPathFrom, + getLength:_length, + lineIntersection:_lineIntersection, + boxIntersection:_boxIntersection, + boundingBoxIntersection:_boundingBoxIntersection, + version:"0.9.0" + }; + + if (typeof exports !== "undefined") { + exports.jsBezier = jsBezier; + } + +}).call(typeof window !== 'undefined' ? window : this); + +/** + * Biltong v0.4.0 + * + * Various geometry functions written as part of jsPlumb and perhaps useful for others. + * + * Copyright (c) 2017 jsPlumb + * https://jsplumbtoolkit.com + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +;(function() { + + "use strict"; + var root = this; + + var Biltong = root.Biltong = { + version:"0.4.0" + }; + + if (typeof exports !== "undefined") { + exports.Biltong = Biltong; + } + + var _isa = function(a) { return Object.prototype.toString.call(a) === "[object Array]"; }, + _pointHelper = function(p1, p2, fn) { + p1 = _isa(p1) ? p1 : [p1.x, p1.y]; + p2 = _isa(p2) ? p2 : [p2.x, p2.y]; + return fn(p1, p2); + }, + /** + * @name Biltong.gradient + * @function + * @desc Calculates the gradient of a line between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The gradient of a line between the two points. + */ + _gradient = Biltong.gradient = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + if (_p2[0] == _p1[0]) + return _p2[1] > _p1[1] ? Infinity : -Infinity; + else if (_p2[1] == _p1[1]) + return _p2[0] > _p1[0] ? 0 : -0; + else + return (_p2[1] - _p1[1]) / (_p2[0] - _p1[0]); + }); + }, + /** + * @name Biltong.normal + * @function + * @desc Calculates the gradient of a normal to a line between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The gradient of a normal to a line between the two points. + */ + _normal = Biltong.normal = function(p1, p2) { + return -1 / _gradient(p1, p2); + }, + /** + * @name Biltong.lineLength + * @function + * @desc Calculates the length of a line between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The length of a line between the two points. + */ + _lineLength = Biltong.lineLength = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + return Math.sqrt(Math.pow(_p2[1] - _p1[1], 2) + Math.pow(_p2[0] - _p1[0], 2)); + }); + }, + /** + * @name Biltong.quadrant + * @function + * @desc Calculates the quadrant in which the angle between the two points lies. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Integer} The quadrant - 1 for upper right, 2 for lower right, 3 for lower left, 4 for upper left. + */ + _quadrant = Biltong.quadrant = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + if (_p2[0] > _p1[0]) { + return (_p2[1] > _p1[1]) ? 2 : 1; + } + else if (_p2[0] == _p1[0]) { + return _p2[1] > _p1[1] ? 2 : 1; + } + else { + return (_p2[1] > _p1[1]) ? 3 : 4; + } + }); + }, + /** + * @name Biltong.theta + * @function + * @desc Calculates the angle between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The angle between the two points. + */ + _theta = Biltong.theta = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + var m = _gradient(_p1, _p2), + t = Math.atan(m), + s = _quadrant(_p1, _p2); + if ((s == 4 || s== 3)) t += Math.PI; + if (t < 0) t += (2 * Math.PI); + + return t; + }); + }, + /** + * @name Biltong.intersects + * @function + * @desc Calculates whether or not the two rectangles intersect. + * @param {Rectangle} r1 First rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @param {Rectangle} r2 Second rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @return {Boolean} True if the rectangles intersect, false otherwise. + */ + _intersects = Biltong.intersects = function(r1, r2) { + var x1 = r1.x, x2 = r1.x + r1.w, y1 = r1.y, y2 = r1.y + r1.h, + a1 = r2.x, a2 = r2.x + r2.w, b1 = r2.y, b2 = r2.y + r2.h; + + return ( (x1 <= a1 && a1 <= x2) && (y1 <= b1 && b1 <= y2) ) || + ( (x1 <= a2 && a2 <= x2) && (y1 <= b1 && b1 <= y2) ) || + ( (x1 <= a1 && a1 <= x2) && (y1 <= b2 && b2 <= y2) ) || + ( (x1 <= a2 && a1 <= x2) && (y1 <= b2 && b2 <= y2) ) || + ( (a1 <= x1 && x1 <= a2) && (b1 <= y1 && y1 <= b2) ) || + ( (a1 <= x2 && x2 <= a2) && (b1 <= y1 && y1 <= b2) ) || + ( (a1 <= x1 && x1 <= a2) && (b1 <= y2 && y2 <= b2) ) || + ( (a1 <= x2 && x1 <= a2) && (b1 <= y2 && y2 <= b2) ); + }, + /** + * @name Biltong.encloses + * @function + * @desc Calculates whether or not r2 is completely enclosed by r1. + * @param {Rectangle} r1 First rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @param {Rectangle} r2 Second rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @param {Boolean} [allowSharedEdges=false] If true, the concept of enclosure allows for one or more edges to be shared by the two rectangles. + * @return {Boolean} True if r1 encloses r2, false otherwise. + */ + _encloses = Biltong.encloses = function(r1, r2, allowSharedEdges) { + var x1 = r1.x, x2 = r1.x + r1.w, y1 = r1.y, y2 = r1.y + r1.h, + a1 = r2.x, a2 = r2.x + r2.w, b1 = r2.y, b2 = r2.y + r2.h, + c = function(v1, v2, v3, v4) { return allowSharedEdges ? v1 <= v2 && v3>= v4 : v1 < v2 && v3 > v4; }; + + return c(x1,a1,x2,a2) && c(y1,b1,y2,b2); + }, + _segmentMultipliers = [null, [1, -1], [1, 1], [-1, 1], [-1, -1] ], + _inverseSegmentMultipliers = [null, [-1, -1], [-1, 1], [1, 1], [1, -1] ], + /** + * @name Biltong.pointOnLine + * @function + * @desc Calculates a point on the line from `fromPoint` to `toPoint` that is `distance` units along the length of the line. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Point} Point on the line, in the form `{ x:..., y:... }`. + */ + _pointOnLine = Biltong.pointOnLine = function(fromPoint, toPoint, distance) { + var m = _gradient(fromPoint, toPoint), + s = _quadrant(fromPoint, toPoint), + segmentMultiplier = distance > 0 ? _segmentMultipliers[s] : _inverseSegmentMultipliers[s], + theta = Math.atan(m), + y = Math.abs(distance * Math.sin(theta)) * segmentMultiplier[1], + x = Math.abs(distance * Math.cos(theta)) * segmentMultiplier[0]; + return { x:fromPoint.x + x, y:fromPoint.y + y }; + }, + /** + * @name Biltong.perpendicularLineTo + * @function + * @desc Calculates a line of length `length` that is perpendicular to the line from `fromPoint` to `toPoint` and passes through `toPoint`. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Line} Perpendicular line, in the form `[ { x:..., y:... }, { x:..., y:... } ]`. + */ + _perpendicularLineTo = Biltong.perpendicularLineTo = function(fromPoint, toPoint, length) { + var m = _gradient(fromPoint, toPoint), + theta2 = Math.atan(-1 / m), + y = length / 2 * Math.sin(theta2), + x = length / 2 * Math.cos(theta2); + return [{x:toPoint.x + x, y:toPoint.y + y}, {x:toPoint.x - x, y:toPoint.y - y}]; + }; +}).call(typeof window !== 'undefined' ? window : this); +; +(function () { + + "use strict"; + + /** + * Creates a Touch object. + * @param view + * @param target + * @param pageX + * @param pageY + * @param screenX + * @param screenY + * @param clientX + * @param clientY + * @returns {Touch} + * @private + */ + function _touch(view, target, pageX, pageY, screenX, screenY, clientX, clientY) { + + return new Touch({ + target:target, + identifier:_uuid(), + pageX: pageX, + pageY: pageY, + screenX: screenX, + screenY: screenY, + clientX: clientX || screenX, + clientY: clientY || screenY + }); + } + + /** + * Create a synthetic touch list from the given list of Touch objects. + * @returns {Array} + * @private + */ + function _touchList() { + var list = []; + Array.prototype.push.apply(list, arguments); + list.item = function(index) { return this[index]; }; + return list; + } + + /** + * Create a Touch object and then insert it into a synthetic touch list, returning the list.s + * @param view + * @param target + * @param pageX + * @param pageY + * @param screenX + * @param screenY + * @param clientX + * @param clientY + * @returns {Array} + * @private + */ + function _touchAndList(view, target, pageX, pageY, screenX, screenY, clientX, clientY) { + return _touchList(_touch.apply(null, arguments)); + } + + var root = this, + matchesSelector = function (el, selector, ctx) { + ctx = ctx || el.parentNode; + var possibles = ctx.querySelectorAll(selector); + for (var i = 0; i < possibles.length; i++) { + if (possibles[i] === el) { + return true; + } + } + return false; + }, + _gel = function (el) { + return (typeof el == "string" || el.constructor === String) ? document.getElementById(el) : el; + }, + _t = function (e) { + return e.srcElement || e.target; + }, + // + // gets path info for the given event - the path from target to obj, in the event's bubble chain. if doCompute + // is false we just return target for the path. + // + _pi = function(e, target, obj, doCompute) { + if (!doCompute) return { path:[target], end:1 }; + else if (typeof e.path !== "undefined" && e.path.indexOf) { + return { path: e.path, end: e.path.indexOf(obj) }; + } else { + var out = { path:[], end:-1 }, _one = function(el) { + out.path.push(el); + if (el === obj) { + out.end = out.path.length - 1; + } + else if (el.parentNode != null) { + _one(el.parentNode) + } + }; + _one(target); + return out; + } + }, + _d = function (l, fn) { + for (var i = 0, j = l.length; i < j; i++) { + if (l[i] == fn) break; + } + if (i < l.length) l.splice(i, 1); + }, + guid = 1, + // + // this function generates a guid for every handler, sets it on the handler, then adds + // it to the associated object's map of handlers for the given event. this is what enables us + // to unbind all events of some type, or all events (the second of which can be requested by the user, + // but it also used by Mottle when an element is removed.) + _store = function (obj, event, fn) { + var g = guid++; + obj.__ta = obj.__ta || {}; + obj.__ta[event] = obj.__ta[event] || {}; + // store each handler with a unique guid. + obj.__ta[event][g] = fn; + // set the guid on the handler. + fn.__tauid = g; + return g; + }, + _unstore = function (obj, event, fn) { + obj.__ta && obj.__ta[event] && delete obj.__ta[event][fn.__tauid]; + // a handler might have attached extra functions, so we unbind those too. + if (fn.__taExtra) { + for (var i = 0; i < fn.__taExtra.length; i++) { + _unbind(obj, fn.__taExtra[i][0], fn.__taExtra[i][1]); + } + fn.__taExtra.length = 0; + } + // a handler might have attached an unstore callback + fn.__taUnstore && fn.__taUnstore(); + }, + _curryChildFilter = function (children, obj, fn, evt) { + if (children == null) return fn; + else { + var c = children.split(","), + _fn = function (e) { + _fn.__tauid = fn.__tauid; + var t = _t(e), target = t; // t is the target element on which the event occurred. it is the + // element we will wish to pass to any callbacks. + var pathInfo = _pi(e, t, obj, children != null) + if (pathInfo.end != -1) { + for (var p = 0; p < pathInfo.end; p++) { + target = pathInfo.path[p]; + for (var i = 0; i < c.length; i++) { + if (matchesSelector(target, c[i], obj)) { + fn.apply(target, arguments); + } + } + } + } + }; + registerExtraFunction(fn, evt, _fn); + return _fn; + } + }, + // + // registers an 'extra' function on some event listener function we were given - a function that we + // created and bound to the element as part of our housekeeping, and which we want to unbind and remove + // whenever the given function is unbound. + registerExtraFunction = function (fn, evt, newFn) { + fn.__taExtra = fn.__taExtra || []; + fn.__taExtra.push([evt, newFn]); + }, + DefaultHandler = function (obj, evt, fn, children) { + if (isTouchDevice && touchMap[evt]) { + var tfn = _curryChildFilter(children, obj, fn, touchMap[evt]); + _bind(obj, touchMap[evt], tfn , fn); + } + if (evt === "focus" && obj.getAttribute("tabindex") == null) { + obj.setAttribute("tabindex", "1"); + } + _bind(obj, evt, _curryChildFilter(children, obj, fn, evt), fn); + }, + SmartClickHandler = function (obj, evt, fn, children) { + if (obj.__taSmartClicks == null) { + var down = function (e) { + obj.__tad = _pageLocation(e); + }, + up = function (e) { + obj.__tau = _pageLocation(e); + }, + click = function (e) { + if (obj.__tad && obj.__tau && obj.__tad[0] === obj.__tau[0] && obj.__tad[1] === obj.__tau[1]) { + for (var i = 0; i < obj.__taSmartClicks.length; i++) + obj.__taSmartClicks[i].apply(_t(e), [ e ]); + } + }; + DefaultHandler(obj, "mousedown", down, children); + DefaultHandler(obj, "mouseup", up, children); + DefaultHandler(obj, "click", click, children); + obj.__taSmartClicks = []; + } + + // store in the list of callbacks + obj.__taSmartClicks.push(fn); + // the unstore function removes this function from the object's listener list for this type. + fn.__taUnstore = function () { + _d(obj.__taSmartClicks, fn); + }; + }, + _tapProfiles = { + "tap": {touches: 1, taps: 1}, + "dbltap": {touches: 1, taps: 2}, + "contextmenu": {touches: 2, taps: 1} + }, + TapHandler = function (clickThreshold, dblClickThreshold) { + return function (obj, evt, fn, children) { + // if event is contextmenu, for devices which are mouse only, we want to + // use the default bind. + if (evt == "contextmenu" && isMouseDevice) + DefaultHandler(obj, evt, fn, children); + else { + // the issue here is that this down handler gets registered only for the + // child nodes in the first registration. in fact it should be registered with + // no child selector and then on down we should cycle through the registered + // functions to see if one of them matches. on mouseup we should execute ALL of + // the functions whose children are either null or match the element. + if (obj.__taTapHandler == null) { + var tt = obj.__taTapHandler = { + tap: [], + dbltap: [], + contextmenu: [], + down: false, + taps: 0, + downSelectors: [] + }; + var down = function (e) { + var target = _t(e), pathInfo = _pi(e, target, obj, children != null), finished = false; + for (var p = 0; p < pathInfo.end; p++) { + if (finished) return; + target = pathInfo.path[p]; + for (var i = 0; i < tt.downSelectors.length; i++) { + if (tt.downSelectors[i] == null || matchesSelector(target, tt.downSelectors[i], obj)) { + tt.down = true; + setTimeout(clearSingle, clickThreshold); + setTimeout(clearDouble, dblClickThreshold); + finished = true; + break; // we only need one match on mousedown + } + } + } + }, + up = function (e) { + if (tt.down) { + var target = _t(e), currentTarget, pathInfo; + tt.taps++; + var tc = _touchCount(e); + for (var eventId in _tapProfiles) { + if (_tapProfiles.hasOwnProperty(eventId)) { + var p = _tapProfiles[eventId]; + if (p.touches === tc && (p.taps === 1 || p.taps === tt.taps)) { + for (var i = 0; i < tt[eventId].length; i++) { + pathInfo = _pi(e, target, obj, tt[eventId][i][1] != null); + for (var pLoop = 0; pLoop < pathInfo.end; pLoop++) { + currentTarget = pathInfo.path[pLoop]; + // this is a single event registration handler. + if (tt[eventId][i][1] == null || matchesSelector(currentTarget, tt[eventId][i][1], obj)) { + tt[eventId][i][0].apply(currentTarget, [ e ]); + break; + } + } + } + } + } + } + } + }, + clearSingle = function () { + tt.down = false; + }, + clearDouble = function () { + tt.taps = 0; + }; + + DefaultHandler(obj, "mousedown", down); + DefaultHandler(obj, "mouseup", up); + } + // add this child selector (it can be null, that's fine). + obj.__taTapHandler.downSelectors.push(children); + + obj.__taTapHandler[evt].push([fn, children]); + // the unstore function removes this function from the object's listener list for this type. + fn.__taUnstore = function () { + _d(obj.__taTapHandler[evt], fn); + }; + } + }; + }, + meeHelper = function (type, evt, obj, target) { + for (var i in obj.__tamee[type]) { + if (obj.__tamee[type].hasOwnProperty(i)) { + obj.__tamee[type][i].apply(target, [ evt ]); + } + } + }, + MouseEnterExitHandler = function () { + var activeElements = []; + return function (obj, evt, fn, children) { + if (!obj.__tamee) { + // __tamee holds a flag saying whether the mouse is currently "in" the element, and a list of + // both mouseenter and mouseexit functions. + obj.__tamee = { over: false, mouseenter: [], mouseexit: [] }; + // register over and out functions + var over = function (e) { + var t = _t(e); + if ((children == null && (t == obj && !obj.__tamee.over)) || (matchesSelector(t, children, obj) && (t.__tamee == null || !t.__tamee.over))) { + meeHelper("mouseenter", e, obj, t); + t.__tamee = t.__tamee || {}; + t.__tamee.over = true; + activeElements.push(t); + } + }, + out = function (e) { + var t = _t(e); + // is the current target one of the activeElements? and is the + // related target NOT a descendant of it? + for (var i = 0; i < activeElements.length; i++) { + if (t == activeElements[i] && !matchesSelector((e.relatedTarget || e.toElement), "*", t)) { + t.__tamee.over = false; + activeElements.splice(i, 1); + meeHelper("mouseexit", e, obj, t); + } + } + }; + + _bind(obj, "mouseover", _curryChildFilter(children, obj, over, "mouseover"), over); + _bind(obj, "mouseout", _curryChildFilter(children, obj, out, "mouseout"), out); + } + + fn.__taUnstore = function () { + delete obj.__tamee[evt][fn.__tauid]; + }; + + _store(obj, evt, fn); + obj.__tamee[evt][fn.__tauid] = fn; + }; + }, + isTouchDevice = "ontouchstart" in document.documentElement || navigator.maxTouchPoints, + isMouseDevice = "onmousedown" in document.documentElement, + touchMap = { "mousedown": "touchstart", "mouseup": "touchend", "mousemove": "touchmove" }, + touchstart = "touchstart", touchend = "touchend", touchmove = "touchmove", + iev = (function () { + var rv = -1; + if (navigator.appName == 'Microsoft Internet Explorer') { + var ua = navigator.userAgent, + re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); + if (re.exec(ua) != null) + rv = parseFloat(RegExp.$1); + } + return rv; + })(), + isIELT9 = iev > -1 && iev < 9, + _genLoc = function (e, prefix) { + if (e == null) return [ 0, 0 ]; + var ts = _touches(e), t = _getTouch(ts, 0); + return [t[prefix + "X"], t[prefix + "Y"]]; + }, + _pageLocation = function (e) { + if (e == null) return [ 0, 0 ]; + if (isIELT9) { + return [ e.clientX + document.documentElement.scrollLeft, e.clientY + document.documentElement.scrollTop ]; + } + else { + return _genLoc(e, "page"); + } + }, + _screenLocation = function (e) { + return _genLoc(e, "screen"); + }, + _clientLocation = function (e) { + return _genLoc(e, "client"); + }, + _getTouch = function (touches, idx) { + return touches.item ? touches.item(idx) : touches[idx]; + }, + _touches = function (e) { + return e.touches && e.touches.length > 0 ? e.touches : + e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches : + e.targetTouches && e.targetTouches.length > 0 ? e.targetTouches : + [ e ]; + }, + _touchCount = function (e) { + return _touches(e).length; + }, + //http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html + _bind = function (obj, type, fn, originalFn) { + _store(obj, type, fn); + originalFn.__tauid = fn.__tauid; + if (obj.addEventListener) + obj.addEventListener(type, fn, false); + else if (obj.attachEvent) { + var key = type + fn.__tauid; + obj["e" + key] = fn; + // TODO look at replacing with .call(..) + obj[key] = function () { + obj["e" + key] && obj["e" + key](window.event); + }; + obj.attachEvent("on" + type, obj[key]); + } + }, + _unbind = function (obj, type, fn) { + if (fn == null) return; + _each(obj, function () { + var _el = _gel(this); + _unstore(_el, type, fn); + // it has been bound if there is a tauid. otherwise it was not bound and we can ignore it. + if (fn.__tauid != null) { + if (_el.removeEventListener) { + _el.removeEventListener(type, fn, false); + if (isTouchDevice && touchMap[type]) _el.removeEventListener(touchMap[type], fn, false); + } + else if (this.detachEvent) { + var key = type + fn.__tauid; + _el[key] && _el.detachEvent("on" + type, _el[key]); + _el[key] = null; + _el["e" + key] = null; + } + } + + // if a touch event was also registered, deregister now. + if (fn.__taTouchProxy) { + _unbind(obj, fn.__taTouchProxy[1], fn.__taTouchProxy[0]); + } + }); + }, + _each = function (obj, fn) { + if (obj == null) return; + // if a list (or list-like), use it. if a string, get a list + // by running the string through querySelectorAll. else, assume + // it's an Element. + // obj.top is "unknown" in IE8. + obj = (typeof Window !== "undefined" && (typeof obj.top !== "unknown" && obj == obj.top)) ? [ obj ] : + (typeof obj !== "string") && (obj.tagName == null && obj.length != null) ? obj : + typeof obj === "string" ? document.querySelectorAll(obj) + : [ obj ]; + + for (var i = 0; i < obj.length; i++) + fn.apply(obj[i]); + }, + _uuid = function () { + return ('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + })); + }; + + /** + * Mottle offers support for abstracting out the differences + * between touch and mouse devices, plus "smart click" functionality + * (don't fire click if the mouse has moved between mousedown and mouseup), + * and synthesized click/tap events. + * @class Mottle + * @constructor + * @param {Object} params Constructor params + * @param {Number} [params.clickThreshold=250] Threshold, in milliseconds beyond which a touchstart followed by a touchend is not considered to be a click. + * @param {Number} [params.dblClickThreshold=450] Threshold, in milliseconds beyond which two successive tap events are not considered to be a click. + * @param {Boolean} [params.smartClicks=false] If true, won't fire click events if the mouse has moved between mousedown and mouseup. Note that this functionality + * requires that Mottle consume the mousedown event, and so may not be viable in all use cases. + */ + root.Mottle = function (params) { + params = params || {}; + var clickThreshold = params.clickThreshold || 250, + dblClickThreshold = params.dblClickThreshold || 450, + mouseEnterExitHandler = new MouseEnterExitHandler(), + tapHandler = new TapHandler(clickThreshold, dblClickThreshold), + _smartClicks = params.smartClicks, + _doBind = function (obj, evt, fn, children) { + if (fn == null) return; + _each(obj, function () { + var _el = _gel(this); + if (_smartClicks && evt === "click") + SmartClickHandler(_el, evt, fn, children); + else if (evt === "tap" || evt === "dbltap" || evt === "contextmenu") { + tapHandler(_el, evt, fn, children); + } + else if (evt === "mouseenter" || evt == "mouseexit") + mouseEnterExitHandler(_el, evt, fn, children); + else + DefaultHandler(_el, evt, fn, children); + }); + }; + + /** + * Removes an element from the DOM, and deregisters all event handlers for it. You should use this + * to ensure you don't leak memory. + * @method remove + * @param {String|Element} el Element, or id of the element, to remove. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.remove = function (el) { + _each(el, function () { + var _el = _gel(this); + if (_el.__ta) { + for (var evt in _el.__ta) { + if (_el.__ta.hasOwnProperty(evt)) { + for (var h in _el.__ta[evt]) { + if (_el.__ta[evt].hasOwnProperty(h)) + _unbind(_el, evt, _el.__ta[evt][h]); + } + } + } + } + _el.parentNode && _el.parentNode.removeChild(_el); + }); + return this; + }; + + /** + * Register an event handler, optionally as a delegate for some set of descendant elements. Note + * that this method takes either 3 or 4 arguments - if you supply 3 arguments it is assumed you have + * omitted the `children` parameter, and that the event handler should be bound directly to the given element. + * @method on + * @param {Element[]|Element|String} el Either an Element, or a CSS spec for a list of elements, or an array of Elements. + * @param {String} [children] Comma-delimited list of selectors identifying allowed children. + * @param {String} event Event ID. + * @param {Function} fn Event handler function. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.on = function (el, event, children, fn) { + var _el = arguments[0], + _c = arguments.length == 4 ? arguments[2] : null, + _e = arguments[1], + _f = arguments[arguments.length - 1]; + + _doBind(_el, _e, _f, _c); + return this; + }; + + /** + * Cancel delegate event handling for the given function. Note that unlike with 'on' you do not supply + * a list of child selectors here: it removes event delegation from all of the child selectors for which the + * given function was registered (if any). + * @method off + * @param {Element[]|Element|String} el Element - or ID of element - from which to remove event listener. + * @param {String} event Event ID. + * @param {Function} fn Event handler function. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.off = function (el, event, fn) { + _unbind(el, event, fn); + return this; + }; + + /** + * Triggers some event for a given element. + * @method trigger + * @param {Element} el Element for which to trigger the event. + * @param {String} event Event ID. + * @param {Event} originalEvent The original event. Should be optional of course, but currently is not, due + * to the jsPlumb use case that caused this method to be added. + * @param {Object} [payload] Optional object to set as `payload` on the generated event; useful for message passing. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.trigger = function (el, event, originalEvent, payload) { + // MouseEvent undefined in old IE; that's how we know it's a mouse event. A fine Microsoft paradox. + var originalIsMouse = isMouseDevice && (typeof MouseEvent === "undefined" || originalEvent == null || originalEvent.constructor === MouseEvent); + + var eventToBind = (isTouchDevice && !isMouseDevice && touchMap[event]) ? touchMap[event] : event, + bindingAMouseEvent = !(isTouchDevice && !isMouseDevice && touchMap[event]); + + var pl = _pageLocation(originalEvent), sl = _screenLocation(originalEvent), cl = _clientLocation(originalEvent); + _each(el, function () { + var _el = _gel(this), evt; + originalEvent = originalEvent || { + screenX: sl[0], + screenY: sl[1], + clientX: cl[0], + clientY: cl[1] + }; + + var _decorate = function (_evt) { + if (payload) _evt.payload = payload; + }; + + var eventGenerators = { + "TouchEvent": function (evt) { + + var touchList = _touchAndList(window, _el, 0, pl[0], pl[1], sl[0], sl[1], cl[0], cl[1]), + init = evt.initTouchEvent || evt.initEvent; + + init(eventToBind, true, true, window, null, sl[0], sl[1], + cl[0], cl[1], false, false, false, false, + touchList, touchList, touchList, 1, 0); + }, + "MouseEvents": function (evt) { + evt.initMouseEvent(eventToBind, true, true, window, 0, + sl[0], sl[1], + cl[0], cl[1], + false, false, false, false, 1, _el); + } + }; + + if (document.createEvent) { + + var ite = !bindingAMouseEvent && !originalIsMouse && (isTouchDevice && touchMap[event]), + evtName = ite ? "TouchEvent" : "MouseEvents"; + + evt = document.createEvent(evtName); + eventGenerators[evtName](evt); + _decorate(evt); + _el.dispatchEvent(evt); + } + else if (document.createEventObject) { + evt = document.createEventObject(); + evt.eventType = evt.eventName = eventToBind; + evt.screenX = sl[0]; + evt.screenY = sl[1]; + evt.clientX = cl[0]; + evt.clientY = cl[1]; + _decorate(evt); + _el.fireEvent('on' + eventToBind, evt); + } + }); + return this; + } + }; + + /** + * Static method to assist in 'consuming' an element: uses `stopPropagation` where available, or sets + * `e.returnValue=false` where it is not. + * @method Mottle.consume + * @param {Event} e Event to consume + * @param {Boolean} [doNotPreventDefault=false] If true, does not call `preventDefault()` on the event. + */ + root.Mottle.consume = function (e, doNotPreventDefault) { + if (e.stopPropagation) + e.stopPropagation(); + else + e.returnValue = false; + + if (!doNotPreventDefault && e.preventDefault) + e.preventDefault(); + }; + + /** + * Gets the page location corresponding to the given event. For touch events this means get the page location of the first touch. + * @method Mottle.pageLocation + * @param {Event} e Event to get page location for. + * @return {Number[]} [left, top] for the given event. + */ + root.Mottle.pageLocation = _pageLocation; + + /** + * Forces touch events to be turned "on". Useful for testing: even if you don't have a touch device, you can still + * trigger a touch event when this is switched on and it will be captured and acted on. + * @method setForceTouchEvents + * @param {Boolean} value If true, force touch events to be on. + */ + root.Mottle.setForceTouchEvents = function (value) { + isTouchDevice = value; + }; + + /** + * Forces mouse events to be turned "on". Useful for testing: even if you don't have a mouse, you can still + * trigger a mouse event when this is switched on and it will be captured and acted on. + * @method setForceMouseEvents + * @param {Boolean} value If true, force mouse events to be on. + */ + root.Mottle.setForceMouseEvents = function (value) { + isMouseDevice = value; + }; + + root.Mottle.version = "0.8.0"; + + if (typeof exports !== "undefined") { + exports.Mottle = root.Mottle; + } + +}).call(typeof window === "undefined" ? this : window); + +/** + drag/drop functionality for use with jsPlumb but with + no knowledge of jsPlumb. supports multiple scopes (separated by whitespace), dragging + multiple elements, constrain to parent, drop filters, drag start filters, custom + css classes. + + a lot of the functionality of this script is expected to be plugged in: + + addClass + removeClass + + addEvent + removeEvent + + getPosition + setPosition + getSize + + indexOf + intersects + + the name came from here: + + http://mrsharpoblunto.github.io/foswig.js/ + + copyright 2016 jsPlumb + */ + +;(function() { + + "use strict"; + var root = this; + + var _suggest = function(list, item, head) { + if (list.indexOf(item) === -1) { + head ? list.unshift(item) : list.push(item); + return true; + } + return false; + }; + + var _vanquish = function(list, item) { + var idx = list.indexOf(item); + if (idx !== -1) list.splice(idx, 1); + }; + + var _difference = function(l1, l2) { + var d = []; + for (var i = 0; i < l1.length; i++) { + if (l2.indexOf(l1[i]) === -1) + d.push(l1[i]); + } + return d; + }; + + var _isString = function(f) { + return f == null ? false : (typeof f === "string" || f.constructor === String); + }; + + var getOffsetRect = function (elem) { + // (1) + var box = elem.getBoundingClientRect(), + body = document.body, + docElem = document.documentElement, + // (2) + scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop, + scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft, + // (3) + clientTop = docElem.clientTop || body.clientTop || 0, + clientLeft = docElem.clientLeft || body.clientLeft || 0, + // (4) + top = box.top + scrollTop - clientTop, + left = box.left + scrollLeft - clientLeft; + + return { top: Math.round(top), left: Math.round(left) }; + }; + + var matchesSelector = function(el, selector, ctx) { + ctx = ctx || el.parentNode; + var possibles = ctx.querySelectorAll(selector); + for (var i = 0; i < possibles.length; i++) { + if (possibles[i] === el) + return true; + } + return false; + }; + + var findDelegateElement = function(parentElement, childElement, selector) { + if (matchesSelector(childElement, selector, parentElement)) { + return childElement; + } else { + var currentParent = childElement.parentNode; + while (currentParent != null && currentParent !== parentElement) { + if (matchesSelector(currentParent, selector, parentElement)) { + return currentParent; + } else { + currentParent = currentParent.parentNode; + } + } + } + }; + + /** + * Finds all elements matching the given selector, for the given parent. In order to support "scoped root" selectors, + * ie. things like "> .someClass", that is .someClass elements that are direct children of `parentElement`, we have to + * jump through a small hoop here: when a delegate draggable is registered, we write a `katavorio-draggable` attribute + * on the element on which the draggable is registered. Then when this method runs, we grab the value of that attribute and + * prepend it as part of the selector we're looking for. So "> .someClass" ends up being written as + * "[katavorio-draggable='...' > .someClass]", which works with querySelectorAll. + * + * @param availableSelectors + * @param parentElement + * @param childElement + * @returns {*} + */ + var findMatchingSelector = function(availableSelectors, parentElement, childElement) { + var el = null; + var draggableId = parentElement.getAttribute("katavorio-draggable"), + prefix = draggableId != null ? "[katavorio-draggable='" + draggableId + "'] " : ""; + + for (var i = 0; i < availableSelectors.length; i++) { + el = findDelegateElement(parentElement, childElement, prefix + availableSelectors[i].selector); + if (el != null) { + if (availableSelectors[i].filter) { + var matches = matchesSelector(childElement, availableSelectors[i].filter, el), + exclude = availableSelectors[i].filterExclude === true; + + if ( (exclude && !matches) || matches) { + return null; + } + + } + return [ availableSelectors[i], el ]; + } + } + return null; + }; + + var iev = (function() { + var rv = -1; + if (navigator.appName === 'Microsoft Internet Explorer') { + var ua = navigator.userAgent, + re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); + if (re.exec(ua) != null) + rv = parseFloat(RegExp.$1); + } + return rv; + })(), + DEFAULT_GRID_X = 10, + DEFAULT_GRID_Y = 10, + isIELT9 = iev > -1 && iev < 9, + isIE9 = iev === 9, + _pl = function(e) { + if (isIELT9) { + return [ e.clientX + document.documentElement.scrollLeft, e.clientY + document.documentElement.scrollTop ]; + } + else { + var ts = _touches(e), t = _getTouch(ts, 0); + // for IE9 pageX might be null if the event was synthesized. We try for pageX/pageY first, + // falling back to clientX/clientY if necessary. In every other browser we want to use pageX/pageY. + return isIE9 ? [t.pageX || t.clientX, t.pageY || t.clientY] : [t.pageX, t.pageY]; + } + }, + _getTouch = function(touches, idx) { return touches.item ? touches.item(idx) : touches[idx]; }, + _touches = function(e) { + return e.touches && e.touches.length > 0 ? e.touches : + e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches : + e.targetTouches && e.targetTouches.length > 0 ? e.targetTouches : + [ e ]; + }, + _classes = { + delegatedDraggable:"katavorio-delegated-draggable", // elements that are the delegated drag handler for a bunch of other elements + draggable:"katavorio-draggable", // draggable elements + droppable:"katavorio-droppable", // droppable elements + drag : "katavorio-drag", // elements currently being dragged + selected:"katavorio-drag-selected", // elements in current drag selection + active : "katavorio-drag-active", // droppables that are targets of a currently dragged element + hover : "katavorio-drag-hover", // droppables over which a matching drag element is hovering + noSelect : "katavorio-drag-no-select", // added to the body to provide a hook to suppress text selection + ghostProxy:"katavorio-ghost-proxy", // added to a ghost proxy element in use when a drag has exited the bounds of its parent. + clonedDrag:"katavorio-clone-drag" // added to a node that is a clone of an element created at the start of a drag + }, + _defaultScope = "katavorio-drag-scope", + _events = [ "stop", "start", "drag", "drop", "over", "out", "beforeStart" ], + _devNull = function() {}, + _true = function() { return true; }, + _foreach = function(l, fn, from) { + for (var i = 0; i < l.length; i++) { + if (l[i] != from) + fn(l[i]); + } + }, + _setDroppablesActive = function(dd, val, andHover, drag) { + _foreach(dd, function(e) { + e.setActive(val); + if (val) e.updatePosition(); + if (andHover) e.setHover(drag, val); + }); + }, + _each = function(obj, fn) { + if (obj == null) return; + obj = !_isString(obj) && (obj.tagName == null && obj.length != null) ? obj : [ obj ]; + for (var i = 0; i < obj.length; i++) + fn.apply(obj[i], [ obj[i] ]); + }, + _consume = function(e) { + if (e.stopPropagation) { + e.stopPropagation(); + e.preventDefault(); + } + else { + e.returnValue = false; + } + }, + _defaultInputFilterSelector = "input,textarea,select,button,option", + // + // filters out events on all input elements, like textarea, checkbox, input, select. + _inputFilter = function(e, el, _katavorio) { + var t = e.srcElement || e.target; + return !matchesSelector(t, _katavorio.getInputFilterSelector(), el); + }; + + var Super = function(el, params, css, scope) { + this.params = params || {}; + this.el = el; + this.params.addClass(this.el, this._class); + this.uuid = _uuid(); + var enabled = true; + this.setEnabled = function(e) { enabled = e; }; + this.isEnabled = function() { return enabled; }; + this.toggleEnabled = function() { enabled = !enabled; }; + this.setScope = function(scopes) { + this.scopes = scopes ? scopes.split(/\s+/) : [ scope ]; + }; + this.addScope = function(scopes) { + var m = {}; + _each(this.scopes, function(s) { m[s] = true;}); + _each(scopes ? scopes.split(/\s+/) : [], function(s) { m[s] = true;}); + this.scopes = []; + for (var i in m) this.scopes.push(i); + }; + this.removeScope = function(scopes) { + var m = {}; + _each(this.scopes, function(s) { m[s] = true;}); + _each(scopes ? scopes.split(/\s+/) : [], function(s) { delete m[s];}); + this.scopes = []; + for (var i in m) this.scopes.push(i); + }; + this.toggleScope = function(scopes) { + var m = {}; + _each(this.scopes, function(s) { m[s] = true;}); + _each(scopes ? scopes.split(/\s+/) : [], function(s) { + if (m[s]) delete m[s]; + else m[s] = true; + }); + this.scopes = []; + for (var i in m) this.scopes.push(i); + }; + this.setScope(params.scope); + this.k = params.katavorio; + return params.katavorio; + }; + + var TRUE = function() { return true; }; + var FALSE = function() { return false; }; + + var Drag = function(el, params, css, scope) { + this._class = css.draggable; + var k = Super.apply(this, arguments); + this.rightButtonCanDrag = this.params.rightButtonCanDrag; + var downAt = [0,0], posAtDown = null, pagePosAtDown = null, pageDelta = [0,0], moving = false, initialScroll = [0,0], + consumeStartEvent = this.params.consumeStartEvent !== false, + dragEl = this.el, + clone = this.params.clone, + scroll = this.params.scroll, + _multipleDrop = params.multipleDrop !== false, + isConstrained = false, + useGhostProxy = params.ghostProxy === true ? TRUE : params.ghostProxy && typeof params.ghostProxy === "function" ? params.ghostProxy : FALSE, + ghostProxy = function(el) { return el.cloneNode(true); }, + elementToDrag = null, + availableSelectors = [], + activeSelectorParams = null, // which, if any, selector config is currently active. + ghostProxyParent = params.ghostProxyParent, + currentParentPosition, + ghostParentPosition, + ghostDx, + ghostDy; + + // if an initial selector was provided, push the entire set of params as a selector config. + if (params.selector) { + var draggableId = el.getAttribute("katavorio-draggable"); + if (draggableId == null) { + draggableId = "" + new Date().getTime(); + el.setAttribute("katavorio-draggable", draggableId); + } + + availableSelectors.push(params); + } + + var snapThreshold = params.snapThreshold, + _snap = function(pos, gridX, gridY, thresholdX, thresholdY) { + var _dx = Math.floor(pos[0] / gridX), + _dxl = gridX * _dx, + _dxt = _dxl + gridX, + _x = Math.abs(pos[0] - _dxl) <= thresholdX ? _dxl : Math.abs(_dxt - pos[0]) <= thresholdX ? _dxt : pos[0]; + + var _dy = Math.floor(pos[1] / gridY), + _dyl = gridY * _dy, + _dyt = _dyl + gridY, + _y = Math.abs(pos[1] - _dyl) <= thresholdY ? _dyl : Math.abs(_dyt - pos[1]) <= thresholdY ? _dyt : pos[1]; + + return [ _x, _y]; + }; + + this.posses = []; + this.posseRoles = {}; + + this.toGrid = function(pos) { + if (this.params.grid == null) { + return pos; + } + else { + var tx = this.params.grid ? this.params.grid[0] / 2 : snapThreshold ? snapThreshold : DEFAULT_GRID_X / 2, + ty = this.params.grid ? this.params.grid[1] / 2 : snapThreshold ? snapThreshold : DEFAULT_GRID_Y / 2; + + return _snap(pos, this.params.grid[0], this.params.grid[1], tx, ty); + } + }; + + this.snap = function(x, y) { + if (dragEl == null) return; + x = x || (this.params.grid ? this.params.grid[0] : DEFAULT_GRID_X); + y = y || (this.params.grid ? this.params.grid[1] : DEFAULT_GRID_Y); + var p = this.params.getPosition(dragEl), + tx = this.params.grid ? this.params.grid[0] / 2 : snapThreshold, + ty = this.params.grid ? this.params.grid[1] / 2 : snapThreshold, + snapped = _snap(p, x, y, tx, ty); + + this.params.setPosition(dragEl, snapped); + return snapped; + }; + + this.setUseGhostProxy = function(val) { + useGhostProxy = val ? TRUE : FALSE; + }; + + var constrain; + var negativeFilter = function(pos) { + return (params.allowNegative === false) ? [ Math.max (0, pos[0]), Math.max(0, pos[1]) ] : pos; + }; + + var _setConstrain = function(value) { + constrain = typeof value === "function" ? value : value ? function(pos, dragEl, _constrainRect, _size) { + return negativeFilter([ + Math.max(0, Math.min(_constrainRect.w - _size[0], pos[0])), + Math.max(0, Math.min(_constrainRect.h - _size[1], pos[1])) + ]); + }.bind(this) : function(pos) { return negativeFilter(pos); }; + }.bind(this); + + _setConstrain(typeof this.params.constrain === "function" ? this.params.constrain : (this.params.constrain || this.params.containment)); + + + /** + * Sets whether or not the Drag is constrained. A value of 'true' means constrain to parent bounds; a function + * will be executed and returns true if the position is allowed. + * @param value + */ + this.setConstrain = function(value) { + _setConstrain(value); + }; + + var revertFunction; + /** + * Sets a function to call on drag stop, which, if it returns true, indicates that the given element should + * revert to its position before the previous drag. + * @param fn + */ + this.setRevert = function(fn) { + revertFunction = fn; + }; + + if (this.params.revert) { + revertFunction = this.params.revert; + } + + var _assignId = function(obj) { + if (typeof obj === "function") { + obj._katavorioId = _uuid(); + return obj._katavorioId; + } else { + return obj; + } + }, + // a map of { spec -> [ fn, exclusion ] } entries. + _filters = {}, + _testFilter = function(e) { + for (var key in _filters) { + var f = _filters[key]; + var rv = f[0](e); + if (f[1]) rv = !rv; + if (!rv) return false; + } + return true; + }, + _setFilter = this.setFilter = function(f, _exclude) { + if (f) { + var key = _assignId(f); + _filters[key] = [ + function(e) { + var t = e.srcElement || e.target, m; + if (_isString(f)) { + m = matchesSelector(t, f, el); + } + else if (typeof f === "function") { + m = f(e, el); + } + return m; + }, + _exclude !== false + ]; + + } + }, + _addFilter = this.addFilter = _setFilter, + _removeFilter = this.removeFilter = function(f) { + var key = typeof f === "function" ? f._katavorioId : f; + delete _filters[key]; + }; + + this.clearAllFilters = function() { + _filters = {}; + }; + + this.canDrag = this.params.canDrag || _true; + + var constrainRect, + matchingDroppables = [], + intersectingDroppables = []; + + this.addSelector = function(params) { + if (params.selector) { + availableSelectors.push(params); + } + }; + + this.downListener = function(e) { + if (e.defaultPrevented) { return; } + var isNotRightClick = this.rightButtonCanDrag || (e.which !== 3 && e.button !== 2); + if (isNotRightClick && this.isEnabled() && this.canDrag()) { + + var _f = _testFilter(e) && _inputFilter(e, this.el, this.k); + if (_f) { + + activeSelectorParams = null; + elementToDrag = null; + + // if (selector) { + // elementToDrag = findDelegateElement(this.el, e.target || e.srcElement, selector); + // if(elementToDrag == null) { + // return; + // } + // } + if (availableSelectors.length > 0) { + var match = findMatchingSelector(availableSelectors, this.el, e.target || e.srcElement); + if (match != null) { + activeSelectorParams = match[0]; + elementToDrag = match[1]; + } + // elementToDrag = findDelegateElement(this.el, e.target || e.srcElement, selector); + if(elementToDrag == null) { + return; + } + } + else { + elementToDrag = this.el; + } + + if (clone) { + dragEl = elementToDrag.cloneNode(true); + this.params.addClass(dragEl, _classes.clonedDrag); + + dragEl.setAttribute("id", null); + dragEl.style.position = "absolute"; + + if (this.params.parent != null) { + var p = this.params.getPosition(this.el); + dragEl.style.left = p[0] + "px"; + dragEl.style.top = p[1] + "px"; + this.params.parent.appendChild(dragEl); + } else { + // the clone node is added to the body; getOffsetRect gives us a value + // relative to the body. + var b = getOffsetRect(elementToDrag); + dragEl.style.left = b.left + "px"; + dragEl.style.top = b.top + "px"; + + document.body.appendChild(dragEl); + } + + } else { + dragEl = elementToDrag; + } + + consumeStartEvent && _consume(e); + downAt = _pl(e); + if (dragEl && dragEl.parentNode) + { + initialScroll = [dragEl.parentNode.scrollLeft, dragEl.parentNode.scrollTop]; + } + // + this.params.bind(document, "mousemove", this.moveListener); + this.params.bind(document, "mouseup", this.upListener); + k.markSelection(this); + k.markPosses(this); + this.params.addClass(document.body, css.noSelect); + _dispatch("beforeStart", {el:this.el, pos:posAtDown, e:e, drag:this}); + } + else if (this.params.consumeFilteredEvents) { + _consume(e); + } + } + }.bind(this); + + this.moveListener = function(e) { + if (downAt) { + if (!moving) { + var _continue = _dispatch("start", {el:this.el, pos:posAtDown, e:e, drag:this}); + if (_continue !== false) { + if (!downAt) { + return; + } + this.mark(true); + moving = true; + } else { + this.abort(); + } + } + + // it is possible that the start event caused the drag to be aborted. So we check + // again that we are currently dragging. + if (downAt) { + intersectingDroppables.length = 0; + var pos = _pl(e), dx = pos[0] - downAt[0], dy = pos[1] - downAt[1], + z = this.params.ignoreZoom ? 1 : k.getZoom(); + if (dragEl && dragEl.parentNode) + { + dx += dragEl.parentNode.scrollLeft - initialScroll[0]; + dy += dragEl.parentNode.scrollTop - initialScroll[1]; + } + dx /= z; + dy /= z; + this.moveBy(dx, dy, e); + k.updateSelection(dx, dy, this); + k.updatePosses(dx, dy, this); + } + } + }.bind(this); + + this.upListener = function(e) { + if (downAt) { + downAt = null; + this.params.unbind(document, "mousemove", this.moveListener); + this.params.unbind(document, "mouseup", this.upListener); + this.params.removeClass(document.body, css.noSelect); + this.unmark(e); + k.unmarkSelection(this, e); + k.unmarkPosses(this, e); + this.stop(e); + + k.notifyPosseDragStop(this, e); + moving = false; + intersectingDroppables.length = 0; + + if (clone) { + dragEl && dragEl.parentNode && dragEl.parentNode.removeChild(dragEl); + dragEl = null; + } else { + if (revertFunction && revertFunction(dragEl, this.params.getPosition(dragEl)) === true) { + this.params.setPosition(dragEl, posAtDown); + _dispatch("revert", dragEl); + } + } + + } + }.bind(this); + + this.getFilters = function() { return _filters; }; + + this.abort = function() { + if (downAt != null) { + this.upListener(); + } + }; + + /** + * Returns the element that was last dragged. This may be some original element from the DOM, or if `clone` is + * set, then its actually a copy of some original DOM element. In some client calls to this method, it is the + * actual element that was dragged that is desired. In others, it is the original DOM element that the user + * wishes to get - in which case, pass true for `retrieveOriginalElement`. + * + * @returns {*} + */ + this.getDragElement = function(retrieveOriginalElement) { + return retrieveOriginalElement ? elementToDrag || this.el : dragEl || this.el; + }; + + var listeners = {"start":[], "drag":[], "stop":[], "over":[], "out":[], "beforeStart":[], "revert":[] }; + if (params.events.start) listeners.start.push(params.events.start); + if (params.events.beforeStart) listeners.beforeStart.push(params.events.beforeStart); + if (params.events.stop) listeners.stop.push(params.events.stop); + if (params.events.drag) listeners.drag.push(params.events.drag); + if (params.events.revert) listeners.revert.push(params.events.revert); + + this.on = function(evt, fn) { + if (listeners[evt]) listeners[evt].push(fn); + }; + + this.off = function(evt, fn) { + if (listeners[evt]) { + var l = []; + for (var i = 0; i < listeners[evt].length; i++) { + if (listeners[evt][i] !== fn) l.push(listeners[evt][i]); + } + listeners[evt] = l; + } + }; + + var _dispatch = function(evt, value) { + var result = null; + if (activeSelectorParams && activeSelectorParams[evt]) { + result = activeSelectorParams[evt](value); + } else if (listeners[evt]) { + for (var i = 0; i < listeners[evt].length; i++) { + try { + var v = listeners[evt][i](value); + if (v != null) { + result = v; + } + } + catch (e) { } + } + } + return result; + }; + + this.notifyStart = function(e) { + _dispatch("start", {el:this.el, pos:this.params.getPosition(dragEl), e:e, drag:this}); + }; + + this.stop = function(e, force) { + if (force || moving) { + var positions = [], + sel = k.getSelection(), + dPos = this.params.getPosition(dragEl); + + if (sel.length > 0) { + for (var i = 0; i < sel.length; i++) { + var p = this.params.getPosition(sel[i].el); + positions.push([ sel[i].el, { left: p[0], top: p[1] }, sel[i] ]); + } + } + else { + positions.push([ dragEl, {left:dPos[0], top:dPos[1]}, this ]); + } + + _dispatch("stop", { + el: dragEl, + pos: ghostProxyOffsets || dPos, + finalPos:dPos, + e: e, + drag: this, + selection:positions + }); + } + }; + + this.mark = function(andNotify) { + posAtDown = this.params.getPosition(dragEl); + pagePosAtDown = this.params.getPosition(dragEl, true); + pageDelta = [pagePosAtDown[0] - posAtDown[0], pagePosAtDown[1] - posAtDown[1]]; + this.size = this.params.getSize(dragEl); + matchingDroppables = k.getMatchingDroppables(this); + _setDroppablesActive(matchingDroppables, true, false, this); + this.params.addClass(dragEl, this.params.dragClass || css.drag); + + var cs; + if (this.params.getConstrainingRectangle) { + cs = this.params.getConstrainingRectangle(dragEl) + } else { + cs = this.params.getSize(dragEl.parentNode); + } + constrainRect = {w: cs[0], h: cs[1]}; + + ghostDx = 0; + ghostDy = 0; + + if (andNotify) { + k.notifySelectionDragStart(this); + } + }; + var ghostProxyOffsets; + this.unmark = function(e, doNotCheckDroppables) { + _setDroppablesActive(matchingDroppables, false, true, this); + + if (isConstrained && useGhostProxy(elementToDrag, dragEl)) { + ghostProxyOffsets = [dragEl.offsetLeft - ghostDx, dragEl.offsetTop - ghostDy]; + dragEl.parentNode.removeChild(dragEl); + dragEl = elementToDrag; + } + else { + ghostProxyOffsets = null; + } + + this.params.removeClass(dragEl, this.params.dragClass || css.drag); + matchingDroppables.length = 0; + isConstrained = false; + if (!doNotCheckDroppables) { + if (intersectingDroppables.length > 0 && ghostProxyOffsets) { + params.setPosition(elementToDrag, ghostProxyOffsets); + } + intersectingDroppables.sort(_rankSort); + for (var i = 0; i < intersectingDroppables.length; i++) { + var retVal = intersectingDroppables[i].drop(this, e); + if (retVal === true) break; + } + } + }; + this.moveBy = function(dx, dy, e) { + intersectingDroppables.length = 0; + + var desiredLoc = this.toGrid([posAtDown[0] + dx, posAtDown[1] + dy]), + cPos = constrain(desiredLoc, dragEl, constrainRect, this.size); + + // if we should use a ghost proxy... + if (useGhostProxy(this.el, dragEl)) { + // and the element has been dragged outside of its parent bounds + if (desiredLoc[0] !== cPos[0] || desiredLoc[1] !== cPos[1]) { + + // ...if ghost proxy not yet created + if (!isConstrained) { + // create it + var gp = ghostProxy(elementToDrag); + params.addClass(gp, _classes.ghostProxy); + + if (ghostProxyParent) { + ghostProxyParent.appendChild(gp); + // find offset between drag el's parent the ghost parent + currentParentPosition = params.getPosition(elementToDrag.parentNode, true); + ghostParentPosition = params.getPosition(params.ghostProxyParent, true); + ghostDx = currentParentPosition[0] - ghostParentPosition[0]; + ghostDy = currentParentPosition[1] - ghostParentPosition[1]; + + } else { + elementToDrag.parentNode.appendChild(gp); + } + + // the ghost proxy is the drag element + dragEl = gp; + // set this flag so we dont recreate the ghost proxy + isConstrained = true; + } + // now the drag position can be the desired position, as the ghost proxy can support it. + cPos = desiredLoc; + } + else { + // if the element is not outside of its parent bounds, and ghost proxy is in place, + if (isConstrained) { + // remove the ghost proxy from the dom + dragEl.parentNode.removeChild(dragEl); + // reset the drag element to the original element + dragEl = elementToDrag; + // clear this flag. + isConstrained = false; + currentParentPosition = null; + ghostParentPosition = null; + ghostDx = 0; + ghostDy = 0; + } + } + } + + var rect = { x:cPos[0], y:cPos[1], w:this.size[0], h:this.size[1]}, + pageRect = { x:rect.x + pageDelta[0], y:rect.y + pageDelta[1], w:rect.w, h:rect.h}, + focusDropElement = null; + + this.params.setPosition(dragEl, [cPos[0] + ghostDx, cPos[1] + ghostDy]); + + for (var i = 0; i < matchingDroppables.length; i++) { + var r2 = { x:matchingDroppables[i].pagePosition[0], y:matchingDroppables[i].pagePosition[1], w:matchingDroppables[i].size[0], h:matchingDroppables[i].size[1]}; + if (this.params.intersects(pageRect, r2) && (_multipleDrop || focusDropElement == null || focusDropElement === matchingDroppables[i].el) && matchingDroppables[i].canDrop(this)) { + if (!focusDropElement) focusDropElement = matchingDroppables[i].el; + intersectingDroppables.push(matchingDroppables[i]); + matchingDroppables[i].setHover(this, true, e); + } + else if (matchingDroppables[i].isHover()) { + matchingDroppables[i].setHover(this, false, e); + } + } + + _dispatch("drag", {el:this.el, pos:cPos, e:e, drag:this}); + + /* test to see if the parent needs to be scrolled (future) + if (scroll) { + var pnsl = dragEl.parentNode.scrollLeft, pnst = dragEl.parentNode.scrollTop; + console.log("scroll!", pnsl, pnst); + }*/ + }; + this.destroy = function() { + this.params.unbind(this.el, "mousedown", this.downListener); + this.params.unbind(document, "mousemove", this.moveListener); + this.params.unbind(document, "mouseup", this.upListener); + this.downListener = null; + this.upListener = null; + this.moveListener = null; + }; + + // init:register mousedown, and perhaps set a filter + this.params.bind(this.el, "mousedown", this.downListener); + + // if handle provided, use that. otherwise, try to set a filter. + // note that a `handle` selector always results in filterExclude being set to false, ie. + // the selector defines the handle element(s). + if (this.params.handle) + _setFilter(this.params.handle, false); + else + _setFilter(this.params.filter, this.params.filterExclude); + }; + + var Drop = function(el, params, css, scope) { + this._class = css.droppable; + this.params = params || {}; + this.rank = params.rank || 0; + this._activeClass = this.params.activeClass || css.active; + this._hoverClass = this.params.hoverClass || css.hover; + Super.apply(this, arguments); + var hover = false; + this.allowLoopback = this.params.allowLoopback !== false; + + this.setActive = function(val) { + this.params[val ? "addClass" : "removeClass"](this.el, this._activeClass); + }; + + this.updatePosition = function() { + this.position = this.params.getPosition(this.el); + this.pagePosition = this.params.getPosition(this.el, true); + this.size = this.params.getSize(this.el); + }; + + this.canDrop = this.params.canDrop || function(drag) { + return true; + }; + + this.isHover = function() { return hover; }; + + this.setHover = function(drag, val, e) { + // if turning off hover but this was not the drag that caused the hover, ignore. + if (val || this.el._katavorioDragHover == null || this.el._katavorioDragHover === drag.el._katavorio) { + this.params[val ? "addClass" : "removeClass"](this.el, this._hoverClass); + this.el._katavorioDragHover = val ? drag.el._katavorio : null; + if (hover !== val) { + this.params.events[val ? "over" : "out"]({el: this.el, e: e, drag: drag, drop: this}); + } + hover = val; + } + }; + + /** + * A drop event. `drag` is the corresponding Drag object, which may be a Drag for some specific element, or it + * may be a Drag on some element acting as a delegate for elements contained within it. + * @param drag + * @param event + * @returns {*} + */ + this.drop = function(drag, event) { + return this.params.events["drop"]({ drag:drag, e:event, drop:this }); + }; + + this.destroy = function() { + this._class = null; + this._activeClass = null; + this._hoverClass = null; + hover = null; + }; + }; + + var _uuid = function() { + return ('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = Math.random()*16|0, v = c === 'x' ? r : (r&0x3|0x8); + return v.toString(16); + })); + }; + + var _rankSort = function(a,b) { + return a.rank < b.rank ? 1 : a.rank > b.rank ? -1 : 0; + }; + + var _gel = function(el) { + if (el == null) return null; + el = (typeof el === "string" || el.constructor === String) ? document.getElementById(el) : el; + if (el == null) return null; + el._katavorio = el._katavorio || _uuid(); + return el; + }; + + root.Katavorio = function(katavorioParams) { + + var _selection = [], + _selectionMap = {}; + + this._dragsByScope = {}; + this._dropsByScope = {}; + var _zoom = 1, + _reg = function(obj, map) { + _each(obj, function(_obj) { + for(var i = 0; i < _obj.scopes.length; i++) { + map[_obj.scopes[i]] = map[_obj.scopes[i]] || []; + map[_obj.scopes[i]].push(_obj); + } + }); + }, + _unreg = function(obj, map) { + var c = 0; + _each(obj, function(_obj) { + for(var i = 0; i < _obj.scopes.length; i++) { + if (map[_obj.scopes[i]]) { + var idx = katavorioParams.indexOf(map[_obj.scopes[i]], _obj); + if (idx !== -1) { + map[_obj.scopes[i]].splice(idx, 1); + c++; + } + } + } + }); + + return c > 0 ; + }, + _getMatchingDroppables = this.getMatchingDroppables = function(drag) { + var dd = [], _m = {}; + for (var i = 0; i < drag.scopes.length; i++) { + var _dd = this._dropsByScope[drag.scopes[i]]; + if (_dd) { + for (var j = 0; j < _dd.length; j++) { + if (_dd[j].canDrop(drag) && !_m[_dd[j].uuid] && (_dd[j].allowLoopback || _dd[j].el !== drag.el)) { + _m[_dd[j].uuid] = true; + dd.push(_dd[j]); + } + } + } + } + dd.sort(_rankSort); + return dd; + }, + _prepareParams = function(p) { + p = p || {}; + var _p = { + events:{} + }, i; + for (i in katavorioParams) _p[i] = katavorioParams[i]; + for (i in p) _p[i] = p[i]; + // events + + for (i = 0; i < _events.length; i++) { + _p.events[_events[i]] = p[_events[i]] || _devNull; + } + _p.katavorio = this; + return _p; + }.bind(this), + _mistletoe = function(existingDrag, params) { + for (var i = 0; i < _events.length; i++) { + if (params[_events[i]]) { + existingDrag.on(_events[i], params[_events[i]]); + } + } + }.bind(this), + _css = {}, + overrideCss = katavorioParams.css || {}, + _scope = katavorioParams.scope || _defaultScope; + + // prepare map of css classes based on defaults frst, then optional overrides + for (var i in _classes) _css[i] = _classes[i]; + for (var i in overrideCss) _css[i] = overrideCss[i]; + + var inputFilterSelector = katavorioParams.inputFilterSelector || _defaultInputFilterSelector; + /** + * Gets the selector identifying which input elements to filter from drag events. + * @method getInputFilterSelector + * @return {String} Current input filter selector. + */ + this.getInputFilterSelector = function() { return inputFilterSelector; }; + + /** + * Sets the selector identifying which input elements to filter from drag events. + * @method setInputFilterSelector + * @param {String} selector Input filter selector to set. + * @return {Katavorio} Current instance; method may be chained. + */ + this.setInputFilterSelector = function(selector) { + inputFilterSelector = selector; + return this; + }; + + /** + * Either makes the given element draggable, or identifies it as an element inside which some identified list + * of elements may be draggable. + * @param el + * @param params + * @returns {Array} + */ + this.draggable = function(el, params) { + var o = []; + _each(el, function (_el) { + _el = _gel(_el); + if (_el != null) { + if (_el._katavorioDrag == null) { + var p = _prepareParams(params); + _el._katavorioDrag = new Drag(_el, p, _css, _scope); + _reg(_el._katavorioDrag, this._dragsByScope); + o.push(_el._katavorioDrag); + katavorioParams.addClass(_el, p.selector ? _css.delegatedDraggable : _css.draggable); + } + else { + _mistletoe(_el._katavorioDrag, params); + } + } + }.bind(this)); + return o; + }; + + this.droppable = function(el, params) { + var o = []; + _each(el, function(_el) { + _el = _gel(_el); + if (_el != null) { + var drop = new Drop(_el, _prepareParams(params), _css, _scope); + _el._katavorioDrop = _el._katavorioDrop || []; + _el._katavorioDrop.push(drop); + _reg(drop, this._dropsByScope); + o.push(drop); + katavorioParams.addClass(_el, _css.droppable); + } + }.bind(this)); + return o; + }; + + /** + * @name Katavorio#select + * @function + * @desc Adds an element to the current selection (for multiple node drag) + * @param {Element|String} DOM element - or id of the element - to add. + */ + this.select = function(el) { + _each(el, function() { + var _el = _gel(this); + if (_el && _el._katavorioDrag) { + if (!_selectionMap[_el._katavorio]) { + _selection.push(_el._katavorioDrag); + _selectionMap[_el._katavorio] = [ _el, _selection.length - 1 ]; + katavorioParams.addClass(_el, _css.selected); + } + } + }); + return this; + }; + + /** + * @name Katavorio#deselect + * @function + * @desc Removes an element from the current selection (for multiple node drag) + * @param {Element|String} DOM element - or id of the element - to remove. + */ + this.deselect = function(el) { + _each(el, function() { + var _el = _gel(this); + if (_el && _el._katavorio) { + var e = _selectionMap[_el._katavorio]; + if (e) { + var _s = []; + for (var i = 0; i < _selection.length; i++) + if (_selection[i].el !== _el) _s.push(_selection[i]); + _selection = _s; + delete _selectionMap[_el._katavorio]; + katavorioParams.removeClass(_el, _css.selected); + } + } + }); + return this; + }; + + this.deselectAll = function() { + for (var i in _selectionMap) { + var d = _selectionMap[i]; + katavorioParams.removeClass(d[0], _css.selected); + } + + _selection.length = 0; + _selectionMap = {}; + }; + + this.markSelection = function(drag) { + _foreach(_selection, function(e) { e.mark(); }, drag); + }; + + this.markPosses = function(drag) { + if (drag.posses) { + _each(drag.posses, function(p) { + if (drag.posseRoles[p] && _posses[p]) { + _foreach(_posses[p].members, function (d) { + d.mark(); + }, drag); + } + }) + } + }; + + this.unmarkSelection = function(drag, event) { + _foreach(_selection, function(e) { e.unmark(event); }, drag); + }; + + this.unmarkPosses = function(drag, event) { + if (drag.posses) { + _each(drag.posses, function(p) { + if (drag.posseRoles[p] && _posses[p]) { + _foreach(_posses[p].members, function (d) { + d.unmark(event, true); + }, drag); + } + }); + } + }; + + this.getSelection = function() { return _selection.slice(0); }; + + this.updateSelection = function(dx, dy, drag) { + _foreach(_selection, function(e) { e.moveBy(dx, dy); }, drag); + }; + + var _posseAction = function(fn, drag) { + if (drag.posses) { + _each(drag.posses, function(p) { + if (drag.posseRoles[p] && _posses[p]) { + _foreach(_posses[p].members, function (e) { + fn(e); + }, drag); + } + }); + } + }; + + this.updatePosses = function(dx, dy, drag) { + _posseAction(function(e) { e.moveBy(dx, dy); }, drag); + }; + + this.notifyPosseDragStop = function(drag, evt) { + _posseAction(function(e) { e.stop(evt, true); }, drag); + }; + + this.notifySelectionDragStop = function(drag, evt) { + _foreach(_selection, function(e) { e.stop(evt, true); }, drag); + }; + + this.notifySelectionDragStart = function(drag, evt) { + _foreach(_selection, function(e) { e.notifyStart(evt);}, drag); + }; + + this.setZoom = function(z) { _zoom = z; }; + this.getZoom = function() { return _zoom; }; + + // does the work of changing scopes + var _scopeManip = function(kObj, scopes, map, fn) { + _each(kObj, function(_kObj) { + _unreg(_kObj, map); // deregister existing scopes + _kObj[fn](scopes); // set scopes + _reg(_kObj, map); // register new ones + }); + }; + + _each([ "set", "add", "remove", "toggle"], function(v) { + this[v + "Scope"] = function(el, scopes) { + _scopeManip(el._katavorioDrag, scopes, this._dragsByScope, v + "Scope"); + _scopeManip(el._katavorioDrop, scopes, this._dropsByScope, v + "Scope"); + }.bind(this); + this[v + "DragScope"] = function(el, scopes) { + _scopeManip(el.constructor === Drag ? el : el._katavorioDrag, scopes, this._dragsByScope, v + "Scope"); + }.bind(this); + this[v + "DropScope"] = function(el, scopes) { + _scopeManip(el.constructor === Drop ? el : el._katavorioDrop, scopes, this._dropsByScope, v + "Scope"); + }.bind(this); + }.bind(this)); + + this.snapToGrid = function(x, y) { + for (var s in this._dragsByScope) { + _foreach(this._dragsByScope[s], function(d) { d.snap(x, y); }); + } + }; + + this.getDragsForScope = function(s) { return this._dragsByScope[s]; }; + this.getDropsForScope = function(s) { return this._dropsByScope[s]; }; + + var _destroy = function(el, type, map) { + el = _gel(el); + if (el[type]) { + + // remove from selection, if present. + var selIdx = _selection.indexOf(el[type]); + if (selIdx >= 0) { + _selection.splice(selIdx, 1); + } + + if (_unreg(el[type], map)) { + _each(el[type], function(kObj) { kObj.destroy() }); + } + + delete el[type]; + } + }; + + var _removeListener = function(el, type, evt, fn) { + el = _gel(el); + if (el[type]) { + el[type].off(evt, fn); + } + }; + + this.elementRemoved = function(el) { + this.destroyDraggable(el); + this.destroyDroppable(el); + }; + + /** + * Either completely remove drag functionality from the given element, or remove a specific event handler. If you + * call this method with a single argument - the element - all drag functionality is removed from it. Otherwise, if + * you provide an event name and listener function, this function is de-registered (if found). + * @param el Element to update + * @param {string} [evt] Optional event name to unsubscribe + * @param {Function} [fn] Optional function to unsubscribe + */ + this.destroyDraggable = function(el, evt, fn) { + if (arguments.length === 1) { + _destroy(el, "_katavorioDrag", this._dragsByScope); + } else { + _removeListener(el, "_katavorioDrag", evt, fn); + } + }; + + /** + * Either completely remove drop functionality from the given element, or remove a specific event handler. If you + * call this method with a single argument - the element - all drop functionality is removed from it. Otherwise, if + * you provide an event name and listener function, this function is de-registered (if found). + * @param el Element to update + * @param {string} [evt] Optional event name to unsubscribe + * @param {Function} [fn] Optional function to unsubscribe + */ + this.destroyDroppable = function(el, evt, fn) { + if (arguments.length === 1) { + _destroy(el, "_katavorioDrop", this._dropsByScope); + } else { + _removeListener(el, "_katavorioDrop", evt, fn); + } + }; + + this.reset = function() { + this._dragsByScope = {}; + this._dropsByScope = {}; + _selection = []; + _selectionMap = {}; + _posses = {}; + }; + + // ----- groups + var _posses = {}; + + var _processOneSpec = function(el, _spec, dontAddExisting) { + var posseId = _isString(_spec) ? _spec : _spec.id; + var active = _isString(_spec) ? true : _spec.active !== false; + var posse = _posses[posseId] || (function() { + var g = {name:posseId, members:[]}; + _posses[posseId] = g; + return g; + })(); + _each(el, function(_el) { + if (_el._katavorioDrag) { + + if (dontAddExisting && _el._katavorioDrag.posseRoles[posse.name] != null) return; + + _suggest(posse.members, _el._katavorioDrag); + _suggest(_el._katavorioDrag.posses, posse.name); + _el._katavorioDrag.posseRoles[posse.name] = active; + } + }); + return posse; + }; + + /** + * Add the given element to the posse with the given id, creating the group if it at first does not exist. + * @method addToPosse + * @param {Element} el Element to add. + * @param {String...|Object...} spec Variable args parameters. Each argument can be a either a String, indicating + * the ID of a Posse to which the element should be added as an active participant, or an Object containing + * `{ id:"posseId", active:false/true}`. In the latter case, if `active` is not provided it is assumed to be + * true. + * @returns {Posse|Posse[]} The Posse(s) to which the element(s) was/were added. + */ + this.addToPosse = function(el, spec) { + + var posses = []; + + for (var i = 1; i < arguments.length; i++) { + posses.push(_processOneSpec(el, arguments[i])); + } + + return posses.length === 1 ? posses[0] : posses; + }; + + /** + * Sets the posse(s) for the element with the given id, creating those that do not yet exist, and removing from + * the element any current Posses that are not specified by this method call. This method will not change the + * active/passive state if it is given a posse in which the element is already a member. + * @method setPosse + * @param {Element} el Element to set posse(s) on. + * @param {String...|Object...} spec Variable args parameters. Each argument can be a either a String, indicating + * the ID of a Posse to which the element should be added as an active participant, or an Object containing + * `{ id:"posseId", active:false/true}`. In the latter case, if `active` is not provided it is assumed to be + * true. + * @returns {Posse|Posse[]} The Posse(s) to which the element(s) now belongs. + */ + this.setPosse = function(el, spec) { + + var posses = []; + + for (var i = 1; i < arguments.length; i++) { + posses.push(_processOneSpec(el, arguments[i], true).name); + } + + _each(el, function(_el) { + if (_el._katavorioDrag) { + var diff = _difference(_el._katavorioDrag.posses, posses); + var p = []; + Array.prototype.push.apply(p, _el._katavorioDrag.posses); + for (var i = 0; i < diff.length; i++) { + this.removeFromPosse(_el, diff[i]); + } + } + }.bind(this)); + + return posses.length === 1 ? posses[0] : posses; + }; + + /** + * Remove the given element from the given posse(s). + * @method removeFromPosse + * @param {Element} el Element to remove. + * @param {String...} posseId Varargs parameter: one value for each posse to remove the element from. + */ + this.removeFromPosse = function(el, posseId) { + if (arguments.length < 2) throw new TypeError("No posse id provided for remove operation"); + for(var i = 1; i < arguments.length; i++) { + posseId = arguments[i]; + _each(el, function (_el) { + if (_el._katavorioDrag && _el._katavorioDrag.posses) { + var d = _el._katavorioDrag; + _each(posseId, function (p) { + _vanquish(_posses[p].members, d); + _vanquish(d.posses, p); + delete d.posseRoles[p]; + }); + } + }); + } + }; + + /** + * Remove the given element from all Posses to which it belongs. + * @method removeFromAllPosses + * @param {Element|Element[]} el Element to remove from Posses. + */ + this.removeFromAllPosses = function(el) { + _each(el, function(_el) { + if (_el._katavorioDrag && _el._katavorioDrag.posses) { + var d = _el._katavorioDrag; + _each(d.posses, function(p) { + _vanquish(_posses[p].members, d); + }); + d.posses.length = 0; + d.posseRoles = {}; + } + }); + }; + + /** + * Changes the participation state for the element in the Posse with the given ID. + * @param {Element|Element[]} el Element(s) to change state for. + * @param {String} posseId ID of the Posse to change element state for. + * @param {Boolean} state True to make active, false to make passive. + */ + this.setPosseState = function(el, posseId, state) { + var posse = _posses[posseId]; + if (posse) { + _each(el, function(_el) { + if (_el._katavorioDrag && _el._katavorioDrag.posses) { + _el._katavorioDrag.posseRoles[posse.name] = state; + } + }); + } + }; + + }; + + root.Katavorio.version = "1.0.0"; + + if (typeof exports !== "undefined") { + exports.Katavorio = root.Katavorio; + } + +}).call(typeof window !== 'undefined' ? window : this); + + +(function() { + + var root = this; + root.jsPlumbUtil = root.jsPlumbUtil || {}; + var jsPlumbUtil = root.jsPlumbUtil; + + if (typeof exports !=='undefined') { exports.jsPlumbUtil = jsPlumbUtil;} + + + /** + * Tests if the given object is an Array. + * @param a + */ + function isArray(a) { + return Object.prototype.toString.call(a) === "[object Array]"; + } + jsPlumbUtil.isArray = isArray; + /** + * Tests if the given object is a Number. + * @param n + */ + function isNumber(n) { + return Object.prototype.toString.call(n) === "[object Number]"; + } + jsPlumbUtil.isNumber = isNumber; + function isString(s) { + return typeof s === "string"; + } + jsPlumbUtil.isString = isString; + function isBoolean(s) { + return typeof s === "boolean"; + } + jsPlumbUtil.isBoolean = isBoolean; + function isNull(s) { + return s == null; + } + jsPlumbUtil.isNull = isNull; + function isObject(o) { + return o == null ? false : Object.prototype.toString.call(o) === "[object Object]"; + } + jsPlumbUtil.isObject = isObject; + function isDate(o) { + return Object.prototype.toString.call(o) === "[object Date]"; + } + jsPlumbUtil.isDate = isDate; + function isFunction(o) { + return Object.prototype.toString.call(o) === "[object Function]"; + } + jsPlumbUtil.isFunction = isFunction; + function isNamedFunction(o) { + return isFunction(o) && o.name != null && o.name.length > 0; + } + jsPlumbUtil.isNamedFunction = isNamedFunction; + function isEmpty(o) { + for (var i in o) { + if (o.hasOwnProperty(i)) { + return false; + } + } + return true; + } + jsPlumbUtil.isEmpty = isEmpty; + function clone(a) { + if (isString(a)) { + return "" + a; + } + else if (isBoolean(a)) { + return !!a; + } + else if (isDate(a)) { + return new Date(a.getTime()); + } + else if (isFunction(a)) { + return a; + } + else if (isArray(a)) { + var b = []; + for (var i = 0; i < a.length; i++) { + b.push(clone(a[i])); + } + return b; + } + else if (isObject(a)) { + var c = {}; + for (var j in a) { + c[j] = clone(a[j]); + } + return c; + } + else { + return a; + } + } + jsPlumbUtil.clone = clone; + function merge(a, b, collations, overwrites) { + // first change the collations array - if present - into a lookup table, because its faster. + var cMap = {}, ar, i, oMap = {}; + collations = collations || []; + overwrites = overwrites || []; + for (i = 0; i < collations.length; i++) { + cMap[collations[i]] = true; + } + for (i = 0; i < overwrites.length; i++) { + oMap[overwrites[i]] = true; + } + var c = clone(a); + for (i in b) { + if (c[i] == null || oMap[i]) { + c[i] = b[i]; + } + else if (isString(b[i]) || isBoolean(b[i])) { + if (!cMap[i]) { + c[i] = b[i]; // if we dont want to collate, just copy it in. + } + else { + ar = []; + // if c's object is also an array we can keep its values. + ar.push.apply(ar, isArray(c[i]) ? c[i] : [c[i]]); + ar.push.apply(ar, isBoolean(b[i]) ? b[i] : [b[i]]); + c[i] = ar; + } + } + else { + if (isArray(b[i])) { + ar = []; + // if c's object is also an array we can keep its values. + if (isArray(c[i])) { + ar.push.apply(ar, c[i]); + } + ar.push.apply(ar, b[i]); + c[i] = ar; + } + else if (isObject(b[i])) { + // overwrite c's value with an object if it is not already one. + if (!isObject(c[i])) { + c[i] = {}; + } + for (var j in b[i]) { + c[i][j] = b[i][j]; + } + } + } + } + return c; + } + jsPlumbUtil.merge = merge; + function replace(inObj, path, value) { + if (inObj == null) { + return; + } + var q = inObj, t = q; + path.replace(/([^\.])+/g, function (term, lc, pos, str) { + var array = term.match(/([^\[0-9]+){1}(\[)([0-9+])/), last = pos + term.length >= str.length, _getArray = function () { + return t[array[1]] || (function () { + t[array[1]] = []; + return t[array[1]]; + })(); + }; + if (last) { + // set term = value on current t, creating term as array if necessary. + if (array) { + _getArray()[array[3]] = value; + } + else { + t[term] = value; + } + } + else { + // set to current t[term], creating t[term] if necessary. + if (array) { + var a_1 = _getArray(); + t = a_1[array[3]] || (function () { + a_1[array[3]] = {}; + return a_1[array[3]]; + })(); + } + else { + t = t[term] || (function () { + t[term] = {}; + return t[term]; + })(); + } + } + return ""; + }); + return inObj; + } + jsPlumbUtil.replace = replace; + // + // chain a list of functions, supplied by [ object, method name, args ], and return on the first + // one that returns the failValue. if none return the failValue, return the successValue. + // + function functionChain(successValue, failValue, fns) { + for (var i = 0; i < fns.length; i++) { + var o = fns[i][0][fns[i][1]].apply(fns[i][0], fns[i][2]); + if (o === failValue) { + return o; + } + } + return successValue; + } + jsPlumbUtil.functionChain = functionChain; + /** + * + * Take the given model and expand out any parameters. 'functionPrefix' is optional, and if present, helps jsplumb figure out what to do if a value is a Function. + * if you do not provide it (and doNotExpandFunctions is null, or false), jsplumb will run the given values through any functions it finds, and use the function's + * output as the value in the result. if you do provide the prefix, only functions that are named and have this prefix + * will be executed; other functions will be passed as values to the output. + * + * @param model + * @param values + * @param functionPrefix + * @param doNotExpandFunctions + * @returns {any} + */ + function populate(model, values, functionPrefix, doNotExpandFunctions) { + // for a string, see if it has parameter matches, and if so, try to make the substitutions. + var getValue = function (fromString) { + var matches = fromString.match(/(\${.*?})/g); + if (matches != null) { + for (var i = 0; i < matches.length; i++) { + var val = values[matches[i].substring(2, matches[i].length - 1)] || ""; + if (val != null) { + fromString = fromString.replace(matches[i], val); + } + } + } + return fromString; + }; + // process one entry. + var _one = function (d) { + if (d != null) { + if (isString(d)) { + return getValue(d); + } + else if (isFunction(d) && !doNotExpandFunctions && (functionPrefix == null || (d.name || "").indexOf(functionPrefix) === 0)) { + return d(values); + } + else if (isArray(d)) { + var r = []; + for (var i = 0; i < d.length; i++) { + r.push(_one(d[i])); + } + return r; + } + else if (isObject(d)) { + var s = {}; + for (var j in d) { + s[j] = _one(d[j]); + } + return s; + } + else { + return d; + } + } + }; + return _one(model); + } + jsPlumbUtil.populate = populate; + /** + * Find the index of a given object in an array. + * @param a The array to search + * @param f The function to run on each element. Return true if the element matches. + * @returns {number} -1 if not found, otherwise the index in the array. + */ + function findWithFunction(a, f) { + if (a) { + for (var i = 0; i < a.length; i++) { + if (f(a[i])) { + return i; + } + } + } + return -1; + } + jsPlumbUtil.findWithFunction = findWithFunction; + /** + * Remove some element from an array by matching each element in the array against some predicate function. Note that this + * is an in-place removal; the array is altered. + * @param a The array to search + * @param f The function to run on each element. Return true if the element matches. + * @returns {boolean} true if removed, false otherwise. + */ + function removeWithFunction(a, f) { + var idx = findWithFunction(a, f); + if (idx > -1) { + a.splice(idx, 1); + } + return idx !== -1; + } + jsPlumbUtil.removeWithFunction = removeWithFunction; + /** + * Remove some element from an array by simple lookup in the array for the given element. Note that this + * is an in-place removal; the array is altered. + * @param l The array to search + * @param v The value to remove. + * @returns {boolean} true if removed, false otherwise. + */ + function remove(l, v) { + var idx = l.indexOf(v); + if (idx > -1) { + l.splice(idx, 1); + } + return idx !== -1; + } + jsPlumbUtil.remove = remove; + /** + * Add some element to the given array, unless it is determined that it is already in the array. + * @param list The array to add the element to. + * @param item The item to add. + * @param hashFunction A function to use to determine if the given item already exists in the array. + */ + function addWithFunction(list, item, hashFunction) { + if (findWithFunction(list, hashFunction) === -1) { + list.push(item); + } + } + jsPlumbUtil.addWithFunction = addWithFunction; + /** + * Add some element to a list that is contained in a map of lists. + * @param map The map of [ key -> list ] entries + * @param key The name of the list to insert into + * @param value The value to insert + * @param insertAtStart Whether or not to insert at the start; defaults to false. + */ + function addToList(map, key, value, insertAtStart) { + var l = map[key]; + if (l == null) { + l = []; + map[key] = l; + } + l[insertAtStart ? "unshift" : "push"](value); + return l; + } + jsPlumbUtil.addToList = addToList; + /** + * Add an item to a list, unless it is already in the list. The test for pre-existence is a simple list lookup. + * If you want to do something more complex, perhaps #addWithFunction might help. + * @param list List to add the item to + * @param item Item to add + * @param insertAtHead Whether or not to insert at the start; defaults to false. + */ + function suggest(list, item, insertAtHead) { + if (list.indexOf(item) === -1) { + if (insertAtHead) { + list.unshift(item); + } + else { + list.push(item); + } + return true; + } + return false; + } + jsPlumbUtil.suggest = suggest; + /** + * Extends the given obj (which can be an array) with the given constructor function, prototype functions, and class members, any of which may be null. + * @param child + * @param parent + * @param _protoFn + */ + function extend(child, parent, _protoFn) { + var i; + parent = isArray(parent) ? parent : [parent]; + var _copyProtoChain = function (focus) { + var proto = focus.__proto__; + while (proto != null) { + if (proto.prototype != null) { + for (var j in proto.prototype) { + if (proto.prototype.hasOwnProperty(j) && !child.prototype.hasOwnProperty(j)) { + child.prototype[j] = proto.prototype[j]; + } + } + proto = proto.prototype.__proto__; + } + else { + proto = null; + } + } + }; + for (i = 0; i < parent.length; i++) { + for (var j in parent[i].prototype) { + if (parent[i].prototype.hasOwnProperty(j) && !child.prototype.hasOwnProperty(j)) { + child.prototype[j] = parent[i].prototype[j]; + } + } + _copyProtoChain(parent[i]); + } + var _makeFn = function (name, protoFn) { + return function () { + for (i = 0; i < parent.length; i++) { + if (parent[i].prototype[name]) { + parent[i].prototype[name].apply(this, arguments); + } + } + return protoFn.apply(this, arguments); + }; + }; + var _oneSet = function (fns) { + for (var k in fns) { + child.prototype[k] = _makeFn(k, fns[k]); + } + }; + if (arguments.length > 2) { + for (i = 2; i < arguments.length; i++) { + _oneSet(arguments[i]); + } + } + return child; + } + jsPlumbUtil.extend = extend; + /** + * Generate a UUID. + */ + // export function uuid(): string { + // return ('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + // let r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8); + // return v.toString(16); + // })); + // } + var lut = []; + for (var i = 0; i < 256; i++) { + lut[i] = (i < 16 ? '0' : '') + (i).toString(16); + } + function uuid() { + var d0 = Math.random() * 0xffffffff | 0; + var d1 = Math.random() * 0xffffffff | 0; + var d2 = Math.random() * 0xffffffff | 0; + var d3 = Math.random() * 0xffffffff | 0; + return lut[d0 & 0xff] + lut[d0 >> 8 & 0xff] + lut[d0 >> 16 & 0xff] + lut[d0 >> 24 & 0xff] + '-' + + lut[d1 & 0xff] + lut[d1 >> 8 & 0xff] + '-' + lut[d1 >> 16 & 0x0f | 0x40] + lut[d1 >> 24 & 0xff] + '-' + + lut[d2 & 0x3f | 0x80] + lut[d2 >> 8 & 0xff] + '-' + lut[d2 >> 16 & 0xff] + lut[d2 >> 24 & 0xff] + + lut[d3 & 0xff] + lut[d3 >> 8 & 0xff] + lut[d3 >> 16 & 0xff] + lut[d3 >> 24 & 0xff]; + } + jsPlumbUtil.uuid = uuid; + /** + * Trim a string. + * @param s String to trim + * @returns the String with leading and trailing whitespace removed. + */ + function fastTrim(s) { + if (s == null) { + return null; + } + var str = s.replace(/^\s\s*/, ''), ws = /\s/, i = str.length; + while (ws.test(str.charAt(--i))) { + } + return str.slice(0, i + 1); + } + jsPlumbUtil.fastTrim = fastTrim; + function each(obj, fn) { + obj = obj.length == null || typeof obj === "string" ? [obj] : obj; + for (var i = 0; i < obj.length; i++) { + fn(obj[i]); + } + } + jsPlumbUtil.each = each; + function map(obj, fn) { + var o = []; + for (var i = 0; i < obj.length; i++) { + o.push(fn(obj[i])); + } + return o; + } + jsPlumbUtil.map = map; + function mergeWithParents(type, map, parentAttribute) { + parentAttribute = parentAttribute || "parent"; + var _def = function (id) { + return id ? map[id] : null; + }; + var _parent = function (def) { + return def ? _def(def[parentAttribute]) : null; + }; + var _one = function (parent, def) { + if (parent == null) { + return def; + } + else { + var overrides = ["anchor", "anchors", "cssClass", "connector", "paintStyle", "hoverPaintStyle", "endpoint", "endpoints"]; + if (def.mergeStrategy === "override") { + Array.prototype.push.apply(overrides, ["events", "overlays"]); + } + var d_1 = merge(parent, def, [], overrides); + return _one(_parent(parent), d_1); + } + }; + var _getDef = function (t) { + if (t == null) { + return {}; + } + if (typeof t === "string") { + return _def(t); + } + else if (t.length) { + var done = false, i = 0, _dd = void 0; + while (!done && i < t.length) { + _dd = _getDef(t[i]); + if (_dd) { + done = true; + } + else { + i++; + } + } + return _dd; + } + }; + var d = _getDef(type); + if (d) { + return _one(_parent(d), d); + } + else { + return {}; + } + } + jsPlumbUtil.mergeWithParents = mergeWithParents; + jsPlumbUtil.logEnabled = true; + function log() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (jsPlumbUtil.logEnabled && typeof console !== "undefined") { + try { + var msg = arguments[arguments.length - 1]; + console.log(msg); + } + catch (e) { + } + } + } + jsPlumbUtil.log = log; + /** + * Wraps one function with another, creating a placeholder for the + * wrapped function if it was null. this is used to wrap the various + * drag/drop event functions - to allow jsPlumb to be notified of + * important lifecycle events without imposing itself on the user's + * drag/drop functionality. + * @method jsPlumbUtil.wrap + * @param {Function} wrappedFunction original function to wrap; may be null. + * @param {Function} newFunction function to wrap the original with. + * @param {Object} [returnOnThisValue] Optional. Indicates that the wrappedFunction should + * not be executed if the newFunction returns a value matching 'returnOnThisValue'. + * note that this is a simple comparison and only works for primitives right now. + */ + function wrap(wrappedFunction, newFunction, returnOnThisValue) { + return function () { + var r = null; + try { + if (newFunction != null) { + r = newFunction.apply(this, arguments); + } + } + catch (e) { + log("jsPlumb function failed : " + e); + } + if ((wrappedFunction != null) && (returnOnThisValue == null || (r !== returnOnThisValue))) { + try { + r = wrappedFunction.apply(this, arguments); + } + catch (e) { + log("wrapped function failed : " + e); + } + } + return r; + }; + } + jsPlumbUtil.wrap = wrap; + var EventGenerator = /** @class */ (function () { + function EventGenerator() { + var _this = this; + this._listeners = {}; + this.eventsSuspended = false; + this.tick = false; + // this is a list of events that should re-throw any errors that occur during their dispatch. + this.eventsToDieOn = { "ready": true }; + this.queue = []; + this.bind = function (event, listener, insertAtStart) { + var _one = function (evt) { + addToList(_this._listeners, evt, listener, insertAtStart); + listener.__jsPlumb = listener.__jsPlumb || {}; + listener.__jsPlumb[uuid()] = evt; + }; + if (typeof event === "string") { + _one(event); + } + else if (event.length != null) { + for (var i = 0; i < event.length; i++) { + _one(event[i]); + } + } + return _this; + }; + this.fire = function (event, value, originalEvent) { + if (!this.tick) { + this.tick = true; + if (!this.eventsSuspended && this._listeners[event]) { + var l = this._listeners[event].length, i = 0, _gone = false, ret = null; + if (!this.shouldFireEvent || this.shouldFireEvent(event, value, originalEvent)) { + while (!_gone && i < l && ret !== false) { + // doing it this way rather than catching and then possibly re-throwing means that an error propagated by this + // method will have the whole call stack available in the debugger. + if (this.eventsToDieOn[event]) { + this._listeners[event][i].apply(this, [value, originalEvent]); + } + else { + try { + ret = this._listeners[event][i].apply(this, [value, originalEvent]); + } + catch (e) { + log("jsPlumb: fire failed for event " + event + " : " + e); + } + } + i++; + if (this._listeners == null || this._listeners[event] == null) { + _gone = true; + } + } + } + } + this.tick = false; + this._drain(); + } + else { + this.queue.unshift(arguments); + } + return this; + }; + this._drain = function () { + var n = _this.queue.pop(); + if (n) { + _this.fire.apply(_this, n); + } + }; + this.unbind = function (eventOrListener, listener) { + if (arguments.length === 0) { + this._listeners = {}; + } + else if (arguments.length === 1) { + if (typeof eventOrListener === "string") { + delete this._listeners[eventOrListener]; + } + else if (eventOrListener.__jsPlumb) { + var evt = void 0; + for (var i in eventOrListener.__jsPlumb) { + evt = eventOrListener.__jsPlumb[i]; + remove(this._listeners[evt] || [], eventOrListener); + } + } + } + else if (arguments.length === 2) { + remove(this._listeners[eventOrListener] || [], listener); + } + return this; + }; + this.getListener = function (forEvent) { + return _this._listeners[forEvent]; + }; + this.setSuspendEvents = function (val) { + _this.eventsSuspended = val; + }; + this.isSuspendEvents = function () { + return _this.eventsSuspended; + }; + this.silently = function (fn) { + _this.setSuspendEvents(true); + try { + fn(); + } + catch (e) { + log("Cannot execute silent function " + e); + } + _this.setSuspendEvents(false); + }; + this.cleanupListeners = function () { + for (var i in _this._listeners) { + _this._listeners[i] = null; + } + }; + } + return EventGenerator; + }()); + jsPlumbUtil.EventGenerator = EventGenerator; + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains utility functions that run in browsers only. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ + ;(function() { + + "use strict"; + + var root = this; + + root.jsPlumbUtil.matchesSelector = function(el, selector, ctx) { + ctx = ctx || el.parentNode; + var possibles = ctx.querySelectorAll(selector); + for (var i = 0; i < possibles.length; i++) { + if (possibles[i] === el) { + return true; + } + } + return false; + }; + + root.jsPlumbUtil.consume = function(e, doNotPreventDefault) { + if (e.stopPropagation) { + e.stopPropagation(); + } + else { + e.returnValue = false; + } + + if (!doNotPreventDefault && e.preventDefault){ + e.preventDefault(); + } + }; + + /* + * Function: sizeElement + * Helper to size and position an element. You would typically use + * this when writing your own Connector or Endpoint implementation. + * + * Parameters: + * x - [int] x position for the element origin + * y - [int] y position for the element origin + * w - [int] width of the element + * h - [int] height of the element + * + */ + root.jsPlumbUtil.sizeElement = function(el, x, y, w, h) { + if (el) { + el.style.height = h + "px"; + el.height = h; + el.style.width = w + "px"; + el.width = w; + el.style.left = x + "px"; + el.style.top = y + "px"; + } + }; + + }).call(typeof window !== 'undefined' ? window : this); + +;(function() { + + var DEFAULT_OPTIONS = { + deriveAnchor:function(edge, index, ep, conn) { + return { + top:["TopRight", "TopLeft"], + bottom:["BottomRight", "BottomLeft"] + }[edge][index]; + } + }; + + var root = this; + + var ListManager = function(jsPlumbInstance, params) { + + this.count = 0; + this.instance = jsPlumbInstance; + this.lists = {}; + this.options = params || {}; + + this.instance.addList = function(el, options) { + return this.listManager.addList(el, options); + }; + + this.instance.removeList = function(el) { + this.listManager.removeList(el); + }; + + this.instance.bind("manageElement", function(p) { + + //look for [jtk-scrollable-list] elements and attach scroll listeners if necessary + var scrollableLists = this.instance.getSelector(p.el, "[jtk-scrollable-list]"); + for (var i = 0; i < scrollableLists.length; i++) { + this.addList(scrollableLists[i]); + } + + }.bind(this)); + + this.instance.bind("unmanageElement", function(p) { + this.removeList(p.el); + }); + + + this.instance.bind("connection", function(c, evt) { + if (evt == null) { + // not added by mouse. look for an ancestor of the source and/or target element that is a scrollable list, and run + // its scroll method. + this._maybeUpdateParentList(c.source); + this._maybeUpdateParentList(c.target); + } + }.bind(this)); + }; + + root.jsPlumbListManager = ListManager; + + ListManager.prototype = { + + addList : function(el, options) { + var dp = this.instance.extend({}, DEFAULT_OPTIONS); + this.instance.extend(dp, this.options); + options = this.instance.extend(dp, options || {}); + var id = [this.instance.getInstanceIndex(), this.count++].join("_"); + this.lists[id] = new List(this.instance, el, options, id); + }, + + removeList:function(el) { + var list = this.lists[el._jsPlumbList]; + if (list) { + list.destroy(); + delete this.lists[el._jsPlumbList]; + } + }, + + _maybeUpdateParentList:function (el) { + var parent = el.parentNode, container = this.instance.getContainer(); + while(parent != null && parent !== container) { + if (parent._jsPlumbList != null && this.lists[parent._jsPlumbList] != null) { + parent._jsPlumbScrollHandler(); + return + } + parent = parent.parentNode; + } + } + + + }; + + var List = function(instance, el, options, id) { + + el["_jsPlumbList"] = id; + + // + // Derive an anchor to use for the current situation. In contrast to the way we derive an endpoint, here we use `anchor` from the options, if present, as + // our first choice, and then `deriveAnchor` as our next choice. There is a default `deriveAnchor` implementation that uses TopRight/TopLeft for top and + // BottomRight/BottomLeft for bottom. + // + // edge - "top" or "bottom" + // index - 0 when endpoint is connection source, 1 when endpoint is connection target + // ep - the endpoint that is being proxied + // conn - the connection that is being proxied + // + function deriveAnchor(edge, index, ep, conn) { + return options.anchor ? options.anchor : options.deriveAnchor(edge, index, ep, conn); + } + + // + // Derive an endpoint to use for the current situation. We'll use a `deriveEndpoint` function passed in to the options as our first choice, + // followed by `endpoint` (an endpoint spec) from the options, and failing either of those we just use the `type` of the endpoint that is being proxied. + // + // edge - "top" or "bottom" + // index - 0 when endpoint is connection source, 1 when endpoint is connection target + // endpoint - the endpoint that is being proxied + // connection - the connection that is being proxied + // + function deriveEndpoint(edge, index, ep, conn) { + return options.deriveEndpoint ? options.deriveEndpoint(edge, index, ep, conn) : options.endpoint ? options.endpoint : ep.type; + } + + // + // look for a parent of the given scrollable list that is draggable, and then update the child offsets for it. this should not + // be necessary in the delegated drag stuff from the upcoming 3.0.0 release. + // + function _maybeUpdateDraggable(el) { + var parent = el.parentNode, container = instance.getContainer(); + while(parent != null && parent !== container) { + if (instance.hasClass(parent, "jtk-managed")) { + instance.recalculateOffsets(parent); + return + } + parent = parent.parentNode; + } + } + + var scrollHandler = function(e) { + + var children = instance.getSelector(el, ".jtk-managed"); + var elId = instance.getId(el); + + for (var i = 0; i < children.length; i++) { + + if (children[i].offsetTop < el.scrollTop) { + if (!children[i]._jsPlumbProxies) { + children[i]._jsPlumbProxies = children[i]._jsPlumbProxies || []; + instance.select({source: children[i]}).each(function (c) { + + + instance.proxyConnection(c, 0, el, elId, function () { + return deriveEndpoint("top", 0, c.endpoints[0], c); + }, function () { + return deriveAnchor("top", 0, c.endpoints[0], c); + }); + children[i]._jsPlumbProxies.push([c, 0]); + }); + + instance.select({target: children[i]}).each(function (c) { + instance.proxyConnection(c, 1, el, elId, function () { + return deriveEndpoint("top", 1, c.endpoints[1], c); + }, function () { + return deriveAnchor("top", 1, c.endpoints[1], c); + }); + children[i]._jsPlumbProxies.push([c, 1]); + }); + } + } + // + else if (children[i].offsetTop + children[i].offsetHeight > el.scrollTop + el.offsetHeight) { + if (!children[i]._jsPlumbProxies) { + children[i]._jsPlumbProxies = children[i]._jsPlumbProxies || []; + + instance.select({source: children[i]}).each(function (c) { + instance.proxyConnection(c, 0, el, elId, function () { + return deriveEndpoint("bottom", 0, c.endpoints[0], c); + }, function () { + return deriveAnchor("bottom", 0, c.endpoints[0], c); + }); + children[i]._jsPlumbProxies.push([c, 0]); + }); + + instance.select({target: children[i]}).each(function (c) { + instance.proxyConnection(c, 1, el, elId, function () { + return deriveEndpoint("bottom", 1, c.endpoints[1], c); + }, function () { + return deriveAnchor("bottom", 1, c.endpoints[1], c); + }); + children[i]._jsPlumbProxies.push([c, 1]); + }); + } + } else if (children[i]._jsPlumbProxies) { + for (var j = 0; j < children[i]._jsPlumbProxies.length; j++) { + instance.unproxyConnection(children[i]._jsPlumbProxies[j][0], children[i]._jsPlumbProxies[j][1], elId); + } + + delete children[i]._jsPlumbProxies; + } + + instance.revalidate(children[i]); + } + + _maybeUpdateDraggable(el); + }; + + instance.setAttribute(el, "jtk-scrollable-list", "true"); + el._jsPlumbScrollHandler = scrollHandler; + instance.on(el, "scroll", scrollHandler); + scrollHandler(); // run it once; there may be connections already. + + this.destroy = function() { + instance.off(el, "scroll", scrollHandler); + delete el._jsPlumbScrollHandler; + + var children = instance.getSelector(el, ".jtk-managed"); + var elId = instance.getId(el); + + for (var i = 0; i < children.length; i++) { + if (children[i]._jsPlumbProxies) { + for (var j = 0; j < children[i]._jsPlumbProxies.length; j++) { + instance.unproxyConnection(children[i]._jsPlumbProxies[j][0], children[i]._jsPlumbProxies[j][1], elId); + } + + delete children[i]._jsPlumbProxies; + } + } + }; + }; + + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the core code. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function () { + + "use strict"; + + var root = this; + + var _ju = root.jsPlumbUtil, + + /** + * creates a timestamp, using milliseconds since 1970, but as a string. + */ + _timestamp = function () { + return "" + (new Date()).getTime(); + }, + + // helper method to update the hover style whenever it, or paintStyle, changes. + // we use paintStyle as the foundation and merge hoverPaintStyle over the + // top. + _updateHoverStyle = function (component) { + if (component._jsPlumb.paintStyle && component._jsPlumb.hoverPaintStyle) { + var mergedHoverStyle = {}; + jsPlumb.extend(mergedHoverStyle, component._jsPlumb.paintStyle); + jsPlumb.extend(mergedHoverStyle, component._jsPlumb.hoverPaintStyle); + delete component._jsPlumb.hoverPaintStyle; + // we want the fill of paintStyle to override a gradient, if possible. + if (mergedHoverStyle.gradient && component._jsPlumb.paintStyle.fill) { + delete mergedHoverStyle.gradient; + } + component._jsPlumb.hoverPaintStyle = mergedHoverStyle; + } + }, + events = ["tap", "dbltap", "click", "dblclick", "mouseover", "mouseout", "mousemove", "mousedown", "mouseup", "contextmenu" ], + eventFilters = { "mouseout": "mouseleave", "mouseexit": "mouseleave" }, + _updateAttachedElements = function (component, state, timestamp, sourceElement) { + var affectedElements = component.getAttachedElements(); + if (affectedElements) { + for (var i = 0, j = affectedElements.length; i < j; i++) { + if (!sourceElement || sourceElement !== affectedElements[i]) { + affectedElements[i].setHover(state, true, timestamp); // tell the attached elements not to inform their own attached elements. + } + } + } + }, + _splitType = function (t) { + return t == null ? null : t.split(" "); + }, + _mapType = function(map, obj, typeId) { + for (var i in obj) { + map[i] = typeId; + } + }, + _each = function(fn, obj) { + obj = _ju.isArray(obj) || (obj.length != null && !_ju.isString(obj)) ? obj : [ obj ]; + for (var i = 0; i < obj.length; i++) { + try { + fn.apply(obj[i], [ obj[i] ]); + } + catch (e) { + _ju.log(".each iteration failed : " + e); + } + } + }, + _applyTypes = function (component, params, doNotRepaint) { + if (component.getDefaultType) { + var td = component.getTypeDescriptor(), map = {}; + var defType = component.getDefaultType(); + var o = _ju.merge({}, defType); + _mapType(map, defType, "__default"); + for (var i = 0, j = component._jsPlumb.types.length; i < j; i++) { + var tid = component._jsPlumb.types[i]; + if (tid !== "__default") { + var _t = component._jsPlumb.instance.getType(tid, td); + if (_t != null) { + + var overrides = ["anchor", "anchors", "connector", "paintStyle", "hoverPaintStyle", "endpoint", "endpoints", "connectorOverlays", "connectorStyle", "connectorHoverStyle", "endpointStyle", "endpointHoverStyle"]; + var collations = [ ]; + + if (_t.mergeStrategy === "override") { + Array.prototype.push.apply(overrides, ["events", "overlays", "cssClass"]); + } else { + collations.push("cssClass"); + } + + o = _ju.merge(o, _t, collations, overrides); + _mapType(map, _t, tid); + } + } + } + + if (params) { + o = _ju.populate(o, params, "_"); + } + + component.applyType(o, doNotRepaint, map); + if (!doNotRepaint) { + component.repaint(); + } + } + }, + +// ------------------------------ BEGIN jsPlumbUIComponent -------------------------------------------- + + jsPlumbUIComponent = root.jsPlumbUIComponent = function (params) { + + _ju.EventGenerator.apply(this, arguments); + + var self = this, + a = arguments, + idPrefix = self.idPrefix, + id = idPrefix + (new Date()).getTime(); + + this._jsPlumb = { + instance: params._jsPlumb, + parameters: params.parameters || {}, + paintStyle: null, + hoverPaintStyle: null, + paintStyleInUse: null, + hover: false, + beforeDetach: params.beforeDetach, + beforeDrop: params.beforeDrop, + overlayPlacements: [], + hoverClass: params.hoverClass || params._jsPlumb.Defaults.HoverClass, + types: [], + typeCache:{} + }; + + this.cacheTypeItem = function(key, item, typeId) { + this._jsPlumb.typeCache[typeId] = this._jsPlumb.typeCache[typeId] || {}; + this._jsPlumb.typeCache[typeId][key] = item; + }; + this.getCachedTypeItem = function(key, typeId) { + return this._jsPlumb.typeCache[typeId] ? this._jsPlumb.typeCache[typeId][key] : null; + }; + + this.getId = function () { + return id; + }; + +// ----------------------------- default type -------------------------------------------- + + + var o = params.overlays || [], oo = {}; + if (this.defaultOverlayKeys) { + for (var i = 0; i < this.defaultOverlayKeys.length; i++) { + Array.prototype.push.apply(o, this._jsPlumb.instance.Defaults[this.defaultOverlayKeys[i]] || []); + } + + for (i = 0; i < o.length; i++) { + // if a string, convert to object representation so that we can store the typeid on it. + // also assign an id. + var fo = jsPlumb.convertToFullOverlaySpec(o[i]); + oo[fo[1].id] = fo; + } + } + + var _defaultType = { + overlays:oo, + parameters: params.parameters || {}, + scope: params.scope || this._jsPlumb.instance.getDefaultScope() + }; + this.getDefaultType = function() { + return _defaultType; + }; + this.appendToDefaultType = function(obj) { + for (var i in obj) { + _defaultType[i] = obj[i]; + } + }; + +// ----------------------------- end default type -------------------------------------------- + + // all components can generate events + + if (params.events) { + for (var evtName in params.events) { + self.bind(evtName, params.events[evtName]); + } + } + + // all components get this clone function. + // TODO issue 116 showed a problem with this - it seems 'a' that is in + // the clone function's scope is shared by all invocations of it, the classic + // JS closure problem. for now, jsPlumb does a version of this inline where + // it used to call clone. but it would be nice to find some time to look + // further at this. + this.clone = function () { + var o = Object.create(this.constructor.prototype); + this.constructor.apply(o, a); + return o; + }.bind(this); + + // user can supply a beforeDetach callback, which will be executed before a detach + // is performed; returning false prevents the detach. + this.isDetachAllowed = function (connection) { + var r = true; + if (this._jsPlumb.beforeDetach) { + try { + r = this._jsPlumb.beforeDetach(connection); + } + catch (e) { + _ju.log("jsPlumb: beforeDetach callback failed", e); + } + } + return r; + }; + + // user can supply a beforeDrop callback, which will be executed before a dropped + // connection is confirmed. user can return false to reject connection. + this.isDropAllowed = function (sourceId, targetId, scope, connection, dropEndpoint, source, target) { + var r = this._jsPlumb.instance.checkCondition("beforeDrop", { + sourceId: sourceId, + targetId: targetId, + scope: scope, + connection: connection, + dropEndpoint: dropEndpoint, + source: source, target: target + }); + if (this._jsPlumb.beforeDrop) { + try { + r = this._jsPlumb.beforeDrop({ + sourceId: sourceId, + targetId: targetId, + scope: scope, + connection: connection, + dropEndpoint: dropEndpoint, + source: source, target: target + }); + } + catch (e) { + _ju.log("jsPlumb: beforeDrop callback failed", e); + } + } + return r; + }; + + var domListeners = []; + + // sets the component associated with listener events. for instance, an overlay delegates + // its events back to a connector. but if the connector is swapped on the underlying connection, + // then this component must be changed. This is called by setConnector in the Connection class. + this.setListenerComponent = function (c) { + for (var i = 0; i < domListeners.length; i++) { + domListeners[i][3] = c; + } + }; + + + }; + + var _removeTypeCssHelper = function (component, typeIndex) { + var typeId = component._jsPlumb.types[typeIndex], + type = component._jsPlumb.instance.getType(typeId, component.getTypeDescriptor()); + + if (type != null && type.cssClass && component.canvas) { + component._jsPlumb.instance.removeClass(component.canvas, type.cssClass); + } + }; + + _ju.extend(root.jsPlumbUIComponent, _ju.EventGenerator, { + + getParameter: function (name) { + return this._jsPlumb.parameters[name]; + }, + + setParameter: function (name, value) { + this._jsPlumb.parameters[name] = value; + }, + + getParameters: function () { + return this._jsPlumb.parameters; + }, + + setParameters: function (p) { + this._jsPlumb.parameters = p; + }, + + getClass:function() { + return jsPlumb.getClass(this.canvas); + }, + + hasClass:function(clazz) { + return jsPlumb.hasClass(this.canvas, clazz); + }, + + addClass: function (clazz) { + jsPlumb.addClass(this.canvas, clazz); + }, + + removeClass: function (clazz) { + jsPlumb.removeClass(this.canvas, clazz); + }, + + updateClasses: function (classesToAdd, classesToRemove) { + jsPlumb.updateClasses(this.canvas, classesToAdd, classesToRemove); + }, + + setType: function (typeId, params, doNotRepaint) { + this.clearTypes(); + this._jsPlumb.types = _splitType(typeId) || []; + _applyTypes(this, params, doNotRepaint); + }, + + getType: function () { + return this._jsPlumb.types; + }, + + reapplyTypes: function (params, doNotRepaint) { + _applyTypes(this, params, doNotRepaint); + }, + + hasType: function (typeId) { + return this._jsPlumb.types.indexOf(typeId) !== -1; + }, + + addType: function (typeId, params, doNotRepaint) { + var t = _splitType(typeId), _cont = false; + if (t != null) { + for (var i = 0, j = t.length; i < j; i++) { + if (!this.hasType(t[i])) { + this._jsPlumb.types.push(t[i]); + _cont = true; + } + } + if (_cont) { + _applyTypes(this, params, doNotRepaint); + } + } + }, + + removeType: function (typeId, params, doNotRepaint) { + var t = _splitType(typeId), _cont = false, _one = function (tt) { + var idx = this._jsPlumb.types.indexOf(tt); + if (idx !== -1) { + // remove css class if necessary + _removeTypeCssHelper(this, idx); + this._jsPlumb.types.splice(idx, 1); + return true; + } + return false; + }.bind(this); + + if (t != null) { + for (var i = 0, j = t.length; i < j; i++) { + _cont = _one(t[i]) || _cont; + } + if (_cont) { + _applyTypes(this, params, doNotRepaint); + } + } + }, + clearTypes: function (params, doNotRepaint) { + var i = this._jsPlumb.types.length; + for (var j = 0; j < i; j++) { + _removeTypeCssHelper(this, 0); + this._jsPlumb.types.splice(0, 1); + } + _applyTypes(this, params, doNotRepaint); + }, + + toggleType: function (typeId, params, doNotRepaint) { + var t = _splitType(typeId); + if (t != null) { + for (var i = 0, j = t.length; i < j; i++) { + var idx = this._jsPlumb.types.indexOf(t[i]); + if (idx !== -1) { + _removeTypeCssHelper(this, idx); + this._jsPlumb.types.splice(idx, 1); + } + else { + this._jsPlumb.types.push(t[i]); + } + } + + _applyTypes(this, params, doNotRepaint); + } + }, + applyType: function (t, doNotRepaint) { + this.setPaintStyle(t.paintStyle, doNotRepaint); + this.setHoverPaintStyle(t.hoverPaintStyle, doNotRepaint); + if (t.parameters) { + for (var i in t.parameters) { + this.setParameter(i, t.parameters[i]); + } + } + this._jsPlumb.paintStyleInUse = this.getPaintStyle(); + }, + setPaintStyle: function (style, doNotRepaint) { + // this._jsPlumb.paintStyle = jsPlumb.extend({}, style); + // TODO figure out if we want components to clone paintStyle so as not to share it. + this._jsPlumb.paintStyle = style; + this._jsPlumb.paintStyleInUse = this._jsPlumb.paintStyle; + _updateHoverStyle(this); + if (!doNotRepaint) { + this.repaint(); + } + }, + getPaintStyle: function () { + return this._jsPlumb.paintStyle; + }, + setHoverPaintStyle: function (style, doNotRepaint) { + //this._jsPlumb.hoverPaintStyle = jsPlumb.extend({}, style); + // TODO figure out if we want components to clone paintStyle so as not to share it. + this._jsPlumb.hoverPaintStyle = style; + _updateHoverStyle(this); + if (!doNotRepaint) { + this.repaint(); + } + }, + getHoverPaintStyle: function () { + return this._jsPlumb.hoverPaintStyle; + }, + destroy: function (force) { + if (force || this.typeId == null) { + this.cleanupListeners(); // this is on EventGenerator + this.clone = null; + this._jsPlumb = null; + } + }, + + isHover: function () { + return this._jsPlumb.hover; + }, + + setHover: function (hover, ignoreAttachedElements, timestamp) { + // while dragging, we ignore these events. this keeps the UI from flashing and + // swishing and whatevering. + if (this._jsPlumb && !this._jsPlumb.instance.currentlyDragging && !this._jsPlumb.instance.isHoverSuspended()) { + + this._jsPlumb.hover = hover; + var method = hover ? "addClass" : "removeClass"; + + if (this.canvas != null) { + if (this._jsPlumb.instance.hoverClass != null) { + this._jsPlumb.instance[method](this.canvas, this._jsPlumb.instance.hoverClass); + } + if (this._jsPlumb.hoverClass != null) { + this._jsPlumb.instance[method](this.canvas, this._jsPlumb.hoverClass); + } + } + if (this._jsPlumb.hoverPaintStyle != null) { + this._jsPlumb.paintStyleInUse = hover ? this._jsPlumb.hoverPaintStyle : this._jsPlumb.paintStyle; + if (!this._jsPlumb.instance.isSuspendDrawing()) { + timestamp = timestamp || _timestamp(); + this.repaint({timestamp: timestamp, recalc: false}); + } + } + // get the list of other affected elements, if supported by this component. + // for a connection, its the endpoints. for an endpoint, its the connections! surprise. + if (this.getAttachedElements && !ignoreAttachedElements) { + _updateAttachedElements(this, hover, _timestamp(), this); + } + } + } + }); + +// ------------------------------ END jsPlumbUIComponent -------------------------------------------- + + var _jsPlumbInstanceIndex = 0, + getInstanceIndex = function () { + var i = _jsPlumbInstanceIndex + 1; + _jsPlumbInstanceIndex++; + return i; + }; + + var jsPlumbInstance = root.jsPlumbInstance = function (_defaults) { + + this.version = "2.13.2"; + + this.Defaults = { + Anchor: "Bottom", + Anchors: [ null, null ], + ConnectionsDetachable: true, + ConnectionOverlays: [ ], + Connector: "Bezier", + Container: null, + DoNotThrowErrors: false, + DragOptions: { }, + DropOptions: { }, + Endpoint: "Dot", + EndpointOverlays: [ ], + Endpoints: [ null, null ], + EndpointStyle: { fill: "#456" }, + EndpointStyles: [ null, null ], + EndpointHoverStyle: null, + EndpointHoverStyles: [ null, null ], + HoverPaintStyle: null, + LabelStyle: { color: "black" }, + ListStyle: { }, + LogEnabled: false, + Overlays: [ ], + MaxConnections: 1, + PaintStyle: { "stroke-width": 4, stroke: "#456" }, + ReattachConnections: false, + RenderMode: "svg", + Scope: "jsPlumb_DefaultScope" + }; + + if (_defaults) { + jsPlumb.extend(this.Defaults, _defaults); + } + + this.logEnabled = this.Defaults.LogEnabled; + this._connectionTypes = {}; + this._endpointTypes = {}; + + _ju.EventGenerator.apply(this); + + var _currentInstance = this, + _instanceIndex = getInstanceIndex(), + _bb = _currentInstance.bind, + _initialDefaults = {}, + _zoom = 1, + _info = function (el) { + if (el == null) { + return null; + } + else if (el.nodeType === 3 || el.nodeType === 8) { + return { el:el, text:true }; + } + else { + var _el = _currentInstance.getElement(el); + return { el: _el, id: (_ju.isString(el) && _el == null) ? el : _getId(_el) }; + } + }; + + this.getInstanceIndex = function () { + return _instanceIndex; + }; + + // CONVERTED + this.setZoom = function (z, repaintEverything) { + _zoom = z; + _currentInstance.fire("zoom", _zoom); + if (repaintEverything) { + _currentInstance.repaintEverything(); + } + return true; + }; + // CONVERTED + this.getZoom = function () { + return _zoom; + }; + + for (var i in this.Defaults) { + _initialDefaults[i] = this.Defaults[i]; + } + + var _container, _containerDelegations = []; + this.unbindContainer = function() { + if (_container != null && _containerDelegations.length > 0) { + for (var i = 0; i < _containerDelegations.length; i++) { + _currentInstance.off(_container, _containerDelegations[i][0], _containerDelegations[i][1]); + } + } + }; + this.setContainer = function (c) { + + this.unbindContainer(); + + // get container as dom element. + c = this.getElement(c); + // move existing connections and endpoints, if any. + this.select().each(function (conn) { + conn.moveParent(c); + }); + this.selectEndpoints().each(function (ep) { + ep.moveParent(c); + }); + + // set container. + var previousContainer = _container; + _container = c; + _containerDelegations.length = 0; + var eventAliases = { + "endpointclick":"endpointClick", + "endpointdblclick":"endpointDblClick" + }; + + var _oneDelegateHandler = function (id, e, componentType) { + var t = e.srcElement || e.target, + jp = (t && t.parentNode ? t.parentNode._jsPlumb : null) || (t ? t._jsPlumb : null) || (t && t.parentNode && t.parentNode.parentNode ? t.parentNode.parentNode._jsPlumb : null); + if (jp) { + jp.fire(id, jp, e); + var alias = componentType ? eventAliases[componentType + id] || id : id; + // jsplumb also fires every event coming from components/overlays. That's what the test for `jp.component` is for. + _currentInstance.fire(alias, jp.component || jp, e); + } + }; + + var _addOneDelegate = function(eventId, selector, fn) { + _containerDelegations.push([eventId, fn]); + _currentInstance.on(_container, eventId, selector, fn); + }; + + // delegate one event on the container to jsplumb elements. it might be possible to + // abstract this out: each of endpoint, connection and overlay could register themselves with + // jsplumb as "component types" or whatever, and provide a suitable selector. this would be + // done by the renderer (although admittedly from 2.0 onwards we're not supporting vml anymore) + var _oneDelegate = function (id) { + // connections. + _addOneDelegate(id, ".jtk-connector", function (e) { + _oneDelegateHandler(id, e); + }); + // endpoints. note they can have an enclosing div, or not. + _addOneDelegate(id, ".jtk-endpoint", function (e) { + _oneDelegateHandler(id, e, "endpoint"); + }); + // overlays + _addOneDelegate(id, ".jtk-overlay", function (e) { + _oneDelegateHandler(id, e); + }); + }; + + for (var i = 0; i < events.length; i++) { + _oneDelegate(events[i]); + } + + // managed elements + for (var elId in managedElements) { + var el = managedElements[elId].el; + if (el.parentNode === previousContainer) { + previousContainer.removeChild(el); + _container.appendChild(el); + } + } + + }; + this.getContainer = function () { + return _container; + }; + + this.bind = function (event, fn) { + if ("ready" === event && initialized) { + fn(); + } + else { + _bb.apply(_currentInstance, [event, fn]); + } + }; + + _currentInstance.importDefaults = function (d) { + for (var i in d) { + _currentInstance.Defaults[i] = d[i]; + } + if (d.Container) { + _currentInstance.setContainer(d.Container); + } + + return _currentInstance; + }; + + _currentInstance.restoreDefaults = function () { + _currentInstance.Defaults = jsPlumb.extend({}, _initialDefaults); + return _currentInstance; + }; + + var log = null, + initialized = false, + // TODO remove from window scope + connections = [], + // map of element id -> endpoint lists. an element can have an arbitrary + // number of endpoints on it, and not all of them have to be connected + // to anything. + endpointsByElement = {}, + endpointsByUUID = {}, + managedElements = {}, + offsets = {}, + offsetTimestamps = {}, + draggableStates = {}, + connectionBeingDragged = false, + sizes = [], + _suspendDrawing = false, + _suspendedAt = null, + DEFAULT_SCOPE = this.Defaults.Scope, + _curIdStamp = 1, + _idstamp = function () { + return "" + _curIdStamp++; + }, + + // + // appends an element to some other element, which is calculated as follows: + // + // 1. if Container exists, use that element. + // 2. if the 'parent' parameter exists, use that. + // 3. otherwise just use the root element. + // + // + _appendElement = function (el, parent) { + if (_container) { + _container.appendChild(el); + } + else if (!parent) { + this.appendToRoot(el); + } + else { + this.getElement(parent).appendChild(el); + } + }.bind(this), + + // + // Draws an endpoint and its connections. this is the main entry point into drawing connections as well + // as endpoints, since jsPlumb is endpoint-centric under the hood. + // + // @param element element to draw (of type library specific element object) + // @param ui UI object from current library's event system. optional. + // @param timestamp timestamp for this paint cycle. used to speed things up a little by cutting down the amount of offset calculations we do. + // @param clearEdits defaults to false; indicates that mouse edits for connectors should be cleared + /// + _draw = function (element, ui, timestamp, clearEdits) { + + if (!_suspendDrawing) { + + element = _currentInstance.getElement(element); + + if (element != null) { + + var id = _getId(element), + repaintEls = element.querySelectorAll(".jtk-managed"); + + if (timestamp == null) { + timestamp = _timestamp(); + } + + // update the offset of everything _before_ we try to draw anything. + var o = _updateOffset({elId: id, offset: ui, recalc: false, timestamp: timestamp}); + + for (var i = 0; i < repaintEls.length; i++) { + _updateOffset({ + elId: repaintEls[i].getAttribute("id"), + // offset: { + // left: o.o.left + repaintEls[i].offset.left, + // top: o.o.top + repaintEls[i].offset.top + // }, + recalc: true, + timestamp: timestamp + }); + } + + _currentInstance.anchorManager.redraw(id, ui, timestamp, null, clearEdits); + + if (repaintEls) { + for (var j = 0; j < repaintEls.length; j++) { + _currentInstance.anchorManager.redraw(repaintEls[j].getAttribute("id"), null, timestamp, null, clearEdits, true); + } + } + } + } + }, + + // + // gets an Endpoint by uuid. + // + _getEndpoint = function (uuid) { + return endpointsByUUID[uuid]; + }, + + /** + * inits a draggable if it's not already initialised. + * TODO: somehow abstract this to the adapter, because the concept of "draggable" has no + * place on the server. + */ + + + _scopeMatch = function (e1, e2) { + var s1 = e1.scope.split(/\s/), s2 = e2.scope.split(/\s/); + for (var i = 0; i < s1.length; i++) { + for (var j = 0; j < s2.length; j++) { + if (s2[j] === s1[i]) { + return true; + } + } + } + + return false; + }, + + _mergeOverrides = function (def, values) { + var m = jsPlumb.extend({}, def); + for (var i in values) { + if (values[i]) { + m[i] = values[i]; + } + } + return m; + }, + + /* + * prepares a final params object that can be passed to _newConnection, taking into account defaults, events, etc. + */ + _prepareConnectionParams = function (params, referenceParams) { + var _p = jsPlumb.extend({ }, params); + if (referenceParams) { + jsPlumb.extend(_p, referenceParams); + } + + // hotwire endpoints passed as source or target to sourceEndpoint/targetEndpoint, respectively. + if (_p.source) { + if (_p.source.endpoint) { + _p.sourceEndpoint = _p.source; + } + else { + _p.source = _currentInstance.getElement(_p.source); + } + } + if (_p.target) { + if (_p.target.endpoint) { + _p.targetEndpoint = _p.target; + } + else { + _p.target = _currentInstance.getElement(_p.target); + } + } + + // test for endpoint uuids to connect + if (params.uuids) { + _p.sourceEndpoint = _getEndpoint(params.uuids[0]); + _p.targetEndpoint = _getEndpoint(params.uuids[1]); + } + + // now ensure that if we do have Endpoints already, they're not full. + // source: + if (_p.sourceEndpoint && _p.sourceEndpoint.isFull()) { + _ju.log(_currentInstance, "could not add connection; source endpoint is full"); + return; + } + + // target: + if (_p.targetEndpoint && _p.targetEndpoint.isFull()) { + _ju.log(_currentInstance, "could not add connection; target endpoint is full"); + return; + } + + // if source endpoint mandates connection type and nothing specified in our params, use it. + if (!_p.type && _p.sourceEndpoint) { + _p.type = _p.sourceEndpoint.connectionType; + } + + // copy in any connectorOverlays that were specified on the source endpoint. + // it doesnt copy target endpoint overlays. i'm not sure if we want it to or not. + if (_p.sourceEndpoint && _p.sourceEndpoint.connectorOverlays) { + _p.overlays = _p.overlays || []; + for (var i = 0, j = _p.sourceEndpoint.connectorOverlays.length; i < j; i++) { + _p.overlays.push(_p.sourceEndpoint.connectorOverlays[i]); + } + } + + // scope + if (_p.sourceEndpoint && _p.sourceEndpoint.scope) { + _p.scope = _p.sourceEndpoint.scope; + } + + // pointer events + if (!_p["pointer-events"] && _p.sourceEndpoint && _p.sourceEndpoint.connectorPointerEvents) { + _p["pointer-events"] = _p.sourceEndpoint.connectorPointerEvents; + } + + + var _addEndpoint = function (el, def, idx) { + var params = _mergeOverrides(def, { + anchor: _p.anchors ? _p.anchors[idx] : _p.anchor, + endpoint: _p.endpoints ? _p.endpoints[idx] : _p.endpoint, + paintStyle: _p.endpointStyles ? _p.endpointStyles[idx] : _p.endpointStyle, + hoverPaintStyle: _p.endpointHoverStyles ? _p.endpointHoverStyles[idx] : _p.endpointHoverStyle + }); + return _currentInstance.addEndpoint(el, params); + }; + + // check for makeSource/makeTarget specs. + + var _oneElementDef = function (type, idx, defs, matchType) { + if (_p[type] && !_p[type].endpoint && !_p[type + "Endpoint"] && !_p.newConnection) { + var tid = _getId(_p[type]), tep = defs[tid]; + + tep = tep ? tep[matchType] : null; + + if (tep) { + // if not enabled, return. + if (!tep.enabled) { + return false; + } + + var epDef = jsPlumb.extend({}, tep.def); + delete epDef.label; + + var newEndpoint = tep.endpoint != null && tep.endpoint._jsPlumb ? tep.endpoint : _addEndpoint(_p[type], epDef, idx); + if (newEndpoint.isFull()) { + return false; + } + _p[type + "Endpoint"] = newEndpoint; + if (!_p.scope && epDef.scope) { + _p.scope = epDef.scope; + } // provide scope if not already provided and endpoint def has one. + if (tep.uniqueEndpoint) { + if (!tep.endpoint) { + tep.endpoint = newEndpoint; + newEndpoint.setDeleteOnEmpty(false); + } + else { + newEndpoint.finalEndpoint = tep.endpoint; + } + } else { + newEndpoint.setDeleteOnEmpty(true); + } + + // + // copy in connector overlays if present on the source definition. + // + if (idx === 0 && tep.def.connectorOverlays) { + _p.overlays = _p.overlays || []; + Array.prototype.push.apply(_p.overlays, tep.def.connectorOverlays); + } + } + } + }; + + if (_oneElementDef("source", 0, this.sourceEndpointDefinitions, _p.type || "default") === false) { + return; + } + if (_oneElementDef("target", 1, this.targetEndpointDefinitions, _p.type || "default") === false) { + return; + } + + // last, ensure scopes match + if (_p.sourceEndpoint && _p.targetEndpoint) { + if (!_scopeMatch(_p.sourceEndpoint, _p.targetEndpoint)) { + _p = null; + } + } + + return _p; + }.bind(_currentInstance), + + _newConnection = function (params) { + var connectionFunc = _currentInstance.Defaults.ConnectionType || _currentInstance.getDefaultConnectionType(); + + params._jsPlumb = _currentInstance; + params.newConnection = _newConnection; + params.newEndpoint = _newEndpoint; + params.endpointsByUUID = endpointsByUUID; + params.endpointsByElement = endpointsByElement; + params.finaliseConnection = _finaliseConnection; + params.id = "con_" + _idstamp(); + var con = new connectionFunc(params); + + // if the connection is draggable, then maybe we need to tell the target endpoint to init the + // dragging code. it won't run again if it already configured to be draggable. + if (con.isDetachable()) { + con.endpoints[0].initDraggable("_jsPlumbSource"); + con.endpoints[1].initDraggable("_jsPlumbTarget"); + } + + return con; + }, + + // + // adds the connection to the backing model, fires an event if necessary and then redraws + // + _finaliseConnection = _currentInstance.finaliseConnection = function (jpc, params, originalEvent, doInformAnchorManager) { + params = params || {}; + // add to list of connections (by scope). + if (!jpc.suspendedEndpoint) { + connections.push(jpc); + } + + jpc.pending = null; + + // turn off isTemporarySource on the source endpoint (only viable on first draw) + jpc.endpoints[0].isTemporarySource = false; + + // always inform the anchor manager + // except that if jpc has a suspended endpoint it's not true to say the + // connection is new; it has just (possibly) moved. the question is whether + // to make that call here or in the anchor manager. i think perhaps here. + if (doInformAnchorManager !== false) { + _currentInstance.anchorManager.newConnection(jpc); + } + + // force a paint + _draw(jpc.source); + + // fire an event + if (!params.doNotFireConnectionEvent && params.fireEvent !== false) { + + var eventArgs = { + connection: jpc, + source: jpc.source, target: jpc.target, + sourceId: jpc.sourceId, targetId: jpc.targetId, + sourceEndpoint: jpc.endpoints[0], targetEndpoint: jpc.endpoints[1] + }; + + _currentInstance.fire("connection", eventArgs, originalEvent); + } + }, + + /* + factory method to prepare a new endpoint. this should always be used instead of creating Endpoints + manually, since this method attaches event listeners and an id. + */ + _newEndpoint = function (params, id) { + var endpointFunc = _currentInstance.Defaults.EndpointType || jsPlumb.Endpoint; + var _p = jsPlumb.extend({}, params); + //delete _p.label; // not supported by endpoint. + _p._jsPlumb = _currentInstance; + _p.newConnection = _newConnection; + _p.newEndpoint = _newEndpoint; + _p.endpointsByUUID = endpointsByUUID; + _p.endpointsByElement = endpointsByElement; + _p.fireDetachEvent = fireDetachEvent; + _p.elementId = id || _getId(_p.source); + var ep = new endpointFunc(_p); + ep.id = "ep_" + _idstamp(); + _manage(_p.elementId, _p.source); + + if (!jsPlumb.headless) { + _currentInstance.getDragManager().endpointAdded(_p.source, id); + } + + return ep; + }, + + /* + * performs the given function operation on all the connections found + * for the given element id; this means we find all the endpoints for + * the given element, and then for each endpoint find the connectors + * connected to it. then we pass each connection in to the given + * function. + */ + _operation = function (elId, func, endpointFunc) { + var endpoints = endpointsByElement[elId]; + if (endpoints && endpoints.length) { + for (var i = 0, ii = endpoints.length; i < ii; i++) { + for (var j = 0, jj = endpoints[i].connections.length; j < jj; j++) { + var retVal = func(endpoints[i].connections[j]); + // if the function passed in returns true, we exit. + // most functions return false. + if (retVal) { + return; + } + } + if (endpointFunc) { + endpointFunc(endpoints[i]); + } + } + } + }, + + _setDraggable = function (element, draggable) { + return jsPlumb.each(element, function (el) { + if (_currentInstance.isDragSupported(el)) { + draggableStates[_currentInstance.getAttribute(el, "id")] = draggable; + _currentInstance.setElementDraggable(el, draggable); + } + }); + }, + /* + * private method to do the business of hiding/showing. + * + * @param el + * either Id of the element in question or a library specific + * object for the element. + * @param state + * String specifying a value for the css 'display' property + * ('block' or 'none'). + */ + _setVisible = function (el, state, alsoChangeEndpoints) { + state = state === "block"; + var endpointFunc = null; + if (alsoChangeEndpoints) { + endpointFunc = function (ep) { + ep.setVisible(state, true, true); + }; + } + var info = _info(el); + _operation(info.id, function (jpc) { + if (state && alsoChangeEndpoints) { + // this test is necessary because this functionality is new, and i wanted to maintain backwards compatibility. + // this block will only set a connection to be visible if the other endpoint in the connection is also visible. + var oidx = jpc.sourceId === info.id ? 1 : 0; + if (jpc.endpoints[oidx].isVisible()) { + jpc.setVisible(true); + } + } + else { // the default behaviour for show, and what always happens for hide, is to just set the visibility without getting clever. + jpc.setVisible(state); + } + }, endpointFunc); + }, + /** + * private method to do the business of toggling hiding/showing. + */ + _toggleVisible = function (elId, changeEndpoints) { + var endpointFunc = null; + if (changeEndpoints) { + endpointFunc = function (ep) { + var state = ep.isVisible(); + ep.setVisible(!state); + }; + } + _operation(elId, function (jpc) { + var state = jpc.isVisible(); + jpc.setVisible(!state); + }, endpointFunc); + }, + + // TODO comparison performance + _getCachedData = function (elId) { + var o = offsets[elId]; + if (!o) { + return _updateOffset({elId: elId}); + } + else { + return {o: o, s: sizes[elId]}; + } + }, + + /** + * gets an id for the given element, creating and setting one if + * necessary. the id is of the form + * + * jsPlumb__ + * + * where "index in instance" is a monotonically increasing integer that starts at 0, + * for each instance. this method is used not only to assign ids to elements that do not + * have them but also to connections and endpoints. + */ + _getId = function (element, uuid, doNotCreateIfNotFound) { + if (_ju.isString(element)) { + return element; + } + if (element == null) { + return null; + } + var id = _currentInstance.getAttribute(element, "id"); + if (!id || id === "undefined") { + // check if fixed uuid parameter is given + if (arguments.length === 2 && arguments[1] !== undefined) { + id = uuid; + } + else if (arguments.length === 1 || (arguments.length === 3 && !arguments[2])) { + id = "jsPlumb_" + _instanceIndex + "_" + _idstamp(); + } + + if (!doNotCreateIfNotFound) { + _currentInstance.setAttribute(element, "id", id); + } + } + return id; + }; + + this.setConnectionBeingDragged = function (v) { + connectionBeingDragged = v; + }; + this.isConnectionBeingDragged = function () { + return connectionBeingDragged; + }; + + /** + * Returns a map of all the elements this jsPlumbInstance is currently managing. + * @returns {Object} Map of [id-> {el, endpoint[], connection, position}] information. + */ + this.getManagedElements = function() { + return managedElements; + }; + + this.connectorClass = "jtk-connector"; + this.connectorOutlineClass = "jtk-connector-outline"; + this.connectedClass = "jtk-connected"; + this.hoverClass = "jtk-hover"; + this.endpointClass = "jtk-endpoint"; + this.endpointConnectedClass = "jtk-endpoint-connected"; + this.endpointFullClass = "jtk-endpoint-full"; + this.endpointDropAllowedClass = "jtk-endpoint-drop-allowed"; + this.endpointDropForbiddenClass = "jtk-endpoint-drop-forbidden"; + this.overlayClass = "jtk-overlay"; + this.draggingClass = "jtk-dragging";// CONVERTED + this.elementDraggingClass = "jtk-element-dragging";// CONVERTED + this.sourceElementDraggingClass = "jtk-source-element-dragging"; // CONVERTED + this.targetElementDraggingClass = "jtk-target-element-dragging";// CONVERTED + this.endpointAnchorClassPrefix = "jtk-endpoint-anchor"; + this.hoverSourceClass = "jtk-source-hover"; + this.hoverTargetClass = "jtk-target-hover"; + this.dragSelectClass = "jtk-drag-select"; + + this.Anchors = {}; + this.Connectors = { "svg": {} }; + this.Endpoints = { "svg": {} }; + this.Overlays = { "svg": {} } ; + this.ConnectorRenderers = {}; + this.SVG = "svg"; + +// --------------------------- jsPlumbInstance public API --------------------------------------------------------- + + + this.addEndpoint = function (el, params, referenceParams) { + referenceParams = referenceParams || {}; + var p = jsPlumb.extend({}, referenceParams); + jsPlumb.extend(p, params); + p.endpoint = p.endpoint || _currentInstance.Defaults.Endpoint; + p.paintStyle = p.paintStyle || _currentInstance.Defaults.EndpointStyle; + + var results = [], + inputs = (_ju.isArray(el) || (el.length != null && !_ju.isString(el))) ? el : [ el ]; + + for (var i = 0, j = inputs.length; i < j; i++) { + p.source = _currentInstance.getElement(inputs[i]); + _ensureContainer(p.source); + + var id = _getId(p.source), e = _newEndpoint(p, id); + + // ensure element is managed. force a recalc if drawing not suspended, to ensure the cached value is fresh + var myOffset = _manage(id, p.source, null, !_suspendDrawing).info.o; + _ju.addToList(endpointsByElement, id, e); + + if (!_suspendDrawing) { + e.paint({ + anchorLoc: e.anchor.compute({ xy: [ myOffset.left, myOffset.top ], wh: sizes[id], element: e, timestamp: _suspendedAt }), + timestamp: _suspendedAt + }); + } + + results.push(e); + } + + return results.length === 1 ? results[0] : results; + }; + + this.addEndpoints = function (el, endpoints, referenceParams) { + var results = []; + for (var i = 0, j = endpoints.length; i < j; i++) { + var e = _currentInstance.addEndpoint(el, endpoints[i], referenceParams); + if (_ju.isArray(e)) { + Array.prototype.push.apply(results, e); + } + else { + results.push(e); + } + } + return results; + }; + + this.animate = function (el, properties, options) { + if (!this.animationSupported) { + return false; + } + + options = options || {}; + var del = _currentInstance.getElement(el), + id = _getId(del), + stepFunction = jsPlumb.animEvents.step, + completeFunction = jsPlumb.animEvents.complete; + + options[stepFunction] = _ju.wrap(options[stepFunction], function () { + _currentInstance.revalidate(id); + }); + + // onComplete repaints, just to make sure everything looks good at the end of the animation. + options[completeFunction] = _ju.wrap(options[completeFunction], function () { + _currentInstance.revalidate(id); + }); + + _currentInstance.doAnimate(del, properties, options); + }; + + /** + * checks for a listener for the given condition, executing it if found, passing in the given value. + * condition listeners would have been attached using "bind" (which is, you could argue, now overloaded, since + * firing click events etc is a bit different to what this does). i thought about adding a "bindCondition" + * or something, but decided against it, for the sake of simplicity. jsPlumb will never fire one of these + * condition events anyway. + */ + this.checkCondition = function (conditionName, args) { + var l = _currentInstance.getListener(conditionName), + r = true; + + if (l && l.length > 0) { + var values = Array.prototype.slice.call(arguments, 1); + try { + for (var i = 0, j = l.length; i < j; i++) { + r = r && l[i].apply(l[i], values); + } + } + catch (e) { + _ju.log(_currentInstance, "cannot check condition [" + conditionName + "]" + e); + } + } + return r; + }; + + this.connect = function (params, referenceParams) { + // prepare a final set of parameters to create connection with + var _p = _prepareConnectionParams(params, referenceParams), jpc; + // TODO probably a nicer return value if the connection was not made. _prepareConnectionParams + // will return null (and log something) if either endpoint was full. what would be nicer is to + // create a dedicated 'error' object. + if (_p) { + if (_p.source == null && _p.sourceEndpoint == null) { + _ju.log("Cannot establish connection - source does not exist"); + return; + } + if (_p.target == null && _p.targetEndpoint == null) { + _ju.log("Cannot establish connection - target does not exist"); + return; + } + _ensureContainer(_p.source); + // create the connection. it is not yet registered + jpc = _newConnection(_p); + // now add it the model, fire an event, and redraw + _finaliseConnection(jpc, _p); + } + return jpc; + }; + + var stTypes = [ + { el: "source", elId: "sourceId", epDefs: "sourceEndpointDefinitions" }, + { el: "target", elId: "targetId", epDefs: "targetEndpointDefinitions" } + ]; + + var _set = function (c, el, idx, doNotRepaint) { + var ep, _st = stTypes[idx], cId = c[_st.elId], cEl = c[_st.el], sid, sep, + oldEndpoint = c.endpoints[idx]; + + var evtParams = { + index: idx, + originalSourceId: idx === 0 ? cId : c.sourceId, + newSourceId: c.sourceId, + originalTargetId: idx === 1 ? cId : c.targetId, + newTargetId: c.targetId, + connection: c + }; + + if (el.constructor === jsPlumb.Endpoint) { + ep = el; + ep.addConnection(c); + el = ep.element; + } + else { + sid = _getId(el); + sep = this[_st.epDefs][sid]; + + if (sid === c[_st.elId]) { + ep = null; // dont change source/target if the element is already the one given. + } + else if (sep) { + for (var t in sep) { + if (!sep[t].enabled) { + return; + } + ep = sep[t].endpoint != null && sep[t].endpoint._jsPlumb ? sep[t].endpoint : this.addEndpoint(el, sep[t].def); + if (sep[t].uniqueEndpoint) { + sep[t].endpoint = ep; + } + ep.addConnection(c); + } + } + else { + ep = c.makeEndpoint(idx === 0, el, sid); + } + } + + if (ep != null) { + oldEndpoint.detachFromConnection(c); + c.endpoints[idx] = ep; + c[_st.el] = ep.element; + c[_st.elId] = ep.elementId; + evtParams[idx === 0 ? "newSourceId" : "newTargetId"] = ep.elementId; + + fireMoveEvent(evtParams); + + if (!doNotRepaint) { + c.repaint(); + } + } + + evtParams.element = el; + return evtParams; + + }.bind(this); + + this.setSource = function (connection, el, doNotRepaint) { + var p = _set(connection, el, 0, doNotRepaint); + this.anchorManager.sourceChanged(p.originalSourceId, p.newSourceId, connection, p.el); + }; + this.setTarget = function (connection, el, doNotRepaint) { + var p = _set(connection, el, 1, doNotRepaint); + this.anchorManager.updateOtherEndpoint(p.originalSourceId, p.originalTargetId, p.newTargetId, connection); + }; + + this.deleteEndpoint = function (object, dontUpdateHover, deleteAttachedObjects) { + var endpoint = (typeof object === "string") ? endpointsByUUID[object] : object; + if (endpoint) { + _currentInstance.deleteObject({ endpoint: endpoint, dontUpdateHover: dontUpdateHover, deleteAttachedObjects:deleteAttachedObjects }); + } + return _currentInstance; + }; + + this.deleteEveryEndpoint = function () { + var _is = _currentInstance.setSuspendDrawing(true); + for (var id in endpointsByElement) { + var endpoints = endpointsByElement[id]; + if (endpoints && endpoints.length) { + for (var i = 0, j = endpoints.length; i < j; i++) { + _currentInstance.deleteEndpoint(endpoints[i], true); + } + } + } + endpointsByElement = {}; + managedElements = {}; + endpointsByUUID = {}; + offsets = {}; + offsetTimestamps = {}; + _currentInstance.anchorManager.reset(); + var dm = _currentInstance.getDragManager(); + if (dm) { + dm.reset(); + } + if (!_is) { + _currentInstance.setSuspendDrawing(false); + } + return _currentInstance; + }; + + var fireDetachEvent = function (jpc, doFireEvent, originalEvent) { + // may have been given a connection, or in special cases, an object + var connType = _currentInstance.Defaults.ConnectionType || _currentInstance.getDefaultConnectionType(), + argIsConnection = jpc.constructor === connType, + params = argIsConnection ? { + connection: jpc, + source: jpc.source, target: jpc.target, + sourceId: jpc.sourceId, targetId: jpc.targetId, + sourceEndpoint: jpc.endpoints[0], targetEndpoint: jpc.endpoints[1] + } : jpc; + + if (doFireEvent) { + _currentInstance.fire("connectionDetached", params, originalEvent); + } + + // always fire this. used by internal jsplumb stuff. + _currentInstance.fire("internal.connectionDetached", params, originalEvent); + + _currentInstance.anchorManager.connectionDetached(params); + }; + + var fireMoveEvent = _currentInstance.fireMoveEvent = function (params, evt) { + _currentInstance.fire("connectionMoved", params, evt); + }; + + this.unregisterEndpoint = function (endpoint) { + if (endpoint._jsPlumb.uuid) { + endpointsByUUID[endpoint._jsPlumb.uuid] = null; + } + _currentInstance.anchorManager.deleteEndpoint(endpoint); + // TODO at least replace this with a removeWithFunction call. + for (var e in endpointsByElement) { + var endpoints = endpointsByElement[e]; + if (endpoints) { + var newEndpoints = []; + for (var i = 0, j = endpoints.length; i < j; i++) { + if (endpoints[i] !== endpoint) { + newEndpoints.push(endpoints[i]); + } + } + + endpointsByElement[e] = newEndpoints; + } + if (endpointsByElement[e].length < 1) { + delete endpointsByElement[e]; + } + } + }; + + var IS_DETACH_ALLOWED = "isDetachAllowed"; + var BEFORE_DETACH = "beforeDetach"; + var CHECK_CONDITION = "checkCondition"; + + /** + * Deletes a Connection. + * @method deleteConnection + * @param connection Connection to delete + * @param {Object} [params] Optional delete parameters + * @param {Boolean} [params.doNotFireEvent=false] If true, a connection detached event will not be fired. Otherwise one will. + * @param {Boolean} [params.force=false] If true, the connection will be deleted even if a beforeDetach interceptor tries to stop the deletion. + * @returns {Boolean} True if the connection was deleted, false otherwise. + */ + this.deleteConnection = function(connection, params) { + + if (connection != null) { + params = params || {}; + + if (params.force || _ju.functionChain(true, false, [ + [ connection.endpoints[0], IS_DETACH_ALLOWED, [ connection ] ], + [ connection.endpoints[1], IS_DETACH_ALLOWED, [ connection ] ], + [ connection, IS_DETACH_ALLOWED, [ connection ] ], + [ _currentInstance, CHECK_CONDITION, [ BEFORE_DETACH, connection ] ] + ])) { + + connection.setHover(false); + fireDetachEvent(connection, !connection.pending && params.fireEvent !== false, params.originalEvent); + + connection.endpoints[0].detachFromConnection(connection); + connection.endpoints[1].detachFromConnection(connection); + _ju.removeWithFunction(connections, function (_c) { + return connection.id === _c.id; + }); + + connection.cleanup(); + connection.destroy(); + return true; + } + } + return false; + }; + + /** + * Remove all Connections from all elements, but leaves Endpoints in place ((unless a connection is set to auto delete its Endpoints). + * @method deleteEveryConnection + * @param {Object} [params] optional params object for the call + * @param {Boolean} [params.fireEvent=true] Whether or not to fire detach events + * @param {Boolean} [params.forceDetach=false] If true, this call will ignore any `beforeDetach` interceptors. + * @returns {Number} The number of connections that were deleted. + */ + this.deleteEveryConnection = function (params) { + params = params || {}; + var count = connections.length, deletedCount = 0; + _currentInstance.batch(function () { + for (var i = 0; i < count; i++) { + deletedCount += _currentInstance.deleteConnection(connections[0], params) ? 1 : 0; + } + }); + return deletedCount; + }; + + /** + * Removes all an element's Connections. + * @method deleteConnectionsForElement + * @param {Object} el Either the id of the element, or a selector for the element. + * @param {Object} [params] Optional parameters. + * @param {Boolean} [params.fireEvent=true] Whether or not to fire the detach event. + * @param {Boolean} [params.forceDetach=false] If true, this call will ignore any `beforeDetach` interceptors. + * @return {jsPlumbInstance} The current jsPlumb instance. + */ + this.deleteConnectionsForElement = function (el, params) { + params = params || {}; + el = _currentInstance.getElement(el); + var id = _getId(el), endpoints = endpointsByElement[id]; + if (endpoints && endpoints.length) { + for (var i = 0, j = endpoints.length; i < j; i++) { + endpoints[i].deleteEveryConnection(params); + } + } + return _currentInstance; + }; + + /// not public. but of course its exposed. how to change this. + this.deleteObject = function (params) { + var result = { + endpoints: {}, + connections: {}, + endpointCount: 0, + connectionCount: 0 + }, + deleteAttachedObjects = params.deleteAttachedObjects !== false; + + var unravelConnection = function (connection) { + if (connection != null && result.connections[connection.id] == null) { + if (!params.dontUpdateHover && connection._jsPlumb != null) { + connection.setHover(false); + } + result.connections[connection.id] = connection; + result.connectionCount++; + } + }; + var unravelEndpoint = function (endpoint) { + if (endpoint != null && result.endpoints[endpoint.id] == null) { + if (!params.dontUpdateHover && endpoint._jsPlumb != null) { + endpoint.setHover(false); + } + result.endpoints[endpoint.id] = endpoint; + result.endpointCount++; + + if (deleteAttachedObjects) { + for (var i = 0; i < endpoint.connections.length; i++) { + var c = endpoint.connections[i]; + unravelConnection(c); + } + } + } + }; + + if (params.connection) { + unravelConnection(params.connection); + } + else { + unravelEndpoint(params.endpoint); + } + + // loop through connections + for (var i in result.connections) { + var c = result.connections[i]; + if (c._jsPlumb) { + _ju.removeWithFunction(connections, function (_c) { + return c.id === _c.id; + }); + + fireDetachEvent(c, params.fireEvent === false ? false : !c.pending, params.originalEvent); + var doNotCleanup = params.deleteAttachedObjects == null ? null : !params.deleteAttachedObjects; + + c.endpoints[0].detachFromConnection(c, null, doNotCleanup); + c.endpoints[1].detachFromConnection(c, null, doNotCleanup); + + c.cleanup(true); + c.destroy(true); + } + } + + // loop through endpoints + for (var j in result.endpoints) { + var e = result.endpoints[j]; + if (e._jsPlumb) { + _currentInstance.unregisterEndpoint(e); + // FIRE some endpoint deleted event? + e.cleanup(true); + e.destroy(true); + } + } + + return result; + }; + + + // helpers for select/selectEndpoints + var _setOperation = function (list, func, args, selector) { + for (var i = 0, j = list.length; i < j; i++) { + list[i][func].apply(list[i], args); + } + return selector(list); + }, + _getOperation = function (list, func, args) { + var out = []; + for (var i = 0, j = list.length; i < j; i++) { + out.push([ list[i][func].apply(list[i], args), list[i] ]); + } + return out; + }, + setter = function (list, func, selector) { + return function () { + return _setOperation(list, func, arguments, selector); + }; + }, + getter = function (list, func) { + return function () { + return _getOperation(list, func, arguments); + }; + }, + prepareList = function (input, doNotGetIds) { + var r = []; + if (input) { + if (typeof input === 'string') { + if (input === "*") { + return input; + } + r.push(input); + } + else { + if (doNotGetIds) { + r = input; + } + else { + if (input.length) { + for (var i = 0, j = input.length; i < j; i++) { + r.push(_info(input[i]).id); + } + } + else { + r.push(_info(input).id); + } + } + } + } + return r; + }, + filterList = function (list, value, missingIsFalse) { + if (list === "*") { + return true; + } + return list.length > 0 ? list.indexOf(value) !== -1 : !missingIsFalse; + }; + + // get some connections, specifying source/target/scope + this.getConnections = function (options, flat) { + if (!options) { + options = {}; + } else if (options.constructor === String) { + options = { "scope": options }; + } + var scope = options.scope || _currentInstance.getDefaultScope(), + scopes = prepareList(scope, true), + sources = prepareList(options.source), + targets = prepareList(options.target), + results = (!flat && scopes.length > 1) ? {} : [], + _addOne = function (scope, obj) { + if (!flat && scopes.length > 1) { + var ss = results[scope]; + if (ss == null) { + ss = results[scope] = []; + } + ss.push(obj); + } else { + results.push(obj); + } + }; + + for (var j = 0, jj = connections.length; j < jj; j++) { + var c = connections[j], + sourceId = c.proxies && c.proxies[0] ? c.proxies[0].originalEp.elementId : c.sourceId, + targetId = c.proxies && c.proxies[1] ? c.proxies[1].originalEp.elementId : c.targetId; + + if (filterList(scopes, c.scope) && filterList(sources, sourceId) && filterList(targets, targetId)) { + _addOne(c.scope, c); + } + } + + return results; + }; + + var _curryEach = function (list, executor) { + return function (f) { + for (var i = 0, ii = list.length; i < ii; i++) { + f(list[i]); + } + return executor(list); + }; + }, + _curryGet = function (list) { + return function (idx) { + return list[idx]; + }; + }; + + var _makeCommonSelectHandler = function (list, executor) { + var out = { + length: list.length, + each: _curryEach(list, executor), + get: _curryGet(list) + }, + setters = ["setHover", "removeAllOverlays", "setLabel", "addClass", "addOverlay", "removeOverlay", + "removeOverlays", "showOverlay", "hideOverlay", "showOverlays", "hideOverlays", "setPaintStyle", + "setHoverPaintStyle", "setSuspendEvents", "setParameter", "setParameters", "setVisible", + "repaint", "addType", "toggleType", "removeType", "removeClass", "setType", "bind", "unbind" ], + + getters = ["getLabel", "getOverlay", "isHover", "getParameter", "getParameters", "getPaintStyle", + "getHoverPaintStyle", "isVisible", "hasType", "getType", "isSuspendEvents" ], + i, ii; + + for (i = 0, ii = setters.length; i < ii; i++) { + out[setters[i]] = setter(list, setters[i], executor); + } + + for (i = 0, ii = getters.length; i < ii; i++) { + out[getters[i]] = getter(list, getters[i]); + } + + return out; + }; + + var _makeConnectionSelectHandler = function (list) { + var common = _makeCommonSelectHandler(list, _makeConnectionSelectHandler); + return jsPlumb.extend(common, { + // setters + setDetachable: setter(list, "setDetachable", _makeConnectionSelectHandler), + setReattach: setter(list, "setReattach", _makeConnectionSelectHandler), + setConnector: setter(list, "setConnector", _makeConnectionSelectHandler), + delete: function () { + for (var i = 0, ii = list.length; i < ii; i++) { + _currentInstance.deleteConnection(list[i]); + } + }, + // getters + isDetachable: getter(list, "isDetachable"), + isReattach: getter(list, "isReattach") + }); + }; + + var _makeEndpointSelectHandler = function (list) { + var common = _makeCommonSelectHandler(list, _makeEndpointSelectHandler); + return jsPlumb.extend(common, { + setEnabled: setter(list, "setEnabled", _makeEndpointSelectHandler), + setAnchor: setter(list, "setAnchor", _makeEndpointSelectHandler), + isEnabled: getter(list, "isEnabled"), + deleteEveryConnection: function () { + for (var i = 0, ii = list.length; i < ii; i++) { + list[i].deleteEveryConnection(); + } + }, + "delete": function () { + for (var i = 0, ii = list.length; i < ii; i++) { + _currentInstance.deleteEndpoint(list[i]); + } + } + }); + }; + + this.select = function (params) { + params = params || {}; + params.scope = params.scope || "*"; + return _makeConnectionSelectHandler(params.connections || _currentInstance.getConnections(params, true)); + }; + + this.selectEndpoints = function (params) { + params = params || {}; + params.scope = params.scope || "*"; + var noElementFilters = !params.element && !params.source && !params.target, + elements = noElementFilters ? "*" : prepareList(params.element), + sources = noElementFilters ? "*" : prepareList(params.source), + targets = noElementFilters ? "*" : prepareList(params.target), + scopes = prepareList(params.scope, true); + + var ep = []; + + for (var el in endpointsByElement) { + var either = filterList(elements, el, true), + source = filterList(sources, el, true), + sourceMatchExact = sources !== "*", + target = filterList(targets, el, true), + targetMatchExact = targets !== "*"; + + // if they requested 'either' then just match scope. otherwise if they requested 'source' (not as a wildcard) then we have to match only endpoints that have isSource set to to true, and the same thing with isTarget. + if (either || source || target) { + inner: + for (var i = 0, ii = endpointsByElement[el].length; i < ii; i++) { + var _ep = endpointsByElement[el][i]; + if (filterList(scopes, _ep.scope, true)) { + + var noMatchSource = (sourceMatchExact && sources.length > 0 && !_ep.isSource), + noMatchTarget = (targetMatchExact && targets.length > 0 && !_ep.isTarget); + + if (noMatchSource || noMatchTarget) { + continue inner; + } + + ep.push(_ep); + } + } + } + } + + return _makeEndpointSelectHandler(ep); + }; + + // get all connections managed by the instance of jsplumb. + this.getAllConnections = function () { + return connections; + }; + this.getDefaultScope = function () { + return DEFAULT_SCOPE; + }; + // get an endpoint by uuid. + this.getEndpoint = _getEndpoint; + /** + * Gets the list of Endpoints for a given element. + * @method getEndpoints + * @param {String|Element|Selector} el The element to get endpoints for. + * @return {Endpoint[]} An array of Endpoints for the specified element. + */ + this.getEndpoints = function (el) { + return endpointsByElement[_info(el).id] || []; + }; + // gets the default endpoint type. used when subclassing. see wiki. + this.getDefaultEndpointType = function () { + return jsPlumb.Endpoint; + }; + // gets the default connection type. used when subclassing. see wiki. + this.getDefaultConnectionType = function () { + return jsPlumb.Connection; + }; + /* + * Gets an element's id, creating one if necessary. really only exposed + * for the lib-specific functionality to access; would be better to pass + * the current instance into the lib-specific code (even though this is + * a static call. i just don't want to expose it to the public API). + */ + this.getId = _getId; + this.draw = _draw; + this.info = _info; + + this.appendElement = _appendElement; + + var _hoverSuspended = false; + this.isHoverSuspended = function () { + return _hoverSuspended; + }; + this.setHoverSuspended = function (s) { + _hoverSuspended = s; + }; + + // set an element's connections to be hidden + this.hide = function (el, changeEndpoints) { + _setVisible(el, "none", changeEndpoints); + return _currentInstance; + }; + + // exposed for other objects to use to get a unique id. + this.idstamp = _idstamp; + + // ensure that, if the current container exists, it is a DOM element and not a selector. + // if it does not exist and `candidate` is supplied, the offset parent of that element will be set as the Container. + // this is used to do a better default behaviour for the case that the user has not set a container: + // addEndpoint, makeSource, makeTarget and connect all call this method with the offsetParent of the + // element in question (for connect it is the source element). So if no container is set, it is inferred + // to be the offsetParent of the first element the user tries to connect. + var _ensureContainer = function (candidate) { + if (!_container && candidate) { + var can = _currentInstance.getElement(candidate); + if (can.offsetParent) { + _currentInstance.setContainer(can.offsetParent); + } + } + }; + + var _getContainerFromDefaults = function () { + if (_currentInstance.Defaults.Container) { + _currentInstance.setContainer(_currentInstance.Defaults.Container); + } + }; + + // check if a given element is managed or not. if not, add to our map. if drawing is not suspended then + // we'll also stash its dimensions; otherwise we'll do this in a lazy way through updateOffset. + var _manage = _currentInstance.manage = function (id, element, _transient, _recalc) { + if (!managedElements[id]) { + managedElements[id] = { + el: element, + endpoints: [], + connections: [] + }; + + managedElements[id].info = _updateOffset({ elId: id, timestamp: _suspendedAt }); + _currentInstance.addClass(element, "jtk-managed"); + + if (!_transient) { + _currentInstance.fire("manageElement", { id:id, info:managedElements[id].info, el:element }); + } + } else { + if (_recalc) { + managedElements[id].info = _updateOffset({ elId: id, timestamp: _suspendedAt, recalc:true }); + } + } + + return managedElements[id]; + }; + + var _unmanage = _currentInstance.unmanage = function(id) { + if (managedElements[id]) { + var el = managedElements[id].el; + _currentInstance.removeClass(el, "jtk-managed"); + delete managedElements[id]; + _currentInstance.fire("unmanageElement", {id:id, el:el}); + } + }; + + /** + * updates the offset and size for a given element, and stores the + * values. if 'offset' is not null we use that (it would have been + * passed in from a drag call) because it's faster; but if it is null, + * or if 'recalc' is true in order to force a recalculation, we get the current values. + * @method updateOffset + */ + var _updateOffset = function (params) { + + var timestamp = params.timestamp, recalc = params.recalc, offset = params.offset, elId = params.elId, s; + if (_suspendDrawing && !timestamp) { + timestamp = _suspendedAt; + } + if (!recalc) { + if (timestamp && timestamp === offsetTimestamps[elId]) { + return {o: params.offset || offsets[elId], s: sizes[elId]}; + } + } + if (recalc || (!offset && offsets[elId] == null)) { // if forced repaint or no offset available, we recalculate. + + // get the current size and offset, and store them + s = managedElements[elId] ? managedElements[elId].el : null; + if (s != null) { + sizes[elId] = _currentInstance.getSize(s); + offsets[elId] = _currentInstance.getOffset(s); + offsetTimestamps[elId] = timestamp; + } + } else { + offsets[elId] = offset || offsets[elId]; + if (sizes[elId] == null) { + s = managedElements[elId].el; + if (s != null) { + sizes[elId] = _currentInstance.getSize(s); + } + } + offsetTimestamps[elId] = timestamp; + } + + if (offsets[elId] && !offsets[elId].right) { + offsets[elId].right = offsets[elId].left + sizes[elId][0]; + offsets[elId].bottom = offsets[elId].top + sizes[elId][1]; + offsets[elId].width = sizes[elId][0]; + offsets[elId].height = sizes[elId][1]; + offsets[elId].centerx = offsets[elId].left + (offsets[elId].width / 2); + offsets[elId].centery = offsets[elId].top + (offsets[elId].height / 2); + } + + return {o: offsets[elId], s: sizes[elId]}; + }; + + this.updateOffset = _updateOffset; + + /** + * callback from the current library to tell us to prepare ourselves (attach + * mouse listeners etc; can't do that until the library has provided a bind method) + */ + this.init = function () { + if (!initialized) { + _getContainerFromDefaults(); + _currentInstance.anchorManager = new root.jsPlumb.AnchorManager({jsPlumbInstance: _currentInstance}); + initialized = true; + _currentInstance.fire("ready", _currentInstance); + } + }.bind(this); + + this.log = log; + this.jsPlumbUIComponent = jsPlumbUIComponent; + + /* + * Creates an anchor with the given params. + * + * + * Returns: The newly created Anchor. + * Throws: an error if a named anchor was not found. + */ + this.makeAnchor = function () { + var pp, _a = function (t, p) { + if (root.jsPlumb.Anchors[t]) { + return new root.jsPlumb.Anchors[t](p); + } + if (!_currentInstance.Defaults.DoNotThrowErrors) { + throw { msg: "jsPlumb: unknown anchor type '" + t + "'" }; + } + }; + if (arguments.length === 0) { + return null; + } + var specimen = arguments[0], elementId = arguments[1], jsPlumbInstance = arguments[2], newAnchor = null; + // if it appears to be an anchor already... + if (specimen.compute && specimen.getOrientation) { + return specimen; + } //TODO hazy here about whether it should be added or is already added somehow. + // is it the name of an anchor type? + else if (typeof specimen === "string") { + newAnchor = _a(arguments[0], {elementId: elementId, jsPlumbInstance: _currentInstance}); + } + // is it an array? it will be one of: + // an array of [spec, params] - this defines a single anchor, which may be dynamic, but has parameters. + // an array of arrays - this defines some dynamic anchors + // an array of numbers - this defines a single anchor. + else if (_ju.isArray(specimen)) { + if (_ju.isArray(specimen[0]) || _ju.isString(specimen[0])) { + // if [spec, params] format + if (specimen.length === 2 && _ju.isObject(specimen[1])) { + // if first arg is a string, its a named anchor with params + if (_ju.isString(specimen[0])) { + pp = root.jsPlumb.extend({elementId: elementId, jsPlumbInstance: _currentInstance}, specimen[1]); + newAnchor = _a(specimen[0], pp); + } + // otherwise first arg is array, second is params. we treat as a dynamic anchor, which is fine + // even if the first arg has only one entry. you could argue all anchors should be implicitly dynamic in fact. + else { + pp = root.jsPlumb.extend({elementId: elementId, jsPlumbInstance: _currentInstance, anchors: specimen[0]}, specimen[1]); + newAnchor = new root.jsPlumb.DynamicAnchor(pp); + } + } + else { + newAnchor = new jsPlumb.DynamicAnchor({anchors: specimen, selector: null, elementId: elementId, jsPlumbInstance: _currentInstance}); + } + + } + else { + var anchorParams = { + x: specimen[0], y: specimen[1], + orientation: (specimen.length >= 4) ? [ specimen[2], specimen[3] ] : [0, 0], + offsets: (specimen.length >= 6) ? [ specimen[4], specimen[5] ] : [ 0, 0 ], + elementId: elementId, + jsPlumbInstance: _currentInstance, + cssClass: specimen.length === 7 ? specimen[6] : null + }; + newAnchor = new root.jsPlumb.Anchor(anchorParams); + newAnchor.clone = function () { + return new root.jsPlumb.Anchor(anchorParams); + }; + } + } + + if (!newAnchor.id) { + newAnchor.id = "anchor_" + _idstamp(); + } + return newAnchor; + }; + + /** + * makes a list of anchors from the given list of types or coords, eg + * ["TopCenter", "RightMiddle", "BottomCenter", [0, 1, -1, -1] ] + */ + this.makeAnchors = function (types, elementId, jsPlumbInstance) { + var r = []; + for (var i = 0, ii = types.length; i < ii; i++) { + if (typeof types[i] === "string") { + r.push(root.jsPlumb.Anchors[types[i]]({elementId: elementId, jsPlumbInstance: jsPlumbInstance})); + } + else if (_ju.isArray(types[i])) { + r.push(_currentInstance.makeAnchor(types[i], elementId, jsPlumbInstance)); + } + } + return r; + }; + + /** + * Makes a dynamic anchor from the given list of anchors (which may be in shorthand notation as strings or dimension arrays, or Anchor + * objects themselves) and the given, optional, anchorSelector function (jsPlumb uses a default if this is not provided; most people will + * not need to provide this - i think). + */ + this.makeDynamicAnchor = function (anchors, anchorSelector) { + return new root.jsPlumb.DynamicAnchor({anchors: anchors, selector: anchorSelector, elementId: null, jsPlumbInstance: _currentInstance}); + }; + +// --------------------- makeSource/makeTarget ---------------------------------------------- + + this.targetEndpointDefinitions = {}; + this.sourceEndpointDefinitions = {}; + + var selectorFilter = function (evt, _el, selector, _instance, negate) { + var t = evt.target || evt.srcElement, ok = false, + sel = _instance.getSelector(_el, selector); + for (var j = 0; j < sel.length; j++) { + if (sel[j] === t) { + ok = true; + break; + } + } + return negate ? !ok : ok; + }; + + var _makeElementDropHandler = function (elInfo, p, dropOptions, isSource, isTarget) { + var proxyComponent = new jsPlumbUIComponent(p); + var _drop = p._jsPlumb.EndpointDropHandler({ + jsPlumb: _currentInstance, + enabled: function () { + return elInfo.def.enabled; + }, + isFull: function () { + var targetCount = _currentInstance.select({target: elInfo.id}).length; + return elInfo.def.maxConnections > 0 && targetCount >= elInfo.def.maxConnections; + }, + element: elInfo.el, + elementId: elInfo.id, + isSource: isSource, + isTarget: isTarget, + addClass: function (clazz) { + _currentInstance.addClass(elInfo.el, clazz); + }, + removeClass: function (clazz) { + _currentInstance.removeClass(elInfo.el, clazz); + }, + onDrop: function (jpc) { + var source = jpc.endpoints[0]; + source.anchor.unlock(); + }, + isDropAllowed: function () { + return proxyComponent.isDropAllowed.apply(proxyComponent, arguments); + }, + isRedrop:function(jpc) { + return (jpc.suspendedElement != null && jpc.suspendedEndpoint != null && jpc.suspendedEndpoint.element === elInfo.el); + }, + getEndpoint: function (jpc) { + + // make a new Endpoint for the target, or get it from the cache if uniqueEndpoint + // is set. if its a redrop the new endpoint will be immediately cleaned up. + + var newEndpoint = elInfo.def.endpoint; + + // if no cached endpoint, or there was one but it has been cleaned up + // (ie. detached), create a new one + if (newEndpoint == null || newEndpoint._jsPlumb == null) { + var eps = _currentInstance.deriveEndpointAndAnchorSpec(jpc.getType().join(" "), true); + var pp = eps.endpoints ? root.jsPlumb.extend(p, { + endpoint:elInfo.def.def.endpoint || eps.endpoints[1] + }) :p; + if (eps.anchors) { + pp = root.jsPlumb.extend(pp, { + anchor:elInfo.def.def.anchor || eps.anchors[1] + }); + } + newEndpoint = _currentInstance.addEndpoint(elInfo.el, pp); + newEndpoint._mtNew = true; + } + + if (p.uniqueEndpoint) { + elInfo.def.endpoint = newEndpoint; + } + + newEndpoint.setDeleteOnEmpty(true); + + // if connection is detachable, init the new endpoint to be draggable, to support that happening. + if (jpc.isDetachable()) { + newEndpoint.initDraggable(); + } + + // if the anchor has a 'positionFinder' set, then delegate to that function to find + // out where to locate the anchor. + if (newEndpoint.anchor.positionFinder != null) { + var dropPosition = _currentInstance.getUIPosition(arguments, _currentInstance.getZoom()), + elPosition = _currentInstance.getOffset(elInfo.el), + elSize = _currentInstance.getSize(elInfo.el), + ap = dropPosition == null ? [0,0] : newEndpoint.anchor.positionFinder(dropPosition, elPosition, elSize, newEndpoint.anchor.constructorParams); + + newEndpoint.anchor.x = ap[0]; + newEndpoint.anchor.y = ap[1]; + // now figure an orientation for it..kind of hard to know what to do actually. probably the best thing i can do is to + // support specifying an orientation in the anchor's spec. if one is not supplied then i will make the orientation + // be what will cause the most natural link to the source: it will be pointing at the source, but it needs to be + // specified in one axis only, and so how to make that choice? i think i will use whichever axis is the one in which + // the target is furthest away from the source. + } + + return newEndpoint; + }, + maybeCleanup: function (ep) { + if (ep._mtNew && ep.connections.length === 0) { + _currentInstance.deleteObject({endpoint: ep}); + } + else { + delete ep._mtNew; + } + } + }); + + // wrap drop events as needed and initialise droppable + var dropEvent = root.jsPlumb.dragEvents.drop; + dropOptions.scope = dropOptions.scope || (p.scope || _currentInstance.Defaults.Scope); + dropOptions[dropEvent] = _ju.wrap(dropOptions[dropEvent], _drop, true); + dropOptions.rank = p.rank || 0; + + // if target, return true from the over event. this will cause katavorio to stop setting drops to hover + // if multipleDrop is set to false. + if (isTarget) { + dropOptions[root.jsPlumb.dragEvents.over] = function () { return true; }; + } + + // vanilla jsplumb only + if (p.allowLoopback === false) { + dropOptions.canDrop = function (_drag) { + var de = _drag.getDragElement()._jsPlumbRelatedElement; + return de !== elInfo.el; + }; + } + _currentInstance.initDroppable(elInfo.el, dropOptions, "internal"); + + return _drop; + + }; + + // see API docs + this.makeTarget = function (el, params, referenceParams) { + + // put jsplumb ref into params without altering the params passed in + var p = root.jsPlumb.extend({_jsPlumb: this}, referenceParams); + root.jsPlumb.extend(p, params); + + var maxConnections = p.maxConnections || -1, + + _doOne = function (el) { + + // get the element's id and store the endpoint definition for it. jsPlumb.connect calls will look for one of these, + // and use the endpoint definition if found. + // decode the info for this element (id and element) + var elInfo = _info(el), + elid = elInfo.id, + dropOptions = root.jsPlumb.extend({}, p.dropOptions || {}), + type = p.connectionType || "default"; + + this.targetEndpointDefinitions[elid] = this.targetEndpointDefinitions[elid] || {}; + + _ensureContainer(elid); + + // if this is a group and the user has not mandated a rank, set to -1 so that Nodes takes + // precedence. + if (elInfo.el._isJsPlumbGroup && dropOptions.rank == null) { + dropOptions.rank = -1; + } + + // store the definition + var _def = { + def: root.jsPlumb.extend({}, p), + uniqueEndpoint: p.uniqueEndpoint, + maxConnections: maxConnections, + enabled: true + }; + + if (p.createEndpoint) { + _def.uniqueEndpoint = true; + _def.endpoint = _currentInstance.addEndpoint(el, _def.def); + _def.endpoint.setDeleteOnEmpty(false); + } + + elInfo.def = _def; + this.targetEndpointDefinitions[elid][type] = _def; + _makeElementDropHandler(elInfo, p, dropOptions, p.isSource === true, true); + // stash the definition on the drop + elInfo.el._katavorioDrop[elInfo.el._katavorioDrop.length - 1].targetDef = _def; + + }.bind(this); + + // make an array if only given one element + var inputs = el.length && el.constructor !== String ? el : [ el ]; + + // register each one in the list. + for (var i = 0, ii = inputs.length; i < ii; i++) { + _doOne(inputs[i]); + } + + return this; + }; + + // see api docs + this.unmakeTarget = function (el, doNotClearArrays) { + var info = _info(el); + _currentInstance.destroyDroppable(info.el, "internal"); + if (!doNotClearArrays) { + delete this.targetEndpointDefinitions[info.id]; + } + + return this; + }; + + // see api docs + this.makeSource = function (el, params, referenceParams) { + var p = root.jsPlumb.extend({_jsPlumb: this}, referenceParams); + root.jsPlumb.extend(p, params); + var type = p.connectionType || "default"; + var aae = _currentInstance.deriveEndpointAndAnchorSpec(type); + p.endpoint = p.endpoint || aae.endpoints[0]; + p.anchor = p.anchor || aae.anchors[0]; + var maxConnections = p.maxConnections || -1, + onMaxConnections = p.onMaxConnections, + _doOne = function (elInfo) { + // get the element's id and store the endpoint definition for it. jsPlumb.connect calls will look for one of these, + // and use the endpoint definition if found. + var elid = elInfo.id, + _del = this.getElement(elInfo.el); + + this.sourceEndpointDefinitions[elid] = this.sourceEndpointDefinitions[elid] || {}; + _ensureContainer(elid); + + var _def = { + def:root.jsPlumb.extend({}, p), + uniqueEndpoint: p.uniqueEndpoint, + maxConnections: maxConnections, + enabled: true + }; + + if (p.createEndpoint) { + _def.uniqueEndpoint = true; + _def.endpoint = _currentInstance.addEndpoint(el, _def.def); + _def.endpoint.setDeleteOnEmpty(false); + } + + this.sourceEndpointDefinitions[elid][type] = _def; + elInfo.def = _def; + + var stopEvent = root.jsPlumb.dragEvents.stop, + dragEvent = root.jsPlumb.dragEvents.drag, + dragOptions = root.jsPlumb.extend({ }, p.dragOptions || {}), + existingDrag = dragOptions.drag, + existingStop = dragOptions.stop, + ep = null, + endpointAddedButNoDragYet = false; + + // set scope if its not set in dragOptions but was passed in in params + dragOptions.scope = dragOptions.scope || p.scope; + + dragOptions[dragEvent] = _ju.wrap(dragOptions[dragEvent], function () { + if (existingDrag) { + existingDrag.apply(this, arguments); + } + endpointAddedButNoDragYet = false; + }); + + dragOptions[stopEvent] = _ju.wrap(dragOptions[stopEvent], function () { + + if (existingStop) { + existingStop.apply(this, arguments); + } + this.currentlyDragging = false; + if (ep._jsPlumb != null) { // if not cleaned up... + + // reset the anchor to the anchor that was initially provided. the one we were using to drag + // the connection was just a placeholder that was located at the place the user pressed the + // mouse button to initiate the drag. + var anchorDef = p.anchor || this.Defaults.Anchor, + oldAnchor = ep.anchor, + oldConnection = ep.connections[0]; + + var newAnchor = this.makeAnchor(anchorDef, elid, this), + _el = ep.element; + + // if the anchor has a 'positionFinder' set, then delegate to that function to find + // out where to locate the anchor. issue 117. + if (newAnchor.positionFinder != null) { + var elPosition = _currentInstance.getOffset(_el), + elSize = this.getSize(_el), + dropPosition = { left: elPosition.left + (oldAnchor.x * elSize[0]), top: elPosition.top + (oldAnchor.y * elSize[1]) }, + ap = newAnchor.positionFinder(dropPosition, elPosition, elSize, newAnchor.constructorParams); + + newAnchor.x = ap[0]; + newAnchor.y = ap[1]; + } + + ep.setAnchor(newAnchor, true); + ep.repaint(); + this.repaint(ep.elementId); + if (oldConnection != null) { + this.repaint(oldConnection.targetId); + } + } + }.bind(this)); + + // when the user presses the mouse, add an Endpoint, if we are enabled. + var mouseDownListener = function (e) { + // on right mouse button, abort. + if (e.which === 3 || e.button === 2) { + return; + } + + elid = this.getId(this.getElement(elInfo.el)); // elid might have changed since this method was called to configure the element. + + // TODO store def on element. + var def = this.sourceEndpointDefinitions[elid][type]; + + // if disabled, return. + if (!def.enabled) { + return; + } + + // if a filter was given, run it, and return if it says no. + if (p.filter) { + var r = _ju.isString(p.filter) ? selectorFilter(e, elInfo.el, p.filter, this, p.filterExclude) : p.filter(e, elInfo.el); + if (r === false) { + return; + } + } + + // if maxConnections reached + var sourceCount = this.select({source: elid}).length; + if (def.maxConnections >= 0 && (sourceCount >= def.maxConnections)) { + if (onMaxConnections) { + onMaxConnections({ + element: elInfo.el, + maxConnections: maxConnections + }, e); + } + return false; + } + + // find the position on the element at which the mouse was pressed; this is where the endpoint + // will be located. + var elxy = root.jsPlumb.getPositionOnElement(e, _del, _zoom); + + // we need to override the anchor in here, and force 'isSource', but we don't want to mess with + // the params passed in, because after a connection is established we're going to reset the endpoint + // to have the anchor we were given. + var tempEndpointParams = {}; + root.jsPlumb.extend(tempEndpointParams, def.def); + tempEndpointParams.isTemporarySource = true; + tempEndpointParams.anchor = [ elxy[0], elxy[1] , 0, 0]; + tempEndpointParams.dragOptions = dragOptions; + + if (def.def.scope) { + tempEndpointParams.scope = def.def.scope; + } + + ep = this.addEndpoint(elid, tempEndpointParams); + endpointAddedButNoDragYet = true; + ep.setDeleteOnEmpty(true); + + // if unique endpoint and it's already been created, push it onto the endpoint we create. at the end + // of a successful connection we'll switch to that endpoint. + // TODO this is the same code as the programmatic endpoints create on line 1050 ish + if (def.uniqueEndpoint) { + if (!def.endpoint) { + def.endpoint = ep; + ep.setDeleteOnEmpty(false); + } + else { + ep.finalEndpoint = def.endpoint; + } + } + + var _delTempEndpoint = function () { + // this mouseup event is fired only if no dragging occurred, by jquery and yui, but for mootools + // it is fired even if dragging has occurred, in which case we would blow away a perfectly + // legitimate endpoint, were it not for this check. the flag is set after adding an + // endpoint and cleared in a drag listener we set in the dragOptions above. + _currentInstance.off(ep.canvas, "mouseup", _delTempEndpoint); + _currentInstance.off(elInfo.el, "mouseup", _delTempEndpoint); + if (endpointAddedButNoDragYet) { + endpointAddedButNoDragYet = false; + _currentInstance.deleteEndpoint(ep); + } + }; + + _currentInstance.on(ep.canvas, "mouseup", _delTempEndpoint); + _currentInstance.on(elInfo.el, "mouseup", _delTempEndpoint); + + // optionally check for attributes to extract from the source element + var payload = {}; + if (def.def.extract) { + for (var att in def.def.extract) { + var v = (e.srcElement || e.target).getAttribute(att); + if (v) { + payload[def.def.extract[att]] = v; + } + } + } + + // and then trigger its mousedown event, which will kick off a drag, which will start dragging + // a new connection from this endpoint. + _currentInstance.trigger(ep.canvas, "mousedown", e, payload); + + _ju.consume(e); + + }.bind(this); + + this.on(elInfo.el, "mousedown", mouseDownListener); + _def.trigger = mouseDownListener; + + // if a filter was provided, set it as a dragFilter on the element, + // to prevent the element drag function from kicking in when we want to + // drag a new connection + if (p.filter && (_ju.isString(p.filter) || _ju.isFunction(p.filter))) { + _currentInstance.setDragFilter(elInfo.el, p.filter); + } + + var dropOptions = root.jsPlumb.extend({}, p.dropOptions || {}); + + _makeElementDropHandler(elInfo, p, dropOptions, true, p.isTarget === true); + + }.bind(this); + + var inputs = el.length && el.constructor !== String ? el : [ el ]; + for (var i = 0, ii = inputs.length; i < ii; i++) { + _doOne(_info(inputs[i])); + } + + return this; + }; + + // see api docs + this.unmakeSource = function (el, connectionType, doNotClearArrays) { + var info = _info(el); + _currentInstance.destroyDroppable(info.el, "internal"); + var eldefs = this.sourceEndpointDefinitions[info.id]; + if (eldefs) { + for (var def in eldefs) { + if (connectionType == null || connectionType === def) { + var mouseDownListener = eldefs[def].trigger; + if (mouseDownListener) { + _currentInstance.off(info.el, "mousedown", mouseDownListener); + } + if (!doNotClearArrays) { + delete this.sourceEndpointDefinitions[info.id][def]; + } + } + } + } + + return this; + }; + + // see api docs + this.unmakeEverySource = function () { + for (var i in this.sourceEndpointDefinitions) { + _currentInstance.unmakeSource(i, null, true); + } + + this.sourceEndpointDefinitions = {}; + return this; + }; + + var _getScope = function (el, types, connectionType) { + types = _ju.isArray(types) ? types : [ types ]; + var id = _getId(el); + connectionType = connectionType || "default"; + for (var i = 0; i < types.length; i++) { + var eldefs = this[types[i]][id]; + if (eldefs && eldefs[connectionType]) { + return eldefs[connectionType].def.scope || this.Defaults.Scope; + } + } + }.bind(this); + + var _setScope = function (el, scope, types, connectionType) { + types = _ju.isArray(types) ? types : [ types ]; + var id = _getId(el); + connectionType = connectionType || "default"; + for (var i = 0; i < types.length; i++) { + var eldefs = this[types[i]][id]; + if (eldefs && eldefs[connectionType]) { + eldefs[connectionType].def.scope = scope; + } + } + + }.bind(this); + + this.getScope = function (el, scope) { + return _getScope(el, [ "sourceEndpointDefinitions", "targetEndpointDefinitions" ]); + }; + this.getSourceScope = function (el) { + return _getScope(el, "sourceEndpointDefinitions"); + }; + this.getTargetScope = function (el) { + return _getScope(el, "targetEndpointDefinitions"); + }; + this.setScope = function (el, scope, connectionType) { + this.setSourceScope(el, scope, connectionType); + this.setTargetScope(el, scope, connectionType); + }; + this.setSourceScope = function (el, scope, connectionType) { + _setScope(el, scope, "sourceEndpointDefinitions", connectionType); + // we get the source scope during the mousedown event, but we also want to set this. + this.setDragScope(el, scope); + }; + this.setTargetScope = function (el, scope, connectionType) { + _setScope(el, scope, "targetEndpointDefinitions", connectionType); + this.setDropScope(el, scope); + }; + + // see api docs + this.unmakeEveryTarget = function () { + for (var i in this.targetEndpointDefinitions) { + _currentInstance.unmakeTarget(i, true); + } + + this.targetEndpointDefinitions = {}; + return this; + }; + + // does the work of setting a source enabled or disabled. + var _setEnabled = function (type, el, state, toggle, connectionType) { + var a = type === "source" ? this.sourceEndpointDefinitions : this.targetEndpointDefinitions, + originalState, info, newState; + + connectionType = connectionType || "default"; + + // a selector or an array + if (el.length && !_ju.isString(el)) { + originalState = []; + for (var i = 0, ii = el.length; i < ii; i++) { + info = _info(el[i]); + if (a[info.id] && a[info.id][connectionType]) { + originalState[i] = a[info.id][connectionType].enabled; + newState = toggle ? !originalState[i] : state; + a[info.id][connectionType].enabled = newState; + _currentInstance[newState ? "removeClass" : "addClass"](info.el, "jtk-" + type + "-disabled"); + } + } + } + // otherwise a DOM element or a String ID. + else { + info = _info(el); + var id = info.id; + if (a[id] && a[id][connectionType]) { + originalState = a[id][connectionType].enabled; + newState = toggle ? !originalState : state; + a[id][connectionType].enabled = newState; + _currentInstance[newState ? "removeClass" : "addClass"](info.el, "jtk-" + type + "-disabled"); + } + } + return originalState; + }.bind(this); + + var _first = function (el, fn) { + if (_ju.isString(el) || !el.length) { + return fn.apply(this, [ el ]); + } + else if (el.length) { + return fn.apply(this, [ el[0] ]); + } + + }.bind(this); + + this.toggleSourceEnabled = function (el, connectionType) { + _setEnabled("source", el, null, true, connectionType); + return this.isSourceEnabled(el, connectionType); + }; + + this.setSourceEnabled = function (el, state, connectionType) { + return _setEnabled("source", el, state, null, connectionType); + }; + this.isSource = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var eldefs = this.sourceEndpointDefinitions[_info(_el).id]; + return eldefs != null && eldefs[connectionType] != null; + }.bind(this)); + }; + this.isSourceEnabled = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var sep = this.sourceEndpointDefinitions[_info(_el).id]; + return sep && sep[connectionType] && sep[connectionType].enabled === true; + }.bind(this)); + }; + + this.toggleTargetEnabled = function (el, connectionType) { + _setEnabled("target", el, null, true, connectionType); + return this.isTargetEnabled(el, connectionType); + }; + + this.isTarget = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var eldefs = this.targetEndpointDefinitions[_info(_el).id]; + return eldefs != null && eldefs[connectionType] != null; + }.bind(this)); + }; + this.isTargetEnabled = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var tep = this.targetEndpointDefinitions[_info(_el).id]; + return tep && tep[connectionType] && tep[connectionType].enabled === true; + }.bind(this)); + }; + this.setTargetEnabled = function (el, state, connectionType) { + return _setEnabled("target", el, state, null, connectionType); + }; + +// --------------------- end makeSource/makeTarget ---------------------------------------------- + + this.ready = function (fn) { + _currentInstance.bind("ready", fn); + }; + + var _elEach = function(el, fn) { + // support both lists... + if (typeof el === 'object' && el.length) { + for (var i = 0, ii = el.length; i < ii; i++) { + fn(el[i]); + } + } + else {// ...and single strings or elements. + fn(el); + } + + return _currentInstance; + }; + + // repaint some element's endpoints and connections + this.repaint = function (el, ui, timestamp) { + return _elEach(el, function(_el) { + _draw(_el, ui, timestamp); + }); + }; + + this.revalidate = function (el, timestamp, isIdAlready) { + return _elEach(el, function(_el) { + var elId = isIdAlready ? _el : _currentInstance.getId(_el); + _currentInstance.updateOffset({ elId: elId, recalc: true, timestamp:timestamp }); + var dm = _currentInstance.getDragManager(); + if (dm) { + dm.updateOffsets(elId); + } + _currentInstance.repaint(_el); + }); + }; + + // repaint every endpoint and connection. + this.repaintEverything = function () { + // TODO this timestamp causes continuous anchors to not repaint properly. + // fix this. do not just take out the timestamp. it runs a lot faster with + // the timestamp included. + var timestamp = _timestamp(), elId; + + for (elId in endpointsByElement) { + _currentInstance.updateOffset({ elId: elId, recalc: true, timestamp: timestamp }); + } + + for (elId in endpointsByElement) { + _draw(elId, null, timestamp); + } + + return this; + }; + + this.removeAllEndpoints = function (el, recurse, affectedElements) { + affectedElements = affectedElements || []; + var _one = function (_el) { + var info = _info(_el), + ebe = endpointsByElement[info.id], + i, ii; + + if (ebe) { + affectedElements.push(info); + for (i = 0, ii = ebe.length; i < ii; i++) { + _currentInstance.deleteEndpoint(ebe[i], false); + } + } + delete endpointsByElement[info.id]; + + if (recurse) { + if (info.el && info.el.nodeType !== 3 && info.el.nodeType !== 8) { + for (i = 0, ii = info.el.childNodes.length; i < ii; i++) { + _one(info.el.childNodes[i]); + } + } + } + + }; + _one(el); + return this; + }; + + var _doRemove = function(info, affectedElements) { + _currentInstance.removeAllEndpoints(info.id, true, affectedElements); + var dm = _currentInstance.getDragManager(); + var _one = function(_info) { + + if (dm) { + dm.elementRemoved(_info.id); + } + _currentInstance.anchorManager.clearFor(_info.id); + _currentInstance.anchorManager.removeFloatingConnection(_info.id); + + if (_currentInstance.isSource(_info.el)) { + _currentInstance.unmakeSource(_info.el); + } + if (_currentInstance.isTarget(_info.el)) { + _currentInstance.unmakeTarget(_info.el); + } + _currentInstance.destroyDraggable(_info.el); + _currentInstance.destroyDroppable(_info.el); + + + delete _currentInstance.floatingConnections[_info.id]; + delete managedElements[_info.id]; + delete offsets[_info.id]; + if (_info.el) { + _currentInstance.removeElement(_info.el); + _info.el._jsPlumb = null; + } + }; + + // remove all affected child elements + for (var ae = 1; ae < affectedElements.length; ae++) { + _one(affectedElements[ae]); + } + // and always remove the requested one from the dom. + _one(info); + }; + + /** + * Remove the given element, including cleaning up all endpoints registered for it. + * This is exposed in the public API but also used internally by jsPlumb when removing the + * element associated with a connection drag. + */ + this.remove = function (el, doNotRepaint) { + var info = _info(el), affectedElements = []; + if (info.text && info.el.parentNode) { + info.el.parentNode.removeChild(info.el); + } + else if (info.id) { + _currentInstance.batch(function () { + _doRemove(info, affectedElements); + }, doNotRepaint === true); + } + return _currentInstance; + }; + + this.empty = function (el, doNotRepaint) { + var affectedElements = []; + var _one = function(el, dontRemoveFocus) { + var info = _info(el); + if (info.text) { + info.el.parentNode.removeChild(info.el); + } + else if (info.el) { + while(info.el.childNodes.length > 0) { + _one(info.el.childNodes[0]); + } + if (!dontRemoveFocus) { + _doRemove(info, affectedElements); + } + } + }; + + _currentInstance.batch(function() { + _one(el, true); + }, doNotRepaint === false); + + return _currentInstance; + }; + + this.reset = function (doNotUnbindInstanceEventListeners) { + _currentInstance.silently(function() { + _hoverSuspended = false; + _currentInstance.removeAllGroups(); + _currentInstance.removeGroupManager(); + _currentInstance.deleteEveryEndpoint(); + if (!doNotUnbindInstanceEventListeners) { + _currentInstance.unbind(); + } + this.targetEndpointDefinitions = {}; + this.sourceEndpointDefinitions = {}; + connections.length = 0; + if (this.doReset) { + this.doReset(); + } + }.bind(this)); + }; + + var _clearObject = function (obj) { + if (obj.canvas && obj.canvas.parentNode) { + obj.canvas.parentNode.removeChild(obj.canvas); + } + obj.cleanup(); + obj.destroy(); + }; + + this.clear = function () { + _currentInstance.select().each(_clearObject); + _currentInstance.selectEndpoints().each(_clearObject); + + endpointsByElement = {}; + endpointsByUUID = {}; + }; + + this.setDefaultScope = function (scope) { + DEFAULT_SCOPE = scope; + return _currentInstance; + }; + + this.deriveEndpointAndAnchorSpec = function(type, dontPrependDefault) { + var bits = ((dontPrependDefault ? "" : "default ") + type).split(/[\s]/), eps = null, ep = null, a = null, as = null; + for (var i = 0; i < bits.length; i++) { + var _t = _currentInstance.getType(bits[i], "connection"); + if (_t) { + if (_t.endpoints) { + eps = _t.endpoints; + } + if (_t.endpoint) { + ep = _t.endpoint; + } + if (_t.anchors) { + as = _t.anchors; + } + if (_t.anchor) { + a = _t.anchor; + } + } + } + return { endpoints: eps ? eps : [ ep, ep ], anchors: as ? as : [a, a ]}; + }; + + // sets the id of some element, changing whatever we need to to keep track. + this.setId = function (el, newId, doNotSetAttribute) { + // + var id; + + if (_ju.isString(el)) { + id = el; + } + else { + el = this.getElement(el); + id = this.getId(el); + } + + var sConns = this.getConnections({source: id, scope: '*'}, true), + tConns = this.getConnections({target: id, scope: '*'}, true); + + newId = "" + newId; + + if (!doNotSetAttribute) { + el = this.getElement(id); + this.setAttribute(el, "id", newId); + } + else { + el = this.getElement(newId); + } + + endpointsByElement[newId] = endpointsByElement[id] || []; + for (var i = 0, ii = endpointsByElement[newId].length; i < ii; i++) { + endpointsByElement[newId][i].setElementId(newId); + endpointsByElement[newId][i].setReferenceElement(el); + } + delete endpointsByElement[id]; + + this.sourceEndpointDefinitions[newId] = this.sourceEndpointDefinitions[id]; + delete this.sourceEndpointDefinitions[id]; + this.targetEndpointDefinitions[newId] = this.targetEndpointDefinitions[id]; + delete this.targetEndpointDefinitions[id]; + + this.anchorManager.changeId(id, newId); + var dm = this.getDragManager(); + if (dm) { + dm.changeId(id, newId); + } + managedElements[newId] = managedElements[id]; + delete managedElements[id]; + + var _conns = function (list, epIdx, type) { + for (var i = 0, ii = list.length; i < ii; i++) { + list[i].endpoints[epIdx].setElementId(newId); + list[i].endpoints[epIdx].setReferenceElement(el); + list[i][type + "Id"] = newId; + list[i][type] = el; + } + }; + _conns(sConns, 0, "source"); + _conns(tConns, 1, "target"); + + this.repaint(newId); + }; + + this.setDebugLog = function (debugLog) { + log = debugLog; + }; + + this.setSuspendDrawing = function (val, repaintAfterwards) { + var curVal = _suspendDrawing; + _suspendDrawing = val; + if (val) { + _suspendedAt = new Date().getTime(); + } else { + _suspendedAt = null; + } + if (repaintAfterwards) { + this.repaintEverything(); + } + return curVal; + }; + + // returns whether or not drawing is currently suspended. + this.isSuspendDrawing = function () { + return _suspendDrawing; + }; + + // return timestamp for when drawing was suspended. + this.getSuspendedAt = function () { + return _suspendedAt; + }; + + this.batch = function (fn, doNotRepaintAfterwards) { + var _wasSuspended = this.isSuspendDrawing(); + if (!_wasSuspended) { + this.setSuspendDrawing(true); + } + try { + fn(); + } + catch (e) { + _ju.log("Function run while suspended failed", e); + } + if (!_wasSuspended) { + this.setSuspendDrawing(false, !doNotRepaintAfterwards); + } + }; + + this.doWhileSuspended = this.batch; + + this.getCachedData = _getCachedData; + this.timestamp = _timestamp; + this.show = function (el, changeEndpoints) { + _setVisible(el, "block", changeEndpoints); + return _currentInstance; + }; + + // TODO: update this method to return the current state. + this.toggleVisible = _toggleVisible; + this.addListener = this.bind; + + var floatingConnections = []; + this.registerFloatingConnection = function(info, conn, ep) { + floatingConnections[info.id] = conn; + // only register for the target endpoint; we will not be dragging the source at any time + // before this connection is either discarded or made into a permanent connection. + _ju.addToList(endpointsByElement, info.id, ep); + }; + this.getFloatingConnectionFor = function(id) { + return floatingConnections[id]; + }; + + this.listManager = new root.jsPlumbListManager(this, this.Defaults.ListStyle); + }; + + _ju.extend(root.jsPlumbInstance, _ju.EventGenerator, { + setAttribute: function (el, a, v) { + this.setAttribute(el, a, v); + }, + getAttribute: function (el, a) { + return this.getAttribute(root.jsPlumb.getElement(el), a); + }, + convertToFullOverlaySpec: function(spec) { + if (_ju.isString(spec)) { + spec = [ spec, { } ]; + } + spec[1].id = spec[1].id || _ju.uuid(); + return spec; + }, + registerConnectionType: function (id, type) { + this._connectionTypes[id] = root.jsPlumb.extend({}, type); + if (type.overlays) { + var to = {}; + for (var i = 0; i < type.overlays.length; i++) { + // if a string, convert to object representation so that we can store the typeid on it. + // also assign an id. + var fo = this.convertToFullOverlaySpec(type.overlays[i]); + to[fo[1].id] = fo; + } + this._connectionTypes[id].overlays = to; + } + }, + registerConnectionTypes: function (types) { + for (var i in types) { + this.registerConnectionType(i, types[i]); + } + }, + registerEndpointType: function (id, type) { + this._endpointTypes[id] = root.jsPlumb.extend({}, type); + if (type.overlays) { + var to = {}; + for (var i = 0; i < type.overlays.length; i++) { + // if a string, convert to object representation so that we can store the typeid on it. + // also assign an id. + var fo = this.convertToFullOverlaySpec(type.overlays[i]); + to[fo[1].id] = fo; + } + this._endpointTypes[id].overlays = to; + } + }, + registerEndpointTypes: function (types) { + for (var i in types) { + this.registerEndpointType(i, types[i]); + } + }, + getType: function (id, typeDescriptor) { + return typeDescriptor === "connection" ? this._connectionTypes[id] : this._endpointTypes[id]; + }, + setIdChanged: function (oldId, newId) { + this.setId(oldId, newId, true); + }, + // set parent: change the parent for some node and update all the registrations we need to. + setParent: function (el, newParent) { + var _dom = this.getElement(el), + _id = this.getId(_dom), + _pdom = this.getElement(newParent), + _pid = this.getId(_pdom), + dm = this.getDragManager(); + + _dom.parentNode.removeChild(_dom); + _pdom.appendChild(_dom); + if (dm) { + dm.setParent(_dom, _id, _pdom, _pid); + } + }, + extend: function (o1, o2, names) { + var i; + if (names) { + for (i = 0; i < names.length; i++) { + o1[names[i]] = o2[names[i]]; + } + } + else { + for (i in o2) { + o1[i] = o2[i]; + } + } + + return o1; + }, + floatingConnections: {}, + getFloatingAnchorIndex: function (jpc) { + return jpc.endpoints[0].isFloating() ? 0 : jpc.endpoints[1].isFloating() ? 1 : -1; + }, + proxyConnection :function(connection, index, proxyEl, proxyElId, endpointGenerator, anchorGenerator) { + var proxyEp, + originalElementId = connection.endpoints[index].elementId, + originalEndpoint = connection.endpoints[index]; + + connection.proxies = connection.proxies || []; + if(connection.proxies[index]) { + proxyEp = connection.proxies[index].ep; + }else { + proxyEp = this.addEndpoint(proxyEl, { + endpoint:endpointGenerator(connection, index), + anchor:anchorGenerator(connection, index), + parameters:{ + isProxyEndpoint:true + } + }); + } + proxyEp.setDeleteOnEmpty(true); + + // for this index, stash proxy info: the new EP, the original EP. + connection.proxies[index] = { ep:proxyEp, originalEp: originalEndpoint }; + + // and advise the anchor manager + if (index === 0) { + // TODO why are there two differently named methods? Why is there not one method that says "some end of this + // connection changed (you give the index), and here's the new element and element id." + this.anchorManager.sourceChanged(originalElementId, proxyElId, connection, proxyEl); + } + else { + this.anchorManager.updateOtherEndpoint(connection.endpoints[0].elementId, originalElementId, proxyElId, connection); + connection.target = proxyEl; + connection.targetId = proxyElId; + } + + // detach the original EP from the connection. + originalEndpoint.detachFromConnection(connection, null, true); + + // set the proxy as the new ep + proxyEp.connections = [ connection ]; + connection.endpoints[index] = proxyEp; + + originalEndpoint.setVisible(false); + + connection.setVisible(true); + + this.revalidate(proxyEl); + }, + unproxyConnection : function(connection, index, proxyElId) { + // if connection cleaned up, no proxies, or none for this end of the connection, abort. + if (connection._jsPlumb == null || connection.proxies == null || connection.proxies[index] == null) { + return; + } + + var originalElement = connection.proxies[index].originalEp.element, + originalElementId = connection.proxies[index].originalEp.elementId; + + connection.endpoints[index] = connection.proxies[index].originalEp; + // and advise the anchor manager + if (index === 0) { + // TODO why are there two differently named methods? Why is there not one method that says "some end of this + // connection changed (you give the index), and here's the new element and element id." + this.anchorManager.sourceChanged(proxyElId, originalElementId, connection, originalElement); + } + else { + this.anchorManager.updateOtherEndpoint(connection.endpoints[0].elementId, proxyElId, originalElementId, connection); + connection.target = originalElement; + connection.targetId = originalElementId; + } + + // detach the proxy EP from the connection (which will cause it to be removed as we no longer need it) + connection.proxies[index].ep.detachFromConnection(connection, null); + + connection.proxies[index].originalEp.addConnection(connection); + if(connection.isVisible()) { + connection.proxies[index].originalEp.setVisible(true); + } + + // cleanup + delete connection.proxies[index]; + } + }); + +// --------------------- static instance + module registration ------------------------------------------- + +// create static instance and assign to window if window exists. + var jsPlumb = new jsPlumbInstance(); + // register on 'root' (lets us run on server or browser) + root.jsPlumb = jsPlumb; + // add 'getInstance' method to static instance + jsPlumb.getInstance = function (_defaults, overrideFns) { + var j = new jsPlumbInstance(_defaults); + if (overrideFns) { + for (var ovf in overrideFns) { + j[ovf] = overrideFns[ovf]; + } + } + j.init(); + return j; + }; + jsPlumb.each = function (spec, fn) { + if (spec == null) { + return; + } + if (typeof spec === "string") { + fn(jsPlumb.getElement(spec)); + } + else if (spec.length != null) { + for (var i = 0; i < spec.length; i++) { + fn(jsPlumb.getElement(spec[i])); + } + } + else { + fn(spec); + } // assume it's an element. + }; + + // CommonJS + if (typeof exports !== 'undefined') { + exports.jsPlumb = jsPlumb; + } + +// --------------------- end static instance + AMD registration ------------------------------------------- + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function() { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + // ------------------------------ BEGIN OverlayCapablejsPlumbUIComponent -------------------------------------------- + + var _internalLabelOverlayId = "__label", + // this is a shortcut helper method to let people add a label as + // overlay. + _makeLabelOverlay = function (component, params) { + + var _params = { + cssClass: params.cssClass, + labelStyle: component.labelStyle, + id: _internalLabelOverlayId, + component: component, + _jsPlumb: component._jsPlumb.instance // TODO not necessary, since the instance can be accessed through the component. + }, + mergedParams = _jp.extend(_params, params); + + return new _jp.Overlays[component._jsPlumb.instance.getRenderMode()].Label(mergedParams); + }, + _processOverlay = function (component, o) { + var _newOverlay = null; + if (_ju.isArray(o)) { // this is for the shorthand ["Arrow", { width:50 }] syntax + // there's also a three arg version: + // ["Arrow", { width:50 }, {location:0.7}] + // which merges the 3rd arg into the 2nd. + var type = o[0], + // make a copy of the object so as not to mess up anyone else's reference... + p = _jp.extend({component: component, _jsPlumb: component._jsPlumb.instance}, o[1]); + if (o.length === 3) { + _jp.extend(p, o[2]); + } + _newOverlay = new _jp.Overlays[component._jsPlumb.instance.getRenderMode()][type](p); + } else if (o.constructor === String) { + _newOverlay = new _jp.Overlays[component._jsPlumb.instance.getRenderMode()][o]({component: component, _jsPlumb: component._jsPlumb.instance}); + } else { + _newOverlay = o; + } + + _newOverlay.id = _newOverlay.id || _ju.uuid(); + component.cacheTypeItem("overlay", _newOverlay, _newOverlay.id); + component._jsPlumb.overlays[_newOverlay.id] = _newOverlay; + + return _newOverlay; + }; + + _jp.OverlayCapableJsPlumbUIComponent = function (params) { + + root.jsPlumbUIComponent.apply(this, arguments); + this._jsPlumb.overlays = {}; + this._jsPlumb.overlayPositions = {}; + + if (params.label) { + this.getDefaultType().overlays[_internalLabelOverlayId] = ["Label", { + label: params.label, + location: params.labelLocation || this.defaultLabelLocation || 0.5, + labelStyle: params.labelStyle || this._jsPlumb.instance.Defaults.LabelStyle, + id:_internalLabelOverlayId + }]; + } + + this.setListenerComponent = function (c) { + if (this._jsPlumb) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].setListenerComponent(c); + } + } + }; + }; + + _jp.OverlayCapableJsPlumbUIComponent.applyType = function (component, t) { + if (t.overlays) { + // loop through the ones in the type. if already present on the component, + // dont remove or re-add. + var keep = {}, i; + + for (i in t.overlays) { + + var existing = component._jsPlumb.overlays[t.overlays[i][1].id]; + if (existing) { + // maybe update from data, if there were parameterised values for instance. + existing.updateFrom(t.overlays[i][1]); + keep[t.overlays[i][1].id] = true; + + existing.reattach(component._jsPlumb.instance, component); + } + else { + var c = component.getCachedTypeItem("overlay", t.overlays[i][1].id); + if (c != null) { + c.reattach(component._jsPlumb.instance, component); + c.setVisible(true); + // maybe update from data, if there were parameterised values for instance. + c.updateFrom(t.overlays[i][1]); + component._jsPlumb.overlays[c.id] = c; + } + else { + c = component.addOverlay(t.overlays[i], true); + } + keep[c.id] = true; + } + } + + // now loop through the full overlays and remove those that we dont want to keep + for (i in component._jsPlumb.overlays) { + if (keep[component._jsPlumb.overlays[i].id] == null) { + component.removeOverlay(component._jsPlumb.overlays[i].id, true); // remove overlay but dont clean it up. + // that would remove event listeners etc; overlays are never discarded by the types stuff, they are + // just detached/reattached. + } + } + } + }; + + _ju.extend(_jp.OverlayCapableJsPlumbUIComponent, root.jsPlumbUIComponent, { + + setHover: function (hover, ignoreAttachedElements) { + if (this._jsPlumb && !this._jsPlumb.instance.isConnectionBeingDragged()) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i][hover ? "addClass" : "removeClass"](this._jsPlumb.instance.hoverClass); + } + } + }, + addOverlay: function (overlay, doNotRepaint) { + var o = _processOverlay(this, overlay); + + if (this.getData && o.type === "Label" && _ju.isArray(overlay)) { + // + // component data might contain label location - look for it here. + var d = this.getData(), p = overlay[1]; + if (d) { + var locationAttribute = p.labelLocationAttribute || "labelLocation"; + var loc = d ? d[locationAttribute] : null; + + if (loc) { + o.loc = loc; + } + } + } + + if (!doNotRepaint) { + this.repaint(); + } + return o; + }, + getOverlay: function (id) { + return this._jsPlumb.overlays[id]; + }, + getOverlays: function () { + return this._jsPlumb.overlays; + }, + hideOverlay: function (id) { + var o = this.getOverlay(id); + if (o) { + o.hide(); + } + }, + hideOverlays: function () { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].hide(); + } + }, + showOverlay: function (id) { + var o = this.getOverlay(id); + if (o) { + o.show(); + } + }, + showOverlays: function () { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].show(); + } + }, + removeAllOverlays: function (doNotRepaint) { + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays[i].cleanup) { + this._jsPlumb.overlays[i].cleanup(); + } + } + + this._jsPlumb.overlays = {}; + this._jsPlumb.overlayPositions = null; + this._jsPlumb.overlayPlacements= {}; + if (!doNotRepaint) { + this.repaint(); + } + }, + removeOverlay: function (overlayId, dontCleanup) { + var o = this._jsPlumb.overlays[overlayId]; + if (o) { + o.setVisible(false); + if (!dontCleanup && o.cleanup) { + o.cleanup(); + } + delete this._jsPlumb.overlays[overlayId]; + if (this._jsPlumb.overlayPositions) { + delete this._jsPlumb.overlayPositions[overlayId]; + } + + if (this._jsPlumb.overlayPlacements) { + delete this._jsPlumb.overlayPlacements[overlayId]; + } + } + }, + removeOverlays: function () { + for (var i = 0, j = arguments.length; i < j; i++) { + this.removeOverlay(arguments[i]); + } + }, + moveParent: function (newParent) { + if (this.bgCanvas) { + this.bgCanvas.parentNode.removeChild(this.bgCanvas); + newParent.appendChild(this.bgCanvas); + } + + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + newParent.appendChild(this.canvas); + + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays[i].isAppendedAtTopLevel) { + var el = this._jsPlumb.overlays[i].getElement(); + el.parentNode.removeChild(el); + newParent.appendChild(el); + } + } + } + }, + getLabel: function () { + var lo = this.getOverlay(_internalLabelOverlayId); + return lo != null ? lo.getLabel() : null; + }, + getLabelOverlay: function () { + return this.getOverlay(_internalLabelOverlayId); + }, + setLabel: function (l) { + var lo = this.getOverlay(_internalLabelOverlayId); + if (!lo) { + var params = l.constructor === String || l.constructor === Function ? { label: l } : l; + lo = _makeLabelOverlay(this, params); + this._jsPlumb.overlays[_internalLabelOverlayId] = lo; + } + else { + if (l.constructor === String || l.constructor === Function) { + lo.setLabel(l); + } + else { + if (l.label) { + lo.setLabel(l.label); + } + if (l.location) { + lo.setLocation(l.location); + } + } + } + + if (!this._jsPlumb.instance.isSuspendDrawing()) { + this.repaint(); + } + }, + cleanup: function (force) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].cleanup(force); + this._jsPlumb.overlays[i].destroy(force); + } + if (force) { + this._jsPlumb.overlays = {}; + this._jsPlumb.overlayPositions = null; + } + }, + setVisible: function (v) { + this[v ? "showOverlays" : "hideOverlays"](); + }, + setAbsoluteOverlayPosition: function (overlay, xy) { + this._jsPlumb.overlayPositions[overlay.id] = xy; + }, + getAbsoluteOverlayPosition: function (overlay) { + return this._jsPlumb.overlayPositions ? this._jsPlumb.overlayPositions[overlay.id] : null; + }, + _clazzManip:function(action, clazz, dontUpdateOverlays) { + if (!dontUpdateOverlays) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i][action + "Class"](clazz); + } + } + }, + addClass:function(clazz, dontUpdateOverlays) { + this._clazzManip("add", clazz, dontUpdateOverlays); + }, + removeClass:function(clazz, dontUpdateOverlays) { + this._clazzManip("remove", clazz, dontUpdateOverlays); + } + }); + +// ------------------------------ END OverlayCapablejsPlumbUIComponent -------------------------------------------- + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the code for Endpoints. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + // create the drag handler for a connection + var _makeConnectionDragHandler = function (endpoint, placeholder, _jsPlumb) { + var stopped = false; + return { + drag: function () { + if (stopped) { + stopped = false; + return true; + } + + if (placeholder.element) { + var _ui = _jsPlumb.getUIPosition(arguments, _jsPlumb.getZoom()); + if (_ui != null) { + _jsPlumb.setPosition(placeholder.element, _ui); + } + _jsPlumb.repaint(placeholder.element, _ui); + // always repaint the source endpoint, because only continuous/dynamic anchors cause the endpoint + // to be repainted, so static anchors need to be told (or the endpoint gets dragged around) + endpoint.paint({anchorPoint:endpoint.anchor.getCurrentLocation({element:endpoint})}); + } + }, + stopDrag: function () { + stopped = true; + } + }; + }; + + // creates a placeholder div for dragging purposes, adds it, and pre-computes its offset. + var _makeDraggablePlaceholder = function (placeholder, _jsPlumb, ipco, ips) { + var n = _jsPlumb.createElement("div", { position : "absolute" }); + _jsPlumb.appendElement(n); + var id = _jsPlumb.getId(n); + _jsPlumb.setPosition(n, ipco); + n.style.width = ips[0] + "px"; + n.style.height = ips[1] + "px"; + _jsPlumb.manage(id, n, true); // TRANSIENT MANAGE + // create and assign an id, and initialize the offset. + placeholder.id = id; + placeholder.element = n; + }; + + // create a floating endpoint (for drag connections) + var _makeFloatingEndpoint = function (paintStyle, referenceAnchor, endpoint, referenceCanvas, sourceElement, _jsPlumb, _newEndpoint, scope) { + var floatingAnchor = new _jp.FloatingAnchor({ reference: referenceAnchor, referenceCanvas: referenceCanvas, jsPlumbInstance: _jsPlumb }); + //setting the scope here should not be the way to fix that mootools issue. it should be fixed by not + // adding the floating endpoint as a droppable. that makes more sense anyway! + // TRANSIENT MANAGE + return _newEndpoint({ + paintStyle: paintStyle, + endpoint: endpoint, + anchor: floatingAnchor, + source: sourceElement, + scope: scope + }); + }; + + var typeParameters = [ "connectorStyle", "connectorHoverStyle", "connectorOverlays", + "connector", "connectionType", "connectorClass", "connectorHoverClass" ]; + + // a helper function that tries to find a connection to the given element, and returns it if so. if elementWithPrecedence is null, + // or no connection to it is found, we return the first connection in our list. + var findConnectionToUseForDynamicAnchor = function (ep, elementWithPrecedence) { + var idx = 0; + if (elementWithPrecedence != null) { + for (var i = 0; i < ep.connections.length; i++) { + if (ep.connections[i].sourceId === elementWithPrecedence || ep.connections[i].targetId === elementWithPrecedence) { + idx = i; + break; + } + } + } + + return ep.connections[idx]; + }; + + _jp.Endpoint = function (params) { + var _jsPlumb = params._jsPlumb, + _newConnection = params.newConnection, + _newEndpoint = params.newEndpoint; + + this.idPrefix = "_jsplumb_e_"; + this.defaultLabelLocation = [ 0.5, 0.5 ]; + this.defaultOverlayKeys = ["Overlays", "EndpointOverlays"]; + _jp.OverlayCapableJsPlumbUIComponent.apply(this, arguments); + +// TYPE + + this.appendToDefaultType({ + connectionType:params.connectionType, + maxConnections: params.maxConnections == null ? this._jsPlumb.instance.Defaults.MaxConnections : params.maxConnections, // maximum number of connections this endpoint can be the source of., + paintStyle: params.endpointStyle || params.paintStyle || params.style || this._jsPlumb.instance.Defaults.EndpointStyle || _jp.Defaults.EndpointStyle, + hoverPaintStyle: params.endpointHoverStyle || params.hoverPaintStyle || this._jsPlumb.instance.Defaults.EndpointHoverStyle || _jp.Defaults.EndpointHoverStyle, + connectorStyle: params.connectorStyle, + connectorHoverStyle: params.connectorHoverStyle, + connectorClass: params.connectorClass, + connectorHoverClass: params.connectorHoverClass, + connectorOverlays: params.connectorOverlays, + connector: params.connector, + connectorTooltip: params.connectorTooltip + }); + +// END TYPE + + this._jsPlumb.enabled = !(params.enabled === false); + this._jsPlumb.visible = true; + this.element = _jp.getElement(params.source); + this._jsPlumb.uuid = params.uuid; + this._jsPlumb.floatingEndpoint = null; + var inPlaceCopy = null; + if (this._jsPlumb.uuid) { + params.endpointsByUUID[this._jsPlumb.uuid] = this; + } + this.elementId = params.elementId; + this.dragProxy = params.dragProxy; + + this._jsPlumb.connectionCost = params.connectionCost; + this._jsPlumb.connectionsDirected = params.connectionsDirected; + this._jsPlumb.currentAnchorClass = ""; + this._jsPlumb.events = {}; + + var deleteOnEmpty = params.deleteOnEmpty === true; + this.setDeleteOnEmpty = function(d) { + deleteOnEmpty = d; + }; + + var _updateAnchorClass = function () { + // stash old, get new + var oldAnchorClass = _jsPlumb.endpointAnchorClassPrefix + "-" + this._jsPlumb.currentAnchorClass; + this._jsPlumb.currentAnchorClass = this.anchor.getCssClass(); + var anchorClass = _jsPlumb.endpointAnchorClassPrefix + (this._jsPlumb.currentAnchorClass ? "-" + this._jsPlumb.currentAnchorClass : ""); + + this.removeClass(oldAnchorClass); + this.addClass(anchorClass); + // add and remove at the same time to reduce the number of reflows. + _jp.updateClasses(this.element, anchorClass, oldAnchorClass); + }.bind(this); + + this.prepareAnchor = function(anchorParams) { + var a = this._jsPlumb.instance.makeAnchor(anchorParams, this.elementId, _jsPlumb); + a.bind("anchorChanged", function (currentAnchor) { + this.fire("anchorChanged", {endpoint: this, anchor: currentAnchor}); + _updateAnchorClass(); + }.bind(this)); + return a; + }; + + this.setPreparedAnchor = function(anchor, doNotRepaint) { + this._jsPlumb.instance.continuousAnchorFactory.clear(this.elementId); + this.anchor = anchor; + _updateAnchorClass(); + + if (!doNotRepaint) { + this._jsPlumb.instance.repaint(this.elementId); + } + + return this; + }; + + this.setAnchor = function (anchorParams, doNotRepaint) { + var a = this.prepareAnchor(anchorParams); + this.setPreparedAnchor(a, doNotRepaint); + return this; + }; + + var internalHover = function (state) { + if (this.connections.length > 0) { + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].setHover(state, false); + } + } + else { + this.setHover(state); + } + }.bind(this); + + this.bind("mouseover", function () { + internalHover(true); + }); + this.bind("mouseout", function () { + internalHover(false); + }); + + // ANCHOR MANAGER + if (!params._transient) { // in place copies, for example, are transient. they will never need to be retrieved during a paint cycle, because they dont move, and then they are deleted. + this._jsPlumb.instance.anchorManager.add(this, this.elementId); + } + + this.prepareEndpoint = function(ep, typeId) { + var _e = function (t, p) { + var rm = _jsPlumb.getRenderMode(); + if (_jp.Endpoints[rm][t]) { + return new _jp.Endpoints[rm][t](p); + } + if (!_jsPlumb.Defaults.DoNotThrowErrors) { + throw { msg: "jsPlumb: unknown endpoint type '" + t + "'" }; + } + }; + + var endpointArgs = { + _jsPlumb: this._jsPlumb.instance, + cssClass: params.cssClass, + container: params.container, + tooltip: params.tooltip, + connectorTooltip: params.connectorTooltip, + endpoint: this + }; + + var endpoint; + + if (_ju.isString(ep)) { + endpoint = _e(ep, endpointArgs); + } + else if (_ju.isArray(ep)) { + endpointArgs = _ju.merge(ep[1], endpointArgs); + endpoint = _e(ep[0], endpointArgs); + } + else { + endpoint = ep.clone(); + } + + // assign a clone function using a copy of endpointArgs. this is used when a drag starts: the endpoint that was dragged is cloned, + // and the clone is left in its place while the original one goes off on a magical journey. + // the copy is to get around a closure problem, in which endpointArgs ends up getting shared by + // the whole world. + //var argsForClone = jsPlumb.extend({}, endpointArgs); + endpoint.clone = function () { + // TODO this, and the code above, can be refactored to be more dry. + if (_ju.isString(ep)) { + return _e(ep, endpointArgs); + } + else if (_ju.isArray(ep)) { + endpointArgs = _ju.merge(ep[1], endpointArgs); + return _e(ep[0], endpointArgs); + } + }.bind(this); + + endpoint.typeId = typeId; + return endpoint; + }; + + this.setEndpoint = function(ep, doNotRepaint) { + var _ep = this.prepareEndpoint(ep); + this.setPreparedEndpoint(_ep, true); + }; + + this.setPreparedEndpoint = function (ep, doNotRepaint) { + if (this.endpoint != null) { + this.endpoint.cleanup(); + this.endpoint.destroy(); + } + this.endpoint = ep; + this.type = this.endpoint.type; + this.canvas = this.endpoint.canvas; + }; + + _jp.extend(this, params, typeParameters); + + this.isSource = params.isSource || false; + this.isTemporarySource = params.isTemporarySource || false; + this.isTarget = params.isTarget || false; + + this.connections = params.connections || []; + this.connectorPointerEvents = params["connector-pointer-events"]; + + this.scope = params.scope || _jsPlumb.getDefaultScope(); + this.timestamp = null; + this.reattachConnections = params.reattach || _jsPlumb.Defaults.ReattachConnections; + this.connectionsDetachable = _jsPlumb.Defaults.ConnectionsDetachable; + if (params.connectionsDetachable === false || params.detachable === false) { + this.connectionsDetachable = false; + } + this.dragAllowedWhenFull = params.dragAllowedWhenFull !== false; + + if (params.onMaxConnections) { + this.bind("maxConnections", params.onMaxConnections); + } + + // + // add a connection. not part of public API. + // + this.addConnection = function (connection) { + this.connections.push(connection); + this[(this.connections.length > 0 ? "add" : "remove") + "Class"](_jsPlumb.endpointConnectedClass); + this[(this.isFull() ? "add" : "remove") + "Class"](_jsPlumb.endpointFullClass); + }; + + this.detachFromConnection = function (connection, idx, doNotCleanup) { + idx = idx == null ? this.connections.indexOf(connection) : idx; + if (idx >= 0) { + this.connections.splice(idx, 1); + this[(this.connections.length > 0 ? "add" : "remove") + "Class"](_jsPlumb.endpointConnectedClass); + this[(this.isFull() ? "add" : "remove") + "Class"](_jsPlumb.endpointFullClass); + } + + if (!doNotCleanup && deleteOnEmpty && this.connections.length === 0) { + _jsPlumb.deleteObject({ + endpoint: this, + fireEvent: false, + deleteAttachedObjects: doNotCleanup !== true + }); + } + }; + + this.deleteEveryConnection = function(params) { + var c = this.connections.length; + for (var i = 0; i < c; i++) { + _jsPlumb.deleteConnection(this.connections[0], params); + } + }; + + this.detachFrom = function (targetEndpoint, fireEvent, originalEvent) { + var c = []; + for (var i = 0; i < this.connections.length; i++) { + if (this.connections[i].endpoints[1] === targetEndpoint || this.connections[i].endpoints[0] === targetEndpoint) { + c.push(this.connections[i]); + } + } + for (var j = 0, count = c.length; j < count; j++) { + _jsPlumb.deleteConnection(c[0]); + } + return this; + }; + + this.getElement = function () { + return this.element; + }; + + this.setElement = function (el) { + var parentId = this._jsPlumb.instance.getId(el), + curId = this.elementId; + // remove the endpoint from the list for the current endpoint's element + _ju.removeWithFunction(params.endpointsByElement[this.elementId], function (e) { + return e.id === this.id; + }.bind(this)); + this.element = _jp.getElement(el); + this.elementId = _jsPlumb.getId(this.element); + _jsPlumb.anchorManager.rehomeEndpoint(this, curId, this.element); + _jsPlumb.dragManager.endpointAdded(this.element); + _ju.addToList(params.endpointsByElement, parentId, this); + return this; + }; + + /** + * private but must be exposed. + */ + this.makeInPlaceCopy = function () { + var loc = this.anchor.getCurrentLocation({element: this}), + o = this.anchor.getOrientation(this), + acc = this.anchor.getCssClass(), + inPlaceAnchor = { + bind: function () { + }, + compute: function () { + return [ loc[0], loc[1] ]; + }, + getCurrentLocation: function () { + return [ loc[0], loc[1] ]; + }, + getOrientation: function () { + return o; + }, + getCssClass: function () { + return acc; + } + }; + + return _newEndpoint({ + dropOptions: params.dropOptions, + anchor: inPlaceAnchor, + source: this.element, + paintStyle: this.getPaintStyle(), + endpoint: params.hideOnDrag ? "Blank" : this.endpoint, + _transient: true, + scope: this.scope, + reference:this + }); + }; + + /** + * returns a connection from the pool; used when dragging starts. just gets the head of the array if it can. + */ + this.connectorSelector = function () { + return this.connections[0]; + }; + + this.setStyle = this.setPaintStyle; + + this.paint = function (params) { + params = params || {}; + var timestamp = params.timestamp, recalc = !(params.recalc === false); + if (!timestamp || this.timestamp !== timestamp) { + + var info = _jsPlumb.updateOffset({ elId: this.elementId, timestamp: timestamp }); + + var xy = params.offset ? params.offset.o : info.o; + if (xy != null) { + var ap = params.anchorPoint, connectorPaintStyle = params.connectorPaintStyle; + if (ap == null) { + var wh = params.dimensions || info.s, + anchorParams = { xy: [ xy.left, xy.top ], wh: wh, element: this, timestamp: timestamp }; + if (recalc && this.anchor.isDynamic && this.connections.length > 0) { + var c = findConnectionToUseForDynamicAnchor(this, params.elementWithPrecedence), + oIdx = c.endpoints[0] === this ? 1 : 0, + oId = oIdx === 0 ? c.sourceId : c.targetId, + oInfo = _jsPlumb.getCachedData(oId), + oOffset = oInfo.o, oWH = oInfo.s; + + anchorParams.index = oIdx === 0 ? 1 : 0; + anchorParams.connection = c; + anchorParams.txy = [ oOffset.left, oOffset.top ]; + anchorParams.twh = oWH; + anchorParams.tElement = c.endpoints[oIdx]; + } else if (this.connections.length > 0) { + anchorParams.connection = this.connections[0]; + } + ap = this.anchor.compute(anchorParams); + } + + this.endpoint.compute(ap, this.anchor.getOrientation(this), this._jsPlumb.paintStyleInUse, connectorPaintStyle || this.paintStyleInUse); + this.endpoint.paint(this._jsPlumb.paintStyleInUse, this.anchor); + this.timestamp = timestamp; + + // paint overlays + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays.hasOwnProperty(i)) { + var o = this._jsPlumb.overlays[i]; + if (o.isVisible()) { + this._jsPlumb.overlayPlacements[i] = o.draw(this.endpoint, this._jsPlumb.paintStyleInUse); + o.paint(this._jsPlumb.overlayPlacements[i]); + } + } + } + } + } + }; + + this.getTypeDescriptor = function () { + return "endpoint"; + }; + this.isVisible = function () { + return this._jsPlumb.visible; + }; + + this.repaint = this.paint; + + var draggingInitialised = false; + this.initDraggable = function () { + + // is this a connection source? we make it draggable and have the + // drag listener maintain a connection with a floating endpoint. + if (!draggingInitialised && _jp.isDragSupported(this.element)) { + var placeholderInfo = { id: null, element: null }, + jpc = null, + existingJpc = false, + existingJpcParams = null, + _dragHandler = _makeConnectionDragHandler(this, placeholderInfo, _jsPlumb), + dragOptions = params.dragOptions || {}, + defaultOpts = {}, + startEvent = _jp.dragEvents.start, + stopEvent = _jp.dragEvents.stop, + dragEvent = _jp.dragEvents.drag, + beforeStartEvent = _jp.dragEvents.beforeStart, + payload; + + // respond to beforeStart from katavorio; this will have, optionally, a payload of attribute values + // that were placed there by the makeSource mousedown listener. + var beforeStart = function(beforeStartParams) { + payload = beforeStartParams.e.payload || {}; + }; + + var start = function (startParams) { + +// ------------- first, get a connection to drag. this may be null, in which case we are dragging a new one. + + jpc = this.connectorSelector(); + +// -------------------------------- now a bunch of tests about whether or not to proceed ------------------------- + + var _continue = true; + // if not enabled, return + if (!this.isEnabled()) { + _continue = false; + } + // if no connection and we're not a source - or temporarily a source, as is the case with makeSource - return. + if (jpc == null && !this.isSource && !this.isTemporarySource) { + _continue = false; + } + // otherwise if we're full and not allowed to drag, also return false. + if (this.isSource && this.isFull() && !(jpc != null && this.dragAllowedWhenFull)) { + _continue = false; + } + // if the connection was setup as not detachable or one of its endpoints + // was setup as connectionsDetachable = false, or Defaults.ConnectionsDetachable + // is set to false... + if (jpc != null && !jpc.isDetachable(this)) { + // .. and the endpoint is full + if (this.isFull()) { + _continue = false; + } else { + // otherwise, if not full, set the connection to null, and we will now proceed + // to drag a new connection. + jpc = null; + } + } + + var beforeDrag = _jsPlumb.checkCondition(jpc == null ? "beforeDrag" : "beforeStartDetach", { + endpoint:this, + source:this.element, + sourceId:this.elementId, + connection:jpc + }); + if (beforeDrag === false) { + _continue = false; + } + // else we might have been given some data. we'll pass it in to a new connection as 'data'. + // here we also merge in the optional payload we were given on mousedown. + else if (typeof beforeDrag === "object") { + _jp.extend(beforeDrag, payload || {}); + } + else { + // or if no beforeDrag data, maybe use the payload on its own. + beforeDrag = payload || {}; + } + + if (_continue === false) { + // this is for mootools and yui. returning false from this causes jquery to stop drag. + // the events are wrapped in both mootools and yui anyway, but i don't think returning + // false from the start callback would stop a drag. + if (_jsPlumb.stopDrag) { + _jsPlumb.stopDrag(this.canvas); + } + _dragHandler.stopDrag(); + return false; + } + +// --------------------------------------------------------------------------------------------------------------------- + + // ok to proceed. + + // clear hover for all connections for this endpoint before continuing. + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].setHover(false); + } + + this.addClass("endpointDrag"); + _jsPlumb.setConnectionBeingDragged(true); + + // if we're not full but there was a connection, make it null. we'll create a new one. + if (jpc && !this.isFull() && this.isSource) { + jpc = null; + } + + _jsPlumb.updateOffset({ elId: this.elementId }); + +// ---------------- make the element we will drag around, and position it ----------------------------- + + var ipco = this._jsPlumb.instance.getOffset(this.canvas), + canvasElement = this.canvas, + ips = this._jsPlumb.instance.getSize(this.canvas); + + _makeDraggablePlaceholder(placeholderInfo, _jsPlumb, ipco, ips); + + // store the id of the dragging div and the source element. the drop function will pick these up. + _jsPlumb.setAttributes(this.canvas, { + "dragId": placeholderInfo.id, + "elId": this.elementId + }); + +// ------------------- create an endpoint that will be our floating endpoint ------------------------------------ + + var endpointToFloat = this.dragProxy || this.endpoint; + if (this.dragProxy == null && this.connectionType != null) { + var aae = this._jsPlumb.instance.deriveEndpointAndAnchorSpec(this.connectionType); + if (aae.endpoints[1]) { + endpointToFloat = aae.endpoints[1]; + } + } + var centerAnchor = this._jsPlumb.instance.makeAnchor("Center"); + centerAnchor.isFloating = true; + this._jsPlumb.floatingEndpoint = _makeFloatingEndpoint(this.getPaintStyle(), centerAnchor, endpointToFloat, this.canvas, placeholderInfo.element, _jsPlumb, _newEndpoint, this.scope); + var _savedAnchor = this._jsPlumb.floatingEndpoint.anchor; + + + if (jpc == null) { + + this.setHover(false, false); + // create a connection. one end is this endpoint, the other is a floating endpoint. + jpc = _newConnection({ + sourceEndpoint: this, + targetEndpoint: this._jsPlumb.floatingEndpoint, + source: this.element, // for makeSource with parent option. ensure source element is represented correctly. + target: placeholderInfo.element, + anchors: [ this.anchor, this._jsPlumb.floatingEndpoint.anchor ], + paintStyle: params.connectorStyle, // this can be null. Connection will use the default. + hoverPaintStyle: params.connectorHoverStyle, + connector: params.connector, // this can also be null. Connection will use the default. + overlays: params.connectorOverlays, + type: this.connectionType, + cssClass: this.connectorClass, + hoverClass: this.connectorHoverClass, + scope:params.scope, + data:beforeDrag + }); + jpc.pending = true; + jpc.addClass(_jsPlumb.draggingClass); + this._jsPlumb.floatingEndpoint.addClass(_jsPlumb.draggingClass); + this._jsPlumb.floatingEndpoint.anchor = _savedAnchor; + // fire an event that informs that a connection is being dragged + _jsPlumb.fire("connectionDrag", jpc); + + // register the new connection on the drag manager. This connection, at this point, is 'pending', + // and has as its target a temporary element (the 'placeholder'). If the connection subsequently + // becomes established, the anchor manager is informed that the target of the connection has + // changed. + + _jsPlumb.anchorManager.newConnection(jpc); + + } else { + existingJpc = true; + jpc.setHover(false); + // new anchor idx + var anchorIdx = jpc.endpoints[0].id === this.id ? 0 : 1; + this.detachFromConnection(jpc, null, true); // detach from the connection while dragging is occurring. but dont cleanup automatically. + + // store the original scope (issue 57) + var dragScope = _jsPlumb.getDragScope(canvasElement); + _jsPlumb.setAttribute(this.canvas, "originalScope", dragScope); + + // fire an event that informs that a connection is being dragged. we do this before + // replacing the original target with the floating element info. + _jsPlumb.fire("connectionDrag", jpc); + + // now we replace ourselves with the temporary div we created above: + if (anchorIdx === 0) { + existingJpcParams = [ jpc.source, jpc.sourceId, canvasElement, dragScope ]; + _jsPlumb.anchorManager.sourceChanged(jpc.endpoints[anchorIdx].elementId, placeholderInfo.id, jpc, placeholderInfo.element); + + } else { + existingJpcParams = [ jpc.target, jpc.targetId, canvasElement, dragScope ]; + jpc.target = placeholderInfo.element; + jpc.targetId = placeholderInfo.id; + + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.endpoints[anchorIdx].elementId, jpc.targetId, jpc); + } + + // store the original endpoint and assign the new floating endpoint for the drag. + jpc.suspendedEndpoint = jpc.endpoints[anchorIdx]; + + // PROVIDE THE SUSPENDED ELEMENT, BE IT A SOURCE OR TARGET (ISSUE 39) + jpc.suspendedElement = jpc.endpoints[anchorIdx].getElement(); + jpc.suspendedElementId = jpc.endpoints[anchorIdx].elementId; + jpc.suspendedElementType = anchorIdx === 0 ? "source" : "target"; + + jpc.suspendedEndpoint.setHover(false); + this._jsPlumb.floatingEndpoint.referenceEndpoint = jpc.suspendedEndpoint; + jpc.endpoints[anchorIdx] = this._jsPlumb.floatingEndpoint; + + jpc.addClass(_jsPlumb.draggingClass); + this._jsPlumb.floatingEndpoint.addClass(_jsPlumb.draggingClass); + } + + _jsPlumb.registerFloatingConnection(placeholderInfo, jpc, this._jsPlumb.floatingEndpoint); + + // // register it and register connection on it. + // _jsPlumb.floatingConnections[placeholderInfo.id] = jpc; + // + // // only register for the target endpoint; we will not be dragging the source at any time + // // before this connection is either discarded or made into a permanent connection. + // _ju.addToList(params.endpointsByElement, placeholderInfo.id, this._jsPlumb.floatingEndpoint); + + + // tell jsplumb about it + _jsPlumb.currentlyDragging = true; + }.bind(this); + + var stop = function () { + _jsPlumb.setConnectionBeingDragged(false); + + if (jpc && jpc.endpoints != null) { + // get the actual drop event (decode from library args to stop function) + var originalEvent = _jsPlumb.getDropEvent(arguments); + // unlock the other endpoint (if it is dynamic, it would have been locked at drag start) + var idx = _jsPlumb.getFloatingAnchorIndex(jpc); + jpc.endpoints[idx === 0 ? 1 : 0].anchor.unlock(); + // TODO: Dont want to know about css classes inside jsplumb, ideally. + jpc.removeClass(_jsPlumb.draggingClass); + + // if we have the floating endpoint then the connection has not been dropped + // on another endpoint. If it is a new connection we throw it away. If it is an + // existing connection we check to see if we should reattach it, throwing it away + // if not. + if (this._jsPlumb && (jpc.deleteConnectionNow || jpc.endpoints[idx] === this._jsPlumb.floatingEndpoint)) { + // 6a. if the connection was an existing one... + if (existingJpc && jpc.suspendedEndpoint) { + // fix for issue35, thanks Sylvain Gizard: when firing the detach event make sure the + // floating endpoint has been replaced. + if (idx === 0) { + jpc.floatingElement = jpc.source; + jpc.floatingId = jpc.sourceId; + jpc.floatingEndpoint = jpc.endpoints[0]; + jpc.floatingIndex = 0; + jpc.source = existingJpcParams[0]; + jpc.sourceId = existingJpcParams[1]; + } else { + // keep a copy of the floating element; the anchor manager will want to clean up. + jpc.floatingElement = jpc.target; + jpc.floatingId = jpc.targetId; + jpc.floatingEndpoint = jpc.endpoints[1]; + jpc.floatingIndex = 1; + jpc.target = existingJpcParams[0]; + jpc.targetId = existingJpcParams[1]; + } + + var fe = this._jsPlumb.floatingEndpoint; // store for later removal. + // restore the original scope (issue 57) + _jsPlumb.setDragScope(existingJpcParams[2], existingJpcParams[3]); + jpc.endpoints[idx] = jpc.suspendedEndpoint; + // if the connection should be reattached, or the other endpoint refuses detach, then + // reset the connection to its original state + if (jpc.isReattach() || jpc._forceReattach || jpc._forceDetach || !_jsPlumb.deleteConnection(jpc, {originalEvent: originalEvent})) { + + jpc.setHover(false); + jpc._forceDetach = null; + jpc._forceReattach = null; + this._jsPlumb.floatingEndpoint.detachFromConnection(jpc); + jpc.suspendedEndpoint.addConnection(jpc); + + // TODO this code is duplicated in lots of places...and there is nothing external + // in the code; it all refers to the connection itself. we could add a + // `checkSanity(connection)` method to anchorManager that did this. + if (idx === 1) { + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.floatingId, jpc.targetId, jpc); + } + else { + _jsPlumb.anchorManager.sourceChanged(jpc.floatingId, jpc.sourceId, jpc, jpc.source); + } + + _jsPlumb.repaint(existingJpcParams[1]); + } + else { + _jsPlumb.deleteObject({endpoint: fe}); + } + } + } + + // makeTargets sets this flag, to tell us we have been replaced and should delete this object. + if (this.deleteAfterDragStop) { + _jsPlumb.deleteObject({endpoint: this}); + } + else { + if (this._jsPlumb) { + this.paint({recalc: false}); + } + } + + // although the connection is no longer valid, there are use cases where this is useful. + _jsPlumb.fire("connectionDragStop", jpc, originalEvent); + // fire this event to give people more fine-grained control (connectionDragStop fires a lot) + if (jpc.pending) { + _jsPlumb.fire("connectionAborted", jpc, originalEvent); + } + // tell jsplumb that dragging is finished. + _jsPlumb.currentlyDragging = false; + jpc.suspendedElement = null; + jpc.suspendedEndpoint = null; + jpc = null; + } + + // if no endpoints, jpc already cleaned up. but still we want to ensure we're reset properly. + // remove the element associated with the floating endpoint + // (and its associated floating endpoint and visual artefacts) + if (placeholderInfo && placeholderInfo.element) { + _jsPlumb.remove(placeholderInfo.element, false, false); + } + // remove the inplace copy + if (inPlaceCopy) { + _jsPlumb.deleteObject({endpoint: inPlaceCopy}); + } + + if (this._jsPlumb) { + // make our canvas visible (TODO: hand off to library; we should not know about DOM) + this.canvas.style.visibility = "visible"; + // unlock our anchor + this.anchor.unlock(); + // clear floating anchor. + this._jsPlumb.floatingEndpoint = null; + } + + }.bind(this); + + dragOptions = _jp.extend(defaultOpts, dragOptions); + dragOptions.scope = this.scope || dragOptions.scope; + dragOptions[beforeStartEvent] = _ju.wrap(dragOptions[beforeStartEvent], beforeStart, false); + dragOptions[startEvent] = _ju.wrap(dragOptions[startEvent], start, false); + // extracted drag handler function so can be used by makeSource + dragOptions[dragEvent] = _ju.wrap(dragOptions[dragEvent], _dragHandler.drag); + dragOptions[stopEvent] = _ju.wrap(dragOptions[stopEvent], stop); + dragOptions.multipleDrop = false; + + dragOptions.canDrag = function () { + return this.isSource || this.isTemporarySource || (this.connections.length > 0 && this.connectionsDetachable !== false); + }.bind(this); + + _jsPlumb.initDraggable(this.canvas, dragOptions, "internal"); + + this.canvas._jsPlumbRelatedElement = this.element; + + draggingInitialised = true; + } + }; + + var ep = params.endpoint || this._jsPlumb.instance.Defaults.Endpoint || _jp.Defaults.Endpoint; + this.setEndpoint(ep, true); + var anchorParamsToUse = params.anchor ? params.anchor : params.anchors ? params.anchors : (_jsPlumb.Defaults.Anchor || "Top"); + this.setAnchor(anchorParamsToUse, true); + + // finally, set type if it was provided + var type = [ "default", (params.type || "")].join(" "); + this.addType(type, params.data, true); + this.canvas = this.endpoint.canvas; + this.canvas._jsPlumb = this; + + this.initDraggable(); + + // pulled this out into a function so we can reuse it for the inPlaceCopy canvas; you can now drop detached connections + // back onto the endpoint you detached it from. + var _initDropTarget = function (canvas, isTransient, endpoint, referenceEndpoint) { + + if (_jp.isDropSupported(this.element)) { + var dropOptions = params.dropOptions || _jsPlumb.Defaults.DropOptions || _jp.Defaults.DropOptions; + dropOptions = _jp.extend({}, dropOptions); + dropOptions.scope = dropOptions.scope || this.scope; + var dropEvent = _jp.dragEvents.drop, + overEvent = _jp.dragEvents.over, + outEvent = _jp.dragEvents.out, + _ep = this, + drop = _jsPlumb.EndpointDropHandler({ + getEndpoint: function () { + return _ep; + }, + jsPlumb: _jsPlumb, + enabled: function () { + return endpoint != null ? endpoint.isEnabled() : true; + }, + isFull: function () { + return endpoint.isFull(); + }, + element: this.element, + elementId: this.elementId, + isSource: this.isSource, + isTarget: this.isTarget, + addClass: function (clazz) { + _ep.addClass(clazz); + }, + removeClass: function (clazz) { + _ep.removeClass(clazz); + }, + isDropAllowed: function () { + return _ep.isDropAllowed.apply(_ep, arguments); + }, + reference:referenceEndpoint, + isRedrop:function(jpc, dhParams) { + return jpc.suspendedEndpoint && dhParams.reference && (jpc.suspendedEndpoint.id === dhParams.reference.id); + } + }); + + dropOptions[dropEvent] = _ju.wrap(dropOptions[dropEvent], drop, true); + dropOptions[overEvent] = _ju.wrap(dropOptions[overEvent], function () { + var draggable = _jp.getDragObject(arguments), + id = _jsPlumb.getAttribute(_jp.getElement(draggable), "dragId"), + _jpc = _jsPlumb.getFloatingConnectionFor(id);//_jsPlumb.floatingConnections[id]; + + if (_jpc != null) { + var idx = _jsPlumb.getFloatingAnchorIndex(_jpc); + // here we should fire the 'over' event if we are a target and this is a new connection, + // or we are the same as the floating endpoint. + var _cont = (this.isTarget && idx !== 0) || (_jpc.suspendedEndpoint && this.referenceEndpoint && this.referenceEndpoint.id === _jpc.suspendedEndpoint.id); + if (_cont) { + var bb = _jsPlumb.checkCondition("checkDropAllowed", { + sourceEndpoint: _jpc.endpoints[idx], + targetEndpoint: this, + connection: _jpc + }); + this[(bb ? "add" : "remove") + "Class"](_jsPlumb.endpointDropAllowedClass); + this[(bb ? "remove" : "add") + "Class"](_jsPlumb.endpointDropForbiddenClass); + _jpc.endpoints[idx].anchor.over(this.anchor, this); + } + } + }.bind(this)); + + dropOptions[outEvent] = _ju.wrap(dropOptions[outEvent], function () { + var draggable = _jp.getDragObject(arguments), + id = draggable == null ? null : _jsPlumb.getAttribute(_jp.getElement(draggable), "dragId"), + _jpc = id ? _jsPlumb.getFloatingConnectionFor(id) : null; + + if (_jpc != null) { + var idx = _jsPlumb.getFloatingAnchorIndex(_jpc); + var _cont = (this.isTarget && idx !== 0) || (_jpc.suspendedEndpoint && this.referenceEndpoint && this.referenceEndpoint.id === _jpc.suspendedEndpoint.id); + if (_cont) { + this.removeClass(_jsPlumb.endpointDropAllowedClass); + this.removeClass(_jsPlumb.endpointDropForbiddenClass); + _jpc.endpoints[idx].anchor.out(); + } + } + }.bind(this)); + + _jsPlumb.initDroppable(canvas, dropOptions, "internal", isTransient); + } + }.bind(this); + + // Initialise the endpoint's canvas as a drop target. The drop handler will take care of the logic of whether + // something can actually be dropped. + if (!this.anchor.isFloating) { + _initDropTarget(this.canvas, !(params._transient || this.anchor.isFloating), this, params.reference); + } + + return this; + }; + + _ju.extend(_jp.Endpoint, _jp.OverlayCapableJsPlumbUIComponent, { + + setVisible: function (v, doNotChangeConnections, doNotNotifyOtherEndpoint) { + this._jsPlumb.visible = v; + if (this.canvas) { + this.canvas.style.display = v ? "block" : "none"; + } + this[v ? "showOverlays" : "hideOverlays"](); + if (!doNotChangeConnections) { + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].setVisible(v); + if (!doNotNotifyOtherEndpoint) { + var oIdx = this === this.connections[i].endpoints[0] ? 1 : 0; + // only change the other endpoint if this is its only connection. + if (this.connections[i].endpoints[oIdx].connections.length === 1) { + this.connections[i].endpoints[oIdx].setVisible(v, true, true); + } + } + } + } + }, + getAttachedElements: function () { + return this.connections; + }, + applyType: function (t, doNotRepaint) { + this.setPaintStyle(t.endpointStyle || t.paintStyle, doNotRepaint); + this.setHoverPaintStyle(t.endpointHoverStyle || t.hoverPaintStyle, doNotRepaint); + if (t.maxConnections != null) { + this._jsPlumb.maxConnections = t.maxConnections; + } + if (t.scope) { + this.scope = t.scope; + } + _jp.extend(this, t, typeParameters); + if (t.cssClass != null && this.canvas) { + this._jsPlumb.instance.addClass(this.canvas, t.cssClass); + } + _jp.OverlayCapableJsPlumbUIComponent.applyType(this, t); + }, + isEnabled: function () { + return this._jsPlumb.enabled; + }, + setEnabled: function (e) { + this._jsPlumb.enabled = e; + }, + cleanup: function () { + var anchorClass = this._jsPlumb.instance.endpointAnchorClassPrefix + (this._jsPlumb.currentAnchorClass ? "-" + this._jsPlumb.currentAnchorClass : ""); + _jp.removeClass(this.element, anchorClass); + this.anchor = null; + this.endpoint.cleanup(true); + this.endpoint.destroy(); + this.endpoint = null; + // drag/drop + this._jsPlumb.instance.destroyDraggable(this.canvas, "internal"); + this._jsPlumb.instance.destroyDroppable(this.canvas, "internal"); + }, + setHover: function (h) { + if (this.endpoint && this._jsPlumb && !this._jsPlumb.instance.isConnectionBeingDragged()) { + this.endpoint.setHover(h); + } + }, + isFull: function () { + return this._jsPlumb.maxConnections === 0 ? true : !(this.isFloating() || this._jsPlumb.maxConnections < 0 || this.connections.length < this._jsPlumb.maxConnections); + }, + /** + * private but needs to be exposed. + */ + isFloating: function () { + return this.anchor != null && this.anchor.isFloating; + }, + isConnectedTo: function (endpoint) { + var found = false; + if (endpoint) { + for (var i = 0; i < this.connections.length; i++) { + if (this.connections[i].endpoints[1] === endpoint || this.connections[i].endpoints[0] === endpoint) { + found = true; + break; + } + } + } + return found; + }, + getConnectionCost: function () { + return this._jsPlumb.connectionCost; + }, + setConnectionCost: function (c) { + this._jsPlumb.connectionCost = c; + }, + areConnectionsDirected: function () { + return this._jsPlumb.connectionsDirected; + }, + setConnectionsDirected: function (b) { + this._jsPlumb.connectionsDirected = b; + }, + setElementId: function (_elId) { + this.elementId = _elId; + this.anchor.elementId = _elId; + }, + setReferenceElement: function (_el) { + this.element = _jp.getElement(_el); + }, + setDragAllowedWhenFull: function (allowed) { + this.dragAllowedWhenFull = allowed; + }, + equals: function (endpoint) { + return this.anchor.equals(endpoint.anchor); + }, + getUuid: function () { + return this._jsPlumb.uuid; + }, + computeAnchor: function (params) { + return this.anchor.compute(params); + } + }); + + root.jsPlumbInstance.prototype.EndpointDropHandler = function (dhParams) { + return function (e) { + + var _jsPlumb = dhParams.jsPlumb; + + // remove the classes that are added dynamically. drop is neither forbidden nor allowed now that + // the drop is finishing. + dhParams.removeClass(_jsPlumb.endpointDropAllowedClass); + dhParams.removeClass(_jsPlumb.endpointDropForbiddenClass); + + var originalEvent = _jsPlumb.getDropEvent(arguments), + draggable = _jsPlumb.getDragObject(arguments), + id = _jsPlumb.getAttribute(draggable, "dragId"), + elId = _jsPlumb.getAttribute(draggable, "elId"), + scope = _jsPlumb.getAttribute(draggable, "originalScope"), + jpc = _jsPlumb.getFloatingConnectionFor(id); + + // if no active connection, bail. + if (jpc == null) { + return; + } + + // calculate if this is an existing connection. + var existingConnection = jpc.suspendedEndpoint != null; + + // if suspended endpoint exists but has been cleaned up, bail. This means it's an existing connection + // that has been detached and will shortly be discarded. + if (existingConnection && jpc.suspendedEndpoint._jsPlumb == null) { + return; + } + + // get the drop endpoint. for a normal connection this is just the one that would replace the currently + // floating endpoint. for a makeTarget this is a new endpoint that is created on drop. But we leave that to + // the handler to figure out. + var _ep = dhParams.getEndpoint(jpc); + + // If we're not given an endpoint to use, bail. + if (_ep == null) { + return; + } + + // if this is a drop back where the connection came from, mark it force reattach and + // return; the stop handler will reattach. without firing an event. + if (dhParams.isRedrop(jpc, dhParams)) { + jpc._forceReattach = true; + jpc.setHover(false); + if (dhParams.maybeCleanup) { + dhParams.maybeCleanup(_ep); + } + return; + } + + // ensure we dont bother trying to drop sources on non-source eps, and same for target. + var idx = _jsPlumb.getFloatingAnchorIndex(jpc); + if ((idx === 0 && !dhParams.isSource)|| (idx === 1 && !dhParams.isTarget)){ + if (dhParams.maybeCleanup) { + dhParams.maybeCleanup(_ep); + } + return; + } + + if (dhParams.onDrop) { + dhParams.onDrop(jpc); + } + + // restore the original scope if necessary (issue 57) + if (scope) { + _jsPlumb.setDragScope(draggable, scope); + } + + // if the target of the drop is full, fire an event (we abort below) + // makeTarget: keep. + var isFull = dhParams.isFull(e); + if (isFull) { + _ep.fire("maxConnections", { + endpoint: this, + connection: jpc, + maxConnections: _ep._jsPlumb.maxConnections + }, originalEvent); + } + // + // if endpoint enabled, not full, and matches the index of the floating endpoint... + if (!isFull && dhParams.enabled()) { + var _doContinue = true; + + // before testing for beforeDrop, reset the connection's source/target to be the actual DOM elements + // involved (that is, stash any temporary stuff used for dragging. but we need to keep it around in + // order that the anchor manager can clean things up properly). + if (idx === 0) { + jpc.floatingElement = jpc.source; + jpc.floatingId = jpc.sourceId; + jpc.floatingEndpoint = jpc.endpoints[0]; + jpc.floatingIndex = 0; + jpc.source = dhParams.element; + jpc.sourceId = _jsPlumb.getId(dhParams.element); + } else { + jpc.floatingElement = jpc.target; + jpc.floatingId = jpc.targetId; + jpc.floatingEndpoint = jpc.endpoints[1]; + jpc.floatingIndex = 1; + jpc.target = dhParams.element; + jpc.targetId = _jsPlumb.getId(dhParams.element); + } + + // if this is an existing connection and detach is not allowed we won't continue. The connection's + // endpoints have been reinstated; everything is back to how it was. + if (existingConnection && jpc.suspendedEndpoint.id !== _ep.id) { + if (!jpc.isDetachAllowed(jpc) || !jpc.endpoints[idx].isDetachAllowed(jpc) || !jpc.suspendedEndpoint.isDetachAllowed(jpc) || !_jsPlumb.checkCondition("beforeDetach", jpc)) { + _doContinue = false; + } + } + +// ------------ wrap the execution path in a function so we can support asynchronous beforeDrop + + var continueFunction = function (optionalData) { + // remove this jpc from the current endpoint, which is a floating endpoint that we will + // subsequently discard. + jpc.endpoints[idx].detachFromConnection(jpc); + + // if there's a suspended endpoint, detach it from the connection. + if (jpc.suspendedEndpoint) { + jpc.suspendedEndpoint.detachFromConnection(jpc); + } + + jpc.endpoints[idx] = _ep; + _ep.addConnection(jpc); + + // copy our parameters in to the connection: + var params = _ep.getParameters(); + for (var aParam in params) { + jpc.setParameter(aParam, params[aParam]); + } + + if (!existingConnection) { + // if not an existing connection and + if (params.draggable) { + _jsPlumb.initDraggable(this.element, dhParams.dragOptions, "internal", _jsPlumb); + } + } + else { + var suspendedElementId = jpc.suspendedEndpoint.elementId; + _jsPlumb.fireMoveEvent({ + index: idx, + originalSourceId: idx === 0 ? suspendedElementId : jpc.sourceId, + newSourceId: idx === 0 ? _ep.elementId : jpc.sourceId, + originalTargetId: idx === 1 ? suspendedElementId : jpc.targetId, + newTargetId: idx === 1 ? _ep.elementId : jpc.targetId, + originalSourceEndpoint: idx === 0 ? jpc.suspendedEndpoint : jpc.endpoints[0], + newSourceEndpoint: idx === 0 ? _ep : jpc.endpoints[0], + originalTargetEndpoint: idx === 1 ? jpc.suspendedEndpoint : jpc.endpoints[1], + newTargetEndpoint: idx === 1 ? _ep : jpc.endpoints[1], + connection: jpc + }, originalEvent); + } + + if (idx === 1) { + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.floatingId, jpc.targetId, jpc); + } + else { + _jsPlumb.anchorManager.sourceChanged(jpc.floatingId, jpc.sourceId, jpc, jpc.source); + } + + // when makeSource has uniqueEndpoint:true, we want to create connections with new endpoints + // that are subsequently deleted. So makeSource sets `finalEndpoint`, which is the Endpoint to + // which the connection should be attached. The `detachFromConnection` call below results in the + // temporary endpoint being cleaned up. + if (jpc.endpoints[0].finalEndpoint) { + var _toDelete = jpc.endpoints[0]; + _toDelete.detachFromConnection(jpc); + jpc.endpoints[0] = jpc.endpoints[0].finalEndpoint; + jpc.endpoints[0].addConnection(jpc); + } + + // if optionalData was given, merge it onto the connection's data. + if (_ju.isObject(optionalData)) { + jpc.mergeData(optionalData); + } + // finalise will inform the anchor manager and also add to + // connectionsByScope if necessary. + _jsPlumb.finaliseConnection(jpc, null, originalEvent, false); + jpc.setHover(false); + + // SP continuous anchor flush + _jsPlumb.revalidate(jpc.endpoints[0].element); + + }.bind(this); + + var dontContinueFunction = function () { + // otherwise just put it back on the endpoint it was on before the drag. + if (jpc.suspendedEndpoint) { + jpc.endpoints[idx] = jpc.suspendedEndpoint; + jpc.setHover(false); + jpc._forceDetach = true; + if (idx === 0) { + jpc.source = jpc.suspendedEndpoint.element; + jpc.sourceId = jpc.suspendedEndpoint.elementId; + } else { + jpc.target = jpc.suspendedEndpoint.element; + jpc.targetId = jpc.suspendedEndpoint.elementId; + } + jpc.suspendedEndpoint.addConnection(jpc); + + // TODO checkSanity + if (idx === 1) { + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.floatingId, jpc.targetId, jpc); + } + else { + _jsPlumb.anchorManager.sourceChanged(jpc.floatingId, jpc.sourceId, jpc, jpc.source); + } + + _jsPlumb.repaint(jpc.sourceId); + jpc._forceDetach = false; + } + }; + +// -------------------------------------- + // now check beforeDrop. this will be available only on Endpoints that are setup to + // have a beforeDrop condition (although, secretly, under the hood all Endpoints and + // the Connection have them, because they are on jsPlumbUIComponent. shhh!), because + // it only makes sense to have it on a target endpoint. + _doContinue = _doContinue && dhParams.isDropAllowed(jpc.sourceId, jpc.targetId, jpc.scope, jpc, _ep);// && jpc.pending; + + if (_doContinue) { + continueFunction(_doContinue); + return true; + } + else { + dontContinueFunction(); + } + } + + if (dhParams.maybeCleanup) { + dhParams.maybeCleanup(_ep); + } + + _jsPlumb.currentlyDragging = false; + }; + }; +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the code for Connections. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, + _jp = root.jsPlumb, + _ju = root.jsPlumbUtil; + + var makeConnector = function (_jsPlumb, renderMode, connectorName, connectorArgs, forComponent) { + // first make sure we have a cache for the specified renderer + _jp.Connectors[renderMode] = _jp.Connectors[renderMode] || {}; + + // now see if the one we want exists; if not we will try to make it + if (_jp.Connectors[renderMode][connectorName] == null) { + + if (_jp.Connectors[connectorName] == null) { + if (!_jsPlumb.Defaults.DoNotThrowErrors) { + throw new TypeError("jsPlumb: unknown connector type '" + connectorName + "'"); + } else { + return null; + } + } + + _jp.Connectors[renderMode][connectorName] = function() { + _jp.Connectors[connectorName].apply(this, arguments); + _jp.ConnectorRenderers[renderMode].apply(this, arguments); + }; + + _ju.extend(_jp.Connectors[renderMode][connectorName], [ _jp.Connectors[connectorName], _jp.ConnectorRenderers[renderMode]]); + + } + + return new _jp.Connectors[renderMode][connectorName](connectorArgs, forComponent); + }, + _makeAnchor = function (anchorParams, elementId, _jsPlumb) { + return (anchorParams) ? _jsPlumb.makeAnchor(anchorParams, elementId, _jsPlumb) : null; + }, + _updateConnectedClass = function (conn, element, _jsPlumb, remove) { + if (element != null) { + element._jsPlumbConnections = element._jsPlumbConnections || {}; + if (remove) { + delete element._jsPlumbConnections[conn.id]; + } + else { + element._jsPlumbConnections[conn.id] = true; + } + + if (_ju.isEmpty(element._jsPlumbConnections)) { + _jsPlumb.removeClass(element, _jsPlumb.connectedClass); + } + else { + _jsPlumb.addClass(element, _jsPlumb.connectedClass); + } + } + }; + + _jp.Connection = function (params) { + var _newEndpoint = params.newEndpoint; + + this.id = params.id; + this.connector = null; + this.idPrefix = "_jsplumb_c_"; + this.defaultLabelLocation = 0.5; + this.defaultOverlayKeys = ["Overlays", "ConnectionOverlays"]; + // if a new connection is the result of moving some existing connection, params.previousConnection + // will have that Connection in it. listeners for the jsPlumbConnection event can look for that + // member and take action if they need to. + this.previousConnection = params.previousConnection; + this.source = _jp.getElement(params.source); + this.target = _jp.getElement(params.target); + + + _jp.OverlayCapableJsPlumbUIComponent.apply(this, arguments); + + // sourceEndpoint and targetEndpoint override source/target, if they are present. but + // source is not overridden if the Endpoint has declared it is not the final target of a connection; + // instead we use the source that the Endpoint declares will be the final source element. + if (params.sourceEndpoint) { + this.source = params.sourceEndpoint.getElement(); + this.sourceId = params.sourceEndpoint.elementId; + } else { + this.sourceId = this._jsPlumb.instance.getId(this.source); + } + + if (params.targetEndpoint) { + this.target = params.targetEndpoint.getElement(); + this.targetId = params.targetEndpoint.elementId; + } else { + this.targetId = this._jsPlumb.instance.getId(this.target); + } + + + this.scope = params.scope; // scope may have been passed in to the connect call. if it wasn't, we will pull it from the source endpoint, after having initialised the endpoints. + this.endpoints = []; + this.endpointStyles = []; + + var _jsPlumb = this._jsPlumb.instance; + + _jsPlumb.manage(this.sourceId, this.source); + _jsPlumb.manage(this.targetId, this.target); + + this._jsPlumb.visible = true; + + this._jsPlumb.params = { + cssClass: params.cssClass, + container: params.container, + "pointer-events": params["pointer-events"], + editorParams: params.editorParams, + overlays: params.overlays + }; + this._jsPlumb.lastPaintedAt = null; + + // listen to mouseover and mouseout events passed from the container delegate. + this.bind("mouseover", function () { + this.setHover(true); + }.bind(this)); + this.bind("mouseout", function () { + this.setHover(false); + }.bind(this)); + + +// INITIALISATION CODE + + this.makeEndpoint = function (isSource, el, elId, ep, definition) { + elId = elId || this._jsPlumb.instance.getId(el); + return this.prepareEndpoint(_jsPlumb, _newEndpoint, this, ep, isSource ? 0 : 1, params, el, elId, definition); + }; + + // if type given, get the endpoint definitions mapping to that type from the jsplumb instance, and use those. + // we apply types at the end of this constructor but endpoints are only honoured in a type definition at + // create time. + if (params.type) { + params.endpoints = params.endpoints || this._jsPlumb.instance.deriveEndpointAndAnchorSpec(params.type).endpoints; + } + + var eS = this.makeEndpoint(true, this.source, this.sourceId, params.sourceEndpoint), + eT = this.makeEndpoint(false, this.target, this.targetId, params.targetEndpoint); + + if (eS) { + _ju.addToList(params.endpointsByElement, this.sourceId, eS); + } + if (eT) { + _ju.addToList(params.endpointsByElement, this.targetId, eT); + } + // if scope not set, set it to be the scope for the source endpoint. + if (!this.scope) { + this.scope = this.endpoints[0].scope; + } + + // if explicitly told to (or not to) delete endpoints when empty, override endpoint's preferences + if (params.deleteEndpointsOnEmpty != null) { + this.endpoints[0].setDeleteOnEmpty(params.deleteEndpointsOnEmpty); + this.endpoints[1].setDeleteOnEmpty(params.deleteEndpointsOnEmpty); + } + +// -------------------------- DEFAULT TYPE --------------------------------------------- + + // DETACHABLE + var _detachable = _jsPlumb.Defaults.ConnectionsDetachable; + if (params.detachable === false) { + _detachable = false; + } + if (this.endpoints[0].connectionsDetachable === false) { + _detachable = false; + } + if (this.endpoints[1].connectionsDetachable === false) { + _detachable = false; + } + // REATTACH + var _reattach = params.reattach || this.endpoints[0].reattachConnections || this.endpoints[1].reattachConnections || _jsPlumb.Defaults.ReattachConnections; + + this.appendToDefaultType({ + detachable: _detachable, + reattach: _reattach, + paintStyle:this.endpoints[0].connectorStyle || this.endpoints[1].connectorStyle || params.paintStyle || _jsPlumb.Defaults.PaintStyle || _jp.Defaults.PaintStyle, + hoverPaintStyle:this.endpoints[0].connectorHoverStyle || this.endpoints[1].connectorHoverStyle || params.hoverPaintStyle || _jsPlumb.Defaults.HoverPaintStyle || _jp.Defaults.HoverPaintStyle + }); + + var _suspendedAt = _jsPlumb.getSuspendedAt(); + if (!_jsPlumb.isSuspendDrawing()) { + // paint the endpoints + var myInfo = _jsPlumb.getCachedData(this.sourceId), + myOffset = myInfo.o, myWH = myInfo.s, + otherInfo = _jsPlumb.getCachedData(this.targetId), + otherOffset = otherInfo.o, + otherWH = otherInfo.s, + initialTimestamp = _suspendedAt || _jsPlumb.timestamp(), + anchorLoc = this.endpoints[0].anchor.compute({ + xy: [ myOffset.left, myOffset.top ], wh: myWH, element: this.endpoints[0], + elementId: this.endpoints[0].elementId, + txy: [ otherOffset.left, otherOffset.top ], twh: otherWH, tElement: this.endpoints[1], + timestamp: initialTimestamp + }); + + this.endpoints[0].paint({ anchorLoc: anchorLoc, timestamp: initialTimestamp }); + + anchorLoc = this.endpoints[1].anchor.compute({ + xy: [ otherOffset.left, otherOffset.top ], wh: otherWH, element: this.endpoints[1], + elementId: this.endpoints[1].elementId, + txy: [ myOffset.left, myOffset.top ], twh: myWH, tElement: this.endpoints[0], + timestamp: initialTimestamp + }); + this.endpoints[1].paint({ anchorLoc: anchorLoc, timestamp: initialTimestamp }); + } + + this.getTypeDescriptor = function () { + return "connection"; + }; + this.getAttachedElements = function () { + return this.endpoints; + }; + + this.isDetachable = function (ep) { + return this._jsPlumb.detachable === false ? false : ep != null ? ep.connectionsDetachable === true : this._jsPlumb.detachable === true; + }; + this.setDetachable = function (detachable) { + this._jsPlumb.detachable = detachable === true; + }; + this.isReattach = function () { + return this._jsPlumb.reattach === true || this.endpoints[0].reattachConnections === true || this.endpoints[1].reattachConnections === true; + }; + this.setReattach = function (reattach) { + this._jsPlumb.reattach = reattach === true; + }; + +// END INITIALISATION CODE + + +// COST + DIRECTIONALITY + // if cost not supplied, try to inherit from source endpoint + this._jsPlumb.cost = params.cost || this.endpoints[0].getConnectionCost(); + this._jsPlumb.directed = params.directed; + // inherit directed flag if set no source endpoint + if (params.directed == null) { + this._jsPlumb.directed = this.endpoints[0].areConnectionsDirected(); + } +// END COST + DIRECTIONALITY + +// PARAMETERS + // merge all the parameters objects into the connection. parameters set + // on the connection take precedence; then source endpoint params, then + // finally target endpoint params. + var _p = _jp.extend({}, this.endpoints[1].getParameters()); + _jp.extend(_p, this.endpoints[0].getParameters()); + _jp.extend(_p, this.getParameters()); + this.setParameters(_p); +// END PARAMETERS + +// PAINTING + + this.setConnector(this.endpoints[0].connector || this.endpoints[1].connector || params.connector || _jsPlumb.Defaults.Connector || _jp.Defaults.Connector, true); + var data = params.data == null || !_ju.isObject(params.data) ? {} : params.data; + this.getData = function() { return data; }; + this.setData = function(d) { data = d || {}; }; + this.mergeData = function(d) { data = _jp.extend(data, d); }; + + // the very last thing we do is apply types, if there are any. + var _types = [ "default", this.endpoints[0].connectionType, this.endpoints[1].connectionType, params.type ].join(" "); + if (/[^\s]/.test(_types)) { + this.addType(_types, params.data, true); + } + + this.updateConnectedClass(); + +// END PAINTING + }; + + _ju.extend(_jp.Connection, _jp.OverlayCapableJsPlumbUIComponent, { + applyType: function (t, doNotRepaint, typeMap) { + + var _connector = null; + if (t.connector != null) { + _connector = this.getCachedTypeItem("connector", typeMap.connector); + if (_connector == null) { + _connector = this.prepareConnector(t.connector, typeMap.connector); + this.cacheTypeItem("connector", _connector, typeMap.connector); + } + this.setPreparedConnector(_connector); + } + + // none of these things result in the creation of objects so can be ignored. + if (t.detachable != null) { + this.setDetachable(t.detachable); + } + if (t.reattach != null) { + this.setReattach(t.reattach); + } + if (t.scope) { + this.scope = t.scope; + } + + if (t.cssClass != null && this.canvas) { + this._jsPlumb.instance.addClass(this.canvas, t.cssClass); + } + + var _anchors = null; + // this also results in the creation of objects. + if (t.anchor) { + // note that even if the param was anchor, we store `anchors`. + _anchors = this.getCachedTypeItem("anchors", typeMap.anchor); + if (_anchors == null) { + _anchors = [ this._jsPlumb.instance.makeAnchor(t.anchor), this._jsPlumb.instance.makeAnchor(t.anchor) ]; + this.cacheTypeItem("anchors", _anchors, typeMap.anchor); + } + } + else if (t.anchors) { + _anchors = this.getCachedTypeItem("anchors", typeMap.anchors); + if (_anchors == null) { + _anchors = [ + this._jsPlumb.instance.makeAnchor(t.anchors[0]), + this._jsPlumb.instance.makeAnchor(t.anchors[1]) + ]; + this.cacheTypeItem("anchors", _anchors, typeMap.anchors); + } + } + if (_anchors != null) { + this.endpoints[0].anchor = _anchors[0]; + this.endpoints[1].anchor = _anchors[1]; + if (this.endpoints[1].anchor.isDynamic) { + this._jsPlumb.instance.repaint(this.endpoints[1].elementId); + } + } + + _jp.OverlayCapableJsPlumbUIComponent.applyType(this, t); + }, + addClass: function (c, informEndpoints) { + if (informEndpoints) { + this.endpoints[0].addClass(c); + this.endpoints[1].addClass(c); + if (this.suspendedEndpoint) { + this.suspendedEndpoint.addClass(c); + } + } + if (this.connector) { + this.connector.addClass(c); + } + }, + removeClass: function (c, informEndpoints) { + if (informEndpoints) { + this.endpoints[0].removeClass(c); + this.endpoints[1].removeClass(c); + if (this.suspendedEndpoint) { + this.suspendedEndpoint.removeClass(c); + } + } + if (this.connector) { + this.connector.removeClass(c); + } + }, + isVisible: function () { + return this._jsPlumb.visible; + }, + setVisible: function (v) { + this._jsPlumb.visible = v; + if (this.connector) { + this.connector.setVisible(v); + } + this.repaint(); + }, + cleanup: function () { + this.updateConnectedClass(true); + this.endpoints = null; + this.source = null; + this.target = null; + if (this.connector != null) { + this.connector.cleanup(true); + this.connector.destroy(true); + } + this.connector = null; + }, + updateConnectedClass:function(remove) { + if (this._jsPlumb) { + _updateConnectedClass(this, this.source, this._jsPlumb.instance, remove); + _updateConnectedClass(this, this.target, this._jsPlumb.instance, remove); + } + }, + setHover: function (state) { + if (this.connector && this._jsPlumb && !this._jsPlumb.instance.isConnectionBeingDragged()) { + this.connector.setHover(state); + root.jsPlumb[state ? "addClass" : "removeClass"](this.source, this._jsPlumb.instance.hoverSourceClass); + root.jsPlumb[state ? "addClass" : "removeClass"](this.target, this._jsPlumb.instance.hoverTargetClass); + } + }, + getUuids:function() { + return [ this.endpoints[0].getUuid(), this.endpoints[1].getUuid() ]; + }, + getCost: function () { + return this._jsPlumb ? this._jsPlumb.cost : -Infinity; + }, + setCost: function (c) { + this._jsPlumb.cost = c; + }, + isDirected: function () { + return this._jsPlumb.directed; + }, + getConnector: function () { + return this.connector; + }, + prepareConnector:function(connectorSpec, typeId) { + var connectorArgs = { + _jsPlumb: this._jsPlumb.instance, + cssClass: this._jsPlumb.params.cssClass, + container: this._jsPlumb.params.container, + "pointer-events": this._jsPlumb.params["pointer-events"] + }, + renderMode = this._jsPlumb.instance.getRenderMode(), + connector; + + if (_ju.isString(connectorSpec)) { + connector = makeConnector(this._jsPlumb.instance, renderMode, connectorSpec, connectorArgs, this); + } // lets you use a string as shorthand. + else if (_ju.isArray(connectorSpec)) { + if (connectorSpec.length === 1) { + connector = makeConnector(this._jsPlumb.instance, renderMode, connectorSpec[0], connectorArgs, this); + } + else { + connector = makeConnector(this._jsPlumb.instance, renderMode, connectorSpec[0], _ju.merge(connectorSpec[1], connectorArgs), this); + } + } + if (typeId != null) { + connector.typeId = typeId; + } + return connector; + }, + setPreparedConnector: function(connector, doNotRepaint, doNotChangeListenerComponent, typeId) { + + if (this.connector !== connector) { + + var previous, previousClasses = ""; + // the connector will not be cleaned up if it was set as part of a type, because `typeId` will be set on it + // and we havent passed in `true` for "force" here. + if (this.connector != null) { + previous = this.connector; + previousClasses = previous.getClass(); + this.connector.cleanup(); + this.connector.destroy(); + } + + this.connector = connector; + if (typeId) { + this.cacheTypeItem("connector", connector, typeId); + } + + this.canvas = this.connector.canvas; + this.bgCanvas = this.connector.bgCanvas; + + this.connector.reattach(this._jsPlumb.instance); + + // put classes from prior connector onto the canvas + this.addClass(previousClasses); + + // new: instead of binding listeners per connector, we now just have one delegate on the container. + // so for that handler we set the connection as the '_jsPlumb' member of the canvas element, and + // bgCanvas, if it exists, which it does right now in the VML renderer, so it won't from v 2.0.0 onwards. + if (this.canvas) { + this.canvas._jsPlumb = this; + } + if (this.bgCanvas) { + this.bgCanvas._jsPlumb = this; + } + + if (previous != null) { + var o = this.getOverlays(); + for (var i = 0; i < o.length; i++) { + if (o[i].transfer) { + o[i].transfer(this.connector); + } + } + } + + if (!doNotChangeListenerComponent) { + this.setListenerComponent(this.connector); + } + if (!doNotRepaint) { + this.repaint(); + } + } + }, + setConnector: function (connectorSpec, doNotRepaint, doNotChangeListenerComponent, typeId) { + var connector = this.prepareConnector(connectorSpec, typeId); + this.setPreparedConnector(connector, doNotRepaint, doNotChangeListenerComponent, typeId); + }, + paint: function (params) { + + if (!this._jsPlumb.instance.isSuspendDrawing() && this._jsPlumb.visible) { + params = params || {}; + var timestamp = params.timestamp, + // if the moving object is not the source we must transpose the two references. + swap = false, + tId = swap ? this.sourceId : this.targetId, sId = swap ? this.targetId : this.sourceId, + tIdx = swap ? 0 : 1, sIdx = swap ? 1 : 0; + + if (timestamp == null || timestamp !== this._jsPlumb.lastPaintedAt) { + var sourceInfo = this._jsPlumb.instance.updateOffset({elId:sId}).o, + targetInfo = this._jsPlumb.instance.updateOffset({elId:tId}).o, + sE = this.endpoints[sIdx], tE = this.endpoints[tIdx]; + + var sAnchorP = sE.anchor.getCurrentLocation({xy: [sourceInfo.left, sourceInfo.top], wh: [sourceInfo.width, sourceInfo.height], element: sE, timestamp: timestamp}), + tAnchorP = tE.anchor.getCurrentLocation({xy: [targetInfo.left, targetInfo.top], wh: [targetInfo.width, targetInfo.height], element: tE, timestamp: timestamp}); + + this.connector.resetBounds(); + + this.connector.compute({ + sourcePos: sAnchorP, + targetPos: tAnchorP, + sourceOrientation:sE.anchor.getOrientation(sE), + targetOrientation:tE.anchor.getOrientation(tE), + sourceEndpoint: this.endpoints[sIdx], + targetEndpoint: this.endpoints[tIdx], + "stroke-width": this._jsPlumb.paintStyleInUse.strokeWidth, + sourceInfo: sourceInfo, + targetInfo: targetInfo + }); + + var overlayExtents = { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity }; + + // compute overlays. we do this first so we can get their placements, and adjust the + // container if needs be (if an overlay would be clipped) + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays.hasOwnProperty(i)) { + var o = this._jsPlumb.overlays[i]; + if (o.isVisible()) { + this._jsPlumb.overlayPlacements[i] = o.draw(this.connector, this._jsPlumb.paintStyleInUse, this.getAbsoluteOverlayPosition(o)); + overlayExtents.minX = Math.min(overlayExtents.minX, this._jsPlumb.overlayPlacements[i].minX); + overlayExtents.maxX = Math.max(overlayExtents.maxX, this._jsPlumb.overlayPlacements[i].maxX); + overlayExtents.minY = Math.min(overlayExtents.minY, this._jsPlumb.overlayPlacements[i].minY); + overlayExtents.maxY = Math.max(overlayExtents.maxY, this._jsPlumb.overlayPlacements[i].maxY); + } + } + } + + var lineWidth = parseFloat(this._jsPlumb.paintStyleInUse.strokeWidth || 1) / 2, + outlineWidth = parseFloat(this._jsPlumb.paintStyleInUse.strokeWidth || 0), + extents = { + xmin: Math.min(this.connector.bounds.minX - (lineWidth + outlineWidth), overlayExtents.minX), + ymin: Math.min(this.connector.bounds.minY - (lineWidth + outlineWidth), overlayExtents.minY), + xmax: Math.max(this.connector.bounds.maxX + (lineWidth + outlineWidth), overlayExtents.maxX), + ymax: Math.max(this.connector.bounds.maxY + (lineWidth + outlineWidth), overlayExtents.maxY) + }; + // paint the connector. + this.connector.paintExtents = extents; + this.connector.paint(this._jsPlumb.paintStyleInUse, null, extents); + // and then the overlays + for (var j in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays.hasOwnProperty(j)) { + var p = this._jsPlumb.overlays[j]; + if (p.isVisible()) { + p.paint(this._jsPlumb.overlayPlacements[j], extents); + } + } + } + } + this._jsPlumb.lastPaintedAt = timestamp; + } + }, + repaint: function (params) { + var p = jsPlumb.extend(params || {}, {}); + p.elId = this.sourceId; + this.paint(p); + }, + prepareEndpoint: function (_jsPlumb, _newEndpoint, conn, existing, index, params, element, elementId, definition) { + var e; + if (existing) { + conn.endpoints[index] = existing; + existing.addConnection(conn); + } else { + if (!params.endpoints) { + params.endpoints = [ null, null ]; + } + var ep = definition || params.endpoints[index] || params.endpoint || _jsPlumb.Defaults.Endpoints[index] || _jp.Defaults.Endpoints[index] || _jsPlumb.Defaults.Endpoint || _jp.Defaults.Endpoint; + if (!params.endpointStyles) { + params.endpointStyles = [ null, null ]; + } + if (!params.endpointHoverStyles) { + params.endpointHoverStyles = [ null, null ]; + } + var es = params.endpointStyles[index] || params.endpointStyle || _jsPlumb.Defaults.EndpointStyles[index] || _jp.Defaults.EndpointStyles[index] || _jsPlumb.Defaults.EndpointStyle || _jp.Defaults.EndpointStyle; + // Endpoints derive their fill from the connector's stroke, if no fill was specified. + if (es.fill == null && params.paintStyle != null) { + es.fill = params.paintStyle.stroke; + } + + if (es.outlineStroke == null && params.paintStyle != null) { + es.outlineStroke = params.paintStyle.outlineStroke; + } + if (es.outlineWidth == null && params.paintStyle != null) { + es.outlineWidth = params.paintStyle.outlineWidth; + } + + var ehs = params.endpointHoverStyles[index] || params.endpointHoverStyle || _jsPlumb.Defaults.EndpointHoverStyles[index] || _jp.Defaults.EndpointHoverStyles[index] || _jsPlumb.Defaults.EndpointHoverStyle || _jp.Defaults.EndpointHoverStyle; + // endpoint hover fill style is derived from connector's hover stroke style + if (params.hoverPaintStyle != null) { + if (ehs == null) { + ehs = {}; + } + if (ehs.fill == null) { + ehs.fill = params.hoverPaintStyle.stroke; + } + } + var a = params.anchors ? params.anchors[index] : + params.anchor ? params.anchor : + _makeAnchor(_jsPlumb.Defaults.Anchors[index], elementId, _jsPlumb) || + _makeAnchor(_jp.Defaults.Anchors[index], elementId, _jsPlumb) || + _makeAnchor(_jsPlumb.Defaults.Anchor, elementId, _jsPlumb) || + _makeAnchor(_jp.Defaults.Anchor, elementId, _jsPlumb), + u = params.uuids ? params.uuids[index] : null; + + e = _newEndpoint({ + paintStyle: es, hoverPaintStyle: ehs, endpoint: ep, connections: [ conn ], + uuid: u, anchor: a, source: element, scope: params.scope, + reattach: params.reattach || _jsPlumb.Defaults.ReattachConnections, + detachable: params.detachable || _jsPlumb.Defaults.ConnectionsDetachable + }); + if (existing == null) { + e.setDeleteOnEmpty(true); + } + conn.endpoints[index] = e; + + if (params.drawEndpoints === false) { + e.setVisible(false, true, true); + } + + } + return e; + }, + replaceEndpoint:function(idx, endpointDef) { + + var current = this.endpoints[idx], + elId = current.elementId, + ebe = this._jsPlumb.instance.getEndpoints(elId), + _idx = ebe.indexOf(current), + _new = this.makeEndpoint(idx === 0, current.element, elId, null, endpointDef); + + this.endpoints[idx] = _new; + + ebe.splice(_idx, 1, _new); + this._jsPlumb.instance.deleteObject({endpoint:current, deleteAttachedObjects:false}); + this._jsPlumb.instance.fire("endpointReplaced", {previous:current, current:_new}); + + this._jsPlumb.instance.anchorManager.updateOtherEndpoint(this.endpoints[0].elementId, this.endpoints[1].elementId, this.endpoints[1].elementId, this); + + } + + }); // END Connection class +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the code for creating and manipulating anchors. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + + var root = this, + _ju = root.jsPlumbUtil, + _jp = root.jsPlumb; + + // + // manages anchors for all elements. + // + _jp.AnchorManager = function (params) { + var _amEndpoints = {}, + continuousAnchorLocations = {}, + continuousAnchorOrientations = {}, + connectionsByElementId = {}, + self = this, + anchorLists = {}, + jsPlumbInstance = params.jsPlumbInstance, + floatingConnections = {}, + // used by placeAnchors function + placeAnchorsOnLine = function (desc, elementDimensions, elementPosition, connections, horizontal, otherMultiplier, reverse) { + var a = [], step = elementDimensions[horizontal ? 0 : 1] / (connections.length + 1); + + for (var i = 0; i < connections.length; i++) { + var val = (i + 1) * step, other = otherMultiplier * elementDimensions[horizontal ? 1 : 0]; + if (reverse) { + val = elementDimensions[horizontal ? 0 : 1] - val; + } + + var dx = (horizontal ? val : other), x = elementPosition[0] + dx, xp = dx / elementDimensions[0], + dy = (horizontal ? other : val), y = elementPosition[1] + dy, yp = dy / elementDimensions[1]; + + a.push([ x, y, xp, yp, connections[i][1], connections[i][2] ]); + } + + return a; + }, + rightAndBottomSort = function(a, b) { + return b[0][0] - a[0][0]; + }, + // used by edgeSortFunctions + leftAndTopSort = function (a, b) { + var p1 = a[0][0] < 0 ? -Math.PI - a[0][0] : Math.PI - a[0][0], + p2 = b[0][0] < 0 ? -Math.PI - b[0][0] : Math.PI - b[0][0]; + + return p1 - p2; + }, + // used by placeAnchors + edgeSortFunctions = { + "top":leftAndTopSort, + "right": rightAndBottomSort, + "bottom": rightAndBottomSort, + "left": leftAndTopSort + }, + // used by placeAnchors + _sortHelper = function (_array, _fn) { + return _array.sort(_fn); + }, + // used by AnchorManager.redraw + placeAnchors = function (elementId, _anchorLists) { + var cd = jsPlumbInstance.getCachedData(elementId), sS = cd.s, sO = cd.o, + placeSomeAnchors = function (desc, elementDimensions, elementPosition, unsortedConnections, isHorizontal, otherMultiplier, orientation) { + if (unsortedConnections.length > 0) { + var sc = _sortHelper(unsortedConnections, edgeSortFunctions[desc]), // puts them in order based on the target element's pos on screen + reverse = desc === "right" || desc === "top", + anchors = placeAnchorsOnLine(desc, elementDimensions, + elementPosition, sc, + isHorizontal, otherMultiplier, reverse); + + // takes a computed anchor position and adjusts it for parent offset and scroll, then stores it. + var _setAnchorLocation = function (endpoint, anchorPos) { + continuousAnchorLocations[endpoint.id] = [ anchorPos[0], anchorPos[1], anchorPos[2], anchorPos[3] ]; + continuousAnchorOrientations[endpoint.id] = orientation; + }; + + for (var i = 0; i < anchors.length; i++) { + var c = anchors[i][4], weAreSource = c.endpoints[0].elementId === elementId, weAreTarget = c.endpoints[1].elementId === elementId; + if (weAreSource) { + _setAnchorLocation(c.endpoints[0], anchors[i]); + } + if (weAreTarget) { + _setAnchorLocation(c.endpoints[1], anchors[i]); + } + } + } + }; + + placeSomeAnchors("bottom", sS, [sO.left, sO.top], _anchorLists.bottom, true, 1, [0, 1]); + placeSomeAnchors("top", sS, [sO.left, sO.top], _anchorLists.top, true, 0, [0, -1]); + placeSomeAnchors("left", sS, [sO.left, sO.top], _anchorLists.left, false, 0, [-1, 0]); + placeSomeAnchors("right", sS, [sO.left, sO.top], _anchorLists.right, false, 1, [1, 0]); + }; + + this.reset = function () { + _amEndpoints = {}; + connectionsByElementId = {}; + anchorLists = {}; + }; + this.addFloatingConnection = function (key, conn) { + floatingConnections[key] = conn; + }; + this.removeFloatingConnection = function (key) { + delete floatingConnections[key]; + }; + this.newConnection = function (conn) { + var sourceId = conn.sourceId, targetId = conn.targetId, + ep = conn.endpoints, + doRegisterTarget = true, + registerConnection = function (otherIndex, otherEndpoint, otherAnchor, elId, c) { + if ((sourceId === targetId) && otherAnchor.isContinuous) { + // remove the target endpoint's canvas. we dont need it. + conn._jsPlumb.instance.removeElement(ep[1].canvas); + doRegisterTarget = false; + } + _ju.addToList(connectionsByElementId, elId, [c, otherEndpoint, otherAnchor.constructor === _jp.DynamicAnchor]); + }; + + registerConnection(0, ep[0], ep[0].anchor, targetId, conn); + if (doRegisterTarget) { + registerConnection(1, ep[1], ep[1].anchor, sourceId, conn); + } + }; + var removeEndpointFromAnchorLists = function (endpoint) { + (function (list, eId) { + if (list) { // transient anchors dont get entries in this list. + var f = function (e) { + return e[4] === eId; + }; + _ju.removeWithFunction(list.top, f); + _ju.removeWithFunction(list.left, f); + _ju.removeWithFunction(list.bottom, f); + _ju.removeWithFunction(list.right, f); + } + })(anchorLists[endpoint.elementId], endpoint.id); + }; + this.connectionDetached = function (connInfo, doNotRedraw) { + var connection = connInfo.connection || connInfo, + sourceId = connInfo.sourceId, + targetId = connInfo.targetId, + ep = connection.endpoints, + removeConnection = function (otherIndex, otherEndpoint, otherAnchor, elId, c) { + _ju.removeWithFunction(connectionsByElementId[elId], function (_c) { + return _c[0].id === c.id; + }); + }; + + removeConnection(1, ep[1], ep[1].anchor, sourceId, connection); + removeConnection(0, ep[0], ep[0].anchor, targetId, connection); + if (connection.floatingId) { + removeConnection(connection.floatingIndex, connection.floatingEndpoint, connection.floatingEndpoint.anchor, connection.floatingId, connection); + removeEndpointFromAnchorLists(connection.floatingEndpoint); + } + + // remove from anchorLists + removeEndpointFromAnchorLists(connection.endpoints[0]); + removeEndpointFromAnchorLists(connection.endpoints[1]); + + if (!doNotRedraw) { + self.redraw(connection.sourceId); + if (connection.targetId !== connection.sourceId) { + self.redraw(connection.targetId); + } + } + }; + this.add = function (endpoint, elementId) { + _ju.addToList(_amEndpoints, elementId, endpoint); + }; + this.changeId = function (oldId, newId) { + connectionsByElementId[newId] = connectionsByElementId[oldId]; + _amEndpoints[newId] = _amEndpoints[oldId]; + delete connectionsByElementId[oldId]; + delete _amEndpoints[oldId]; + }; + this.getConnectionsFor = function (elementId) { + return connectionsByElementId[elementId] || []; + }; + this.getEndpointsFor = function (elementId) { + return _amEndpoints[elementId] || []; + }; + this.deleteEndpoint = function (endpoint) { + _ju.removeWithFunction(_amEndpoints[endpoint.elementId], function (e) { + return e.id === endpoint.id; + }); + removeEndpointFromAnchorLists(endpoint); + }; + this.clearFor = function (elementId) { + delete _amEndpoints[elementId]; + _amEndpoints[elementId] = []; + }; + // updates the given anchor list by either updating an existing anchor's info, or adding it. this function + // also removes the anchor from its previous list, if the edge it is on has changed. + // all connections found along the way (those that are connected to one of the faces this function + // operates on) are added to the connsToPaint list, as are their endpoints. in this way we know to repaint + // them wthout having to calculate anything else about them. + var _updateAnchorList = function (lists, theta, order, conn, aBoolean, otherElId, idx, reverse, edgeId, elId, connsToPaint, endpointsToPaint) { + // first try to find the exact match, but keep track of the first index of a matching element id along the way.s + var exactIdx = -1, + firstMatchingElIdx = -1, + endpoint = conn.endpoints[idx], + endpointId = endpoint.id, + oIdx = [1, 0][idx], + values = [ + [ theta, order ], + conn, + aBoolean, + otherElId, + endpointId + ], + listToAddTo = lists[edgeId], + listToRemoveFrom = endpoint._continuousAnchorEdge ? lists[endpoint._continuousAnchorEdge] : null, + i, + candidate; + + if (listToRemoveFrom) { + var rIdx = _ju.findWithFunction(listToRemoveFrom, function (e) { + return e[4] === endpointId; + }); + if (rIdx !== -1) { + listToRemoveFrom.splice(rIdx, 1); + // get all connections from this list + for (i = 0; i < listToRemoveFrom.length; i++) { + candidate = listToRemoveFrom[i][1]; + _ju.addWithFunction(connsToPaint, candidate, function (c) { + return c.id === candidate.id; + }); + _ju.addWithFunction(endpointsToPaint, listToRemoveFrom[i][1].endpoints[idx], function (e) { + return e.id === candidate.endpoints[idx].id; + }); + _ju.addWithFunction(endpointsToPaint, listToRemoveFrom[i][1].endpoints[oIdx], function (e) { + return e.id === candidate.endpoints[oIdx].id; + }); + } + } + } + + for (i = 0; i < listToAddTo.length; i++) { + candidate = listToAddTo[i][1]; + if (params.idx === 1 && listToAddTo[i][3] === otherElId && firstMatchingElIdx === -1) { + firstMatchingElIdx = i; + } + _ju.addWithFunction(connsToPaint, candidate, function (c) { + return c.id === candidate.id; + }); + _ju.addWithFunction(endpointsToPaint, listToAddTo[i][1].endpoints[idx], function (e) { + return e.id === candidate.endpoints[idx].id; + }); + _ju.addWithFunction(endpointsToPaint, listToAddTo[i][1].endpoints[oIdx], function (e) { + return e.id === candidate.endpoints[oIdx].id; + }); + } + if (exactIdx !== -1) { + listToAddTo[exactIdx] = values; + } + else { + var insertIdx = reverse ? firstMatchingElIdx !== -1 ? firstMatchingElIdx : 0 : listToAddTo.length; // of course we will get this from having looked through the array shortly. + listToAddTo.splice(insertIdx, 0, values); + } + + // store this for next time. + endpoint._continuousAnchorEdge = edgeId; + }; + + // + // find the entry in an endpoint's list for this connection and update its target endpoint + // with the current target in the connection. + // This method and sourceChanged need to be folder into one. + // + this.updateOtherEndpoint = function (sourceElId, oldTargetId, newTargetId, connection) { + var sIndex = _ju.findWithFunction(connectionsByElementId[sourceElId], function (i) { + return i[0].id === connection.id; + }), + tIndex = _ju.findWithFunction(connectionsByElementId[oldTargetId], function (i) { + return i[0].id === connection.id; + }); + + // update or add data for source + if (sIndex !== -1) { + connectionsByElementId[sourceElId][sIndex][0] = connection; + connectionsByElementId[sourceElId][sIndex][1] = connection.endpoints[1]; + connectionsByElementId[sourceElId][sIndex][2] = connection.endpoints[1].anchor.constructor === _jp.DynamicAnchor; + } + + // remove entry for previous target (if there) + if (tIndex > -1) { + connectionsByElementId[oldTargetId].splice(tIndex, 1); + // add entry for new target + _ju.addToList(connectionsByElementId, newTargetId, [connection, connection.endpoints[0], connection.endpoints[0].anchor.constructor === _jp.DynamicAnchor]); + } + + connection.updateConnectedClass(); + }; + + // + // notification that the connection given has changed source from the originalId to the newId. + // This involves: + // 1. removing the connection from the list of connections stored for the originalId + // 2. updating the source information for the target of the connection + // 3. re-registering the connection in connectionsByElementId with the newId + // + this.sourceChanged = function (originalId, newId, connection, newElement) { + if (originalId !== newId) { + + connection.sourceId = newId; + connection.source = newElement; + + // remove the entry that points from the old source to the target + _ju.removeWithFunction(connectionsByElementId[originalId], function (info) { + return info[0].id === connection.id; + }); + // find entry for target and update it + var tIdx = _ju.findWithFunction(connectionsByElementId[connection.targetId], function (i) { + return i[0].id === connection.id; + }); + if (tIdx > -1) { + connectionsByElementId[connection.targetId][tIdx][0] = connection; + connectionsByElementId[connection.targetId][tIdx][1] = connection.endpoints[0]; + connectionsByElementId[connection.targetId][tIdx][2] = connection.endpoints[0].anchor.constructor === _jp.DynamicAnchor; + } + // add entry for new source + _ju.addToList(connectionsByElementId, newId, [connection, connection.endpoints[1], connection.endpoints[1].anchor.constructor === _jp.DynamicAnchor]); + + // TODO SP not final on this yet. when a user drags an existing connection and it turns into a self + // loop, then this code hides the target endpoint (by removing it from the DOM) But I think this should + // occur only if the anchor is Continuous + if (connection.endpoints[1].anchor.isContinuous) { + if (connection.source === connection.target) { + connection._jsPlumb.instance.removeElement(connection.endpoints[1].canvas); + } + else { + if (connection.endpoints[1].canvas.parentNode == null) { + connection._jsPlumb.instance.appendElement(connection.endpoints[1].canvas); + } + } + } + + connection.updateConnectedClass(); + } + }; + + // + // moves the given endpoint from `currentId` to `element`. + // This involves: + // + // 1. changing the key in _amEndpoints under which the endpoint is stored + // 2. changing the source or target values in all of the endpoint's connections + // 3. changing the array in connectionsByElementId in which the endpoint's connections + // are stored (done by either sourceChanged or updateOtherEndpoint) + // + this.rehomeEndpoint = function (ep, currentId, element) { + var eps = _amEndpoints[currentId] || [], + elementId = jsPlumbInstance.getId(element); + + if (elementId !== currentId) { + var idx = eps.indexOf(ep); + if (idx > -1) { + var _ep = eps.splice(idx, 1)[0]; + self.add(_ep, elementId); + } + } + + for (var i = 0; i < ep.connections.length; i++) { + if (ep.connections[i].sourceId === currentId) { + self.sourceChanged(currentId, ep.elementId, ep.connections[i], ep.element); + } + else if (ep.connections[i].targetId === currentId) { + ep.connections[i].targetId = ep.elementId; + ep.connections[i].target = ep.element; + self.updateOtherEndpoint(ep.connections[i].sourceId, currentId, ep.elementId, ep.connections[i]); + } + } + }; + + this.redraw = function (elementId, ui, timestamp, offsetToUI, clearEdits, doNotRecalcEndpoint) { + + if (!jsPlumbInstance.isSuspendDrawing()) { + // get all the endpoints for this element + var ep = _amEndpoints[elementId] || [], + endpointConnections = connectionsByElementId[elementId] || [], + connectionsToPaint = [], + endpointsToPaint = [], + anchorsToUpdate = []; + + timestamp = timestamp || jsPlumbInstance.timestamp(); + // offsetToUI are values that would have been calculated in the dragManager when registering + // an endpoint for an element that had a parent (somewhere in the hierarchy) that had been + // registered as draggable. + offsetToUI = offsetToUI || {left: 0, top: 0}; + if (ui) { + ui = { + left: ui.left + offsetToUI.left, + top: ui.top + offsetToUI.top + }; + } + + // valid for one paint cycle. + var myOffset = jsPlumbInstance.updateOffset({ elId: elementId, offset: ui, recalc: false, timestamp: timestamp }), + orientationCache = {}; + + // actually, first we should compute the orientation of this element to all other elements to which + // this element is connected with a continuous anchor (whether both ends of the connection have + // a continuous anchor or just one) + + for (var i = 0; i < endpointConnections.length; i++) { + var conn = endpointConnections[i][0], + sourceId = conn.sourceId, + targetId = conn.targetId, + sourceContinuous = conn.endpoints[0].anchor.isContinuous, + targetContinuous = conn.endpoints[1].anchor.isContinuous; + + if (sourceContinuous || targetContinuous) { + var oKey = sourceId + "_" + targetId, + o = orientationCache[oKey], + oIdx = conn.sourceId === elementId ? 1 : 0; + + if (sourceContinuous && !anchorLists[sourceId]) { + anchorLists[sourceId] = { top: [], right: [], bottom: [], left: [] }; + } + if (targetContinuous && !anchorLists[targetId]) { + anchorLists[targetId] = { top: [], right: [], bottom: [], left: [] }; + } + + if (elementId !== targetId) { + jsPlumbInstance.updateOffset({ elId: targetId, timestamp: timestamp }); + } + if (elementId !== sourceId) { + jsPlumbInstance.updateOffset({ elId: sourceId, timestamp: timestamp }); + } + + var td = jsPlumbInstance.getCachedData(targetId), + sd = jsPlumbInstance.getCachedData(sourceId); + + if (targetId === sourceId && (sourceContinuous || targetContinuous)) { + // here we may want to improve this by somehow determining the face we'd like + // to put the connector on. ideally, when drawing, the face should be calculated + // by determining which face is closest to the point at which the mouse button + // was released. for now, we're putting it on the top face. + _updateAnchorList( anchorLists[sourceId], -Math.PI / 2, 0, conn, false, targetId, 0, false, "top", sourceId, connectionsToPaint, endpointsToPaint); + _updateAnchorList( anchorLists[targetId], -Math.PI / 2, 0, conn, false, sourceId, 1, false, "top", targetId, connectionsToPaint, endpointsToPaint); + } + else { + if (!o) { + o = this.calculateOrientation(sourceId, targetId, sd.o, td.o, conn.endpoints[0].anchor, conn.endpoints[1].anchor, conn); + orientationCache[oKey] = o; + // this would be a performance enhancement, but the computed angles need to be clamped to + //the (-PI/2 -> PI/2) range in order for the sorting to work properly. + /* orientationCache[oKey2] = { + orientation:o.orientation, + a:[o.a[1], o.a[0]], + theta:o.theta + Math.PI, + theta2:o.theta2 + Math.PI + };*/ + } + if (sourceContinuous) { + _updateAnchorList(anchorLists[sourceId], o.theta, 0, conn, false, targetId, 0, false, o.a[0], sourceId, connectionsToPaint, endpointsToPaint); + } + if (targetContinuous) { + _updateAnchorList(anchorLists[targetId], o.theta2, -1, conn, true, sourceId, 1, true, o.a[1], targetId, connectionsToPaint, endpointsToPaint); + } + } + + if (sourceContinuous) { + _ju.addWithFunction(anchorsToUpdate, sourceId, function (a) { + return a === sourceId; + }); + } + if (targetContinuous) { + _ju.addWithFunction(anchorsToUpdate, targetId, function (a) { + return a === targetId; + }); + } + _ju.addWithFunction(connectionsToPaint, conn, function (c) { + return c.id === conn.id; + }); + if ((sourceContinuous && oIdx === 0) || (targetContinuous && oIdx === 1)) { + _ju.addWithFunction(endpointsToPaint, conn.endpoints[oIdx], function (e) { + return e.id === conn.endpoints[oIdx].id; + }); + } + } + } + + // place Endpoints whose anchors are continuous but have no Connections + for (i = 0; i < ep.length; i++) { + if (ep[i].connections.length === 0 && ep[i].anchor.isContinuous) { + if (!anchorLists[elementId]) { + anchorLists[elementId] = { top: [], right: [], bottom: [], left: [] }; + } + _updateAnchorList(anchorLists[elementId], -Math.PI / 2, 0, {endpoints: [ep[i], ep[i]], paint: function () { + }}, false, elementId, 0, false, ep[i].anchor.getDefaultFace(), elementId, connectionsToPaint, endpointsToPaint); + _ju.addWithFunction(anchorsToUpdate, elementId, function (a) { + return a === elementId; + }); + } + } + + // now place all the continuous anchors we need to; + for (i = 0; i < anchorsToUpdate.length; i++) { + placeAnchors(anchorsToUpdate[i], anchorLists[anchorsToUpdate[i]]); + } + + // now that continuous anchors have been placed, paint all the endpoints for this element + for (i = 0; i < ep.length; i++) { + ep[i].paint({ timestamp: timestamp, offset: myOffset, dimensions: myOffset.s, recalc: doNotRecalcEndpoint !== true }); + } + + // ... and any other endpoints we came across as a result of the continuous anchors. + for (i = 0; i < endpointsToPaint.length; i++) { + var cd = jsPlumbInstance.getCachedData(endpointsToPaint[i].elementId); + //endpointsToPaint[i].paint({ timestamp: timestamp, offset: cd, dimensions: cd.s }); + endpointsToPaint[i].paint({ timestamp: null, offset: cd, dimensions: cd.s }); + } + + // paint all the standard and "dynamic connections", which are connections whose other anchor is + // static and therefore does need to be recomputed; we make sure that happens only one time. + + // TODO we could have compiled a list of these in the first pass through connections; might save some time. + for (i = 0; i < endpointConnections.length; i++) { + var otherEndpoint = endpointConnections[i][1]; + if (otherEndpoint.anchor.constructor === _jp.DynamicAnchor) { + otherEndpoint.paint({ elementWithPrecedence: elementId, timestamp: timestamp }); + _ju.addWithFunction(connectionsToPaint, endpointConnections[i][0], function (c) { + return c.id === endpointConnections[i][0].id; + }); + // all the connections for the other endpoint now need to be repainted + for (var k = 0; k < otherEndpoint.connections.length; k++) { + if (otherEndpoint.connections[k] !== endpointConnections[i][0]) { + _ju.addWithFunction(connectionsToPaint, otherEndpoint.connections[k], function (c) { + return c.id === otherEndpoint.connections[k].id; + }); + } + } + } else { + _ju.addWithFunction(connectionsToPaint, endpointConnections[i][0], function (c) { + return c.id === endpointConnections[i][0].id; + }); + } + } + + // paint current floating connection for this element, if there is one. + var fc = floatingConnections[elementId]; + if (fc) { + fc.paint({timestamp: timestamp, recalc: false, elId: elementId}); + } + + // paint all the connections + for (i = 0; i < connectionsToPaint.length; i++) { + connectionsToPaint[i].paint({elId: elementId, timestamp: null, recalc: false, clearEdits: clearEdits}); + } + } + }; + + var ContinuousAnchor = function (anchorParams) { + _ju.EventGenerator.apply(this); + this.type = "Continuous"; + this.isDynamic = true; + this.isContinuous = true; + var faces = anchorParams.faces || ["top", "right", "bottom", "left"], + clockwise = !(anchorParams.clockwise === false), + availableFaces = { }, + opposites = { "top": "bottom", "right": "left", "left": "right", "bottom": "top" }, + clockwiseOptions = { "top": "right", "right": "bottom", "left": "top", "bottom": "left" }, + antiClockwiseOptions = { "top": "left", "right": "top", "left": "bottom", "bottom": "right" }, + secondBest = clockwise ? clockwiseOptions : antiClockwiseOptions, + lastChoice = clockwise ? antiClockwiseOptions : clockwiseOptions, + cssClass = anchorParams.cssClass || "", + _currentFace = null, _lockedFace = null, X_AXIS_FACES = ["left", "right"], Y_AXIS_FACES = ["top", "bottom"], + _lockedAxis = null; + + for (var i = 0; i < faces.length; i++) { + availableFaces[faces[i]] = true; + } + + this.getDefaultFace = function () { + return faces.length === 0 ? "top" : faces[0]; + }; + + this.isRelocatable = function() { return true; }; + this.isSnapOnRelocate = function() { return true; }; + + // if the given edge is supported, returns it. otherwise looks for a substitute that _is_ + // supported. if none supported we also return the request edge. + this.verifyEdge = function (edge) { + if (availableFaces[edge]) { + return edge; + } + else if (availableFaces[opposites[edge]]) { + return opposites[edge]; + } + else if (availableFaces[secondBest[edge]]) { + return secondBest[edge]; + } + else if (availableFaces[lastChoice[edge]]) { + return lastChoice[edge]; + } + return edge; // we have to give them something. + }; + + this.isEdgeSupported = function (edge) { + return _lockedAxis == null ? + + (_lockedFace == null ? availableFaces[edge] === true : _lockedFace === edge) + + : _lockedAxis.indexOf(edge) !== -1; + }; + + this.setCurrentFace = function(face, overrideLock) { + _currentFace = face; + // if currently locked, and the user wants to override, do that. + if (overrideLock && _lockedFace != null) { + _lockedFace = _currentFace; + } + }; + + this.getCurrentFace = function() { return _currentFace; }; + this.getSupportedFaces = function() { + var af = []; + for (var k in availableFaces) { + if (availableFaces[k]) { + af.push(k); + } + } + return af; + }; + + this.lock = function() { + _lockedFace = _currentFace; + }; + this.unlock = function() { + _lockedFace = null; + }; + this.isLocked = function() { + return _lockedFace != null; + }; + + this.lockCurrentAxis = function() { + if (_currentFace != null) { + _lockedAxis = (_currentFace === "left" || _currentFace === "right") ? X_AXIS_FACES : Y_AXIS_FACES; + } + }; + + this.unlockCurrentAxis = function() { + _lockedAxis = null; + }; + + this.compute = function (params) { + return continuousAnchorLocations[params.element.id] || [0, 0]; + }; + this.getCurrentLocation = function (params) { + return continuousAnchorLocations[params.element.id] || [0, 0]; + }; + this.getOrientation = function (endpoint) { + return continuousAnchorOrientations[endpoint.id] || [0, 0]; + }; + this.getCssClass = function () { + return cssClass; + }; + }; + + // continuous anchors + jsPlumbInstance.continuousAnchorFactory = { + get: function (params) { + return new ContinuousAnchor(params); + }, + clear: function (elementId) { + delete continuousAnchorLocations[elementId]; + } + }; + }; + + _jp.AnchorManager.prototype.calculateOrientation = function (sourceId, targetId, sd, td, sourceAnchor, targetAnchor) { + + var Orientation = { HORIZONTAL: "horizontal", VERTICAL: "vertical", DIAGONAL: "diagonal", IDENTITY: "identity" }, + axes = ["left", "top", "right", "bottom"]; + + if (sourceId === targetId) { + return { + orientation: Orientation.IDENTITY, + a: ["top", "top"] + }; + } + + var theta = Math.atan2((td.centery - sd.centery), (td.centerx - sd.centerx)), + theta2 = Math.atan2((sd.centery - td.centery), (sd.centerx - td.centerx)); + +// -------------------------------------------------------------------------------------- + + // improved face calculation. get midpoints of each face for source and target, then put in an array with all combinations of + // source/target faces. sort this array by distance between midpoints. the entry at index 0 is our preferred option. we can + // go through the array one by one until we find an entry in which each requested face is supported. + var candidates = [], midpoints = { }; + (function (types, dim) { + for (var i = 0; i < types.length; i++) { + midpoints[types[i]] = { + "left": [ dim[i].left, dim[i].centery ], + "right": [ dim[i].right, dim[i].centery ], + "top": [ dim[i].centerx, dim[i].top ], + "bottom": [ dim[i].centerx , dim[i].bottom] + }; + } + })([ "source", "target" ], [ sd, td ]); + + for (var sf = 0; sf < axes.length; sf++) { + for (var tf = 0; tf < axes.length; tf++) { + candidates.push({ + source: axes[sf], + target: axes[tf], + dist: Biltong.lineLength(midpoints.source[axes[sf]], midpoints.target[axes[tf]]) + }); + } + } + + candidates.sort(function (a, b) { + return a.dist < b.dist ? -1 : a.dist > b.dist ? 1 : 0; + }); + + // now go through this list and try to get an entry that satisfies both (there will be one, unless one of the anchors + // declares no available faces) + var sourceEdge = candidates[0].source, targetEdge = candidates[0].target; + for (var i = 0; i < candidates.length; i++) { + + if (!sourceAnchor.isContinuous || sourceAnchor.isEdgeSupported(candidates[i].source)) { + sourceEdge = candidates[i].source; + } + else { + sourceEdge = null; + } + + if (!targetAnchor.isContinuous || targetAnchor.isEdgeSupported(candidates[i].target)) { + targetEdge = candidates[i].target; + } + else { + targetEdge = null; + } + + if (sourceEdge != null && targetEdge != null) { + break; + } + } + + if (sourceAnchor.isContinuous) { + sourceAnchor.setCurrentFace(sourceEdge); + } + + if (targetAnchor.isContinuous) { + targetAnchor.setCurrentFace(targetEdge); + } + +// -------------------------------------------------------------------------------------- + + return { + a: [ sourceEdge, targetEdge ], + theta: theta, + theta2: theta2 + }; + }; + + /** + * Anchors model a position on some element at which an Endpoint may be located. They began as a first class citizen of jsPlumb, ie. a user + * was required to create these themselves, but over time this has been replaced by the concept of referring to them either by name (eg. "TopMiddle"), + * or by an array describing their coordinates (eg. [ 0, 0.5, 0, -1 ], which is the same as "TopMiddle"). jsPlumb now handles all of the + * creation of Anchors without user intervention. + */ + _jp.Anchor = function (params) { + this.x = params.x || 0; + this.y = params.y || 0; + this.elementId = params.elementId; + this.cssClass = params.cssClass || ""; + this.userDefinedLocation = null; + this.orientation = params.orientation || [ 0, 0 ]; + this.lastReturnValue = null; + this.offsets = params.offsets || [ 0, 0 ]; + this.timestamp = null; + + var relocatable = params.relocatable !== false; + this.isRelocatable = function() { return relocatable; }; + this.setRelocatable = function(_relocatable) { relocatable = _relocatable; }; + var snapOnRelocate = params.snapOnRelocate !== false; + this.isSnapOnRelocate = function() { return snapOnRelocate; }; + + var locked = false; + this.lock = function() { locked = true; }; + this.unlock = function() { locked = false; }; + this.isLocked = function() { return locked; }; + + _ju.EventGenerator.apply(this); + + this.compute = function (params) { + + var xy = params.xy, wh = params.wh, timestamp = params.timestamp; + + if (params.clearUserDefinedLocation) { + this.userDefinedLocation = null; + } + + if (timestamp && timestamp === this.timestamp) { + return this.lastReturnValue; + } + + if (this.userDefinedLocation != null) { + this.lastReturnValue = this.userDefinedLocation; + } + else { + this.lastReturnValue = [ xy[0] + (this.x * wh[0]) + this.offsets[0], xy[1] + (this.y * wh[1]) + this.offsets[1], this.x, this.y ]; + } + + this.timestamp = timestamp; + return this.lastReturnValue; + }; + + this.getCurrentLocation = function (params) { + params = params || {}; + return (this.lastReturnValue == null || (params.timestamp != null && this.timestamp !== params.timestamp)) ? this.compute(params) : this.lastReturnValue; + }; + + this.setPosition = function(x, y, ox, oy, overrideLock) { + if (!locked || overrideLock) { + this.x = x; + this.y = y; + this.orientation = [ ox, oy ]; + this.lastReturnValue = null; + } + }; + }; + _ju.extend(_jp.Anchor, _ju.EventGenerator, { + equals: function (anchor) { + if (!anchor) { + return false; + } + var ao = anchor.getOrientation(), + o = this.getOrientation(); + return this.x === anchor.x && this.y === anchor.y && this.offsets[0] === anchor.offsets[0] && this.offsets[1] === anchor.offsets[1] && o[0] === ao[0] && o[1] === ao[1]; + }, + getUserDefinedLocation: function () { + return this.userDefinedLocation; + }, + setUserDefinedLocation: function (l) { + this.userDefinedLocation = l; + }, + clearUserDefinedLocation: function () { + this.userDefinedLocation = null; + }, + getOrientation: function () { + return this.orientation; + }, + getCssClass: function () { + return this.cssClass; + } + }); + + /** + * An Anchor that floats. its orientation is computed dynamically from + * its position relative to the anchor it is floating relative to. It is used when creating + * a connection through drag and drop. + * + * TODO FloatingAnchor could totally be refactored to extend Anchor just slightly. + */ + _jp.FloatingAnchor = function (params) { + + _jp.Anchor.apply(this, arguments); + + // this is the anchor that this floating anchor is referenced to for + // purposes of calculating the orientation. + var ref = params.reference, + // the canvas this refers to. + refCanvas = params.referenceCanvas, + size = _jp.getSize(refCanvas), + // these are used to store the current relative position of our + // anchor wrt the reference anchor. they only indicate + // direction, so have a value of 1 or -1 (or, very rarely, 0). these + // values are written by the compute method, and read + // by the getOrientation method. + xDir = 0, yDir = 0, + // temporary member used to store an orientation when the floating + // anchor is hovering over another anchor. + orientation = null, + _lastResult = null; + + // clear from parent. we want floating anchor orientation to always be computed. + this.orientation = null; + + // set these to 0 each; they are used by certain types of connectors in the loopback case, + // when the connector is trying to clear the element it is on. but for floating anchor it's not + // very important. + this.x = 0; + this.y = 0; + + this.isFloating = true; + + this.compute = function (params) { + var xy = params.xy, + result = [ xy[0] + (size[0] / 2), xy[1] + (size[1] / 2) ]; // return origin of the element. we may wish to improve this so that any object can be the drag proxy. + _lastResult = result; + return result; + }; + + this.getOrientation = function (_endpoint) { + if (orientation) { + return orientation; + } + else { + var o = ref.getOrientation(_endpoint); + // here we take into account the orientation of the other + // anchor: if it declares zero for some direction, we declare zero too. this might not be the most awesome. perhaps we can come + // up with a better way. it's just so that the line we draw looks like it makes sense. maybe this wont make sense. + return [ Math.abs(o[0]) * xDir * -1, + Math.abs(o[1]) * yDir * -1 ]; + } + }; + + /** + * notification the endpoint associated with this anchor is hovering + * over another anchor; we want to assume that anchor's orientation + * for the duration of the hover. + */ + this.over = function (anchor, endpoint) { + orientation = anchor.getOrientation(endpoint); + }; + + /** + * notification the endpoint associated with this anchor is no + * longer hovering over another anchor; we should resume calculating + * orientation as we normally do. + */ + this.out = function () { + orientation = null; + }; + + this.getCurrentLocation = function (params) { + return _lastResult == null ? this.compute(params) : _lastResult; + }; + }; + _ju.extend(_jp.FloatingAnchor, _jp.Anchor); + + var _convertAnchor = function (anchor, jsPlumbInstance, elementId) { + return anchor.constructor === _jp.Anchor ? anchor : jsPlumbInstance.makeAnchor(anchor, elementId, jsPlumbInstance); + }; + + /* + * A DynamicAnchor is an Anchor that contains a list of other Anchors, which it cycles + * through at compute time to find the one that is located closest to + * the center of the target element, and returns that Anchor's compute + * method result. this causes endpoints to follow each other with + * respect to the orientation of their target elements, which is a useful + * feature for some applications. + * + */ + _jp.DynamicAnchor = function (params) { + _jp.Anchor.apply(this, arguments); + + this.isDynamic = true; + this.anchors = []; + this.elementId = params.elementId; + this.jsPlumbInstance = params.jsPlumbInstance; + + for (var i = 0; i < params.anchors.length; i++) { + this.anchors[i] = _convertAnchor(params.anchors[i], this.jsPlumbInstance, this.elementId); + } + + this.getAnchors = function () { + return this.anchors; + }; + + var _curAnchor = this.anchors.length > 0 ? this.anchors[0] : null, + _lastAnchor = _curAnchor, + self = this, + + // helper method to calculate the distance between the centers of the two elements. + _distance = function (anchor, cx, cy, xy, wh) { + var ax = xy[0] + (anchor.x * wh[0]), ay = xy[1] + (anchor.y * wh[1]), + acx = xy[0] + (wh[0] / 2), acy = xy[1] + (wh[1] / 2); + return (Math.sqrt(Math.pow(cx - ax, 2) + Math.pow(cy - ay, 2)) + + Math.sqrt(Math.pow(acx - ax, 2) + Math.pow(acy - ay, 2))); + }, + // default method uses distance between element centers. you can provide your own method in the dynamic anchor + // constructor (and also to jsPlumb.makeDynamicAnchor). the arguments to it are four arrays: + // xy - xy loc of the anchor's element + // wh - anchor's element's dimensions + // txy - xy loc of the element of the other anchor in the connection + // twh - dimensions of the element of the other anchor in the connection. + // anchors - the list of selectable anchors + _anchorSelector = params.selector || function (xy, wh, txy, twh, anchors) { + var cx = txy[0] + (twh[0] / 2), cy = txy[1] + (twh[1] / 2); + var minIdx = -1, minDist = Infinity; + for (var i = 0; i < anchors.length; i++) { + var d = _distance(anchors[i], cx, cy, xy, wh); + if (d < minDist) { + minIdx = i + 0; + minDist = d; + } + } + return anchors[minIdx]; + }; + + this.compute = function (params) { + var xy = params.xy, wh = params.wh, txy = params.txy, twh = params.twh; + + this.timestamp = params.timestamp; + + var udl = self.getUserDefinedLocation(); + if (udl != null) { + return udl; + } + + // if anchor is locked or an opposite element was not given, we + // maintain our state. anchor will be locked + // if it is the source of a drag and drop. + if (this.isLocked() || txy == null || twh == null) { + return _curAnchor.compute(params); + } + else { + params.timestamp = null; // otherwise clear this, i think. we want the anchor to compute. + } + + _curAnchor = _anchorSelector(xy, wh, txy, twh, this.anchors); + this.x = _curAnchor.x; + this.y = _curAnchor.y; + + if (_curAnchor !== _lastAnchor) { + this.fire("anchorChanged", _curAnchor); + } + + _lastAnchor = _curAnchor; + + return _curAnchor.compute(params); + }; + + this.getCurrentLocation = function (params) { + return this.getUserDefinedLocation() || (_curAnchor != null ? _curAnchor.getCurrentLocation(params) : null); + }; + + this.getOrientation = function (_endpoint) { + return _curAnchor != null ? _curAnchor.getOrientation(_endpoint) : [ 0, 0 ]; + }; + this.over = function (anchor, endpoint) { + if (_curAnchor != null) { + _curAnchor.over(anchor, endpoint); + } + }; + this.out = function () { + if (_curAnchor != null) { + _curAnchor.out(); + } + }; + + this.setAnchor = function(a) { + _curAnchor = a; + }; + + this.getCssClass = function () { + return (_curAnchor && _curAnchor.getCssClass()) || ""; + }; + + /** + * Attempt to match an anchor with the given coordinates and then set it. + * @param coords + * @returns true if matching anchor found, false otherwise. + */ + this.setAnchorCoordinates = function(coords) { + var idx = jsPlumbUtil.findWithFunction(this.anchors, function(a) { + return a.x === coords[0] && a.y === coords[1]; + }); + if (idx !== -1) { + this.setAnchor(this.anchors[idx]); + return true; + } else { + return false; + } + }; + }; + _ju.extend(_jp.DynamicAnchor, _jp.Anchor); + +// -------- basic anchors ------------------ + var _curryAnchor = function (x, y, ox, oy, type, fnInit) { + _jp.Anchors[type] = function (params) { + var a = params.jsPlumbInstance.makeAnchor([ x, y, ox, oy, 0, 0 ], params.elementId, params.jsPlumbInstance); + a.type = type; + if (fnInit) { + fnInit(a, params); + } + return a; + }; + }; + + _curryAnchor(0.5, 0, 0, -1, "TopCenter"); + _curryAnchor(0.5, 1, 0, 1, "BottomCenter"); + _curryAnchor(0, 0.5, -1, 0, "LeftMiddle"); + _curryAnchor(1, 0.5, 1, 0, "RightMiddle"); + + _curryAnchor(0.5, 0, 0, -1, "Top"); + _curryAnchor(0.5, 1, 0, 1, "Bottom"); + _curryAnchor(0, 0.5, -1, 0, "Left"); + _curryAnchor(1, 0.5, 1, 0, "Right"); + _curryAnchor(0.5, 0.5, 0, 0, "Center"); + _curryAnchor(1, 0, 0, -1, "TopRight"); + _curryAnchor(1, 1, 0, 1, "BottomRight"); + _curryAnchor(0, 0, 0, -1, "TopLeft"); + _curryAnchor(0, 1, 0, 1, "BottomLeft"); + +// ------- dynamic anchors ------------------- + + // default dynamic anchors chooses from Top, Right, Bottom, Left + _jp.Defaults.DynamicAnchors = function (params) { + return params.jsPlumbInstance.makeAnchors(["TopCenter", "RightMiddle", "BottomCenter", "LeftMiddle"], params.elementId, params.jsPlumbInstance); + }; + + // default dynamic anchors bound to name 'AutoDefault' + _jp.Anchors.AutoDefault = function (params) { + var a = params.jsPlumbInstance.makeDynamicAnchor(_jp.Defaults.DynamicAnchors(params)); + a.type = "AutoDefault"; + return a; + }; + +// ------- continuous anchors ------------------- + + var _curryContinuousAnchor = function (type, faces) { + _jp.Anchors[type] = function (params) { + var a = params.jsPlumbInstance.makeAnchor(["Continuous", { faces: faces }], params.elementId, params.jsPlumbInstance); + a.type = type; + return a; + }; + }; + + _jp.Anchors.Continuous = function (params) { + return params.jsPlumbInstance.continuousAnchorFactory.get(params); + }; + + _curryContinuousAnchor("ContinuousLeft", ["left"]); + _curryContinuousAnchor("ContinuousTop", ["top"]); + _curryContinuousAnchor("ContinuousBottom", ["bottom"]); + _curryContinuousAnchor("ContinuousRight", ["right"]); + +// ------- position assign anchors ------------------- + + // this anchor type lets you assign the position at connection time. + _curryAnchor(0, 0, 0, 0, "Assign", function (anchor, params) { + // find what to use as the "position finder". the user may have supplied a String which represents + // the id of a position finder in jsPlumb.AnchorPositionFinders, or the user may have supplied the + // position finder as a function. we find out what to use and then set it on the anchor. + var pf = params.position || "Fixed"; + anchor.positionFinder = pf.constructor === String ? params.jsPlumbInstance.AnchorPositionFinders[pf] : pf; + // always set the constructor params; the position finder might need them later (the Grid one does, + // for example) + anchor.constructorParams = params; + }); + + // these are the default anchor positions finders, which are used by the makeTarget function. supplying + // a position finder argument to that function allows you to specify where the resulting anchor will + // be located + root.jsPlumbInstance.prototype.AnchorPositionFinders = { + "Fixed": function (dp, ep, es) { + return [ (dp.left - ep.left) / es[0], (dp.top - ep.top) / es[1] ]; + }, + "Grid": function (dp, ep, es, params) { + var dx = dp.left - ep.left, dy = dp.top - ep.top, + gx = es[0] / (params.grid[0]), gy = es[1] / (params.grid[1]), + mx = Math.floor(dx / gx), my = Math.floor(dy / gy); + return [ ((mx * gx) + (gx / 2)) / es[0], ((my * gy) + (gy / 2)) / es[1] ]; + } + }; + +// ------- perimeter anchors ------------------- + + _jp.Anchors.Perimeter = function (params) { + params = params || {}; + var anchorCount = params.anchorCount || 60, + shape = params.shape; + + if (!shape) { + throw new Error("no shape supplied to Perimeter Anchor type"); + } + + var _circle = function () { + var r = 0.5, step = Math.PI * 2 / anchorCount, current = 0, a = []; + for (var i = 0; i < anchorCount; i++) { + var x = r + (r * Math.sin(current)), + y = r + (r * Math.cos(current)); + a.push([ x, y, 0, 0 ]); + current += step; + } + return a; + }, + _path = function (segments) { + var anchorsPerFace = anchorCount / segments.length, a = [], + _computeFace = function (x1, y1, x2, y2, fractionalLength, ox, oy) { + anchorsPerFace = anchorCount * fractionalLength; + var dx = (x2 - x1) / anchorsPerFace, dy = (y2 - y1) / anchorsPerFace; + for (var i = 0; i < anchorsPerFace; i++) { + a.push([ + x1 + (dx * i), + y1 + (dy * i), + ox == null ? 0 : ox, + oy == null ? 0 : oy + ]); + } + }; + + for (var i = 0; i < segments.length; i++) { + _computeFace.apply(null, segments[i]); + } + + return a; + }, + _shape = function (faces) { + var s = []; + for (var i = 0; i < faces.length; i++) { + s.push([faces[i][0], faces[i][1], faces[i][2], faces[i][3], 1 / faces.length, faces[i][4], faces[i][5]]); + } + return _path(s); + }, + _rectangle = function () { + return _shape([ + [ 0, 0, 1, 0, 0, -1 ], + [ 1, 0, 1, 1, 1, 0 ], + [ 1, 1, 0, 1, 0, 1 ], + [ 0, 1, 0, 0, -1, 0 ] + ]); + }; + + var _shapes = { + "Circle": _circle, + "Ellipse": _circle, + "Diamond": function () { + return _shape([ + [ 0.5, 0, 1, 0.5 ], + [ 1, 0.5, 0.5, 1 ], + [ 0.5, 1, 0, 0.5 ], + [ 0, 0.5, 0.5, 0 ] + ]); + }, + "Rectangle": _rectangle, + "Square": _rectangle, + "Triangle": function () { + return _shape([ + [ 0.5, 0, 1, 1 ], + [ 1, 1, 0, 1 ], + [ 0, 1, 0.5, 0] + ]); + }, + "Path": function (params) { + var points = params.points, p = [], tl = 0; + for (var i = 0; i < points.length - 1; i++) { + var l = Math.sqrt(Math.pow(points[i][2] - points[i][0]) + Math.pow(points[i][3] - points[i][1])); + tl += l; + p.push([points[i][0], points[i][1], points[i + 1][0], points[i + 1][1], l]); + } + for (var j = 0; j < p.length; j++) { + p[j][4] = p[j][4] / tl; + } + return _path(p); + } + }, + _rotate = function (points, amountInDegrees) { + var o = [], theta = amountInDegrees / 180 * Math.PI; + for (var i = 0; i < points.length; i++) { + var _x = points[i][0] - 0.5, + _y = points[i][1] - 0.5; + + o.push([ + 0.5 + ((_x * Math.cos(theta)) - (_y * Math.sin(theta))), + 0.5 + ((_x * Math.sin(theta)) + (_y * Math.cos(theta))), + points[i][2], + points[i][3] + ]); + } + return o; + }; + + if (!_shapes[shape]) { + throw new Error("Shape [" + shape + "] is unknown by Perimeter Anchor type"); + } + + var da = _shapes[shape](params); + if (params.rotation) { + da = _rotate(da, params.rotation); + } + var a = params.jsPlumbInstance.makeDynamicAnchor(da); + a.type = "Perimeter"; + return a; + }; +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the default Connectors, Endpoint and Overlay definitions. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil, _jg = root.Biltong; + + _jp.Segments = { + + /* + * Class: AbstractSegment + * A Connector is made up of 1..N Segments, each of which has a Type, such as 'Straight', 'Arc', + * 'Bezier'. This is new from 1.4.2, and gives us a lot more flexibility when drawing connections: things such + * as rounded corners for flowchart connectors, for example, or a straight line stub for Bezier connections, are + * much easier to do now. + * + * A Segment is responsible for providing coordinates for painting it, and also must be able to report its length. + * + */ + AbstractSegment: function (params) { + this.params = params; + + /** + * Function: findClosestPointOnPath + * Finds the closest point on this segment to the given [x, y], + * returning both the x and y of the point plus its distance from + * the supplied point, and its location along the length of the + * path inscribed by the segment. This implementation returns + * Infinity for distance and null values for everything else; + * subclasses are expected to override. + */ + this.findClosestPointOnPath = function (x, y) { + return { + d: Infinity, + x: null, + y: null, + l: null + }; + }; + + this.getBounds = function () { + return { + minX: Math.min(params.x1, params.x2), + minY: Math.min(params.y1, params.y2), + maxX: Math.max(params.x1, params.x2), + maxY: Math.max(params.y1, params.y2) + }; + }; + + /** + * Computes the list of points on the segment that intersect the given line. + * @method lineIntersection + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @returns {Array<[number, number]>} + */ + this.lineIntersection = function(x1, y1, x2, y2) { + return []; + }; + + /** + * Computes the list of points on the segment that intersect the box with the given origin and size. + * @method boxIntersection + * @param {number} x1 + * @param {number} y1 + * @param {number} w + * @param {number} h + * @returns {Array<[number, number]>} + */ + this.boxIntersection = function(x, y, w, h) { + var a = []; + a.push.apply(a, this.lineIntersection(x, y, x + w, y)); + a.push.apply(a, this.lineIntersection(x + w, y, x + w, y + h)); + a.push.apply(a, this.lineIntersection(x + w, y + h, x, y + h)); + a.push.apply(a, this.lineIntersection(x, y + h, x, y)); + return a; + }; + + /** + * Computes the list of points on the segment that intersect the given bounding box, which is an object of the form { x:.., y:.., w:.., h:.. }. + * @method lineIntersection + * @param {BoundingRectangle} box + * @returns {Array<[number, number]>} + */ + this.boundingBoxIntersection = function(box) { + return this.boxIntersection(box.x, box.y, box.w, box.y); + }; + }, + Straight: function (params) { + var _super = _jp.Segments.AbstractSegment.apply(this, arguments), + length, m, m2, x1, x2, y1, y2, + _recalc = function () { + length = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); + m = _jg.gradient({x: x1, y: y1}, {x: x2, y: y2}); + m2 = -1 / m; + }; + + this.type = "Straight"; + + this.getLength = function () { + return length; + }; + this.getGradient = function () { + return m; + }; + + this.getCoordinates = function () { + return { x1: x1, y1: y1, x2: x2, y2: y2 }; + }; + this.setCoordinates = function (coords) { + x1 = coords.x1; + y1 = coords.y1; + x2 = coords.x2; + y2 = coords.y2; + _recalc(); + }; + this.setCoordinates({x1: params.x1, y1: params.y1, x2: params.x2, y2: params.y2}); + + this.getBounds = function () { + return { + minX: Math.min(x1, x2), + minY: Math.min(y1, y2), + maxX: Math.max(x1, x2), + maxY: Math.max(y1, y2) + }; + }; + + /** + * returns the point on the segment's path that is 'location' along the length of the path, where 'location' is a decimal from + * 0 to 1 inclusive. for the straight line segment this is simple maths. + */ + this.pointOnPath = function (location, absolute) { + if (location === 0 && !absolute) { + return { x: x1, y: y1 }; + } + else if (location === 1 && !absolute) { + return { x: x2, y: y2 }; + } + else { + var l = absolute ? location > 0 ? location : length + location : location * length; + return _jg.pointOnLine({x: x1, y: y1}, {x: x2, y: y2}, l); + } + }; + + /** + * returns the gradient of the segment at the given point - which for us is constant. + */ + this.gradientAtPoint = function (_) { + return m; + }; + + /** + * returns the point on the segment's path that is 'distance' along the length of the path from 'location', where + * 'location' is a decimal from 0 to 1 inclusive, and 'distance' is a number of pixels. + * this hands off to jsPlumbUtil to do the maths, supplying two points and the distance. + */ + this.pointAlongPathFrom = function (location, distance, absolute) { + var p = this.pointOnPath(location, absolute), + farAwayPoint = distance <= 0 ? {x: x1, y: y1} : {x: x2, y: y2 }; + + /* + location == 1 ? { + x:x1 + ((x2 - x1) * 10), + y:y1 + ((y1 - y2) * 10) + } : + */ + + if (distance <= 0 && Math.abs(distance) > 1) { + distance *= -1; + } + + return _jg.pointOnLine(p, farAwayPoint, distance); + }; + + // is c between a and b? + var within = function (a, b, c) { + return c >= Math.min(a, b) && c <= Math.max(a, b); + }; + // find which of a and b is closest to c + var closest = function (a, b, c) { + return Math.abs(c - a) < Math.abs(c - b) ? a : b; + }; + + /** + Function: findClosestPointOnPath + Finds the closest point on this segment to [x,y]. See + notes on this method in AbstractSegment. + */ + this.findClosestPointOnPath = function (x, y) { + var out = { + d: Infinity, + x: null, + y: null, + l: null, + x1: x1, + x2: x2, + y1: y1, + y2: y2 + }; + + if (m === 0) { + out.y = y1; + out.x = within(x1, x2, x) ? x : closest(x1, x2, x); + } + else if (m === Infinity || m === -Infinity) { + out.x = x1; + out.y = within(y1, y2, y) ? y : closest(y1, y2, y); + } + else { + // closest point lies on normal from given point to this line. + var b = y1 - (m * x1), + b2 = y - (m2 * x), + // y1 = m.x1 + b and y1 = m2.x1 + b2 + // so m.x1 + b = m2.x1 + b2 + // x1(m - m2) = b2 - b + // x1 = (b2 - b) / (m - m2) + _x1 = (b2 - b) / (m - m2), + _y1 = (m * _x1) + b; + + out.x = within(x1, x2, _x1) ? _x1 : closest(x1, x2, _x1);//_x1; + out.y = within(y1, y2, _y1) ? _y1 : closest(y1, y2, _y1);//_y1; + } + + var fractionInSegment = _jg.lineLength([ out.x, out.y ], [ x1, y1 ]); + out.d = _jg.lineLength([x, y], [out.x, out.y]); + out.l = fractionInSegment / length; + return out; + }; + + var _pointLiesBetween = function(q, p1, p2) { + return (p2 > p1) ? (p1 <= q && q <= p2) : (p1 >= q && q >= p2); + }, _plb = _pointLiesBetween; + + /** + * Calculates all intersections of the given line with this segment. + * @param _x1 + * @param _y1 + * @param _x2 + * @param _y2 + * @returns {Array} + */ + this.lineIntersection = function(_x1, _y1, _x2, _y2) { + var m2 = Math.abs(_jg.gradient({x: _x1, y: _y1}, {x: _x2, y: _y2})), + m1 = Math.abs(m), + b = m1 === Infinity ? x1 : y1 - (m1 * x1), + out = [], + b2 = m2 === Infinity ? _x1 : _y1 - (m2 * _x1); + + // if lines parallel, no intersection + if (m2 !== m1) { + // perpendicular, segment horizontal + if(m2 === Infinity && m1 === 0) { + if (_plb(_x1, x1, x2) && _plb(y1, _y1, _y2)) { + out = [ _x1, y1 ]; // we return X on the incident line and Y from the segment + } + } else if(m2 === 0 && m1 === Infinity) { + // perpendicular, segment vertical + if(_plb(_y1, y1, y2) && _plb(x1, _x1, _x2)) { + out = [x1, _y1]; // we return X on the segment and Y from the incident line + } + } else { + var X, Y; + if (m2 === Infinity) { + // test line is a vertical line. where does it cross the segment? + X = _x1; + if (_plb(X, x1, x2)) { + Y = (m1 * _x1) + b; + if (_plb(Y, _y1, _y2)) { + out = [ X, Y ]; + } + } + } else if (m2 === 0) { + Y = _y1; + // test line is a horizontal line. where does it cross the segment? + if (_plb(Y, y1, y2)) { + X = (_y1 - b) / m1; + if (_plb(X, _x1, _x2)) { + out = [ X, Y ]; + } + } + } else { + // mX + b = m2X + b2 + // mX - m2X = b2 - b + // X(m - m2) = b2 - b + // X = (b2 - b) / (m - m2) + // Y = mX + b + X = (b2 - b) / (m1 - m2); + Y = (m1 * X) + b; + if(_plb(X, x1, x2) && _plb(Y, y1, y2)) { + out = [ X, Y]; + } + } + } + } + + return out; + }; + + /** + * Calculates all intersections of the given box with this segment. By default this method simply calls `lineIntersection` with each of the four + * faces of the box; subclasses can override this if they think there's a faster way to compute the entire box at once. + * @param x X position of top left corner of box + * @param y Y position of top left corner of box + * @param w width of box + * @param h height of box + * @returns {Array} + */ + this.boxIntersection = function(x, y, w, h) { + var a = []; + a.push.apply(a, this.lineIntersection(x, y, x + w, y)); + a.push.apply(a, this.lineIntersection(x + w, y, x + w, y + h)); + a.push.apply(a, this.lineIntersection(x + w, y + h, x, y + h)); + a.push.apply(a, this.lineIntersection(x, y + h, x, y)); + return a; + }; + + /** + * Calculates all intersections of the given bounding box with this segment. By default this method simply calls `lineIntersection` with each of the four + * faces of the box; subclasses can override this if they think there's a faster way to compute the entire box at once. + * @param box Bounding box, in { x:.., y:..., w:..., h:... } format. + * @returns {Array} + */ + this.boundingBoxIntersection = function(box) { + return this.boxIntersection(box.x, box.y, box.w, box.h); + }; + }, + + /* + Arc Segment. You need to supply: + + r - radius + cx - center x for the arc + cy - center y for the arc + ac - whether the arc is anticlockwise or not. default is clockwise. + + and then either: + + startAngle - startAngle for the arc. + endAngle - endAngle for the arc. + + or: + + x1 - x for start point + y1 - y for start point + x2 - x for end point + y2 - y for end point + + */ + Arc: function (params) { + var _super = _jp.Segments.AbstractSegment.apply(this, arguments), + _calcAngle = function (_x, _y) { + return _jg.theta([params.cx, params.cy], [_x, _y]); + }, + _calcAngleForLocation = function (segment, location) { + if (segment.anticlockwise) { + var sa = segment.startAngle < segment.endAngle ? segment.startAngle + TWO_PI : segment.startAngle, + s = Math.abs(sa - segment.endAngle); + return sa - (s * location); + } + else { + var ea = segment.endAngle < segment.startAngle ? segment.endAngle + TWO_PI : segment.endAngle, + ss = Math.abs(ea - segment.startAngle); + + return segment.startAngle + (ss * location); + } + }, + TWO_PI = 2 * Math.PI; + + this.radius = params.r; + this.anticlockwise = params.ac; + this.type = "Arc"; + + if (params.startAngle && params.endAngle) { + this.startAngle = params.startAngle; + this.endAngle = params.endAngle; + this.x1 = params.cx + (this.radius * Math.cos(params.startAngle)); + this.y1 = params.cy + (this.radius * Math.sin(params.startAngle)); + this.x2 = params.cx + (this.radius * Math.cos(params.endAngle)); + this.y2 = params.cy + (this.radius * Math.sin(params.endAngle)); + } + else { + this.startAngle = _calcAngle(params.x1, params.y1); + this.endAngle = _calcAngle(params.x2, params.y2); + this.x1 = params.x1; + this.y1 = params.y1; + this.x2 = params.x2; + this.y2 = params.y2; + } + + if (this.endAngle < 0) { + this.endAngle += TWO_PI; + } + if (this.startAngle < 0) { + this.startAngle += TWO_PI; + } + + // segment is used by vml + //this.segment = _jg.quadrant([this.x1, this.y1], [this.x2, this.y2]); + + // we now have startAngle and endAngle as positive numbers, meaning the + // absolute difference (|d|) between them is the sweep (s) of this arc, unless the + // arc is 'anticlockwise' in which case 's' is given by 2PI - |d|. + + var ea = this.endAngle < this.startAngle ? this.endAngle + TWO_PI : this.endAngle; + this.sweep = Math.abs(ea - this.startAngle); + if (this.anticlockwise) { + this.sweep = TWO_PI - this.sweep; + } + var circumference = 2 * Math.PI * this.radius, + frac = this.sweep / TWO_PI, + length = circumference * frac; + + this.getLength = function () { + return length; + }; + + this.getBounds = function () { + return { + minX: params.cx - params.r, + maxX: params.cx + params.r, + minY: params.cy - params.r, + maxY: params.cy + params.r + }; + }; + + var VERY_SMALL_VALUE = 0.0000000001, + gentleRound = function (n) { + var f = Math.floor(n), r = Math.ceil(n); + if (n - f < VERY_SMALL_VALUE) { + return f; + } + else if (r - n < VERY_SMALL_VALUE) { + return r; + } + return n; + }; + + /** + * returns the point on the segment's path that is 'location' along the length of the path, where 'location' is a decimal from + * 0 to 1 inclusive. + */ + this.pointOnPath = function (location, absolute) { + + if (location === 0) { + return { x: this.x1, y: this.y1, theta: this.startAngle }; + } + else if (location === 1) { + return { x: this.x2, y: this.y2, theta: this.endAngle }; + } + + if (absolute) { + location = location / length; + } + + var angle = _calcAngleForLocation(this, location), + _x = params.cx + (params.r * Math.cos(angle)), + _y = params.cy + (params.r * Math.sin(angle)); + + return { x: gentleRound(_x), y: gentleRound(_y), theta: angle }; + }; + + /** + * returns the gradient of the segment at the given point. + */ + this.gradientAtPoint = function (location, absolute) { + var p = this.pointOnPath(location, absolute); + var m = _jg.normal([ params.cx, params.cy ], [p.x, p.y ]); + if (!this.anticlockwise && (m === Infinity || m === -Infinity)) { + m *= -1; + } + return m; + }; + + this.pointAlongPathFrom = function (location, distance, absolute) { + var p = this.pointOnPath(location, absolute), + arcSpan = distance / circumference * 2 * Math.PI, + dir = this.anticlockwise ? -1 : 1, + startAngle = p.theta + (dir * arcSpan), + startX = params.cx + (this.radius * Math.cos(startAngle)), + startY = params.cy + (this.radius * Math.sin(startAngle)); + + return {x: startX, y: startY}; + }; + + // TODO: lineIntersection + }, + + Bezier: function (params) { + this.curve = [ + { x: params.x1, y: params.y1}, + { x: params.cp1x, y: params.cp1y }, + { x: params.cp2x, y: params.cp2y }, + { x: params.x2, y: params.y2 } + ]; + + var _isPoint = function(c) { + return c[0].x === c[1].x && c[0].y === c[1].y; + }; + + var _dist = function(p1, p2 ) { + return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2)); + }; + + var _compute = function(loc) { + + var EMPTY_POINT = {x:0, y:0}; + + if (loc === 0) { + return this.curve[0]; + } + + var degree = this.curve.length - 1; + + if (loc === 1) { + return this.curve[degree]; + } + + var o = this.curve; + var s = 1 - loc; + + if (degree === 0) { + return this.curve[0]; + } + + if (degree === 1) { + return { + x: s * o[0].x + loc * o[1].x, + y: s * o[0].y + loc * o[1].y + }; + } + + if (degree < 4) { + + var l = s * s, h = loc * loc, u = 0, m, g, f; + + if (degree === 2) { + o = [o[0], o[1], o[2], EMPTY_POINT]; + m = l; + g = 2 * (s * loc); + f = h; + } else if (degree === 3) { + m = l * s; + g = 3 * (l * loc); + f = 3 * (s * h); + u = loc * h; + } + + return { + x: m * o[0].x + g * o[1].x + f * o[2].x + u * o[3].x, + y: m * o[0].y + g * o[1].y + f * o[2].y + u * o[3].y + }; + } else { + return EMPTY_POINT; // not supported. + } + }.bind(this); + + var _getLUT = function(steps) { + var out = []; + steps--; + for (var n = 0; n <= steps; n++) { + out.push(_compute(n / steps)); + } + return out; + }; + + var _computeLength = function() { + + if (_isPoint(this.curve)) { + this.length = 0; + } + + var steps = 16; + var lut = _getLUT(steps); + this.length = 0; + + for (var i = 0; i < steps - 1; i++) { + var a = lut[i], b = lut[i + 1]; + this.length += _dist(a, b); + } + }.bind(this); + + var _super = _jp.Segments.AbstractSegment.apply(this, arguments); + // although this is not a strictly rigorous determination of bounds + // of a bezier curve, it works for the types of curves that this segment + // type produces. + this.bounds = { + minX: Math.min(params.x1, params.x2, params.cp1x, params.cp2x), + minY: Math.min(params.y1, params.y2, params.cp1y, params.cp2y), + maxX: Math.max(params.x1, params.x2, params.cp1x, params.cp2x), + maxY: Math.max(params.y1, params.y2, params.cp1y, params.cp2y) + }; + + this.type = "Bezier"; + + _computeLength(); + + var _translateLocation = function (_curve, location, absolute) { + if (absolute) { + location = root.jsBezier.locationAlongCurveFrom(_curve, location > 0 ? 0 : 1, location); + } + + return location; + }; + + /** + * returns the point on the segment's path that is 'location' along the length of the path, where 'location' is a decimal from + * 0 to 1 inclusive. + */ + this.pointOnPath = function (location, absolute) { + location = _translateLocation(this.curve, location, absolute); + return root.jsBezier.pointOnCurve(this.curve, location); + }; + + /** + * returns the gradient of the segment at the given point. + */ + this.gradientAtPoint = function (location, absolute) { + location = _translateLocation(this.curve, location, absolute); + return root.jsBezier.gradientAtPoint(this.curve, location); + }; + + this.pointAlongPathFrom = function (location, distance, absolute) { + location = _translateLocation(this.curve, location, absolute); + return root.jsBezier.pointAlongCurveFrom(this.curve, location, distance); + }; + + this.getLength = function () { + return this.length; + }; + + this.getBounds = function () { + return this.bounds; + }; + + this.findClosestPointOnPath = function (x, y) { + var p = root.jsBezier.nearestPointOnCurve({x:x,y:y}, this.curve); + return { + d:Math.sqrt(Math.pow(p.point.x - x, 2) + Math.pow(p.point.y - y, 2)), + x:p.point.x, + y:p.point.y, + l:1 - p.location, + s:this + }; + }; + + this.lineIntersection = function(x1, y1, x2, y2) { + return root.jsBezier.lineIntersection(x1, y1, x2, y2, this.curve); + }; + } + }; + + _jp.SegmentRenderer = { + getPath: function (segment, isFirstSegment) { + return ({ + "Straight": function (isFirstSegment) { + var d = segment.getCoordinates(); + return (isFirstSegment ? "M " + d.x1 + " " + d.y1 + " " : "") + "L " + d.x2 + " " + d.y2; + }, + "Bezier": function (isFirstSegment) { + var d = segment.params; + return (isFirstSegment ? "M " + d.x2 + " " + d.y2 + " " : "") + + "C " + d.cp2x + " " + d.cp2y + " " + d.cp1x + " " + d.cp1y + " " + d.x1 + " " + d.y1; + }, + "Arc": function (isFirstSegment) { + var d = segment.params, + laf = segment.sweep > Math.PI ? 1 : 0, + sf = segment.anticlockwise ? 0 : 1; + + return (isFirstSegment ? "M" + segment.x1 + " " + segment.y1 + " " : "") + "A " + segment.radius + " " + d.r + " 0 " + laf + "," + sf + " " + segment.x2 + " " + segment.y2; + } + })[segment.type](isFirstSegment); + } + }; + + /* + Class: UIComponent + Superclass for Connector and AbstractEndpoint. + */ + var AbstractComponent = function () { + this.resetBounds = function () { + this.bounds = { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity }; + }; + this.resetBounds(); + }; + + /* + * Class: Connector + * Superclass for all Connectors; here is where Segments are managed. This is exposed on jsPlumb just so it + * can be accessed from other files. You should not try to instantiate one of these directly. + * + * When this class is asked for a pointOnPath, or gradient etc, it must first figure out which segment to dispatch + * that request to. This is done by keeping track of the total connector length as segments are added, and also + * their cumulative ratios to the total length. Then when the right segment is found it is a simple case of dispatching + * the request to it (and adjusting 'location' so that it is relative to the beginning of that segment.) + */ + _jp.Connectors.AbstractConnector = function (params) { + + AbstractComponent.apply(this, arguments); + + var segments = [], + totalLength = 0, + segmentProportions = [], + segmentProportionalLengths = [], + stub = params.stub || 0, + sourceStub = _ju.isArray(stub) ? stub[0] : stub, + targetStub = _ju.isArray(stub) ? stub[1] : stub, + gap = params.gap || 0, + sourceGap = _ju.isArray(gap) ? gap[0] : gap, + targetGap = _ju.isArray(gap) ? gap[1] : gap, + userProvidedSegments = null, + paintInfo = null; + + this.getPathData = function() { + var p = ""; + for (var i = 0; i < segments.length; i++) { + p += _jp.SegmentRenderer.getPath(segments[i], i === 0); + p += " "; + } + return p; + }; + + /** + * Function: findSegmentForPoint + * Returns the segment that is closest to the given [x,y], + * null if nothing found. This function returns a JS + * object with: + * + * d - distance from segment + * l - proportional location in segment + * x - x point on the segment + * y - y point on the segment + * s - the segment itself. + * connectorLocation - the location on the connector of the point, expressed as a decimal between 0 and 1 inclusive. + */ + this.findSegmentForPoint = function (x, y) { + var out = { d: Infinity, s: null, x: null, y: null, l: null }; + for (var i = 0; i < segments.length; i++) { + var _s = segments[i].findClosestPointOnPath(x, y); + if (_s.d < out.d) { + out.d = _s.d; + out.l = _s.l; + out.x = _s.x; + out.y = _s.y; + out.s = segments[i]; + out.x1 = _s.x1; + out.x2 = _s.x2; + out.y1 = _s.y1; + out.y2 = _s.y2; + out.index = i; + out.connectorLocation = segmentProportions[i][0] + (_s.l * (segmentProportions[i][1] - segmentProportions[i][0])); + } + } + + return out; + }; + + this.lineIntersection = function(x1, y1, x2, y2) { + var out = []; + for (var i = 0; i < segments.length; i++) { + out.push.apply(out, segments[i].lineIntersection(x1, y1, x2, y2)); + } + return out; + }; + + this.boxIntersection = function(x, y, w, h) { + var out = []; + for (var i = 0; i < segments.length; i++) { + out.push.apply(out, segments[i].boxIntersection(x, y, w, h)); + } + return out; + }; + + this.boundingBoxIntersection = function(box) { + var out = []; + for (var i = 0; i < segments.length; i++) { + out.push.apply(out, segments[i].boundingBoxIntersection(box)); + } + return out; + }; + + var _updateSegmentProportions = function () { + var curLoc = 0; + for (var i = 0; i < segments.length; i++) { + var sl = segments[i].getLength(); + segmentProportionalLengths[i] = sl / totalLength; + segmentProportions[i] = [curLoc, (curLoc += (sl / totalLength)) ]; + } + }, + + /** + * returns [segment, proportion of travel in segment, segment index] for the segment + * that contains the point which is 'location' distance along the entire path, where + * 'location' is a decimal between 0 and 1 inclusive. in this connector type, paths + * are made up of a list of segments, each of which contributes some fraction to + * the total length. + * From 1.3.10 this also supports the 'absolute' property, which lets us specify a location + * as the absolute distance in pixels, rather than a proportion of the total path. + */ + _findSegmentForLocation = function (location, absolute) { + + var idx, i, inSegmentProportion; + + if (absolute) { + location = location > 0 ? location / totalLength : (totalLength + location) / totalLength; + } + + // if location 1 we know its the last segment + if (location === 1) { + idx = segments.length - 1; + inSegmentProportion = 1; + } else if (location === 0) { + // if location 0 we know its the first segment + inSegmentProportion = 0; + idx = 0; + } else { + + // if location >= 0.5, traverse backwards (of course not exact, who knows the segment proportions. but + // an educated guess at least) + if (location >= 0.5) { + + idx = 0; + inSegmentProportion = 0; + for (i = segmentProportions.length - 1; i > -1; i--) { + if (segmentProportions[i][1] >= location && segmentProportions[i][0] <= location) { + idx = i; + inSegmentProportion = (location - segmentProportions[i][0]) / segmentProportionalLengths[i]; + break; + } + } + + } else { + idx = segmentProportions.length - 1; + inSegmentProportion = 1; + for (i = 0; i < segmentProportions.length; i++) { + if (segmentProportions[i][1] >= location) { + idx = i; + inSegmentProportion = (location - segmentProportions[i][0]) / segmentProportionalLengths[i]; + break; + } + } + } + } + + return { segment: segments[idx], proportion: inSegmentProportion, index: idx }; + }, + _addSegment = function (conn, type, params) { + if (params.x1 === params.x2 && params.y1 === params.y2) { + return; + } + var s = new _jp.Segments[type](params); + segments.push(s); + totalLength += s.getLength(); + conn.updateBounds(s); + }, + _clearSegments = function () { + totalLength = segments.length = segmentProportions.length = segmentProportionalLengths.length = 0; + }; + + this.setSegments = function (_segs) { + userProvidedSegments = []; + totalLength = 0; + for (var i = 0; i < _segs.length; i++) { + userProvidedSegments.push(_segs[i]); + totalLength += _segs[i].getLength(); + } + }; + + this.getLength = function() { + return totalLength; + }; + + var _prepareCompute = function (params) { + this.strokeWidth = params.strokeWidth; + var segment = _jg.quadrant(params.sourcePos, params.targetPos), + swapX = params.targetPos[0] < params.sourcePos[0], + swapY = params.targetPos[1] < params.sourcePos[1], + lw = params.strokeWidth || 1, + so = params.sourceEndpoint.anchor.getOrientation(params.sourceEndpoint), + to = params.targetEndpoint.anchor.getOrientation(params.targetEndpoint), + x = swapX ? params.targetPos[0] : params.sourcePos[0], + y = swapY ? params.targetPos[1] : params.sourcePos[1], + w = Math.abs(params.targetPos[0] - params.sourcePos[0]), + h = Math.abs(params.targetPos[1] - params.sourcePos[1]); + + // if either anchor does not have an orientation set, we derive one from their relative + // positions. we fix the axis to be the one in which the two elements are further apart, and + // point each anchor at the other element. this is also used when dragging a new connection. + if (so[0] === 0 && so[1] === 0 || to[0] === 0 && to[1] === 0) { + var index = w > h ? 0 : 1, oIndex = [1, 0][index]; + so = []; + to = []; + so[index] = params.sourcePos[index] > params.targetPos[index] ? -1 : 1; + to[index] = params.sourcePos[index] > params.targetPos[index] ? 1 : -1; + so[oIndex] = 0; + to[oIndex] = 0; + } + + var sx = swapX ? w + (sourceGap * so[0]) : sourceGap * so[0], + sy = swapY ? h + (sourceGap * so[1]) : sourceGap * so[1], + tx = swapX ? targetGap * to[0] : w + (targetGap * to[0]), + ty = swapY ? targetGap * to[1] : h + (targetGap * to[1]), + oProduct = ((so[0] * to[0]) + (so[1] * to[1])); + + var result = { + sx: sx, sy: sy, tx: tx, ty: ty, lw: lw, + xSpan: Math.abs(tx - sx), + ySpan: Math.abs(ty - sy), + mx: (sx + tx) / 2, + my: (sy + ty) / 2, + so: so, to: to, x: x, y: y, w: w, h: h, + segment: segment, + startStubX: sx + (so[0] * sourceStub), + startStubY: sy + (so[1] * sourceStub), + endStubX: tx + (to[0] * targetStub), + endStubY: ty + (to[1] * targetStub), + isXGreaterThanStubTimes2: Math.abs(sx - tx) > (sourceStub + targetStub), + isYGreaterThanStubTimes2: Math.abs(sy - ty) > (sourceStub + targetStub), + opposite: oProduct === -1, + perpendicular: oProduct === 0, + orthogonal: oProduct === 1, + sourceAxis: so[0] === 0 ? "y" : "x", + points: [x, y, w, h, sx, sy, tx, ty ], + stubs:[sourceStub, targetStub] + }; + result.anchorOrientation = result.opposite ? "opposite" : result.orthogonal ? "orthogonal" : "perpendicular"; + return result; + }; + + this.getSegments = function () { + return segments; + }; + + this.updateBounds = function (segment) { + var segBounds = segment.getBounds(); + this.bounds.minX = Math.min(this.bounds.minX, segBounds.minX); + this.bounds.maxX = Math.max(this.bounds.maxX, segBounds.maxX); + this.bounds.minY = Math.min(this.bounds.minY, segBounds.minY); + this.bounds.maxY = Math.max(this.bounds.maxY, segBounds.maxY); + }; + + var dumpSegmentsToConsole = function () { + console.log("SEGMENTS:"); + for (var i = 0; i < segments.length; i++) { + console.log(segments[i].type, segments[i].getLength(), segmentProportions[i]); + } + }; + + this.pointOnPath = function (location, absolute) { + var seg = _findSegmentForLocation(location, absolute); + return seg.segment && seg.segment.pointOnPath(seg.proportion, false) || [0, 0]; + }; + + this.gradientAtPoint = function (location, absolute) { + var seg = _findSegmentForLocation(location, absolute); + return seg.segment && seg.segment.gradientAtPoint(seg.proportion, false) || 0; + }; + + this.pointAlongPathFrom = function (location, distance, absolute) { + var seg = _findSegmentForLocation(location, absolute); + // TODO what happens if this crosses to the next segment? + return seg.segment && seg.segment.pointAlongPathFrom(seg.proportion, distance, false) || [0, 0]; + }; + + this.compute = function (params) { + paintInfo = _prepareCompute.call(this, params); + + _clearSegments(); + this._compute(paintInfo, params); + this.x = paintInfo.points[0]; + this.y = paintInfo.points[1]; + this.w = paintInfo.points[2]; + this.h = paintInfo.points[3]; + this.segment = paintInfo.segment; + _updateSegmentProportions(); + }; + + return { + addSegment: _addSegment, + prepareCompute: _prepareCompute, + sourceStub: sourceStub, + targetStub: targetStub, + maxStub: Math.max(sourceStub, targetStub), + sourceGap: sourceGap, + targetGap: targetGap, + maxGap: Math.max(sourceGap, targetGap) + }; + }; + _ju.extend(_jp.Connectors.AbstractConnector, AbstractComponent); + + + // ********************************* END OF CONNECTOR TYPES ******************************************************************* + + // ********************************* ENDPOINT TYPES ******************************************************************* + + _jp.Endpoints.AbstractEndpoint = function (params) { + AbstractComponent.apply(this, arguments); + var compute = this.compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + var out = this._compute.apply(this, arguments); + this.x = out[0]; + this.y = out[1]; + this.w = out[2]; + this.h = out[3]; + this.bounds.minX = this.x; + this.bounds.minY = this.y; + this.bounds.maxX = this.x + this.w; + this.bounds.maxY = this.y + this.h; + return out; + }; + return { + compute: compute, + cssClass: params.cssClass + }; + }; + _ju.extend(_jp.Endpoints.AbstractEndpoint, AbstractComponent); + + /** + * Class: Endpoints.Dot + * A round endpoint, with default radius 10 pixels. + */ + + /** + * Function: Constructor + * + * Parameters: + * + * radius - radius of the endpoint. defaults to 10 pixels. + */ + _jp.Endpoints.Dot = function (params) { + this.type = "Dot"; + var _super = _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + params = params || {}; + this.radius = params.radius || 10; + this.defaultOffset = 0.5 * this.radius; + this.defaultInnerRadius = this.radius / 3; + + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + this.radius = endpointStyle.radius || this.radius; + var x = anchorPoint[0] - this.radius, + y = anchorPoint[1] - this.radius, + w = this.radius * 2, + h = this.radius * 2; + + if (endpointStyle.stroke) { + var lw = endpointStyle.strokeWidth || 1; + x -= lw; + y -= lw; + w += (lw * 2); + h += (lw * 2); + } + return [ x, y, w, h, this.radius ]; + }; + }; + _ju.extend(_jp.Endpoints.Dot, _jp.Endpoints.AbstractEndpoint); + + _jp.Endpoints.Rectangle = function (params) { + this.type = "Rectangle"; + var _super = _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + params = params || {}; + this.width = params.width || 20; + this.height = params.height || 20; + + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + var width = endpointStyle.width || this.width, + height = endpointStyle.height || this.height, + x = anchorPoint[0] - (width / 2), + y = anchorPoint[1] - (height / 2); + + return [ x, y, width, height]; + }; + }; + _ju.extend(_jp.Endpoints.Rectangle, _jp.Endpoints.AbstractEndpoint); + + var DOMElementEndpoint = function (params) { + _jp.jsPlumbUIComponent.apply(this, arguments); + this._jsPlumb.displayElements = []; + }; + _ju.extend(DOMElementEndpoint, _jp.jsPlumbUIComponent, { + getDisplayElements: function () { + return this._jsPlumb.displayElements; + }, + appendDisplayElement: function (el) { + this._jsPlumb.displayElements.push(el); + } + }); + + /** + * Class: Endpoints.Image + * Draws an image as the Endpoint. + */ + /** + * Function: Constructor + * + * Parameters: + * + * src - location of the image to use. + + TODO: multiple references to self. not sure quite how to get rid of them entirely. perhaps self = null in the cleanup + function will suffice + + TODO this class still might leak memory. + + */ + _jp.Endpoints.Image = function (params) { + + this.type = "Image"; + DOMElementEndpoint.apply(this, arguments); + _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + + var _onload = params.onload, + src = params.src || params.url, + clazz = params.cssClass ? " " + params.cssClass : ""; + + this._jsPlumb.img = new Image(); + this._jsPlumb.ready = false; + this._jsPlumb.initialized = false; + this._jsPlumb.deleted = false; + this._jsPlumb.widthToUse = params.width; + this._jsPlumb.heightToUse = params.height; + this._jsPlumb.endpoint = params.endpoint; + + this._jsPlumb.img.onload = function () { + if (this._jsPlumb != null) { + this._jsPlumb.ready = true; + this._jsPlumb.widthToUse = this._jsPlumb.widthToUse || this._jsPlumb.img.width; + this._jsPlumb.heightToUse = this._jsPlumb.heightToUse || this._jsPlumb.img.height; + if (_onload) { + _onload(this); + } + } + }.bind(this); + + /* + Function: setImage + Sets the Image to use in this Endpoint. + + Parameters: + img - may be a URL or an Image object + onload - optional; a callback to execute once the image has loaded. + */ + this._jsPlumb.endpoint.setImage = function (_img, onload) { + var s = _img.constructor === String ? _img : _img.src; + _onload = onload; + this._jsPlumb.img.src = s; + + if (this.canvas != null) { + this.canvas.setAttribute("src", this._jsPlumb.img.src); + } + }.bind(this); + + this._jsPlumb.endpoint.setImage(src, _onload); + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + this.anchorPoint = anchorPoint; + if (this._jsPlumb.ready) { + return [anchorPoint[0] - this._jsPlumb.widthToUse / 2, anchorPoint[1] - this._jsPlumb.heightToUse / 2, + this._jsPlumb.widthToUse, this._jsPlumb.heightToUse]; + } + else { + return [0, 0, 0, 0]; + } + }; + + this.canvas = _jp.createElement("img", { + position:"absolute", + margin:0, + padding:0, + outline:0 + }, this._jsPlumb.instance.endpointClass + clazz); + + if (this._jsPlumb.widthToUse) { + this.canvas.setAttribute("width", this._jsPlumb.widthToUse); + } + if (this._jsPlumb.heightToUse) { + this.canvas.setAttribute("height", this._jsPlumb.heightToUse); + } + this._jsPlumb.instance.appendElement(this.canvas); + + this.actuallyPaint = function (d, style, anchor) { + if (!this._jsPlumb.deleted) { + if (!this._jsPlumb.initialized) { + this.canvas.setAttribute("src", this._jsPlumb.img.src); + this.appendDisplayElement(this.canvas); + this._jsPlumb.initialized = true; + } + var x = this.anchorPoint[0] - (this._jsPlumb.widthToUse / 2), + y = this.anchorPoint[1] - (this._jsPlumb.heightToUse / 2); + _ju.sizeElement(this.canvas, x, y, this._jsPlumb.widthToUse, this._jsPlumb.heightToUse); + } + }; + + this.paint = function (style, anchor) { + if (this._jsPlumb != null) { // may have been deleted + if (this._jsPlumb.ready) { + this.actuallyPaint(style, anchor); + } + else { + root.setTimeout(function () { + this.paint(style, anchor); + }.bind(this), 200); + } + } + }; + }; + _ju.extend(_jp.Endpoints.Image, [ DOMElementEndpoint, _jp.Endpoints.AbstractEndpoint ], { + cleanup: function (force) { + if (force) { + this._jsPlumb.deleted = true; + if (this.canvas) { + this.canvas.parentNode.removeChild(this.canvas); + } + this.canvas = null; + } + } + }); + + /* + * Class: Endpoints.Blank + * An Endpoint that paints nothing (visible) on the screen. Supports cssClass and hoverClass parameters like all Endpoints. + */ + _jp.Endpoints.Blank = function (params) { + var _super = _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + this.type = "Blank"; + DOMElementEndpoint.apply(this, arguments); + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + return [anchorPoint[0], anchorPoint[1], 10, 0]; + }; + + var clazz = params.cssClass ? " " + params.cssClass : ""; + + this.canvas = _jp.createElement("div", { + display: "block", + width: "1px", + height: "1px", + background: "transparent", + position: "absolute" + }, this._jsPlumb.instance.endpointClass + clazz); + + this._jsPlumb.instance.appendElement(this.canvas); + + this.paint = function (style, anchor) { + _ju.sizeElement(this.canvas, this.x, this.y, this.w, this.h); + }; + }; + _ju.extend(_jp.Endpoints.Blank, [_jp.Endpoints.AbstractEndpoint, DOMElementEndpoint], { + cleanup: function () { + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + } + }); + + /* + * Class: Endpoints.Triangle + * A triangular Endpoint. + */ + /* + * Function: Constructor + * + * Parameters: + * + * width width of the triangle's base. defaults to 55 pixels. + * height height of the triangle from base to apex. defaults to 55 pixels. + */ + _jp.Endpoints.Triangle = function (params) { + this.type = "Triangle"; + _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + var self = this; + params = params || { }; + params.width = params.width || 55; + params.height = params.height || 55; + this.width = params.width; + this.height = params.height; + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + var width = endpointStyle.width || self.width, + height = endpointStyle.height || self.height, + x = anchorPoint[0] - (width / 2), + y = anchorPoint[1] - (height / 2); + return [ x, y, width, height ]; + }; + }; +// ********************************* END OF ENDPOINT TYPES ******************************************************************* + + +// ********************************* OVERLAY DEFINITIONS *********************************************************************** + + var AbstractOverlay = _jp.Overlays.AbstractOverlay = function (params) { + this.visible = true; + this.isAppendedAtTopLevel = true; + this.component = params.component; + this.loc = params.location == null ? 0.5 : params.location; + this.endpointLoc = params.endpointLocation == null ? [ 0.5, 0.5] : params.endpointLocation; + this.visible = params.visible !== false; + }; + AbstractOverlay.prototype = { + cleanup: function (force) { + if (force) { + this.component = null; + this.canvas = null; + this.endpointLoc = null; + } + }, + reattach:function(instance, component) { }, + setVisible: function (val) { + this.visible = val; + this.component.repaint(); + }, + isVisible: function () { + return this.visible; + }, + hide: function () { + this.setVisible(false); + }, + show: function () { + this.setVisible(true); + }, + incrementLocation: function (amount) { + this.loc += amount; + this.component.repaint(); + }, + setLocation: function (l) { + this.loc = l; + this.component.repaint(); + }, + getLocation: function () { + return this.loc; + }, + updateFrom:function() { } + }; + + + /* + * Class: Overlays.Arrow + * + * An arrow overlay, defined by four points: the head, the two sides of the tail, and a 'foldback' point at some distance along the length + * of the arrow that lines from each tail point converge into. The foldback point is defined using a decimal that indicates some fraction + * of the length of the arrow and has a default value of 0.623. A foldback point value of 1 would mean that the arrow had a straight line + * across the tail. + */ + /* + * @constructor + * + * @param {Object} params Constructor params. + * @param {Number} [params.length] Distance in pixels from head to tail baseline. default 20. + * @param {Number} [params.width] Width in pixels of the tail baseline. default 20. + * @param {String} [params.fill] Style to use when filling the arrow. defaults to "black". + * @param {String} [params.stroke] Style to use when stroking the arrow. defaults to null, which means the arrow is not stroked. + * @param {Number} [params.stroke-width] Line width to use when stroking the arrow. defaults to 1, but only used if stroke is not null. + * @param {Number} [params.foldback] Distance (as a decimal from 0 to 1 inclusive) along the length of the arrow marking the point the tail points should fold back to. defaults to 0.623. + * @param {Number} [params.location] Distance (as a decimal from 0 to 1 inclusive) marking where the arrow should sit on the connector. defaults to 0.5. + * @param {NUmber} [params.direction] Indicates the direction the arrow points in. valid values are -1 and 1; 1 is default. + */ + _jp.Overlays.Arrow = function (params) { + this.type = "Arrow"; + AbstractOverlay.apply(this, arguments); + this.isAppendedAtTopLevel = false; + params = params || {}; + var self = this; + + this.length = params.length || 20; + this.width = params.width || 20; + this.id = params.id; + this.direction = (params.direction || 1) < 0 ? -1 : 1; + var paintStyle = params.paintStyle || { "stroke-width": 1 }, + // how far along the arrow the lines folding back in come to. default is 62.3%. + foldback = params.foldback || 0.623; + + this.computeMaxSize = function () { + return self.width * 1.5; + }; + + this.elementCreated = function(p, component) { + this.path = p; + if (params.events) { + for (var i in params.events) { + _jp.on(p, i, params.events[i]); + } + } + }; + + this.draw = function (component, currentConnectionPaintStyle) { + + var hxy, mid, txy, tail, cxy; + if (component.pointAlongPathFrom) { + + if (_ju.isString(this.loc) || this.loc > 1 || this.loc < 0) { + var l = parseInt(this.loc, 10), + fromLoc = this.loc < 0 ? 1 : 0; + hxy = component.pointAlongPathFrom(fromLoc, l, false); + mid = component.pointAlongPathFrom(fromLoc, l - (this.direction * this.length / 2), false); + txy = _jg.pointOnLine(hxy, mid, this.length); + } + else if (this.loc === 1) { + hxy = component.pointOnPath(this.loc); + mid = component.pointAlongPathFrom(this.loc, -(this.length)); + txy = _jg.pointOnLine(hxy, mid, this.length); + + if (this.direction === -1) { + var _ = txy; + txy = hxy; + hxy = _; + } + } + else if (this.loc === 0) { + txy = component.pointOnPath(this.loc); + mid = component.pointAlongPathFrom(this.loc, this.length); + hxy = _jg.pointOnLine(txy, mid, this.length); + if (this.direction === -1) { + var __ = txy; + txy = hxy; + hxy = __; + } + } + else { + hxy = component.pointAlongPathFrom(this.loc, this.direction * this.length / 2); + mid = component.pointOnPath(this.loc); + txy = _jg.pointOnLine(hxy, mid, this.length); + } + + tail = _jg.perpendicularLineTo(hxy, txy, this.width); + cxy = _jg.pointOnLine(hxy, txy, foldback * this.length); + + var d = { hxy: hxy, tail: tail, cxy: cxy }, + stroke = paintStyle.stroke || currentConnectionPaintStyle.stroke, + fill = paintStyle.fill || currentConnectionPaintStyle.stroke, + lineWidth = paintStyle.strokeWidth || currentConnectionPaintStyle.strokeWidth; + + return { + component: component, + d: d, + "stroke-width": lineWidth, + stroke: stroke, + fill: fill, + minX: Math.min(hxy.x, tail[0].x, tail[1].x), + maxX: Math.max(hxy.x, tail[0].x, tail[1].x), + minY: Math.min(hxy.y, tail[0].y, tail[1].y), + maxY: Math.max(hxy.y, tail[0].y, tail[1].y) + }; + } + else { + return {component: component, minX: 0, maxX: 0, minY: 0, maxY: 0}; + } + }; + }; + _ju.extend(_jp.Overlays.Arrow, AbstractOverlay, { + updateFrom:function(d) { + this.length = d.length || this.length; + this.width = d.width|| this.width; + this.direction = d.direction != null ? d.direction : this.direction; + this.foldback = d.foldback|| this.foldback; + }, + cleanup:function() { + if (this.path && this.path.parentNode) { + this.path.parentNode.removeChild(this.path); + } + } + }); + + /* + * Class: Overlays.PlainArrow + * + * A basic arrow. This is in fact just one instance of the more generic case in which the tail folds back on itself to some + * point along the length of the arrow: in this case, that foldback point is the full length of the arrow. so it just does + * a 'call' to Arrow with foldback set appropriately. + */ + /* + * Function: Constructor + * See for allowed parameters for this overlay. + */ + _jp.Overlays.PlainArrow = function (params) { + params = params || {}; + var p = _jp.extend(params, {foldback: 1}); + _jp.Overlays.Arrow.call(this, p); + this.type = "PlainArrow"; + }; + _ju.extend(_jp.Overlays.PlainArrow, _jp.Overlays.Arrow); + + /* + * Class: Overlays.Diamond + * + * A diamond. Like PlainArrow, this is a concrete case of the more generic case of the tail points converging on some point...it just + * happens that in this case, that point is greater than the length of the the arrow. + * + * this could probably do with some help with positioning...due to the way it reuses the Arrow paint code, what Arrow thinks is the + * center is actually 1/4 of the way along for this guy. but we don't have any knowledge of pixels at this point, so we're kind of + * stuck when it comes to helping out the Arrow class. possibly we could pass in a 'transpose' parameter or something. the value + * would be -l/4 in this case - move along one quarter of the total length. + */ + /* + * Function: Constructor + * See for allowed parameters for this overlay. + */ + _jp.Overlays.Diamond = function (params) { + params = params || {}; + var l = params.length || 40, + p = _jp.extend(params, {length: l / 2, foldback: 2}); + _jp.Overlays.Arrow.call(this, p); + this.type = "Diamond"; + }; + _ju.extend(_jp.Overlays.Diamond, _jp.Overlays.Arrow); + + var _getDimensions = function (component, forceRefresh) { + if (component._jsPlumb.cachedDimensions == null || forceRefresh) { + component._jsPlumb.cachedDimensions = component.getDimensions(); + } + return component._jsPlumb.cachedDimensions; + }; + + // abstract superclass for overlays that add an element to the DOM. + var AbstractDOMOverlay = function (params) { + _jp.jsPlumbUIComponent.apply(this, arguments); + AbstractOverlay.apply(this, arguments); + + // hand off fired events to associated component. + var _f = this.fire; + this.fire = function () { + _f.apply(this, arguments); + if (this.component) { + this.component.fire.apply(this.component, arguments); + } + }; + + this.detached=false; + this.id = params.id; + this._jsPlumb.div = null; + this._jsPlumb.initialised = false; + this._jsPlumb.component = params.component; + this._jsPlumb.cachedDimensions = null; + this._jsPlumb.create = params.create; + this._jsPlumb.initiallyInvisible = params.visible === false; + + this.getElement = function () { + if (this._jsPlumb.div == null) { + var div = this._jsPlumb.div = _jp.getElement(this._jsPlumb.create(this._jsPlumb.component)); + div.style.position = "absolute"; + jsPlumb.addClass(div, this._jsPlumb.instance.overlayClass + " " + + (this.cssClass ? this.cssClass : + params.cssClass ? params.cssClass : "")); + this._jsPlumb.instance.appendElement(div); + this._jsPlumb.instance.getId(div); + this.canvas = div; + + // in IE the top left corner is what it placed at the desired location. This will not + // be fixed. IE8 is not going to be supported for much longer. + var ts = "translate(-50%, -50%)"; + div.style.webkitTransform = ts; + div.style.mozTransform = ts; + div.style.msTransform = ts; + div.style.oTransform = ts; + div.style.transform = ts; + + // write the related component into the created element + div._jsPlumb = this; + + if (params.visible === false) { + div.style.display = "none"; + } + } + return this._jsPlumb.div; + }; + + this.draw = function (component, currentConnectionPaintStyle, absolutePosition) { + var td = _getDimensions(this); + if (td != null && td.length === 2) { + var cxy = { x: 0, y: 0 }; + + // absolutePosition would have been set by a call to connection.setAbsoluteOverlayPosition. + if (absolutePosition) { + cxy = { x: absolutePosition[0], y: absolutePosition[1] }; + } + else if (component.pointOnPath) { + var loc = this.loc, absolute = false; + if (_ju.isString(this.loc) || this.loc < 0 || this.loc > 1) { + loc = parseInt(this.loc, 10); + absolute = true; + } + cxy = component.pointOnPath(loc, absolute); // a connection + } + else { + var locToUse = this.loc.constructor === Array ? this.loc : this.endpointLoc; + cxy = { x: locToUse[0] * component.w, + y: locToUse[1] * component.h }; + } + + var minx = cxy.x - (td[0] / 2), + miny = cxy.y - (td[1] / 2); + + return { + component: component, + d: { minx: minx, miny: miny, td: td, cxy: cxy }, + minX: minx, + maxX: minx + td[0], + minY: miny, + maxY: miny + td[1] + }; + } + else { + return {minX: 0, maxX: 0, minY: 0, maxY: 0}; + } + }; + }; + _ju.extend(AbstractDOMOverlay, [_jp.jsPlumbUIComponent, AbstractOverlay], { + getDimensions: function () { + return [1,1]; + }, + setVisible: function (state) { + if (this._jsPlumb.div) { + this._jsPlumb.div.style.display = state ? "block" : "none"; + // if initially invisible, dimensions are 0,0 and never get updated + if (state && this._jsPlumb.initiallyInvisible) { + _getDimensions(this, true); + this.component.repaint(); + this._jsPlumb.initiallyInvisible = false; + } + } + }, + /* + * Function: clearCachedDimensions + * Clears the cached dimensions for the label. As a performance enhancement, label dimensions are + * cached from 1.3.12 onwards. The cache is cleared when you change the label text, of course, but + * there are other reasons why the text dimensions might change - if you make a change through CSS, for + * example, you might change the font size. in that case you should explicitly call this method. + */ + clearCachedDimensions: function () { + this._jsPlumb.cachedDimensions = null; + }, + cleanup: function (force) { + if (force) { + if (this._jsPlumb.div != null) { + this._jsPlumb.div._jsPlumb = null; + this._jsPlumb.instance.removeElement(this._jsPlumb.div); + } + } + else { + // if not a forced cleanup, just detach child from parent for now. + if (this._jsPlumb && this._jsPlumb.div && this._jsPlumb.div.parentNode) { + this._jsPlumb.div.parentNode.removeChild(this._jsPlumb.div); + } + this.detached = true; + } + + }, + reattach:function(instance, component) { + if (this._jsPlumb.div != null) { + instance.getContainer().appendChild(this._jsPlumb.div); + } + this.detached = false; + }, + computeMaxSize: function () { + var td = _getDimensions(this); + return Math.max(td[0], td[1]); + }, + paint: function (p, containerExtents) { + if (!this._jsPlumb.initialised) { + this.getElement(); + p.component.appendDisplayElement(this._jsPlumb.div); + this._jsPlumb.initialised = true; + if (this.detached) { + this._jsPlumb.div.parentNode.removeChild(this._jsPlumb.div); + } + } + this._jsPlumb.div.style.left = (p.component.x + p.d.minx) + "px"; + this._jsPlumb.div.style.top = (p.component.y + p.d.miny) + "px"; + } + }); + + /* + * Class: Overlays.Custom + * A Custom overlay. You supply a 'create' function which returns some DOM element, and jsPlumb positions it. + * The 'create' function is passed a Connection or Endpoint. + */ + /* + * Function: Constructor + * + * Parameters: + * create - function for jsPlumb to call that returns a DOM element. + * location - distance (as a decimal from 0 to 1 inclusive) marking where the label should sit on the connector. defaults to 0.5. + * id - optional id to use for later retrieval of this overlay. + * + */ + _jp.Overlays.Custom = function (params) { + this.type = "Custom"; + AbstractDOMOverlay.apply(this, arguments); + }; + _ju.extend(_jp.Overlays.Custom, AbstractDOMOverlay); + + _jp.Overlays.GuideLines = function () { + var self = this; + self.length = 50; + self.strokeWidth = 5; + this.type = "GuideLines"; + AbstractOverlay.apply(this, arguments); + _jp.jsPlumbUIComponent.apply(this, arguments); + this.draw = function (connector, currentConnectionPaintStyle) { + + var head = connector.pointAlongPathFrom(self.loc, self.length / 2), + mid = connector.pointOnPath(self.loc), + tail = _jg.pointOnLine(head, mid, self.length), + tailLine = _jg.perpendicularLineTo(head, tail, 40), + headLine = _jg.perpendicularLineTo(tail, head, 20); + + return { + connector: connector, + head: head, + tail: tail, + headLine: headLine, + tailLine: tailLine, + minX: Math.min(head.x, tail.x, headLine[0].x, headLine[1].x), + minY: Math.min(head.y, tail.y, headLine[0].y, headLine[1].y), + maxX: Math.max(head.x, tail.x, headLine[0].x, headLine[1].x), + maxY: Math.max(head.y, tail.y, headLine[0].y, headLine[1].y) + }; + }; + + // this.cleanup = function() { }; // nothing to clean up for GuideLines + }; + + /* + * Class: Overlays.Label + + */ + /* + * Function: Constructor + * + * Parameters: + * cssClass - optional css class string to append to css class. This string is appended "as-is", so you can of course have multiple classes + * defined. This parameter is preferred to using labelStyle, borderWidth and borderStyle. + * label - the label to paint. May be a string or a function that returns a string. Nothing will be painted if your label is null or your + * label function returns null. empty strings _will_ be painted. + * location - distance (as a decimal from 0 to 1 inclusive) marking where the label should sit on the connector. defaults to 0.5. + * id - optional id to use for later retrieval of this overlay. + * + * + */ + _jp.Overlays.Label = function (params) { + this.labelStyle = params.labelStyle; + + var labelWidth = null, labelHeight = null, labelText = null, labelPadding = null; + this.cssClass = this.labelStyle != null ? this.labelStyle.cssClass : null; + var p = _jp.extend({ + create: function () { + return _jp.createElement("div"); + }}, params); + _jp.Overlays.Custom.call(this, p); + this.type = "Label"; + this.label = params.label || ""; + this.labelText = null; + if (this.labelStyle) { + var el = this.getElement(); + this.labelStyle.font = this.labelStyle.font || "12px sans-serif"; + el.style.font = this.labelStyle.font; + el.style.color = this.labelStyle.color || "black"; + if (this.labelStyle.fill) { + el.style.background = this.labelStyle.fill; + } + if (this.labelStyle.borderWidth > 0) { + var dStyle = this.labelStyle.borderStyle ? this.labelStyle.borderStyle : "black"; + el.style.border = this.labelStyle.borderWidth + "px solid " + dStyle; + } + if (this.labelStyle.padding) { + el.style.padding = this.labelStyle.padding; + } + } + + }; + _ju.extend(_jp.Overlays.Label, _jp.Overlays.Custom, { + cleanup: function (force) { + if (force) { + this.div = null; + this.label = null; + this.labelText = null; + this.cssClass = null; + this.labelStyle = null; + } + }, + getLabel: function () { + return this.label; + }, + /* + * Function: setLabel + * sets the label's, um, label. you would think i'd call this function + * 'setText', but you can pass either a Function or a String to this, so + * it makes more sense as 'setLabel'. This uses innerHTML on the label div, so keep + * that in mind if you need escaped HTML. + */ + setLabel: function (l) { + this.label = l; + this.labelText = null; + this.clearCachedDimensions(); + this.update(); + this.component.repaint(); + }, + getDimensions: function () { + this.update(); + return AbstractDOMOverlay.prototype.getDimensions.apply(this, arguments); + }, + update: function () { + if (typeof this.label === "function") { + var lt = this.label(this); + this.getElement().innerHTML = lt.replace(/\r\n/g, "
    "); + } + else { + if (this.labelText == null) { + this.labelText = this.label; + this.getElement().innerHTML = this.labelText.replace(/\r\n/g, "
    "); + } + } + }, + updateFrom:function(d) { + if(d.label != null){ + this.setLabel(d.label); + } + } + }); + + // ********************************* END OF OVERLAY DEFINITIONS *********************************************************************** + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * Copyright (c) 2010 - 2020 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function() { + "use strict"; + + var root = this, + _ju = root.jsPlumbUtil, + _jpi = root.jsPlumbInstance; + + var GROUP_COLLAPSED_CLASS = "jtk-group-collapsed"; + var GROUP_EXPANDED_CLASS = "jtk-group-expanded"; + var GROUP_CONTAINER_SELECTOR = "[jtk-group-content]"; + var ELEMENT_DRAGGABLE_EVENT = "elementDraggable"; + var STOP = "stop"; + var REVERT = "revert"; + var GROUP_MANAGER = "_groupManager"; + var GROUP = "_jsPlumbGroup"; + var GROUP_DRAG_SCOPE = "_jsPlumbGroupDrag"; + var EVT_CHILD_ADDED = "group:addMember"; + var EVT_CHILD_REMOVED = "group:removeMember"; + var EVT_GROUP_ADDED = "group:add"; + var EVT_GROUP_REMOVED = "group:remove"; + var EVT_EXPAND = "group:expand"; + var EVT_COLLAPSE = "group:collapse"; + var EVT_GROUP_DRAG_STOP = "groupDragStop"; + var EVT_CONNECTION_MOVED = "connectionMoved"; + var EVT_INTERNAL_CONNECTION_DETACHED = "internal.connectionDetached"; + + var CMD_REMOVE_ALL = "removeAll"; + var CMD_ORPHAN_ALL = "orphanAll"; + var CMD_SHOW = "show"; + var CMD_HIDE = "hide"; + + var GroupManager = function(_jsPlumb) { + var _managedGroups = {}, _connectionSourceMap = {}, _connectionTargetMap = {}, self = this; + + // function findGroupFor(el) { + // var c = _jsPlumb.getContainer(); + // var abort = false, g = null, child = null; + // while (!abort) { + // if (el == null || el === c) { + // abort = true; + // } else { + // if (el[GROUP]) { + // g = el[GROUP]; + // child = el; + // abort = true; + // } else { + // el = el.parentNode; + // } + // } + // } + // return g; + // } + + function isDescendant(el, parentEl) { + var c = _jsPlumb.getContainer(); + var abort = false, g = null, child = null; + while (!abort) { + if (el == null || el === c) { + return false; + } else { + if (el === parentEl) { + return true; + } else { + el = el.parentNode; + } + } + } + } + + _jsPlumb.bind("connection", function(p) { + + var sourceGroup = _jsPlumb.getGroupFor(p.source); + var targetGroup = _jsPlumb.getGroupFor(p.target); + + if (sourceGroup != null && targetGroup != null && sourceGroup === targetGroup) { + _connectionSourceMap[p.connection.id] = sourceGroup; + _connectionTargetMap[p.connection.id] = sourceGroup; + } + else { + if (sourceGroup != null) { + _ju.suggest(sourceGroup.connections.source, p.connection); + _connectionSourceMap[p.connection.id] = sourceGroup; + } + if (targetGroup != null) { + _ju.suggest(targetGroup.connections.target, p.connection); + _connectionTargetMap[p.connection.id] = targetGroup; + } + } + }); + + function _cleanupDetachedConnection(conn) { + delete conn.proxies; + var group = _connectionSourceMap[conn.id], f; + if (group != null) { + f = function(c) { return c.id === conn.id; }; + _ju.removeWithFunction(group.connections.source, f); + _ju.removeWithFunction(group.connections.target, f); + delete _connectionSourceMap[conn.id]; + } + + group = _connectionTargetMap[conn.id]; + if (group != null) { + f = function(c) { return c.id === conn.id; }; + _ju.removeWithFunction(group.connections.source, f); + _ju.removeWithFunction(group.connections.target, f); + delete _connectionTargetMap[conn.id]; + } + } + + _jsPlumb.bind(EVT_INTERNAL_CONNECTION_DETACHED, function(p) { + _cleanupDetachedConnection(p.connection); + }); + + _jsPlumb.bind(EVT_CONNECTION_MOVED, function(p) { + var connMap = p.index === 0 ? _connectionSourceMap : _connectionTargetMap; + var group = connMap[p.connection.id]; + if (group) { + var list = group.connections[p.index === 0 ? "source" : "target"]; + var idx = list.indexOf(p.connection); + if (idx !== -1) { + list.splice(idx, 1); + } + } + }); + + this.addGroup = function(group) { + _jsPlumb.addClass(group.getEl(), GROUP_EXPANDED_CLASS); + _managedGroups[group.id] = group; + group.manager = this; + _updateConnectionsForGroup(group); + _jsPlumb.fire(EVT_GROUP_ADDED, { group:group }); + }; + + this.addToGroup = function(group, el, doNotFireEvent) { + group = this.getGroup(group); + if (group) { + var groupEl = group.getEl(); + + if (el._isJsPlumbGroup) { + return; + } + var currentGroup = el._jsPlumbGroup; + // if already a member of this group, do nothing + if (currentGroup !== group) { + + _jsPlumb.removeFromDragSelection(el); + + var elpos = _jsPlumb.getOffset(el, true); + var cpos = group.collapsed ? _jsPlumb.getOffset(groupEl, true) : _jsPlumb.getOffset(group.getDragArea(), true); + + // otherwise, transfer to this group. + if (currentGroup != null) { + currentGroup.remove(el, false, doNotFireEvent, false, group); + self.updateConnectionsForGroup(currentGroup); + } + group.add(el, doNotFireEvent/*, currentGroup*/); + + var handleDroppedConnections = function (list, index) { + var oidx = index === 0 ? 1 : 0; + list.each(function (c) { + c.setVisible(false); + if (c.endpoints[oidx].element._jsPlumbGroup === group) { + c.endpoints[oidx].setVisible(false); + _expandConnection(c, oidx, group); + } + else { + c.endpoints[index].setVisible(false); + _collapseConnection(c, index, group); + } + }); + }; + + if (group.collapsed) { + handleDroppedConnections(_jsPlumb.select({source: el}), 0); + handleDroppedConnections(_jsPlumb.select({target: el}), 1); + } + + var elId = _jsPlumb.getId(el); + _jsPlumb.dragManager.setParent(el, elId, groupEl, _jsPlumb.getId(groupEl), elpos); + + var newPosition = { left: elpos.left - cpos.left, top: elpos.top - cpos.top }; + + _jsPlumb.setPosition(el, newPosition); + + _jsPlumb.dragManager.revalidateParent(el, elId, elpos); + + self.updateConnectionsForGroup(group); + + _jsPlumb.revalidate(elId); + + if (!doNotFireEvent) { + var p = {group: group, el: el, pos:newPosition}; + if (currentGroup) { + p.sourceGroup = currentGroup; + } + _jsPlumb.fire(EVT_CHILD_ADDED, p); + } + } + } + }; + + this.removeFromGroup = function(group, el, doNotFireEvent) { + group = this.getGroup(group); + if (group) { + + // if this group is currently collapsed then any proxied connections for the given el (or its descendants) need + // to be put back on their original element, and unproxied + if (group.collapsed) { + var _expandSet = function (conns, index) { + for (var i = 0; i < conns.length; i++) { + var c = conns[i]; + if (c.proxies) { + for(var j = 0; j < c.proxies.length; j++) { + if (c.proxies[j] != null) { + var proxiedElement = c.proxies[j].originalEp.element; + if (proxiedElement === el || isDescendant(proxiedElement, el)) { + _expandConnection(c, index, group); + } + } + + } + } + } + }; + + // setup proxies for sources and targets + _expandSet(group.connections.source.slice(), 0); + _expandSet(group.connections.target.slice(), 1); + } + + group.remove(el, null, doNotFireEvent); + } + }; + + this.getGroup = function(groupId) { + var group = groupId; + if (_ju.isString(groupId)) { + group = _managedGroups[groupId]; + if (group == null) { + throw new TypeError("No such group [" + groupId + "]"); + } + } + return group; + }; + + this.getGroups = function() { + var o = []; + for (var g in _managedGroups) { + o.push(_managedGroups[g]); + } + return o; + }; + + this.removeGroup = function(group, deleteMembers, manipulateDOM, doNotFireEvent) { + group = this.getGroup(group); + this.expandGroup(group, true); // this reinstates any original connections and removes all proxies, but does not fire an event. + var newPositions = group[deleteMembers ? CMD_REMOVE_ALL : CMD_ORPHAN_ALL](manipulateDOM, doNotFireEvent); + _jsPlumb.remove(group.getEl()); + delete _managedGroups[group.id]; + delete _jsPlumb._groups[group.id]; + _jsPlumb.fire(EVT_GROUP_REMOVED, { group:group }); + return newPositions; // this will be null in the case or remove, but be a map of {id->[x,y]} in the case of orphan + }; + + this.removeAllGroups = function(deleteMembers, manipulateDOM, doNotFireEvent) { + for (var g in _managedGroups) { + this.removeGroup(_managedGroups[g], deleteMembers, manipulateDOM, doNotFireEvent); + } + }; + + function _setVisible(group, state) { + + // TODO discovering the list of elements would ideally be a pluggable function. + var m = group.getEl().querySelectorAll(".jtk-managed"); + for (var i = 0; i < m.length; i++) { + _jsPlumb[state ? CMD_SHOW : CMD_HIDE](m[i], true); + } + } + + var _collapseConnection = function(c, index, group) { + + var otherEl = c.endpoints[index === 0 ? 1 : 0].element; + if (otherEl[GROUP] && (!otherEl[GROUP].shouldProxy() && otherEl[GROUP].collapsed)) { + return; + } + + var groupEl = group.getEl(), groupElId = _jsPlumb.getId(groupEl); + + _jsPlumb.proxyConnection(c, index, groupEl, groupElId, function(c, index) { return group.getEndpoint(c, index); }, function(c, index) { return group.getAnchor(c, index); }); + }; + + this.collapseGroup = function(group) { + group = this.getGroup(group); + if (group == null || group.collapsed) { + return; + } + var groupEl = group.getEl(); + + // todo remove old proxy endpoints first, just in case? + //group.proxies.length = 0; + + // hide all connections + _setVisible(group, false); + + if (group.shouldProxy()) { + // collapses all connections in a group. + var _collapseSet = function (conns, index) { + for (var i = 0; i < conns.length; i++) { + var c = conns[i]; + _collapseConnection(c, index, group); + } + }; + + // setup proxies for sources and targets + _collapseSet(group.connections.source, 0); + _collapseSet(group.connections.target, 1); + } + + group.collapsed = true; + _jsPlumb.removeClass(groupEl, GROUP_EXPANDED_CLASS); + _jsPlumb.addClass(groupEl, GROUP_COLLAPSED_CLASS); + _jsPlumb.revalidate(groupEl); + _jsPlumb.fire(EVT_COLLAPSE, { group:group }); + }; + + var _expandConnection = function(c, index, group) { + _jsPlumb.unproxyConnection(c, index, _jsPlumb.getId(group.getEl())); + }; + + this.expandGroup = function(group, doNotFireEvent) { + + group = this.getGroup(group); + + if (group == null || !group.collapsed) { + return; + } + var groupEl = group.getEl(); + + _setVisible(group, true); + + if (group.shouldProxy()) { + // expands all connections in a group. + var _expandSet = function (conns, index) { + for (var i = 0; i < conns.length; i++) { + var c = conns[i]; + _expandConnection(c, index, group); + } + }; + + // setup proxies for sources and targets + _expandSet(group.connections.source, 0); + _expandSet(group.connections.target, 1); + } + + group.collapsed = false; + _jsPlumb.addClass(groupEl, GROUP_EXPANDED_CLASS); + _jsPlumb.removeClass(groupEl, GROUP_COLLAPSED_CLASS); + _jsPlumb.revalidate(groupEl); + this.repaintGroup(group); + if (!doNotFireEvent) { + _jsPlumb.fire(EVT_EXPAND, { group: group}); + } + }; + + this.repaintGroup = function(group) { + group = this.getGroup(group); + var m = group.getMembers(); + for (var i = 0; i < m.length; i++) { + _jsPlumb.revalidate(m[i]); + } + }; + + // TODO refactor this with the code that responds to `connection` events. + function _updateConnectionsForGroup(group) { + var members = group.getMembers().slice(); + + var childMembers = []; + for (var i = 0; i < members.length; i++) { + Array.prototype.push.apply(childMembers, members[i].querySelectorAll(".jtk-managed")); + } + Array.prototype.push.apply(members, childMembers); + + var c1 = _jsPlumb.getConnections({source:members, scope:"*"}, true); + var c2 = _jsPlumb.getConnections({target:members, scope:"*"}, true); + + var processed = {}; + group.connections.source.length = 0; + group.connections.target.length = 0; + var oneSet = function(c) { + for (var i = 0; i < c.length; i++) { + if (processed[c[i].id]) { + continue; + } + processed[c[i].id] = true; + var gs = _jsPlumb.getGroupFor(c[i].source), + gt = _jsPlumb.getGroupFor(c[i].target); + + if (gs === group) { + if (gt !== group) { + group.connections.source.push(c[i]); + } + _connectionSourceMap[c[i].id] = group; + } + else if (gt === group) { + group.connections.target.push(c[i]); + _connectionTargetMap[c[i].id] = group; + } + } + }; + oneSet(c1); oneSet(c2); + } + + this.updateConnectionsForGroup = _updateConnectionsForGroup; + this.refreshAllGroups = function() { + for (var g in _managedGroups) { + _updateConnectionsForGroup(_managedGroups[g]); + _jsPlumb.dragManager.updateOffsets(_jsPlumb.getId(_managedGroups[g].getEl())); + } + }; + }; + + /** + * + * @param {jsPlumbInstance} _jsPlumb Associated jsPlumb instance. + * @param {Object} params + * @param {Element} params.el The DOM element representing the Group. + * @param {String} [params.id] Optional ID for the Group. A UUID will be assigned as the Group's ID if you do not provide one. + * @param {Boolean} [params.constrain=false] If true, child elements will not be able to be dragged outside of the Group container. + * @param {Boolean} [params.revert=true] By default, child elements revert to the container if dragged outside. You can change this by setting `revert:false`. This behaviour is also overridden if you set `orphan` or `prune`. + * @param {Boolean} [params.orphan=false] If true, child elements dropped outside of the Group container will be removed from the Group (but not from the DOM). + * @param {Boolean} [params.prune=false] If true, child elements dropped outside of the Group container will be removed from the Group and also from the DOM. + * @param {Boolean} [params.dropOverride=false] If true, a child element that has been dropped onto some other Group will not be subject to the controls imposed by `prune`, `revert` or `orphan`. + * @constructor + */ + var Group = function(_jsPlumb, params) { + var self = this; + var el = params.el; + this.getEl = function() { return el; }; + this.id = params.id || _ju.uuid(); + el._isJsPlumbGroup = true; + + var getDragArea = this.getDragArea = function() { + var da = _jsPlumb.getSelector(el, GROUP_CONTAINER_SELECTOR); + return da && da.length > 0 ? da[0] : el; + }; + + var ghost = params.ghost === true; + var constrain = ghost || (params.constrain === true); + var revert = params.revert !== false; + var orphan = params.orphan === true; + var prune = params.prune === true; + var dropOverride = params.dropOverride === true; + var proxied = params.proxied !== false; + var elements = []; + this.connections = { source:[], target:[], internal:[] }; + + // this function, and getEndpoint below, are stubs for a future setup in which we can choose endpoint + // and anchor based upon the connection and the index (source/target) of the endpoint to be proxied. + this.getAnchor = function(conn, endpointIndex) { + return params.anchor || "Continuous"; + }; + + this.getEndpoint = function(conn, endpointIndex) { + return params.endpoint || [ "Dot", { radius:10 }]; + }; + + this.collapsed = false; + if (params.draggable !== false) { + var opts = { + drag:function() { + for (var i = 0; i < elements.length; i++) { + _jsPlumb.draw(elements[i]); + } + }, + stop:function(params) { + _jsPlumb.fire(EVT_GROUP_DRAG_STOP, jsPlumb.extend(params, {group:self})); + }, + scope:GROUP_DRAG_SCOPE + }; + if (params.dragOptions) { + root.jsPlumb.extend(opts, params.dragOptions); + } + _jsPlumb.draggable(params.el, opts); + } + if (params.droppable !== false) { + _jsPlumb.droppable(params.el, { + drop:function(p) { + var el = p.drag.el; + if (el._isJsPlumbGroup) { + return; + } + var currentGroup = el._jsPlumbGroup; + if (currentGroup !== self) { + if (currentGroup != null) { + if (currentGroup.overrideDrop(el, self)) { + return; + } + } + _jsPlumb.getGroupManager().addToGroup(self, el, false); + } + + } + }); + } + var _each = function(_el, fn) { + var els = _el.nodeType == null ? _el : [ _el ]; + for (var i = 0; i < els.length; i++) { + fn(els[i]); + } + }; + + this.overrideDrop = function(_el, targetGroup) { + return dropOverride && (revert || prune || orphan); + }; + + this.add = function(_el, doNotFireEvent/*, sourceGroup*/) { + var dragArea = getDragArea(); + _each(_el, function(__el) { + + if (__el._jsPlumbGroup != null) { + if (__el._jsPlumbGroup === self) { + return; + } else { + __el._jsPlumbGroup.remove(__el, true, doNotFireEvent, false); + } + } + + __el._jsPlumbGroup = self; + elements.push(__el); + // test if draggable and add handlers if so. + if (_jsPlumb.isAlreadyDraggable(__el)) { + _bindDragHandlers(__el); + } + + if (__el.parentNode !== dragArea) { + dragArea.appendChild(__el); + } + + // if (!doNotFireEvent) { + // var p = {group: self, el: __el}; + // if (sourceGroup) { + // p.sourceGroup = sourceGroup; + // } + // //_jsPlumb.fire(EVT_CHILD_ADDED, p); + // } + }); + + _jsPlumb.getGroupManager().updateConnectionsForGroup(self); + }; + + this.remove = function(el, manipulateDOM, doNotFireEvent, doNotUpdateConnections, targetGroup) { + + _each(el, function(__el) { + if (__el._jsPlumbGroup === self) { + delete __el._jsPlumbGroup; + _ju.removeWithFunction(elements, function (e) { + return e === __el; + }); + + + if (manipulateDOM) { + try { + self.getDragArea().removeChild(__el); + } catch (e) { + jsPlumbUtil.log("Could not remove element from Group " + e); + } + } + _unbindDragHandlers(__el); + + if (!doNotFireEvent) { + var p = {group: self, el: __el}; + if (targetGroup) { + p.targetGroup = targetGroup; + } + _jsPlumb.fire(EVT_CHILD_REMOVED, p); + } + } + }); + if (!doNotUpdateConnections) { + _jsPlumb.getGroupManager().updateConnectionsForGroup(self); + } + }; + this.removeAll = function(manipulateDOM, doNotFireEvent) { + for (var i = 0, l = elements.length; i < l; i++) { + var el = elements[0]; + self.remove(el, manipulateDOM, doNotFireEvent, true); + _jsPlumb.remove(el, true); + } + elements.length = 0; + _jsPlumb.getGroupManager().updateConnectionsForGroup(self); + }; + this.orphanAll = function() { + var orphanedPositions = {}; + for (var i = 0; i < elements.length; i++) { + var newPosition = _orphan(elements[i]); + orphanedPositions[newPosition[0]] = newPosition[1]; + } + elements.length = 0; + + return orphanedPositions; + }; + this.getMembers = function() { return elements; }; + + el[GROUP] = this; + + _jsPlumb.bind(ELEMENT_DRAGGABLE_EVENT, function(dragParams) { + // if its for the current group, + if (dragParams.el._jsPlumbGroup === this) { + _bindDragHandlers(dragParams.el); + } + }.bind(this)); + + function _findParent(_el) { + return _el.offsetParent; + } + + function _isInsideParent(_el, pos) { + var p = _findParent(_el), + s = _jsPlumb.getSize(p), + ss = _jsPlumb.getSize(_el), + leftEdge = pos[0], + rightEdge = leftEdge + ss[0], + topEdge = pos[1], + bottomEdge = topEdge + ss[1]; + + return rightEdge > 0 && leftEdge < s[0] && bottomEdge > 0 && topEdge < s[1]; + } + + // + // orphaning an element means taking it out of the group and adding it to the main jsplumb container. + // we return the new calculated position from this method and the element's id. + // + function _orphan(_el) { + var id = _jsPlumb.getId(_el); + var pos = _jsPlumb.getOffset(_el); + _el.parentNode.removeChild(_el); + _jsPlumb.getContainer().appendChild(_el); + _jsPlumb.setPosition(_el, pos); + _unbindDragHandlers(_el); + _jsPlumb.dragManager.clearParent(_el, id); + return [id, pos]; + } + + // + // remove an element from the group, then either prune it from the jsplumb instance, or just orphan it. + // + function _pruneOrOrphan(p) { + + var out = []; + + function _one(el, left, top) { + var orphanedPosition = null; + if (!_isInsideParent(el, [left, top])) { + var group = el._jsPlumbGroup; + if (prune) { + _jsPlumb.remove(el); + } else { + orphanedPosition = _orphan(el); + } + + group.remove(el); + } + + return orphanedPosition; + } + + for (var i = 0; i < p.selection.length; i++) { + out.push(_one(p.selection[i][0], p.selection[i][1].left, p.selection[i][1].top)); + } + + return out.length === 1 ? out[0] : out; + + } + + // + // redraws the element + // + function _revalidate(_el) { + var id = _jsPlumb.getId(_el); + _jsPlumb.revalidate(_el); + _jsPlumb.dragManager.revalidateParent(_el, id); + } + + // + // unbind the group specific drag/revert handlers. + // + function _unbindDragHandlers(_el) { + if (!_el._katavorioDrag) { + return; + } + if (prune || orphan) { + _el._katavorioDrag.off(STOP, _pruneOrOrphan); + } + if (!prune && !orphan && revert) { + _el._katavorioDrag.off(REVERT, _revalidate); + _el._katavorioDrag.setRevert(null); + } + } + + function _bindDragHandlers(_el) { + if (!_el._katavorioDrag) { + return; + } + if (prune || orphan) { + _el._katavorioDrag.on(STOP, _pruneOrOrphan); + } + + if (constrain) { + _el._katavorioDrag.setConstrain(true); + } + + if (ghost) { + _el._katavorioDrag.setUseGhostProxy(true); + } + + if (!prune && !orphan && revert) { + _el._katavorioDrag.on(REVERT, _revalidate); + _el._katavorioDrag.setRevert(function(__el, pos) { + return !_isInsideParent(__el, pos); + }); + } + } + + this.shouldProxy = function() { + return proxied; + }; + + _jsPlumb.getGroupManager().addGroup(this); + }; + + /** + * Adds a group to the jsPlumb instance. + * @method addGroup + * @param {Object} params + * @return {Group} The newly created Group. + */ + _jpi.prototype.addGroup = function(params) { + var j = this; + j._groups = j._groups || {}; + if (j._groups[params.id] != null) { + throw new TypeError("cannot create Group [" + params.id + "]; a Group with that ID exists"); + } + if (params.el[GROUP] != null) { + throw new TypeError("cannot create Group [" + params.id + "]; the given element is already a Group"); + } + var group = new Group(j, params); + j._groups[group.id] = group; + if (params.collapsed) { + this.collapseGroup(group); + } + return group; + }; + + /** + * Add an element to a group. + * @method addToGroup + * @param {String} group Group, or ID of the group, to add the element to. + * @param {Element} el Element to add to the group. + */ + _jpi.prototype.addToGroup = function(group, el, doNotFireEvent) { + + var _one = function(_el) { + var id = this.getId(_el); + this.manage(id, _el); + this.getGroupManager().addToGroup(group, _el, doNotFireEvent); + }.bind(this); + + if (Array.isArray(el)) { + for (var i = 0; i < el.length; i++) { + _one(el[i]); + } + } else { + _one(el); + } + }; + + /** + * Remove an element from a group, and sets its DOM element to be a child of the container again. ?? + * @method removeFromGroup + * @param {String} group Group, or ID of the group, to remove the element from. + * @param {Element} el Element to add to the group. + */ + _jpi.prototype.removeFromGroup = function(group, el, doNotFireEvent) { + this.getGroupManager().removeFromGroup(group, el, doNotFireEvent); + this.getContainer().appendChild(el); + }; + + /** + * Remove a group, and optionally remove its members from the jsPlumb instance. + * @method removeGroup + * @param {String|Group} group Group to delete, or ID of Group to delete. + * @param {Boolean} [deleteMembers=false] If true, group members will be removed along with the group. Otherwise they will + * just be 'orphaned' (returned to the main container). + * @returns {Map[String, Position}} When deleteMembers is false, this method returns a map of {id->position} + */ + _jpi.prototype.removeGroup = function(group, deleteMembers, manipulateDOM, doNotFireEvent) { + return this.getGroupManager().removeGroup(group, deleteMembers, manipulateDOM, doNotFireEvent); + }; + + /** + * Remove all groups, and optionally remove their members from the jsPlumb instance. + * @method removeAllGroup + * @param {Boolean} [deleteMembers=false] If true, group members will be removed along with the groups. Otherwise they will + * just be 'orphaned' (returned to the main container). + */ + _jpi.prototype.removeAllGroups = function(deleteMembers, manipulateDOM, doNotFireEvent) { + this.getGroupManager().removeAllGroups(deleteMembers, manipulateDOM, doNotFireEvent); + }; + + /** + * Get a Group + * @method getGroup + * @param {String} groupId ID of the group to get + * @return {Group} Group with the given ID, null if not found. + */ + _jpi.prototype.getGroup = function(groupId) { + return this.getGroupManager().getGroup(groupId); + }; + + /** + * Gets all the Groups managed by the jsPlumb instance. + * @returns {Group[]} List of Groups. Empty if none. + */ + _jpi.prototype.getGroups = function() { + return this.getGroupManager().getGroups(); + }; + + /** + * Expands a group element. jsPlumb doesn't do "everything" for you here, because what it means to expand a Group + * will vary from application to application. jsPlumb does these things: + * + * - Hides any connections that are internal to the group (connections between members, and connections from member of + * the group to the group itself) + * - Proxies all connections for which the source or target is a member of the group. + * - Hides the proxied connections. + * - Adds the jtk-group-expanded class to the group's element + * - Removes the jtk-group-collapsed class from the group's element. + * + * @method expandGroup + * @param {String|Group} group Group to expand, or ID of Group to expand. + */ + _jpi.prototype.expandGroup = function(group) { + this.getGroupManager().expandGroup(group); + }; + + /** + * Collapses a group element. jsPlumb doesn't do "everything" for you here, because what it means to collapse a Group + * will vary from application to application. jsPlumb does these things: + * + * - Shows any connections that are internal to the group (connections between members, and connections from member of + * the group to the group itself) + * - Removes proxies for all connections for which the source or target is a member of the group. + * - Shows the previously proxied connections. + * - Adds the jtk-group-collapsed class to the group's element + * - Removes the jtk-group-expanded class from the group's element. + * + * @method expandGroup + * @param {String|Group} group Group to expand, or ID of Group to expand. + */ + _jpi.prototype.collapseGroup = function(groupId) { + this.getGroupManager().collapseGroup(groupId); + }; + + + _jpi.prototype.repaintGroup = function(group) { + this.getGroupManager().repaintGroup(group); + }; + + /** + * Collapses or expands a group element depending on its current state. See notes in the collapseGroup and expandGroup method. + * + * @method toggleGroup + * @param {String|Group} group Group to expand/collapse, or ID of Group to expand/collapse. + */ + _jpi.prototype.toggleGroup = function(group) { + group = this.getGroupManager().getGroup(group); + if (group != null) { + this.getGroupManager()[group.collapsed ? "expandGroup" : "collapseGroup"](group); + } + }; + + // + // lazy init a group manager for the given jsplumb instance. + // + _jpi.prototype.getGroupManager = function() { + var mgr = this[GROUP_MANAGER]; + if (mgr == null) { + mgr = this[GROUP_MANAGER] = new GroupManager(this); + } + return mgr; + }; + + _jpi.prototype.removeGroupManager = function() { + delete this[GROUP_MANAGER]; + }; + + /** + * Gets the Group that the given element belongs to, null if none. + * @method getGroupFor + * @param {String|Element} el Element, or element ID. + * @returns {Group} A Group, if found, or null. + */ + _jpi.prototype.getGroupFor = function(el) { + el = this.getElement(el); + if (el) { + var c = this.getContainer(); + var abort = false, g = null, child = null; + while (!abort) { + if (el == null || el === c) { + abort = true; + } else { + if (el[GROUP]) { + g = el[GROUP]; + child = el; + abort = true; + } else { + el = el.parentNode; + } + } + } + return g; + } + }; + +}).call(typeof window !== 'undefined' ? window : this); + + +/* + * This file contains the 'flowchart' connectors, consisting of vertical and horizontal line segments. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + var STRAIGHT = "Straight"; + var ARC = "Arc"; + + var Flowchart = function (params) { + this.type = "Flowchart"; + params = params || {}; + params.stub = params.stub == null ? 30 : params.stub; + var segments, + _super = _jp.Connectors.AbstractConnector.apply(this, arguments), + midpoint = params.midpoint == null ? 0.5 : params.midpoint, + alwaysRespectStubs = params.alwaysRespectStubs === true, + lastx = null, lasty = null, lastOrientation, + cornerRadius = params.cornerRadius != null ? params.cornerRadius : 0, + + // TODO now common between this and AbstractBezierEditor; refactor into superclass? + loopbackRadius = params.loopbackRadius || 25, + isLoopbackCurrently = false, + + sgn = function (n) { + return n < 0 ? -1 : n === 0 ? 0 : 1; + }, + segmentDirections = function(segment) { + return [ + sgn( segment[2] - segment[0] ), + sgn( segment[3] - segment[1] ) + ]; + }, + /** + * helper method to add a segment. + */ + addSegment = function (segments, x, y, paintInfo) { + if (lastx === x && lasty === y) { + return; + } + var lx = lastx == null ? paintInfo.sx : lastx, + ly = lasty == null ? paintInfo.sy : lasty, + o = lx === x ? "v" : "h"; + + lastx = x; + lasty = y; + segments.push([ lx, ly, x, y, o ]); + }, + segLength = function (s) { + return Math.sqrt(Math.pow(s[0] - s[2], 2) + Math.pow(s[1] - s[3], 2)); + }, + _cloneArray = function (a) { + var _a = []; + _a.push.apply(_a, a); + return _a; + }, + writeSegments = function (conn, segments, paintInfo) { + var current = null, next, currentDirection, nextDirection; + for (var i = 0; i < segments.length - 1; i++) { + + current = current || _cloneArray(segments[i]); + next = _cloneArray(segments[i + 1]); + + currentDirection = segmentDirections(current); + nextDirection = segmentDirections(next); + + if (cornerRadius > 0 && current[4] !== next[4]) { + + var minSegLength = Math.min(segLength(current), segLength(next)); + var radiusToUse = Math.min(cornerRadius, minSegLength / 2); + + current[2] -= currentDirection[0] * radiusToUse; + current[3] -= currentDirection[1] * radiusToUse; + next[0] += nextDirection[0] * radiusToUse; + next[1] += nextDirection[1] * radiusToUse; + + var ac = (currentDirection[1] === nextDirection[0] && nextDirection[0] === 1) || + ((currentDirection[1] === nextDirection[0] && nextDirection[0] === 0) && currentDirection[0] !== nextDirection[1]) || + (currentDirection[1] === nextDirection[0] && nextDirection[0] === -1), + sgny = next[1] > current[3] ? 1 : -1, + sgnx = next[0] > current[2] ? 1 : -1, + sgnEqual = sgny === sgnx, + cx = (sgnEqual && ac || (!sgnEqual && !ac)) ? next[0] : current[2], + cy = (sgnEqual && ac || (!sgnEqual && !ac)) ? current[3] : next[1]; + + _super.addSegment(conn, STRAIGHT, { + x1: current[0], y1: current[1], x2: current[2], y2: current[3] + }); + + _super.addSegment(conn, ARC, { + r: radiusToUse, + x1: current[2], + y1: current[3], + x2: next[0], + y2: next[1], + cx: cx, + cy: cy, + ac: ac + }); + } + else { + // dx + dy are used to adjust for line width. + var dx = (current[2] === current[0]) ? 0 : (current[2] > current[0]) ? (paintInfo.lw / 2) : -(paintInfo.lw / 2), + dy = (current[3] === current[1]) ? 0 : (current[3] > current[1]) ? (paintInfo.lw / 2) : -(paintInfo.lw / 2); + + _super.addSegment(conn, STRAIGHT, { + x1: current[0] - dx, y1: current[1] - dy, x2: current[2] + dx, y2: current[3] + dy + }); + } + current = next; + } + if (next != null) { + // last segment + _super.addSegment(conn, STRAIGHT, { + x1: next[0], y1: next[1], x2: next[2], y2: next[3] + }); + } + }; + + this._compute = function (paintInfo, params) { + + segments = []; + lastx = null; + lasty = null; + lastOrientation = null; + + var commonStubCalculator = function () { + return [paintInfo.startStubX, paintInfo.startStubY, paintInfo.endStubX, paintInfo.endStubY]; + }, + stubCalculators = { + perpendicular: commonStubCalculator, + orthogonal: commonStubCalculator, + opposite: function (axis) { + var pi = paintInfo, + idx = axis === "x" ? 0 : 1, + areInProximity = { + "x": function () { + return ( (pi.so[idx] === 1 && ( + ( (pi.startStubX > pi.endStubX) && (pi.tx > pi.startStubX) ) || + ( (pi.sx > pi.endStubX) && (pi.tx > pi.sx))))) || + + ( (pi.so[idx] === -1 && ( + ( (pi.startStubX < pi.endStubX) && (pi.tx < pi.startStubX) ) || + ( (pi.sx < pi.endStubX) && (pi.tx < pi.sx))))); + }, + "y": function () { + return ( (pi.so[idx] === 1 && ( + ( (pi.startStubY > pi.endStubY) && (pi.ty > pi.startStubY) ) || + ( (pi.sy > pi.endStubY) && (pi.ty > pi.sy))))) || + + ( (pi.so[idx] === -1 && ( + ( (pi.startStubY < pi.endStubY) && (pi.ty < pi.startStubY) ) || + ( (pi.sy < pi.endStubY) && (pi.ty < pi.sy))))); + } + }; + + if (!alwaysRespectStubs && areInProximity[axis]()) { + return { + "x": [(paintInfo.sx + paintInfo.tx) / 2, paintInfo.startStubY, (paintInfo.sx + paintInfo.tx) / 2, paintInfo.endStubY], + "y": [paintInfo.startStubX, (paintInfo.sy + paintInfo.ty) / 2, paintInfo.endStubX, (paintInfo.sy + paintInfo.ty) / 2] + }[axis]; + } + else { + return [paintInfo.startStubX, paintInfo.startStubY, paintInfo.endStubX, paintInfo.endStubY]; + } + } + }; + + // calculate Stubs. + var stubs = stubCalculators[paintInfo.anchorOrientation](paintInfo.sourceAxis), + idx = paintInfo.sourceAxis === "x" ? 0 : 1, + oidx = paintInfo.sourceAxis === "x" ? 1 : 0, + ss = stubs[idx], + oss = stubs[oidx], + es = stubs[idx + 2], + oes = stubs[oidx + 2]; + + // add the start stub segment. use stubs for loopback as it will look better, with the loop spaced + // away from the element. + addSegment(segments, stubs[0], stubs[1], paintInfo); + + // if its a loopback and we should treat it differently. + // if (false && params.sourcePos[0] === params.targetPos[0] && params.sourcePos[1] === params.targetPos[1]) { + // + // // we use loopbackRadius here, as statemachine connectors do. + // // so we go radius to the left from stubs[0], then upwards by 2*radius, to the right by 2*radius, + // // down by 2*radius, left by radius. + // addSegment(segments, stubs[0] - loopbackRadius, stubs[1], paintInfo); + // addSegment(segments, stubs[0] - loopbackRadius, stubs[1] - (2 * loopbackRadius), paintInfo); + // addSegment(segments, stubs[0] + loopbackRadius, stubs[1] - (2 * loopbackRadius), paintInfo); + // addSegment(segments, stubs[0] + loopbackRadius, stubs[1], paintInfo); + // addSegment(segments, stubs[0], stubs[1], paintInfo); + // + // } + // else { + + + var midx = paintInfo.startStubX + ((paintInfo.endStubX - paintInfo.startStubX) * midpoint), + midy = paintInfo.startStubY + ((paintInfo.endStubY - paintInfo.startStubY) * midpoint); + + var orientations = {x: [0, 1], y: [1, 0]}, + lineCalculators = { + perpendicular: function (axis) { + var pi = paintInfo, + sis = { + x: [ + [[1, 2, 3, 4], null, [2, 1, 4, 3]], + null, + [[4, 3, 2, 1], null, [3, 4, 1, 2]] + ], + y: [ + [[3, 2, 1, 4], null, [2, 3, 4, 1]], + null, + [[4, 1, 2, 3], null, [1, 4, 3, 2]] + ] + }, + stubs = { + x: [[pi.startStubX, pi.endStubX], null, [pi.endStubX, pi.startStubX]], + y: [[pi.startStubY, pi.endStubY], null, [pi.endStubY, pi.startStubY]] + }, + midLines = { + x: [[midx, pi.startStubY], [midx, pi.endStubY]], + y: [[pi.startStubX, midy], [pi.endStubX, midy]] + }, + linesToEnd = { + x: [[pi.endStubX, pi.startStubY]], + y: [[pi.startStubX, pi.endStubY]] + }, + startToEnd = { + x: [[pi.startStubX, pi.endStubY], [pi.endStubX, pi.endStubY]], + y: [[pi.endStubX, pi.startStubY], [pi.endStubX, pi.endStubY]] + }, + startToMidToEnd = { + x: [[pi.startStubX, midy], [pi.endStubX, midy], [pi.endStubX, pi.endStubY]], + y: [[midx, pi.startStubY], [midx, pi.endStubY], [pi.endStubX, pi.endStubY]] + }, + otherStubs = { + x: [pi.startStubY, pi.endStubY], + y: [pi.startStubX, pi.endStubX] + }, + soIdx = orientations[axis][0], toIdx = orientations[axis][1], + _so = pi.so[soIdx] + 1, + _to = pi.to[toIdx] + 1, + otherFlipped = (pi.to[toIdx] === -1 && (otherStubs[axis][1] < otherStubs[axis][0])) || (pi.to[toIdx] === 1 && (otherStubs[axis][1] > otherStubs[axis][0])), + stub1 = stubs[axis][_so][0], + stub2 = stubs[axis][_so][1], + segmentIndexes = sis[axis][_so][_to]; + + if (pi.segment === segmentIndexes[3] || (pi.segment === segmentIndexes[2] && otherFlipped)) { + return midLines[axis]; + } + else if (pi.segment === segmentIndexes[2] && stub2 < stub1) { + return linesToEnd[axis]; + } + else if ((pi.segment === segmentIndexes[2] && stub2 >= stub1) || (pi.segment === segmentIndexes[1] && !otherFlipped)) { + return startToMidToEnd[axis]; + } + else if (pi.segment === segmentIndexes[0] || (pi.segment === segmentIndexes[1] && otherFlipped)) { + return startToEnd[axis]; + } + }, + orthogonal: function (axis, startStub, otherStartStub, endStub, otherEndStub) { + var pi = paintInfo, + extent = { + "x": pi.so[0] === -1 ? Math.min(startStub, endStub) : Math.max(startStub, endStub), + "y": pi.so[1] === -1 ? Math.min(startStub, endStub) : Math.max(startStub, endStub) + }[axis]; + + return { + "x": [ + [extent, otherStartStub], + [extent, otherEndStub], + [endStub, otherEndStub] + ], + "y": [ + [otherStartStub, extent], + [otherEndStub, extent], + [otherEndStub, endStub] + ] + }[axis]; + }, + opposite: function (axis, ss, oss, es) { + var pi = paintInfo, + otherAxis = {"x": "y", "y": "x"}[axis], + dim = {"x": "height", "y": "width"}[axis], + comparator = pi["is" + axis.toUpperCase() + "GreaterThanStubTimes2"]; + + if (params.sourceEndpoint.elementId === params.targetEndpoint.elementId) { + var _val = oss + ((1 - params.sourceEndpoint.anchor[otherAxis]) * params.sourceInfo[dim]) + _super.maxStub; + return { + "x": [ + [ss, _val], + [es, _val] + ], + "y": [ + [_val, ss], + [_val, es] + ] + }[axis]; + + } + else if (!comparator || (pi.so[idx] === 1 && ss > es) || (pi.so[idx] === -1 && ss < es)) { + return { + "x": [ + [ss, midy], + [es, midy] + ], + "y": [ + [midx, ss], + [midx, es] + ] + }[axis]; + } + else if ((pi.so[idx] === 1 && ss < es) || (pi.so[idx] === -1 && ss > es)) { + return { + "x": [ + [midx, pi.sy], + [midx, pi.ty] + ], + "y": [ + [pi.sx, midy], + [pi.tx, midy] + ] + }[axis]; + } + } + }; + + // compute the rest of the line + var p = lineCalculators[paintInfo.anchorOrientation](paintInfo.sourceAxis, ss, oss, es, oes); + if (p) { + for (var i = 0; i < p.length; i++) { + addSegment(segments, p[i][0], p[i][1], paintInfo); + } + } + + // line to end stub + addSegment(segments, stubs[2], stubs[3], paintInfo); + + //} + + // end stub to end (common) + addSegment(segments, paintInfo.tx, paintInfo.ty, paintInfo); + + + + // write out the segments. + writeSegments(this, segments, paintInfo); + + }; + }; + + _jp.Connectors.Flowchart = Flowchart; + _ju.extend(_jp.Connectors.Flowchart, _jp.Connectors.AbstractConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the code for the Bezier connector type. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + _jp.Connectors.AbstractBezierConnector = function(params) { + params = params || {}; + var showLoopback = params.showLoopback !== false, + curviness = params.curviness || 10, + margin = params.margin || 5, + proximityLimit = params.proximityLimit || 80, + clockwise = params.orientation && params.orientation === "clockwise", + loopbackRadius = params.loopbackRadius || 25, + isLoopbackCurrently = false, + _super; + + this._compute = function (paintInfo, p) { + + var sp = p.sourcePos, + tp = p.targetPos, + _w = Math.abs(sp[0] - tp[0]), + _h = Math.abs(sp[1] - tp[1]); + + if (!showLoopback || (p.sourceEndpoint.elementId !== p.targetEndpoint.elementId)) { + isLoopbackCurrently = false; + this._computeBezier(paintInfo, p, sp, tp, _w, _h); + } else { + isLoopbackCurrently = true; + // a loopback connector. draw an arc from one anchor to the other. + var x1 = p.sourcePos[0], y1 = p.sourcePos[1] - margin, + cx = x1, cy = y1 - loopbackRadius, + // canvas sizing stuff, to ensure the whole painted area is visible. + _x = cx - loopbackRadius, + _y = cy - loopbackRadius; + + _w = 2 * loopbackRadius; + _h = 2 * loopbackRadius; + + paintInfo.points[0] = _x; + paintInfo.points[1] = _y; + paintInfo.points[2] = _w; + paintInfo.points[3] = _h; + + // ADD AN ARC SEGMENT. + _super.addSegment(this, "Arc", { + loopback: true, + x1: (x1 - _x) + 4, + y1: y1 - _y, + startAngle: 0, + endAngle: 2 * Math.PI, + r: loopbackRadius, + ac: !clockwise, + x2: (x1 - _x) - 4, + y2: y1 - _y, + cx: cx - _x, + cy: cy - _y + }); + } + }; + + _super = _jp.Connectors.AbstractConnector.apply(this, arguments); + return _super; + }; + _ju.extend(_jp.Connectors.AbstractBezierConnector, _jp.Connectors.AbstractConnector); + + var Bezier = function (params) { + params = params || {}; + this.type = "Bezier"; + + var _super = _jp.Connectors.AbstractBezierConnector.apply(this, arguments), + majorAnchor = params.curviness || 150, + minorAnchor = 10; + + this.getCurviness = function () { + return majorAnchor; + }; + + this._findControlPoint = function (point, sourceAnchorPosition, targetAnchorPosition, sourceEndpoint, targetEndpoint, soo, too) { + // determine if the two anchors are perpendicular to each other in their orientation. we swap the control + // points around if so (code could be tightened up) + var perpendicular = soo[0] !== too[0] || soo[1] === too[1], + p = []; + + if (!perpendicular) { + if (soo[0] === 0) { + p.push(sourceAnchorPosition[0] < targetAnchorPosition[0] ? point[0] + minorAnchor : point[0] - minorAnchor); + } + else { + p.push(point[0] - (majorAnchor * soo[0])); + } + + if (soo[1] === 0) { + p.push(sourceAnchorPosition[1] < targetAnchorPosition[1] ? point[1] + minorAnchor : point[1] - minorAnchor); + } + else { + p.push(point[1] + (majorAnchor * too[1])); + } + } + else { + if (too[0] === 0) { + p.push(targetAnchorPosition[0] < sourceAnchorPosition[0] ? point[0] + minorAnchor : point[0] - minorAnchor); + } + else { + p.push(point[0] + (majorAnchor * too[0])); + } + + if (too[1] === 0) { + p.push(targetAnchorPosition[1] < sourceAnchorPosition[1] ? point[1] + minorAnchor : point[1] - minorAnchor); + } + else { + p.push(point[1] + (majorAnchor * soo[1])); + } + } + + return p; + }; + + this._computeBezier = function (paintInfo, p, sp, tp, _w, _h) { + + var _CP, _CP2, + _sx = sp[0] < tp[0] ? _w : 0, + _sy = sp[1] < tp[1] ? _h : 0, + _tx = sp[0] < tp[0] ? 0 : _w, + _ty = sp[1] < tp[1] ? 0 : _h; + + _CP = this._findControlPoint([_sx, _sy], sp, tp, p.sourceEndpoint, p.targetEndpoint, paintInfo.so, paintInfo.to); + _CP2 = this._findControlPoint([_tx, _ty], tp, sp, p.targetEndpoint, p.sourceEndpoint, paintInfo.to, paintInfo.so); + + + _super.addSegment(this, "Bezier", { + x1: _sx, y1: _sy, x2: _tx, y2: _ty, + cp1x: _CP[0], cp1y: _CP[1], cp2x: _CP2[0], cp2y: _CP2[1] + }); + }; + + + }; + + _jp.Connectors.Bezier = Bezier; + _ju.extend(Bezier, _jp.Connectors.AbstractBezierConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the state machine connectors, which extend AbstractBezierConnector. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + var _segment = function (x1, y1, x2, y2) { + if (x1 <= x2 && y2 <= y1) { + return 1; + } + else if (x1 <= x2 && y1 <= y2) { + return 2; + } + else if (x2 <= x1 && y2 >= y1) { + return 3; + } + return 4; + }, + + // the control point we will use depends on the faces to which each end of the connection is assigned, specifically whether or not the + // two faces are parallel or perpendicular. if they are parallel then the control point lies on the midpoint of the axis in which they + // are parellel and varies only in the other axis; this variation is proportional to the distance that the anchor points lie from the + // center of that face. if the two faces are perpendicular then the control point is at some distance from both the midpoints; the amount and + // direction are dependent on the orientation of the two elements. 'seg', passed in to this method, tells you which segment the target element + // lies in with respect to the source: 1 is top right, 2 is bottom right, 3 is bottom left, 4 is top left. + // + // sourcePos and targetPos are arrays of info about where on the source and target each anchor is located. their contents are: + // + // 0 - absolute x + // 1 - absolute y + // 2 - proportional x in element (0 is left edge, 1 is right edge) + // 3 - proportional y in element (0 is top edge, 1 is bottom edge) + // + _findControlPoint = function (midx, midy, segment, sourceEdge, targetEdge, dx, dy, distance, proximityLimit) { + // TODO (maybe) + // - if anchor pos is 0.5, make the control point take into account the relative position of the elements. + if (distance <= proximityLimit) { + return [midx, midy]; + } + + if (segment === 1) { + if (sourceEdge[3] <= 0 && targetEdge[3] >= 1) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] >= 1 && targetEdge[2] <= 0) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + (-1 * dx) , midy + (-1 * dy) ]; + } + } + else if (segment === 2) { + if (sourceEdge[3] >= 1 && targetEdge[3] <= 0) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] >= 1 && targetEdge[2] <= 0) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + dx, midy + (-1 * dy) ]; + } + } + else if (segment === 3) { + if (sourceEdge[3] >= 1 && targetEdge[3] <= 0) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] <= 0 && targetEdge[2] >= 1) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + (-1 * dx) , midy + (-1 * dy) ]; + } + } + else if (segment === 4) { + if (sourceEdge[3] <= 0 && targetEdge[3] >= 1) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] <= 0 && targetEdge[2] >= 1) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + dx , midy + (-1 * dy) ]; + } + } + + }; + + var StateMachine = function (params) { + params = params || {}; + this.type = "StateMachine"; + + var _super = _jp.Connectors.AbstractBezierConnector.apply(this, arguments), + curviness = params.curviness || 10, + margin = params.margin || 5, + proximityLimit = params.proximityLimit || 80, + clockwise = params.orientation && params.orientation === "clockwise", + _controlPoint; + + this._computeBezier = function(paintInfo, params, sp, tp, w, h) { + var _sx = params.sourcePos[0] < params.targetPos[0] ? 0 : w, + _sy = params.sourcePos[1] < params.targetPos[1] ? 0 : h, + _tx = params.sourcePos[0] < params.targetPos[0] ? w : 0, + _ty = params.sourcePos[1] < params.targetPos[1] ? h : 0; + + // now adjust for the margin + if (params.sourcePos[2] === 0) { + _sx -= margin; + } + if (params.sourcePos[2] === 1) { + _sx += margin; + } + if (params.sourcePos[3] === 0) { + _sy -= margin; + } + if (params.sourcePos[3] === 1) { + _sy += margin; + } + if (params.targetPos[2] === 0) { + _tx -= margin; + } + if (params.targetPos[2] === 1) { + _tx += margin; + } + if (params.targetPos[3] === 0) { + _ty -= margin; + } + if (params.targetPos[3] === 1) { + _ty += margin; + } + + // + // these connectors are quadratic bezier curves, having a single control point. if both anchors + // are located at 0.5 on their respective faces, the control point is set to the midpoint and you + // get a straight line. this is also the case if the two anchors are within 'proximityLimit', since + // it seems to make good aesthetic sense to do that. outside of that, the control point is positioned + // at 'curviness' pixels away along the normal to the straight line connecting the two anchors. + // + // there may be two improvements to this. firstly, we might actually support the notion of avoiding nodes + // in the UI, or at least making a good effort at doing so. if a connection would pass underneath some node, + // for example, we might increase the distance the control point is away from the midpoint in a bid to + // steer it around that node. this will work within limits, but i think those limits would also be the likely + // limits for, once again, aesthetic good sense in the layout of a chart using these connectors. + // + // the second possible change is actually two possible changes: firstly, it is possible we should gradually + // decrease the 'curviness' as the distance between the anchors decreases; start tailing it off to 0 at some + // point (which should be configurable). secondly, we might slightly increase the 'curviness' for connectors + // with respect to how far their anchor is from the center of its respective face. this could either look cool, + // or stupid, and may indeed work only in a way that is so subtle as to have been a waste of time. + // + + var _midx = (_sx + _tx) / 2, + _midy = (_sy + _ty) / 2, + segment = _segment(_sx, _sy, _tx, _ty), + distance = Math.sqrt(Math.pow(_tx - _sx, 2) + Math.pow(_ty - _sy, 2)), + cp1x, cp2x, cp1y, cp2y; + + + // calculate the control point. this code will be where we'll put in a rudimentary element avoidance scheme; it + // will work by extending the control point to force the curve to be, um, curvier. + _controlPoint = _findControlPoint(_midx, + _midy, + segment, + params.sourcePos, + params.targetPos, + curviness, curviness, + distance, + proximityLimit); + + cp1x = _controlPoint[0]; + cp2x = _controlPoint[0]; + cp1y = _controlPoint[1]; + cp2y = _controlPoint[1]; + + _super.addSegment(this, "Bezier", { + x1: _tx, y1: _ty, x2: _sx, y2: _sy, + cp1x: cp1x, cp1y: cp1y, + cp2x: cp2x, cp2y: cp2y + }); + }; + }; + + _jp.Connectors.StateMachine = StateMachine; + _ju.extend(StateMachine, _jp.Connectors.AbstractBezierConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the 'flowchart' connectors, consisting of vertical and horizontal line segments. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + var STRAIGHT = "Straight"; + + var Straight = function (params) { + this.type = STRAIGHT; + var _super = _jp.Connectors.AbstractConnector.apply(this, arguments); + + this._compute = function (paintInfo, _) { + _super.addSegment(this, STRAIGHT, {x1: paintInfo.sx, y1: paintInfo.sy, x2: paintInfo.startStubX, y2: paintInfo.startStubY}); + _super.addSegment(this, STRAIGHT, {x1: paintInfo.startStubX, y1: paintInfo.startStubY, x2: paintInfo.endStubX, y2: paintInfo.endStubY}); + _super.addSegment(this, STRAIGHT, {x1: paintInfo.endStubX, y1: paintInfo.endStubY, x2: paintInfo.tx, y2: paintInfo.ty}); + }; + }; + + _jp.Connectors.Straight = Straight; + _ju.extend(Straight, _jp.Connectors.AbstractConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the SVG renderers. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + +// ************************** SVG utility methods ******************************************** + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + var svgAttributeMap = { + "stroke-linejoin": "stroke-linejoin", + "stroke-dashoffset": "stroke-dashoffset", + "stroke-linecap": "stroke-linecap" + }, + STROKE_DASHARRAY = "stroke-dasharray", + DASHSTYLE = "dashstyle", + LINEAR_GRADIENT = "linearGradient", + RADIAL_GRADIENT = "radialGradient", + DEFS = "defs", + FILL = "fill", + STOP = "stop", + STROKE = "stroke", + STROKE_WIDTH = "stroke-width", + STYLE = "style", + NONE = "none", + JSPLUMB_GRADIENT = "jsplumb_gradient_", + LINE_WIDTH = "strokeWidth", + ns = { + svg: "http://www.w3.org/2000/svg" + }, + _attr = function (node, attributes) { + for (var i in attributes) { + node.setAttribute(i, "" + attributes[i]); + } + }, + _node = function (name, attributes) { + attributes = attributes || {}; + attributes.version = "1.1"; + attributes.xmlns = ns.svg; + return _jp.createElementNS(ns.svg, name, null, null, attributes); + }, + _pos = function (d) { + return "position:absolute;left:" + d[0] + "px;top:" + d[1] + "px"; + }, + _clearGradient = function (parent) { + var els = parent.querySelectorAll(" defs,linearGradient,radialGradient"); + for (var i = 0; i < els.length; i++) { + els[i].parentNode.removeChild(els[i]); + } + }, + _updateGradient = function (parent, node, style, dimensions, uiComponent) { + var id = JSPLUMB_GRADIENT + uiComponent._jsPlumb.instance.idstamp(); + // first clear out any existing gradient + _clearGradient(parent); + // this checks for an 'offset' property in the gradient, and in the absence of it, assumes + // we want a linear gradient. if it's there, we create a radial gradient. + // it is possible that a more explicit means of defining the gradient type would be + // better. relying on 'offset' means that we can never have a radial gradient that uses + // some default offset, for instance. + // issue 244 suggested the 'gradientUnits' attribute; without this, straight/flowchart connectors with gradients would + // not show gradients when the line was perfectly horizontal or vertical. + var g; + if (!style.gradient.offset) { + g = _node(LINEAR_GRADIENT, {id: id, gradientUnits: "userSpaceOnUse"}); + } + else { + g = _node(RADIAL_GRADIENT, { id: id }); + } + + var defs = _node(DEFS); + parent.appendChild(defs); + defs.appendChild(g); + + // the svg radial gradient seems to treat stops in the reverse + // order to how canvas does it. so we want to keep all the maths the same, but + // iterate the actual style declarations in reverse order, if the x indexes are not in order. + for (var i = 0; i < style.gradient.stops.length; i++) { + var styleToUse = uiComponent.segment === 1 || uiComponent.segment === 2 ? i : style.gradient.stops.length - 1 - i, + stopColor = style.gradient.stops[styleToUse][1], + s = _node(STOP, {"offset": Math.floor(style.gradient.stops[i][0] * 100) + "%", "stop-color": stopColor}); + + g.appendChild(s); + } + var applyGradientTo = style.stroke ? STROKE : FILL; + node.setAttribute(applyGradientTo, "url(#" + id + ")"); + }, + _applyStyles = function (parent, node, style, dimensions, uiComponent) { + + node.setAttribute(FILL, style.fill ? style.fill : NONE); + node.setAttribute(STROKE, style.stroke ? style.stroke : NONE); + + if (style.gradient) { + _updateGradient(parent, node, style, dimensions, uiComponent); + } + else { + // make sure we clear any existing gradient + _clearGradient(parent); + node.setAttribute(STYLE, ""); + } + + if (style.strokeWidth) { + node.setAttribute(STROKE_WIDTH, style.strokeWidth); + } + + // in SVG there is a stroke-dasharray attribute we can set, and its syntax looks like + // the syntax in VML but is actually kind of nasty: values are given in the pixel + // coordinate space, whereas in VML they are multiples of the width of the stroked + // line, which makes a lot more sense. for that reason, jsPlumb is supporting both + // the native svg 'stroke-dasharray' attribute, and also the 'dashstyle' concept from + // VML, which will be the preferred method. the code below this converts a dashstyle + // attribute given in terms of stroke width into a pixel representation, by using the + // stroke's lineWidth. + if (style[DASHSTYLE] && style[LINE_WIDTH] && !style[STROKE_DASHARRAY]) { + var sep = style[DASHSTYLE].indexOf(",") === -1 ? " " : ",", + parts = style[DASHSTYLE].split(sep), + styleToUse = ""; + parts.forEach(function (p) { + styleToUse += (Math.floor(p * style.strokeWidth) + sep); + }); + node.setAttribute(STROKE_DASHARRAY, styleToUse); + } + else if (style[STROKE_DASHARRAY]) { + node.setAttribute(STROKE_DASHARRAY, style[STROKE_DASHARRAY]); + } + + // extra attributes such as join type, dash offset. + for (var i in svgAttributeMap) { + if (style[i]) { + node.setAttribute(svgAttributeMap[i], style[i]); + } + } + }, + _appendAtIndex = function (svg, path, idx) { + if (svg.childNodes.length > idx) { + svg.insertBefore(path, svg.childNodes[idx]); + } + else { + svg.appendChild(path); + } + }; + + /** + utility methods for other objects to use. + */ + _ju.svg = { + node: _node, + attr: _attr, + pos: _pos + }; + + // ************************** / SVG utility methods ******************************************** + + /* + * Base class for SVG components. + */ + var SvgComponent = function (params) { + var pointerEventsSpec = params.pointerEventsSpec || "all", renderer = {}; + + _jp.jsPlumbUIComponent.apply(this, params.originalArgs); + this.canvas = null; + this.path = null; + this.svg = null; + this.bgCanvas = null; + + var clazz = params.cssClass + " " + (params.originalArgs[0].cssClass || ""), + svgParams = { + "style": "", + "width": 0, + "height": 0, + "pointer-events": pointerEventsSpec, + "position": "absolute" + }; + + this.svg = _node("svg", svgParams); + + if (params.useDivWrapper) { + this.canvas = _jp.createElement("div", { position : "absolute" }); + _ju.sizeElement(this.canvas, 0, 0, 1, 1); + this.canvas.className = clazz; + } + else { + _attr(this.svg, { "class": clazz }); + this.canvas = this.svg; + } + + params._jsPlumb.appendElement(this.canvas, params.originalArgs[0].parent); + if (params.useDivWrapper) { + this.canvas.appendChild(this.svg); + } + + var displayElements = [ this.canvas ]; + this.getDisplayElements = function () { + return displayElements; + }; + + this.appendDisplayElement = function (el) { + displayElements.push(el); + }; + + this.paint = function (style, anchor, extents) { + if (style != null) { + + var xy = [ this.x, this.y ], wh = [ this.w, this.h ], p; + if (extents != null) { + if (extents.xmin < 0) { + xy[0] += extents.xmin; + } + if (extents.ymin < 0) { + xy[1] += extents.ymin; + } + wh[0] = extents.xmax + ((extents.xmin < 0) ? -extents.xmin : 0); + wh[1] = extents.ymax + ((extents.ymin < 0) ? -extents.ymin : 0); + } + + if (params.useDivWrapper) { + _ju.sizeElement(this.canvas, xy[0], xy[1], wh[0], wh[1]); + xy[0] = 0; + xy[1] = 0; + p = _pos([ 0, 0 ]); + } + else { + p = _pos([ xy[0], xy[1] ]); + } + + renderer.paint.apply(this, arguments); + + _attr(this.svg, { + "style": p, + "width": wh[0] || 0, + "height": wh[1] || 0 + }); + } + }; + + return { + renderer: renderer + }; + }; + + _ju.extend(SvgComponent, _jp.jsPlumbUIComponent, { + cleanup: function (force) { + if (force || this.typeId == null) { + if (this.canvas) { + this.canvas._jsPlumb = null; + } + if (this.svg) { + this.svg._jsPlumb = null; + } + if (this.bgCanvas) { + this.bgCanvas._jsPlumb = null; + } + + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + if (this.bgCanvas && this.bgCanvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + + this.svg = null; + this.canvas = null; + this.path = null; + this.group = null; + } + else { + // if not a forced cleanup, just detach from DOM for now. + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + if (this.bgCanvas && this.bgCanvas.parentNode) { + this.bgCanvas.parentNode.removeChild(this.bgCanvas); + } + } + }, + reattach:function(instance) { + var c = instance.getContainer(); + if (this.canvas && this.canvas.parentNode == null) { + c.appendChild(this.canvas); + } + if (this.bgCanvas && this.bgCanvas.parentNode == null) { + c.appendChild(this.bgCanvas); + } + }, + setVisible: function (v) { + if (this.canvas) { + this.canvas.style.display = v ? "block" : "none"; + } + } + }); + + /* + * Base class for SVG connectors. + */ + _jp.ConnectorRenderers.svg = function (params) { + var self = this, + _super = SvgComponent.apply(this, [ + { + cssClass: params._jsPlumb.connectorClass, + originalArgs: arguments, + pointerEventsSpec: "none", + _jsPlumb: params._jsPlumb + } + ]); + + _super.renderer.paint = function (style, anchor, extents) { + + var segments = self.getSegments(), p = "", offset = [0, 0]; + if (extents.xmin < 0) { + offset[0] = -extents.xmin; + } + if (extents.ymin < 0) { + offset[1] = -extents.ymin; + } + + if (segments.length > 0) { + + p = self.getPathData(); + + var a = { + d: p, + transform: "translate(" + offset[0] + "," + offset[1] + ")", + "pointer-events": params["pointer-events"] || "visibleStroke" + }, + outlineStyle = null, + d = [self.x, self.y, self.w, self.h]; + + // outline style. actually means drawing an svg object underneath the main one. + if (style.outlineStroke) { + var outlineWidth = style.outlineWidth || 1, + outlineStrokeWidth = style.strokeWidth + (2 * outlineWidth); + outlineStyle = _jp.extend({}, style); + delete outlineStyle.gradient; + outlineStyle.stroke = style.outlineStroke; + outlineStyle.strokeWidth = outlineStrokeWidth; + + if (self.bgPath == null) { + self.bgPath = _node("path", a); + _jp.addClass(self.bgPath, _jp.connectorOutlineClass); + _appendAtIndex(self.svg, self.bgPath, 0); + } + else { + _attr(self.bgPath, a); + } + + _applyStyles(self.svg, self.bgPath, outlineStyle, d, self); + } + + if (self.path == null) { + self.path = _node("path", a); + _appendAtIndex(self.svg, self.path, style.outlineStroke ? 1 : 0); + } + else { + _attr(self.path, a); + } + + _applyStyles(self.svg, self.path, style, d, self); + } + }; + }; + _ju.extend(_jp.ConnectorRenderers.svg, SvgComponent); + +// ******************************* svg segment renderer ***************************************************** + + +// ******************************* /svg segments ***************************************************** + + /* + * Base class for SVG endpoints. + */ + var SvgEndpoint = _jp.SvgEndpoint = function (params) { + var _super = SvgComponent.apply(this, [ + { + cssClass: params._jsPlumb.endpointClass, + originalArgs: arguments, + pointerEventsSpec: "all", + useDivWrapper: true, + _jsPlumb: params._jsPlumb + } + ]); + + _super.renderer.paint = function (style) { + var s = _jp.extend({}, style); + if (s.outlineStroke) { + s.stroke = s.outlineStroke; + } + + if (this.node == null) { + this.node = this.makeNode(s); + this.svg.appendChild(this.node); + } + else if (this.updateNode != null) { + this.updateNode(this.node); + } + _applyStyles(this.svg, this.node, s, [ this.x, this.y, this.w, this.h ], this); + _pos(this.node, [ this.x, this.y ]); + }.bind(this); + + }; + _ju.extend(SvgEndpoint, SvgComponent); + + /* + * SVG Dot Endpoint + */ + _jp.Endpoints.svg.Dot = function () { + _jp.Endpoints.Dot.apply(this, arguments); + SvgEndpoint.apply(this, arguments); + this.makeNode = function (style) { + return _node("circle", { + "cx": this.w / 2, + "cy": this.h / 2, + "r": this.radius + }); + }; + this.updateNode = function (node) { + _attr(node, { + "cx": this.w / 2, + "cy": this.h / 2, + "r": this.radius + }); + }; + }; + _ju.extend(_jp.Endpoints.svg.Dot, [_jp.Endpoints.Dot, SvgEndpoint]); + + /* + * SVG Rectangle Endpoint + */ + _jp.Endpoints.svg.Rectangle = function () { + _jp.Endpoints.Rectangle.apply(this, arguments); + SvgEndpoint.apply(this, arguments); + this.makeNode = function (style) { + return _node("rect", { + "width": this.w, + "height": this.h + }); + }; + this.updateNode = function (node) { + _attr(node, { + "width": this.w, + "height": this.h + }); + }; + }; + _ju.extend(_jp.Endpoints.svg.Rectangle, [_jp.Endpoints.Rectangle, SvgEndpoint]); + + /* + * SVG Image Endpoint is the default image endpoint. + */ + _jp.Endpoints.svg.Image = _jp.Endpoints.Image; + /* + * Blank endpoint in svg renderer is the default Blank endpoint. + */ + _jp.Endpoints.svg.Blank = _jp.Endpoints.Blank; + /* + * Label overlay in svg renderer is the default Label overlay. + */ + _jp.Overlays.svg.Label = _jp.Overlays.Label; + /* + * Custom overlay in svg renderer is the default Custom overlay. + */ + _jp.Overlays.svg.Custom = _jp.Overlays.Custom; + + var AbstractSvgArrowOverlay = function (superclass, originalArgs) { + superclass.apply(this, originalArgs); + _jp.jsPlumbUIComponent.apply(this, originalArgs); + this.isAppendedAtTopLevel = false; + var self = this; + this.path = null; + this.paint = function (params, containerExtents) { + // only draws on connections, not endpoints. + if (params.component.svg && containerExtents) { + if (this.path == null) { + this.path = _node("path", { + "pointer-events": "all" + }); + params.component.svg.appendChild(this.path); + if (this.elementCreated) { + this.elementCreated(this.path, params.component); + } + + this.canvas = params.component.svg; // for the sake of completeness; this behaves the same as other overlays + } + var clazz = originalArgs && (originalArgs.length === 1) ? (originalArgs[0].cssClass || "") : "", + offset = [0, 0]; + + if (containerExtents.xmin < 0) { + offset[0] = -containerExtents.xmin; + } + if (containerExtents.ymin < 0) { + offset[1] = -containerExtents.ymin; + } + + _attr(this.path, { + "d": makePath(params.d), + "class": clazz, + stroke: params.stroke ? params.stroke : null, + fill: params.fill ? params.fill : null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + } + }; + var makePath = function (d) { + return (isNaN(d.cxy.x) || isNaN(d.cxy.y)) ? "" : "M" + d.hxy.x + "," + d.hxy.y + + " L" + d.tail[0].x + "," + d.tail[0].y + + " L" + d.cxy.x + "," + d.cxy.y + + " L" + d.tail[1].x + "," + d.tail[1].y + + " L" + d.hxy.x + "," + d.hxy.y; + }; + this.transfer = function(target) { + if (target.canvas && this.path && this.path.parentNode) { + this.path.parentNode.removeChild(this.path); + target.canvas.appendChild(this.path); + } + }; + }; + + var svgProtoFunctions = { + cleanup : function (force) { + if (this.path != null) { + if (force) { + this._jsPlumb.instance.removeElement(this.path); + } + else { + if (this.path.parentNode) { + this.path.parentNode.removeChild(this.path); + } + } + } + }, reattach :function(instance, component) { + if (this.path && component.canvas) { + component.canvas.appendChild(this.path); + } + }, + setVisible : function (v) { + if (this.path != null) { + (this.path.style.display = (v ? "block" : "none")); + } + } + }; + + _ju.extend(AbstractSvgArrowOverlay, [_jp.jsPlumbUIComponent, _jp.Overlays.AbstractOverlay]); + + _jp.Overlays.svg.Arrow = function () { + AbstractSvgArrowOverlay.apply(this, [_jp.Overlays.Arrow, arguments]); + }; + _ju.extend(_jp.Overlays.svg.Arrow, [ _jp.Overlays.Arrow, AbstractSvgArrowOverlay ], svgProtoFunctions); + + _jp.Overlays.svg.PlainArrow = function () { + AbstractSvgArrowOverlay.apply(this, [_jp.Overlays.PlainArrow, arguments]); + }; + _ju.extend(_jp.Overlays.svg.PlainArrow, [ _jp.Overlays.PlainArrow, AbstractSvgArrowOverlay ], svgProtoFunctions); + + _jp.Overlays.svg.Diamond = function () { + AbstractSvgArrowOverlay.apply(this, [_jp.Overlays.Diamond, arguments]); + }; + _ju.extend(_jp.Overlays.svg.Diamond, [ _jp.Overlays.Diamond, AbstractSvgArrowOverlay ], svgProtoFunctions); + + // a test + _jp.Overlays.svg.GuideLines = function () { + var path = null, self = this, p1_1, p1_2; + _jp.Overlays.GuideLines.apply(this, arguments); + this.paint = function (params, containerExtents) { + if (path == null) { + path = _node("path"); + params.connector.svg.appendChild(path); + self.attachListeners(path, params.connector); + self.attachListeners(path, self); + + p1_1 = _node("path"); + params.connector.svg.appendChild(p1_1); + self.attachListeners(p1_1, params.connector); + self.attachListeners(p1_1, self); + + p1_2 = _node("path"); + params.connector.svg.appendChild(p1_2); + self.attachListeners(p1_2, params.connector); + self.attachListeners(p1_2, self); + } + + var offset = [0, 0]; + if (containerExtents.xmin < 0) { + offset[0] = -containerExtents.xmin; + } + if (containerExtents.ymin < 0) { + offset[1] = -containerExtents.ymin; + } + + _attr(path, { + "d": makePath(params.head, params.tail), + stroke: "red", + fill: null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + + _attr(p1_1, { + "d": makePath(params.tailLine[0], params.tailLine[1]), + stroke: "blue", + fill: null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + + _attr(p1_2, { + "d": makePath(params.headLine[0], params.headLine[1]), + stroke: "green", + fill: null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + }; + + var makePath = function (d1, d2) { + return "M " + d1.x + "," + d1.y + + " L" + d2.x + "," + d2.y; + }; + }; + _ju.extend(_jp.Overlays.svg.GuideLines, _jp.Overlays.GuideLines); +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains code used when jsPlumb is being rendered in a DOM. + * + * Copyright (c) 2010 - 2019 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil, + _jk = root.Katavorio, _jg = root.Biltong; + + var _getEventManager = function(instance) { + var e = instance._mottle; + if (!e) { + e = instance._mottle = new root.Mottle(); + } + return e; + }; + + var _getDragManager = function (instance, category) { + + category = category || "main"; + var key = "_katavorio_" + category; + var k = instance[key], + e = instance.getEventManager(); + + if (!k) { + k = new _jk({ + bind: e.on, + unbind: e.off, + getSize: _jp.getSize, + getConstrainingRectangle:function(el) { + return [ el.parentNode.scrollWidth, el.parentNode.scrollHeight ]; + }, + getPosition: function (el, relativeToRoot) { + // if this is a nested draggable then compute the offset against its own offsetParent, otherwise + // compute against the Container's origin. see also the getUIPosition method below. + var o = instance.getOffset(el, relativeToRoot, el._katavorioDrag ? el.offsetParent : null); + return [o.left, o.top]; + }, + setPosition: function (el, xy) { + el.style.left = xy[0] + "px"; + el.style.top = xy[1] + "px"; + }, + addClass: _jp.addClass, + removeClass: _jp.removeClass, + intersects: _jg.intersects, + indexOf: function(l, i) { return l.indexOf(i); }, + scope:instance.getDefaultScope(), + css: { + noSelect: instance.dragSelectClass, + droppable: "jtk-droppable", + draggable: "jtk-draggable", + drag: "jtk-drag", + selected: "jtk-drag-selected", + active: "jtk-drag-active", + hover: "jtk-drag-hover", + ghostProxy:"jtk-ghost-proxy" + } + }); + k.setZoom(instance.getZoom()); + instance[key] = k; + instance.bind("zoom", k.setZoom); + } + return k; + }; + + var _dragStart=function(params) { + var options = params.el._jsPlumbDragOptions; + var cont = true; + if (options.canDrag) { + cont = options.canDrag(); + } + if (cont) { + this.setHoverSuspended(true); + this.select({source: params.el}).addClass(this.elementDraggingClass + " " + this.sourceElementDraggingClass, true); + this.select({target: params.el}).addClass(this.elementDraggingClass + " " + this.targetElementDraggingClass, true); + this.setConnectionBeingDragged(true); + } + return cont; + }; + var _dragMove=function(params) { + var ui = this.getUIPosition(arguments, this.getZoom()); + if (ui != null) { + var o = params.el._jsPlumbDragOptions; + this.draw(params.el, ui, null, true); + if (o._dragging) { + this.addClass(params.el, "jtk-dragged"); + } + o._dragging = true; + } + }; + var _dragStop=function(params) { + var elements = params.selection, uip; + + var _one = function (_e) { + if (_e[1] != null) { + // run the reported offset through the code that takes parent containers + // into account, to adjust if necessary (issue 554) + uip = this.getUIPosition([{ + el:_e[2].el, + pos:[_e[1].left, _e[1].top] + }]); + this.draw(_e[2].el, uip); + } + + if (_e[0]._jsPlumbDragOptions != null) { + delete _e[0]._jsPlumbDragOptions._dragging; + } + + this.removeClass(_e[0], "jtk-dragged"); + this.select({source: _e[2].el}).removeClass(this.elementDraggingClass + " " + this.sourceElementDraggingClass, true); + this.select({target: _e[2].el}).removeClass(this.elementDraggingClass + " " + this.targetElementDraggingClass, true); + this.getDragManager().dragEnded(_e[2].el); + }.bind(this); + + for (var i = 0; i < elements.length; i++) { + _one(elements[i]); + } + + this.setHoverSuspended(false); + this.setConnectionBeingDragged(false); + }; + + var _animProps = function (o, p) { + var _one = function (pName) { + if (p[pName] != null) { + if (_ju.isString(p[pName])) { + var m = p[pName].match(/-=/) ? -1 : 1, + v = p[pName].substring(2); + return o[pName] + (m * v); + } + else { + return p[pName]; + } + } + else { + return o[pName]; + } + }; + return [ _one("left"), _one("top") ]; + }; + + var _genLoc = function (prefix, e) { + if (e == null) { + return [ 0, 0 ]; + } + var ts = _touches(e), t = _getTouch(ts, 0); + return [t[prefix + "X"], t[prefix + "Y"]]; + }, + _pageLocation = _genLoc.bind(this, "page"), + _screenLocation = _genLoc.bind(this, "screen"), + _clientLocation = _genLoc.bind(this, "client"), + _getTouch = function (touches, idx) { + return touches.item ? touches.item(idx) : touches[idx]; + }, + _touches = function (e) { + return e.touches && e.touches.length > 0 ? e.touches : + e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches : + e.targetTouches && e.targetTouches.length > 0 ? e.targetTouches : + [ e ]; + }; + + /** + Manages dragging for some instance of jsPlumb. + + TODO instead of this being accessed directly, it should subscribe to events on the jsPlumb instance: every method + in here is called directly by jsPlumb. But what should happen is that we have unpublished events that this listens + to. The only trick is getting one of these instantiated with every jsPlumb instance: it needs to have a hook somehow. + Basically the general idea is to pull ALL the drag code out (prototype method registrations plus this) into a + dedicated drag script), that does not necessarily need to be included. + + + */ + var DragManager = function (_currentInstance) { + var _draggables = {}, _dlist = [], _delements = {}, _elementsWithEndpoints = {}, + // elementids mapped to the draggable to which they belong. + _draggablesForElements = {}; + + /** + register some element as draggable. right now the drag init stuff is done elsewhere, and it is + possible that will continue to be the case. + */ + this.register = function (el) { + var id = _currentInstance.getId(el), + parentOffset; + + if (!_draggables[id]) { + _draggables[id] = el; + _dlist.push(el); + _delements[id] = {}; + } + + // look for child elements that have endpoints and register them against this draggable. + var _oneLevel = function (p) { + if (p) { + for (var i = 0; i < p.childNodes.length; i++) { + if (p.childNodes[i].nodeType !== 3 && p.childNodes[i].nodeType !== 8) { + var cEl = jsPlumb.getElement(p.childNodes[i]), + cid = _currentInstance.getId(p.childNodes[i], null, true); + if (cid && _elementsWithEndpoints[cid] && _elementsWithEndpoints[cid] > 0) { + if (!parentOffset) { + parentOffset = _currentInstance.getOffset(el); + } + var cOff = _currentInstance.getOffset(cEl); + _delements[id][cid] = { + id: cid, + offset: { + left: cOff.left - parentOffset.left, + top: cOff.top - parentOffset.top + } + }; + _draggablesForElements[cid] = id; + } + _oneLevel(p.childNodes[i]); + } + } + } + }; + + _oneLevel(el); + }; + + // refresh the offsets for child elements of this element. + this.updateOffsets = function (elId, childOffsetOverrides) { + if (elId != null) { + childOffsetOverrides = childOffsetOverrides || {}; + var domEl = jsPlumb.getElement(elId), + id = _currentInstance.getId(domEl), + children = _delements[id], + parentOffset; + + if (children) { + for (var i in children) { + if (children.hasOwnProperty(i)) { + var cel = jsPlumb.getElement(i), + cOff = childOffsetOverrides[i] || _currentInstance.getOffset(cel); + + // do not update if we have a value already and we'd just be writing 0,0 + if (cel.offsetParent == null && _delements[id][i] != null) { + continue; + } + + if (!parentOffset) { + parentOffset = _currentInstance.getOffset(domEl); + } + + _delements[id][i] = { + id: i, + offset: { + left: cOff.left - parentOffset.left, + top: cOff.top - parentOffset.top + } + }; + _draggablesForElements[i] = id; + } + } + } + } + }; + + /** + notification that an endpoint was added to the given el. we go up from that el's parent + node, looking for a parent that has been registered as a draggable. if we find one, we add this + el to that parent's list of elements to update on drag (if it is not there already) + */ + this.endpointAdded = function (el, id) { + + id = id || _currentInstance.getId(el); + + var b = document.body, + p = el.parentNode; + + _elementsWithEndpoints[id] = _elementsWithEndpoints[id] ? _elementsWithEndpoints[id] + 1 : 1; + + while (p != null && p !== b) { + var pid = _currentInstance.getId(p, null, true); + if (pid && _draggables[pid]) { + var pLoc = _currentInstance.getOffset(p); + + if (_delements[pid][id] == null) { + var cLoc = _currentInstance.getOffset(el); + _delements[pid][id] = { + id: id, + offset: { + left: cLoc.left - pLoc.left, + top: cLoc.top - pLoc.top + } + }; + _draggablesForElements[id] = pid; + } + break; + } + p = p.parentNode; + } + }; + + this.endpointDeleted = function (endpoint) { + if (_elementsWithEndpoints[endpoint.elementId]) { + _elementsWithEndpoints[endpoint.elementId]--; + if (_elementsWithEndpoints[endpoint.elementId] <= 0) { + for (var i in _delements) { + if (_delements.hasOwnProperty(i) && _delements[i]) { + delete _delements[i][endpoint.elementId]; + delete _draggablesForElements[endpoint.elementId]; + } + } + } + } + }; + + this.changeId = function (oldId, newId) { + _delements[newId] = _delements[oldId]; + _delements[oldId] = {}; + _draggablesForElements[newId] = _draggablesForElements[oldId]; + _draggablesForElements[oldId] = null; + }; + + this.getElementsForDraggable = function (id) { + return _delements[id]; + }; + + this.elementRemoved = function (elementId) { + var elId = _draggablesForElements[elementId]; + if (elId) { + delete _delements[elId][elementId]; + delete _draggablesForElements[elementId]; + } + }; + + this.reset = function () { + _draggables = {}; + _dlist = []; + _delements = {}; + _elementsWithEndpoints = {}; + }; + + // + // notification drag ended. We check automatically if need to update some + // ancestor's offsets. + // + this.dragEnded = function (el) { + if (el.offsetParent != null) { + var id = _currentInstance.getId(el), + ancestor = _draggablesForElements[id]; + + if (ancestor) { + this.updateOffsets(ancestor); + } + } + }; + + this.setParent = function (el, elId, p, pId, currentChildLocation) { + var current = _draggablesForElements[elId]; + if (!_delements[pId]) { + _delements[pId] = {}; + } + var pLoc = _currentInstance.getOffset(p), + cLoc = currentChildLocation || _currentInstance.getOffset(el); + + if (current && _delements[current]) { + delete _delements[current][elId]; + } + + _delements[pId][elId] = { + id:elId, + offset : { + left: cLoc.left - pLoc.left, + top: cLoc.top - pLoc.top + } + }; + _draggablesForElements[elId] = pId; + }; + + this.clearParent = function(el, elId) { + var current = _draggablesForElements[elId]; + if (current) { + delete _delements[current][elId]; + delete _draggablesForElements[elId]; + } + }; + + this.revalidateParent = function(el, elId, childOffset) { + var current = _draggablesForElements[elId]; + if (current) { + var co = {}; + co[elId] = childOffset; + this.updateOffsets(current, co); + _currentInstance.revalidate(current); + } + }; + + this.getDragAncestor = function (el) { + var de = jsPlumb.getElement(el), + id = _currentInstance.getId(de), + aid = _draggablesForElements[id]; + + if (aid) { + return jsPlumb.getElement(aid); + } + else { + return null; + } + }; + + }; + + var _setClassName = function (el, cn, classList) { + cn = _ju.fastTrim(cn); + if (typeof el.className.baseVal !== "undefined") { + el.className.baseVal = cn; + } + else { + el.className = cn; + } + + // recent (i currently have 61.0.3163.100) version of chrome do not update classList when you set the base val + // of an svg element's className. in the long run we'd like to move to just using classList anyway + try { + var cl = el.classList; + if (cl != null) { + while (cl.length > 0) { + cl.remove(cl.item(0)); + } + for (var i = 0; i < classList.length; i++) { + if (classList[i]) { + cl.add(classList[i]); + } + } + } + } + catch(e) { + // not fatal + _ju.log("JSPLUMB: cannot set class list", e); + } + }, + _getClassName = function (el) { + return (typeof el.className.baseVal === "undefined") ? el.className : el.className.baseVal; + }, + _classManip = function (el, classesToAdd, classesToRemove) { + classesToAdd = classesToAdd == null ? [] : _ju.isArray(classesToAdd) ? classesToAdd : classesToAdd.split(/\s+/); + classesToRemove = classesToRemove == null ? [] : _ju.isArray(classesToRemove) ? classesToRemove : classesToRemove.split(/\s+/); + + var className = _getClassName(el), + curClasses = className.split(/\s+/); + + var _oneSet = function (add, classes) { + for (var i = 0; i < classes.length; i++) { + if (add) { + if (curClasses.indexOf(classes[i]) === -1) { + curClasses.push(classes[i]); + } + } + else { + var idx = curClasses.indexOf(classes[i]); + if (idx !== -1) { + curClasses.splice(idx, 1); + } + } + } + }; + + _oneSet(true, classesToAdd); + _oneSet(false, classesToRemove); + + _setClassName(el, curClasses.join(" "), curClasses); + }; + + root.jsPlumb.extend(root.jsPlumbInstance.prototype, { + + headless: false, + + pageLocation: _pageLocation, + screenLocation: _screenLocation, + clientLocation: _clientLocation, + + getDragManager:function() { + if (this.dragManager == null) { + this.dragManager = new DragManager(this); + } + + return this.dragManager; + }, + + recalculateOffsets:function(elId) { + this.getDragManager().updateOffsets(elId); + }, + + createElement:function(tag, style, clazz, atts) { + return this.createElementNS(null, tag, style, clazz, atts); + }, + + createElementNS:function(ns, tag, style, clazz, atts) { + var e = ns == null ? document.createElement(tag) : document.createElementNS(ns, tag); + var i; + style = style || {}; + for (i in style) { + e.style[i] = style[i]; + } + + if (clazz) { + e.className = clazz; + } + + atts = atts || {}; + for (i in atts) { + e.setAttribute(i, "" + atts[i]); + } + + return e; + }, + + getAttribute: function (el, attName) { + return el.getAttribute != null ? el.getAttribute(attName) : null; + }, + + setAttribute: function (el, a, v) { + if (el.setAttribute != null) { + el.setAttribute(a, v); + } + }, + + setAttributes: function (el, atts) { + for (var i in atts) { + if (atts.hasOwnProperty(i)) { + el.setAttribute(i, atts[i]); + } + } + }, + appendToRoot: function (node) { + document.body.appendChild(node); + }, + getRenderModes: function () { + return [ "svg" ]; + }, + getClass:_getClassName, + addClass: function (el, clazz) { + jsPlumb.each(el, function (e) { + _classManip(e, clazz); + }); + }, + hasClass: function (el, clazz) { + el = jsPlumb.getElement(el); + if (el.classList) { + return el.classList.contains(clazz); + } + else { + return _getClassName(el).indexOf(clazz) !== -1; + } + }, + removeClass: function (el, clazz) { + jsPlumb.each(el, function (e) { + _classManip(e, null, clazz); + }); + }, + toggleClass:function(el, clazz) { + if (jsPlumb.hasClass(el, clazz)) { + jsPlumb.removeClass(el, clazz); + } else { + jsPlumb.addClass(el, clazz); + } + }, + updateClasses: function (el, toAdd, toRemove) { + jsPlumb.each(el, function (e) { + _classManip(e, toAdd, toRemove); + }); + }, + setClass: function (el, clazz) { + if (clazz != null) { + jsPlumb.each(el, function (e) { + _setClassName(e, clazz, clazz.split(/\s+/)); + }); + } + }, + setPosition: function (el, p) { + el.style.left = p.left + "px"; + el.style.top = p.top + "px"; + }, + getPosition: function (el) { + var _one = function (prop) { + var v = el.style[prop]; + return v ? v.substring(0, v.length - 2) : 0; + }; + return { + left: _one("left"), + top: _one("top") + }; + }, + getStyle:function(el, prop) { + if (typeof window.getComputedStyle !== 'undefined') { + return getComputedStyle(el, null).getPropertyValue(prop); + } else { + return el.currentStyle[prop]; + } + }, + getSelector: function (ctx, spec) { + var sel = null; + if (arguments.length === 1) { + sel = ctx.nodeType != null ? ctx : document.querySelectorAll(ctx); + } + else { + sel = ctx.querySelectorAll(spec); + } + + return sel; + }, + getOffset:function(el, relativeToRoot, container) { + el = jsPlumb.getElement(el); + container = container || this.getContainer(); + var out = { + left: el.offsetLeft, + top: el.offsetTop + }, + op = (relativeToRoot || (container != null && (el !== container && el.offsetParent !== container))) ? el.offsetParent : null, + _maybeAdjustScroll = function(offsetParent) { + if (offsetParent != null && offsetParent !== document.body && (offsetParent.scrollTop > 0 || offsetParent.scrollLeft > 0)) { + out.left -= offsetParent.scrollLeft; + out.top -= offsetParent.scrollTop; + } + }.bind(this); + + while (op != null) { + out.left += op.offsetLeft; + out.top += op.offsetTop; + _maybeAdjustScroll(op); + op = relativeToRoot ? op.offsetParent : + op.offsetParent === container ? null : op.offsetParent; + } + + // if container is scrolled and the element (or its offset parent) is not absolute or fixed, adjust accordingly. + if (container != null && !relativeToRoot && (container.scrollTop > 0 || container.scrollLeft > 0)) { + var pp = el.offsetParent != null ? this.getStyle(el.offsetParent, "position") : "static", + p = this.getStyle(el, "position"); + if (p !== "absolute" && p !== "fixed" && pp !== "absolute" && pp !== "fixed") { + out.left -= container.scrollLeft; + out.top -= container.scrollTop; + } + } + return out; + }, + // + // return x+y proportion of the given element's size corresponding to the location of the given event. + // + getPositionOnElement: function (evt, el, zoom) { + var box = typeof el.getBoundingClientRect !== "undefined" ? el.getBoundingClientRect() : { left: 0, top: 0, width: 0, height: 0 }, + body = document.body, + docElem = document.documentElement, + scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop, + scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft, + clientTop = docElem.clientTop || body.clientTop || 0, + clientLeft = docElem.clientLeft || body.clientLeft || 0, + pst = 0, + psl = 0, + top = box.top + scrollTop - clientTop + (pst * zoom), + left = box.left + scrollLeft - clientLeft + (psl * zoom), + cl = jsPlumb.pageLocation(evt), + w = box.width || (el.offsetWidth * zoom), + h = box.height || (el.offsetHeight * zoom), + x = (cl[0] - left) / w, + y = (cl[1] - top) / h; + + return [ x, y ]; + }, + + /** + * Gets the absolute position of some element as read from the left/top properties in its style. + * @method getAbsolutePosition + * @param {Element} el The element to retrieve the absolute coordinates from. **Note** this is a DOM element, not a selector from the underlying library. + * @return {Number[]} [left, top] pixel values. + */ + getAbsolutePosition: function (el) { + var _one = function (s) { + var ss = el.style[s]; + if (ss) { + return parseFloat(ss.substring(0, ss.length - 2)); + } + }; + return [ _one("left"), _one("top") ]; + }, + + /** + * Sets the absolute position of some element by setting the left/top properties in its style. + * @method setAbsolutePosition + * @param {Element} el The element to set the absolute coordinates on. **Note** this is a DOM element, not a selector from the underlying library. + * @param {Number[]} xy x and y coordinates + * @param {Number[]} [animateFrom] Optional previous xy to animate from. + * @param {Object} [animateOptions] Options for the animation. + */ + setAbsolutePosition: function (el, xy, animateFrom, animateOptions) { + if (animateFrom) { + this.animate(el, { + left: "+=" + (xy[0] - animateFrom[0]), + top: "+=" + (xy[1] - animateFrom[1]) + }, animateOptions); + } + else { + el.style.left = xy[0] + "px"; + el.style.top = xy[1] + "px"; + } + }, + /** + * gets the size for the element, in an array : [ width, height ]. + */ + getSize: function (el) { + return [ el.offsetWidth, el.offsetHeight ]; + }, + getWidth: function (el) { + return el.offsetWidth; + }, + getHeight: function (el) { + return el.offsetHeight; + }, + getRenderMode : function() { return "svg"; }, + draggable : function (el, options) { + var info; + el = _ju.isArray(el) || (el.length != null && !_ju.isString(el)) ? el: [ el ]; + Array.prototype.slice.call(el).forEach(function(_el) { + info = this.info(_el); + if (info.el) { + this._initDraggableIfNecessary(info.el, true, options, info.id, true); + } + }.bind(this)); + return this; + }, + snapToGrid : function(el, x, y) { + var out = []; + var _oneEl = function(_el) { + var info = this.info(_el); + if (info.el != null && info.el._katavorioDrag) { + var snapped = info.el._katavorioDrag.snap(x, y); + this.revalidate(info.el); + out.push([info.el, snapped]); + } + }.bind(this); + + // if you call this method with 0 arguments or 2 arguments it is assumed you want to snap all managed elements to + // a grid. if you supply one argument or 3, then you are assumed to be specifying one element. + if(arguments.length === 1 || arguments.length === 3) { + _oneEl(el, x, y); + } else { + var _me = this.getManagedElements(); + for (var mel in _me) { + _oneEl(mel, arguments[0], arguments[1]); + } + } + + return out; + }, + initDraggable: function (el, options, category) { + _getDragManager(this, category).draggable(el, options); + el._jsPlumbDragOptions = options; + }, + destroyDraggable: function (el, category) { + _getDragManager(this, category).destroyDraggable(el); + delete el._jsPlumbDragOptions; + }, + unbindDraggable: function (el, evt, fn, category) { + _getDragManager(this, category).destroyDraggable(el, evt, fn); + }, + setDraggable : function (element, draggable) { + return jsPlumb.each(element, function (el) { + if (this.isDragSupported(el)) { + this._draggableStates[this.getAttribute(el, "id")] = draggable; + this.setElementDraggable(el, draggable); + } + }.bind(this)); + }, + _draggableStates : {}, + /* + * toggles the draggable state of the given element(s). + * el is either an id, or an element object, or a list of ids/element objects. + */ + toggleDraggable : function (el) { + var state; + jsPlumb.each(el, function (el) { + var elId = this.getAttribute(el, "id"); + state = this._draggableStates[elId] == null ? false : this._draggableStates[elId]; + state = !state; + this._draggableStates[elId] = state; + this.setDraggable(el, state); + return state; + }.bind(this)); + return state; + }, + _initDraggableIfNecessary : function (element, isDraggable, dragOptions, id, fireEvent) { + // TODO FIRST: move to DragManager. including as much of the decision to init dragging as possible. + if (!jsPlumb.headless) { + var _draggable = isDraggable == null ? false : isDraggable; + if (_draggable) { + if (jsPlumb.isDragSupported(element, this)) { + var options = dragOptions || this.Defaults.DragOptions; + options = jsPlumb.extend({}, options); // make a copy. + if (!jsPlumb.isAlreadyDraggable(element, this)) { + var dragEvent = jsPlumb.dragEvents.drag, + stopEvent = jsPlumb.dragEvents.stop, + startEvent = jsPlumb.dragEvents.start; + + this.manage(id, element); + + options[startEvent] = _ju.wrap(options[startEvent], _dragStart.bind(this)); + + options[dragEvent] = _ju.wrap(options[dragEvent], _dragMove.bind(this)); + + options[stopEvent] = _ju.wrap(options[stopEvent], _dragStop.bind(this)); + + var elId = this.getId(element); // need ID + + this._draggableStates[elId] = true; + var draggable = this._draggableStates[elId]; + + options.disabled = draggable == null ? false : !draggable; + this.initDraggable(element, options); + this.getDragManager().register(element); + if (fireEvent) { + this.fire("elementDraggable", {el:element, options:options}); + } + } + else { + // already draggable. attach any start, drag or stop listeners to the current Drag. + if (dragOptions.force) { + this.initDraggable(element, options); + } + } + } + } + } + }, + animationSupported:true, + getElement: function (el) { + if (el == null) { + return null; + } + // here we pluck the first entry if el was a list of entries. + // this is not my favourite thing to do, but previous versions of + // jsplumb supported jquery selectors, and it is possible a selector + // will be passed in here. + el = typeof el === "string" ? el : el.length != null && el.enctype == null ? el[0] : el; + return typeof el === "string" ? document.getElementById(el) : el; + }, + removeElement: function (element) { + _getDragManager(this).elementRemoved(element); + this.getEventManager().remove(element); + }, + // + // this adapter supports a rudimentary animation function. no easing is supported. only + // left/top properties are supported. property delta args are expected to be in the form + // + // +=x.xxxx + // + // or + // + // -=x.xxxx + // + doAnimate: function (el, properties, options) { + options = options || {}; + var o = this.getOffset(el), + ap = _animProps(o, properties), + ldist = ap[0] - o.left, + tdist = ap[1] - o.top, + d = options.duration || 250, + step = 15, steps = d / step, + linc = (step / d) * ldist, + tinc = (step / d) * tdist, + idx = 0, + _int = setInterval(function () { + _jp.setPosition(el, { + left: o.left + (linc * (idx + 1)), + top: o.top + (tinc * (idx + 1)) + }); + if (options.step != null) { + options.step(idx, Math.ceil(steps)); + } + idx++; + if (idx >= steps) { + window.clearInterval(_int); + if (options.complete != null) { + options.complete(); + } + } + }, step); + }, + // DRAG/DROP + + + destroyDroppable: function (el, category) { + _getDragManager(this, category).destroyDroppable(el); + }, + unbindDroppable: function (el, evt, fn, category) { + _getDragManager(this, category).destroyDroppable(el, evt, fn); + }, + + droppable :function(el, options) { + el = _ju.isArray(el) || (el.length != null && !_ju.isString(el)) ? el: [ el ]; + var info; + options = options || {}; + options.allowLoopback = false; + Array.prototype.slice.call(el).forEach(function(_el) { + info = this.info(_el); + if (info.el) { + this.initDroppable(info.el, options); + } + }.bind(this)); + return this; + }, + + initDroppable: function (el, options, category) { + _getDragManager(this, category).droppable(el, options); + }, + isAlreadyDraggable: function (el) { + return el._katavorioDrag != null; + }, + isDragSupported: function (el, options) { + return true; + }, + isDropSupported: function (el, options) { + return true; + }, + isElementDraggable: function (el) { + el = _jp.getElement(el); + return el._katavorioDrag && el._katavorioDrag.isEnabled(); + }, + getDragObject: function (eventArgs) { + return eventArgs[0].drag.getDragElement(); + }, + getDragScope: function (el) { + return el._katavorioDrag && el._katavorioDrag.scopes.join(" ") || ""; + }, + getDropEvent: function (args) { + return args[0].e; + }, + getUIPosition: function (eventArgs, zoom) { + // here the position reported to us by Katavorio is relative to the element's offsetParent. For top + // level nodes that is fine, but if we have a nested draggable then its offsetParent is actually + // not going to be the jsplumb container; it's going to be some child of that element. In that case + // we want to adjust the UI position to account for the offsetParent's position relative to the Container + // origin. + var el = eventArgs[0].el; + if (el.offsetParent == null) { + return null; + } + var finalPos = eventArgs[0].finalPos || eventArgs[0].pos; + var p = { left:finalPos[0], top:finalPos[1] }; + if (el._katavorioDrag && el.offsetParent !== this.getContainer()) { + var oc = this.getOffset(el.offsetParent); + p.left += oc.left; + p.top += oc.top; + } + return p; + }, + setDragFilter: function (el, filter, _exclude) { + if (el._katavorioDrag) { + el._katavorioDrag.setFilter(filter, _exclude); + } + }, + setElementDraggable: function (el, draggable) { + el = _jp.getElement(el); + if (el._katavorioDrag) { + el._katavorioDrag.setEnabled(draggable); + } + }, + setDragScope: function (el, scope) { + if (el._katavorioDrag) { + el._katavorioDrag.k.setDragScope(el, scope); + } + }, + setDropScope:function(el, scope) { + if (el._katavorioDrop && el._katavorioDrop.length > 0) { + el._katavorioDrop[0].k.setDropScope(el, scope); + } + }, + addToPosse:function(el, spec) { + var specs = Array.prototype.slice.call(arguments, 1); + var dm = _getDragManager(this); + _jp.each(el, function(_el) { + _el = [ _jp.getElement(_el) ]; + _el.push.apply(_el, specs ); + dm.addToPosse.apply(dm, _el); + }); + }, + setPosse:function(el, spec) { + var specs = Array.prototype.slice.call(arguments, 1); + var dm = _getDragManager(this); + _jp.each(el, function(_el) { + _el = [ _jp.getElement(_el) ]; + _el.push.apply(_el, specs ); + dm.setPosse.apply(dm, _el); + }); + }, + removeFromPosse:function(el, posseId) { + var specs = Array.prototype.slice.call(arguments, 1); + var dm = _getDragManager(this); + _jp.each(el, function(_el) { + _el = [ _jp.getElement(_el) ]; + _el.push.apply(_el, specs ); + dm.removeFromPosse.apply(dm, _el); + }); + }, + removeFromAllPosses:function(el) { + var dm = _getDragManager(this); + _jp.each(el, function(_el) { dm.removeFromAllPosses(_jp.getElement(_el)); }); + }, + setPosseState:function(el, posseId, state) { + var dm = _getDragManager(this); + _jp.each(el, function(_el) { dm.setPosseState(_jp.getElement(_el), posseId, state); }); + }, + dragEvents: { + 'start': 'start', 'stop': 'stop', 'drag': 'drag', 'step': 'step', + 'over': 'over', 'out': 'out', 'drop': 'drop', 'complete': 'complete', + 'beforeStart':'beforeStart' + }, + animEvents: { + 'step': "step", 'complete': 'complete' + }, + stopDrag: function (el) { + if (el._katavorioDrag) { + el._katavorioDrag.abort(); + } + }, + addToDragSelection: function (spec) { + var el = this.getElement(spec); + if (el != null && (el._isJsPlumbGroup || el._jsPlumbGroup == null)) { + _getDragManager(this).select(spec); + } + }, + removeFromDragSelection: function (spec) { + _getDragManager(this).deselect(spec); + }, + getDragSelection:function() { + return _getDragManager(this).getSelection(); + }, + clearDragSelection: function () { + _getDragManager(this).deselectAll(); + }, + trigger: function (el, event, originalEvent, payload) { + this.getEventManager().trigger(el, event, originalEvent, payload); + }, + doReset:function() { + // look for katavorio instances and reset each one if found. + for (var key in this) { + if (key.indexOf("_katavorio_") === 0) { + this[key].reset(); + } + } + }, + getEventManager:function() { + return _getEventManager(this); + }, + on : function(el, event, callback) { + // TODO: here we would like to map the tap event if we know its + // an internal bind to a click. we have to know its internal because only + // then can we be sure that the UP event wont be consumed (tap is a synthesized + // event from a mousedown followed by a mouseup). + //event = { "click":"tap", "dblclick":"dbltap"}[event] || event; + this.getEventManager().on.apply(this, arguments); + return this; + }, + off : function(el, event, callback) { + this.getEventManager().off.apply(this, arguments); + return this; + } + + }); + + var ready = function (f) { + var _do = function () { + if (/complete|loaded|interactive/.test(document.readyState) && typeof(document.body) !== "undefined" && document.body != null) { + f(); + } + else { + setTimeout(_do, 9); + } + }; + + _do(); + }; + ready(_jp.init); + +}).call(typeof window !== 'undefined' ? window : this); diff --git a/experiment/simulation/EE6/helper/cable/simulate.html b/experiment/simulation/EE6/helper/cable/simulate.html new file mode 100644 index 0000000..d650bcc --- /dev/null +++ b/experiment/simulation/EE6/helper/cable/simulate.html @@ -0,0 +1,117 @@ + + + Log Amplifier + + + + + + + +
    + +

    Log Amplifier

    + + + + +
    +

    1

    +

    2

    +

    3

    +

    4

    +

    5

    +

    6

    +

    7

    +

    8

    +

    9

    +

    10

    +
    + + + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + Copyright©2019 | Lab developed by Virtual Labs, IIT Roorkee
    +
    + + +
    + + + + + + + \ No newline at end of file diff --git a/experiment/simulation/EE6/helper/cable/temp.html b/experiment/simulation/EE6/helper/cable/temp.html new file mode 100644 index 0000000..8311e75 --- /dev/null +++ b/experiment/simulation/EE6/helper/cable/temp.html @@ -0,0 +1,76 @@ + + + + + + JsPlumb Circuit Simulator + + + + + + +
    1
    +
    2
    +
    3
    +
    4
    +
    5
    +
    6
    +
    7
    +
    8
    +
    9
    +
    10
    + + + + + diff --git a/experiment/simulation/EE6/helper/img/slider_D_blank.png b/experiment/simulation/EE6/helper/img/slider_D_blank.png new file mode 100644 index 0000000..d7893b4 Binary files /dev/null and b/experiment/simulation/EE6/helper/img/slider_D_blank.png differ diff --git a/experiment/simulation/EE6/helper/img/slider_R_arrow.png b/experiment/simulation/EE6/helper/img/slider_R_arrow.png new file mode 100644 index 0000000..cbbb9c5 Binary files /dev/null and b/experiment/simulation/EE6/helper/img/slider_R_arrow.png differ diff --git a/experiment/simulation/EE6/helper/img/slider_V_arrow.png b/experiment/simulation/EE6/helper/img/slider_V_arrow.png new file mode 100644 index 0000000..b855b94 Binary files /dev/null and b/experiment/simulation/EE6/helper/img/slider_V_arrow.png differ diff --git a/experiment/simulation/EE6/helper/img/slider_V_back.png b/experiment/simulation/EE6/helper/img/slider_V_back.png new file mode 100644 index 0000000..14ddcee Binary files /dev/null and b/experiment/simulation/EE6/helper/img/slider_V_back.png differ diff --git a/experiment/simulation/EE6/helper/img/slider_circuit.png b/experiment/simulation/EE6/helper/img/slider_circuit.png new file mode 100644 index 0000000..f58870f Binary files /dev/null and b/experiment/simulation/EE6/helper/img/slider_circuit.png differ diff --git a/experiment/simulation/EE6/helper/img/slider_tip.png b/experiment/simulation/EE6/helper/img/slider_tip.png new file mode 100644 index 0000000..13c5348 Binary files /dev/null and b/experiment/simulation/EE6/helper/img/slider_tip.png differ diff --git a/experiment/simulation/EE6/helper/practice component/leet.js b/experiment/simulation/EE6/helper/practice component/leet.js new file mode 100644 index 0000000..41e7fb1 --- /dev/null +++ b/experiment/simulation/EE6/helper/practice component/leet.js @@ -0,0 +1,8 @@ +let sc = "!@#$%^&*()-+" + + +let pass = "sneha@@33" + +console.log("skjdkj") + +console.log(pass.indexOf(sc)); \ No newline at end of file diff --git a/experiment/simulation/EE6/helper/practice component/temp.html b/experiment/simulation/EE6/helper/practice component/temp.html new file mode 100644 index 0000000..c79f92f --- /dev/null +++ b/experiment/simulation/EE6/helper/practice component/temp.html @@ -0,0 +1,202 @@ + + + + + + Document + + + +
    +
    +
    +
    V in (V)
    + +
    +
    +
    R (Ω)
    + +
    +
    +
    Characteristics
    + +
    +
    + +
    +
    +
    D
    + + +
    +
    +
    + + + \ No newline at end of file diff --git a/experiment/simulation/EE6/helper/practice component/tempCodeRunnerFile.js b/experiment/simulation/EE6/helper/practice component/tempCodeRunnerFile.js new file mode 100644 index 0000000..2550fd3 --- /dev/null +++ b/experiment/simulation/EE6/helper/practice component/tempCodeRunnerFile.js @@ -0,0 +1,8 @@ +let sc = "!@#$%^&*()-+" + + +let pass = "sneha@@33" + +console.log("skjdkj") + +console.log(pass.indexOf("sc")); \ No newline at end of file diff --git a/experiment/simulation/EE6/helper/sliders.css b/experiment/simulation/EE6/helper/sliders.css new file mode 100644 index 0000000..6a7e6fc --- /dev/null +++ b/experiment/simulation/EE6/helper/sliders.css @@ -0,0 +1,137 @@ +body{ + background-color: #f1ece3; +} +.universal-slider{ + +} +.universal-slider .slider-circuit{ + position: relative; + z-index: 20; +} +.slider .slider_R,.range-slider{ + position: absolute; + left: 557px; + top: 115px; + z-index: 499; + -webkit-appearance: none; + appearance: none; + transform: rotate(-90deg); + width: 80px; + height: 30px; + height: 10px; + border-radius: 5px; + /* background: #d3d3d3; */ + background: transparent; + outline: none; + opacity: 0.9; + -webkit-transition: .2s; + transition: opacity .2s; +} +.slider .slider_R::-webkit-slider-thumb,.range-slider::-webkit-slider-thumb{ + -webkit-appearance: none; + appearance: none; + height: 30px; + width: 30px; + border: 0; + transform: rotate(90deg); + background: url('./img/slider_tip.png'); + background-position: center; + background-size: cover; + background-repeat: no-repeat; + cursor: pointer; + +} +.slider .slider_R:hover,.range-slider:hover{ + /* background-color: black; */ + opacity: 1; +} + +.slider .slider_R+img{ + position: absolute; + left: 569px; + top: 120px; + z-index: 498; +} +.slider .value-box{ + background-color: white; + text-align: black; + border: 1px solid black; + width: fit-content; + display: flex; + padding: 0 3px; +} +.slider .value-box input{ + border: none; + outline: none; + width: 25px; + font-weight: bold; +} + + + + +/* ! Fix positions of all slider input value */ +.slider .r .value-box{ + position: absolute; + left: 588px; + top: 54px; + z-index: 500; +} +/* slider d */ +.slider .slider_D{ + transform: rotate(0deg); + left: 281px; + top: 143.8px; + width: 80px; + background-color: transparent; +} + +.slider .d .value-box{ + position: absolute; + left: 299px; + top: 97px; + z-index: 500; +} +.slider .slider_D+img{ + position: absolute; + left: 218px; + top: 141px; + width: 80px; + z-index: 10; +} + +/* slider v */ +.slider .v .meter{ + width: 113px; + position: absolute; + top: 12px; + left: 70px; +} + +.slider .v .slider-V-arrow{ + width: 35px; + position: absolute; + z-index: 200; +} + +.slider-v-r1{ + transform: rotate(0deg); + top: 65px; + left: 100px; +} +.slider-v-r2{ + transform: rotate(50deg); + top: 62px; + left: 110px; +} +.slider-v-r3{ + transform: rotate(110deg); + top: 67px; + left: 119px; +} +.slider .v .value-box{ + position: absolute; + top: 103px; + left: 116px; + z-index: 200; +} diff --git a/experiment/simulation/EE6/helper/sliders.js b/experiment/simulation/EE6/helper/sliders.js new file mode 100644 index 0000000..eadb1ec --- /dev/null +++ b/experiment/simulation/EE6/helper/sliders.js @@ -0,0 +1,103 @@ +function sliderR(){ + let slider_R = document.querySelector(".slider_R") + let sliderImg = document.querySelector(".slider-R-arrow") + let sliderValueInput = document.querySelector(".r .value-box input") + // ratio to move 450/50 = 1:10 + // max img 71px -> min 120 px + let val = 0 + + // slider function + function slide(e){ + e = e instanceof Event + if(e){ + sliderValueInput.value = slider_R.value + } + else{ + slider_R.value = sliderValueInput.value + } + val = (slider_R.value / 9.3) - 5 + sliderImg.style.top = `${120 - val}px` + } + + const slideInput = ()=>{ + let val = sliderValueInput.value + if(val > 500){ + val = 500 + } + sliderValueInput.value = val + slide(false) + } + + slider_R.oninput = slide + sliderValueInput.onkeyup = slideInput + sliderValueInput.addEventListener("focusout",()=>{ + if(sliderValueInput.value < 50){ + sliderValueInput.value = 50 + } + slide(false) + }) +} +function sliderD(){ + let slider_D = document.querySelector(".slider_D") + let sliderImg = document.querySelector(".slider-D-arrow") + let sliderValueInput = document.querySelector(".d .value-box input") + let val = 0 + + // slider function + function slide(e){ + e = e instanceof Event + if(e){ + sliderValueInput.value = slider_D.value + } + else{ + slider_D.value = sliderValueInput.value + } + val = ((slider_D.value*100) / 1.7) - 5 + sliderImg.style.left = `${218 + val}px` + } + + const slideInput = ()=>{ + let val = sliderValueInput.value + if(val > 0.95){ + val = 0.95 + } + sliderValueInput.value = val + slide(false) + } + + slider_D.oninput = slide + sliderValueInput.onkeyup = slideInput + sliderValueInput.addEventListener("focusout",()=>{ + if(sliderValueInput.value < 0.1){ + sliderValueInput.value = 0.1 + } + slide(false) + }) +} +function sliderV(){ + let sliderArrow = document.querySelector(".slider-V-arrow") + let sliderValueInput = document.querySelector(".v .value-box input") + + // slider function + function rotateArrow(rot=0){ + if(sliderArrow.classList.contains("slider-v-r3")){ + sliderArrow.classList.remove("slider-v-r3") + sliderArrow.classList.add("slider-v-r1") + sliderValueInput.value = 24 + + }else if(sliderArrow.classList.contains("slider-v-r1")){ + sliderArrow.classList.remove("slider-v-r1") + sliderArrow.classList.add("slider-v-r2") + sliderValueInput.value = 48 + }else if(sliderArrow.classList.contains("slider-v-r2")){ + sliderArrow.classList.remove("slider-v-r2") + sliderArrow.classList.add("slider-v-r3") + sliderValueInput.value = 72 + } + } + + sliderArrow.onclick = rotateArrow +} +sliderV() +sliderR() +sliderD() \ No newline at end of file diff --git a/experiment/simulation/EE6/helper/temp.html b/experiment/simulation/EE6/helper/temp.html new file mode 100644 index 0000000..33e8c0d --- /dev/null +++ b/experiment/simulation/EE6/helper/temp.html @@ -0,0 +1,97 @@ + + + + + + Document + + + + + + +
    + + + + + + + + + + + + +
    + + + diff --git a/experiment/simulation/EE6/helper/temp.py b/experiment/simulation/EE6/helper/temp.py new file mode 100644 index 0000000..8c74adf --- /dev/null +++ b/experiment/simulation/EE6/helper/temp.py @@ -0,0 +1,51 @@ +import os +def html(name): + return ''' + + '''.format(name) + +def src(name :str): + return name[0:name.find('.')] + ":this.allImgsDom[index++],\n" + + +def dom(name): + name1 = name[0: name.find(".")] + return f'{name1} : new Dom("{name1}"),\n' + + +sneha_folder_path = "E:\\office project\\vlabs-EE\\EE6\\src\\images\\EE6\\" + +# utkarsh_folder_path = "S:\\Users\\Utkarsh\\Documents\\Office Main\\All Projects Repo\\vlabs-EE\\EE4\\src\\images\\exp4\\part2\\" + +names = os.listdir(sneha_folder_path) + +# namesStr = '' +# for name in names: +# namesStr = namesStr + f'{name}\n' + +# open("temp3.txt","w").write(namesStr) + +# BASE_COUNT = 13 +# count = 168 + +srcs = '' +doms = '' +htms = '' +for i in range(len(names)): + htms = htms + html(names[i]) + doms = doms + dom(names[i]) + srcs = srcs + src(names[i]) + + + + +# open("temp.txt","w").write() +allItems = f'{htms}\n\n{srcs}\n\n{doms}' +open("temp2.txt","w").write(allItems) + +print("Done 👍") +# print(os.__path__) +# \ No newline at end of file diff --git a/experiment/simulation/EE6/helper/temp.txt b/experiment/simulation/EE6/helper/temp.txt new file mode 100644 index 0000000..e69de29 diff --git a/experiment/simulation/EE6/helper/temp2.py b/experiment/simulation/EE6/helper/temp2.py new file mode 100644 index 0000000..6554647 --- /dev/null +++ b/experiment/simulation/EE6/helper/temp2.py @@ -0,0 +1,325 @@ +domitems = ''' + anchor_plate.webp + anchor_plate.webp + anchor_plate.webp + anchor_plate.webp + + beam_3d_1.png + beam_3d_1.png + + beam_3d_with_holes.png + beam_3d_with_holes.png + + ct_prop.png + ct_prop.png + ct_prop.png + ct_prop.png + ct_prop.png + ct_prop.png + + foot_adapter.png + foot_adapter.png + foot_adapter.png + + head_adapter.webp + head_adapter.webp + full_column.jpeg + drill_machine.png + hammer.png + nail.png + objective.png + real_foot_adapter.png + real_head_adapter.png + + sheathing.png + sheathing.png + sheathing.png + sheathing.png + sheathing.png + + steel_waler.png + steel_waler.png + steel_waler.png + tie_rod.png + tie_rod.png + tie_rod.png + tie_rod.png + wing_nut_top-cutout.png + wing_nut_top-cutout.png + wing_nut_top-cutout.png + wing_nut_top-cutout.png + wing_nut_top-cutout.png + wing_nut_full.png +''' + +names = '''anchor_plate +anchor_plate +anchor_plate +anchor_plate +beam_3d_1 +beam_3d_1 +beam_3d_with_holes +beam_3d_with_holes +ct_prop +ct_prop +ct_prop +ct_prop +ct_prop +ct_prop +foot_adapter +foot_adapter +foot_adapter +head_adapter +head_adapter +full_column +drill_machine +hammer +nail +objective +real_foot_adapter +real_head_adapter +sheathing +sheathing +sheathing +sheathing +sheathing +steel +steel +steel +tie_rod +tie_rod +tie_rod +tie_rod +wing_nut_top +wing_nut_top +wing_nut_top +wing_nut_top +wing_nut_top +wing_nut_full +''' + +names = names.split("\n") +for i in range(27,len(names)+27): + l = names[i-27] + ": this.allImgsDom[{0}],".format(i) + print(l) + \ No newline at end of file diff --git a/experiment/simulation/EE6/helper/temp2.txt b/experiment/simulation/EE6/helper/temp2.txt new file mode 100644 index 0000000..a802c50 --- /dev/null +++ b/experiment/simulation/EE6/helper/temp2.txt @@ -0,0 +1,68 @@ + + formulas_component_stress.png + + formulas_efficiency.png + + formulas_ideal.png + + formulas_nomenclautre.png + + formulas_non_ideal.png + + formulas_procedure.png + + formulas_universal.png + + graph2_arrow.png + + +formulas_component_stress:this.allImgsDom[134], +formulas_efficiency:this.allImgsDom[135], +formulas_ideal:this.allImgsDom[136], +formulas_nomenclautre:this.allImgsDom[137], +formulas_non_ideal:this.allImgsDom[138], +formulas_procedure:this.allImgsDom[139], +formulas_universal:this.allImgsDom[140], +graph2_arrow:this.allImgsDom[141], + + +formulas_component_stress : new Dom("formulas_component_stress"), +formulas_efficiency : new Dom("formulas_efficiency"), +formulas_ideal : new Dom("formulas_ideal"), +formulas_nomenclautre : new Dom("formulas_nomenclautre"), +formulas_non_ideal : new Dom("formulas_non_ideal"), +formulas_procedure : new Dom("formulas_procedure"), +formulas_universal : new Dom("formulas_universal"), +graph2_arrow : new Dom("graph2_arrow"), diff --git a/experiment/simulation/EE6/helper/temp3.txt b/experiment/simulation/EE6/helper/temp3.txt new file mode 100644 index 0000000..56fbe1c --- /dev/null +++ b/experiment/simulation/EE6/helper/temp3.txt @@ -0,0 +1,90 @@ +slide_1.png +slide_2.png +slide_3_page_1.png +slide_3_page_2.png +slide_3_page_3.png +slide_3_page_4.png +slide_4_page_1.png +slide_4_page_1_fan.png +slide_4_page_2_battery_1.png +slide_4_page_2_battery_2.png +slide_4_page_2_battery_3.png +slide_4_page_2_volt_text.png +slide_4_page_3_text_1.png +slide_4_page_3_text_2.png +slide_4_page_3_wire.png +slide_5_page_1.png +slide_5_page_2_text_1.png +slide_5_page_2_volt_text.png +slide_5_page_3_1_text_1.png +slide_5_page_3_2_wire.png +slide_5_page_3_3_light.png +slide_5_page_3_4_blast.gif +slide_5_page_3_5_cross.png +slide_5_page_3_6_emoji.png +slide_5_page_3_7_text_2.png +slide_5_page_3_8_text_3.png +slide_5_page_4_1_text_1.png +slide_6_page_1.png +slide_6_page_2_1_text_1.png +slide_6_page_2_2_emoji_blink.png +slide_6_page_3_1_text_1.png +slide_6_page_3_2_emoji_blink.png +slide_7_page_1_1.png +slide_7_page_1_2.png +slide_7_page_1_3.png +slide_8_page_1.png +slide_8_page_2_and_rotate_the_fan.png +slide_8_page_3_1.png +slide_8_page_3_2_light.png +slide_8_page_3_3_blank.png +slide_8_page_3_4_emoji.png +slide_8_page_3_5_text.png +slide_9.png +slide_10_page_1.png +slide_10_page_2.png +slide_10_page_3.png +slide_10_page_4_1.png +slide_10_page_4_2_plus.png +slide_10_page_4_3_minus.png +slide_10_page_4_4_arrow.png +slide_10_page_4_5_text.png +slide_11_page_1.png +slide_11_page_2_1.png +slide_11_page_2_2_blink.png +slide_11_page_3_1.png +slide_11_page_3_2_rotate_it.png +slide_11_page_3_3_text_and_arrow.png +slide_12_page_1.png +slide_12_page_2_1_pwm_blink.png +slide_12_page_2_2.png +slide_12_page_2_3_text.png +slide_12_page_3_1_pwn_blink.png +slide_12_page_3_2.png +slide_12_page_3_3_text.png +slide_12_page_3_4_text_2.png +slide_13_page_1.png +slide_13_page_2.png +slide_13_page_3_1_plus.png +slide_13_page_3_2_minus_rotate_both.png +slide_13_page_3_4.png +slide_13_page_3_5_text.png +['slide_14_helper.png', +'slide_14_page_1.png', +'slide_14_page_1_ball.png', +'slide_14_page_2_1_blink.png', +'slide_14_page_2_2_text.png', +'slide_14_page_3_1_symbols.png', +'slide_14_page_3_2_green_graph_and_start_ball.png', +'slide_14_page_3_3_white_image_for_blue_line.png', +'slide_15_page_1.png', +'slide_15_page_1_ball.png', +'slide_15_page_1_green_graph.png', +'slide_15_page_1_minus.png', +'slide_15_page_1_plus.png', +'slide_15_page_2_1_blink.png', +'slide_15_page_2_2_text.png', +'slide_15_page_3_1_arrow_and_text.png', +'slide_15_page_3_1_white.png', +'slide_15_page_3_2_graph.png', +'slide_15_page_3_3_text.png',] \ No newline at end of file diff --git a/experiment/simulation/EE6/helper/tempCodeRunnerFile.py b/experiment/simulation/EE6/helper/tempCodeRunnerFile.py new file mode 100644 index 0000000..0b8a6fb --- /dev/null +++ b/experiment/simulation/EE6/helper/tempCodeRunnerFile.py @@ -0,0 +1,42 @@ +import os + +def html(name): + return ''' + {0} + '''.format(name) + +def src(name :str,i :int): + return name[0:name.find('.')] + ":this.allImgsDom[{0}],\n".format(i) + + +def dom(name): + name1 = name[0: name.find(".")] + return f'{name1} : new Dom("{name1}"),\n' + + +names = os.listdir("S:\\Users\\Utkarsh\\Documents\\Project2\\CE8\\src\\images\\Beam and Slab") + +count = 108 + +srcs = '' +doms = '' +htms = '' +for i in range(len(names)): + htms = htms + html(names[i]) + doms = doms + dom(names[i]) + srcs = srcs + src(names[i],i+count) + + + +# open("temp.txt","w").write() +allItems = f'{htms}\n\n{srcs}\n\n{doms}' +open("temp2.txt","w").write(allItems) + +print("Done 👍") +# print(os.__path__) +# \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/apple-touch-icon.png b/experiment/simulation/EE6/iframes/data/apple-touch-icon.png new file mode 100644 index 0000000..5add869 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/apple-touch-icon.png differ diff --git a/experiment/simulation/EE6/iframes/data/browsersupport.js b/experiment/simulation/EE6/iframes/data/browsersupport.js new file mode 100644 index 0000000..0b1d9d3 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/browsersupport.js @@ -0,0 +1,7 @@ +!function(e,n,s){function t(e,n){return typeof e===n}function o(){var e,n,s,o,a,i,l;for(var c in f)if(f.hasOwnProperty(c)){if(e=[],n=f[c],n.name&&(e.push(n.name.toLowerCase()),n.options&&n.options.aliases&&n.options.aliases.length))for(s=0;si;i++){var r=g[i],f=r.toUpperCase()+"_"+t;if(f in a)return"@-"+r.toLowerCase()+"-"+n}return!1};l.atRule=m;var g=l._config.usePrefixes?" -webkit- -moz- -o- -ms- ".split(" "):["",""];l._prefixes=g,o(),a(r),delete l.addTest,delete l.addAsyncTest;for(var v=0;vparseFloat(r)){q=String(u);break a}}q=r};var w=e(),x=g()||d("iPod"),y=d("iPad"),z=d("Android")&&!(f()||e()||d("Opera")||d("Silk")),A=f(),B=d("Safari")&&!(f()||d("Coast")||d("Opera")||d("Edge")||d("Edg/")||d("OPR")||e()||d("Silk")||d("Android"))&&!(g()||d("iPad")||d("iPod"));function C(b){return(b=b.exec(c()))?b[1]:""}var D=function(){if(w)return C(/Firefox\/([0-9.]+)/);if(l||m||k)return q;if(A){if(g()||d("iPad")||d("iPod")||d("Macintosh")){var b=C(/CriOS\/([0-9.]+)/);if(b)return b}return C(/Chrome\/([0-9.]+)/)}if(B&&!(g()||d("iPad")||d("iPod")))return C(/Version\/([0-9.]+)/);if(x||y){if(b=/Version\/(\S+).*Mobile\/(\S+)/.exec(c()))return b[1]+"."+b[2]}else if(z)return(b=C(/Android\s+([0-9.]+)/))?b:C(/Version\/([0-9.]+)/);return""}();function E(b){var h;(h=!Modernizr.inlinesvg||l)||(h=parseInt(D,10),h=B&&14>h);return h?(location.replace(b+window.location.search),!0):!1}var F=["ispring","compatibility","performRedirectIfNeeded"],G=a;F[0]in G||"undefined"==typeof G.execScript||G.execScript("var "+F[0]);for(var H;F.length&&(H=F.shift());)F.length||void 0===E?G=G[H]&&G[H]!==Object.prototype[H]?G[H]:G[H]={}:G[H]=E;E("data/html5-unsupported.html");window.onerror=function(){return!0};a.console||(window._log="",a.console={log:function(b){window._log+="\n"+b},warn:function(b){window._log+="\nwarn: "+b},error:function(b){window._log+="\nerror: "+b}});})(); diff --git a/experiment/simulation/EE6/iframes/data/eraser.cur b/experiment/simulation/EE6/iframes/data/eraser.cur new file mode 100644 index 0000000..d88b5b8 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/eraser.cur differ diff --git a/experiment/simulation/EE6/iframes/data/favicon.ico b/experiment/simulation/EE6/iframes/data/favicon.ico new file mode 100644 index 0000000..9e6bd46 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/favicon.ico differ diff --git a/experiment/simulation/EE6/iframes/data/fnt0.woff b/experiment/simulation/EE6/iframes/data/fnt0.woff new file mode 100644 index 0000000..f322b8a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/fnt0.woff differ diff --git a/experiment/simulation/EE6/iframes/data/fnt1.woff b/experiment/simulation/EE6/iframes/data/fnt1.woff new file mode 100644 index 0000000..621a37f Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/fnt1.woff differ diff --git a/experiment/simulation/EE6/iframes/data/fnt10.woff b/experiment/simulation/EE6/iframes/data/fnt10.woff new file mode 100644 index 0000000..d0423ec Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/fnt10.woff differ diff --git a/experiment/simulation/EE6/iframes/data/fnt11.woff b/experiment/simulation/EE6/iframes/data/fnt11.woff new file mode 100644 index 0000000..a1baaa7 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/fnt11.woff differ diff --git a/experiment/simulation/EE6/iframes/data/fnt12.woff b/experiment/simulation/EE6/iframes/data/fnt12.woff new file mode 100644 index 0000000..31560b3 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/fnt12.woff differ diff --git a/experiment/simulation/EE6/iframes/data/fnt13.woff b/experiment/simulation/EE6/iframes/data/fnt13.woff new file mode 100644 index 0000000..2d4870c Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/fnt13.woff differ diff --git a/experiment/simulation/EE6/iframes/data/fnt14.woff b/experiment/simulation/EE6/iframes/data/fnt14.woff new file mode 100644 index 0000000..f171d8c Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/fnt14.woff differ diff --git a/experiment/simulation/EE6/iframes/data/fnt2.woff b/experiment/simulation/EE6/iframes/data/fnt2.woff new file mode 100644 index 0000000..7dbc547 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/fnt2.woff differ diff --git a/experiment/simulation/EE6/iframes/data/fnt3.woff b/experiment/simulation/EE6/iframes/data/fnt3.woff new file mode 100644 index 0000000..56fc9ab Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/fnt3.woff differ diff --git a/experiment/simulation/EE6/iframes/data/fnt4.woff b/experiment/simulation/EE6/iframes/data/fnt4.woff new file mode 100644 index 0000000..4edb33a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/fnt4.woff differ diff --git a/experiment/simulation/EE6/iframes/data/fnt5.woff b/experiment/simulation/EE6/iframes/data/fnt5.woff new file mode 100644 index 0000000..1fda4ed Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/fnt5.woff differ diff --git a/experiment/simulation/EE6/iframes/data/fnt6.woff b/experiment/simulation/EE6/iframes/data/fnt6.woff new file mode 100644 index 0000000..2426e78 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/fnt6.woff differ diff --git a/experiment/simulation/EE6/iframes/data/fnt7.woff b/experiment/simulation/EE6/iframes/data/fnt7.woff new file mode 100644 index 0000000..fafb725 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/fnt7.woff differ diff --git a/experiment/simulation/EE6/iframes/data/fnt8.woff b/experiment/simulation/EE6/iframes/data/fnt8.woff new file mode 100644 index 0000000..a546f79 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/fnt8.woff differ diff --git a/experiment/simulation/EE6/iframes/data/fnt9.woff b/experiment/simulation/EE6/iframes/data/fnt9.woff new file mode 100644 index 0000000..4e78c6d Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/fnt9.woff differ diff --git a/experiment/simulation/EE6/iframes/data/highlighter.cur b/experiment/simulation/EE6/iframes/data/highlighter.cur new file mode 100644 index 0000000..9656c6a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/highlighter.cur differ diff --git a/experiment/simulation/EE6/iframes/data/html5-unsupported.html b/experiment/simulation/EE6/iframes/data/html5-unsupported.html new file mode 100644 index 0000000..787b7f5 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/html5-unsupported.html @@ -0,0 +1,375 @@ + + + + + + + + + + Page Not Available + + + + + + \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/img0.png b/experiment/simulation/EE6/iframes/data/img0.png new file mode 100644 index 0000000..736ccfd Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img0.png differ diff --git a/experiment/simulation/EE6/iframes/data/img1.png b/experiment/simulation/EE6/iframes/data/img1.png new file mode 100644 index 0000000..cdeafe9 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img1.png differ diff --git a/experiment/simulation/EE6/iframes/data/img10.png b/experiment/simulation/EE6/iframes/data/img10.png new file mode 100644 index 0000000..4bf2012 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img10.png differ diff --git a/experiment/simulation/EE6/iframes/data/img100.png b/experiment/simulation/EE6/iframes/data/img100.png new file mode 100644 index 0000000..78d0d47 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img100.png differ diff --git a/experiment/simulation/EE6/iframes/data/img101.png b/experiment/simulation/EE6/iframes/data/img101.png new file mode 100644 index 0000000..8ade93a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img101.png differ diff --git a/experiment/simulation/EE6/iframes/data/img102.png b/experiment/simulation/EE6/iframes/data/img102.png new file mode 100644 index 0000000..c7d47f3 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img102.png differ diff --git a/experiment/simulation/EE6/iframes/data/img103.png b/experiment/simulation/EE6/iframes/data/img103.png new file mode 100644 index 0000000..7e1f1b7 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img103.png differ diff --git a/experiment/simulation/EE6/iframes/data/img104.png b/experiment/simulation/EE6/iframes/data/img104.png new file mode 100644 index 0000000..d5ef1f0 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img104.png differ diff --git a/experiment/simulation/EE6/iframes/data/img105.png b/experiment/simulation/EE6/iframes/data/img105.png new file mode 100644 index 0000000..9c8afb8 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img105.png differ diff --git a/experiment/simulation/EE6/iframes/data/img106.png b/experiment/simulation/EE6/iframes/data/img106.png new file mode 100644 index 0000000..f29a2cd Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img106.png differ diff --git a/experiment/simulation/EE6/iframes/data/img107.png b/experiment/simulation/EE6/iframes/data/img107.png new file mode 100644 index 0000000..6136bdd Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img107.png differ diff --git a/experiment/simulation/EE6/iframes/data/img108.png b/experiment/simulation/EE6/iframes/data/img108.png new file mode 100644 index 0000000..c1a69f5 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img108.png differ diff --git a/experiment/simulation/EE6/iframes/data/img109.png b/experiment/simulation/EE6/iframes/data/img109.png new file mode 100644 index 0000000..6078112 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img109.png differ diff --git a/experiment/simulation/EE6/iframes/data/img11.png b/experiment/simulation/EE6/iframes/data/img11.png new file mode 100644 index 0000000..0b884e8 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img11.png differ diff --git a/experiment/simulation/EE6/iframes/data/img110.png b/experiment/simulation/EE6/iframes/data/img110.png new file mode 100644 index 0000000..fc42a29 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img110.png differ diff --git a/experiment/simulation/EE6/iframes/data/img111.png b/experiment/simulation/EE6/iframes/data/img111.png new file mode 100644 index 0000000..2a77a22 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img111.png differ diff --git a/experiment/simulation/EE6/iframes/data/img112.png b/experiment/simulation/EE6/iframes/data/img112.png new file mode 100644 index 0000000..a52bc25 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img112.png differ diff --git a/experiment/simulation/EE6/iframes/data/img113.png b/experiment/simulation/EE6/iframes/data/img113.png new file mode 100644 index 0000000..c70c879 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img113.png differ diff --git a/experiment/simulation/EE6/iframes/data/img114.png b/experiment/simulation/EE6/iframes/data/img114.png new file mode 100644 index 0000000..8806c5d Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img114.png differ diff --git a/experiment/simulation/EE6/iframes/data/img115.png b/experiment/simulation/EE6/iframes/data/img115.png new file mode 100644 index 0000000..4d49eed Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img115.png differ diff --git a/experiment/simulation/EE6/iframes/data/img116.png b/experiment/simulation/EE6/iframes/data/img116.png new file mode 100644 index 0000000..5433041 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img116.png differ diff --git a/experiment/simulation/EE6/iframes/data/img117.png b/experiment/simulation/EE6/iframes/data/img117.png new file mode 100644 index 0000000..718eef5 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img117.png differ diff --git a/experiment/simulation/EE6/iframes/data/img118.png b/experiment/simulation/EE6/iframes/data/img118.png new file mode 100644 index 0000000..a5077c1 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img118.png differ diff --git a/experiment/simulation/EE6/iframes/data/img119.png b/experiment/simulation/EE6/iframes/data/img119.png new file mode 100644 index 0000000..9a6553f Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img119.png differ diff --git a/experiment/simulation/EE6/iframes/data/img12.png b/experiment/simulation/EE6/iframes/data/img12.png new file mode 100644 index 0000000..f8c2cfd Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img12.png differ diff --git a/experiment/simulation/EE6/iframes/data/img120.png b/experiment/simulation/EE6/iframes/data/img120.png new file mode 100644 index 0000000..c8ba191 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img120.png differ diff --git a/experiment/simulation/EE6/iframes/data/img121.png b/experiment/simulation/EE6/iframes/data/img121.png new file mode 100644 index 0000000..72bbf04 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img121.png differ diff --git a/experiment/simulation/EE6/iframes/data/img122.png b/experiment/simulation/EE6/iframes/data/img122.png new file mode 100644 index 0000000..611c7d4 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img122.png differ diff --git a/experiment/simulation/EE6/iframes/data/img123.png b/experiment/simulation/EE6/iframes/data/img123.png new file mode 100644 index 0000000..d1d8a39 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img123.png differ diff --git a/experiment/simulation/EE6/iframes/data/img124.png b/experiment/simulation/EE6/iframes/data/img124.png new file mode 100644 index 0000000..f662b59 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img124.png differ diff --git a/experiment/simulation/EE6/iframes/data/img125.png b/experiment/simulation/EE6/iframes/data/img125.png new file mode 100644 index 0000000..1288b61 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img125.png differ diff --git a/experiment/simulation/EE6/iframes/data/img126.png b/experiment/simulation/EE6/iframes/data/img126.png new file mode 100644 index 0000000..aba12c6 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img126.png differ diff --git a/experiment/simulation/EE6/iframes/data/img127.png b/experiment/simulation/EE6/iframes/data/img127.png new file mode 100644 index 0000000..a608244 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img127.png differ diff --git a/experiment/simulation/EE6/iframes/data/img128.png b/experiment/simulation/EE6/iframes/data/img128.png new file mode 100644 index 0000000..28773cb Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img128.png differ diff --git a/experiment/simulation/EE6/iframes/data/img129.png b/experiment/simulation/EE6/iframes/data/img129.png new file mode 100644 index 0000000..74996ea Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img129.png differ diff --git a/experiment/simulation/EE6/iframes/data/img13.png b/experiment/simulation/EE6/iframes/data/img13.png new file mode 100644 index 0000000..1bd3e91 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img13.png differ diff --git a/experiment/simulation/EE6/iframes/data/img130.png b/experiment/simulation/EE6/iframes/data/img130.png new file mode 100644 index 0000000..e198587 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img130.png differ diff --git a/experiment/simulation/EE6/iframes/data/img131.png b/experiment/simulation/EE6/iframes/data/img131.png new file mode 100644 index 0000000..a9c69fc Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img131.png differ diff --git a/experiment/simulation/EE6/iframes/data/img132.png b/experiment/simulation/EE6/iframes/data/img132.png new file mode 100644 index 0000000..e9e1392 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img132.png differ diff --git a/experiment/simulation/EE6/iframes/data/img133.png b/experiment/simulation/EE6/iframes/data/img133.png new file mode 100644 index 0000000..a8d8eb1 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img133.png differ diff --git a/experiment/simulation/EE6/iframes/data/img134.png b/experiment/simulation/EE6/iframes/data/img134.png new file mode 100644 index 0000000..051e59a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img134.png differ diff --git a/experiment/simulation/EE6/iframes/data/img135.png b/experiment/simulation/EE6/iframes/data/img135.png new file mode 100644 index 0000000..79a6877 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img135.png differ diff --git a/experiment/simulation/EE6/iframes/data/img136.png b/experiment/simulation/EE6/iframes/data/img136.png new file mode 100644 index 0000000..f744855 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img136.png differ diff --git a/experiment/simulation/EE6/iframes/data/img137.png b/experiment/simulation/EE6/iframes/data/img137.png new file mode 100644 index 0000000..b556cd9 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img137.png differ diff --git a/experiment/simulation/EE6/iframes/data/img138.png b/experiment/simulation/EE6/iframes/data/img138.png new file mode 100644 index 0000000..43e889f Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img138.png differ diff --git a/experiment/simulation/EE6/iframes/data/img139.png b/experiment/simulation/EE6/iframes/data/img139.png new file mode 100644 index 0000000..4db8459 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img139.png differ diff --git a/experiment/simulation/EE6/iframes/data/img14.jpg b/experiment/simulation/EE6/iframes/data/img14.jpg new file mode 100644 index 0000000..697a03a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img14.jpg differ diff --git a/experiment/simulation/EE6/iframes/data/img140.png b/experiment/simulation/EE6/iframes/data/img140.png new file mode 100644 index 0000000..f95fc21 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img140.png differ diff --git a/experiment/simulation/EE6/iframes/data/img141.png b/experiment/simulation/EE6/iframes/data/img141.png new file mode 100644 index 0000000..56a8bff Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img141.png differ diff --git a/experiment/simulation/EE6/iframes/data/img142.png b/experiment/simulation/EE6/iframes/data/img142.png new file mode 100644 index 0000000..53ad844 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img142.png differ diff --git a/experiment/simulation/EE6/iframes/data/img143.png b/experiment/simulation/EE6/iframes/data/img143.png new file mode 100644 index 0000000..f88f9e7 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img143.png differ diff --git a/experiment/simulation/EE6/iframes/data/img144.png b/experiment/simulation/EE6/iframes/data/img144.png new file mode 100644 index 0000000..9617b77 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img144.png differ diff --git a/experiment/simulation/EE6/iframes/data/img145.png b/experiment/simulation/EE6/iframes/data/img145.png new file mode 100644 index 0000000..cf925a3 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img145.png differ diff --git a/experiment/simulation/EE6/iframes/data/img146.png b/experiment/simulation/EE6/iframes/data/img146.png new file mode 100644 index 0000000..b04143a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img146.png differ diff --git a/experiment/simulation/EE6/iframes/data/img147.png b/experiment/simulation/EE6/iframes/data/img147.png new file mode 100644 index 0000000..52951ba Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img147.png differ diff --git a/experiment/simulation/EE6/iframes/data/img148.png b/experiment/simulation/EE6/iframes/data/img148.png new file mode 100644 index 0000000..b5d0cc3 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img148.png differ diff --git a/experiment/simulation/EE6/iframes/data/img149.png b/experiment/simulation/EE6/iframes/data/img149.png new file mode 100644 index 0000000..811aed4 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img149.png differ diff --git a/experiment/simulation/EE6/iframes/data/img15.png b/experiment/simulation/EE6/iframes/data/img15.png new file mode 100644 index 0000000..7701eb2 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img15.png differ diff --git a/experiment/simulation/EE6/iframes/data/img150.png b/experiment/simulation/EE6/iframes/data/img150.png new file mode 100644 index 0000000..af0b250 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img150.png differ diff --git a/experiment/simulation/EE6/iframes/data/img151.png b/experiment/simulation/EE6/iframes/data/img151.png new file mode 100644 index 0000000..996ffd0 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img151.png differ diff --git a/experiment/simulation/EE6/iframes/data/img152.png b/experiment/simulation/EE6/iframes/data/img152.png new file mode 100644 index 0000000..0dcdd67 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img152.png differ diff --git a/experiment/simulation/EE6/iframes/data/img153.png b/experiment/simulation/EE6/iframes/data/img153.png new file mode 100644 index 0000000..859e8b6 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img153.png differ diff --git a/experiment/simulation/EE6/iframes/data/img154.png b/experiment/simulation/EE6/iframes/data/img154.png new file mode 100644 index 0000000..f6858f6 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img154.png differ diff --git a/experiment/simulation/EE6/iframes/data/img155.png b/experiment/simulation/EE6/iframes/data/img155.png new file mode 100644 index 0000000..ce1b604 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img155.png differ diff --git a/experiment/simulation/EE6/iframes/data/img156.png b/experiment/simulation/EE6/iframes/data/img156.png new file mode 100644 index 0000000..0357397 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img156.png differ diff --git a/experiment/simulation/EE6/iframes/data/img157.png b/experiment/simulation/EE6/iframes/data/img157.png new file mode 100644 index 0000000..d984fcf Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img157.png differ diff --git a/experiment/simulation/EE6/iframes/data/img158.png b/experiment/simulation/EE6/iframes/data/img158.png new file mode 100644 index 0000000..c8cd4db Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img158.png differ diff --git a/experiment/simulation/EE6/iframes/data/img159.png b/experiment/simulation/EE6/iframes/data/img159.png new file mode 100644 index 0000000..d4006c6 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img159.png differ diff --git a/experiment/simulation/EE6/iframes/data/img16.png b/experiment/simulation/EE6/iframes/data/img16.png new file mode 100644 index 0000000..28d8221 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img16.png differ diff --git a/experiment/simulation/EE6/iframes/data/img160.png b/experiment/simulation/EE6/iframes/data/img160.png new file mode 100644 index 0000000..d096146 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img160.png differ diff --git a/experiment/simulation/EE6/iframes/data/img161.png b/experiment/simulation/EE6/iframes/data/img161.png new file mode 100644 index 0000000..452fee6 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img161.png differ diff --git a/experiment/simulation/EE6/iframes/data/img162.png b/experiment/simulation/EE6/iframes/data/img162.png new file mode 100644 index 0000000..aad720a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img162.png differ diff --git a/experiment/simulation/EE6/iframes/data/img163.png b/experiment/simulation/EE6/iframes/data/img163.png new file mode 100644 index 0000000..55211e1 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img163.png differ diff --git a/experiment/simulation/EE6/iframes/data/img164.png b/experiment/simulation/EE6/iframes/data/img164.png new file mode 100644 index 0000000..c7cab0e Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img164.png differ diff --git a/experiment/simulation/EE6/iframes/data/img165.png b/experiment/simulation/EE6/iframes/data/img165.png new file mode 100644 index 0000000..d3b26f6 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img165.png differ diff --git a/experiment/simulation/EE6/iframes/data/img166.png b/experiment/simulation/EE6/iframes/data/img166.png new file mode 100644 index 0000000..9bc8937 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img166.png differ diff --git a/experiment/simulation/EE6/iframes/data/img167.png b/experiment/simulation/EE6/iframes/data/img167.png new file mode 100644 index 0000000..3b4181a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img167.png differ diff --git a/experiment/simulation/EE6/iframes/data/img168.png b/experiment/simulation/EE6/iframes/data/img168.png new file mode 100644 index 0000000..16d1939 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img168.png differ diff --git a/experiment/simulation/EE6/iframes/data/img169.png b/experiment/simulation/EE6/iframes/data/img169.png new file mode 100644 index 0000000..4bd0f6e Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img169.png differ diff --git a/experiment/simulation/EE6/iframes/data/img17.png b/experiment/simulation/EE6/iframes/data/img17.png new file mode 100644 index 0000000..d314efe Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img17.png differ diff --git a/experiment/simulation/EE6/iframes/data/img170.png b/experiment/simulation/EE6/iframes/data/img170.png new file mode 100644 index 0000000..f6a3d72 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img170.png differ diff --git a/experiment/simulation/EE6/iframes/data/img171.png b/experiment/simulation/EE6/iframes/data/img171.png new file mode 100644 index 0000000..35a6390 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img171.png differ diff --git a/experiment/simulation/EE6/iframes/data/img172.png b/experiment/simulation/EE6/iframes/data/img172.png new file mode 100644 index 0000000..87fd201 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img172.png differ diff --git a/experiment/simulation/EE6/iframes/data/img173.png b/experiment/simulation/EE6/iframes/data/img173.png new file mode 100644 index 0000000..624561c Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img173.png differ diff --git a/experiment/simulation/EE6/iframes/data/img174.png b/experiment/simulation/EE6/iframes/data/img174.png new file mode 100644 index 0000000..fc00125 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img174.png differ diff --git a/experiment/simulation/EE6/iframes/data/img175.png b/experiment/simulation/EE6/iframes/data/img175.png new file mode 100644 index 0000000..569c455 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img175.png differ diff --git a/experiment/simulation/EE6/iframes/data/img176.png b/experiment/simulation/EE6/iframes/data/img176.png new file mode 100644 index 0000000..f9e8b3f Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img176.png differ diff --git a/experiment/simulation/EE6/iframes/data/img177.png b/experiment/simulation/EE6/iframes/data/img177.png new file mode 100644 index 0000000..8098ef2 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img177.png differ diff --git a/experiment/simulation/EE6/iframes/data/img178.png b/experiment/simulation/EE6/iframes/data/img178.png new file mode 100644 index 0000000..9efe52d Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img178.png differ diff --git a/experiment/simulation/EE6/iframes/data/img179.png b/experiment/simulation/EE6/iframes/data/img179.png new file mode 100644 index 0000000..72d6db5 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img179.png differ diff --git a/experiment/simulation/EE6/iframes/data/img18.png b/experiment/simulation/EE6/iframes/data/img18.png new file mode 100644 index 0000000..539b554 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img18.png differ diff --git a/experiment/simulation/EE6/iframes/data/img180.png b/experiment/simulation/EE6/iframes/data/img180.png new file mode 100644 index 0000000..04fb879 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img180.png differ diff --git a/experiment/simulation/EE6/iframes/data/img181.png b/experiment/simulation/EE6/iframes/data/img181.png new file mode 100644 index 0000000..8bb4de0 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img181.png differ diff --git a/experiment/simulation/EE6/iframes/data/img182.png b/experiment/simulation/EE6/iframes/data/img182.png new file mode 100644 index 0000000..ab41ed0 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img182.png differ diff --git a/experiment/simulation/EE6/iframes/data/img183.png b/experiment/simulation/EE6/iframes/data/img183.png new file mode 100644 index 0000000..dd9a746 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img183.png differ diff --git a/experiment/simulation/EE6/iframes/data/img184.png b/experiment/simulation/EE6/iframes/data/img184.png new file mode 100644 index 0000000..e47a8d9 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img184.png differ diff --git a/experiment/simulation/EE6/iframes/data/img185.png b/experiment/simulation/EE6/iframes/data/img185.png new file mode 100644 index 0000000..eaf1e2a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img185.png differ diff --git a/experiment/simulation/EE6/iframes/data/img186.png b/experiment/simulation/EE6/iframes/data/img186.png new file mode 100644 index 0000000..417ded2 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img186.png differ diff --git a/experiment/simulation/EE6/iframes/data/img187.png b/experiment/simulation/EE6/iframes/data/img187.png new file mode 100644 index 0000000..b917b17 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img187.png differ diff --git a/experiment/simulation/EE6/iframes/data/img188.png b/experiment/simulation/EE6/iframes/data/img188.png new file mode 100644 index 0000000..590193c Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img188.png differ diff --git a/experiment/simulation/EE6/iframes/data/img189.png b/experiment/simulation/EE6/iframes/data/img189.png new file mode 100644 index 0000000..c33cb73 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img189.png differ diff --git a/experiment/simulation/EE6/iframes/data/img19.png b/experiment/simulation/EE6/iframes/data/img19.png new file mode 100644 index 0000000..5d1b28b Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img19.png differ diff --git a/experiment/simulation/EE6/iframes/data/img190.png b/experiment/simulation/EE6/iframes/data/img190.png new file mode 100644 index 0000000..b278e28 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img190.png differ diff --git a/experiment/simulation/EE6/iframes/data/img191.png b/experiment/simulation/EE6/iframes/data/img191.png new file mode 100644 index 0000000..96e0fca Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img191.png differ diff --git a/experiment/simulation/EE6/iframes/data/img192.png b/experiment/simulation/EE6/iframes/data/img192.png new file mode 100644 index 0000000..fe91fb8 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img192.png differ diff --git a/experiment/simulation/EE6/iframes/data/img193.png b/experiment/simulation/EE6/iframes/data/img193.png new file mode 100644 index 0000000..216c43c Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img193.png differ diff --git a/experiment/simulation/EE6/iframes/data/img194.png b/experiment/simulation/EE6/iframes/data/img194.png new file mode 100644 index 0000000..faab1fd Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img194.png differ diff --git a/experiment/simulation/EE6/iframes/data/img195.png b/experiment/simulation/EE6/iframes/data/img195.png new file mode 100644 index 0000000..9b6b9ef Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img195.png differ diff --git a/experiment/simulation/EE6/iframes/data/img196.png b/experiment/simulation/EE6/iframes/data/img196.png new file mode 100644 index 0000000..de84574 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img196.png differ diff --git a/experiment/simulation/EE6/iframes/data/img197.png b/experiment/simulation/EE6/iframes/data/img197.png new file mode 100644 index 0000000..0c80522 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img197.png differ diff --git a/experiment/simulation/EE6/iframes/data/img198.png b/experiment/simulation/EE6/iframes/data/img198.png new file mode 100644 index 0000000..91f7f6f Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img198.png differ diff --git a/experiment/simulation/EE6/iframes/data/img199.png b/experiment/simulation/EE6/iframes/data/img199.png new file mode 100644 index 0000000..cb9dc7c Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img199.png differ diff --git a/experiment/simulation/EE6/iframes/data/img2.png b/experiment/simulation/EE6/iframes/data/img2.png new file mode 100644 index 0000000..4a332c2 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img2.png differ diff --git a/experiment/simulation/EE6/iframes/data/img20.png b/experiment/simulation/EE6/iframes/data/img20.png new file mode 100644 index 0000000..6947a02 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img20.png differ diff --git a/experiment/simulation/EE6/iframes/data/img200.png b/experiment/simulation/EE6/iframes/data/img200.png new file mode 100644 index 0000000..9f87203 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img200.png differ diff --git a/experiment/simulation/EE6/iframes/data/img201.png b/experiment/simulation/EE6/iframes/data/img201.png new file mode 100644 index 0000000..8cec636 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img201.png differ diff --git a/experiment/simulation/EE6/iframes/data/img202.png b/experiment/simulation/EE6/iframes/data/img202.png new file mode 100644 index 0000000..20a91ca Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img202.png differ diff --git a/experiment/simulation/EE6/iframes/data/img203.png b/experiment/simulation/EE6/iframes/data/img203.png new file mode 100644 index 0000000..a3ab5cc Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img203.png differ diff --git a/experiment/simulation/EE6/iframes/data/img204.png b/experiment/simulation/EE6/iframes/data/img204.png new file mode 100644 index 0000000..d60beb6 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img204.png differ diff --git a/experiment/simulation/EE6/iframes/data/img205.png b/experiment/simulation/EE6/iframes/data/img205.png new file mode 100644 index 0000000..50c9ace Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img205.png differ diff --git a/experiment/simulation/EE6/iframes/data/img206.png b/experiment/simulation/EE6/iframes/data/img206.png new file mode 100644 index 0000000..050e30d Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img206.png differ diff --git a/experiment/simulation/EE6/iframes/data/img207.png b/experiment/simulation/EE6/iframes/data/img207.png new file mode 100644 index 0000000..96532b7 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img207.png differ diff --git a/experiment/simulation/EE6/iframes/data/img208.png b/experiment/simulation/EE6/iframes/data/img208.png new file mode 100644 index 0000000..bb403ff Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img208.png differ diff --git a/experiment/simulation/EE6/iframes/data/img209.png b/experiment/simulation/EE6/iframes/data/img209.png new file mode 100644 index 0000000..238cd3c Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img209.png differ diff --git a/experiment/simulation/EE6/iframes/data/img21.png b/experiment/simulation/EE6/iframes/data/img21.png new file mode 100644 index 0000000..8e7ddd8 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img21.png differ diff --git a/experiment/simulation/EE6/iframes/data/img210.png b/experiment/simulation/EE6/iframes/data/img210.png new file mode 100644 index 0000000..68f85e1 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img210.png differ diff --git a/experiment/simulation/EE6/iframes/data/img211.png b/experiment/simulation/EE6/iframes/data/img211.png new file mode 100644 index 0000000..cb985c1 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img211.png differ diff --git a/experiment/simulation/EE6/iframes/data/img212.png b/experiment/simulation/EE6/iframes/data/img212.png new file mode 100644 index 0000000..ef2a905 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img212.png differ diff --git a/experiment/simulation/EE6/iframes/data/img213.png b/experiment/simulation/EE6/iframes/data/img213.png new file mode 100644 index 0000000..ac359f5 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img213.png differ diff --git a/experiment/simulation/EE6/iframes/data/img214.png b/experiment/simulation/EE6/iframes/data/img214.png new file mode 100644 index 0000000..35abcc5 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img214.png differ diff --git a/experiment/simulation/EE6/iframes/data/img215.png b/experiment/simulation/EE6/iframes/data/img215.png new file mode 100644 index 0000000..847a991 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img215.png differ diff --git a/experiment/simulation/EE6/iframes/data/img216.png b/experiment/simulation/EE6/iframes/data/img216.png new file mode 100644 index 0000000..c7a5861 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img216.png differ diff --git a/experiment/simulation/EE6/iframes/data/img217.png b/experiment/simulation/EE6/iframes/data/img217.png new file mode 100644 index 0000000..73653c1 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img217.png differ diff --git a/experiment/simulation/EE6/iframes/data/img218.png b/experiment/simulation/EE6/iframes/data/img218.png new file mode 100644 index 0000000..cae13ae Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img218.png differ diff --git a/experiment/simulation/EE6/iframes/data/img219.png b/experiment/simulation/EE6/iframes/data/img219.png new file mode 100644 index 0000000..03ef945 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img219.png differ diff --git a/experiment/simulation/EE6/iframes/data/img22.png b/experiment/simulation/EE6/iframes/data/img22.png new file mode 100644 index 0000000..fe0925c Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img22.png differ diff --git a/experiment/simulation/EE6/iframes/data/img220.png b/experiment/simulation/EE6/iframes/data/img220.png new file mode 100644 index 0000000..936d938 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img220.png differ diff --git a/experiment/simulation/EE6/iframes/data/img221.png b/experiment/simulation/EE6/iframes/data/img221.png new file mode 100644 index 0000000..c65bb21 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img221.png differ diff --git a/experiment/simulation/EE6/iframes/data/img222.png b/experiment/simulation/EE6/iframes/data/img222.png new file mode 100644 index 0000000..d3e2e7b Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img222.png differ diff --git a/experiment/simulation/EE6/iframes/data/img223.png b/experiment/simulation/EE6/iframes/data/img223.png new file mode 100644 index 0000000..5c1a1c5 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img223.png differ diff --git a/experiment/simulation/EE6/iframes/data/img224.png b/experiment/simulation/EE6/iframes/data/img224.png new file mode 100644 index 0000000..cb29693 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img224.png differ diff --git a/experiment/simulation/EE6/iframes/data/img225.png b/experiment/simulation/EE6/iframes/data/img225.png new file mode 100644 index 0000000..151b45e Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img225.png differ diff --git a/experiment/simulation/EE6/iframes/data/img226.png b/experiment/simulation/EE6/iframes/data/img226.png new file mode 100644 index 0000000..3c1b665 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img226.png differ diff --git a/experiment/simulation/EE6/iframes/data/img227.png b/experiment/simulation/EE6/iframes/data/img227.png new file mode 100644 index 0000000..94e7da9 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img227.png differ diff --git a/experiment/simulation/EE6/iframes/data/img228.png b/experiment/simulation/EE6/iframes/data/img228.png new file mode 100644 index 0000000..feaad78 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img228.png differ diff --git a/experiment/simulation/EE6/iframes/data/img229.png b/experiment/simulation/EE6/iframes/data/img229.png new file mode 100644 index 0000000..eeaa6cb Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img229.png differ diff --git a/experiment/simulation/EE6/iframes/data/img23.png b/experiment/simulation/EE6/iframes/data/img23.png new file mode 100644 index 0000000..46b8cd3 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img23.png differ diff --git a/experiment/simulation/EE6/iframes/data/img230.png b/experiment/simulation/EE6/iframes/data/img230.png new file mode 100644 index 0000000..cb4b57a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img230.png differ diff --git a/experiment/simulation/EE6/iframes/data/img231.png b/experiment/simulation/EE6/iframes/data/img231.png new file mode 100644 index 0000000..e8e9d7d Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img231.png differ diff --git a/experiment/simulation/EE6/iframes/data/img232.png b/experiment/simulation/EE6/iframes/data/img232.png new file mode 100644 index 0000000..faf9305 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img232.png differ diff --git a/experiment/simulation/EE6/iframes/data/img233.png b/experiment/simulation/EE6/iframes/data/img233.png new file mode 100644 index 0000000..0c15da8 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img233.png differ diff --git a/experiment/simulation/EE6/iframes/data/img234.png b/experiment/simulation/EE6/iframes/data/img234.png new file mode 100644 index 0000000..fc162f1 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img234.png differ diff --git a/experiment/simulation/EE6/iframes/data/img235.png b/experiment/simulation/EE6/iframes/data/img235.png new file mode 100644 index 0000000..515bb97 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img235.png differ diff --git a/experiment/simulation/EE6/iframes/data/img236.png b/experiment/simulation/EE6/iframes/data/img236.png new file mode 100644 index 0000000..afee920 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img236.png differ diff --git a/experiment/simulation/EE6/iframes/data/img237.png b/experiment/simulation/EE6/iframes/data/img237.png new file mode 100644 index 0000000..3f50114 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img237.png differ diff --git a/experiment/simulation/EE6/iframes/data/img238.png b/experiment/simulation/EE6/iframes/data/img238.png new file mode 100644 index 0000000..0c52f8f Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img238.png differ diff --git a/experiment/simulation/EE6/iframes/data/img239.png b/experiment/simulation/EE6/iframes/data/img239.png new file mode 100644 index 0000000..5d1f843 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img239.png differ diff --git a/experiment/simulation/EE6/iframes/data/img24.png b/experiment/simulation/EE6/iframes/data/img24.png new file mode 100644 index 0000000..a1788d6 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img24.png differ diff --git a/experiment/simulation/EE6/iframes/data/img240.png b/experiment/simulation/EE6/iframes/data/img240.png new file mode 100644 index 0000000..b0edc42 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img240.png differ diff --git a/experiment/simulation/EE6/iframes/data/img241.png b/experiment/simulation/EE6/iframes/data/img241.png new file mode 100644 index 0000000..ba96ffe Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img241.png differ diff --git a/experiment/simulation/EE6/iframes/data/img242.png b/experiment/simulation/EE6/iframes/data/img242.png new file mode 100644 index 0000000..28a04f2 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img242.png differ diff --git a/experiment/simulation/EE6/iframes/data/img243.png b/experiment/simulation/EE6/iframes/data/img243.png new file mode 100644 index 0000000..66b8028 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img243.png differ diff --git a/experiment/simulation/EE6/iframes/data/img244.png b/experiment/simulation/EE6/iframes/data/img244.png new file mode 100644 index 0000000..a3a2d6e Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img244.png differ diff --git a/experiment/simulation/EE6/iframes/data/img245.png b/experiment/simulation/EE6/iframes/data/img245.png new file mode 100644 index 0000000..4843406 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img245.png differ diff --git a/experiment/simulation/EE6/iframes/data/img246.png b/experiment/simulation/EE6/iframes/data/img246.png new file mode 100644 index 0000000..a87e186 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img246.png differ diff --git a/experiment/simulation/EE6/iframes/data/img247.png b/experiment/simulation/EE6/iframes/data/img247.png new file mode 100644 index 0000000..086c437 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img247.png differ diff --git a/experiment/simulation/EE6/iframes/data/img248.png b/experiment/simulation/EE6/iframes/data/img248.png new file mode 100644 index 0000000..97e1e8d Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img248.png differ diff --git a/experiment/simulation/EE6/iframes/data/img249.png b/experiment/simulation/EE6/iframes/data/img249.png new file mode 100644 index 0000000..3361dce Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img249.png differ diff --git a/experiment/simulation/EE6/iframes/data/img25.png b/experiment/simulation/EE6/iframes/data/img25.png new file mode 100644 index 0000000..5c3948a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img25.png differ diff --git a/experiment/simulation/EE6/iframes/data/img250.png b/experiment/simulation/EE6/iframes/data/img250.png new file mode 100644 index 0000000..25c936d Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img250.png differ diff --git a/experiment/simulation/EE6/iframes/data/img251.png b/experiment/simulation/EE6/iframes/data/img251.png new file mode 100644 index 0000000..5c132f7 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img251.png differ diff --git a/experiment/simulation/EE6/iframes/data/img252.png b/experiment/simulation/EE6/iframes/data/img252.png new file mode 100644 index 0000000..f024d3e Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img252.png differ diff --git a/experiment/simulation/EE6/iframes/data/img253.png b/experiment/simulation/EE6/iframes/data/img253.png new file mode 100644 index 0000000..0e1d8fd Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img253.png differ diff --git a/experiment/simulation/EE6/iframes/data/img254.png b/experiment/simulation/EE6/iframes/data/img254.png new file mode 100644 index 0000000..577c5a3 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img254.png differ diff --git a/experiment/simulation/EE6/iframes/data/img255.png b/experiment/simulation/EE6/iframes/data/img255.png new file mode 100644 index 0000000..071e2df Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img255.png differ diff --git a/experiment/simulation/EE6/iframes/data/img256.png b/experiment/simulation/EE6/iframes/data/img256.png new file mode 100644 index 0000000..a9b9843 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img256.png differ diff --git a/experiment/simulation/EE6/iframes/data/img257.png b/experiment/simulation/EE6/iframes/data/img257.png new file mode 100644 index 0000000..16eac56 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img257.png differ diff --git a/experiment/simulation/EE6/iframes/data/img258.png b/experiment/simulation/EE6/iframes/data/img258.png new file mode 100644 index 0000000..dcdd775 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img258.png differ diff --git a/experiment/simulation/EE6/iframes/data/img259.png b/experiment/simulation/EE6/iframes/data/img259.png new file mode 100644 index 0000000..d757d48 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img259.png differ diff --git a/experiment/simulation/EE6/iframes/data/img26.png b/experiment/simulation/EE6/iframes/data/img26.png new file mode 100644 index 0000000..867aa23 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img26.png differ diff --git a/experiment/simulation/EE6/iframes/data/img260.png b/experiment/simulation/EE6/iframes/data/img260.png new file mode 100644 index 0000000..59da1df Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img260.png differ diff --git a/experiment/simulation/EE6/iframes/data/img261.png b/experiment/simulation/EE6/iframes/data/img261.png new file mode 100644 index 0000000..b7d6d4d Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img261.png differ diff --git a/experiment/simulation/EE6/iframes/data/img262.png b/experiment/simulation/EE6/iframes/data/img262.png new file mode 100644 index 0000000..49a36f3 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img262.png differ diff --git a/experiment/simulation/EE6/iframes/data/img263.png b/experiment/simulation/EE6/iframes/data/img263.png new file mode 100644 index 0000000..b765cd4 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img263.png differ diff --git a/experiment/simulation/EE6/iframes/data/img264.png b/experiment/simulation/EE6/iframes/data/img264.png new file mode 100644 index 0000000..85fe42b Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img264.png differ diff --git a/experiment/simulation/EE6/iframes/data/img265.png b/experiment/simulation/EE6/iframes/data/img265.png new file mode 100644 index 0000000..3c89406 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img265.png differ diff --git a/experiment/simulation/EE6/iframes/data/img266.png b/experiment/simulation/EE6/iframes/data/img266.png new file mode 100644 index 0000000..5acc02f Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img266.png differ diff --git a/experiment/simulation/EE6/iframes/data/img267.png b/experiment/simulation/EE6/iframes/data/img267.png new file mode 100644 index 0000000..7928e25 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img267.png differ diff --git a/experiment/simulation/EE6/iframes/data/img268.png b/experiment/simulation/EE6/iframes/data/img268.png new file mode 100644 index 0000000..2e37f6b Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img268.png differ diff --git a/experiment/simulation/EE6/iframes/data/img269.png b/experiment/simulation/EE6/iframes/data/img269.png new file mode 100644 index 0000000..65af341 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img269.png differ diff --git a/experiment/simulation/EE6/iframes/data/img27.png b/experiment/simulation/EE6/iframes/data/img27.png new file mode 100644 index 0000000..be9bba2 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img27.png differ diff --git a/experiment/simulation/EE6/iframes/data/img270.png b/experiment/simulation/EE6/iframes/data/img270.png new file mode 100644 index 0000000..2af9b1e Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img270.png differ diff --git a/experiment/simulation/EE6/iframes/data/img271.png b/experiment/simulation/EE6/iframes/data/img271.png new file mode 100644 index 0000000..4b54fa7 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img271.png differ diff --git a/experiment/simulation/EE6/iframes/data/img272.png b/experiment/simulation/EE6/iframes/data/img272.png new file mode 100644 index 0000000..b1f5828 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img272.png differ diff --git a/experiment/simulation/EE6/iframes/data/img273.png b/experiment/simulation/EE6/iframes/data/img273.png new file mode 100644 index 0000000..094f80d Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img273.png differ diff --git a/experiment/simulation/EE6/iframes/data/img274.png b/experiment/simulation/EE6/iframes/data/img274.png new file mode 100644 index 0000000..b9aa282 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img274.png differ diff --git a/experiment/simulation/EE6/iframes/data/img275.png b/experiment/simulation/EE6/iframes/data/img275.png new file mode 100644 index 0000000..15d79fa Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img275.png differ diff --git a/experiment/simulation/EE6/iframes/data/img276.png b/experiment/simulation/EE6/iframes/data/img276.png new file mode 100644 index 0000000..0728c45 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img276.png differ diff --git a/experiment/simulation/EE6/iframes/data/img277.png b/experiment/simulation/EE6/iframes/data/img277.png new file mode 100644 index 0000000..d8ad2b6 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img277.png differ diff --git a/experiment/simulation/EE6/iframes/data/img278.png b/experiment/simulation/EE6/iframes/data/img278.png new file mode 100644 index 0000000..825a3d9 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img278.png differ diff --git a/experiment/simulation/EE6/iframes/data/img279.png b/experiment/simulation/EE6/iframes/data/img279.png new file mode 100644 index 0000000..b76af07 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img279.png differ diff --git a/experiment/simulation/EE6/iframes/data/img28.png b/experiment/simulation/EE6/iframes/data/img28.png new file mode 100644 index 0000000..a4d5663 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img28.png differ diff --git a/experiment/simulation/EE6/iframes/data/img280.png b/experiment/simulation/EE6/iframes/data/img280.png new file mode 100644 index 0000000..37174d1 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img280.png differ diff --git a/experiment/simulation/EE6/iframes/data/img281.png b/experiment/simulation/EE6/iframes/data/img281.png new file mode 100644 index 0000000..2c0977d Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img281.png differ diff --git a/experiment/simulation/EE6/iframes/data/img282.png b/experiment/simulation/EE6/iframes/data/img282.png new file mode 100644 index 0000000..2ba4dc9 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img282.png differ diff --git a/experiment/simulation/EE6/iframes/data/img283.png b/experiment/simulation/EE6/iframes/data/img283.png new file mode 100644 index 0000000..5c42bf2 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img283.png differ diff --git a/experiment/simulation/EE6/iframes/data/img284.png b/experiment/simulation/EE6/iframes/data/img284.png new file mode 100644 index 0000000..e4d0f20 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img284.png differ diff --git a/experiment/simulation/EE6/iframes/data/img285.png b/experiment/simulation/EE6/iframes/data/img285.png new file mode 100644 index 0000000..efb6f65 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img285.png differ diff --git a/experiment/simulation/EE6/iframes/data/img286.png b/experiment/simulation/EE6/iframes/data/img286.png new file mode 100644 index 0000000..b3a37eb Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img286.png differ diff --git a/experiment/simulation/EE6/iframes/data/img287.png b/experiment/simulation/EE6/iframes/data/img287.png new file mode 100644 index 0000000..e6451f7 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img287.png differ diff --git a/experiment/simulation/EE6/iframes/data/img288.png b/experiment/simulation/EE6/iframes/data/img288.png new file mode 100644 index 0000000..a645db9 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img288.png differ diff --git a/experiment/simulation/EE6/iframes/data/img289.png b/experiment/simulation/EE6/iframes/data/img289.png new file mode 100644 index 0000000..08a5706 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img289.png differ diff --git a/experiment/simulation/EE6/iframes/data/img29.png b/experiment/simulation/EE6/iframes/data/img29.png new file mode 100644 index 0000000..7eede7e Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img29.png differ diff --git a/experiment/simulation/EE6/iframes/data/img290.png b/experiment/simulation/EE6/iframes/data/img290.png new file mode 100644 index 0000000..5322c2b Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img290.png differ diff --git a/experiment/simulation/EE6/iframes/data/img291.png b/experiment/simulation/EE6/iframes/data/img291.png new file mode 100644 index 0000000..d00e1c7 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img291.png differ diff --git a/experiment/simulation/EE6/iframes/data/img292.png b/experiment/simulation/EE6/iframes/data/img292.png new file mode 100644 index 0000000..de93a31 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img292.png differ diff --git a/experiment/simulation/EE6/iframes/data/img293.png b/experiment/simulation/EE6/iframes/data/img293.png new file mode 100644 index 0000000..a165027 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img293.png differ diff --git a/experiment/simulation/EE6/iframes/data/img294.png b/experiment/simulation/EE6/iframes/data/img294.png new file mode 100644 index 0000000..76323e5 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img294.png differ diff --git a/experiment/simulation/EE6/iframes/data/img295.png b/experiment/simulation/EE6/iframes/data/img295.png new file mode 100644 index 0000000..c65e94c Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img295.png differ diff --git a/experiment/simulation/EE6/iframes/data/img296.png b/experiment/simulation/EE6/iframes/data/img296.png new file mode 100644 index 0000000..de80039 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img296.png differ diff --git a/experiment/simulation/EE6/iframes/data/img297.png b/experiment/simulation/EE6/iframes/data/img297.png new file mode 100644 index 0000000..a9deae6 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img297.png differ diff --git a/experiment/simulation/EE6/iframes/data/img298.png b/experiment/simulation/EE6/iframes/data/img298.png new file mode 100644 index 0000000..dd9b4f9 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img298.png differ diff --git a/experiment/simulation/EE6/iframes/data/img299.png b/experiment/simulation/EE6/iframes/data/img299.png new file mode 100644 index 0000000..3455e9a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img299.png differ diff --git a/experiment/simulation/EE6/iframes/data/img3.png b/experiment/simulation/EE6/iframes/data/img3.png new file mode 100644 index 0000000..035266b Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img3.png differ diff --git a/experiment/simulation/EE6/iframes/data/img30.png b/experiment/simulation/EE6/iframes/data/img30.png new file mode 100644 index 0000000..5673f1b Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img30.png differ diff --git a/experiment/simulation/EE6/iframes/data/img300.png b/experiment/simulation/EE6/iframes/data/img300.png new file mode 100644 index 0000000..8f96983 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img300.png differ diff --git a/experiment/simulation/EE6/iframes/data/img301.png b/experiment/simulation/EE6/iframes/data/img301.png new file mode 100644 index 0000000..675d1eb Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img301.png differ diff --git a/experiment/simulation/EE6/iframes/data/img302.png b/experiment/simulation/EE6/iframes/data/img302.png new file mode 100644 index 0000000..d029dd9 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img302.png differ diff --git a/experiment/simulation/EE6/iframes/data/img303.png b/experiment/simulation/EE6/iframes/data/img303.png new file mode 100644 index 0000000..35b738a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img303.png differ diff --git a/experiment/simulation/EE6/iframes/data/img304.png b/experiment/simulation/EE6/iframes/data/img304.png new file mode 100644 index 0000000..8e57879 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img304.png differ diff --git a/experiment/simulation/EE6/iframes/data/img305.png b/experiment/simulation/EE6/iframes/data/img305.png new file mode 100644 index 0000000..3f6912b Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img305.png differ diff --git a/experiment/simulation/EE6/iframes/data/img306.png b/experiment/simulation/EE6/iframes/data/img306.png new file mode 100644 index 0000000..1647bda Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img306.png differ diff --git a/experiment/simulation/EE6/iframes/data/img307.png b/experiment/simulation/EE6/iframes/data/img307.png new file mode 100644 index 0000000..428c99e Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img307.png differ diff --git a/experiment/simulation/EE6/iframes/data/img308.png b/experiment/simulation/EE6/iframes/data/img308.png new file mode 100644 index 0000000..b1086a1 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img308.png differ diff --git a/experiment/simulation/EE6/iframes/data/img309.png b/experiment/simulation/EE6/iframes/data/img309.png new file mode 100644 index 0000000..191fcd5 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img309.png differ diff --git a/experiment/simulation/EE6/iframes/data/img31.png b/experiment/simulation/EE6/iframes/data/img31.png new file mode 100644 index 0000000..c717eb7 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img31.png differ diff --git a/experiment/simulation/EE6/iframes/data/img310.png b/experiment/simulation/EE6/iframes/data/img310.png new file mode 100644 index 0000000..66123fb Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img310.png differ diff --git a/experiment/simulation/EE6/iframes/data/img311.png b/experiment/simulation/EE6/iframes/data/img311.png new file mode 100644 index 0000000..215d6f4 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img311.png differ diff --git a/experiment/simulation/EE6/iframes/data/img312.png b/experiment/simulation/EE6/iframes/data/img312.png new file mode 100644 index 0000000..542ed48 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img312.png differ diff --git a/experiment/simulation/EE6/iframes/data/img313.png b/experiment/simulation/EE6/iframes/data/img313.png new file mode 100644 index 0000000..aff833a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img313.png differ diff --git a/experiment/simulation/EE6/iframes/data/img314.png b/experiment/simulation/EE6/iframes/data/img314.png new file mode 100644 index 0000000..59111ba Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img314.png differ diff --git a/experiment/simulation/EE6/iframes/data/img315.png b/experiment/simulation/EE6/iframes/data/img315.png new file mode 100644 index 0000000..783443c Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img315.png differ diff --git a/experiment/simulation/EE6/iframes/data/img316.png b/experiment/simulation/EE6/iframes/data/img316.png new file mode 100644 index 0000000..09e03ba Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img316.png differ diff --git a/experiment/simulation/EE6/iframes/data/img317.png b/experiment/simulation/EE6/iframes/data/img317.png new file mode 100644 index 0000000..9f75a7f Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img317.png differ diff --git a/experiment/simulation/EE6/iframes/data/img318.png b/experiment/simulation/EE6/iframes/data/img318.png new file mode 100644 index 0000000..21e6b59 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img318.png differ diff --git a/experiment/simulation/EE6/iframes/data/img319.png b/experiment/simulation/EE6/iframes/data/img319.png new file mode 100644 index 0000000..98e416c Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img319.png differ diff --git a/experiment/simulation/EE6/iframes/data/img32.png b/experiment/simulation/EE6/iframes/data/img32.png new file mode 100644 index 0000000..0d5165c Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img32.png differ diff --git a/experiment/simulation/EE6/iframes/data/img320.png b/experiment/simulation/EE6/iframes/data/img320.png new file mode 100644 index 0000000..465e9fe Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img320.png differ diff --git a/experiment/simulation/EE6/iframes/data/img321.png b/experiment/simulation/EE6/iframes/data/img321.png new file mode 100644 index 0000000..6fd5a94 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img321.png differ diff --git a/experiment/simulation/EE6/iframes/data/img322.png b/experiment/simulation/EE6/iframes/data/img322.png new file mode 100644 index 0000000..eb4fd97 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img322.png differ diff --git a/experiment/simulation/EE6/iframes/data/img323.png b/experiment/simulation/EE6/iframes/data/img323.png new file mode 100644 index 0000000..f1dae99 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img323.png differ diff --git a/experiment/simulation/EE6/iframes/data/img324.png b/experiment/simulation/EE6/iframes/data/img324.png new file mode 100644 index 0000000..91bb6bb Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img324.png differ diff --git a/experiment/simulation/EE6/iframes/data/img325.png b/experiment/simulation/EE6/iframes/data/img325.png new file mode 100644 index 0000000..3571e42 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img325.png differ diff --git a/experiment/simulation/EE6/iframes/data/img326.png b/experiment/simulation/EE6/iframes/data/img326.png new file mode 100644 index 0000000..01d2e7a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img326.png differ diff --git a/experiment/simulation/EE6/iframes/data/img327.png b/experiment/simulation/EE6/iframes/data/img327.png new file mode 100644 index 0000000..7265691 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img327.png differ diff --git a/experiment/simulation/EE6/iframes/data/img328.png b/experiment/simulation/EE6/iframes/data/img328.png new file mode 100644 index 0000000..d2d9a0e Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img328.png differ diff --git a/experiment/simulation/EE6/iframes/data/img329.png b/experiment/simulation/EE6/iframes/data/img329.png new file mode 100644 index 0000000..46d9fc6 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img329.png differ diff --git a/experiment/simulation/EE6/iframes/data/img33.png b/experiment/simulation/EE6/iframes/data/img33.png new file mode 100644 index 0000000..9228003 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img33.png differ diff --git a/experiment/simulation/EE6/iframes/data/img330.png b/experiment/simulation/EE6/iframes/data/img330.png new file mode 100644 index 0000000..3025f1f Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img330.png differ diff --git a/experiment/simulation/EE6/iframes/data/img331.png b/experiment/simulation/EE6/iframes/data/img331.png new file mode 100644 index 0000000..36a328f Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img331.png differ diff --git a/experiment/simulation/EE6/iframes/data/img332.png b/experiment/simulation/EE6/iframes/data/img332.png new file mode 100644 index 0000000..8c78df6 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img332.png differ diff --git a/experiment/simulation/EE6/iframes/data/img333.png b/experiment/simulation/EE6/iframes/data/img333.png new file mode 100644 index 0000000..fb98962 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img333.png differ diff --git a/experiment/simulation/EE6/iframes/data/img334.png b/experiment/simulation/EE6/iframes/data/img334.png new file mode 100644 index 0000000..b298c8e Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img334.png differ diff --git a/experiment/simulation/EE6/iframes/data/img335.png b/experiment/simulation/EE6/iframes/data/img335.png new file mode 100644 index 0000000..f8f3877 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img335.png differ diff --git a/experiment/simulation/EE6/iframes/data/img336.png b/experiment/simulation/EE6/iframes/data/img336.png new file mode 100644 index 0000000..cf15ece Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img336.png differ diff --git a/experiment/simulation/EE6/iframes/data/img337.png b/experiment/simulation/EE6/iframes/data/img337.png new file mode 100644 index 0000000..e8baff8 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img337.png differ diff --git a/experiment/simulation/EE6/iframes/data/img338.png b/experiment/simulation/EE6/iframes/data/img338.png new file mode 100644 index 0000000..f24a03a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img338.png differ diff --git a/experiment/simulation/EE6/iframes/data/img339.png b/experiment/simulation/EE6/iframes/data/img339.png new file mode 100644 index 0000000..3bbde15 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img339.png differ diff --git a/experiment/simulation/EE6/iframes/data/img34.png b/experiment/simulation/EE6/iframes/data/img34.png new file mode 100644 index 0000000..cd7ed43 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img34.png differ diff --git a/experiment/simulation/EE6/iframes/data/img340.png b/experiment/simulation/EE6/iframes/data/img340.png new file mode 100644 index 0000000..2717650 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img340.png differ diff --git a/experiment/simulation/EE6/iframes/data/img341.png b/experiment/simulation/EE6/iframes/data/img341.png new file mode 100644 index 0000000..bb4baba Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img341.png differ diff --git a/experiment/simulation/EE6/iframes/data/img342.png b/experiment/simulation/EE6/iframes/data/img342.png new file mode 100644 index 0000000..b951cfe Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img342.png differ diff --git a/experiment/simulation/EE6/iframes/data/img343.png b/experiment/simulation/EE6/iframes/data/img343.png new file mode 100644 index 0000000..873a4de Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img343.png differ diff --git a/experiment/simulation/EE6/iframes/data/img344.png b/experiment/simulation/EE6/iframes/data/img344.png new file mode 100644 index 0000000..94e5f84 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img344.png differ diff --git a/experiment/simulation/EE6/iframes/data/img345.png b/experiment/simulation/EE6/iframes/data/img345.png new file mode 100644 index 0000000..85ac309 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img345.png differ diff --git a/experiment/simulation/EE6/iframes/data/img346.png b/experiment/simulation/EE6/iframes/data/img346.png new file mode 100644 index 0000000..79e30d4 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img346.png differ diff --git a/experiment/simulation/EE6/iframes/data/img347.png b/experiment/simulation/EE6/iframes/data/img347.png new file mode 100644 index 0000000..d2db4ad Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img347.png differ diff --git a/experiment/simulation/EE6/iframes/data/img348.png b/experiment/simulation/EE6/iframes/data/img348.png new file mode 100644 index 0000000..a94c645 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img348.png differ diff --git a/experiment/simulation/EE6/iframes/data/img349.png b/experiment/simulation/EE6/iframes/data/img349.png new file mode 100644 index 0000000..398b788 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img349.png differ diff --git a/experiment/simulation/EE6/iframes/data/img35.png b/experiment/simulation/EE6/iframes/data/img35.png new file mode 100644 index 0000000..c7452f4 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img35.png differ diff --git a/experiment/simulation/EE6/iframes/data/img350.png b/experiment/simulation/EE6/iframes/data/img350.png new file mode 100644 index 0000000..d1bf1b2 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img350.png differ diff --git a/experiment/simulation/EE6/iframes/data/img351.png b/experiment/simulation/EE6/iframes/data/img351.png new file mode 100644 index 0000000..78e4943 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img351.png differ diff --git a/experiment/simulation/EE6/iframes/data/img352.png b/experiment/simulation/EE6/iframes/data/img352.png new file mode 100644 index 0000000..29688d6 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img352.png differ diff --git a/experiment/simulation/EE6/iframes/data/img353.png b/experiment/simulation/EE6/iframes/data/img353.png new file mode 100644 index 0000000..664af69 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img353.png differ diff --git a/experiment/simulation/EE6/iframes/data/img354.png b/experiment/simulation/EE6/iframes/data/img354.png new file mode 100644 index 0000000..7763a75 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img354.png differ diff --git a/experiment/simulation/EE6/iframes/data/img355.png b/experiment/simulation/EE6/iframes/data/img355.png new file mode 100644 index 0000000..5811669 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img355.png differ diff --git a/experiment/simulation/EE6/iframes/data/img356.png b/experiment/simulation/EE6/iframes/data/img356.png new file mode 100644 index 0000000..06f0190 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img356.png differ diff --git a/experiment/simulation/EE6/iframes/data/img357.png b/experiment/simulation/EE6/iframes/data/img357.png new file mode 100644 index 0000000..dc246d2 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img357.png differ diff --git a/experiment/simulation/EE6/iframes/data/img358.png b/experiment/simulation/EE6/iframes/data/img358.png new file mode 100644 index 0000000..14e6989 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img358.png differ diff --git a/experiment/simulation/EE6/iframes/data/img359.png b/experiment/simulation/EE6/iframes/data/img359.png new file mode 100644 index 0000000..dd24706 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img359.png differ diff --git a/experiment/simulation/EE6/iframes/data/img36.png b/experiment/simulation/EE6/iframes/data/img36.png new file mode 100644 index 0000000..dc1a8db Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img36.png differ diff --git a/experiment/simulation/EE6/iframes/data/img360.png b/experiment/simulation/EE6/iframes/data/img360.png new file mode 100644 index 0000000..a5e36a8 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img360.png differ diff --git a/experiment/simulation/EE6/iframes/data/img361.png b/experiment/simulation/EE6/iframes/data/img361.png new file mode 100644 index 0000000..7fd3382 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img361.png differ diff --git a/experiment/simulation/EE6/iframes/data/img362.png b/experiment/simulation/EE6/iframes/data/img362.png new file mode 100644 index 0000000..ebbffcd Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img362.png differ diff --git a/experiment/simulation/EE6/iframes/data/img363.png b/experiment/simulation/EE6/iframes/data/img363.png new file mode 100644 index 0000000..f29eb77 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img363.png differ diff --git a/experiment/simulation/EE6/iframes/data/img364.png b/experiment/simulation/EE6/iframes/data/img364.png new file mode 100644 index 0000000..56d2e10 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img364.png differ diff --git a/experiment/simulation/EE6/iframes/data/img365.png b/experiment/simulation/EE6/iframes/data/img365.png new file mode 100644 index 0000000..cedc74f Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img365.png differ diff --git a/experiment/simulation/EE6/iframes/data/img366.png b/experiment/simulation/EE6/iframes/data/img366.png new file mode 100644 index 0000000..1944e9a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img366.png differ diff --git a/experiment/simulation/EE6/iframes/data/img367.png b/experiment/simulation/EE6/iframes/data/img367.png new file mode 100644 index 0000000..842c8c2 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img367.png differ diff --git a/experiment/simulation/EE6/iframes/data/img368.png b/experiment/simulation/EE6/iframes/data/img368.png new file mode 100644 index 0000000..f0fcba6 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img368.png differ diff --git a/experiment/simulation/EE6/iframes/data/img369.png b/experiment/simulation/EE6/iframes/data/img369.png new file mode 100644 index 0000000..887f758 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img369.png differ diff --git a/experiment/simulation/EE6/iframes/data/img37.png b/experiment/simulation/EE6/iframes/data/img37.png new file mode 100644 index 0000000..c7d668b Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img37.png differ diff --git a/experiment/simulation/EE6/iframes/data/img370.png b/experiment/simulation/EE6/iframes/data/img370.png new file mode 100644 index 0000000..ee525e7 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img370.png differ diff --git a/experiment/simulation/EE6/iframes/data/img371.png b/experiment/simulation/EE6/iframes/data/img371.png new file mode 100644 index 0000000..652ccfb Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img371.png differ diff --git a/experiment/simulation/EE6/iframes/data/img372.png b/experiment/simulation/EE6/iframes/data/img372.png new file mode 100644 index 0000000..125a2b5 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img372.png differ diff --git a/experiment/simulation/EE6/iframes/data/img373.png b/experiment/simulation/EE6/iframes/data/img373.png new file mode 100644 index 0000000..2c384b9 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img373.png differ diff --git a/experiment/simulation/EE6/iframes/data/img374.png b/experiment/simulation/EE6/iframes/data/img374.png new file mode 100644 index 0000000..0d3881c Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img374.png differ diff --git a/experiment/simulation/EE6/iframes/data/img375.png b/experiment/simulation/EE6/iframes/data/img375.png new file mode 100644 index 0000000..e5c6c78 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img375.png differ diff --git a/experiment/simulation/EE6/iframes/data/img376.png b/experiment/simulation/EE6/iframes/data/img376.png new file mode 100644 index 0000000..799f304 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img376.png differ diff --git a/experiment/simulation/EE6/iframes/data/img377.png b/experiment/simulation/EE6/iframes/data/img377.png new file mode 100644 index 0000000..b4e8900 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img377.png differ diff --git a/experiment/simulation/EE6/iframes/data/img378.png b/experiment/simulation/EE6/iframes/data/img378.png new file mode 100644 index 0000000..b65daf7 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img378.png differ diff --git a/experiment/simulation/EE6/iframes/data/img379.png b/experiment/simulation/EE6/iframes/data/img379.png new file mode 100644 index 0000000..87cedde Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img379.png differ diff --git a/experiment/simulation/EE6/iframes/data/img38.png b/experiment/simulation/EE6/iframes/data/img38.png new file mode 100644 index 0000000..ad83ec0 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img38.png differ diff --git a/experiment/simulation/EE6/iframes/data/img380.png b/experiment/simulation/EE6/iframes/data/img380.png new file mode 100644 index 0000000..f2f71f5 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img380.png differ diff --git a/experiment/simulation/EE6/iframes/data/img381.png b/experiment/simulation/EE6/iframes/data/img381.png new file mode 100644 index 0000000..877b548 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img381.png differ diff --git a/experiment/simulation/EE6/iframes/data/img382.png b/experiment/simulation/EE6/iframes/data/img382.png new file mode 100644 index 0000000..3e04aa6 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img382.png differ diff --git a/experiment/simulation/EE6/iframes/data/img383.png b/experiment/simulation/EE6/iframes/data/img383.png new file mode 100644 index 0000000..656b941 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img383.png differ diff --git a/experiment/simulation/EE6/iframes/data/img384.png b/experiment/simulation/EE6/iframes/data/img384.png new file mode 100644 index 0000000..a0ee88b Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img384.png differ diff --git a/experiment/simulation/EE6/iframes/data/img385.png b/experiment/simulation/EE6/iframes/data/img385.png new file mode 100644 index 0000000..96da029 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img385.png differ diff --git a/experiment/simulation/EE6/iframes/data/img386.png b/experiment/simulation/EE6/iframes/data/img386.png new file mode 100644 index 0000000..7e06f94 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img386.png differ diff --git a/experiment/simulation/EE6/iframes/data/img387.png b/experiment/simulation/EE6/iframes/data/img387.png new file mode 100644 index 0000000..5a2896c Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img387.png differ diff --git a/experiment/simulation/EE6/iframes/data/img388.png b/experiment/simulation/EE6/iframes/data/img388.png new file mode 100644 index 0000000..5a41921 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img388.png differ diff --git a/experiment/simulation/EE6/iframes/data/img389.png b/experiment/simulation/EE6/iframes/data/img389.png new file mode 100644 index 0000000..18caa61 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img389.png differ diff --git a/experiment/simulation/EE6/iframes/data/img39.png b/experiment/simulation/EE6/iframes/data/img39.png new file mode 100644 index 0000000..6dd7ce1 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img39.png differ diff --git a/experiment/simulation/EE6/iframes/data/img390.png b/experiment/simulation/EE6/iframes/data/img390.png new file mode 100644 index 0000000..e929ee3 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img390.png differ diff --git a/experiment/simulation/EE6/iframes/data/img391.png b/experiment/simulation/EE6/iframes/data/img391.png new file mode 100644 index 0000000..fd22325 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img391.png differ diff --git a/experiment/simulation/EE6/iframes/data/img392.png b/experiment/simulation/EE6/iframes/data/img392.png new file mode 100644 index 0000000..4bbe1ae Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img392.png differ diff --git a/experiment/simulation/EE6/iframes/data/img393.png b/experiment/simulation/EE6/iframes/data/img393.png new file mode 100644 index 0000000..3d34eb0 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img393.png differ diff --git a/experiment/simulation/EE6/iframes/data/img394.png b/experiment/simulation/EE6/iframes/data/img394.png new file mode 100644 index 0000000..b040b73 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img394.png differ diff --git a/experiment/simulation/EE6/iframes/data/img395.png b/experiment/simulation/EE6/iframes/data/img395.png new file mode 100644 index 0000000..1acc8b5 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img395.png differ diff --git a/experiment/simulation/EE6/iframes/data/img396.png b/experiment/simulation/EE6/iframes/data/img396.png new file mode 100644 index 0000000..65877c5 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img396.png differ diff --git a/experiment/simulation/EE6/iframes/data/img397.png b/experiment/simulation/EE6/iframes/data/img397.png new file mode 100644 index 0000000..ee57683 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img397.png differ diff --git a/experiment/simulation/EE6/iframes/data/img398.png b/experiment/simulation/EE6/iframes/data/img398.png new file mode 100644 index 0000000..13fd750 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img398.png differ diff --git a/experiment/simulation/EE6/iframes/data/img399.png b/experiment/simulation/EE6/iframes/data/img399.png new file mode 100644 index 0000000..2b20163 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img399.png differ diff --git a/experiment/simulation/EE6/iframes/data/img4.png b/experiment/simulation/EE6/iframes/data/img4.png new file mode 100644 index 0000000..a54919a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img4.png differ diff --git a/experiment/simulation/EE6/iframes/data/img40.png b/experiment/simulation/EE6/iframes/data/img40.png new file mode 100644 index 0000000..6dc1b81 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img40.png differ diff --git a/experiment/simulation/EE6/iframes/data/img400.png b/experiment/simulation/EE6/iframes/data/img400.png new file mode 100644 index 0000000..dab6501 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img400.png differ diff --git a/experiment/simulation/EE6/iframes/data/img401.png b/experiment/simulation/EE6/iframes/data/img401.png new file mode 100644 index 0000000..59648ea Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img401.png differ diff --git a/experiment/simulation/EE6/iframes/data/img402.png b/experiment/simulation/EE6/iframes/data/img402.png new file mode 100644 index 0000000..d99d90b Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img402.png differ diff --git a/experiment/simulation/EE6/iframes/data/img403.png b/experiment/simulation/EE6/iframes/data/img403.png new file mode 100644 index 0000000..bc8eaa2 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img403.png differ diff --git a/experiment/simulation/EE6/iframes/data/img404.png b/experiment/simulation/EE6/iframes/data/img404.png new file mode 100644 index 0000000..a6fad87 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img404.png differ diff --git a/experiment/simulation/EE6/iframes/data/img405.png b/experiment/simulation/EE6/iframes/data/img405.png new file mode 100644 index 0000000..8e094f4 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img405.png differ diff --git a/experiment/simulation/EE6/iframes/data/img406.png b/experiment/simulation/EE6/iframes/data/img406.png new file mode 100644 index 0000000..b2d3877 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img406.png differ diff --git a/experiment/simulation/EE6/iframes/data/img407.png b/experiment/simulation/EE6/iframes/data/img407.png new file mode 100644 index 0000000..f852d75 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img407.png differ diff --git a/experiment/simulation/EE6/iframes/data/img41.png b/experiment/simulation/EE6/iframes/data/img41.png new file mode 100644 index 0000000..4cb91af Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img41.png differ diff --git a/experiment/simulation/EE6/iframes/data/img42.png b/experiment/simulation/EE6/iframes/data/img42.png new file mode 100644 index 0000000..d8d6a8b Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img42.png differ diff --git a/experiment/simulation/EE6/iframes/data/img43.png b/experiment/simulation/EE6/iframes/data/img43.png new file mode 100644 index 0000000..63ee2b6 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img43.png differ diff --git a/experiment/simulation/EE6/iframes/data/img44.png b/experiment/simulation/EE6/iframes/data/img44.png new file mode 100644 index 0000000..4b68c99 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img44.png differ diff --git a/experiment/simulation/EE6/iframes/data/img45.png b/experiment/simulation/EE6/iframes/data/img45.png new file mode 100644 index 0000000..c79fa1a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img45.png differ diff --git a/experiment/simulation/EE6/iframes/data/img46.png b/experiment/simulation/EE6/iframes/data/img46.png new file mode 100644 index 0000000..8ebff3c Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img46.png differ diff --git a/experiment/simulation/EE6/iframes/data/img47.png b/experiment/simulation/EE6/iframes/data/img47.png new file mode 100644 index 0000000..656b4b7 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img47.png differ diff --git a/experiment/simulation/EE6/iframes/data/img48.png b/experiment/simulation/EE6/iframes/data/img48.png new file mode 100644 index 0000000..967b67a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img48.png differ diff --git a/experiment/simulation/EE6/iframes/data/img49.png b/experiment/simulation/EE6/iframes/data/img49.png new file mode 100644 index 0000000..7f2f05d Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img49.png differ diff --git a/experiment/simulation/EE6/iframes/data/img5.png b/experiment/simulation/EE6/iframes/data/img5.png new file mode 100644 index 0000000..a6a430e Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img5.png differ diff --git a/experiment/simulation/EE6/iframes/data/img50.png b/experiment/simulation/EE6/iframes/data/img50.png new file mode 100644 index 0000000..4a9bbd2 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img50.png differ diff --git a/experiment/simulation/EE6/iframes/data/img51.png b/experiment/simulation/EE6/iframes/data/img51.png new file mode 100644 index 0000000..6d15302 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img51.png differ diff --git a/experiment/simulation/EE6/iframes/data/img52.png b/experiment/simulation/EE6/iframes/data/img52.png new file mode 100644 index 0000000..1e89e6b Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img52.png differ diff --git a/experiment/simulation/EE6/iframes/data/img53.png b/experiment/simulation/EE6/iframes/data/img53.png new file mode 100644 index 0000000..acf94ff Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img53.png differ diff --git a/experiment/simulation/EE6/iframes/data/img54.png b/experiment/simulation/EE6/iframes/data/img54.png new file mode 100644 index 0000000..d944231 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img54.png differ diff --git a/experiment/simulation/EE6/iframes/data/img55.png b/experiment/simulation/EE6/iframes/data/img55.png new file mode 100644 index 0000000..cc7551f Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img55.png differ diff --git a/experiment/simulation/EE6/iframes/data/img56.png b/experiment/simulation/EE6/iframes/data/img56.png new file mode 100644 index 0000000..3f0020d Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img56.png differ diff --git a/experiment/simulation/EE6/iframes/data/img57.png b/experiment/simulation/EE6/iframes/data/img57.png new file mode 100644 index 0000000..e499dde Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img57.png differ diff --git a/experiment/simulation/EE6/iframes/data/img58.png b/experiment/simulation/EE6/iframes/data/img58.png new file mode 100644 index 0000000..a8fdb39 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img58.png differ diff --git a/experiment/simulation/EE6/iframes/data/img59.png b/experiment/simulation/EE6/iframes/data/img59.png new file mode 100644 index 0000000..6421b8b Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img59.png differ diff --git a/experiment/simulation/EE6/iframes/data/img6.png b/experiment/simulation/EE6/iframes/data/img6.png new file mode 100644 index 0000000..ed28927 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img6.png differ diff --git a/experiment/simulation/EE6/iframes/data/img60.png b/experiment/simulation/EE6/iframes/data/img60.png new file mode 100644 index 0000000..4e5c96b Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img60.png differ diff --git a/experiment/simulation/EE6/iframes/data/img61.png b/experiment/simulation/EE6/iframes/data/img61.png new file mode 100644 index 0000000..17b0627 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img61.png differ diff --git a/experiment/simulation/EE6/iframes/data/img62.png b/experiment/simulation/EE6/iframes/data/img62.png new file mode 100644 index 0000000..9469ee9 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img62.png differ diff --git a/experiment/simulation/EE6/iframes/data/img63.png b/experiment/simulation/EE6/iframes/data/img63.png new file mode 100644 index 0000000..30db3c5 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img63.png differ diff --git a/experiment/simulation/EE6/iframes/data/img64.png b/experiment/simulation/EE6/iframes/data/img64.png new file mode 100644 index 0000000..884eeaf Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img64.png differ diff --git a/experiment/simulation/EE6/iframes/data/img65.png b/experiment/simulation/EE6/iframes/data/img65.png new file mode 100644 index 0000000..0ab8741 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img65.png differ diff --git a/experiment/simulation/EE6/iframes/data/img66.png b/experiment/simulation/EE6/iframes/data/img66.png new file mode 100644 index 0000000..b122b5e Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img66.png differ diff --git a/experiment/simulation/EE6/iframes/data/img67.png b/experiment/simulation/EE6/iframes/data/img67.png new file mode 100644 index 0000000..541af62 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img67.png differ diff --git a/experiment/simulation/EE6/iframes/data/img68.png b/experiment/simulation/EE6/iframes/data/img68.png new file mode 100644 index 0000000..959c85e Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img68.png differ diff --git a/experiment/simulation/EE6/iframes/data/img69.png b/experiment/simulation/EE6/iframes/data/img69.png new file mode 100644 index 0000000..1591f09 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img69.png differ diff --git a/experiment/simulation/EE6/iframes/data/img7.png b/experiment/simulation/EE6/iframes/data/img7.png new file mode 100644 index 0000000..8a73758 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img7.png differ diff --git a/experiment/simulation/EE6/iframes/data/img70.png b/experiment/simulation/EE6/iframes/data/img70.png new file mode 100644 index 0000000..335a097 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img70.png differ diff --git a/experiment/simulation/EE6/iframes/data/img71.png b/experiment/simulation/EE6/iframes/data/img71.png new file mode 100644 index 0000000..91ed004 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img71.png differ diff --git a/experiment/simulation/EE6/iframes/data/img72.png b/experiment/simulation/EE6/iframes/data/img72.png new file mode 100644 index 0000000..29b1b57 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img72.png differ diff --git a/experiment/simulation/EE6/iframes/data/img73.png b/experiment/simulation/EE6/iframes/data/img73.png new file mode 100644 index 0000000..fa0056f Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img73.png differ diff --git a/experiment/simulation/EE6/iframes/data/img74.png b/experiment/simulation/EE6/iframes/data/img74.png new file mode 100644 index 0000000..63f82ef Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img74.png differ diff --git a/experiment/simulation/EE6/iframes/data/img75.png b/experiment/simulation/EE6/iframes/data/img75.png new file mode 100644 index 0000000..48c94f8 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img75.png differ diff --git a/experiment/simulation/EE6/iframes/data/img76.png b/experiment/simulation/EE6/iframes/data/img76.png new file mode 100644 index 0000000..11b88cf Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img76.png differ diff --git a/experiment/simulation/EE6/iframes/data/img77.png b/experiment/simulation/EE6/iframes/data/img77.png new file mode 100644 index 0000000..47290cd Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img77.png differ diff --git a/experiment/simulation/EE6/iframes/data/img78.png b/experiment/simulation/EE6/iframes/data/img78.png new file mode 100644 index 0000000..cb6afc4 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img78.png differ diff --git a/experiment/simulation/EE6/iframes/data/img79.png b/experiment/simulation/EE6/iframes/data/img79.png new file mode 100644 index 0000000..db8cf96 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img79.png differ diff --git a/experiment/simulation/EE6/iframes/data/img8.png b/experiment/simulation/EE6/iframes/data/img8.png new file mode 100644 index 0000000..6106403 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img8.png differ diff --git a/experiment/simulation/EE6/iframes/data/img80.png b/experiment/simulation/EE6/iframes/data/img80.png new file mode 100644 index 0000000..1cf0e91 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img80.png differ diff --git a/experiment/simulation/EE6/iframes/data/img81.png b/experiment/simulation/EE6/iframes/data/img81.png new file mode 100644 index 0000000..6bf22d3 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img81.png differ diff --git a/experiment/simulation/EE6/iframes/data/img82.png b/experiment/simulation/EE6/iframes/data/img82.png new file mode 100644 index 0000000..96e5ac8 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img82.png differ diff --git a/experiment/simulation/EE6/iframes/data/img83.png b/experiment/simulation/EE6/iframes/data/img83.png new file mode 100644 index 0000000..55f81ad Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img83.png differ diff --git a/experiment/simulation/EE6/iframes/data/img84.png b/experiment/simulation/EE6/iframes/data/img84.png new file mode 100644 index 0000000..f73abca Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img84.png differ diff --git a/experiment/simulation/EE6/iframes/data/img85.png b/experiment/simulation/EE6/iframes/data/img85.png new file mode 100644 index 0000000..eb49e8d Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img85.png differ diff --git a/experiment/simulation/EE6/iframes/data/img86.png b/experiment/simulation/EE6/iframes/data/img86.png new file mode 100644 index 0000000..b9d2c11 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img86.png differ diff --git a/experiment/simulation/EE6/iframes/data/img87.png b/experiment/simulation/EE6/iframes/data/img87.png new file mode 100644 index 0000000..a284fee Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img87.png differ diff --git a/experiment/simulation/EE6/iframes/data/img88.png b/experiment/simulation/EE6/iframes/data/img88.png new file mode 100644 index 0000000..23b729b Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img88.png differ diff --git a/experiment/simulation/EE6/iframes/data/img89.png b/experiment/simulation/EE6/iframes/data/img89.png new file mode 100644 index 0000000..397ccfb Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img89.png differ diff --git a/experiment/simulation/EE6/iframes/data/img9.png b/experiment/simulation/EE6/iframes/data/img9.png new file mode 100644 index 0000000..3d70aa2 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img9.png differ diff --git a/experiment/simulation/EE6/iframes/data/img90.png b/experiment/simulation/EE6/iframes/data/img90.png new file mode 100644 index 0000000..7c74ce7 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img90.png differ diff --git a/experiment/simulation/EE6/iframes/data/img91.png b/experiment/simulation/EE6/iframes/data/img91.png new file mode 100644 index 0000000..7bb684a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img91.png differ diff --git a/experiment/simulation/EE6/iframes/data/img92.png b/experiment/simulation/EE6/iframes/data/img92.png new file mode 100644 index 0000000..f0c7c46 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img92.png differ diff --git a/experiment/simulation/EE6/iframes/data/img93.png b/experiment/simulation/EE6/iframes/data/img93.png new file mode 100644 index 0000000..225172c Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img93.png differ diff --git a/experiment/simulation/EE6/iframes/data/img94.png b/experiment/simulation/EE6/iframes/data/img94.png new file mode 100644 index 0000000..c70beeb Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img94.png differ diff --git a/experiment/simulation/EE6/iframes/data/img95.png b/experiment/simulation/EE6/iframes/data/img95.png new file mode 100644 index 0000000..20fcfc2 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img95.png differ diff --git a/experiment/simulation/EE6/iframes/data/img96.png b/experiment/simulation/EE6/iframes/data/img96.png new file mode 100644 index 0000000..785eef7 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img96.png differ diff --git a/experiment/simulation/EE6/iframes/data/img97.png b/experiment/simulation/EE6/iframes/data/img97.png new file mode 100644 index 0000000..56f5206 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img97.png differ diff --git a/experiment/simulation/EE6/iframes/data/img98.png b/experiment/simulation/EE6/iframes/data/img98.png new file mode 100644 index 0000000..e9a9679 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img98.png differ diff --git a/experiment/simulation/EE6/iframes/data/img99.png b/experiment/simulation/EE6/iframes/data/img99.png new file mode 100644 index 0000000..1155a35 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/img99.png differ diff --git a/experiment/simulation/EE6/iframes/data/lock.cur b/experiment/simulation/EE6/iframes/data/lock.cur new file mode 100644 index 0000000..e92f527 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/lock.cur differ diff --git a/experiment/simulation/EE6/iframes/data/marker.cur b/experiment/simulation/EE6/iframes/data/marker.cur new file mode 100644 index 0000000..0726e17 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/marker.cur differ diff --git a/experiment/simulation/EE6/iframes/data/player.js b/experiment/simulation/EE6/iframes/data/player.js new file mode 100644 index 0000000..fcdeb6c --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/player.js @@ -0,0 +1,1783 @@ +(function(){/* + + Copyright The Closure Library Authors. + SPDX-License-Identifier: Apache-2.0 +*/ +var k,ba="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};function ca(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b>>0),pa=0;function qa(a,b,c){return a.call.apply(a.bind,arguments)}function sa(a,b,c){if(!a)throw Error();if(2b?null:"string"===typeof a?a.charAt(b):a[b]}function Pa(a,b){return 0<=Ia(a,b)}function Ra(a,b){b=Ia(a,b);let c;(c=0<=b)&&Sa(a,b);return c}function Sa(a,b){Array.prototype.splice.call(a,b,1)}function Ta(a){return Array.prototype.concat.apply([],arguments)} +function Ua(a){const b=a.length;if(0=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)} +function Za(a){let b=0,c=0;const d={};for(;cb?1:a")&&(a=a.replace(mb,">"));-1!=a.indexOf('"')&&(a=a.replace(ob,"""));-1!=a.indexOf("'")&&(a=a.replace(pb,"'"));-1!=a.indexOf("\x00")&&(a=a.replace(qb,"�"));return a}var kb=/&/g,lb=//g,ob=/"/g,pb=/'/g,qb=/\x00/g,jb=/[\x00&<>"']/; +function rb(a,b){let c=0;a=hb(String(a)).split(".");b=hb(String(b)).split(".");const d=Math.max(a.length,b.length);for(let g=0;0==c&&gb?1:0};function ub(){var a=ia.navigator;return a&&(a=a.userAgent)?a:""}function vb(a){return-1!=ub().indexOf(a)};function wb(){return vb("Firefox")||vb("FxiOS")}function yb(){return vb("Safari")&&!(zb()||vb("Coast")||vb("Opera")||vb("Edge")||vb("Edg/")||vb("OPR")||wb()||vb("Silk")||vb("Android"))}function zb(){return(vb("Chrome")||vb("CriOS"))&&!vb("Edge")||vb("Silk")}function Ab(){return vb("Android")&&!(zb()||wb()||vb("Opera")||vb("Silk"))};function Bb(){return vb("iPhone")&&!vb("iPod")&&!vb("iPad")}function Cb(){return Bb()||vb("iPad")||vb("iPod")};function Eb(a){Eb[" "](a);return a}Eb[" "]=function(){};function Fb(a,b,c,d){d=d?d(b):b;return Object.prototype.hasOwnProperty.call(a,d)?a[d]:a[d]=c(b)};var Hb=vb("Opera"),Ib=vb("Trident")||vb("MSIE"),Jb=vb("Edge"),Kb=Jb||Ib,Lb=vb("Gecko")&&!(-1!=ub().toLowerCase().indexOf("webkit")&&!vb("Edge"))&&!(vb("Trident")||vb("MSIE"))&&!vb("Edge"),Mb=-1!=ub().toLowerCase().indexOf("webkit")&&!vb("Edge"),Nb=vb("Macintosh"),Ob=vb("Windows"),Pb=vb("Linux")||vb("CrOS"),Qb=vb("Android"),Rb=Bb(),Sb=vb("iPad"),Tb=vb("iPod");function Ub(){var a=ia.document;return a?a.documentMode:void 0}var Vb; +a:{var Wb="",Xb=function(){var a=ub();if(Lb)return/rv:([^\);]+)(\)|;)/.exec(a);if(Jb)return/Edge\/([\d\.]+)/.exec(a);if(Ib)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(Mb)return/WebKit\/(\S+)/.exec(a);if(Hb)return/(?:Version)[ \/]?(\S+)/.exec(a)}();Xb&&(Wb=Xb?Xb[1]:"");if(Ib){var Zb=Ub();if(null!=Zb&&Zb>parseFloat(Wb)){Vb=String(Zb);break a}}Vb=Wb}var $b={};function ac(a){return Fb($b,a,function(){return 0<=rb(Vb,a)})}var bc; +if(ia.document&&Ib){var cc=Ub();bc=cc?cc:parseInt(Vb,10)||void 0}else bc=void 0;var dc=bc;var ec=Ib||Mb;function fc(a,b,c){for(const d in a)b.call(c,a[d],d,a)}function hc(a,b){const c={};for(const d in a)b.call(void 0,a[d],d,a)&&(c[d]=a[d]);return c}function ic(a,b){const c={};for(const d in a)c[d]=b.call(void 0,a[d],d,a);return c}function jc(a){const b=[];let c=0;for(const d in a)b[c++]=a[d];return b}function kc(a){const b=[];let c=0;for(const d in a)b[c++]=d;return b}function lc(a,b){return null!==a&&b in a}function nc(a,b){for(const c in a)if(b.call(void 0,a[c],c,a))return c} +function oc(){var a=pc;for(const b in a)return!1;return!0}function qc(a,b,c){if(null!==a&&b in a)throw Error(`The object already contains the key "${b}"`);a[b]=c}function w(a,b,c){return null!==a&&b in a?a[b]:c}function rc(a){const b={};for(const c in a)b[c]=a[c];return b}const sc="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "); +function tc(a,b){let c,d;for(let e=1;e{Array.isArray(e)?e.forEach(d):(e=Jc(e),c.push(Hc(e).toString()))};a.forEach(d);return Kc(c.join(Hc(b).toString()))} +function Nc(a){return Lc(Array.prototype.slice.call(arguments))}class Ic{constructor(a,b){this.UQ=b===Gc?a:"";this.ux=!0}ox(){return this.UQ.toString()}toString(){return this.UQ.toString()}}var Mc=new Ic(ia.trustedTypes&&ia.trustedTypes.emptyHTML||"",Gc),Pc=Kc("
    ");var Qc={MATH:!0,SCRIPT:!0,STYLE:!0,SVG:!0,TEMPLATE:!0},Rc=function(a){let b=!1,c;return function(){b||(c=a(),b=!0);return c}}(function(){var a=document.createElement("div"),b=document.createElement("div");b.appendChild(document.createElement("div"));a.appendChild(b);b=a.firstChild.firstChild;a.innerHTML=Hc(Mc);return!b.parentElement}); +function Sc(a,b){if(a.tagName&&Qc[a.tagName.toUpperCase()])throw Error("goog.dom.safe.setInnerHtml cannot be used to set content of "+a.tagName+".");if(Rc())for(;a.lastChild;)a.removeChild(a.lastChild);a.innerHTML=Hc(b)}function Tc(a,b,c,d){a=a instanceof Ac?a:Ec(a);b=b||ia;c instanceof wc?c instanceof wc&&c.constructor===wc&&c.d2===yc?c=c.u1:(Ga("expected object of type Const, got '"+c+"'"),c="type_error:Const"):c=c||"";return void 0!==d?b.open(Bc(a),c,d):b.open(Bc(a),c)}var Uc=/^[\w+/_-]+[=]{0,2}$/;function Vc(a,b,c){return Math.min(Math.max(a,b),c)}function Wc(a,b,c){return a+c*(b-a)};function Xc(a,b){this.x=void 0!==a?a:0;this.y=void 0!==b?b:0}k=Xc.prototype;k.clone=function(){return new Xc(this.x,this.y)};k.Bm=function(a){return a instanceof Xc&&Yc(this,a)};function Yc(a,b){return a==b?!0:a&&b?a.x==b.x&&a.y==b.y:!1}function Zc(a,b){var c=a.x-b.x;a=a.y-b.y;return Math.sqrt(c*c+a*a)}function $c(a,b){var c=a.x-b.x;a=a.y-b.y;return c*c+a*a}function ad(a,b){return new Xc(a.x-b.x,a.y-b.y)}function bd(a,b){return new Xc(a.x+b.x,a.y+b.y)} +k.ceil=function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};k.floor=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this};k.round=function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this};k.translate=function(a,b){a instanceof Xc?(this.x+=a.x,this.y+=a.y):(this.x+=Number(a),"number"===typeof b&&(this.y+=b));return this};k.scale=function(a,b){this.x*=a;this.y*="number"===typeof b?b:a;return this};function cd(a,b){this.width=a;this.height=b}function dd(a,b){return a==b?!0:a&&b?a.width==b.width&&a.height==b.height:!1}k=cd.prototype;k.clone=function(){return new cd(this.width,this.height)};k.area=function(){return this.width*this.height};k.aspectRatio=function(){return this.width/this.height};k.ri=function(){return!this.area()};k.ceil=function(){this.width=Math.ceil(this.width);this.height=Math.ceil(this.height);return this}; +k.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};k.round=function(){this.width=Math.round(this.width);this.height=Math.round(this.height);return this};k.scale=function(a,b){this.width*=a;this.height*="number"===typeof b?b:a;return this};function ed(a){const b={"&":"&","<":"<",">":">",""":'"'};let c;c=ia.document.createElement("div");return a.replace(fd,function(d,e){let f=b[d];if(f)return f;"#"==e.charAt(0)&&(e=Number("0"+e.slice(1)),isNaN(e)||(f=String.fromCharCode(e)));f||(Sc(c,Kc(d+" ")),f=c.firstChild.nodeValue.slice(0,-1));return b[d]=f})} +function gd(a){return a.replace(/&([^;]+);/g,function(b,c){switch(c){case "amp":return"&";case "lt":return"<";case "gt":return">";case "quot":return'"';default:return"#"!=c.charAt(0)||(c=Number("0"+c.slice(1)),isNaN(c))?b:String.fromCharCode(c)}})}var fd=/&([^;\s<&]+);?/g,hd={"\x00":"\\0","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\x0B",'"':'\\"',"\\":"\\\\","<":"\\u003C"},id={"'":"\\'"},jd=String.prototype.repeat?function(a,b){return a.repeat(b)}:function(a,b){return Array(b+1).join(a)}; +function kd(a,b){if(!Number.isFinite(a))return String(a);a=String(a);let c=a.indexOf(".");-1===c&&(c=a.length);const d="-"===a[0]?"-":"";d&&(a=a.substring(1));return d+jd("0",Math.max(0,b-c))+a}function ld(){return Math.floor(2147483648*Math.random()).toString(36)+Math.abs(Math.floor(2147483648*Math.random())^wa()).toString(36)}function md(a){return String(a).replace(/\-([a-z])/g,function(b,c){return c.toUpperCase()})} +function nd(a){return a.replace(RegExp("(^|[\\s]+)([a-z])","g"),function(b,c,d){return c+d.toUpperCase()})};function od(a){return a?new pd(qd(a)):Ba||(Ba=new pd)}function rd(a,b){return"string"===typeof b?a.getElementById(b):b} +function sd(a,b,c){var d=document;c=c||d;a=a&&"*"!=a?String(a).toUpperCase():"";if(c.querySelectorAll&&c.querySelector&&(a||b))return c.querySelectorAll(a+(b?"."+b:""));if(b&&c.getElementsByClassName){c=c.getElementsByClassName(b);if(a){d={};for(var e=0,f=0,g;g=c[f];f++)a==g.nodeName&&(d[e++]=g);d.length=e;return d}return c}c=c.getElementsByTagName(a||"*");if(b){d={};for(f=e=0;g=c[f];f++)a=g.className,"function"==typeof a.split&&Pa(a.split(/\s+/),b)&&(d[e++]=g);d.length=e;return d}return c} +function td(a,b){fc(b,function(c,d){c&&"object"==typeof c&&c.ux&&(c=c.ox());"style"==d?a.style.cssText=c:"class"==d?a.className=c:"for"==d?a.htmlFor=c:ud.hasOwnProperty(d)?a.setAttribute(ud[d],c):0==d.lastIndexOf("aria-",0)||0==d.lastIndexOf("data-",0)?a.setAttribute(d,c):a[d]=c})} +var ud={cellpadding:"cellPadding",cellspacing:"cellSpacing",colspan:"colSpan",frameborder:"frameBorder",height:"height",maxlength:"maxLength",nonce:"nonce",role:"role",rowspan:"rowSpan",type:"type",usemap:"useMap",valign:"vAlign",width:"width"}; +function vd(a){var b=a.scrollingElement?a.scrollingElement:Mb||"CSS1Compat"!=a.compatMode?a.body||a.documentElement:a.documentElement;a=a.parentWindow||a.defaultView;return Ib&&ac("10")&&a.pageYOffset!=b.scrollTop?new Xc(b.scrollLeft,b.scrollTop):new Xc(a.pageXOffset||b.scrollLeft,a.pageYOffset||b.scrollTop)} +function wd(a,b,c){var d=arguments,e=document,f=d[1],g=xd(e,String(d[0]));f&&("string"===typeof f?g.className=f:Array.isArray(f)?g.className=f.join(" "):td(g,f));2{},b),ia.removeEventListener("test",()=>{},b)}catch(c){}return a}();function fe(a){return Mb?"webkit"+a:a.toLowerCase()};var ge=fe("AnimationEnd"),he=fe("TransitionEnd");function ie(a,b){ce.call(this,a?a.type:"");this.relatedTarget=this.currentTarget=this.target=null;this.button=this.screenY=this.screenX=this.clientY=this.clientX=this.offsetY=this.offsetX=0;this.key="";this.charCode=this.keyCode=0;this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.pointerId=0;this.pointerType="";this.oe=null;a&&this.$q(a,b)}t(ie,ce);var je={2:"touch",3:"pen",4:"mouse"}; +ie.prototype.$q=function(a,b){var c=this.type=a.type,d=a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:null;this.target=a.target||a.srcElement;this.currentTarget=b;if(b=a.relatedTarget){if(Lb){a:{try{Eb(b.nodeName);var e=!0;break a}catch(f){}e=!1}e||(b=null)}}else"mouseover"==c?b=a.fromElement:"mouseout"==c&&(b=a.toElement);this.relatedTarget=b;d?(this.clientX=void 0!==d.clientX?d.clientX:d.pageX,this.clientY=void 0!==d.clientY?d.clientY:d.pageY,this.screenX=d.screenX||0,this.screenY= +d.screenY||0):(this.offsetX=Mb||void 0!==a.offsetX?a.offsetX:a.layerX,this.offsetY=Mb||void 0!==a.offsetY?a.offsetY:a.layerY,this.clientX=void 0!==a.clientX?a.clientX:a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0);this.button=a.button;this.keyCode=a.keyCode||0;this.key=a.key||"";this.charCode=a.charCode||("keypress"==c?a.keyCode:0);this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=a.shiftKey;this.metaKey=a.metaKey;this.pointerId= +a.pointerId||0;this.pointerType="string"===typeof a.pointerType?a.pointerType:je[a.pointerType]||"";this.state=a.state;this.oe=a;a.defaultPrevented&&ie.Mb.preventDefault.call(this)};ie.prototype.stopPropagation=function(){ie.Mb.stopPropagation.call(this);this.oe.stopPropagation?this.oe.stopPropagation():this.oe.cancelBubble=!0};ie.prototype.preventDefault=function(){ie.Mb.preventDefault.call(this);var a=this.oe;a.preventDefault?a.preventDefault():a.returnValue=!1};var ke="closure_listenable_"+(1E6*Math.random()|0);function le(a){return!(!a||!a[ke])};var me=0;function ne(a,b,c,d,e){this.listener=a;this.proxy=null;this.src=b;this.type=c;this.capture=!!d;this.MH=e;this.key=++me;this.MC=this.wH=!1}function oe(a){a.MC=!0;a.listener=null;a.proxy=null;a.src=null;a.MH=null};function pe(a){this.src=a;this.Sg={};this.gD=0}pe.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.Sg[f];a||(a=this.Sg[f]=[],this.gD++);var g=qe(a,b,d,e);-1>>0);function xe(a){if("function"===typeof a)return a;a[Ge]||(a[Ge]=function(b){return a.handleEvent(b)});return a[Ge]};function He(){Yd.call(this);this.sl=new pe(this);this.T9=this;this.LQ=null}t(He,Yd);He.prototype[ke]=!0;k=He.prototype;k.addEventListener=function(a,b,c,d){ve(this,a,b,c,d)};k.removeEventListener=function(a,b,c,d){De(this,a,b,c,d)}; +k.dispatchEvent=function(a){var b,c=this.LQ;if(c)for(b=[];c;c=c.LQ)b.push(c);c=this.T9;var d=a.type||a;if("string"===typeof a)a=new ce(a,c);else if(a instanceof ce)a.target=a.target||c;else{var e=a;a=new ce(d,c);tc(a,e)}e=!0;if(b)for(var f=b.length-1;!a.IC&&0<=f;f--){var g=a.currentTarget=b[f];e=Ie(g,d,!0,a)&&e}a.IC||(g=a.currentTarget=c,e=Ie(g,d,!0,a)&&e,a.IC||(e=Ie(g,d,!1,a)&&e));if(b)for(f=0;!a.IC&&f{a:{var g={QP:b,jx:c,context:d,priority:void 0};for(const h in f)if(!(h in g)||f[h]!==g[h]){f=!1;break a}for(const h in g)if(!(h in f)){f=!1;break a}f=!0}return f});e&&Ke(a,e)}function Qe(a,b,c,d){const e=(...f)=>{c.apply(d,f);Pe(a,b,e,d)};z(a,b,e,d)}function Re(a,b){if(b){if(a.tj){var c=hc(a.tj,d=>d.QP.PW==b);for(const d of Object.keys(c))Ke(a,d)}if(a.Qd){const d=Le(b);c=Ka(a.Qd,e=>e.src==d);for(const e of c)Oe(a,e)}}} +function B(a,b){a.Cp=a.Cp||[];a.Cp.push(b);return b}function Se(a,...b){if(a.Cp)for(const c of b)c&&(a.Mr(c),b=Ia(a.Cp,c),0<=b&&(a.Cp.splice(b,1),Te(c)))}function Ue(a,...b){for(const c of b)c&&a.Mr(c)}class Ve{constructor(){this.Cp=this.tj=this.Qd=null}Xc(){this.rd();if(this.Cp)for(const a of this.Cp)Te(a);if(this.Qd){for(const a of this.Qd)if(Array.isArray(a))for(const b of a)Ee(b);else Ee(a);this.Qd=null}if(this.tj)for(const a of Object.keys(this.tj))Ke(this,a)}Mr(a){Re(this,a)}rd(){}};function We(a,b){return 0==b?a.Sw:a.Bt[b]}function $e(a,b){return 0==b?a.Sw||[]:b in a.Bt?We(a,b):[]}function af(a){if(!a.Bt)return a.Sw?a.Sw.slice():[];const b=[],c=a.cG;for(let d=0;d>>1);let l;l=d(b,c[h]);0d&&Wa(c,-(d+1),0,b)}We(this,b).push(a)}remove(a,b){(b=We(this,b))&&Ra(b,a)}};function cf(a){return a.Ii?af(a.Ii).length:0}function df(a,b){a.vA||(a.vA=[]);a.vA.push(b)} +class C extends Ve{constructor(a=null){super();this.vA=this.Ii=null;this.PW=a}U$(){return this.PW}addHandler(a,b,c){this.Ii=this.Ii||new bf;this.Ii.push({jx:a,context:b},c||0)}removeHandler(a,b,c){c=c||0;if(this.Ii){var d=$e(this.Ii,c),e=d.length;for(let f=0;f{b.C(...a)})}rd(){super.rd()}}C.prototype.dispatch=C.prototype.C;C.prototype.hasHandler=C.prototype.lQ;C.prototype.removeHandler=C.prototype.removeHandler;C.prototype.addHandler=C.prototype.addHandler;C.prototype.eventOwner=C.prototype.U$;function ff(a,b){return a.L()!=b.L()?a.L()-b.L():a.Aa()!=b.Aa()?a.Aa()-b.Aa():a.ib()-b.ib()}class gf{constructor(a,b,c){this.Fd=a||0;this.wB=b||0;this.Xi=c||0}L(){return this.Fd}Aa(){return this.wB}ib(){return this.Xi}}gf.prototype.timeOffset=gf.prototype.ib;gf.prototype.stepIndex=gf.prototype.Aa;gf.prototype.slideIndex=gf.prototype.L;function hf(){}q("ispring.presenter.presentation.slides.IAnimationStep",hf);hf.prototype.rl=function(){};hf.prototype.automaticAdvance=hf.prototype.rl;hf.prototype.duration=function(){};hf.prototype.duration=hf.prototype.duration;hf.prototype.startTime=function(){};hf.prototype.startTime=hf.prototype.startTime;function jf(){}q("ispring.presenter.presentation.meta.IMetaCommands",jf);jf.prototype.getMetaCommand=jf.prototype.rC;jf.prototype.count=jf.prototype.count;function kf(){}q("ispring.presenter.presentation.slides.IAnimationSteps",kf);kf.prototype.count=function(){};kf.prototype.count=kf.prototype.count;kf.prototype.pc=function(){};kf.prototype.getStep=kf.prototype.pc;kf.prototype.duration=function(){};kf.prototype.duration=kf.prototype.duration;kf.prototype.getTime=function(){};kf.prototype.getTime=kf.prototype.getTime;function lf(){}q("ispring.presenter.presentation.slides.ISlideShowTransition",lf);lf.prototype.effectType=lf.prototype.T_;lf.prototype.duration=lf.prototype.duration;class mf{constructor(a,b){this.Af=a;this.Ga=b}src(){return this.Af}type(){return this.Ga}};class nf{constructor(a,b){this.$b=a;this.rz=b}id(){return this.$b}pi(){return this.rz}hj(){return!1}sources(){const a=[],b=this.rz.match(//g);if(b)for(let d=0;da||a>=this.count())throw Error("index is out of bounds");return this.yd[a]};sf.prototype.getMetaCommand=sf.prototype.rC;sf.prototype.count=function(){return this.yd.length};sf.prototype.count=sf.prototype.count;function tf(a,b,c){this.bX=a;this.hN=null!=b?b:0;this.Hr=void 0!==c?c:!0;this.Mj=0}tf.prototype.animationDuration=function(){return this.bX};tf.prototype.rl=function(){return this.Hr};tf.prototype.automaticAdvance=tf.prototype.rl;tf.prototype.duration=function(){return this.bX+this.hN};tf.prototype.duration=tf.prototype.duration;tf.prototype.startTime=function(){return this.Mj};tf.prototype.startTime=tf.prototype.startTime;tf.prototype.uR=function(a){this.Mj=a};function uf(){this.xB=[]}uf.prototype.Ea=0;uf.prototype.add=function(a){a.uR(this.Ea);this.xB.push(a);this.Ea+=a.duration()};uf.prototype.count=function(){return this.xB.length};uf.prototype.count=uf.prototype.count;uf.prototype.pc=function(a){if(0>a||a>=this.xB.length)throw Error("stepIndex is out of range");return this.xB[a]};uf.prototype.getStep=uf.prototype.pc;uf.prototype.duration=function(){return this.Ea};uf.prototype.duration=uf.prototype.duration; +uf.prototype.getTime=function(a,b){return this.pc(a).startTime()+b};uf.prototype.getTime=uf.prototype.getTime;let vf=0;class wf{constructor(a,b){this.Th=a;this.Gd=b;this.$b=`${vf++}`}name(){return this.Th}time(){return this.Gd}id(){return this.$b}};function xf(a,b){if(0>b||b>=a.count())throw Error();return a.Jr[b]}class yf{constructor(){this.Jr=[]}count(){return this.Jr.length}add(a){this.Jr.push(a)}};class zf{constructor(a,b,c){this.Ga=a;this.il=b;this.pm=c}type(){return this.Ga}jc(){return this.il}xi(){return this.pm}};class Af{constructor(){this.yd=[]}count(){return this.yd.length}};class Bf{constructor(a,b,c){this.Z2=a;this.il=b;this.IK=c}jc(){return this.il}jf(){return this.IK}};function Cf(a){if(0>=a.count())throw Error("index is out of range");return a.Pi[0]}function Df(a,b){for(let c=0;cff(b,d.jf()))return d}return null}class Ef{constructor(a){this.Pi=a}count(){return this.Pi.length}};function Ff(a,b,c){c&&!Gf(a,b,c)&&(c=null);c||(c=Hf(a,b));a.Pi.push(new Bf(b,b.jc(),c))}function Gf(a,b,c){a=Hf(a,b);return 0<=ff(a,c)} +function Hf(a,b){const c=a.ye;var d=c.lm,e=c.Fj,f=null;if("number"===typeof d)f=c.duration(),f=f-(b.xi()||0)+f*(d-1);else switch(d){case "untilNextClick":e=-1;break;case "untilNextSlide":e=Math.max(e,0)}b=b.jc();e=0>e?new gf(b.L(),b.Aa()+1,0):new gf(b.L()+e+1,-1,0);d=null;null!==f&&(a=a.M,b=a.mi(b,!0,!1),f=Math.min(b+f,a.duration()),d=a.Io(f,!0,!1));return d&&0>ff(d,e)?d:e} +class Jf{constructor(a,b){this.ye=a;this.M=b;this.Pi=[];a=this.ye.yd;b=null;for(let e=0;ed||d>=c.count())throw Error("index is out of range");c=c.yd[d];d=c.jc();switch(c.type()){case "play":b&&Ff(this,b,d);b=c;break;case "togglePlay":b&&Gf(this,b,d)?(Ff(this,b,d),b=null):(b&&Ff(this,b),b=c);break;case "stop":b&&(Ff(this,b,d),b=null)}}b&&Ff(this,b)}HP(){return new Ef(this.Pi)}};function Kf(a,b){a.Pi||(a.Pi=(new Jf(a,b)).HP());return a.Pi}class Lf{constructor(a,b,c){this.$b=a;this.Di=b;this.Ea=c;this.Fj=-1;this.He=this.lm=1;this.Jr=new yf;this.yd=new Af;this.Pi=null}id(){return this.$b}duration(){return this.Ea}volume(){return this.He}setVolume(a){this.He=a}Sj(){return this.Jr}};class Mf extends Lf{constructor(a,b,c){super(a,b,c);this.pv=!1}};function Nf(a,b,c,d){this.Yu=a;this.Ea=b;this.zf=c||null;this.fZ=d||!1}Nf.prototype.zf=null;Nf.prototype.T_=function(){return this.Yu};Nf.prototype.effectType=Nf.prototype.T_;Nf.prototype.duration=function(){return this.Ea};Nf.prototype.duration=Nf.prototype.duration;Nf.prototype.clone=function(){return new Nf(this.Yu,this.Ea,this.zf,this.fZ)};function Of(){}Of.prototype.AV=null;Of.prototype.wX=null;Of.prototype.Oo=function(){return this.AV};function Pf(a,b){a.AV=b}Of.prototype.Gx=function(){return this.wX};function Qf(a,b){a.wX=b};function Rf(a,b){if(0>b||b>=a.ys.length)throw Error("index is out of range");return a.ys[b]}function Sf(a,b){for(let c=0;c=this.left&&a.right<=this.right&&a.top>=this.top&&a.bottom<=this.bottom:a.x>=this.left&&a.x<=this.right&&a.y>=this.top&&a.y<=this.bottom:!1}; +k.expand=function(a,b,c,d){la(a)?(this.top-=a.top,this.right+=a.right,this.bottom+=a.bottom,this.left-=a.left):(this.top-=a,this.right+=Number(b),this.bottom+=Number(c),this.left-=Number(d));return this};k.ceil=function(){this.top=Math.ceil(this.top);this.right=Math.ceil(this.right);this.bottom=Math.ceil(this.bottom);this.left=Math.ceil(this.left);return this}; +k.floor=function(){this.top=Math.floor(this.top);this.right=Math.floor(this.right);this.bottom=Math.floor(this.bottom);this.left=Math.floor(this.left);return this};k.round=function(){this.top=Math.round(this.top);this.right=Math.round(this.right);this.bottom=Math.round(this.bottom);this.left=Math.round(this.left);return this}; +k.translate=function(a,b){a instanceof Xc?(this.left+=a.x,this.right+=a.x,this.top+=a.y,this.bottom+=a.y):(this.left+=a,this.right+=a,"number"===typeof b&&(this.top+=b,this.bottom+=b));return this};k.scale=function(a,b){b="number"===typeof b?b:a;this.left*=a;this.right*=a;this.top*=b;this.bottom*=b;return this};function Wf(a,b,c,d){this.left=a;this.top=b;this.width=c;this.height=d}k=Wf.prototype;k.clone=function(){return new Wf(this.left,this.top,this.width,this.height)};k.contains=function(a){return a instanceof Xc?a.x>=this.left&&a.x<=this.left+this.width&&a.y>=this.top&&a.y<=this.top+this.height:this.left<=a.left&&this.left+this.width>=a.left+a.width&&this.top<=a.top&&this.top+this.height>=a.top+a.height}; +k.Q_=function(){var a=(void 0).xl-n);this.M=g}id(){return this.$b}Wx(){return this.X8}Xa(){return this.sf}duration(){return this.l9}slides(){return this.M}qr(){return this.P7}Nm(){return this.k8}rotation(){return this.nw}};function Zf(a,b){return Oa(a.Hi,c=>c.id()==b)}function $f(a,b){return Oa(a.Hi,c=>!!c.slides().length&&c.slides()[0]==b)}function ag(a){let b=[];for(var c of a.Hi)b=b.concat(c.slides());if(!b.length)return!0;b.sort((d,e)=>d-e);a=b[0];for(c=0;ca)throw Error("negative time not accepted");let c=0;b&&null!=this.transition()&&(b=this.transition().duration(),b=a)break;a-=d.duration()}if(c==b.count())if(.001>=a)--c,a=b.pc(c).duration();else throw Error("time out of bounds");}return new gf(this.index(),c,a)}} +dg.prototype.convertTimeToTimestamp=dg.prototype.Io;dg.prototype.zoomEffects=dg.prototype.qk;dg.prototype.navigationSettings=dg.prototype.St;dg.prototype.presenter=dg.prototype.zg;dg.prototype.metaCommands=dg.prototype.No;dg.prototype.text=dg.prototype.text;dg.prototype.nestingLevel=dg.prototype.Zc;dg.prototype.startTime=dg.prototype.startTime;dg.prototype.thumbnail=dg.prototype.ru;dg.prototype.duration=dg.prototype.duration;dg.prototype.transition=dg.prototype.transition; +dg.prototype.slideNotes=dg.prototype.pj;dg.prototype.title=dg.prototype.title;dg.prototype.isLoaded=dg.prototype.mf;dg.prototype.visible=dg.prototype.visible;dg.prototype.visibleIndex=dg.prototype.Ci;dg.prototype.index=dg.prototype.index;dg.prototype.id=dg.prototype.id;dg.prototype.type=dg.prototype.type;dg.prototype.animationSteps=dg.prototype.nb;function eg(a,b){b.zj=a.M.length;b.uR(a.duration());a.M.push(b);if(b.visible()){b.e_=a.OB.length;a.OB.push(b);const c=b.duration(),d=b.transition()?b.transition().duration():0;a.oP+=c;a.nP+=c-d}b.f_.addHandler(c=>{a.UY.C(c)},a)} +class fg{constructor(){this.M=[];this.OB=[];this.nP=this.oP=0;this.UY=new C}ja(a){if(0>a||a>=this.M.length)throw Error("slideIndex is out of range");return this.M[a]}count(){return this.M.length}duration(){if(0==this.count())return 0;const a=this.M[this.M.length-1];return a.startTime()+a.duration()}x$(a,b,c){return new gf(a,b,c)}mi(a,b,c){if(!a)throw Error("Invalid timestamp");var d=a.L();if(d>=this.count())throw Error("Slide index is out of bounds");if(0>d)return NaN;void 0===b&&(b=!0);void 0=== +c&&(c=!0);let e=0;for(var f=0;f=a.count())throw Error("stepIndex is out of bounds");a=a.pc(g);f>a.duration()&&(f=a.duration());e+=a.startTime()+f}else b&&(f>h.duration()&&(f=h.duration()),e+=f);return e}Io(a,b,c){if(isNaN(a))throw Error("NaN time not accepted");if(0>a)throw Error("negative time not accepted"); +let d=null;for(var e=0;e=a||f&&.001>=a-g)break;a-=g}if(e==this.count()&&0<=a)throw Error("time out of bounds");c=0;b&&(b=d.transition().duration(),b=a)break;a-=e.duration()}if(c==b.count())if(.001>=a)--c,a=b.pc(c).duration();else throw Error("time out of bounds"); +}return new gf(d.index(),c,a)}np(){return this.OB.length}KH(a){if(0>a||a>=this.np())throw Error("Slide index is out of range");return this.OB[a]}Nca(){return this.oP}wu(){return this.nP}}fg.prototype.visibleAnimationStepsDuration=fg.prototype.wu;fg.prototype.visibleSlidesDuration=fg.prototype.Nca;fg.prototype.getVisibleSlide=fg.prototype.KH;fg.prototype.visibleSlidesCount=fg.prototype.np;fg.prototype.convertTimeToTimestamp=fg.prototype.Io;fg.prototype.convertTimestampToTime=fg.prototype.mi; +fg.prototype.createTimestamp=fg.prototype.x$;fg.prototype.duration=fg.prototype.duration;fg.prototype.count=fg.prototype.count;fg.prototype.getSlide=fg.prototype.ja;function gg(a){0<=a.U&&--a.U;return 0<=a.U}function hg(a){for(;a.bI()&&!a.$().visible(););return!!a.$()}function ig(a){for(;gg(a)&&!a.$().visible(););return!!a.$()}class jg{constructor(a,b){this.t7=a;this.zw=b;this.VD=b.length;this.U=-1}seekTo(a){this.U=Vc(a,-1,this.VD);return!0}bI(){this.Ub||b>=a.count())throw Error("actionIndex is out of range");return a.lc[b]};function ug(){this.lc=new sg}ug.prototype.Fb=!0;ug.prototype.enabled=function(){return this.Fb};ug.prototype.ra=function(a){this.Fb=a};ug.prototype.actions=function(){return this.lc};function vg(){this.Fb=!0}vg.prototype.enabled=function(){return this.Fb};vg.prototype.enabled=vg.prototype.enabled;vg.prototype.ra=function(a){this.Fb=a};vg.prototype.Tg=function(){return this.ze};function E(a,b){const c=new C(a);B(a,c);if(b)if(Array.isArray(b))for(const d of b)df(d,c);else df(b,c);return c}class wg extends Ve{};const xg=[.75,1,1.25,1.5,2];class yg extends wg{constructor(){super();this.lN=1;this.Nw=!1;this.Rk=E(this)}playbackRate(){return this.lN}jk(a){this.lN!=a&&(this.lN=a,this.Rk.C())}mD(){return this.Nw}};function zg(){return Mb?"Webkit":Lb?"Moz":Ib?"ms":null}function Ag(a,b){if(b&&a in b)return a;var c=zg();return c?(c=c.toLowerCase(),a=c+nd(a),void 0===b||a in b?a:null):null};var Bg=class extends ce{constructor(a,b){super("visibilitychange");this.hidden=a;this.visibilityState=b}};const Cg=new WeakMap;function Dg(a){var b=Eg;const c=ma(a),d=([,...f])=>b(c,f),e=([f,...g])=>a.apply(f,g);return function(...f){const g=this||ia;let h=Cg.get(g);h||(h={},Cg.set(g,h));return Fb(h,[this,...f],e,d)}}function Eg(a,b){a=[a];for(let c=b.length-1;0<=c;--c)a.push(typeof b[c],b[c]);return a.join("\v")};function Fg(a){He.call(this);this.jC=a||od();if(this.W_=this.eaa())this.T$=ve(this.jC.ld,this.W_,ta(this.laa,this))}t(Fg,He);k=Fg.prototype;k.eaa=Dg(function(){var a=!!this.pC(),b="hidden"!=this.pC();return a?b?((zg()||"")+"visibilitychange").toLowerCase():"visibilitychange":null});k.pC=Dg(function(){return Ag("hidden",this.jC.ld)});k.haa=Dg(function(){return Ag("visibilityState",this.jC.ld)});function Gg(a){return!!a.jC.ld[a.pC()]} +k.laa=function(){var a=this.pC()?this.jC.ld[this.haa()]:null;a=new Bg(Gg(this),a);this.dispatchEvent(a)};k.hf=function(){Ee(this.T$);Fg.Mb.hf.call(this)};class Hg{constructor(){this.M=[];this.aF=1;this.Fn=this.Ee=0;this.Tf=!1}push(a){this.Tf||(this.M[this.Fn]=a,this.Fn=(this.Fn+1)%this.aF,this.Ee=Math.min(this.Ee+1,this.aF))}pop(){if(this.Tf||this.ri())return null;this.Fn=0>this.Fn-1?this.aF-1:this.Fn-1;this.Ee--;return this.M[this.Fn]}top(){return this.ri()?null:this.M[0>this.Fn-1?this.aF-1:this.Fn-1]}ri(){return!this.Ee}size(){return this.Ee}lock(){this.Tf=!0}unlock(){this.Tf=!1}};var Ig={ofa:"playingSlide",pfa:"playingTransition",kfa:"pausedTransition",jfa:"pausedSlide",e2:"suspended",XR:"buffering"};q("ispring.presenter.player.PresentationPlaybackState",Ig);q("PLAYING_SLIDE","playingSlide",Ig);q("PAUSED_SLIDE","pausedSlide",Ig);q("SUSPENDED","suspended",Ig);q("PLAYING_TRANSITION","playingTransition",Ig);q("PAUSED_TRANSITION","pausedTransition",Ig);q("BUFFERING","buffering",Ig);function Jg(a){this.Ga=a}Jg.prototype.type=function(){return this.Ga};function Kg(a){this.Ga="gotoSlide";this.Fd=a}t(Kg,Jg);Kg.prototype.L=function(){return this.Fd};function Lg(a){this.B=a}Lg.prototype.WP=function(a){switch(a.type()){case "closePlayerWindow":this.B.eE.C();return;case "gotoNextSlide":Pg(this.B,!0,!0,!0);return;case "gotoSlide":this.bL(a.L());return}throw Error("unknown action type");};Lg.prototype.bL=function(a){this.B.pe(a)};function Qg(a,b,c,d,e){this.eG=a;this.FX=b;this.dG=c;this.iS=d;this.VZ=e}Qg.prototype.quizState=function(){return this.FX};Qg.prototype.quizPassed=function(){return this.dG};Qg.prototype.allowRetakeQuiz=function(){return this.iS};Qg.prototype.eD=function(){return{type:this.eG,state:this.FX,passed:this.dG,retake:this.iS,attempts:this.VZ}}; +function Rg(a){const b=a.quiz().isGraded()?"graded":"survey";var c=a.currentSession();if(c){const d=c.evaluation();c=c.sessionMode();const e=a.usedAttemptsCount();let f=!1,g=!1;d&&(f=d.quizPassed(),g=a.allowRetakeQuiz());return new Qg(b,c,f,g,e)}return new Qg(b,null,!1,a.allowRetakeQuiz(),0)};function Sg(a){return"graded"==a.eG?a.quizPassed():Tg(a)}function Tg(a){a=a.quizState();return"completed"==a||"reviewing"==a};function Ug(a){this.Ga=a}Ug.prototype.type=function(){return this.Ga};function Vg(a){this.Ga="gotoSlide";this.Fd=a}t(Vg,Ug);Vg.prototype.L=function(){return this.Fd};function Wg(a){this.B=a}Wg.prototype.WP=function(a){switch(a.type()){case "closePlayerWindow":this.B.eE.C();return;case "gotoNextSlide":Pg(this.B,!0,!0,!0);return;case "gotoSlide":this.bL(a.L());return}throw Error("unknown action type");};Wg.prototype.bL=function(a){this.B.pe(a)};class Xg{constructor(a,b,c){this.xw=a;this.TX=b;this.B8=c}};var Yg={Jga:"started",e2:"suspended",XR:"buffering",Kga:"stopped",Wfa:"rewinding"};q("ispring.presenter.player.clock.PresentationClockState",Yg);q("STARTED","started",Yg);q("SUSPENDED","suspended",Yg);q("BUFFERING","buffering",Yg);q("STOPPED","stopped",Yg);q("REWINDING","rewinding",Yg);class Zg extends Lf{constructor(a,b,c,d){super(a,b,c);this.YW=d;this.aX=this.VX=this.fU=!1}nQ(){return this.fU}uI(){return this.VX}NQ(){return this.aX}};var $g=wb(),ah=Bb()||vb("iPod"),bh=vb("iPad"),ch=Ab(),dh=zb(),eh=yb()&&!Cb();function fh(a,b){b||(b={});var c=window;if(a instanceof Ac)var d=a;else d="undefined"!=typeof a.href?a.href:String(a),d instanceof Ac||(d="object"==typeof d&&d.ux?d.ox():String(d),Dc.test(d)?d=new Ac(d,zc):(d=String(d),d=d.replace(/(%0A|%0D)/g,""),d=d.match(Cc)?new Ac(d,zc):null)),d=d||Fc;var e=void 0!==self.crossOriginIsolated,f="strict-origin-when-cross-origin";window.Request&&(f=(new Request("/")).referrerPolicy);const g="unsafe-url"===f;f=b.noreferrer;if(e&&f){if(g)throw Error("Cannot use the noreferrer option on a page that sets a referrer-policy of `unsafe-url` in modern browsers!"); +f=!1}a=b.target||a.target;e=[];for(var h in b)switch(h){case "width":case "height":case "top":case "left":e.push(h+"="+b[h]);break;case "target":case "noopener":case "noreferrer":break;default:e.push(h+"="+(b[h]?1:0))}h=e.join(",");if(Cb()&&c.navigator&&c.navigator.standalone&&a&&"_self"!=a){b=zd("A");a:{try{var l=b&&b.ownerDocument,n=l&&(l.defaultView||l.parentWindow);n=n||ia;if(n.Element&&n.Location){var m=n;break a}}catch(r){}m=null}if(m&&"undefined"!=typeof m.HTMLAnchorElement&&(!b||!(b instanceof +m.HTMLAnchorElement)&&(b instanceof m.Location||b instanceof m.Element))){if(la(b))try{var p=b.constructor.displayName||b.constructor.name||Object.prototype.toString.call(b)}catch(r){p=""}else p=void 0===b?"undefined":null===b?"null":typeof b;Ga("Argument is not a %s (or a non-Element, non-Location mock); got: %s","HTMLAnchorElement",p)}m=d instanceof Ac?d:Ec(d);b.href=Bc(m);b.target=a;f&&(b.rel="noreferrer");m=document.createEvent("MouseEvent");m.initMouseEvent("click", +!0,!0,c,1);b.dispatchEvent(m);c={}}else f?(c=Tc("",c,a,h),b=Bc(d),c&&(Kb&&-1!=b.indexOf(";")&&(b="'"+b.replace(/'/g,"%27")+"'"),c.opener=null,""===b&&(b="javascript:''"),b=ib(b),b=Kc(''),(m=c.document)&&m.write&&(m.write(Hc(b)),m.close()))):((c=Tc(d,c,a,h))&&b.noopener&&(c.opener=null),c&&b.noreferrer&&(c.opener=null));return c};let gh;function hh(a){a instanceof ie&&(a=a.oe);gh||(gh=new WeakMap);return gh.has(a)}function ih(a){a instanceof ie&&(a=a.oe);return a.defaultPrevented?!0:hh(a)};function jh(a,b){He.call(this);this.wx=a||1;this.dD=b||ia;this.C_=ta(this.Aca,this);this.p0=wa()}t(jh,He);k=jh.prototype;k.enabled=!1;k.El=null;k.setInterval=function(a){this.wx=a;this.El&&this.enabled?(this.stop(),this.start()):this.El&&this.stop()};k.Aca=function(){if(this.enabled){var a=wa()-this.p0;0>=8);b[c++]=e}a=void 0;void 0===a&&(a=0);rh();a=lh[a];c=Array(Math.floor(b.length/3));d=a[64]||"";let n=0;for(e=0;n>2];f=a[(f&3)<<4|g>>4];g=a[(g&15)<<2|h>>6];h=a[h&63];c[e++]=""+l+f+g+h}l=0;h=d;switch(b.length-n){case 2:l=b[n+1],h=a[(l&15)<<2]||d;case 1:b=b[n],c[e]=""+a[b>>2]+a[(b&3)<<4|l>>4]+h+d}b=c.join("")}return b} +function sh(a){if(ph)return ia.atob(a);var b="";th(a,function(c){b+=String.fromCharCode(c)});return b}function uh(a){var b=[];th(a,function(c){b.push(c)});return b}function th(a,b){function c(l){for(;d>4);64!=g&&(b(f<<4&240|g>>2),64!=h&&b(g<<6&192|h))}} +function rh(){if(!mh){mh={};for(var a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""),b=["+/=","+/","-_=","-_.","-_"],c=0;5>c;c++){var d=a.concat(b[c].split(""));lh[c]=d;for(var e=0;e{Fd(b)},100)}catch(b){return!1}return!0};function gi(a){this.length=a.length||a;for(let b=0;b{a.apply(b||null,e)},c)}function Hi(){return Ii&&!Ji?"about:blank":""}function Ki(){const a=Li();return Math.max(1,Math.min(a.width,a.height)/420)} +function Li(){if(Mi)return new cd(document.documentElement.clientWidth,document.documentElement.clientHeight);if(Ii&&Ib)return new cd(screen.width,screen.height);var a=void 0!==window.devicePixelRatio?window.devicePixelRatio:1;return Ji?new cd(screen.width/a,screen.height/a):Ii?Ni&&(a=Math.max(screen.width,screen.height),document.documentElement.clientWidth>a)?new cd(Math.max(document.documentElement.clientWidth,a),Math.max(document.documentElement.clientHeight,Math.min(screen.width,screen.height))): +new cd(screen.width,screen.height):new cd(screen.width*a,screen.height*a)}function Oi(){var a=window.location.search.substr(1);if(a){var b={};a=a.split("&");for(let e=0;e{setTimeout(()=>{if(!ih(d.oe)){const e=d.currentTarget;Ri(e.href,e.target||"_blank")}})});ve(c,"click",d=>{d.preventDefault()})}}function Ri(a,b){ei?(new di("openWindow",[a])).ix():fh(a,b?{target:b}:void 0)}function Si(a){if(!a)return!1;for(;a;){if("A"==a.nodeName.toLocaleUpperCase())return!0;a=a.parentNode}return!1}function Ti(a){return a&&"VIDEO"==a.nodeName&&a.controls} +function Ui(a){const b=wd("script",{type:"text/javascript",charset:"UTF-8"});document.body.appendChild(b);b.src=a;return b}function Vi(){return 0==window.location.href.indexOf("file:")}function Wi(){const a=wd("DIV");try{Di(a,"100px")}catch(b){return!1}return!0}function Xi(){let a;try{const b=wd("CANVAS");a=b.getContext("webgl")||b.getContext("experimental-webgl")}catch(b){}return a?!0:!1};(function(){function a(b){try{return b.ISPlayer&&(window.ISPlayer=b.ISPlayer),b.ISPVideoPlayer&&(window.ISPVideoPlayer=b.ISPVideoPlayer),b.ISPQuizPlayer&&(window.ISPQuizPlayer=b.ISPQuizPlayer),b.ISPInteractionPlayerCore&&(window.ISPInteractionPlayerCore=b.ISPInteractionPlayerCore),b.ISPBookPlayer&&(window.ISPBookPlayer=b.ISPBookPlayer),b.ISPScenarioPlayer&&(window.ISPScenarioPlayer=b.ISPScenarioPlayer),b.ISPFlipPlayer&&(window.ISPFlipPlayer=b.ISPFlipPlayer),!0}catch(c){return!1}}if(function(){let b; +try{b=window.frameElement}catch(c){}return null!=b}()){let b=window,c=7;for(;b&&b.parent!=b&&0!=c--&&!a(b.parent);)b=b.parent}})();var Yi;const Zi=Oi().user_agent;Yi=Zi?Zi:ub()||"";var Ni=bh||ah,Mi="1"==Oi().small_screen,$i="1"==Oi().tablet_screen,aj;let bj;try{bj=window.top.location.href?window.frameElement:null}catch(a){}var cj=(aj=null!=bj)&&window.frameElement&&window.frameElement.parentNode&&"FRAMESET"==window.frameElement.parentNode.tagName?!0:!1,dj=ah&&aj; +function ej(){const a=Yi.toLowerCase();return-1!=a.indexOf("android")||-1!=a.indexOf("mobile")||-1!=a.indexOf("wpdesktop")||Mi||$i}var fj=-1!=Yi.toLowerCase().indexOf("chrome"),gj=Mb&&!fj,hj=-1!=Yi.indexOf("CriOS"),ij=-1==Yi.toLowerCase().indexOf("windows phone")&&-1!=Yi.toLowerCase().indexOf("android"),Ii=ej(),jj=Ii&&(ej()?"ontouchstart"in window||void 0!==window.DocumentTouch&&document instanceof window.DocumentTouch||-1!=Yi.toLowerCase().indexOf("touch"):!1);let kj=""; +if(Ni){const a=/CPU.+OS\s(\d+)_(\d+)/.exec(Yi);kj=a?a[1]+"."+a[2]:""}var lj=parseInt(kj,10),mj=Ni&&6>=lj,nj=Ni&&7<=lj,oj=Ni&&8<=lj,pj=Ni&&9<=lj,qj=Ni&&10<=lj,rj=Ni&&12<=lj,sj=Ib&&"9."==Vb.substr(0,2),tj=Ib&&"10."==Vb.substr(0,3),vj=uj&&Ib,Ji=ij&&!fj&&!$g&&!Hb,wj=-1!=Yi.toLowerCase().indexOf("micromessenger"),ei=-1!=Yi.indexOf("ismobile"),xj=ei&&ah,yj=ei&&ij,zj; +if(zj=!window._ispringFullsizeSkin){var Aj;if(!(Aj=Mi))if(window._ispringFullsizeSkin)Aj=!1;else{var Bj=Li();Aj=(ah||700>Math.min(Bj.width,Bj.height))&&!$i}zj=Aj}var uj=zj,Cj=ah&&!xj&&10>lj||vj&&uj,Dj=void 0!==window.ISPlayer,Ej=Dj&&uj,Fj=Ii&&!Dj,Gj=!1,Hj=Ni||vj||ij||jj;const Ij=document.createElement("audio"),Jj=Ij.play&&Ij.play(); +Jj&&Jj.then(()=>{Ij.pause()},a=>{if(0=HTMLMediaElement.HAVE_METADATA}function Sj(a){var b=(b=a.Xf)?b.error?"error":b.ended?"ended":Tj(a)?"paused":a.tf?"buffering":"playing":"disposed";const c=a.Pa;c!=b&&(a.Pa=b,a.zq.C(a,c))}function Tj(a){const b=a.mediaElement();return Ni||!a.hj()?!a.Wc:b.paused}function Rj(a){return!!a.Xf&&!a.Xf.error&&void 0!==a.Xf.play}function Uj(a){a.wy&&(clearInterval(a.wy),a.wy=void 0)}function Vj(a){0>a.vy&&(a.vy=setInterval(a.S2.bind(a),500))} +function Wj(a){0=HTMLMediaElement.HAVE_CURRENT_DATA)||we(a,"canplay",this.KM,!1,this);Sj(this)}mediaElement(){if(!this.Xf)throw Error("media player was disposed");return this.Xf}state(){return this.Pa}playbackRate(){return this.Xf.playbackRate}jk(a){this.Xf&&a!=this.playbackRate()&&(this.Xf.playbackRate= +a,this.Xf.defaultPlaybackRate=a,this.Rk.C())}ready(){return Rj(this)&&this.$h}xz(){const a=this.$m;var b=this.mediaElement().getAttribute("preload");b=b&&"metadata"!=b?$g?HTMLMediaElement.HAVE_CURRENT_DATA:HTMLMediaElement.HAVE_FUTURE_DATA:HTMLMediaElement.HAVE_METADATA;$g&&this.mediaElement().readyState>=HTMLMediaElement.HAVE_CURRENT_DATA&&!this.$h?this.KM():(this.$m=this.$h&&Rj(this)&&this.mediaElement().readyState>=b,!this.$m&&Ii&&1==this.mediaElement().networkState&&1==this.z4&&(this.$m=!0,this.k7.C(this)), +this.$m||this.qs?this.$m&&(clearInterval(this.qs),this.qs=void 0):this.qs=setInterval(this.xz.bind(this),2E3),!a&&this.$m&&this.vp.C(this),this.z4=this.mediaElement().networkState)}bC(){this.xz();return this.$m}yM(){this.xz()}playing(){return this.Wc}play(){if(Rj(this)){this.Wc=!0;Ni&&"VIDEO"==this.mediaElement().tagName&&this.src()&&!this.mediaElement().src&&(this.mediaElement().src=this.src());const a=this.mediaElement().play();a&&a.catch(b=>window.console.log(b));if(nj){const b=this.mediaElement().currentTime; +let c=0;clearInterval(this.wy);this.wy=setInterval(()=>{++c;this.mediaElement().currentTime=d&&e>=Math.min(this.currentTime()+5,this.duration())){c=!1;this.mediaElement().paused&&this.mediaElement().play();break}}this.tf!=c&&(this.tf=c,Sj(this))}}Jo(a){this.mediaElement().controls=a}hj(){return this.mediaElement().controls|| +ah}Ch(a){if(this.Xf&&this.Xf.play){if("string"!==typeof a)a:{Array.isArray(a)||(a=[a]);for(let c=0;c{});c.pause();d.push(c)}function b(){if(30>ek.length)for(var c=ek.length;30>c;++c){var d=dk();a(d,ek)}if(30>fk.length)for(c=fk.length;30>c;++c)d=zd("VIDEO"),d.setAttribute("preload","metadata"),qj&&d.setAttribute("playsinline",""),a(d,fk)}if(Fj){let c=!1;document.body.addEventListener("touchstart",()=>{c=!0});document.body.addEventListener("touchmove", +d=>{if(Ni||!d.defaultPrevented)c=!1});document.body.addEventListener("touchend",d=>{!1!==d.isTrusted&&c&&b()})}else Ib||Jb||document.body.addEventListener("mouseup",()=>b());window.ismediacreator=[ek,fk]}function gk(){return ek&&ek.length?ek.shift():dk()};class hk extends Xj{constructor(a){super(a);this.Nz=0;this.kL=!1}IM(){this.kL?this.kL=!1:super.IM()}LM(){super.LM();this.Nz=Date.now()}Pv(){super.Pv();if(this.ready()&&Ji){var a=100>Date.now()-this.Nz;this.playing()||a||(this.kL=!0,a=this.mediaElement(),a.play(),a.pause())}}};class ik extends ck{constructor(a){super(new hk(a))}};class jk{constructor(a,b,c){this.Yl=a;this.wB=b;this.Xi=c;0>this.Xi&&(this.Xi=0);this.Yl&&0>this.Yl.m.t&&(this.Yl.m.t=0)}Aa(){return this.wB}ib(){return this.Xi}cR(){const a={s:this.wB,t:this.Xi};this.Yl&&(a.S=rc(this.Yl));return a}clone(){return new jk(this.Yl?rc(this.Yl):null,this.wB,this.Xi)}};function kk(a,b){return a.sa.querySelector(`#${b}`)}class lk{constructor(a,b){this.sa=a;this.Cv=b}content(){return this.sa}Lx(a,b){this.sa!=a&&(this.sa=a,this.Cv=b,this.qY())}qY(){}};function mk(a,b,c){a.Ca.Ai(a.L(),b,c,!0)}function nk(a){a.gI(a.Bu.count()-1)}function ok(a){a.pause();mk(a,0,0)}function pk(a){const b=a.Ca.Z().timestamp();if(null==a.Va||b.L()!=a.L()||0>b.Aa())throw Error("playback controller not active");}function qk(a,b){b&&a.$p!=b&&(a.$p=b,a.Js())} +class rk{constructor(a,b,c){this.ya=a;this.pa=b;this.Ca=c;this.uX=this.Va=null;this.Bu=a.nb();this.Fd=a.index();this.$p=!1;this.vB=new C;this.wf=new C;this.Aq=new C}slide(){return this.ya}view(){return this.pa}activate(a){this.Va=a;this.Ca.Z().Sb().addHandler(this.wb,this)}deactivate(){this.Va=null;this.Ca.Z().Sb().removeHandler(this.wb,this)}play(){this.Ca.start()}pause(){this.Ca.stop()}L(){return this.Fd}pH(){}NP(){}gI(a){const b=this.Bu.pc(a);this.pause();mk(this,a,b.duration())}nb(){return this.Bu}AH(){pk(this); +return this.Ca.Z().timestamp().Aa()}MP(){pk(this);const a=this.nb().pc(this.AH());return Math.min(a.duration(),this.Ca.Z().timestamp().ib())}C$(){pk(this);const a=this.nb().pc(this.AH());return 0=d.time){a=d.freeze?d.fQ:d.fQ+a-d.time;break a}}throw Error("invalid clock");}return a}sk.prototype.add=function(a){const b=this.Of();b.Gd+=a;return b};sk.prototype.Of=function(){return new sk(this.SS,this.Gd)}; +function uk(a){this.yq=new sk(this);this.vD=[];this.rm=[{time:0,fQ:a,freeze:!1}]}function vk(a,b,c,d){b={time:b,fQ:c,freeze:d||!1};0==a.rm.length?a.rm.push(b):(c=a.rm[a.rm.length-1],c.time!=b.time&&wk(a,c.time,b.time)?a.rm.push(b):a.rm.splice(a.rm.length-1,1,b))}uk.prototype.persistState=function(){return{t:this.yq.time(),p:Ua(this.rm)}};function wk(a,b,c){return La(a.vD,d=>d>=b&&d<=c)};class xk{constructor(a,b){this.o$=a[ia.Symbol.iterator]();this.Kaa=b}[Symbol.iterator](){return this}next(){const a=this.o$.next();return{value:a.done?void 0:this.Kaa.call(void 0,a.value),done:a.done}}}function yk(a,b){return new xk(a,b)};function zk(){}zk.prototype.next=function(){return Ak};var Ak={done:!0,value:void 0};function Bk(a){return{value:a,done:!1}}zk.prototype.sj=function(){return this};function Ck(a){if(a instanceof zk)return a;if("function"==typeof a.sj)return a.sj(!1);if(ka(a)){let b=0;const c=new zk;c.next=function(){for(;;){if(b>=a.length)return Ak;if(b in a)return Bk(a[b++]);b++}};return c}throw Error("Not implemented");} +function Dk(a,b){if(ka(a))u(a,b);else for(a=Ck(a);;){const {done:c,value:d}=a.next();if(c)break;b.call(void 0,d,void 0,a)}}function Ek(a,b,c){let d=0,e=a,f=c||1;1=e||0>f&&d<=e)return Ak;const h=d;d+=f;return Bk(h)};return g}function Fk(a){if(ka(a))return Ua(a);a=Ck(a);const b=[];Dk(a,function(c){b.push(c)});return b};function Gk(a){if(a instanceof Hk||a instanceof Ik||a instanceof Jk)return a;if("function"==typeof a.next)return new Hk(()=>a);if("function"==typeof a[Symbol.iterator])return new Hk(()=>a[Symbol.iterator]());if("function"==typeof a.sj)return new Hk(()=>a.sj());throw Error("Not an iterator or iterable.");}class Hk{constructor(a){this.hQ=a}sj(){return new Ik(this.hQ())}[Symbol.iterator](){return new Jk(this.hQ())}SI(){return new Jk(this.hQ())}} +class Ik extends zk{constructor(a){super();this.AC=a}next(){return this.AC.next()}[Symbol.iterator](){return new Jk(this.AC)}SI(){return new Jk(this.AC)}}class Jk extends Hk{constructor(a){super(()=>a);this.AC=a}next(){return this.AC.next()}};function Kk(a,b){this.xl={};this.Yc=[];this.jD=this.size=0;var c=arguments.length;if(12*this.size&&Mk(this),!0):!1}; +function Mk(a){if(a.size!=a.Yc.length){for(var b=0,c=0;b=d.Yc.length)return Ak;var f=d.Yc[b++];return Bk(a?f:d.xl[f])};return e};function Nk(a,b){return Object.prototype.hasOwnProperty.call(a,b)};function Pk(){this.Pr=[[]]}function Qk(a){return a.Pr[a.Pr.length-1]}k=Pk.prototype;k.add=function(a){let b=Qk(this);Array.isArray(a)?(b=Ta(b,a),this.Pr[this.Pr.length-1]=b):b.push(a)};k.push=function(){this.Pr.push([])};k.pop=function(){if(1>=this.Pr.length)throw Error("");const a=this.Pr.pop();this.add(a);return a};k.clear=function(a,b){const c=Qk(this);a=void 0!==a?a:0;b=void 0!==b?b:c.length;c.splice(a,b-a)};k.apply=function(a){const b=Qk(this);for(let c=0;c=l?(e-f)/(2*l):(e-f)/(2-2*l));c=[Math.round(g+360)%360,h,l]}else c=b;d=c;"rgb"==a?(b=d[1],c=d[2],a=d[0]/360,0==b?c=d=a=255*c:(b=.5>c?c*(1+b):c+b-b*c,e=2*c-b,c=255*Vk(e,b,a+1/3),d=255*Vk(e,b,a),a=255*Vk(e,b,a-1/3)),a=[Math.round(c),Math.round(d),Math.round(a)]):a=d}return a}Bm(a){const b= +this.fe==a.fe?this.Nb:this.Sc(a.fe);return bb(b,a.Nb)}clone(){return new Tk(this.fe,Ua(this.Nb))}};class Wk extends Sk{constructor(a,b,c,d,e){super(c,d,e);this.Pf=a;this.Cr=[];this.jq=b||0}color(){return this.Pf}priority(){return this.jq}Tt(){const a=this.Of();a.Pf.multiple(-1);return a}Of(){const a=new Wk(this.Pf.clone(),this.jq,this.absolute(),this.Z(),this.completed());a.Cr=Ua(this.Cr);return a}yD(a){if(this.absolute()){this.Pf.add(a.Pf);for(let b=0;b=a)return 0;if(1<=a)return 1;const b=this.f2,c=this.t3,d=1-(b+c),e=1/(b/2+d+c/2);let f=0;0b?b:a,2)/2,a-=b);0d?d:a),a-=d);0a||a>this.duration())throw Error("invalid action's run time");return this.tt?this.tt.normalize(a,this.duration(),b):a};function Fl(){}t(Fl,El);function Gl(a){let b=0;a instanceof El&&(b=a.duration());return b}function Hl(){}Hl.prototype.se=function(a,b,c,d){a.se(b,c,d)};Hl.prototype.complete=function(a,b,c){if(a instanceof Al)a.se(b,c);else if(a instanceof El)a.complete(b,c);else throw Error("unknown action");};var Il=null;function Jl(){Il||(Il=new Hl);return Il}function Kl(){}Kl.prototype.se=function(a,b,c,d){a.gk(b,c,d)}; +Kl.prototype.complete=function(a,b,c){if(a instanceof Al)a.gk(b,c);else if(a instanceof El)a.NC(b,c);else throw Error("unknown action");};var Ll=null;function Ml(){Ll||(Ll=new Kl);return Ll};function Nl(a){this.lc=a||[];this.LN=a?a.slice().reverse():[]}t(Nl,Fl);k=Nl.prototype;k.Ea=-1;k.uh=function(a){if(0<=this.Ea)throw Error("ActionsSequence was already initialized");this.lc.push(a);this.LN.splice(0,0,a)};k.EJ=function(){let a=0;for(let b=0;bthis.Ea&&(this.Ea=this.EJ());return this.Ea};k.se=function(a,b,c){a=this.Mi(a);this.uc(this.lc,Jl(),a,b,c)};k.complete=function(a,b){this.Eh(this.lc,Jl(),a,b)}; +k.gk=function(a,b,c){a=this.Mi(a,!0);this.uc(this.LN,Ml(),a,b,c)};k.NC=function(a,b){this.Eh(this.LN,Ml(),a,b)}; +k.uc=function(a,b,c,d,e){const f=ma(this)+"",g=d.yd;g.push();var h=0;let l=0,n=d.fv.get(f);var m;if(m=n)m=n,m=tk(m.Z())==tk(e)&&m.time()<=c;m&&(h=n.j2+1,l=n.duration(),g.add(n.yd));n=null;m=!1;const p=a.length;for(let r=h;ra||a>=this.count()?null:this.Hn[a]};fm.prototype.Al=function(a){for(let b=0;bb.push(c));return b}function sm(a){if(a.Nc){var b=a.Nc.Xa,c=a.Xa,d=a.fr;c=new Wf(c.left-.5*d,c.top-.5*d,c.width+d,c.height+d);d=Math.abs(b.top-c.top);var e=Math.abs(b.width-c.width),f=Math.abs(b.height-c.height);a.ZB=1E-4>Math.abs(b.left-c.left)&&1E-4>d&&1E-4>e&&1E-4>f&&!a.B_}} +class tm{constructor(a,b,c){this.type=a;this.Xa=b;this.zIndex=c;this.Dl=[];this.Qq=[];this.Nc=null;this.B_=!1;this.text="";this.Fl=this.ul=!1;this.rotation=0;this.ne=this.mj=void 0;this.fr=0;this.ZB=!1;this.kx=new qm}};var um={Bfa:"slide",T1:"interaction",b2:"quiz",c2:"scenario"};q("ispring.presenter.presentation.slides.SlideType",um);q("PRESENTATION_SLIDE","slide",um);q("INTERACTION_SLIDE","interaction",um);q("QUIZ_SLIDE","quiz",um);q("SCENARIO_SLIDE","scenario",um);function vm(a,b,c,d,e,f,g){this.c3=a;this.th=b;this.Ua=c;this.Na=d;this.Xi=e;this.M2=void 0==f?"":f;this.m9=g;this.ml=1}k=vm.prototype;k.containerId=function(){return this.c3};k.url=function(){return this.th};k.width=function(){return this.Ua};k.height=function(){return this.Na};k.ib=function(){return this.Xi*this.ml};k.Al=function(a){this.ml=a};k.bgColor=function(){return this.M2};k.D1=function(){return this.m9};function wm(){this.$y=[]}wm.prototype.count=function(){return this.$y.length};wm.prototype.Al=function(a){for(let b=0;b{a.PB.push(e)}),c=!0);c||a.PB.push(b)} +class Am extends dg{constructor(){var a=new em;super("slide");this.GL=!0;this.yv=new bm(a);this.zU=[];this.Au=new nm;this.Sd=[];this.PB=[];this.kU=[];this.Ao=new ym;this.Xy=new fm;this.CK=new wm;this.ww=[];this.Qg=a}persistState(a){a=super.persistState(a);a.visitedHyperlinks=this.PB;return a}Eo(a,b){super.Eo(a,b);this.PB=w(a,"visitedHyperlinks",!1)}WI(){return this.PB}fD(){return this.Sd}vh(a){0>Ia(this.Sd,a)&&this.Sd.push(a)}oD(){return this.Ao}};function Bm(a,b){this.ya=a;this.ot=b}k=Bm.prototype;k.Ya=null;k.zI=function(a){this.Ya=a};function Cm(a,b){return Sf(a.ya.Md(),b)}function Dm(a,b){return Sf(a.ya.$d(),b)}k.playVideo=function(a,b,c){a=Dm(this,a);if(null!=this.ot.Va&&a){var d=this.Ya;Em(d,a,d.X.timestamp(),null!=b?b:null,c||!1)}};k.stopVideo=function(a,b){a=Dm(this,a);null!=this.ot.Va&&a&&Fm(this.Ya,a,b)}; +k.pauseVideo=function(a,b){a=Dm(this,a);if(null!=this.ot.Va&&a){var c=this.Ya;const d=Gm(c,a);d.playing()?(d.pause(),c.Ll==d&&(c.Ll=null)):Em(c,a,c.X.timestamp(),null,b||!1)}};function Hm(a,b,c,d,e){this.$b=a;this.U2=b;this.V2=c;this.c8=d;this.d8=e}k=Hm.prototype;k.id=function(){return this.$b};k.clientX=function(){return this.U2};k.clientY=function(){return this.V2};k.screenX=function(){return this.c8};k.screenY=function(){return this.d8};function Im(a,b){this.KK=a;this.e9=b}function Jm(a){const b=[];for(let c=0;cd&&(d=h,e=g)}return e?(c.Jt().defaultPrevented?e.Pq():e.tH(c),!0):!1}function Qm(a,b){a.Ak[b.mx()]=b}function Wm(a,b){b=b.mx();b in a.Ak&&delete a.Ak[b]}function Xm(a,b){return b in a.Ak?a.Ak[b]:null};function Ym(){this.zB=new C;this.nT=new C;this.CO=new C;this.BO=new C}k=Ym.prototype;k.oo=null;k.aH=!1;k.mx=function(){return"tap"};k.LH=function(a,b){if("touchEnd"==a)return this.aH?1:0;const c=new Xc(b.touches()[0].clientX(),b.touches()[0].clientY());if("touchStart"==a&&1==b.touches().length)return this.oo=c,this.aH=!0,this.CO.C(),vj||ve(window,"scroll",this.Pq,!1,this),0;if(!this.oo)return 0;50>=$c(c,this.oo)||this.aH&&this.Pq();return 0}; +k.tH=function(a){this.zB.C(this.oo.x,this.oo.y,a.Jt());let b=!1;const c=Date.now();this.OU&&1E3>c-this.OU&&50>=$c(this.B4,this.oo)&&(b=!0,this.nT.C(this.oo.x,this.oo.y,a.Jt()));this.OU=b?null:c;this.B4=this.oo};k.Pq=function(){De(window,"scroll",this.Pq,!1,this);this.aH=!1;this.BO.C()};var Zm={},$m=!1,an=-1;function bn(a){return a in Zm?Zm[a]:null}function cn(a,b,c,d,e){this.Na=a;this.L9=b;this.yZ=c;this.O2=d||!1;this.r4=e||!1}cn.prototype.height=function(){return this.Na};cn.prototype.UR=function(){return this.L9};cn.prototype.bold=function(){return this.O2};cn.prototype.italic=function(){return this.r4};function dn(a){a=a||document.styleSheets;for(var b=[],c=en(a),d=0;a=c[d];d++){var e=fn(a);if(e&&e.length)for(var f=0,g=0,h=e.length,l;gparseInt(Vb,10);let d=Ib,e;d&&(e=parseInt(Vb,10),11<=e&&(d=!1));const f=a.content();a=f.querySelectorAll("span");const g=new Ln(()=>{yn(f)});for(let v=0;vl.length)continue;h=3;if(0<=l[0].search("rgb")||0<=l[0].search("#"))h=0;var n= +l.splice(h,l.length-3).join(""),m=parseFloat(l[2]);l=parseFloat(D.top)||0;h=parseFloat(D.left)||0;let I=1,A=1;var p=0,r=D.msTransform;r&&(r=r.match(/matrix\(\s*([\d.-]+),\s*([\d.-]+),\s*([\d.-]+),\s*([\d.-]+),\s*[\d.-]+,\s*[\d.-]+\s*\)/))&&5==r.length&&(I=parseFloat(r[1]),A=parseFloat(r[4]),p=parseFloat(r[3]));if(10>e)y.style.color=n,0null!=d.onclick)&&(b=new Mn,this.vt.C(a.uu,b),b.actionPrevented()&&c.preventDefault())}};function Sn(a,b){this.M4=a;this.eV=b||null}var Tn=[];Sn.prototype.eV=null;Sn.prototype.Bx=function(){return this.M4};Sn.prototype.si=function(){return this.eV};function Un(a,b,c,d,e,f,g,h){this.qD=a;this.sD=b;this.x1=c;this.y1=d;this.x2=e;this.y2=f;this.rD=g;this.tD=h}Un.prototype.clone=function(){return new Un(this.qD,this.sD,this.x1,this.y1,this.x2,this.y2,this.rD,this.tD)};Un.prototype.Bm=function(a){return this.qD==a.qD&&this.sD==a.sD&&this.x1==a.x1&&this.y1==a.y1&&this.x2==a.x2&&this.y2==a.y2&&this.rD==a.rD&&this.tD==a.tD};function Vn(a,b){const c=zd("canvas");void 0!==a&&(c.width=a);void 0!==b&&(c.height=b);return c}function Wn(a,b){b=b instanceof gm?[b.md,b.Wd,b.Vd,b.Id,b.qe,b.re]:b;a.transform(b[0],b[1],b[2],b[3],b[4],b[5])};function Xn(a,b,c){this.Op=a;this.Cd=this.Hh(b||100,c||100);this.Wf=this.Cd.getContext("2d");this.Wf.fillStyle="rgba(255,255,255,1)";this.zv=Yn}Xn.prototype.zv="";Xn.prototype.Dz=!1;Xn.prototype.Hh=function(a,b){return Vn(a,b)};Xn.prototype.apply=function(a,b){const c=a.getContext("2d");c.save();this.Zi(this.Dz?1-b:b);b=this.Cd;c.scale(a.width/b.width,a.height/b.height);c.globalCompositeOperation=this.zv==Yn?"destination-in":"destination-out";c.drawImage(b,0,0);c.restore()}; +function Zn(a){a.Wf.clearRect(-a.Cd.width,-a.Cd.height,2*a.Cd.width,2*a.Cd.height)}function $n(a,b){const c=a.Cd.width,d=a.Cd.height;a=a.Wf;switch(b){case ao[90]:a.rotate(.5*Math.PI);a.translate(0,-d);break;case ao[180]:a.rotate(Math.PI);a.translate(-c,-d);break;case ao[270]:a.rotate(1.5*Math.PI),a.translate(-c,0)}}var Yn="maskIn",ao={0:"0",90:"90",180:"180",270:"270"};function bo(a){Xn.call(this,a);a=a.si();a&1&&$n(this,ao[90]);a&4&&(this.zv="maskOut",this.Dz=!0)}t(bo,Xn);bo.prototype.Zi=function(a){const b=this.Cd;Zn(this);a*=b.width;this.Wf.fillRect(b.width/2-a/2,0,a,b.height)};function co(a,b,c,d){Xn.call(this,a,102,102);this.Y2=d;this.T7=c;b||$n(this,ao[90]);a=Math.ceil(this.Cd.width/d);c=Math.ceil(this.Cd.height/c);this.Yy=this.Hh(a,c);this.lG=this.Hh(this.Cd.width+a,c)}t(co,Xn); +co.prototype.Zi=function(a){Zn(this);var b=this.Yy.width,c=this.Yy.height,d=this.Yy.getContext("2d");d.clearRect(0,0,b,c);d.fillStyle="rgba(255,255,255,1)";d.fillRect(0,0,b*a,c);a=this.lG.getContext("2d");a.clearRect(0,0,this.lG.width,this.lG.height);b=this.Yy;for(c=0;ca;++a)this.gN.push(mo(100)),this.fN.push(this.Hh(20,20));const b=mo(25);for(a=0;aa;++a)for(c=20*a,d=0;5>d;++d)b.drawImage(this.fN[this.j7[5*a+d]],c,20*d)};function no(a){Xn.call(this,a);a.si()&2&&$n(this,ao[90]);this.GX=Fk(Ek(0,100));db(this.GX)}t(no,Xn);no.prototype.Zi=function(a){Zn(this);const b=this.Wf,c=this.Cd.width;a=Math.floor(100*a);for(let d=0;dd;++d)c.fillRect(0,6*d,b?6*(16-d-1):6*d,6);a&32&&$n(this,ao[180])}t(oo,Xn);oo.prototype.Zi=function(a){Zn(this);this.Wf.drawImage(this.iZ,-192*(1-a),0)};function po(a){Xn.call(this,a);a.si()&16&&(this.zv="maskOut",this.Dz=!0);$n(this,ao[270])}t(po,Xn);po.prototype.Zi=function(a){Zn(this);const b=this.Wf;a*=Math.PI;const c=this.Cd.width;b.save();b.translate(c/2,c/2);b.beginPath();b.moveTo(0,0);b.arc(0,0,c,-a,a,!1);b.lineTo(0,0);b.fill();b.restore()};function qo(a,b){Xn.call(this,a);this.VS=a.si();b||(this.zv="maskOut",this.Dz=!0);$n(this,ao[270])}t(qo,Xn);qo.prototype.Zi=function(a){Zn(this);const b=this.Wf,c=this.Cd.width,d=2*Math.PI/this.VS;a*=d;b.save();b.translate(c/2,c/2);b.beginPath();for(let e=0;e=c&&0<=e&&255>=e&&0<=d&&255>=d){c=[c,e,d];break a}}c=[]}if(c.length)return b.OH=Uk(c[0],c[1],c[2]),b.type="rgb",b;if(Go&&(c=Go[a.toLowerCase()]))return b.OH=c,b.type="named",b;throw Error(a+" is not a valid color string");}var Oo=/#(.)(.)(.)/; +function Mo(a){if(!Lo.test(a))throw Error("'"+a+"' is not a valid hex color");4==a.length&&(a=a.replace(Oo,"#$1$1$2$2$3$3"));return a.toLowerCase()}function Po(a){a=Mo(a);a=parseInt(a.slice(1),16);return[a>>16,a>>8&255,a&255]}function Uk(a,b,c){a=Number(a);b=Number(b);c=Number(c);if(a!=(a&255)||b!=(b&255)||c!=(c&255))throw Error('"('+a+","+b+","+c+'") is not a valid RGB color');b=a<<16|b<<8|c;return 16>a?"#"+(16777216|b).toString(16).slice(1):"#"+b.toString(16)} +function Vk(a,b,c){0>c?c+=1:16*c?a+6*(b-a)*c:1>2*c?b:2>3*c?a+(b-a)*(2/3-c)*6:a}var Lo=/^#(?:[0-9a-f]{3}){1,2}$/i,No=/^(?:rgb)?\((0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2})\)$/i;function Qo(){}t(Qo,Do);Qo.prototype.Qm=function(a,b){Qo.Mb.Qm.call(this,a,b);Eo(this,a,b.context());var c=b.context();try{const d=Fh(a,"backgroundColor"),e=a.style.width,f=a.style.height;if(""!=d&&"transparent"!=d&&""!=e&&""!=f){const g=Ko(d);c.save();c.fillStyle=g.OH;c.fillRect(0,0,parseFloat(e),parseFloat(f));c.restore()}}catch(d){}"block"==ia.window.getComputedStyle(a,null).display&&(b.kK=0)};function Ro(){}t(Ro,Do);Ro.prototype.Qm=function(a,b){Ro.Mb.Qm.call(this,a,b);Eo(this,a,b.context());try{if(a.complete&&0{var e=d=d.clone(),f=-d.re;e.qe+=-d.qe;e.re+=f;hm(b,d)});return b} +function Vo(a,b,c,d){const e=parseFloat(c.fontSize);let f=parseFloat(c.letterSpacing);var g=parseFloat(c.lineHeight);isNaN(g)&&(g=parseFloat(c.height));var h=bn(c.fontFamily);!h||isNaN(g)?isNaN(g)?(a.textBaseline="alphabetic",g=e):(a.textBaseline="middle",g*=.5):(a.textBaseline="alphabetic",g=.5*(e*h.height()+g)-e*(h.UR()+h.yZ));if(isNaN(f))a.fillText(b,0,g),b=a.measureText(b).width;else{const l=[];let n=0;for(h=0;ha.indexOf("http://www.w3.org/2000/svg")&&(a=']*>/g,"").replace(/<\/a>/g,"")}k.X0=function(){};function $o(){this.ro={};this.wJ=this.y3.bind(this)}$o.prototype.BS=null;$o.prototype.LU=null;$o.prototype.PJ=null;$o.prototype.y3=function(){const a=this.ro,b=this.LU;let c;for(;c=b.next();){const d=a[c.nodeName.toLowerCase()],e=d.async(),f=this.BS;b.m0()?e?d.x_(f,this.wJ):d.z1(f):e?d.y_(c,f,this.wJ):d.Qm(c,f);if(e)return}c||this.PJ&&this.PJ()}; +function ap(a,b,c,d){const e=b.getContext("2d");e.clearRect(0,0,b.width,b.height);d&&(b.setAttribute("data-scale-x",d.width),e.scale(d.width,d.height));b=new $o;b.ro.div=new Qo;b.ro.a=new Qo;b.ro.img=new Ro;b.ro.span=new To;b.ro.svg=new Wo;b.ro.canvas=new Fo;b.ro.video=new Fo;b.BS=new Co(e);e.Vw=[];b.PJ=c||null;b.LU=new bp(a,b.ro,b.wJ)} +function bp(a,b,c){this.rb=[];const d=new Fn(a),e=this;setTimeout(()=>{const f=new Bo(a);for(;;){var g=f.next();if(g.done)break;g=g.value;if(g!==a){var h=g.nodeName.toLowerCase();if(h in b){var l=f.zC();h=b[h];const n=g.hasAttribute("data-draw-ignore");l&&!h.isVisible(g)||n?(g=f,l=g.xh?-1:1,g.Ah==l&&(g.Ah=-1*l,g.depth+=g.Ah*(g.xh?-1:1))):(l&&h.X0(g),e.rb.push({element:g,zC:l}))}}}Jn(d);c()},0)}bp.prototype.Ih=-1; +bp.prototype.next=function(){this.Ih{var f=b.Op;var g=ma(f)+"";g in vo?g=vo[g]:(f=wo(f),g=vo[g]=f);g.apply(e,b.progress());yi(e,"50% 50%");on(e,a.L4);yo(d,!0)}),c&&.1>b.progress()&&yo(d,!0)):(d.nq=null,d.KD&&yo(d,!1))}function mp(a,b){a=kl(a.Pa,"filter");return a instanceof hp&&b.progress()==a.progress()&&b.Op.Bx()==a.Op.Bx()&&b.Op.si()==a.Op.si()?!1:!0} +function np(a,b){const c=a.X3;if(c)if(b=b.color(),(a=km(a.Ni,"imgColor"))&&b.Bm(a))yo(c,!1);else{const d=b.Sc("rgb");c.zx()||c.pI();Ao(c,e=>{const f=e.getContext("2d");try{const g=f.getImageData(0,0,e.width,e.height),h=g.data;for(e=0;e=e&&g<=f&&c.se(b,d.add(g))}};function Op(a,b){this.Qg=a;this.Pj=b;this.ve=new Pp(Ql(b.Zs),a);this.pV=[new Jp(b),new Mp(b)];this.g3=new Kk;this.reset(0);this.Lw=new C}k=Op.prototype;k.Gd=0;k.Zx=function(){return this.Lw};k.timeline=function(){return this.Pj};k.time=function(){return this.Gd};k.resume=function(a){const b=Kp(this.ve);b&&vk(Lp(this.ve,b),this.Gd,a)}; +k.seek=function(a,b){if(aa)break}else if(l=h.pk(),l.required())break;else f=new uk(tk(f.add(g))),this.ve.vh(l,f),f=f.yq,a-=g,g=0}this.Gd=a;b=new yl(b,this.g3);for(h=0;h{a.push(c.id())},this);const b=[];u(this.JB,c=>{b.push(c.persistState())},this);return{t:a,at:b}};Pp.prototype.vh=function(a,b){b.vD=this.vD[this.JB.length];this.Sd.push(a);this.JB.push(b)}; +function Lp(a,b){b=Ia(a.Sd,b);if(0>b)throw Error("trigger wasn't activated");return a.JB[b]}function Kp(a){const b=a.Sd.length;return 0{b=b.Z();c=c.Z();return!!b!=!!c?b?1:-1:b&&c?tk(b)-tk(c):0})};function Yp(a){const b=a.ya;var c=b.yv;if(!c)throw Error("slide must contain main timeline");Zp(a);a.Uf=new Op(b.Qg,c);a.Uf.Zx().addHandler(()=>{a.Lw.C(a.Fd)});c=b.zU;a.Gk=[];for(let d=0;d{a.Lw.C(a.Fd)})}} +function Zp(a){a.ya.GL&&a.ya.Au.Sc().forEach(b=>{if(!a.tL.includes(b.id())){var c=a.pp.get(b.id());$p(a,b)&&(jl(c,"moveX",!0).add(new bl(b.Xa().left,!0)),jl(c,"moveY",!0).add(new bl(b.Xa().top,!0)));if(c=(c=rp(a.d_,b,c))?c.mv:null)c=new Tp(b.id(),c),a.ya.yv.qL.uh(c),a.ya.yv.Zs.uh(b.id(),new Up(0),0),a.tL.push(b.id())}})}function $p(a,b){return!a.ya.ww.find(c=>c.Nc&&c.Nc.id==b.id()||!!c.Dl.find(d=>d.id==b.id()))}function aq(a,b){a&&(a.reset(b),a.timeline().Zs.reset())} +function bq(a){if(!a.Uf)throw Error("animation controller isn't activated");}function cq(a){return"completed"==a.Uf.playbackState().state()?a.ya.nb().count()-1:a.Uf.ve.Sd.length-1-1}function dq(a){if(a.Gk){const b=a.kn();for(let c=0;cb.Aa()||c!=a.Fd?!1:!0} +class fq{constructor(a,b,c,d,e){this.ya=a;this.X=c;this.Ae=e;this.Lw=new C;this.Fd=a.index();this.pp=new xl;this.d_=new qp(a,b);this.T4=new sp(d);this.Gk=this.Uf=null;this.Db=!1;this.tL=[];a.ww.forEach(f=>rm(f).forEach(g=>this.pp.set(g.id,g.state)))}Zx(){return this.Lw}persistState(){const a=[];u(this.Gk,b=>{a.push(b.persistState())},this);return{m:this.Uf.persistState(),i:a}}restoreState(a){this.Uf||Yp(this);this.Uf.restoreState(a.m);this.tI(a);this.uo(0,0)}tI(a){u(a.i,(b,c)=>{this.Gk[c].restoreState(b)})}reset(a, +b){void 0===a&&(a=-1);void 0===b&&(b=0);this.Uf||Yp(this);this.bG=this.kn();this.xX=a;this.yX=b;aq(this.Uf,this.bG);0<=a&&(this.uo(0,0),this.seek(a,b));this.uo(0,0,!1)}qI(){this.ya.Au.Sc().some(a=>!this.tL.includes(a.id()))&&(this.ya.yv.qL.Ea=-1,Zp(this),this.reset(0,0))}activate(){if(this.Db)throw Error("already activated");this.Db=!0;this.X.Sb().addHandler(this.wb,this);this.X.Cl().addHandler(this.IV,this)}deactivate(){bq(this);this.Db=!1;this.X.Sb().removeHandler(this.wb,this);this.X.Cl().removeHandler(this.IV, +this)}play(){bq(this);this.Uf.resume(this.kn())}pause(){bq(this)}uo(a,b,c){var d=[];c=void 0!==c?c:this.X.Ag();a=this.Uf.Ai(a,this.pp,c);d.push(a);for(a=0;a +v.level())p=v;m=p}else if(m instanceof Xk){m=Xp(p);p=null;for(r=0;r=this.Uf.ve.Sd.length?0:this.Uf.time();if(a>d||a==d&&(void 0===b||e<=b)){for(;cq(this)!=a;)this.Uf.Tw("__step",c),e=0;void 0!== +b&&0e)){c=c.Sj();const f=[];for(let g=0;g=d&&l<=e&&f.push(h)}d=f;for(e=0;e{(e=kk(a.pa,e.YW))?(kq(d,e),b=!0):c=!0});a.iP=b&&!c}function lq(a){jq(a,b=>b.$Q())}function mq(a){jq(a,b=>{b.stop();Lj&&b.JP()})}function nq(a){jq(a,b=>oq(b));a.iP=!1}function jq(a,b){const c=a.Va.ie;a.ya.$d().Sc().forEach(d=>{if(!(0b?a.rp:a.M[b]).fl)}ju(a){Th(this.slide(),a)}width(){return this.Ua}height(){return this.Na}slide(){return this.ya}clone(){return this.Of}lv(a){Nq(this,a.tb,a.slideBackground()); +Oq(this)}nr(){this.Oc();this.ya=zd("DIV");F(this.ya,"position","absolute");this.vw=zd("DIV");F(this.vw,"position","absolute");this.ya.appendChild(this.vw);Pq(this,this.kv);this.yG=zd("DIV");F(this.yG,"position","absolute");this.ya.appendChild(this.yG);this.yG.appendChild(this.tb);this.fl.appendChild(this.ya);Oq(this)}k0(a){Pq(this,a);this.ya&&Oq(this)}RH(){return this.kv}Oc(){this.ya&&(Fd(this.ya),this.ya=null)}content(){return this.yG}background(){return this.vw}pW(a){this.lv(a)}resize(a,b){if(this.Ua!= +a||this.Na!=b)this.Ua=a,this.Na=b,this.jw(a,b)}jw(a,b){a=Math.min(a/this.OW,b/this.NW,this.gV);this.tb&&Qq(this,this.tb,a);this.no&&Qq(this,this.no,a)}};class Sq{constructor(a){this.m3=a}displayObject(){return this.m3}};class Tq{constructor({Xj:a,uD:b}){this.hh=a.concat();this.tP=b.concat()}Xj(){return this.hh.concat()}uD(){return this.tP.concat()}persistState(){const a={};a.indexes=this.hh;a.zoomStates=this.tP;return a}LP(){return new Tq({Xj:this.hh,uD:this.tP})}};function Uq(a){for(let b=a.Hi.length-1;0<=b;--b)if(a.Hi[b])return a.Hi[b];return null}function Vq(a,b=null){a.GD=b?new Sq(b):null;a.xs=null}function Wq(a,b){const c=[];for(let d=0;dd.includes(e))} +function Yq(a,b,c,d,e,f){function g(l){if(e&&!f.ja(c).visible())return l;for(;l{Jq(a.Ol,a.hi,g,c,l=>{a.VY.set(a.CG[e],l);h(l)},f.RH())})} +function fr(a,b,c,d,e,f){const g=a.Ca.Z().timestamp(),h=dr(g,b,f,d,e);if(a.WD[h])return Promise.resolve(a.aT.get(a.WD[h]));a.WD[h]={hash:h};const l=a.vc.zd[c],n=er(a,c);return new Promise(m=>{Lq(a.Ol,a.hi,n,e,d,f,p=>{a.aT.set(a.WD[h],p);p.setAttribute("id",b);m(p)},l.RH())})} +function gr(a,b,c){function d(){return new Promise(n=>{cr(l,h).then(m=>{l.Lb.jR(m);c.jR(l.Lb.wQ());n()})})}function e(){return new Promise(n=>{fr(l,g.id(),h,g.Xa(),g.rotation(),[g.Wx()]).then(m=>{l.Lb.GD=new Sq(m);n()})})}b=0<=b?a.M.ja(b):void 0;var f=b instanceof br||b instanceof sq||b instanceof Aq;if(!c||f)return Promise.resolve();const g=c.effect(),h=c.wr(),l=a;g&&g.Nm()&&(Vq(a.Lb),a.Lb.BU.C(b));b=g&&!g.Nm()&&!c.na();f=!!c.Yo();a=[];if(f&&b)b=new Promise(n=>{d().then(()=>{e().then(()=>{n()})})}), +a.push(b);else if(f||b)f&&(f=d(),a.push(f)),b&&(b=e(),a.push(b));return Promise.all(a)}function dr(a,b,c,d,e){c=c.join(",");a=[a.Aa(),a.ib(),b,c];d&&a.push(d.toString());void 0!==e&&a.push(e);return a.join("_")}function er(a,b){const c=a.vc.zd[b];b=a.M.ja(b);var d=c.PY;b.GL=!1;d=new ar({content:d,fD:b.fD()});a=new pq(b,d,a.Ca,a.Ae);a.TH();var e=a.nb();d=e.pc(e.count()-1);e=e.count()-1;d=d.duration();a.Me.activate();a.Me.reset(e,1E3*d);b.GL=!0;return c.clone()} +class hr{constructor({lca:a,Pm:b,ada:c,Ho:d,slides:e,yH:f,iI:g}){this.hi=a;this.vc=b;this.Ca=d;this.M=e;this.Va=f;this.Ae=g;this.Ol=new Mq;this.VY=new WeakMap;this.CG={};this.aT=new WeakMap;this.WD={};this.Lb=c;this.uz={}}};function ir(a){this.sa=a.content;this.e3=""==a.contentHover?a.content:a.contentHover;this.th=a.url;this.Ua=a.width;this.Na=a.height;this.n9=a.Yx;this.y4=a.language;this.p3=a.Zw;this.o3=a.Yw;this.q3=a.$w;this.r3=a.ex}k=ir.prototype;k.content=function(){return this.sa};k.contentHover=function(){return this.e3};k.url=function(){return this.th};k.width=function(){return this.Ua};k.height=function(){return this.Na};k.Yx=function(){return this.n9};k.language=function(){return this.y4};k.Zw=function(){return this.p3}; +k.Yw=function(){return this.o3};k.$w=function(){return this.q3};k.ex=function(){return this.r3};function jr(a){ir.call(this,a)}t(jr,ir);class kr{constructor(a,b,c){this.Th=a;this.I4=b;this.v9=[].concat(c)}name(){return this.Th}localName(){return this.I4}urls(){return this.v9}};class lr{constructor(){this.CA=[]}count(){return this.CA.length}d0(a){if(0>a||a>=this.count())throw Error("index is out of range");return this.CA[a]}U9(a){this.CA.push(a)}}lr.prototype.getPresenter=lr.prototype.d0;lr.prototype.count=lr.prototype.count;class mr{constructor(a,b){this.Af=a;this.Kr=b;this.nh=1;this.th=null;this.Bq="_self"}src(){return this.Af}Xa(){return this.Kr}opacity(){return this.nh}Hf(a){this.nh=a}url(){return this.th}target(){return this.Bq}};class nr{constructor(){this.Du={}}XP(a){return a in this.Du}};var or={bda:"activated",Wda:"deactivated",XR:"buffering"};q("ispring.presenter.presentation.narration.NarrationTrackPlaybackState",or);q("ACTIVATED","activated",or);q("DEACTIVATED","deactivated",or);q("BUFFERING","buffering",or);function pr(a,b){a.Yh!=b&&(a.Yh=b,a.dX.C(a))}class qr{constructor(a,b,c){this.il=a;this.IK=b;this.He=void 0!==c?c:1;this.Yh="deactivated";this.dX=new C}jc(){return this.il}jf(){return this.IK}volume(){return this.He}playbackState(){return this.Yh}playbackStateChangedEvent(){return this.dX}}qr.prototype.playbackStateChangedEvent=qr.prototype.playbackStateChangedEvent;qr.prototype.playbackState=qr.prototype.playbackState;qr.prototype.endTimestamp=qr.prototype.jf;qr.prototype.startTimestamp=qr.prototype.jc;class rr extends qr{constructor(a,b,c,d){super(b,c,d);this.v2=a}audio(){return this.v2}}rr.prototype.audio=rr.prototype.audio;class sr{constructor(){this.sm=[]}get C1(){return this.sm}count(){return this.sm.length}sC(a){if(0>a||a>=this.count())throw Error("index is out of range");return this.sm[a]}}sr.prototype.getTrack=sr.prototype.sC;sr.prototype.count=sr.prototype.count;class tr extends sr{b0(a){return this.sC(a)}q_(a){this.sm.push(a)}Sc(){const a=[];for(let b=0;ba||a>=this.count())throw Error("index is out of range");return this.hw[a]}Sc(){return this.hw}}yr.prototype.getReference=yr.prototype.e0;yr.prototype.count=yr.prototype.count;class zr{constructor(){this.hw=new yr}ti(){return this.hw}}zr.prototype.references=zr.prototype.ti;class Ar{constructor(){this.Fb=!1}enabled(){return this.Fb}ra(a){this.Fb=a}};class Br{constructor(){this.Zy=!0}fitToWindow(){return this.Zy}}Br.prototype.fitToWindow=Br.prototype.fitToWindow;var Cr={tea:"free",Qfa:"restricted",jga:"sequential"};q("ispring.presenter.presentation.settings.NavigationType",Cr);q("FREE","free",Cr);q("RESTRICTED","restricted",Cr);q("SEQUENTIAL","sequential",Cr);class Dr{constructor(){this.X4=new vg;this.Kz=new ug;this.N3=new pg;this.Bn="free"}Gm(){return this.X4}keyboard(){return this.Kz}lx(){return this.N3}navigationType(){return this.Bn}lR(a){this.Bn=a}}Dr.prototype.navigationType=Dr.prototype.navigationType;Dr.prototype.mouse=Dr.prototype.Gm;var Er={Dfa:"prompt",eda:"always",Sea:"never"};q("ispring.presenter.presentation.settings.PresentationResumeMode",Er);q("PROMPT_TO_RESUME","prompt",Er);q("ALWAYS_RESUME","always",Er);q("NEVER_RESUME","never",Er);class Fr{constructor(){this.mG=this.qp=this.bV=!1;this.kw="never"}Fm(){return this.bV}eca(a){this.bV=a}ff(){return this.qp}yI(a){this.qp=a}eu(){return this.kw}bR(){return this.mG}}Fr.prototype.resumeMode=Fr.prototype.eu;Fr.prototype.autoStart=Fr.prototype.ff;Fr.prototype.loopPlayback=Fr.prototype.Fm;var Gr={dea:["BC","AD"],cea:["Before Christ","Anno Domini"],Qea:"JFMAMJJASOND".split(""),Ega:"JFMAMJJASOND".split(""),Mea:"January February March April May June July August September October November December".split(" "),Dga:"January February March April May June July August September October November December".split(" "),nga:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),Gga:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),lha:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "), +Iga:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),pga:"Sun Mon Tue Wed Thu Fri Sat".split(" "),Hga:"Sun Mon Tue Wed Thu Fri Sat".split(" "),Rea:"SMTWTFS".split(""),Fga:"SMTWTFS".split(""),oga:["Q1","Q2","Q3","Q4"],Ifa:["1st quarter","2nd quarter","3rd quarter","4th quarter"],fda:["AM","PM"],Uda:["EEEE, MMMM d, y","MMMM d, y","MMM d, y","M/d/yy"],Vga:["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],Vda:["{1} 'at' {0}","{1} 'at' {0}","{1}, {0}","{1}, {0}"],Q1:6,mha:[5,6], +R1:5},Hr=Gr;Hr=Gr;function Ir(a,b,c,d,e,f){"string"===typeof a?(this.rj=a==Jr?b:0,this.kj=a==Kr?b:0,this.days=a==Lr?b:0,this.Wj=a==Mr?b:0,this.Yj=a==Nr?b:0,this.hk=a==Or?b:0):(this.rj=a||0,this.kj=b||0,this.days=c||0,this.Wj=d||0,this.Yj=e||0,this.hk=f||0)} +Ir.prototype.TI=function(){var a=Math.min(this.rj,this.kj,this.days,this.Wj,this.Yj,this.hk),b=Math.max(this.rj,this.kj,this.days,this.Wj,this.Yj,this.hk);if(0>a&&0a&&b.push("-");b.push("P");this.rj&&b.push(Math.abs(this.rj)+"Y");this.kj&&b.push(Math.abs(this.kj)+"M");this.days&&b.push(Math.abs(this.days)+"D");if(this.Wj||this.Yj||this.hk)b.push("T"),this.Wj&&b.push(Math.abs(this.Wj)+"H"),this.Yj&&b.push(Math.abs(this.Yj)+"M"),this.hk&&b.push(Math.abs(this.hk)+ +"S");return b.join("")};Ir.prototype.Bm=function(a){return a.rj==this.rj&&a.kj==this.kj&&a.days==this.days&&a.Wj==this.Wj&&a.Yj==this.Yj&&a.hk==this.hk};Ir.prototype.clone=function(){return new Ir(this.rj,this.kj,this.days,this.Wj,this.Yj,this.hk)};var Jr="y",Kr="m",Lr="d",Mr="h",Nr="n",Or="s";Ir.prototype.add=function(a){this.rj+=a.rj;this.kj+=a.kj;this.days+=a.days;this.Wj+=a.Wj;this.Yj+=a.Yj;this.hk+=a.hk}; +function Pr(a,b,c){"number"===typeof a?(this.hc=Qr(a,b||0,c||1),Rr(this,c||1)):la(a)?(this.hc=Qr(a.getFullYear(),a.getMonth(),a.getDate()),Rr(this,a.getDate())):(this.hc=new Date(wa()),a=this.hc.getDate(),this.hc.setHours(0),this.hc.setMinutes(0),this.hc.setSeconds(0),this.hc.setMilliseconds(0),Rr(this,a))}function Qr(a,b,c){b=new Date(a,b,c);0<=a&&100>a&&b.setFullYear(b.getFullYear()-1900);return b}k=Pr.prototype;k.Y_=Hr.Q1;k.$_=Hr.R1; +k.clone=function(){var a=new Pr(this.hc);a.Y_=this.Y_;a.$_=this.$_;return a};k.getFullYear=function(){return this.hc.getFullYear()};k.getYear=function(){return this.getFullYear()};k.getMonth=function(){return this.hc.getMonth()};k.getDate=function(){return this.hc.getDate()};k.getTime=function(){return this.hc.getTime()};k.getDay=function(){return this.hc.getDay()};k.getUTCFullYear=function(){return this.hc.getUTCFullYear()};k.getUTCMonth=function(){return this.hc.getUTCMonth()};k.getUTCDate=function(){return this.hc.getUTCDate()}; +k.getUTCDay=function(){return this.hc.getDay()};k.getUTCHours=function(){return this.hc.getUTCHours()};k.getUTCMinutes=function(){return this.hc.getUTCMinutes()};k.getTimezoneOffset=function(){return this.hc.getTimezoneOffset()};k.set=function(a){this.hc=new Date(a.getFullYear(),a.getMonth(),a.getDate())};k.setFullYear=function(a){this.hc.setFullYear(a)};k.setYear=function(a){this.setFullYear(a)};k.setMonth=function(a){this.hc.setMonth(a)};k.setDate=function(a){this.hc.setDate(a)};k.setTime=function(a){this.hc.setTime(a)}; +k.setUTCFullYear=function(a){this.hc.setUTCFullYear(a)};k.setUTCMonth=function(a){this.hc.setUTCMonth(a)};k.setUTCDate=function(a){this.hc.setUTCDate(a)}; +k.add=function(a){if(a.rj||a.kj){var b=this.getMonth()+a.kj+12*a.rj,c=this.getYear()+Math.floor(b/12);b%=12;0>b&&(b+=12);a:{switch(b){case 1:var d=0!=c%4||0==c%100&&0!=c%400?28:29;break a;case 5:case 8:case 10:case 3:d=30;break a}d=31}d=Math.min(d,this.getDate());this.setDate(1);this.setFullYear(c);this.setMonth(b);this.setDate(d)}a.days&&(c=this.getYear(),b=0<=c&&99>=c?-1900:0,a=new Date((new Date(c,this.getMonth(),this.getDate(),12)).getTime()+864E5*a.days),this.setDate(1),this.setFullYear(a.getFullYear()+ +b),this.setMonth(a.getMonth()),this.setDate(a.getDate()),Rr(this,a.getDate()))};k.TI=function(){var a=this.getFullYear();const b=0>a?"-":1E4<=a?"+":"";return[b+kd(Math.abs(a),b?6:4),kd(this.getMonth()+1,2),kd(this.getDate(),2)].join("")+""};k.Bm=function(a){return!(!a||this.getYear()!=a.getYear()||this.getMonth()!=a.getMonth()||this.getDate()!=a.getDate())};k.toString=function(){return this.TI()};function Rr(a,b){a.getDate()!=b&&a.hc.setUTCHours(a.hc.getUTCHours()+(a.getDate()=this.o1.valueOf()&&a.valueOf()<=this.lC.valueOf()};Tr.prototype.iterator=function(){return new Ur(this)};function Ur(a){this.DQ=a.getStartDate().clone();this.lC=Number(a.lC.TI())}t(Ur,zk);Ur.prototype.next=function(){if(Number(this.DQ.TI())>this.lC)return Ak;var a=this.DQ.clone();this.DQ.add(new Ir(Lr,1));return Bk(a)};function Vr(a,b){a.rZ=b}class Wr{constructor(){this.eN=void 0;this.mT=this.rZ=null}password(){return this.eN}Xx(){return this.rZ}DH(){return this.mT}};function Xr(){}Xr.prototype.MY=null;Xr.prototype.oX=null;Xr.prototype.HI=function(){return this.MY};function Yr(a,b){a.MY=b}Xr.prototype.mI=function(){return this.oX};function Zr(a,b){a.oX=b}function $r(a,b){this.th=a;this.Bq=b}$r.prototype.url=function(){return this.th};$r.prototype.target=function(){return this.Bq};$r.prototype.open=function(){fh(this.th,{target:this.Bq})};class as{constructor(){this.gM=new Dr;this.mN=new Fr;this.s2=new Br;this.I=this.CE=this.Wa=null;this.xq="";this.H9=new Xr;this.B7=new Wr;this.i2=new Ar}navigation(){return this.gM}Pc(){return this.mN}Lq(){return this.s2}NI(){return this.xq}skin(){return this.Wa}ia(){return this.I}fR(a){this.I=a}xu(){return this.H9}Hx(){return this.B7}Gt(){return this.i2}}as.prototype.i18n=as.prototype.ia;as.prototype.skin=as.prototype.skin;as.prototype.appearance=as.prototype.Lq;as.prototype.playback=as.prototype.Pc;function bs(){this.tO=[]}bs.prototype.count=function(){return this.tO.length};bs.prototype.add=function(a){this.tO.push(a)};function cs(a,b){const c=a.count();for(let d=0;d{gr(a.nH,b,n).then(()=>{a.ZT(b,c,d,e,f,g,h,l,n);m&&a.Lb.reset();a.sF&&a.sF();a.sF=null})},r=n?n.wr():b,v=a.M.ja(r);!n||v.mf()?p():(a.Ye.gl.addHandler(y=>{y.index()===r&&p()}),a.Ye.iu(r))} +function ps(a,b=!0){if(a.mG){var c=a.Z().timestamp();if(0<=c.L()&&0<=c.Aa()){var d=a.kf(c.L());d=d instanceof pq?d.persistState():null;d=new jk(d,c.Aa(),c.ib());a=a.Va.Ce;b&&(a.DB=!0);qs(a,c.L(),d);a.invalidate()}}}function rs(a){var b=a.X.timestamp(),c=b.Aa();b=b.ib();const d=a.Od.nb();c=0<=c?d.pc(c):null;return"suspended"==a.X.state()||null!==c&&b>=c.duration()}function ss(a,b){const c=ms(a)?ns(a).yw:void 0;return new gs(a.F.slides(),b.id(),b,c)} +function ts(a,b,c,d,e){c=c?d&&d.Yo()?new gf(d.wr(),0,0):e||a.X.timestamp():null;a.Bf.push(new Xg(b,c,a.Pe));b=lg(b);0>b&&(b=0);a.Pe=b}function us(a,b,c){const d=Uq(a.Lb)||void 0,e=d?!1:void 0;if(d){var f=d.effect();const g=ss(a,f),h=new gf(d.wr(),0,0);d.na()||ts(a,g,f.qr(),d,h);f=lg(g);0>f&&(f=0);a.Pe=f}os(a,{L:b,ff:c,ZC:e,pr:!0,xP:!1,hy:d})} +function vs(a){if(0a.M.ja(d).visible()&&d>ns(a).slides()[a.Pe]);if(void 0===c)for(b=a.Bf.length-2;-1<=b;--b)c=a.Bf[b],c=(c?c.xw:a.Sh).slides().find(d=>a.M.ja(d).visible()&&d>ns(a).slides()[a.Pe]);return void 0!==c?c:-1}c=ms(a)?ns(a).yw:void 0; +b=b?Yq(a.Lb,b.index(),a.U,a.$().qk(),c,a.M):-1;return b>=a.M.count()?-1:b}return-1}function As(a){if(!a.Lb.ri()){var b=a.Lb.WH();if(-1!=b)return b}var c=a.$();b=ys(a);if(!ms(a)&&a.U!=b)return ns(a).slides()[0];b=kg(ns(a));if(b.seekTo(a.Pe)){for(c=c.visible();gg(b);){const d=b.$();if(d&&d.gy()||!c||c&&d&&d.visible())break}b=b.$();return!b&&ms(a)&&ws(a)?(b=zs(a).slides().concat().reverse().find(d=>da.Bf.length)return a.Sh;const b=a.Bf[a.Bf.length-2];return b?b.xw:a.Sh}function Es(a,b,c,d,e){ts(a,b,c,d);os(a,{L:b.slides()[a.Pe],ZC:!0,hy:d,$t:e})}function Fs(a,b,c){const d=ss(a,b);c=Cs(a,b,!1,c);Es(a,d,b.qr(),c)}function Gs(a,b){a.Bf.length||a.eE.C();var c=ms(a),d=a.Bf.pop();const e=c?d.xw.n_:void 0;e&&Vq(a.Lb);(c=d.TX)?(a.Pe=d.B8,d=e?Cs(a,e,!0):void 0,os(a,{L:c.L(),pr:!1,hy:d,$t:b})):a.Pe=a.U} +function Pg(a,b,c,d){if(0>a.U)throw Error("current slide is null");var e=!!a.$().fj().Oo();const f=d?vs(a):a.Ug();0<=f?(d=()=>{a.Rs=!0;const g=Hs(a,f);g?Fs(a,g.E0,g.Yo):0=a.M.count())){if(!a.M.ja(b).visible())return xs(a,b+1);b=a.U==b?void 0:$f(a.$().qk(),b);var c=ms(a)?ns(a).yw:void 0;return b&&Xq(a.Lb,b.slides(),c)?xs(a,Math.max.apply(a,b.slides())+1):b}}function Is(a){a.VF||(a.VF=!0,a.$l.C())}function Ks(a){return"accessible"==a.vc.Gb} +function Ls(a,b){a.sF=b}function Ms(a,b,c,d,e){a.U!=b&&(c&&0<=a.U&&a.wE.push(a.M.ja(a.U)),d&&0<=a.U&&(d=ms(a)?ns(a).yw:void 0,a.Lb.push(a.M.ja(a.U),e,d)),a.Od&&(a.Od.NP(),a.Od.deactivate()),e=ns(a).slides(),d=-1,null!==a.Rs&&(d=a.Rs?e.indexOf(b,a.Pe):e.lastIndexOf(b,a.Pe)),e=0<=d?d:e.indexOf(b),0<=e&&(a.Pe=e),a.Rs=null,a.U=b,e=a.M.ja(b),e.gy()||cg(e,!0),Ks(a)&&!e.completed()&&(e.vj=!0),c&&Ns(a.Va.Ce,b),a.Od=a.kf(b),a.KY.C(b),Os(a,e),a.OY.C(b))} +function Ps(a){if(a.Od){var b=a.Od;qk(b,a.Db);b.activate(a.Va);a.Od instanceof pq&&(a.Od.TH(),a.Od.qI())}}function Os(a,b){const c=b.index(),d=a.kf(c);b=b.persistState(d);a=a.Va.Ce;a.vq[c]=b;a.ll=!0;a.invalidate()}function Qs(a){var b=a.Va.Ce.vm;if(b){var c=b.Xj();b=b.uD();for(let e=0;e{this.QO.Z().Cl().C()},this);this.X.vr().addHandler(()=>{this.QO.Z().vr().C()},this); +this.Ge.UI().addHandler(this.AW,this);this.Ge.tu().addHandler(()=>{this.DZ.C()},this);this.Ge.UI().addHandler(()=>{this.CZ.C();ls(this)},this);this.E8=[];this.wE=new Hg;this.Sh=a.ZH();this.Bf=[];a=new cd(this.F.slideWidth(),this.F.slideHeight());this.Lb=new $q(this.Va.Ce);this.Lb.jW.addHandler(()=>{this.nH.uz={};ms(this)&&(this.Bf.pop(),this.Pe=this.U);ls(this)},this);this.Lb.BU.addHandler(n=>{ls(this,n)},this);this.nH=new hr({lca:a,Pm:b,ada:this.Lb,Ho:e,slides:this.M,yH:f,iI:this.Qi});b=this.X.timestamp().L(); +0<=b&&(this.X.started()?os(this,{L:b,r_:!1,Lm:!1}):this.wb(this.X));this.NL=Date.now();this.kS=new hs;this.kS.Sb().addHandler(this.j5,this);this.kS.start();this.sJ=new C;this.Dr=new C;this.OY=new C;this.vB=new C;this.KY=new C;this.eE=new C;this.JT=new C;this.DZ=new C;this.CZ=new C;this.ET=new C;this.Rk=new C;this.cN=new Fg;this.cN.pC()&&ve(this.cN,"visibilitychange",this.Z6,!1,this);ve(window,"beforeunload",()=>{ps(this,!1)});this.ZU=new C;this.HZ=new C;this.Qi.Rk.addHandler(this.V5,this)}play(){0> +this.U?os(this,{L:this.Gf(),pr:!1}):rs(this)&&!this.X.kd()?this.Lo():this.Od.play()}pause(){this.Od&&this.Od.pause()}pe(a,b,c=!0){this.Lb.reset();os(this,{L:a,ff:b,pr:!c,$t:!0})}WH(){const a=this.wE.top();return a?a.index():-1}qx(a){this.Lb.reset();if(!this.wE.ri()){void 0===a&&(a=!0);var b=this.wE.pop();b&&os(this,{L:b.index(),ff:a,r_:!1,$t:!0})}}Gf(){const a=kg(this.Sh);return hg(a)?a.$().index():this.Sh.slides()[0]}Em(){var a=kg(this.Sh);a.U=a.zw.length;if(ig(a))return a.$().index();a=this.Sh.slides().length; +return this.Sh.slides()[a-1]}Yq(a){this.Lb.reset();os(this,{L:this.Gf(),ff:a,$t:!0})}Zq(a){this.Lb.reset();os(this,{L:this.Em(),ff:a,$t:!0})}lf(a){Pg(this,void 0!==a?a:!0,!0)}ni(a){void 0===a&&(a=!0);if(0>this.U)throw Error("current slide is null");this.aL(a,!1)}Lo(){if(0>this.U)throw Error("Slide has not been loaded");var a=this.X.timestamp(),b=a.Aa(),c=a.ib();a=this.Od;var d=a.nb();const e=0<=b?d.pc(b):null,f=e?e.duration():0;d=b==d.count()-1&&(c>=f||e&&e.rl());0>b?(Js(this.Ge),this.HB&&Pg(this, +!0,!1)):d?(nk(a),Pg(this,!0,!0)):(this.xE=f<=c,b=a.ya.nb(),c=a.Ca.Z().timestamp().Aa(),c==b.count()-1?nk(a):(b=c+1,a.play(),mk(a,b,0)),Bs(this),this.xE=!1)}Vj(a,b,c,d){void 0==d&&(d=!1);if(a>this.M.count()||0>a)throw Error("slideIndex is out of bounds");var e=this.M.ja(a);if(0>b)c=b=0;else{var f=e.nb().count();b>f-1&&(b=f-1)}"idle"!=this.Ge.state()&&Js(this.Ge);if(f=a!=this.U){ps(this);this.Ye.iu(a);if(!e.mf()){this.Hp=arguments;this.jz=this.Vj.bind(this);this.Hp.L=a;Ss(this.Ca,!0,this.Ye);return}this.Hp&& +(this.jz=this.Hp=null,Ss(this.Ca,!1,this.Ye));if(0==b&&0==c){os(this,{L:a,ff:d,ZC:!1});return}e=this.kf(a);if(e instanceof pq){e.Me.reset(b,1E3*c);var g=Ts(this.Va.Ce,a);(g=g?g.Yl:null)&&e.tI(g)}}this.Ca.Ai(a,b,c,!0);f&&this.Dr.C(a);d?this.Ca.start():this.Ca.stop();Bs(this)}aL(a,b,c=!1){void 0!==this.$K?this.tX=arguments:this.$K=setTimeout(this.WT.bind(this,a,b,c),0)}WT(a,b,c=!1){clearTimeout(this.$K);this.$K=void 0;var d=this.tX;if(d)this.tX=null,this.WT.apply(this,d);else{d=this.Vg();if(0>d){if(0> +this.U)return;d=this.U}this.Rs=!1;if(!this.Lb.ri()&&this.Lb.WH()==d){const {slide:g,P$:h}=this.Lb.pop();if(g){d=void 0;if(h){var e=h.wr()==g.index();d=void 0;var f=h.effect();h.Yo()&&(f=h.Yo(),d=h.effect());d=Cs(this,f,e,d);e&&Vq(this.Lb,Us(this.vc,g.index()).RH())}ms(this)&&ws(this)&&(this.Bf.pop(),this.Pe=this.U);d&&!ms(this)&&(e=d.effect(),f=ss(this,e),ts(this,f,e.qr(),d));os(this,{L:g.index(),ff:a,na:b,pr:c,xP:!1,hy:d});return}}os(this,{L:d,ff:a,na:b,pr:c,xP:!1})}}Vg(){if(0>this.U)return-1;const a= +this.$().fj().Gx();return a?Ds(a):As(this)}Ot(){const a=this.kf(this.U);let b=!0;var c=this.X.timestamp();const d=c.Aa();0>d?(Js(this.Ge),this.HB||(this.aL(!1,!0,!0),b=!1)):0this.U)){var b=this.X.Ag(),c=b?(this.NL-a)/1E3:0,d=this.X.timestamp();a=d.L();var e=d.Aa();d=d.ib();var f=this.Qi.playbackRate();d+=c*f;if(b&&0<=e&&(b=this.$().nb(),c=b.pc(e),d>=c.duration()))if(c.rl()){++e;if(e==b.count()){this.Ca.Ai(a,e-1,c.duration());Pg(this,!0,!1);return}d=0}else{this.Ca.Ai(a,e,c.duration());Vs(this.Ca,!0);return}this.Ca.Ai(a,e,d)}}AW(){this.Ye.ra(!0);const a=this.kf(this.U);a.pH();const b=Ts(this.Va.Ce,this.U),c= +b?b.Yl:null;this.xE=!0;b&&this.L7?(this.Ca.Ai(this.U,b.Aa(),b.ib()),this.Od instanceof pq&&c&&this.Od.restoreState(c),this.qp?a.play():a.pause()):this.qp?(a.play(),mk(a,0,0)):ok(a);this.xE=!1;(this.HB||b)&&Bs(this)}Ug(){if(0>this.U)return-1;const a=this.$().fj().Oo();return a?Ds(a):vs(this)}ZT(a,b,c,d,e,f,g,h,l){a<<=0;if(a>=this.M.count()||0>a)throw Error("Invalid slide index");void 0==b&&(b=!0);void 0==c&&(c=!0);void 0==d&&(d=!1);void 0==e&&(e=!0);void 0==f&&(f=!0);void 0==g&&(g=!0);void 0==h&&(h= +!0);if(a!=this.U){var n=~this.U?this.M.ja(this.U).type():null,m=this.M.ja(a).type(),p=Ks(this);this.sJ.C(n,m);n="quiz"==m||this.Oa();m="interaction"==m||this.fb();if(n||m||p)f=!1;"idle"!=this.Ge.state()&&Js(this.Ge);this.Ye.iu(a);if(2!=this.Ye.nx(a))this.Hp=arguments,this.Hp.L=a,this.jz=this.ZT.bind(this),Ss(this.Ca,!0,this.Ye);else{this.jz=this.Hp=null;this.Ye.ra(!1);m=l?l.effect():void 0;this.qp=p?!1:b;this.HB=l?void 0===m.duration()?null===this.Rs?!1:!this.Rs:l.na():d;this.L7=g;p=this.HB?0>this.U? +a:this.U:a;this.tg=this.M.ja(p).transition().clone();l&&(void 0===m.duration()?m=null:(m=m.duration(),m=new Nf("Zoom",m,null,!1)),this.tg=m||this.tg);this.JT.C(this.tg,this.U,a);ps(this);this.Ca.Ai(p,-1,0);p=this.kf(a);p instanceof pq&&(g||qs(this.Va.Ce,a),(m=(m=Ts(this.Va.Ce,a))?m.Yl:null)?p.restoreState(m):(dq(p.Me),p.Me.reset(0,0)));Ms(this,a,c,h,l);if(p=f&&0 +m.U;m.Kn=A?I.background():m.vc.zd[m.U];m.Fv=I.zd[r];I=[];0<=m.U&&(I=m.F.slides().ja(m.U),I=I instanceof Am?I.ww:[]);var J=m.F.slides().ja(r);J=J instanceof Am?J.ww:[];m.U=r;Ws(m);v=r=new Xs(m.pg,m.og,y,m.Fv,m.Kn,m.Rf,v,D);y=J;v.Gs=I;v.Ds=y;r.Jv=A;A=n;n=r;"RandomTransition"==A&&(A=Ys[Math.floor(Math.random()*Ys.length)],A=A[Math.floor(Math.random()*A.length)]);n=(A=Zs[A])?A(n):new $s(n);m.Yg=n;m.Yg.Rt()&&(A=m.Yg,A.X=m.X,A.X.Cl().addHandler(A.HV,A),A.X.vr().addHandler(A.GV,A),m.Yg.ge.addHandler(m.zW, +m));n.zx()?at(m):n.JA.addHandler(m.XM,m)}else bt(this.Ge,a),ls(this);Ps(this);this.Dr.C(a);this.Ca.start(d);f&&((n=this.tg.zf)?(m=this.Va.mediaController(),ct(m,n,m.X.timestamp(),0)):this.tg.fZ&&Gp(this.Va.mediaController()));p||this.AW();e&&Bs(this)}}}playbackState(){const a=this.X.state(),b=this.X.timestamp().Aa();return"stopped"==a?0>b?"pausedTransition":"pausedSlide":"suspended"==a?"suspended":"buffering"==a?"buffering":0>b?"playingTransition":"playingSlide"}wb(a){a=a.timestamp();const b=a.L(), +c=a.Aa();var d=a.ib();if(0>c){var e=d,f=0;if(this.tg&&"null"!=this.tg.Yu){var g=this.Ge.zO*this.tg.duration();isNaN(g)&&(g=0);f=Math.max(0,this.tg.duration()-g);e-=g}this.QO.Bg(0{et(a,b.pl())},1E3)}pl(){return 0this.U)throw Error("Current slide is undefined");return this.M.ja(this.U)}Ud(){if(!this.Od)throw Error("Current slide is undefined");return this.Od}kf(a,b=!0){if(!this.M.ja(a).mf())return null;const c=this.E8; +let d=c[a]||null;!d&&b&&(d=ft(this.D8,a),c[a]=d,d.stateChangedEvent().addHandler(this.C6,this),d instanceof pq?d.Zx().addHandler(e=>{this.U==e&&ps(this)}):d instanceof wq?d.Oa().quizPlayerEvent().addHandler(this.e6,this):d instanceof Bq&&d.ob().scenarioPlayerEvent().addHandler(this.m6,this));return d}e6(a){switch(a){case "gotoPreviousSlide":this.ni();break;case "skipQuizSlide":this.lf();break;case "quizFinished":a=this.$();var b=this.Ud();b=Rg(b.Oa());a=Sg(b)?a.LF:a.hE;b=this.$();const c=this.Ud().Oa(), +d=Rg(c);"graded"==d.eG&&Tg(d)&&!Sg(d)&&b.ZQ()&&c.restartQuiz();(new Lg(this)).WP(a);break;case "lockPresentationViewMode":this.ZU.C();break;case "unlockPresentationViewMode":this.HZ.C()}}m6(a){switch(a){case "gotoPreviousSlide":this.ni();break;case "gotoNextSlide":this.lf();break;case "skipScenarioSlide":this.lf();break;case "scenarioRestarted":case "scenarioRestored":this.ET.C(a);break;case "scenarioFinished":a=this.$();var b=this.Ud();a=yq(b.ob()).scenarioPassed()?a.MF:a.iE;(new Wg(this)).WP(a)}}C6(a){Os(this, +a)}Wo(){return this.Qi}Bc(){return this.OY}tu(){return this.DZ}NR(){return this.CZ}ZP(){return this.ET}Ux(){return this.vB}zR(){return this.KY}Vo(){return this.$l}pW(a){const b=this.Hp,c=this.jz;c&&b&&b.L==a.index()&&(this.jz=this.Hp=null,Ss(this.Ca,!1,this.Ye),c.apply(this,b))}Oa(){return 0>this.U||!(this.$()instanceof br)?null:this.Ud().Oa()}fb(){return 0>this.U||!(this.$()instanceof sq)?null:this.Ud().fb()}ob(){return 0>this.U||!(this.$()instanceof Aq)?null:this.Ud().ob()}$C(){return this.Ge}Qt(){return this.Va.Qt()}D5(a){var b= +this.kf(this.U);b&&(b=b.view(),b instanceof Rn&&b.vt.C(a,new Mn,!0))}Z6(){Gg(this.cN)?(this.W2=this.X.Ag(),this.pause()):this.W2&&Gi(()=>{this.play()},this,100)}V5(){this.Rk.C()}}Rs.prototype.slideTransitionController=Rs.prototype.$C;Rs.prototype.scenarioPlayer=Rs.prototype.ob;Rs.prototype.interactionPlayer=Rs.prototype.fb;Rs.prototype.quizPlayer=Rs.prototype.Oa;Rs.prototype.playbackCompleteEvent=Rs.prototype.Vo;Rs.prototype.stepChangeEvent=Rs.prototype.Ux;Rs.prototype.slideChangeEvent=Rs.prototype.Bc; +Rs.prototype.currentSlide=Rs.prototype.$;Rs.prototype.currentSlideIndex=Rs.prototype.ma;Rs.prototype.clock=Rs.prototype.Z;Rs.prototype.playbackState=Rs.prototype.playbackState;Rs.prototype.nextSlideIndex=Rs.prototype.Ug;Rs.prototype.gotoPreviousStep=Rs.prototype.Ot;Rs.prototype.previousSlideIndex=Rs.prototype.Vg;Rs.prototype.gotoTimestamp=Rs.prototype.Vj;Rs.prototype.gotoNextStep=Rs.prototype.Lo;Rs.prototype.gotoPreviousSlide=Rs.prototype.ni;Rs.prototype.gotoNextSlide=Rs.prototype.lf; +Rs.prototype.gotoLastSlide=Rs.prototype.Zq;Rs.prototype.gotoFirstSlide=Rs.prototype.Yq;Rs.prototype.lastSlideIndex=Rs.prototype.Em;Rs.prototype.firstSlideIndex=Rs.prototype.Gf;Rs.prototype.gotoLastSlideViewed=Rs.prototype.qx;Rs.prototype.gotoSlide=Rs.prototype.pe;Rs.prototype.pause=Rs.prototype.pause;Rs.prototype.play=Rs.prototype.play;let gt;function ht(a,b){b?a.setAttribute("role",b):a.removeAttribute("role")}function it(a,b,c){Array.isArray(c)&&(c=c.join(" "));var d="aria-"+b;""===c||void 0==c?(gt||(gt={atomic:!1,autocomplete:"none",dropeffect:"none",haspopup:!1,live:"off",multiline:!1,multiselectable:!1,orientation:"vertical",readonly:!1,relevant:"additions text",required:!1,sort:"none",busy:!1,disabled:!1,hidden:!1,invalid:"false"}),c=gt,b in c?a.setAttribute(d,c[b]):a.removeAttribute(d)):a.setAttribute(d,c)} +function jt(a,b){a=a.getAttribute("aria-"+b);return null==a||void 0==a?"":String(a)};class kt{constructor(a){this.fg=a}ha(a,b,c){c=this.fg.hasOwnProperty(a)?this.fg[a]:c;if(void 0!==c){if(void 0!==b){a=this.ST;for(let d in b)if(b.hasOwnProperty(d)){const e=b[d];a&&(d=a(d));c=c.replace(new RegExp(d,"g"),e)}}return c}Ga("unknown message id: "+a);return a}messages(){return this.fg}ST(a){return"%"+a.toUpperCase()+"%"}}kt.prototype.getMessage=kt.prototype.ha;class lt{constructor(a){this.pa=a;this.BV=!1;this.Ab=zd("DIV");mn(this.Ab,"framesLayer");this.ph=new C;a.Le().addHandler(this.nA,this)}nA(a,b,c,d){this.pa.UH()?Gh(this.Ab,0,0):Gh(this.Ab,c,d);F(this.Ab,"pointer-events","none");c="";this.BV||(c="rect(0px,"+a+"px,"+b+"px,0px)");F(this.Ab,"clip",c);this.ph.C()}Le(){return this.ph}position(a,b){const c=this.pa.wi();return this.gq(c.querySelector("#"+a),c,b||this.scale())}scale(){return this.pa.scale()}gq(a,b,c){let d=new Xc(0,0);if(!a)return d;a=Kh(a); +b=Kh(b);d=ad(a,b);return d=new Xc(d.x/c,d.y/c)}displayObject(){return this.Ab}};function mt(a,b){return`${a.className()}_${b}`}function nt(a,b,c){return`${mt(a,b)}_${c}`}function ot(a,b,c){b=jn(b);const d=nt(a,c,"");return Oa(b,e=>0==e.indexOf(d))}class pt{constructor(a,b){this.yJ=a;this.Ad=b}className(){return this.Ad?`${this.yJ}__${this.Ad}`:this.yJ}};var qt=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||setTimeout;function rt(a){return"string"!==typeof a.className}function st(a,b){a.className.baseVal=b}function tt(a){return rt(a)?(a=a.className.baseVal,"string"===typeof a&&a.match(/\S+/g)||[]):jn(a)}function ut(a,b){return rt(a)?Pa(tt(a),b):ln(a,b)}function vt(a,b){if(rt(a)){if(!ut(a,b)){let c=a.className.baseVal;c+=0c!=b).join(" ")):nn(a,b)};class xt extends C{constructor(a){super(a);this.mz=B(this,new C);this.cL=B(this,new C)}addHandler(a,b,c){super.addHandler(a,b,c);this.mz.C()}removeHandler(a,b,c){super.removeHandler(a,b,c);this.cL.C()}};let yt;const zt=[];if(window.MutationObserver){yt=new MutationObserver(b=>{b&&b.forEach(c=>{for(const d of c.removedNodes)for(const e of zt)"function"===typeof d.contains&&d.contains(e.displayObject())&&e.Si(!1)})});const a={subtree:!0,childList:!0};qt(()=>{yt.observe(document.body,a)})}function At(a,b){a.sy.push(b);vt(a.P,b.className())} +function Bt(a){const b=new ResizeObserver(c=>{for(const d of c)void 0!==d.target&&0{1==cf(b)&&Rm(c);x(a,a.P,"mouseover",()=>{a.enabled()&&0{a.Si(!1)})});z(a,b.cL,()=>{0==cf(b)&&Sm(c)});const d=new Ym;z(a,d.zB,(e,f,g)=>{a.Si(!1);a.enabled()&&a.Bp(g);a.iq&&g.target==a.P&&g.preventDefault()});z(a,d.BO,()=>{a.Si(!0)});z(a,d.CO,()=>{a.enabled()&&a.my()});Qm(c,d)} +function Dt(a){yt?zt.push(a):Ib?x(a,window,"DOMNodeRemoved",b=>{Md(b.target,a.P)&&a.Si(!1)}):x(a,a.P,"DOMNodeRemovedFromDocument",()=>{a.Si(!1)})}function L(a,b,c){F(a.P,b,c)}function N(a,b,c){B(a,b);null!=c?a.Ff(b,c):a.V(b)}function Et(a,b){for(const c of Object.keys(b))F(a.P,c,b[c])}function Ft(a,b){b instanceof pt||(b=new pt(b));At(a,b)}function O(a,b){return new pt(a.sy[0].yJ,b)} +function Gt(a,b,c=b){const d=a.P.scrollTop;b=Math.min(0,b-d-a.a_);c=Math.max(0,c-(d+a.P.clientHeight)+a.a_);0!=b?a.P.scrollTop+=b:0!=c&&(a.P.scrollTop+=c)}function Ht(a,b,c,d){const e=a.la.bind(a),f=()=>{var g="string"===typeof c?c:c();g=b.ha(g,d&&d());e(g)};z(a,b.jh,g=>{const h="string"===typeof c?c:c();g==h&&f()});f();a.wL=f} +class P extends wg{constructor(a){let {ga:b,G:c,U_:d,za:e,Yb:f,nI:g,v_:h,HH:l,rf:n,Wha:m=0,xI:p,tabIndex:r,V9:v}=a||{};super();e||(e=wd(f||"DIV"));this.P=e;this.sy=[];if(b||c)b=b||new pt(c,d),At(this,b);this.iq=void 0!==g?g:!0;this.nh=this.Na=this.Ua=this.Rb=this.Qb=this.Xr=void 0;this.a_=m;this.Os=1;this.wL=null;this.hZ={};this.Qa=null;n&&(this.Ws=Bt(this));(this.i8=p)&&this.yh(!1);void 0!==r&&this.Ox(r);this.ka=B(this,new xt(this));Ct(this,this.ka);l&&z(this,this.ka,()=>{});v&&Dt(this);this.ph= +E(this);if(!1===h){let y=!1;x(this,this.displayObject(),"mousedown",()=>{y=!0});x(this,this.displayObject(),"focusout",D=>{D.target==D.currentTarget&&(y=!1)});x(this,this.displayObject(),"focusin",D=>{y&&D.target==D.currentTarget&&qt(()=>{this.displayObject().blur()})})}}Le(){return this.ph}focus(){(()=>{this.P.focus()})()}getAttribute(a){return this.P.getAttribute(a)}setAttribute(a,b){(()=>{this.P.setAttribute(a,b)})()}removeAttribute(a){(()=>{this.P.removeAttribute(a)})()}Ox(a){this.Xr=a;this.$A(a)}oj(a){this.Qb= +a;(()=>{this.P.style.left=a+"px"})()}Cg(a){this.Rb=a;(()=>{this.P.style.top=a+"px"})()}move(a,b){this.oj(a);this.Cg(b)}Zb(a){this.resize(a)}Kd(a){this.resize(void 0,a)}resize(a,b){this.jw(a,b);void 0!==a&&(this.Ua=a);void 0!==b&&(this.Na=b);this.$a(this.width(),this.height());this.ph.C(this)}ra(a){void 0!==this.Xr&&this.$A(a?this.Xr:-1);(()=>{a?this.P.removeAttribute("disabled"):this.P.setAttribute("disabled","")})()}J(a){this.Qa=a;(()=>{this.Qa=null;Th(this.P,a)})()}Hf(a){(()=>{L(this,"opacity", +a)})();this.nh=a}V(a){const b=this.Ck(a);(()=>{this.P.appendChild(b)})()}Ff(a,b){const c=this.Ck(a);this.P==c.parentNode&&this.P.childNodes[b]==c||(()=>{Ed(this.P,c,b)})()}removeChild(a){const b=this.Ck(a);this.oi(b)&&(()=>{this.P.removeChild(b)})()}Zo(){(()=>{Cd(this.P)})()}la(a){(()=>{Nd(this.P,a)})()}gp(a){(()=>{this.P.innerHTML=a})()}gR(a){(()=>{this.P.id=a})()}fp(a){this.pf("label",a)}nf(a){Array.isArray(a)&&(a=a.join(" "));(()=>{ht(this.P,a)})()}ik(a){this.pf("hidden",a)}pf(a,b){(()=>{it(this.P, +a,b)})()}fa(a,b){if(this.sy.length)for(const c of this.sy)if("string"===typeof b){const d=ot(c,this.P,a);d&&(delete this.hZ[a],(()=>{wt(this.P,d)})());if(b){const e=nt(c,a,b);this.hZ[a]=e;(()=>{vt(this.P,e)})()}}else{const d=mt(c,a);(()=>{var e=this.P,f=d;b?mn(e,f):nn(e,f)})()}else(()=>{var c=this.P;b?mn(c,a):nn(c,a)})(),Ga("component has no bemInfo")}NH(a){const b=this.sy[0];a=b?mt(b,a):a;return ut(this.P,a)}yh(a){this.pf("selected",a)}selected(){return"true"==jt(this.P,"selected")}ub(){this.$a(this.width(), +this.height());this.ph.C()}oi(a){return this.Ck(a).parentNode==this.displayObject()}x(){return void 0!==this.Qb?this.Qb:Ih(this.displayObject()).x}y(){return void 0!==this.Rb?this.Rb:Ih(this.displayObject()).y}width(){return void 0!==this.Ua?this.Ua:this.XK()}height(){return void 0!==this.Na?this.Na:this.WK()}enabled(){return!this.P.hasAttribute("disabled")}visible(){return"boolean"===typeof this.Qa?this.Qa:"none"!=this.displayObject().style.display}opacity(){if(void 0!==this.nh)return this.nh;const a= +Sh(this.P);return"number"===typeof a?a:1}displayObject(){return this.P}setScale(a,b="0 0"){(()=>{wn(this.P,a,a);yi(this.P,b)})()}setParentScale(a){this.Os=a;this.jA()}contains(a){if(!a)return!1;a=this.Ck(a);return Md(this.P,a)}Mr(a){(a instanceof Node||"function"===typeof a.displayObject)&&this.removeChild(a);super.Mr(a)}Ck(a){return a instanceof Node?a:a.displayObject()}XK(){const a=this.P;return a.tagName.toUpperCase()=="SVG".toString()?a.width.baseVal.value:Vh(a).width}WK(){const a=this.P;return a.tagName.toUpperCase()== +"SVG".toString()?a.height.baseVal.value:Vh(a).height}jw(a,b){(()=>{void 0!==a&&Oh(this.P,a);void 0!==b&&Ph(this.P,b)})()}$a(){}jA(){}Bp(a){this.ka.C(this,a)}my(){this.fa("active",!0)}Si(){this.fa("active",!1)}ny(){x(this,this.P,"keydown",this.BM,this)}BM(a){document.activeElement!=this.displayObject()||a.defaultPrevented||13!=a.keyCode&&32!=a.keyCode||(a.preventDefault(),this.Bp())}$A(a){(()=>{this.setAttribute("tabindex",a+"")})()}rd(){this.Ws&&this.Ws.disconnect();const a=zt.indexOf(this);0<=a&& +zt.splice(a,1)}};function It(a){Kd(a)?this.Ir=this.P=a:(this.P=wd("DIV",Jt("component_container",a)),this.Ir=this.XS(Jt("component_base",a)),this.P.appendChild(this.Ir));this.Qd=[];this.iq=!1;if(jj){const b=new Pm(this.Vx());this.ka=new xt;this.ka.mz.addHandler(function(){1==cf(this.ka)&&Rm(b)},this);this.ka.cL.addHandler(function(){0==cf(this.ka)&&Sm(b)},this);a=new Ym;a.zB.addHandler(function(c,d,e){this.Si(!1);this.iq&&e.preventDefault();this.enabled()&&this.Bp(e)},this);a.BO.addHandler(function(){this.Si(!0)}, +this);a.CO.addHandler(function(){this.enabled()&&this.my()},this);Qm(b,a)}else this.iq=!0,this.ka=new xt,this.ka.mz.addHandler(function c(){this.ka.mz.removeHandler(c,this);var d=ve(this.Vx(),"mouseover",function(){this.enabled()&&0{for(const b of a)void 0!==b.target&&(a=b.contentRect,this.Ua=a.width,this.Na=a.height,this.$a(a.width,a.height),this.ph.C(this))});this.Ws.observe(this.P);this.$a(parseInt(this.P.style.width,10),parseInt(this.P.style.height,10));this.ph.C(this)};k.my=function(){this.fa("active",!0)};k.Si=function(){this.fa("active",!1)};k.za=function(){return this.Ir};It.prototype.baseElement=It.prototype.za;It.prototype.displayObject=function(){return this.P}; +It.prototype.displayObject=It.prototype.displayObject;k=It.prototype;k.width=function(){return void 0!==this.Ua?this.Ua:this.XK(this.za())};k.XK=function(a){return"SVG"==a.tagName.toUpperCase()?a.width.baseVal.value:Vh(a).width};k.Zb=function(a){this.resize(a)};k.height=function(){return void 0!==this.Na?this.Na:this.WK(this.za())};k.WK=function(a){return"SVG"==a.tagName.toUpperCase()?a.height.baseVal.value:Vh(a).height};k.Kd=function(a){this.resize(void 0,a)}; +k.resize=function(a,b){if(void 0!==this.Ws)throw Error("ResizeObserver is turned on");this.jw(a,b);void 0!==a&&(this.Ua=a);void 0!==b&&(this.Na=b);this.ph.C(this)};k.jw=function(a,b){void 0!==a&&(Oh(this.displayObject(),a),Oh(this.za(),a));void 0!==b&&(Ph(this.displayObject(),b),Ph(this.za(),b));void 0!==a&&void 0!==b&&this.$a(a,b)};k.$a=function(){};k.x=function(){return void 0!==this.Qb?this.Qb:Ih(this.displayObject()).x};k.oj=function(a){this.Qb=a;this.displayObject().style.left=a+"px"}; +k.y=function(){return void 0!==this.Rb?this.Rb:Ih(this.displayObject()).y};k.Cg=function(a){this.Rb=a;this.displayObject().style.top=a+"px"};k.move=function(a,b){this.oj(a);this.Cg(b)};k.enabled=function(){return!this.za().hasAttribute("disabled")};k.ra=function(a){void 0!==this.Xr&&this.$A(a?this.Xr:-1);a?this.za().removeAttribute("disabled"):this.za().setAttribute("disabled","")};k.visible=function(){return"none"!=this.displayObject().style.display};k.J=function(a){Th(this.displayObject(),a)}; +k.opacity=function(){return this.nh};k.Hf=function(a){Kt(this,"opacity",a);this.nh=a};k.V=function(a){a=this.Ck(a);this.displayObject().appendChild(a)};k.Ff=function(a,b){a=this.Ck(a);Ed(this.displayObject(),a,b)};k.removeChild=function(a){a=this.Ck(a);this.oi(a)&&this.displayObject().removeChild(a)};k.Zo=function(){const a=this.displayObject();for(;a.firstChild;)a.removeChild(a.firstChild)};k.oi=function(a){return(a instanceof It?a.displayObject():a).parentNode==this.displayObject()}; +k.la=function(a){Nd(this.za(),a)};k.gp=function(a){this.za().innerHTML=a};function Kt(a,b,c){F(a.displayObject(),b,c)}k.fp=function(a){this.pf("label",a)};k.nf=function(a){Array.isArray(a)&&(a=a.join(" "));ht(this.YG?this.Ir:this.P,a)};k.ik=function(a){this.pf("hidden",a)};k.pf=function(a,b){it(this.YG?this.Ir:this.P,a,b)};k.XS=function(a){return wd("DIV",a)};function Jt(a,b){return void 0===b?a:b instanceof Array?(b=Ua(b),b.push(a),b):[a,b]} +k.fa=function(a,b){a=this.uJ?mt(this.uJ,a):a;var c=this.P;b?mn(c,a):nn(c,a);this.P!=this.Ir&&(c=this.Ir,b?mn(c,a):nn(c,a))};k.NH=function(a){a=this.uJ?mt(this.uJ,a):a;return ln(this.P,a)};function Lt(a){a=a.displayObject();mn(a,"animation")}k.ny=function(){ve(this.displayObject(),"keydown",this.BM,!1,this)};k.BM=function(a){document.activeElement!=this.displayObject()||a.defaultPrevented||13!=a.keyCode&&32!=a.keyCode||(a.preventDefault(),this.Bp(null))}; +k.$A=function(a){this.setAttribute("tabindex",a+"")};k.Xc=function(){for(let a=0;a{d.stopPropagation();c= +this.HD.url();Ri(c)},this);F(this.displayObject(),"z-index","1000")}Xa(){return this.Kr}displayObject(){return this.Gi.displayObject()}};function Rt(){this.bE=new C;this.J2=new C;this.qT=new C;this.oT=new C}k=Rt.prototype;k.Vu=!1;k.Uu=!1;k.FG=null;k.DA=null;k.mx=function(){return"drag"};k.LH=function(a,b){if(1==b.touches().length){if("touchStart"==a)return this.Vu&&(this.Uu=this.Vu=!1),this.Uu=!1,1;if("touchMove"==a&&this.Uu)return 1}this.Vu&&(this.Uu=this.Vu=!1,this.oT.C(this.DA.x,this.DA.y));return 0}; +k.tH=function(a){a=new Xc(a.touches()[0].clientX(),a.touches()[0].clientY());this.Uu?(a=ad(a,this.FG),Yc(a,this.DA)||(this.Vu||(this.Vu=!0,this.qT.C(this.FG.x,this.FG.y)),this.DA=a,this.bE.C(a.x,a.y))):(this.Uu=!0,this.FG=a,this.DA=new Xc,this.J2.C())};k.Pq=function(){};function St(){this.V7=new C;this.ow=new C;this.gY=new C;this.bE=new C;this.Lz=null;this.RN=!1}k=St.prototype;k.Mz=-1;k.BE=0;k.mx=function(){return"scale"};k.LH=function(a,b){a=2==b.touches().length;const c=!a&&0c.x&&0>d.x||0c.y&&0>d.y||0=Math.abs(a.y-b.y)};Vt.prototype.WZ=function(a,b){const c=b.x-a.x;return 40=Math.abs(a.y-b.y)};function Wt(){this.UA=new C}t(Wt,Ut);Wt.prototype.mx=function(){return"scrollRight"};Wt.prototype.YZ=function(a,b){return a.x>=b.x};Wt.prototype.XZ=function(a,b){return a.x-b.x>=Math.abs(a.y-b.y)}; +Wt.prototype.WZ=function(a,b){const c=a.x-b.x;return 40=Math.abs(a.y-b.y)};function Xt(){He.call(this);this.Rc=Yt;this.endTime=this.startTime=null}t(Xt,He);var Yt=0;Xt.prototype.Ro=function(){this.wh("begin")};Xt.prototype.yl=function(){this.wh("end")};Xt.prototype.wh=function(a){this.dispatchEvent(a)};function Zt(a,b,c){Yd.call(this);this.uQ=a;this.wx=b||0;this.sx=c;this.m$=ta(this.M$,this)}t(Zt,Yd);k=Zt.prototype;k.uC=0;k.hf=function(){Zt.Mb.hf.call(this);this.stop();delete this.uQ;delete this.sx};k.start=function(a){this.stop();this.uC=kh(this.m$,void 0!==a?a:this.wx)};k.stop=function(){this.isActive()&&ia.clearTimeout(this.uC);this.uC=0};k.isActive=function(){return 0!=this.uC};k.M$=function(){this.uC=0;this.uQ&&this.uQ.call(this.sx)};var pc={},$t=null;function au(a){a=ma(a);delete pc[a];oc()&&$t&&$t.stop()}function bu(){$t||($t=new Zt(function(){cu()},20));var a=$t;a.isActive()||a.start()}function cu(){var a=wa();fc(pc,function(b){du(b,a)});oc()||bu()};function eu(a,b,c,d){Xt.call(this);if(!Array.isArray(a)||!Array.isArray(b))throw Error("Start and end parameters must be arrays");if(a.length!=b.length)throw Error("Start and end points must be the same length");this.bD=a;this.R$=b;this.duration=c;this.p_=d;this.coords=[];this.iD=!1;this.progress=0}t(eu,Xt);k=eu.prototype; +k.play=function(a){if(a||this.Rc==Yt)this.progress=0,this.coords=this.bD;else if(1==this.Rc)return!1;au(this);this.startTime=a=wa();-1==this.Rc&&(this.startTime-=this.duration*this.progress);this.endTime=this.startTime+this.duration;this.progress||this.Ro();this.wh("play");-1==this.Rc&&this.wh("resume");this.Rc=1;var b=ma(this);b in pc||(pc[b]=this);bu();du(this,a);return!0};k.stop=function(a){au(this);this.Rc=Yt;a&&(this.progress=1);fu(this,this.progress);this.wh("stop");this.yl()}; +k.pause=function(){1==this.Rc&&(au(this),this.Rc=-1,this.wh("pause"))};k.Bg=function(a){this.progress=a;1==this.Rc&&(this.startTime=wa()-this.duration*this.progress,this.endTime=this.startTime+this.duration)};k.hf=function(){this.Rc==Yt||this.stop(!1);this.K0();eu.Mb.hf.call(this)};k.destroy=function(){this.Xc()}; +function du(a,b){bthis.HG&&(ku(this),this.HG=this.Np);lu(this,Vc(this.HG*a,1,4))};k.W6=function(){this.HG=-1};k.U6=function(a,b){1b.$d().Sc())}function tu(a,b,c){return pu(a.Aw[b]||[],a.Aw[c]||[])}class su{constructor(a,b){this.Aw=[];for(let e=0;e{var c=a.Ue.yr();c.Be()&&c.aE(c.y8)&&c.F.settings().navigation().Gm().enabled()&&c.B.$().SB()&&wu(c)});z(a,Xm(b,"scrollRight").UA,()=>{var c=a.Ue.yr();c.Be()&&c.aE(c.z8)&&c.F.settings().navigation().Gm().enabled()&&c.B.$().SB()&&c.tc.ni()});Rm(b);if(Hj){const c=new Ym;z(a,c.zB,a.p5,a);z(a,c.nT,a.o5,a);Qm(b,c)}return b} +function xu(a){var b=Hd(a.Qe.displayObject());if(b.length)for(const c of b)ln(c,"framesLayerContent")&&(b=c,b.setAttribute("data-width",a.Ua),b.setAttribute("data-height",a.Na))}function yu(a){var b=a.B;-1!=b.ma()&&(b=b.Ud().view(),b instanceof zq&&b.ob().setParentScale(a.qa),uj||(b instanceof vq?b.Oa().resize(a.Ua,a.Na):b instanceof rq&&b.fb().resize(a.Ua,a.Na)))}function zu(a,b,c){for(let d=0;d{null!=e.id&&0{let m=16*Math.random()|0;return("x"==n?m:m&3|8).toString(16)}));let f;if(lc(a.lL,e.id)){var g=w(a.lL,e.id);f=g.transform.clone();var h=g.origin.clone();var l=g.width;g=g.height}else f=sn(e),null===f&&(f=new gm),h=tn(e),null===h&&(h=new Xc), +yi(e,h.x+"px "+h.y+"px"),l=parseFloat(e.getAttribute("width")),g=parseFloat(e.getAttribute("height")),qc(a.lL,e.id,{transform:f.clone(),origin:h.clone(),width:l,height:g});g*=a.qa;Oh(e,l*a.qa);Ph(e,g);l=1/a.qa;g=1/a.qa;h=ad(new Xc,h);h=new gm(l,0,0,g,h.x-l*h.x,h.y-g*h.y);on(e,hm(f,h))},a)}}function Gu(a){a.Mh&&(Fd(a.Mh),a.Mh=null)} +class Hu extends wg{constructor({Ba:a,uba:b,YH:c,MI:d,wi:e,Vq:f,va:g,II:h,W:l,Eca:n}){super();this.F=a;this.Ue=b;this.Fa=c;this.hl=d;this.Fe=e;this.Qe=f;this.Rf=g;this.mt=h;uu(this);this.Ua=a.slideWidth();this.Na=a.slideHeight();this.qa=1;this.Bk=vu(this);const {width:m,height:p}=this.hi();b=new iu(this.Fa,this.Bk,m,p);ju(b,!1);z(this,b.ow,this.W7,this);this.lP=b;this.nG=E(this);this.Ec=null;this.OE=!1;this.B=l;this.Ge=n;this.lL={};this.Nk=!1;this.Mh=null;a=a.slides();this.Bw=qu(a)}width(){return this.Ua}height(){return this.Na}scale(){return this.qa}resize(a, +b){this.Ua=a;this.Na=b;Nh(this.Fa,a,b);var c=this.lP;c.sc=nu(c,bd(c.sc,new Xc((a-c.gH)/2,(b-c.fH)/2)));c.gH=a;c.fH=b;c.oS=Math.min(a/c.pg,b/c.og,c.N4);lu(c,c.Np);xu(this);yu(this)}J0(a){var b=this.B,c=this.Ec?this.Ec.index():-1;const d=b.ma();this.Ec=0<=d?b.$():null;b=this.Ec instanceof br;const e=this.Ec instanceof sq,f=this.Ec instanceof Aq;this.OE=(this.Qe.BV=b)||e||f;this.hl.style.opacity=this.OE?"0":"";this.yt();a&&F(a.displayObject(),"display",f?"none":"");a=tu(this.Bw,c,d);c=tu(this.Bw,d,c); +zu(this,a,!1);zu(this,c,!0);this.Nk&&(Bu(this,a),Cu(this,c));xu(this);Du(this)}t_(a){lu(this.lP,1);Eu(this);yu(this);Fu(this);var b=this.B;-1!=b.ma()&&void 0!==a&&(b=(b=b.Ud())&&b.view(),b instanceof vq?b.Oa().setBannerView(a.displayObject()):b instanceof rq?b.fb().setBannerView(a.displayObject()):b instanceof zq&&b.ob().setBannerView(a.displayObject()))}setOverlayDisplayed(a){if(this.Nk!=a){this.Nk=a;if(this.Ec){var b=this.Ec.index();b=this.Bw.Aw[b]||[];a?Cu(this,b):Bu(this,b);(b=this.B.Oa())&&b.setOverlayDisplayed(a)}Du(this)}}PH(a){this.Fe.style.display= +"";this.hl.style.display="";Iu(a);Eu(this)}UH(){return this.OE}oU(){const a=this.Fa;a.setAttribute("role","main");a.setAttribute("aria-live","polite");a.style.overflow="hidden";Nh(a,this.hi().width,this.hi().height);ah&&(a.style["-webkit-text-size-adjust"]="none")}rU(){const a=this.hl;Ld(a)||Ed(this.Fa,this.hl,0);a.style.display="none";const {width:b,height:c}=this.hi();Nh(a,b-2,c-2);Gh(a,1,1)}sU(){const a=this.Fe;a.removeAttribute("class");a.style.overflow="hidden";a.style.position="absolute";Nh(a, +this.hi().width,this.hi().height);yi(a,"0 0")}mU(){const a=this.Qe.displayObject();F(a,"z-index","2");Ld(a)||this.Fa.appendChild(a)}nU(){Ld(this.Rf)||this.Fe.appendChild(this.Rf)}pU(){nn(this.mt,"slide-displays-parent")}o5(a,b,c){a=c.target;a instanceof HTMLVideoElement&&a.controls?c.stopPropagation():Md(this.Fe,a)&&(c.preventDefault(),c=this.Ue.yr(),c.aE(c.x8))}p5(a,b,c){Si(c.target)||(a=c.target,a instanceof HTMLVideoElement&&a.controls?c.stopPropagation():Md(this.Fe,a)&&(c.preventDefault(),qq(this.Ue.yr(), +this,c)))}W7(a,b,c){b=Math.round(b);c=Math.round(c);var d=this.F.slideWidth(),e=this.F.slideHeight();d*=a;e*=a;const f=this.qa!=a;f&&(this.qa=a,wn(this.Fe,a),Ju(this.Ue.ie,this.qa),yu(this),Fu(this),Nh(this.hl,d-2,e-2));Gh(this.Fe,b,c);Gh(this.hl,b+1,c+1);this.nG.C(d,e,b,c);f&&Ii&&yn(this.Fa)}hi(){return new cd(this.F.slideWidth(),this.F.slideHeight())}yt(){Gu(this);0<=this.B.ma()&&(this.ZO()||this.WO()||this.$O())}ZO(){if(this.B.$()instanceof br){const a=this.B.Oa();a.setOverlayDisplayed(this.Nk); +uj||(this.Mh=a.skin().displayObject(),this.Fa.appendChild(this.Mh));return!0}return!1}WO(){if(this.B.$()instanceof sq){const a=this.B.fb();a.setOverlayDisplayed(this.Nk);uj||(this.Mh=a.displayObject(),this.Fa.appendChild(this.Mh));return!0}return!1}$O(){this.B.$()instanceof Aq&&this.B.ob().setOverlayDisplayed(this.Nk)}rd(){super.rd();Sm(this.Bk);Gu(this)}};class Ku extends wg{constructor({Ba:a,W:b,YH:c,MI:d,wi:e,Vq:f,va:g,II:h}){super();this.F=a;this.B=b;this.Fa=c;this.hl=d;this.Fe=e;this.Qe=f;this.Rf=g;this.mt=h;this.nG=E(this);this.Mh=null;uu(this);z(this,this.B.ZP(),this.yt,this)}width(){return 0}height(){return 0}scale(){return 1}resize(){}J0(a){a&&F(a.displayObject(),"display","");this.yt();this.nG.C()}t_(){}setOverlayDisplayed(){}PH(){Th(this.Fe,!0)}UH(){return!1}oU(){this.Fa.removeAttribute("role");this.Fa.removeAttribute("aria-live");this.Fa.removeAttribute("style")}rU(){Fd(this.hl)}sU(){this.Fe.removeAttribute("style"); +mn(this.Fe,"slides-container")}mU(){Fd(this.Qe.displayObject())}nU(){Fd(this.Rf)}pU(){mn(this.mt,"slide-displays-parent")}yt(){Gu(this);0<=this.B.ma()&&(this.ZO()||this.WO()||this.$O())}ZO(){return this.B.$()instanceof br?(this.Mh=this.B.Oa().skin().displayObject(),this.Fa.appendChild(this.Mh),!0):!1}WO(){return this.B.$()instanceof sq?(this.Mh=this.B.fb().displayObject(),this.Fa.appendChild(this.Mh),!0):!1}$O(){this.B.$()instanceof Aq&&(this.Mh=this.B.ob().displayObject(),this.Fa.appendChild(this.Mh))}rd(){super.rd(); +Gu(this)}};class Lu{constructor(a){this.rk=a}create(a){switch(a){case "normal":return new Hu(this.rk);case "accessible":return new Ku({Ba:this.rk.Ba,W:this.rk.W,YH:this.rk.YH,MI:this.rk.MI,wi:this.rk.wi,Vq:this.rk.Vq,va:this.rk.va,II:this.rk.II});default:throw Error("unknown presentation view mode");}}};var Mu={Rga:"switchToNextSlide",Tga:"switchToPreviousSlide",gda:"arbitrarySlideSwitching",yga:"slideShowControl",Sga:"switchToNextStep",Uga:"switchToPreviousStep",qfa:"playPauseControl",zfa:"presentationSeeking",xga:"slideSeeking",Lfa:"quizSwitchToNextSlide",Mfa:"quizSwitchToNextSlideWithoutBranching",Jfa:"quizArbitrarySlideSwitching",hga:"scenarioSwitchToNextSlide",iga:"scenarioSwitchToNextSlideWithoutBranching",fga:"ScenarioArbitrarySlideSwitching"}; +q("ispring.presenter.player.restriction.NavigationActionType",Mu);function Nu(){return"switchToNextSlide switchToPreviousSlide arbitrarySlideSwitching slideShowControl switchToNextStep switchToPreviousStep playPauseControl presentationSeeking slideSeeking".split(" ")}Mu.all=Nu;q("SWITCH_TO_NEXT_SLIDE","switchToNextSlide",Mu);q("SWITCH_TO_PREVIOUS_SLIDE","switchToPreviousSlide",Mu);q("ARBITRARY_SLIDE_SWITCHING","arbitrarySlideSwitching",Mu);q("SLIDE_SHOW_CONTROL","slideShowControl",Mu); +q("SWITCH_TO_NEXT_STEP","switchToNextStep",Mu);q("SWITCH_TO_PREVIOUS_STEP","switchToPreviousStep",Mu);q("PLAY_PAUSE_CONTROL","playPauseControl",Mu);q("PRESENTATION_SEEKING","presentationSeeking",Mu);q("SLIDE_SEEKING","slideSeeking",Mu);class Ou{constructor(a,b){this.Ga=a;this.I7=b}type(){return this.Ga}Jd(){return this.I7}}Ou.prototype.relatedSlideIndex=Ou.prototype.Jd;Ou.prototype.type=Ou.prototype.type;class Pu{constructor(a,b,c,d,e,f){this.a5=a;this.O7=b;this.N7=c;this.Fd=null!=d?d:null;this.Pg=e||null;this.xw=f||null}AQ(){return this.a5}$o(){return this.O7}od(){return this.N7}Jd(){return this.Fd}Pba(){return this.Pg}Oba(){return this.xw}}Pu.prototype.relatedSlideShow=Pu.prototype.Oba;Pu.prototype.relatedTimestamp=Pu.prototype.Pba;Pu.prototype.relatedSlideIndex=Pu.prototype.Jd;Pu.prototype.restrictionReason=Pu.prototype.od;Pu.prototype.restrictionSource=Pu.prototype.$o; +Pu.prototype.navigationAction=Pu.prototype.AQ;var Qu={Pda:"currentSlideIsLocked",Qda:"currentSlideIsNotCompleted",Mda:"currentSlideIsFirstSlide",Oda:"currentSlideIsLastSlide",Nda:"currentSlideIsInteraction",jda:"backwardNavigationIsRestricted",rea:"forwardNavigationIsRestricted",Afa:"presentationSeekingDisabled",Kea:"interactionNotCompleted",tfa:"precedingQuizNotPassed",sfa:"precedingQuizNotCompleted",rfa:"precedingQuizFailed",vfa:"precedingScenarioNotCompleted",wfa:"precedingScenarioNotPassed",ufa:"precedingScenarioFailed"}; +q("ispring.presenter.player.restriction.NavigationRestrictionReasonType",Qu);q("CURRENT_SLIDE_IS_LOCKED","currentSlideIsLocked",Qu);q("CURRENT_SLIDE_IS_NOT_COMPLETED","currentSlideIsNotCompleted",Qu);q("CURRENT_SLIDE_IS_LAST_SLIDE","currentSlideIsLastSlide",Qu);q("CURRENT_SLIDE_IS_FIRST_SLIDE","currentSlideIsFirstSlide",Qu);q("BACKWARD_NAVIGATION_IS_RESTRICTED","backwardNavigationIsRestricted",Qu);q("FORWARD_NAVIGATION_IS_RESTRICTED","forwardNavigationIsRestricted",Qu); +q("PRESENTATION_SEEKING_DISABLED","presentationSeekingDisabled",Qu);q("PRECEDING_QUIZ_NOT_PASSED","precedingQuizNotPassed",Qu);q("PRECEDING_QUIZ_NOT_COMPLETED","precedingQuizNotCompleted",Qu);q("PRECEDING_QUIZ_FAILED","precedingQuizFailed",Qu);q("PRECEDING_SCENARIO_NOT_COMPLETED","precedingScenarioNotCompleted",Qu);q("PRECEDING_SCENARIO_FAILED","precedingScenarioFailed",Qu);q("PRECEDING_SCENARIO_NOT_PASSED","precedingScenarioNotPassed",Qu);var Ru={yfa:"presentationNavigationType",wga:"slideNavigationSettings",Kfa:"quizNavigationSettings",gga:"scenarioNavigationSettings",xfa:"presentationFlow"};q("ispring.presenter.player.restriction.NavigationRestrictionSource",Ru);q("PRESENTATION_NAVIGATION_TYPE","presentationNavigationType",Ru);q("SLIDE_NAVIGATION_SETTINGS","slideNavigationSettings",Ru);q("PRESENTATION_FLOW","presentationFlow",Ru);function Q(a,b){this.B=a;this.F=b;this.wV=new C}Q.prototype.kf=function(a){return this.B.kf(a)}; +Q.prototype.gf=function(a,b,c,d){const e={};var f;a:{if(Su(this,a)){if((f=-1==this.B.Ug())&&!(f=this.$().fj().Oo())&&(f=!this.F.settings().Pc().Fm())){var g=this.B,h=g.X.timestamp();f=h.Aa();h=h.ib();g=g.Od.nb();f=f==g.count()-1?g.pc(f):null;f=null!==f&&h>=f.duration()}if(f){f=new Ou("currentSlideIsLastSlide");break a}}else if(Tu(this,a)&&-1==this.B.Vg()&&(f=this.B.Z().timestamp(),0==f.Aa()&&0==f.ib()||this.$().fj().Gx())){f=new Ou("currentSlideIsFirstSlide");break a}f=null}e.presentationFlow=f;"quizSwitchToNextSlide"!= +a&&"quizSwitchToNextSlideWithoutBranching"!=a&&"scenarioSwitchToNextSlide"!=a&&"scenarioSwitchToNextSlideWithoutBranching"!=a&&(e.presentationNavigationType=Uu(this,a,b));f="quizSwitchToNextSlideWithoutBranching"==a||"scenarioSwitchToNextSlideWithoutBranching"==a?vs(this.B):this.B.Ug();e.quizNavigationSettings=Vu(this,a,b,f);e.scenarioNavigationSettings=Wu(this,a,b,f);f="playPauseControl"!=a||Su(this,a)?(f=0<=this.B.ma()?this.B.$():null)?f.St().B0(a)?null:new Ou("currentSlideIsLocked"):null:null; +e.slideNavigationSettings=f;h=f=null;for(const l in e)e.hasOwnProperty(l)&&(g=e[l])&&(f=l,h=g);return null!==f?new Pu(a,f,h,b,c,d):null};Q.prototype.checkNavigationRestriction=Q.prototype.gf; +function Uu(a,b,c){const d=a.B,e=a.F.settings().navigation().navigationType(),f=0<=d.ma()?d.$():null;if(!f)return null;{const l=a.B;var g=0<=l.ma()?l.$():null;if(g){var h=a.F.slides();switch(b){case "arbitrarySlideSwitching":g=h.ja(c);break;case "switchToNextSlide":case "switchToNextStep":case "playPauseControl":Su(a,b)&&(c=l.Ug(),0<=c?g=h.ja(c):(c=!!a.$().fj().Oo(),a.F.settings().Pc().Fm()&&!c&&(g=h.ja(a.Gf()))));break;case "switchToPreviousSlide":case "switchToPreviousStep":Tu(a,b)&&(a=l.Vg(),0<= +a&&(g=h.ja(a)));break;case "presentationSeeking":g=null}h=g}else h=null}if(h==f)return null;if(!h)return"presentationSeeking"==b&&"free"!=e?new Ou("presentationSeekingDisabled"):null;switch(e){case "restricted":if(h.gy())break;if(h.index()!=d.Ug()&&h.index()!=d.Vg())return new Ou("forwardNavigationIsRestricted");if("slide"==f.type()&&!f.completed())return new Ou("currentSlideIsNotCompleted");break;case "sequential":if(h.index()!=d.Ug()&&(0!=h.index()||"switchToNextSlide"!=b))return h.gy()?new Ou("backwardNavigationIsRestricted"): +new Ou("forwardNavigationIsRestricted");if("slide"==f.type()&&!f.completed())return new Ou("currentSlideIsNotCompleted")}return null} +function Vu(a,b,c,d){Su(a,b)?c=d:Tu(a,b)&&(c=a.Vg());if(void 0===c)return null;d=a.B.Ud().view();if((d instanceof vq||d instanceof rq)&&!d.Sx()&&c!=a.B.ma())return new Ou("interactionNotCompleted");if(!(0=a.ib()}return!1}function Zu(a,b,c,d){return(b=a.gf(b,c,d,null))?(a.wV.C(b),!1):!0}Q.prototype.play=function(){Zu(this,"playPauseControl",this.B.ma(),null)&&this.B.play()};Q.prototype.play=Q.prototype.play;Q.prototype.pause=function(){Zu(this,"playPauseControl",this.B.ma(),null)&&this.B.pause()};Q.prototype.pause=Q.prototype.pause; +Q.prototype.pe=function(a,b){Zu(this,"arbitrarySlideSwitching",a,null)&&this.B.pe(a,b)};Q.prototype.gotoSlide=Q.prototype.pe;Q.prototype.qx=function(a){const b=this.B.WH();-1!=b&&Zu(this,"arbitrarySlideSwitching",b,null)&&this.B.qx(a)};Q.prototype.gotoLastSlideViewed=Q.prototype.qx;Q.prototype.Yq=function(a){Zu(this,"arbitrarySlideSwitching",this.B.Gf(),null)&&this.B.Yq(a)};Q.prototype.gotoFirstSlide=Q.prototype.Yq;Q.prototype.Zq=function(a){Zu(this,"arbitrarySlideSwitching",this.B.Em(),null)&&this.B.Zq(a)}; +Q.prototype.gotoLastSlide=Q.prototype.Zq;Q.prototype.lf=function(a){Zu(this,"switchToNextSlide",this.B.Ug(),null)&&this.B.lf(a)};Q.prototype.gotoNextSlide=Q.prototype.lf;Q.prototype.ni=function(a){Zu(this,"switchToPreviousSlide",this.B.Vg(),null)&&this.B.ni(a)};Q.prototype.gotoPreviousSlide=Q.prototype.ni;Q.prototype.Lo=function(){Zu(this,"switchToNextStep",this.B.ma(),null)&&this.B.Lo()};Q.prototype.gotoNextStep=Q.prototype.Lo; +Q.prototype.Ot=function(){Zu(this,"switchToPreviousStep",this.B.ma(),null)&&this.B.Ot()};Q.prototype.gotoPreviousStep=Q.prototype.Ot;Q.prototype.Vj=function(a,b,c,d){Zu(this,a==this.B.ma()?"slideSeeking":"presentationSeeking",a,new gf(a,b,c))&&this.B.Vj(a,b,c,d)};Q.prototype.gotoTimestamp=Q.prototype.Vj;Q.prototype.Gf=function(){return this.B.Gf()};Q.prototype.firstSlideIndex=Q.prototype.Gf;Q.prototype.Em=function(){return this.B.Em()};Q.prototype.lastSlideIndex=Q.prototype.Em;Q.prototype.Ug=function(){return this.B.Ug()}; +Q.prototype.nextSlideIndex=Q.prototype.Ug;Q.prototype.Vg=function(){return this.B.Vg()};Q.prototype.previousSlideIndex=Q.prototype.Vg;Q.prototype.ma=function(){return this.B.ma()};Q.prototype.currentSlideIndex=Q.prototype.ma;Q.prototype.$=function(){return this.B.$()};Q.prototype.currentSlide=Q.prototype.$;Q.prototype.playbackState=function(){return this.B.playbackState()};Q.prototype.playbackState=Q.prototype.playbackState;Q.prototype.Z=function(){return this.B.Z()};Q.prototype.clock=Q.prototype.Z; +Q.prototype.Bc=function(){return this.B.Bc()};Q.prototype.slideChangeEvent=Q.prototype.Bc;Q.prototype.Ux=function(){return this.B.Ux()};Q.prototype.stepChangeEvent=Q.prototype.Ux;k=Q.prototype;k.zR=function(){return this.B.zR()};k.tu=function(){return this.B.tu()};k.ZP=function(){return this.B.ZP()};k.NR=function(){return this.B.NR()};k.Vo=function(){return this.B.Vo()};Q.prototype.playbackCompleteEvent=Q.prototype.Vo;Q.prototype.Dx=function(){return this.wV}; +Q.prototype.navigationRestrictedEvent=Q.prototype.Dx;Q.prototype.PQ=function(){return this.B.PQ()};Q.prototype.Ud=function(){return this.B.Ud()};Q.prototype.Oa=function(){return this.B.Oa()};Q.prototype.quizPlayer=Q.prototype.Oa;Q.prototype.ob=function(){return this.B.ob()};Q.prototype.scenarioPlayer=Q.prototype.ob;Q.prototype.fb=function(){return this.B.fb()};Q.prototype.$C=function(){return this.B.$C()};Q.prototype.slideTransitionController=Q.prototype.$C;k=Q.prototype;k.Qt=function(){return this.B.Qt()}; +k.ER=function(a,b){this.B.ER(a,b)};k.cD=function(a){this.B.cD(a)};k.TP=function(){this.B.TP()};k.YQ=function(){this.B.YQ()};k.Wo=function(){return this.B.Wo()};function Iu(a){a.Fu.forEach(b=>b.displayObject().style.display="")}function $u(a,b){a.Fu.push(b);b=b.displayObject();yi(b,"0 0");Ed(a.pa.displayObject(),b,0)}function av(a){a.Fu.forEach(b=>b.displayObject().style.display="none")}function bv(a,b){a.Fu.forEach(c=>Ed(b,c.displayObject(),0))}function cv(a,b){a.Fu.forEach(c=>b(c))} +class dv extends wg{constructor(a){super();this.pa=a;this.Fu=[];z(this,this.pa.Le(),this.kA,this)}kA(a,b,c,d){for(const f of this.Fu){a=f;b=c;var e=d;const g=a.displayObject(),h=this.pa.scale();wn(g,h);const [l,n]="accessible"==this.pa.Gb?[0,0]:[b+h*a.Xa().left,e+h*a.Xa().top];Gh(g,l,n)}}};class ev extends Qt{constructor(a,b){var c=a.content(),d=RegExp('',"gi");const e=[];for(var f=d.exec(c);f;)e.push(f[1]),f=d.exec(c);for(d=0;de&&a.Lu.push(c):0<=e&&a.Lu.splice(e,1);iv(a);a.kd()!=d&&a.BJ.C(a);a.CJ.C(a)} +function jv(a,b,c){const d=a.kd(),e=a.Gw.indexOf(c);b?0>e&&a.Gw.push(c):0<=e&&a.Gw.splice(e,1);iv(a);a.kd()!=d&&a.BJ.C(a);a.CJ.C(a)}gv.prototype.Sb=function(){return this.Dq};gv.prototype.tickEvent=gv.prototype.Sb;gv.prototype.Cl=function(){return this.GG};gv.prototype.startEvent=gv.prototype.Cl;gv.prototype.vr=function(){return this.IG};gv.prototype.stopEvent=gv.prototype.vr;gv.prototype.Cc=function(){return this.zq};gv.prototype.stateChangeEvent=gv.prototype.Cc;gv.prototype.vH=function(){return this.BJ}; +gv.prototype.bufferStateChangeEvent=gv.prototype.vH;gv.prototype.aC=function(){return this.CJ};gv.prototype.bufferedObjectChangeEvent=gv.prototype.aC;function hv(a,b){return a.qo||a.tf(b)||a.Wi(b)}function iv(a){let b="stopped";a.po&&(b=a.qo?"suspended":a.kd()?"buffering":a.jG?"rewinding":"started");a.Pa!=b&&(a.Pa=b,a.zq.C(a))}gv.prototype.tf=function(a){return 1{h.setViewMode(g)})}fb(){return this.Di.fb()}ju(a){this.slide().style.opacity=""+(a?1:0)}Nq(a){a?a.appendChild(this.tb):Fd(this.tb)}};class lv extends Rq{constructor(a,b,c,d,e,f,g){super(a,b,c,d,e,f);this.Di=f;this.FN=null;f.Oa()?this.aB(g):Qe(this,f.EX,()=>this.aB(g))}Oa(){return this.Di.Oa()}ju(a){this.slide().style.opacity=""+(a?1:0)}Nq(a){a?a.appendChild(this.tb):Fd(this.tb)}aB(a){const b=this.Di.Oa();b.onPresentationViewModeChanged(a);this.FN=b.skin().displayObject();this.tb.appendChild(this.FN);this.xG.innerHTML=this.tb.innerHTML;Th(this.no,"normal"==a)}rd(){super.rd();Fd(this.FN)}};class mv extends wg{constructor(a){super();this.ya=a;this.Pa=0;this.gl=E(this);this.jy=this.no=this.tb=null}slide(){return this.ya}$q(a,b,c){this.tb=a;this.no=b;this.jy=c;this.Pa=2;this.gl.C(this)}slideBackground(){return this.no}mf(){return 2==this.Pa}state(){return this.Pa}};class nv extends mv{constructor(a){super(a);this.yf=null;this.jY=E(this)}ob(){return this.yf}rR(a){this.yf=a;this.jY.C()}};class ov extends Rq{constructor(a,b,c,d,e,f,g){super(a,b,c,d,e,f);this.Di=f;f.yf?this.aB(g):Qe(this,f.jY,()=>this.aB(g))}ob(){return this.Di.ob()}ju(a){this.slide().style.opacity=""+(a?1:0)}Nq(a){a?a.appendChild(this.tb):Fd(this.tb)}aB(a){this.Di.ob().setViewMode(a);this.xG.innerHTML=this.tb.innerHTML;Th(this.no,"normal"==a)}};function ft(a,b){const c=a.M.ja(b);b=a.vc.zd[b];if(c instanceof Am){b.nr();b.ju(!1);var d=new Rn({content:b.fl,mode:a.vc.Gb,WI:c.WI(),fD:c.fD()});d=new pq(c,d,a.Ca,a.Ae)}else if(c instanceof br){if(!b.Oa())return null;d=new vq({content:b.fl,mode:a.vc.Gb,Oa:b.Oa(),VB:c.VB()});d=new wq(c,d,a.Ca)}else if(c instanceof sq){if(!b.fb())return null;d=new rq({content:b.fl,mode:a.vc.Gb,fb:b.fb(),UB:c.UB()});d=new tq(c,d,a.Ca)}else if(c instanceof Aq){if(!b.ob())return null;d=new zq({content:b.fl,mode:a.vc.Gb, +ob:b.ob(),WB:c.WB()});d=new Bq(c,d,a.Ca)}return d}class pv{constructor(a,b,c,d){this.Ca=c;this.M=b;this.vc=a;this.Ae=d}};class Xs{constructor(a,b,c,d,e,f,g,h){this.Gs=[];this.Ds=[];this.Jv=!1;this.pg=a;this.og=b;this.Ez=c;this.Kg=d;this.Mg=e||null;this.Rf=f;this.dE=g;this.P9=h}hy(){return this.P9}slideWidth(){return this.pg}slideHeight(){return this.og}na(){return this.Ez}hb(){return this.Kg}qc(){return this.Mg}va(){return this.Rf}};function qv(a,b,c,d,e,f){this.F=a;this.vc=b;this.X=c;this.pg=d;this.og=e;this.Rf=f;this.uT=new C;this.tT=new C}qv.prototype.U=-1;qv.prototype.Fca=function(){return this.X.progress()};qv.prototype.transitionProgress=qv.prototype.Fca;qv.prototype.state=function(){return this.Yg?this.X.o0()?"playing":"paused":"idle"};qv.prototype.state=qv.prototype.state;qv.prototype.tu=function(){return this.uT};qv.prototype.transitionEffectStartEvent=qv.prototype.tu;qv.prototype.UI=function(){return this.tT}; +qv.prototype.transitionEffectCompleteEvent=qv.prototype.UI;function Js(a){a.Yg&&rv(a,!1)}function bt(a,b){const c=a.vc;c.zd[b].nr();0<=a.U&&c.zd[a.U].Oc();a.U=b}function Ws(a){a.Kn.xg();a.Fv.nr();a.Kn.nr()}function at(a){a.Yg.start();a.vT=!0;Ji&&(a.H7=setInterval(a.G7,100));a.X.Sb().addHandler(a.yW,a);a.uT.C(a.U);sj&&document.body&&yn(document.body)}k=qv.prototype;k.G7=function(){if(Ji&&document.body)return yn(document.body)};k.zW=function(){rv(this)}; +k.XM=function(a){this.Yg.JA.removeHandler(this.XM,this);a&&at(this)};k.yW=function(a){isNaN(this.zO)&&(this.zO=a,a=0);this.Yg.Rt()||(1>a?this.Yg.Bg(a):rv(this))};function rv(a,b){void 0===b&&(b=oj);a.vT&&(a.X.Sb().removeHandler(a.yW,a),a.vT=!1);Ji&&clearInterval(a.H7);a.Yg.zx()||a.Yg.JA.removeHandler(a.XM,a);a.Yg.Rt()&&a.Yg.ge.removeHandler(a.zW,a);a.Yg.terminate();a.Yg=null;Ws(a);a.Kn&&(a.Kn.Oc(),a.Kn=null);a.Fv=null;b?Gi(a.KV,a):a.KV()}k.KV=function(){Cd(this.Rf);this.tT.C(this.U)};function sv(){this.Dq=new C;this.GG=new C;this.IG=new C}k=sv.prototype;k.le=0;k.JL=!1;k.progress=function(){return this.le};k.Bg=function(a){this.le=a;this.Dq.C(a)};k.o0=function(){return this.JL};k.start=function(){this.JL=!0};k.stop=function(){this.JL=!1};k.Sb=function(){return this.Dq};k.Cl=function(){return this.GG};k.vr=function(){return this.IG};k.Z=function(){return this};function R(a){this.Ez=a.na();this.Fv=a.hb();this.Kn=a.qc();this.Gz=!0;this.h7=a;this.pg=a.slideWidth();this.og=a.slideHeight();this.JA=new C;this.ge=new C;this.Rf=a.va();this.dE=a.dE;this.pg>this.og?(this.VL=Math.min(this.pg,1024),this.ws=this.VL/this.pg,this.UL=this.og*this.ws):(this.UL=Math.min(this.og,1024),this.ws=this.UL/this.og,this.VL=this.pg*this.ws);this.SN=wd("DIV");wn(this.SN,1/this.ws,1/this.ws);this.$e=Ii}k=R.prototype; +k.start=function(){this.Rf.appendChild(this.SN);var a=this.qc().slide();mn(a,"transitionSlide");a=this.hb().slide();mn(a,"transitionSlide");this.initialize();this.Bg(0)};k.terminate=function(){this.Bg(1);this.CH();this.X&&(this.X.Cl().removeHandler(this.HV,this),this.X.vr().removeHandler(this.GV,this));var a=this.qc().slide();nn(a,"transitionSlide");a=this.hb().slide();nn(a,"transitionSlide");Cd(this.Rf)}; +function tv(a,b){b?(b=a.qc().slide(),mn(b,"paused"),a=a.hb().slide(),mn(a,"paused")):(b=a.qc().slide(),nn(b,"paused"),a=a.hb().slide(),nn(a,"paused"))}k.Bg=function(a){if(this.zx()){var b=this.Ha;a=this.na()?1-a:a;b.call(this,a)}};k.zx=function(){return this.Gz};k.Jv=function(){return this.h7.Jv};k.na=function(){return this.Ez};k.initialize=function(){};k.CH=function(){};k.Ha=function(){};k.hb=function(){return this.na()?this.Kn:this.Fv};k.qc=function(){return this.na()?this.Fv:this.Kn}; +function uv(a,b){null!=a.qc()&&a.qc().ju(b)}function vv(a,b){a.hb().ju(b)} +k.Ma=function(a,b,c,d,e,f){function g(){if(!--h){var A=r,J=v,T=y,U=D,X=I;this.mb=p;this.Da=A;this.Cn=J;this.hF=U;this.Up=T;this.nF=X;this.qW();1!=this.Gz&&(this.Gz=!0,this.JA.C(!0))}}0!=this.Gz&&(this.Gz=!1,this.JA.C(!1));let h=0;for(var l=0;l>1;a|=a>>2;a|=a>>4;a|=a>>8;return(a|a>>16)+1}function yv(a,b){b=b||0;return Math.round(a*Math.pow(10,b))/Math.pow(10,b)};function zv(a){R.call(this,a)}var Av,Bv;t(zv,R);function Cv(a,b){a.ns();a.vz(b);b=a.N;a.jb=mat4.create();a.RW=mat4.create();b.viewport(0,0,b.L1,b.K1);b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT);const c=.5*a.slideHeight()/Math.tan(22.5*Math.PI/180);mat4.perspective(45,b.L1/b.K1,1,1E4,a.RW);mat4.identity(a.jb);mat4.translate(a.jb,[0,0,-c])}k=zv.prototype; +k.ns=function(){this.tq=!0;void 0===Av&&(Av=S(this.slideWidth()+3,this.slideHeight()+3),F(Av,"left","-1px"),F(Av,"top","-1px"));void 0===Bv&&(Bv=Av.getContext("webgl")||Av.getContext("experimental-webgl"));this.va().appendChild(Av);try{Bv.L1=Av.width,Bv.K1=Av.height,Bv.enable(Bv.DEPTH_TEST)}catch(b){}const a=this.N=Bv;this.TK=Dv(this,a.FRAGMENT_SHADER,this.Nh());this.gP=Dv(this,a.VERTEX_SHADER,this.Oh());null!==this.TK&&null!==this.gP&&(this.sq=a.createProgram(),a.attachShader(this.sq,this.gP),a.attachShader(this.sq, +this.TK),a.linkProgram(this.sq),a.getProgramParameter(this.sq,a.LINK_STATUS)?(a.useProgram(this.sq),this.Vh()):this.tq=!1)};k.CH=function(){this.N&&(this.Kh(),Ev(this,this.fP),Ev(this,this.EO),Ev(this,this.iX),Ev(this,this.tV),this.Lh(),this.N.deleteTexture(this.mB),this.N.deleteShader(this.TK),this.N.deleteShader(this.gP),this.N.deleteProgram(this.sq))};k.Lh=function(){alert("override _disableAttributes")};k.Kh=function(){}; +function Fv(a,b){a.N.bindBuffer(a.N.ARRAY_BUFFER,null);a.N.deleteBuffer(b.kg);a.N.deleteBuffer(b.Sf);a.N.deleteBuffer(b.rg);a.N.deleteBuffer(b.Gn)}k.vz=function(a){this.mB=Gv(this,this.N.TEXTURE0,this.yj(),0,a)}; +function Gv(a,b,c,d,e,f){const g=a.N;var h=a.slideWidth(),l=a.slideHeight();h=xv(h);l=xv(l);a=a.N.getParameter(a.N.MAX_TEXTURE_SIZE);if(Math.max(h,l)>a){var n=h/l;h>l?(h=a,l=h/n):(l=a,h=l*n)}a=new cd(h,l);h=a.width;l=a.height;a=S(h,l);n=a.getContext("2d");void 0!==f?f(n,e,h,l):n.drawImage(e,0,0,h,l);e=g.createTexture();g.activeTexture(b);g.bindTexture(g.TEXTURE_2D,e);g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,a);g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MAG_FILTER,g.LINEAR);g.texParameteri(g.TEXTURE_2D, +g.TEXTURE_MIN_FILTER,g.LINEAR_MIPMAP_LINEAR);g.generateMipmap(g.TEXTURE_2D);g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_S,g.CLAMP_TO_EDGE);g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_T,g.CLAMP_TO_EDGE);g.bindTexture(g.TEXTURE_2D,null);g.activeTexture(b);g.bindTexture(g.TEXTURE_2D,e);g.uniform1i(c,d);return e}k.Nh=function(){alert("Please override _getFragmentShaderSource");return""};k.Oh=function(){alert("Please override _getVertexShaderSource");return""};k.Vh=function(){}; +function Dv(a,b,c){const d=a.N;b=d.createShader(b);d.shaderSource(b,c);d.compileShader(b);return d.getShaderParameter(b,d.COMPILE_STATUS)?b:(a.tq=!1,null)}function Hv(a,b,c){a=a.N;const d=b.length/c,e=a.createBuffer();a.bindBuffer(a.ARRAY_BUFFER,e);a.bufferData(a.ARRAY_BUFFER,new Float32Array(b),a.DYNAMIC_DRAW);e.Ax=c;e.F0=d;return e} +function Iv(a,b){a=a.N;const c=b.length/1,d=a.createBuffer();a.bindBuffer(a.ELEMENT_ARRAY_BUFFER,d);a.bufferData(a.ELEMENT_ARRAY_BUFFER,new Uint16Array(b),a.DYNAMIC_DRAW);d.Ax=1;d.F0=c;return d}function Jv(a){if(0==a.fM.length)throw"Invalid popMatrix!";a.jb=a.fM.pop()}function Kv(a){const b=mat4.create();mat4.set(a.jb,b);a.fM.push(b)}function Lv(a,b,c,d){mat4.translate(a.jb,[-d[0],-d[1],-d[2]]);mat4.rotate(a.jb,b*Math.PI/180,c);mat4.translate(a.jb,d)} +function Mv(a,b,c,d,e){const f=a.N,g=b.kg;f.bindBuffer(f.ARRAY_BUFFER,g);void 0!==d&&d();f.vertexAttribPointer(a.fP,g.Ax,f.FLOAT,!1,0,0);b.Gn&&(d=b.Gn,f.bindBuffer(f.ARRAY_BUFFER,d),void 0!==e&&e(),f.vertexAttribPointer(a.iz(),d.Ax,f.FLOAT,!1,0,0));e=b.rg;f.bindBuffer(f.ARRAY_BUFFER,e);f.vertexAttribPointer(a.EO,e.Ax,f.FLOAT,!1,0,0);a.vJ();a=b.Sf;f.bindBuffer(f.ELEMENT_ARRAY_BUFFER,a);void 0===c&&(c=f.TRIANGLES);f.drawElements(c,a.F0,f.UNSIGNED_SHORT,0)} +k.iz=function(){alert("override _getVertexNormalAttributeLocation");return-1};k.yj=function(){alert("override _getSamplerUniform");return null};k.vJ=function(){};function Nv(a){a.fP=Ov(a,"aVertexPosition");a.EO=Ov(a,"aTextureCoord");a.iX=Pv(a,"uPMVMatrix");a.tV=Pv(a,"uNMatrix")} +function Qv(a,b){let c=0;for(let e=0;ea){var b=Y(0,0,.3,1)(a);this.Zr(b,!0);this.Zr(b,!1)}b=this.slideWidth();var c=this.slideHeight();c=Math.max(b,c);const d=this.O==lw?1:-1;Kv(this);.1<=a&&(.1=a?(a=Y(.1,0,.4,1)(a),mw(this,a),mat4.translate(this.jb,[0,0,-a*c/4]),Lv(this,-60*a,[1,0,0],[-d*b/4,0,0]),Lv(this,45*d*a,[0,0,1],[-d*b/4,0,0])):.4=a?(a=Y(.4,0,.5,1)(a),mw(this,1),mat4.translate(this.jb,[0,0,-c/4]),mat4.translate(this.jb,[d*a*c/50,-a*c/50,a*c/50]),Lv(this, +-60,[1,0,0],[-d*b/4,0,0]),Lv(this,45*d,[0,0,1],[-d*b/4,0,0])):.5a?(a=Y(.5,0,.55,1)(a),mw(this,1),mat4.translate(this.jb,[0,0,-c/4]),mat4.translate(this.jb,[d*c/50,-c/50,c/50]),Lv(this,-60,[1,0,0],[-d*b/4,0,0]),Lv(this,45*d,[0,0,1],[-d*b/4,0,0]),Lv(this,-1*a,[1,0,0],[0,0,0])):.55h;++h){var d=g,e=a,f=b;d=3*(1-3*f+3*e)*d*d+2*(3*f-6*e)*d+3*e;if(0==d)break;g-=((((1-3*b+3*a)*g+(3*b-6*a))*g+3*a)*g-c)/d}c=(-2*g+3)*g*g}return c}}var Dw=Cw(.42,.58);function Y(a,b,c,d){return function(e){return b+(d-b)/(c-a)*(e-a)}}function ow(a,b,c){if(c=b)return 1;a=(c-a)/(b-a);return-2*Math.pow(a,3)+3*Math.pow(a,2)} +function Ew(a,b,c,d){if(d>1)}const c=this.Da,d=this.mb;var e=this.slideWidth(),f=this.slideHeight();e=Math.floor(e/7);f=Math.floor(f/5);const g=c.width-6*e,h=c.height-4*f;this.fn=[];for(let l=0;5>l;++l){const n=b(5,l),m=n*f,p=4==n?h:f+1;for(let r=0;7>r;++r){const v=b(7,r),y=new Lw(c,d,v*e,m,6==v?g:e+1,p,a,this.gs,this.xc);this.Ys.appendChild(y.Dp);this.fn[7*n+v]=y}}Mw(this)}; +Jw.prototype.mL=function(){const a=this.slideWidth(),b=this.slideHeight();Nh(this.Ys,a,b);var c=(.5*a).toString()+"px "+(.5*b).toString()+"px";Di(this.Ys,this.xA.toString()+"px");Ei(this.Ys,c);Lb&&(c=zd("DIV"),this.Ys.appendChild(c),Nh(c,a,b),F(c,"position","absolute"),Ci(c,"preserve-3d"),this.Ys=c)}; +function Mw(a){var b=.7-.15,c=a.O==Kw?b/4:0,d=a.O==Nw?b/6:0;b=0;var e=1;for(var f=0;5>f;++f)for(let g=0;7>g;++g){const h=f*c+g*d+.15*Math.random();b=Math.max(h,b);e=Math.min(h,e);a.fn[g+7*f].CP=h}c=e;b=.7/(b-c);for(d=0;5>d;++d)for(e=0;7>e;++e)f=a.fn[e+7*d],f.CP=(f.CP-c)*b}Jw.prototype.Ha=function(a){const b=this.fn.length;for(let c=0;ce:1=c&&Pw(a,!0);xi(a.Dp,(a.qz?"rotateX(-":"rotateY(")+b.toString()+"deg)")}else a.NE?90<=b&&Pw(a,!1):90>=b&&Pw(a,!0),xi(a.Dp,(a.qz?"scaleY(":"scaleX(")+Math.cos(a.LD*Math.PI/180).toString()+")");H(a.qG,.5*Math.sin(a.LD*Math.PI/180))}} +function Pw(a,b){const c=b?a.QT:a.ED,d=b?a.ED:a.QT;a.NE=b;F(c,"visibility","visible");F(d,"visibility","hidden")};function Qw(a,b){R.call(this,a);this.O=b;this.$e=!1;this.Ma(!1,!0);this.O==Rw?(this.Gg=(1-Sw)/(Tw-1),this.dS=2*this.slideWidth()/Math.pow(Sw,2)):(this.Gg=.25,this.dS=2*this.slideHeight()/Math.pow(Sw,2))}t(Qw,R);function Uw(a,b,c,d,e,f){const g=S(e+1,f+1);g.getContext("2d").drawImage(a.Da,c,d,e,f,0,0,e+1,f+1);b.push(new Vw(g,c,d,e,f))} +Qw.prototype.initialize=function(){let a;a=this.O==Rw?Tw:Ww;const b=this.slideWidth(),c=this.slideHeight();this.Ju=[];this.Ku=[];const d=b/a,e=c/a;let f=0;for(let h=0;h=b?0:a.dS*Math.pow(b,2)/2}function Yw(a,b){const c=a.slideHeight();let d=0,e=a.Gg,f=0,g=1,h=e,l=1;a.na()&&(d=c,e=1-e,f=1-f,g=1-g,h=e,l=1-l);if(!a.na()){if(be)return d;return c*(f+(g-f)/(l-h)*(b-h))} +Qw.prototype.Ha=function(a){let b,c,d;const e=this.Da.getContext("2d");e.clearRect(0,0,this.slideWidth(),this.slideHeight());if(this.O==Rw){for(b=0;b1-dx?1-a:dx;var b=Math.max(this.slideWidth(),this.slideHeight());b=Y(0,0,dx,.2*-b);const c=Y(0,0,dx,10);yi(this.pa,"50% 100%");xi(this.pa,"rotateX("+c(a)+"deg) translateZ("+b(a)+"px)")}; +k.oL=function(a){const b=this.slideWidth(),c=this.slideHeight();this.Vk=this.Uk=this.Nl=this.Ml=0;switch(a){case ex:this.Nl=1;this.Uk=fx*b;this.Vk=-fx*c;break;case gx:this.Nl=-1;this.Uk=-fx*b;this.Vk=fx*c;break;case hx:this.Ml=-1;this.Uk=fx*b;this.Vk=fx*c;break;case ix:this.Ml=1;this.Uk=-fx*b;this.Vk=-fx*c;break;case jx:this.Nl=this.Ml=-1;this.Uk=-fx*b;this.Vk=fx*c;break;case kx:this.Ml=-1;this.Nl=1;this.Uk=-fx*b;this.Vk=-fx*c;break;case lx:this.Ml=1;this.Nl=-1;this.Uk=fx*b;this.Vk=fx*c;break;case mx:this.Nl= +this.Ml=1,this.Uk=fx*b,this.Vk=-fx*c}this.Re?(this.Nl*=-1,this.Vk*=-1):(this.Ml*=-1,this.Uk*=-1)}; +k.Ha=function(a){this.Re&&(a=1-a);this.eM(a);if(a>=nx&&a=ox&&(this.na()||this.Re?this.na()&&this.Re&&vv(this,!1):uv(this,!1),F(this.sw,"visibility","hidden"))};var gx=0,hx=1,ix=2,ex=3,kx=4,jx=5,mx=6,lx=7,dx=.4,nx=.1,ox=.7,px=800,qx=.5,bx=.3,ax=50,fx=1,cx=1;function rx(a,b,c){R.call(this,a);this.O=b;this.Re=c;this.$e=!1;this.oL(b)}t(rx,R);k=rx.prototype;k.initialize=function(){uv(this,!0);vv(this,!0);this.qn().xg()};k.qn=function(){return this.Re?this.qc():this.hb()};k.hz=function(){return this.Re?this.hb():this.qc()}; +k.oL=function(a){const b=this.slideWidth(),c=this.slideHeight();this.kl=this.jl=0;switch(a){case ex:this.kl=c;break;case gx:this.kl=-c;break;case hx:this.jl=b;break;case ix:this.jl=-b;break;case jx:this.jl=b;this.kl=-c;break;case kx:this.jl=b;this.kl=c;break;case lx:this.jl=-b;this.kl=-c;break;case mx:this.jl=-b,this.kl=c}this.Re&&(this.jl*=-1,this.kl*=-1)};k.Ha=function(a){a=Dw(a);this.Re&&(a=1-a);const b=Y(0,this.jl,1,0),c=Y(0,this.kl,1,0);Gh(this.qn().slide(),b(a),c(a))};function sx(a,b,c){var d=new W;this.zr=a;this.$x=b;this.ey=c;this.n=d};function tx(a){R.call(this,a);this.Ma(!1,!0)}t(tx,zv); +var ux=[0,1,2,3,2,4,5,4,6,7,6,8,9,8,10,11,10,12,13,12,14,15,14,16,17,16,18,19,18,20,21,20,22,1,23,24,2,24,25,4,25,26,6,26,27,8,27,28,10,28,29,12,29,30,14,30,31,16,31,32,18,32,33,20,33,34,23,35,36,24,36,37,25,37,38,26,38,39,27,39,40,28,40,41,29,41,42,30,42,43,31,43,44,32,44,45,33,45,46,35,47,48,36,48,49,37,49,50,38,50,51,39,51,52,40,52,53,41,53,54,42,54,55,43,55,56,44,56,57,45,57,58,47,59,60,48,60,61,49,61,62,50,62,63,51,63,64,52,64,65,53,65,66,54,66,67,55,67,68,56,68,69,57,69,70,59,71,72,60,72,73, +61,73,74,62,74,75,63,75,76,64,76,77,65,77,78,66,78,79,67,79,80,68,80,81,69,81,82,71,83,84,72,84,85,73,85,86,74,86,87,75,87,88,76,88,89,77,89,90,78,90,91,79,91,92,80,92,93,81,93,94,83,95,96,84,96,97,85,97,98,86,98,99,87,99,100,88,100,101,89,101,102,90,102,103,91,103,104,92,104,105,93,105,106,0,2,3,3,4,5,5,6,7,7,8,9,9,10,11,11,12,13,13,14,15,15,16,17,17,18,19,19,20,21,21,22,107,1,24,2,2,25,4,4,26,6,6,27,8,8,28,10,10,29,12,12,30,14,14,31,16,16,32,18,18,33,20,20,34,22,23,36,24,24,37,25,25,38,26,26,39, +27,27,40,28,28,41,29,29,42,30,30,43,31,31,44,32,32,45,33,33,46,34,35,48,36,36,49,37,37,50,38,38,51,39,39,52,40,40,53,41,41,54,42,42,55,43,43,56,44,44,57,45,45,58,46,47,60,48,48,61,49,49,62,50,50,63,51,51,64,52,52,65,53,53,66,54,54,67,55,55,68,56,56,69,57,57,70,58,59,72,60,60,73,61,61,74,62,62,75,63,63,76,64,64,77,65,65,78,66,66,79,67,67,80,68,68,81,69,69,82,70,71,84,72,72,85,73,73,86,74,74,87,75,75,88,76,76,89,77,77,90,78,78,91,79,79,92,80,80,93,81,81,94,82,83,96,84,84,97,85,85,98,86,86,99,87,87, +100,88,88,101,89,89,102,90,90,103,91,91,104,92,92,105,93,93,106,94],vx="/+8MAP/rSADoi0gA6I8MANFLSADRTwwAuitIALovDACi60gAou8MAIurSACLrwwAC6tIAAuvDAAi60gAIu8MADorSAA6LwwAUUtIAFFPDABoi0gAaI8MAH/rSAD/54QA6IeEANFHhAC6J4QAoueEAIunhAALp4QAIueEADonhABRR4QAaIeEAH/nhAD/48AA6IPAANFDwAC6I8AAouPAAIujwAALo8AAIuPAADojwABRQ8AAaIPAAH/jwAD/4AAA6IAAANFAAAC6IAAAouAAAIugAAALoAAAIuAAADogAABRQAAAaIAAAH/gAAD/88AA6JPAANFTwAC6M8AAovPAAIuzwAALs8AAIvPAADozwABRU8AAaJPAAH/zwAD/94QA6JeEANFXhAC6N4QAoveEAIu3hAALt4QAIveEADo3hABRV4QAaJeEAH/3hAD/+0gA6JtIANFbSAC6O0gAovtIAIu7SAALu0gAIvtIADo7SABRW0gAaJtIAH/7SAD//wwA6J8MANFfDAC6PwwAov8MAIu/DAALvwwAIv8MADo/DABRXwwAaJ8MAH//DAB/7wwA 8u/+EviMJALjCzwa4S7kSs1rNAHNrw4Gt0s8DLfPDAyhC0wLoa8UC4qrWAuLbyALC6tgCwrvIAsiK1gLIS8QCziLPAs3LuwNTqsQDEzOvgJkiugHYU5gLXpLHAn8aCwJ5WeUC85nZAm3p2gLoQd4C4pnjAsMJ5wLIsecCzlnhAtQB2QLZodIC31HbAv+JDQL5yPgC8/DrAu4o5wLoaOoC4rDwAsMA9ALIuPcCznD0AtQo7QLZ4OUC36DnAv+oEQL56AkC9CQBAu5cBwLonAcC4twDAsLgAQLIoAUCzmAGAtQoAALZ9AoC37QSAv+k5wL55OYC9CzuAu5s9QLotPgC4vz2AsK88QLIdOwCzjTqAtP87QLZzPoC340PAv9N3AL5pdMC8/3aAu5V4gLorecC4v3oAsKt5QLIXeACjgXdA1Ot3AGZZecC3x4PAn6WxwK5HrsB86bFAu4ezwLohtYC4ubZAsK+1wLIZtQCjf7SA9OGz4KY3tEJnh8NAD1frIJ4V5gMMz+wgO3PvANoT8UC4rfJAsLvyQLIj8YCji/DBBPHv4TYb7EY3K/+ht1TrII 4w9GCOysIArfCtim3S6MudHrDgHSzswEu8soObxO6DWk6ywqpU7sKo3rJCyOLuQsCOsYKwjO2C4gCxAuH87IHjcrCBo17oBVTEqAbUsNlBBcKKoNWcrMc3JJkhHziKAA4gc4g9DHUgO653A7pAdwKI1HZCwJZ1gsICdQKzcnTC5OR0QcYyaManbmFAf5JNAP48P0Pc6DrgG5A8A4ooPAKYwjrCwKQ5wsIMOQLDdjkCtOQ4QuZONIHXrCuED6QPAl5ABcKs1gIC+3ABQuoMAQLIqAACsL0BgsIjAoKjhQKDBOcCwtZRBgKnsxBCP58sw849NQIM0zkC22U6Arn7OsLIkzuCsNc8wtJBPUJDqTzEJP07ILZFP0S3k05Ar2tjgI4na0Y80XTB+2F1wtnzdoLIhXeCsOd4QtJVeMJTv3hEBRd2YGYhdQhHNYrADyOb4D3BjqEsvaqGi2OxgenxsoLYf7OCsO+0gsJftMJzz7QD5SuyIFXzr0pWy8LAjlnEIq2LrgccqdzA61XqRRnv7kIYf++C0PPwgsJl8MKD1/BDlTnuQAXN6ouGRffgNlrCov 1W44NeArWEHX6ij31I3c/9EqMDXSDfQ1u+pkhL0OMH+larxUpm6IWo5rFGWPTtxiCItYYAgPJGQfi4RpH49AXTYrSEYzDbi6RmkgtkSr5E1R5mgxVMj8n2eGlg3lB+Qp3WaQ4dCGcDe65pyBpGbwUY1nSGkJh5BhIGfIWjaH2I9KZug7WuS8qmoDBCHoJGAH4kL4wdBCtD66AtB1oyMoVYwDhGUK48xkIcQIZTikZEtNg/ycX+MEKm/gZIPwYToG5BC0lM1QvG63EIwxoVB0g4qQNFoMYBhPIwBMfjoApFpRIPw+ZcCQm3CRigbvMMCB3xNMJcx0XJe2lFxNn9QgZYjz6GAOM5RvJRNITDuzCH1RktQzYTMAxmfUiA/ps3Qf2dUIpcmXQDa09/SBnnfgXYe3qF4PV1xuJhcUSzx20IJR1qAyXTao4mQ38Cvm9woM0RbELcU5YLO0m4BFndukaIbbdF8QWyhpJzrcTT1alIdSemQzWLpM9l/baD3XmOon01lAn8L8IEqxnfi4nb9gXoY/PGMRHvRlKD6oVT5+WIZTPiQ0VT4FAFcelDlX6GIn x+00d9EKJG7PSWU3xSyFPMtpOHHFjOBru2jdC7yMmSipaeCPrC2knZLKzLmU7pCtBCuIoALvQKwZy6TqGm9IyjALKLUsrT0xP+iBFj5rpMFJBjh1UklElFhE1hjXJtBW1uYRI8yFbHS6BTzrpiYkhZBHCMEGh9iqHWh4mzDn6QlBZmiUV6VYyVyh4EDOo7Be3UKxB80BkIq4QZDKowJgiY1DQMEJBCSgH2TgzjXFTJ1I5Bj8VeKgYWLwdK3eQrQz3JC0ysZxGPS00bB1n9EwwYnwbJ8MAGiUISEM0jahfJpMwbCBXwBE0l4yxC7iICym0VJwYsg09Pu0NWSdnbT0xYb0JKgPkzTAJbJYjzpxzOZNEiR0WTKtGE8zxFrYMchC05UI1cC3GIevWFT6m1iEkoRX1KISdvzGKFYkhTtViPdMFdhyVRY5K1d27GLYFQoNyDbAc7041Q+uW6yrl9vY1oG7hJ8VGsDDKxngiTxZLQ9LWZRwTnm5OFD6PG/HtnAP0Pnwhby8FL+qPZkpl5+MxQAfRK0XfoC0Lh2cjT0c5SZEvSxlRBzZN0e9QG9IhZAt sGuEisDqQKa6x8lHsKrJTbYHAImvKmSDsccRV6zq0VOqJyCVq8sEgZyIrTejrEU2iCrlDI3uHUoKqw2QCM5xUB5quSIaa+2sMahtZyyLoSY4RqC1PgokqEPFNBO/ptxswyTRKLhjZIi1wzlSpkNYtJUFQSuCJ2zaEIhlPSXoLYAxpqjcR+Vk8EoCIF27gzRlziKU576wGI+0MMFCoXAQ7Y0h4SQFhBTTFKThZChl2QQ9ZL0zRIK0hFKQZMLL4mgzzhD8wrqxiSSmMhzalnHBX4ew2L8MwMi7G6FZVzEC+U8+AuClTyBQ5EvzIF3SUBiawVMMfLz1SS2nddDrknWVTYEUJNMSEekkJzA87jhQnWY7MMSaRdHJQzuzxJnFslRWxxV477OXyNajGA1lj3jQ/QZXdNYZNVkwKrO4tDXUhWY4NGCaPtUhUkcWkJ/HdeQjuXd4s7NZeWCee0kgiLrlbgta3QIgGM06LVd4lC54FVw2GASVOjihWT852KG5lhyHuZr8gKqcPReZfCWphz6BSg++QTclfHUoK1swbyf7oUMuO0yELNsxVjCcBJM4xXiO qubgL7knVJmqRcEtryjU3p7jgJeiZsBOpmVhTKvoTQSX5Eypm6e0cKIleVupSNEOjwgBQ5kK8SyCiRHTh8spWhCqEWAHaP3fIidZiBdKPVsnBmjAJQocuDZmoCipJVSmtQMFQq0A+JGxonVOn2DIz5diZY2GBVlQAsVt/hbG8a4f5gTzN4XE9j4DaFKrQrBXwCK0wrhx2LuvkOGDnbHdMYmgCXcCAxkKC0IF1BjEHVovhck9NkPIfkPgULS6wogPwRDkmrVxkVOhMpk4kJGNoIeQKNwMQJDEFwBxdyjjFZEtZBy9P2FM4znyaG3EkBxTsxL8YrMU3SCd9a0VipU9lwFTdO8RMNFZJGHtEjKQYYYvAMi0NzAlZS4TTNW7U1QiurTg4aaXKOibNs2gh1jBWApWmP4cE9VKItFIqCazjWInkfCnL1OFXz7T8LC1tuQGrldww6XXLYOSub1nAFip3RN2fYgktt0MJZSEXCjWzRgsFOxiMlbVGjEVFGCvNdiSoVm8lZn55VuKeMnmBrr5aRmZqWIgGbi3H5eUDyW5/Mkn+BAbKdng4TF4sCcpZXiK".split(" "); +k=tx.prototype;k.initialize=function(){uv(this,!1);vv(this,!0);Cv(this,this.Da);this.Bd();this.N.enable(this.N.DEPTH_TEST);const a=mat4.create();mat4.identity(a);a[0]=this.slideWidth()/921.6;a[5]=this.slideHeight()/518.4;this.jb=mat4.multiply(this.jb,a,this.jb);this.yB=mat4.create();mat4.set(this.jb,this.yB)};k.GJ=function(a){for(let b=0;b>>=0;e.push(new W(xx((0==(g>>31&1)?1:-1)*((g&2145386496)>>21),460.8,11),xx((0==(g>>20&1)?1:-1)*((g&1047552)>>10),275.3,11),xx((0==(g>>9&1)?1:-1)*(g&511),211.2,10)))}for(f=0;fvx.length-1&&(c=vx.length-1,b=0);if(0!=b||this.na()&&!this.o4){if(this.w4!=c){var d=c!=vx.length-1?vx[c+1]:null;this.x4=wx(this,vx[c],!0);this.zV=null!=d?wx(this,d,!0):null}for(d=0;da?(f=Y(0,90,45,0),f=.5*Math.sin(f(e)*Math.PI/180),H(this.sp,f)):(f=Y(45,0,90,90),f=.5*Math.sin(f(e)*Math.PI/180),H(this.tp,f)));this.xc?(a=e-n(a),0>=a?(H(this.Kc,0),H(this.sp,0)):90<=a?(H(this.Lc,0),H(this.tp,0)):(H(this.Kc,1),H(this.Lc,1)),xi(this.zp,b)):(xi(this.Lc,c),xi(this.Kc,d),xi(this.tp,c),xi(this.sp,d))}; +var Ax=0,zx=1,Bx=2,Cx=3;function Dx(a,b,c,d){d/=a-1;c/=b-1;const e=new fw,f=new W(0,0,1);for(let g=0;gg;++g)for(let h=c;h= max)\n\t\t{\n\t\t\treturn 1.0;\n\t\t}\n\n\t\tfloat value = (x - min) / (max - min);\n\t\tfloat squaredValue = value * value;\n\n\t\treturn -2.0 * squaredValue * value + 3.0 * squaredValue;\n\t}\n\n\tfloat calcAmp()\n\t{\n\t\tfloat periodKoef = linearInterpolation(uPhase, waveStartAppearTime, 1.0, waveStartAppearTime + WAVE_APPEAR_DURATION, MIN_AMP_KOEF);\n\t\tperiodKoef = clamp(periodKoef, MIN_AMP_KOEF, 1.0);\n\n\t\treturn calcAmpKoef(periodKoef) * uSlideWidth / WAVES_COUNT;\n\t}\n\n\tfloat calcX()\n\t{\n\t\tfloat forcedX = smoothStep(xTimesPart1.x, xTimesPart1.y, uPhase) * forcedXPath + smoothStep(xTimesPart1.z, xTimesPart1.w, uPhase) * 0.75;\n\t\tfloat dampAmpKoef = (uPhase <= xTimesPart2.w + 0.35) ? 1.0 : (diagonalRatio == 0.0 ? 1.0 : diagonalRatio);\n\t\tfloat stretchWidth = smoothStep(xTimesPart2.w, xTimesPart3.x, uPhase);\n\t\tfloat compressionWidth = smoothStep(xTimesPart3.x, xTimesPart3.y, uPhase);\n\t\tfloat deltaWidthKoef = (linearInterpolation(diagonalRatio, 0.0, 0.0, 1.0, compressionWidth) - linearInterpolation(diagonalRatio, 0.0, 0.0, 1.0, stretchWidth)) * STRETCH_KOEF;\n\n\t\tfloat dampX = smoothStep(xTimesPart2.x, xTimesPart2.y, uPhase);\n\t\tdampX -= smoothStep(xTimesPart2.y, xTimesPart2.z, uPhase) * 1.25;\n\t\tdampX += deltaWidthKoef;\n\n\t\treturn (forcedX + dampX * xDampAmp / dampAmpKoef) * uSlideWidth;\n\t}\n\n\tfloat calcY(vec3 vertex)\n\t{\n\t\tfloat cornerBounceAtStartKoef = linearInterpolation(uPhase, yTimesPart1.y, 0.0, yTimesPart1.z, MAX_CORNER_BOUNCE_AT_START_KOEF);\n\t\tfloat x0 = uLeftCurtain ? uSlideWidth * 0.25 : uSlideWidth * 0.5;\n\t\tfloat x1 = uLeftCurtain ? uSlideWidth * 0.5 : uSlideWidth * 0.75;\n\t\tfloat fx0 = uLeftCurtain ? cornerBounceAtStartKoef : MAX_CORNER_BOUNCE_AT_START_KOEF;\n\t\tfloat fx1 = uLeftCurtain ? MAX_CORNER_BOUNCE_AT_START_KOEF: cornerBounceAtStartKoef ;\n\t\tfloat colBounceAtStartKoef = linearInterpolation(vertex.x, x0, fx0, x1, fx1);\n\t\tcolBounceAtStartKoef = clamp(colBounceAtStartKoef, 0.0, MAX_CORNER_BOUNCE_AT_START_KOEF);\n\n\t\tfloat cornerBounceAtEndKoef = linearInterpolation(uPhase, yTimesPart2.y, 0.0, yTimesPart2.z, MAX_CORNER_BOUNCE_AT_END_KOEF);\n\t\tx0 = uLeftCurtain ? 0.0 : uSlideWidth * 0.5;\n\t\tx1 = uLeftCurtain ? uSlideWidth * 0.5 : uSlideWidth;\n\t\tfx0 = uLeftCurtain ? cornerBounceAtEndKoef : MAX_CORNER_BOUNCE_AT_END_KOEF;\n\t\tfx1 = uLeftCurtain ? MAX_CORNER_BOUNCE_AT_END_KOEF: cornerBounceAtEndKoef ;\n\t\tfloat colBounceAtEndKoef = linearInterpolation(vertex.x, x0, fx0, x1, fx1);\n\n\t\tfloat y0 = -smoothStep(yTimesPart1.x, yTimesPart1.y, uPhase) * colBounceAtStartKoef;\n\t\ty0 += smoothStep(yTimesPart1.y, yTimesPart1.z, uPhase) * MAX_CORNER_BOUNCE_AT_START_KOEF;\n\t\ty0 -= smoothStep(yTimesPart1.z, yTimesPart1.w, uPhase) * 0.25;\n\t\ty0 += smoothStep(yTimesPart1.w, yTimesPart2.x, uPhase) * 0.25;\n\t\ty0 -= smoothStep(yTimesPart2.x, yTimesPart2.y, uPhase) * colBounceAtEndKoef;\n\t\ty0 += smoothStep(yTimesPart2.y, yTimesPart2.z, uPhase) * (MAX_CORNER_BOUNCE_AT_END_KOEF + 1.0);\n\n\t\treturn (y0 * yAmp + rowRatio) * uSlideHeight;\n\t}\n\n\tvec3 getVertexPosition(vec3 vertex)\n\t{\n\t\tfloat amp = calcAmp();\n\t\tfloat z = -amp * sinX;\n\t\tfloat xKoef = uLeftCurtain ? 1.0 : -1.0;\n\n\t\treturn vec3(vertex.x - calcX() * xKoef, -calcY(vertex), z);\n\t}\n\n\tvoid initVertexParams(vec3 vertex)\n\t{\n\t\tfloat periodWidth = uSlideWidth / WAVES_COUNT;\n\t\tfloat frequency = PI * 2.0 / periodWidth;\n\t\tsinX = sin(frequency * vertex.x);\n\n\t\trowRatio = vertex.y / uSlideHeight;\n\n\t\tfloat halfRowRatio = rowRatio * 0.5;\n\t\tfloat halfSquaredRowRatio = rowRatio * halfRowRatio;\n\n\t\tfloat maxDT = 0.1;\n\t\tfloat dtAmp = 2.0 * maxDT;\n\t\tfloat dt = dtAmp * halfRowRatio;\n\n\t\tfloat distT = (0.6 - dt);\n\n\t\tfloat xT1 = dt;\n\t\tfloat xT2 = 0.4 + dt;\n\t\tfloat xT3 = xT2 + distT * 0.5;\n\t\tfloat xT4 = 1.0 + (1.0 - xT3);\n\n\t\tfloat xDampT1 = (xT1 + xT2) * 0.45;\n\t\tfloat xDampT2 = xT2;\n\t\tfloat xDampT3 = xT3;\n\t\tfloat xDampT4 = xDampT2 + (xDampT3 - xDampT2) * 0.5;\n\t\tfloat xDampT5 = xDampT3 + 0.075;\n\t\tfloat xDampT6 = 1.0;\n\n\t\tdistT = (0.7 - dt);\n\n\t\tfloat yT2 = 0.3 + dt;\n\t\tfloat yT3 = yT2 + distT * 0.5;\n\n\t\tfloat yDampT1 = 0.0;\n\t\tfloat yDampT2 = (yDampT1 * 2.0 + 0.35) * 0.5;\n\t\tfloat yDampT3 = yT2;\n\t\tfloat yDampT4 = (yT2 + yT2 + yT3) / 3.0;\n\t\tfloat yDampT5 = (yT2 + yT3 + yT3) / 3.0;\n\t\tfloat yDampT6 = yT3 + 0.1175;\n\t\tfloat yDampT7 = 1.0;\n\n\t\txTimesPart1 = vec4(xT1, xT2, xT3 - 0.125, xT4);\n\t\txTimesPart2 = vec4(xDampT1, xDampT2, xDampT3, xDampT4);\n\t\txTimesPart3 = vec2(xDampT5, xDampT6);\n\n\t\tyTimesPart1 = vec4(yDampT1 + 0.05, yDampT2, yDampT3, yDampT4);\n\t\tyTimesPart2 = vec3(yDampT5, yDampT6, yDampT7);\n\n\t\twaveStartAppearTime = linearInterpolation(vertex.y, 0.0, WAVES_START_APPEAR_PHASE, uSlideHeight, WAVES_READY_PHASE - WAVE_APPEAR_DURATION);\n\n\t\tfloat colRatio = (uLeftCurtain ? vertex.x : uSlideWidth - vertex.x) / (uSlideWidth * 0.5);\n\t\tdiagonalRatio = (colRatio + rowRatio) * 0.5;\n\n\t\tfloat x0 = uLeftCurtain ? 0.0 : uSlideWidth * 0.5;\n\t\tfloat x1 = uLeftCurtain ? uSlideWidth * 0.5 : uSlideWidth;\n\t\tfloat fx0 = uLeftCurtain ? 0.2 : 0.0;\n\t\tfloat fx1 = uLeftCurtain ? 0.0 : 0.2;\n\t\tforcedXPath = 0.2 * (colRatio + linearInterpolation(vertex.x, x0, fx0, x1, fx1));\n\n\t\tfloat mxDampAmp = 0.1 * diagonalRatio;\n\t\tfloat dampAcc = 2.0 * mxDampAmp;\n\t\txDampAmp = dampAcc * halfRowRatio;\n\n\t\tfloat maxYAmp = 0.02;\n\t\tfloat dyAmp = 2.0 * maxYAmp * diagonalRatio * rowRatio;\n\t\tyAmp = dyAmp * halfSquaredRowRatio;\n\t}\n\n\tvec3 getVertexNormal(vec3 vertex, vec3 p)\n\t{\n\t\tbool rightSideXPos = vertex.x == (uLeftCurtain ? uSlideWidth * 0.5 : uSlideWidth);\n\t\tfloat deltaWidth = rightSideXPos ? -DELTA_W : DELTA_W;\n\n\t\tvec3 rightVertex = vec3(vertex.x + deltaWidth, vertex.y, vertex.z);\n\t\tinitVertexParams(rightVertex);\n\t\tvec3 right = getVertexPosition(rightVertex);\n\n\t\tvec3 downVertex = vec3(vertex.x, vertex.y + DELTA_H, vertex.z);\n\t\tinitVertexParams(downVertex);\n\t\tvec3 down = getVertexPosition(downVertex);\n\n\t\tvec3 v1 = vec3(right.x - p.x, right.y - p.y, right.z - p.z);\n\t\tvec3 v2 = vec3(down.x - p.x, down.y - p.y, down.z - p.z);\n\n\t\tvec3 n = rightSideXPos ? cross(v1, v2) : cross(v2, v1);\n\t\tn = normalize(n);\n\n\t\treturn n;\n\t}\n\n\tvoid main(void)\n\t{\n\t\tvTextureCoord = aTextureCoord;\n\n\t\tvec3 vertex = vec3(aVertexPosition.x, -aVertexPosition.y, aVertexPosition.z);\n\t\tinitVertexParams(vertex);\n\t\tvec3 p = getVertexPosition(vertex);\n\n\t\tvec3 pNormal = getVertexNormal(vertex, p);\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\n\t\tif (vertex.y == 0.0)\n\t\t{\n\t\t\tfloat maxDY = calcAmpKoef(MIN_AMP_KOEF) * uSlideWidth / WAVES_COUNT * 0.4;\n\t\t\tp.y += max(0.0, min(maxDY, linearInterpolation(uPhase, WAVES_START_APPEAR_PHASE, 0.0, WAVES_START_APPEAR_PHASE + WAVE_APPEAR_DURATION, maxDY)));\n\t\t}\n\t\tgl_Position = uPMVMatrix * vec4(p, 1.0);\n\t}"}; +k.HR=function(){if(void 0!==this.tq)return this.tq;this.ns();return this.tq=this.tq};k.ns=function(){void 0===this.N&&Hx.Mb.ns.call(this)};k.Ha=function(a){this.N.uniform1f(this.jg,a);this.rT=!0;Mv(this,this.Oz,this.N.TRIANGLE_STRIP);this.rT=!1;Mv(this,this.PA,this.N.TRIANGLE_STRIP)}; +k.Vh=function(){Nv(this);this.We=Pv(this,"uSampler");this.jg=Pv(this,"uPhase");this.C4=Pv(this,"uLeftCurtain");const a=Pv(this,"uSlideWidth");this.N.uniform1f(Pv(this,"uSlideHeight"),this.slideHeight());this.N.uniform1f(a,this.slideWidth())};k.Kh=function(){Fv(this,this.Oz);Fv(this,this.PA)};k.Lh=function(){};k.vJ=function(){this.N.uniform1i(this.C4,this.rT?1:0)}; +k.Bd=function(){var a=this.slideWidth();const b=this.slideHeight();this.RU=Ex(a,b,0,31);this.XX=Ex(a,b,30,61);this.xe=Fx(15,31);this.Oz=new Vv;a=Hv(this,hw(this.RU),3);this.Oz.kg=a;a=Hv(this,iw(this.RU),2);this.Oz.rg=a;a=Iv(this,this.xe);this.Oz.Sf=a;this.PA=new Vv;a=Hv(this,hw(this.XX),3);this.PA.kg=a;a=Hv(this,iw(this.XX),2);this.PA.rg=a;a=Iv(this,this.xe);this.PA.Sf=a};k.yj=function(){return this.We};function Ix(a){R.call(this,a);this.hb().xg();this.$e=!1}t(Ix,R);Ix.prototype.initialize=function(){uv(this,!0);vv(this,!0)};Ix.prototype.Ha=function(a){.3>a?H(this.hb().slide(),0):H(this.hb().slide(),1)};function Jx(a){R.call(this,a);this.hb().xg();this.$e=!1}t(Jx,R);Jx.prototype.initialize=function(){uv(this,!0);vv(this,!0);this.Eg=document.createElement("div");Oh(this.Eg,this.slideWidth());Ph(this.Eg,this.slideHeight());F(this.Eg,"backgroundColor","#000000");F(this.Eg,"position","relative");this.va().appendChild(this.Eg)};Jx.prototype.Ha=function(a){.5>a?(H(this.hb().slide(),0),H(this.Eg,0)):.8>a?H(this.Eg,1):(H(this.Eg,0),H(this.hb().slide(),1))};function Kx(a){R.call(this,a);this.$e=!1;this.Ma(!1,!0);this.pM=0;a=this.slideWidth();const b=this.slideHeight(),c=Lx!=a||Mx!=b;if(!Nx||c)Nx=[],Lx=a,Mx=b,Ox(a,b)}var Nx,Lx,Mx;t(Kx,R);Kx.prototype.initialize=function(){uv(this,!1);vv(this,!0);const a=this.Da;this.va().appendChild(a);this.gA=S(this.slideWidth(),this.slideHeight());this.gA.getContext("2d").drawImage(a,0,0)}; +function Ox(a,b){var c=Nx;a/=54;const d=b/42;let e=0,f=0;for(b=0;54>b;++b){f=0;const g=Math.round((b+1)*a)-e,h=e;for(let l=0;42>l;++l){const n=Math.round((l+1)*d)-f,m=new Px(h,f,g,n);m.tr=Math.random();c.push(m);f+=n}e+=g}c.sort(function(g,h){return g.trh.tr?1:0});a=c.length;for(b=0;b time)\n\t\t{\n\t\t\treturn linearInterpolation(phase, time, ANGLE_3, 1.0, ANGLE_2);\n\t\t}\n\t\tfloat angle = linearInterpolation(phase, constAngleTime, ANGLE_2, time, ANGLE_3);\n\t\treturn angle;\n\t}\n\n\tfloat getRowAngleByPhase(vec3 pos, float phase)\n\t{\n\t\tconst float HORIZONTAL_DELAY = 0.05;\n\t\tfloat colDelay = uDirectionIsLeft\n\t\t\t? linearInterpolation(pos.x, 0.0, 0.0, uSlideWidth, HORIZONTAL_DELAY)\n\t\t\t: linearInterpolation(pos.x, 0.0, HORIZONTAL_DELAY, uSlideWidth, 0.0);\n\n\t\tphase = linearInterpolation(phase, 0.0, colDelay, 1.0, 1.0);\n\n\t\tfloat constAngleTime = linearInterpolation(pos.y, 0.0, TIME_2, uSlideHeight, TIME_1);\n\t\tif (phase > constAngleTime)\n\t\t{\n\t\t\treturn goBack(pos.y, phase, constAngleTime);\n\t\t}\n\n\t\tfloat angle = linearInterpolation(phase, 0.0, ANGLE_1, constAngleTime, ANGLE_2);\n\t\treturn angle;\n\t}\n\n\tvec3 getVertexPosition(float phase, vec3 pos)\n\t{\n\t\tfloat R_1 = uSlideHeight;\n\t\tfloat R_2 = uSlideHeight * 0.25;\n\t\tvec2 r = vec2(linearInterpolation(pos.y, 0.0, R_1, uSlideHeight, 0.0), linearInterpolation(pos.y, 0.0, R_2, uSlideHeight, 0.0));\n\n\t\tfloat angle = getRowAngleByPhase(pos, phase);\n\t\tvec3 v = ellipse(angle, pos, vec2(0.0, 0.0), r);\n\t\treturn v;\n\t}\n\tvec3 getVertexNormal(float phase, vec3 pos)\n\t{\n\t\tconst float DELTA_W = 1.0;\n\t\tconst float DELTA_H = 1.0;\n\n\t\tfloat deltaWidth = (pos.x == uSlideWidth) ? -DELTA_W : DELTA_W;\n\t\tfloat deltaHeight = (pos.y == uSlideHeight) ? -DELTA_H : DELTA_H;\n\n\t\tvec3 right = getVertexPosition(phase, vec3(pos.x + deltaWidth, pos.y, pos.z));\n\t\tvec3 down = getVertexPosition(phase, vec3(pos.x, pos.y + deltaHeight, pos.z));\n\t\tvec3 p = getVertexPosition(phase, vec3(pos.x, pos.y, pos.z));\n\n\t\tvec3 v1 = right - p;\n\t\tvec3 v2 = down - p;\n\n\t\tvec3 n = (pos.x == uSlideWidth) ? cross(v1, v2) : cross(v2, v1);\n\n\t\treturn normalize(n);\n\t}\n\n\tvoid main(void)\n\t{\n\t\tfloat phase = uPhase;\n\t\tif (phase < START_PHASE)\n\t\t{\n\t\t\tphase = 0.0;\n\t\t}\n\t\telse if (phase > END_PHASE)\n\t\t{\n\t\t\tphase = 1.0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tphase = linearInterpolation(phase, START_PHASE, 0.0, END_PHASE, 1.0);\n\t\t}\n\t\t\n\t\tvec3 vertex = vec3(aVertexPosition.x, -aVertexPosition.y, aVertexPosition.z);\n\t\tvec4 p = vec4(getVertexPosition(phase, vertex), 1.0);\n\t\tgl_Position = uPMVMatrix * p;\n\t\tvTextureCoord = aTextureCoord;\n\n\t\tvec3 pNormal = getVertexNormal(phase, vertex);\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\t}"}; +k.Ha=function(a){this.N.uniform1f(this.jg,a);Mv(this,this.Ty,this.N.TRIANGLE_STRIP)};k.Vh=function(){Nv(this);this.We=Pv(this,"uSampler");this.jg=Pv(this,"uPhase");const a=Pv(this,"uDirectionIsLeft"),b=Pv(this,"uSlideWidth");this.N.uniform1f(Pv(this,"uSlideHeight"),this.slideHeight());this.N.uniform1f(b,this.slideWidth());this.N.uniform1i(a,this.O==Ux?1:0)};k.Lh=function(){}; +k.Bd=function(){this.Zf=Dx(30,30,this.slideWidth(),this.slideHeight());this.xe=this.O==Ux?Gx(30,30):Fx(30,30);this.Ty=new Vv;var a=Hv(this,hw(this.Zf),3);this.Ty.kg=a;a=Hv(this,iw(this.Zf),2);this.Ty.rg=a;a=Iv(this,this.xe);this.Ty.Sf=a};k.vz=function(a){this.mB=Gv(this,this.N.TEXTURE0,this.yj(),0,a,this.RK.bind(this))};k.Kh=function(){Fv(this,this.Ty)};k.RK=function(a,b,c,d){a.translate(0,d);a.scale(1,-1);a.drawImage(b,0,0,c,d)};k.yj=function(){return this.We};var Ux=0;function $s(a){R.call(this,a)}t($s,R);function Vx(a){R.call(this,a);this.hb().xg();this.$e=!1}t(Vx,R);Vx.prototype.initialize=function(){};Vx.prototype.Ha=function(a){H(this.hb().slide(),a)};function Wx(a){R.call(this,a);this.hb().xg()}t(Wx,R);Wx.prototype.initialize=function(){uv(this,!0);this.$e=!1;this.Eg=document.createElement("div");Oh(this.Eg,this.slideWidth());Ph(this.Eg,this.slideHeight());F(this.Eg,"backgroundColor","#000000");F(this.Eg,"position","relative");this.va().appendChild(this.Eg)};Wx.prototype.Ha=function(a){.5>a?(H(this.Eg,1-2*(.5-a)),vv(this,!1)):(H(this.Eg,1-2*(a-.5)),vv(this,!0))};function Xx(a,b){R.call(this,a);this.O=b;this.Ma(!1,!0)}t(Xx,zv);k=Xx.prototype;k.initialize=function(){uv(this,!1);vv(this,!0);Cv(this,this.Da);this.Bd();mat4.translate(this.jb,[-this.slideWidth()/2,-this.slideHeight()/2,0]);Uv(this)};k.Nh=function(){return"precision mediump float; \n\n\tvarying vec2 vTextureCoord; \n\tvarying vec3 vNormal; \n\n\tuniform sampler2D uSampler; \n\n\tvoid main(void) \n\t{ \n\t\tvec3 n = normalize(vNormal); \n\t\tvec3 lightingDirection = vec3(0.0, 0.0, 1.0); \n\t\tfloat directionalLightWeighting = dot(n, lightingDirection); \n\t\tfloat intentsity = 0.55 + 0.45 * directionalLightWeighting; \n\t\tvec4 textureColor = texture2D(uSampler, vTextureCoord); \n\t\tgl_FragColor = vec4(textureColor.rgb * intentsity, textureColor.a); \n\t}"}; +k.Oh=function(){return"attribute vec3 aVertexPosition;\n\tattribute vec2 aTextureCoord;\n\n\tuniform mat4 uPMVMatrix;\n\tuniform mat3 uNMatrix;\n\n\tuniform float uPhase;\n\tuniform bool uDirectionIsLeft;\n\tuniform float uSlideHeight;\n\tuniform float uSlideWidth;\n\n\tvarying vec2 vTextureCoord;\n\tvarying vec3 vNormal;\n\n\tconst float DELAY_ANGLE = 5.0;\n\tconst float SLIDE_WIDTH_KOEF = 0.2;\n\tconst float PI = 3.14159265358979323846264;\n\tconst vec2 CENTER = vec2(0.0, 0.0);\n\tconst float DELTA_W = 0.5;\n\tconst float DELTA_H = 0.5;\n\n\tfloat linearInterpolation(float x, float x0, float fx0, float x1, float fx1)\n\t{\n\t\treturn mix(fx0, fx1, (x - x0) / (x1 - x0));\n\t}\n\n\tvec2 ellipse(float angle, vec2 center, vec2 radius)\n\t{\n\t\tfloat ang = radians(angle);\n\t\treturn vec2((center.x + radius.x * cos(ang)), -(center.y + radius.y * sin(ang)));\n\t}\n\n\tfloat accelerationFunc(float progress)\n\t{\n\t\tfloat a = 3.0;\n\t\tfloat b = 1.0;\n\t\tfloat c = 1.0;\n\t\tfloat d = 1.0;\n\n\t\tfloat squaredProgress = progress * progress;\n\t\treturn a * squaredProgress * progress + b * squaredProgress + c * progress + d;\n\t}\n\n\tfloat getRowAngleByPhase(vec3 vertex)\n\t{\n\t\tfloat endAngle = atan(uSlideHeight * 0.5 / max(uSlideWidth, uSlideHeight)) * 180.0 / PI + 90.0 + DELAY_ANGLE * 4.0;\n\n\t\tfloat a = -0.6;\n\t\tfloat b = 2.0 + a;\n\n\t\tfloat phase = linearInterpolation(uPhase, 0.0, a, 1.0, b);\n\t\tphase = accelerationFunc(phase);\n\n\t\tfloat angle = linearInterpolation(phase, accelerationFunc(a), 0.0, accelerationFunc(b), endAngle);\n\t\tfloat rowDelayAngle = linearInterpolation(vertex.y, 0.0, DELAY_ANGLE, uSlideHeight, 0.0);\n\t\tfloat extraAngle = linearInterpolation(uPhase, 0.5, 0.0, 0.8, DELAY_ANGLE);\n\t\tfloat maxDelayAngle = DELAY_ANGLE + max(0.0, min(DELAY_ANGLE, extraAngle));\n\t\tfloat colAngle = uDirectionIsLeft\n\t\t\t? linearInterpolation(vertex.x, 0.0, maxDelayAngle * 0.5, uSlideWidth, maxDelayAngle)\n\t\t\t: linearInterpolation(vertex.x, 0.0, maxDelayAngle, uSlideWidth, maxDelayAngle * 0.5);\n\n\t\tfloat colDelayAngle = uDirectionIsLeft\n\t\t\t? linearInterpolation(vertex.x, 0.0, 0.0, uSlideWidth, colAngle)\n\t\t\t: linearInterpolation(vertex.x, 0.0, colAngle, uSlideWidth, 0.0);\n\n\n\t\treturn max(0.0, angle - rowDelayAngle - colDelayAngle);\n\t}\n\n\tvec3 getVertexPosition(vec3 vertex)\n\t{\n\t\tfloat maxXRadius = uSlideHeight;\n\t\tfloat maxYRadius = sqrt(uSlideWidth * SLIDE_WIDTH_KOEF * uSlideWidth * SLIDE_WIDTH_KOEF + uSlideHeight * uSlideHeight);\n\n\t\tfloat xRadius = linearInterpolation(vertex.y, 0.0, maxXRadius, uSlideHeight, 0.0);\n\t\tfloat yRadius = linearInterpolation(vertex.y, 0.0, maxYRadius, uSlideHeight, 0.0);\n\n\t\treturn vec3(vertex.x, ellipse(getRowAngleByPhase(vertex), CENTER, vec2(xRadius, yRadius)));\n\t}\n\n\tvec3 getVertexNormal(vec3 pos, vec3 p)\n\t{\n\t\tbool rightSideXPos = pos.x == uSlideWidth;\n\t\tfloat deltaWidth = rightSideXPos ? -DELTA_W : DELTA_W;\n\n\t\tvec3 right = getVertexPosition(vec3(pos.x + deltaWidth, pos.y, pos.z));\n\t\tvec3 down = getVertexPosition(vec3(pos.x, pos.y + DELTA_H, pos.z));\n\n\t\tvec3 v1 = right - p;\n\t\tvec3 v2 = down - p;\n\n\t\tvec3 n = rightSideXPos ? cross(v1, v2) : cross(v2, v1);\n\t\tn = normalize(n);\n\n\t\treturn n;\n\t}\n\n\tvoid main(void)\n\t{\n\t\tvTextureCoord = aTextureCoord;\n\n\t\tvec3 vertex = vec3(aVertexPosition.x, -aVertexPosition.y, aVertexPosition.z);\n\t\tvec4 p = vec4(getVertexPosition(vertex), 1.0);\n\t\tgl_Position = uPMVMatrix * p;\n\n\t\tvec3 pNormal = getVertexNormal(vertex, vec3(p.xyz));\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\t}"}; +k.Ha=function(a){this.N.uniform1f(this.jg,a);Mv(this,this.$f,this.N.TRIANGLE_STRIP)};k.Vh=function(){Nv(this);this.We=Pv(this,"uSampler");this.jg=Pv(this,"uPhase");const a=Pv(this,"uDirectionIsLeft"),b=Pv(this,"uSlideWidth");this.N.uniform1f(Pv(this,"uSlideHeight"),this.slideHeight());this.N.uniform1f(b,this.slideWidth());this.N.uniform1i(a,0==this.O?1:0)};k.Lh=function(){};k.Kh=function(){Fv(this,this.$f)}; +k.Bd=function(){var a=this.slideWidth();const b=this.slideHeight();this.Zf=Dx(15,15,a,b);this.xe=Fx(15,15);this.$f=new Vv;a=Hv(this,hw(this.Zf),3);this.$f.kg=a;a=Hv(this,iw(this.Zf),2);this.$f.rg=a;a=Iv(this,this.xe);this.$f.Sf=a};k.yj=function(){return this.We};function Yx(a,b){R.call(this,a);this.O=b;this.Ma(!1,!1,!0,!0,!0,!0)}t(Yx,R);k=Yx.prototype; +k.initialize=function(){uv(this,!1);vv(this,!1);const a=this.slideWidth(),b=this.slideHeight();var c=S(a,b);F(c,"position","absolute");this.va().appendChild(c);c.getContext("2d").drawImage(this.hF,0,0);this.Cs=c;c=S(a,b);F(c,"position","absolute");this.va().appendChild(c);c.getContext("2d").drawImage(this.nF,0,0);this.Fs=c;this.Ne=this.nc(a,b);this.va().appendChild(this.Ne);var d=S(a,b);c=S(a,b);this.DG=this.nc(a,b);this.mh=this.nc(a,b);this.lh=this.nc(a,b);this.mh.appendChild(d);this.lh.appendChild(c); +this.Ne.appendChild(this.DG);this.DG.appendChild(this.mh);this.DG.appendChild(this.lh);d=d.getContext("2d");c=c.getContext("2d");d.drawImage(this.Up,0,0);c.drawImage(this.Cn,0,0);Di(this.Ne,Math.max(a,b)+"px");Ei(this.Ne,a/2+"px "+b/2+"px");Ci(this.DG,"preserve-3d")}; +k.Ha=function(a){const b=this.slideWidth(),c=this.slideHeight();H(this.Fs,1-a);H(this.Cs,a);a=ow(0,1,a);const d=this.O==Zx?1:-1,e=d*this.W1*b*(1-a),f=-this.X1*c*(1-a),g=-Math.max(b,c)*(1-a),h=-this.aS*(1-a),l=-d*this.bS*(1-a),n=d*this.Y1*(1-a);xi(this.mh,"translateZ("+Math.max(b,c)*a+"px) translateY("+c*a+"px) translateX("+-d*this.Z1*b*a+"px) rotateX("+this.aS*a+"deg) rotateY("+d*this.bS*a+"deg) rotateZ("+-d*this.a2*a+"deg)");xi(this.lh,"translateZ("+g+"px) translateY("+f+"px) translateX("+e+"px) rotateX("+ +h+"deg) rotateY("+l+"deg) rotateZ("+n+"deg)")};k.nc=function(a,b){const c=zd("DIV");Oh(c,a);Ph(c,b);F(c,"position","absolute");return c};k.Z1=.1;k.W1=.5;k.X1=1.75;k.Y1=30;k.a2=10;k.aS=80;k.bS=30;var Zx=1;function $x(a){R.call(this,a);this.$e=!1;this.Ma(!0,!0)}t($x,R);$x.prototype.initialize=function(){this.zG=!1;uv(this,!1);vv(this,!1);const a=this.slideWidth(),b=this.slideHeight(),c=this.mb,d=this.Da;F(c,"position","absolute");F(d,"position","absolute");var e=this.va(),f=this.na()?d:c;e.appendChild(f);e=this.va();f=this.na()?c:d;e.appendChild(f);this.gA=S(a,b);e=this.gA.getContext("2d");this.yV=S(a,b);this.yV.getContext("2d").drawImage(c,0,0);e.drawImage(d,0,0)}; +$x.prototype.Ha=function(a){const b=this.mb,c=this.Da;.2>a?(!this.zG&&this.na()&&(this.zG=!0,Fd(b)),ay(this,c,this.gA,a/.2)):(this.zG||this.na()||(this.zG=!0,Fd(c)),ay(this,b,this.yV,(1-a)/.8))};function ay(a,b,c,d){b=b.getContext("2d");const e=a.slideWidth();a=a.slideHeight();b.drawImage(c,0,0,e,a);b.save();b.globalCompositeOperation="lighter";b.fillStyle="rgba(255, 255, 255,"+zn(d)+")";b.rect(0,0,e,a);b.fill();b.restore()};function by(a,b,c){R.call(this,a);this.xc=c;this.na()?this.hb().xg():this.qc().xg();this.Ma(!0,!0);this.O=b}t(by,R);by.prototype.initialize=function(){uv(this,!1);vv(this,!1);this.vn()}; +by.prototype.Ha=function(a){a=ow(0,1,a);let b;if(this.xc){var c=-this.slideWidth()/2;.5>a?(b=Y(0,0,.5,-90),this.Py=b(a),b=Y(0,0,.5,-45),this.Yr=b(a),b=Y(0,0,.5,40),a=this.O==cy?"translateX("+-c+"px) translateZ("+this.Py+"px) rotateY("+this.Yr+"deg) rotateX("+b(a)+"deg) translateX("+c+"px)":"translateX("+c+"px) translateZ("+this.Py+"px) rotateY("+-this.Yr+"deg) rotateX("+b(a)+"deg) translateX("+-c+"px)"):.85>a?(b=Y(.5,-90,.85,0),this.Py=b(a),b=Y(.5,-45,.85,0),this.Yr=b(a),b=Y(.5,40,.85,90),a=this.O== +cy?"translateX("+-c+"px) translateZ("+this.Py+"px) rotateY("+this.Yr+"deg) rotateX("+b(a)+"deg) translateX("+c+"px)":"translateX("+c+"px) translateZ("+this.Py+"px) rotateY("+-this.Yr+"deg) rotateX("+b(a)+"deg) translateX("+-c+"px)"):(this.na()&&(this.Yr=0),b=Y(.85,90,1,180),a="translateX("+-c+"px) rotateY("+this.Yr+"deg) rotateX("+b(a)+"deg) translateX("+c+"px)");xi(this.we,a)}else.5>a?(b=Y(0,1,.5,0),a="scaleY("+b(a)+")",H(this.Lc,1),H(this.Kc,0),xi(this.Lc,a)):(b=Y(.5,0,1,1),a="scaleY("+b(a)+")", +H(this.Kc,1),H(this.Lc,0),xi(this.Kc,a))}; +by.prototype.vn=function(){this.Lc=this.Da;this.Kc=this.mb;const a=wd("DIV");this.we=wd("DIV");const b=this.slideWidth(),c=this.slideHeight();try{Di(a,b+"px"),Ei(a,b/2+"px "+c/2+"px"),Ci(this.we,"preserve-3d"),this.we.appendChild(this.Lc),this.we.appendChild(this.Kc),a.appendChild(this.we),this.va().appendChild(a)}catch(d){this.va().appendChild(this.Lc),this.va().appendChild(this.Kc)}F(this.Lc,"position","absolute");F(this.Kc,"position","absolute");Nh(this.we,b,c);Nh(this.Lc,b,c);Nh(this.Kc,b,c); +this.xc&&(xi(this.Lc,"translateZ(10px)"),xi(this.Kc,"rotateX(180deg)"))};var cy=1;function dy(a,b,c){R.call(this,a);this.xc=c;this.na()?this.hb().xg():this.qc().xg();this.Ma(!0,!0);this.Vn=b==cy}t(dy,R); +dy.prototype.initialize=function(){uv(this,!1);vv(this,!1);this.Lc=this.Da;this.Kc=this.mb;const a=wd("DIV");this.we=wd("DIV");const b=this.slideWidth(),c=this.slideHeight();try{Di(a,Math.max(b,c)+"px"),Ei(a,b/2+"px "+c/2+"px"),Ci(this.we,"preserve-3d"),Fi(this.we,"hidden"),this.Vn?(this.we.appendChild(this.Lc),this.we.appendChild(this.Kc)):(this.we.appendChild(this.Kc),this.we.appendChild(this.Lc)),a.appendChild(this.we),this.va().appendChild(a)}catch(d){this.Vn?(this.we.appendChild(this.Lc),this.we.appendChild(this.Kc)): +(this.we.appendChild(this.Kc),this.we.appendChild(this.Lc))}F(this.Lc,"position","absolute");F(this.Kc,"position","absolute");Nh(this.we,b,c);Nh(this.Lc,b,c);Nh(this.Kc,b,c);this.xc&&(this.Vn?xi(this.Lc,"rotateY(180deg)"):xi(this.Kc,"rotateY(180deg)"))};dy.prototype.Ha=function(a){this.xc?this.JN(a):this.NK(a)}; +dy.prototype.JN=function(a){a=this.Vn?1-a:a;const b=.25*(1-Math.cos(2*a*Math.PI));a=Cw(.63,.43)(a);const c=Math.max(this.slideWidth(),this.slideHeight());xi(this.we,"rotateY("+-180*a+"deg)translateZ("+b*c*-.3+"px)")};dy.prototype.NK=function(a){a=Cw(.63,.43)(a);if(.5>a){var b=Y(0,1,.5,0);a="scaleX("+b(a)+")";H(this.Lc,1);H(this.Kc,0);xi(this.Lc,a)}else b=Y(.5,0,1,1),a="scaleX("+b(a)+")",H(this.Kc,1),H(this.Lc,0),xi(this.Kc,a)};function ey(a){R.call(this,a);this.Ma(!1,!0)}t(ey,zv);k=ey.prototype;k.yj=function(){return this.We}; +k.initialize=function(){uv(this,!1);vv(this,!0);Cv(this,this.Da);this.N.disable(this.N.DEPTH_TEST);var a=[new V(.1806930693069307,0),new V(.3725247524752475,0),new V(.4603960396039604,0),new V(.6856435643564357,0),new V(.7673267326732673,0),new V(.8849009900990099,0),new V(.9987623762376238,.02103960396039604),new V(0,.027227722772277228),new V(0,.15841584158415842),new V(.47,.16955445544554457),new V(.4876237623762376,.16955445544554457),new V(.5284653465346535,.17202970297029702),new V(.41707920792079206, +.1745049504950495),new V(1,.18316831683168316),new V(0,.19554455445544555),new V(.6076732673267327,.2042079207920792),new V(.32,.21658415841584158),new V(.6485148514851485,.2202970297029703),new V(.7141089108910891,.22153465346534654),new V(0,.2623762376237624),new V(.275990099009901,.2908415841584158),new V(.2524752475247525,.33292079207920794),new V(.22153465346534654,.38242574257425743),new V(.8081683168316832,.41336633663366334),new V(0,.44183168316831684),new V(.18935643564356436,.46410891089108913), +new V(.4752475247524752,.47029702970297027),new V(.4665841584158416,.4715346534653465),new V(.4938118811881188,.4814356435643564),new V(.5024752475247525,.48267326732673266),new V(.5099009900990099,.4863861386138614),new V(.5123762376237624,.49133663366336633),new V(.801980198019802,.4938118811881188),new V(.5148514851485149,.49876237623762376),new V(.47896039603960394,.5),new V(.47,.5),new V(.5,.5),new V(.5148514851485149,.5012376237623762),new V(.4801980198019802,.5061881188118812),new V(.5136138613861386, +.5099009900990099),new V(.48267326732673266,.5123762376237624),new V(.5099009900990099,.5136138613861386),new V(.48514851485148514,.5148514851485149),new V(.504950495049505,.5160891089108911),new V(.48886138613861385,.5185643564356436),new V(.4938118811881188,.5185643564356436),new V(.4975247524752475,.5185643564356436),new V(.5334158415841584,.5334158415841584),new V(1,.5346534653465347),new V(.4962871287128713,.5371287128712872),new V(.47648514851485146,.5396039603960396),new V(.18811881188118812, +.568069306930693),new V(0,.6485148514851485),new V(.2537128712871287,.6534653465346535),new V(.7982673267326733,.6670792079207921),new V(.28589108910891087,.7066831683168316),new V(.775,.7351485148514851),new V(1,.7784653465346535),new V(.3341584158415842,.7945544554455446),new V(.7066831683168316,.8032178217821783),new V(0,.8106435643564357),new V(.38985148514851486,.8477722772277227),new V(.47,.8564356435643564),new V(.6150990099009901,.8601485148514851),new V(1,.943069306930693),new V(0,.9826732673267327), +new V(.21905940594059406,1),new V(.34034653465346537,1),new V(.4752475247524752,1),new V(.6596534653465347,1),new V(.8403465346534653,1),new V(0,0),new V(1,0),new V(1,1),new V(0,1)],b=new fw,c=new W(0,0,1);for(var d=0;d=1-this.yu&&(b=!1,xi(this.Dc,"translateZ("+this.WR*(1-a)+"px) rotateY("+(1-a)/this.yu*c*this.ZR+"deg)"),this.QE||this.na()||(this.QE=this.Ev=!0));if(b||this.Ev)b=this.slideWidth()+this.cS,a=this.Ev?this.na()?0:1:(a-this.yu)/(1-2*this.yu),this.Ev&&(this.Ev=!1),a=a*c*b,xi(this.Mg, +"translateX("+a+"px)"),this.Tn&&xi(this.Kv,"translate("+a+"px, "+(this.slideHeight()+this.iy)+"px)"),xi(this.Kg,"translateX("+(a-c*b)+"px)"),this.Tn&&xi(this.Gv,"translate("+(a-c*b)+"px, "+(this.slideHeight()+this.iy)+"px)")}};k.nc=function(a,b){const c=zd("DIV");Oh(c,a);Ph(c,b);F(c,"position","absolute");return c}; +function iy(a,b,c){b=b.getContext("2d");b.save();b.translate(0,a.slideHeight()/4);b.scale(1,-1);b.drawImage(c,0,.75*a.slideHeight(),a.slideWidth(),a.slideHeight()/4,0,0,a.slideWidth(),a.slideHeight()/4);b.restore();b.globalCompositeOperation="destination-out";c=b.createLinearGradient(a.slideWidth()/4,0,a.slideWidth()/4,a.slideHeight()/4);c.addColorStop(0,"rgba(0, 255, 0, 0)");c.addColorStop(.8,"rgba(0, 255, 0, 1)");b.fillStyle=c;b.beginPath();b.rect(0,0,a.slideWidth(),a.slideHeight()/4);b.fill()} +k.Ev=!1;k.QE=!1;k.iy=7.5;k.yu=.3;k.ZR=20;k.YR=20;k.WR=-100;k.cS=70;var jy=0,ky=1;function ly(a,b,c){R.call(this,a);this.Ga=b;this.O=c;this.Ma(!0,!0)}t(ly,R); +ly.prototype.initialize=function(){uv(this,!1);vv(this,!1);if(this.na())switch(this.O){case my:this.O=ny;break;case ny:this.O=my;break;case oy:this.O=py;break;default:this.O=oy}const a=this.na()?this.mb:this.Da,b=this.na()?this.Da:this.mb;this.Ga==qy?(this.lH=16,this.sP=8):(this.lH=16,this.sP=12);this.M9=2*this.sP+1;const c=this.slideWidth()/this.lH,d=c/2,e=this.slideHeight()/this.sP,f=e/2;this.hi=this.O==oy||this.O==py?this.slideWidth():this.slideHeight();this.qt=2*this.hi;this.fn=[];let g;const h= +-f;let l;for(let n=0;nthis.$R&&(f.DL=!0)}};function ry(a,b,c){b=S(b,c);F(b,"position","absolute");a.va().appendChild(b);return b} +function ty(a,b,c,d,e,f){b=b.getContext("2d");b.save();b.fillStyle="#FFFFFF";dh&&(yy(a,b,c,d),b.globalCompositeOperation="destination-in");b.beginPath();const g=Math.round(.5*e),h=Math.round(.5*f);e=Math.round(e);f=Math.round(f);b.moveTo(g,-1);b.lineTo(e+1,h);b.lineTo(g,f+1);b.lineTo(-1,h);b.lineTo(g,-1);b.fill();dh||(b.globalCompositeOperation="source-in",yy(a,b,c,d));b.restore()} +function uy(a,b,c,d,e,f){b=b.getContext("2d");b.save();b.fillStyle="#FFFFFF";dh&&(yy(a,b,c,d),b.globalCompositeOperation="destination-in");const g=Math.round(.5*e)+.5;e=Math.round(e)+.5;const h=Math.round(f)+.5;b.beginPath();b.moveTo(g,-1);b.lineTo(e,Math.round(.25*f)-1);b.lineTo(e,Math.round(.75*f)+1);b.lineTo(g,h);b.lineTo(-1,Math.round(.75*f)+1);b.lineTo(-1,Math.round(.25*f)-1);b.lineTo(g,1);b.fill();dh||(b.globalCompositeOperation="source-in",yy(a,b,c,d));b.restore()} +function yy(a,b,c,d){c=Math.round(c);d=Math.round(d);b.drawImage(a,-c,-d)}function xy(a,b,c){switch(a.O){case my:return b.Rb>=c?b.Rb-c:0;case ny:return b.Rb<=c?c-b.Rb:0;case oy:return b.Qb>=c?b.Qb-c:0}return b.Qb<=c?c-b.Qb:0}ly.prototype.$R=.3;ly.prototype.ZI=.7;var qy=0,my=0,ny=1,oy=2,py=3;function sy(){}k=sy.prototype;k.Qb=0;k.Rb=0;k.IU=!0;k.JU=!0;k.Mf=0;k.hv=!0;k.rB=0;k.DL=!1;k.ME=!1;k.oj=function(a){this.Qb=a;this.Dg()};k.Cg=function(a){this.Rb=a;this.Dg()}; +function vy(a,b){a.IU=b;null!=a.gB&&H(a.gB,b?1:0);b&&a.Dg()}function wy(a,b){a.JU=b;null!=a.tw&&H(a.tw,b?1:0);b&&a.Dg()}k.Dg=function(){null!=this.gB&&this.IU&&Gh(this.gB,this.Qb,this.Rb);null!=this.tw&&this.JU&&Gh(this.tw,this.Qb,this.Rb)};function zy(a){R.call(this,a);this.Ma(!0,!0)}t(zy,R);zy.prototype.initialize=function(){uv(this,!1);vv(this,!1);this.nL();this.vn()}; +zy.prototype.vn=function(){const a=this.slideWidth(),b=this.slideHeight();this.Ul=S(a,b);this.mM=this.Ul.getContext("2d");this.iU=S(a,b);this.jU=this.iU.getContext("2d");this.dV=S(a,b);this.Av=this.dV.getContext("2d");this.XY=S(a,b);this.J8=this.XY.getContext("2d");this.pF=S(a,b);this.wM=this.pF.getContext("2d");this.gU=S(a,b);this.hU=this.gU.getContext("2d");this.Jc=S(a,b);this.Vf=this.Jc.getContext("2d");this.WY=S(a,b);this.I8=this.WY.getContext("2d");this.va().appendChild(this.Ul);this.va().appendChild(this.pF); +F(this.Ul,"position","absolute");F(this.pF,"position","absolute")}; +zy.prototype.Ha=function(a){var b=this.slideWidth();const c=this.slideHeight();this.mM.clearRect(0,0,b,c);this.wM.clearRect(0,0,b,c);this.Vf.clearRect(0,0,b,c);this.hU.clearRect(0,0,b,c);this.Vf.drawImage(this.Da,0,0);this.Vf.save();this.Vf.globalCompositeOperation="destination-in";Ay(this,this.hU,this.CS,a);this.Vf.drawImage(this.gU,0,0);this.Vf.restore();By(this,this.I8,this.Da,a/Cy,!1);this.wM.drawImage(this.Jc,0,0);this.wM.drawImage(this.WY,0,0);if(a>Dy&&a<1-Dy){var d=Y(Dy,1,1-Dy,4),e=Y(Dy,0, +1-Dy,-30);xi(this.pF,"rotate("+e(a)+"deg) scale("+d(a)+", "+d(a)+")")}a>Ey&&(this.Av.clearRect(0,0,b,c),this.jU.clearRect(0,0,b,c),this.Av.drawImage(this.mb,0,0),this.Av.save(),this.Av.globalCompositeOperation="destination-in",Ay(this,this.jU,this.DS,a),this.Av.drawImage(this.iU,0,0),this.Av.restore(),this.mM.drawImage(this.dV,0,0),a=e.QI&&d<=e.QI+.05){var g=(d-e.QI)/.05;f=e.OP?1-g:g}else f=d{b.push(new Qy(e.element,e.id))},this);u(this.uw,e=>{b.push(new Qy(e.element,e.id))},this);const c=[0,.005,.01,.015,.02,.025,.03,.035,.04,.045,.05,.1,.15,.2,.25,.3,.35,.4,.45,.46,.47,.48,.49,.495,.498,.499];u(c,function(e){const f=this.wo(e);u(b,g=>{const h=f[g.id];h.Bg(e);g.ur.push(h)},this)},this);Ja(c,function(e){e=1-e;const f=this.wo(e);u(b,g=>{const h=f[g.id];h.Bg(e);g.ur.push(h)},this)},this);this.Mu=0;this.NO=b.length;let d="";u(b,function(e){d+=Ry(e); +const f=e.element;f?(f.style.animation=e.id+" "+a+"s 1 linear",f.firstElementChild&&(f.firstElementChild.style.animation=e.id+"_ "+a+"s 1 linear"),ve(f,ge,this.wk,!1,this)):this.wk()},this);this.Qf=gn(d)};k.update=function(a){this.A4!=a&&this.wo(a);this.A4=a};k.wk=function(){this.Mu++;this.Mu==this.NO&&this.ge.C()}; +function Ry(a){let b="@keyframes "+a.id+" {\n";u(a.ur,d=>{b+=d.MQ+" {transform: "+d.transform+";opacity:"+d.opacity+";z-index:"+d.zIndex+"}\n"});b+="}\n";let c="";a.ur[0].cC&&(c="@keyframes "+a.id+"_ {\n",u(a.ur,d=>{c+=d.MQ+" {transform:"+d.cC+"}\n"}),c+="}\n");return b+c} +k.wo=function(a){const b=this.lo[0];let c=this.X7*a+1;c*=b.PC;let d=this.Z7*a+1;d*=b.QC;const e=Math.round(this.O9*a)+this.N9;let f=this.R7*a;f+=b.rotation;const g=this.Y7*a+1,h=this.a8*a+1;if(this.om)var l=new Vf((this.Vy.top-this.om.top)*a+this.om.top,(this.Vy.right-this.om.right)*a+this.om.right,(this.Vy.bottom-this.om.bottom)*a+this.om.bottom,(this.Vy.left-this.om.left)*a+this.om.left);const n={};u(this.lo,function(m){if(this.sS)var p=1;else p=1-Math.pow(a,2),.425>a&&(p=a*(1-Math.pow(.425,2)- +1)/.425+1);let r=!0,v=l;this.bU&&(this.h3?(v=this.om,r=!1):v=void 0);p=Sy(m,c,d,f,g,h,this.cY*a,this.j_*a,this.k_*a,p,e,v,Ty(this,m,a,!1),r);Uy(this,p);n[m.id]=p},this);u(this.uw,function(m,p){p=Math.min(this.lo.length-1,p);p=this.lo[p];const r=Vy(-p.dx,-p.dy,f,c,d),v=Vy(-m.dx,-m.dy,f,c,d);if(this.sS)var y=a;else y=1+Math.pow(a-1,3),.425Math.PI?a-=2*Math.PI:a<-Math.PI&&(a+=2*Math.PI);return a==Math.PI||a==-Math.PI?-a:a} +function Ty(a,b,c,d){var e="13"==b.g1;if(!a.xc||e){var f=e=1;"bg"==b.type&&(c=d?2*(c-.5):2*(.5-c),a.Jp!=a.rE&&(e=c),a.Fq!=a.ZG&&(f=c));a="scaleX("+e+") scaleY("+f+")"}else e=a.Jp!=a.rE,f=a.Fq!=a.ZG,"bg"!=b.type||!e&&!f?a="":f&&!e?a="rotateX("+(a.Fq&&!a.ZG?-1:1)*c*180+"deg)"+(d?" scaleY(-1)":""):e&&!f?a="rotateY("+(a.Jp&&!a.rE?1:-1)*c*180+"deg)"+(d?" scaleX(-1)":""):a.Jp&&!a.Fq||!a.Jp&&a.Fq?(b=ow(0,1,c),a="rotateX("+-90*ow(0,1,.5>c?2*b:2*(1-b))+"deg) rotateZ("+180*(a.Jp&&!a.Fq?1:!a.Jp&&a.Fq?-1:1)* +b+"deg)"+(d?" scaleX(-1) scaleY(-1) ":"")):(b=ow(0,1,c),a="rotateX("+90*ow(0,1,.5>c?2*b:2*(1-b))+"deg) rotateZ("+180*(a.ZG&&a.rE?1:a.Fq&&a.Jp?-1:1)*b+"deg)"+(d?" scaleX(-1) scaleY(-1) ":""));return a} +function Sy(a,b,c,d,e,f,g,h,l,n,m,p,r,v){var y=new gm;y.translate(a.Xca,a.Yca);y.rotate(d,0,0);y.scale(b,c);(b=a.qj)&&(y=hm(y,b));(b=a.nk)&&(y=hm(b.clone(),y));b=new gm;b.rotate(-a.fca,0,0);b.translate(a.dx,a.dy);b=hm(b,a.qj);hm(b,im(y));c=im(b);e="rotate("+g+"rad) "+r+(" scaleX("+e+") scaleY("+f+")");h=jm(h,l);l=rn(h)+" "+rn(c)+" "+e+" "+rn(b)+" "+rn(y);h=new Ly(a.element);h.transform=l;""!=a.opacity&&(n*=a.opacity);h.opacity=n;h.zIndex=m;p?(n=(1-a.ne.right-a.ne.left)/(1-p.right-p.left),m=(1-a.ne.top- +a.ne.bottom)/(1-p.top-p.bottom),h.cC=a.SH+" translate("+-(a.ul?p.right:p.left)*a.t$*n+"px, "+-(a.Fl?p.bottom:p.top)*a.s$*m+"px) scale("+n+", "+m+")"):v&&(h.cC=a.SH);return h}function Vy(a,b,c,d,e){const f=new Dq(a,b);f.rotate(c);f.scale(d,e);f.zi(new Dq(a,b));return f}function Qy(a,b){this.element=a;this.id=b;this.ur=[]};function Wy(a,b){this.g5=a;this.h5=b;this.x3=Zc(Xf(a.Xa),Xf(b.Xa));a=a.kx;b=b.kx;let c;c=a.line!=b.line?1:0;c+=a.fill!=b.fill?1:0;c+=a.Nt!=b.Nt?1:0;c+=a.Zt!=b.Zt?1:0;c+=a.ku!=b.ku?1:0;c+=a.pu!=b.pu?1:0;this.v3=c+=a.qu!=b.qu?2:0}Wy.prototype.Q_=function(){return this.x3};Wy.prototype.JH=function(){return 1E3*this.v3+this.Q_()/1E3};function Xy(a,b){if(a instanceof Xy)this.wg=a.Sc();else{var c;if(c=ka(a))a:{for(var d=c=0;d=Math.abs(this.wg[b][c]-a.wg[b][c])))return!1;return!0};k.c0=function(){if(this.Ld.width!=this.Ld.height)throw Error("A determinant can only be take on a square matrix");return az(this)};k.tl=function(){return this.Ld};function bz(a,b,c){return 0<=b&&b=b?f+1:f])},a);return c}function dz(a,b){var c=new Xy(a.Ld.height,b.tl().width);Zy(c,function(d,e,f){for(var g=d=0;g{b.forEach(g=>{cz(e.Nu,f.index(),g.index(),c(f,g))})});iz(this)}function iz(a){const b=a.Nu.tl().width+1,c=[];for(let d=0;da.nM.size())for(f= +1;f<=a.xM.size()-a.nM.size();f++)if(d+1==f+a.nM.size()){d=-1;break}b.push(d)}return b}function kz(a,b){const c=[];for(let d=0;d>16&255,a>>8&255,a&255]};function nz(a,b,c){this.tM=a.content();this.kM=a.content();this.links=[];this.eF=[];this.dF=[];a=oz(this,this.kM,c);b=oz(this,this.tM,b);const d={},e={};u(a,g=>{const h=g.type;d[h]=!0;e[h]?e[h].push(g):e[h]=[g]});const f={};u(b,g=>{const h=g.type;d[h]=!0;f[h]?f[h].push(g):f[h]=[g]});this.D0=[];this.H0=[];this.C0=[];this.G0=[];u(kc(d),g=>{pz(this,f[g]||[],e[g]||[])},this)} +nz.prototype.O3=function(a,b){a=a.object();b=b.object();const c=new Wy(a,b),d=qz(a,b),e=c.g5.rotation!=c.h5.rotation;c.JH()||e||!d||(this.dF.push(rz(a,b,!1)),this.dF.push(rz(a,b,!0)));d||(this.eF.push(rz(a,b,!1)),this.eF.push(rz(a,b,!0)));return d?c.JH():1E13};function rz(a,b,c){return c?ma(b)+"_"+ma(a):ma(a)+"_"+ma(b)} +function pz(a,b,c){function d(m){const p=new gz;for(let r=0;r{sz(a, +a.H0,a.tM,m)},a);u(c,m=>{sz(a,a.D0,a.kM,m)},a);u(h,m=>{sz(a,a.G0,a.tM,m)},a);u(l,m=>{sz(a,a.C0,a.kM,m)},a)}function oz(a,b,c){return Ka(c,d=>{const e=d.Nc;if(e)return"none"!=b.querySelector(`#${e.id}`).style.display;d=d.Dl||[];return d.length?"none"!=b.querySelector(`#${d[0].id}`).style.display:!0},a)}function sz(a,b,c,d){const e=d.Nc;e&&tz(b,c,e.id);u(d.Dl,f=>{tz(b,c,f.id)},a)}function tz(a,b,c){(b=b.querySelector("#"+c))&&"none"!=b.style.display&&a.push(b)} +function qz(a,b){if(a.type!=b.type||a.text!=b.text)return!1;if("6"==a.type){if(a.Qq.length!=b.Qq.length)return!1;for(let c=0;cuz(d.mj,e.mj)}return!0}return a.mj&&b.mj?.0325>uz(a.mj,b.mj):!0} +function uz(a,b){const c=a.length,d=[0,0,0];for(let e=0;e{g.Nc&&b(g.Nc.id,c,g.zIndex, +this.RB);u(g.Dl,h=>{b(h.id,c,g.zIndex,this.RB)},this)},this);u(a,g=>{g.Nc&&b(g.Nc.id,d,g.zIndex,this.RB);u(g.Dl,h=>{b(h.id,d,g.zIndex,this.RB)},this)},this);this.MB=[];u(f.links,g=>{g=new My(this.dE,c,d,g[0],g[1],this.Rt(),this.slideWidth(),this.slideHeight());g.ge.addHandler(this.wk,this);this.MB.push(g)},this);this.En=this.hb().background().firstChild;this.Jv()&&F(this.En,"top",0);this.qc().background().appendChild(this.En);this.Gs=f.H0;this.vM=f.G0;this.Ds=f.D0;this.lM=f.C0;this.Mu=0;this.NO=this.MB.length+ +this.Ds.length+this.Gs.length+1;this.Rt()&&this.rL()}t(vz,R);k=vz.prototype; +k.rL=function(){const a=this.dE;this.Qf=gn("@keyframes newSlideBackground {0% {opacity:0} 100% {opacity:1}} @keyframes oldSlideObjects {0% {opacity:1} 50% {opacity:0} 100% {opacity:0}} @keyframes newSlideObjects {0% {opacity:0} 50% {opacity:0} 100% {opacity:1}}");this.En.style.animation="newSlideBackground "+a+"s 1 linear";H(this.En,1);ve(this.En,ge,this.wk,!1,this);u(this.Gs,b=>{b.style.animation="oldSlideObjects "+a+"s 1 linear";H(b,0);ve(b,ge,this.wk,!1,this)},this);u(this.Ds,b=>{b.style.animation= +"newSlideObjects "+a+"s 1 linear";H(b,1);ve(b,ge,this.wk,!1,this)},this);u(this.vM,b=>{H(b,0)},this);u(this.lM,b=>{H(b,1)},this)};k.initialize=function(){vz.Mb.initialize.call(this)};k.wk=function(){this.Mu++;this.Mu==this.NO&&this.ge.C()};k.Rt=function(){const a=Modernizr.atRule("@keyframes");return Ni?!1:Ii?a:!1}; +k.Ha=function(a){if(!this.Rt()){a=this.na()?1-a:a;u(this.MB,d=>{d.update(a)},this);var b=1-Math.min(1,2*a),c=2*Math.max(0,a-.5);u(this.Gs,d=>{d&&H(d,b)},this);u(this.Ds,d=>{d&&H(d,c)},this);u(this.vM,d=>{d&&H(d,0)},this);u(this.lM,d=>{d&&H(d,1)},this);H(this.En,a);1<=a&&this.ge.C();fj&&yn(document.body)}}; +k.CH=function(){vz.Mb.CH.call(this);u(this.Fp,a=>{this.hb().content().firstElementChild.removeChild(a);this.qc().content().firstElementChild.appendChild(a)},this);this.Fp=[];this.Qf&&Fd(this.Qf);De(this.En,ge,this.wk,!1,this);this.Mu=0;u(this.MB,a=>{a.clear()},this);this.En.style.animation="";this.Jv()&&F(this.En,"top","");u(this.Gs,a=>{a.style.animation="";H(a,1);De(a,ge,this.wk,!1,this)},this);u(this.Ds,a=>{a.style.animation="";H(a,1);De(a,ge,this.wk,!1,this)},this);u(this.vM,a=>{H(a,1)},this); +u(this.lM,a=>{H(a,1)},this);u(this.MB,a=>{a.ge.removeHandler(this.wk,this)},this);u(this.RB,a=>{a.style.zIndex=""},this)};function wz(a){R.call(this,a);this.hb().xg()}t(wz,R);wz.prototype.initialize=function(){uv(this,!0);vv(this,!0)};wz.prototype.Ha=function(a){const b=this.hb().slide();var c=this.slideWidth();const d=this.slideHeight(),e="scale("+a+") rotate("+-360*a+"deg)";c=c/2+"px "+d/2+"px";H(b,a);F(b,"MozTransform",e);F(b,"MozTransformOrigin",c);F(b,"webkitTransform",e);F(b,"webkitTransformOrigin",c);F(b,"OTransform",e);F(b,"OTransformOrigin",c);F(b,"msTransform",e);F(b,"msTransformOrigin",c)};function xz(a,b,c){this.a=a;this.b=b;this.c=c}function yz(a,b){var c=-a.b;const d=a.a,e=-c*b.x()-d*b.y();c=zz(a,new xz(c,d,e));a=2*c.x()-b.x();b=2*c.y()-b.y();return new V(a,b)}function zz(a,b){const c=a.a*b.b-b.a*a.b;return 1E-9>Math.abs(c)?null:new V((a.b*b.c-b.b)*a.c/c,(a.c*b.a-b.c*a.a)/c)}function Az(a,b){const c=a.y()-b.y(),d=b.x()-a.x();a=a.x()*b.y()-b.x()*a.y();return new xz(c,d,a)};function Bz(a,b){R.call(this,a);this.O=b;this.Ma(!0,!0)}t(Bz,zv);k=Bz.prototype; +k.initialize=function(){uv(this,!1);vv(this,!0);Cv(this,this.Da);var a=this.slideWidth(),b=-this.slideHeight()/2;a=a/2-.2*a;var c=3*b/4,d=Az(new V(-a,-b),new V(a/2,-b/2)),e=Az(new V(-a/4,-b),new V(0,0)),f=Az(new V(a/2,-b/2),new V(a,b)),g=Az(new V(0,0),new V(a,b/4)),h=zz(d,e),l=zz(f,g);const n=new V(Y(0,.5,a,.8)(l.x()),Y(0,.5,b,1)(l.y())),m=new V(Y(-a,.2,0,.5)(h.x()),Y(-b,0,0,.5)(h.y()));var p=new W(5*a/8,3*-b/8,-(10*c/16));const r=new W(-a/8,-b/2,15*-c/32),v=new W(a/2,b/8,15*-c/32);var y=new W(5* +-a/8,5*-b/16,9*-c/8),D=new W(a/2,b/4,5*-c/6),I=new W(-a/10,b/10,-c),A=new W(4*-a/8,-b/8,3*-c/16),J=new W(-a/16,5*b/8,3*-c/16),T=new W(5*a/16,5*b/8,-c),U=new W(14*-a/32,4*-b/8,0),X=new W(4*a/8,23*b/32,0),aa=new W(5*-a/16,3*-b/16,-c/4),ha=new W(3*a/16,5*b/16,0);e=new W(3*-a/4,3*b/4,0);f=new Cz(new W(a,-b,0),new W(15*a/16,9*-b/16,-c),new V(.8,0));g=new Cz(new W(7*a/8,7*-b/8,0),new W(9*a/12,-b/2,-(46*c/48)),new V(.7625,.0625));d=new Cz(new W(a/2,-b,0),new W(6*a/9,8*-b/12,47*-c/48),new V(.65,0));c=new Cz(new W(a, +-b/2,0),new W(19*a/24,4*-b/9,47*-c/48),new V(.8,.25));var ra=new Cz(new W(a/2,-b/2,0),p,new V(.65,.25));h=new Cz(new W(h.x(),h.y(),0),r,new V(m.x(),m.y()));l=new Cz(new W(l.x(),l.y(),0),v,new V(n.x(),n.y()));p=new Cz(new W(-a/4,-b,0),p,new V(.425,0));D=new Cz(new W(a,b/4,0),D,new V(.8,.625));I=new Cz(new W(0,0,0),I,new V(.5,.5));A=new Cz(new W(-a/2,-b/2,0),A,new V(.35,.25));J=new Cz(new W(a/2,b/2,0),J,new V(.65,.75));y=new Cz(new W(-a,-b,0),y,new V(.2,0));T=new Cz(new W(a,b,0),T,new V(.8,1));U=new Cz(new W(-a, +-b/2,0),U,new V(.2,.25));X=new Cz(new W(a/2,b,0),X,new V(.65,1));aa=new Cz(new W(-a/2,0,0),aa,new V(.35,.5));ha=new Cz(new W(0,b/2,0),ha,new V(.5,.75));b=new Cz(new W(-a,b,0),e,new V(.2,1));this.Ej=[f,f,g,g,d,c,g,g,d,c,ra,ra,d,c,h,l,ra,ra,d,c,h,l,p,D,ra,ra,h,l,I,I,h,l,I,I,A,J,h,l,p,D,y,T,h,l,A,J,y,T,I,I,aa,ha,A,J,A,J,y,T,U,X,A,J,U,X,aa,ha,I,I,aa,ha,b,b,aa,ha,U,X,b,b];if(this.O==Dz){b=[];a=this.slideHeight();a=Az(new V(0,-a/2),new V(0,a/2));for(f=0;f=a?Iz(this,a):.2>=a?(d=Y(.1,.1,.2,1),a=d(a),Lv(this,-60*a,[1,0,0],[0,0,0]),mat4.translate(this.jb,[0,0,20*-a]),this.Lk=Fz(a,this.Ej),Lv(this,-15*c*a,[0,0,1],[0,0,0])):.4>=a?(this.Lk=Fz(1,this.Ej),Lv(this,-60,[1,0,0],[0,0,0]),Lv(this,-15*c,[0,0,1],[0,0,0]),mat4.translate(this.jb,[0,0,-20]),d=Y(.2,0,.4,1),a=Math.pow(d(a),3),mat4.translate(this.jb,[0,0,-a*b/20])):.5>a?(this.Lk=Fz(1,this.Ej), +Lv(this,-60,[1,0,0],[0,0,0]),Lv(this,-15*c,[0,0,1],[0,0,0]),mat4.translate(this.jb,[0,0,-(20+b/20)]),d=Y(.4,0,.5,1),a=d(a),mat4.translate(this.jb,[0,0,-a*b/30]),Jz(a,this.Ej,this.Lk,8)):(this.Lk=Fz(1,this.Ej),Lv(this,-60,[1,0,0],[0,0,0]),Lv(this,-15*c,[0,0,1],[0,0,0]),mat4.translate(this.jb,[0,0,-(20+b/20+b/30)]),d=Y(.5,0,1,1),a=d(a),Jz(a,this.Ej,this.Lk,40),a=ow(0,1,a),mat4.translate(this.jb,[c*a*b,a*b/2,a*b/2]),Lv(this,-30*c*a,[0,0,1],[0,0,0]),Lv(this,-60*c*a,[0,1,0],[0,0,0]));Uv(this);Mv(this, +this.KW,this.N.TRIANGLES,this.AL.bind(this),this.yL.bind(this));Jv(this)};k.AL=function(){this.N.bufferSubData(this.N.ARRAY_BUFFER,0,new Float32Array(hw(this.Lk)))};k.yL=function(){Qv(this.Lk,this.aN);this.N.bufferSubData(this.N.ARRAY_BUFFER,0,new Float32Array(jw(this.Lk)))}; +function Iz(a,b){var c=Y(0,0,.1,.1);a.Lk=Fz(c(b),a.Ej);Lv(a,-60*c(b),[1,0,0],[0,0,0]);c=Y(0,0,.1,1);a.Pz=Fz(c(b),a.RL);a.QA=Fz(c(b),a.NN);Uv(a);Mv(a,a.SU,a.N.TRIANGLES,ta(function(){this.N.bufferSubData(this.N.ARRAY_BUFFER,0,new Float32Array(hw(this.Pz)))},a),ta(function(){Qv(this.Pz,this.QL);this.N.bufferSubData(this.N.ARRAY_BUFFER,0,new Float32Array(jw(this.Pz)))},a));Mv(a,a.YX,a.N.TRIANGLES,ta(function(){this.N.bufferSubData(this.N.ARRAY_BUFFER,0,new Float32Array(hw(this.QA)))},a),ta(function(){Qv(this.QA, +this.MN);this.N.bufferSubData(this.N.ARRAY_BUFFER,0,new Float32Array(jw(this.QA)))},a))} +function Jz(a,b,c,d){void 0===d&&(d=50);const e=[new Kz([0,1],0,0,-5),new Kz([2,3,6,7],0,0,-5),new Kz([4,8,12,18],0,0,-5),new Kz([5,9,13,19],0,0,-5),new Kz([20,14,26,30,42,36],0,0,15),new Kz([15,21,37,43,31,27],0,0,15),new Kz([44,34,52,60,54],0,0,20),new Kz([35,45,55,61,53],0,0,20),new Kz([40,46,56],0,0,30),new Kz([41,47,57],20,20,30),new Kz([58,62,74],20,20,15),new Kz([75,63,59],0,0,15),new Kz([76,70,71,77],0,0,-20)];for(let p=0;p= 0.0 && phase <= CHANGE_PHASE)\n\t\t{\n\t\t\tangle = -ANGLE * (phase + (PHASE_OFFSET_FUNC1(x) * PHASE_FUNC(phase)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tangle = -ANGLE * (phase + PHASE_OFFSET_FUNC1(x));\n\t\t}\n\t\treturn max(angle, -ANGLE);\n\t}\n\n\tvec2 getPosition(float x)\n\t{\n\t\tfloat a = uSlideWidth * 0.5 * C_FUNC1(x);\n\t\tfloat b = a * COEF_1;\n\t\tvec2 center = vec2(uSlideWidth * 0.5, 0.0);\n\t\tfloat angle = getAngleInDoubleLeft(x, uPhase);\n\n\t\tvec2 pos = ellipse(angle, center, vec2(a, b));\n\t\tpos.y = pos.y - (b * C_FUNC1(x) * PHASE_FUNC1(uPhase));\n\t\tpos.y = max(pos.y, 1.0);\n\t\treturn pos;\n\t}\n\n\tvoid main(void)\n\t{\n\t\tvec3 pNormal;\n\t\tfloat x = aVertexPosition.x;\n\t\tif (x <= uSlideWidth * 0.5)\n\t\t{\n\t\t\tgl_Position = uPMVMatrix * vec4(aVertexPosition, 1.0);\n\t\t\tpNormal = vec3(0.0, 0.0, 1.0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvec2 pos = getPosition(x);\n\t\t\tvec3 v = vec3(pos.x, aVertexPosition.y, pos.y);\n\t\t\tgl_Position = uPMVMatrix * vec4(v, 1.0);\n\n\t\t\tfloat nextX = x + uDeltaX;\n\t\t\tvec2 pr = getPosition(nextX);\n\t\t\tpNormal = getNormal(v, pr);\n\t\t}\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\t\tvTextureCoord = aTextureCoord;\n\t}";case 1:return"\n\tfloat C_FUNC2(float x)\n\t{\n\t\treturn linearInterpolation(x, 0.0, 1.0, uSlideWidth * 0.5, 0.0);\n\t}\n\tfloat PHASE_OFFSET_FUNC2(float x)\n\t{\n\t\treturn linearInterpolation(x, 0.0, 0.0, uSlideWidth * 0.5, PHASE_OFFSET);\n\t}\n\n\tfloat getAngleInDoubleRight(float x, float phase)\n\t{\n\t\tfloat angle;\n\t\tif (phase >= 0.0 && phase <= CHANGE_PHASE)\n\t\t{\n\t\t\tangle = ANGLE * (1.0 + phase + (PHASE_OFFSET_FUNC2(x) * PHASE_FUNC(phase)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tangle = ANGLE * (1.0 + phase + PHASE_OFFSET_FUNC2(x));\n\t\t}\n\t\treturn min(angle, ANGLE * 2.0);\n\t}\n\n\tvec2 getPosition(float x)\n\t{\n\t\tfloat a = uSlideWidth * 0.5 * C_FUNC2(x);\n\t\tfloat b = a * COEF_1;\n\t\tvec2 center = vec2(uSlideWidth * 0.5, 0.0);\n\t\tfloat angle = getAngleInDoubleRight(x, uPhase);\n\n\t\tvec2 pos = ellipse(angle, center, vec2(a, b));\n\t\tpos.y = pos.y - (b * C_FUNC2(x) * PHASE_FUNC1(uPhase));\n\t\tpos.y = max(pos.y, 1.0);\n\t\treturn pos;\n\t}\n\n\tvoid main(void)\n\t{\n\t\tvec3 pNormal;\n\t\tfloat x = aVertexPosition.x;\n\t\tif (x >= uSlideWidth * 0.5)\n\t\t{\n\t\t\tgl_Position = uPMVMatrix * vec4(aVertexPosition, 1.0);\n\t\t\tpNormal = vec3(0.0, 0.0, 1.0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvec2 pos = getPosition(x);\n\t\t\tvec3 v = vec3(pos.x, aVertexPosition.y, pos.y);\n\t\t\tgl_Position = uPMVMatrix * vec4(v, 1.0);\n\n\t\t\tfloat nextX = x + uDeltaX;\n\t\t\tvec2 pr = getPosition(nextX);\n\t\t\tpNormal = getNormal(v, pr);\n\t\t}\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\t\tvTextureCoord = aTextureCoord;\n\t}"; +case 2:return"\n\tfloat C_FUNC3(float x)\n\t{\n\t\treturn linearInterpolation(x, 0.0, 0.0, uSlideWidth, 1.0);\n\t}\n\n\tfloat PHASE_OFFSET_FUNC3(float x)\n\t{\n\t\treturn linearInterpolation(x, 0.0, 0.0, uSlideWidth, PHASE_OFFSET);\n\t}\n\n\tfloat getAngleInSingleLeft(float x, float phase)\n\t{\n\t\tfloat angle;\n\t\tif (phase >= 0.0 && phase <= CHANGE_PHASE)\n\t\t{\n\t\t\tangle = -ANGLE * (phase - (PHASE_OFFSET_FUNC3(x) * PHASE_FUNC(phase)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tangle = -ANGLE * (phase - PHASE_OFFSET_FUNC3(x));\n\t\t}\n\t\treturn min(angle, 0.0);\n\t}\n\n\tvec2 getPosition(float x)\n\t{\n\t\tfloat a = uSlideWidth * C_FUNC3(x);\n\t\tfloat b = a * COEF_2;\n\t\tvec2 center = vec2(0.0, 0.0);\n\t\tfloat angle = getAngleInSingleLeft(x, uPhase);\n\n\t\tvec2 pos = ellipse(angle, center, vec2(a, b));\n\t\tpos.y = pos.y - (b * C_FUNC3(x) * PHASE_FUNC2(uPhase));\n\t\tpos.y = max(pos.y, 0.0);\n\t\treturn pos;\n\t}\n\n\tvoid main(void)\n\t{\n\t\tvec2 pos = getPosition(aVertexPosition.x);\n\t\tvec3 v = vec3(pos.x, aVertexPosition.y, pos.y);\n\t\tgl_Position = uPMVMatrix * vec4(v, 1.0);\n\t\tvTextureCoord = aTextureCoord;\n\n\t\tfloat nextX = aVertexPosition.x + uDeltaX;\n\t\tvec2 pr = getPosition(nextX);\n\t\tvec3 pNormal = getNormal(v, pr);\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\t}"; +case 3:return"\n\tfloat C_FUNC4(float x)\n\t{\n\t\treturn linearInterpolation(x, 0.0, 1.0, uSlideWidth, 0.0);\n\t}\n\n\tfloat PHASE_OFFSET_FUNC4(float x)\n\t{\n\t\treturn linearInterpolation(x, 0.0, PHASE_OFFSET, uSlideWidth, 0.0);\n\t}\n\n\tfloat getAngleInSingleRight(float x, float phase)\n\t{\n\t\tfloat angle;\n\t\tif (phase >= 0.0 && phase <= CHANGE_PHASE)\n\t\t{\n\t\t\tangle = ANGLE * (1.0 + phase - (PHASE_OFFSET_FUNC4(x) * PHASE_FUNC(phase)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tangle = ANGLE * (1.0 + phase - PHASE_OFFSET_FUNC4(x));\n\t\t}\n\t\treturn max(angle, ANGLE);\n\t}\n\n\tvec2 getPosition(float x)\n\t{\n\t\tfloat a = uSlideWidth * C_FUNC4(x);\n\t\tfloat b = a * COEF_2;\n\t\tvec2 center = vec2(uSlideWidth, 0.0);\n\t\tfloat angle = getAngleInSingleRight(x, uPhase);\n\n\t\tvec2 pos = ellipse(angle, center, vec2(a, b));\n\t\tpos.y = pos.y - (b * C_FUNC4(x) * PHASE_FUNC2(uPhase));\n\t\tpos.y = max(pos.y, 0.0);\n\t\treturn pos;\n\t}\n\n\tvoid main(void)\n\t{\n\t\tvec2 pos = getPosition(aVertexPosition.x);\n\t\tvec3 v = vec3(pos.x, aVertexPosition.y, pos.y);\n\t\tgl_Position = uPMVMatrix * vec4(v, 1.0);\n\t\tvTextureCoord = aTextureCoord;\n\n\t\tfloat nextX = aVertexPosition.x + uDeltaX;\n\t\tvec2 pr = getPosition(nextX);\n\t\tvec3 pNormal = getNormal(v, pr);\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\t}"; +default:throw Error("Unknown transition page curl type");}}k.Bd=function(){var a=this.slideWidth();const b=this.slideHeight();this.Zf=Dx(2,40,a,b);this.xe=Fx(2,40);this.uA=new Vv;a=Hv(this,hw(this.Zf),3);this.uA.kg=a;a=Hv(this,iw(this.Zf),2);this.uA.rg=a;a=Iv(this,this.xe);this.uA.Sf=a};function Nz(a,b,c){R.call(this,a);this.O=b;this.AJ=c}t(Nz,R);Nz.prototype.initialize=function(){uv(this,!0);vv(this,!0);this.hb().xg();this.$e=!1;var a=this.va(),b=this.qc().content();a.appendChild(b);a=this.va();b=this.hb().content();a.appendChild(b)}; +Nz.prototype.Ha=function(a){const b=this.slideWidth(),c=this.slideHeight();var d=0,e=0;let f=0,g=0;this.O==Oz||this.O==Pz?(d=this.O==Oz?1:-1,f=this.O==Oz?-1:1):(e=this.O==Qz?1:-1,g=this.O==Qz?-1:1);const h=this.AJ?Ew(0,.7,7,a):Dw(a);d=Math.floor(h*d*b);e=Math.floor(h*e*c);Gh(this.qc().content(),d,e);Gh(this.hb().content(),f*b+d,g*c+e);H(this.hb().background(),a)};var Qz=0,Pz=1,Oz=2;function Rz(a,b){R.call(this,a);this.O=b;this.Ma(!1,!0)}t(Rz,zv);k=Rz.prototype;k.initialize=function(){uv(this,!1);vv(this,!0);Cv(this,this.Da);this.Bd();mat4.translate(this.jb,[(this.O==Sz?-1:1)*this.slideWidth()/2,this.slideHeight()/2,0]);Uv(this)};k.Nh=function(){return"precision mediump float;\n\n\tvarying vec2 vTextureCoord;\n\tvarying vec3 vNormal;\n\n\tuniform sampler2D uSampler;\n\n\tconst vec3 LIGHT_DIRECTION = vec3(0.0, 0.0, 1.0);\n\tconst float AMBIENT_INTENSITY = 0.4;\n\tconst float DIFFUSE_INTENSITY = 0.6;\n\n\tvoid main(void) \n\t{ \n\t\tfloat intentsity = AMBIENT_INTENSITY + DIFFUSE_INTENSITY * abs(dot(normalize(vNormal), LIGHT_DIRECTION));\n\t\tvec4 textureColor = texture2D(uSampler, vTextureCoord); \n\t\tgl_FragColor = vec4(textureColor.rgb * intentsity, textureColor.a); \n\t}"}; +k.Oh=function(){return"attribute vec3 aVertexPosition;\n\tattribute vec2 aTextureCoord;\n\n\tuniform mat4 uPMVMatrix;\n\tuniform mat3 uNMatrix;\n\n\tuniform float uPhase;\n\tuniform bool uDirectionIsLeft;\n\tuniform float uSlideHeight;\n\tuniform float uSlideWidth;\n\n\tvarying vec2 vTextureCoord;\n\tvarying vec3 vNormal;\n\n\tconst float ANGLE = 45.0;\n\tconst float PI = 3.14159265358979323846264;\n\n\tfloat linearInterpolation(float x, float x0, float fx0, float x1, float fx1)\n\t{\n\t\treturn mix(fx0, fx1, (x - x0) / (x1 - x0));\n\t}\n\n\tmat4 rotationZmatrix(float angle)\n\t{\n\t \tfloat ang = radians(angle);\n\t \tfloat cosA = cos(ang);\n\t \tfloat sinA = sin(ang);\n\n\t \tmat4 m = mat4(1.0);\n\t \tm[0] = vec4(cosA, sinA, 0, 0);\n\t \tm[1] = vec4(-sinA, cosA, 0, 0);\n\t \treturn m;\n\t}\n\n\tvec3 getOriginPos(vec3 pos)\n\t{\n\t\tvec3 v = vec3(pos.x, pos.y, 0.0);;\n\t\tmat4 m;\n\n\t\tvec2 p;\n\t\tif (uDirectionIsLeft)\n\t\t{\n\t\t\tm = rotationZmatrix(ANGLE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tv.x = pos.x - uSlideWidth;\n\t\t\tm = rotationZmatrix(-ANGLE);\n\t\t}\n\t\tv = (m * vec4(v.xyz, 1.0)).xyz;\n\t\treturn vec3(v.x, v.y, 0.0);\n\t}\n\n\tfloat calcX(float phase, float u, float r, float maxSide)\n\t{\n\t\tfloat coeff = (u < 0.0) ? -1.0 : 1.0;\n\t\tfloat centerX = linearInterpolation(phase, 0.0, maxSide, 1.0, 0.0);\n\t\tfloat m = PI * r;\n\n\t\tif (centerX > coeff * u)\n\t\t{\n\t\t\treturn u;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfloat a = 180.0 * (maxSide - centerX) / (PI * r);\n\t\t\tfloat b = linearInterpolation(coeff * u, centerX, -90.0, maxSide + 1.0, a - 90.0);\n\n\t\t\tif (coeff * u >= centerX + m)\n\t\t\t{\n\t\t\t\treturn coeff * (centerX - (coeff * u - centerX - m));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfloat ang = b * PI / 180.0;\n\t\t\t\treturn coeff * (centerX + r * cos(ang));\n\t\t\t}\n\t\t}\n\t}\n\n\tfloat calcY(float phase, float u, float r, float maxSide)\n\t{\n\t\tu = abs(u);\n\n\t\tfloat centerX = linearInterpolation(phase, 0.0, maxSide, 1.0, 0.0);\n\t\tfloat centerY = r;\n\n\t\tfloat m = PI * r;\n\t\tif (centerX >= u)\n\t\t{\n\t\t\treturn 0.0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (u > centerX + m)\n\t\t\t{\n\t\t\t\treturn linearInterpolation(u, centerX + m, r * 2.0, centerX + m + m, r * 2.5);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfloat a = 180.0 * (maxSide - centerX) / (PI * r);\n\t\t\t\tfloat b = linearInterpolation(u, centerX, -90.0, maxSide+1.0, a - 90.0);\n\n\t\t\t\tfloat ang = b * PI / 180.0;\n\t\t\t\treturn centerY + r * sin(ang);\n\t\t\t}\n\t\t}\n\t}\n\n\tvec3 getVertexPosition(float phase, vec3 pos)\n\t{\n\t\tvec3 originPos = getOriginPos(pos);\n\t\tfloat maxSide = sqrt(uSlideWidth * uSlideWidth + uSlideHeight * uSlideHeight);\n\n\t\tfloat r = max(uSlideWidth, uSlideHeight) / 4.0;\n\t\tvec3 v = vec3(calcX(phase, originPos.x, r, maxSide), originPos.y, calcY(phase, originPos.x, r, maxSide));\n\n\t\tmat4 m;\n\t\tif (uDirectionIsLeft)\n\t\t{\n\t\t\tm = rotationZmatrix(-ANGLE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm = rotationZmatrix(ANGLE);\n\t\t}\n\n\t\treturn (m * vec4(v.xyz, 1.0)).xyz;\n\t}\n\n\tvec3 getVertexNormal(float phase, vec3 pos)\n\t{\n\t\tconst float DELTA_W = 1.0;\n\t\tconst float DELTA_H = 1.0;\n\n\t\tvec3 right = getVertexPosition(phase, vec3(pos.x + DELTA_W, pos.y, pos.z));\n\t\tvec3 down = getVertexPosition(phase, vec3(pos.x, pos.y + DELTA_H, pos.z));\n\t\tvec3 p = getVertexPosition(phase, vec3(pos.x, pos.y, pos.z));\n\n\t\tvec3 v1 = right - p;\n\t\tvec3 v2 = down - p;\n\n\t\treturn normalize(cross(v2, v1));\n\t}\n\n\tvoid main(void)\n\t{\n\t\tfloat phase = uPhase;\n\t\tvec3 vertex = vec3(aVertexPosition.x, aVertexPosition.y, aVertexPosition.z);\n\t\tvec4 p = vec4(getVertexPosition(phase, vertex), 1.0);\n\t\tgl_Position = uPMVMatrix * p;\n\t\tvTextureCoord = aTextureCoord;\n\n\t\tvec3 pNormal = getVertexNormal(phase, vertex);\n\t\tvec3 transformedNormal = uNMatrix * pNormal;\n\t\tvNormal = transformedNormal;\n\t}"}; +k.Ha=function(a){a=Y(0,0,1,1.2)(a);this.N.uniform1f(this.jg,a);Mv(this,this.$f,this.N.TRIANGLE_STRIP)};k.Vh=function(){Nv(this);this.We=Pv(this,"uSampler");this.jg=Pv(this,"uPhase");const a=Pv(this,"uDirectionIsLeft"),b=Pv(this,"uSlideWidth");this.N.uniform1f(Pv(this,"uSlideHeight"),this.slideHeight());this.N.uniform1f(b,this.slideWidth());this.N.uniform1i(a,this.O==Sz?1:0)};k.Lh=function(){}; +k.Bd=function(){this.Zf=Dx(30,30,this.slideWidth(),this.slideHeight());this.xe=Fx(30,30);this.$f=new Vv;var a=Hv(this,hw(this.Zf),3);this.$f.kg=a;a=Hv(this,iw(this.Zf),2);this.$f.rg=a;a=Iv(this,this.xe);this.$f.Sf=a};k.yj=function(){return this.We};k.Kh=function(){Fv(this,this.$f)};var Sz=0;function Tz(a){R.call(this,a);this.Ma(!1,!0)}t(Tz,zv);k=Tz.prototype;k.initialize=function(){uv(this,!1);vv(this,!0);Cv(this,this.Da);this.Bd();mat4.translate(this.jb,[-this.slideWidth()/2,this.slideHeight()/2,0]);Uv(this)};k.HR=function(){if(void 0!==Uz)return Uz;this.ns();return Uz=this.tq};k.ns=function(){void 0===this.N&&Tz.Mb.ns.call(this)};k.Ha=function(a){this.N.uniform1f(this.jg,a);Mv(this,this.$f,this.N.TRIANGLE_STRIP)}; +k.Bd=function(){this.Zf=Dx(10,35,this.slideWidth(),this.slideHeight());this.xe=Fx(10,35);this.$f=new Vv;var a=Hv(this,hw(this.Zf),3);this.$f.kg=a;a=Hv(this,iw(this.Zf),2);this.$f.rg=a;a=Iv(this,this.xe);this.$f.Sf=a};k.Kh=function(){Fv(this,this.$f)};k.Vh=function(){Nv(this);this.We=Pv(this,"uSampler");this.jg=Pv(this,"uPhase");const a=Pv(this,"uSlideWidth");this.N.uniform1f(Pv(this,"uSlideHeight"),this.slideHeight());this.N.uniform1f(a,this.slideWidth())};k.Lh=function(){};k.yj=function(){return this.We}; +k.Nh=function(){return"precision mediump float;\n\n\tvarying vec2 vTextureCoord;\n\tvarying vec3 vNormal;\n\n\tuniform sampler2D uSampler;\n\n\tconst vec3 LIGHT_DIRECTION = vec3(0.0, 0.0, 1.0);\n\tconst float AMBIENT_INTENSITY = 0.3;\n\tconst float DIFFUSE_INTENSITY = 0.7;\n\n\tvoid main(void)\n\t{\n\t\tfloat intentsity = AMBIENT_INTENSITY + DIFFUSE_INTENSITY * abs(dot(normalize(vNormal), LIGHT_DIRECTION));\n\t\tvec4 textureColor = texture2D(uSampler, vTextureCoord);\n\t\tgl_FragColor = vec4(textureColor.rgb * intentsity, textureColor.a);\n\t}"}; +k.Oh=function(){return"attribute vec3 aVertexPosition;\n\tattribute vec3 aVertexNormal;\n\tattribute vec2 aTextureCoord;\n\n\tuniform mat4 uPMVMatrix;\n\tuniform mat3 uNMatrix;\n\n\tuniform float uPhase;\n\tuniform float uSlideHeight;\n\tuniform float uSlideWidth;\n\n\tvarying vec2 vTextureCoord;\n\tvarying vec3 vNormal;\n\n\tconst float START_EFFECT_TIME = 0.0;\n\tconst float START_FLY_EFFECT_TIME = 0.4;\n\tconst float STOP_FLY_EFFECT_TIME = 0.8;\n\tconst float START_TOP_CENTER = 0.0;\n\tconst float START_TOP_CORNERS_TIME = 0.1;\n\tconst float START_BOTTOM_CORNERS_TIME = 0.0;\n\n\tconst float HORIZONTAL_WAVES_COUNT = 3.0;\n\tfloat HORIZONTAL_MAX_AMPLITUDE;\n\tconst float HORIZONTAL_WAVE_RUNNING_START_TIME = 0.0;\n\n\tconst float MAX_FLEX_DELAY = 0.1;\n\n\tfloat MAX_STRETCHING_Z;\n\tfloat MAX_STRETCHING_Y;\n\tfloat HORIZONTAL_TOP_STRETCHING;\n\tfloat VERTICAL_TOP_STRETCHING;\n\n\tconst float PI = 3.141592654;\n\n\tfloat linearInterpolation(float x, float x0, float fx0, float x1, float fx1)\n\t{\n\t\treturn mix(fx0, fx1, (x - x0) / (x1 - x0));\n\t}\n\tvec2 getMirrorPoint(vec2 a, vec2 b, vec2 p)\n\t{\n\t\treturn a + reflect(a - p, b - a);\n\t}\n\tfloat calcCenterWave(float x, float phase, float A, float F, float dx, float dy)\n\t{\n\t\tfloat CENTER_LINE_POS = uSlideWidth * 0.5;\n\t\tfloat startX = CENTER_LINE_POS;\n\t\tif (x < startX)\n\t\t{\n\t\t\tx = getMirrorPoint(vec2(CENTER_LINE_POS, 0), vec2(CENTER_LINE_POS , uSlideHeight), vec2(x, 0)).x;\n\t\t}\n\t\tfloat s = linearInterpolation(phase, 0.0, startX, 1.0, uSlideWidth);\n\t\tif ((x < startX) || (x < s))\n\t\t{\n\t\t\treturn 0.0;\n\t\t}\n\t\tfloat x0 = - linearInterpolation(phase, 0.0, 2.0 * PI * startX / uSlideWidth * HORIZONTAL_WAVES_COUNT, 1.0, PI * 2.0 * HORIZONTAL_WAVES_COUNT);\n\t\treturn A + A * sin(F * x +-PI / 2.0 + x0);\n\t}\n\tfloat getColWaveDelay(float phase, vec3 pos)\n\t{\n\t\tphase = linearInterpolation(phase, HORIZONTAL_WAVE_RUNNING_START_TIME, 0.0, 1.0, 1.0);\n\t\tfloat MAX_AMPLITUDE = linearInterpolation(phase, 0.0, 0.0, 1.0, HORIZONTAL_MAX_AMPLITUDE);\n\t\tfloat A = linearInterpolation(pos.y, 0.0, 0.0, uSlideHeight, MAX_AMPLITUDE);\n\t\tfloat F = (PI * 2.0 / uSlideWidth) * HORIZONTAL_WAVES_COUNT;\n\t\treturn calcCenterWave(pos.x, phase, A, F, 0.0, 0.0);\n\t}\n\tvec3 getVertexPosition(float phase, vec3 pos)\n\t{\n\t\tfloat CENTER = uSlideWidth * 0.5;\n\t\tphase = pow(phase, 4.0);\n\t\tfloat modifiedPhase = phase;\n\n\t\tfloat deltaZVertical = linearInterpolation(abs(pos.y), 0.0, 1.0, uSlideHeight / 2.0, 0.0);\n\t\tif (abs(pos.y) > uSlideHeight * 0.5)\n\t\t{\n\t\t\tdeltaZVertical = 0.0;\n\t\t}\n\t\tbool isLeft = (pos.x < CENTER);\n\t\tfloat stretch;\n\t\tfloat yDelay;\n\t\tvec3 delta = vec3(0, 0, 0);\n\t\tif (modifiedPhase > START_TOP_CENTER)\n\t\t{\n\t\t\tif (isLeft)\n\t\t\t{\n\t\t\t\tyDelay = linearInterpolation(pos.x, 0.0, MAX_FLEX_DELAY, CENTER, 0.0);\n\t\t\t\tstretch = linearInterpolation(pos.x, 0.0, 0.0, CENTER, 1.0);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tyDelay = linearInterpolation(pos.x, CENTER, 0.0, uSlideWidth, MAX_FLEX_DELAY);\n\t\t\t\tstretch = linearInterpolation(pos.x, CENTER, 1.0, uSlideWidth, 0.0);\n\t\t\t}\n\t\t\tfloat deltaZHorizontal = pow(stretch, 3.0);\n\t\t\tmodifiedPhase = linearInterpolation(modifiedPhase, START_TOP_CENTER, 0.0, 1.0, 1.0);\n\t\t\tif (modifiedPhase >= yDelay)\n\t\t\t{\n\t\t\t\tdelta.y = linearInterpolation(modifiedPhase, yDelay, 0.0, 1.0, MAX_STRETCHING_Y * deltaZHorizontal * deltaZVertical);\n\t\t\t\tdelta.z = linearInterpolation(modifiedPhase, yDelay, 0.0, 1.0, MAX_STRETCHING_Z * deltaZHorizontal * deltaZVertical);\n\t\t\t}\n\t\t\tdelta.y = -delta.y;\n\t\t}\n\t\tif (phase > HORIZONTAL_WAVE_RUNNING_START_TIME)\n\t\t{\n\t\t\tdelta.z += getColWaveDelay(phase, pos);\n\t\t}\n\t\treturn pos - delta;\n\t}\n\tfloat getPower(float h1, float h2, float v1, float v2, vec2 pos, float max2)\n\t{\n\t float a1 = min(max(linearInterpolation(pos.x, h1, 1.0, h2, 0.0), 0.0), 1.0);\n\t float a2 = linearInterpolation(pos.y, v1, 1.0, v2, max2);\n\t return a1 * a2;\n\t}\n\tvec3 updateVertex(float phase, vec3 translation)\n\t{\n\t\tfloat pPhase = phase;\n\t\tvec3 delta = vec3(0, 0, 0);\n\t\tvec3 v0 = getVertexPosition(phase, aVertexPosition);\n\n\t\tif (phase > START_TOP_CORNERS_TIME)\n\t\t{\n\t\t\tpPhase = linearInterpolation(phase, START_TOP_CORNERS_TIME, 0.0, 1.0, 1.0);\n\t\t\tpPhase = pow(pPhase, 4.0);\n\n\t\t\tfloat p1 = getPower(0.0, uSlideWidth * 0.5, 0.0, uSlideHeight, v0.xy, 2.0);\n\t\t\tfloat p2 = getPower(uSlideWidth, uSlideWidth * 0.5, 0.0, uSlideHeight, v0.xy, 2.0);\n\n\t\t\tdelta += vec3(p2 - p1, -p1 - p2, 0) * vec3(HORIZONTAL_TOP_STRETCHING, VERTICAL_TOP_STRETCHING, 0) * vec3(pPhase, pPhase, 0);\n\t\t}\n\t\tif (phase > START_BOTTOM_CORNERS_TIME)\n\t\t{\n\t\t\tpPhase = linearInterpolation(phase, START_BOTTOM_CORNERS_TIME, 0.0, 1.0, 1.0);\n\t\t\tpPhase = pow(pPhase, 4.0);\n\n\t\t\tfloat p1 = getPower(0.0, uSlideWidth * 0.25, uSlideHeight, 0.0, v0.xy, 0.0);\n\t\t\tfloat p2 = getPower(uSlideWidth, uSlideWidth * 0.75, uSlideHeight, 0.0, v0.xy, 0.0);\n\n\t\t\tdelta += vec3(0.5, 1, 0.25) * vec3(p2 - p1, p2, p2) * vec3(uSlideWidth, uSlideHeight, uSlideHeight) * vec3(pPhase, pPhase, pPhase);\n\t\t}\n\t\tdelta.y = -min(uSlideHeight * 0.75, abs(delta.y));\n\t\treturn (translation + v0 + delta);\n\t}\n\tvec3 getPosition(float phase, vec3 pos)\n\t{\n\t \tfloat maxSide = sqrt(uSlideHeight * uSlideHeight + (uSlideWidth * 0.5) * (uSlideWidth * 0.5)) * 2.0;\n\t\tvec3 translation = vec3(0.0);\n\t\tif ((phase >= START_FLY_EFFECT_TIME) && (phase <= STOP_FLY_EFFECT_TIME))\n\t\t{\n\t\t\tfloat modifiedPhase = linearInterpolation(phase, START_FLY_EFFECT_TIME, 0.0, STOP_FLY_EFFECT_TIME, 1.0);\n\t\t\tmodifiedPhase = pow(modifiedPhase, 4.0);\n\t\t\ttranslation = vec3(0.0, modifiedPhase * maxSide, 0.0);\n\t\t}\n\t\telse if (phase > STOP_FLY_EFFECT_TIME)\n\t\t{\n\t\t\ttranslation = vec3(0.0, maxSide, 0.0);\n\t\t}\n\t\tif (phase >= START_EFFECT_TIME)\n\t\t{\n\t\t\tfloat modifiedPhase = linearInterpolation(phase, START_EFFECT_TIME, 0.0, 1.0, 1.0);\n\t\t\treturn updateVertex(modifiedPhase, translation);\n\t\t}\n\t\treturn updateVertex(0.0, translation);\n\t}\n\n\tvec3 getVertexNormal(float phase, vec3 pos)\n\t{\n\t\tfloat deltaWidth = (pos.x == uSlideWidth) ? -1.0 : 1.0;\n\t\tfloat deltaHeight = 1.0;\n\n\t\tvec3 right = getVertexPosition(phase, vec3(pos.x + deltaWidth, pos.y, pos.z));\n\t\tvec3 down = getVertexPosition(phase, vec3(pos.x, pos.y + deltaHeight, pos.z));\n\t\tvec3 p = getVertexPosition(phase, vec3(pos.x, pos.y, pos.z));\n\n\t\tvec3 v1 = right - p;\n\t\tvec3 v2 = down - p;\n\n\t\tvec3 n = (pos.x == uSlideWidth) ? cross(v1, v2) : cross(v2, v1);\n\t\tn = normalize(n);\n\n\t\treturn n;\n\t}\n\tvoid main()\n\t{\n\t\tMAX_STRETCHING_Z = 0.74 * uSlideHeight;\n\t\tMAX_STRETCHING_Y = 0.74 * uSlideHeight;\n\t\tHORIZONTAL_TOP_STRETCHING = 0.42 * uSlideWidth;\n\t\tVERTICAL_TOP_STRETCHING = 0.05 * uSlideHeight;\n\t\tHORIZONTAL_MAX_AMPLITUDE = 0.93 * uSlideHeight;\n\n\t \tvTextureCoord = aTextureCoord;\n\n\t\tvec3 vertex = vec3(aVertexPosition.x, -aVertexPosition.y, aVertexPosition.z);\n\t\tvec4 p = vec4(getPosition(uPhase, vertex), 1.0);\n\t\tgl_Position = uPMVMatrix * p;\n\n\t\tvec3 transformedNormal = uNMatrix * getVertexNormal(uPhase, vertex);\n\t\tvNormal = transformedNormal;\n\t}"}; +var Uz=void 0;function Vz(a,b){R.call(this,a);this.O=b;this.Ma(!0,!0)}t(Vz,R);Vz.prototype.initialize=function(){uv(this,!1);vv(this,!1);const a=S(this.slideWidth(),this.slideHeight());F(a,"position","absolute");this.va().appendChild(a);this.wG=a}; +Vz.prototype.Ha=function(a){const b=this.slideWidth(),c=this.slideHeight(),d=b*ow(0,b,Math.floor(a*b));a=c*ow(0,c,Math.floor(a*c));const e=this.wG.getContext("2d");e.clearRect(0,0,b,c);switch(this.O){case Wz:e.drawImage(this.mb,0,a-c);e.drawImage(this.Da,0,a);break;case Xz:e.drawImage(this.mb,b-d,0);e.drawImage(this.Da,-d,0);break;case Yz:e.drawImage(this.mb,d-b,0);e.drawImage(this.Da,d,0);break;case Zz:e.drawImage(this.mb,0,c-a),e.drawImage(this.Da,0,-a)}};var Wz=0,Xz=1,Yz=2,Zz=3;function $z(a,b){R.call(this,a);this.hS=b;this.Ma(!1,!0);this.qy=[];a=this.slideWidth();switch(this.hS){case aA:a=this.slideHeight();break;case bA:a=this.slideWidth()}this.Gu=Math.floor(a/7);a=[];for(b=0;bd.vI?1:0});for(b=0;b=this.qy[c].getStartTime()+.2?b.addColorStop(g,f):d>=this.qy[c].getStartTime()?b.addColorStop(g,"rgba(255,255,255,"+h+")"):b.addColorStop(g,a)}e.fillStyle=b;e.beginPath();e.rect(0,0,this.slideWidth(),this.slideHeight());e.fill();e.restore()};var aA=0,bA=1;function cA(a,b){this.gq=a;this.Mj=b}cA.prototype.getStartTime=function(){return this.Mj};function dA(a,b){R.call(this,a);this.O=b;this.$e=!1;this.Ma(!1,!1,!0,!0,!1,!1)}t(dA,R);dA.prototype.initialize=function(){uv(this,!1);vv(this,!1);var a=this.va(),b=this.hb().background();a.appendChild(b);a=this.va();b=this.qc().background();a.appendChild(b);this.RD=S(this.slideWidth(),this.slideHeight());F(this.RD,"position","absolute");this.va().appendChild(this.RD);this.xJ=S(this.slideWidth(),this.slideHeight());F(this.xJ,"position","absolute");this.va().appendChild(this.xJ)}; +dA.prototype.Ha=function(a){var b=this.slideWidth(),c=this.slideHeight(),d=this.RD.getContext("2d");d.clearRect(0,0,b,c);var e=.5>a?this.O==eA||this.O==fA?Y(0,-b,.5,b):Y(0,b,.5,-b):this.O==eA||this.O==fA?Y(.5,b,1,-b):Y(.5,-b,1,b);e=d.createLinearGradient(e(a),0,e(a)+b,0);this.O==eA||this.O==fA?(e.addColorStop(0,"rgba(0, 0, 0, 1)"),e.addColorStop(1,"rgba(0, 0, 0, 0)")):(e.addColorStop(0,"rgba(0, 0, 0, 0)"),e.addColorStop(1,"rgba(0, 0, 0, 1)"));this.O==gA||this.O==fA?(H(this.qc().background(),1-a), +.5>a?d.drawImage(this.Up,0,0):d.drawImage(this.Cn,0,0),d.save(),d.globalCompositeOperation="destination-out",d.fillStyle=e,d.fillRect(0,0,this.slideWidth(),this.slideHeight()),d.restore()):(.5>a?(H(this.qc().background(),1),d.drawImage(this.Up,0,0)):(H(this.qc().background(),0),d.drawImage(this.Cn,0,0)),d=this.xJ.getContext("2d"),d.clearRect(0,0,b,c),d.fillStyle=e,d.fillRect(0,0,this.slideWidth(),this.slideHeight()));.5>a?(b=Y(0,0,.5,hA),c=Y(0,0,.5,iA),d=Y(0,1,.5,1+jA)):(b=Y(.5,-hA,1,0),c=Y(.5,iA, +1,0),d=Y(.5,1+jA,1,1));a="scale("+d(a)+") translate("+b(a)+"px,"+c(a)+"px)";xi(this.RD,a)};var hA=-30,iA=-20,jA=.1,gA=0,fA=1,eA=2;function kA(a,b){R.call(this,a);this.Ga=b;this.$e=!1;this.Ma(!1,!0)}t(kA,R);kA.prototype.initialize=function(){uv(this,!1);vv(this,!0);const a=this.slideWidth(),b=this.slideHeight();this.i_=Math.sqrt(a*a+b*b)*(this.Ga==lA?.5:1);this.Pw=a/2;this.Qw=b/2;switch(this.Ga){case mA:this.Pw=a;this.Qw=b;break;case nA:this.Pw=a;this.Qw=0;break;case oA:this.Pw=0;this.Qw=b;break;case pA:this.Qw=this.Pw=0}this.Jn=S(a,b);F(this.Jn,"position","relative");this.va().appendChild(this.Jn);this.sM=this.Jn.getContext("2d")}; +kA.prototype.Ha=function(a){this.sM.drawImage(this.Da,0,0);var b=this.sM,c=this.Pw,d=this.Qw,e=this.i_;b.save();b.globalCompositeOperation="destination-in";c=b.createRadialGradient(c,d,0,c,d,e);d=1.2*a;e=1;var f=d,g=0,h=d-.2;.2>d?(g=1-d/.2,h=0):1<=d&&(e=1-(d-1)/.2,f=1);c.addColorStop(h,"rgba(0,0,0,"+zn(g)+")");c.addColorStop(f,"rgba(0,0,0,"+zn(e)+")");b.fillStyle=c;b.fillRect(0,0,this.slideWidth(),this.slideHeight());b.restore();b=.8-.2;c=this.sM;e=0;for(d=[1];;){f=2*a-.03125*e;if(0>=f)break;else 1> +f&&d.push(f);++e}d.push(0);e=this.Pw;f=this.Qw;e=c.createRadialGradient(e,f,0,e,f,this.i_);f=d.length;for(--f;0<=f;--f){g=d[f];h=a;h*=2;h=1-ow(h-.2,h,g);var l=a;l*=2;h=.3*(.5*Math.cos(8*Math.PI*(g-2*a))+.5)*h*ow(l-.2-b-.2,l-.2-b,g);h*=1-.5*g;e.addColorStop(g,"rgba(0,0,0,alpha)".replace("alpha",zn(h).toString()))}c.fillStyle=e;c.fillRect(0,0,this.slideWidth(),this.slideHeight())};var lA=0,oA=1,mA=2,nA=3,pA=4;function qA(a,b){R.call(this,a);this.O=b;this.Ma(!0,!0)}t(qA,zv);k=qA.prototype;k.initialize=function(){uv(this,!1);vv(this,!1);Cv(this,this.Da);this.Bd();mat4.translate(this.jb,[-this.slideWidth()/2,this.slideHeight()/2,0]);Uv(this)};k.Bd=function(){this.Zf=Dx(50,50,this.slideWidth(),this.slideHeight());this.xe=Fx(50,50);this.$k=new Vv;var a=Hv(this,hw(this.Zf),3);this.$k.kg=a;a=Hv(this,iw(this.Zf),2);this.$k.rg=a;a=Iv(this,this.xe);this.$k.Sf=a};k.Kh=function(){Fv(this,this.$k);this.N.deleteTexture(this.nB)}; +k.Vh=function(){Nv(this);this.RA=Pv(this,"uSampler1");this.SA=Pv(this,"uSampler2");this.jg=Pv(this,"uPhase");const a=Pv(this,"uSlideSize"),b=Pv(this,"uWaveCenter"),c=Pv(this,"uWaveRadius"),d=this.slideWidth(),e=this.slideHeight();let f;switch(this.O){case lA:f=new V(d/2,e/2);break;case nA:f=new V(d,0);break;case pA:f=new V(0,0);break;case oA:f=new V(0,e);break;case mA:f=new V(d,e);break;default:throw Error("Unknown direction");}let g=Math.sqrt(d*d+e*e);this.O==lA&&(g=Math.sqrt(f.x()*f.x()+f.y()*f.y())); +this.N.uniform2fv(a,[d,e]);this.N.uniform2fv(b,[f.x(),f.y()]);this.N.uniform1f(c,g)};k.Lh=function(){};k.Ha=function(a){this.N.uniform1f(this.jg,a);Mv(this,this.$k,this.N.TRIANGLE_STRIP)};k.Oh=function(){return"precision mediump float;\n\n\tattribute vec3 aVertexPosition;\n\tattribute vec2 aTextureCoord;\n\n\tuniform mat4 uPMVMatrix;\n\tuniform mat3 uNMatrix;\n\n\tconst float FREQUENCY = 12.566371; // 4.0 * PI\n\tconst float SHADOW = 0.3;\n\n\tuniform float uPhase;\n\tuniform vec2 uSlideSize;\n\tuniform vec2 uWaveCenter;\n\tuniform float uWaveRadius;\n\n\tvarying mediump vec2 vTextureCoord;\n\tvarying mediump float vShadow;\n\tvarying mediump float vAlpha;\n\n\tvoid main(void)\n\t{\n\t\tvec2 texCoord = aTextureCoord;\n\t\tvec2 screenCoord = texCoord * uSlideSize;\n\t\tvec2 centerToPoint = screenCoord - uWaveCenter;\n\n\t\tfloat angle = atan(centerToPoint.y, centerToPoint.x);\n\t\tfloat radius = length(centerToPoint);\n\n\t\tfloat phaseOffset = radius / uWaveRadius;\n\t\tfloat phaseOffsetFixed = (uPhase + uPhase) - phaseOffset;\n\t\tfloat offset = sin(phaseOffsetFixed * FREQUENCY) * smoothstep(1.0, 0.85, phaseOffsetFixed) * smoothstep(0.0, 0.15, phaseOffsetFixed) * (phaseOffset);\n\n\t\tfloat AMPLITUDE = min(uSlideSize.x, uSlideSize.y) / 15.0;\n\t\tradius = radius + offset * AMPLITUDE;\n\t\tcenterToPoint = vec2(radius * cos(angle), radius * sin(angle));\n\n\t\ttexCoord =(uWaveCenter + centerToPoint) / uSlideSize;\n\t\tfloat alpha = smoothstep(0.0, 1.0, phaseOffsetFixed);\n\t\tfloat shadow = (1.0 - SHADOW * abs(offset));\n\n\t\tvTextureCoord = texCoord;\n\t\tvShadow = shadow;\n\t\tvAlpha = alpha;\n\n\t\tgl_Position = uPMVMatrix * vec4(aVertexPosition, 1.0);\n\t}"}; +k.Nh=function(){return"precision mediump float;\n\n\tvarying mediump vec2 vTextureCoord;\n\tvarying mediump float vShadow;\n\tvarying mediump float vAlpha;\n\n\tuniform sampler2D uSampler1;\n\tuniform sampler2D uSampler2;\n\n\tvoid main(void) \n\t{ \n\t\tif (vTextureCoord.x < 0.0 || vTextureCoord.x > 1.0 || vTextureCoord.y < 0.0 || vTextureCoord.y > 1.0) \n\t\t{ \n\t\t\tgl_FragColor = mix(vec4(0.0), vec4(0.0), 0.0);\n\t\t\treturn;\n\t\t} \n\t\tvec4 color1 = texture2D(uSampler1, vTextureCoord);\n\t\tvec4 color2 = texture2D(uSampler2, vTextureCoord);\n\t\tvec4 mixedColor = mix(color1, color2, vAlpha);\n\t\tgl_FragColor = vec4(vShadow * mixedColor.rgb, mixedColor.a);\n\t}"}; +k.vz=function(){this.mB=Gv(this,this.N.TEXTURE0,this.RA,0,this.Da);this.nB=Gv(this,this.N.TEXTURE1,this.SA,1,this.mb)};function rA(a){R.call(this,a);this.Ma(!1,!0)}t(rA,R);rA.prototype.initialize=function(){uv(this,!1);this.Jn=S(this.slideWidth(),this.slideHeight());this.va().appendChild(this.Jn);this.uj=this.Jn.getContext("2d")}; +rA.prototype.Ha=function(a){const b=this.slideWidth(),c=this.slideHeight();var d=this.Da;const e=this.uj;e.clearRect(0,0,b,c);e.drawImage(d,0,0);e.save();d=a*Math.max(b,c);e.globalCompositeOperation="destination-out";const f=e.createRadialGradient(b/2,c/2,a*d,b/2,c/2,d);f.addColorStop(0,"#FFFFFF");f.addColorStop(.15,"rgba(255,255,255,128)");f.addColorStop(1,"rgba(255,255,255,0)");e.fillStyle=f;e.beginPath();e.arc(b/2,c/2,d,0,2*Math.PI,!0);e.fill();e.restore();this.na()&&0>=a&&vv(this,!1)};function sA(a){R.call(this,a);this.Ma(!0,!1)}t(sA,R);sA.prototype.initialize=function(){vv(this,!1);uv(this,!0);this.xV=S(this.slideWidth(),this.slideHeight());this.va().appendChild(this.xV);this.c5=this.mb.getContext("2d");this.d5=this.xV.getContext("2d")}; +sA.prototype.Ha=function(a){if(0!=a||this.na()){var b=this.slideWidth(),c=this.slideHeight(),d=this.mb,e=this.d5;e.clearRect(0,0,b,c);e.drawImage(d,0,0);e.save();e.globalCompositeOperation="destination-out";d=tA(this,b/2,c/2,b/2+b*a,c/2+c*a,a,!1,!1);var f=b/2,g=c/2,h=b/2,l=c/2;e.fillStyle=d;e.beginPath();e.rect(f,g,h,l);e.fill();d=tA(this,b/2,c/2,b/2+b*a,-a*c+c/2,a,!0,!1);f=b/2;g=b/2;h=c/2;e.fillStyle=d;e.beginPath();e.rect(f,0,g,h);e.fill();d=tA(this,b/2,c/2,-a*b+b/2,c/2+c*a,a,!1,!0);f=c/2;g=b/2; +h=c/2;e.fillStyle=d;e.beginPath();e.rect(0,f,g,h);e.fill();a=tA(this,b/2,c/2,-a*b+b/2,-a*c+c/2,a,!0,!0);b/=2;c/=2;e.fillStyle=a;e.beginPath();e.rect(0,0,b,c);e.fill();e.restore()}}; +function tA(a,b,c,d,e,f,g,h){const l=a.c5;a=a.slideHeight()>a.slideWidth()?l.createLinearGradient(b,c,(h?-b:b)*f*2+d,e):l.createLinearGradient(b,c,d,(g?-c:c)*f*2+e);a.addColorStop(0,"rgba(255,255,255,0)");a.addColorStop(.2f?f+.2:1,"#FFFFFF");a.addColorStop(1,"#FFFFFF");return a};function uA(a){R.call(this,a);this.Ma(!1,!0)}t(uA,R);uA.prototype.initialize=function(){uv(this,!1);vv(this,!0);this.Jc=S(this.slideWidth(),this.slideHeight());this.va().appendChild(this.Jc)}; +uA.prototype.Ha=function(a){var b=(this.slideWidth()/2+50)*(1-a),c=b-50,d=(this.slideHeight()/2+50)*(1-a);let e=d-50;const f=this.Jc.getContext("2d");f.clearRect(0,0,this.slideWidth(),this.slideHeight());f.drawImage(this.Da,0,0);f.save();f.globalCompositeOperation="destination-out";d=f.createLinearGradient(0,d,0,e);d.addColorStop(0,"rgba(255, 255, 255, 1)");d.addColorStop(1,"rgba(255, 255, 255, 0)");b=f.createLinearGradient(b,0,c,0);b.addColorStop(0,"rgba(255, 255, 255, 1)");b.addColorStop(1,"rgba(255, 255, 255, 0)"); +c=this.slideWidth()/2+(this.slideWidth()/2+50)*a;c=f.createLinearGradient(c-50,0,c,0);c.addColorStop(0,"rgba(255, 255, 255, 1)");c.addColorStop(1,"rgba(255, 255, 255, 0)");e=this.slideHeight()/2+(this.slideHeight()/2+50)*a;a=f.createLinearGradient(0,e-50,0,e);a.addColorStop(0,"rgba(255, 255, 255, 1)");a.addColorStop(1,"rgba(255, 255, 255, 0)");f.fillStyle=d;f.fillRect(0,0,this.slideWidth()/2,this.slideHeight()/2);f.fillStyle=b;f.fillRect(0,0,this.slideWidth()/2,this.slideHeight()/2);f.fillStyle=a; +f.fillRect(0,this.slideHeight()/2,this.slideWidth()/2,this.slideHeight()/2);f.fillStyle=b;f.fillRect(0,this.slideHeight()/2,this.slideWidth()/2,this.slideHeight()/2);f.fillStyle=d;f.fillRect(this.slideWidth()/2,0,this.slideWidth()/2,this.slideHeight()/2);f.fillStyle=c;f.fillRect(this.slideWidth()/2,0,this.slideWidth()/2,this.slideHeight()/2);f.fillStyle=a;f.fillRect(this.slideWidth()/2,this.slideHeight()/2,this.slideWidth()/2,this.slideHeight()/2);f.fillStyle=c;f.fillRect(this.slideWidth()/2,this.slideHeight()/ +2,this.slideWidth()/2,this.slideHeight()/2);f.restore()};function vA(){var a=Array(2);wA(a,0,0);return a}function wA(a,b,c){a[0]=b;a[1]=c};function xA(a,b){R.call(this,a);this.Ga=b;this.Ma(!0,!0)}t(xA,R);k=xA.prototype; +k.initialize=function(){uv(this,!1);vv(this,!1);this.HJ=this.nZ=!1;this.iF=[];this.oF=[];var a=this.slideWidth(),b=this.slideHeight();this.aM=Math.max(a,b);var c=this.hn(this.va(),a,b,!0);Di(c,this.aM+"px");this.pa=this.hn(c,a,b,!0);this.uM=this.hn(this.pa,a,b,!0);this.jF=this.hn(this.pa,a,b,!0);F(this.jF,"visibility","hidden");if(this.Ga==yA||this.Ga==zA){b=Ni?4:8;c=this.na()?this.mb:this.Da;const p=this.na()?this.Da:this.mb;var d=this.slideWidth(),e=this.slideHeight(),f=b/2-1;for(a=0;aMath.random()?-1:1));this.oF[a]=this.Qu(this.uM,d,e,g,l,h);this.iF[a]=this.Qu(this.jF,d,e,g,l,h)}d/=128;e/=96;f=0;h=[];for(a=0;128>a;++a){g=0;l=Math.round((a+1)*d)-f;const r=f;for(let v=0;96>v;++v){if(0==h.length)for(var n=0;nc&&(T=c-J);if(!v&&J+T>=c)if(T>.5*g+h)T=h;else{X.Jx=void 0;y=vA();wA(y,X.Go.x,0);D=vA();wA(D,J+T,U);X.Go.kr.x+=T;X.Go.kr.y=d;continue}v?(y=vA(),wA(y,J,0),D=vA(),wA(D,J+T,U),X.Go={DC:y,kr:D}):(y=vA(),wA(y,J,U),D=vA(),wA(D,J+T,d),X.Jx={DC:y,kr:D},m.push({BC:void 0,Go:void 0,Jx:void 0}),p=m[++r],y=vA(),wA(y,J,0),D=vA(),wA(D,J+T,U),p.BC={DC:y,kr:D});p=T;v= +!v}const I=a.na()?a.mb:a.Da,A=a.na()?a.Da:a.mb;e=.5>Math.random()?-1:1;for(f=0;f=a)&&(this.HJ=!0);if(0<=a&&.4>a){var d=Y(0,0,.4,1);a=d(a)}else.6<=a&&1>a?(d=Y(.6,1,1,0),a=d(a)):a=1;d=-this.aM*a/2;let e=30*a*(this.HJ?-1:1);c&&b&&(e=-e);xi(this.pa,"translateZ("+d+"px) rotateY("+e+"deg) rotateX("+-15*a+"deg)")}; +k.Ha=function(a){if(1!=a||!this.na()){this.eM(a);const f=2*this.aM;var b=this.na();let g=this.oF;if(b&&.47>=a||!b&&.47<=a)g=this.iF,this.nZ||(this.nZ=!0,F(this.jF,"visibility","visible"),F(this.uM,"visibility","hidden"));b=g.length;for(let h=0;hc){var d=Y(0,0,.4,1);c=d(c)}else.522<=c&&.922>c?(d=Y(.522,1,.922,0),c=d(c)):c=.4<=c&&.522>c?1:0;c*=l.L$;d=a;if(.401<=d&&.461>d){var e=Y(.401,0,.461,1);d=e(d)}else.461<=d&&.521>d?(e=Y(.461,1,.521,0),d=e(d)):d=0;xi(l.canvas, +"translateZ("+(d*f*l.direction+c)+"px)")}}};function BA(a,b,c,d){this.canvas=a;this.startTime=b;this.L$=c;this.direction=d}var CA=1,yA=2,zA=3;function DA(a,b){R.call(this,a);this.Ma(!1,!0);this.O=b}t(DA,R);DA.prototype.initialize=function(){uv(this,!1);vv(this,!0);this.Jc=S(this.slideWidth(),this.slideHeight());this.va().appendChild(this.Jc)}; +DA.prototype.Ha=function(a){var b=0;let c=0,d=0,e=0;var f=0;let g=0,h=0,l=0;switch(this.O){case EA:e=(this.slideHeight()/2+200)*a;c=e-200;h=this.slideHeight()-a*(this.slideHeight()/2+200);l=h+200;break;case FA:c=(this.slideHeight()/2+200)*(1-a);e=c-200;l=this.slideHeight()-(1-a)*(this.slideHeight()/2+200);h=l+200;break;case GA:d=(this.slideWidth()/2+200)*a;b=d-200;f=this.slideWidth()-a*(this.slideWidth()/2+200);g=f+200;break;case HA:b=(this.slideWidth()/2+200)*(1-a),d=b-200,g=this.slideWidth()-(1- +a)*(this.slideWidth()/2+200),f=g+200}a=this.Jc.getContext("2d");a.clearRect(0,0,this.slideWidth(),this.slideHeight());a.drawImage(this.Da,0,0);a.save();a.globalCompositeOperation="destination-out";b=a.createLinearGradient(b,c,d,e);b.addColorStop(0,"rgba(255, 255, 255, 1)");b.addColorStop(1,"rgba(255, 255, 255, 0)");a.fillStyle=b;this.O==GA||this.O==HA?a.fillRect(0,0,this.slideWidth()/2,this.slideHeight()):a.fillRect(0,0,this.slideWidth(),this.slideHeight()/2);f=a.createLinearGradient(f,h,g,l);f.addColorStop(0, +"rgba(255, 255, 255, 0)");f.addColorStop(1,"rgba(255, 255, 255, 1)");a.fillStyle=f;this.O==GA||this.O==HA?a.fillRect(this.slideWidth()/2,0,this.slideWidth()/2,this.slideHeight()):a.fillRect(0,this.slideHeight()/2,this.slideWidth(),this.slideHeight()/2);a.restore()};var GA=0,HA=1,EA=2,FA=3;function IA(a,b){R.call(this,a);this.Ma(!1,!0);this.O=b}t(IA,R);IA.prototype.initialize=function(){uv(this,!1);vv(this,!0);this.Jc=S(this.slideWidth(),this.slideHeight());F(this.Jc,"position","relative");this.va().appendChild(this.Jc)}; +IA.prototype.Ha=function(a){var b=0;let c=0,d=0,e=0;switch(this.O){case JA:e=(this.slideHeight()+400)*a;c=e-200;b=(this.slideWidth()+400)*(1-a);d=b-200;break;case KA:c=(this.slideHeight()+400)*(1-a);e=c-200;b=(this.slideWidth()+400)*(1-a);d=b-200;break;case LA:e=(this.slideHeight()+400)*a;c=e-200;d=(this.slideWidth()+400)*a;b=d-200;break;case MA:d=(this.slideWidth()+400)*a,b=d-200,c=(this.slideHeight()+400)*(1-a),e=c-200}a=this.Jc.getContext("2d");a.clearRect(0,0,this.slideWidth(),this.slideHeight()); +a.drawImage(this.Da,0,0);a.save();a.globalCompositeOperation="destination-out";b=a.createLinearGradient(b,c,d,e);b.addColorStop(0,"rgba(255, 255, 255, 1)");b.addColorStop(1,"rgba(255, 255, 255, 0)");a.fillStyle=b;a.fillRect(0,0,this.slideWidth(),this.slideHeight());a.restore()};var JA=0,KA=1,LA=2,MA=3;function NA(a,b,c){R.call(this,a);this.O=b;this.Fz=c;this.Ma(!0,!0)}t(NA,R);k=NA.prototype; +k.initialize=function(){uv(this,!1);vv(this,!1);const a=this.slideWidth(),b=this.slideHeight();this.Ne=this.nc(a,b);this.va().appendChild(this.Ne);var c=S(a,b),d=S(a,b);this.Dc=this.nc(a,b);this.mh=this.nc(a,b);this.lh=this.nc(a,b);this.Fz||(this.Dn=S(a,b));this.mh.appendChild(c);this.lh.appendChild(d);this.Ne.appendChild(this.Dc);this.Dc.appendChild(this.lh);this.Dc.appendChild(this.mh);this.Fz||(F(this.Dn,"position","absolute"),this.Dc.appendChild(this.Dn));c=c.getContext("2d");d=d.getContext("2d"); +c.drawImage(this.Da,0,0);d.drawImage(this.mb,0,0);this.Fz||(this.Dn.getContext("2d").drawImage(this.mb,0,0),this.na()||H(this.Dn,0));this.RE=!1;this.Fz&&(Di(this.Ne,Math.max(a,b)+"px"),Ei(this.Ne,this.slideWidth()/2+"px "+this.slideHeight()/2+"px"),Ci(this.Dc,"preserve-3d"))};k.nc=function(a,b){const c=zd("DIV");Oh(c,a);Ph(c,b);F(c,"position","absolute");return c}; +k.Ha=function(a){const b=this.O==OA?-1:1;if(this.Fz){var c=.25*(1-Math.cos(2*a*Math.PI));var d=Math.max(this.slideHeight(),this.slideWidth()),e=this.U1,f=this.V1,g=this.YI,h=-b*c*this.slideWidth()/2,l=c*this.slideHeight()*1.5;xi(this.Dc,"translateZ("+d+"px) translateY("+l+"px) translateX("+h+"px) rotateX("+-e*c+"deg) rotateY("+-b*f*c+"deg) rotateZ("+b*g*c+"deg)");PA(this,a,!1);PA(this,a,!0)}else e=this.slideHeight()/2,c=.25*(1-Math.cos(2*a*Math.PI)),d=-e*c,e=(this.slideHeight()+e)*c,Gh(this.mh,0, +d),Gh(this.lh,0,e),Gh(this.Dn,0,e),e=new gm,d=new gm,e.rotate(this.YI*Math.PI/180*b*c,0,0),d.rotate(this.YI*Math.PI/180*b*c,0,0),on(this.mh,e),on(this.lh,d),on(this.Dn,d),c=Math.max(1-a,.8),e.scale(c,c),on(this.mh,e),c=this.na()?Math.max(a,.8):Math.max(.5>a?1-a:a,.8),d.scale(c,c),on(this.lh,d),on(this.Dn,d),.5<=a&&!this.RE&&!this.na()?(this.RE=!0,H(this.Dn,1)):.5>=a&&!this.RE&&this.na()&&(this.RE=!0,H(this.Dn,0))}; +function PA(a,b,c){var d=a.slideHeight()/2;const e=.25*(1-Math.cos(2*b*Math.PI));d=(c?-(d+a.Gl):a.slideHeight()+d+a.Gl)*e;b=-(c?1+b:2-b)*Math.max(a.slideWidth(),a.slideHeight());xi(c?a.mh:a.lh,"translateY("+d+"px) translateZ("+b+"px)")}k.U1=30;k.V1=20;k.YI=30;k.Gl=20;var OA=1;function QA(a,b,c){R.call(this,a);this.xc=c;this.Ma(!0,!0);this.Vn=b==OA}t(QA,R);k=QA.prototype; +k.initialize=function(){uv(this,!1);vv(this,!1);const a=this.slideWidth(),b=this.slideHeight();this.kH=this.nc(a,b);this.va().appendChild(this.kH);this.up=this.nc(a,b);this.Mg=this.nc(a,b);this.Kg=this.nc(a,b);this.Vn?(this.Mg.appendChild(this.mb),this.Kg.appendChild(this.Da)):(this.Mg.appendChild(this.Da),this.Kg.appendChild(this.mb));this.kH.appendChild(this.up);this.Vn?(this.up.appendChild(this.Mg),this.up.appendChild(this.Kg)):(this.up.appendChild(this.Kg),this.up.appendChild(this.Mg));this.mH= +!1;this.xc&&(Di(this.kH,Math.max(a,b)+"px"),Ei(this.kH,this.slideWidth()/2+"px "+this.slideHeight()/2+"px"),Ci(this.up,"preserve-3d"))};k.Ha=function(a){a=this.Vn?1-a:a;this.xc?this.JN(a):this.NK(a)}; +k.JN=function(a){function b(g){const h=g?-1:1,l=g?this.Mg:this.Kg;g="translateZ("+(g?e:f).call(this,a)*d+"px)rotateY("+-30*h*c+"deg)translateX("+h*c*this.slideWidth()*1.05+"px)";xi(l,g)}const c=.25*(1-Math.cos(2*a*Math.PI)),d=Math.max(this.slideWidth(),this.slideHeight()),e=Y(0,0,1,-.3),f=Y(0,-.3,1,0);b.call(this,!0);b.call(this,!1)}; +k.NK=function(a){function b(d){const e=d?-1:1;d=d?this.Mg:this.Kg;const f=new gm;f.scale(1-.5*c,1-.5*c);f.translate(e*c*this.slideWidth()*1.05,0);on(d,f)}this.Vn?.5>a&&!this.mH&&(this.up.appendChild(this.Mg),this.mH=!0):.5<=a&&!this.mH&&(this.up.appendChild(this.Kg),this.mH=!0);const c=.25*(1-Math.cos(2*a*Math.PI));this.slideWidth();this.slideHeight();b.call(this,!0);b.call(this,!1)};k.nc=function(a,b){const c=zd("DIV");Oh(c,a);Ph(c,b);F(c,"position","absolute");return c};function RA(a,b){R.call(this,a);this.O=b;this.Ma(!0,!0);this.$q()}var SA,TA,UA,VA,WA,XA,YA;t(RA,R); +RA.prototype.$q=function(){var a=this.slideWidth(),b=this.slideHeight(),c=XA!=a||YA!=b;if(!(SA&&TA&&UA&&VA&&WA)||c){XA=a;YA=b;SA=[];TA=[];UA=[];VA=[];WA=[];a=this.slideWidth();b=this.slideHeight();c=SA;const g=TA,h=UA;for(var d=0;d=Ma.JQ;m=Ma;var r=gc,v=p;p=ha;var y=ra,D=tb,I=Db;const Zk=this.O==hB||this.O==iB,$k=this.na();var A=this.slideWidth(), +J=this.slideHeight();const ru=this.FD.getContext("2d"),Ho=SA;var T=TA,U=UA;const Io=this.Da,Jo=this.mb;v&&(v=Ho[r],r=(Zk?T:U)[r],T=m.eQ.getContext("2d"),U=m.EP.getContext("2d"),A-=p+D,J-=y+I,T.drawImage(v,p,y,D,I,0,0,D,I),U.drawImage(r,A,J,D,I,0,0,D,I),T.save(),T.globalCompositeOperation="source-out",T.drawImage(Io,p,y,D,I,0,0,D,I),T.restore(),U.save(),U.globalCompositeOperation="source-out",U.drawImage(Jo,A,J,D,I,0,0,D,I),U.restore(),ru.clearRect($k&&Zk?A:p,$k&&!Zk?J:y,D,I),m.n0=!0)}Ma.PR(a,g,h, +aa.A$)}}};function kB(a,b,c){this.i7=a;this.q0=[];this.S7=b;this.UE=c}kB.prototype.PR=function(a){const b=this.UE;a=(a-this.S7)/fB;a=Math.min(Math.max(a,0),1);a=Math.PI*a*(b?1:-1);xi(this.i7,(b?"rotateY":"rotateX")+"("+a+"rad)");this.A$=a}; +function gB(a,b,c,d,e,f,g,h,l,n,m,p){this.eQ=b;this.EP=c;xi(c,(m?"rotateY":"rotateX")+"(180deg)");this.Ee=f;this.rc=a;this.jl=d;this.kl=e;this.gs=n;this.JQ=g;this.QW=g+(h-g)/2;this.f7=.8+this.JQ-.2;this.Q0=.8+this.QW-.2;this.w3=0>l?-1:1;this.P4=Math.abs(l);this.e5=p;this.UE=m;this.n0=!1;lB(this,!0)} +gB.prototype.PR=function(a,b,c,d){var e=this.rc,f=this.P4,g=this.Ee,h=mB(a,this.JQ,this.f7,f);a=mB(a,this.QW,this.Q0,f);f=this.UE;var l=this.e5,n=this.w3,m=l?-n:n;f&&(m=l?n:-n);l=l?Math.max(h,a):Math.min(h,a);g=Math.atan2(h-a,g)*m;h>a?yi(e,"0% 0%"):yi(e,"100% 100%");l*=n;xi(e,"translateZ("+l+"px)"+((f?"rotateY":"rotateX")+"("+g+"rad)"));f=l;e=this.jl;h=this.kl;n=this.Ee;m=this.UE;a=Array(16);a[0]=0;a[1]=0;a[2]=0;a[3]=0;a[4]=0;a[5]=0;a[6]=0;a[7]=0;a[8]=0;a[9]=0;a[10]=0;a[11]=0;a[12]=0;a[13]=0;a[14]= +0;a[15]=0;a[0]=1;a[1]=0;a[2]=0;a[3]=0;a[4]=0;a[5]=1;a[6]=0;a[7]=0;a[8]=0;a[9]=0;a[10]=1;a[11]=0;a[12]=0;a[13]=0;a[14]=0;a[15]=1;m?(b-=(e-n)/2,ti(a,b,0,0),vi(a,d),ti(a,-b,0,0),ti(a,0,0,f),vi(a,g)):(b=c-(h-n)/2,ti(a,0,b,0),ui(a,d),ti(a,0,-b,0),ti(a,0,0,f),ui(a,g));b=pi();qi(b,e,h,0,1);si(a,b,b);d=pi();qi(d,b[0],b[1],b[2],0);ri(d,this.gs,d);b=pi();qi(b,e,h,1,0);c=pi();qi(c,e,h,0,0);ri(b,c,b);si(a,b,b);d=ni(b,d);this.NE?0<=d&&lB(this,!1):0>=d&&lB(this,!0)}; +function lB(a,b){const c=b?a.eQ:a.EP,d=b?a.EP:a.eQ;a.NE=b;F(c,"visibility","visible");F(d,"visibility","hidden")}function mB(a,b,c,d){return a>=b&&a<=b+.2?d*(a-b)/.2:a>=c?Math.max(d-d*(a-c)/.2,0):a>=b?d:0}var hB=0,iB=2,jB=3;function nB(a,b){R.call(this,a);this.O=b;this.Ma(!0,!0)}t(nB,zv);k=nB.prototype;k.initialize=function(){uv(this,!1);vv(this,!1);Cv(this,this.Da);this.Bd();mat4.translate(this.jb,[-this.slideWidth()/2,this.slideHeight()/2,0]);Uv(this)}; +k.Vh=function(){Nv(this);this.hT=Ov(this,"aDelay");this.fV=Ov(this,"aMaxDistance");this.RA=Pv(this,"uSampler1");this.SA=Pv(this,"uSampler2");this.jg=Pv(this,"uPhase");const a=Pv(this,"uSlideWidth"),b=Pv(this,"uHorizontal");this.N.uniform1f(Pv(this,"uSlideHeight"),this.slideHeight());this.N.uniform1f(a,this.slideWidth());this.N.uniform1i(b,this.O==hB||this.O==iB?1:0)};k.Lh=function(){Ev(this,this.hT);Ev(this,this.fV)}; +k.vJ=function(){const a=this.N;a.bindBuffer(a.ARRAY_BUFFER,this.tK);a.vertexAttribPointer(this.hT,this.tK.Ax,a.FLOAT,!1,0,0);a.bindBuffer(a.ARRAY_BUFFER,this.xK);a.vertexAttribPointer(this.fV,this.xK.Ax,a.FLOAT,!1,0,0)}; +k.Bd=function(){var a=this.slideWidth();const b=this.slideHeight();var c=ij&&Ii,d=Ni&&Ii||c;c=d?26:50;d=d?20:45;const e=a/c,f=b/d;this.rb=new oB;for(let g=0;g endTime)\n\t\t{\n\t\t\tpPhase = 1.0;\n\t\t}\n\t\tfloat z = 4.0 * aMaxDistance * pPhase * (pPhase - 1.0);\n\t\tfloat rotation = 180.0 * pPhase;\n\n\t\tmat4 m = mat4(1.0);\n\n\t\tvec3 pivotPoint = vec3(- uSlideWidth / 2.0, uSlideHeight / 2.0, 0.0);\n\t\tm = m * translationMatrix(-pivotPoint.x, -pivotPoint.y, -pivotPoint.z);\n\t\tif (uHorizontal)\n\t\t{\n\t\t m = m * rotationYmatrix(rotation);//left right\n\t\t}\n\t\telse \n\t\t{\n\t\t\tm = m * rotationXmatrix(rotation);//top bottom\n\t\t}\n\t\tm = m * translationMatrix(pivotPoint.x, pivotPoint.y, pivotPoint.z);\n\t\tm = m * translationMatrix(0.0, 0.0, z);\n\n\t\treturn m;\n\t}\n\n\tvec3 getVertexPosition() \n\t{ \n\t\tmat4 m = positionMatrix();\n\t\tvec4 v = m * vec4(aVertexPosition, 1.0);\n\t\treturn v.xyz;\n\t} \n\tvec3 getNormal() \n\t{\n\t\tmat4 m = positionMatrix();\n\t\tvec4 v = m * vec4(0 ,0, 1, 0.0);\n\t\treturn v.xyz;\n\t}\n\tvoid main(void)\n\t{\n\t\tvTextureCoord = aTextureCoord;\n\n\t\tvec3 pos = getVertexPosition();\n\t\tvec3 n = getNormal();\n\t\tn = normalize(n);\n\t\tgl_Position = uPMVMatrix * vec4(pos, 1.0); \n\t\tvNormal = uNMatrix * n;\n\t}"}; +function oB(){this.US=0;this.tN=[];this.uK=[];this.yK=[];this.FO=[];this.hh=[]}k=oB.prototype;k.Uw=function(a){this.tN=this.tN.concat(a.TQ());this.uK=this.uK.concat(a.PP());this.yK=this.yK.concat(a.RP());this.FO=this.FO.concat(a.JR());const b=4*this.US;for(let c=0;c=1.5*Math.PI&&(d.beginPath(),d.moveTo(b,c),d.arc(b,c,this.Rg,3*Math.PI-a,a,!1),d.lineTo(b,c),d.fillStyle="#000",d.fill());d=this.tA;d.drawImage(this.mb,0,0);d.save();d.globalCompositeOperation="destination-in";d.drawImage(this.Jc,0,0);d.restore()}; +uB.prototype.cE=function(a,b,c,d,e,f,g){const h=this.Vf;h.fillStyle="rgba(0,0,0,"+g.toString()+")";h.beginPath();h.moveTo(a,b);h.lineTo(c,d);h.lineTo(e,f);h.fill()}; +uB.prototype.zK=function(a,b){const c=.5*this.slideWidth(),d=.5*this.slideHeight();let e=vB;b-=a;var f=a;f<1.5*Math.PI&&(e=(1.5*Math.PI-a)/b,f=1.5*Math.PI);let g=c+this.Rg*Math.cos(f),h=d+this.Rg*Math.sin(f),l=c+this.Rg*Math.cos(3*Math.PI-f);for(f=d+this.Rg*Math.sin(3*Math.PI-f);1>=e;){let n=a+e*b;n>2.5*Math.PI&&(n=2.5*Math.PI);const m=c+this.Rg*Math.cos(n),p=d+this.Rg*Math.sin(n);this.cE(c,d,g,h,m,p,1-e);const r=c+this.Rg*Math.cos(3*Math.PI-n),v=d+this.Rg*Math.sin(3*Math.PI-n);this.cE(c,d,l,f,r, +v,1-e);e+=vB;g=m;h=p;l=r;f=v;if(n==2.5*Math.PI)break}};function wB(a,b){R.call(this,a);this.Un=!1;0>b&&(b=-b,this.Un=!0);this.yO=b;this.Ma(!0,!1)}t(wB,R);wB.prototype.initialize=function(){var a=this.slideWidth();const b=this.slideHeight();vv(this,!1);const c=S(a,b);this.tA=c.getContext("2d");this.Jc=S(a,b);this.Vf=this.Jc.getContext("2d");this.Vf.scale(1,b/a);a*=.5;this.Rg=Math.sqrt(2*a*a);F(c,"position","absolute");this.va().appendChild(c)};var xB=1/15; +wB.prototype.Ha=function(a){var b=this.slideWidth();this.slideHeight();const c=this.Vf;let d=2/this.yO,e=.2/this.yO;this.Un&&(d=-d,e=-e);c.clearRect(0,0,b,b);for(b=0;b=f)g.beginPath(),g.moveTo(l,l),this.Un?g.arc(l,l,this.Rg,f,h,!0):g.arc(l,l,this.Rg,f,h,!1),g.lineTo(l,l),g.fillStyle="#000",g.fill()}a=this.tA;a.drawImage(this.mb,0,0);a.save(); +a.globalCompositeOperation="destination-in";a.drawImage(this.Jc,0,0);a.restore()};wB.prototype.cE=function(a,b,c,d,e,f,g){const h=this.Vf;h.fillStyle="rgba(0,0,0,"+zn(g).toString()+")";h.beginPath();h.moveTo(a,b);h.lineTo(c,d);h.lineTo(e,f);h.fill()}; +wB.prototype.zK=function(a,b,c,d){const e=.5*this.slideWidth();let f=xB;b-=a;var g=a;if(this.Un&&g>c||!this.Un&&g=f;){let h=a+f*b;if(this.Un&&hd)h=d;const l=e+this.Rg*Math.cos(h),n=e+this.Rg*Math.sin(h);this.cE(e,e,c,g,l,n,1-f);f+=xB;c=l;g=n;if(h==d)break}};function yB(a,b){R.call(this,a);this.O=b;this.Ma(!1,!0)}t(yB,zv);k=yB.prototype;k.initialize=function(){uv(this,!1);vv(this,!0);Cv(this,this.Da);this.Bd();this.N.enable(this.N.DEPTH_TEST);mat4.translate(this.jb,[-this.slideWidth()/2,this.slideHeight()/2,0]);this.yB=mat4.create();mat4.set(this.jb,this.yB)}; +k.Bd=function(){this.hg=Dx(20,20,this.slideWidth(),this.slideHeight());for(var a=0==this.O?Gx(20,20):Fx(20,20),b=[],c=0,d=a.length;c+2e)){var f=a[c++];if(!(0>f))for(var g=!0;ch)break;e!=f&&e!=h&&f!=h&&b.push(e,f,h);g?e=h:f=h;g=!g}}}this.xe=b;this.Gq=new fw;for(a=0;am;m++)v[0].push(zB(3,m,n));for(m=0;4>m;m++)v[1].push(zB(3,m,p));for(m=0;2>m;m++)v[2].push(zB(1,m,r));this.ZZ.push(v)}this.oh=[];for(c=0;4>c;c++)for(d=0;4>d;d++)for(e=0;2>e;e++)f=this.zj(c,d,e),g=a,h=b,l=d,n=e,p=[0,0,0],p[0]=g[0]+c/3*(h[0]-g[0]),p[1]=g[1]+l/3*(h[1]-g[1]),p[2]=g[2]+n/1*(h[2]-g[2]),g=p,this.oh[f]= +g[0],this.oh[f+1]=g[1],this.oh[f+2]=g[2];this.AA={}};function zB(a,b,c){let d=1;for(let e=1;e<=b;e++)d*=(a-(b-e))/e;return d*Math.pow(c,b)*Math.pow(1-c,a-b)}k.zj=function(a,b,c){return 3*(a+4*b+16*c)};k.Kh=function(){Fv(this,this.Ei)};k.Lh=function(){Ev(this,this.ol)};k.Nh=function(){return"precision mediump float;\n\n\tvarying vec2 vTextureCoord;\n\tvarying vec3 vNormal;\n\n\tuniform sampler2D uSampler;\n\n\tconst vec3 LIGHT_DIRECTION = vec3(0.0, 0.0, 1.0);\n\tconst float AMBIENT_INTENSITY = 0.4;\n\tconst float DIFFUSE_INTENSITY = 0.6;\n\n\tvoid main(void)\n\t{\n\t\tfloat diffuseFactor = dot(normalize(vNormal), LIGHT_DIRECTION);\n\t\tfloat intentsity = AMBIENT_INTENSITY + DIFFUSE_INTENSITY * diffuseFactor * diffuseFactor;\n\t\tvec4 textureColor = texture2D(uSampler, vTextureCoord);\n\t\tgl_FragColor = vec4(textureColor.rgb * intentsity, textureColor.a);\n\t}"}; +k.Oh=function(){return"attribute vec3 aVertexPosition;\n\tattribute vec3 aVertexNormal;\n\tattribute vec2 aTextureCoord;\n\n\tuniform mat4 uPMVMatrix;\n\n\tuniform mat3 uNMatrix;\n\n\tvarying vec2 vTextureCoord;\n\tvarying vec3 vNormal;\n\n\tvoid main(void)\n\t{\n\t\tgl_Position = uPMVMatrix * vec4(aVertexPosition, 1.0);\n\t\tvTextureCoord = aTextureCoord;\n\t\tvNormal = uNMatrix * normalize(aVertexNormal);\n\t}"};k.Vh=function(){Nv(this);this.ol=Ov(this,"aVertexNormal");this.We=Pv(this,"uSampler")}; +k.yj=function(){return this.We};function AB(a,b,c,d){let e=a.zj(b,c,0);const f=b.toString()+c.toString();let g;void 0===a.AA[f]?(g=[a.oh[e+0],a.oh[e+1],a.oh[e+2]],a.AA[f]=[g[0],g[1],g[2]]):g=[a.AA[f][0],a.AA[f][1],a.AA[f][2]];mat4.multiplyVec3(d,g,g);a.oh[e+0]=g[0];a.oh[e+1]=g[1];a.oh[e+2]=g[2];e=a.zj(b,c,1);a.oh[e+0]=g[0];a.oh[e+1]=g[1];a.oh[e+2]=g[2]}k.iz=function(){return this.ol}; +k.GJ=function(){for(let a=0;ab&&CB(a,e,0,.2*a.slideHeight(),b);.6<=b&&CB(a,f,.2*a.slideHeight(),-.7*a.slideHeight(),b);mat4.identity(g);mat4.translate(g,[0,0,-.3*a.slideHeight()*Math.sin(1.5*Math.PI*d)]);c=0==a.O?0:3;AB(a,c,0,g)} +function EB(a,b){for(var c=0;c.2*a.slideWidth()?BB(a,d,b):0:d.position().x()<.8*a.slideWidth()?BB(a,d,b):0;var e=a.Gq.gb[c],f=a,g=a.ZZ[c];let h;const l=new W;for(let n=0;4>n;n++){const m=new W;for(let p=0;4>p;p++){const r=new W;for(let v=0;2>v;v++){const y=f.zj(n,p,v);h=g[2][v];Wv(r,new W(f.oh[y+0]*h,f.oh[y+1]*h,f.oh[y+2]*h))}h=g[1][p];Wv(m,new W(r.x()*h,r.y()*h,r.z()*h))}h=g[0][n];Wv(l,new W(m.x()*h,m.y()*h,m.z()*h))}ew(e,l.add(new W(0, +0,d)));Tv(a.Gq.gb[c],new W)}a.GJ();for(b=0;b=parseFloat(Vb)?!1:Wi(),d=Xi();if(!Zs){const e={"null":function(h){return new $s(h)},Cut:function(h){return new Ix(h)},CutThroughBlack:function(h){return new Jx(h)}};c?(e.BlindsHorizontal=function(h){return new nw(h,1)},e.BlindsVertical=function(h){return new nw(h,pw)}):(e.BlindsHorizontal=function(h){return new uw(h,1)},e.BlindsVertical=function(h){return new uw(h,vw)});e.CheckerboardAcross=function(h){return new Jw(h,Nw)};e.CheckerboardDown=function(h){return new Jw(h, +Kw)};e.Dissolve=function(h){return new Kx(h)};e.FadeThroughBlack=function(h){return new Wx(h)};b&&2013>a&&2007!=a?(e.CoverLeft=function(h){return new Zw(h,hx,!1)},e.CoverUp=function(h){return new Zw(h,ex,!1)},e.CoverRight=function(h){return new Zw(h,ix,!1)},e.CoverDown=function(h){return new Zw(h,gx,!1)},e.CoverLeftUp=function(h){return new Zw(h,kx,!1)},e.CoverRightUp=function(h){return new Zw(h,mx,!1)},e.CoverLeftDown=function(h){return new Zw(h,jx,!1)},e.CoverRightDown=function(h){return new Zw(h, +lx,!1)},e.UncoverLeft=function(h){return new Zw(h,hx,!0)},e.UncoverUp=function(h){return new Zw(h,ex,!0)},e.UncoverRight=function(h){return new Zw(h,ix,!0)},e.UncoverDown=function(h){return new Zw(h,gx,!0)},e.UncoverLeftUp=function(h){return new Zw(h,kx,!0)},e.UncoverRightUp=function(h){return new Zw(h,mx,!0)},e.UncoverLeftDown=function(h){return new Zw(h,jx,!0)},e.UncoverRightDown=function(h){return new Zw(h,lx,!0)}):(e.CoverLeft=function(h){return new rx(h,hx,!1)},e.CoverUp=function(h){return new rx(h, +ex,!1)},e.CoverRight=function(h){return new rx(h,ix,!1)},e.CoverDown=function(h){return new rx(h,gx,!1)},e.CoverLeftUp=function(h){return new rx(h,kx,!1)},e.CoverRightUp=function(h){return new rx(h,mx,!1)},e.CoverLeftDown=function(h){return new rx(h,jx,!1)},e.CoverRightDown=function(h){return new rx(h,lx,!1)},e.UncoverLeft=function(h){return new rx(h,hx,!0)},e.UncoverUp=function(h){return new rx(h,ex,!0)},e.UncoverRight=function(h){return new rx(h,ix,!0)},e.UncoverDown=function(h){return new rx(h, +gx,!0)},e.UncoverLeftUp=function(h){return new rx(h,kx,!0)},e.UncoverRightUp=function(h){return new rx(h,mx,!0)},e.UncoverLeftDown=function(h){return new rx(h,jx,!0)},e.UncoverRightDown=function(h){return new rx(h,lx,!0)});e.RandomBarsHorizontal=function(h){return new $z(h,aA)};e.RandomBarsVertical=function(h){return new $z(h,bA)};e.StripsLeftUp=function(h){return new IA(h,KA)};e.StripsRightUp=function(h){return new IA(h,MA)};e.StripsLeftDown=function(h){return new IA(h,JA)};e.StripsRightDown=function(h){return new IA(h, +LA)};e.WipeLeft=function(h){return new GB(h,JB)};e.WipeUp=function(h){return new GB(h,IB)};e.WipeRight=function(h){return new GB(h,KB)};e.WipeDown=function(h){return new GB(h,HB)};e.BoxOut=function(h){return new yw(h,zw)};e.BoxIn=function(h){return new yw(h,Aw)};e.SplitHorizontalOut=function(h){return new DA(h,FA)};e.SplitHorizontalIn=function(h){return new DA(h,EA)};e.SplitVerticalOut=function(h){return new DA(h,HA)};e.SplitVerticalIn=function(h){return new DA(h,GA)};e.ShapeCircle=function(h){return new rA(h)}; +e.ShapeDiamond=function(h){return new sA(h)};e.CombHorizontal=function(h){return new Qw(h,Rw)};e.CombVertical=function(h){return new Qw(h,1)};e.FadeSmoothly=function(h){return new Vx(h)};e.Newsflash=function(h){return new wz(h)};e.ShapePlus=function(h){return new uA(h)};e.PushDown=function(h){return new Vz(h,Wz)};e.PushLeft=function(h){return new Vz(h,Xz)};e.PushRight=function(h){return new Vz(h,Yz)};e.PushUp=function(h){return new Vz(h,Zz)};e.Wedge=function(h){return new uB(h)};e.Wheel1Spoke=function(h){return new wB(h, +1)};e.Wheel2Spokes=function(h){return new wB(h,2)};e.Wheel3Spokes=function(h){return new wB(h,3)};e.Wheel4Spokes=function(h){return new wB(h,4)};e.Wheel8Spokes=function(h){return new wB(h,8)};e.WheelReverse1Spoke=function(h){return new wB(h,-1)};e.MorphByObject=function(h){return new vz(h)};e.MorphByWord=function(h){return new vz(h)};e.MorphByChar=function(h){return new vz(h)};b?d?(e.VortexLeft=function(h){return new nB(h,hB)},e.VortexUp=function(h){return new nB(h,1)},e.VortexRight=function(h){return new nB(h, +iB)},e.VortexDown=function(h){return new nB(h,jB)}):(e.VortexLeft=function(h){return new RA(h,hB)},e.VortexUp=function(h){return new RA(h,1)},e.VortexRight=function(h){return new RA(h,iB)},e.VortexDown=function(h){return new RA(h,jB)}):(e.VortexLeft=function(h){return new Kx(h)},e.VortexUp=function(h){return new Kx(h)},e.VortexRight=function(h){return new Kx(h)},e.VortexDown=function(h){return new Kx(h)});!d||Ni||ij?(e.RippleCenter=function(h){return new kA(h,lA)},e.RippleRightUp=function(h){return new kA(h, +oA)},e.RippleLeftUp=function(h){return new kA(h,mA)},e.RippleLeftDown=function(h){return new kA(h,nA)},e.RippleRightDown=function(h){return new kA(h,pA)}):(e.RippleCenter=function(h){return new qA(h,lA)},e.RippleRightUp=function(h){return new qA(h,oA)},e.RippleLeftUp=function(h){return new qA(h,mA)},e.RippleLeftDown=function(h){return new qA(h,nA)},e.RippleRightDown=function(h){return new qA(h,pA)});e.GlitterDiamondLeft=function(h){return new ly(h,qy,oy)};e.GlitterDiamondUp=function(h){return new ly(h, +qy,my)};e.GlitterDiamondRight=function(h){return new ly(h,qy,py)};e.GlitterDiamondDown=function(h){return new ly(h,qy,ny)};e.GlitterHexagonLeft=function(h){return new ly(h,1,oy)};e.GlitterHexagonUp=function(h){return new ly(h,1,my)};e.GlitterHexagonRight=function(h){return new ly(h,1,py)};e.GlitterHexagonDown=function(h){return new ly(h,1,ny)};b?(e.GalleryLeft=function(h){return new hy(h,jy,!1)},e.GalleryRight=function(h){return new hy(h,ky,!1)}):(e.GalleryLeft=function(h){return new Vz(h,Xz)},e.GalleryRight= +function(h){return new Vz(h,Yz)});b?(e.ConveyorLeft=function(h){return new hy(h,jy,!0)},e.ConveyorRight=function(h){return new hy(h,ky,!0)}):(e.ConveyorLeft=function(h){return new Nz(h,Pz,!0)},e.ConveyorRight=function(h){return new Nz(h,Oz,!0)});e.DoorsVertical=function(h){return new Qx(h,Rx,!1,!0)};e.DoorsHorizontal=function(h){return new Qx(h,Sx,!1,!0)};e.WindowVertical=function(h){return new Qx(h,Rx,!0,2013>a)};e.WindowHorizontal=function(h){return new Qx(h,Sx,!0,2013>a)};e.WarpIn=function(h){return new qB(h, +rB,!1,!1)};e.WarpOut=function(h){return new qB(h,1,!1,!1)};e.FlyThroughIn=function(h){return new qB(h,rB,!0,!1)};e.FlyThroughOut=function(h){return new qB(h,1,!0,!1)};e.FlyThroughInBounce=function(h){return new qB(h,rB,!0,!0)};e.FlyThroughOutBounce=function(h){return new qB(h,1,!0,!0)};e.RevealSmoothLeft=function(h){return new dA(h,gA)};e.RevealSmoothRight=function(h){return new dA(h,fA)};e.RevealBlackLeft=function(h){return new dA(h,eA)};e.RevealBlackRight=function(h){return new dA(h,3)};e.Honeycomb= +function(h){return new zy(h)};b?(e.FerrisWheelLeft=function(h){return new Yx(h,0)},e.FerrisWheelRight=function(h){return new Yx(h,Zx)}):(e.FerrisWheelLeft=function(h){return new Nz(h,Qz,!0)},e.FerrisWheelRight=function(h){return new Nz(h,Qz,!0)});const f=2013<=a?QA:NA,g=2013<=a?dy:by;e.SwitchLeft=function(h){return new f(h,0,c)};e.SwitchRight=function(h){return new f(h,OA,c)};e.FlipLeft=function(h){return new g(h,0,c)};e.FlipRight=function(h){return new g(h,cy,c)};e.Flashbulb=function(h){return new $x(h)}; +c?(e.ShredStripsIn=function(h){return new xA(h,0)},e.ShredStripsOut=function(h){return new xA(h,CA)},e.ShredRectangleIn=function(h){return new xA(h,yA)},e.ShredRectangleOut=function(h){return new xA(h,zA)}):(e.ShredStripsIn=function(h){return new Kx(h)},e.ShredStripsOut=function(h){return new Kx(h)},e.ShredRectangleIn=function(h){return new Kx(h)},e.ShredRectangleOut=function(h){return new Kx(h)});e.CubeLeft=function(h){return new yx(h,Bx,!1,c)};e.CubeUp=function(h){return new yx(h,Ax,!1,c)};e.CubeRight= +function(h){return new yx(h,Cx,!1,c)};e.CubeDown=function(h){return new yx(h,zx,!1,c)};e.RotateLeft=function(h){return new yx(h,Bx,!0,c)};e.RotateUp=function(h){return new yx(h,Ax,!0,c)};e.RotateRight=function(h){return new yx(h,Cx,!0,c)};e.RotateDown=function(h){return new yx(h,zx,!0,c)};c?(e.BoxLeft=function(h){return new Fw(h,Iw,!1)},e.BoxUp=function(h){return new Fw(h,0,!1)},e.BoxRight=function(h){return new Fw(h,Gw,!1)},e.BoxDown=function(h){return new Fw(h,Hw,!1)},e.OrbitLeft=function(h){return new Fw(h, +Iw,!0)},e.OrbitUp=function(h){return new Fw(h,0,!0)},e.OrbitRight=function(h){return new Fw(h,Gw,!0)},e.OrbitDown=function(h){return new Fw(h,Hw,!0)}):(e.BoxLeft=function(h){return new Vz(h,Xz)},e.BoxUp=function(h){return new Vz(h,Zz)},e.BoxRight=function(h){return new Vz(h,Yz)},e.BoxDown=function(h){return new Vz(h,Wz)},e.OrbitLeft=function(h){return new Nz(h,Pz,!0)},e.OrbitUp=function(h){return new Nz(h,3,!0)},e.OrbitRight=function(h){return new Nz(h,Oz,!0)},e.OrbitDown=function(h){return new Nz(h, +Qz,!0)});e.PanLeft=function(h){return new Nz(h,Pz,2013>a)};e.PanUp=function(h){return new Nz(h,3,2013>a)};e.PanRight=function(h){return new Nz(h,Oz,2013>a)};e.PanDown=function(h){return new Nz(h,Qz,2013>a)};d?(e.AirplaneLeft=function(h){return new kw(h,lw)},e.AirplaneRight=function(h){return new kw(h,1)},e.OrigamiLeft=function(h){return new Bz(h,Dz)},e.OrigamiRight=function(h){return new Bz(h,Hz)},e.DrapeLeft=function(h){return new Tx(h,Ux)},e.DrapeRight=function(h){return new Tx(h,1)},e.FallOverLeft= +function(h){return new Xx(h,0)},e.FallOverRight=function(h){return new Xx(h,1)},e.Curtains=function(h){const l=new Hx(h);return l.HR()?l:new Vx(h)},e.Fracture=function(h){return new ey(h)},e.Crush=function(h){return new tx(h)},e.WindRight=function(h){return new yB(h,0)},e.WindLeft=function(h){return new yB(h,1)},e.PeelOffLeft=function(h){return new Rz(h,Sz)},e.PeelOffRight=function(h){return new Rz(h,1)},e.Prestige=function(h){const l=new Tz(h);return l.HR()?l:new Vx(h)},e.PageCurlDoubleLeft=function(h){return new Lz(h, +0)},e.PageCurlDoubleRight=function(h){return new Lz(h,1)},e.PageCurlSingleLeft=function(h){return new Lz(h,2)},e.PageCurlSingleRight=function(h){return new Lz(h,3)}):(e.AirplaneLeft=function(h){return new Vx(h)},e.AirplaneRight=function(h){return new Vx(h)},e.OrigamiLeft=function(h){return new Vx(h)},e.OrigamiRight=function(h){return new Vx(h)},e.DrapeLeft=function(h){return new Vx(h)},e.DrapeRight=function(h){return new Vx(h)},e.FallOverLeft=function(h){return new Vx(h)},e.FallOverRight=function(h){return new Vx(h)}, +e.Curtains=function(h){return new Vx(h)},e.Fracture=function(h){return new Vx(h)},e.Crush=function(h){return new Vx(h)},e.WindRight=function(h){return new Vx(h)},e.WindLeft=function(h){return new Vx(h)},e.PeelOffLeft=function(h){return new Vx(h)},e.PeelOffRight=function(h){return new Vx(h)},e.Prestige=function(h){return new Vx(h)},e.PageCurlDoubleLeft=function(h){return new Vx(h)},e.PageCurlDoubleRight=function(h){return new Vx(h)},e.PageCurlSingleLeft=function(h){return new Vx(h)},e.PageCurlSingleRight= +function(h){return new Vx(h)});e.Zoom=function(h){return new MB(h)};Zs=e}} +var Zs,Ys=[["PushUp","PushLeft","PushRight","PushDown"],["ShapePlus","ShapeCircle","ShapeDiamond"],["BlindsVertical","BlindsHorizontal"],["BoxIn","BoxOut"],["CheckerboardAcross","CheckerboardDown"],["Flashbulb"],["WipeDown","WipeUp","WipeLeft","WipeRight"],["RandomBarsVertical","RandomBarsHorizontal"],["FadeSmoothly","FadeThroughBlack"],["null"],["Cut","CutThroughBlack"],["CombHorizontal","CombVertical"],["Dissolve"],["FlyThroughIn","FlyThroughOut","FlyThroughInBounce","FlyThroughOutBounce"],["WarpIn", +"WarpOut"],["Newsflash"],["BoxLeft","BoxUp","BoxRight","BoxDown"],["OrbitUp","OrbitDown","OrbitLeft","OrbitRight"],["WindowHorizontal","WindowVertical"],["DoorsHorizontal","DoorsVertical"],["FerrisWheelLeft","FerrisWheelRight"],["SwitchLeft","SwitchRight"],["GalleryLeft","GalleryRight"],["RippleCenter","RippleRightUp","RippleLeftUp","RippleLeftDown","RippleRightDown"],["VortexLeft","VortexRight","VortexUp","VortexDown"],["ShredStripsIn","ShredStripsOut","ShredRectangleIn","ShredRectangleOut"],["FlipLeft", +"FlipRight"],"CoverLeft CoverUp CoverRight CoverDown CoverLeftUp CoverRightUp CoverLeftDown CoverRightDown".split(" "),"UncoverDown UncoverLeft UncoverLeftDown UncoverLeftUp UncoverRight UncoverRightDown UncoverRightUp UncoverUp".split(" "),["StripsLeftDown","StripsLeftUp","StripsRightDown","StripsRightUp"],["Honeycomb"],["SplitVerticalIn","SplitVerticalOut","SplitHorizontalIn","SplitHorizontalOut"],"Wedge Wheel1Spoke Wheel2Spokes Wheel3Spokes Wheel4Spokes Wheel8Spokes WheelReverse1Spoke".split(" "), +["RevealSmoothLeft","RevealSmoothRight","RevealBlackLeft","RevealBlackRight"],["CubeLeft","CubeUp","CubeRight","CubeDown"],["RotateLeft","RotateUp","RotateRight","RotateDown"],"GlitterDiamondDown GlitterDiamondUp GlitterDiamondLeft GlitterDiamondRight GlitterHexagonDown GlitterHexagonUp GlitterHexagonLeft GlitterHexagonRight".split(" "),["ConveyorLeft","ConveyorRight"],["PanLeft","PanUp","PanRight","PanDown"],["AirplaneLeft","AirplaneRight"],["OrigamiLeft","OrigamiRight"],["DrapeLeft","DrapeRight"], +["FallOverLeft","FallOverRight"],["Curtains"],["Fracture"],["Crush"],["WindRight","WindLeft"],["PeelOffLeft","PeelOffRight"],["Prestige"],["PageCurlDoubleLeft","PageCurlDoubleRight","PageCurlSingleLeft","PageCurlSingleRight"]];function OB(){}k=OB.prototype;k.MG=null;k.NG=null;k.start=function(a,b,c,d){b=jd(b[0],8);const e={};e.family=a;e.bold=!0===c;e.italic=!0===d;this.MG=new PB(e,"arial,'URW Gothic L',sans-serif",b);this.NG=new PB(e,"Georgia,'Century Schoolbook L',serif",b)};k.finish=function(){this.MG.Xc();this.MG=null;this.NG.Xc();this.NG=null};k.check=function(){return QB(this.MG)||QB(this.NG)}; +function PB(a,b,c){var d=w(a,"family","");d=String(d);const e=['"'];for(let n=0;ng)l=f;else if(l=f,l in id)l=id[l];else if(l in hd)l=id[l]=hd[l];else{g=l.charCodeAt(0);if(31g)f=l;else{if(256>g){if(f="\\x",16>g||256g&&(f+="0");f+=g.toString(16).toUpperCase()}l=id[l]=f}e[h]=l}e.push('"');d=e.join("");this.pt=zd("span");this.pt.innerHTML=c;F(this.pt,{position:"absolute",top:"-999px", +left:"-999px",fontSize:"100px",fontFamily:b,fontWeight:w(a,"bold",!1)?"bold":"normal",fontStyle:w(a,"italic",!1)?"italic":"normal",opacity:"0"});document.body.appendChild(this.pt);this.MW=Qh(this.pt).width;F(this.pt,"fontFamily",d+","+b)}PB.prototype.Xc=function(){Fd(this.pt)};function QB(a){return!!a.MW&&Qh(a.pt).width!=a.MW};var RB={};function SB(a,b,c,d){d=d||c;let e="",f=!1,g=!1;"string"!==typeof a?(e=w(a,"family",""),f=w(a,"bold",!1),g=w(a,"italic",!1)):e=a;e=e.replace(/^"|"$/g,"");if(e in RB)(RB[e]?c:d)();else{var h=h||5E3;var l=new OB;l.start(e,b,f,g);var n=Date.now(),m=setInterval(()=>{let p=!1,r=!1;l.check()?r=p=!0:Date.now()-n>h&&(p=!0,r=!1);p&&(clearInterval(m),l.finish(),r?c():d&&(Ga(`can't preload font ${a&&a.family}`),d()))},50)}} +function TB(a,b){Array.isArray(b)||(b=[b]);const c=[];u(b,d=>{c.push(d.M8+"('"+d.src()+"')"+(d.format()?" format('"+d.format()+"')":""))});return`@font-face { + font-family: '${a}'; + src: ${c.join(",")}; + ${""} + ${""} + }`}function UB(a,b){this.M8=a;this.Af=b;this.M3=null}UB.prototype.src=function(){return this.Af};UB.prototype.format=function(){return this.M3};function VB(a,b){b=a.w7.create(b);B(a,b);z(a,b.nG,a.k6,a);return b}function WB(a){"normal"==a.Gb&&bv(a.Wm,a.Fa);cv(a.Wm,b=>{if(b instanceof fv){const c="normal"==a.Gb?"":"none";b.displayObject().style.display=c}})} +class XB extends wg{constructor(a,b,c){super();this.Ue=a;this.F=b;this.Qi=c;this.Gb="normal";this.ph=new C;this.Fa=this.nc();this.hl=this.nc("slidesBackground");this.Fe=this.nc();this.Qe=new lt(this);this.mt=this.nc();this.Rf=this.nc("frontLayers");this.Fa.appendChild(this.hl);this.Fa.appendChild(this.Fe);a=this.Qe.displayObject();this.Fa.appendChild(a);this.Fe.appendChild(this.mt);this.Fe.appendChild(this.Rf);this.Fe.style.display="none";this.vc=YB(this.Ue.Ix(),{AR:this.mt,width:this.F.slideWidth(), +height:this.F.slideHeight(),Oaa:Number.MAX_VALUE,backgroundColor:"#000000",SR:this.Gb});a=new sv;this.Ge=new qv(this.F,this.vc,a,this.F.slideWidth(),this.F.slideHeight(),this.Rf);c=new gv;var d=new pv(this.vc,this.F.slides(),c,this.Qi);this.B=new Rs(this.F,this.vc,this.Ue.Ix().Ye,d,c,this.Ue,this.Ge,a,this.Qi);z(this,this.B.Bc(),this.Dj,this);z(this,this.B.Dr,this.kJ,this);a=this.B;this.Ue.hL.vt.addHandler(a.D5,a);z(this,this.B.sJ,this.k5,this);z(this,this.B.Dr,this.i5,this);this.tc=new Q(this.B, +this.F);this.w7=new Lu({Ba:this.F,uba:this.Ue,YH:this.Fa,MI:this.hl,wi:this.Fe,Vq:this.Qe,va:this.Rf,II:this.mt,W:this.B,Eca:this.Ge,Pm:this.vc});this.Gj=VB(this,"normal");b=b.fonts();a=$g||Ib;c=[];for(d=0;d{this.UK.C(iC())},!1,this)}};function $B(a,b){a.LL!=b&&((a.LL=b)&&a.Kz.enabled()?(ve(document,"keydown",a.Nv,!1,a),ve(document,"keyup",a.TV,!1,a)):(De(document,"keydown",a.Nv,!1,a),De(document,"keyup",a.TV,!1,a)))} +function lC(a,b){const c=a.B;if(!(0>c.ma())){var d=c.Z(),e=a.M;0>a.sB&&(a.sB=Date.now(),a.Zl=d.Ag(),c.pause());a=(1+(Date.now()-a.sB)/1E3)*(b?1:-1);d=d.timestamp();b=e.mi(d,!1,!0);e=e.Io(Vc(b+a,0,e.wu()),!1,!0);a=c.Ud();e.L()>d.L()?1==a.U0()?c.lf(!1):nk(a):e.L(){let c=!1,d=!1;a.Sb().removeHandler(this.wb,this);a.Ag()||(d=(c=sC(this,a.timestamp()))&&tC(this,a.timestamp()),this.ND=a.timestamp(),a.Sb().addHandler(this.wb,this));rC(this,a,c,d,!1)};this.NJ?b():setTimeout(b,0)};k.wb=function(a){var b=a.timestamp(),c;(c=!this.ND)||(c=this.ND,c=!(c.L()==b.L()&&c.Aa()==b.Aa()&&0>=Math.abs(c.ib()-b.ib())));c&&(this.ND=b,c=(b=sC(this,a.timestamp()))&&tC(this,a.timestamp()),rC(this,a,b,c,!0))}; +function sC(a,b){a=a.F.slides().ja(b.L());if(0>b.Aa())return!1;a=a.nb().pc(b.Aa());return b.ib()>=a.duration()}function tC(a,b){a=a.F.slides().ja(b.L());return b.Aa()==a.nb().count()-1}k.JM=function(a){this.remove(a)};k.HM=function(a){Ss(this.Ca,a.kd(),a)};function uC(a){this.gI=!1;this.rba=a}var qC=new uC(!1),vC=new uC(!0),wC=new uC(!0);function xC(a,b,c,d){this.M=a;this.X=b;this.zf=c;this.D=d;this.$l=new C;this.Fg=new C}k=xC.prototype;k.Pg=null;k.Be=!1;k.nl=!1;k.playing=function(){return this.D.playing()};k.kd=function(){return this.D.kd()};k.play=function(a){this.Uo(this.X.timestamp(),a||0)}; +k.Uo=function(a,b){this.LA();this.D.Cc().addHandler(this.tF,this);this.D.Fg.addHandler(this.Vp,this);this.Pg=a;this.nl=!1;this.Be=!0;this.D.activate();var c=this.D,d=c.ir;const e=this.M;a=(e.mi(this.X.timestamp(),!0,!1)-e.mi(a,!0,!1)+b)%this.zf.duration();d.call(c,a)};k.pause=function(){this.stop()};k.stop=function(){this.Be&&(this.Wl(),this.D.stop(),this.D.deactivate())};k.LA=function(){this.D.Cc().removeHandler(this.tF,this);this.D.Fg.removeHandler(this.Vp,this)}; +k.tF=function(){if("ended"==this.D.state()){let a=!0;if("untilNextSound"==this.zf.lm){const b=this.Pg.L();this.X.timestamp().L()>=b&&(this.D.seek(0),this.D.play(),a=!1)}a&&(this.Wl(),this.D.deactivate())}};k.Vp=function(){this.Fg.C(this);!this.kd()&&this.playing()&&this.nl&&this.D.pause()};k.w1=function(){this.nl=!1;this.D.play()};k.v1=function(){this.nl=!0;this.kd()||this.D.pause()};k.Wl=function(){this.Be&&(this.Be=!1,this.LA(),this.$l.C(this))};k.Vo=function(){return this.$l};(function(){if(Ob){var a=/Windows NT ([0-9.]+)/;return(a=a.exec(ub()))?a[1]:"0"}return Nb?(a=/1[0|1][_.][0-9_.]+/,(a=a.exec(ub()))?a[0].replace(/_/g,"."):"10"):Qb?(a=/Android\s+([^\);]+)(\)|;)/,(a=a.exec(ub()))?a[1]:""):Rb||Sb||Tb?(a=/(?:iPhone|CPU)\s+OS\s+(\S+)/,(a=a.exec(ub()))?a[1].replace(/_/g,"."):""):""})();function yC(a){return(a=a.exec(ub()))?a[1]:""}(function(){if($g)return yC(/Firefox\/([0-9.]+)/);if(Ib||Jb||Hb)return Vb;if(dh){if(Cb()||vb("Macintosh")){var a=yC(/CriOS\/([0-9.]+)/);if(a)return a}return yC(/Chrome\/([0-9.]+)/)}if(eh&&!Cb())return yC(/Version\/([0-9.]+)/);if(ah||bh){if(a=/Version\/(\S+).*Mobile\/(\S+)/.exec(ub()))return a[1]+"."+a[2]}else if(ch)return(a=yC(/Android\s+([0-9.]+)/))?a:yC(/Version\/([0-9.]+)/);return""})();function zC(a,b,c,d,e){eu.call(this,b,c,d,e);this.element=a}t(zC,eu);zC.prototype.mp=function(){};zC.prototype.cI=function(){this.mp();zC.Mb.cI.call(this)};zC.prototype.yl=function(){this.mp();zC.Mb.yl.call(this)};zC.prototype.Ro=function(){this.mp();zC.Mb.Ro.call(this)};function AC(a,b,c,d,e){if(2!=b.length||2!=c.length)throw Error("Start and end points must be 2D");zC.call(this,a,b,c,d,e)}t(AC,zC); +AC.prototype.mp=function(){var a;if(a=this.iD)void 0===this.OC&&(this.OC=Uh(this.element)),a=this.OC;this.element.style[a?"right":"left"]=Math.round(this.coords[0])+"px";this.element.style.top=Math.round(this.coords[1])+"px"};function BC(a,b,c,d,e){"number"===typeof b&&(b=[b]);"number"===typeof c&&(c=[c]);zC.call(this,a,b,c,d,e);if(1!=b.length||1!=c.length)throw Error("Start and end points must be 1D");this.VH=CC}t(BC,zC);var DC=1/1024,CC=-1;k=BC.prototype; +k.mp=function(){var a=this.coords[0];Math.abs(a-this.VH)>=DC&&(H(this.element,a),this.VH=a)};k.Ro=function(){this.VH=CC;BC.Mb.Ro.call(this)};k.yl=function(){this.VH=CC;BC.Mb.yl.call(this)};k.show=function(){this.element.style.display=""};k.Oc=function(){this.element.style.display="none"};function EC(a,b,c){BC.call(this,a,1,0,b,c)}t(EC,BC);function FC(a,b,c){BC.call(this,a,0,1,b,c)}t(FC,BC);class GC extends zC{constructor(a,b,c){super(null,[b],[c],200);this.P=a}mp(){this.P.Hf(this.coords[0])}};class HC extends P{constructor({ga:a,G:b,U_:c,nI:d,v_:e,tabIndex:f,Sha:g,toggle:h,rf:l}){super({ga:a,G:b,U_:c,nI:d,v_:e,tabIndex:f,Yb:"BUTTON",V9:!0,rf:l});g&&(a=g.top,b=g.right,c=g.bottom,g=g.left,this.ki=new P,N(this,this.ki),L(this.ki,"position","absolute"),L(this.ki,"top",a?`${-a}px`:0),L(this.ki,"right",b?`${-b}px`:0),L(this.ki,"bottom",c?`${-c}px`:0),L(this.ki,"left",g?`${-g}px`:0));(this.d9=h)&&this.Ac(!1);this.ny()}Ac(a){this.pf("pressed",a)}selected(){return!1}yh(){}pressed(){return"true"== +jt(this.P,"pressed")}la(a){super.la(a);this.ki&&this.Ff(this.ki,0)}gp(a){super.gp(a);this.ki&&this.Ff(this.ki,0)}};class IC extends P{constructor(a,b){super({G:"bookmark"});this.D=a;this.uy=b;this.J(!1);a.duration()?this.nv():Qe(this,a.mV,this.nv,this);x(this,this.displayObject(),Km,this.O5,this,!1)}nv(){L(this,"left",`${this.uy.time()/this.D.duration()*100}%`);this.J(!0)}O5(a){a.stopPropagation();this.D.seek(this.uy.time());return yn(this.displayObject().parentNode)}};function JC(a,b){null!==b&&0>b&&(b=null);null!==a.gi&&a.rb[a.gi].yh(!1);a.gi=b;null!==b&&a.rb[b].yh(!0);if(null!==a.gi){var c=a.rb[a.gi];b=c.displayObject().offsetTop;c=b+c.displayObject().offsetHeight;Gt(a,b,c)}}function KC(a,b){b=a.HF.indexOf(b);JC(a,0<=b?b:null)}class LC extends P{constructor({G:a,rf:b,options:c}){super({G:a,rf:b});this.nf("listbox");L(this,"position","absolute");this.HF=c.slice();Object.freeze(this.HF);this.rb=[];this.gi=null;this.$N=E(this)}options(){return this.HF}};class MC extends LC{constructor({G:a,options:b,M_:c}){super({G:a,options:b});for(const d of b){const e=c(d);e.nf("option");e.yh(!1);Ft(e,O(this,"item"));N(this,e);this.rb.push(e);z(this,e.ka,()=>{JC(this,this.rb.indexOf(e));this.$N.C()})}}$a(a,b){super.$a(a,b);this.rb.forEach(c=>c.ub())}};const NC=[{value:.75,toString:()=>"0.75x"},{value:1,toString:()=>"1x"},{value:1.25,toString:()=>"1.25x"},{value:1.5,toString:()=>"1.5x"},{value:2,toString:()=>"2x"}];function OC(a){const b=NC.find(c=>("number"===typeof a.gi?a.HF[a.gi]:null)==c.toString());return b?b.value:null}function PC(a,b){const c=NC.find(d=>d.value==b);KC(a,c?c.toString():null)} +class QC extends MC{constructor(a){super({G:"playback-rate-menu",options:NC.map(c=>c.toString()),M_:c=>{const d=new P({xI:!0});d.la(c);return d}});const b=new P({ga:O(this,"caption")});b.la(a.ha("PB_PLAYBACK_RATE_MENU_CAPTION",{},"Rate"));N(this,b,0)}};class RC extends MC{constructor(a,b){super({G:"subtitles-list",options:[b.ha("PB_SUBTITLES_OFF",{},"Off"),...a],M_:c=>{const d=new P({xI:!0});d.la(c);return d}});a=new P({ga:O(this,"caption")});a.la(b.ha("PB_SUBTITLES_MENU_CAPTION",{},"Subtitles"));N(this,a,0)}};function SC(a,b){void 0===b&&(b=a.D.muted()?0:a.D.volume());L(a.eT,"height",`${100*(1-b)}%`);return yn(a.displayObject())} +class TC extends P{constructor(a){super({G:"volume_popup"});this.D=a;this.QB=new P({G:"volume"});N(this,this.QB);this.eT=new P({G:"back"});N(this.QB,this.eT);SC(this,this.D.volume());z(this,this.D.fF,()=>SC(this));z(this,this.D.pP,()=>SC(this));x(this,this.QB.displayObject(),Km,this.b7,this)}b7(a){x(this,document,Mm,this.EF,this);x(this,document,Lm,this.GW,this);this.EF(a);this.D.Zj(!1)}EF(a){this.visible()&&(a=Lh(a,this.QB.displayObject()).y,a=Math.min(1,a/this.QB.height()),a=Math.max(0,a),a=1-a, +this.D.setVolume(a),SC(this,a))}GW(a){Ne(this,document,Mm,this.EF,this);Ne(this,document,Lm,this.GW,this);this.EF(a)}};function UC(a){const b=new HC({G:"play",toggle:!0});b.ik(!0);z(a,b.ka,()=>a.D.playing()?a.D.pause():a.D.play());return b} +function VC(a){if(a.Nw){const b=new HC({G:"rate",toggle:!0});b.ik(!0);b.fa("subtitle-button-next",WC(a));const c=new QC(a.I);c.J(!1);c.fa("subtitle-button-next",WC(a));PC(c,a.D.playbackRate());z(a,b.ka,()=>{if(c.visible()){const d=new BC(c.displayObject(),1,0,150);d.play();Me(a,d,"finish",()=>{c.J(!1);b.Ac(!1);wt(b.displayObject(),"selected")})}else XC(a,{button:b,jr:c,N0:()=>{b.Ac(!1);wt(b.displayObject(),"selected")}}),b.Ac(!0),vt(b.displayObject(),"selected")});z(a,c.$N,()=>{a.D.jk(OC(c));c.J(!1)}); +return{V0:b,W0:c}}return{V0:null,W0:null}}function YC(a){const b=new HC({G:"mute",toggle:!0});b.ik(!0);const c=new TC(a.D);c.J(!1);z(a,b.ka,()=>{const d=!a.D.muted();a.D.Zj(d);b.Ac(d);d?vt(b.displayObject(),"selected"):wt(b.displayObject(),"selected")});z(a,a.D.fF,()=>{const d=a.D.muted();b.Ac(d);d?vt(b.displayObject(),"selected"):wt(b.displayObject(),"selected")});x(a,b.displayObject(),"mouseover",()=>{c.visible()||XC(a,{button:b,jr:c})});return{Waa:b,Oca:c}} +function ZC(a,b){var c=a.l7.displayObject(),d=a.wa.width()-2;a=Lh(b,c).x/a.KN*a.qa;d=Math.min(1,a/d);return d=Math.max(0,d)}function $C(a){function b(e){e=e.toString();1==e.length&&(e="0"+e);return e}a=Math.round(a);const c=Math.floor(a/3600);a%=3600;const d=Math.floor(a/60);a%=60;return b(c)+":"+b(d)+":"+b(a)}function WC(a){return!!a.Cf&&!!aD(a.Cf).length} +function XC(a,{button:b,jr:c,N0:d}){c.J(!0);let e=new BC(c.displayObject(),0,1,150);e.play();let f=!1;x(a,document,Mm,g=>{g=bD({button:b,jr:c,V$:g});if(g==f){const h=parseFloat(Eh(c.displayObject(),"opacity"));e.stop();g?(f=!1,e=new BC(c.displayObject(),h,1,150),e.play()):(f=!0,e=new BC(c.displayObject(),h,0,150),e.play(),Me(a,e,"finish",()=>{c.J(!1);d&&d()}))}})} +function cD(a){const b=new HC({G:"subtitles",toggle:!0});b.ik(!0);z(a,b.ka,()=>{a.Nj&&a.ji&&!a.Nj.visible()&&(XC(a,{button:a.ji,jr:a.Nj,N0:()=>{a.ji&&(a.ji.Ac(!1),wt(a.ji.displayObject(),"selected"))}}),a.ji.Ac(!0),vt(a.ji.displayObject(),"selected"))});a.ji=b;a.V(b)}function dD(a,b){b=new RC(b,a.I);b.J(!1);z(a,b.$N,()=>{if(a.Cf&&a.Nj){var c=(c=a.Nj.gi)?c-1:null;"number"===typeof c?a.Cf.select(c):a.Cf.show(!1);a.Nj.J(!1)}});a.Nj=b;a.V(b)} +function bD({button:a,jr:b,V$:c}){const d=Lh(c,b.displayObject());if(0>d.x||d.x>b.width()||0>d.y)return!1;b=Lh(c,a.displayObject());return 0>=b.y||0<=b.x&&b.x<=a.width()&&b.y<=a.height()} +class eD extends P{constructor({ic:a,uca:b,ia:c,Sj:d,mD:e}){super({G:"controls",HH:!0});this.D=a;this.Cf=b;this.I=c;this.Nw=e;this.fc=UC(this);N(this,this.fc);const {wba:f,zc:g}=this.Sr(d);this.l7=f;this.wa=g;N(this,this.wa);const {V0:h,W0:l}=VC(this);(this.WF=h)&&N(this,this.WF);(this.XF=l)&&N(this,this.XF);this.Nj=this.ji=null;this.Cf&&(this.QZ(),z(this,this.Cf.FS,this.QZ,this),z(this,this.Cf.HS,this.RZ,this));const {Waa:n,Oca:m}=YC(this);this.Y4=n;N(this,this.Y4);this.G9=m;N(this,this.G9);this.Gp= +this.XJ();N(this,this.Gp);this.wZ=new C;this.$U=new C;this.Tf=this.Zl=!1;this.KN=this.qa=1;z(this,this.D.Cc(),this.Ks,this);z(this,this.D.Rk,this.W5,this);yi(this.displayObject(),"left bottom")}locked(){return this.Tf}XJ(){const a=new HC({G:"toggle_fullscreen",toggle:!0});a.ik(!0);z(this,a.ka,()=>this.wZ.C());return a}Sr(a){const b=new P({G:"progress"}),c=new P({G:"loading"});N(b,c);const d=new P({G:"playing"});N(b,d);const e=new P({G:"tooltip"});e.J(!1);N(b,e);if(a)for(let f=0;f{L(c,"width",100*this.D.XH()+"%")});z(this,this.D.wf,()=>{L(d,"width",this.D.currentTime()/this.D.duration()*100+"%")});x(this,b,"mouseover",()=>{e.J(!0)});x(this,b,"mouseout",()=>{e.J(!1)});x(this,b,Mm,f=>{f=ZC(this,f);L(e,"left",`${100*f}%`);e.la($C(f*this.D.duration()))},this);x(this,b,Km,this.Rv,this);return{wba:d,zc:b}}QZ(){this.Nj&&(this.removeChild(this.Nj),this.Nj=null);WC(this)&&(this.ji||cD(this),dD(this,aD(this.Cf)));this.RZ()}RZ(){var a=WC(this); +this.ji&&this.ji.J(a);if(this.Nj){const b=this.Cf;a=a&&b.isVisible()?b.gt:null;JC(this.Nj,null==a?0:a+1)}}Rv(a){this.Tf=!0;x(this,document,Mm,this.Qv,this);x(this,document,Lm,this.AF,this);this.D.playing()&&(this.D.pause(),this.Zl=!0);this.Qv(a);a.preventDefault()}Qv(a){this.D.seek(ZC(this,a)*this.D.duration())}AF(a){Ne(this,document,Mm,this.Qv,this);Ne(this,document,Lm,this.AF,this);this.Qv(a);this.Zl&&(this.D.play(),this.Zl=!1);this.Tf=!1;this.$U.C()}Ks(){const a=this.D.playing();this.fc.Ac(a); +a?vt(this.fc.displayObject(),"selected"):wt(this.fc.displayObject(),"selected")}W5(){this.XF&&PC(this.XF,this.D.playbackRate())}};const fD=$g?{snapToLines:!1,line:83,lineAlign:"end"}:{snapToLines:!0,line:-4,lineAlign:"end"},gD=(a,b)=>{b?a.mode="showing":"showing"===a.mode&&(a.mode="hidden")},hD=a=>{for(let b=0;b{a.snapToLines=b.snapToLines;a.line=b.line;a.lineAlign=b.lineAlign},jD=a=>{if(a&&a.cues){const b=[];for(let c=0;c{this.select(hD(this.Yi));this.HS.C(this)};a=()=>{this.select(hD(this.Yi));this.FS.C(this)};this.Yi.onaddtrack=a;this.Yi.onremovetrack=a}select(a){this.gt=null!==a&&ac&&"SOURCE"==c.nodeName&&"video/mp4"==c.getAttribute("type"));b&&a.appendChild(b)}return new nD(a)} +function pD(a){if(!Ii){const b=a.mediaElement().getAttribute("poster");a.mediaElement().removeAttribute("poster");if(b)return a=new P({G:"poster"}),L(a,"background",`url(${b})`),L(a,"background-size","100% 100%"),a}return null}function qD(a){if(!Ii)if(a=a.mediaElement(),tj)rD(a);else if(!sj&&la(a.textTracks)&&void 0!==a.textTracks.length)return new mD(a.textTracks);return null} +function rD(a){const b=c=>c&&"TRACK"===c.nodeName&&c.hasAttribute("kind")?(c=c.getAttribute("kind"),!!c&&("captions"===c||"subtitles"===c)):!1;Pd(a,c=>c&&b(c)&&c.hasAttribute("default"))||(a=Pd(a,b))&&a.setAttribute("default","")};function kq(a,b){a.Vv=b;Bd(b,a.Za.displayObject());Ii&&sD(a,a.D.mediaElement().width,a.D.mediaElement().height);Ii&&(Fj?void 0!==window.TouchEvent&&window.event instanceof window.TouchEvent||window.event instanceof MouseEvent:1)&&(a.D.play(),a.D.pause());sj&&(a.Za.resize(a.Za.width()+1),Gi(()=>a.Za.resize(a.Za.width()-1)))} +function oq(a){a.Vv=null;if(Fd(a.Za.displayObject())&&Ii){const b=a.D,c=oD(a.A9);Cj?(a.Za.removeChild(b.mediaElement()),a.Za.V(c.mediaElement())):a.Za=new P({za:c.mediaElement()});ak(a,c);b.Xc()}}function Au(a,b){a.wj&&(b?a.EE||(a.EE=setInterval(()=>tD(a),100)):(clearInterval(a.EE),a.EE=void 0,a.Mx(!1)))} +function uD(a,b){const c=new eD({ic:a.D,uca:a.Cf,ia:a.I,Sj:b,mD:a.Nw});c.resize(a.D.mediaElement().width);c.Hf(0);c.wZ.addHandler(()=>{a.Mx(!a.Ql);return yn(c.displayObject())},a);c.$U.addHandler(()=>{a.cM||vD(a,!1)},a);ve(a.Za.displayObject(),"mouseenter",()=>{a.cM=!0;vD(a,!0)},!1,a);ve(a.Za.displayObject(),"mouseleave",()=>{a.cM=!1;c.locked()||vD(a,!1)},!1,a);return c} +function wD(a,b){if(a.Ve){const c=Vi()?"poster_frame_hide_video":"poster_frame";b?vt(a.Za.displayObject(),c):wt(a.Za.displayObject(),c);a.Ve.Hf(b?1:0);!b&&a.ZF&&(xD(a,a.ZF),a.ZF=void 0);Ib&&!Ii&&Th(a.D.mediaElement(),!b)}}function xD(a,b){a.Ve&&L(a.Ve,"background-image",`url(${b})`)} +function yD(a,b,c){a.Ve||(a.Ve=new P({G:"poster"}),L(a.Ve,"background-size","contain"),L(a.Ve,"background-position","center"),L(a.Ve,"background-repeat","no-repeat"),L(a.Ve,"position","absolute"),L(a.Ve,"top","0"),Ii?a.Za.displayObject().parentNode.appendChild(a.Ve.displayObject()):a.Za.V(a.Ve),a.Ve.resize(a.Za.width(),a.Za.height()));!c&&Ii&&a.Ve.opacity()?a.ZF=b:xD(a,b)} +function tD(a){var b=a.Za.displayObject().parentNode;if(b&&"none"!=b.style.display){var c=Qh(a.Za.displayObject());a.wj.resize(c.width);b=(b=sn(b))?b.md:1;b=tj||a.Ql?b*a.yN:b;a=a.wj;b&&(a.KN=b,b=a.width())&&(a.qa=Math.max(a.KN,240/b),c=Math.round(11/a.qa),L(a,"left",`${c}px`),L(a,"bottom",`${c}px`),b=Math.round(b*a.qa)-22,wn(a.displayObject(),1/a.qa),c=b-173,a.ji&&a.ji.visible()&&(c-=a.ji.width()),a.WF&&(c-=a.WF.width()),a.wa.resize(c),a.Zb(b))}} +function sD(a,b,c){const d=tj||a.Ql?1:a.yN,e=new gm;e.scale(1/d,1/d);on(a.Za.displayObject(),e);a.Za.resize(b*d,c*d)}function vD(a,b){var c=b?1:0;(new GC(a.wj,a.wj.opacity(),c)).play();a.Cf&&(b?(a=a.Cf,a.Eq||(a.Eq=jD(lD(a)))):kD(a.Cf))} +class zD extends ck{constructor(a,b,c,d=null){const e=oD(a);super(e);this.A9=a;this.I=new kt(d||{});this.Ve=pD(e);this.Cf=qD(e);this.wj=null;this.ZF=void 0;this.cM=this.Ql=!1;this.yN=1;this.bH=!1;this.EE=void 0;this.Vv=null;this.Nw=b;Ii?Cj?(this.Za=new P({G:"video_player"}),Ft(this.Za,"iphone"),this.Za.V(this.D.mediaElement()),this.Za.resize(this.D.mediaElement().width,this.D.mediaElement().height),c=this.D.mediaElement().getAttribute("poster"),this.D.mediaElement().removeAttribute("poster"),c&&(L(this.Za, +"background","url("+c+")"),L(this.Za,"background-size","100% 100%")),this.Jo(this.hj())):this.Za=new P({za:this.D.mediaElement()}):(a=this.hj(),super.Jo(!1),this.Za=new P({G:"video_player"}),this.wj=uD(this,c),this.Ve&&this.Za.V(this.Ve),this.Za.V(this.D.mediaElement()),this.Za.V(this.wj),this.Za.resize(this.D.mediaElement().width,this.D.mediaElement().height),this.Jo(a),ve(this.D.mediaElement(),"loadeddata",this.HE,!1,this));wD(this,!0);pj&&this.D.Cc().addHandler(f=>{"playing"==f.state()&&this.Vv&& +(f=this.Vv.style.opacity,this.Vv.style.opacity="0.99",this.Vv.style.opacity=f)},this)}Jo(a){this.wj?this.wj.J(a):Cj?a?wt(this.Za.displayObject(),"without_controls"):vt(this.Za.displayObject(),"without_controls"):this.D.Jo(a);a?this.bH||(ij?x(this,this.Za,"click",this.DF,this):z(this,this.Za.ka,this.DF,this),x(this,this.Za,"click",this.eZ,this),this.bH=!0):this.bH&&(ij?Ne(this,this.Za,"click",this.DF,this):Pe(this,this.Za.ka,this.DF,this),Ne(this,this.Za,"click",this.eZ,this),this.bH=!1)}hj(){return this.wj? +this.wj.visible():super.hj()}JP(){this.D&&this.D.JP()}$Q(){this.D&&this.D.$Q()}setScale(a){this.yN=a;sD(this,this.D.mediaElement().width,this.D.mediaElement().height)}videoWidth(){return this.D.videoWidth()}videoHeight(){return this.D.videoHeight()}resize(a,b){this.Za&&(sD(this,a,b),this.wj&&tD(this));const c=this.D.mediaElement();c.width=a;c.height=b;this.HE();this.Ve&&this.Ve.resize(this.Za.width(),this.Za.height())}Ch(a){a=super.Ch(a);this.HE();return a}HE(){if(Ib||Jb){var a=this.D.mediaElement(); +L(this.Za,"background","#000000");F(a,"width","");F(a,"height","");this.Ql||(a.videoWidth/a.videoHeight{d.Ch(e);a.Uo(b,0,!0)},0)}else a.Uo(b,0,!0)}function BD(a,b){if(a.AO){var c=a.D,d=a.M;var e=a.pm||0;var f=a.ye.duration();d=d.mi(a.X.timestamp(),!0,!1)-d.mi(a.Pg,!0,!1);d+=e;const g=Math.floor(d/f);e=g;f=d-g*f;a.UF=e;e=f-c.currentTime();c.playing()&&!b&&.01e?a.LG(f):c.seek(f)}}function CD(a){a.Db||a.D.deactivate()} +function DD(a){a.il=void 0;a.X.Sb().removeHandler(a.LS,a);a.X.Cc().removeHandler(a.KS,a);a.sz=!1;a.ML="ended";if(a.ye instanceof Zg){const b=a.D;a.ye.uI()&&b.stop();b.Mx(!1);a.ye.nQ()&&b.show(!1)}a.Fg.C(a);ED(a)}function ED(a){a.Wi&&(a.Wi=!1,jv(a.X,!1,a))} +class FD{constructor(a,b,c,d){this.M=a;this.X=b;this.ye=c;this.D=d;this.Pg=null;this.UF=0;this.pm=null;this.nl=this.Be=!1;this.$l=new C;this.Fg=new C;this.AO=!1;this.il=void 0;this.sz=this.Db=!1;this.ML="";this.Wi=!1;this.D.Cc().addHandler(this.tF,this);this.D.XA.addHandler(this.NX,this)}activate(){this.Db=!0;this.D.Db||this.D.activate()}deactivate(){this.D.playing()||this.D.deactivate();this.Db=!1}ic(){return this.D}playing(){return this.D.playing()}kd(){return this.Be&&(this.D.kd()||!this.D.bC())}play(a){this.Uo(this.X.timestamp(), +void 0!==a?a:null,!1)}Uo(a,b,c){this.LA();this.X.Sb().addHandler(this.wb,this);this.D.Fg.addHandler(this.Vp,this);this.D.vp.addHandler(this.Vp,this);this.D.Mw.addHandler(this.BW,this);this.Be=!0;this.nl=!1;this.AO=c;this.Pg=a;this.pm=null!=b?b:null;this.AO?(a=()=>{BD(this,!0);this.D.play();this.Vp()},gj&&!Ii?this.ye instanceof Zg?setTimeout(a,150):a():(ij&&this.D.Ch(this.D.src()),a())):null!=b?this.D.ir(b):this.D.play()}pause(){this.Wl();this.D.pause();CD(this)}stop(a){this.Wl();this.D.pause();const b= +this.ye instanceof Zg&&this.ye.uI();a=a||b?0:this.D.duration();this.D.seek(a);CD(this);DD(this)}LA(){this.X.Sb().removeHandler(this.wb,this);this.D.Fg.removeHandler(this.Vp,this);this.D.vp.removeHandler(this.Vp,this);this.D.Mw.removeHandler(this.BW,this)}wb(){if(this.Pg){var a=this.Pg;const d=this.X.timestamp();var b=d.L()-a.L(),c=0==b;a=c?d.Aa()-a.Aa():0;c=c&&0==a;0>b||0>a?b=!0:(a=this.ye.Fj,b=0>a?!c:b>a);b&&(this.Wl(),this.D.pause(),CD(this))}}tF(){const a=this.D.state();if("ended"==a){++this.UF; +let c=!1;const d=this.ye.lm;if("number"!==typeof d){var b=this.Pg;const e=this.X.timestamp();b=b.L()!=e.L()||b.Aa()!=e.Aa();switch(d){case "untilNextClick":c=!b;break;case "untilNextSlide":c=!0}}else c=this.UFa-this.D.currentTime()&&(this.D.wf.removeHandler(c,this),ED(this))},this))}zF(){this.il=this.X.timestamp();this.X.Sb().addHandler(this.LS,this);this.X.Cc().addHandler(this.KS,this);if(this.ye instanceof Zg){const a=this.D;a.show(!0);this.ye.NQ()&&a.Mx(!0);wD(a,!1)}}KS(){var a;if(a=this.Be)a:if(this.X.suspended()){a= +this.X.timestamp();if(0{Pa(a.wD,c)||(Fp(a,c).activate(),a.wD.push(c))},a);Gi(a.s3,a)} +function ct(a,b,c,d){if(a.vs.F_()){var e=KD(a,b);HD(a,b,e,!0);e.Uo(c,d)}}function MD(a,b){return"accessible"==a.Gb?null:a.F.slides().ja(b).ty} +class ND{constructor(a,b,c){this.Db=!1;this.F=a;this.ie=b;this.vs=c;this.X=null;this.zn=new pC(a);this.zE=this.Ll=this.Tu=this.Iu=null;this.Gb="normal";this.uO={};this.oB={};this.RO={};this.U=-1;this.Bw=qu(a.slides());this.NB=[];this.AU=new C;this.xU={};this.wD=[];a=this.ie;b=gk();b=new OD(b);z(a,b.ly,a.BF,a);this.z2=b}pR(a,b){this.X=a;this.zn.pR(a,b);a.Sb().addHandler(this.wb,this)}Mm(a){this.Gb=a;this.vs.Mm(a)}activate(){this.Db=!0;this.Ll&&AD(this.Ll,this.X.timestamp());this.Iu&&this.Iu.activate(); +const a=this.X.timestamp().L();0<=a&&LD(this,a)}wb(a){a=a.timestamp().L();a!=this.U&&this.Dj(a)}s3(){const a=this.X.timestamp().L(),b=this.F.slides().ja(a).Md().Sc();u(this.wD,c=>{Pa(b,c)||(Fp(this,c).deactivate(),Ra(this.wD,c))},this)}Dj(a){JD(this);this.Db&&LD(this,a);const b=(f,g)=>{for(let h=0;h{g.Mw.removeHandler(this.DW,this);Ra(d,g)});b(c,(f,g)=>{g.Mw.addHandler(this.DW, +this)});this.ie.IR();ZB(this,MD(this,a))}DW(a,b){var c=this.NB;Pa(c,a)||c.push(a);"play"==b&&this.AU.C(a)}};class PD{constructor(){this.Ib={};this.mS={};this.He=1}forEach(a){fc(this.Ib,a,this)}get(a){a=a.id();return this.Ib[a]}set(a,b,c){this.Ib[a.id()]=b;this.mS[a.id()]=c;b.setVolume(this.He*c)}XP(a){return a.id()in this.Ib}setVolume(a){if(this.He!=a){this.He=a;for(const b in this.Ib)this.Ib.hasOwnProperty(b)&&this.Ib[b].setVolume(this.He*this.mS[b])}}fI(){for(const a in this.Ib)this.Ib.hasOwnProperty(a)&&this.Ib[a].pause()}};class OD extends ik{constructor(a){super(a);this.gm=null}oR(a){this.gm!=a&&(a?this.Ch(a.Ht()[0].sources()):this.D.Ch(Hi()),this.gm=a)}};function Ju(a,b){a.qa=b;a.Ct.forEach(c=>{c.setScale(b)})}function QD(a){const b=a.An?0:a.He;b!=a.GN&&(a.GN=b,a.HX.C(),a.Cw.setVolume(b),a.Ct.setVolume(b))} +class RD extends wg{constructor(a){super();this.Ae=a;this.Cw=new PD;this.Ct=new PD;this.He=1;this.An=!1;this.GN=1;this.ql=E(this);this.HX=E(this);this.sV=E(this);this.WW=E(this);this.YY=E(this);this.D9=E(this);this.qa=1;this.I=null;z(this,this.Ae.Rk,this.IR,this)}jQ(a){var b=a.Di;a=a.volume();a=void 0!==a?a:1;if(this.Cw.XP(b))var c=this.Cw.get(b);else c=null,b.Mq()?c=rd(document,b.Mq()):b.pi()&&(c=Ad(Kc(b.pi()))),c=new ik(c),c.jk(this.Ae.playbackRate()),z(this,c.ly,this.BF,this),this.Cw.set(b,c,a); +return c}Dm(a){var b=a.Di,c=a.volume();a=a.Sj();c=void 0!==c?c:1;this.Ct.XP(b)?a=this.Ct.get(b):(a=new zD(b.pi(),this.Ae.mD(),a,this.I),z(this,a.ly,this.Q6,this),a.setScale(this.qa),a.jk(this.Ae.playbackRate()),this.Ct.set(b,a,c));return a}IR(){const a=this.Ae.playbackRate();this.Cw.forEach(b=>b.jk(a));this.Ct.forEach(b=>b.jk(a))}volume(){return this.He}setVolume(a){if(0>a||1new jk(d.S,d.s,d.t)),b.DB=!0;return b}function Ts(a,b){return b in a.wq?a.wq[b]:null}function qs(a,b,c){c?a.wq[b]=c:delete a.wq[b];a.ll=!0}function et(a,b){a.pl!=b&&(a.pl=b,a.ll=!0,a.EU.ix())}function Ns(a,b){a.us!=b&&(a.us=b,a.ll=!0)} +class VD{constructor(){this.us=null;this.pl=0;this.vm=null;this.vq={};this.wq={};this.ll=!1;this.EU=new TD(this.h4.bind(this));this.Aq=new C;this.DB=!1}tQ(){return this.us}nx(a){return a in this.vq?this.vq[a]:null}cR(){const a={};a.lastViewedSlide=this.us;a.viewDuration=this.pl;a.slideStates=rc(this.vq);this.vm&&(a.zoomState=this.vm.persistState());this.DB&&(a.slideTimelineStates=ic(this.wq,b=>b.cR()));return a}LP(a){this.us=a.us;this.pl=a.pl;this.vq=rc(a.vq);this.DB=a.DB;this.vm=a.vm?a.vm.LP():null; +this.wq=ic(a.wq,b=>b.clone());this.ll=!0}invalidate(){this.EU.W$()}h4(){this.ll&&(this.ll=!1,this.Aq.C())}stateChangedEvent(){return this.Aq}};function qq(a,b,c){a.Be()&&a.aE(a.LY,b,c)&&(b=a.F.settings().xu().HI(),c="quiz"==a.B.$().type(),b&&!c?b.open():a.B.$().SB()&&!uj&&wu(a))}function wu(a){const b=a.tc,c=b.Z(),d=a.F.settings().Pc().Fm(),e=b.PQ()&&0>b.Ug();c.started()||e?!d&&e?dt(a.Ya.zn):"bySlides"==a.F.settings().navigation().Gm().Tg()?b.lf():b.Lo():b.play()} +class WD{constructor(a,b){this.F=a;this.Ya=b;this.tc=this.B=null;this.LY=new C;this.y8=new C;this.z8=new C;this.x8=new C}Be(){return!!this.B&&0<=this.B.ma()}aE(a,b){const c=new Mn,d=Xa(Ua(arguments),1);a.C(...d.concat(c));return!c.actionPrevented()}};var XD=RegExp("^(?:([^:/?#.]+):)?(?://(?:([^\\\\/?#]*)@)?([^\\\\/?#]*?)(?::([0-9]+))?(?=[\\\\/?#]|$))?([^?#]+)?(?:\\?([^#]*))?(?:#([\\s\\S]*))?$");function YD(a,b,c){if(Array.isArray(b))for(var d=0;d{$D=!0;bE(a)&&a.wb(a.X)});const c=window.location.toString().match(XD)[1]||null;b.src="https"==c?"https://players.youku.com/jsapi":"http://player.youku.com/jsapi";document.body.appendChild(b)};function cE(a,b){this.$b=a;this.c_=b}k=cE.prototype;k.$b="";k.c_="";k.Ua=0;k.Na=0;k.Xi=0;k.ml=1;k.width=function(){return this.Ua};k.Zb=function(a){this.Ua=a};k.height=function(){return this.Na};k.Kd=function(a){this.Na=a};k.id=function(){return this.$b};k.Bi=function(){return this.c_};k.ib=function(){return this.Xi*this.ml};k.Al=function(a){this.ml=a};function dE(a,b,c){cE.call(this,a,b);this.PS=c}t(dE,cE);dE.prototype.PS="";dE.prototype.clientId=function(){return this.PS};function eE(a,b){this.D=null;this.tn=!1;this.Ab=a;this.fm=b;this.oq=new C;this.rc=zd("DIV");this.rc.style.position="absolute";a.displayObject().appendChild(this.rc);Th(this.rc,this.$g);this.Ef(a)}k=eE.prototype;k.tn=!1;k.$g=!1;k.GQ=function(){this.tn=!0;this.Dg(this.Ab);this.cB(this.$g);this.oq.C(this)};k.hba=function(){};k.gba=function(){};k.$h=function(){return this.tn&&null!=this.D};k.stop=function(){if(this.$h())try{this.D.pauseVideo()}catch(a){}};k.visible=function(){return this.$g}; +k.Dg=function(a){this.Ef(a);if(this.$h()){const c=this.sa;var b=a.scale();a=b*this.fm.width();b*=this.fm.height();Nh(c,a,b)}};k.Ef=function(a){a=a.position(this.fm.id(),1);Gh(this.rc,a.x,a.y)};k.FI=function(a){this.$g!=a&&(this.$g=a,this.cB(a))}; +k.cB=function(a){if(a){if(!this.D){var b=this.rc,c=this.Ab.scale();const e=this.fm,f={styleid:"0",client_id:e.clientId(),vid:e.Bi(),autoplay:!1,show_related:!1,events:{onPlayerReady:this.GQ.bind(this),onPlayStart:this.hba.bind(this),onPlayEnd:this.gba.bind(this)}},g="_"+e.id(),h=zd("DIV");h.setAttribute("id",g);var d=c*e.width();c*=e.height();Nh(h,d,c);F(h,"background","#494949");d=zd("DIV");F(d,"position","absolute");F(d,"top","50%");F(d,"left","50%");F(d,"transform","translate(-50%, -50%)");h.appendChild(d); +c=zd("DIV");mn(c,"preloader");F(c,"position","relative");d.appendChild(c);c=zd("DIV");Nd(c,"\u8bf7\u7a0d\u540e");F(c,"position","relative");F(c,"font-family",'Tahoma, Arial, Helvetica, "Microsoft YaHei New", "Microsoft Yahei", "\u5fae\u8f6f\u96c5\u9ed1", \u5b8b\u4f53, SimSun, STXihei, "\u534e\u6587\u7ec6\u9ed1", sans-serif');F(c,"font-weight","lighter");F(c,"font-size","32px");F(c,"color","white");F(c,"text-align","center");F(c,"margin-top","12px");d.appendChild(c);b.appendChild(h);this.sa=h;this.D= +new YKU.Player(g,f);this.Dg(this.Ab)}}else Cd(this.rc),this.D=null,this.tn=!1;Th(this.rc,a)};k.readyEvent=function(){return this.oq};var fE,gE=!1;q("onYouTubePlayerAPIReady",function(){gE=!0;var a=fE;bE(a)&&a.wb(a.X);fE=null});function hE(a,b){cE.call(this,a,b)}t(hE,cE);function iE(a,b){this.D=null;this.tn=!1;this.Ab=a;this.fm=b;this.oq=new C;this.rc=zd("DIV");this.rc.style.position="absolute";a.displayObject().appendChild(this.rc);Th(this.rc,this.$g);this.Ef(a)}k=iE.prototype;k.tn=!1;k.$g=!1;k.GQ=function(){this.tn=!0;this.Dg(this.Ab);this.cB(this.$g);this.oq.C(this)};k.jba=function(){};k.kba=function(){};k.iba=function(){};k.$h=function(){return this.tn&&null!=this.D};k.sa=function(){return this.$h()?this.D.getIframe():null};k.stop=function(){if(this.$h())try{this.D.stopVideo()}catch(a){}}; +k.visible=function(){return this.$g};k.Dg=function(a){this.Ef(a);const b=this.sa();if(b){var c=a.scale();a=c*this.fm.width();c*=this.fm.height();Nh(b,a,c)}};k.Ef=function(a){const b=this.fm.id();a=a.position(b,1);Gh(this.rc,a.x,a.y)};k.FI=function(a){this.$g!=a&&(this.$g=a,this.cB(a))}; +k.cB=function(a){if(a){if(!this.D){var b=this.rc,c=this.Ab.scale(),d=this.fm;c={width:c*d.width(),height:c*d.height(),videoId:d.Bi(),playerVars:{controls:1,loop:0,enablejsapi:1,autohide:2,autoplay:0,showinfo:1,rel:0},events:{onReady:this.GQ.bind(this),onPlaybackQualityChange:this.jba.bind(this),onStateChange:this.kba.bind(this),onError:this.iba.bind(this)}};d="_"+d.id();const e=zd("DIV");e.setAttribute("id",d);b.appendChild(e);this.D=new YT.Player(d,c);this.Dg(this.Ab)}}else Cd(this.rc),this.D=null, +this.tn=!1;Th(this.rc,a)};k.readyEvent=function(){return this.oq};function jE(a,b,c){this.Ib={};this.Ab=a;this.M=c;this.X=b;a.Le().addHandler(this.nA,this);b.Sb().addHandler(this.wb,this)}k=jE.prototype;k.U=-1;k.m_=!1;k.l_=!1;function kE(a,b,c){let d=0;if(0>b||b>=a.M.count())return d;a=a.M.ja(b);if(a instanceof Am)for(a=a.Xy,b=0;bb||b>=a.M.count())&&(b=a.M.ja(b),b instanceof Am)){b=b.Xy;for(let f=0;fa/tE.width||1>b)&&F(c,"backgroundSize","contain")}}; +k.Oc=function(){if(this.Qa)if(this.Qa=!1,this.KT){this.Ab.Le().removeHandler(this.VV,this);var a;null==(a=this.ev)||a.Xc();this.ev=null}else{const b=rE(this);b&&(a=sE(),nn(b,a),Cd(b))}};function qE(a){const b=a.Ab.scale(),c=a.$u;a.ev.setSize(c.width()*b,c.height()*b)}function pE(a){var b=document.getElementById(a.$u.containerId());const c=a.Ab.scale(),d=sn(b);if(d){var e=d.qe;b=d.re}else e=parseFloat(Eh(b,"left")),b=parseFloat(Eh(b,"top"));a=rd(a.ev.ld);Gh(a,e*c,b*c)}k.VV=function(){pE(this);qE(this)}; +function rE(a){if(a.lE)return a.lE;a.lE=rd(document,a.$u.containerId());return a.lE}var tE=new cd(74,89); +function sE(){if(void 0!==oE)return oE;const a="_sf"+ld();oE=a;gn("."+a+" {background: #A42222;}."+a+" div {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEoAAABZCAYAAACZkrJEAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwQAADsEBuJFr7QAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAFA0lEQVR4Xu3c21MTVxwHcP/B+iwyPimoT46WPulY6INDR3mwdhTojJeOgC1MMZHhoha85EJIMCg1CTXQJEsokJCEJJgbyc/fiW5nJ2NjCL/dPecYZ74zIYa9fPZ7zh4Y3SNHWn9aAi0BYoGZM2dhGuMd/OW/bHgW4a+RESDelVibc/T0QPDRI0hHo1CpVP43UY/n64Kabj8By9iWnUCgLkwt2lcD5er5ARIHxNFiSQ9l7/oO8ru7B2rP54ag1FBbOK/Um3cO8ndSQoVwcj4IQiOflQrKicMs+4W7VyMoUg89/+AgtqisW6Iet/jLg5AVh1oZkXRM1C04VNKP6yEdgdRtCw0Vw6tsBBLbh7BQYQOGm/YiCAm1OjRsWJOEHXoLuASolPcNT9S9INZdr5BKGo7ELoxQUBuzs6Ygxfx+eDM0JEajvN09UNnHIadj0ooCrwYGYPL0GTFQPverv0ISh5xOSO8sVpgSGUcFqw45HZDCuF1re7u47dE2ynH6rC5Itu5uOYBUrKwSQagSWfLJBEzI0iIVaflaHxmQim2XrUkMq4BXn7JNUiIF8DZNiRS0WOSak9Rhl08koFwqkSTu88mJFOgfIAFi0DkEnzguyRKgdoFJ2aa5b7vkbNOr77uxTUWSxH1v5URizcpEwiRIDFvaIUfZJt/9+/K2advlImlTLrEjLxIbdlRz01J/v7xQoYcWKBdxEj9kcjuStymPJ3hYpGa/fx2HvBD//M3DlgTFgmlZd82LAbWFB9qCaqDTZiKxfQvRqKWr10xtkzBQmXDIdChFhDnK7GHH9s891D/jD6FcwLudyVHmOb/r5eJxRMqbHmXeye/ywMsmcQ6Q2DFwDZUO4STegqq/eLJd6OIGietGbeLkyUubuIbiCYkdS4THyXy1uiQw/06nPQYuofbzOeAtYaeDr+VBcHycDGnx1i1g8WjixtfaLODXalz4Ws08vq7m5k1wYmYuX+YLiqpJKwjewC8lxPxIcPwPbNN7kvx29Ki8UPs5RCLIuoOz+YSytxt4chRIbBsTnZ1ytukJnhgVktRtSq2tQim3R5I53u5OVMPu7a/3oPQekQiSRHCq4+JqO49xyFEAqduQtk1725sIlSWJ4rDJ2abUWpAESIW2ynin2369BKU9bBJRInYJ27T92otAGdIMfSPRKtzadhy2EKmISJTx3rsrz9z09Px5yG7+C8UsIhEmg9vk6jbe7MFMdXSCYrOR4mihJ/ECNHtsXHwfa5Bie4lAad0Sxu1zcbKNHMQYTqJTHR3VOH/shcDYKA6xDd1wVPgM7qOR4+PiM8UMtsWkvOjtFQlqF6GMT/jlC3GQqv/9C5GMTvzdilhIZkE9aGsTECqNjTIwjy9dEg+p2qh0CqGMifPnG2IiGQm1eOeOuEhGQTluCNwkdRFX2E2CXklHFZi5eFHsJukNFV/xw/CxY3IgMaw8Noo67tu36wKN4rNRnPjkQzUz+NCa3/E9FvUCPsDXLFz8+PIRKoFQNIlhi0ZPnWr45BTNU54dCBfRfO0ZHgE7vscPVAqRDplYwA/TTcxFWhiGwnBUmElsmU0WqLXnz5oCUjFqG8Te/7OvD9yfwJbxIYAcNWoHG9V41j0LMHvlCskJ1DaKofw99wxUoDBPD2CvhxQL+GDt+RzYf7oOlnPnSHC0DdFCqcPsKT7MhoV9jiuosZMngWW0JtxUvnUgLQGpBD4AN9FCi/luT4wAAAAASUVORK5CYII=) no-repeat;background-position: center;}");return a} +;function uE(a,b,c,d){this.R=a;this.Ab=b;this.X=c;this.M=d;this.QK=[];c.Sb().addHandler(this.wb,this)}uE.prototype.U=-1;uE.prototype.wb=function(){var a=this.X.timestamp(),b=a.L();if(b!=this.U){if(0<=this.U){var c=this.M.ja(this.U);c instanceof Am&&vE(this,c,-1)}this.U=b}if(0<=b&&(c=this.M.ja(b),c instanceof Am)){b=c;const d=a.Aa();a=0>d?-1:b.nb().pc(d).startTime()+a.ib();vE(this,c,a)}}; +function vE(a,b,c){b=b.CK;for(let g=0;ge||e>=d.count())throw Error("index is out of range");d=d.$y[e];e=a;var f=d;const h=ma(f)+"";h in e.QK||(e.QK[h]=new nE(f,e.R,e.Ab));e=e.QK[h];c>=d.ib()?e.show():e.Oc()}};function wE(a){ei&&a.DT.addHandler(this.A5,this)}wE.prototype.A5=function(a,b){"string"!==typeof a&&(a=a.baseVal);this.$M(a)&&(b.OS=!0)};wE.prototype.$M=function(a){return(new di("openWindow",[a])).ix()};function xE(a,b,c,d){this.Qe=b;this.B=c;this.ie=d;this.eH=yE(a);this.oO=[];this.ZW={};this.SY={};this.P=zd("div");this.Qe.displayObject().appendChild(this.P);c.Z().Sb().addHandler(this.wb,this);b.Le().addHandler(this.c6,this)}k=xE.prototype;k.U=-1;k.Db=!1;k.activate=function(){this.Db=!0;const a=this.B.Z().timestamp();0<=a.L()&&0<=a.Aa()&&this.Dj(a.L())};function yE(a){return new su(a,b=>{b=b.$d();const c=[];for(let d=0;d{c.playbackStateChangedEvent().removeHandler(b.EM,b)});this.wz=[];this.Lp.audioStartedEvent().removeHandler(this.QV,this);this.Lp.videoStartedEvent().removeHandler(this.RV,this);this.DE=this.Lp=null}const a=this.B.Oa()||this.B.ob()||this.B.fb();a&&(this.Lp=a.mediaController())&&(this.Lp.audioStartedEvent().addHandler(this.QV,this),this.Lp.videoStartedEvent().addHandler(this.RV,this),this.DE=a.soundController(),this.NZ())}; +k.QV=function(a){a.ready()||a.readyEvent().addHandler(this.PV,this)};k.PV=function(a){a.readyEvent().removeHandler(this.PV,this);this.c4.C()};k.RV=function(a){Pa(this.wz,a)||(this.wz.push(a),a.playbackStateChangedEvent().addHandler(this.EM,this),this.f4.C())};k.EM=function(a){a.playing()||(a.playbackStateChangedEvent().removeHandler(this.EM,this),Ra(this.wz,a))};k.NZ=function(){this.DE&&this.DE.setVolume(this.Wb.KC())};function CE(){}CE.prototype.activate=function(){};class DE{constructor(a,b,c){const d=c.duration();b=new gf(b.index(),-1,0);const e=c.mi(b,!0,!1);a="untilNextSound"==a.lm?d:Math.min(d,e+a.duration());c=c.Io(a,!0,!1);this.Pi=new Ef([new Bf(new zf("play",b,0),b,c)])}HP(){return this.Pi}};function EE(a,b,c,d){this.M=a;this.Ya=b;this.bF=[];this.X=c;c.Cc().addHandler(this.Lv,this,1);for(b=0;b=ff(d,Cf(c.OQ).jc()),c.GR(d))}}} +EE.prototype.Lv=function(){this.X.Ag()&&this.hM&&(FE(this),this.hM=!1)};EE.prototype.qU=function(a){const b=this.M;for(var c=a.Md(),d=0;dff(c.jc(),d.jc()));return b}};function LE(a){this.pJ=new ME;this.IF={};a.YY.addHandler(this.BF,this)}t(LE,CE);LE.prototype.activate=function(){this.pJ.activate()};LE.prototype.BF=function(a,b){if(b){b=ma(a)+"";var c=a.ic();var d=this.pJ;var e=c.src();let f=null;0a;++a){const b=new hk(zd("audio"));this.Ib.push(b)}} +ME.prototype.activate=function(){u(this.Ib,a=>{a=a.mediaElement();a.play();a.pause()})};ME.prototype.release=function(a){this.Ib.push(a)};function NE(a,b){const c=OE(a,b);PE(c);c.deactivate();a.g9.C(b)}function OE(a,b){const c=ma(b)+"";c in a.PO||(a.PO[c]=a.h9.Tq(b,a.X,a.Ca));return a.PO[c]}function QE(a,b,c){if(a.Db){b=RE(a,b);for(let d=0;d=b&&c.push(e)}return c} +function TE(a,b,c){c=UE(a,c);const d=UE(a,b.jc());a=UE(a,b.jf())-d;return Vc(c-d,0,a)}function UE(a,b){return a.M.mi(b,!0,!1)} +class VE{constructor(a,b,c,d,e){this.M=a;this.X=b;this.Ca=c;this.h9=e;this.U=-1;this.fA=void 0;this.Db=this.LJ=!1;this.sm=this.EG(d);this.op=[];this.PO={};this.f9=new C;this.g9=new C;b.Sb().addHandler(this.wb,this);b.Cc().addHandler(this.Lv,this)}activate(){this.Db=!0;this.Lv(this.X)}iu(a){this.fA=a}P_(){this.op.forEach(a=>NE(this,a));this.op=[]}EG(a){const b=[];for(let c=0;cff(c.jc(),d.jc()));return b}Dj(a,b){this.LJ=!0;if(0<=this.U){const c=RE(this,this.U); +for(let d=0;d=ff(e.jf(),b)||0{c.xC()||d()},this)}Lv(a){if(this.Db){a.started()&& +QE(this,this.U,a.timestamp());var b=this.op;for(let e=0;ethis.oc.jk(f.playbackRate()))}mf(){return 1==this.oc.XH()}xC(){return this.tf||this.Wi||this.Et}LG(a){this.Wi||this.tf||(this.Wi=!0,jv(this.Ca,!0,this),this.U8=a,a=1E3*(a-this.oc.currentTime())+500,this.lZ=setTimeout(this.sY.bind(this),a),this.oc.wf.addHandler(this.MS,this))}sY(){clearTimeout(this.lZ); +this.lZ=void 0;this.oc.wf.removeHandler(this.MS,this);this.Wc||this.oc.pause();this.Wi=!1;jv(this.Ca,!1,this)}MS(){.1>this.U8-this.oc.currentTime()&&this.sY()}preload(a){const b=this.oc,c=WE(this);if(!c&&!this.vN){this.vN=!0;const d=this.q9.bind(this);setTimeout(d,300);Ji&&(this.TO=setInterval(d,1E3))}!a||b.bC()&&c||this.Et||(this.Et=!0,Ss(this.Ca,!0,this),b.vp.addHandler(this.NM,this))}q9(){XE(this);this.oc.ready()?clearInterval(this.TO):this.oc.load()}NM(){Ji&&1==this.oc.duration()?this.JS=setInterval(this.T2.bind(this), +200):PE(this)}T2(){1!=this.oc.duration()&&PE(this)}activate(){pr(this.OO,"activated");this.oc.Cc().addHandler(this.YV,this)}deactivate(){pr(this.OO,"deactivated");this.oc.Cc().removeHandler(this.YV,this);this.tf&&(this.tf=!1,Ss(this.Ca,!1,this));this.Wc=!1;this.oc.pause()}Lm(a,b,c){if(!this.tf||b){XE(this);var d=this.oc,e=a-d.currentTime(),f=b?.01:.5;e>f&&!b&&!this.tf&&!c?this.LG(a):Math.abs(e)>f&&d.dQ(a);this.Wc&&!this.oc.playing()&&this.oc.play()}}play(a){this.Wc||this.Et||(this.Lm(a,!this.oc.playing()), +this.Wc=!0,this.oc.play())}pause(){this.Wc&&(this.Wc=!1,this.tf||this.Wi||this.oc.pause())}YV(){var a=!1;"buffering"==this.oc.state()&&(a=!0);this.tf!=a&&(this.tf=a,pr(this.OO,a?"buffering":"activated"),Ss(this.Ca,a,this),a||this.Wc||this.oc.pause(),this.Fg.C())}XO(){this.oc.Ch(this.gX)}};class ZE extends YE{constructor(a,b,c,d,e){super(a,b,a.audio().sources(),c,d,e);this.Gr=b}};class $E{constructor(a,b){this.Gr=a;this.Ae=b}Tq(a,b,c){return new ZE(a,this.Gr,b,c,this.Ae)}};class aF{constructor(a){this.Ae=a}Tq(a,b,c){var d=gk();d=new ik(d);return new ZE(a,d,b,c,this.Ae)}};class bF extends VE{constructor(a,b,c,d,e,f){var g=gk();g=new ik(g);super(a,b,c,d,Ii?new $E(g,f):new aF(f));this.Gr=g;this.Wb=e;e.LC().addHandler(this.tm,this);this.tm()}activate(){if(Ii){const a=this.Gr.ic().mediaElement();a.src=Hi();a.play()}super.activate()}tm(){this.Gr.setVolume(this.Wb.KC())}ky(a){super.ky(a);Ii||(this.Gr=OE(this,a).Gr,this.tm())}};class cF extends YE{constructor({track:a,lD:b,Z:c,Ho:d,Xt:e,iI:f}){super(a,b,a.video().sources(),c,d,f);this.Hd=b;this.$v=e}lD(){return this.Hd}activate(a){super.activate(a);this.$v&&yD(this.Hd,this.$v,!0)}XO(){this.$v&&(yD(this.Hd,this.$v,!0),wD(this.Hd,!0),this.Hd.wf.addHandler(function b(){0!=this.Hd.currentTime()&&(this.Hd.wf.removeHandler(b,this),wD(this.Hd,!1))},this));super.XO()}};class dF{constructor(a){this.Ae=a}Tq(a,b,c){const d=new zD("",this.Ae.mD()),e=a.video().Xt();e&&yD(d,e,!0);return new cF({track:a,lD:d,Z:b,Ho:c,Xt:a.video().Xt(),iI:this.Ae})}};function eF(a){this.Hd=a;this.P=zd("div");kq(a,this.P)}eF.prototype.displayObject=function(){return this.P};eF.prototype.displayObject=eF.prototype.displayObject;eF.prototype.resize=function(a,b){this.Hd.resize(a,b)};eF.prototype.resize=eF.prototype.resize;eF.prototype.width=function(){return this.Hd.width()};eF.prototype.width=eF.prototype.width;eF.prototype.height=function(){return this.Hd.height()};eF.prototype.height=eF.prototype.height; +eF.prototype.QR=function(a){a.resize(this.Hd.width(),this.Hd.height());oq(this.Hd);this.Hd=a;kq(a,this.P)};eF.prototype.updatePlayer=eF.prototype.QR;class fF{constructor(a,b){this.Hd=a;this.Ae=b}Tq(a,b,c){return new cF({track:a,lD:this.Hd,Z:b,Ho:c,Xt:a.video().Xt(),iI:this.Ae})}};class gF extends VE{constructor(a,b,c,d,e,f){const g=new zD(ah&&10>lj?"":"",f.mD());super(a,b,c,d,Ii?new fF(g,f):new dF(f));this.Hd=g;this.pa=new eF(g);this.Wb=e;this.Wb.LC().addHandler(this.tm,this);this.tm();this.lX=new P;this.lX.Hf(0);document.body.appendChild(this.lX.displayObject())}activate(){if(Fj){const a=this.Hd.ic().mediaElement();a.src=Hi();a.play();a.pause()}super.activate()}view(){return this.pa}uN(a){super.uN(a);Ii&&(clearTimeout(this.p7), +a.length&&(this.p7=Gi(()=>{const b=a[0].video().Xt();b&&yD(OE(this,a[0]).lD(),b)},this,500)))}tm(){this.Hd.setVolume(this.Wb.KC())}ky(a){super.ky(a);Ii||(this.Hd=OE(this,a).lD(),this.pa.QR(this.Hd),this.tm())}}gF.prototype.view=gF.prototype.view;const hF={Rfa:"resumePlayback",Hea:"gotoSlide",Xda:"delayStartup"};class iF{constructor(a){this.Fw=a;this.Fd=0;this.Hl="gotoSlide";this.qp=!1}L(){return this.Fd}d1(a){this.Fd=a}action(){return this.Hl}fu(a){this.Hl=a}ff(){return this.qp}yI(a){this.qp=a}qca(){return this.Fw}}iF.prototype.startupController=iF.prototype.qca;iF.prototype.setAutoStart=iF.prototype.yI;iF.prototype.autoStart=iF.prototype.ff;iF.prototype.setAction=iF.prototype.fu;iF.prototype.action=iF.prototype.action;iF.prototype.setSlideIndex=iF.prototype.d1;iF.prototype.slideIndex=iF.prototype.L; +q("ispring.presenter.player.startup.PresentationStartup.Action",hF);q("RESUME_PLAYBACK","resumePlayback",hF);q("GOTO_SLIDE","gotoSlide",hF);q("DELAY_STARTUP","delayStartup",hF);function jF(a){return a.B2.some(b=>a.M7.some(c=>c(b)))} +class kF{constructor(a,b,c){this.F=a;this.B=b;b=this.slides;var d=c;c=[];do if(c.push(d),"slide"==d.type()&&d.rl()){var e=b;const f=d.fj().Oo();(d=f&&"gotoSlide"==f.type()?e.ja(f.L()):d.index()b.jc().L()<=a.index()&&b.jf().L()>=a.index())}C2(a){return!!a.ty}E2(a){return this.G8.some(b=>{a:{b:{var c=Kf(b,this.slides);if(0=b.L()&&a.index()<=c.L())){b={jc:b,jf:c};break b}b=null}if(c=b){b=c.jc;c=c.jf;if(a.index()==b.L()){if(0!!Df(Kf(c,this.slides),b))}return!1}D7(a){return a instanceof br?(a=this.W.kf(a.index()))?!a.Oa().autoStartAvailable():!0:!1}b8(a){return a instanceof Aq?(a=this.W.kf(a.index()))?!a.ob().autoStartAvailable():!0:!1}d4(a){return a instanceof sq?(a=this.W.kf(a.index()))?!a.fb().autoStartAvailable():!0:!1}};function lF(a,b,c,d,e){if(a.u7)throw Error("presentation was already started");if(e){var f=a.D;const l=f.Va.Ce;l.LP(e);et(l,0);e=f.F.slides();for(f=0;f{Ns(a.D.yH().Ce,b);a.D.pa.PH();const h=!(e instanceof Am);h&&f.Vj(b,0,0,!1);let l=!1;if(void 0===c){c=d.settings().Pc().ff();const n=new kF(d,f,e);c&&(Fj||Gj)&&jF(n)&&(c=!1,l=!0)}l&&Ls(f,()=>{pF(a.D,b,!1,l)});l&&!h&&f.Vj(b,0,0,!1);l||(us(f,b,c),pF(a.D,b,c,l))};if(e.mf())g();else{const h=f.Ho();Ss(h,!0,a);const l=a.D.yH().Ix().Ye,n=m=>{m===e&&(Ss(h,!1,a),l.gl.removeHandler(n),g())};l.gl.addHandler(n)}} +class qF{constructor(a,b){this.D=a;this.S8=b;this.cZ=this.u7=!1}start(a,b){lF(this,a,b,"gotoSlide")}resume(a,b){lF(this,a,b,"resumePlayback",this.S8)}}qF.prototype.resume=qF.prototype.resume;qF.prototype.start=qF.prototype.start;function rF(a,b,c){this.sa=null;this.zo=b;this.nN=c;b.iC()&&(this.rc=zd("DIV"),a.displayObject().appendChild(this.rc),this.rc.style.overflow="hidden",this.rc.style.position="absolute",Ni&&(this.rc.style["-webkit-overflow-scrolling"]="touch",this.rc.style.overflow="auto"),a=zd("IFRAME"),a.setAttribute("src",this.zo.url()),a.style.border=0,a.style.backgroundColor="#ffffff",a.setAttribute("webkitallowfullscreen",""),a.setAttribute("mozallowfullscreen",""),a.setAttribute("allowfullscreen",""),this.sa= +a)}k=rF.prototype;k.$g=!1;k.Dg=function(a){const b=this.zo;if(this.sa&&this.rc&&b.iC()){var c=a.scale();const d=c*b.width();c*=b.height();a=a.position(b.id(),1);Nh(this.rc,d,c);Gh(this.rc,a.x,a.y);Nh(this.sa,d,c)}};k.visible=function(){return this.$g}; +k.FI=function(a){if(this.$g!=a)if(this.$g=a,this.zo.iC()){if(a){this.rc.appendChild(this.sa);try{this.sa.contentWindow.ispringPresentationPlayer=this.nN}catch(b){}}else Cd(this.rc);Th(this.rc,a)}else if(a){if(!this.sa){a=this.zo;const b={resizable:!0,statusbar:!1,toolbar:!1,location:!1,scrollbars:!1,menubar:!1},c=this.zo.width()||this.zo.height();a.gQ()?(b.width=screen.availWidth,b.height=screen.availHeight,b.top=0,b.left=0):c&&(b.width=Math.max(this.zo.width(),100),b.height=Math.max(this.zo.height(), +100));this.sa=ei?this.$M(a.url()):fh(a.url(),b)}}else{if(this.sa)try{this.sa.close()}catch(b){}this.sa=null}};k.$M=function(a){(new di("openWindow",[a])).ix();return null};function sF(a,b,c,d){this.Ib={};this.nN=d;this.Ab=a;this.M=c;b.Sb().addHandler(this.wb,this);a.Le().addHandler(this.nA,this)}k=sF.prototype;k.U=-1;k.wb=function(a){a=a.timestamp();this.U!=a.L()&&tF(this,this.U,-1);this.U=a.L();-1!=a.Aa()&&(a=this.vO(a),tF(this,this.U,a))};k.D=function(a){const b=a.id();this.Ib[b]||(this.Ib[b]=new rF(this.Ab,a,this.nN));return this.Ib[b]};k.nA=function(){const a=this;uF(this,this.U,function(b){b.Dg(a.Ab)})}; +function tF(a,b,c){a.rO(b);uF(a,a.U,function(d){const e=d.zo.timeout()<=c;e&&(d.visible()||d.Dg(a.Ab));d.FI(e)})}k.Ao=function(a){return this.AG(a)&&(a=this.M.ja(a),a instanceof Am)?a.oD():null};k.rO=function(a){this.AG(a)&&this.M.ja(a).nb().duration()};k.vO=function(a){const b=a.Aa(),c=a.L();return this.M.ja(c).nb().pc(b).startTime()+a.ib()};k.AG=function(a){return 0<=a&&af||f>=e.count()?null:e.Ao[f])e=a.D(e),c(e)}}};var vF={S1:"gotoPreviousSlide",O1:"continuePresentation",P1:"finishAction",uga:"skipQuiz"};q("ispring.quiz.player.QuizPlayerControllerActionType",vF);q("GOTO_PREVIOUS_SLIDE","gotoPreviousSlide",vF);q("CONTINUE_PRESENTATION","continuePresentation",vF);q("FINISH_ACTION","finishAction",vF);q("SKIP_QUIZ","skipQuiz",vF);var wF={O1:"continuePresentation",P1:"finishAction",vga:"skipScenario",S1:"gotoPreviousSlide",Fea:"gotoNextSlide"};q("ispring.scenario.player.ScenarioPlayerControllerActionType",wF);q("CONTINUE_PRESENTATION","continuePresentation",wF);q("FINISH_ACTION","finishAction",wF);q("SKIP_SCENARIO","skipScenario",wF);q("GOTO_PREVIOUS_SLIDE","gotoPreviousSlide",wF);q("GOTO_NEXT_SLIDE","gotoNextSlide",wF);var xF={Jea:"initializing",ida:"authorizating",Lea:"inProgress",wda:"completed"};q("ispring.scenario.session.ScenarioState",xF);q("INITIALIZING","initializing",xF);q("IN_PROGRESS","inProgress",xF);q("COMPLETED","completed",xF);q("AUTHORIZATING","authorizating",xF);var yF=null,zF=null;function AF(a,b,c){this.F=a;var d=Oi();if("1"==d.resume||"review"==window.launchMode)a.settings().Pc().kw="always";else if("0"==d.resume||"browse"==window.launchMode)a.settings().Pc().kw="never";var e=Fj?new KE(a):new AE;d=new dC;const f=new yg,g=new RD(f);g.fR(a.settings().ia());const h=new ND(a,g,e);var l=new WD(a,h);this.Hg=new kC;const n=new mC(a.settings().navigation().keyboard(),a.slides(),g,this.Hg);var m=new VD;m.stateChangedEvent().addHandler(this.qA,this);this.Va=new uq(d,c,h,g,g,l,n,this, +m);new NB(b);this.pa=new XB(this.Va,a,f);b=this.pa.W();m=this.pa.Xd();e.$q(b.Z());h.pR(b.Z(),b.Ho());n.SC(m);l.B=b;l.tc=m;d.SC(b);d.zI(h);BF(this,d);e=this.pa.Vq();l=e.displayObject();c.Ye.Qe=l;new jE(e,b.Z(),a.slides());new sF(e,b.Z(),a.slides(),this);new uE(this.pa,e,b.Z(),a.slides());this.lV=new SD(a);this.lV.SC(b);this.dZ=new C;this.bZ=new C;this.vU=new C;this.RS=new C;this.Aq=new C;this.LX=new C;this.DD=new bF(a.slides(),b.Z(),b.Ho(),a.nd().xm(),g,f);this.cH=new gF(a.slides(),b.Z(),b.Ho(),a.nd().Lf(), +g,f);this.S4=new EE(a.slides(),h,b.Z(),c.Ye);new BE(b,g);Ii&&new wE(d);this.j3=new xE(a.slides(),e,b,g);this.R4=Fj?new LE(g):new CE(g);b.SX.addHandler(this.h6,this);b.Vo().addHandler(this.Wl,this);b.eE.addHandler(this.z5,this);b.JT.addHandler(this.I3,this);b.Bc().addHandler(this.On,this);this.ie=g;Dj&&ISPlayer.setPauseMediaCallback(this.NF.bind(this))}k=AF.prototype;k.IT=!1;k.Uj=function(){return this.Hg};k.yH=function(){return this.Va}; +function BF(a,b){const c=wd("DIV");c.getCore=function(){return b};c.setAttribute("id",a.F.settings().NI());a.pa.displayObject().appendChild(c)}function pF(a,b,c,d){const e=a.pa.W().Z(),f=!d;f&&a.Js();c&&oF(a);f&&c||e.Cc().addHandler(function h(){e.started()&&(e.Cc().removeHandler(h,this,-1),f||a.Js(),c||oF(a))},a,-1);a.vU.C(b,c,d)}k.Js=function(){this.j3.activate();this.pa.W().activate()}; +function oF(a){a.IT||(a.IT=!0,a.R4.activate(),a.DD.activate(),a.cH.activate(),a.Va.mediaController().activate())}k.Ba=function(){return this.F};AF.prototype.presentation=AF.prototype.Ba;AF.prototype.view=function(){return this.pa};AF.prototype.view=AF.prototype.view;AF.prototype.version=function(){return"8.3.0"};AF.prototype.version=AF.prototype.version;AF.prototype.persistState=function(){return this.Va.Ce.cR()};AF.prototype.persistState=AF.prototype.persistState; +AF.prototype.gaa=function(a,b){var c={width:a,height:b,D_:!1};this.LX.C(c);return c.D_?new cd(c.width,c.height):(c=Math.min(a/this.F.slideWidth(),b/this.F.slideHeight()),new cd(a*c,b*c))};AF.prototype.getOptimalPlayerSize=AF.prototype.gaa;AF.prototype.qA=function(){this.Aq.C(new Mn)}; +AF.prototype.start=function(a){var b=null;a&&(b=UD(a));a=this.F.settings().Pc();var c=this.view().W(),d=b,e=this.view().W().Gf(),f;if(f=d)a:{f=this.F.slides().count();var g=this.view().W().Gf();for(let h=0;hf||f>=this.F.slides().count();d="review"==window.launchMode;d=g&&null!=e&&0<=e&&("never"!=a.eu()||d);g&&(f=c.Gf());c=d?e:f;b=new qF(this,b);e=new iF(b); +e.yI(a.ff());e.fu(d?"resumePlayback":"gotoSlide");e.d1(c);this.dZ.C(e);switch(e.action()){case "resumePlayback":b.resume(e.L());break;case "gotoSlide":b.start(e.L());break;case "delayStartup":b.cZ=!0;break;default:throw Error("unknown startup action");}};AF.prototype.Ix=function(){return this.Va.Ix()};AF.prototype.Tx=function(){return this.dZ};AF.prototype.startupEvent=AF.prototype.Tx;AF.prototype.startupCompletedEvent=function(){return this.bZ};AF.prototype.startupCompletedEvent=AF.prototype.startupCompletedEvent; +AF.prototype.vx=function(){return this.vU};AF.prototype.initialSlideShownEvent=AF.prototype.vx;AF.prototype.h6=function(){this.DD.Lm();this.cH.Lm();this.S4.Lm()};AF.prototype.Wl=function(){const a=this.F.settings().xu().mI();a&&a.open()};AF.prototype.mC=function(){return this.lV.mC()};AF.prototype.executeMetaCommandEvent=AF.prototype.mC;AF.prototype.z_=function(){return this.DD};AF.prototype.audioNarrationController=AF.prototype.z_;AF.prototype.Ar=function(){return this.cH}; +AF.prototype.videoNarrationController=AF.prototype.Ar;AF.prototype.z5=function(){const a=new Mn;this.RS.C(a);if(!a.actionPrevented())if(ei)(new di("closeWindow")).ix();else try{Ji||(window.open("","_self",""),window.close())}catch(b){}};AF.prototype.closeWindowEvent=function(){return this.RS};AF.prototype.closeWindowEvent=AF.prototype.closeWindowEvent;AF.prototype.stateChangedEvent=function(){return this.Aq};AF.prototype.stateChangedEvent=AF.prototype.stateChangedEvent; +AF.prototype.Mm=function(a){this.pa.Gb!=a&&(this.NF(),this.pa.Mm(a))};AF.prototype.gestureNavigationEnabled=function(){return this.F.settings().navigation().Gm().enabled()};AF.prototype.gestureNavigationEnabled=AF.prototype.gestureNavigationEnabled;function CF(a,b){if(b=null==a.pa.Xd().gf(b))b=!(-1==a.pa.W().Ug()&&-1==a.pa.W().Vg());return b}function DF(a,b){return null==a.pa.Xd().gf("quizArbitrarySlideSwitching",b)}function EF(a,b){return null==a.pa.Xd().gf("ScenarioArbitrarySlideSwitching",b)} +function FF(a,b){var c=a.pa.W(),d=c.$();c=c.Ud().view();c=yq(c.ob());switch(b){case "gotoPreviousSlide":return-1!=a.pa.W().Vg();case "skipScenario":return"atAnyTime"==d.um&&CF(a,"switchToNextSlide");case "continuePresentation":return b=c.scenarioPassed()?d.MF:d.iE,d=0,b instanceof Vg&&(d=b.L()),"gotoSlide"==b.type()&&EF(a,d)||"gotoNextSlide"==b.type()&&CF(a,"scenarioSwitchToNextSlideWithoutBranching");case "finishAction":return b=c.scenarioPassed()?d.MF:d.iE,d=0,b instanceof Vg&&(d=b.L()),"closePlayerWindow"== +b.type()||"gotoSlide"==b.type()&&EF(a,d)||"gotoNextSlide"==b.type()&&CF(a,"scenarioSwitchToNextSlide")}return!1} +function GF(a,b){var c=a.pa.W();const d=c.$();c=c.Ud().view();const e=Rg(c.Oa());switch(b){case "gotoPreviousSlide":return"sequential"!=a.F.settings().navigation().navigationType()&&c.Sx()&&-1!=a.pa.W().Vg();case "skipQuiz":if(b="atAnyTime"==d.um)b=CF(a,"switchToNextSlide")&&-1!=a.pa.W().Ug();return b;case "continuePresentation":return b=Sg(e)?d.LF:d.hE,"gotoSlide"==b.type()?DF(a,b.L()):"gotoNextSlide"==b.type()&&CF(a,"quizSwitchToNextSlideWithoutBranching");case "finishAction":return b=Sg(e)?d.LF: +d.hE,"gotoSlide"==b.type()?DF(a,b.L()):"closePlayerWindow"==b.type()||"gotoNextSlide"==b.type()&&CF(a,"quizSwitchToNextSlide")}return!1}AF.prototype.actionAvailable=function(a){var b=this.pa.W().$();if(b instanceof br)a=GF(this,a);else if(b instanceof sq)a:{b=this.pa.W().Ud().view();switch(a){case "gotoNextPresentationSlide":a=CF(this,"switchToNextSlide");break a;case "gotoPreviousPresentationSlide":a=b.Sx()&&-1!=this.pa.W().Vg();break a}a=!1}else a=b instanceof Aq?FF(this,a):!1;return a}; +AF.prototype.actionAvailable=AF.prototype.actionAvailable;AF.prototype.I3=function(a,b,c){const d=this.F.slides();b=0<=b?d.ja(b):null;c=0<=c?d.ja(c):null;if(b instanceof br||c instanceof br||b instanceof sq||c instanceof sq||b instanceof Aq||c instanceof Aq)uj?(a.Yu="null",a.Ea=0):a.Yu="FadeSmoothly"};AF.prototype.On=function(){const a=this.pa.W().Ug();this.DD.iu(a);this.cH.iu(a)}; +AF.prototype.NF=function(){const a=this.pa.W();if(!(0>a.ma())){a.pause();this.ie.fI();var b=this.pa.W().Oa();b&&b.pauseMedia();(b=this.pa.W().ob())&&b.pauseMedia();b=a.$();b instanceof sq&&a.kf(b.index()).fb().pauseMedia()}};function HF(a){this.aI=a}HF.prototype.set=function(a,b){void 0===b?this.aI.remove(a):this.aI.set(a,vh(b))};HF.prototype.get=function(a){let b;try{b=this.aI.get(a)}catch(c){return}if(null!==b)try{return JSON.parse(b)}catch(c){throw"Storage: Invalid value was encountered";}};HF.prototype.remove=function(a){this.aI.remove(a)};function IF(){};function JF(){}t(JF,IF);JF.prototype.IH=function(){let a=0;for(const b of this)a++;return a};JF.prototype[Symbol.iterator]=function(){return Gk(this.sj(!0)).SI()};JF.prototype.clear=function(){const a=Array.from(this);for(const b of a)this.remove(b)};function KF(a){this.mk=a}t(KF,JF);k=KF.prototype;k.rQ=function(){if(!this.mk)return!1;try{return this.mk.setItem("__sak","1"),this.mk.removeItem("__sak"),!0}catch(a){return!1}};k.set=function(a,b){try{this.mk.setItem(a,b)}catch(c){if(0==this.mk.length)throw"Storage mechanism: Storage disabled";throw"Storage mechanism: Quota exceeded";}};k.get=function(a){a=this.mk.getItem(a);if("string"!==typeof a&&null!==a)throw"Storage mechanism: Invalid value was encountered";return a};k.remove=function(a){this.mk.removeItem(a)}; +k.IH=function(){return this.mk.length};k.sj=function(a){var b=0,c=this.mk,d=new zk;d.next=function(){if(b>=c.length)return Ak;var e=c.key(b++);if(a)return Bk(e);e=c.getItem(e);if("string"!==typeof e)throw"Storage mechanism: Invalid value was encountered";return Bk(e)};return d};k.clear=function(){this.mk.clear()};k.key=function(a){return this.mk.key(a)};function LF(){var a=null;try{a=window.localStorage||null}catch(b){}this.mk=a}t(LF,KF);function MF(a,b){this.t1=a;this.zh=null;if(Ib&&!(9<=Number(dc))){NF||(NF=new Kk);this.zh=NF.get(a);this.zh||(b?this.zh=document.getElementById(b):(this.zh=document.createElement("userdata"),this.zh.addBehavior("#default#userData"),document.body.appendChild(this.zh)),NF.set(a,this.zh));try{this.zh.load(this.t1)}catch(c){this.zh=null}}}t(MF,JF);var OF={".":".2E","!":".21","~":".7E","*":".2A","'":".27","(":".28",")":".29","%":"."},NF=null; +function PF(a){return"_"+encodeURIComponent(a).replace(/[.!~*'()%]/g,function(b){return OF[b]})}k=MF.prototype;k.rQ=function(){return!!this.zh};k.set=function(a,b){this.zh.setAttribute(PF(a),b);QF(this)};k.get=function(a){a=this.zh.getAttribute(PF(a));if("string"!==typeof a&&null!==a)throw"Storage mechanism: Invalid value was encountered";return a};k.remove=function(a){this.zh.removeAttribute(PF(a));QF(this)};k.IH=function(){return RF(this).attributes.length}; +k.sj=function(a){var b=0,c=RF(this).attributes,d=new zk;d.next=function(){if(b>=c.length)return Ak;var e=c[b++];if(a)return Bk(decodeURIComponent(e.nodeName.replace(/\./g,"%")).slice(1));e=e.nodeValue;if("string"!==typeof e)throw"Storage mechanism: Invalid value was encountered";return Bk(e)};return d};k.clear=function(){for(var a=RF(this),b=a.attributes.length;0{if(!e.actionPrevented()){e.preventAction();e=c.persistState();const f=VF();try{f.set(d,e)}catch(g){}}},null,99);c.start(b)};function YF(a,b){for(const c in a)a.hasOwnProperty(c)&&ZF(a[c],c,b)}function ZF(a,b,c){for(const d in a)a.hasOwnProperty(d)&&(d==c?b=a[c]:"toString"!=d&&ZF(a[d],d,c));a.toString=function(){return b}};function $F(){var a={A:""};a:{for(const b in a){a=b;break a}a=void 0}return a};function aG(){const a={id:{A:"i"},title:{A:"t"},courseTitle:{A:"ct"},slideWidth:{A:"w"},slideHeight:{A:"h"},L_:{A:"c"},yba:{A:"pv"},slides:{A:"s",id:{A:"I"},aD:{A:"st",slide:{A:"s"},quiz:{A:"q"},interaction:{A:"i"},scenario:{A:"S"}},title:{A:"t"},visible:{A:"v"},N_:{A:"c"},src:{A:"s"},n1:{A:"sl"},gj:{A:"o"},Po:{A:"n"},uaa:{A:"N"},R9:{A:"an"},text:{A:"x"},ru:{A:"T",vC:{A:"i"},width:{A:"w"},height:{A:"h"}},SB:{A:"a"},W9:{A:"d"},Zc:{A:"l"},Bba:{A:"p"},d$:{A:"B"},h0:{A:"hi"},yi:{A:"e",T0:{A:"p"},S0:{A:"a"}}, +timeline:{A:"i"},transition:{A:"q",type:{A:"t"},duration:{A:"d"},lk:{A:"s"}},Md:{A:"S",id:{A:"i"},Mq:{A:"a"},slides:{A:"s"},repeat:{A:"r",F1:{A:"s"},E1:{A:"c"},G1:{A:"n"}},volume:{A:"v"},effect:{A:"e"},Sj:{A:"b",name:{A:"n"},time:{A:"t"}},duration:{A:"d"}},$d:{A:"V",id:{A:"i"},Mq:{A:"a"},slides:{A:"s"},repeat:{A:"r",F1:{A:"s"},E1:{A:"c"},G1:{A:"n"}},NQ:{A:"f"},nQ:{A:"H"},uI:{A:"R"},volume:{A:"v"},pi:{A:"h"},Sj:{A:"b",name:{A:"n"},time:{A:"t"}},duration:{A:"d"}},oD:{A:"wo",containerId:{A:"c"},url:{A:"u"}, +timeout:{A:"to"},width:{A:"w"},height:{A:"h"},gQ:{A:"f"},iC:{A:"ds"}},$ca:{A:"y",containerId:{A:"c"},Bi:{A:"v"},width:{A:"w"},height:{A:"h"},ib:{A:"to"}},Zca:{A:"yk",containerId:{A:"c"},Bi:{A:"v"},width:{A:"w"},height:{A:"h"},ib:{A:"to"},clientId:{A:"cl"}},No:{A:"m",name:{A:"n"},params:{A:"p",name:{A:"n"},value:{A:"v"}}},fj:{A:"b",action:{type:{A:"t",bba:{A:"n"},pe:{A:"g"}},L:{A:"s"}},Oo:{A:"n"},Gx:{A:"p"}},St:{A:"r",lock:{A:"l"}},qk:{A:"z",id:{A:"i"},Wx:{A:"t"},qr:{A:"r"},Nm:{A:"bg"},OR:{A:"tt"}, +ym:{A:"b"},ul:{A:"hF"},Fl:{A:"vF"},rotation:{A:"R"},slides:{A:"s"}},cQ:{A:"f",containerId:{A:"c"},width:{A:"w"},height:{A:"h"},url:{A:"u"},ib:{A:"to"},bgColor:{A:"b"},D1:{A:"t"}},kca:{A:"si",CI:{A:"shapes",item:{id:{A:"id"},ym:{A:"bbox"},qj:{A:"transformBefore"},nk:{A:"transformAfter"}},Nc:{A:"bg"},Dl:{A:"textItems"},Qq:{A:"childItems"},type:{A:"type"},text:{A:"text"},ym:{A:"bbox"},ul:{A:"hFlip"},Fl:{A:"vFlip"},rotation:{A:"rotation"},fr:{A:"lineWeight"},mj:{A:"normalizedPic"},naa:{A:"hasTransparency"}, +ne:{A:"crop",left:{A:"l"},top:{A:"t"},right:{A:"r"},bottom:{A:"b"}},line:{A:"line"},fill:{A:"fill"},Nt:{A:"glow"},Zt:{A:"reflection"},ku:{A:"shadow"},pu:{A:"softEdge"},qu:{A:"threeD"}}},Iba:{A:"qb"},Jba:{A:"qB",VB:{A:"i"},ZQ:{A:"r"},AP:{A:"n",DP:{A:"t"},yP:{A:"a"},zP:{A:"p"}},aQ:{A:"f",Ut:{A:"p",type:{A:"t",KP:{A:"w"},lf:{A:"n"},pe:{A:"s"}},L:{A:"s"}},$P:{A:"f"}}},Kba:{A:"qt"},Yba:{A:"sB",WB:{A:"i"},AP:{A:"n",DP:{A:"t"},yP:{A:"a"},zP:{A:"p"}},aQ:{A:"f",Ut:{A:"p",type:{A:"t",KP:{A:"w"},lf:{A:"n"}, +pe:{A:"s"}},L:{A:"s"}},$P:{A:"f"}}},pQ:{A:"it"},Xo:{A:"pp"},xaa:{A:"ip",navigationType:{A:"nt"},UB:{A:"ai"}}},settings:{A:"e",navigation:{A:"n",Gm:{A:"m",enabled:{A:"e"},target:{A:"t",step:{A:"s"},slide:{A:"l"}}},keyboard:{A:"k",enabled:{A:"e"},actions:{A:"a",name:{A:"n",tba:{A:"pp"},bI:{A:"ns"},Cba:{A:"ps"},aba:{A:"nt"},Dba:{A:"pt"},bca:{A:"sf"},aca:{A:"sb"},Y$:{A:"fs"},Eaa:{A:"ls"},tQ:{A:"lv"},mca:{A:"ss"},jca:{A:"se"},Qca:{A:"vu"},Pca:{A:"vd"},Bca:{A:"tf"}},lu:{A:"s",key:{A:"k"},zH:{A:"c"},shift:{A:"s"}}}}, +lx:{A:"g",VR:{A:"z"}}},Pc:{A:"p",bR:{A:"s"},ff:{A:"a"},resume:{A:"r",prompt:{A:"p"},X9:{A:"a"},Yaa:{A:"n"}},Fm:{A:"l"},navigationType:{A:"n",Mha:{A:"n"},Qba:{A:"r"},cca:{A:"s"}}},Lq:{A:"a",fitToWindow:{A:"f"}},xu:{A:"w",link:{url:{A:"u"},target:{A:"t"}},HI:{A:"s"},mI:{A:"p"}},Hx:{A:"P",password:{A:"p"},Xx:{A:"t",I$:{A:"a"},J$:{A:"u"}},DH:{A:"d"}},Gt:{A:"A",enabled:{A:"e"}}},LI:{A:"S",name:{A:"n"},slides:{A:"s"}},ZH:{A:"sS"},skinSettings:{A:"k"},ia:{A:"I"},YB:{A:"b",content:{A:"c"},contentHover:{A:"ch"}, +url:{A:"u"},width:{A:"w"},height:{A:"h"},Yx:{A:"t"},language:{A:"l"},Zw:{A:"x"},Yw:{A:"d"},$w:{A:"xx"},ex:{A:"xy"}},nD:{A:"W",src:{A:"s"},left:{A:"l"},top:{A:"t"},width:{A:"w"},height:{A:"h"},opacity:{A:"o"},url:{A:"u"},target:{A:"T"}},fonts:{A:"f",name:{A:"n"},localName:{A:"l"},urls:{A:"u"},Uca:{A:"A"},UR:{A:"D"},Y9:{A:"a"},E$:{A:"d"},daa:{A:"g"},bold:{A:"b"},italic:{A:"i"}},Td:{A:"C",logo:{A:"l",vC:{A:"i"},width:{A:"w"},height:{A:"h"}},ue:{A:"w"},pD:{A:"t"}},Yt:{A:"p",name:{A:"n"},Pt:{A:"j"},Oq:{A:"b"}, +ue:{A:"w"},email:{A:"e"},phone:{A:"p"},Td:{A:"C"},Vt:{A:"P",vC:{A:"i"},width:{A:"w"},height:{A:"h"}}},Md:{A:"o",id:{A:"i"},pi:{A:"h"}},$d:{A:"v",id:{A:"i"},pi:{A:"h"},poster:{A:"p"}},nd:{A:"n",xm:{A:"a"},Lf:{A:"v"},track:{FC:{A:"i"},volume:{A:"v"},jc:{A:"st"},jf:{A:"et"},timestamp:{L:{A:"s"},Aa:{A:"t"},ib:{A:"i"}}}},ti:{A:"r",type:{A:"t",Z9:{A:"a"},Nba:{A:"r"}},title:{A:"i"},url:{A:"u"},target:{A:"a"}},Wt:{A:"P",loop:{A:"l"},Md:{A:"s"}}},b=$F();YF(a,b);return a};class fG{Uq(a,b){var c=["data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA5LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDksMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbD0iI0RENEIzOCIgZD0iTTIxLjA0MSwyOXY5Ljg0NGMwLDUuNTA4LDQuNjkxLDkuOTczLDEwLjQ3OSw5Ljk3M2M1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTczVjI5SDIxLjA0MXoiLz4NCjxwYXRoIGZpbGw9IiNERDRCMzgiIGQ9Ik0yNi41NTgsMjl2LTcuNjg5YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MlYyOWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNFYyOUgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjEuMDQxLDI4LjIwNnY5Ljg0NWMwLDUuNTA2LDQuNjkxLDkuOTcxLDEwLjQ3OSw5Ljk3MWM1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTcxdi05Ljg0NUgyMS4wNDF6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjYuNTU4LDI4LjA0VjIwLjM1YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MnY3LjY4OWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNHY4LjA1NEgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRjA4RjgyIiBkPSJNMzQsMzYuMzY1YzAtMS4yODctMS4wNDQtMi4zMzEtMi4zMzEtMi4zMzFjLTEuMjg4LDAtMi4zMzIsMS4wNDQtMi4zMzIsMi4zMzENCgljMCwwLjk3MSwwLjU5NCwxLjgwMiwxLjQzOCwyLjE1MnY0LjQ2N2gxLjkxdi00LjUyOUMzMy40NjEsMzguMDc2LDM0LDM3LjI4NywzNCwzNi4zNjV6Ii8+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA4LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDgsMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik01OS42NDYsMzFoLTMuMjkzQzU2LjE1OCwzMSw1NiwzMS40NDgsNTYsMzINCgljMCwwLjU1MywwLjE1OCwxLDAuMzU0LDFoMy4yOTNDNTkuODQyLDMzLDYwLDMyLjU1Myw2MCwzMkM2MCwzMS40NDgsNTkuODQyLDMxLDU5LjY0NiwzMXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjREQ0QjM4IiBkPSJNNi42NDcsMzFIMy4zNTNDMy4xNTgsMzEsMywzMS40NDgsMywzMmMwLDAuNTUzLDAuMTU4LDEsMC4zNTMsMQ0KCWgzLjI5NEM2Ljg0MiwzMyw3LDMyLjU1Myw3LDMyQzcsMzEuNDQ4LDYuODQyLDMxLDYuNjQ3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik0zMSw4YzAuNTUzLDAsMS0wLjE1OCwxLTAuMzUzVjQuMzUzQzMyLDQuMTU4LDMxLjU1Myw0LDMxLDQNCgljLTAuNTUyLDAtMSwwLjE1OC0xLDAuMzUzdjMuMjk0QzMwLDcuODQyLDMwLjQ0OCw4LDMxLDh6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTMxLDU2Yy0wLjU1MiwwLTEsMC4xNTgtMSwwLjM1NHYzLjI5M0MzMCw1OS44NDIsMzAuNDQ4LDYwLDMxLDYwDQoJYzAuNTUzLDAsMS0wLjE1OCwxLTAuMzU0di0zLjI5M0MzMiw1Ni4xNTgsMzEuNTUzLDU2LDMxLDU2eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik00Ny42NjgsMzFoLTEyLjgxQzM0LjQ5NiwyOS42LDMzLjQsMjguNTA1LDMyLDI4LjE0Mg0KCWMwLDAtMC4xNzItMC4xNDItMS0wLjE0MmMtMC44MjksMC0yLDAuNTU1LTIsMC41NTVjLTEuMTksMC42OTMtMiwxLjk2OS0yLDMuNDQ1YzAsMi4yMDksMS43OTEsNCw0LDRjMS40NzcsMCwyLjc1Mi0wLjgwOSwzLjQ0NS0yDQoJaDEzLjIyM0M0OC40MDQsMzQsNDksMzMuMzI4LDQ5LDMyLjVDNDksMzEuNjcyLDQ4LjQwNCwzMSw0Ny42NjgsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTI3LjAxOCwyOS43NDhjMC41OTIsMS4wMjUsMS42NTIsMS41MiwyLjM3LDEuMTA2bDAsMA0KCWMwLjcxNy0wLjQxNSwwLjgxOS0xLjU4MSwwLjIyOC0yLjYwNmwtNy44NTctMTMuNjA5Yy0wLjU5Mi0xLjAyNC0xLjY1My0xLjUyLTIuMzcxLTEuMTA2bDAsMGMtMC43MTcsMC40MTUtMC44MTgsMS41ODEtMC4yMjgsMi42MDUNCglMMjcuMDE4LDI5Ljc0OHoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMjcuMDE4LDI4LjM2MWMwLjU5MiwxLjAyNSwxLjY1MiwxLjUyLDIuMzcsMS4xMDZsMCwwDQoJYzAuNzE3LTAuNDE1LDAuODE5LTEuNTgxLDAuMjI4LTIuNjA2bC03Ljg1Ny0xMy42MDljLTAuNTkyLTEuMDI0LTEuNjUzLTEuNTItMi4zNzEtMS4xMDZsMCwwYy0wLjcxNywwLjQxNS0wLjgxOCwxLjU4MS0wLjIyOCwyLjYwNQ0KCUwyNy4wMTgsMjguMzYxeiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgY3g9IjMxIiBjeT0iMzEiIHI9IjQiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNjAsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzU0LDFoLTMuMjkzQzU2LjE1OCwzMiw1NiwzMS41NTIsNTYsMzENCglsMCwwYzAtMC41NTIsMC4xNTgtMSwwLjM1NC0xaDMuMjkzQzU5Ljg0MiwzMCw2MCwzMC40NDgsNjAsMzFMNjAsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTcsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzUzLDFIMy4zNTNDMy4xNTgsMzIsMywzMS41NTIsMywzMWwwLDANCgljMC0wLjU1MiwwLjE1OC0xLDAuMzUzLTFoMy4yOTRDNi44NDIsMzAsNywzMC40NDgsNywzMUw3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0zMSwzYzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDYuODQyLDMxLjU1Myw3LDMxLDdsMCwwDQoJYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1M1YzLjM1M0MzMCwzLjE1OCwzMC40NDgsMywzMSwzTDMxLDN6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTMxLDU1YzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDU4Ljg0MiwzMS41NTMsNTksMzEsNTkNCglsMCwwYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1NHYtMy4yOTRDMzAsNTUuMTU4LDMwLjQ0OCw1NSwzMSw1NUwzMSw1NXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNDksMzEuNDk5QzQ5LDMwLjY3Miw0OC40MDQsMzAsNDcuNjY4LDMwSDM0LjMzMw0KCUMzMy41OTYsMzAsMzMsMzAuNjcxLDMzLDMxLjVsMCwwYzAsMC44MjgsMC41OTYsMS41LDEuMzMzLDEuNWgxMy4zMzVDNDguNDA0LDMzLDQ5LDMyLjMyOCw0OSwzMS40OTlMNDksMzEuNDk5eiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YxNjE1NSIgY3g9IjMxIiBjeT0iMzEiIHI9IjIiLz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPgo8cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHJ4PSI2IiBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIwLjciLz4KPGcgb3BhY2l0eT0iMC44IiBjbGlwLXBhdGg9InVybCgjY2xpcDApIj4KPHBhdGggZD0iTTUzLjUgMjQuODk4NEg1MkM1MS42MDIyIDI0Ljg5ODQgNTEuMjIwNiAyNS4wNTYgNTAuOTM5MyAyNS4zMzY0QzUwLjY1OCAyNS42MTY5IDUwLjUgMjUuOTk3MiA1MC41IDI2LjM5MzhDNTAuNSAyNi43OTA0IDUwLjY1OCAyNy4xNzA4IDUwLjkzOTMgMjcuNDUxMkM1MS4yMjA2IDI3LjczMTYgNTEuNjAyMiAyNy44ODkyIDUyIDI3Ljg4OTJINTMuNUM1My44OTc4IDI3Ljg4OTIgNTQuMjc5NCAyOC4wNDY3IDU0LjU2MDcgMjguMzI3MkM1NC44NDIgMjguNjA3NiA1NSAyOC45ODggNTUgMjkuMzg0NlY0MS4zODQ5QzUzLjcwOTMgNDAuMzk1OCA1Mi4xMjggMzkuODU3MiA1MC41IDM5Ljg1MjJDNDkuMjcxNyAzOS44NTI4IDQ4LjA2MjQgNDAuMTU0MSA0Ni45NzgzIDQwLjcyOTdDNDUuODk0MiA0MS4zMDUzIDQ0Ljk2ODUgNDIuMTM3NSA0NC4yODI1IDQzLjE1MzJDNDMuNzI2MSA0Mi41ODIxIDQzLjA2MDMgNDIuMTI4MSA0Mi4zMjQ4IDQxLjgxOEM0MS41ODkyIDQxLjUwOCA0MC43OTg2IDQxLjM0ODMgNDAgNDEuMzQ4M0MzOS4yMDE0IDQxLjM0ODMgMzguNDEwOCA0MS41MDggMzcuNjc1MiA0MS44MThDMzYuOTM5NyA0Mi4xMjgxIDM2LjI3MzkgNDIuNTgyMSAzNS43MTc1IDQzLjE1MzJDMzUuMDMxNSA0Mi4xMzc1IDM0LjEwNTggNDEuMzA1MyAzMy4wMjE3IDQwLjcyOTdDMzEuOTM3NiA0MC4xNTQxIDMwLjcyODMgMzkuODUyOCAyOS41IDM5Ljg1MjJDMjcuODcyIDM5Ljg1NzIgMjYuMjkwNyA0MC4zOTU4IDI1IDQxLjM4NDlWMjkuMzg0NkMyNSAyOC45ODggMjUuMTU4IDI4LjYwNzYgMjUuNDM5MyAyOC4zMjcyQzI1LjcyMDYgMjguMDQ2NyAyNi4xMDIyIDI3Ljg4OTIgMjYuNSAyNy44ODkySDI4QzI4LjM5NzggMjcuODg5MiAyOC43Nzk0IDI3LjczMTYgMjkuMDYwNyAyNy40NTEyQzI5LjM0MiAyNy4xNzA4IDI5LjUgMjYuNzkwNCAyOS41IDI2LjM5MzhDMjkuNSAyNS45OTcyIDI5LjM0MiAyNS42MTY5IDI5LjA2MDcgMjUuMzM2NEMyOC43Nzk0IDI1LjA1NiAyOC4zOTc4IDI0Ljg5ODQgMjggMjQuODk4NEgyNi41QzI1LjMwNjUgMjQuODk4NCAyNC4xNjE5IDI1LjM3MTEgMjMuMzE4IDI2LjIxMjRDMjIuNDc0MSAyNy4wNTM3IDIyIDI4LjE5NDggMjIgMjkuMzg0NlY0Ny4zMjkxQzIyIDQ5LjMxMjEgMjIuNzkwMiA1MS4yMTM4IDI0LjE5NjcgNTIuNjE2QzI1LjYwMzIgNTQuMDE4MiAyNy41MTA5IDU0LjgwNTkgMjkuNSA1NC44MDU5QzMxLjQ4OTEgNTQuODA1OSAzMy4zOTY4IDU0LjAxODIgMzQuODAzMyA1Mi42MTZDMzYuMjA5OCA1MS4yMTM4IDM3IDQ5LjMxMjEgMzcgNDcuMzI5MUMzNyA0Ni41MzU5IDM3LjMxNjEgNDUuNzc1MiAzNy44Nzg3IDQ1LjIxNDNDMzguNDQxMyA0NC42NTM0IDM5LjIwNDQgNDQuMzM4MyA0MCA0NC4zMzgzQzQwLjc5NTYgNDQuMzM4MyA0MS41NTg3IDQ0LjY1MzQgNDIuMTIxMyA0NS4yMTQzQzQyLjY4MzkgNDUuNzc1MiA0MyA0Ni41MzU5IDQzIDQ3LjMyOTFDNDMgNDkuMzEyMSA0My43OTAyIDUxLjIxMzggNDUuMTk2NyA1Mi42MTZDNDYuNjAzMiA1NC4wMTgyIDQ4LjUxMDkgNTQuODA1OSA1MC41IDU0LjgwNTlDNTIuNDg5MSA1NC44MDU5IDU0LjM5NjggNTQuMDE4MiA1NS44MDMzIDUyLjYxNkM1Ny4yMDk4IDUxLjIxMzggNTggNDkuMzEyMSA1OCA0Ny4zMjkxVjI5LjM4NDZDNTggMjguMTk0OCA1Ny41MjU5IDI3LjA1MzcgNTYuNjgyIDI2LjIxMjRDNTUuODM4MSAyNS4zNzExIDU0LjY5MzUgMjQuODk4NCA1My41IDI0Ljg5ODRaTTI5LjUgNTEuODE1MkMyOC42MSA1MS44MTUyIDI3Ljc0IDUxLjU1MjEgMjYuOTk5OSA1MS4wNTkxQzI2LjI1OTkgNTAuNTY2MiAyNS42ODMxIDQ5Ljg2NTYgMjUuMzQyNSA0OS4wNDU4QzI1LjAwMTkgNDguMjI2MSAyNC45MTI4IDQ3LjMyNDEgMjUuMDg2NSA0Ni40NTM5QzI1LjI2MDEgNDUuNTgzNiAyNS42ODg3IDQ0Ljc4NDMgMjYuMzE4IDQ0LjE1NjlDMjYuOTQ3NCA0My41Mjk1IDI3Ljc0OTIgNDMuMTAyMiAyOC42MjIxIDQyLjkyOTFDMjkuNDk1IDQyLjc1NiAzMC4zOTk4IDQyLjg0NDkgMzEuMjIyMSA0My4xODQ0QzMyLjA0NDMgNDMuNTI0IDMyLjc0NzEgNDQuMDk5IDMzLjI0MTYgNDQuODM2N0MzMy43MzYxIDQ1LjU3NDQgMzQgNDYuNDQxOCAzNCA0Ny4zMjkxQzM0IDQ4LjUxODkgMzMuNTI1OSA0OS42NTk5IDMyLjY4MiA1MC41MDEyQzMxLjgzODEgNTEuMzQyNSAzMC42OTM1IDUxLjgxNTIgMjkuNSA1MS44MTUyWk01MC41IDUxLjgxNTJDNDkuNjEgNTEuODE1MiA0OC43NCA1MS41NTIxIDQ3Ljk5OTkgNTEuMDU5MUM0Ny4yNTk5IDUwLjU2NjIgNDYuNjgzMSA0OS44NjU2IDQ2LjM0MjUgNDkuMDQ1OEM0Ni4wMDE5IDQ4LjIyNjEgNDUuOTEyOCA0Ny4zMjQxIDQ2LjA4NjUgNDYuNDUzOUM0Ni4yNjAxIDQ1LjU4MzYgNDYuNjg4NyA0NC43ODQzIDQ3LjMxOCA0NC4xNTY5QzQ3Ljk0NzQgNDMuNTI5NSA0OC43NDkyIDQzLjEwMjIgNDkuNjIyMSA0Mi45MjkxQzUwLjQ5NSA0Mi43NTYgNTEuMzk5OCA0Mi44NDQ5IDUyLjIyMjEgNDMuMTg0NEM1My4wNDQzIDQzLjUyNCA1My43NDcxIDQ0LjA5OSA1NC4yNDE2IDQ0LjgzNjdDNTQuNzM2MSA0NS41NzQ0IDU1IDQ2LjQ0MTggNTUgNDcuMzI5MUM1NSA0OC41MTg5IDU0LjUyNTkgNDkuNjU5OSA1My42ODIgNTAuNTAxMkM1Mi44MzgxIDUxLjM0MjUgNTEuNjkzNSA1MS44MTUyIDUwLjUgNTEuODE1MloiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OCA1Ny45MTQxTDIyIDIxLjkxNDEiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iMyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjwvZz4KPC9nPgo8ZGVmcz4KPGZpbHRlciBpZD0iZmlsdGVyMF9kIiB4PSIwIiB5PSIwIiB3aWR0aD0iODAiIGhlaWdodD0iODAiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLz4KPGZlT2Zmc2V0Lz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIvPgo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4yNSAwIi8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93Ii8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9kcm9wU2hhZG93IiByZXN1bHQ9InNoYXBlIi8+CjwvZmlsdGVyPgo8Y2xpcFBhdGggaWQ9ImNsaXAwIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjM5Ljg3NjciIGZpbGw9IndoaXRlIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMCAxOS45MTQxKSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPgo8cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHJ4PSI2IiBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIwLjgiLz4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwKSI+CjxwYXRoIGQ9Ik01My41IDI0Ljg5ODRINTJDNTEuNjAyMiAyNC44OTg0IDUxLjIyMDYgMjUuMDU2IDUwLjkzOTMgMjUuMzM2NEM1MC42NTggMjUuNjE2OSA1MC41IDI1Ljk5NzIgNTAuNSAyNi4zOTM4QzUwLjUgMjYuNzkwNCA1MC42NTggMjcuMTcwOCA1MC45MzkzIDI3LjQ1MTJDNTEuMjIwNiAyNy43MzE2IDUxLjYwMjIgMjcuODg5MiA1MiAyNy44ODkySDUzLjVDNTMuODk3OCAyNy44ODkyIDU0LjI3OTQgMjguMDQ2NyA1NC41NjA3IDI4LjMyNzJDNTQuODQyIDI4LjYwNzYgNTUgMjguOTg4IDU1IDI5LjM4NDZWNDEuMzg0OUM1My43MDkzIDQwLjM5NTggNTIuMTI4IDM5Ljg1NzIgNTAuNSAzOS44NTIyQzQ5LjI3MTcgMzkuODUyOCA0OC4wNjI0IDQwLjE1NDEgNDYuOTc4MyA0MC43Mjk3QzQ1Ljg5NDIgNDEuMzA1MyA0NC45Njg1IDQyLjEzNzUgNDQuMjgyNSA0My4xNTMyQzQzLjcyNjEgNDIuNTgyMSA0My4wNjAzIDQyLjEyODEgNDIuMzI0OCA0MS44MThDNDEuNTg5MiA0MS41MDggNDAuNzk4NiA0MS4zNDgzIDQwIDQxLjM0ODNDMzkuMjAxNCA0MS4zNDgzIDM4LjQxMDggNDEuNTA4IDM3LjY3NTIgNDEuODE4QzM2LjkzOTcgNDIuMTI4MSAzNi4yNzM5IDQyLjU4MjEgMzUuNzE3NSA0My4xNTMyQzM1LjAzMTUgNDIuMTM3NSAzNC4xMDU4IDQxLjMwNTMgMzMuMDIxNyA0MC43Mjk3QzMxLjkzNzYgNDAuMTU0MSAzMC43MjgzIDM5Ljg1MjggMjkuNSAzOS44NTIyQzI3Ljg3MiAzOS44NTcyIDI2LjI5MDcgNDAuMzk1OCAyNSA0MS4zODQ5VjI5LjM4NDZDMjUgMjguOTg4IDI1LjE1OCAyOC42MDc2IDI1LjQzOTMgMjguMzI3MkMyNS43MjA2IDI4LjA0NjcgMjYuMTAyMiAyNy44ODkyIDI2LjUgMjcuODg5MkgyOEMyOC4zOTc4IDI3Ljg4OTIgMjguNzc5NCAyNy43MzE2IDI5LjA2MDcgMjcuNDUxMkMyOS4zNDIgMjcuMTcwOCAyOS41IDI2Ljc5MDQgMjkuNSAyNi4zOTM4QzI5LjUgMjUuOTk3MiAyOS4zNDIgMjUuNjE2OSAyOS4wNjA3IDI1LjMzNjRDMjguNzc5NCAyNS4wNTYgMjguMzk3OCAyNC44OTg0IDI4IDI0Ljg5ODRIMjYuNUMyNS4zMDY1IDI0Ljg5ODQgMjQuMTYxOSAyNS4zNzExIDIzLjMxOCAyNi4yMTI0QzIyLjQ3NDEgMjcuMDUzNyAyMiAyOC4xOTQ4IDIyIDI5LjM4NDZWNDcuMzI5MUMyMiA0OS4zMTIxIDIyLjc5MDIgNTEuMjEzOCAyNC4xOTY3IDUyLjYxNkMyNS42MDMyIDU0LjAxODIgMjcuNTEwOSA1NC44MDU5IDI5LjUgNTQuODA1OUMzMS40ODkxIDU0LjgwNTkgMzMuMzk2OCA1NC4wMTgyIDM0LjgwMzMgNTIuNjE2QzM2LjIwOTggNTEuMjEzOCAzNyA0OS4zMTIxIDM3IDQ3LjMyOTFDMzcgNDYuNTM1OSAzNy4zMTYxIDQ1Ljc3NTIgMzcuODc4NyA0NS4yMTQzQzM4LjQ0MTMgNDQuNjUzNCAzOS4yMDQ0IDQ0LjMzODMgNDAgNDQuMzM4M0M0MC43OTU2IDQ0LjMzODMgNDEuNTU4NyA0NC42NTM0IDQyLjEyMTMgNDUuMjE0M0M0Mi42ODM5IDQ1Ljc3NTIgNDMgNDYuNTM1OSA0MyA0Ny4zMjkxQzQzIDQ5LjMxMjEgNDMuNzkwMiA1MS4yMTM4IDQ1LjE5NjcgNTIuNjE2QzQ2LjYwMzIgNTQuMDE4MiA0OC41MTA5IDU0LjgwNTkgNTAuNSA1NC44MDU5QzUyLjQ4OTEgNTQuODA1OSA1NC4zOTY4IDU0LjAxODIgNTUuODAzMyA1Mi42MTZDNTcuMjA5OCA1MS4yMTM4IDU4IDQ5LjMxMjEgNTggNDcuMzI5MVYyOS4zODQ2QzU4IDI4LjE5NDggNTcuNTI1OSAyNy4wNTM3IDU2LjY4MiAyNi4yMTI0QzU1LjgzODEgMjUuMzcxMSA1NC42OTM1IDI0Ljg5ODQgNTMuNSAyNC44OTg0Wk0yOS41IDUxLjgxNTJDMjguNjEgNTEuODE1MiAyNy43NCA1MS41NTIxIDI2Ljk5OTkgNTEuMDU5MUMyNi4yNTk5IDUwLjU2NjIgMjUuNjgzMSA0OS44NjU2IDI1LjM0MjUgNDkuMDQ1OEMyNS4wMDE5IDQ4LjIyNjEgMjQuOTEyOCA0Ny4zMjQxIDI1LjA4NjUgNDYuNDUzOUMyNS4yNjAxIDQ1LjU4MzYgMjUuNjg4NyA0NC43ODQzIDI2LjMxOCA0NC4xNTY5QzI2Ljk0NzQgNDMuNTI5NSAyNy43NDkyIDQzLjEwMjIgMjguNjIyMSA0Mi45MjkxQzI5LjQ5NSA0Mi43NTYgMzAuMzk5OCA0Mi44NDQ5IDMxLjIyMjEgNDMuMTg0NEMzMi4wNDQzIDQzLjUyNCAzMi43NDcxIDQ0LjA5OSAzMy4yNDE2IDQ0LjgzNjdDMzMuNzM2MSA0NS41NzQ0IDM0IDQ2LjQ0MTggMzQgNDcuMzI5MUMzNCA0OC41MTg5IDMzLjUyNTkgNDkuNjU5OSAzMi42ODIgNTAuNTAxMkMzMS44MzgxIDUxLjM0MjUgMzAuNjkzNSA1MS44MTUyIDI5LjUgNTEuODE1MlpNNTAuNSA1MS44MTUyQzQ5LjYxIDUxLjgxNTIgNDguNzQgNTEuNTUyMSA0Ny45OTk5IDUxLjA1OTFDNDcuMjU5OSA1MC41NjYyIDQ2LjY4MzEgNDkuODY1NiA0Ni4zNDI1IDQ5LjA0NThDNDYuMDAxOSA0OC4yMjYxIDQ1LjkxMjggNDcuMzI0MSA0Ni4wODY1IDQ2LjQ1MzlDNDYuMjYwMSA0NS41ODM2IDQ2LjY4ODcgNDQuNzg0MyA0Ny4zMTggNDQuMTU2OUM0Ny45NDc0IDQzLjUyOTUgNDguNzQ5MiA0My4xMDIyIDQ5LjYyMjEgNDIuOTI5MUM1MC40OTUgNDIuNzU2IDUxLjM5OTggNDIuODQ0OSA1Mi4yMjIxIDQzLjE4NDRDNTMuMDQ0MyA0My41MjQgNTMuNzQ3MSA0NC4wOTkgNTQuMjQxNiA0NC44MzY3QzU0LjczNjEgNDUuNTc0NCA1NSA0Ni40NDE4IDU1IDQ3LjMyOTFDNTUgNDguNTE4OSA1NC41MjU5IDQ5LjY1OTkgNTMuNjgyIDUwLjUwMTJDNTIuODM4MSA1MS4zNDI1IDUxLjY5MzUgNTEuODE1MiA1MC41IDUxLjgxNTJaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNTggNTcuOTE0MUwyMiAyMS45MTQxIiBzdHJva2U9IndoaXRlIiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L2c+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZCIgeD0iMCIgeT0iMCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjgwIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIi8+CjxmZU9mZnNldC8+CjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjQiLz4KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvdyIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvdyIgcmVzdWx0PSJzaGFwZSIvPgo8L2ZpbHRlcj4KPGNsaXBQYXRoIGlkPSJjbGlwMCI+CjxyZWN0IHdpZHRoPSI0MCIgaGVpZ2h0PSIzOS44NzY3IiBmaWxsPSJ3aGl0ZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjAgMTkuOTE0MSkiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iNiIgZmlsbD0iYmxhY2siIGZpbGwtb3BhY2l0eT0iMC44Ii8+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiPgo8cGF0aCBkPSJNNDUuNSAxNi44OTg0SDQ0QzQzLjYwMjIgMTYuODk4NCA0My4yMjA2IDE3LjA1NiA0Mi45MzkzIDE3LjMzNjRDNDIuNjU4IDE3LjYxNjkgNDIuNSAxNy45OTcyIDQyLjUgMTguMzkzOEM0Mi41IDE4Ljc5MDQgNDIuNjU4IDE5LjE3MDggNDIuOTM5MyAxOS40NTEyQzQzLjIyMDYgMTkuNzMxNiA0My42MDIyIDE5Ljg4OTIgNDQgMTkuODg5Mkg0NS41QzQ1Ljg5NzggMTkuODg5MiA0Ni4yNzk0IDIwLjA0NjcgNDYuNTYwNyAyMC4zMjcyQzQ2Ljg0MiAyMC42MDc2IDQ3IDIwLjk4OCA0NyAyMS4zODQ2VjMzLjM4NDlDNDUuNzA5MyAzMi4zOTU4IDQ0LjEyOCAzMS44NTcyIDQyLjUgMzEuODUyMkM0MS4yNzE3IDMxLjg1MjggNDAuMDYyNCAzMi4xNTQxIDM4Ljk3ODMgMzIuNzI5N0MzNy44OTQyIDMzLjMwNTMgMzYuOTY4NSAzNC4xMzc1IDM2LjI4MjUgMzUuMTUzMkMzNS43MjYxIDM0LjU4MjEgMzUuMDYwMyAzNC4xMjgxIDM0LjMyNDggMzMuODE4QzMzLjU4OTIgMzMuNTA4IDMyLjc5ODYgMzMuMzQ4MyAzMiAzMy4zNDgzQzMxLjIwMTQgMzMuMzQ4MyAzMC40MTA4IDMzLjUwOCAyOS42NzUyIDMzLjgxOEMyOC45Mzk3IDM0LjEyODEgMjguMjczOSAzNC41ODIxIDI3LjcxNzUgMzUuMTUzMkMyNy4wMzE1IDM0LjEzNzUgMjYuMTA1OCAzMy4zMDUzIDI1LjAyMTcgMzIuNzI5N0MyMy45Mzc2IDMyLjE1NDEgMjIuNzI4MyAzMS44NTI4IDIxLjUgMzEuODUyMkMxOS44NzIgMzEuODU3MiAxOC4yOTA3IDMyLjM5NTggMTcgMzMuMzg0OVYyMS4zODQ2QzE3IDIwLjk4OCAxNy4xNTggMjAuNjA3NiAxNy40MzkzIDIwLjMyNzJDMTcuNzIwNiAyMC4wNDY3IDE4LjEwMjIgMTkuODg5MiAxOC41IDE5Ljg4OTJIMjBDMjAuMzk3OCAxOS44ODkyIDIwLjc3OTQgMTkuNzMxNiAyMS4wNjA3IDE5LjQ1MTJDMjEuMzQyIDE5LjE3MDggMjEuNSAxOC43OTA0IDIxLjUgMTguMzkzOEMyMS41IDE3Ljk5NzIgMjEuMzQyIDE3LjYxNjkgMjEuMDYwNyAxNy4zMzY0QzIwLjc3OTQgMTcuMDU2IDIwLjM5NzggMTYuODk4NCAyMCAxNi44OTg0SDE4LjVDMTcuMzA2NSAxNi44OTg0IDE2LjE2MTkgMTcuMzcxMSAxNS4zMTggMTguMjEyNEMxNC40NzQxIDE5LjA1MzcgMTQgMjAuMTk0OCAxNCAyMS4zODQ2VjM5LjMyOTFDMTQgNDEuMzEyMSAxNC43OTAyIDQzLjIxMzggMTYuMTk2NyA0NC42MTZDMTcuNjAzMiA0Ni4wMTgyIDE5LjUxMDkgNDYuODA1OSAyMS41IDQ2LjgwNTlDMjMuNDg5MSA0Ni44MDU5IDI1LjM5NjggNDYuMDE4MiAyNi44MDMzIDQ0LjYxNkMyOC4yMDk4IDQzLjIxMzggMjkgNDEuMzEyMSAyOSAzOS4zMjkxQzI5IDM4LjUzNTkgMjkuMzE2MSAzNy43NzUyIDI5Ljg3ODcgMzcuMjE0M0MzMC40NDEzIDM2LjY1MzQgMzEuMjA0NCAzNi4zMzgzIDMyIDM2LjMzODNDMzIuNzk1NiAzNi4zMzgzIDMzLjU1ODcgMzYuNjUzNCAzNC4xMjEzIDM3LjIxNDNDMzQuNjgzOSAzNy43NzUyIDM1IDM4LjUzNTkgMzUgMzkuMzI5MUMzNSA0MS4zMTIxIDM1Ljc5MDIgNDMuMjEzOCAzNy4xOTY3IDQ0LjYxNkMzOC42MDMyIDQ2LjAxODIgNDAuNTEwOSA0Ni44MDU5IDQyLjUgNDYuODA1OUM0NC40ODkxIDQ2LjgwNTkgNDYuMzk2OCA0Ni4wMTgyIDQ3LjgwMzMgNDQuNjE2QzQ5LjIwOTggNDMuMjEzOCA1MCA0MS4zMTIxIDUwIDM5LjMyOTFWMjEuMzg0NkM1MCAyMC4xOTQ4IDQ5LjUyNTkgMTkuMDUzNyA0OC42ODIgMTguMjEyNEM0Ny44MzgxIDE3LjM3MTEgNDYuNjkzNSAxNi44OTg0IDQ1LjUgMTYuODk4NFpNMjEuNSA0My44MTUyQzIwLjYxIDQzLjgxNTIgMTkuNzQgNDMuNTUyMSAxOC45OTk5IDQzLjA1OTFDMTguMjU5OSA0Mi41NjYyIDE3LjY4MzEgNDEuODY1NiAxNy4zNDI1IDQxLjA0NThDMTcuMDAxOSA0MC4yMjYxIDE2LjkxMjggMzkuMzI0MSAxNy4wODY1IDM4LjQ1MzlDMTcuMjYwMSAzNy41ODM2IDE3LjY4ODcgMzYuNzg0MyAxOC4zMTggMzYuMTU2OUMxOC45NDc0IDM1LjUyOTUgMTkuNzQ5MiAzNS4xMDIyIDIwLjYyMjEgMzQuOTI5MUMyMS40OTUgMzQuNzU2IDIyLjM5OTggMzQuODQ0OSAyMy4yMjIxIDM1LjE4NDRDMjQuMDQ0MyAzNS41MjQgMjQuNzQ3MSAzNi4wOTkgMjUuMjQxNiAzNi44MzY3QzI1LjczNjEgMzcuNTc0NCAyNiAzOC40NDE4IDI2IDM5LjMyOTFDMjYgNDAuNTE4OSAyNS41MjU5IDQxLjY1OTkgMjQuNjgyIDQyLjUwMTJDMjMuODM4MSA0My4zNDI1IDIyLjY5MzUgNDMuODE1MiAyMS41IDQzLjgxNTJaTTQyLjUgNDMuODE1MkM0MS42MSA0My44MTUyIDQwLjc0IDQzLjU1MjEgMzkuOTk5OSA0My4wNTkxQzM5LjI1OTkgNDIuNTY2MiAzOC42ODMxIDQxLjg2NTYgMzguMzQyNSA0MS4wNDU4QzM4LjAwMTkgNDAuMjI2MSAzNy45MTI4IDM5LjMyNDEgMzguMDg2NSAzOC40NTM5QzM4LjI2MDEgMzcuNTgzNiAzOC42ODg3IDM2Ljc4NDMgMzkuMzE4IDM2LjE1NjlDMzkuOTQ3NCAzNS41Mjk1IDQwLjc0OTIgMzUuMTAyMiA0MS42MjIxIDM0LjkyOTFDNDIuNDk1IDM0Ljc1NiA0My4zOTk4IDM0Ljg0NDkgNDQuMjIyMSAzNS4xODQ0QzQ1LjA0NDMgMzUuNTI0IDQ1Ljc0NzEgMzYuMDk5IDQ2LjI0MTYgMzYuODM2N0M0Ni43MzYxIDM3LjU3NDQgNDcgMzguNDQxOCA0NyAzOS4zMjkxQzQ3IDQwLjUxODkgNDYuNTI1OSA0MS42NTk5IDQ1LjY4MiA0Mi41MDEyQzQ0LjgzODEgNDMuMzQyNSA0My42OTM1IDQzLjgxNTIgNDIuNSA0My44MTUyWiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTUwIDQ5LjkxNDFMMTQgMTMuOTE0MSIgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMCI+CjxyZWN0IHdpZHRoPSI0MCIgaGVpZ2h0PSIzOS44NzY3IiBmaWxsPSJ3aGl0ZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIgMTEuOTE0MSkiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K"]; +c=".trial_banner {position: relative;transform: translateZ(0); } .trial_banner .banner-content, .trial_banner .banner-content_hover {position: absolute;left: 0;right: 0;top: 0;bottom: 0;width: 100%;height: 100%; } .trial_banner .banner-content {visibility: visible;z-index: 1; } .trial_banner .banner-content_hover {visibility: hidden;z-index: 0; } .trial_banner .days_remaining {position: absolute;font-family: 'Open Sans', Arial, sans-serif;font-weight: normal;font-size: 13px;left: 65px;top: 41px;color: #7C1645;z-index: 1; } .trial_banner:hover .banner-content {visibility: hidden;z-index: 0; } .trial_banner:hover .banner-content_hover {visibility: visible;z-index: 1; }body {margin: 0;overflow-y: auto;overflow-x: hidden; } body .password_form, body .info_panel {position: absolute;background: #F7F7F7;border-radius: 4px;width: 513px;height: 210px;font-family: Arial; } body .password_form *, body .info_panel * {box-sizing: border-box; } body .password_form .password_label {position: absolute;color: #3A3A3A;font-size: 15px;top: 63px;left: 55px; } body .password_form .wrong_password_label {position: absolute;color: #DD4A37;font-size: 12px;top: 131px;left: 55px; } body .password_form input {position: absolute;width: 330px;height: 32px;background: #FFFFFF;border: 1px solid #D1D2D4;padding: 1px;border-radius: 2px;font-size: 18px;color: #231F20;left: 54px;top: 94px;padding-left: 8px; } body .password_form button {border: transparent;background: transparent;color: #343434;font-family: Arial;font-size: 15px;text-shadow: 0 1px 0 rgba(255, 255, 255, 0.4); } body .password_form button::before {background: linear-gradient(to bottom, #D3D3D3, #BABABA);position: absolute;content: '';top: 0;right: 0;bottom: 0;left: 0;border-radius: 4px;z-index: -1; } body .password_form button::after {background: linear-gradient(to bottom, #DCDCDC, #D1D1D1);position: absolute;content: '';top: 1px;right: 1px;bottom: 1px;left: 1px;border-radius: 4px;z-index: -1; } body .password_form .btn_ok {position: absolute;top: 94px;right: 55px;width: 60px;height: 32px;opacity: 0.99; } body .info_panel {display: table; } body .info_panel .label {position: static;display: table-cell;vertical-align: middle;width: 100%;padding-left: 120px;padding-right: 40px;color: #3A3A3A;font-size: 15px; } body .info_panel::after {position: absolute;content: '';width: 63px;height: 63px;top: 73px;left: 46px; } body .info_panel.domain::after {background: transparent url("+ +c[0]+"); } body .info_panel.time::after {background: transparent url("+c[1]+"); }#playerView * {position: static; }#playerView {position: static; }#content {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;padding: 0 96px;background: #CED1D3; }.presentation-view-mode-switch-control {width: 64px;height: 64px;position: fixed;left: 16px;top: 16px;cursor: pointer;border: none;background: url("+c[2]+") no-repeat center; } .presentation-view-mode-switch-control:hover {background: url("+ +c[3]+") no-repeat center; } .presentation-view-mode-switch-control:active {background: url("+c[4]+") no-repeat center; } .presentation-view-mode-switch-control:focus {outline: none; }.ppt-accessible-skin {font-family: Segoe UI, sans-serif;font-size: 20px;font-weight: normal;min-width: 0;padding: 20px 64px 20px 64px;box-sizing: border-box;background: #FFFFFF; }.accessible-null-skin {font-family: Segoe UI, sans-serif;font-size: 20px;font-weight: normal;min-width: 0;padding: 20px 64px 20px 64px;box-sizing: border-box;background: #FFFFFF; }.ppt-accessible-slide {margin-bottom: 20px; } .ppt-accessible-slide img, .ppt-accessible-slide video, .ppt-accessible-slide audio {display: block;margin: 32px 0 32px 0; } .ppt-accessible-slide img {max-width: 100%;max-height: 30%; } .ppt-accessible-slide video {max-width: 100%; }.ppt-accessible-top-panel {margin-bottom: 20px; } .ppt-accessible-top-panel__slide-status {font-size: 20px;font-weight: 400; }.ppt-accessible-narration {margin: 16px 0; } .ppt-accessible-narration video {max-width: 100%; }.ppt-accessible-slide-content p {margin: 16px 0; }.ppt-accessible-slide-content h2 {font-size: 30px;margin: 0; }.ppt-accessible-skip-link-container {position: relative;height: 27px; }.ppt-accessible-skip-link {position: absolute !important;display: block;left: -10000px;width: 1px;height: 1px;overflow: hidden; } .ppt-accessible-skip-link:focus {left: auto;width: auto;height: auto; }.simple-navigation-panel {margin-top: 32px;margin-bottom: 32px;float: left;direction: rtl; } .simple-navigation-panel__button {width: 217px;height: 46px;font-family: Segoe UI, sans-serif;font-size: 20px;font-weight: normal; } .simple-navigation-panel__button:nth-child(1) {margin-left: 12px; }.ppt-accessible-slide-list-wrapper {clear: both; }.ppt-accessible-slide-list {clear: both;margin: 16px 0;margin-top: 0; } .ppt-accessible-slide-list summary {font-weight: 600;margin-bottom: 8px; } .ppt-accessible-slide-list ul {padding: 0;margin: 0; } .ppt-accessible-slide-list__item {list-style: none; } .ppt-accessible-slide-list__item {cursor: pointer; } .ppt-accessible-slide-list__item.ppt-accessible-slide-list__item_active {color: #A52A2A; }.ppt-accessible-slide-notes {clear: both;margin: 16px 0; } .ppt-accessible-slide-notes summary {font-weight: 600;margin-bottom: 8px; } .ppt-accessible-slide-notes ul {padding: 0;margin: 0; } .ppt-accessible-slide-notes__item {list-style: none; } .ppt-accessible-slide-notes p {margin: 0; }.ppt-accessible-resources {clear: both;margin: 16px 0; } .ppt-accessible-resources summary {font-weight: 600;margin-bottom: 8px; } .ppt-accessible-resources ul {padding: 0;margin: 0; } .ppt-accessible-resources__item {list-style: none; }.ppt-accessible-presenter {clear: both;margin: 16px 0; } .ppt-accessible-presenter summary {font-weight: 600;margin-bottom: 8px; } .ppt-accessible-presenter ul {padding: 0;margin: 0; } .ppt-accessible-presenter__item {list-style: none; } .ppt-accessible-presenter p {margin: 6px 0;white-space: pre-line; } .ppt-accessible-presenter a, .ppt-accessible-presenter img {display: block;margin: 6px 0; }.quiz-accessible-skin {width: 100%;position: static !important; }.quiz-accessible-top-panel {padding-left: 0 !important;padding-right: 0 !important; }.quiz-accessible-slide {padding-left: 0 !important;padding-right: 0 !important; }.quiz-accessible-hidden-link-container {padding: 0 !important; }.quiz-accessible-control-panel {padding: 0 !important;margin-top: 32px;margin-bottom: 32px; }.quiz-accessible-slide-list {padding: 0 !important;margin: 16px 0 !important; }.accessible-quiz-review {padding: 0 !important;margin-bottom: 20px; }.ppt-accessible-scenario-slide-content {padding-top: 32px; }.scenario-accessible-skin {width: 100%;padding: 0 !important; }.ppt-accessible-footer .page-controls {position: relative;margin-top: 32px;margin-bottom: 32px;left: 0;top: 0;direction: rtl;float: left; } .ppt-accessible-footer .page-controls button {margin: 0;min-width: 217px;min-height: 46px;font-family: 'Segoe UI', sans-serif;font-size: 20px; } .ppt-accessible-footer .page-controls button:first-child {margin-left: 12px; }.ppt-accessible-footer .items-list {clear: both;margin-bottom: 16px;padding: 0;font-size: 20px; } .ppt-accessible-footer .items-list summary {margin-bottom: 8px;font-weight: 600; }.ppt-accessible-footer .scenario-accessible-bottom-panel__button {width: 217px;height: 46px;font-family: Segoe UI, sans-serif;font-size: 20px;font-weight: normal; }"; +let d;for(const [f,g]of Object.entries(null!=(d=a)?d:{}))a=`__${f.replace(RegExp("\\.","g"),"_")}__`,c=c.replace(new RegExp(a,"g"),g);let e;for(const [f,g]of Object.entries(null!=(e=b)?e:{}))c=c.replace(new RegExp(f,"g"),g);c=c.replace(/__verticalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.rn);c=c.replace(/__horizontalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.pn);return gn(c)}rn(a,b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}pn(a, +b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}};class yG{Uq(a,b){const c=g=>{g=sh(g);let h;for(const [l,n]of Object.entries(null!=(h=a)?h:{}))g=g.replace(new RegExp(`{${l}}`,"g"),n);return qh(g)};let d=function(){var g=["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAADcmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmFjOGVjNDFhLTZkYWItODQ0Ni04YzkzLWU1Mjk3N2YwMmE4NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFRThCNzU3NDYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFRThCNzU3MzYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cykiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0OWFlZmI1OC00ZWFmLWQ3NDgtYTI0ZS0zNmNhNGQ2M2QwNTYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6N0MwQkFBM0M2MjAxMTFFNUI4QjBERTk4MjY5MjQwQjUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6MGSVVAAAE3klEQVR42uycW4hWVRiG15Q4eYzGQySSQlriEQ9BF2mE4iSdESRRIb0RD+mNmHgICjqQEGUe6sqgCy1i0iRinAzELrooQhHLGQURUTzMiM7omCLj+/F/czX/t/890z6s9e/3hZcZ1l6z19r7mXXca62arq4uR/mjh/gKCIQiEAKhCIRAKAIhEIpACIQiEIpACIQiEAKhCIRAKAIhEMoX9Yu62NbWxjcUobq6OpaQQpcQz/QwPBOeDU+Fx8Oj4UfhoRrnJnwDvgC3wCfgY/Bf8P0QHrImahmQB1VWLfwGvAieqy+/LxJIR+Dv4QPwf75WWb4CGQavg9fo70mqFd4F79DfCSRCA+HN8Hp4cMppdcBfwB/Bt9mo99Sr8Cl4SwYwnKYhaf2jaXMconoE/hL+CR6TQ/pPato7NS+FbtSfgH+Gp8eMfwv+HT6qpakZvqzVT/d//ePw0/BEeI72ygbFvP/f8MvwpSK2IfLSGuGxFeJ1aby98CG4s5fpDNAqaTlcL89cIf45jddcpDZknI4PKsFo0NKzQLusnX1Iq1P/doHe60CF+GM1b+OK0obIYO5XeGREnLPwfHghfDzBtOVeb+q9z0bEG6njltHVDqQ2RuP9HTwDbkoxH02axv4YjX1tNQP5LKIBl7ZiK/yWToGkLUljsaZpNaTTNc9VCeR1eHUEjHfgD3OoQiXNVRFQVmveqwrIEHh3xPXNOp2Rl77WPFiSvA+tJiCb4FHGNanHP/FggCp52Gdck7y/Wy0Dw2Hatx9s9KZmZNRmxC3JMjh8qsy1Du0St4Y+DomaKFzlEQxRu+apnOQZ1oVeZfWPeMCGlLu2/6dL3BDRwPcPGYiMjocbvaoPnL963+h1DddnChbIMiP8cMIj8KQln34be/lM3gOREW69cW2v81/fGOH1aY7e0wTyrNGYyxT6wQCAHNS8lmvcZ4UIZL4RLt8z7gQA5I7mtZyeCxHIS0b4UReOrLw+EyIQqxScDAiIldcJIQLZYTTmvwUEpMUIHxMikB/gta40PXIF/lwHVrcCAnLVCH8srQR9X7mYt2RUbq1yrOFia390N9SReugaYoR3EEg+GmGEtxNIPhpvhJ8nkHw02Qj/l0Dy0Rwj/DSBZC9ZeD3buPYHgWSv11z5RdrSw/qTQLLX20Z4o0toSxyBxJdsKrVmq79NM2ECKa/3XPltC9fgXwgkW81zpVX35fSVS3HahEB6SqZK9hjXujeJOgLJTrLG19qos1OrLALJSLL+eLFx7SL8cRaZIJCSVrrSfnVL8qHtJoFkoy3ablibQeWz849ZZaZfgUHIfg/Z97EkIs5xLR2OQNLv2u5x0Ttt5UShV1wfj91glRVP01xp8UVTBRiyuOFFheJYQpKVzNrKwQErXPyDA2SF+5k8MhsykCnwPdfzaA3ZYy6nREyCX4Cfd/EPs+nV0RoEUlqWsx1eCie9Bkc2nW5wOa87Dg3Ipy75bWXntSd1yIcHDK1RT3KzTIcOBif6AqOo3d42HX/I0tZW3zIXWgnp68chmfaQjZxyoKac0bXNRxghlpCN2m1dpj/btXEfpD0uqYaua89Luq3dx8TKN3AeE1vt4mLrAohACIQiEAKhCIRAKAIhEIpACq7IqROKJYRA+AoIhCIQAqEIhEAoAiEQikCKrQcCDABHPgH2w7NQdAAAAABJRU5ErkJggg==", +"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICB3aWR0aD0iMjhweCIgaGVpZ2h0PSIzM3B4IiB2aWV3Qm94PSIwIDAgMjguMzAyIDMzLjI0MiI+DQoJPHBhdGggZD0iTTAsMS44VjMxLjQ0MmExLjgsMS44LDAsMCwwLDIuNzI2LDEuNTQzbDI0LjctMTQuODJhMS44LDEuOCwwLDAsMCwwLTMuMDg3TDIuNzI2LjI1N0ExLjgsMS44LDAsMCwwLDAsMS44WiIgc3R5bGU9ImZpbGw6IzMzMyIvPg0KPC9zdmc+","data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyOHB4IiBoZWlnaHQ9IjMzcHgiIHZpZXdCb3g9IjAgMCAyOC4zMDIgMzMuMjQyIj4NCgk8cGF0aCBkPSJNMCwxLjhWMzEuNDQyYTEuOCwxLjgsMCwwLDAsMi43MjYsMS41NDNsMjQuNy0xNC44MmExLjgsMS44LDAsMCwwLDAtMy4wODdMMi43MjYuMjU3QTEuOCwxLjgsMCwwLDAsMCwxLjhaIiBzdHlsZT0iZmlsbDojNTI4YmRmIi8+DQo8L3N2Zz4=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA5LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDksMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbD0iI0RENEIzOCIgZD0iTTIxLjA0MSwyOXY5Ljg0NGMwLDUuNTA4LDQuNjkxLDkuOTczLDEwLjQ3OSw5Ljk3M2M1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTczVjI5SDIxLjA0MXoiLz4NCjxwYXRoIGZpbGw9IiNERDRCMzgiIGQ9Ik0yNi41NTgsMjl2LTcuNjg5YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MlYyOWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNFYyOUgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjEuMDQxLDI4LjIwNnY5Ljg0NWMwLDUuNTA2LDQuNjkxLDkuOTcxLDEwLjQ3OSw5Ljk3MWM1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTcxdi05Ljg0NUgyMS4wNDF6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjYuNTU4LDI4LjA0VjIwLjM1YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MnY3LjY4OWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNHY4LjA1NEgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRjA4RjgyIiBkPSJNMzQsMzYuMzY1YzAtMS4yODctMS4wNDQtMi4zMzEtMi4zMzEtMi4zMzFjLTEuMjg4LDAtMi4zMzIsMS4wNDQtMi4zMzIsMi4zMzENCgljMCwwLjk3MSwwLjU5NCwxLjgwMiwxLjQzOCwyLjE1MnY0LjQ2N2gxLjkxdi00LjUyOUMzMy40NjEsMzguMDc2LDM0LDM3LjI4NywzNCwzNi4zNjV6Ii8+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA4LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDgsMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik01OS42NDYsMzFoLTMuMjkzQzU2LjE1OCwzMSw1NiwzMS40NDgsNTYsMzINCgljMCwwLjU1MywwLjE1OCwxLDAuMzU0LDFoMy4yOTNDNTkuODQyLDMzLDYwLDMyLjU1Myw2MCwzMkM2MCwzMS40NDgsNTkuODQyLDMxLDU5LjY0NiwzMXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjREQ0QjM4IiBkPSJNNi42NDcsMzFIMy4zNTNDMy4xNTgsMzEsMywzMS40NDgsMywzMmMwLDAuNTUzLDAuMTU4LDEsMC4zNTMsMQ0KCWgzLjI5NEM2Ljg0MiwzMyw3LDMyLjU1Myw3LDMyQzcsMzEuNDQ4LDYuODQyLDMxLDYuNjQ3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik0zMSw4YzAuNTUzLDAsMS0wLjE1OCwxLTAuMzUzVjQuMzUzQzMyLDQuMTU4LDMxLjU1Myw0LDMxLDQNCgljLTAuNTUyLDAtMSwwLjE1OC0xLDAuMzUzdjMuMjk0QzMwLDcuODQyLDMwLjQ0OCw4LDMxLDh6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTMxLDU2Yy0wLjU1MiwwLTEsMC4xNTgtMSwwLjM1NHYzLjI5M0MzMCw1OS44NDIsMzAuNDQ4LDYwLDMxLDYwDQoJYzAuNTUzLDAsMS0wLjE1OCwxLTAuMzU0di0zLjI5M0MzMiw1Ni4xNTgsMzEuNTUzLDU2LDMxLDU2eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik00Ny42NjgsMzFoLTEyLjgxQzM0LjQ5NiwyOS42LDMzLjQsMjguNTA1LDMyLDI4LjE0Mg0KCWMwLDAtMC4xNzItMC4xNDItMS0wLjE0MmMtMC44MjksMC0yLDAuNTU1LTIsMC41NTVjLTEuMTksMC42OTMtMiwxLjk2OS0yLDMuNDQ1YzAsMi4yMDksMS43OTEsNCw0LDRjMS40NzcsMCwyLjc1Mi0wLjgwOSwzLjQ0NS0yDQoJaDEzLjIyM0M0OC40MDQsMzQsNDksMzMuMzI4LDQ5LDMyLjVDNDksMzEuNjcyLDQ4LjQwNCwzMSw0Ny42NjgsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTI3LjAxOCwyOS43NDhjMC41OTIsMS4wMjUsMS42NTIsMS41MiwyLjM3LDEuMTA2bDAsMA0KCWMwLjcxNy0wLjQxNSwwLjgxOS0xLjU4MSwwLjIyOC0yLjYwNmwtNy44NTctMTMuNjA5Yy0wLjU5Mi0xLjAyNC0xLjY1My0xLjUyLTIuMzcxLTEuMTA2bDAsMGMtMC43MTcsMC40MTUtMC44MTgsMS41ODEtMC4yMjgsMi42MDUNCglMMjcuMDE4LDI5Ljc0OHoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMjcuMDE4LDI4LjM2MWMwLjU5MiwxLjAyNSwxLjY1MiwxLjUyLDIuMzcsMS4xMDZsMCwwDQoJYzAuNzE3LTAuNDE1LDAuODE5LTEuNTgxLDAuMjI4LTIuNjA2bC03Ljg1Ny0xMy42MDljLTAuNTkyLTEuMDI0LTEuNjUzLTEuNTItMi4zNzEtMS4xMDZsMCwwYy0wLjcxNywwLjQxNS0wLjgxOCwxLjU4MS0wLjIyOCwyLjYwNQ0KCUwyNy4wMTgsMjguMzYxeiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgY3g9IjMxIiBjeT0iMzEiIHI9IjQiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNjAsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzU0LDFoLTMuMjkzQzU2LjE1OCwzMiw1NiwzMS41NTIsNTYsMzENCglsMCwwYzAtMC41NTIsMC4xNTgtMSwwLjM1NC0xaDMuMjkzQzU5Ljg0MiwzMCw2MCwzMC40NDgsNjAsMzFMNjAsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTcsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzUzLDFIMy4zNTNDMy4xNTgsMzIsMywzMS41NTIsMywzMWwwLDANCgljMC0wLjU1MiwwLjE1OC0xLDAuMzUzLTFoMy4yOTRDNi44NDIsMzAsNywzMC40NDgsNywzMUw3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0zMSwzYzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDYuODQyLDMxLjU1Myw3LDMxLDdsMCwwDQoJYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1M1YzLjM1M0MzMCwzLjE1OCwzMC40NDgsMywzMSwzTDMxLDN6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTMxLDU1YzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDU4Ljg0MiwzMS41NTMsNTksMzEsNTkNCglsMCwwYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1NHYtMy4yOTRDMzAsNTUuMTU4LDMwLjQ0OCw1NSwzMSw1NUwzMSw1NXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNDksMzEuNDk5QzQ5LDMwLjY3Miw0OC40MDQsMzAsNDcuNjY4LDMwSDM0LjMzMw0KCUMzMy41OTYsMzAsMzMsMzAuNjcxLDMzLDMxLjVsMCwwYzAsMC44MjgsMC41OTYsMS41LDEuMzMzLDEuNWgxMy4zMzVDNDguNDA0LDMzLDQ5LDMyLjMyOCw0OSwzMS40OTlMNDksMzEuNDk5eiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YxNjE1NSIgY3g9IjMxIiBjeT0iMzEiIHI9IjIiLz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjM2MzgxNDQiPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgzNjAiIGNsYXNzPSJmaWwwIiBkPSJNNi43NzM1IDMuOTc5bDAgLTMuNDQyNDVjMCwtMC4yOTUxMTkgLTAuMjQxNDMzLC0wLjUzNjU1MiAtMC41MzY1NTIsLTAuNTM2NTUybC02LjIzNjk1IDAgMCA0LjUxNTU1IDYuMjM2OTUgMGMwLjI5NTExOSwwIDAuNTM2NTUyLC0wLjI0MTQzMyAwLjUzNjU1MiwtMC41MzY1NTJ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMzYzODEyMCIgY2xhc3M9ImZpbDEiIGQ9Ik0zLjE4NzUgMS4yMzAyMWwtMC4zMzU1NTIgMC4zMzU1MTQgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAtMC4yMjM2NjQgMC4yMjM2NjQgMC40NDczNjUgMC40NDczNjUgLTAuMzM1NTE0IDAuMzM1NTUyIDAuODk0NzMgMCAwIC0wLjg5NDczem0wLjI2NTY0MSAyLjA1NTFsMC4zMzU1MTQgLTAuMzM1NTE0IDAuNDQ3MzY1IDAuNDQ3MzY1IDAuMjIzNzAxIC0wLjIyMzcwMSAtMC40NDczNjUgLTAuNDQ3MzY1IDAuMzM1NTE0IC0wLjMzNTUxNCAtMC44OTQ3MyAwIDAgMC44OTQ3M3oiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDojRkVGRUZFO2ZpbGwtb3BhY2l0eTowLjEwMTk2MX0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIzNjM4MTQ0Ij4NCiAgIDxwYXRoIGlkPSJfMTIzNjM4MzYwIiBjbGFzcz0iZmlsMCIgZD0iTTYuNzczNSAzLjk3OWwwIC0zLjQ0MjQ1YzAsLTAuMjk1MTE5IC0wLjI0MTQzMywtMC41MzY1NTIgLTAuNTM2NTUyLC0wLjUzNjU1MmwtNi4yMzY5NSAwIDAgNC41MTU1NSA2LjIzNjk1IDBjMC4yOTUxMTksMCAwLjUzNjU1MiwtMC4yNDE0MzMgMC41MzY1NTIsLTAuNTM2NTUyeiIvPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgxMjAiIGNsYXNzPSJmaWwxIiBkPSJNMy4xODc1IDEuMjMwMjFsLTAuMzM1NTUyIDAuMzM1NTE0IC0wLjQ0NzM2NSAtMC40NDczNjUgLTAuMjIzNjY0IDAuMjIzNjY0IDAuNDQ3MzY1IDAuNDQ3MzY1IC0wLjMzNTUxNCAwLjMzNTU1MiAwLjg5NDczIDAgMCAtMC44OTQ3M3ptMC4yNjU2NDEgMi4wNTUxbDAuMzM1NTE0IC0wLjMzNTUxNCAwLjQ0NzM2NSAwLjQ0NzM2NSAwLjIyMzcwMSAtMC4yMjM3MDEgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAwLjMzNTUxNCAtMC4zMzU1MTQgLTAuODk0NzMgMCAwIDAuODk0NzN6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDojRkVGRUZFO2ZpbGwtb3BhY2l0eTowLjA1MDk4MH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIzNjM4MTQ0Ij4NCiAgIDxwYXRoIGlkPSJfMTIzNjM4MzYwIiBjbGFzcz0iZmlsMCIgZD0iTTYuNzczNSAzLjk3OWwwIC0zLjQ0MjQ1YzAsLTAuMjk1MTE5IC0wLjI0MTQzMywtMC41MzY1NTIgLTAuNTM2NTUyLC0wLjUzNjU1MmwtNi4yMzY5NSAwIDAgNC41MTU1NSA2LjIzNjk1IDBjMC4yOTUxMTksMCAwLjUzNjU1MiwtMC4yNDE0MzMgMC41MzY1NTIsLTAuNTM2NTUyeiIvPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgxMjAiIGNsYXNzPSJmaWwxIiBkPSJNMy4xODc1IDEuMjMwMjFsLTAuMzM1NTUyIDAuMzM1NTE0IC0wLjQ0NzM2NSAtMC40NDczNjUgLTAuMjIzNjY0IDAuMjIzNjY0IDAuNDQ3MzY1IDAuNDQ3MzY1IC0wLjMzNTUxNCAwLjMzNTU1MiAwLjg5NDczIDAgMCAtMC44OTQ3M3ptMC4yNjU2NDEgMi4wNTUxbDAuMzM1NTE0IC0wLjMzNTUxNCAwLjQ0NzM2NSAwLjQ0NzM2NSAwLjIyMzcwMSAtMC4yMjM3MDEgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAwLjMzNTUxNCAtMC4zMzU1MTQgLTAuODk0NzMgMCAwIDAuODk0NzN6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACHDwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKNWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAASMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEoqGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAGeIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gzSZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25qbc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9CvjcM4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjKuLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqxOPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIWiAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFVSAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAyrA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYghUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7rh2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SEdJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3JaSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQtlHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJy5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hopb2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsyu21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCccNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527PYS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOwEaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6sfaznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy+rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVsS1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9UxlfeqXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/wjowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9Vt1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503rm10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7Pnl/eriQvLDwG/eE8/s6uL5TAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAAGnRFWHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS4xMDD0cqEAAABfSURBVChTY/j//z8DMZgoRSCD4ApLK6rYgLgDiJ9CMYjNBrMNWWHnvAUL/3/4+BGMQWygwk5sCp+CFMDAhw8fQAqfYlcIlCRGYeeceQv+g0wCYRAbl9XEeYZQWBIdjgCVaiC8JN1udgAAAABJRU5ErkJggg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAACuSURBVHicY/n//z8DCLh7+/sAqWIgNmGAgDNA3Ltz68YtIA4LVFELkKpmQAUOIAyUawUqrmEBMnyxKEIG1UA1J0EmFsFELC3MGfJzssDsSVOnMxw7fgImVQRSaAzjgRQJCgqA2XnZmcgKjVnwWIkCWKC+cwRxJk6eypCfm80AYyOBMyCF/TCFx0+eAmMsoJ8F6PXNoCBgwO1zUPBsBrsRFE5AxSCXFzKgBng/LMABrBM9cyiwScIAAAAASUVORK5CYII=", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAZCAYAAABtnU33AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAETSURBVHic7ZgxCsJAFAUXSaeIpScQDyCCguA5rEUQEbWzsvACKhICaquHUQu18hxi6vgebCSgwSb5C2sGhpBkIX+aZIkTBIHS1OAI1mFR2cEDHuEKnnnB0TeGcAlzZuZKjTKswA4cwzWDW8rO2ChsY+OFwVNld2wIG6cMbpqeRJAmg0umpxCk5PxeYxdZsO1kwbaTBdvOXwb7MG96ECF8Bt9gw/QkQlwZ7Kr/CXYZvIdt2DU7S+rs4CF8afXgCU5g1dhI6XCHC7jlSRjM/zwbbUGbJDPY/7HGg/OEn/vUvvn2WfpYlAADfYyL9vSaIOZ+Ykh9hxkSFy0WSyQ3Ht+iRWOJ9E4rGq2UcCwxsbWMRovGkhc6FTEV3QXLmAAAAABJRU5ErkJggg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAElJREFUSEvt0qERAEAIA0H6b5rXL1ecI5qQOcIsanB+3TC5egZOyJm9B2Zgw0EnF+AeekPC+S3tGTjhoJMLcA+9IeG89+6L04QHtFKarLFAHLUAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAFBJREFUSEvtkjEKADAIA/PpQunnWzo63nBbBDdjOGPWPpd0yPCf5YLo5TNgB52Z54AZsKDQygVwDr5A4RxLfQbsUGjlAjgHX6Bw9r394KjDAzeSX574b7LUAAAAAElFTkSuQmCC", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAyMCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik03LjE3MDI1IDMuMDkxODJDOC4wNzEzMiAyLjY5OTkyIDkuMDMyNDkgMi41IDEwIDIuNUMxMC45Njc1IDIuNSAxMS45Mjg3IDIuNjk5OTIgMTIuODI5NyAzLjA5MTgyQzEzLjczMTIgMy40ODM4NyAxNC41NTgzIDQuMDYyMDIgMTUuMjYwNyA0Ljc5OTUyQzE1Ljk2MzQgNS41MzcyOCAxNi41MjY4IDYuNDE5NjcgMTYuOTEzMiA3LjM5OTI0QzE3LjI5OTcgOC4zNzg5NyAxNy41IDkuNDMyOTUgMTcuNSAxMC41SDIwQzIwIDkuMTIxMTIgMTkuNzQxMyA3Ljc1NTc0IDE5LjIzODggNi40ODE4MkMxOC43MzYyIDUuMjA3OSAxNy45OTk2IDQuMDUwMzkgMTcuMDcxMSAzLjA3NTM4QzE2LjE0MjUgMi4xMDAzNiAxNS4wNDAxIDEuMzI2OTQgMTMuODI2OCAwLjc5OTI2NUMxMi42MTM2IDAuMjcxNTg5IDExLjMxMzIgMCAxMCAwQzguNjg2NzggMCA3LjM4NjQyIDAuMjcxNTg5IDYuMTczMTcgMC43OTkyNjVDNC45NTk5MiAxLjMyNjk0IDMuODU3NTIgMi4xMDAzNiAyLjkyODkzIDMuMDc1MzhDMi4wMDAzNSA0LjA1MDM5IDEuMjYzNzUgNS4yMDc5IDAuNzYxMjA0IDYuNDgxODJDMC4yNTg2NTggNy43NTU3NCAwIDkuMTIxMTIgMCAxMC41SDIuNUMyLjUgOS40MzI5NSAyLjcwMDMgOC4zNzg5NyAzLjA4Njc5IDcuMzk5MjRDMy40NzMyMiA2LjQxOTY3IDQuMDM2NjUgNS41MzcyOCA0LjczOTI4IDQuNzk5NTJDNS40NDE2NiA0LjA2MjAyIDYuMjY4ODUgMy40ODM4NyA3LjE3MDI1IDMuMDkxODJaTTEwLjU3MSA3LjU4MzM1QzEwLjY4NDMgNy40OTI4MyAxMC43OTY2IDcuNDA0NSAxMC45MDcxIDcuMzE4ODNDMTEuMzUxNyA2Ljk3NDAzIDExLjc2NTggNi42NzI0MyAxMi4wODY4IDYuNDQ0OTlDMTIuMTcxNyA2LjM4NDgxIDEyLjI1MDEgNi4zMjk4MSAxMi4zMjA5IDYuMjgwNThDMTIuNDkgNi4xNjI5MiAxMi43MTIgNi4yOTExIDEyLjY5NDYgNi40OTYzOEMxMi42ODc0IDYuNTgyMjYgMTIuNjc5IDYuNjc3NjggMTIuNjY5MyA2Ljc4MTM0QzEyLjYzMjkgNy4xNzMwNCAxMi41Nzg3IDcuNjgyNDcgMTIuNTAyNCA4LjIzOTg4QzEyLjQ4MzQgOC4zNzgzNyAxMi40NjMxIDguNTE5ODIgMTIuNDQxMyA4LjY2MzE2QzEyLjI0NjggOS45NDQxNSAxMS45Mzc1IDExLjM3NjIgMTEuNDY0MSAxMi4xOTYyQzExLjA3MzYgMTIuODcyNiAxMC4wMzExIDEzLjY3ODIgOC43MzIwNSAxMi45MjgyQzcuNDMzMDEgMTIuMTc4MiA3LjYwOTQ4IDEwLjg3MjYgOCAxMC4xOTYyQzguNDczMzcgOS4zNzYyNSA5LjU1ODk0IDguMzkyMzEgMTAuNTcxIDcuNTgzMzVaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NzA3MjgiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjMzNjc2NjQiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjkxNDI4IDAuNjkxNDI4LDAuNjkxNDI4IDAuNjkxNDI4LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTcwNzA0IiBjbGFzcz0iZmlsMSIgZD0iTTAuMzQ1NzM2IDAuMTU3MTg4bC0wLjEyNTcyMiAwLjA5NDI2NDkgLTAuMDk0MzAwNiAwIDAgMC4xODg1ODMgMC4wOTQzMDA2IDAgMC4xMjU3MjIgMC4wOTQyNjQ5IDAgLTAuMzc3MTEzem0wLjE1NzExNyAtMi42NzI2N2UtMDA1bDAuMDMxNDMwNiAwIDAgMC4zNzcxNCAtMC4wMzE0MzA2IDAgMCAtMC4zNzcxNHptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjI1MTQwOSAtMC4wMzE0MzA2IDAgMCAtMC4yNTE0MDl6bS0wLjA2Mjg0MzMgMC4wNjI4NjExbDAuMDMxNDMwNiAwIDAgMC4xMjU2ODcgLTAuMDMxNDMwNiAwIDAgLTAuMTI1Njg3eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NjkwMjQiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjE5NjkyNDAiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjQzNjE2IDAuNjQzNjE2LDAuNjQzNjE2IDAuNjQzNjE2LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY5MDAwIiBjbGFzcz0iZmlsMSIgZD0iTTAuMzIxODM3IDAuMTQ2MzAybC0wLjExNzAyOSAwLjA4Nzc0NjYgLTAuMDg3Nzc5NyAwIDAgMC4xNzU1NDMgMC4wODc3Nzk3IDAgMC4xMTcwMjkgMC4wODc3NDY2IDAgLTAuMzUxMDM2em0wLjI3NzkwMSAwLjI1MDcyNmwtMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjA5MzA4NzIgLTAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjAyMDY5MDYgLTAuMDIwNjkwNiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAwLjAyMDY5MDYgLTAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MnoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTggM0MxOS4xMDQ2IDMgMjAgMy44OTU0MyAyMCA1VjE1QzIwIDE2LjEwNDYgMTkuMTA0NiAxNyAxOCAxN0gyQzAuODk1NDMxIDE3IDAgMTYuMTA0NiAwIDE1VjVDMCAzLjg5NTQzIDAuODk1NDMxIDMgMiAzSDE4Wk02LjU4MDA4IDcuMDA0ODhDNS41OTgzIDcuMDA0ODggNC44MjYwMSA3LjMyMDE1IDQuMjYzMTggNy45NTA2OEMzLjcwMDM1IDguNTgxMjIgMy40MTg5NSA5LjQyNTQ1IDMuNDE4OTUgMTAuNDgzNFYxMC42MDRDMy40MTg5NSAxMS43MDQzIDMuNzAyNDcgMTIuNTY2NSA0LjI2OTUzIDEzLjE5MDdDNC44MzY1OSAxMy44MTQ5IDUuNjExIDE0LjEyNyA2LjU5Mjc3IDE0LjEyN0M3LjExNzUyIDE0LjEyNyA3LjU5Njc2IDE0LjAyMDEgOC4wMzA1MiAxMy44MDY0QzguNDY0MjggMTMuNTkyNyA4LjgwNTk5IDEzLjI5MjIgOS4wNTU2NiAxMi45MDVDOS4zMDUzNCAxMi41MTc4IDkuNDMyMjkgMTIuMDkxNSA5LjQzNjUyIDExLjYyNkg3LjcxNjMxQzcuNzA3ODQgMTEuOTM0OSA3LjU5NzgyIDEyLjE4MjUgNy4zODYyMyAxMi4zNjg3QzcuMTc0NjQgMTIuNTU0OSA2Ljg5OTU4IDEyLjY0NzkgNi41NjEwNCAxMi42NDc5QzYuMTIwOTMgMTIuNjQ3OSA1Ljc5Mjk3IDEyLjQ5MzUgNS41NzcxNSAxMi4xODQ2QzUuMzYxMzMgMTEuODc1NiA1LjI1MzQyIDExLjM2NzggNS4yNTM0MiAxMC42NjExVjEwLjQ3MDdDNS4yNTM0MiA5Ljc3MjQ2IDUuMzYyMzkgOS4yNjc4MiA1LjU4MDMyIDguOTU2NzlDNS43OTgyNiA4LjY0NTc1IDYuMTIwOTMgOC40OTAyMyA2LjU0ODM0IDguNDkwMjNDNi44OTUzNSA4LjQ5MDIzIDcuMTc0NjQgOC42MDEzMiA3LjM4NjIzIDguODIzNDlDNy41OTc4MiA5LjA0NTY2IDcuNzA3ODQgOS4zMzQ0NyA3LjcxNjMxIDkuNjg5OTRIOS40MzY1MkM5LjQyODA2IDguODc3NDQgOS4xNjQ2NCA4LjIyNjgxIDguNjQ2MjQgNy43MzgwNEM4LjEyNzg1IDcuMjQ5MjcgNy40MzkxMyA3LjAwNDg4IDYuNTgwMDggNy4wMDQ4OFpNMTMuMzU5NCA3LjAwNDg4QzEyLjM3NzYgNy4wMDQ4OCAxMS42MDUzIDcuMzIwMTUgMTEuMDQyNSA3Ljk1MDY4QzEwLjQ3OTcgOC41ODEyMiAxMC4xOTgyIDkuNDI1NDUgMTAuMTk4MiAxMC40ODM0VjEwLjYwNEMxMC4xOTgyIDExLjcwNDMgMTAuNDgxOCAxMi41NjY1IDExLjA0ODggMTMuMTkwN0MxMS42MTU5IDEzLjgxNDkgMTIuMzkwMyAxNC4xMjcgMTMuMzcyMSAxNC4xMjdDMTMuODk2OCAxNC4xMjcgMTQuMzc2MSAxNC4wMjAxIDE0LjgwOTggMTMuODA2NEMxNS4yNDM2IDEzLjU5MjcgMTUuNTg1MyAxMy4yOTIyIDE1LjgzNSAxMi45MDVDMTYuMDg0NiAxMi41MTc4IDE2LjIxMTYgMTIuMDkxNSAxNi4yMTU4IDExLjYyNkgxNC40OTU2QzE0LjQ4NzEgMTEuOTM0OSAxNC4zNzcxIDEyLjE4MjUgMTQuMTY1NSAxMi4zNjg3QzEzLjk1MzkgMTIuNTU0OSAxMy42Nzg5IDEyLjY0NzkgMTMuMzQwMyAxMi42NDc5QzEyLjkwMDIgMTIuNjQ3OSAxMi41NzIzIDEyLjQ5MzUgMTIuMzU2NCAxMi4xODQ2QzEyLjE0MDYgMTEuODc1NiAxMi4wMzI3IDExLjM2NzggMTIuMDMyNyAxMC42NjExVjEwLjQ3MDdDMTIuMDMyNyA5Ljc3MjQ2IDEyLjE0MTcgOS4yNjc4MiAxMi4zNTk2IDguOTU2NzlDMTIuNTc3NiA4LjY0NTc1IDEyLjkwMDIgOC40OTAyMyAxMy4zMjc2IDguNDkwMjNDMTMuNjc0NiA4LjQ5MDIzIDEzLjk1MzkgOC42MDEzMiAxNC4xNjU1IDguODIzNDlDMTQuMzc3MSA5LjA0NTY2IDE0LjQ4NzEgOS4zMzQ0NyAxNC40OTU2IDkuNjg5OTRIMTYuMjE1OEMxNi4yMDc0IDguODc3NDQgMTUuOTQzOSA4LjIyNjgxIDE1LjQyNTUgNy43MzgwNEMxNC45MDcxIDcuMjQ5MjcgMTQuMjE4NCA3LjAwNDg4IDEzLjM1OTQgNy4wMDQ4OFoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxwYXRoIGNsYXNzPSJmaWwwIiBkPSJNLTAgMC4yNzExMDFsMCAxLjczOTM1YzAsMC4xNDkxMTMgMC4xMjE5ODgsMC4yNzExMDEgMC4yNzExMDEsMC4yNzExMDFsMy4xNTEzMSAwIDAgLTIuMjgxNTUgLTMuMTUxMzEgMGMtMC4xNDkxMTMsMCAtMC4yNzExMDEsMC4xMjE5ODggLTAuMjcxMTAxLDAuMjcxMTAxeiIvPg0KICA8cG9seWdvbiBjbGFzcz0iZmlsMSIgcG9pbnRzPSIxLjQwOTIsMC42NzEwMzggMi4wODAyOCwxLjE0MDc3IDEuNDA5MiwxLjYxMDUxICIvPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIxOTY2NTUyIj4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NzY4IiBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMzIzOTU2bDAgMi4wNzg0NmMwLDAuMTc4MTg1IDAuMTQ1NzcxLDAuMzIzOTU2IDAuMzIzOTU2LDAuMzIzOTU2bDMuNzY1NzEgMCAwIC0yLjcyNjM4IC0zLjc2NTcxIDBjLTAuMTc4MTg1LDAgLTAuMzIzOTU2LDAuMTQ1NzcxIC0wLjMyMzk1NiwwLjMyMzk1NnoiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NTI4IiBjbGFzcz0iZmlsMSIgZD0iTTEuNjAzOCAwLjg4MjAzOGwwLjMyMDc1MSAwIDAgMC45NjIyNTQgLTAuMzIwNzUxIDAgMCAtMC45NjIyNTR6bTAuNTYxMzMyIDBsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAhCAYAAAAYucG/AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAA+SURBVHicY/H09pViYQACFi4uLgYWbm5uOAHncsG4/Pz8xKv79u0bA8vXr1/hBJz7Dcb9+PEjIXVzZs18BgAgpy6CcHz1VgAAAABJRU5ErkJggg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsLW9wYWNpdHk9IjAiIGQ9Ik01MSw0LjA0MXYyNS45MThDNTEsMzIuMTgyLDQ5LjE4MiwzNCw0Ni45NiwzNEgwVjBoNDYuOTZDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDENCgkJCUw1MSw0LjA0MXoiLz4NCgkJPHBhdGggaWQ9Il8xMjMzNzQxNDQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xOCwxNS43MzdsMi41MjYtMi41MjZsMy4zNjksMy4zNjlsMS42ODQtMS42ODVsLTMuMzY4LTMuMzY4TDI0LjczNiw5aC01LjA1M0gxOHYxLjY4NA0KCQkJVjE1LjczN3ogTTM0LDE4LjI2NGwtMi41MjcsMi41MjVsLTMuMzY4LTMuMzY4bC0xLjY4NSwxLjY4NWwzLjM2OSwzLjM2N0wyNy4yNjMsMjVoNS4wNTNIMzR2LTEuNjg1VjE4LjI2NHoiLz4NCgk8L2c+DQo8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMTAyIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjRkVGRUZFIiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMDUxIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjOTY5Njk2IiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTRweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgMTQgMTUiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDU4ICg4NDY2MykgLSBodHRwczovL3NrZXRjaC5jb20gLS0+CiAgICA8dGl0bGU+dGljay1jb21ib2JveDwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJQRC0zNzQ0LeKAlC0yIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNzkwLjAwMDAwMCwgLTQzMS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgaWQ9InRpY2stY29tYm9ib3giIHRyYW5zZm9ybT0idHJhbnNsYXRlKDc4OS4wMDAwMDAsIDQzMC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMy4zNDQ3NjY4LDEuNjU5MzMyNTIgTDUuOCwxMi41ODY3MjE4IEw1LjgsMTIuNTg2NzIxOCBMMi42MDU2MzE3Nyw4LjkzNDE5NjUyIEMyLjM1MzE1MjQxLDguNjQ1NTA0OTMgMS45MTQ0NDY2Nyw4LjYxNjE0OTExIDEuNjI1NzU1MDcsOC44Njg2Mjg0OCBDMS41NzczMDU0Miw4LjkxMTAwMDgyIDEuNTM0OTgxOTMsOC45NTk5MDMyNiAxLjUsOS4wMTM5MzE0OCBDMS4yMDYzNDk0OSw5LjQ2NzQ2MzE2IDEuMjYwMDExMDgsMTAuMDYyODI2MyAxLjYzMDAyNTk4LDEwLjQ1NjU0MDEgTDUuNDc5NzMxMTgsMTQuNTUyODEzNSBDNS42Njg4NDMyLDE0Ljc1NDAzNzkgNS45ODUyNzMzOSwxNC43NjM4NTY5IDYuMTg2NDk3NzcsMTQuNTc0NzQ0OSBDNi4yMTEyMjc0NywxNC41NTE1MDM4IDYuMjMzNTI2NzQsMTQuNTI1ODA1MyA2LjI1MzA1MDY3LDE0LjQ5ODA0NyBMMTQuNTM5MDU1MywyLjcxNzM0NDAzIEMxNC44MDE1Mjc3LDIuMzQ0MTcxNDggMTQuNzQxNjUzNywxLjgzMzM1NzAzIDE0LjQsMS41MzA5OTU4NyBDMTQuMTA2MjM3OCwxLjI3MTAxODMyIDEzLjY1NzM0MywxLjI5ODQwNjIyIDEzLjM5NzM2NTUsMS41OTIxNjg0NCBDMTMuMzc4NTAyNywxLjYxMzQ4MjQgMTMuMzYwOTM4MiwxLjYzNTkxMDg3IDEzLjM0NDc2NjgsMS42NTkzMzI1MiBaIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cG9seWxpbmUgaWQ9IlBhdGgtMiIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjIiIHBvaW50cz0iMiA5LjY1NjUyODE3IDUuODYxNjc5NzcgMTQgMTQgMiI+PC9wb2x5bGluZT4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjIsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9ItCh0LvQvtC5XzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMzVweCIgaGVpZ2h0PSIzNXB4IiB2aWV3Qm94PSIwIDAgMzUgMzUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDM1IDM1IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMTcuNSwzNUMyNy4xMzksMzUsMzUsMjcuMTM4LDM1LDE3LjVDMzUsNy44NjEsMjcuMTM5LDAsMTcuNSwwDQoJQzcuODYxLDAsMCw3Ljg2MSwwLDE3LjVDMCwyNy4xMzgsNy44NjEsMzUsMTcuNSwzNXoiLz4NCjxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTcuNTAwNSIgeTE9IjIuNjQ5OSIgeDI9IjE3LjUwMDUiIHkyPSIzMi4zNDkiPg0KCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiM1Q0IwRkYiLz4NCgk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMTI5MEZGIi8+DQo8L2xpbmVhckdyYWRpZW50Pg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9InVybCgjU1ZHSURfMV8pIiBkPSJNMTcuNSwzMy45OTljOS4wODgsMCwxNi41LTcuNDEyLDE2LjUtMTYuNDk5DQoJUzI2LjU4NywxLDE3LjUsMUM4LjQxMywxLDEuMDAxLDguNDEzLDEuMDAxLDE3LjVTOC40MTMsMzMuOTk5LDE3LjUsMzMuOTk5eiIvPg0KPHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTE4LjM2OCwyMi41aC0zYy0wLjAwOC0wLjQ2MywwLTAuODk3LDAtMWMwLTEuMDM3LDAuMDU1LTEuODgxLDAuMzk2LTIuNTUNCgljMC4zNDQtMC42NzMsMS4wMzMtMS40MjMsMi4wNjMtMi4yNjRjMS4wMjgtMC44MzUsMS42NDYtMS4zODQsMS44NDMtMS42NDZjMC4zMTMtMC40MDcsMC40NjgtMC44NjIsMC40NjgtMS4zNTQNCgljMC0wLjY4Ni0wLjI3NS0xLjI3My0wLjgyNC0xLjc2NmMtMC41NDktMC40ODktMS4yODUtMC43MzMtMi4yMTUtMC43MzNjLTAuODk2LDAtMS42NDYsMC4yNTctMi4yNTEsMC43NjcNCgljLTAuNjAxLDAuNTEtMS4wMTYsMS4yOTEtMS4yNDMsMi4zMzZsLTMuMjM2LTAuNDAzYzAuMDktMS41LDAuNzI5LTIuNzczLDEuOTEyLTMuODE5QzEzLjQ2Nyw5LjAyMiwxNS4wMTgsOC41LDE2Ljk0OCw4LjUNCgljMi4wMjMsMCwzLjYzNSwwLjUzMSw0LjgzNSwxLjU5YzEuMTk2LDEuMDU5LDEuNzk2LDIuMjg5LDEuNzk2LDMuNjk5YzAsMC43NzYtMC4yMjMsMS41MTQtMC42NiwyLjIwOA0KCWMtMC40NDEsMC42OTQtMS40NjEsMS41NS0yLjgyLDIuODM3QzE4Ljg2OCwyMCwxOC4zNjgsMjAuNSwxOC4zNjgsMjIuNUwxOC4zNjgsMjIuNXogTTE1LjM2OCwyNy40OTl2LTNoM3YzSDE1LjM2OHoiLz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjIsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9ItCh0LvQvtC5XzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMzVweCIgaGVpZ2h0PSIzNXB4IiB2aWV3Qm94PSIwIDAgMzUgMzUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDM1IDM1IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMTcuNSwzNUMyNy4xMzgsMzUsMzUsMjcuMTQsMzUsMTcuNUMzNSw3Ljg2MiwyNy4xMzgsMCwxNy41LDANCglDNy44NjEsMCwwLDcuODYyLDAsMTcuNUMwLDI3LjE0LDcuODYxLDM1LDE3LjUsMzV6Ii8+DQo8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE3LjQ5OTUiIHkxPSIyLjY1MDQiIHgyPSIxNy40OTk1IiB5Mj0iMzIuMzUwNCI+DQoJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGODI1QyIvPg0KCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRjREMTIiLz4NCjwvbGluZWFyR3JhZGllbnQ+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0idXJsKCNTVkdJRF8xXykiIGQ9Ik0xNy41LDM0YzkuMDg3LDAsMTYuNS03LjQxMiwxNi41LTE2LjUNCgljMC05LjA4OC03LjQxMi0xNi41LTE2LjUtMTYuNVMxLDguNDEzLDEsMTcuNUMxLDI2LjU4OCw4LjQxMiwzNCwxNy41LDM0eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xNS41LDkuMDAxYzAtMiwzLjk5OS0yLDMuOTk5LDBMMTguOTk5LDIxDQoJYy0wLjA2MSwxLjQ5OC0yLjkzNywxLjUtMywwTDE1LjUsOS4wMDF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTE3LjUsMjhjMS4xMDIsMCwyLTAuODk3LDItMmMwLTEuMTAyLTAuODk3LTItMi0yDQoJYy0xLjEwMiwwLTEuOTk5LDAuODk4LTEuOTk5LDJDMTUuNSwyNy4xMDMsMTYuMzk4LDI4LDE3LjUsMjh6Ii8+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkNPUlJFQ1QtSUNPTiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IgoJIHk9IjBweCIgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNCAyNDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNGRkZGRkY7fQoJLnN0MXtmaWxsOiM3Q0I5MTE7fQo8L3N0eWxlPgo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPgo8cGF0aCBpZD0iU2hhcGVfM19jb3B5IiBjbGFzcz0ic3QxIiBkPSJNMTIsMkM2LjUsMiwyLDYuNSwyLDEyczQuNSwxMCwxMCwxMHMxMC00LjUsMTAtMTBTMTcuNSwyLDEyLDJ6IE0xNy45LDguOWwtNy43LDcuNwoJYy0wLjQsMC40LTAuOSwwLjQtMS4zLDBsLTMuMi0zLjJjLTAuNC0wLjQtMC40LTAuOSwwLTEuM3MwLjktMC40LDEuMywwbDIuNSwyLjVsNy4xLTcuMWMwLjMtMC40LDAuOS0wLjQsMS4zLDAKCUMxOC4yLDcuOSwxOC4yLDguNSwxNy45LDguOUMxNy45LDguOSwxNy45LDguOSwxNy45LDguOXoiLz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIKCSB5PSIwcHgiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjQgMjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGNpcmNsZSBmaWxsPSIjRkZGRkZGIiBjeD0iMTIiIGN5PSIxMiIgcj0iMTIiLz4KPHBhdGggZmlsbD0iI2Y3YjQ0NSIgZD0iTTEyLDJDNi41LDIsMiw2LjUsMiwxMnM0LjUsMTAsMTAsMTBzMTAtNC41LDEwLTEwUzE3LjUsMiwxMiwyeiBNMTcuOSw4LjlsLTcuNyw3LjcKCWMtMC40LDAuNC0wLjksMC40LTEuMywwbC0zLjItMy4yYy0wLjQtMC40LTAuNC0wLjksMC0xLjNzMC45LTAuNCwxLjMsMGwyLjUsMi41bDcuMS03LjFjMC4zLTAuNCwwLjktMC40LDEuMywwCglDMTguMiw3LjksMTguMiw4LjUsMTcuOSw4LjlDMTcuOSw4LjksMTcuOSw4LjksMTcuOSw4Ljl6Ii8+Cjwvc3ZnPgo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IklOQ09SUkVDVC1JQ09OIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiCgkgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDI0IDI0OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6I0ZGRkZGRjt9Cgkuc3Qxe2ZpbGw6I0Y5NjAzRDt9Cjwvc3R5bGU+CjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjEyIiBjeT0iMTIiIHI9IjEyIi8+CjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0xMiwyQzYuNSwyLDIsNi41LDIsMTJzNC41LDEwLDEwLDEwczEwLTQuNSwxMC0xMFMxNy41LDIsMTIsMnogTTE2LjQsOC44TDEzLjIsMTJsMi45LDIuOQoJYzAuMywwLjMsMC4zLDAuOSwwLDEuMmMtMC4zLDAuMy0wLjksMC4zLTEuMiwwbDAsMEwxMiwxMy4ybC0zLjIsMy4yYy0wLjMsMC4zLTAuOSwwLjMtMS4yLDBzLTAuMy0wLjksMC0xLjJsMy4yLTMuMkw3LjksOS4xCgljLTAuMy0wLjMtMC4zLTAuOSwwLTEuMnMwLjktMC4zLDEuMiwwbDIuOSwyLjlsMy4yLTMuMmMwLjMtMC4zLDAuOS0wLjMsMS4yLDBDMTYuNyw3LjksMTYuOCw4LjQsMTYuNCw4LjgKCUMxNi40LDguOCwxNi40LDguOCwxNi40LDguOHoiLz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkFOU1dFUkVELUlDT04iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIKCSB5PSIwcHgiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjQgMjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbDojRkZGRkZGO30KCS5zdDF7ZmlsbDojNTI4QkRGO30KPC9zdHlsZT4KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMTIiIGN5PSIxMiIgcj0iMTIiLz4KPHBhdGggY2xhc3M9InN0MSIgZD0iTTEyLDIyQzYuNSwyMiwyLDE3LjUsMiwxMlM2LjUsMiwxMiwyczEwLDQuNSwxMCwxMFMxNy41LDIyLDEyLDIyeiBNOSwxMUg3djJoMlYxMXogTTEzLDExaC0ydjJoMlYxMXogTTE3LDExCgloLTJ2MmgyVjExeiIvPgo8L3N2Zz4K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkNPUlJFQ1QtSUNPTiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IgoJIHk9IjBweCIgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNCAyNDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNGRkZGRkY7fQoJLnN0MXtmaWxsOiM1MjhCREY7fQo8L3N0eWxlPgo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPgo8cGF0aCBpZD0iU2hhcGVfM19jb3B5IiBjbGFzcz0ic3QxIiBkPSJNMTIsMkM2LjUsMiwyLDYuNSwyLDEyczQuNSwxMCwxMCwxMHMxMC00LjUsMTAtMTBTMTcuNSwyLDEyLDJ6IE0xNy45LDguOWwtNy43LDcuNwoJYy0wLjQsMC40LTAuOSwwLjQtMS4zLDBsLTMuMi0zLjJjLTAuNC0wLjQtMC40LTAuOSwwLTEuM3MwLjktMC40LDEuMywwbDIuNSwyLjVsNy4xLTcuMWMwLjMtMC40LDAuOS0wLjQsMS4zLDAKCUMxOC4yLDcuOSwxOC4yLDguNSwxNy45LDguOUMxNy45LDguOSwxNy45LDguOSwxNy45LDguOXoiLz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,"+c("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMiAxOCIgd2lkdGg9IjEycHgiIGhlaWdodD0iMTZweCI+DQoJPGRlZnM+DQoJCTxzdHlsZT4NCgkJCS5ub3JtYWwgew0KCQkJCWZpbGw6IHt0ZXh0fTsNCgkJCQlvcGFjaXR5OiAwLjc7DQoJCQkJaXNvbGF0aW9uOmlzb2xhdGU7DQoJCQl9DQoJCTwvc3R5bGU+DQoJPC9kZWZzPg0KCTxwYXRoIGNsYXNzPSJub3JtYWwiIGQ9Ik0xMCwwSDJBMiwyLDAsMCwwLDAsMlYxOGwyLS4yMiw0LTMuNjYsNCwzLjY2TDEyLDE4VjJBMiwyLDAsMCwwLDEwLDBaTTIsMmg4VjE0LjQ5bC00LTMtNCwzWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCkiLz4NCjwvc3ZnPg=="), +"data:image/svg+xml;base64,"+c("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMiAxOCIgd2lkdGg9IjEycHgiIGhlaWdodD0iMTZweCI+DQoJPGRlZnM+DQoJCTxzdHlsZT4NCgkJCS5vdmVyIHsNCgkJCQlmaWxsOiB7bGlzdEl0ZW0ubGFiZWwub3Zlcn07DQoJCQkJb3BhY2l0eTogMC43Ow0KCQkJCWlzb2xhdGlvbjppc29sYXRlOw0KCQkJfQ0KCQk8L3N0eWxlPg0KCTwvZGVmcz4NCgk8cGF0aCBjbGFzcz0ib3ZlciIgZD0iTTEwLDBIMkEyLDIsMCwwLDAsMCwyVjE4bDItLjIyLDQtMy42Niw0LDMuNjZMMTIsMThWMkEyLDIsMCwwLDAsMTAsMFpNMiwyaDhWMTQuNDlsLTQtMy00LDNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwKSIvPg0KPC9zdmc+"), +"data:image/svg+xml;base64,"+c("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMiAxOCIgd2lkdGg9IjEycHgiIGhlaWdodD0iMTZweCI+DQoJPGRlZnM+DQoJCTxzdHlsZT4NCgkJCS5zZWxlY3RlZCB7DQoJCQkJZmlsbDoge2xpc3RJdGVtLmxhYmVsLnByZXNzZWR9Ow0KCQkJCW9wYWNpdHk6IDAuNzsNCgkJCQlpc29sYXRpb246aXNvbGF0ZTsNCgkJCX0NCgkJPC9zdHlsZT4NCgk8L2RlZnM+DQoJPHBhdGggY2xhc3M9InNlbGVjdGVkIiBkPSJNMTAsMEgyQTIsMiwwLDAsMCwwLDJWMThsMi0uMjIsNC0zLjY2LDQsMy42NkwxMiwxOFYyQTIsMiwwLDAsMCwxMCwwWk0yLDJoOFYxNC40OWwtNC0zLTQsM1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDApIi8+DQo8L3N2Zz4="), +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPgo8cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHJ4PSI2IiBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIwLjciLz4KPGcgb3BhY2l0eT0iMC44Ij4KPHBhdGggZD0iTTUzLjUgMjVINTJDNTEuNjAyMiAyNSA1MS4yMjA2IDI1LjE1OCA1MC45MzkzIDI1LjQzOTNDNTAuNjU4IDI1LjcyMDYgNTAuNSAyNi4xMDIyIDUwLjUgMjYuNUM1MC41IDI2Ljg5NzggNTAuNjU4IDI3LjI3OTQgNTAuOTM5MyAyNy41NjA3QzUxLjIyMDYgMjcuODQyIDUxLjYwMjIgMjggNTIgMjhINTMuNUM1My44OTc4IDI4IDU0LjI3OTQgMjguMTU4IDU0LjU2MDcgMjguNDM5M0M1NC44NDIgMjguNzIwNiA1NSAyOS4xMDIyIDU1IDI5LjVWNDEuNTM3NUM1My43MDkzIDQwLjU0NTMgNTIuMTI4IDQwLjAwNSA1MC41IDQwQzQ5LjI3MTcgNDAuMDAwNiA0OC4wNjI0IDQwLjMwMjkgNDYuOTc4MyA0MC44ODAzQzQ1Ljg5NDIgNDEuNDU3NiA0NC45Njg1IDQyLjI5MjQgNDQuMjgyNSA0My4zMTEzQzQzLjcyNjEgNDIuNzM4NCA0My4wNjAzIDQyLjI4MjkgNDIuMzI0OCA0MS45NzE5QzQxLjU4OTIgNDEuNjYwOSA0MC43OTg2IDQxLjUwMDcgNDAgNDEuNTAwN0MzOS4yMDE0IDQxLjUwMDcgMzguNDEwOCA0MS42NjA5IDM3LjY3NTIgNDEuOTcxOUMzNi45Mzk3IDQyLjI4MjkgMzYuMjczOSA0Mi43Mzg0IDM1LjcxNzUgNDMuMzExM0MzNS4wMzE1IDQyLjI5MjQgMzQuMTA1OCA0MS40NTc2IDMzLjAyMTcgNDAuODgwM0MzMS45Mzc2IDQwLjMwMjkgMzAuNzI4MyA0MC4wMDA2IDI5LjUgNDBDMjcuODcyIDQwLjAwNSAyNi4yOTA3IDQwLjU0NTMgMjUgNDEuNTM3NVYyOS41QzI1IDI5LjEwMjIgMjUuMTU4IDI4LjcyMDYgMjUuNDM5MyAyOC40MzkzQzI1LjcyMDYgMjguMTU4IDI2LjEwMjIgMjggMjYuNSAyOEgyOEMyOC4zOTc4IDI4IDI4Ljc3OTQgMjcuODQyIDI5LjA2MDcgMjcuNTYwN0MyOS4zNDIgMjcuMjc5NCAyOS41IDI2Ljg5NzggMjkuNSAyNi41QzI5LjUgMjYuMTAyMiAyOS4zNDIgMjUuNzIwNiAyOS4wNjA3IDI1LjQzOTNDMjguNzc5NCAyNS4xNTggMjguMzk3OCAyNSAyOCAyNUgyNi41QzI1LjMwNjUgMjUgMjQuMTYxOSAyNS40NzQxIDIzLjMxOCAyNi4zMThDMjIuNDc0MSAyNy4xNjE5IDIyIDI4LjMwNjUgMjIgMjkuNVY0Ny41QzIyIDQ5LjQ4OTEgMjIuNzkwMiA1MS4zOTY4IDI0LjE5NjcgNTIuODAzM0MyNS42MDMyIDU0LjIwOTggMjcuNTEwOSA1NSAyOS41IDU1QzMxLjQ4OTEgNTUgMzMuMzk2OCA1NC4yMDk4IDM0LjgwMzMgNTIuODAzM0MzNi4yMDk4IDUxLjM5NjggMzcgNDkuNDg5MSAzNyA0Ny41QzM3IDQ2LjcwNDQgMzcuMzE2MSA0NS45NDEzIDM3Ljg3ODcgNDUuMzc4N0MzOC40NDEzIDQ0LjgxNjEgMzkuMjA0NCA0NC41IDQwIDQ0LjVDNDAuNzk1NiA0NC41IDQxLjU1ODcgNDQuODE2MSA0Mi4xMjEzIDQ1LjM3ODdDNDIuNjgzOSA0NS45NDEzIDQzIDQ2LjcwNDQgNDMgNDcuNUM0MyA0OS40ODkxIDQzLjc5MDIgNTEuMzk2OCA0NS4xOTY3IDUyLjgwMzNDNDYuNjAzMiA1NC4yMDk4IDQ4LjUxMDkgNTUgNTAuNSA1NUM1Mi40ODkxIDU1IDU0LjM5NjggNTQuMjA5OCA1NS44MDMzIDUyLjgwMzNDNTcuMjA5OCA1MS4zOTY4IDU4IDQ5LjQ4OTEgNTggNDcuNVYyOS41QzU4IDI4LjMwNjUgNTcuNTI1OSAyNy4xNjE5IDU2LjY4MiAyNi4zMThDNTUuODM4MSAyNS40NzQxIDU0LjY5MzUgMjUgNTMuNSAyNVpNMjkuNSA1MkMyOC42MSA1MiAyNy43NCA1MS43MzYxIDI2Ljk5OTkgNTEuMjQxNkMyNi4yNTk5IDUwLjc0NzEgMjUuNjgzMSA1MC4wNDQzIDI1LjM0MjUgNDkuMjIyMUMyNS4wMDE5IDQ4LjM5OTggMjQuOTEyOCA0Ny40OTUgMjUuMDg2NSA0Ni42MjIxQzI1LjI2MDEgNDUuNzQ5MiAyNS42ODg3IDQ0Ljk0NzQgMjYuMzE4IDQ0LjMxOEMyNi45NDc0IDQzLjY4ODcgMjcuNzQ5MiA0My4yNjAxIDI4LjYyMjEgNDMuMDg2NUMyOS40OTUgNDIuOTEyOCAzMC4zOTk4IDQzLjAwMTkgMzEuMjIyMSA0My4zNDI1QzMyLjA0NDMgNDMuNjgzMSAzMi43NDcxIDQ0LjI1OTkgMzMuMjQxNiA0NC45OTk5QzMzLjczNjEgNDUuNzQgMzQgNDYuNjEgMzQgNDcuNUMzNCA0OC42OTM1IDMzLjUyNTkgNDkuODM4MSAzMi42ODIgNTAuNjgyQzMxLjgzODEgNTEuNTI1OSAzMC42OTM1IDUyIDI5LjUgNTJaTTUwLjUgNTJDNDkuNjEgNTIgNDguNzQgNTEuNzM2MSA0Ny45OTk5IDUxLjI0MTZDNDcuMjU5OSA1MC43NDcxIDQ2LjY4MzEgNTAuMDQ0MyA0Ni4zNDI1IDQ5LjIyMjFDNDYuMDAxOSA0OC4zOTk4IDQ1LjkxMjggNDcuNDk1IDQ2LjA4NjUgNDYuNjIyMUM0Ni4yNjAxIDQ1Ljc0OTIgNDYuNjg4NyA0NC45NDc0IDQ3LjMxOCA0NC4zMThDNDcuOTQ3NCA0My42ODg3IDQ4Ljc0OTIgNDMuMjYwMSA0OS42MjIxIDQzLjA4NjVDNTAuNDk1IDQyLjkxMjggNTEuMzk5OCA0My4wMDE5IDUyLjIyMjEgNDMuMzQyNUM1My4wNDQzIDQzLjY4MzEgNTMuNzQ3MSA0NC4yNTk5IDU0LjI0MTYgNDQuOTk5OUM1NC43MzYxIDQ1Ljc0IDU1IDQ2LjYxIDU1IDQ3LjVDNTUgNDguNjkzNSA1NC41MjU5IDQ5LjgzODEgNTMuNjgyIDUwLjY4MkM1Mi44MzgxIDUxLjUyNTkgNTEuNjkzNSA1MiA1MC41IDUyWiIgZmlsbD0id2hpdGUiLz4KPC9nPgo8L2c+CjxkZWZzPgo8ZmlsdGVyIGlkPSJmaWx0ZXIwX2QiIHg9IjAiIHk9IjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSI4MCIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgo8ZmVDb2xvck1hdHJpeCBpbj0iU291cmNlQWxwaGEiIHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMCIvPgo8ZmVPZmZzZXQvPgo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0Ii8+CjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwLjI1IDAiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3ciLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3ciIHJlc3VsdD0ic2hhcGUiLz4KPC9maWx0ZXI+CjwvZGVmcz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPgo8cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHJ4PSI2IiBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIwLjgiLz4KPHBhdGggZD0iTTUzLjUgMjVINTJDNTEuNjAyMiAyNSA1MS4yMjA2IDI1LjE1OCA1MC45MzkzIDI1LjQzOTNDNTAuNjU4IDI1LjcyMDYgNTAuNSAyNi4xMDIyIDUwLjUgMjYuNUM1MC41IDI2Ljg5NzggNTAuNjU4IDI3LjI3OTQgNTAuOTM5MyAyNy41NjA3QzUxLjIyMDYgMjcuODQyIDUxLjYwMjIgMjggNTIgMjhINTMuNUM1My44OTc4IDI4IDU0LjI3OTQgMjguMTU4IDU0LjU2MDcgMjguNDM5M0M1NC44NDIgMjguNzIwNiA1NSAyOS4xMDIyIDU1IDI5LjVWNDEuNTM3NUM1My43MDkzIDQwLjU0NTMgNTIuMTI4IDQwLjAwNSA1MC41IDQwQzQ5LjI3MTcgNDAuMDAwNiA0OC4wNjI0IDQwLjMwMjkgNDYuOTc4MyA0MC44ODAzQzQ1Ljg5NDIgNDEuNDU3NiA0NC45Njg1IDQyLjI5MjQgNDQuMjgyNSA0My4zMTEzQzQzLjcyNjEgNDIuNzM4NCA0My4wNjAzIDQyLjI4MjkgNDIuMzI0OCA0MS45NzE5QzQxLjU4OTIgNDEuNjYwOSA0MC43OTg2IDQxLjUwMDcgNDAgNDEuNTAwN0MzOS4yMDE0IDQxLjUwMDcgMzguNDEwOCA0MS42NjA5IDM3LjY3NTIgNDEuOTcxOUMzNi45Mzk3IDQyLjI4MjkgMzYuMjczOSA0Mi43Mzg0IDM1LjcxNzUgNDMuMzExM0MzNS4wMzE1IDQyLjI5MjQgMzQuMTA1OCA0MS40NTc2IDMzLjAyMTcgNDAuODgwM0MzMS45Mzc2IDQwLjMwMjkgMzAuNzI4MyA0MC4wMDA2IDI5LjUgNDBDMjcuODcyIDQwLjAwNSAyNi4yOTA3IDQwLjU0NTMgMjUgNDEuNTM3NVYyOS41QzI1IDI5LjEwMjIgMjUuMTU4IDI4LjcyMDYgMjUuNDM5MyAyOC40MzkzQzI1LjcyMDYgMjguMTU4IDI2LjEwMjIgMjggMjYuNSAyOEgyOEMyOC4zOTc4IDI4IDI4Ljc3OTQgMjcuODQyIDI5LjA2MDcgMjcuNTYwN0MyOS4zNDIgMjcuMjc5NCAyOS41IDI2Ljg5NzggMjkuNSAyNi41QzI5LjUgMjYuMTAyMiAyOS4zNDIgMjUuNzIwNiAyOS4wNjA3IDI1LjQzOTNDMjguNzc5NCAyNS4xNTggMjguMzk3OCAyNSAyOCAyNUgyNi41QzI1LjMwNjUgMjUgMjQuMTYxOSAyNS40NzQxIDIzLjMxOCAyNi4zMThDMjIuNDc0MSAyNy4xNjE5IDIyIDI4LjMwNjUgMjIgMjkuNVY0Ny41QzIyIDQ5LjQ4OTEgMjIuNzkwMiA1MS4zOTY4IDI0LjE5NjcgNTIuODAzM0MyNS42MDMyIDU0LjIwOTggMjcuNTEwOSA1NSAyOS41IDU1QzMxLjQ4OTEgNTUgMzMuMzk2OCA1NC4yMDk4IDM0LjgwMzMgNTIuODAzM0MzNi4yMDk4IDUxLjM5NjggMzcgNDkuNDg5MSAzNyA0Ny41QzM3IDQ2LjcwNDQgMzcuMzE2MSA0NS45NDEzIDM3Ljg3ODcgNDUuMzc4N0MzOC40NDEzIDQ0LjgxNjEgMzkuMjA0NCA0NC41IDQwIDQ0LjVDNDAuNzk1NiA0NC41IDQxLjU1ODcgNDQuODE2MSA0Mi4xMjEzIDQ1LjM3ODdDNDIuNjgzOSA0NS45NDEzIDQzIDQ2LjcwNDQgNDMgNDcuNUM0MyA0OS40ODkxIDQzLjc5MDIgNTEuMzk2OCA0NS4xOTY3IDUyLjgwMzNDNDYuNjAzMiA1NC4yMDk4IDQ4LjUxMDkgNTUgNTAuNSA1NUM1Mi40ODkxIDU1IDU0LjM5NjggNTQuMjA5OCA1NS44MDMzIDUyLjgwMzNDNTcuMjA5OCA1MS4zOTY4IDU4IDQ5LjQ4OTEgNTggNDcuNVYyOS41QzU4IDI4LjMwNjUgNTcuNTI1OSAyNy4xNjE5IDU2LjY4MiAyNi4zMThDNTUuODM4MSAyNS40NzQxIDU0LjY5MzUgMjUgNTMuNSAyNVpNMjkuNSA1MkMyOC42MSA1MiAyNy43NCA1MS43MzYxIDI2Ljk5OTkgNTEuMjQxNkMyNi4yNTk5IDUwLjc0NzEgMjUuNjgzMSA1MC4wNDQzIDI1LjM0MjUgNDkuMjIyMUMyNS4wMDE5IDQ4LjM5OTggMjQuOTEyOCA0Ny40OTUgMjUuMDg2NSA0Ni42MjIxQzI1LjI2MDEgNDUuNzQ5MiAyNS42ODg3IDQ0Ljk0NzQgMjYuMzE4IDQ0LjMxOEMyNi45NDc0IDQzLjY4ODcgMjcuNzQ5MiA0My4yNjAxIDI4LjYyMjEgNDMuMDg2NUMyOS40OTUgNDIuOTEyOCAzMC4zOTk4IDQzLjAwMTkgMzEuMjIyMSA0My4zNDI1QzMyLjA0NDMgNDMuNjgzMSAzMi43NDcxIDQ0LjI1OTkgMzMuMjQxNiA0NC45OTk5QzMzLjczNjEgNDUuNzQgMzQgNDYuNjEgMzQgNDcuNUMzNCA0OC42OTM1IDMzLjUyNTkgNDkuODM4MSAzMi42ODIgNTAuNjgyQzMxLjgzODEgNTEuNTI1OSAzMC42OTM1IDUyIDI5LjUgNTJaTTUwLjUgNTJDNDkuNjEgNTIgNDguNzQgNTEuNzM2MSA0Ny45OTk5IDUxLjI0MTZDNDcuMjU5OSA1MC43NDcxIDQ2LjY4MzEgNTAuMDQ0MyA0Ni4zNDI1IDQ5LjIyMjFDNDYuMDAxOSA0OC4zOTk4IDQ1LjkxMjggNDcuNDk1IDQ2LjA4NjUgNDYuNjIyMUM0Ni4yNjAxIDQ1Ljc0OTIgNDYuNjg4NyA0NC45NDc0IDQ3LjMxOCA0NC4zMThDNDcuOTQ3NCA0My42ODg3IDQ4Ljc0OTIgNDMuMjYwMSA0OS42MjIxIDQzLjA4NjVDNTAuNDk1IDQyLjkxMjggNTEuMzk5OCA0My4wMDE5IDUyLjIyMjEgNDMuMzQyNUM1My4wNDQzIDQzLjY4MzEgNTMuNzQ3MSA0NC4yNTk5IDU0LjI0MTYgNDQuOTk5OUM1NC43MzYxIDQ1Ljc0IDU1IDQ2LjYxIDU1IDQ3LjVDNTUgNDguNjkzNSA1NC41MjU5IDQ5LjgzODEgNTMuNjgyIDUwLjY4MkM1Mi44MzgxIDUxLjUyNTkgNTEuNjkzNSA1MiA1MC41IDUyWiIgZmlsbD0id2hpdGUiLz4KPC9nPgo8ZGVmcz4KPGZpbHRlciBpZD0iZmlsdGVyMF9kIiB4PSIwIiB5PSIwIiB3aWR0aD0iODAiIGhlaWdodD0iODAiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLz4KPGZlT2Zmc2V0Lz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIvPgo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4yNSAwIi8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93Ii8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9kcm9wU2hhZG93IiByZXN1bHQ9InNoYXBlIi8+CjwvZmlsdGVyPgo8L2RlZnM+Cjwvc3ZnPgo=", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iNiIgZmlsbD0iYmxhY2siIGZpbGwtb3BhY2l0eT0iMC44Ii8+CjxwYXRoIGQ9Ik00NS41IDE3SDQ0QzQzLjYwMjIgMTcgNDMuMjIwNiAxNy4xNTggNDIuOTM5MyAxNy40MzkzQzQyLjY1OCAxNy43MjA2IDQyLjUgMTguMTAyMiA0Mi41IDE4LjVDNDIuNSAxOC44OTc4IDQyLjY1OCAxOS4yNzk0IDQyLjkzOTMgMTkuNTYwN0M0My4yMjA2IDE5Ljg0MiA0My42MDIyIDIwIDQ0IDIwSDQ1LjVDNDUuODk3OCAyMCA0Ni4yNzk0IDIwLjE1OCA0Ni41NjA3IDIwLjQzOTNDNDYuODQyIDIwLjcyMDYgNDcgMjEuMTAyMiA0NyAyMS41VjMzLjUzNzVDNDUuNzA5MyAzMi41NDUzIDQ0LjEyOCAzMi4wMDUgNDIuNSAzMkM0MS4yNzE3IDMyLjAwMDYgNDAuMDYyNCAzMi4zMDI5IDM4Ljk3ODMgMzIuODgwM0MzNy44OTQyIDMzLjQ1NzYgMzYuOTY4NSAzNC4yOTI0IDM2LjI4MjUgMzUuMzExM0MzNS43MjYxIDM0LjczODQgMzUuMDYwMyAzNC4yODI5IDM0LjMyNDggMzMuOTcxOUMzMy41ODkyIDMzLjY2MDkgMzIuNzk4NiAzMy41MDA3IDMyIDMzLjUwMDdDMzEuMjAxNCAzMy41MDA3IDMwLjQxMDggMzMuNjYwOSAyOS42NzUyIDMzLjk3MTlDMjguOTM5NyAzNC4yODI5IDI4LjI3MzkgMzQuNzM4NCAyNy43MTc1IDM1LjMxMTNDMjcuMDMxNSAzNC4yOTI0IDI2LjEwNTggMzMuNDU3NiAyNS4wMjE3IDMyLjg4MDNDMjMuOTM3NiAzMi4zMDI5IDIyLjcyODMgMzIuMDAwNiAyMS41IDMyQzE5Ljg3MiAzMi4wMDUgMTguMjkwNyAzMi41NDUzIDE3IDMzLjUzNzVWMjEuNUMxNyAyMS4xMDIyIDE3LjE1OCAyMC43MjA2IDE3LjQzOTMgMjAuNDM5M0MxNy43MjA2IDIwLjE1OCAxOC4xMDIyIDIwIDE4LjUgMjBIMjBDMjAuMzk3OCAyMCAyMC43Nzk0IDE5Ljg0MiAyMS4wNjA3IDE5LjU2MDdDMjEuMzQyIDE5LjI3OTQgMjEuNSAxOC44OTc4IDIxLjUgMTguNUMyMS41IDE4LjEwMjIgMjEuMzQyIDE3LjcyMDYgMjEuMDYwNyAxNy40MzkzQzIwLjc3OTQgMTcuMTU4IDIwLjM5NzggMTcgMjAgMTdIMTguNUMxNy4zMDY1IDE3IDE2LjE2MTkgMTcuNDc0MSAxNS4zMTggMTguMzE4QzE0LjQ3NDEgMTkuMTYxOSAxNCAyMC4zMDY1IDE0IDIxLjVWMzkuNUMxNCA0MS40ODkxIDE0Ljc5MDIgNDMuMzk2OCAxNi4xOTY3IDQ0LjgwMzNDMTcuNjAzMiA0Ni4yMDk4IDE5LjUxMDkgNDcgMjEuNSA0N0MyMy40ODkxIDQ3IDI1LjM5NjggNDYuMjA5OCAyNi44MDMzIDQ0LjgwMzNDMjguMjA5OCA0My4zOTY4IDI5IDQxLjQ4OTEgMjkgMzkuNUMyOSAzOC43MDQ0IDI5LjMxNjEgMzcuOTQxMyAyOS44Nzg3IDM3LjM3ODdDMzAuNDQxMyAzNi44MTYxIDMxLjIwNDQgMzYuNSAzMiAzNi41QzMyLjc5NTYgMzYuNSAzMy41NTg3IDM2LjgxNjEgMzQuMTIxMyAzNy4zNzg3QzM0LjY4MzkgMzcuOTQxMyAzNSAzOC43MDQ0IDM1IDM5LjVDMzUgNDEuNDg5MSAzNS43OTAyIDQzLjM5NjggMzcuMTk2NyA0NC44MDMzQzM4LjYwMzIgNDYuMjA5OCA0MC41MTA5IDQ3IDQyLjUgNDdDNDQuNDg5MSA0NyA0Ni4zOTY4IDQ2LjIwOTggNDcuODAzMyA0NC44MDMzQzQ5LjIwOTggNDMuMzk2OCA1MCA0MS40ODkxIDUwIDM5LjVWMjEuNUM1MCAyMC4zMDY1IDQ5LjUyNTkgMTkuMTYxOSA0OC42ODIgMTguMzE4QzQ3LjgzODEgMTcuNDc0MSA0Ni42OTM1IDE3IDQ1LjUgMTdaTTIxLjUgNDRDMjAuNjEgNDQgMTkuNzQgNDMuNzM2MSAxOC45OTk5IDQzLjI0MTZDMTguMjU5OSA0Mi43NDcxIDE3LjY4MzEgNDIuMDQ0MyAxNy4zNDI1IDQxLjIyMjFDMTcuMDAxOSA0MC4zOTk4IDE2LjkxMjggMzkuNDk1IDE3LjA4NjUgMzguNjIyMUMxNy4yNjAxIDM3Ljc0OTIgMTcuNjg4NyAzNi45NDc0IDE4LjMxOCAzNi4zMThDMTguOTQ3NCAzNS42ODg3IDE5Ljc0OTIgMzUuMjYwMSAyMC42MjIxIDM1LjA4NjVDMjEuNDk1IDM0LjkxMjggMjIuMzk5OCAzNS4wMDE5IDIzLjIyMjEgMzUuMzQyNUMyNC4wNDQzIDM1LjY4MzEgMjQuNzQ3MSAzNi4yNTk5IDI1LjI0MTYgMzYuOTk5OUMyNS43MzYxIDM3Ljc0IDI2IDM4LjYxIDI2IDM5LjVDMjYgNDAuNjkzNSAyNS41MjU5IDQxLjgzODEgMjQuNjgyIDQyLjY4MkMyMy44MzgxIDQzLjUyNTkgMjIuNjkzNSA0NCAyMS41IDQ0Wk00Mi41IDQ0QzQxLjYxIDQ0IDQwLjc0IDQzLjczNjEgMzkuOTk5OSA0My4yNDE2QzM5LjI1OTkgNDIuNzQ3MSAzOC42ODMxIDQyLjA0NDMgMzguMzQyNSA0MS4yMjIxQzM4LjAwMTkgNDAuMzk5OCAzNy45MTI4IDM5LjQ5NSAzOC4wODY1IDM4LjYyMjFDMzguMjYwMSAzNy43NDkyIDM4LjY4ODcgMzYuOTQ3NCAzOS4zMTggMzYuMzE4QzM5Ljk0NzQgMzUuNjg4NyA0MC43NDkyIDM1LjI2MDEgNDEuNjIyMSAzNS4wODY1QzQyLjQ5NSAzNC45MTI4IDQzLjM5OTggMzUuMDAxOSA0NC4yMjIxIDM1LjM0MjVDNDUuMDQ0MyAzNS42ODMxIDQ1Ljc0NzEgMzYuMjU5OSA0Ni4yNDE2IDM2Ljk5OTlDNDYuNzM2MSAzNy43NCA0NyAzOC42MSA0NyAzOS41QzQ3IDQwLjY5MzUgNDYuNTI1OSA0MS44MzgxIDQ1LjY4MiA0Mi42ODJDNDQuODM4MSA0My41MjU5IDQzLjY5MzUgNDQgNDIuNSA0NFoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo="]; +return"/* reset styles */* {box-sizing: border-box;-webkit-touch-callout: none;-webkit-user-select: none;-ms-user-select: none;user-select: none; }input,textarea {-webkit-user-select: text;-ms-user-select: text;user-select: text; }html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video {margin: 0;padding: 0;border: 0; }/* HTML5 display-role reset for older browsers */article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section {display: block; }ol,ul {list-style: none; }table {border-collapse: collapse;border-spacing: 0; }div {-webkit-tap-highlight-color: rgba(0, 0, 0, 0);-webkit-user-drag: none; }input {-webkit-appearance: none;-moz-appearance: none; } input::-ms-clear {display: none; }.clear {clear: both; }*::-moz-focus-inner {border: 0; }.popup-layer {top: 0;right: 0;bottom: 0;left: 0;z-index: 1;position: absolute;border-radius: inherit; }.modal-layer {background: #000000;opacity: 0.4;position: absolute;width: 100%;height: 100%;border-radius: inherit; }.slide-transiting .quiz-uikit-primary-button {transition: none; }.slide-transiting .quiz-uikit-secondary-button {transition: none; }.slide-transiting .quiz-uikit-link-button {transition: none; }.slide-transiting .visuals-uikit-primary-button {transition: none; }.slide-transiting .visuals-uikit-secondary-button {transition: none; }.slide-transiting .visuals-uikit-link-button {transition: none; }.uikit-primary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-primary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-primary-button.uikit-primary-button_size_medium {padding: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:first-child {margin-left: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:last-child {margin-right: 10px; } .uikit-primary-button.uikit-primary-button_size_small {padding: 6px 12px; } .uikit-primary-button.uikit-primary-button_size_small .uikit-primary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-primary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__button-text {margin-right: 8px; } .uikit-primary-button__left-icon {margin-right: 8px; } .uikit-primary-button__button-text:first-child {margin-left: 0; } .uikit-primary-button__button-text:last-child {margin-right: 0; } .uikit-primary-button__left-icon:first-child {margin-left: 0; } .uikit-primary-button__left-icon:last-child {margin-right: 0; } .uikit-primary-button__right-icon:first-child {margin-left: 0; } .uikit-primary-button__right-icon:last-child {margin-right: 0; } .uikit-primary-button[disabled] {opacity: 0.4; } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-secondary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-secondary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-secondary-button.uikit-secondary-button_size_medium {padding: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:first-child {margin-left: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:last-child {margin-right: 10px; } .uikit-secondary-button.uikit-secondary-button_size_small {padding: 6px 12px; } .uikit-secondary-button.uikit-secondary-button_size_small .uikit-secondary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-secondary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__button-text {margin-right: 8px; } .uikit-secondary-button__left-icon {margin-right: 8px; } .uikit-secondary-button__button-text:first-child {margin-left: 0; } .uikit-secondary-button__button-text:last-child {margin-right: 0; } .uikit-secondary-button__left-icon:first-child {margin-left: 0; } .uikit-secondary-button__left-icon:last-child {margin-right: 0; } .uikit-secondary-button__right-icon:first-child {margin-left: 0; } .uikit-secondary-button__right-icon:last-child {margin-right: 0; } .uikit-secondary-button[disabled] {opacity: 0.4; } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-link-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-link-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-link-button.uikit-link-button_size_medium {padding: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text {font-size: 17px;line-height: 20px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:first-child {margin-left: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:last-child {margin-right: 10px; } .uikit-link-button.uikit-link-button_size_small {padding: 6px 12px; } .uikit-link-button.uikit-link-button_size_small .uikit-link-button__button-text {font-size: 14px;line-height: 20px; } .uikit-link-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__button-text {margin-right: 8px; } .uikit-link-button__left-icon {margin-right: 8px; } .uikit-link-button__button-text:first-child {margin-left: 0; } .uikit-link-button__button-text:last-child {margin-right: 0; } .uikit-link-button__left-icon:first-child {margin-left: 0; } .uikit-link-button__left-icon:last-child {margin-right: 0; } .uikit-link-button__right-icon:first-child {margin-left: 0; } .uikit-link-button__right-icon:last-child {margin-right: 0; } .uikit-link-button[disabled] {opacity: 0.4; } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-primary-button {background: var(--primary-button-background-color, var(--primary-button-background-color));color: var(--primary-button-text-color, var(--primary-button-text-color)); } .uikit-primary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--primary-button-border-color, var(--primary-button-border-color));background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-primary-button__button-text {font-family: var(--font-family-bold);font-weight: 700; } .uikit-primary-button.uikit-primary-button_active, .uikit-primary-button[aria-pressed='true'], .uikit-primary-button:focus {background: var(--primary-button-background-color-active, var(--primary-button-background-color-active));color: var(--primary-button-text-color-active, var(--primary-button-text-color-active)); } .uikit-primary-button.uikit-primary-button_active::after, .uikit-primary-button[aria-pressed='true']::after, .uikit-primary-button:focus::after {background: var(--primary-button-border-color-active, var(--primary-button-border-color-active));background-origin: border-box; }.uikit-secondary-button {background: var(--secondary-button-background-color, var(--secondary-button-background-color));color: var(--secondary-button-text-color, var(--secondary-button-text-color)); } .uikit-secondary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--secondary-button-border-color, var(--secondary-button-border-color));background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-secondary-button__button-text {font-family: var(--font-family-normal); } .uikit-secondary-button.uikit-secondary-button_active, .uikit-secondary-button[aria-pressed='true'], .uikit-secondary-button:focus {background: var(--secondary-button-background-color-active, var(--secondary-button-background-color-active));color: var(--secondary-button-text-color-active, var(--secondary-button-text-color-active)); } .uikit-secondary-button.uikit-secondary-button_active::after, .uikit-secondary-button[aria-pressed='true']::after, .uikit-secondary-button:focus::after {background: var(--secondary-button-border-color-active, var(--secondary-button-border-color-active));background-origin: border-box; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 15px; }.uikit-link-button {background: var(--link-button-background-color);color: var(--link-button-text-color);border: none; } .uikit-link-button.uikit-link-button_active, .uikit-link-button[aria-pressed='true'] {background: var(--link-button-background-color); }.uikit-collapsed-control {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;position: relative;overflow: hidden;padding: 10px;border: none;border-radius: var(--button-border-radius);background: var(--secondary-button-background-color-active);color: var(--secondary-button-text-color-active);transition-property: background, color;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-collapsed-control::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--secondary-button-border-color-active);background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-collapsed-control__collapsed-component {cursor: pointer;display: -ms-flexbox;display: flex; } .uikit-collapsed-control__expanded-component {margin-left: 8px;opacity: 1;transition-property: width, opacity;transition-duration: 300ms;transition-timing-function: ease; } .uikit-collapsed-control.uikit-collapsed-control_collapsed {background: var(--secondary-button-background-color);color: var(--secondary-button-text-color);padding-right: 2px; } .uikit-collapsed-control.uikit-collapsed-control_collapsed::after {background: var(--secondary-button-border-color);background-origin: border-box; } .uikit-collapsed-control.uikit-collapsed-control_collapsed .uikit-collapsed-control__expanded-component {width: 0;opacity: 0; } .uikit-collapsed-control[data-tooltip]::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 0; } .uikit-collapsed-control[data-tooltip]:hover::before {opacity: 1;visibility: visible; }.menu-base {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: start;align-items: start;font-family: var(--font-family-normal); }.menu-base-item {width: 100%;box-sizing: border-box;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;height: 44px;padding: 0 20px;color: var(--popup-text-color); } .menu-base-item__label {-ms-flex-positive: 1;flex-grow: 1;font-size: 15px;line-height: 20px;margin-left: 12px; } .menu-base-item__icon {width: 20px;height: 20px;-ms-flex-negative: 0;flex-shrink: 0;color: var(--popup-text-color); } .menu-base-item__value {-ms-flex-negative: 0;flex-shrink: 0;margin-left: 16px; } .menu-base-item.menu-base-item_clickable:hover {cursor: pointer;background: var(--popup-background-hover-color);color: var(--popup-text-hover-color); } .menu-base-item.menu-base-item_clickable:hover .menu-base-item__icon {color: var(--popup-text-hover-color); }.rate-menu {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;width: 100%;padding: 12px 0; } .rate-menu__caption {padding: 8px 20px;color: var(--popup-text-color);font-size: 16px;line-height: 22px;font-family: var(--font-family-bold);font-weight: 700; } .rate-menu__delimiter {width: 100%;height: 1px;background: var(--popup-text-color);opacity: 0.08;margin: 8px 0; }.presenter-info {font-family: var(--font-family-normal);box-sizing: border-box;position: relative;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;color: var(--panel-text-color); } .presenter-info__main {display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: start; } .presenter-info__info {display: inline-block;-ms-flex-positive: 1;flex-grow: 1; } .presenter-info__photo {width: 64px;height: 64px;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;overflow: hidden;border-radius: 50%;-ms-flex-negative: 0;flex-shrink: 0;background-repeat: no-repeat;background-position: center;margin-right: 20px; } .presenter-info__photo img {width: auto;height: auto; } .presenter-info__name {font-family: var(--font-family-bold);font-weight: 700;word-wrap: break-word;overflow: hidden;font-size: 16px;line-height: 22px;margin-bottom: 8px;max-height: 53px; } .presenter-info__job {word-wrap: break-word;overflow: hidden;font-size: 14px;line-height: 18px;margin-bottom: 8px; } .presenter-info__phone {word-wrap: break-word;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;font-size: 15px;line-height: 20px; } .presenter-info__links {display: -ms-flexbox;display: flex;margin-top: 8px; } .presenter-info__link {border: 1px solid var(--presenter-info-link-border-color);border-radius: 10px;width: 36px;height: 28px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;position: relative;color: var(--panel-text-color); } .presenter-info__link:not(:last-child) {margin-right: 8px; } .presenter-info__link::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 6px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .presenter-info__link:hover::before {opacity: 1;visibility: visible; } .presenter-info__link-icon {width: 20px;height: 20px; } .presenter-info .bio-container {position: relative;display: -webkit-box;white-space: normal;text-overflow: ellipsis;margin-right: -20px;margin-top: 20px;padding-right: 10px;font-size: 14px;line-height: 20px;-ms-flex-positive: 1;flex-grow: 1;height: 100%;max-height: 120px;overflow: hidden; } .presenter-info .bio-container.bio-container_collapsed {max-height: 60px; } .presenter-info .bio-container.bio-container_collapsed .scroll-area__bio {display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .presenter-info .bio-container .scroll-area {word-break: break-word;overflow: hidden; } .presenter-info .bio-container .container-top-shadow {background: __verticalGradient(var(--panel-color), transparent);background: linear-gradient(to bottom, var(--panel-color), transparent);position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; } .presenter-info .bio-container .container-bottom-shadow {background: __verticalGradient(transparent, var(--panel-color));background: linear-gradient(to bottom, transparent, var(--panel-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; } .presenter-info__show-more {font-size: 14px;line-height: 20px;height: 20px;opacity: 0.6;text-decoration: underline; } .presenter-info__show-more:hover {cursor: pointer;opacity: 0.8; } .presenter-info.presenter-info_popup {margin-bottom: 0; } .presenter-info.presenter-info_no-photo .presenter-info__info {width: 100%; }.attachments-info {font-family: var(--font-family-normal);position: relative;width: 100%;overflow: hidden;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column; } .attachments-info__scroll-area {height: 100%;overflow: hidden; } .attachments-info__delimiter {height: 1px;margin: 8px 20px 8px 62px;background: var(--popup-text-color);opacity: 0.08; } .attachments-info .container-top-shadow {background: __verticalGradient(var(--panel-color), transparent);background: linear-gradient(to bottom, var(--panel-color), transparent);position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; } .attachments-info .container-bottom-shadow {background: __verticalGradient(transparent, var(--panel-color));background: linear-gradient(to bottom, transparent, var(--panel-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; }.attach-item {padding: 8px 20px;box-sizing: border-box;display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: start;cursor: pointer; } .attach-item__icon-container {width: 36px;height: 36px;border-radius: 50%;background: var(--top-panel-icon-container-color);display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;-ms-flex-negative: 0;flex-shrink: 0;margin-right: 6px; } .attach-item__icon {width: 20px;height: 20px;color: var(--popup-text-color);opacity: 0.72; } .attach-item__info-container {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-positive: 1;flex-grow: 1;padding-left: 6px; } .attach-item__title {font-size: 15px;line-height: 20px;margin-bottom: 4px;color: var(--popup-text-color);word-break: break-word;max-height: 60px;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .attach-item__subtitle {font-size: 14px;line-height: 18px;color: var(--popup-text-color);opacity: 0.6; } .attach-item:hover {background: var(--list-item-background-hover-color); } .attach-item:hover .attach-item__title {color: var(--popup-text-hover-color); } .attach-item:hover .attach-item__subtitle {color: var(--popup-text-hover-color); } .attach-item:hover .attach-item__icon {color: var(--popup-text-hover-color); }:root {--page-background-color: __pageBackground__;--button-background-color: __primaryButtonBackground__;--button-hover-background-color: __primaryButtonBackgroundHover__;--button-hover-text-color: __primaryButtonTextHover__;--button-text-color: __primaryButtonText__;--company-logo-background-color: __asideLogoBackground__;--hyperlink-text-color: __hyperlink__;--list-item-background-hover-color: __asideElementBackgroundHover__;--list-item-border-color: __outlineItemBorder__;--list-item-background-pressed-color: __asideElementBackgroundActive__;--list-item-text-hover-color: __asideElementTextHover__;--list-item-text-pressed-color: __asideElementTextActive__;--list-item-text-visited-color: __asideElementTextVisited__;--list-item-icon-fill-color: __itemsListIconFill__;--list-item-order-color: __itemsListOrder__;--list-item-icon-stroke-color: __itemsListIconStroke__;--list-item-icon-color: __itemsListIcon__;--panel-color: __asideBackground__;--panel-text-color: __asideElementText__;--panel-video-stub-background-color: __panelVideoStubBackgroundColor__;--panel-video-stub-color: __panelVideoStubColor__;--player-background-color: __playerBackground__;--progressbar-background-color: __progressBackground__;--progressbar-playback-color: __progressPlayback__;--slide-border-color: __slideBorder__;--text-color: __playerText__;--topbar-hover-background-color: __secondaryButtonBackgroundHover__;--topbar-text-color: __secondaryButtonText__;--primary-button-text-color: __primaryButtonText__;--primary-button-text-color-active: __primaryButtonTextHover__;--primary-button-background-color-active: __primaryButtonBackgroundHover__;--primary-button-background-color: __primaryButtonBackground__;--primary-button-border-color: __primaryButtonBorder__;--primary-button-border-color-active: __primaryButtonBorderHover__;--secondary-button-background-color: __secondaryButtonBackground__;--secondary-button-background-color-active: __secondaryButtonBackgroundHover__;--secondary-button-text-color: __secondaryButtonText__;--secondary-button-text-color-active: __secondaryButtonTextHover__;--secondary-button-border-color: __secondaryButtonBorder__;--secondary-button-border-color-active: __secondaryButtonBorderHover__;--volume-control-background-color: __volumeControlBackgroundColor__;--volume-control-playback-color: __volumeControlPlaybackColor__;--volume-control-thumb-color: __volumeControlThumbColor__;--more-menu-volume-control-background-color: __moreMenuVolumeControlBackgroundColor__;--more-menu-volume-control-playbackColor: __moreMenuVolumeControlPlaybackColor__;--more-menu-volume-control-thumb-color: __moreMenuVolumeControlThumbColor__;--popup-background-color: __popupBackground__;--popup-transparent-background-color: __transparentPopupBackground__;--popup-border: __popupBorder__;--popup-background-hover-color: __popupBackgroundHover__;--popup-text-color: __popupText__;--popup-text-hover-color: __popupTextHover__;--link-button-background-color: transparent;--link-button-text-color: __linkButtonTextColor__;--player-text: __playerText__;--button-border-radius: __borderRadius__;--presenter-info-link-border-color: __presenterInfoLinkBorderColor__;--search-field-background-color: __searchFieldBackgroundColor__;--hovered-tab-background-color: __hoveredTabBackgroundColor__;--selected-tab-background-color: __selectedTabBackgroundColor__;--top-panel-icon-container-color: __topPanelIconContainerColor__;--top-panel-icon-color: __topPanelIconColor__;--mini-skin-menu-button-text: __miniSkinMenuButtonText__;--mini-skin-menu-button-background-active: __miniSkinMenuButtonBackgroundActive__;--mini-skin-top-bottom-panel-border: __miniSkinTopBottomPanelBorder__;--mini-skin-presenter-delimiter-color: __miniSkinPresenterDelimiterColor__;--top-bottom-panel-border-color: __topBottomPanelBorderColor__; }.logo-container {display: -ms-flexbox;display: flex; } .logo-container > a {display: -ms-flexbox;display: flex; }.top-panel {display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;-ms-flex-pack: justify;justify-content: space-between;height: 52px;padding: 0 16px;border-bottom: 1px solid var(--top-bottom-panel-border-color);box-sizing: border-box;will-change: transform; } .top-panel.top-panel_reversed {-ms-flex-direction: row-reverse;flex-direction: row-reverse; } .top-panel__container {display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;-ms-flex-align: center;align-items: center; } .top-panel__presenter-info {max-width: 400px;padding: 32px 28px; }.top-main-container {display: -ms-flexbox;display: flex;-ms-flex-positive: 1;flex-grow: 1;-ms-flex-pack: justify;justify-content: space-between;max-height: 100%; } .top-main-container .info-container {margin-left: auto; } .top-main-container .info-container__item:first-child {margin-right: 20px; } .top-main-container .info-container__item:last-child {margin-right: 0; } .top-main-container.top-main-container_reversed {-ms-flex-direction: row-reverse;flex-direction: row-reverse; } .top-main-container.top-main-container_reversed .info-container {margin-right: auto;margin-left: 0;-ms-flex-direction: row-reverse;flex-direction: row-reverse; } .top-main-container.top-main-container_reversed .info-container__item:first-child {margin-right: 0; } .top-main-container.top-main-container_reversed .info-container__item:last-child {margin-right: 20px; }.buttons-container {-ms-flex-negative: 0;flex-shrink: 0; } .buttons-container__button {margin-right: 8px; }.info-container {overflow: hidden; } .info-container__title {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;overflow: hidden;color: var(--text-color);max-width: 480px; } .info-container__title > div {font-family: var(--font-family-normal);font-size: 14px;line-height: 20px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; }.popups-layer {position: absolute;margin-left: 0 !important;left: 0;top: 0;width: 100%; } .popups-layer .popup {background: var(--popup-background-color);border: 1px solid var(--popup-border);box-shadow: 0 20px 32px rgba(0, 0, 0, 0.16);-webkit-backdrop-filter: blur(8px);backdrop-filter: blur(8px);border-radius: 10px;position: absolute;top: 0;left: 0; } .popups-layer .popup.popup_outline-popup {width: 280px; } .popups-layer .popup.popup_presenter .mask {width: calc(100% - 2px);left: 1px;bottom: 12px; } .popups-layer .popup.popup_attachments {width: 368px;box-sizing: border-box; }.notes-popup {position: relative;font-size: 15px;line-height: 20px;word-wrap: break-word;width: 372px;padding: 16px;border-radius: inherit; } .notes-popup__scroll-area {overflow: hidden;height: 100%; } .notes-popup .notes-text {word-wrap: break-word; } .notes-popup .notes-text p {margin-top: 0;margin-bottom: 0;white-space: pre-wrap; } .notes-popup .notes-text p, .notes-popup .notes-text span {color: var(--panel-text-color) !important; } .notes-popup .notes-text p:first-child {margin-top: 0; } .notes-popup .notes-text p:last-child {margin-bottom: 0; } .notes-popup .notes-text p, .notes-popup .notes-text p.bold span.nobold, .notes-popup .notes-text p.italic span.noitalic, .notes-popup .notes-text p.bold.italic span.nobold.noitalic {font-family: var(--font-family-normal); } .notes-popup .notes-text p span.bold, .notes-popup .notes-text p.bold, .notes-popup .notes-text p.italic span.bold.noitalic, .notes-popup .notes-text p.bold.italic span.noitalic {font-family: var(--font-family-bold); } .notes-popup .notes-text p span.italic, .notes-popup .notes-text p.bold span.nobold.italic, .notes-popup .notes-text p.italic, .notes-popup .notes-text p.bold.italic span.nobold {font-family: var(--font-family-italic); } .notes-popup .notes-text p span.bold.italic, .notes-popup .notes-text p.bold span.italic, .notes-popup .notes-text p.italic span.bold, .notes-popup .notes-text p.bold.italic {font-family: var(--font-family-bold-italic); }.attachments-popup {padding: 12px 0;border-radius: inherit; }.progress-tooltip {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;z-index: 1; } .progress-tooltip__thumbnail-tooltip {border: 2px var(--top-bottom-bar-background-color) solid;border-radius: 3px;width: 140px;height: 80px;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out; } .progress-tooltip__timing-tooltip {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: 4px; }.universal-skin-separator {position: relative;width: 100%;padding-top: 1px; } .universal-skin-separator::after {content: '';display: block;height: 1px;background: var(--top-bottom-panel-border-color); }.progressbar {position: relative;height: 2px;width: 100%; } .progressbar__progress {position: absolute;top: 0;left: 0;width: 100%;height: 100%;background-color: var(--progressbar-background-color);transition: transform 0.3s ease-in-out; } .progressbar__progress-background {position: absolute;background: var(--progressbar-playback-color);top: 0;left: 0;height: 100%;transition: transform 0.3s ease-in-out; } .progressbar__thumb {width: 12px;height: 12px;border-radius: 50%;background: var(--progressbar-playback-color);bottom: -5px;position: absolute;left: -6px;cursor: pointer; } .progressbar__progress-tooltip {position: absolute;top: -14px;-ms-transform: translateY(-100%);transform: translateY(-100%); }:root {--page-background-color: __pageBackground__;--button-background-color: __primaryButtonBackground__;--button-hover-background-color: __primaryButtonBackgroundHover__;--button-hover-text-color: __primaryButtonTextHover__;--button-text-color: __primaryButtonText__;--company-logo-background-color: __asideLogoBackground__;--hyperlink-text-color: __hyperlink__;--list-item-background-hover-color: __asideElementBackgroundHover__;--list-item-border-color: __outlineItemBorder__;--list-item-background-pressed-color: __asideElementBackgroundActive__;--list-item-text-hover-color: __asideElementTextHover__;--list-item-text-pressed-color: __asideElementTextActive__;--list-item-text-visited-color: __asideElementTextVisited__;--list-item-icon-fill-color: __itemsListIconFill__;--list-item-order-color: __itemsListOrder__;--list-item-icon-stroke-color: __itemsListIconStroke__;--list-item-icon-color: __itemsListIcon__;--panel-color: __asideBackground__;--panel-text-color: __asideElementText__;--panel-video-stub-background-color: __panelVideoStubBackgroundColor__;--panel-video-stub-color: __panelVideoStubColor__;--player-background-color: __playerBackground__;--progressbar-background-color: __progressBackground__;--progressbar-playback-color: __progressPlayback__;--slide-border-color: __slideBorder__;--text-color: __playerText__;--topbar-hover-background-color: __secondaryButtonBackgroundHover__;--topbar-text-color: __secondaryButtonText__;--primary-button-text-color: __primaryButtonText__;--primary-button-text-color-active: __primaryButtonTextHover__;--primary-button-background-color-active: __primaryButtonBackgroundHover__;--primary-button-background-color: __primaryButtonBackground__;--primary-button-border-color: __primaryButtonBorder__;--primary-button-border-color-active: __primaryButtonBorderHover__;--secondary-button-background-color: __secondaryButtonBackground__;--secondary-button-background-color-active: __secondaryButtonBackgroundHover__;--secondary-button-text-color: __secondaryButtonText__;--secondary-button-text-color-active: __secondaryButtonTextHover__;--secondary-button-border-color: __secondaryButtonBorder__;--secondary-button-border-color-active: __secondaryButtonBorderHover__;--volume-control-background-color: __volumeControlBackgroundColor__;--volume-control-playback-color: __volumeControlPlaybackColor__;--volume-control-thumb-color: __volumeControlThumbColor__;--more-menu-volume-control-background-color: __moreMenuVolumeControlBackgroundColor__;--more-menu-volume-control-playbackColor: __moreMenuVolumeControlPlaybackColor__;--more-menu-volume-control-thumb-color: __moreMenuVolumeControlThumbColor__;--popup-background-color: __popupBackground__;--popup-transparent-background-color: __transparentPopupBackground__;--popup-border: __popupBorder__;--popup-background-hover-color: __popupBackgroundHover__;--popup-text-color: __popupText__;--popup-text-hover-color: __popupTextHover__;--link-button-background-color: transparent;--link-button-text-color: __linkButtonTextColor__;--player-text: __playerText__;--button-border-radius: __borderRadius__;--presenter-info-link-border-color: __presenterInfoLinkBorderColor__;--search-field-background-color: __searchFieldBackgroundColor__;--hovered-tab-background-color: __hoveredTabBackgroundColor__;--selected-tab-background-color: __selectedTabBackgroundColor__;--top-panel-icon-container-color: __topPanelIconContainerColor__;--top-panel-icon-color: __topPanelIconColor__;--mini-skin-menu-button-text: __miniSkinMenuButtonText__;--mini-skin-menu-button-background-active: __miniSkinMenuButtonBackgroundActive__;--mini-skin-top-bottom-panel-border: __miniSkinTopBottomPanelBorder__;--mini-skin-presenter-delimiter-color: __miniSkinPresenterDelimiterColor__;--top-bottom-panel-border-color: __topBottomPanelBorderColor__; }.more-menu-popup {padding: 12px 0; } .more-menu-popup .volume-slider-wrapper {width: 86px; } .more-menu-popup .volume-slider {position: relative;width: 80px;height: 3px; } .more-menu-popup .volume-slider__enlarged-click-area {position: absolute;cursor: pointer;width: 100%;height: 40px;top: 50%;-ms-transform: translateY(-50%);transform: translateY(-50%); } .more-menu-popup .volume-slider__background {position: absolute;width: 100%;height: 100%;background: var(--more-menu-volume-control-background-color); } .more-menu-popup .volume-slider__volume {position: absolute;background: var(--more-menu-volume-control-playbackColor);bottom: 0;left: 0;height: 100%;border-radius: 4px; } .more-menu-popup .volume-slider__track {position: relative;height: 100%; } .more-menu-popup .volume-slider__thumb {position: absolute;width: 12px;height: 12px;border-radius: 50%;background: var(--more-menu-volume-control-thumb-color);bottom: -4.5px;margin-left: -6px; }.collapsable-buttons-group {vertical-align: middle;display: -ms-inline-flexbox;display: inline-flex;-ms-flex-align: center;align-items: center;overflow: hidden;-ms-flex-positive: 1;flex-grow: 1;-ms-flex-negative: 1;flex-shrink: 1; } .collapsable-buttons-group__collapsable-button {margin-right: 8px; }.navigation-controls {display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;-ms-flex-align: center;align-items: center;position: relative; } .navigation-controls__button.navigation-controls__button_next {margin-left: 8px; } .navigation-controls__button.navigation-controls__button_prev {margin-left: 20px; } .navigation-controls__button.navigation-controls__button_locked {pointer-events: auto;cursor: url(data/lock.cur), no-drop; } .navigation-controls__label {font-size: 14px;color: var(--text-color);opacity: 0.72; }.play-controls-container {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative;-ms-flex-positive: 1;flex-grow: 1;-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;margin: 14px 16px; } .play-controls-container::before {content: '';display: inline-block;height: 100%;vertical-align: middle; } .play-controls-container__play-pause-button {margin-right: 8px; } .play-controls-container__outline-button {margin-right: 8px; }.universal-control-panel {font-family: var(--font-family-normal);display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;width: 100%;position: relative;-ms-transform-origin: 0 0;transform-origin: 0 0;min-height: 66px;will-change: transform; } .universal-control-panel .volume-slider-wrapper {width: 86px; } .universal-control-panel .volume-slider {position: relative;width: 80px;height: 3px; } .universal-control-panel .volume-slider__enlarged-click-area {position: absolute;cursor: pointer;width: 100%;height: 40px;top: 50%;-ms-transform: translateY(-50%);transform: translateY(-50%); } .universal-control-panel .volume-slider__background {position: absolute;width: 100%;height: 100%;background: var(--volume-control-background-color); } .universal-control-panel .volume-slider__volume {position: absolute;background: var(--volume-control-playback-color);bottom: 0;left: 0;height: 100%;border-radius: 4px; } .universal-control-panel .volume-slider__track {position: relative;height: 100%; } .universal-control-panel .volume-slider__thumb {position: absolute;width: 12px;height: 12px;border-radius: 50%;background: var(--volume-control-thumb-color);bottom: -4.5px;margin-left: -6px; } .universal-control-panel__navigation-controls {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;margin: 14px 16px 14px auto; } .universal-control-panel.universal-control-panel_interaction-mode .universal-control-panel__play-controls-container {display: none; } .universal-control-panel.universal-control-panel_hide-controls {visibility: hidden; }.universal-side-panel {width: 280px;height: 100%;overflow: hidden;z-index: 0;position: relative;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-transform-origin: left center;transform-origin: left center;background: var(--panel-color);color: var(--panel-text-color);vertical-align: top;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel__presenter-info {padding: 24px 20px;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel__presenter-info.universal-side-panel__presenter-info_with-delimiter::after {content: '';height: 1px;width: 240px;background: var(--popup-text-color);opacity: 0.08;position: absolute;bottom: 0;left: 20px; } .universal-side-panel .logo {width: 100%;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;-ms-flex-negative: 0;flex-shrink: 0;position: relative;background: var(--company-logo-background-color); } .universal-side-panel .logo.logo_has-logo {padding: 12px 0;min-height: 75px;max-height: 180px;max-width: 280px; } .universal-side-panel .logo a {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;height: 100%; } .universal-side-panel .logo a canvas {max-height: 156px;max-width: 280px; } .universal-side-panel .logo.logo_with-delimiter::after {content: '';height: 1px;width: 240px;background: var(--popup-text-color);opacity: 0.08;position: absolute;bottom: 0;left: 20px; } .universal-side-panel .video-container {box-sizing: border-box;overflow: hidden;margin-bottom: 12px;position: relative;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel .video-container::before {content: '';box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.04);position: absolute;z-index: 1;left: 0;top: 0;width: 100%;height: 100%;pointer-events: none; } .universal-side-panel__video-stub {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;box-sizing: border-box;-ms-flex-negative: 0;flex-shrink: 0;height: 158px;margin-bottom: 12px;background: var(--panel-video-stub-background-color);color: var(--panel-video-stub-color); } .universal-side-panel .playerView {box-sizing: border-box;overflow: hidden;position: relative;margin-bottom: 12px;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel .playerView::before {content: '';box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.04);position: absolute;z-index: 1;left: 0;top: 0;width: 100%;height: 100%;pointer-events: none; } .universal-side-panel__maximized {margin: 0;position: absolute;width: 36px;height: 36px;background: rgba(69, 69, 69, 0.84);color: #FFFFFF;border-radius: 10px;-webkit-backdrop-filter: blur(8px);backdrop-filter: blur(8px);left: 8px;bottom: 5px;z-index: 3;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center; } .universal-side-panel__maximized.universal-side-panel__maximized_at-left {right: 8px;left: auto; } .universal-side-panel__maximized.universal-side-panel__maximized_active {background: #454545; } .universal-side-panel__panel-title {color: var(--text-color);padding: 5px 8px 12px 8px; }.outline-info-panel {font-family: var(--font-family-normal);-ms-flex-positive: 1;flex-grow: 1;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;border-radius: inherit;height: 100%; } .outline-info-panel .outline-panel-header {display: -ms-flexbox;display: flex;-ms-flex-negative: 0;flex-shrink: 0;-ms-flex-align: center;align-items: center;width: 100%;height: 68px;padding: 16px 16px 16px 20px; } .outline-info-panel .outline-panel-header__switcher {display: -ms-flexbox;display: flex;-ms-flex-negative: 0;flex-shrink: 0;-ms-flex-positive: 1;flex-grow: 1; } .outline-info-panel .outline-panel-header__panel-title {font-family: var(--font-family-bold);font-size: 16px;line-height: 20px;color: var(--panel-text-color);-ms-flex-negative: 0;flex-shrink: 0;-ms-flex-positive: 1;flex-grow: 1; } .outline-info-panel .search-button {width: 36px;height: 36px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;color: var(--popup-text-color);cursor: pointer; } .outline-info-panel .search-button svg {width: 20px;height: 20px; } .outline-info-panel .clear-button {width: 36px;height: 36px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;color: var(--popup-text-color);cursor: pointer; } .outline-info-panel .clear-button svg {width: 20px;height: 20px; } .outline-info-panel .search-button {opacity: 0.72; } .outline-info-panel .clear-button {position: absolute;right: 4px;top: 2px;opacity: 0.6; } .outline-info-panel .search-wrapper {-ms-flex-positive: 1;flex-grow: 1;position: relative; } .outline-info-panel .search-field {position: relative;height: 40px;width: 100%;background: var(--search-field-background-color);border-radius: 8px;padding: 10px 44px 10px 16px;font-size: 15px;line-height: 20px;color: var(--panel-text-color);border: none;outline: none; } .outline-info-panel .search-field:-ms-input-placeholder {opacity: 0.4; } .outline-info-panel .search-field::placeholder {opacity: 0.4; } .outline-info-panel .panel-tab-button {font-family: var(--font-family-bold);display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;height: 36px;padding: 0 16px;border-radius: var(--button-border-radius);color: var(--panel-text-color);background: transparent;opacity: 0.72;transition: background 0.3s ease, color 0.3s ease, opacity 0.3s ease; } .outline-info-panel .panel-tab-button.panel-tab-button_active {background: var(--hovered-tab-background-color);color: var(--list-item-text-hover-color);opacity: 1; } .outline-info-panel .panel-tab-button.panel-tab-button_chosen {background: var(--selected-tab-background-color);color: var(--list-item-text-pressed-color);opacity: 1; } .outline-info-panel .panel-tab-button:not(:last-child) {margin-right: 4px; } .outline-info-panel.outline-info-panel_mode_notes .outline-info-panel__outline-container {display: none; } .outline-info-panel__notes-container {-ms-flex-positive: 1;flex-grow: 1;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;height: 100%; } .outline-info-panel__outline-container {-ms-flex-positive: 1;flex-grow: 1;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;height: 100%; } .outline-info-panel__outline-container {border-radius: inherit;border-top-left-radius: 0;border-top-right-radius: 0;height: 100%; } .outline-info-panel__notes-container {padding-bottom: 10px; } .outline-info-panel .outline {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;border-radius: inherit;height: 100%; } .outline-info-panel .notes {height: 100%;position: relative;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;padding-left: 12px; } .outline-info-panel .notes .notes-text {word-wrap: break-word;padding-right: 10px; } .outline-info-panel .notes .notes-text p {margin-top: 0;margin-bottom: 0;white-space: pre-wrap; } .outline-info-panel .notes .notes-text p, .outline-info-panel .notes .notes-text span {color: var(--panel-text-color) !important; } .outline-info-panel .notes .notes-text p:first-child {margin-top: 0; } .outline-info-panel .notes .notes-text p:last-child {margin-bottom: 0; } .outline-info-panel .notes .notes-text p, .outline-info-panel .notes .notes-text p.bold span.nobold, .outline-info-panel .notes .notes-text p.italic span.noitalic, .outline-info-panel .notes .notes-text p.bold.italic span.nobold.noitalic {font-family: var(--font-family-normal); } .outline-info-panel .notes .notes-text p span.bold, .outline-info-panel .notes .notes-text p.bold, .outline-info-panel .notes .notes-text p.italic span.bold.noitalic, .outline-info-panel .notes .notes-text p.bold.italic span.noitalic {font-family: var(--font-family-bold); } .outline-info-panel .notes .notes-text p span.italic, .outline-info-panel .notes .notes-text p.bold span.nobold.italic, .outline-info-panel .notes .notes-text p.italic, .outline-info-panel .notes .notes-text p.bold.italic span.nobold {font-family: var(--font-family-italic); } .outline-info-panel .notes .notes-text p span.bold.italic, .outline-info-panel .notes .notes-text p.bold span.italic, .outline-info-panel .notes .notes-text p.italic span.bold, .outline-info-panel .notes .notes-text p.bold.italic {font-family: var(--font-family-bold-italic); } .outline-info-panel .notes__scroll-area {overflow: hidden; } .outline-info-panel.outline-info-panel_mode_outline .outline-info-panel__notes-container {display: none; }.video-container.video-container_force-fit-video video {position: absolute;width: 100%;height: 100%;margin: auto;top: 0;right: 0;bottom: 0;left: 0; }.video-container video {background-color: black; }.marker-panel {font-family: var(--font-family-normal);padding: 12px 0;width: 260px; } .marker-panel__separator {position: relative;background: var(--popup-text-color);opacity: 0.08;height: 1px;margin: 3px 0; }.marker-panel-button {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative;padding: 4px 20px;opacity: 1;background-color: transparent;transition: background-color 0.28s ease-in-out;width: 100%; } .marker-panel-button__text {font-size: 15px;text-align: left;color: var(--popup-text-color); } .marker-panel-button.marker-panel-button_type_eraseAll, .marker-panel-button.marker-panel-button_type_endDrawing {padding: 14px 20px 14px 24px; } .marker-panel-button:focus, .marker-panel-button:hover {background-color: var(--list-item-background-hover-color); } .marker-panel-button:focus .marker-panel-button__text, .marker-panel-button:hover .marker-panel-button__text {color: var(--popup-text-hover-color); } .marker-panel-button:focus .marker-panel-button__item-icon, .marker-panel-button:hover .marker-panel-button__item-icon {color: var(--popup-text-hover-color); } .marker-panel-button[disabled] {opacity: 0.5;color: var(--popup-text-color);pointer-events: none; } .marker-panel-button[aria-selected='true'] {background-color: var(--list-item-background-pressed-color);color: var(--list-item-text-pressed-color); }.item-icon {width: 40px;height: 40px;background-color: var(--top-panel-icon-container-color);border-radius: 50%;margin-right: 10px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;color: var(--popup-text-color); } .item-icon__item-icon-image {width: 28px;height: 28px;color: inherit; }.marker-tool-container {position: absolute;top: 0; } .marker-tool-container.marker-tool-container_tool_line {cursor: url(data/marker.cur) 3 3, crosshair; } .marker-tool-container.marker-tool-container_tool_marker {cursor: url(data/highlighter.cur) 3 10, crosshair; } .marker-tool-container.marker-tool-container_tool_eraser {cursor: url(data/eraser.cur) 5 5, crosshair; }.draw-control {position: absolute; }.closed-caption-panel {position: absolute;height: 110px;width: 100%;bottom: 0;background-color: rgba(0, 0, 0, 0.5);padding: 13px 4px 7px 14px; } .closed-caption-panel__scroll-area {height: 100%; }.closed-captions {font-family: var(--font-family-normal);color: #FFFFFF;line-height: 19px;font-size: 14px;width: 100%;padding-right: 30px;word-wrap: break-word;white-space: pre-wrap;text-shadow: -1.4px 1.4px 2px rgba(0, 0, 0, 0.48); } .closed-captions p {position: relative !important;margin: 0; }.show-side-panel-button {position: absolute;top: 6px;z-index: 1001; } .show-side-panel-button.show-side-panel-button_side_left {left: 0; } .show-side-panel-button.show-side-panel-button_side_left .show-side-panel-button__button {left: -9px;border-radius: 0 25px 25px 0; } .show-side-panel-button.show-side-panel-button_side_right {right: 0; } .show-side-panel-button.show-side-panel-button_side_right .show-side-panel-button__button {left: 9px;border-radius: 25px 0 0 25px; } .show-side-panel-button.show-side-panel-button_side_right .show-side-panel-button__button.show-side-panel-button__button_active, .show-side-panel-button.show-side-panel-button_side_right .show-side-panel-button__button[aria-pressed='true'], .show-side-panel-button.show-side-panel-button_side_left .show-side-panel-button__button.show-side-panel-button__button_active, .show-side-panel-button.show-side-panel-button_side_left .show-side-panel-button__button[aria-pressed='true'] {background: var(--player-background-color);left: 0; } .show-side-panel-button__button {background: var(--player-background-color);box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.2);transition-property: left; }:root {--font-family-bold: PFnb;--font-family-bold-italic: PFnbi;--font-family-italic: PFni;--font-family-normal: PFn;--font-family-semibold: PFnsb, PFn;--font-family-semibold-italic: PFnsbi, PFni; }@keyframes preloader_spin {0% {transform: rotate(0deg); } 100% {transform: rotate(360deg); } }.message-box {background: var(--player-background-color);position: absolute;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;border-radius: 7px;min-width: 280px;padding: 40px;box-shadow: 0 8px 16px rgba(0, 0, 0, 0.08); } .message-box::after {content: '';box-sizing: border-box;border: 1px solid var(--popup-border);width: 100%;height: 100%;position: absolute;left: 0;top: 0;border-radius: 7px;pointer-events: none; } .message-box__content {position: relative;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-direction: column;flex-direction: column; } .message-box__icon {width: 24px;height: 24px;margin-bottom: 24px;position: relative;display: inline-block;color: var(--text-color);opacity: 0.72; } .message-box .message-box-buttons {position: relative;width: 100%;height: 36px; } .message-box .message-box-buttons__buttons {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center; } .message-box .message-box-buttons__window-button {margin: 0 4px; } .message-box .vertical-scrollbar {top: 40px; } .message-box__message-container {overflow: hidden;display: inline-block;max-width: 480px;vertical-align: top;position: relative; } .message-box__message {text-align: center;font-size: 16px;color: var(--text-color);text-overflow: ellipsis;overflow: hidden;position: relative;font-family: var(--font-family-normal); } .message-box__buttons {margin-top: 28px; }body {overflow: hidden;cursor: default; }:focus {outline: none; }button {cursor: pointer;margin: 0;border: 0;background: transparent; }#content {width: 100%;height: 100%; }.universal {font-family: var(--font-family-normal);display: -ms-flexbox;display: flex;overflow: hidden;position: relative;background: var(--player-background-color);-ms-transform-origin: 0 0;transform-origin: 0 0; } .universal.universal_left-panel {-ms-flex-direction: row-reverse;flex-direction: row-reverse; } .universal.universal_side-panel-hidden .universal__main-container {width: 100%; } .universal.universal_embedded-mode::after {content: '';top: 0;bottom: 0;left: 0;right: 0;position: absolute;border: 1px solid rgba(0, 0, 0, 0.12);pointer-events: none; }.main-container {position: relative;display: inline-block;z-index: 0;-ms-flex-positive: 1;flex-grow: 1; }.content-area {margin-left: auto;margin-right: auto;left: 0;right: 0;position: relative; } .content-area > div {position: absolute !important;top: 0;bottom: 0;margin-top: auto;margin-bottom: auto; } .content-area #playerView {position: absolute; } .content-area .preloader {width: 50px;height: 50px;position: absolute;top: 0;left: 0;bottom: 0;right: 0;margin: auto;border-radius: 10px;background-color: rgba(0, 0, 0, 0.5); } .content-area .preloader::after {content: '';position: absolute;background: url("+ +g[0]+");background-size: cover;top: 0;left: 0;bottom: 0;right: 0;animation: preloader_spin 1s infinite linear; } .content-area .float-panel-overlay {width: 100%;height: 100%;position: absolute;top: 0;left: 0; }.treecontrol {position: relative;-webkit-overflow-scrolling: touch;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;border-radius: inherit; } .treecontrol .container-top-shadow {background: __verticalGradient(var(--panel-color), transparent);background: linear-gradient(to bottom, var(--panel-color), transparent);position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; } .treecontrol .container-bottom-shadow {background: __verticalGradient(transparent, var(--panel-color));background: linear-gradient(to bottom, transparent, var(--panel-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; } .treecontrol.treecontrol_locked {cursor: url(data/lock.cur), no-drop; }.launch-screen {z-index: 100;position: fixed;top: 0;right: 0;bottom: 0;left: 0;background-color: rgba(0, 0, 0, 0.48); } .launch-screen .launch-screen-button {top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 96px;height: 96px;position: absolute; } .launch-screen .launch-screen-button__play-icon {background-color: #FFFFFF;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 90px;height: 90px;box-shadow: 0 12px 50px 0 rgba(0, 0, 0, 0.2);transition: 0.3s ease-in-out; } .launch-screen .launch-screen-button__icon {background: url("+ +g[1]+") no-repeat center;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 6px;width: 90px;height: 90px; } .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__play-icon {width: 96px;height: 96px; } .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__icon {background: url("+g[2]+") no-repeat center; }body {margin: 0;padding: 0;overflow: hidden;cursor: default;-ms-touch-action: pan-y;touch-action: pan-y;-webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body .password_form, body .info_panel {position: absolute;background: #F7F7F7;border-radius: 4px;width: 513px;height: 210px;font-family: Arial; } body .password_form *, body .info_panel * {box-sizing: border-box; } body .password_form .password_label {position: absolute;color: #3A3A3A;font-size: 15px;top: 63px;left: 55px; } body .password_form .wrong_password_label {position: absolute;color: #DD4A37;font-size: 12px;top: 131px;left: 55px; } body .password_form input {position: absolute;width: 330px;height: 32px;background: #FFFFFF;border: 1px solid #D1D2D4;padding: 1px;border-radius: 2px;font-size: 18px;color: #231F20;left: 54px;top: 94px;padding-left: 8px; } body .password_form button {border: transparent;background: transparent;color: #343434;font-family: Arial;font-size: 15px;text-shadow: 0 1px 0 rgba(255, 255, 255, 0.4); } body .password_form button::before {background: linear-gradient(to bottom, #D3D3D3, #BABABA);position: absolute;content: '';top: 0;right: 0;bottom: 0;left: 0;border-radius: 4px;z-index: -1; } body .password_form button::after {background: linear-gradient(to bottom, #DCDCDC, #D1D1D1);position: absolute;content: '';top: 1px;right: 1px;bottom: 1px;left: 1px;border-radius: 4px;z-index: -1; } body .password_form .btn_ok {position: absolute;top: 94px;right: 55px;width: 60px;height: 32px;opacity: 0.99; } body .info_panel {display: table; } body .info_panel .label {position: static;display: table-cell;vertical-align: middle;width: 100%;padding-left: 120px;padding-right: 40px;color: #3A3A3A;font-size: 15px; } body .info_panel::after {position: absolute;content: '';width: 63px;height: 63px;top: 73px;left: 46px; } body .info_panel.domain::after {background: transparent url("+ +g[3]+"); } body .info_panel.time::after {background: transparent url("+g[4]+"); }.component_base,.component_container {position: absolute; }:focus {outline: none; }::-moz-focus-inner {border: 0; }input {appearance: none; }button {cursor: pointer;margin: 0;border: 0; }button[disabled] {cursor: default; }.__player_view_id__ {position: absolute; } .__player_view_id__ > * {position: absolute; } .__player_view_id__ .slide {white-space: nowrap;font-size: 0; } .__player_view_id__ .slide a {text-decoration: none;cursor: pointer; } .__player_view_id__ .slide a img {border: 0; } .__player_view_id__ .slide * {-ms-transform-origin: 0 0;transform-origin: 0 0; } .__player_view_id__ .slide.relpos, .__player_view_id__ .slide .relpos {position: relative !important;vertical-align: top; } .__player_view_id__ .slide.kern, .__player_view_id__ .slide .kern {text-rendering: optimizeLegibility;font-feature-settings: 'kern' 1, 'liga' 0; } .__player_view_id__ .slide.nokern, .__player_view_id__ .slide .nokern {text-rendering: optimizeSpeed;font-feature-settings: 'kern' 0, 'liga' 0; } .__player_view_id__ .fullscreen {-ms-transform: none !important;transform: none !important;top: 0 !important;left: 0 !important; } .__player_view_id__ .fullscreen > video, .__player_view_id__ .fullscreen .video_player {background-color: black;width: __slide_width__ !important;height: __slide_height__ !important;z-index: 100;-ms-transform: none !important;transform: none !important; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen {background: url("+ +g[5]+") no-repeat; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen:hover {background: url("+g[6]+") no-repeat; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen:active {background: url("+g[7]+") no-repeat; } .__player_view_id__ .video_player video {width: 100%;height: 100%;margin: auto;top: 0;right: 0;bottom: 0;left: 0; } .__player_view_id__ .video_player video::cue {color: #FFFFFF;background-color: rgba(8, 8, 8, 0.75);border-radius: 4px;font-family: Helvetica, Roboto, Arial, sans-serif;line-height: 1.1; } .__player_view_id__ .video_player.poster_frame_hide_video video {display: none; } .__player_view_id__ .video_player.poster_frame video {opacity: 0; } .__player_view_id__ .video_player.poster_frame_hide_video .poster, .__player_view_id__ .video_player.poster_frame .poster {position: absolute;width: 100%;height: 100%; } .__player_view_id__ .video_player .controls {height: 36px;background: rgba(45, 50, 55, 0.85098);border: 1px solid #444648;cursor: default;border-radius: 4px; } .__player_view_id__ .video_player .controls, .__player_view_id__ .video_player .controls * {backface-visibility: hidden; } .__player_view_id__ .video_player .controls .progress {background-color: #75787A;height: 14px;left: 64px;top: 0;bottom: 0;margin-top: auto;margin-bottom: auto;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark {width: 10px;height: 10px;margin-top: -5px;margin-left: -5px;top: 50%;background: url("+ +g[8]+") no-repeat;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark:hover, .__player_view_id__ .video_player .controls .progress .bookmark:active {background: url("+g[9]+") no-repeat; } .__player_view_id__ .video_player .controls .progress .loading {background-color: #B1B3B5;height: 100%; } .__player_view_id__ .video_player .controls .progress .playing {background-color: #FFFFFF;height: 100%; } .__player_view_id__ .video_player .controls .progress .tooltip {background: url("+ +g[10]+") no-repeat;width: 60px;height: 25px;top: -33px;margin-left: -30px;font-family: Arial;font-size: 12px;padding-top: 2px;text-align: center; } .__player_view_id__ .video_player .controls .volume_popup {border-radius: 3px;background: rgba(45, 50, 55, 0.85098);top: -67px;right: 65px;padding: 8px;box-sizing: border-box;width: 28px;height: 64px; } .__player_view_id__ .video_player .controls .volume_popup .volume {background: url("+g[11]+");position: relative;cursor: pointer;width: 12px;height: 48px; } .__player_view_id__ .video_player .controls .volume_popup .volume .back {background: url("+ +g[12]+");width: 100%; } .__player_view_id__ .video_player .controls button {width: 100%;height: 100%; } .__player_view_id__ .video_player .controls button.rate {background: url("+g[13]+") no-repeat center; } .__player_view_id__ .video_player .controls button.rate.selected {background-color: rgba(255, 255, 255, 0.1); } .__player_view_id__ .video_player .controls button.mute {background: url("+g[14]+"); } .__player_view_id__ .video_player .controls button.mute:hover {background: url("+ +g[15]+"); } .__player_view_id__ .video_player .controls button.mute:active {background: url("+g[16]+"); } .__player_view_id__ .video_player .controls button.mute.selected {background: url("+g[17]+"); } .__player_view_id__ .video_player .controls button.mute.selected:hover {background: url("+g[18]+"); } .__player_view_id__ .video_player .controls button.mute.selected:active {background: url("+g[19]+"); } .__player_view_id__ .video_player .controls button.subtitles {background: url("+ +g[20]+") no-repeat center; } .__player_view_id__ .video_player .controls button.subtitles.selected {background-color: rgba(255, 255, 255, 0.1); } .__player_view_id__ .video_player .controls button.play {background: url("+g[21]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:hover {background: url("+g[22]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:active {background: url("+g[23]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected {background: url("+ +g[24]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:hover {background: url("+g[25]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:active {background: url("+g[26]+") no-repeat; } .__player_view_id__ .video_player .controls button.play::after {background: url("+g[27]+");width: 1px;height: 32px;right: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls button.toggle_fullscreen {background: url("+ +g[28]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:hover {background: url("+g[29]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:active {background: url("+g[30]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen::before {background: url("+g[27]+") no-repeat;width: 1px;height: 32px;left: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls .subtitles-list {width: 195px;right: 0;border-radius: 4px;border: solid 1px #444648;background-color: rgba(45, 50, 55, 0.85);font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;font-weight: normal;font-stretch: normal;font-style: normal;line-height: normal;letter-spacing: normal;padding: 3px 0;bottom: 37px; } .__player_view_id__ .video_player .controls .subtitles-list__caption {position: relative !important;padding: 12px 0 22px 0;color: #b8b8b8;text-align: center; } .__player_view_id__ .video_player .controls .subtitles-list__caption::after {position: absolute;content: '';width: calc(100% - 20px);left: 0;right: 0;bottom: 5px;margin: auto;border-bottom: 1px solid #444648; } .__player_view_id__ .video_player .controls .subtitles-list__item {color: #b8b8b8;position: relative !important;padding: 10px 2px 10px 35px;cursor: pointer;overflow: hidden;text-overflow: ellipsis; } .__player_view_id__ .video_player .controls .subtitles-list__item.subtitles-list__item_active {background-color: rgba(255, 255, 255, 0.1);color: #FFFFFF; } .__player_view_id__ .video_player .controls .subtitles-list__item[aria-selected='true'] {background-color: rgba(0, 0, 0, 0.24);color: #FFFFFF;padding-left: 12px; } .__player_view_id__ .video_player .controls .subtitles-list__item[aria-selected='true']::before {background: url("+ +g[31]+") no-repeat;width: 14px;height: 15px;padding-right: 23px;content: ''; } .__player_view_id__ .video_player .controls .toggle_fullscreen {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .play {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .rate {width: 32px;height: 34px;right: 95px;top: 0; } .__player_view_id__ .video_player .controls .rate.rate_subtitle-button-next {right: 127px; } .__player_view_id__ .video_player .controls .playback-rate-menu {width: 120px;right: 51px;border-radius: 4px;border: solid 1px #444648;background-color: rgba(45, 50, 55, 0.85);font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;font-weight: normal;font-stretch: normal;font-style: normal;line-height: normal;letter-spacing: normal;padding: 3px 0;bottom: 37px; } .__player_view_id__ .video_player .controls .playback-rate-menu.playback-rate-menu_subtitle-button-next {right: 83px; } .__player_view_id__ .video_player .controls .playback-rate-menu__caption {position: relative !important;padding: 12px 0 22px 0;color: #b8b8b8;text-align: center; } .__player_view_id__ .video_player .controls .playback-rate-menu__caption::after {position: absolute;content: '';width: calc(100% - 20px);left: 0;right: 0;bottom: 5px;margin: auto;border-bottom: 1px solid #444648; } .__player_view_id__ .video_player .controls .playback-rate-menu__item {color: #b8b8b8;position: relative !important;padding: 10px 2px 10px 35px;cursor: pointer;overflow: hidden;text-overflow: ellipsis; } .__player_view_id__ .video_player .controls .playback-rate-menu__item.playback-rate-menu__item_active {background-color: rgba(255, 255, 255, 0.1);color: #FFFFFF; } .__player_view_id__ .video_player .controls .playback-rate-menu__item[aria-selected='true'] {background-color: rgba(0, 0, 0, 0.24);color: #FFFFFF;padding-left: 12px; } .__player_view_id__ .video_player .controls .playback-rate-menu__item[aria-selected='true']::before {background: url("+ +g[31]+") no-repeat;width: 14px;height: 15px;padding-right: 23px;content: ''; } .__player_view_id__ .video_player .controls .subtitles {width: 32px;height: 34px;right: 95px;top: 0; } .__player_view_id__ .video_player .controls .toggle_fullscreen {right: -1px; } .__player_view_id__ .video_player .controls .mute {width: 22px;height: 22px;right: 67px;top: 6px; }.popup_layer {position: absolute; } .popup_layer .modal_layer {background: #000000;opacity: 0.4;z-index: 10;width: 100%;height: 100%; } .popup_layer .message_box, .popup_layer .confirm_window {background: #FFFFFF;border-radius: 5px;border: 1px solid rgba(0, 0, 0, 0.75);width: 357px;height: 150px;position: absolute;top: 0;right: 0;bottom: 0;left: 0;margin: auto;z-index: 10; } .popup_layer .message_box::after, .popup_layer .confirm_window::after {background-color: #E6E6E6;width: 100%;height: 1px;top: 30px;position: absolute;content: ''; } .popup_layer .message_box .title, .popup_layer .message_box .message, .popup_layer .confirm_window .title, .popup_layer .confirm_window .message {font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;color: #323232; } .popup_layer .message_box .title, .popup_layer .confirm_window .title {position: absolute;left: 13px;top: 7px;font-weight: bold;background: transparent; } .popup_layer .message_box .message, .popup_layer .confirm_window .message {position: absolute;top: 47px;left: 69px;margin-right: 25px; } .popup_layer .message_box .message::before, .popup_layer .confirm_window .message::before {background-color: #E6E6E6;width: 35px;height: 35px;left: -45px;position: absolute;content: ''; } .popup_layer .message_box button, .popup_layer .confirm_window button {font-size: 14px;border-radius: 5px;color: #323232;width: 68px;height: 30px; } .popup_layer .message_box button, .popup_layer .message_box button.mobile:hover, .popup_layer .message_box button.mobile:active, .popup_layer .confirm_window button, .popup_layer .confirm_window button.mobile:hover, .popup_layer .confirm_window button.mobile:active {background: #D4D4D4; } .popup_layer .message_box button:hover, .popup_layer .message_box button:active, .popup_layer .message_box button.mobile.active, .popup_layer .confirm_window button:hover, .popup_layer .confirm_window button:active, .popup_layer .confirm_window button.mobile.active {background: #B8B8B8; } .popup_layer .confirm_window button.btn_yes {left: 101px;top: 98px; } .popup_layer .confirm_window button.btn_no {left: 181px;top: 98px; } .popup_layer .confirm_window .message::before {background: url("+ +g[32]+"); } .popup_layer .message_box button.btn_ok {left: 141px;top: 98px; } .popup_layer .message_box .message::before {background: url("+g[33]+"); }.transitionSlide.paused * {animation-play-state: paused !important; }.framesLayer .video_player {-ms-transform-origin: 0 0;transform-origin: 0 0; }.framesLayer *:not(.framesLayerContent) {pointer-events: all; }.framesLayer .framesLayerContent {position: absolute; } .framesLayer .framesLayerContent > div {pointer-events: all; }.trial_banner {position: relative;transform: translateZ(0); } .trial_banner .banner-content, .trial_banner .banner-content_hover {position: absolute;left: 0;right: 0;top: 0;bottom: 0;width: 100%;height: 100%; } .trial_banner .banner-content {visibility: visible;z-index: 1; } .trial_banner .banner-content_hover {visibility: hidden;z-index: 0; } .trial_banner .days_remaining {position: absolute;font-family: 'Open Sans', Arial, sans-serif;font-weight: normal;font-size: 13px;left: 65px;top: 41px;color: #7C1645;z-index: 1; } .trial_banner:hover .banner-content {visibility: hidden;z-index: 0; } .trial_banner:hover .banner-content_hover {visibility: visible;z-index: 1; }.outline {font-family: var(--font-family-normal);position: relative; }.search-result {font-family: var(--font-family-bold);padding: 16px 0 8px 20px;position: relative;font-size: 15px;line-height: 20px;color: var(--popup-text-color); } .search-result.search-result_no-results {font-family: var(--font-family-normal);height: 100%;text-align: center;padding: 60px 0 0;opacity: 0.6; }.slide-item-view {position: relative;overflow: hidden;display: table;width: 100%;color: var(--panel-text-color);transition: background 0.28s ease; } .slide-item-view__content {height: 100%;display: table-row; } .slide-item-view__content > * {display: table-cell;vertical-align: middle; } .slide-item-view__open-button {width: 12px;height: 12px;margin: 0 8px 0 12px;opacity: 0.6;padding: 0;color: var(--popup-text-color);transition: transform 0.3s ease;background: transparent; } .slide-item-view__open-button[aria-pressed='true'] {-ms-transform: rotate(90deg);transform: rotate(90deg); } .slide-item-view__thumb {max-width: 100px;max-height: 60px;vertical-align: middle;margin-top: 1px;border: 1px solid rgba(0, 0, 0, 0.04);border-radius: 4px;background-color: var(--player-background-color); } .slide-item-view__status {position: absolute;width: 18px;height: 18px;background-size: 18px 18px; } .slide-item-view__status.slide-item-view__status_status_correct {background-image: url("+ +g[34]+"); } .slide-item-view__status.slide-item-view__status_status_partially {background-image: url("+g[35]+"); } .slide-item-view__status.slide-item-view__status_status_incorrect {background-image: url("+g[36]+"); } .slide-item-view__status.slide-item-view__status_status_answered {background-image: url("+g[37]+"); } .slide-item-view__status.slide-item-view__status_answered {background-image: url("+g[38]+"); } .slide-item-view__mark {position: absolute;width: 12px;height: 18px;top: 0;bottom: 0;margin: auto;background-image: url("+ +g[39]+");background-size: 12px 18px;background-repeat: no-repeat;margin-left: -40px; } .slide-item-view__mark.slide-item-view__mark_with-status {left: 8px; } .slide-item-view__title-container {width: 100%; } .slide-item-view__title {padding: 0 16px;font-size: 14px;line-height: 18px;max-height: 60px;word-break: break-word;overflow: hidden;display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .slide-item-view__title.slide-item-view__title_minimized {max-height: 70px; } .slide-item-view.slide-item-view_with-thumbnail .slide-item-view__title {padding-left: 11px; } .slide-item-view.slide-item-view_with-thumbnail .slide-item-view__mark {margin-left: -20px; } .slide-item-view.slide-item-view_active {background: var(--list-item-background-hover-color);color: var(--list-item-text-hover-color); } .slide-item-view.slide-item-view_active .slide-item-view__mark {background-image: url("+ +g[40]+"); } .slide-item-view[aria-selected='true'] {background: var(--list-item-background-pressed-color);color: var(--list-item-text-pressed-color); } .slide-item-view[aria-selected='true'] .slide-item-view__mark {background-image: url("+g[41]+"); }.treecontrol.treecontrol_highlight-viewed .slide-item-view.slide-item-view_viewed {color: var(--list-item-text-visited-color); }.treecontrol.treecontrol_highlight-viewed .slide-item-view.slide-item-view_viewed.slide-item-view_active {background: var(--list-item-background-hover-color);color: var(--list-item-text-hover-color); }.treecontrol.treecontrol_highlight-viewed .slide-item-view.slide-item-view_viewed[aria-selected='true'] {background: var(--list-item-background-pressed-color);color: var(--list-item-text-pressed-color); }.highlighted {font-family: var(--font-family-bold);padding: 2px 3px;margin: -2px -3px;font-size: 14px;line-height: 18px;color: var(--popup-text-color);opacity: 1; }.search-context {font-size: 14px;line-height: 18px;color: var(--popup-text-color);opacity: 0.6; }.container-top-shadow {background: __verticalGradient(var(--popup-background-color), var(--popup-transparent-background-color));background: linear-gradient(to bottom, var(--popup-background-color), var(--popup-transparent-background-color));position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; }.container-bottom-shadow {background: __verticalGradient(var(--popup-transparent-background-color), var(--popup-background-color));background: linear-gradient(to bottom, var(--popup-transparent-background-color), var(--popup-background-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; }.vertical-scrollbar {position: absolute;right: 0;top: 4px;bottom: 4px;width: 14px;transition: opacity 0.2s ease; } .vertical-scrollbar .thumb {position: absolute;width: 8px;right: 3px;padding: 1px;border-radius: 5px; } .vertical-scrollbar .thumb__background {height: 100%;border-radius: 4px;background-color: rgba(0, 0, 0, 0.32);border: 1px solid rgba(255, 255, 255, 0.12); }.vertical-scrollbar {transition: none;opacity: 0.5 !important; }.vertical-scrollbar .thumb {padding: 0;right: 0; } .vertical-scrollbar .thumb__background {height: 100%;border-radius: 20px;background-color: rgba(0, 0, 0, 0.16);border: 1px solid rgba(255, 255, 255, 0.12); }.presentation-view-mode-switch-control {width: 64px;height: 64px;position: fixed;left: 16px;top: 16px;cursor: pointer;border: none;background: url("+ +g[42]+") no-repeat center; } .presentation-view-mode-switch-control:not([disabled]):hover {background: url("+g[43]+") no-repeat center; } .presentation-view-mode-switch-control:not([disabled]):active {background: url("+g[44]+") no-repeat center; } .presentation-view-mode-switch-control:not([disabled]):focus {outline: none; } .presentation-view-mode-switch-control:not([disabled]):focus::before {content: '';position: absolute;top: 3px;bottom: 3px;left: 3px;right: 3px;border: 1px dotted #FFFFFF;opacity: 0.6; }"}(); +var e;for(const [g,h]of Object.entries(null!=(e=a)?e:{}))e=`__${g.replace(RegExp("\\.","g"),"_")}__`,d=d.replace(new RegExp(e,"g"),h);let f;for(const [g,h]of Object.entries(null!=(f=b)?f:{}))d=d.replace(new RegExp(g,"g"),h);d=d.replace(/__verticalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.rn);d=d.replace(/__horizontalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.pn);return gn(d)}rn(a,b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}pn(a, +b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}};var zG={mb_question_icon:'', +mb_warning_icon:'', +arrows_left:'',arrows_right:'', +"attachment-doc":'', +"attachment-image":'', +"attachment-link":'',"attachment-unknown":'', +"attachment-video":'', +attachments_button_icon:'', +"btn_pause_big.svg":' \t\t', +"btn_play_big.svg":' ', +cc:'', +cc_on:'', +chevron_left:'',chevron_right:'',collapse_icon:'', +erase_search:'', +exit_fullscreen:'', +"external-link":'',fullscreen:'', +"mail-link":'', +marker_eraser:'', +marker_highlighter:'', +marker_panel_button_icon:'', +marker_pen:'', +more:'', +next_btn:'',next_btn_mobile:'', +notes_button_icon:'', +outline:'', +outline_button_icon:'', +pause:'',play:'',play_pause_btn:' ', +presenter_info_button_icon:'',prev_btn:' ', +prev_btn_mobile:'',"rate-0.75x":'', +"rate-1.25x":'', +"rate-1.5x":'', +"rate-1x":'', +"rate-2x":'', +replay:'',search:'', +"tab-left":'',"tab-right":'',tab1:'', +tab2:'',tick:'', +video_maximize:'',"video_stub.svg":'', +volume_high:'', +volume_middle:'', +volume_mute:''};var AG={mb_question_icon:'', +mb_warning_icon:'', +"attachment-doc":'', +"attachment-image":'', +"attachment-link":'',"attachment-unknown":'', +"attachment-video":'', +attachments:'', +attachment_icon:'\t', +back:'',back_to_app:'', +bio:'', +close:'', +mail:'', +next:'',notes:'', +outline:'', +outline_landscape:'', +pause:'',phone:'', +play:'',presenter_info:'', +prev:'',"rate-0.75x":'', +"rate-1.25x":'', +"rate-1.5x":'', +"rate-1x":'', +"rate-2x":'', +rate:'', +search:'', +site:'', +tick:'',url_icon:'\t'};class BG{Uq(a,b){var c="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICB3aWR0aD0iMjhweCIgaGVpZ2h0PSIzM3B4IiB2aWV3Qm94PSIwIDAgMjguMzAyIDMzLjI0MiI+DQoJPHBhdGggZD0iTTAsMS44VjMxLjQ0MmExLjgsMS44LDAsMCwwLDIuNzI2LDEuNTQzbDI0LjctMTQuODJhMS44LDEuOCwwLDAsMCwwLTMuMDg3TDIuNzI2LjI1N0ExLjgsMS44LDAsMCwwLDAsMS44WiIgc3R5bGU9ImZpbGw6IzMzMyIvPg0KPC9zdmc+ data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyOHB4IiBoZWlnaHQ9IjMzcHgiIHZpZXdCb3g9IjAgMCAyOC4zMDIgMzMuMjQyIj4NCgk8cGF0aCBkPSJNMCwxLjhWMzEuNDQyYTEuOCwxLjgsMCwwLDAsMi43MjYsMS41NDNsMjQuNy0xNC44MmExLjgsMS44LDAsMCwwLDAtMy4wODdMMi43MjYuMjU3QTEuOCwxLjgsMCwwLDAsMCwxLjhaIiBzdHlsZT0iZmlsbDojNTI4YmRmIi8+DQo8L3N2Zz4= data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAADcmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmFjOGVjNDFhLTZkYWItODQ0Ni04YzkzLWU1Mjk3N2YwMmE4NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFRThCNzU3NDYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFRThCNzU3MzYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cykiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0OWFlZmI1OC00ZWFmLWQ3NDgtYTI0ZS0zNmNhNGQ2M2QwNTYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6N0MwQkFBM0M2MjAxMTFFNUI4QjBERTk4MjY5MjQwQjUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6MGSVVAAAE3klEQVR42uycW4hWVRiG15Q4eYzGQySSQlriEQ9BF2mE4iSdESRRIb0RD+mNmHgICjqQEGUe6sqgCy1i0iRinAzELrooQhHLGQURUTzMiM7omCLj+/F/czX/t/890z6s9e/3hZcZ1l6z19r7mXXca62arq4uR/mjh/gKCIQiEAKhCIRAKAIhEIpACIQiEIpACIQiEAKhCIRAKAIhEMoX9Yu62NbWxjcUobq6OpaQQpcQz/QwPBOeDU+Fx8Oj4UfhoRrnJnwDvgC3wCfgY/Bf8P0QHrImahmQB1VWLfwGvAieqy+/LxJIR+Dv4QPwf75WWb4CGQavg9fo70mqFd4F79DfCSRCA+HN8Hp4cMppdcBfwB/Bt9mo99Sr8Cl4SwYwnKYhaf2jaXMconoE/hL+CR6TQ/pPato7NS+FbtSfgH+Gp8eMfwv+HT6qpakZvqzVT/d//ePw0/BEeI72ygbFvP/f8MvwpSK2IfLSGuGxFeJ1aby98CG4s5fpDNAqaTlcL89cIf45jddcpDZknI4PKsFo0NKzQLusnX1Iq1P/doHe60CF+GM1b+OK0obIYO5XeGREnLPwfHghfDzBtOVeb+q9z0bEG6njltHVDqQ2RuP9HTwDbkoxH02axv4YjX1tNQP5LKIBl7ZiK/yWToGkLUljsaZpNaTTNc9VCeR1eHUEjHfgD3OoQiXNVRFQVmveqwrIEHh3xPXNOp2Rl77WPFiSvA+tJiCb4FHGNanHP/FggCp52Gdck7y/Wy0Dw2Hatx9s9KZmZNRmxC3JMjh8qsy1Du0St4Y+DomaKFzlEQxRu+apnOQZ1oVeZfWPeMCGlLu2/6dL3BDRwPcPGYiMjocbvaoPnL963+h1DddnChbIMiP8cMIj8KQln34be/lM3gOREW69cW2v81/fGOH1aY7e0wTyrNGYyxT6wQCAHNS8lmvcZ4UIZL4RLt8z7gQA5I7mtZyeCxHIS0b4UReOrLw+EyIQqxScDAiIldcJIQLZYTTmvwUEpMUIHxMikB/gta40PXIF/lwHVrcCAnLVCH8srQR9X7mYt2RUbq1yrOFia390N9SReugaYoR3EEg+GmGEtxNIPhpvhJ8nkHw02Qj/l0Dy0Rwj/DSBZC9ZeD3buPYHgWSv11z5RdrSw/qTQLLX20Z4o0toSxyBxJdsKrVmq79NM2ECKa/3XPltC9fgXwgkW81zpVX35fSVS3HahEB6SqZK9hjXujeJOgLJTrLG19qos1OrLALJSLL+eLFx7SL8cRaZIJCSVrrSfnVL8qHtJoFkoy3ablibQeWz849ZZaZfgUHIfg/Z97EkIs5xLR2OQNLv2u5x0Ttt5UShV1wfj91glRVP01xp8UVTBRiyuOFFheJYQpKVzNrKwQErXPyDA2SF+5k8MhsykCnwPdfzaA3ZYy6nREyCX4Cfd/EPs+nV0RoEUlqWsx1eCie9Bkc2nW5wOa87Dg3Ipy75bWXntSd1yIcHDK1RT3KzTIcOBif6AqOo3d42HX/I0tZW3zIXWgnp68chmfaQjZxyoKac0bXNRxghlpCN2m1dpj/btXEfpD0uqYaua89Luq3dx8TKN3AeE1vt4mLrAohACIQiEAKhCIRAKAIhEIpACq7IqROKJYRA+AoIhCIQAqEIhEAoAiEQikCKrQcCDABHPgH2w7NQdAAAAABJRU5ErkJggg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA5LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDksMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbD0iI0RENEIzOCIgZD0iTTIxLjA0MSwyOXY5Ljg0NGMwLDUuNTA4LDQuNjkxLDkuOTczLDEwLjQ3OSw5Ljk3M2M1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTczVjI5SDIxLjA0MXoiLz4NCjxwYXRoIGZpbGw9IiNERDRCMzgiIGQ9Ik0yNi41NTgsMjl2LTcuNjg5YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MlYyOWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNFYyOUgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjEuMDQxLDI4LjIwNnY5Ljg0NWMwLDUuNTA2LDQuNjkxLDkuOTcxLDEwLjQ3OSw5Ljk3MWM1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTcxdi05Ljg0NUgyMS4wNDF6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjYuNTU4LDI4LjA0VjIwLjM1YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MnY3LjY4OWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNHY4LjA1NEgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRjA4RjgyIiBkPSJNMzQsMzYuMzY1YzAtMS4yODctMS4wNDQtMi4zMzEtMi4zMzEtMi4zMzFjLTEuMjg4LDAtMi4zMzIsMS4wNDQtMi4zMzIsMi4zMzENCgljMCwwLjk3MSwwLjU5NCwxLjgwMiwxLjQzOCwyLjE1MnY0LjQ2N2gxLjkxdi00LjUyOUMzMy40NjEsMzguMDc2LDM0LDM3LjI4NywzNCwzNi4zNjV6Ii8+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA4LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDgsMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik01OS42NDYsMzFoLTMuMjkzQzU2LjE1OCwzMSw1NiwzMS40NDgsNTYsMzINCgljMCwwLjU1MywwLjE1OCwxLDAuMzU0LDFoMy4yOTNDNTkuODQyLDMzLDYwLDMyLjU1Myw2MCwzMkM2MCwzMS40NDgsNTkuODQyLDMxLDU5LjY0NiwzMXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjREQ0QjM4IiBkPSJNNi42NDcsMzFIMy4zNTNDMy4xNTgsMzEsMywzMS40NDgsMywzMmMwLDAuNTUzLDAuMTU4LDEsMC4zNTMsMQ0KCWgzLjI5NEM2Ljg0MiwzMyw3LDMyLjU1Myw3LDMyQzcsMzEuNDQ4LDYuODQyLDMxLDYuNjQ3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik0zMSw4YzAuNTUzLDAsMS0wLjE1OCwxLTAuMzUzVjQuMzUzQzMyLDQuMTU4LDMxLjU1Myw0LDMxLDQNCgljLTAuNTUyLDAtMSwwLjE1OC0xLDAuMzUzdjMuMjk0QzMwLDcuODQyLDMwLjQ0OCw4LDMxLDh6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTMxLDU2Yy0wLjU1MiwwLTEsMC4xNTgtMSwwLjM1NHYzLjI5M0MzMCw1OS44NDIsMzAuNDQ4LDYwLDMxLDYwDQoJYzAuNTUzLDAsMS0wLjE1OCwxLTAuMzU0di0zLjI5M0MzMiw1Ni4xNTgsMzEuNTUzLDU2LDMxLDU2eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik00Ny42NjgsMzFoLTEyLjgxQzM0LjQ5NiwyOS42LDMzLjQsMjguNTA1LDMyLDI4LjE0Mg0KCWMwLDAtMC4xNzItMC4xNDItMS0wLjE0MmMtMC44MjksMC0yLDAuNTU1LTIsMC41NTVjLTEuMTksMC42OTMtMiwxLjk2OS0yLDMuNDQ1YzAsMi4yMDksMS43OTEsNCw0LDRjMS40NzcsMCwyLjc1Mi0wLjgwOSwzLjQ0NS0yDQoJaDEzLjIyM0M0OC40MDQsMzQsNDksMzMuMzI4LDQ5LDMyLjVDNDksMzEuNjcyLDQ4LjQwNCwzMSw0Ny42NjgsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTI3LjAxOCwyOS43NDhjMC41OTIsMS4wMjUsMS42NTIsMS41MiwyLjM3LDEuMTA2bDAsMA0KCWMwLjcxNy0wLjQxNSwwLjgxOS0xLjU4MSwwLjIyOC0yLjYwNmwtNy44NTctMTMuNjA5Yy0wLjU5Mi0xLjAyNC0xLjY1My0xLjUyLTIuMzcxLTEuMTA2bDAsMGMtMC43MTcsMC40MTUtMC44MTgsMS41ODEtMC4yMjgsMi42MDUNCglMMjcuMDE4LDI5Ljc0OHoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMjcuMDE4LDI4LjM2MWMwLjU5MiwxLjAyNSwxLjY1MiwxLjUyLDIuMzcsMS4xMDZsMCwwDQoJYzAuNzE3LTAuNDE1LDAuODE5LTEuNTgxLDAuMjI4LTIuNjA2bC03Ljg1Ny0xMy42MDljLTAuNTkyLTEuMDI0LTEuNjUzLTEuNTItMi4zNzEtMS4xMDZsMCwwYy0wLjcxNywwLjQxNS0wLjgxOCwxLjU4MS0wLjIyOCwyLjYwNQ0KCUwyNy4wMTgsMjguMzYxeiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgY3g9IjMxIiBjeT0iMzEiIHI9IjQiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNjAsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzU0LDFoLTMuMjkzQzU2LjE1OCwzMiw1NiwzMS41NTIsNTYsMzENCglsMCwwYzAtMC41NTIsMC4xNTgtMSwwLjM1NC0xaDMuMjkzQzU5Ljg0MiwzMCw2MCwzMC40NDgsNjAsMzFMNjAsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTcsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzUzLDFIMy4zNTNDMy4xNTgsMzIsMywzMS41NTIsMywzMWwwLDANCgljMC0wLjU1MiwwLjE1OC0xLDAuMzUzLTFoMy4yOTRDNi44NDIsMzAsNywzMC40NDgsNywzMUw3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0zMSwzYzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDYuODQyLDMxLjU1Myw3LDMxLDdsMCwwDQoJYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1M1YzLjM1M0MzMCwzLjE1OCwzMC40NDgsMywzMSwzTDMxLDN6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTMxLDU1YzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDU4Ljg0MiwzMS41NTMsNTksMzEsNTkNCglsMCwwYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1NHYtMy4yOTRDMzAsNTUuMTU4LDMwLjQ0OCw1NSwzMSw1NUwzMSw1NXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNDksMzEuNDk5QzQ5LDMwLjY3Miw0OC40MDQsMzAsNDcuNjY4LDMwSDM0LjMzMw0KCUMzMy41OTYsMzAsMzMsMzAuNjcxLDMzLDMxLjVsMCwwYzAsMC44MjgsMC41OTYsMS41LDEuMzMzLDEuNWgxMy4zMzVDNDguNDA0LDMzLDQ5LDMyLjMyOCw0OSwzMS40OTlMNDksMzEuNDk5eiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YxNjE1NSIgY3g9IjMxIiBjeT0iMzEiIHI9IjIiLz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjM2MzgxNDQiPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgzNjAiIGNsYXNzPSJmaWwwIiBkPSJNNi43NzM1IDMuOTc5bDAgLTMuNDQyNDVjMCwtMC4yOTUxMTkgLTAuMjQxNDMzLC0wLjUzNjU1MiAtMC41MzY1NTIsLTAuNTM2NTUybC02LjIzNjk1IDAgMCA0LjUxNTU1IDYuMjM2OTUgMGMwLjI5NTExOSwwIDAuNTM2NTUyLC0wLjI0MTQzMyAwLjUzNjU1MiwtMC41MzY1NTJ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMzYzODEyMCIgY2xhc3M9ImZpbDEiIGQ9Ik0zLjE4NzUgMS4yMzAyMWwtMC4zMzU1NTIgMC4zMzU1MTQgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAtMC4yMjM2NjQgMC4yMjM2NjQgMC40NDczNjUgMC40NDczNjUgLTAuMzM1NTE0IDAuMzM1NTUyIDAuODk0NzMgMCAwIC0wLjg5NDczem0wLjI2NTY0MSAyLjA1NTFsMC4zMzU1MTQgLTAuMzM1NTE0IDAuNDQ3MzY1IDAuNDQ3MzY1IDAuMjIzNzAxIC0wLjIyMzcwMSAtMC40NDczNjUgLTAuNDQ3MzY1IDAuMzM1NTE0IC0wLjMzNTUxNCAtMC44OTQ3MyAwIDAgMC44OTQ3M3oiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDojRkVGRUZFO2ZpbGwtb3BhY2l0eTowLjEwMTk2MX0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIzNjM4MTQ0Ij4NCiAgIDxwYXRoIGlkPSJfMTIzNjM4MzYwIiBjbGFzcz0iZmlsMCIgZD0iTTYuNzczNSAzLjk3OWwwIC0zLjQ0MjQ1YzAsLTAuMjk1MTE5IC0wLjI0MTQzMywtMC41MzY1NTIgLTAuNTM2NTUyLC0wLjUzNjU1MmwtNi4yMzY5NSAwIDAgNC41MTU1NSA2LjIzNjk1IDBjMC4yOTUxMTksMCAwLjUzNjU1MiwtMC4yNDE0MzMgMC41MzY1NTIsLTAuNTM2NTUyeiIvPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgxMjAiIGNsYXNzPSJmaWwxIiBkPSJNMy4xODc1IDEuMjMwMjFsLTAuMzM1NTUyIDAuMzM1NTE0IC0wLjQ0NzM2NSAtMC40NDczNjUgLTAuMjIzNjY0IDAuMjIzNjY0IDAuNDQ3MzY1IDAuNDQ3MzY1IC0wLjMzNTUxNCAwLjMzNTU1MiAwLjg5NDczIDAgMCAtMC44OTQ3M3ptMC4yNjU2NDEgMi4wNTUxbDAuMzM1NTE0IC0wLjMzNTUxNCAwLjQ0NzM2NSAwLjQ0NzM2NSAwLjIyMzcwMSAtMC4yMjM3MDEgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAwLjMzNTUxNCAtMC4zMzU1MTQgLTAuODk0NzMgMCAwIDAuODk0NzN6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDojRkVGRUZFO2ZpbGwtb3BhY2l0eTowLjA1MDk4MH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIzNjM4MTQ0Ij4NCiAgIDxwYXRoIGlkPSJfMTIzNjM4MzYwIiBjbGFzcz0iZmlsMCIgZD0iTTYuNzczNSAzLjk3OWwwIC0zLjQ0MjQ1YzAsLTAuMjk1MTE5IC0wLjI0MTQzMywtMC41MzY1NTIgLTAuNTM2NTUyLC0wLjUzNjU1MmwtNi4yMzY5NSAwIDAgNC41MTU1NSA2LjIzNjk1IDBjMC4yOTUxMTksMCAwLjUzNjU1MiwtMC4yNDE0MzMgMC41MzY1NTIsLTAuNTM2NTUyeiIvPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgxMjAiIGNsYXNzPSJmaWwxIiBkPSJNMy4xODc1IDEuMjMwMjFsLTAuMzM1NTUyIDAuMzM1NTE0IC0wLjQ0NzM2NSAtMC40NDczNjUgLTAuMjIzNjY0IDAuMjIzNjY0IDAuNDQ3MzY1IDAuNDQ3MzY1IC0wLjMzNTUxNCAwLjMzNTU1MiAwLjg5NDczIDAgMCAtMC44OTQ3M3ptMC4yNjU2NDEgMi4wNTUxbDAuMzM1NTE0IC0wLjMzNTUxNCAwLjQ0NzM2NSAwLjQ0NzM2NSAwLjIyMzcwMSAtMC4yMjM3MDEgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAwLjMzNTUxNCAtMC4zMzU1MTQgLTAuODk0NzMgMCAwIDAuODk0NzN6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACHDwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKNWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAASMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEoqGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAGeIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gzSZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25qbc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9CvjcM4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjKuLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqxOPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIWiAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFVSAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAyrA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYghUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7rh2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SEdJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3JaSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQtlHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJy5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hopb2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsyu21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCccNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527PYS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOwEaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6sfaznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy+rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVsS1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9UxlfeqXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/wjowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9Vt1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503rm10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7Pnl/eriQvLDwG/eE8/s6uL5TAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAAGnRFWHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS4xMDD0cqEAAABfSURBVChTY/j//z8DMZgoRSCD4ApLK6rYgLgDiJ9CMYjNBrMNWWHnvAUL/3/4+BGMQWygwk5sCp+CFMDAhw8fQAqfYlcIlCRGYeeceQv+g0wCYRAbl9XEeYZQWBIdjgCVaiC8JN1udgAAAABJRU5ErkJggg== data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAACuSURBVHicY/n//z8DCLh7+/sAqWIgNmGAgDNA3Ltz68YtIA4LVFELkKpmQAUOIAyUawUqrmEBMnyxKEIG1UA1J0EmFsFELC3MGfJzssDsSVOnMxw7fgImVQRSaAzjgRQJCgqA2XnZmcgKjVnwWIkCWKC+cwRxJk6eypCfm80AYyOBMyCF/TCFx0+eAmMsoJ8F6PXNoCBgwO1zUPBsBrsRFE5AxSCXFzKgBng/LMABrBM9cyiwScIAAAAASUVORK5CYII= data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAZCAYAAABtnU33AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAETSURBVHic7ZgxCsJAFAUXSaeIpScQDyCCguA5rEUQEbWzsvACKhICaquHUQu18hxi6vgebCSgwSb5C2sGhpBkIX+aZIkTBIHS1OAI1mFR2cEDHuEKnnnB0TeGcAlzZuZKjTKswA4cwzWDW8rO2ChsY+OFwVNld2wIG6cMbpqeRJAmg0umpxCk5PxeYxdZsO1kwbaTBdvOXwb7MG96ECF8Bt9gw/QkQlwZ7Kr/CXYZvIdt2DU7S+rs4CF8afXgCU5g1dhI6XCHC7jlSRjM/zwbbUGbJDPY/7HGg/OEn/vUvvn2WfpYlAADfYyL9vSaIOZ+Ykh9hxkSFy0WSyQ3Ht+iRWOJ9E4rGq2UcCwxsbWMRovGkhc6FTEV3QXLmAAAAABJRU5ErkJggg== data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAElJREFUSEvt0qERAEAIA0H6b5rXL1ecI5qQOcIsanB+3TC5egZOyJm9B2Zgw0EnF+AeekPC+S3tGTjhoJMLcA+9IeG89+6L04QHtFKarLFAHLUAAAAASUVORK5CYII= data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAFBJREFUSEvtkjEKADAIA/PpQunnWzo63nBbBDdjOGPWPpd0yPCf5YLo5TNgB52Z54AZsKDQygVwDr5A4RxLfQbsUGjlAjgHX6Bw9r394KjDAzeSX574b7LUAAAAAElFTkSuQmCC data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAyMCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik03LjE3MDI1IDMuMDkxODJDOC4wNzEzMiAyLjY5OTkyIDkuMDMyNDkgMi41IDEwIDIuNUMxMC45Njc1IDIuNSAxMS45Mjg3IDIuNjk5OTIgMTIuODI5NyAzLjA5MTgyQzEzLjczMTIgMy40ODM4NyAxNC41NTgzIDQuMDYyMDIgMTUuMjYwNyA0Ljc5OTUyQzE1Ljk2MzQgNS41MzcyOCAxNi41MjY4IDYuNDE5NjcgMTYuOTEzMiA3LjM5OTI0QzE3LjI5OTcgOC4zNzg5NyAxNy41IDkuNDMyOTUgMTcuNSAxMC41SDIwQzIwIDkuMTIxMTIgMTkuNzQxMyA3Ljc1NTc0IDE5LjIzODggNi40ODE4MkMxOC43MzYyIDUuMjA3OSAxNy45OTk2IDQuMDUwMzkgMTcuMDcxMSAzLjA3NTM4QzE2LjE0MjUgMi4xMDAzNiAxNS4wNDAxIDEuMzI2OTQgMTMuODI2OCAwLjc5OTI2NUMxMi42MTM2IDAuMjcxNTg5IDExLjMxMzIgMCAxMCAwQzguNjg2NzggMCA3LjM4NjQyIDAuMjcxNTg5IDYuMTczMTcgMC43OTkyNjVDNC45NTk5MiAxLjMyNjk0IDMuODU3NTIgMi4xMDAzNiAyLjkyODkzIDMuMDc1MzhDMi4wMDAzNSA0LjA1MDM5IDEuMjYzNzUgNS4yMDc5IDAuNzYxMjA0IDYuNDgxODJDMC4yNTg2NTggNy43NTU3NCAwIDkuMTIxMTIgMCAxMC41SDIuNUMyLjUgOS40MzI5NSAyLjcwMDMgOC4zNzg5NyAzLjA4Njc5IDcuMzk5MjRDMy40NzMyMiA2LjQxOTY3IDQuMDM2NjUgNS41MzcyOCA0LjczOTI4IDQuNzk5NTJDNS40NDE2NiA0LjA2MjAyIDYuMjY4ODUgMy40ODM4NyA3LjE3MDI1IDMuMDkxODJaTTEwLjU3MSA3LjU4MzM1QzEwLjY4NDMgNy40OTI4MyAxMC43OTY2IDcuNDA0NSAxMC45MDcxIDcuMzE4ODNDMTEuMzUxNyA2Ljk3NDAzIDExLjc2NTggNi42NzI0MyAxMi4wODY4IDYuNDQ0OTlDMTIuMTcxNyA2LjM4NDgxIDEyLjI1MDEgNi4zMjk4MSAxMi4zMjA5IDYuMjgwNThDMTIuNDkgNi4xNjI5MiAxMi43MTIgNi4yOTExIDEyLjY5NDYgNi40OTYzOEMxMi42ODc0IDYuNTgyMjYgMTIuNjc5IDYuNjc3NjggMTIuNjY5MyA2Ljc4MTM0QzEyLjYzMjkgNy4xNzMwNCAxMi41Nzg3IDcuNjgyNDcgMTIuNTAyNCA4LjIzOTg4QzEyLjQ4MzQgOC4zNzgzNyAxMi40NjMxIDguNTE5ODIgMTIuNDQxMyA4LjY2MzE2QzEyLjI0NjggOS45NDQxNSAxMS45Mzc1IDExLjM3NjIgMTEuNDY0MSAxMi4xOTYyQzExLjA3MzYgMTIuODcyNiAxMC4wMzExIDEzLjY3ODIgOC43MzIwNSAxMi45MjgyQzcuNDMzMDEgMTIuMTc4MiA3LjYwOTQ4IDEwLjg3MjYgOCAxMC4xOTYyQzguNDczMzcgOS4zNzYyNSA5LjU1ODk0IDguMzkyMzEgMTAuNTcxIDcuNTgzMzVaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NzA3MjgiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjMzNjc2NjQiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjkxNDI4IDAuNjkxNDI4LDAuNjkxNDI4IDAuNjkxNDI4LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTcwNzA0IiBjbGFzcz0iZmlsMSIgZD0iTTAuMzQ1NzM2IDAuMTU3MTg4bC0wLjEyNTcyMiAwLjA5NDI2NDkgLTAuMDk0MzAwNiAwIDAgMC4xODg1ODMgMC4wOTQzMDA2IDAgMC4xMjU3MjIgMC4wOTQyNjQ5IDAgLTAuMzc3MTEzem0wLjE1NzExNyAtMi42NzI2N2UtMDA1bDAuMDMxNDMwNiAwIDAgMC4zNzcxNCAtMC4wMzE0MzA2IDAgMCAtMC4zNzcxNHptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjI1MTQwOSAtMC4wMzE0MzA2IDAgMCAtMC4yNTE0MDl6bS0wLjA2Mjg0MzMgMC4wNjI4NjExbDAuMDMxNDMwNiAwIDAgMC4xMjU2ODcgLTAuMDMxNDMwNiAwIDAgLTAuMTI1Njg3eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NjkwMjQiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjE5NjkyNDAiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjQzNjE2IDAuNjQzNjE2LDAuNjQzNjE2IDAuNjQzNjE2LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY5MDAwIiBjbGFzcz0iZmlsMSIgZD0iTTAuMzIxODM3IDAuMTQ2MzAybC0wLjExNzAyOSAwLjA4Nzc0NjYgLTAuMDg3Nzc5NyAwIDAgMC4xNzU1NDMgMC4wODc3Nzk3IDAgMC4xMTcwMjkgMC4wODc3NDY2IDAgLTAuMzUxMDM2em0wLjI3NzkwMSAwLjI1MDcyNmwtMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjA5MzA4NzIgLTAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjAyMDY5MDYgLTAuMDIwNjkwNiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAwLjAyMDY5MDYgLTAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MnoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTggM0MxOS4xMDQ2IDMgMjAgMy44OTU0MyAyMCA1VjE1QzIwIDE2LjEwNDYgMTkuMTA0NiAxNyAxOCAxN0gyQzAuODk1NDMxIDE3IDAgMTYuMTA0NiAwIDE1VjVDMCAzLjg5NTQzIDAuODk1NDMxIDMgMiAzSDE4Wk02LjU4MDA4IDcuMDA0ODhDNS41OTgzIDcuMDA0ODggNC44MjYwMSA3LjMyMDE1IDQuMjYzMTggNy45NTA2OEMzLjcwMDM1IDguNTgxMjIgMy40MTg5NSA5LjQyNTQ1IDMuNDE4OTUgMTAuNDgzNFYxMC42MDRDMy40MTg5NSAxMS43MDQzIDMuNzAyNDcgMTIuNTY2NSA0LjI2OTUzIDEzLjE5MDdDNC44MzY1OSAxMy44MTQ5IDUuNjExIDE0LjEyNyA2LjU5Mjc3IDE0LjEyN0M3LjExNzUyIDE0LjEyNyA3LjU5Njc2IDE0LjAyMDEgOC4wMzA1MiAxMy44MDY0QzguNDY0MjggMTMuNTkyNyA4LjgwNTk5IDEzLjI5MjIgOS4wNTU2NiAxMi45MDVDOS4zMDUzNCAxMi41MTc4IDkuNDMyMjkgMTIuMDkxNSA5LjQzNjUyIDExLjYyNkg3LjcxNjMxQzcuNzA3ODQgMTEuOTM0OSA3LjU5NzgyIDEyLjE4MjUgNy4zODYyMyAxMi4zNjg3QzcuMTc0NjQgMTIuNTU0OSA2Ljg5OTU4IDEyLjY0NzkgNi41NjEwNCAxMi42NDc5QzYuMTIwOTMgMTIuNjQ3OSA1Ljc5Mjk3IDEyLjQ5MzUgNS41NzcxNSAxMi4xODQ2QzUuMzYxMzMgMTEuODc1NiA1LjI1MzQyIDExLjM2NzggNS4yNTM0MiAxMC42NjExVjEwLjQ3MDdDNS4yNTM0MiA5Ljc3MjQ2IDUuMzYyMzkgOS4yNjc4MiA1LjU4MDMyIDguOTU2NzlDNS43OTgyNiA4LjY0NTc1IDYuMTIwOTMgOC40OTAyMyA2LjU0ODM0IDguNDkwMjNDNi44OTUzNSA4LjQ5MDIzIDcuMTc0NjQgOC42MDEzMiA3LjM4NjIzIDguODIzNDlDNy41OTc4MiA5LjA0NTY2IDcuNzA3ODQgOS4zMzQ0NyA3LjcxNjMxIDkuNjg5OTRIOS40MzY1MkM5LjQyODA2IDguODc3NDQgOS4xNjQ2NCA4LjIyNjgxIDguNjQ2MjQgNy43MzgwNEM4LjEyNzg1IDcuMjQ5MjcgNy40MzkxMyA3LjAwNDg4IDYuNTgwMDggNy4wMDQ4OFpNMTMuMzU5NCA3LjAwNDg4QzEyLjM3NzYgNy4wMDQ4OCAxMS42MDUzIDcuMzIwMTUgMTEuMDQyNSA3Ljk1MDY4QzEwLjQ3OTcgOC41ODEyMiAxMC4xOTgyIDkuNDI1NDUgMTAuMTk4MiAxMC40ODM0VjEwLjYwNEMxMC4xOTgyIDExLjcwNDMgMTAuNDgxOCAxMi41NjY1IDExLjA0ODggMTMuMTkwN0MxMS42MTU5IDEzLjgxNDkgMTIuMzkwMyAxNC4xMjcgMTMuMzcyMSAxNC4xMjdDMTMuODk2OCAxNC4xMjcgMTQuMzc2MSAxNC4wMjAxIDE0LjgwOTggMTMuODA2NEMxNS4yNDM2IDEzLjU5MjcgMTUuNTg1MyAxMy4yOTIyIDE1LjgzNSAxMi45MDVDMTYuMDg0NiAxMi41MTc4IDE2LjIxMTYgMTIuMDkxNSAxNi4yMTU4IDExLjYyNkgxNC40OTU2QzE0LjQ4NzEgMTEuOTM0OSAxNC4zNzcxIDEyLjE4MjUgMTQuMTY1NSAxMi4zNjg3QzEzLjk1MzkgMTIuNTU0OSAxMy42Nzg5IDEyLjY0NzkgMTMuMzQwMyAxMi42NDc5QzEyLjkwMDIgMTIuNjQ3OSAxMi41NzIzIDEyLjQ5MzUgMTIuMzU2NCAxMi4xODQ2QzEyLjE0MDYgMTEuODc1NiAxMi4wMzI3IDExLjM2NzggMTIuMDMyNyAxMC42NjExVjEwLjQ3MDdDMTIuMDMyNyA5Ljc3MjQ2IDEyLjE0MTcgOS4yNjc4MiAxMi4zNTk2IDguOTU2NzlDMTIuNTc3NiA4LjY0NTc1IDEyLjkwMDIgOC40OTAyMyAxMy4zMjc2IDguNDkwMjNDMTMuNjc0NiA4LjQ5MDIzIDEzLjk1MzkgOC42MDEzMiAxNC4xNjU1IDguODIzNDlDMTQuMzc3MSA5LjA0NTY2IDE0LjQ4NzEgOS4zMzQ0NyAxNC40OTU2IDkuNjg5OTRIMTYuMjE1OEMxNi4yMDc0IDguODc3NDQgMTUuOTQzOSA4LjIyNjgxIDE1LjQyNTUgNy43MzgwNEMxNC45MDcxIDcuMjQ5MjcgMTQuMjE4NCA3LjAwNDg4IDEzLjM1OTQgNy4wMDQ4OFoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxwYXRoIGNsYXNzPSJmaWwwIiBkPSJNLTAgMC4yNzExMDFsMCAxLjczOTM1YzAsMC4xNDkxMTMgMC4xMjE5ODgsMC4yNzExMDEgMC4yNzExMDEsMC4yNzExMDFsMy4xNTEzMSAwIDAgLTIuMjgxNTUgLTMuMTUxMzEgMGMtMC4xNDkxMTMsMCAtMC4yNzExMDEsMC4xMjE5ODggLTAuMjcxMTAxLDAuMjcxMTAxeiIvPg0KICA8cG9seWdvbiBjbGFzcz0iZmlsMSIgcG9pbnRzPSIxLjQwOTIsMC42NzEwMzggMi4wODAyOCwxLjE0MDc3IDEuNDA5MiwxLjYxMDUxICIvPg0KIDwvZz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIxOTY2NTUyIj4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NzY4IiBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMzIzOTU2bDAgMi4wNzg0NmMwLDAuMTc4MTg1IDAuMTQ1NzcxLDAuMzIzOTU2IDAuMzIzOTU2LDAuMzIzOTU2bDMuNzY1NzEgMCAwIC0yLjcyNjM4IC0zLjc2NTcxIDBjLTAuMTc4MTg1LDAgLTAuMzIzOTU2LDAuMTQ1NzcxIC0wLjMyMzk1NiwwLjMyMzk1NnoiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NTI4IiBjbGFzcz0iZmlsMSIgZD0iTTEuNjAzOCAwLjg4MjAzOGwwLjMyMDc1MSAwIDAgMC45NjIyNTQgLTAuMzIwNzUxIDAgMCAtMC45NjIyNTR6bTAuNTYxMzMyIDBsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAhCAYAAAAYucG/AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAA+SURBVHicY/H09pViYQACFi4uLgYWbm5uOAHncsG4/Pz8xKv79u0bA8vXr1/hBJz7Dcb9+PEjIXVzZs18BgAgpy6CcHz1VgAAAABJRU5ErkJggg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsLW9wYWNpdHk9IjAiIGQ9Ik01MSw0LjA0MXYyNS45MThDNTEsMzIuMTgyLDQ5LjE4MiwzNCw0Ni45NiwzNEgwVjBoNDYuOTZDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDENCgkJCUw1MSw0LjA0MXoiLz4NCgkJPHBhdGggaWQ9Il8xMjMzNzQxNDQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xOCwxNS43MzdsMi41MjYtMi41MjZsMy4zNjksMy4zNjlsMS42ODQtMS42ODVsLTMuMzY4LTMuMzY4TDI0LjczNiw5aC01LjA1M0gxOHYxLjY4NA0KCQkJVjE1LjczN3ogTTM0LDE4LjI2NGwtMi41MjcsMi41MjVsLTMuMzY4LTMuMzY4bC0xLjY4NSwxLjY4NWwzLjM2OSwzLjM2N0wyNy4yNjMsMjVoNS4wNTNIMzR2LTEuNjg1VjE4LjI2NHoiLz4NCgk8L2c+DQo8L2c+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMTAyIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjRkVGRUZFIiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMDUxIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjOTY5Njk2IiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo= data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTRweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgMTQgMTUiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDU4ICg4NDY2MykgLSBodHRwczovL3NrZXRjaC5jb20gLS0+CiAgICA8dGl0bGU+dGljay1jb21ib2JveDwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJQRC0zNzQ0LeKAlC0yIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNzkwLjAwMDAwMCwgLTQzMS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgaWQ9InRpY2stY29tYm9ib3giIHRyYW5zZm9ybT0idHJhbnNsYXRlKDc4OS4wMDAwMDAsIDQzMC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMy4zNDQ3NjY4LDEuNjU5MzMyNTIgTDUuOCwxMi41ODY3MjE4IEw1LjgsMTIuNTg2NzIxOCBMMi42MDU2MzE3Nyw4LjkzNDE5NjUyIEMyLjM1MzE1MjQxLDguNjQ1NTA0OTMgMS45MTQ0NDY2Nyw4LjYxNjE0OTExIDEuNjI1NzU1MDcsOC44Njg2Mjg0OCBDMS41NzczMDU0Miw4LjkxMTAwMDgyIDEuNTM0OTgxOTMsOC45NTk5MDMyNiAxLjUsOS4wMTM5MzE0OCBDMS4yMDYzNDk0OSw5LjQ2NzQ2MzE2IDEuMjYwMDExMDgsMTAuMDYyODI2MyAxLjYzMDAyNTk4LDEwLjQ1NjU0MDEgTDUuNDc5NzMxMTgsMTQuNTUyODEzNSBDNS42Njg4NDMyLDE0Ljc1NDAzNzkgNS45ODUyNzMzOSwxNC43NjM4NTY5IDYuMTg2NDk3NzcsMTQuNTc0NzQ0OSBDNi4yMTEyMjc0NywxNC41NTE1MDM4IDYuMjMzNTI2NzQsMTQuNTI1ODA1MyA2LjI1MzA1MDY3LDE0LjQ5ODA0NyBMMTQuNTM5MDU1MywyLjcxNzM0NDAzIEMxNC44MDE1Mjc3LDIuMzQ0MTcxNDggMTQuNzQxNjUzNywxLjgzMzM1NzAzIDE0LjQsMS41MzA5OTU4NyBDMTQuMTA2MjM3OCwxLjI3MTAxODMyIDEzLjY1NzM0MywxLjI5ODQwNjIyIDEzLjM5NzM2NTUsMS41OTIxNjg0NCBDMTMuMzc4NTAyNywxLjYxMzQ4MjQgMTMuMzYwOTM4MiwxLjYzNTkxMDg3IDEzLjM0NDc2NjgsMS42NTkzMzI1MiBaIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cG9seWxpbmUgaWQ9IlBhdGgtMiIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjIiIHBvaW50cz0iMiA5LjY1NjUyODE3IDUuODYxNjc5NzcgMTQgMTQgMiI+PC9wb2x5bGluZT4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+ data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjIsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9ItCh0LvQvtC5XzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMzVweCIgaGVpZ2h0PSIzNXB4IiB2aWV3Qm94PSIwIDAgMzUgMzUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDM1IDM1IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMTcuNSwzNUMyNy4xMzksMzUsMzUsMjcuMTM4LDM1LDE3LjVDMzUsNy44NjEsMjcuMTM5LDAsMTcuNSwwDQoJQzcuODYxLDAsMCw3Ljg2MSwwLDE3LjVDMCwyNy4xMzgsNy44NjEsMzUsMTcuNSwzNXoiLz4NCjxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTcuNTAwNSIgeTE9IjIuNjQ5OSIgeDI9IjE3LjUwMDUiIHkyPSIzMi4zNDkiPg0KCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiM1Q0IwRkYiLz4NCgk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMTI5MEZGIi8+DQo8L2xpbmVhckdyYWRpZW50Pg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9InVybCgjU1ZHSURfMV8pIiBkPSJNMTcuNSwzMy45OTljOS4wODgsMCwxNi41LTcuNDEyLDE2LjUtMTYuNDk5DQoJUzI2LjU4NywxLDE3LjUsMUM4LjQxMywxLDEuMDAxLDguNDEzLDEuMDAxLDE3LjVTOC40MTMsMzMuOTk5LDE3LjUsMzMuOTk5eiIvPg0KPHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTE4LjM2OCwyMi41aC0zYy0wLjAwOC0wLjQ2MywwLTAuODk3LDAtMWMwLTEuMDM3LDAuMDU1LTEuODgxLDAuMzk2LTIuNTUNCgljMC4zNDQtMC42NzMsMS4wMzMtMS40MjMsMi4wNjMtMi4yNjRjMS4wMjgtMC44MzUsMS42NDYtMS4zODQsMS44NDMtMS42NDZjMC4zMTMtMC40MDcsMC40NjgtMC44NjIsMC40NjgtMS4zNTQNCgljMC0wLjY4Ni0wLjI3NS0xLjI3My0wLjgyNC0xLjc2NmMtMC41NDktMC40ODktMS4yODUtMC43MzMtMi4yMTUtMC43MzNjLTAuODk2LDAtMS42NDYsMC4yNTctMi4yNTEsMC43NjcNCgljLTAuNjAxLDAuNTEtMS4wMTYsMS4yOTEtMS4yNDMsMi4zMzZsLTMuMjM2LTAuNDAzYzAuMDktMS41LDAuNzI5LTIuNzczLDEuOTEyLTMuODE5QzEzLjQ2Nyw5LjAyMiwxNS4wMTgsOC41LDE2Ljk0OCw4LjUNCgljMi4wMjMsMCwzLjYzNSwwLjUzMSw0LjgzNSwxLjU5YzEuMTk2LDEuMDU5LDEuNzk2LDIuMjg5LDEuNzk2LDMuNjk5YzAsMC43NzYtMC4yMjMsMS41MTQtMC42NiwyLjIwOA0KCWMtMC40NDEsMC42OTQtMS40NjEsMS41NS0yLjgyLDIuODM3QzE4Ljg2OCwyMCwxOC4zNjgsMjAuNSwxOC4zNjgsMjIuNUwxOC4zNjgsMjIuNXogTTE1LjM2OCwyNy40OTl2LTNoM3YzSDE1LjM2OHoiLz4NCjwvc3ZnPg0K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjIsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9ItCh0LvQvtC5XzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMzVweCIgaGVpZ2h0PSIzNXB4IiB2aWV3Qm94PSIwIDAgMzUgMzUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDM1IDM1IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMTcuNSwzNUMyNy4xMzgsMzUsMzUsMjcuMTQsMzUsMTcuNUMzNSw3Ljg2MiwyNy4xMzgsMCwxNy41LDANCglDNy44NjEsMCwwLDcuODYyLDAsMTcuNUMwLDI3LjE0LDcuODYxLDM1LDE3LjUsMzV6Ii8+DQo8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE3LjQ5OTUiIHkxPSIyLjY1MDQiIHgyPSIxNy40OTk1IiB5Mj0iMzIuMzUwNCI+DQoJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGODI1QyIvPg0KCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRjREMTIiLz4NCjwvbGluZWFyR3JhZGllbnQ+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0idXJsKCNTVkdJRF8xXykiIGQ9Ik0xNy41LDM0YzkuMDg3LDAsMTYuNS03LjQxMiwxNi41LTE2LjUNCgljMC05LjA4OC03LjQxMi0xNi41LTE2LjUtMTYuNVMxLDguNDEzLDEsMTcuNUMxLDI2LjU4OCw4LjQxMiwzNCwxNy41LDM0eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xNS41LDkuMDAxYzAtMiwzLjk5OS0yLDMuOTk5LDBMMTguOTk5LDIxDQoJYy0wLjA2MSwxLjQ5OC0yLjkzNywxLjUtMywwTDE1LjUsOS4wMDF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTE3LjUsMjhjMS4xMDIsMCwyLTAuODk3LDItMmMwLTEuMTAyLTAuODk3LTItMi0yDQoJYy0xLjEwMiwwLTEuOTk5LDAuODk4LTEuOTk5LDJDMTUuNSwyNy4xMDMsMTYuMzk4LDI4LDE3LjUsMjh6Ii8+DQo8L3N2Zz4NCg== data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTNweCIgaGVpZ2h0PSIyMXB4IiB2aWV3Qm94PSIwIDAgMTMgMjEiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5CYWNrLUFycm93PC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9ImlQaG9uZS1YLUNvdXJzZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyLjAwMDAwMCwgLTU2LjAwMDAwMCkiIGZpbGw9IiMzREEwRTEiPgogICAgICAgICAgICA8cGF0aCBkPSJNMjEuOTA2MzgyOCw1Ni45ODk5NDk1IEwxMiw2Ni41IEwyMS45MDYzODI4LDc2LjAxMDA1MDUgQzIyLjQ4MjU4NSw3Ni41NjMyMDAyIDIzLjM5MjU5Miw3Ni41NjMyMDAyIDIzLjk2ODc5NDMsNzYuMDEwMDUwNSBMMjMuOTY4Nzk0Myw3Ni4wMTAwNTA1IEMyNC41MTU1MjgzLDc1LjQ4NTE5MDEgMjQuNTMzMjYwMyw3NC42MTY0OTEyIDI0LjAwODM5OTksNzQuMDY5NzU3MiBDMjMuOTk1NDY4OSw3NC4wNTYyODcyIDIzLjk4MjI2NDIsNzQuMDQzMDgyNiAyMy45Njg3OTQzLDc0LjAzMDE1MTUgTDE2LjEyNDgyMjksNjYuNSBMMjMuOTY4Nzk0Myw1OC45Njk4NDg1IEMyNC41MTU1MjgzLDU4LjQ0NDk4ODEgMjQuNTMzMjYwMyw1Ny41NzYyODkyIDI0LjAwODM5OTksNTcuMDI5NTU1MiBDMjMuOTk1NDY4OSw1Ny4wMTYwODUyIDIzLjk4MjI2NDIsNTcuMDAyODgwNiAyMy45Njg3OTQzLDU2Ljk4OTk0OTUgTDIzLjk2ODc5NDMsNTYuOTg5OTQ5NSBDMjMuMzkyNTkyLDU2LjQzNjc5OTggMjIuNDgyNTg1LDU2LjQzNjc5OTggMjEuOTA2MzgyOCw1Ni45ODk5NDk1IFoiIGlkPSJCYWNrLUFycm93Ij48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4= data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPgo8cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHJ4PSI2IiBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIwLjciLz4KPGcgb3BhY2l0eT0iMC44Ij4KPHBhdGggZD0iTTUzLjUgMjVINTJDNTEuNjAyMiAyNSA1MS4yMjA2IDI1LjE1OCA1MC45MzkzIDI1LjQzOTNDNTAuNjU4IDI1LjcyMDYgNTAuNSAyNi4xMDIyIDUwLjUgMjYuNUM1MC41IDI2Ljg5NzggNTAuNjU4IDI3LjI3OTQgNTAuOTM5MyAyNy41NjA3QzUxLjIyMDYgMjcuODQyIDUxLjYwMjIgMjggNTIgMjhINTMuNUM1My44OTc4IDI4IDU0LjI3OTQgMjguMTU4IDU0LjU2MDcgMjguNDM5M0M1NC44NDIgMjguNzIwNiA1NSAyOS4xMDIyIDU1IDI5LjVWNDEuNTM3NUM1My43MDkzIDQwLjU0NTMgNTIuMTI4IDQwLjAwNSA1MC41IDQwQzQ5LjI3MTcgNDAuMDAwNiA0OC4wNjI0IDQwLjMwMjkgNDYuOTc4MyA0MC44ODAzQzQ1Ljg5NDIgNDEuNDU3NiA0NC45Njg1IDQyLjI5MjQgNDQuMjgyNSA0My4zMTEzQzQzLjcyNjEgNDIuNzM4NCA0My4wNjAzIDQyLjI4MjkgNDIuMzI0OCA0MS45NzE5QzQxLjU4OTIgNDEuNjYwOSA0MC43OTg2IDQxLjUwMDcgNDAgNDEuNTAwN0MzOS4yMDE0IDQxLjUwMDcgMzguNDEwOCA0MS42NjA5IDM3LjY3NTIgNDEuOTcxOUMzNi45Mzk3IDQyLjI4MjkgMzYuMjczOSA0Mi43Mzg0IDM1LjcxNzUgNDMuMzExM0MzNS4wMzE1IDQyLjI5MjQgMzQuMTA1OCA0MS40NTc2IDMzLjAyMTcgNDAuODgwM0MzMS45Mzc2IDQwLjMwMjkgMzAuNzI4MyA0MC4wMDA2IDI5LjUgNDBDMjcuODcyIDQwLjAwNSAyNi4yOTA3IDQwLjU0NTMgMjUgNDEuNTM3NVYyOS41QzI1IDI5LjEwMjIgMjUuMTU4IDI4LjcyMDYgMjUuNDM5MyAyOC40MzkzQzI1LjcyMDYgMjguMTU4IDI2LjEwMjIgMjggMjYuNSAyOEgyOEMyOC4zOTc4IDI4IDI4Ljc3OTQgMjcuODQyIDI5LjA2MDcgMjcuNTYwN0MyOS4zNDIgMjcuMjc5NCAyOS41IDI2Ljg5NzggMjkuNSAyNi41QzI5LjUgMjYuMTAyMiAyOS4zNDIgMjUuNzIwNiAyOS4wNjA3IDI1LjQzOTNDMjguNzc5NCAyNS4xNTggMjguMzk3OCAyNSAyOCAyNUgyNi41QzI1LjMwNjUgMjUgMjQuMTYxOSAyNS40NzQxIDIzLjMxOCAyNi4zMThDMjIuNDc0MSAyNy4xNjE5IDIyIDI4LjMwNjUgMjIgMjkuNVY0Ny41QzIyIDQ5LjQ4OTEgMjIuNzkwMiA1MS4zOTY4IDI0LjE5NjcgNTIuODAzM0MyNS42MDMyIDU0LjIwOTggMjcuNTEwOSA1NSAyOS41IDU1QzMxLjQ4OTEgNTUgMzMuMzk2OCA1NC4yMDk4IDM0LjgwMzMgNTIuODAzM0MzNi4yMDk4IDUxLjM5NjggMzcgNDkuNDg5MSAzNyA0Ny41QzM3IDQ2LjcwNDQgMzcuMzE2MSA0NS45NDEzIDM3Ljg3ODcgNDUuMzc4N0MzOC40NDEzIDQ0LjgxNjEgMzkuMjA0NCA0NC41IDQwIDQ0LjVDNDAuNzk1NiA0NC41IDQxLjU1ODcgNDQuODE2MSA0Mi4xMjEzIDQ1LjM3ODdDNDIuNjgzOSA0NS45NDEzIDQzIDQ2LjcwNDQgNDMgNDcuNUM0MyA0OS40ODkxIDQzLjc5MDIgNTEuMzk2OCA0NS4xOTY3IDUyLjgwMzNDNDYuNjAzMiA1NC4yMDk4IDQ4LjUxMDkgNTUgNTAuNSA1NUM1Mi40ODkxIDU1IDU0LjM5NjggNTQuMjA5OCA1NS44MDMzIDUyLjgwMzNDNTcuMjA5OCA1MS4zOTY4IDU4IDQ5LjQ4OTEgNTggNDcuNVYyOS41QzU4IDI4LjMwNjUgNTcuNTI1OSAyNy4xNjE5IDU2LjY4MiAyNi4zMThDNTUuODM4MSAyNS40NzQxIDU0LjY5MzUgMjUgNTMuNSAyNVpNMjkuNSA1MkMyOC42MSA1MiAyNy43NCA1MS43MzYxIDI2Ljk5OTkgNTEuMjQxNkMyNi4yNTk5IDUwLjc0NzEgMjUuNjgzMSA1MC4wNDQzIDI1LjM0MjUgNDkuMjIyMUMyNS4wMDE5IDQ4LjM5OTggMjQuOTEyOCA0Ny40OTUgMjUuMDg2NSA0Ni42MjIxQzI1LjI2MDEgNDUuNzQ5MiAyNS42ODg3IDQ0Ljk0NzQgMjYuMzE4IDQ0LjMxOEMyNi45NDc0IDQzLjY4ODcgMjcuNzQ5MiA0My4yNjAxIDI4LjYyMjEgNDMuMDg2NUMyOS40OTUgNDIuOTEyOCAzMC4zOTk4IDQzLjAwMTkgMzEuMjIyMSA0My4zNDI1QzMyLjA0NDMgNDMuNjgzMSAzMi43NDcxIDQ0LjI1OTkgMzMuMjQxNiA0NC45OTk5QzMzLjczNjEgNDUuNzQgMzQgNDYuNjEgMzQgNDcuNUMzNCA0OC42OTM1IDMzLjUyNTkgNDkuODM4MSAzMi42ODIgNTAuNjgyQzMxLjgzODEgNTEuNTI1OSAzMC42OTM1IDUyIDI5LjUgNTJaTTUwLjUgNTJDNDkuNjEgNTIgNDguNzQgNTEuNzM2MSA0Ny45OTk5IDUxLjI0MTZDNDcuMjU5OSA1MC43NDcxIDQ2LjY4MzEgNTAuMDQ0MyA0Ni4zNDI1IDQ5LjIyMjFDNDYuMDAxOSA0OC4zOTk4IDQ1LjkxMjggNDcuNDk1IDQ2LjA4NjUgNDYuNjIyMUM0Ni4yNjAxIDQ1Ljc0OTIgNDYuNjg4NyA0NC45NDc0IDQ3LjMxOCA0NC4zMThDNDcuOTQ3NCA0My42ODg3IDQ4Ljc0OTIgNDMuMjYwMSA0OS42MjIxIDQzLjA4NjVDNTAuNDk1IDQyLjkxMjggNTEuMzk5OCA0My4wMDE5IDUyLjIyMjEgNDMuMzQyNUM1My4wNDQzIDQzLjY4MzEgNTMuNzQ3MSA0NC4yNTk5IDU0LjI0MTYgNDQuOTk5OUM1NC43MzYxIDQ1Ljc0IDU1IDQ2LjYxIDU1IDQ3LjVDNTUgNDguNjkzNSA1NC41MjU5IDQ5LjgzODEgNTMuNjgyIDUwLjY4MkM1Mi44MzgxIDUxLjUyNTkgNTEuNjkzNSA1MiA1MC41IDUyWiIgZmlsbD0id2hpdGUiLz4KPC9nPgo8L2c+CjxkZWZzPgo8ZmlsdGVyIGlkPSJmaWx0ZXIwX2QiIHg9IjAiIHk9IjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSI4MCIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgo8ZmVDb2xvck1hdHJpeCBpbj0iU291cmNlQWxwaGEiIHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMCIvPgo8ZmVPZmZzZXQvPgo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0Ii8+CjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwLjI1IDAiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3ciLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3ciIHJlc3VsdD0ic2hhcGUiLz4KPC9maWx0ZXI+CjwvZGVmcz4KPC9zdmc+Cg== data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPgo8cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHJ4PSI2IiBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIwLjgiLz4KPHBhdGggZD0iTTUzLjUgMjVINTJDNTEuNjAyMiAyNSA1MS4yMjA2IDI1LjE1OCA1MC45MzkzIDI1LjQzOTNDNTAuNjU4IDI1LjcyMDYgNTAuNSAyNi4xMDIyIDUwLjUgMjYuNUM1MC41IDI2Ljg5NzggNTAuNjU4IDI3LjI3OTQgNTAuOTM5MyAyNy41NjA3QzUxLjIyMDYgMjcuODQyIDUxLjYwMjIgMjggNTIgMjhINTMuNUM1My44OTc4IDI4IDU0LjI3OTQgMjguMTU4IDU0LjU2MDcgMjguNDM5M0M1NC44NDIgMjguNzIwNiA1NSAyOS4xMDIyIDU1IDI5LjVWNDEuNTM3NUM1My43MDkzIDQwLjU0NTMgNTIuMTI4IDQwLjAwNSA1MC41IDQwQzQ5LjI3MTcgNDAuMDAwNiA0OC4wNjI0IDQwLjMwMjkgNDYuOTc4MyA0MC44ODAzQzQ1Ljg5NDIgNDEuNDU3NiA0NC45Njg1IDQyLjI5MjQgNDQuMjgyNSA0My4zMTEzQzQzLjcyNjEgNDIuNzM4NCA0My4wNjAzIDQyLjI4MjkgNDIuMzI0OCA0MS45NzE5QzQxLjU4OTIgNDEuNjYwOSA0MC43OTg2IDQxLjUwMDcgNDAgNDEuNTAwN0MzOS4yMDE0IDQxLjUwMDcgMzguNDEwOCA0MS42NjA5IDM3LjY3NTIgNDEuOTcxOUMzNi45Mzk3IDQyLjI4MjkgMzYuMjczOSA0Mi43Mzg0IDM1LjcxNzUgNDMuMzExM0MzNS4wMzE1IDQyLjI5MjQgMzQuMTA1OCA0MS40NTc2IDMzLjAyMTcgNDAuODgwM0MzMS45Mzc2IDQwLjMwMjkgMzAuNzI4MyA0MC4wMDA2IDI5LjUgNDBDMjcuODcyIDQwLjAwNSAyNi4yOTA3IDQwLjU0NTMgMjUgNDEuNTM3NVYyOS41QzI1IDI5LjEwMjIgMjUuMTU4IDI4LjcyMDYgMjUuNDM5MyAyOC40MzkzQzI1LjcyMDYgMjguMTU4IDI2LjEwMjIgMjggMjYuNSAyOEgyOEMyOC4zOTc4IDI4IDI4Ljc3OTQgMjcuODQyIDI5LjA2MDcgMjcuNTYwN0MyOS4zNDIgMjcuMjc5NCAyOS41IDI2Ljg5NzggMjkuNSAyNi41QzI5LjUgMjYuMTAyMiAyOS4zNDIgMjUuNzIwNiAyOS4wNjA3IDI1LjQzOTNDMjguNzc5NCAyNS4xNTggMjguMzk3OCAyNSAyOCAyNUgyNi41QzI1LjMwNjUgMjUgMjQuMTYxOSAyNS40NzQxIDIzLjMxOCAyNi4zMThDMjIuNDc0MSAyNy4xNjE5IDIyIDI4LjMwNjUgMjIgMjkuNVY0Ny41QzIyIDQ5LjQ4OTEgMjIuNzkwMiA1MS4zOTY4IDI0LjE5NjcgNTIuODAzM0MyNS42MDMyIDU0LjIwOTggMjcuNTEwOSA1NSAyOS41IDU1QzMxLjQ4OTEgNTUgMzMuMzk2OCA1NC4yMDk4IDM0LjgwMzMgNTIuODAzM0MzNi4yMDk4IDUxLjM5NjggMzcgNDkuNDg5MSAzNyA0Ny41QzM3IDQ2LjcwNDQgMzcuMzE2MSA0NS45NDEzIDM3Ljg3ODcgNDUuMzc4N0MzOC40NDEzIDQ0LjgxNjEgMzkuMjA0NCA0NC41IDQwIDQ0LjVDNDAuNzk1NiA0NC41IDQxLjU1ODcgNDQuODE2MSA0Mi4xMjEzIDQ1LjM3ODdDNDIuNjgzOSA0NS45NDEzIDQzIDQ2LjcwNDQgNDMgNDcuNUM0MyA0OS40ODkxIDQzLjc5MDIgNTEuMzk2OCA0NS4xOTY3IDUyLjgwMzNDNDYuNjAzMiA1NC4yMDk4IDQ4LjUxMDkgNTUgNTAuNSA1NUM1Mi40ODkxIDU1IDU0LjM5NjggNTQuMjA5OCA1NS44MDMzIDUyLjgwMzNDNTcuMjA5OCA1MS4zOTY4IDU4IDQ5LjQ4OTEgNTggNDcuNVYyOS41QzU4IDI4LjMwNjUgNTcuNTI1OSAyNy4xNjE5IDU2LjY4MiAyNi4zMThDNTUuODM4MSAyNS40NzQxIDU0LjY5MzUgMjUgNTMuNSAyNVpNMjkuNSA1MkMyOC42MSA1MiAyNy43NCA1MS43MzYxIDI2Ljk5OTkgNTEuMjQxNkMyNi4yNTk5IDUwLjc0NzEgMjUuNjgzMSA1MC4wNDQzIDI1LjM0MjUgNDkuMjIyMUMyNS4wMDE5IDQ4LjM5OTggMjQuOTEyOCA0Ny40OTUgMjUuMDg2NSA0Ni42MjIxQzI1LjI2MDEgNDUuNzQ5MiAyNS42ODg3IDQ0Ljk0NzQgMjYuMzE4IDQ0LjMxOEMyNi45NDc0IDQzLjY4ODcgMjcuNzQ5MiA0My4yNjAxIDI4LjYyMjEgNDMuMDg2NUMyOS40OTUgNDIuOTEyOCAzMC4zOTk4IDQzLjAwMTkgMzEuMjIyMSA0My4zNDI1QzMyLjA0NDMgNDMuNjgzMSAzMi43NDcxIDQ0LjI1OTkgMzMuMjQxNiA0NC45OTk5QzMzLjczNjEgNDUuNzQgMzQgNDYuNjEgMzQgNDcuNUMzNCA0OC42OTM1IDMzLjUyNTkgNDkuODM4MSAzMi42ODIgNTAuNjgyQzMxLjgzODEgNTEuNTI1OSAzMC42OTM1IDUyIDI5LjUgNTJaTTUwLjUgNTJDNDkuNjEgNTIgNDguNzQgNTEuNzM2MSA0Ny45OTk5IDUxLjI0MTZDNDcuMjU5OSA1MC43NDcxIDQ2LjY4MzEgNTAuMDQ0MyA0Ni4zNDI1IDQ5LjIyMjFDNDYuMDAxOSA0OC4zOTk4IDQ1LjkxMjggNDcuNDk1IDQ2LjA4NjUgNDYuNjIyMUM0Ni4yNjAxIDQ1Ljc0OTIgNDYuNjg4NyA0NC45NDc0IDQ3LjMxOCA0NC4zMThDNDcuOTQ3NCA0My42ODg3IDQ4Ljc0OTIgNDMuMjYwMSA0OS42MjIxIDQzLjA4NjVDNTAuNDk1IDQyLjkxMjggNTEuMzk5OCA0My4wMDE5IDUyLjIyMjEgNDMuMzQyNUM1My4wNDQzIDQzLjY4MzEgNTMuNzQ3MSA0NC4yNTk5IDU0LjI0MTYgNDQuOTk5OUM1NC43MzYxIDQ1Ljc0IDU1IDQ2LjYxIDU1IDQ3LjVDNTUgNDguNjkzNSA1NC41MjU5IDQ5LjgzODEgNTMuNjgyIDUwLjY4MkM1Mi44MzgxIDUxLjUyNTkgNTEuNjkzNSA1MiA1MC41IDUyWiIgZmlsbD0id2hpdGUiLz4KPC9nPgo8ZGVmcz4KPGZpbHRlciBpZD0iZmlsdGVyMF9kIiB4PSIwIiB5PSIwIiB3aWR0aD0iODAiIGhlaWdodD0iODAiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLz4KPGZlT2Zmc2V0Lz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIvPgo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4yNSAwIi8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93Ii8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9kcm9wU2hhZG93IiByZXN1bHQ9InNoYXBlIi8+CjwvZmlsdGVyPgo8L2RlZnM+Cjwvc3ZnPgo= data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iNiIgZmlsbD0iYmxhY2siIGZpbGwtb3BhY2l0eT0iMC44Ii8+CjxwYXRoIGQ9Ik00NS41IDE3SDQ0QzQzLjYwMjIgMTcgNDMuMjIwNiAxNy4xNTggNDIuOTM5MyAxNy40MzkzQzQyLjY1OCAxNy43MjA2IDQyLjUgMTguMTAyMiA0Mi41IDE4LjVDNDIuNSAxOC44OTc4IDQyLjY1OCAxOS4yNzk0IDQyLjkzOTMgMTkuNTYwN0M0My4yMjA2IDE5Ljg0MiA0My42MDIyIDIwIDQ0IDIwSDQ1LjVDNDUuODk3OCAyMCA0Ni4yNzk0IDIwLjE1OCA0Ni41NjA3IDIwLjQzOTNDNDYuODQyIDIwLjcyMDYgNDcgMjEuMTAyMiA0NyAyMS41VjMzLjUzNzVDNDUuNzA5MyAzMi41NDUzIDQ0LjEyOCAzMi4wMDUgNDIuNSAzMkM0MS4yNzE3IDMyLjAwMDYgNDAuMDYyNCAzMi4zMDI5IDM4Ljk3ODMgMzIuODgwM0MzNy44OTQyIDMzLjQ1NzYgMzYuOTY4NSAzNC4yOTI0IDM2LjI4MjUgMzUuMzExM0MzNS43MjYxIDM0LjczODQgMzUuMDYwMyAzNC4yODI5IDM0LjMyNDggMzMuOTcxOUMzMy41ODkyIDMzLjY2MDkgMzIuNzk4NiAzMy41MDA3IDMyIDMzLjUwMDdDMzEuMjAxNCAzMy41MDA3IDMwLjQxMDggMzMuNjYwOSAyOS42NzUyIDMzLjk3MTlDMjguOTM5NyAzNC4yODI5IDI4LjI3MzkgMzQuNzM4NCAyNy43MTc1IDM1LjMxMTNDMjcuMDMxNSAzNC4yOTI0IDI2LjEwNTggMzMuNDU3NiAyNS4wMjE3IDMyLjg4MDNDMjMuOTM3NiAzMi4zMDI5IDIyLjcyODMgMzIuMDAwNiAyMS41IDMyQzE5Ljg3MiAzMi4wMDUgMTguMjkwNyAzMi41NDUzIDE3IDMzLjUzNzVWMjEuNUMxNyAyMS4xMDIyIDE3LjE1OCAyMC43MjA2IDE3LjQzOTMgMjAuNDM5M0MxNy43MjA2IDIwLjE1OCAxOC4xMDIyIDIwIDE4LjUgMjBIMjBDMjAuMzk3OCAyMCAyMC43Nzk0IDE5Ljg0MiAyMS4wNjA3IDE5LjU2MDdDMjEuMzQyIDE5LjI3OTQgMjEuNSAxOC44OTc4IDIxLjUgMTguNUMyMS41IDE4LjEwMjIgMjEuMzQyIDE3LjcyMDYgMjEuMDYwNyAxNy40MzkzQzIwLjc3OTQgMTcuMTU4IDIwLjM5NzggMTcgMjAgMTdIMTguNUMxNy4zMDY1IDE3IDE2LjE2MTkgMTcuNDc0MSAxNS4zMTggMTguMzE4QzE0LjQ3NDEgMTkuMTYxOSAxNCAyMC4zMDY1IDE0IDIxLjVWMzkuNUMxNCA0MS40ODkxIDE0Ljc5MDIgNDMuMzk2OCAxNi4xOTY3IDQ0LjgwMzNDMTcuNjAzMiA0Ni4yMDk4IDE5LjUxMDkgNDcgMjEuNSA0N0MyMy40ODkxIDQ3IDI1LjM5NjggNDYuMjA5OCAyNi44MDMzIDQ0LjgwMzNDMjguMjA5OCA0My4zOTY4IDI5IDQxLjQ4OTEgMjkgMzkuNUMyOSAzOC43MDQ0IDI5LjMxNjEgMzcuOTQxMyAyOS44Nzg3IDM3LjM3ODdDMzAuNDQxMyAzNi44MTYxIDMxLjIwNDQgMzYuNSAzMiAzNi41QzMyLjc5NTYgMzYuNSAzMy41NTg3IDM2LjgxNjEgMzQuMTIxMyAzNy4zNzg3QzM0LjY4MzkgMzcuOTQxMyAzNSAzOC43MDQ0IDM1IDM5LjVDMzUgNDEuNDg5MSAzNS43OTAyIDQzLjM5NjggMzcuMTk2NyA0NC44MDMzQzM4LjYwMzIgNDYuMjA5OCA0MC41MTA5IDQ3IDQyLjUgNDdDNDQuNDg5MSA0NyA0Ni4zOTY4IDQ2LjIwOTggNDcuODAzMyA0NC44MDMzQzQ5LjIwOTggNDMuMzk2OCA1MCA0MS40ODkxIDUwIDM5LjVWMjEuNUM1MCAyMC4zMDY1IDQ5LjUyNTkgMTkuMTYxOSA0OC42ODIgMTguMzE4QzQ3LjgzODEgMTcuNDc0MSA0Ni42OTM1IDE3IDQ1LjUgMTdaTTIxLjUgNDRDMjAuNjEgNDQgMTkuNzQgNDMuNzM2MSAxOC45OTk5IDQzLjI0MTZDMTguMjU5OSA0Mi43NDcxIDE3LjY4MzEgNDIuMDQ0MyAxNy4zNDI1IDQxLjIyMjFDMTcuMDAxOSA0MC4zOTk4IDE2LjkxMjggMzkuNDk1IDE3LjA4NjUgMzguNjIyMUMxNy4yNjAxIDM3Ljc0OTIgMTcuNjg4NyAzNi45NDc0IDE4LjMxOCAzNi4zMThDMTguOTQ3NCAzNS42ODg3IDE5Ljc0OTIgMzUuMjYwMSAyMC42MjIxIDM1LjA4NjVDMjEuNDk1IDM0LjkxMjggMjIuMzk5OCAzNS4wMDE5IDIzLjIyMjEgMzUuMzQyNUMyNC4wNDQzIDM1LjY4MzEgMjQuNzQ3MSAzNi4yNTk5IDI1LjI0MTYgMzYuOTk5OUMyNS43MzYxIDM3Ljc0IDI2IDM4LjYxIDI2IDM5LjVDMjYgNDAuNjkzNSAyNS41MjU5IDQxLjgzODEgMjQuNjgyIDQyLjY4MkMyMy44MzgxIDQzLjUyNTkgMjIuNjkzNSA0NCAyMS41IDQ0Wk00Mi41IDQ0QzQxLjYxIDQ0IDQwLjc0IDQzLjczNjEgMzkuOTk5OSA0My4yNDE2QzM5LjI1OTkgNDIuNzQ3MSAzOC42ODMxIDQyLjA0NDMgMzguMzQyNSA0MS4yMjIxQzM4LjAwMTkgNDAuMzk5OCAzNy45MTI4IDM5LjQ5NSAzOC4wODY1IDM4LjYyMjFDMzguMjYwMSAzNy43NDkyIDM4LjY4ODcgMzYuOTQ3NCAzOS4zMTggMzYuMzE4QzM5Ljk0NzQgMzUuNjg4NyA0MC43NDkyIDM1LjI2MDEgNDEuNjIyMSAzNS4wODY1QzQyLjQ5NSAzNC45MTI4IDQzLjM5OTggMzUuMDAxOSA0NC4yMjIxIDM1LjM0MjVDNDUuMDQ0MyAzNS42ODMxIDQ1Ljc0NzEgMzYuMjU5OSA0Ni4yNDE2IDM2Ljk5OTlDNDYuNzM2MSAzNy43NCA0NyAzOC42MSA0NyAzOS41QzQ3IDQwLjY5MzUgNDYuNTI1OSA0MS44MzgxIDQ1LjY4MiA0Mi42ODJDNDQuODM4MSA0My41MjU5IDQzLjY5MzUgNDQgNDIuNSA0NFoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo=".split(" "); +c=":root {--text-color: __playerText__;--panel-color: __asideBackground__;--button-background-color: __primaryButtonBackground__;--button-text-color: __primaryButtonText__;--button-hover-background-color: __primaryButtonBackgroundHover__;--button-hover-text-color: __primaryButtonTextHover__;--button-border-color: __primaryButtonBorder__;--button-hover-border-color: __primaryButtonBorderHover__;--page-background-color: __pageBackground__;--font-family-bold: nPFnb;--font-family-bold-italic: nPFnbi;--font-family-italic: nPFni;--font-family-normal: nPFn;--font-family-semibold: nPFnsb, nPFn;--font-family-semibold-italic: nPFnsbi, nPFni;--button-border-radius: __borderRadius__;--popup-border: __popupBorder__; }.none {position: absolute; } .none .launch-screen {z-index: 100;position: fixed;top: 0;right: 0;bottom: 0;left: 0;background-color: rgba(0, 0, 0, 0.48); } .none .launch-screen .launch-screen-button {top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 96px;height: 96px;position: absolute; } .none .launch-screen .launch-screen-button__play-icon {background-color: #FFFFFF;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 90px;height: 90px;box-shadow: 0 12px 50px 0 rgba(0, 0, 0, 0.2);transition: 0.3s ease-in-out; } .none .launch-screen .launch-screen-button__icon {background: url("+ +c[0]+") no-repeat center;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 6px;width: 90px;height: 90px; } .none .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__play-icon {width: 96px;height: 96px; } .none .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__icon {background: url("+c[1]+") no-repeat center; } .none .playerView .preloader {width: 50px;height: 50px;position: absolute;top: 0;left: 0;bottom: 0;right: 0;margin: auto;border-radius: 10px;background-color: rgba(0, 0, 0, 0.5); } .none .playerView .preloader::after {content: '';position: absolute;background: url("+ +c[2]+");background-size: cover;top: 0;left: 0;bottom: 0;right: 0;animation: preloader_spin 1s infinite linear; } .none .title-panel {width: 100%;background: var(--panel-color);position: absolute;box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);height: 46px; } .none.none_landscape .title-panel {display: none; }.android_default * {text-rendering: auto !important; }body {margin: 0;padding: 0;overflow: hidden;cursor: default;-ms-touch-action: pan-y;touch-action: pan-y;-webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body .password_form, body .info_panel {position: absolute;background: #F7F7F7;border-radius: 4px;width: 513px;height: 210px;font-family: Arial; } body .password_form *, body .info_panel * {box-sizing: border-box; } body .password_form .password_label {position: absolute;color: #3A3A3A;font-size: 15px;top: 63px;left: 55px; } body .password_form .wrong_password_label {position: absolute;color: #DD4A37;font-size: 12px;top: 131px;left: 55px; } body .password_form input {position: absolute;width: 330px;height: 32px;background: #FFFFFF;border: 1px solid #D1D2D4;padding: 1px;border-radius: 2px;font-size: 18px;color: #231F20;left: 54px;top: 94px;padding-left: 8px; } body .password_form button {border: transparent;background: transparent;color: #343434;font-family: Arial;font-size: 15px;text-shadow: 0 1px 0 rgba(255, 255, 255, 0.4); } body .password_form button::before {background: linear-gradient(to bottom, #D3D3D3, #BABABA);position: absolute;content: '';top: 0;right: 0;bottom: 0;left: 0;border-radius: 4px;z-index: -1; } body .password_form button::after {background: linear-gradient(to bottom, #DCDCDC, #D1D1D1);position: absolute;content: '';top: 1px;right: 1px;bottom: 1px;left: 1px;border-radius: 4px;z-index: -1; } body .password_form .btn_ok {position: absolute;top: 94px;right: 55px;width: 60px;height: 32px;opacity: 0.99; } body .info_panel {display: table; } body .info_panel .label {position: static;display: table-cell;vertical-align: middle;width: 100%;padding-left: 120px;padding-right: 40px;color: #3A3A3A;font-size: 15px; } body .info_panel::after {position: absolute;content: '';width: 63px;height: 63px;top: 73px;left: 46px; } body .info_panel.domain::after {background: transparent url("+ +c[3]+"); } body .info_panel.time::after {background: transparent url("+c[4]+"); }.component_base,.component_container {position: absolute; }:focus {outline: none; }::-moz-focus-inner {border: 0; }input {appearance: none; }button {cursor: pointer;margin: 0;border: 0; }button[disabled] {cursor: default; }.__player_view_id__ {position: absolute; } .__player_view_id__ > * {position: absolute; } .__player_view_id__ .slide {white-space: nowrap;font-size: 0; } .__player_view_id__ .slide a {text-decoration: none;cursor: pointer; } .__player_view_id__ .slide a img {border: 0; } .__player_view_id__ .slide * {-ms-transform-origin: 0 0;transform-origin: 0 0; } .__player_view_id__ .slide.relpos, .__player_view_id__ .slide .relpos {position: relative !important;vertical-align: top; } .__player_view_id__ .slide.kern, .__player_view_id__ .slide .kern {text-rendering: optimizeLegibility;font-feature-settings: 'kern' 1, 'liga' 0; } .__player_view_id__ .slide.nokern, .__player_view_id__ .slide .nokern {text-rendering: optimizeSpeed;font-feature-settings: 'kern' 0, 'liga' 0; } .__player_view_id__ .fullscreen {-ms-transform: none !important;transform: none !important;top: 0 !important;left: 0 !important; } .__player_view_id__ .fullscreen > video, .__player_view_id__ .fullscreen .video_player {background-color: black;width: __slide_width__ !important;height: __slide_height__ !important;z-index: 100;-ms-transform: none !important;transform: none !important; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen {background: url("+ +c[5]+") no-repeat; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen:hover {background: url("+c[6]+") no-repeat; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen:active {background: url("+c[7]+") no-repeat; } .__player_view_id__ .video_player video {width: 100%;height: 100%;margin: auto;top: 0;right: 0;bottom: 0;left: 0; } .__player_view_id__ .video_player video::cue {color: #FFFFFF;background-color: rgba(8, 8, 8, 0.75);border-radius: 4px;font-family: Helvetica, Roboto, Arial, sans-serif;line-height: 1.1; } .__player_view_id__ .video_player.poster_frame_hide_video video {display: none; } .__player_view_id__ .video_player.poster_frame video {opacity: 0; } .__player_view_id__ .video_player.poster_frame_hide_video .poster, .__player_view_id__ .video_player.poster_frame .poster {position: absolute;width: 100%;height: 100%; } .__player_view_id__ .video_player .controls {height: 36px;background: rgba(45, 50, 55, 0.85098);border: 1px solid #444648;cursor: default;border-radius: 4px; } .__player_view_id__ .video_player .controls, .__player_view_id__ .video_player .controls * {backface-visibility: hidden; } .__player_view_id__ .video_player .controls .progress {background-color: #75787A;height: 14px;left: 64px;top: 0;bottom: 0;margin-top: auto;margin-bottom: auto;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark {width: 10px;height: 10px;margin-top: -5px;margin-left: -5px;top: 50%;background: url("+ +c[8]+") no-repeat;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark:hover, .__player_view_id__ .video_player .controls .progress .bookmark:active {background: url("+c[9]+") no-repeat; } .__player_view_id__ .video_player .controls .progress .loading {background-color: #B1B3B5;height: 100%; } .__player_view_id__ .video_player .controls .progress .playing {background-color: #FFFFFF;height: 100%; } .__player_view_id__ .video_player .controls .progress .tooltip {background: url("+ +c[10]+") no-repeat;width: 60px;height: 25px;top: -33px;margin-left: -30px;font-family: Arial;font-size: 12px;padding-top: 2px;text-align: center; } .__player_view_id__ .video_player .controls .volume_popup {border-radius: 3px;background: rgba(45, 50, 55, 0.85098);top: -67px;right: 65px;padding: 8px;box-sizing: border-box;width: 28px;height: 64px; } .__player_view_id__ .video_player .controls .volume_popup .volume {background: url("+c[11]+");position: relative;cursor: pointer;width: 12px;height: 48px; } .__player_view_id__ .video_player .controls .volume_popup .volume .back {background: url("+ +c[12]+");width: 100%; } .__player_view_id__ .video_player .controls button {width: 100%;height: 100%; } .__player_view_id__ .video_player .controls button.rate {background: url("+c[13]+") no-repeat center; } .__player_view_id__ .video_player .controls button.rate.selected {background-color: rgba(255, 255, 255, 0.1); } .__player_view_id__ .video_player .controls button.mute {background: url("+c[14]+"); } .__player_view_id__ .video_player .controls button.mute:hover {background: url("+ +c[15]+"); } .__player_view_id__ .video_player .controls button.mute:active {background: url("+c[16]+"); } .__player_view_id__ .video_player .controls button.mute.selected {background: url("+c[17]+"); } .__player_view_id__ .video_player .controls button.mute.selected:hover {background: url("+c[18]+"); } .__player_view_id__ .video_player .controls button.mute.selected:active {background: url("+c[19]+"); } .__player_view_id__ .video_player .controls button.subtitles {background: url("+ +c[20]+") no-repeat center; } .__player_view_id__ .video_player .controls button.subtitles.selected {background-color: rgba(255, 255, 255, 0.1); } .__player_view_id__ .video_player .controls button.play {background: url("+c[21]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:hover {background: url("+c[22]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:active {background: url("+c[23]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected {background: url("+ +c[24]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:hover {background: url("+c[25]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:active {background: url("+c[26]+") no-repeat; } .__player_view_id__ .video_player .controls button.play::after {background: url("+c[27]+");width: 1px;height: 32px;right: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls button.toggle_fullscreen {background: url("+ +c[28]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:hover {background: url("+c[29]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:active {background: url("+c[30]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen::before {background: url("+c[27]+") no-repeat;width: 1px;height: 32px;left: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls .subtitles-list {width: 195px;right: 0;border-radius: 4px;border: solid 1px #444648;background-color: rgba(45, 50, 55, 0.85);font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;font-weight: normal;font-stretch: normal;font-style: normal;line-height: normal;letter-spacing: normal;padding: 3px 0;bottom: 37px; } .__player_view_id__ .video_player .controls .subtitles-list__caption {position: relative !important;padding: 12px 0 22px 0;color: #b8b8b8;text-align: center; } .__player_view_id__ .video_player .controls .subtitles-list__caption::after {position: absolute;content: '';width: calc(100% - 20px);left: 0;right: 0;bottom: 5px;margin: auto;border-bottom: 1px solid #444648; } .__player_view_id__ .video_player .controls .subtitles-list__item {color: #b8b8b8;position: relative !important;padding: 10px 2px 10px 35px;cursor: pointer;overflow: hidden;text-overflow: ellipsis; } .__player_view_id__ .video_player .controls .subtitles-list__item.subtitles-list__item_active {background-color: rgba(255, 255, 255, 0.1);color: #FFFFFF; } .__player_view_id__ .video_player .controls .subtitles-list__item[aria-selected='true'] {background-color: rgba(0, 0, 0, 0.24);color: #FFFFFF;padding-left: 12px; } .__player_view_id__ .video_player .controls .subtitles-list__item[aria-selected='true']::before {background: url("+ +c[31]+") no-repeat;width: 14px;height: 15px;padding-right: 23px;content: ''; } .__player_view_id__ .video_player .controls .toggle_fullscreen {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .play {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .rate {width: 32px;height: 34px;right: 95px;top: 0; } .__player_view_id__ .video_player .controls .rate.rate_subtitle-button-next {right: 127px; } .__player_view_id__ .video_player .controls .playback-rate-menu {width: 120px;right: 51px;border-radius: 4px;border: solid 1px #444648;background-color: rgba(45, 50, 55, 0.85);font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;font-weight: normal;font-stretch: normal;font-style: normal;line-height: normal;letter-spacing: normal;padding: 3px 0;bottom: 37px; } .__player_view_id__ .video_player .controls .playback-rate-menu.playback-rate-menu_subtitle-button-next {right: 83px; } .__player_view_id__ .video_player .controls .playback-rate-menu__caption {position: relative !important;padding: 12px 0 22px 0;color: #b8b8b8;text-align: center; } .__player_view_id__ .video_player .controls .playback-rate-menu__caption::after {position: absolute;content: '';width: calc(100% - 20px);left: 0;right: 0;bottom: 5px;margin: auto;border-bottom: 1px solid #444648; } .__player_view_id__ .video_player .controls .playback-rate-menu__item {color: #b8b8b8;position: relative !important;padding: 10px 2px 10px 35px;cursor: pointer;overflow: hidden;text-overflow: ellipsis; } .__player_view_id__ .video_player .controls .playback-rate-menu__item.playback-rate-menu__item_active {background-color: rgba(255, 255, 255, 0.1);color: #FFFFFF; } .__player_view_id__ .video_player .controls .playback-rate-menu__item[aria-selected='true'] {background-color: rgba(0, 0, 0, 0.24);color: #FFFFFF;padding-left: 12px; } .__player_view_id__ .video_player .controls .playback-rate-menu__item[aria-selected='true']::before {background: url("+ +c[31]+") no-repeat;width: 14px;height: 15px;padding-right: 23px;content: ''; } .__player_view_id__ .video_player .controls .subtitles {width: 32px;height: 34px;right: 95px;top: 0; } .__player_view_id__ .video_player .controls .toggle_fullscreen {right: -1px; } .__player_view_id__ .video_player .controls .mute {width: 22px;height: 22px;right: 67px;top: 6px; }.popup_layer {position: absolute; } .popup_layer .modal_layer {background: #000000;opacity: 0.4;z-index: 10;width: 100%;height: 100%; } .popup_layer .message_box, .popup_layer .confirm_window {background: #FFFFFF;border-radius: 5px;border: 1px solid rgba(0, 0, 0, 0.75);width: 357px;height: 150px;position: absolute;top: 0;right: 0;bottom: 0;left: 0;margin: auto;z-index: 10; } .popup_layer .message_box::after, .popup_layer .confirm_window::after {background-color: #E6E6E6;width: 100%;height: 1px;top: 30px;position: absolute;content: ''; } .popup_layer .message_box .title, .popup_layer .message_box .message, .popup_layer .confirm_window .title, .popup_layer .confirm_window .message {font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;color: #323232; } .popup_layer .message_box .title, .popup_layer .confirm_window .title {position: absolute;left: 13px;top: 7px;font-weight: bold;background: transparent; } .popup_layer .message_box .message, .popup_layer .confirm_window .message {position: absolute;top: 47px;left: 69px;margin-right: 25px; } .popup_layer .message_box .message::before, .popup_layer .confirm_window .message::before {background-color: #E6E6E6;width: 35px;height: 35px;left: -45px;position: absolute;content: ''; } .popup_layer .message_box button, .popup_layer .confirm_window button {font-size: 14px;border-radius: 5px;color: #323232;width: 68px;height: 30px; } .popup_layer .message_box button, .popup_layer .message_box button.mobile:hover, .popup_layer .message_box button.mobile:active, .popup_layer .confirm_window button, .popup_layer .confirm_window button.mobile:hover, .popup_layer .confirm_window button.mobile:active {background: #D4D4D4; } .popup_layer .message_box button:hover, .popup_layer .message_box button:active, .popup_layer .message_box button.mobile.active, .popup_layer .confirm_window button:hover, .popup_layer .confirm_window button:active, .popup_layer .confirm_window button.mobile.active {background: #B8B8B8; } .popup_layer .confirm_window button.btn_yes {left: 101px;top: 98px; } .popup_layer .confirm_window button.btn_no {left: 181px;top: 98px; } .popup_layer .confirm_window .message::before {background: url("+ +c[32]+"); } .popup_layer .message_box button.btn_ok {left: 141px;top: 98px; } .popup_layer .message_box .message::before {background: url("+c[33]+"); }.transitionSlide.paused * {animation-play-state: paused !important; }.framesLayer .video_player {-ms-transform-origin: 0 0;transform-origin: 0 0; }.framesLayer *:not(.framesLayerContent) {pointer-events: all; }.framesLayer .framesLayerContent {position: absolute; } .framesLayer .framesLayerContent > div {pointer-events: all; }.trial_banner {position: relative;transform: translateZ(0); } .trial_banner .banner-content, .trial_banner .banner-content_hover {position: absolute;left: 0;right: 0;top: 0;bottom: 0;width: 100%;height: 100%; } .trial_banner .banner-content {visibility: visible;z-index: 1; } .trial_banner .banner-content_hover {visibility: hidden;z-index: 0; } .trial_banner .days_remaining {position: absolute;font-family: 'Open Sans', Arial, sans-serif;font-weight: normal;font-size: 13px;left: 65px;top: 41px;color: #7C1645;z-index: 1; } .trial_banner:hover .banner-content {visibility: hidden;z-index: 0; } .trial_banner:hover .banner-content_hover {visibility: visible;z-index: 1; }.back_to_app {height: 100%;position: absolute;left: 0; } .back_to_app__text {color: #3DA0E1;font-size: 16px;font-family: Helvetica Neue, Helvetica, Roboto, Arial;text-overflow: ellipsis;overflow: hidden;position: absolute;bottom: 0;top: 0;height: 24px;line-height: 24px;margin: auto;padding-left: 25px;max-width: 80px; } .back_to_app__text::before {content: '';background: url("+ +c[34]+") no-repeat center;height: 24px;width: 14px;left: 8px;position: absolute; }.popup-layer {top: 0;right: 0;bottom: 0;left: 0;z-index: 1;position: absolute;border-radius: inherit; }.modal-layer {background: #000000;opacity: 0.4;position: absolute;width: 100%;height: 100%;border-radius: inherit; }.uikit-primary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-primary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-primary-button.uikit-primary-button_size_medium {padding: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:first-child {margin-left: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:last-child {margin-right: 10px; } .uikit-primary-button.uikit-primary-button_size_small {padding: 6px 12px; } .uikit-primary-button.uikit-primary-button_size_small .uikit-primary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-primary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__button-text {margin-right: 8px; } .uikit-primary-button__left-icon {margin-right: 8px; } .uikit-primary-button__button-text:first-child {margin-left: 0; } .uikit-primary-button__button-text:last-child {margin-right: 0; } .uikit-primary-button__left-icon:first-child {margin-left: 0; } .uikit-primary-button__left-icon:last-child {margin-right: 0; } .uikit-primary-button__right-icon:first-child {margin-left: 0; } .uikit-primary-button__right-icon:last-child {margin-right: 0; } .uikit-primary-button[disabled] {opacity: 0.4; } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-secondary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-secondary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-secondary-button.uikit-secondary-button_size_medium {padding: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:first-child {margin-left: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:last-child {margin-right: 10px; } .uikit-secondary-button.uikit-secondary-button_size_small {padding: 6px 12px; } .uikit-secondary-button.uikit-secondary-button_size_small .uikit-secondary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-secondary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__button-text {margin-right: 8px; } .uikit-secondary-button__left-icon {margin-right: 8px; } .uikit-secondary-button__button-text:first-child {margin-left: 0; } .uikit-secondary-button__button-text:last-child {margin-right: 0; } .uikit-secondary-button__left-icon:first-child {margin-left: 0; } .uikit-secondary-button__left-icon:last-child {margin-right: 0; } .uikit-secondary-button__right-icon:first-child {margin-left: 0; } .uikit-secondary-button__right-icon:last-child {margin-right: 0; } .uikit-secondary-button[disabled] {opacity: 0.4; } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-link-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-link-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-link-button.uikit-link-button_size_medium {padding: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text {font-size: 17px;line-height: 20px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:first-child {margin-left: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:last-child {margin-right: 10px; } .uikit-link-button.uikit-link-button_size_small {padding: 6px 12px; } .uikit-link-button.uikit-link-button_size_small .uikit-link-button__button-text {font-size: 14px;line-height: 20px; } .uikit-link-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__button-text {margin-right: 8px; } .uikit-link-button__left-icon {margin-right: 8px; } .uikit-link-button__button-text:first-child {margin-left: 0; } .uikit-link-button__button-text:last-child {margin-right: 0; } .uikit-link-button__left-icon:first-child {margin-left: 0; } .uikit-link-button__left-icon:last-child {margin-right: 0; } .uikit-link-button__right-icon:first-child {margin-left: 0; } .uikit-link-button__right-icon:last-child {margin-right: 0; } .uikit-link-button[disabled] {opacity: 0.4; } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-primary-button {background: var(--primary-button-background-color, var(--button-background-color));color: var(--primary-button-text-color, var(--button-text-color)); } .uikit-primary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--primary-button-border-color, var(--button-border-color));background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-primary-button__button-text {font-family: var(--font-family-normal);font-weight: 700; } .uikit-primary-button.uikit-primary-button_active, .uikit-primary-button[aria-pressed='true'], .uikit-primary-button:focus {background: var(--primary-button-background-color-active, var(--button-hover-background-color));color: var(--primary-button-text-color-active, var(--button-hover-text-color)); } .uikit-primary-button.uikit-primary-button_active::after, .uikit-primary-button[aria-pressed='true']::after, .uikit-primary-button:focus::after {background: var(--primary-button-border-color-active, var(--button-hover-border-color));background-origin: border-box; }.message-box {background: var(--panel-color);position: absolute;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;border-radius: 7px;min-width: 280px;padding: 40px;box-shadow: 0 8px 16px rgba(0, 0, 0, 0.08); } .message-box::after {content: '';box-sizing: border-box;border: 1px solid var(--popup-border);width: 100%;height: 100%;position: absolute;left: 0;top: 0;border-radius: 7px;pointer-events: none; } .message-box__content {position: relative;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-direction: column;flex-direction: column; } .message-box__icon {width: 24px;height: 24px;margin-bottom: 24px;position: relative;display: inline-block;color: var(--text-color);opacity: 0.72; } .message-box .message-box-buttons {position: relative;width: 100%;height: 36px; } .message-box .message-box-buttons__buttons {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center; } .message-box .message-box-buttons__window-button {margin: 0 4px; } .message-box .vertical-scrollbar {top: 40px; } .message-box__message-container {overflow: hidden;display: inline-block;max-width: 480px;vertical-align: top;position: relative; } .message-box__message {text-align: center;font-size: 16px;color: var(--text-color);text-overflow: ellipsis;overflow: hidden;position: relative;font-family: var(--font-family-normal); } .message-box__buttons {margin-top: 28px; }.container-top-shadow {background: __verticalGradient(#FFFFFF, rgba(255, 255, 255, 0));background: linear-gradient(to bottom, #FFFFFF, rgba(255, 255, 255, 0));position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; }.container-bottom-shadow {background: __verticalGradient(rgba(255, 255, 255, 0), #FFFFFF);background: linear-gradient(to bottom, rgba(255, 255, 255, 0), #FFFFFF);position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; }.vertical-scrollbar {position: absolute;right: 0;top: 4px;bottom: 4px;width: 14px;transition: opacity 0.2s ease; } .vertical-scrollbar .thumb {position: absolute;width: 8px;right: 3px;padding: 1px;border-radius: 5px; } .vertical-scrollbar .thumb__background {height: 100%;border-radius: 4px;background-color: rgba(0, 0, 0, 0.32);border: 1px solid rgba(255, 255, 255, 0.12); }.vertical-scrollbar {transition: none;opacity: 0.5 !important; }.presentation-view-mode-switch-control {width: 64px;height: 64px;position: fixed;left: 16px;top: 16px;cursor: pointer;border: none;background: url("+ +c[35]+") no-repeat center; } .presentation-view-mode-switch-control:not([disabled]):hover {background: url("+c[36]+") no-repeat center; } .presentation-view-mode-switch-control:not([disabled]):active {background: url("+c[37]+") no-repeat center; } .presentation-view-mode-switch-control:not([disabled]):focus {outline: none; } .presentation-view-mode-switch-control:not([disabled]):focus::before {content: '';position: absolute;top: 3px;bottom: 3px;left: 3px;right: 3px;border: 1px dotted #FFFFFF;opacity: 0.6; }"; +let d;for(const [f,g]of Object.entries(null!=(d=a)?d:{}))a=`__${f.replace(RegExp("\\.","g"),"_")}__`,c=c.replace(new RegExp(a,"g"),g);let e;for(const [f,g]of Object.entries(null!=(e=b)?e:{}))c=c.replace(new RegExp(f,"g"),g);c=c.replace(/__verticalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.rn);c=c.replace(/__horizontalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.pn);return gn(c)}rn(a,b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}pn(a, +b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}};class CG{Uq(a,b){var c=sh("PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMTA2cHgiIGhlaWdodD0iMTM0cHgiIHZpZXdCb3g9IjAgMCAxMDYgMTM0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDYgMTM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGw9Int0ZXh0fSIgZD0iTTUzLDE5Yy0xNi43MDYsMC0zMC4yNSwxNS4yMjctMzAuMjUsMzQuMDMxYzAsMTguNzk0LDEzLjU0NCwzNC4wMzEsMzAuMjUsMzQuMDMxDQoJYzE2LjcxMywwLDMwLjI1LTE1LjIzNywzMC4yNS0zNC4wMzFDODMuMjUsMzQuMjI3LDY5LjcxMywxOSw1MywxOXoiLz4NCjxwYXRoIGZpbGw9Int0ZXh0fSIgZD0iTTc0LjExOSw4OC42MjVjLTYuMjkzLDUuMDUzLTEzLjQ4Niw3Ljk2Mi0yMS4xMjIsNy45NjJjLTcuNjMsMC0xNC44MjMtMi45MDQtMjEuMTIyLTcuOTYyDQoJQzE4LjI4Niw5My45ODQsNy42MjEsMTA2LjY4OCwyLjczOSwxMzRoMTAwLjUyMUM5OC4zNzksMTA2LjY4OCw4Ny43MjMsOTMuOTcxLDc0LjExOSw4OC42MjV6Ii8+DQo8L3N2Zz4NCg=="); +let d;for(const [g,h]of Object.entries(null!=(d=a)?d:{}))c=c.replace(new RegExp(`{${g}}`,"g"),h);c=["data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICB3aWR0aD0iMjhweCIgaGVpZ2h0PSIzM3B4IiB2aWV3Qm94PSIwIDAgMjguMzAyIDMzLjI0MiI+DQoJPHBhdGggZD0iTTAsMS44VjMxLjQ0MmExLjgsMS44LDAsMCwwLDIuNzI2LDEuNTQzbDI0LjctMTQuODJhMS44LDEuOCwwLDAsMCwwLTMuMDg3TDIuNzI2LjI1N0ExLjgsMS44LDAsMCwwLDAsMS44WiIgc3R5bGU9ImZpbGw6IzMzMyIvPg0KPC9zdmc+","data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyOHB4IiBoZWlnaHQ9IjMzcHgiIHZpZXdCb3g9IjAgMCAyOC4zMDIgMzMuMjQyIj4NCgk8cGF0aCBkPSJNMCwxLjhWMzEuNDQyYTEuOCwxLjgsMCwwLDAsMi43MjYsMS41NDNsMjQuNy0xNC44MmExLjgsMS44LDAsMCwwLDAtMy4wODdMMi43MjYuMjU3QTEuOCwxLjgsMCwwLDAsMCwxLjhaIiBzdHlsZT0iZmlsbDojNTI4YmRmIi8+DQo8L3N2Zz4=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMnB4IiB2aWV3Qm94PSIwIDAgMjAgMjIiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5TV0FQLUlDT048L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iaVBob25lLTgtUGx1cy1ALUNvdXJzZS1sYW5kc2NhcGUtU1dBUCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQ2Mi4wMDAwMDAsIC0xMTAuMDAwMDAwKSIgZmlsbD0iI0ZGRkZGRiIgZmlsbC1ydWxlPSJub256ZXJvIj4KICAgICAgICAgICAgPGcgaWQ9IlNXQVAtQlVUVE9OIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0NTAuMDAwMDAwLCA5OS4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNS45MTQyMTM2LDE2IEwyNCwxNiBDMjQuNTUyMjg0NywxNiAyNSwxNi40NDc3MTUzIDI1LDE3IEMyNSwxNy41NTIyODQ3IDI0LjU1MjI4NDcsMTggMjQsMTggTDE1LjkxNDIxMzYsMTggTDE4LjcwNzEwNjgsMjAuNzkyODkzMiBDMTkuMDk3NjMxMSwyMS4xODM0MTc1IDE5LjA5NzYzMTEsMjEuODE2NTgyNSAxOC43MDcxMDY4LDIyLjIwNzEwNjggQzE4LjMxNjU4MjUsMjIuNTk3NjMxMSAxNy42ODM0MTc1LDIyLjU5NzYzMTEgMTcuMjkyODkzMiwyMi4yMDcxMDY4IEwxMi43OTI4OTMyLDE3LjcwNzEwNjggQzEyLjQwMjM2ODksMTcuMzE2NTgyNSAxMi40MDIzNjg5LDE2LjY4MzQxNzUgMTIuNzkyODkzMiwxNi4yOTI4OTMyIEwxNy4yOTI4OTMyLDExLjc5Mjg5MzIgQzE3LjY4MzQxNzUsMTEuNDAyMzY4OSAxOC4zMTY1ODI1LDExLjQwMjM2ODkgMTguNzA3MTA2OCwxMS43OTI4OTMyIEMxOS4wOTc2MzExLDEyLjE4MzQxNzUgMTkuMDk3NjMxMSwxMi44MTY1ODI1IDE4LjcwNzEwNjgsMTMuMjA3MTA2OCBMMTUuOTE0MjEzNiwxNiBaIE0yOC4wODU3ODY0LDI4IEwyMCwyOCBDMTkuNDQ3NzE1MywyOCAxOSwyNy41NTIyODQ3IDE5LDI3IEMxOSwyNi40NDc3MTUzIDE5LjQ0NzcxNTMsMjYgMjAsMjYgTDI4LjA4NTc4NjQsMjYgTDI1LjI5Mjg5MzIsMjMuMjA3MTA2OCBDMjQuOTAyMzY4OSwyMi44MTY1ODI1IDI0LjkwMjM2ODksMjIuMTgzNDE3NSAyNS4yOTI4OTMyLDIxLjc5Mjg5MzIgQzI1LjY4MzQxNzUsMjEuNDAyMzY4OSAyNi4zMTY1ODI1LDIxLjQwMjM2ODkgMjYuNzA3MTA2OCwyMS43OTI4OTMyIEwzMS4yMDcxMDY4LDI2LjI5Mjg5MzIgQzMxLjU5NzYzMTEsMjYuNjgzNDE3NSAzMS41OTc2MzExLDI3LjMxNjU4MjUgMzEuMjA3MTA2OCwyNy43MDcxMDY4IEwyNi43MDcxMDY4LDMyLjIwNzEwNjggQzI2LjMxNjU4MjUsMzIuNTk3NjMxMSAyNS42ODM0MTc1LDMyLjU5NzYzMTEgMjUuMjkyODkzMiwzMi4yMDcxMDY4IEMyNC45MDIzNjg5LDMxLjgxNjU4MjUgMjQuOTAyMzY4OSwzMS4xODM0MTc1IDI1LjI5Mjg5MzIsMzAuNzkyODkzMiBMMjguMDg1Nzg2NCwyOCBaIiBpZD0iU1dBUC1JQ09OIj48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAADcmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmFjOGVjNDFhLTZkYWItODQ0Ni04YzkzLWU1Mjk3N2YwMmE4NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFRThCNzU3NDYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFRThCNzU3MzYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cykiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0OWFlZmI1OC00ZWFmLWQ3NDgtYTI0ZS0zNmNhNGQ2M2QwNTYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6N0MwQkFBM0M2MjAxMTFFNUI4QjBERTk4MjY5MjQwQjUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6MGSVVAAAE3klEQVR42uycW4hWVRiG15Q4eYzGQySSQlriEQ9BF2mE4iSdESRRIb0RD+mNmHgICjqQEGUe6sqgCy1i0iRinAzELrooQhHLGQURUTzMiM7omCLj+/F/czX/t/890z6s9e/3hZcZ1l6z19r7mXXca62arq4uR/mjh/gKCIQiEAKhCIRAKAIhEIpACIQiEIpACIQiEAKhCIRAKAIhEMoX9Yu62NbWxjcUobq6OpaQQpcQz/QwPBOeDU+Fx8Oj4UfhoRrnJnwDvgC3wCfgY/Bf8P0QHrImahmQB1VWLfwGvAieqy+/LxJIR+Dv4QPwf75WWb4CGQavg9fo70mqFd4F79DfCSRCA+HN8Hp4cMppdcBfwB/Bt9mo99Sr8Cl4SwYwnKYhaf2jaXMconoE/hL+CR6TQ/pPato7NS+FbtSfgH+Gp8eMfwv+HT6qpakZvqzVT/d//ePw0/BEeI72ygbFvP/f8MvwpSK2IfLSGuGxFeJ1aby98CG4s5fpDNAqaTlcL89cIf45jddcpDZknI4PKsFo0NKzQLusnX1Iq1P/doHe60CF+GM1b+OK0obIYO5XeGREnLPwfHghfDzBtOVeb+q9z0bEG6njltHVDqQ2RuP9HTwDbkoxH02axv4YjX1tNQP5LKIBl7ZiK/yWToGkLUljsaZpNaTTNc9VCeR1eHUEjHfgD3OoQiXNVRFQVmveqwrIEHh3xPXNOp2Rl77WPFiSvA+tJiCb4FHGNanHP/FggCp52Gdck7y/Wy0Dw2Hatx9s9KZmZNRmxC3JMjh8qsy1Du0St4Y+DomaKFzlEQxRu+apnOQZ1oVeZfWPeMCGlLu2/6dL3BDRwPcPGYiMjocbvaoPnL963+h1DddnChbIMiP8cMIj8KQln34be/lM3gOREW69cW2v81/fGOH1aY7e0wTyrNGYyxT6wQCAHNS8lmvcZ4UIZL4RLt8z7gQA5I7mtZyeCxHIS0b4UReOrLw+EyIQqxScDAiIldcJIQLZYTTmvwUEpMUIHxMikB/gta40PXIF/lwHVrcCAnLVCH8srQR9X7mYt2RUbq1yrOFia390N9SReugaYoR3EEg+GmGEtxNIPhpvhJ8nkHw02Qj/l0Dy0Rwj/DSBZC9ZeD3buPYHgWSv11z5RdrSw/qTQLLX20Z4o0toSxyBxJdsKrVmq79NM2ECKa/3XPltC9fgXwgkW81zpVX35fSVS3HahEB6SqZK9hjXujeJOgLJTrLG19qos1OrLALJSLL+eLFx7SL8cRaZIJCSVrrSfnVL8qHtJoFkoy3ablibQeWz849ZZaZfgUHIfg/Z97EkIs5xLR2OQNLv2u5x0Ttt5UShV1wfj91glRVP01xp8UVTBRiyuOFFheJYQpKVzNrKwQErXPyDA2SF+5k8MhsykCnwPdfzaA3ZYy6nREyCX4Cfd/EPs+nV0RoEUlqWsx1eCie9Bkc2nW5wOa87Dg3Ipy75bWXntSd1yIcHDK1RT3KzTIcOBif6AqOo3d42HX/I0tZW3zIXWgnp68chmfaQjZxyoKac0bXNRxghlpCN2m1dpj/btXEfpD0uqYaua89Luq3dx8TKN3AeE1vt4mLrAohACIQiEAKhCIRAKAIhEIpACq7IqROKJYRA+AoIhCIQAqEIhEAoAiEQikCKrQcCDABHPgH2w7NQdAAAAABJRU5ErkJggg==", +"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4IDEyIiB3aWR0aD0iOCIgaGVpZ2h0PSIxMiI+DQoJPHRpdGxlPlRvLXF1aXo8L3RpdGxlPg0KCTxwYXRoIGQ9Ik0xLDEyYTEsMSwwLDAsMS0uNzA3LTEuNzA3TDQuNTg2LDYsLjI5MywxLjcwN0ExLDEsMCwwLDEsMS43MDcuMjkzTDcuNDE0LDYsMS43MDcsMTEuNzA3QTEsMSwwLDAsMSwxLDEyWiIgc3R5bGU9ImZpbGw6IzllYWViOSIvPg0KPC9zdmc+","data:image/svg+xml;base64,"+qh(c),"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA5LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDksMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbD0iI0RENEIzOCIgZD0iTTIxLjA0MSwyOXY5Ljg0NGMwLDUuNTA4LDQuNjkxLDkuOTczLDEwLjQ3OSw5Ljk3M2M1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTczVjI5SDIxLjA0MXoiLz4NCjxwYXRoIGZpbGw9IiNERDRCMzgiIGQ9Ik0yNi41NTgsMjl2LTcuNjg5YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MlYyOWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNFYyOUgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjEuMDQxLDI4LjIwNnY5Ljg0NWMwLDUuNTA2LDQuNjkxLDkuOTcxLDEwLjQ3OSw5Ljk3MWM1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTcxdi05Ljg0NUgyMS4wNDF6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjYuNTU4LDI4LjA0VjIwLjM1YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MnY3LjY4OWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNHY4LjA1NEgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRjA4RjgyIiBkPSJNMzQsMzYuMzY1YzAtMS4yODctMS4wNDQtMi4zMzEtMi4zMzEtMi4zMzFjLTEuMjg4LDAtMi4zMzIsMS4wNDQtMi4zMzIsMi4zMzENCgljMCwwLjk3MSwwLjU5NCwxLjgwMiwxLjQzOCwyLjE1MnY0LjQ2N2gxLjkxdi00LjUyOUMzMy40NjEsMzguMDc2LDM0LDM3LjI4NywzNCwzNi4zNjV6Ii8+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA4LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDgsMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik01OS42NDYsMzFoLTMuMjkzQzU2LjE1OCwzMSw1NiwzMS40NDgsNTYsMzINCgljMCwwLjU1MywwLjE1OCwxLDAuMzU0LDFoMy4yOTNDNTkuODQyLDMzLDYwLDMyLjU1Myw2MCwzMkM2MCwzMS40NDgsNTkuODQyLDMxLDU5LjY0NiwzMXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjREQ0QjM4IiBkPSJNNi42NDcsMzFIMy4zNTNDMy4xNTgsMzEsMywzMS40NDgsMywzMmMwLDAuNTUzLDAuMTU4LDEsMC4zNTMsMQ0KCWgzLjI5NEM2Ljg0MiwzMyw3LDMyLjU1Myw3LDMyQzcsMzEuNDQ4LDYuODQyLDMxLDYuNjQ3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik0zMSw4YzAuNTUzLDAsMS0wLjE1OCwxLTAuMzUzVjQuMzUzQzMyLDQuMTU4LDMxLjU1Myw0LDMxLDQNCgljLTAuNTUyLDAtMSwwLjE1OC0xLDAuMzUzdjMuMjk0QzMwLDcuODQyLDMwLjQ0OCw4LDMxLDh6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTMxLDU2Yy0wLjU1MiwwLTEsMC4xNTgtMSwwLjM1NHYzLjI5M0MzMCw1OS44NDIsMzAuNDQ4LDYwLDMxLDYwDQoJYzAuNTUzLDAsMS0wLjE1OCwxLTAuMzU0di0zLjI5M0MzMiw1Ni4xNTgsMzEuNTUzLDU2LDMxLDU2eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik00Ny42NjgsMzFoLTEyLjgxQzM0LjQ5NiwyOS42LDMzLjQsMjguNTA1LDMyLDI4LjE0Mg0KCWMwLDAtMC4xNzItMC4xNDItMS0wLjE0MmMtMC44MjksMC0yLDAuNTU1LTIsMC41NTVjLTEuMTksMC42OTMtMiwxLjk2OS0yLDMuNDQ1YzAsMi4yMDksMS43OTEsNCw0LDRjMS40NzcsMCwyLjc1Mi0wLjgwOSwzLjQ0NS0yDQoJaDEzLjIyM0M0OC40MDQsMzQsNDksMzMuMzI4LDQ5LDMyLjVDNDksMzEuNjcyLDQ4LjQwNCwzMSw0Ny42NjgsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTI3LjAxOCwyOS43NDhjMC41OTIsMS4wMjUsMS42NTIsMS41MiwyLjM3LDEuMTA2bDAsMA0KCWMwLjcxNy0wLjQxNSwwLjgxOS0xLjU4MSwwLjIyOC0yLjYwNmwtNy44NTctMTMuNjA5Yy0wLjU5Mi0xLjAyNC0xLjY1My0xLjUyLTIuMzcxLTEuMTA2bDAsMGMtMC43MTcsMC40MTUtMC44MTgsMS41ODEtMC4yMjgsMi42MDUNCglMMjcuMDE4LDI5Ljc0OHoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMjcuMDE4LDI4LjM2MWMwLjU5MiwxLjAyNSwxLjY1MiwxLjUyLDIuMzcsMS4xMDZsMCwwDQoJYzAuNzE3LTAuNDE1LDAuODE5LTEuNTgxLDAuMjI4LTIuNjA2bC03Ljg1Ny0xMy42MDljLTAuNTkyLTEuMDI0LTEuNjUzLTEuNTItMi4zNzEtMS4xMDZsMCwwYy0wLjcxNywwLjQxNS0wLjgxOCwxLjU4MS0wLjIyOCwyLjYwNQ0KCUwyNy4wMTgsMjguMzYxeiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgY3g9IjMxIiBjeT0iMzEiIHI9IjQiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNjAsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzU0LDFoLTMuMjkzQzU2LjE1OCwzMiw1NiwzMS41NTIsNTYsMzENCglsMCwwYzAtMC41NTIsMC4xNTgtMSwwLjM1NC0xaDMuMjkzQzU5Ljg0MiwzMCw2MCwzMC40NDgsNjAsMzFMNjAsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTcsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzUzLDFIMy4zNTNDMy4xNTgsMzIsMywzMS41NTIsMywzMWwwLDANCgljMC0wLjU1MiwwLjE1OC0xLDAuMzUzLTFoMy4yOTRDNi44NDIsMzAsNywzMC40NDgsNywzMUw3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0zMSwzYzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDYuODQyLDMxLjU1Myw3LDMxLDdsMCwwDQoJYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1M1YzLjM1M0MzMCwzLjE1OCwzMC40NDgsMywzMSwzTDMxLDN6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTMxLDU1YzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDU4Ljg0MiwzMS41NTMsNTksMzEsNTkNCglsMCwwYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1NHYtMy4yOTRDMzAsNTUuMTU4LDMwLjQ0OCw1NSwzMSw1NUwzMSw1NXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNDksMzEuNDk5QzQ5LDMwLjY3Miw0OC40MDQsMzAsNDcuNjY4LDMwSDM0LjMzMw0KCUMzMy41OTYsMzAsMzMsMzAuNjcxLDMzLDMxLjVsMCwwYzAsMC44MjgsMC41OTYsMS41LDEuMzMzLDEuNWgxMy4zMzVDNDguNDA0LDMzLDQ5LDMyLjMyOCw0OSwzMS40OTlMNDksMzEuNDk5eiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YxNjE1NSIgY3g9IjMxIiBjeT0iMzEiIHI9IjIiLz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRjhCNDUwIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGQ0U2RCIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA4LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDgsMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGNEE2M0MiIGQ9Ik0zMS41MTQsMTNDMjUuNzA0LDEzLDIxLDE3Ljc0NiwyMSwyMy42MTMNCgljMCw0LjY2LDIuOTc2LDguNjI5LDcuMTEzLDEwLjAzOHYxOS4yMTRMMzEuNDg2LDU2TDM0LDUzdi0xbC0xLjA5OC0xLjQzN0wzNSw0OXYtMWwtMi0ydi0xbDItMXYtMWwtMi0xbDItNHYtNA0KCWM0LjA1My0xLjQ2Nyw3LTUuNzg0LDctMTAuMzg3QzQyLDE3Ljc0NiwzNy4yOTUsMTMsMzEuNTE0LDEzeiBNMjksNTFWMzRoMXYxOEwyOSw1MXogTTMxLjUsMjNjLTEuOTIxLDAtMy41LTEuNTUyLTMuNS0zLjQ4Mw0KCUMyOCwxNy41NTIsMjkuNTc4LDE2LDMxLjUsMTZjMS45MjIsMCwzLjUsMS41NTIsMy41LDMuNTE3QzM1LDIxLjQ0OCwzMy40MjIsMjMsMzEuNSwyM3oiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMzEuNTE0LDEyQzI1LjcwNCwxMiwyMSwxNi43NDYsMjEsMjIuNjEzDQoJYzAsNC42NiwyLjk3Niw4LjYyOSw3LjExMywxMC4wMzh2MTkuMjE0TDMxLjQ4Niw1NUwzNCw1MnYtMWwtMS4wOTgtMS40MzdMMzUsNDh2LTFsLTItMnYtMWwyLTF2LTFsLTItMWwyLTR2LTQNCgljNC4wNTMtMS40NjcsNy01Ljc4NCw3LTEwLjM4N0M0MiwxNi43NDYsMzcuMjk1LDEyLDMxLjUxNCwxMnogTTI5LDUwVjMzaDF2MThMMjksNTB6IE0zMS41LDIyYy0xLjkyMSwwLTMuNS0xLjU1Mi0zLjUtMy40ODMNCglDMjgsMTYuNTUyLDI5LjU3OCwxNSwzMS41LDE1YzEuOTIyLDAsMy41LDEuNTUyLDMuNSwzLjUxN0MzNSwyMC40NDgsMzMuNDIyLDIyLDMxLjUsMjJ6Ii8+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNzJweCIgaGVpZ2h0PSI3MnB4IiB2aWV3Qm94PSIwIDAgMTQyLjIyIDE0Mi4yMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTQyLjIyIDE0Mi4yMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8Y2lyY2xlIG9wYWNpdHk9IjAuNDMiIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBjeD0iNzEuMTEiIGN5PSI3MS4xMSIgcj0iNzEuMTEiLz4NCjxwb2x5Z29uIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBwb2ludHM9IjU0LjQyMywxMDQuNTk0IDEwNS43OTgsNzAuNzc0IDU0LjQyMywzNy42MjYgIi8+DQo8L3N2Zz4=", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACHDwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKNWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAASMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEoqGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAGeIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gzSZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25qbc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9CvjcM4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjKuLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqxOPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIWiAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFVSAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAyrA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYghUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7rh2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SEdJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3JaSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQtlHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJy5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hopb2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsyu21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCccNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527PYS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOwEaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6sfaznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy+rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVsS1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9UxlfeqXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/wjowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9Vt1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503rm10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7Pnl/eriQvLDwG/eE8/s6uL5TAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAAGnRFWHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS4xMDD0cqEAAABfSURBVChTY/j//z8DMZgoRSCD4ApLK6rYgLgDiJ9CMYjNBrMNWWHnvAUL/3/4+BGMQWygwk5sCp+CFMDAhw8fQAqfYlcIlCRGYeeceQv+g0wCYRAbl9XEeYZQWBIdjgCVaiC8JN1udgAAAABJRU5ErkJggg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAACuSURBVHicY/n//z8DCLh7+/sAqWIgNmGAgDNA3Ltz68YtIA4LVFELkKpmQAUOIAyUawUqrmEBMnyxKEIG1UA1J0EmFsFELC3MGfJzssDsSVOnMxw7fgImVQRSaAzjgRQJCgqA2XnZmcgKjVnwWIkCWKC+cwRxJk6eypCfm80AYyOBMyCF/TCFx0+eAmMsoJ8F6PXNoCBgwO1zUPBsBrsRFE5AxSCXFzKgBng/LMABrBM9cyiwScIAAAAASUVORK5CYII=", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAZCAYAAABtnU33AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAETSURBVHic7ZgxCsJAFAUXSaeIpScQDyCCguA5rEUQEbWzsvACKhICaquHUQu18hxi6vgebCSgwSb5C2sGhpBkIX+aZIkTBIHS1OAI1mFR2cEDHuEKnnnB0TeGcAlzZuZKjTKswA4cwzWDW8rO2ChsY+OFwVNld2wIG6cMbpqeRJAmg0umpxCk5PxeYxdZsO1kwbaTBdvOXwb7MG96ECF8Bt9gw/QkQlwZ7Kr/CXYZvIdt2DU7S+rs4CF8afXgCU5g1dhI6XCHC7jlSRjM/zwbbUGbJDPY/7HGg/OEn/vUvvn2WfpYlAADfYyL9vSaIOZ+Ykh9hxkSFy0WSyQ3Ht+iRWOJ9E4rGq2UcCwxsbWMRovGkhc6FTEV3QXLmAAAAABJRU5ErkJggg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAElJREFUSEvt0qERAEAIA0H6b5rXL1ecI5qQOcIsanB+3TC5egZOyJm9B2Zgw0EnF+AeekPC+S3tGTjhoJMLcA+9IeG89+6L04QHtFKarLFAHLUAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAFBJREFUSEvtkjEKADAIA/PpQunnWzo63nBbBDdjOGPWPpd0yPCf5YLo5TNgB52Z54AZsKDQygVwDr5A4RxLfQbsUGjlAjgHX6Bw9r394KjDAzeSX574b7LUAAAAAElFTkSuQmCC", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NzA3MjgiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjMzNjc2NjQiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjkxNDI4IDAuNjkxNDI4LDAuNjkxNDI4IDAuNjkxNDI4LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTcwNzA0IiBjbGFzcz0iZmlsMSIgZD0iTTAuMzQ1NzM2IDAuMTU3MTg4bC0wLjEyNTcyMiAwLjA5NDI2NDkgLTAuMDk0MzAwNiAwIDAgMC4xODg1ODMgMC4wOTQzMDA2IDAgMC4xMjU3MjIgMC4wOTQyNjQ5IDAgLTAuMzc3MTEzem0wLjE1NzExNyAtMi42NzI2N2UtMDA1bDAuMDMxNDMwNiAwIDAgMC4zNzcxNCAtMC4wMzE0MzA2IDAgMCAtMC4zNzcxNHptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjI1MTQwOSAtMC4wMzE0MzA2IDAgMCAtMC4yNTE0MDl6bS0wLjA2Mjg0MzMgMC4wNjI4NjExbDAuMDMxNDMwNiAwIDAgMC4xMjU2ODcgLTAuMDMxNDMwNiAwIDAgLTAuMTI1Njg3eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NjkwMjQiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjE5NjkyNDAiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjQzNjE2IDAuNjQzNjE2LDAuNjQzNjE2IDAuNjQzNjE2LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY5MDAwIiBjbGFzcz0iZmlsMSIgZD0iTTAuMzIxODM3IDAuMTQ2MzAybC0wLjExNzAyOSAwLjA4Nzc0NjYgLTAuMDg3Nzc5NyAwIDAgMC4xNzU1NDMgMC4wODc3Nzk3IDAgMC4xMTcwMjkgMC4wODc3NDY2IDAgLTAuMzUxMDM2em0wLjI3NzkwMSAwLjI1MDcyNmwtMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjA5MzA4NzIgLTAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjAyMDY5MDYgLTAuMDIwNjkwNiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAwLjAyMDY5MDYgLTAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MnoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxwYXRoIGNsYXNzPSJmaWwwIiBkPSJNLTAgMC4yNzExMDFsMCAxLjczOTM1YzAsMC4xNDkxMTMgMC4xMjE5ODgsMC4yNzExMDEgMC4yNzExMDEsMC4yNzExMDFsMy4xNTEzMSAwIDAgLTIuMjgxNTUgLTMuMTUxMzEgMGMtMC4xNDkxMTMsMCAtMC4yNzExMDEsMC4xMjE5ODggLTAuMjcxMTAxLDAuMjcxMTAxeiIvPg0KICA8cG9seWdvbiBjbGFzcz0iZmlsMSIgcG9pbnRzPSIxLjQwOTIsMC42NzEwMzggMi4wODAyOCwxLjE0MDc3IDEuNDA5MiwxLjYxMDUxICIvPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIxOTY2NTUyIj4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NzY4IiBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMzIzOTU2bDAgMi4wNzg0NmMwLDAuMTc4MTg1IDAuMTQ1NzcxLDAuMzIzOTU2IDAuMzIzOTU2LDAuMzIzOTU2bDMuNzY1NzEgMCAwIC0yLjcyNjM4IC0zLjc2NTcxIDBjLTAuMTc4MTg1LDAgLTAuMzIzOTU2LDAuMTQ1NzcxIC0wLjMyMzk1NiwwLjMyMzk1NnoiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NTI4IiBjbGFzcz0iZmlsMSIgZD0iTTEuNjAzOCAwLjg4MjAzOGwwLjMyMDc1MSAwIDAgMC45NjIyNTQgLTAuMzIwNzUxIDAgMCAtMC45NjIyNTR6bTAuNTYxMzMyIDBsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAhCAYAAAAYucG/AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAA+SURBVHicY/H09pViYQACFi4uLgYWbm5uOAHncsG4/Pz8xKv79u0bA8vXr1/hBJz7Dcb9+PEjIXVzZs18BgAgpy6CcHz1VgAAAABJRU5ErkJggg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsLW9wYWNpdHk9IjAiIGQ9Ik01MSw0LjA0MXYyNS45MThDNTEsMzIuMTgyLDQ5LjE4MiwzNCw0Ni45NiwzNEgwVjBoNDYuOTZDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDENCgkJCUw1MSw0LjA0MXoiLz4NCgkJPHBhdGggaWQ9Il8xMjMzNzQxNDQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xOCwxNS43MzdsMi41MjYtMi41MjZsMy4zNjksMy4zNjlsMS42ODQtMS42ODVsLTMuMzY4LTMuMzY4TDI0LjczNiw5aC01LjA1M0gxOHYxLjY4NA0KCQkJVjE1LjczN3ogTTM0LDE4LjI2NGwtMi41MjcsMi41MjVsLTMuMzY4LTMuMzY4bC0xLjY4NSwxLjY4NWwzLjM2OSwzLjM2N0wyNy4yNjMsMjVoNS4wNTNIMzR2LTEuNjg1VjE4LjI2NHoiLz4NCgk8L2c+DQo8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMTAyIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjRkVGRUZFIiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMDUxIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjOTY5Njk2IiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTNweCIgaGVpZ2h0PSIyMXB4IiB2aWV3Qm94PSIwIDAgMTMgMjEiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5CYWNrLUFycm93PC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9ImlQaG9uZS1YLUNvdXJzZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyLjAwMDAwMCwgLTU2LjAwMDAwMCkiIGZpbGw9IiMzREEwRTEiPgogICAgICAgICAgICA8cGF0aCBkPSJNMjEuOTA2MzgyOCw1Ni45ODk5NDk1IEwxMiw2Ni41IEwyMS45MDYzODI4LDc2LjAxMDA1MDUgQzIyLjQ4MjU4NSw3Ni41NjMyMDAyIDIzLjM5MjU5Miw3Ni41NjMyMDAyIDIzLjk2ODc5NDMsNzYuMDEwMDUwNSBMMjMuOTY4Nzk0Myw3Ni4wMTAwNTA1IEMyNC41MTU1MjgzLDc1LjQ4NTE5MDEgMjQuNTMzMjYwMyw3NC42MTY0OTEyIDI0LjAwODM5OTksNzQuMDY5NzU3MiBDMjMuOTk1NDY4OSw3NC4wNTYyODcyIDIzLjk4MjI2NDIsNzQuMDQzMDgyNiAyMy45Njg3OTQzLDc0LjAzMDE1MTUgTDE2LjEyNDgyMjksNjYuNSBMMjMuOTY4Nzk0Myw1OC45Njk4NDg1IEMyNC41MTU1MjgzLDU4LjQ0NDk4ODEgMjQuNTMzMjYwMyw1Ny41NzYyODkyIDI0LjAwODM5OTksNTcuMDI5NTU1MiBDMjMuOTk1NDY4OSw1Ny4wMTYwODUyIDIzLjk4MjI2NDIsNTcuMDAyODgwNiAyMy45Njg3OTQzLDU2Ljk4OTk0OTUgTDIzLjk2ODc5NDMsNTYuOTg5OTQ5NSBDMjMuMzkyNTkyLDU2LjQzNjc5OTggMjIuNDgyNTg1LDU2LjQzNjc5OTggMjEuOTA2MzgyOCw1Ni45ODk5NDk1IFoiIGlkPSJCYWNrLUFycm93Ij48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4="]; +c=".popup-layer {top: 0;right: 0;bottom: 0;left: 0;z-index: 1;position: absolute;border-radius: inherit; }.modal-layer {background: #000000;opacity: 0.4;position: absolute;width: 100%;height: 100%;border-radius: inherit; }:root {--page-background-color: __pageBackground__;--button-background-color: __primaryButtonBackground__;--button-hover-background-color: __primaryButtonBackgroundHover__;--button-hover-text-color: __primaryButtonTextHover__;--button-text-color: __primaryButtonText__;--company-logo-background-color: __asideLogoBackground__;--hyperlink-text-color: __hyperlink__;--list-item-background-hover-color: __asideElementBackgroundHover__;--list-item-border-color: __outlineItemBorder__;--list-item-background-pressed-color: __asideElementBackgroundActive__;--list-item-text-hover-color: __asideElementTextHover__;--list-item-text-pressed-color: __asideElementTextActive__;--list-item-text-visited-color: __asideElementTextVisited__;--list-item-icon-fill-color: __itemsListIconFill__;--list-item-order-color: __itemsListOrder__;--list-item-icon-stroke-color: __itemsListIconStroke__;--list-item-icon-color: __itemsListIcon__;--panel-color: __asideBackground__;--panel-text-color: __asideElementText__;--panel-video-stub-background-color: __panelVideoStubBackgroundColor__;--panel-video-stub-color: __panelVideoStubColor__;--player-background-color: __playerBackground__;--progressbar-background-color: __progressBackground__;--progressbar-playback-color: __progressPlayback__;--slide-border-color: __slideBorder__;--text-color: __playerText__;--topbar-hover-background-color: __secondaryButtonBackgroundHover__;--topbar-text-color: __secondaryButtonText__;--primary-button-text-color: __primaryButtonText__;--primary-button-text-color-active: __primaryButtonTextHover__;--primary-button-background-color-active: __primaryButtonBackgroundHover__;--primary-button-background-color: __primaryButtonBackground__;--primary-button-border-color: __primaryButtonBorder__;--primary-button-border-color-active: __primaryButtonBorderHover__;--secondary-button-background-color: __secondaryButtonBackground__;--secondary-button-background-color-active: __secondaryButtonBackgroundHover__;--secondary-button-text-color: __secondaryButtonText__;--secondary-button-text-color-active: __secondaryButtonTextHover__;--secondary-button-border-color: __secondaryButtonBorder__;--secondary-button-border-color-active: __secondaryButtonBorderHover__;--volume-control-background-color: __volumeControlBackgroundColor__;--volume-control-playback-color: __volumeControlPlaybackColor__;--volume-control-thumb-color: __volumeControlThumbColor__;--more-menu-volume-control-background-color: __moreMenuVolumeControlBackgroundColor__;--more-menu-volume-control-playbackColor: __moreMenuVolumeControlPlaybackColor__;--more-menu-volume-control-thumb-color: __moreMenuVolumeControlThumbColor__;--popup-background-color: __popupBackground__;--popup-transparent-background-color: __transparentPopupBackground__;--popup-border: __popupBorder__;--popup-background-hover-color: __popupBackgroundHover__;--popup-text-color: __popupText__;--popup-text-hover-color: __popupTextHover__;--link-button-background-color: transparent;--link-button-text-color: __linkButtonTextColor__;--player-text: __playerText__;--button-border-radius: __borderRadius__;--presenter-info-link-border-color: __presenterInfoLinkBorderColor__;--search-field-background-color: __searchFieldBackgroundColor__;--hovered-tab-background-color: __hoveredTabBackgroundColor__;--selected-tab-background-color: __selectedTabBackgroundColor__;--top-panel-icon-container-color: __topPanelIconContainerColor__;--top-panel-icon-color: __topPanelIconColor__;--mini-skin-menu-button-text: __miniSkinMenuButtonText__;--mini-skin-menu-button-background-active: __miniSkinMenuButtonBackgroundActive__;--mini-skin-top-bottom-panel-border: __miniSkinTopBottomPanelBorder__;--mini-skin-presenter-delimiter-color: __miniSkinPresenterDelimiterColor__;--top-bottom-panel-border-color: __topBottomPanelBorderColor__; }:root {--page-background-color: __pageBackground__;--button-background-color: __primaryButtonBackground__;--button-hover-background-color: __primaryButtonBackgroundHover__;--button-hover-text-color: __primaryButtonTextHover__;--button-text-color: __primaryButtonText__;--company-logo-background-color: __asideLogoBackground__;--hyperlink-text-color: __hyperlink__;--list-item-background-hover-color: __asideElementBackgroundHover__;--list-item-border-color: __outlineItemBorder__;--list-item-background-pressed-color: __asideElementBackgroundActive__;--list-item-text-hover-color: __asideElementTextHover__;--list-item-text-pressed-color: __asideElementTextActive__;--list-item-text-visited-color: __asideElementTextVisited__;--list-item-icon-fill-color: __itemsListIconFill__;--list-item-order-color: __itemsListOrder__;--list-item-icon-stroke-color: __itemsListIconStroke__;--list-item-icon-color: __itemsListIcon__;--panel-color: __asideBackground__;--panel-text-color: __asideElementText__;--panel-video-stub-background-color: __panelVideoStubBackgroundColor__;--panel-video-stub-color: __panelVideoStubColor__;--player-background-color: __playerBackground__;--progressbar-background-color: __progressBackground__;--progressbar-playback-color: __progressPlayback__;--slide-border-color: __slideBorder__;--text-color: __playerText__;--topbar-hover-background-color: __secondaryButtonBackgroundHover__;--topbar-text-color: __secondaryButtonText__;--primary-button-text-color: __primaryButtonText__;--primary-button-text-color-active: __primaryButtonTextHover__;--primary-button-background-color-active: __primaryButtonBackgroundHover__;--primary-button-background-color: __primaryButtonBackground__;--primary-button-border-color: __primaryButtonBorder__;--primary-button-border-color-active: __primaryButtonBorderHover__;--secondary-button-background-color: __secondaryButtonBackground__;--secondary-button-background-color-active: __secondaryButtonBackgroundHover__;--secondary-button-text-color: __secondaryButtonText__;--secondary-button-text-color-active: __secondaryButtonTextHover__;--secondary-button-border-color: __secondaryButtonBorder__;--secondary-button-border-color-active: __secondaryButtonBorderHover__;--volume-control-background-color: __volumeControlBackgroundColor__;--volume-control-playback-color: __volumeControlPlaybackColor__;--volume-control-thumb-color: __volumeControlThumbColor__;--more-menu-volume-control-background-color: __moreMenuVolumeControlBackgroundColor__;--more-menu-volume-control-playbackColor: __moreMenuVolumeControlPlaybackColor__;--more-menu-volume-control-thumb-color: __moreMenuVolumeControlThumbColor__;--popup-background-color: __popupBackground__;--popup-transparent-background-color: __transparentPopupBackground__;--popup-border: __popupBorder__;--popup-background-hover-color: __popupBackgroundHover__;--popup-text-color: __popupText__;--popup-text-hover-color: __popupTextHover__;--link-button-background-color: transparent;--link-button-text-color: __linkButtonTextColor__;--player-text: __playerText__;--button-border-radius: __borderRadius__;--presenter-info-link-border-color: __presenterInfoLinkBorderColor__;--search-field-background-color: __searchFieldBackgroundColor__;--hovered-tab-background-color: __hoveredTabBackgroundColor__;--selected-tab-background-color: __selectedTabBackgroundColor__;--top-panel-icon-container-color: __topPanelIconContainerColor__;--top-panel-icon-color: __topPanelIconColor__;--mini-skin-menu-button-text: __miniSkinMenuButtonText__;--mini-skin-menu-button-background-active: __miniSkinMenuButtonBackgroundActive__;--mini-skin-top-bottom-panel-border: __miniSkinTopBottomPanelBorder__;--mini-skin-presenter-delimiter-color: __miniSkinPresenterDelimiterColor__;--top-bottom-panel-border-color: __topBottomPanelBorderColor__; }@keyframes preloader_spin {0% {transform: rotate(0deg); } 100% {transform: rotate(360deg); } }html,body {background-color: var(--page-background-color) !important; }.universal_mini {overflow: hidden;background: var(--player-background-color); } .universal_mini div {-webkit-tap-highlight-color: rgba(0, 0, 0, 0);-webkit-user-select: none;-ms-user-select: none;user-select: none;-webkit-touch-callout: none;-webkit-user-drag: none; } .universal_mini .launch-screen {z-index: 100;position: fixed;top: 0;right: 0;bottom: 0;left: 0;background-color: rgba(0, 0, 0, 0.48); } .universal_mini .launch-screen .launch-screen-button {top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 96px;height: 96px;position: absolute; } .universal_mini .launch-screen .launch-screen-button__play-icon {background-color: #FFFFFF;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 90px;height: 90px;box-shadow: 0 12px 50px 0 rgba(0, 0, 0, 0.2);transition: 0.3s ease-in-out; } .universal_mini .launch-screen .launch-screen-button__icon {background: url("+ +c[0]+") no-repeat center;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 6px;width: 90px;height: 90px; } .universal_mini .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__play-icon {width: 96px;height: 96px; } .universal_mini .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__icon {background: url("+c[1]+") no-repeat center; } .universal_mini .playerView {-ms-transform: translateX(0);transform: translateX(0); } .universal_mini.not_loaded .top-panel, .universal_mini.not_loaded .bottom-panel, .universal_mini.not_loaded .landscape-bottom-panel {display: none; } .universal_mini:not(.landscape) .landscape-bottom-panel {display: none; } .universal_mini.landscape > .bottom-panel {display: none; } .universal_mini.landscape > .top-panel {display: none !important; } .universal_mini.landscape.quiz_mode .top-panel, .universal_mini.landscape.quiz_mode .landscape-bottom-panel {display: initial; } .universal_mini.landscape.quiz_mode > .bottom-panel {display: none; } .universal_mini > .top-panel {width: 100%;background: var(--player-background-color);position: absolute;box-sizing: border-box;box-shadow: 0 1px 0 var(--mini-skin-top-bottom-panel-border);height: 52px;top: 0; } .universal_mini > .top-panel::before, .universal_mini > .top-panel::after {top: 100%; } .universal_mini > .top-panel .menu {cursor: pointer;position: absolute;top: 6px;right: 12px;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: center;align-items: center;padding: 8px;background: transparent;color: var(--mini-skin-menu-button-text);border-radius: var(--button-border-radius); } .universal_mini > .top-panel .menu.menu_active {background: var(--mini-skin-menu-button-background-active);color: var(--text-color); } .universal_mini > .top-panel .slide-info {font-family: var(--font-family-bold);width: 100%;position: absolute;font-size: 17px;line-height: 52px;text-align: center;color: var(--text-color);text-overflow: ellipsis;overflow: hidden;white-space: nowrap;z-index: 1;pointer-events: none; } .universal_mini > .bottom-panel {width: 100%;background: var(--player-background-color);position: absolute;box-sizing: border-box;bottom: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;padding: 0 12px;height: 56px;top: auto; } .universal_mini > .bottom-panel .navigation-controls {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .universal_mini > .bottom-panel > button:not(:first-child) {margin-left: 12px; } .universal_mini > .bottom-panel .navigation-controls {margin-left: auto; } .universal_mini > .bottom-panel .navigation-controls button:not(:first-child) {margin-left: 12px; } .universal_mini > .bottom-panel.bottom-panel_with-border {border-top: 1px solid var(--mini-skin-top-bottom-panel-border); } .universal_mini > .bottom-panel .rate-menu-popup {background: var(--popup-background-color);border: 1px solid var(--popup-border);box-shadow: 0 20px 32px rgba(0, 0, 0, 0.16);-webkit-backdrop-filter: blur(8px);backdrop-filter: blur(8px);border-radius: 10px;position: absolute; } .universal_mini > .progress {position: absolute;top: auto;left: 0;height: 2px;background: var(--progressbar-background-color); } .universal_mini > .progress > .playback-progress {position: absolute;top: 0;left: 0;width: 0;height: 100%;background: var(--progressbar-playback-color); } .universal_mini > .landscape-bottom-panel {width: 100%;background: var(--player-background-color);position: absolute;box-sizing: border-box;bottom: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;right: 0;top: 0;width: 52px;-ms-flex-direction: column;flex-direction: column;align-items: center;padding: 16px 0;border-left: 1px solid rgba(97, 104, 112, 0.1); } .universal_mini > .landscape-bottom-panel .navigation-controls {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .universal_mini > .landscape-bottom-panel > button:not(:last-child) {margin-bottom: 12px; } .universal_mini > .landscape-bottom-panel .navigation-controls {margin-top: auto;-ms-flex-direction: column;flex-direction: column; } .universal_mini > .landscape-bottom-panel .navigation-controls button:not(:first-child) {margin-top: 12px; } .universal_mini > .landscape-bottom-panel .rate-menu-popup {background: var(--popup-background-color);border: 1px solid var(--popup-border);box-shadow: 0 20px 32px rgba(0, 0, 0, 0.16);-webkit-backdrop-filter: blur(8px);backdrop-filter: blur(8px);border-radius: 10px;position: absolute; } .universal_mini #playerView {border: 1px solid rgba(0, 0, 0, 0.04); } .universal_mini.quiz_mode {overflow: visible;height: auto !important; } .universal_mini.quiz_mode #playerView, .universal_mini.quiz_mode .video-container {display: none; } .universal_mini.quiz_mode.interaction_slide .bottom-panel {box-shadow: 0 -2px 12px 0 rgba(0, 0, 0, 0.1);position: fixed;bottom: 0 !important; } .universal_mini.quiz_mode.interaction_slide .bottom-panel .play, .universal_mini.quiz_mode.interaction_slide .bottom-panel .progress-bar {display: none; } .universal_mini.quiz_mode .top-panel {position: fixed;top: -1px;height: 52px; } .universal_mini.quiz_mode .top-panel .slide-info {top: 1px; } .universal_mini.quiz_mode .top-panel .menu.component_container {top: 1px;height: 52px; } .universal_mini, .universal_mini > div {position: absolute;top: 0; } .universal_mini .launch_layer {width: 100%;height: 100%;background: url("+ +c[0]+") no-repeat center;background-color: rgba(0, 0, 0, 0.75); } .universal_mini .launch_layer:active {background-image: url("+c[1]+"); } .universal_mini .launch_layer[disabled], .universal_mini .launch_layer:active[disabled] {background-image: none; } .universal_mini .video-container video {position: absolute; } .universal_mini .change-layout-button {width: 44px;height: 44px;border-radius: 100%;background: #333333;position: absolute;left: 10px;bottom: 10px;border: 1px solid rgba(255, 255, 255, 0.3);box-sizing: border-box; } .universal_mini .change-layout-button::after {content: '';position: absolute;width: 20px;height: 20px;background: url("+ +c[2]+");background-size: cover;margin: auto;top: 0;left: 0;bottom: 0;right: 0; } .universal_mini .preloader {width: 50px;height: 50px;position: absolute;top: 0;left: 0;bottom: 0;right: 0;margin: auto;border-radius: 10px;background-color: rgba(0, 0, 0, 0.5); } .universal_mini .preloader::after {content: '';position: absolute;background: url("+c[3]+");background-size: cover;top: 0;left: 0;bottom: 0;right: 0;animation: preloader_spin 1s infinite linear; } .universal_mini .menu_layer {position: absolute;background: var(--panel-color);z-index: 10;color: var(--panel-text-color); } .universal_mini .menu_layer .menu-layer-top-panel {position: absolute;height: 52px;display: block;z-index: 1; } .universal_mini .menu_layer .menu-layer-top-panel .tab-title {font-family: var(--font-family-bold);position: absolute;left: 0;top: 0;width: 100%;height: 52px;font-size: 18px;line-height: 52px;text-align: center;text-overflow: ellipsis;overflow: hidden;white-space: nowrap;pointer-events: none;padding: 0 64px;box-sizing: border-box; } .universal_mini .menu_layer .menu-layer-top-panel .search-button, .universal_mini .menu_layer .menu-layer-top-panel .close-button, .universal_mini .menu_layer .menu-layer-top-panel .back-button {position: absolute;top: 0;cursor: pointer; } .universal_mini .menu_layer .menu-layer-top-panel > .search-button, .universal_mini .menu_layer .menu-layer-top-panel > .close-button, .universal_mini .menu_layer .menu-layer-top-panel > .back-button {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;padding: 8px 8px;color: var(--top-panel-icon-color);background: transparent; } .universal_mini .menu_layer .menu-layer-top-panel > .search-button {top: 6px;left: 12px; } .universal_mini .menu_layer .menu-layer-top-panel > .close-button {top: 6px;right: 12px; } .universal_mini .menu_layer .menu-layer-top-panel > .back-button {top: 6px;left: 12px; } .universal_mini .menu_layer .menu-layer-top-panel.with_search .back {right: 44px; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel {position: absolute;background: var(--player-background-color);top: 0;right: 0;bottom: 0;left: 0;z-index: 1;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;padding: 8px 12px;box-shadow: 0 1px 0 var(--mini-skin-top-bottom-panel-border); } .universal_mini .menu_layer .menu-layer-top-panel .search_panel__cancel-button {cursor: pointer; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel__search-icon {width: 24px;height: 24px;margin: 6px 8px;color: var(--text-color);-ms-flex-negative: 0;flex-shrink: 0; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel__cancel-button {width: 24px;height: 24px;margin: 6px 8px;color: var(--text-color);-ms-flex-negative: 0;flex-shrink: 0; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel .search_input {font-family: var(--font-family-normal);-ms-flex-positive: 1;flex-grow: 1;border: none;height: 100%;font-size: 15px;line-height: 20px;color: var(--text-color);background: transparent;min-width: 0; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel .search_input:-ms-input-placeholder {opacity: 0.4; } .universal_mini .menu_layer .menu-layer-top-panel .search_panel .search_input::placeholder {opacity: 0.4; } .universal_mini .menu_layer.tab_control .content.component_container {bottom: 56px; } .universal_mini .menu_layer.tab_control .bottom-panel {position: absolute;bottom: 0;height: 56px;background: var(--player-background-color);box-shadow: 0 -1px 0 var(--mini-skin-top-bottom-panel-border);box-sizing: border-box;padding: 7px 12px;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .universal_mini .menu_layer.tab_control .bottom-panel .menu-tab-button {font-family: var(--font-family-normal);cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: center;align-items: center;background: transparent;color: var(--text-color);font-size: 12px;line-height: 16px;opacity: 0.4; } .universal_mini .menu_layer.tab_control .bottom-panel .menu-tab-button[aria-selected='true'] {opacity: 1; } .universal_mini .menu_layer.tab_control .bottom-panel .menu-tab-button__text {margin-top: 2px; } .universal_mini .menu_layer .content.component_container {position: absolute;top: 64px;bottom: 0;width: 100%; } .universal_mini .menu_layer .content.component_container.animation .content.component_base > div {position: absolute; } .universal_mini .menu_layer .content.component_container .content.component_base {width: 100%;position: relative; } .universal_mini .menu_layer .content.component_container .content.component_base .search-result-layout .result-label {font-family: var(--font-family-bold);margin-top: 28px;margin-left: 20px;font-size: 16px;line-height: 22px;color: var(--panel-text-color); } .universal_mini .menu_layer .content.component_container .content.component_base .search-result-layout .no-matches-label {font-family: var(--font-family-normal);font-size: 15px;line-height: 20px;color: var(--panel-text-color);opacity: 0.6;text-align: center;margin-top: 80px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .separator {background: rgba(0, 0, 0, 0.08);position: relative;width: calc(100% - 20px);height: 1px;left: 10px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .separator:first-child {position: absolute;top: -1px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .separator:last-child {position: absolute;bottom: -1px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list {position: relative; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list.slides_list_highlight-visited .item.visited:not(.active):not(.selected) {color: var(--list-item-text-visited-color); } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative;min-height: 76px;color: var(--panel-text-color);margin-bottom: 1px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.level1 {padding-left: 24px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.level2 {padding-left: 48px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.level3 {padding-left: 72px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.level4 {padding-left: 96px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item .image {float: left;margin: 10px 16px 10px 20px;border-radius: 4px;border: 1px solid rgba(0, 0, 0, 0.04);box-sizing: content-box;max-height: 56px;max-width: 100px;-ms-flex-negative: 0;flex-shrink: 0; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item .text {font-family: var(--font-family-normal);position: relative;margin: 0;padding-right: 10px;padding-bottom: 1px;font-size: 14px;line-height: 18px;word-break: break-word;max-height: 54px;overflow: hidden;text-overflow: ellipsis;flex-grow: 1;display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item .text .highlighted {font-family: var(--font-family-bold); } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item .text .search-context {opacity: 0.6; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.text_only .text {padding-left: 13px; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.active, .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.selected {background: var(--list-item-background-pressed-color);color: var(--list-item-text-pressed-color); } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.parent::before {content: '';position: absolute;top: 0;bottom: 0;right: 19px;width: 8px;height: 12px;margin: auto;background: url("+ +c[4]+");background-size: contain;background-repeat: no-repeat; } .universal_mini .menu_layer .content.component_container .content.component_base .slides_list .item.parent .text {padding-right: 25px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: center;align-items: center; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .top-container {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: center;align-items: center;background-color: transparent;padding: 8px 24px 28px;margin: 0 24px;width: 100%;box-sizing: border-box; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .top-container .name, .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .top-container .job {word-wrap: break-word;position: relative;text-align: center; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .top-container .name {font-family: var(--font-family-bold);color: var(--panel-text-color);font-size: 24px;line-height: 28px;margin-bottom: 8px;margin-top: 16px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .top-container .job {font-family: var(--font-family-normal);color: var(--panel-text-color);opacity: 0.72;font-size: 14px;line-height: 18px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bottom-container {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: center;align-items: center;padding: 28px 0;margin: 0 24px;color: var(--panel-text-color);box-sizing: border-box;width: calc(100% - 48px);border-top: 1px solid var(--mini-skin-presenter-delimiter-color); } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bottom-container a {color: var(--panel-text-color); } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bottom-container .item {font-family: var(--font-family-normal);display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: flex-start;width: 100%;color: var(--panel-text-color); } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bottom-container .item .item-icon {margin-right: 8px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bottom-container .item .bottom-container-text {font-size: 15px;line-height: 20px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .bottom-container .item:not(:last-child) {margin-bottom: 16px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .photo_container {position: relative;width: 80px;height: 80px;border-radius: 100%; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .name_photo_container {width: 75px;height: 75px;background: #9EAEB9;border-radius: 100%;left: 0;right: 0;margin: auto;margin-bottom: 10px; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .name_photo_container .letter {font-size: 24px;line-height: 75px;text-align: center;color: #FFFFFF;font-family: Helvetica Neue, Helvetica, Roboto, Arial; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .no_presenter_container {margin-bottom: 10px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center; } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .no_presenter_photo {width: 106px;height: 134px;background: url("+ +c[5]+"); } .universal_mini .menu_layer .content.component_container .content.component_base .presenter_info .no_presenter_label {position: relative;font-family: Helvetica Neue, Helvetica, Roboto, Arial;font-size: 15px;color: var(--panel-text-color);padding: 0 40px;text-align: center; } .universal_mini .menu_layer .content.component_container .content.component_base .notes {font-family: var(--font-family-normal);padding: 12px 24px;font-size: 15px;line-height: 20px;color: var(--panel-text-color);width: auto !important;white-space: pre-wrap;word-wrap: break-word; }body {margin: 0;padding: 0;cursor: default;-ms-touch-action: pan-y;touch-action: pan-y;overflow-y: auto; } body .info_panel {position: relative;top: 0;background: #FFFFFF;font-family: Helvetica, Roboto, Arial;padding-top: 161px;padding-bottom: 50px; } body .info_panel, body .info_panel * {box-sizing: border-box; } body .info_panel.domain::before {background: transparent url("+ +c[6]+") no-repeat center; } body .info_panel.time::before {background: transparent url("+c[7]+") no-repeat center; } body .info_panel.password::before {background: transparent url("+c[8]+") no-repeat center; } body .info_panel::before {position: absolute;width: 100%;top: 55px;height: 63px;content: ''; } body .info_panel .message {position: relative;color: #414A5B;font-size: 16px;padding-left: 15px;padding-right: 15px;text-align: center; } body .password .password_field {position: relative;margin-left: 20px;margin-right: 20px;padding-top: 23px;padding-bottom: 26px; } body .password .password_field input {position: relative;width: 100%;height: 34px;border: 1px solid #D6D6D6;border-top: 1px solid #BABABA;padding-left: 8px;font-size: 20px; } body .password .wrong_password_label {position: absolute;font-size: 12px;color: #DD4A37;left: 22px;right: 22px;margin-top: -21px; } body .ok.component_container {position: fixed;bottom: 0;height: 50px;background: #434E50; } body .ok.component_container.active {background: #637375; } body .ok.component_container button {top: 0;bottom: 0;left: 0;width: 100%;position: absolute;background: transparent;border: 0;line-height: 50px;color: #E2E2E2;font-size: 16px; } body .ok.component_container button[disabled] {color: #647577; }.launch-screen {z-index: 999 !important; }.component_base,.component_container {position: absolute; }:focus {outline: none; }::-moz-focus-inner {border: 0; }input {appearance: none; }button {cursor: pointer;margin: 0;border: 0; }button[disabled] {cursor: default; }.__player_view_id__ > * {position: absolute; }.__player_view_id__ .slide {white-space: nowrap;font-size: 0; } .__player_view_id__ .slide a {text-decoration: none;cursor: pointer; } .__player_view_id__ .slide a img {border: 0; } .__player_view_id__ .slide * {-ms-transform-origin: 0 0;transform-origin: 0 0; } .__player_view_id__ .slide.relpos, .__player_view_id__ .slide .relpos {position: relative !important;vertical-align: top; } .__player_view_id__ .slide.kern, .__player_view_id__ .slide .kern {text-rendering: optimizeLegibility;font-feature-settings: 'kern' 1, 'liga' 0; } .__player_view_id__ .slide.nokern, .__player_view_id__ .slide .nokern {text-rendering: optimizeSpeed;font-feature-settings: 'kern' 0, 'liga' 0; }.__player_view_id__ .fullscreen {-ms-transform: none !important;transform: none !important;top: 0 !important;left: 0 !important; } .__player_view_id__ .fullscreen > video {background-color: black;width: __slide_width__ !important;height: __slide_height__ !important;z-index: 100; }.__player_view_id__ .video_player video {width: 100%;height: 100%; } .__player_view_id__ .video_player video::cue {color: #FFFFFF;background-color: rgba(8, 8, 8, 0.75);border-radius: 4px;font-family: Helvetica, Roboto, Arial;line-height: 1.1; }.__player_view_id__ .video_player.iphone::after {background: rgba(0, 0, 0, 0) url("+ +c[9]+") no-repeat center;position: absolute;width: 100%;height: 100%;top: 0;right: 0;content: ''; }.__player_view_id__ .video_player.iphone video {opacity: 0; }.__player_view_id__ .video_player.iphone.without_controls video {display: none; }.__player_view_id__ .video_player .controls {height: 36px;background: rgba(45, 50, 55, 0.85098);border: 1px solid #444648;cursor: default;border-radius: 4px; } .__player_view_id__ .video_player .controls .progress {background-color: #75787A;height: 14px;left: 62px;top: 0;bottom: 0;margin-top: auto;margin-bottom: auto;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark {width: 10px;height: 10px;margin-top: -5px;margin-left: -5px;top: 50%;background: url("+ +c[10]+") no-repeat;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark:hover, .__player_view_id__ .video_player .controls .progress .bookmark:active {background: url("+c[11]+") no-repeat; } .__player_view_id__ .video_player .controls .progress .loading {background-color: #B1B3B5;height: 100%; } .__player_view_id__ .video_player .controls .progress .playing {background-color: #FFFFFF;height: 100%; } .__player_view_id__ .video_player .controls .progress .tooltip {background: url("+ +c[12]+") no-repeat;width: 60px;height: 25px;top: -33px;margin-left: -30px;font-family: Helvetica, Roboto, Arial;font-size: 12px;padding-top: 2px;text-align: center; } .__player_view_id__ .video_player .controls .volume_popup {border-radius: 3px;background: rgba(45, 50, 55, 0.85098);top: -67px;right: 55px;padding: 8px; } .__player_view_id__ .video_player .controls .volume_popup .volume {background: url("+c[13]+");position: relative;cursor: pointer;width: 12px;height: 48px; } .__player_view_id__ .video_player .controls .volume_popup .volume .back {background: url("+ +c[14]+");width: 100%; } .__player_view_id__ .video_player .controls button {width: 100%;height: 100%; } .__player_view_id__ .video_player .controls button.mute {background: url("+c[15]+"); } .__player_view_id__ .video_player .controls button.mute:hover {background: url("+c[16]+"); } .__player_view_id__ .video_player .controls button.mute:active {background: url("+c[17]+"); } .__player_view_id__ .video_player .controls button.mute.selected {background: url("+c[18]+"); } .__player_view_id__ .video_player .controls button.mute.selected:hover {background: url("+ +c[19]+"); } .__player_view_id__ .video_player .controls button.mute.selected:active {background: url("+c[20]+"); } .__player_view_id__ .video_player .controls button.play {background: url("+c[21]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:hover {background: url("+c[22]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:active {background: url("+c[23]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected {background: url("+ +c[24]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:hover {background: url("+c[25]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:active {background: url("+c[26]+") no-repeat; } .__player_view_id__ .video_player .controls button.play::after {background: url("+c[27]+");width: 1px;height: 32px;right: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls button.toggle_fullscreen {background: url("+ +c[28]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:hover {background: url("+c[29]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:active {background: url("+c[30]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen::before {background: url("+c[27]+") no-repeat;width: 1px;height: 32px;left: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls .component_container.toggle_fullscreen, .__player_view_id__ .video_player .controls .component_container.play {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .component_container.toggle_fullscreen {right: -1px; } .__player_view_id__ .video_player .controls .component_container.mute {width: 22px;height: 22px;right: 58px;top: 6px; }.modal_layer {background: #000000;opacity: 0.7;z-index: 1;width: 100%;height: 100%; }.message_box,.confirm_window {border-radius: 4px;min-height: 150px;min-width: 300px;z-index: 1;background: #FFFFFF;position: absolute;width: 300px;top: 0;right: 0;bottom: 0;left: 0;margin: auto; } .message_box .title, .confirm_window .title {display: none !important; } .message_box .message, .confirm_window .message {padding: 34px 34px 24px 34px;font-size: 14px;line-height: 18px;color: #231F20;font-family: Helvetica, Roboto, Arial; }.message_box .btn_ok.component_container {padding-bottom: 24px;position: relative;text-align: center;height: 44px;width: 100%; } .message_box .btn_ok.component_container button {vertical-align: middle;line-height: 44px;height: 44px;padding-left: 20px;padding-right: 20px;min-width: 110px;margin-left: 5px;margin-right: 5px;position: static;appearance: none;border: 0;border-radius: 4px;font-size: 16px;background: #339BE0;color: #FFFFFF; } .message_box .btn_ok.component_container button.active {background: #058ACC; }.confirm_window .buttons_panel {text-align: center;position: relative;padding-bottom: 24px;height: 44px;width: 100%; } .confirm_window .buttons_panel > div {width: 50%;float: right;position: relative; } .confirm_window .buttons_panel > div button {vertical-align: middle;line-height: 44px;height: 44px;padding-left: 20px;padding-right: 20px;min-width: 110px;margin-left: 5px;margin-right: 5px;position: static;appearance: none;border: 0;border-radius: 4px;font-size: 16px;background: #339BE0;color: #FFFFFF; } .confirm_window .buttons_panel > div.active button {background: #058ACC; } .confirm_window .buttons_panel > div:only-child {width: 100%;text-align: center !important; } .confirm_window .buttons_panel > div:nth-child(1) {text-align: left; } .confirm_window .buttons_panel > div:nth-child(2) {text-align: right; }.back_to_app {height: 100%;position: absolute;left: 0; } .back_to_app__text {color: #3DA0E1;font-size: 16px;font-family: Helvetica Neue, Helvetica, Roboto, Arial;text-overflow: ellipsis;overflow: hidden;position: absolute;bottom: 0;top: 0;height: 24px;line-height: 24px;margin: auto;padding-left: 25px;max-width: 80px; } .back_to_app__text::before {content: '';background: url("+ +c[31]+") no-repeat center;height: 24px;width: 14px;left: 8px;position: absolute; }.trial_banner {position: relative;transform: translateZ(0); } .trial_banner .banner-content, .trial_banner .banner-content_hover {position: absolute;left: 0;right: 0;top: 0;bottom: 0;width: 100%;height: 100%; } .trial_banner .banner-content {visibility: visible;z-index: 1; } .trial_banner .banner-content_hover {visibility: hidden;z-index: 0; } .trial_banner .days_remaining {position: absolute;font-family: 'Open Sans', Arial, sans-serif;font-weight: normal;font-size: 13px;left: 65px;top: 41px;color: #7C1645;z-index: 1; } .trial_banner:hover .banner-content {visibility: hidden;z-index: 0; } .trial_banner:hover .banner-content_hover {visibility: visible;z-index: 1; }.popup_layer {z-index: 1; } .popup_layer .modal_layer {z-index: initial; }.framesLayer iframe {pointer-events: all; }.slide-transiting .quiz-uikit-primary-button {transition: none; }.slide-transiting .quiz-uikit-secondary-button {transition: none; }.slide-transiting .quiz-uikit-link-button {transition: none; }.slide-transiting .visuals-uikit-primary-button {transition: none; }.slide-transiting .visuals-uikit-secondary-button {transition: none; }.slide-transiting .visuals-uikit-link-button {transition: none; }.uikit-primary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-primary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-primary-button.uikit-primary-button_size_medium {padding: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:first-child {margin-left: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:last-child {margin-right: 10px; } .uikit-primary-button.uikit-primary-button_size_small {padding: 6px 12px; } .uikit-primary-button.uikit-primary-button_size_small .uikit-primary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-primary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__button-text {margin-right: 8px; } .uikit-primary-button__left-icon {margin-right: 8px; } .uikit-primary-button__button-text:first-child {margin-left: 0; } .uikit-primary-button__button-text:last-child {margin-right: 0; } .uikit-primary-button__left-icon:first-child {margin-left: 0; } .uikit-primary-button__left-icon:last-child {margin-right: 0; } .uikit-primary-button__right-icon:first-child {margin-left: 0; } .uikit-primary-button__right-icon:last-child {margin-right: 0; } .uikit-primary-button[disabled] {opacity: 0.4; } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-secondary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-secondary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-secondary-button.uikit-secondary-button_size_medium {padding: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:first-child {margin-left: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:last-child {margin-right: 10px; } .uikit-secondary-button.uikit-secondary-button_size_small {padding: 6px 12px; } .uikit-secondary-button.uikit-secondary-button_size_small .uikit-secondary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-secondary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__button-text {margin-right: 8px; } .uikit-secondary-button__left-icon {margin-right: 8px; } .uikit-secondary-button__button-text:first-child {margin-left: 0; } .uikit-secondary-button__button-text:last-child {margin-right: 0; } .uikit-secondary-button__left-icon:first-child {margin-left: 0; } .uikit-secondary-button__left-icon:last-child {margin-right: 0; } .uikit-secondary-button__right-icon:first-child {margin-left: 0; } .uikit-secondary-button__right-icon:last-child {margin-right: 0; } .uikit-secondary-button[disabled] {opacity: 0.4; } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-link-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-link-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-link-button.uikit-link-button_size_medium {padding: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text {font-size: 17px;line-height: 20px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:first-child {margin-left: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:last-child {margin-right: 10px; } .uikit-link-button.uikit-link-button_size_small {padding: 6px 12px; } .uikit-link-button.uikit-link-button_size_small .uikit-link-button__button-text {font-size: 14px;line-height: 20px; } .uikit-link-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__button-text {margin-right: 8px; } .uikit-link-button__left-icon {margin-right: 8px; } .uikit-link-button__button-text:first-child {margin-left: 0; } .uikit-link-button__button-text:last-child {margin-right: 0; } .uikit-link-button__left-icon:first-child {margin-left: 0; } .uikit-link-button__left-icon:last-child {margin-right: 0; } .uikit-link-button__right-icon:first-child {margin-left: 0; } .uikit-link-button__right-icon:last-child {margin-right: 0; } .uikit-link-button[disabled] {opacity: 0.4; } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-primary-button {background: var(--primary-button-background-color, var(--primary-button-background-color));color: var(--primary-button-text-color, var(--primary-button-text-color)); } .uikit-primary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--primary-button-border-color, var(--primary-button-border-color));background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-primary-button__button-text {font-family: var(--font-family-bold);font-weight: 700; } .uikit-primary-button.uikit-primary-button_active, .uikit-primary-button[aria-pressed='true'], .uikit-primary-button:focus {background: var(--primary-button-background-color-active, var(--primary-button-background-color-active));color: var(--primary-button-text-color-active, var(--primary-button-text-color-active)); } .uikit-primary-button.uikit-primary-button_active::after, .uikit-primary-button[aria-pressed='true']::after, .uikit-primary-button:focus::after {background: var(--primary-button-border-color-active, var(--primary-button-border-color-active));background-origin: border-box; }.uikit-secondary-button {background: var(--secondary-button-background-color, var(--secondary-button-background-color));color: var(--secondary-button-text-color, var(--secondary-button-text-color)); } .uikit-secondary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--secondary-button-border-color, var(--secondary-button-border-color));background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-secondary-button__button-text {font-family: var(--font-family-normal); } .uikit-secondary-button.uikit-secondary-button_active, .uikit-secondary-button[aria-pressed='true'], .uikit-secondary-button:focus {background: var(--secondary-button-background-color-active, var(--secondary-button-background-color-active));color: var(--secondary-button-text-color-active, var(--secondary-button-text-color-active)); } .uikit-secondary-button.uikit-secondary-button_active::after, .uikit-secondary-button[aria-pressed='true']::after, .uikit-secondary-button:focus::after {background: var(--secondary-button-border-color-active, var(--secondary-button-border-color-active));background-origin: border-box; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 15px; }.uikit-link-button {background: var(--link-button-background-color);color: var(--link-button-text-color);border: none; } .uikit-link-button.uikit-link-button_active, .uikit-link-button[aria-pressed='true'] {background: var(--link-button-background-color); }.uikit-collapsed-control {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;position: relative;overflow: hidden;padding: 10px;border: none;border-radius: var(--button-border-radius);background: var(--secondary-button-background-color-active);color: var(--secondary-button-text-color-active);transition-property: background, color;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-collapsed-control::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--secondary-button-border-color-active);background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-collapsed-control__collapsed-component {cursor: pointer;display: -ms-flexbox;display: flex; } .uikit-collapsed-control__expanded-component {margin-left: 8px;opacity: 1;transition-property: width, opacity;transition-duration: 300ms;transition-timing-function: ease; } .uikit-collapsed-control.uikit-collapsed-control_collapsed {background: var(--secondary-button-background-color);color: var(--secondary-button-text-color);padding-right: 2px; } .uikit-collapsed-control.uikit-collapsed-control_collapsed::after {background: var(--secondary-button-border-color);background-origin: border-box; } .uikit-collapsed-control.uikit-collapsed-control_collapsed .uikit-collapsed-control__expanded-component {width: 0;opacity: 0; } .uikit-collapsed-control[data-tooltip]::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 0; } .uikit-collapsed-control[data-tooltip]:hover::before {opacity: 1;visibility: visible; }.menu-base {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: start;align-items: start;font-family: var(--font-family-normal); }.menu-base-item {width: 100%;box-sizing: border-box;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;height: 44px;padding: 0 20px;color: var(--popup-text-color); } .menu-base-item__label {-ms-flex-positive: 1;flex-grow: 1;font-size: 15px;line-height: 20px;margin-left: 12px; } .menu-base-item__icon {width: 20px;height: 20px;-ms-flex-negative: 0;flex-shrink: 0;color: var(--popup-text-color); } .menu-base-item__value {-ms-flex-negative: 0;flex-shrink: 0;margin-left: 16px; } .menu-base-item.menu-base-item_clickable:hover {cursor: pointer;background: var(--popup-background-hover-color);color: var(--popup-text-hover-color); } .menu-base-item.menu-base-item_clickable:hover .menu-base-item__icon {color: var(--popup-text-hover-color); }.rate-menu {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;width: 100%;padding: 12px 0; } .rate-menu__caption {padding: 8px 20px;color: var(--popup-text-color);font-size: 16px;line-height: 22px;font-family: var(--font-family-bold);font-weight: 700; } .rate-menu__delimiter {width: 100%;height: 1px;background: var(--popup-text-color);opacity: 0.08;margin: 8px 0; }.presenter-info {font-family: var(--font-family-normal);box-sizing: border-box;position: relative;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;color: var(--panel-text-color); } .presenter-info__main {display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: start; } .presenter-info__info {display: inline-block;-ms-flex-positive: 1;flex-grow: 1; } .presenter-info__photo {width: 64px;height: 64px;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;overflow: hidden;border-radius: 50%;-ms-flex-negative: 0;flex-shrink: 0;background-repeat: no-repeat;background-position: center;margin-right: 20px; } .presenter-info__photo img {width: auto;height: auto; } .presenter-info__name {font-family: var(--font-family-bold);font-weight: 700;word-wrap: break-word;overflow: hidden;font-size: 16px;line-height: 22px;margin-bottom: 8px;max-height: 53px; } .presenter-info__job {word-wrap: break-word;overflow: hidden;font-size: 14px;line-height: 18px;margin-bottom: 8px; } .presenter-info__phone {word-wrap: break-word;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;font-size: 15px;line-height: 20px; } .presenter-info__links {display: -ms-flexbox;display: flex;margin-top: 8px; } .presenter-info__link {border: 1px solid var(--presenter-info-link-border-color);border-radius: 10px;width: 36px;height: 28px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;position: relative;color: var(--panel-text-color); } .presenter-info__link:not(:last-child) {margin-right: 8px; } .presenter-info__link::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 6px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .presenter-info__link:hover::before {opacity: 1;visibility: visible; } .presenter-info__link-icon {width: 20px;height: 20px; } .presenter-info .bio-container {position: relative;display: -webkit-box;white-space: normal;text-overflow: ellipsis;margin-right: -20px;margin-top: 20px;padding-right: 10px;font-size: 14px;line-height: 20px;-ms-flex-positive: 1;flex-grow: 1;height: 100%;max-height: 120px;overflow: hidden; } .presenter-info .bio-container.bio-container_collapsed {max-height: 60px; } .presenter-info .bio-container.bio-container_collapsed .scroll-area__bio {display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .presenter-info .bio-container .scroll-area {word-break: break-word;overflow: hidden; } .presenter-info .bio-container .container-top-shadow {background: __verticalGradient(var(--panel-color), transparent);background: linear-gradient(to bottom, var(--panel-color), transparent);position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; } .presenter-info .bio-container .container-bottom-shadow {background: __verticalGradient(transparent, var(--panel-color));background: linear-gradient(to bottom, transparent, var(--panel-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; } .presenter-info__show-more {font-size: 14px;line-height: 20px;height: 20px;opacity: 0.6;text-decoration: underline; } .presenter-info__show-more:hover {cursor: pointer;opacity: 0.8; } .presenter-info.presenter-info_popup {margin-bottom: 0; } .presenter-info.presenter-info_no-photo .presenter-info__info {width: 100%; }.attachments-info {font-family: var(--font-family-normal);position: relative;width: 100%;overflow: hidden;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column; } .attachments-info__scroll-area {height: 100%;overflow: hidden; } .attachments-info__delimiter {height: 1px;margin: 8px 20px 8px 62px;background: var(--popup-text-color);opacity: 0.08; } .attachments-info .container-top-shadow {background: __verticalGradient(var(--panel-color), transparent);background: linear-gradient(to bottom, var(--panel-color), transparent);position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; } .attachments-info .container-bottom-shadow {background: __verticalGradient(transparent, var(--panel-color));background: linear-gradient(to bottom, transparent, var(--panel-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; }.attach-item {padding: 8px 20px;box-sizing: border-box;display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: start;cursor: pointer; } .attach-item__icon-container {width: 36px;height: 36px;border-radius: 50%;background: var(--top-panel-icon-container-color);display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;-ms-flex-negative: 0;flex-shrink: 0;margin-right: 6px; } .attach-item__icon {width: 20px;height: 20px;color: var(--popup-text-color);opacity: 0.72; } .attach-item__info-container {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-positive: 1;flex-grow: 1;padding-left: 6px; } .attach-item__title {font-size: 15px;line-height: 20px;margin-bottom: 4px;color: var(--popup-text-color);word-break: break-word;max-height: 60px;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .attach-item__subtitle {font-size: 14px;line-height: 18px;color: var(--popup-text-color);opacity: 0.6; } .attach-item:hover {background: var(--list-item-background-hover-color); } .attach-item:hover .attach-item__title {color: var(--popup-text-hover-color); } .attach-item:hover .attach-item__subtitle {color: var(--popup-text-hover-color); } .attach-item:hover .attach-item__icon {color: var(--popup-text-hover-color); }.message-box {background: var(--player-background-color);position: absolute;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;border-radius: 7px;min-width: 280px;padding: 40px;box-shadow: 0 8px 16px rgba(0, 0, 0, 0.08); } .message-box::after {content: '';box-sizing: border-box;border: 1px solid var(--popup-border);width: 100%;height: 100%;position: absolute;left: 0;top: 0;border-radius: 7px;pointer-events: none; } .message-box__content {position: relative;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-direction: column;flex-direction: column; } .message-box__icon {width: 24px;height: 24px;margin-bottom: 24px;position: relative;display: inline-block;color: var(--text-color);opacity: 0.72; } .message-box .message-box-buttons {position: relative;width: 100%;height: 36px; } .message-box .message-box-buttons__buttons {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center; } .message-box .message-box-buttons__window-button {margin: 0 4px; } .message-box .vertical-scrollbar {top: 40px; } .message-box__message-container {overflow: hidden;display: inline-block;max-width: 480px;vertical-align: top;position: relative; } .message-box__message {text-align: center;font-size: 15px;color: var(--text-color);text-overflow: ellipsis;overflow: hidden;position: relative;font-family: Helvetica Neue, Helvetica, Roboto, Arial; } .message-box__buttons {margin-top: 28px; }.back-to-app-button {position: absolute;top: 6px;left: 12px;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;width: 40px;height: 40px; } .back-to-app-button svg path {fill: var(--text-color); }.quiz-tablet-skin {background: var(--player-background-color); } .quiz-tablet-skin .smartphone-top-panel.smartphone-top-panel_mode_reviewing .smartphone-top-panel__button.smartphone-top-panel__button_outline {-ms-grid-column: 1;grid-column: 1; }.smartphone-slide-list-slides * {box-sizing: border-box; }.universal_mini.mobile .playerView {background-color: var(--player-background-color); }.universal_mini.mobile:not(.landscape) .slide-list-header__awarded-points-cell {display: none; }.universal_mini.mobile:not(.landscape) .slide-list-header__max-points-cell {display: none; }.universal_mini.mobile:not(.landscape) .slide-state-list-row__awarded-points {display: none; }.universal_mini.mobile:not(.landscape) .slide-state-list-row__points {display: none; }.menu_layer .component_base.content {min-height: 100%; }.menu_layer .smartphone-slide-list-slides {height: 100%; }:root {--font-family-bold: PFnb;--font-family-bold-italic: PFnbi;--font-family-italic: PFni;--font-family-normal: PFn;--font-family-semibold: PFnsb, PFn;--font-family-semibold-italic: PFnsbi, PFni; }"; +let e;for(const [g,h]of Object.entries(null!=(e=a)?e:{}))a=`__${g.replace(RegExp("\\.","g"),"_")}__`,c=c.replace(new RegExp(a,"g"),h);let f;for(const [g,h]of Object.entries(null!=(f=b)?f:{}))c=c.replace(new RegExp(g,"g"),h);c=c.replace(/__verticalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.rn);c=c.replace(/__horizontalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.pn);return gn(c)}rn(a,b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}pn(a, +b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}};class DG{Uq(a,b){const c=g=>{g=sh(g);let h;for(const [l,n]of Object.entries(null!=(h=a)?h:{}))g=g.replace(new RegExp(`{${l}}`,"g"),n);return qh(g)};let d=function(){var g=["data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA5LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDksMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbD0iI0RENEIzOCIgZD0iTTIxLjA0MSwyOXY5Ljg0NGMwLDUuNTA4LDQuNjkxLDkuOTczLDEwLjQ3OSw5Ljk3M2M1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTczVjI5SDIxLjA0MXoiLz4NCjxwYXRoIGZpbGw9IiNERDRCMzgiIGQ9Ik0yNi41NTgsMjl2LTcuNjg5YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MlYyOWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNFYyOUgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjEuMDQxLDI4LjIwNnY5Ljg0NWMwLDUuNTA2LDQuNjkxLDkuOTcxLDEwLjQ3OSw5Ljk3MWM1Ljc4OSwwLDEwLjQ4LTQuNDY1LDEwLjQ4LTkuOTcxdi05Ljg0NUgyMS4wNDF6Ii8+DQo8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMjYuNTU4LDI4LjA0VjIwLjM1YzAtMi43NTYsMi4yMTktNC45OTIsNC45NTQtNC45OTJjMi43MzYsMCw0Ljk1NCwyLjIzNSw0Ljk1NCw0Ljk5MnY3LjY4OWgyLjQ3OHYtOC4wNTQNCgljMC0zLjgyOS0zLjMyNi02LjkzNC03LjQzMi02LjkzNGMtNC4xMDQsMC03LjQzMywzLjEwNC03LjQzMyw2LjkzNHY4LjA1NEgyNi41NTh6Ii8+DQo8cGF0aCBmaWxsPSIjRjA4RjgyIiBkPSJNMzQsMzYuMzY1YzAtMS4yODctMS4wNDQtMi4zMzEtMi4zMzEtMi4zMzFjLTEuMjg4LDAtMi4zMzIsMS4wNDQtMi4zMzIsMi4zMzENCgljMCwwLjk3MSwwLjU5NCwxLjgwMiwxLjQzOCwyLjE1MnY0LjQ2N2gxLjkxdi00LjUyOUMzMy40NjEsMzguMDc2LDM0LDM3LjI4NywzNCwzNi4zNjV6Ii8+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNjNweCIgaGVpZ2h0PSI2M3B4IiB2aWV3Qm94PSIwIDAgNjMgNjMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYzIDYzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRTU2NTRDIiBkPSJNMzEuNTM0LDBDNDguODg5LDAsNjMsMTQuMDczLDYzLDMxLjQ2Ng0KCUM2Myw0OC44NTksNDguODg5LDYzLDMxLjUzNCw2M0MxNC4xMTEsNjMsMCw0OC44NTksMCwzMS40NjZDMCwxNC4wNzMsMTQuMTExLDAsMzEuNTM0LDBMMzEuNTM0LDB6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YwOEY4MiIgZD0iTTMxLjUsMkM0Ny43OTIsMiw2MSwxNS4yMzksNjEsMzEuNUM2MSw0Ny44MjgsNDcuNzkyLDYxLDMxLjUsNjENCglDMTUuMjA4LDYxLDIsNDcuODI4LDIsMzEuNUMyLDE1LjIzOSwxNS4yMDgsMiwzMS41LDJMMzEuNSwyeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik01OS42NDYsMzFoLTMuMjkzQzU2LjE1OCwzMSw1NiwzMS40NDgsNTYsMzINCgljMCwwLjU1MywwLjE1OCwxLDAuMzU0LDFoMy4yOTNDNTkuODQyLDMzLDYwLDMyLjU1Myw2MCwzMkM2MCwzMS40NDgsNTkuODQyLDMxLDU5LjY0NiwzMXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjREQ0QjM4IiBkPSJNNi42NDcsMzFIMy4zNTNDMy4xNTgsMzEsMywzMS40NDgsMywzMmMwLDAuNTUzLDAuMTU4LDEsMC4zNTMsMQ0KCWgzLjI5NEM2Ljg0MiwzMyw3LDMyLjU1Myw3LDMyQzcsMzEuNDQ4LDYuODQyLDMxLDYuNjQ3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik0zMSw4YzAuNTUzLDAsMS0wLjE1OCwxLTAuMzUzVjQuMzUzQzMyLDQuMTU4LDMxLjU1Myw0LDMxLDQNCgljLTAuNTUyLDAtMSwwLjE1OC0xLDAuMzUzdjMuMjk0QzMwLDcuODQyLDMwLjQ0OCw4LDMxLDh6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTMxLDU2Yy0wLjU1MiwwLTEsMC4xNTgtMSwwLjM1NHYzLjI5M0MzMCw1OS44NDIsMzAuNDQ4LDYwLDMxLDYwDQoJYzAuNTUzLDAsMS0wLjE1OCwxLTAuMzU0di0zLjI5M0MzMiw1Ni4xNTgsMzEuNTUzLDU2LDMxLDU2eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNERDRCMzgiIGQ9Ik00Ny42NjgsMzFoLTEyLjgxQzM0LjQ5NiwyOS42LDMzLjQsMjguNTA1LDMyLDI4LjE0Mg0KCWMwLDAtMC4xNzItMC4xNDItMS0wLjE0MmMtMC44MjksMC0yLDAuNTU1LTIsMC41NTVjLTEuMTksMC42OTMtMiwxLjk2OS0yLDMuNDQ1YzAsMi4yMDksMS43OTEsNCw0LDRjMS40NzcsMCwyLjc1Mi0wLjgwOSwzLjQ0NS0yDQoJaDEzLjIyM0M0OC40MDQsMzQsNDksMzMuMzI4LDQ5LDMyLjVDNDksMzEuNjcyLDQ4LjQwNCwzMSw0Ny42NjgsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0RENEIzOCIgZD0iTTI3LjAxOCwyOS43NDhjMC41OTIsMS4wMjUsMS42NTIsMS41MiwyLjM3LDEuMTA2bDAsMA0KCWMwLjcxNy0wLjQxNSwwLjgxOS0xLjU4MSwwLjIyOC0yLjYwNmwtNy44NTctMTMuNjA5Yy0wLjU5Mi0xLjAyNC0xLjY1My0xLjUyLTIuMzcxLTEuMTA2bDAsMGMtMC43MTcsMC40MTUtMC44MTgsMS41ODEtMC4yMjgsMi42MDUNCglMMjcuMDE4LDI5Ljc0OHoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMjcuMDE4LDI4LjM2MWMwLjU5MiwxLjAyNSwxLjY1MiwxLjUyLDIuMzcsMS4xMDZsMCwwDQoJYzAuNzE3LTAuNDE1LDAuODE5LTEuNTgxLDAuMjI4LTIuNjA2bC03Ljg1Ny0xMy42MDljLTAuNTkyLTEuMDI0LTEuNjUzLTEuNTItMi4zNzEtMS4xMDZsMCwwYy0wLjcxNywwLjQxNS0wLjgxOCwxLjU4MS0wLjIyOCwyLjYwNQ0KCUwyNy4wMTgsMjguMzYxeiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgY3g9IjMxIiBjeT0iMzEiIHI9IjQiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNjAsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzU0LDFoLTMuMjkzQzU2LjE1OCwzMiw1NiwzMS41NTIsNTYsMzENCglsMCwwYzAtMC41NTIsMC4xNTgtMSwwLjM1NC0xaDMuMjkzQzU5Ljg0MiwzMCw2MCwzMC40NDgsNjAsMzFMNjAsMzF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTcsMzFjMCwwLjU1Mi0wLjE1OCwxLTAuMzUzLDFIMy4zNTNDMy4xNTgsMzIsMywzMS41NTIsMywzMWwwLDANCgljMC0wLjU1MiwwLjE1OC0xLDAuMzUzLTFoMy4yOTRDNi44NDIsMzAsNywzMC40NDgsNywzMUw3LDMxeiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0zMSwzYzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDYuODQyLDMxLjU1Myw3LDMxLDdsMCwwDQoJYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1M1YzLjM1M0MzMCwzLjE1OCwzMC40NDgsMywzMSwzTDMxLDN6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTMxLDU1YzAuNTUzLDAsMSwwLjE1OCwxLDAuMzUzdjMuMjk0QzMyLDU4Ljg0MiwzMS41NTMsNTksMzEsNTkNCglsMCwwYy0wLjU1MiwwLTEtMC4xNTgtMS0wLjM1NHYtMy4yOTRDMzAsNTUuMTU4LDMwLjQ0OCw1NSwzMSw1NUwzMSw1NXoiLz4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNNDksMzEuNDk5QzQ5LDMwLjY3Miw0OC40MDQsMzAsNDcuNjY4LDMwSDM0LjMzMw0KCUMzMy41OTYsMzAsMzMsMzAuNjcxLDMzLDMxLjVsMCwwYzAsMC44MjgsMC41OTYsMS41LDEuMzMzLDEuNWgxMy4zMzVDNDguNDA0LDMzLDQ5LDMyLjMyOCw0OSwzMS40OTlMNDksMzEuNDk5eiIvPg0KPGNpcmNsZSBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0YxNjE1NSIgY3g9IjMxIiBjeT0iMzEiIHI9IjIiLz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjM2MzgxNDQiPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgzNjAiIGNsYXNzPSJmaWwwIiBkPSJNNi43NzM1IDMuOTc5bDAgLTMuNDQyNDVjMCwtMC4yOTUxMTkgLTAuMjQxNDMzLC0wLjUzNjU1MiAtMC41MzY1NTIsLTAuNTM2NTUybC02LjIzNjk1IDAgMCA0LjUxNTU1IDYuMjM2OTUgMGMwLjI5NTExOSwwIDAuNTM2NTUyLC0wLjI0MTQzMyAwLjUzNjU1MiwtMC41MzY1NTJ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMzYzODEyMCIgY2xhc3M9ImZpbDEiIGQ9Ik0zLjE4NzUgMS4yMzAyMWwtMC4zMzU1NTIgMC4zMzU1MTQgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAtMC4yMjM2NjQgMC4yMjM2NjQgMC40NDczNjUgMC40NDczNjUgLTAuMzM1NTE0IDAuMzM1NTUyIDAuODk0NzMgMCAwIC0wLjg5NDczem0wLjI2NTY0MSAyLjA1NTFsMC4zMzU1MTQgLTAuMzM1NTE0IDAuNDQ3MzY1IDAuNDQ3MzY1IDAuMjIzNzAxIC0wLjIyMzcwMSAtMC40NDczNjUgLTAuNDQ3MzY1IDAuMzM1NTE0IC0wLjMzNTUxNCAtMC44OTQ3MyAwIDAgMC44OTQ3M3oiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDojRkVGRUZFO2ZpbGwtb3BhY2l0eTowLjEwMTk2MX0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIzNjM4MTQ0Ij4NCiAgIDxwYXRoIGlkPSJfMTIzNjM4MzYwIiBjbGFzcz0iZmlsMCIgZD0iTTYuNzczNSAzLjk3OWwwIC0zLjQ0MjQ1YzAsLTAuMjk1MTE5IC0wLjI0MTQzMywtMC41MzY1NTIgLTAuNTM2NTUyLC0wLjUzNjU1MmwtNi4yMzY5NSAwIDAgNC41MTU1NSA2LjIzNjk1IDBjMC4yOTUxMTksMCAwLjUzNjU1MiwtMC4yNDE0MzMgMC41MzY1NTIsLTAuNTM2NTUyeiIvPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgxMjAiIGNsYXNzPSJmaWwxIiBkPSJNMy4xODc1IDEuMjMwMjFsLTAuMzM1NTUyIDAuMzM1NTE0IC0wLjQ0NzM2NSAtMC40NDczNjUgLTAuMjIzNjY0IDAuMjIzNjY0IDAuNDQ3MzY1IDAuNDQ3MzY1IC0wLjMzNTUxNCAwLjMzNTU1MiAwLjg5NDczIDAgMCAtMC44OTQ3M3ptMC4yNjU2NDEgMi4wNTUxbDAuMzM1NTE0IC0wLjMzNTUxNCAwLjQ0NzM2NSAwLjQ0NzM2NSAwLjIyMzcwMSAtMC4yMjM3MDEgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAwLjMzNTUxNCAtMC4zMzU1MTQgLTAuODk0NzMgMCAwIDAuODk0NzN6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNi43NzM1IDQuNTE1NTUiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDojRkVGRUZFO2ZpbGwtb3BhY2l0eTowLjA1MDk4MH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIzNjM4MTQ0Ij4NCiAgIDxwYXRoIGlkPSJfMTIzNjM4MzYwIiBjbGFzcz0iZmlsMCIgZD0iTTYuNzczNSAzLjk3OWwwIC0zLjQ0MjQ1YzAsLTAuMjk1MTE5IC0wLjI0MTQzMywtMC41MzY1NTIgLTAuNTM2NTUyLC0wLjUzNjU1MmwtNi4yMzY5NSAwIDAgNC41MTU1NSA2LjIzNjk1IDBjMC4yOTUxMTksMCAwLjUzNjU1MiwtMC4yNDE0MzMgMC41MzY1NTIsLTAuNTM2NTUyeiIvPg0KICAgPHBhdGggaWQ9Il8xMjM2MzgxMjAiIGNsYXNzPSJmaWwxIiBkPSJNMy4xODc1IDEuMjMwMjFsLTAuMzM1NTUyIDAuMzM1NTE0IC0wLjQ0NzM2NSAtMC40NDczNjUgLTAuMjIzNjY0IDAuMjIzNjY0IDAuNDQ3MzY1IDAuNDQ3MzY1IC0wLjMzNTUxNCAwLjMzNTU1MiAwLjg5NDczIDAgMCAtMC44OTQ3M3ptMC4yNjU2NDEgMi4wNTUxbDAuMzM1NTE0IC0wLjMzNTUxNCAwLjQ0NzM2NSAwLjQ0NzM2NSAwLjIyMzcwMSAtMC4yMjM3MDEgLTAuNDQ3MzY1IC0wLjQ0NzM2NSAwLjMzNTUxNCAtMC4zMzU1MTQgLTAuODk0NzMgMCAwIDAuODk0NzN6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACHDwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKNWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAASMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEoqGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAGeIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gzSZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25qbc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9CvjcM4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjKuLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqxOPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIWiAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFVSAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAyrA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYghUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7rh2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SEdJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3JaSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQtlHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJy5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hopb2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsyu21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCccNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527PYS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOwEaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6sfaznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy+rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVsS1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9UxlfeqXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/wjowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9Vt1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503rm10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7Pnl/eriQvLDwG/eE8/s6uL5TAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAAGnRFWHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS4xMDD0cqEAAABfSURBVChTY/j//z8DMZgoRSCD4ApLK6rYgLgDiJ9CMYjNBrMNWWHnvAUL/3/4+BGMQWygwk5sCp+CFMDAhw8fQAqfYlcIlCRGYeeceQv+g0wCYRAbl9XEeYZQWBIdjgCVaiC8JN1udgAAAABJRU5ErkJggg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAACuSURBVHicY/n//z8DCLh7+/sAqWIgNmGAgDNA3Ltz68YtIA4LVFELkKpmQAUOIAyUawUqrmEBMnyxKEIG1UA1J0EmFsFELC3MGfJzssDsSVOnMxw7fgImVQRSaAzjgRQJCgqA2XnZmcgKjVnwWIkCWKC+cwRxJk6eypCfm80AYyOBMyCF/TCFx0+eAmMsoJ8F6PXNoCBgwO1zUPBsBrsRFE5AxSCXFzKgBng/LMABrBM9cyiwScIAAAAASUVORK5CYII=", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAZCAYAAABtnU33AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAETSURBVHic7ZgxCsJAFAUXSaeIpScQDyCCguA5rEUQEbWzsvACKhICaquHUQu18hxi6vgebCSgwSb5C2sGhpBkIX+aZIkTBIHS1OAI1mFR2cEDHuEKnnnB0TeGcAlzZuZKjTKswA4cwzWDW8rO2ChsY+OFwVNld2wIG6cMbpqeRJAmg0umpxCk5PxeYxdZsO1kwbaTBdvOXwb7MG96ECF8Bt9gw/QkQlwZ7Kr/CXYZvIdt2DU7S+rs4CF8afXgCU5g1dhI6XCHC7jlSRjM/zwbbUGbJDPY/7HGg/OEn/vUvvn2WfpYlAADfYyL9vSaIOZ+Ykh9hxkSFy0WSyQ3Ht+iRWOJ9E4rGq2UcCwxsbWMRovGkhc6FTEV3QXLmAAAAABJRU5ErkJggg==", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAElJREFUSEvt0qERAEAIA0H6b5rXL1ecI5qQOcIsanB+3TC5egZOyJm9B2Zgw0EnF+AeekPC+S3tGTjhoJMLcA+9IeG89+6L04QHtFKarLFAHLUAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAwCAYAAAAlzZsxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAFBJREFUSEvtkjEKADAIA/PpQunnWzo63nBbBDdjOGPWPpd0yPCf5YLo5TNgB52Z54AZsKDQygVwDr5A4RxLfQbsUGjlAjgHX6Bw9r394KjDAzeSX574b7LUAAAAAElFTkSuQmCC", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAyMCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik03LjE3MDI1IDMuMDkxODJDOC4wNzEzMiAyLjY5OTkyIDkuMDMyNDkgMi41IDEwIDIuNUMxMC45Njc1IDIuNSAxMS45Mjg3IDIuNjk5OTIgMTIuODI5NyAzLjA5MTgyQzEzLjczMTIgMy40ODM4NyAxNC41NTgzIDQuMDYyMDIgMTUuMjYwNyA0Ljc5OTUyQzE1Ljk2MzQgNS41MzcyOCAxNi41MjY4IDYuNDE5NjcgMTYuOTEzMiA3LjM5OTI0QzE3LjI5OTcgOC4zNzg5NyAxNy41IDkuNDMyOTUgMTcuNSAxMC41SDIwQzIwIDkuMTIxMTIgMTkuNzQxMyA3Ljc1NTc0IDE5LjIzODggNi40ODE4MkMxOC43MzYyIDUuMjA3OSAxNy45OTk2IDQuMDUwMzkgMTcuMDcxMSAzLjA3NTM4QzE2LjE0MjUgMi4xMDAzNiAxNS4wNDAxIDEuMzI2OTQgMTMuODI2OCAwLjc5OTI2NUMxMi42MTM2IDAuMjcxNTg5IDExLjMxMzIgMCAxMCAwQzguNjg2NzggMCA3LjM4NjQyIDAuMjcxNTg5IDYuMTczMTcgMC43OTkyNjVDNC45NTk5MiAxLjMyNjk0IDMuODU3NTIgMi4xMDAzNiAyLjkyODkzIDMuMDc1MzhDMi4wMDAzNSA0LjA1MDM5IDEuMjYzNzUgNS4yMDc5IDAuNzYxMjA0IDYuNDgxODJDMC4yNTg2NTggNy43NTU3NCAwIDkuMTIxMTIgMCAxMC41SDIuNUMyLjUgOS40MzI5NSAyLjcwMDMgOC4zNzg5NyAzLjA4Njc5IDcuMzk5MjRDMy40NzMyMiA2LjQxOTY3IDQuMDM2NjUgNS41MzcyOCA0LjczOTI4IDQuNzk5NTJDNS40NDE2NiA0LjA2MjAyIDYuMjY4ODUgMy40ODM4NyA3LjE3MDI1IDMuMDkxODJaTTEwLjU3MSA3LjU4MzM1QzEwLjY4NDMgNy40OTI4MyAxMC43OTY2IDcuNDA0NSAxMC45MDcxIDcuMzE4ODNDMTEuMzUxNyA2Ljk3NDAzIDExLjc2NTggNi42NzI0MyAxMi4wODY4IDYuNDQ0OTlDMTIuMTcxNyA2LjM4NDgxIDEyLjI1MDEgNi4zMjk4MSAxMi4zMjA5IDYuMjgwNThDMTIuNDkgNi4xNjI5MiAxMi43MTIgNi4yOTExIDEyLjY5NDYgNi40OTYzOEMxMi42ODc0IDYuNTgyMjYgMTIuNjc5IDYuNjc3NjggMTIuNjY5MyA2Ljc4MTM0QzEyLjYzMjkgNy4xNzMwNCAxMi41Nzg3IDcuNjgyNDcgMTIuNTAyNCA4LjIzOTg4QzEyLjQ4MzQgOC4zNzgzNyAxMi40NjMxIDguNTE5ODIgMTIuNDQxMyA4LjY2MzE2QzEyLjI0NjggOS45NDQxNSAxMS45Mzc1IDExLjM3NjIgMTEuNDY0MSAxMi4xOTYyQzExLjA3MzYgMTIuODcyNiAxMC4wMzExIDEzLjY3ODIgOC43MzIwNSAxMi45MjgyQzcuNDMzMDEgMTIuMTc4MiA3LjYwOTQ4IDEwLjg3MjYgOCAxMC4xOTYyQzguNDczMzcgOS4zNzYyNSA5LjU1ODk0IDguMzkyMzEgMTAuNTcxIDcuNTgzMzVaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NzA3MjgiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjMzNjc2NjQiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjkxNDI4IDAuNjkxNDI4LDAuNjkxNDI4IDAuNjkxNDI4LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTcwNzA0IiBjbGFzcz0iZmlsMSIgZD0iTTAuMzQ1NzM2IDAuMTU3MTg4bC0wLjEyNTcyMiAwLjA5NDI2NDkgLTAuMDk0MzAwNiAwIDAgMC4xODg1ODMgMC4wOTQzMDA2IDAgMC4xMjU3MjIgMC4wOTQyNjQ5IDAgLTAuMzc3MTEzem0wLjE1NzExNyAtMi42NzI2N2UtMDA1bDAuMDMxNDMwNiAwIDAgMC4zNzcxNCAtMC4wMzE0MzA2IDAgMCAtMC4zNzcxNHptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjI1MTQwOSAtMC4wMzE0MzA2IDAgMCAtMC4yNTE0MDl6bS0wLjA2Mjg0MzMgMC4wNjI4NjExbDAuMDMxNDMwNiAwIDAgMC4xMjU2ODcgLTAuMDMxNDMwNiAwIDAgLTAuMTI1Njg3eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42OTE0MjggMC42OTE0MjgiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk3MDcyOCI+DQogICA8cG9seWdvbiBpZD0iXzEyMzM2NzY2NCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42OTE0MjggMC42OTE0MjgsMC42OTE0MjggMC42OTE0MjgsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NzA3MDQiIGNsYXNzPSJmaWwxIiBkPSJNMC4zNDU3MzYgMC4xNTcxODhsLTAuMTI1NzIyIDAuMDk0MjY0OSAtMC4wOTQzMDA2IDAgMCAwLjE4ODU4MyAwLjA5NDMwMDYgMCAwLjEyNTcyMiAwLjA5NDI2NDkgMCAtMC4zNzcxMTN6bTAuMTU3MTE3IC0yLjY3MjY3ZS0wMDVsMC4wMzE0MzA2IDAgMCAwLjM3NzE0IC0wLjAzMTQzMDYgMCAwIC0wLjM3NzE0em0tMC4wNjI4NDMzIDAuMDYyODYxMWwwLjAzMTQzMDYgMCAwIDAuMjUxNDA5IC0wLjAzMTQzMDYgMCAwIC0wLjI1MTQwOXptLTAuMDYyODQzMyAwLjA2Mjg2MTFsMC4wMzE0MzA2IDAgMCAwLjEyNTY4NyAtMC4wMzE0MzA2IDAgMCAtMC4xMjU2ODd6Ii8+DQogIDwvZz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6d2hpdGV9DQogICAgLmZpbDAge2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjAuMDAwMDAwfQ0KICAgXV0+DQogIDwvc3R5bGU+DQogPC9kZWZzPg0KIDxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCiAgPG1ldGFkYXRhIGlkPSJDb3JlbENvcnBJRF8wQ29yZWwtTGF5ZXIiLz4NCiAgPGcgaWQ9Il8xMjE5NjkwMjQiPg0KICAgPHBvbHlnb24gaWQ9Il8xMjE5NjkyNDAiIGNsYXNzPSJmaWwwIiBwb2ludHM9Ii0wLDAuNjQzNjE2IDAuNjQzNjE2LDAuNjQzNjE2IDAuNjQzNjE2LDAgLTAsMCAiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY5MDAwIiBjbGFzcz0iZmlsMSIgZD0iTTAuMzIxODM3IDAuMTQ2MzAybC0wLjExNzAyOSAwLjA4Nzc0NjYgLTAuMDg3Nzc5NyAwIDAgMC4xNzU1NDMgMC4wODc3Nzk3IDAgMC4xMTcwMjkgMC4wODc3NDY2IDAgLTAuMzUxMDM2em0wLjI3NzkwMSAwLjI1MDcyNmwtMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjA5MzA4NzIgLTAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAtMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAwLjAyMDY5MDYgLTAuMDIwNjkwNiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAwLjAyMDY5MDYgLTAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIDAuMDkzMDg3MnoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6I0ZFRkVGRX0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMC42NDM2MTYgMC42NDM2MTYiDQogeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KIDxkZWZzPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgPCFbQ0RBVEFbDQogICAgLmZpbDEge2ZpbGw6Izk2OTY5Nn0NCiAgICAuZmlsMCB7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MC4wMDAwMDB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2OTAyNCI+DQogICA8cG9seWdvbiBpZD0iXzEyMTk2OTI0MCIgY2xhc3M9ImZpbDAiIHBvaW50cz0iLTAsMC42NDM2MTYgMC42NDM2MTYsMC42NDM2MTYgMC42NDM2MTYsMCAtMCwwICIvPg0KICAgPHBhdGggaWQ9Il8xMjE5NjkwMDAiIGNsYXNzPSJmaWwxIiBkPSJNMC4zMjE4MzcgMC4xNDYzMDJsLTAuMTE3MDI5IDAuMDg3NzQ2NiAtMC4wODc3Nzk3IDAgMCAwLjE3NTU0MyAwLjA4Nzc3OTcgMCAwLjExNzAyOSAwLjA4Nzc0NjYgMCAtMC4zNTEwMzZ6bTAuMjc3OTAxIDAuMjUwNzI2bC0wLjAyMDY5MDYgMC4wMjA2OTA2IC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDkzMDg3MiAtMC4wMjA2OTA2IC0wLjAyMDY5MDYgMC4wOTMwODcyIC0wLjA5MzA4NzIgLTAuMDkzMDg3MiAtMC4wOTMwODcyIDAuMDIwNjkwNiAtMC4wMjA2OTA2IDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyIC0wLjA5MzA4NzIgMC4wMjA2OTA2IDAuMDIwNjkwNiAtMC4wOTMwODcyIDAuMDkzMDg3MiAwLjA5MzA4NzIgMC4wOTMwODcyeiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTggM0MxOS4xMDQ2IDMgMjAgMy44OTU0MyAyMCA1VjE1QzIwIDE2LjEwNDYgMTkuMTA0NiAxNyAxOCAxN0gyQzAuODk1NDMxIDE3IDAgMTYuMTA0NiAwIDE1VjVDMCAzLjg5NTQzIDAuODk1NDMxIDMgMiAzSDE4Wk02LjU4MDA4IDcuMDA0ODhDNS41OTgzIDcuMDA0ODggNC44MjYwMSA3LjMyMDE1IDQuMjYzMTggNy45NTA2OEMzLjcwMDM1IDguNTgxMjIgMy40MTg5NSA5LjQyNTQ1IDMuNDE4OTUgMTAuNDgzNFYxMC42MDRDMy40MTg5NSAxMS43MDQzIDMuNzAyNDcgMTIuNTY2NSA0LjI2OTUzIDEzLjE5MDdDNC44MzY1OSAxMy44MTQ5IDUuNjExIDE0LjEyNyA2LjU5Mjc3IDE0LjEyN0M3LjExNzUyIDE0LjEyNyA3LjU5Njc2IDE0LjAyMDEgOC4wMzA1MiAxMy44MDY0QzguNDY0MjggMTMuNTkyNyA4LjgwNTk5IDEzLjI5MjIgOS4wNTU2NiAxMi45MDVDOS4zMDUzNCAxMi41MTc4IDkuNDMyMjkgMTIuMDkxNSA5LjQzNjUyIDExLjYyNkg3LjcxNjMxQzcuNzA3ODQgMTEuOTM0OSA3LjU5NzgyIDEyLjE4MjUgNy4zODYyMyAxMi4zNjg3QzcuMTc0NjQgMTIuNTU0OSA2Ljg5OTU4IDEyLjY0NzkgNi41NjEwNCAxMi42NDc5QzYuMTIwOTMgMTIuNjQ3OSA1Ljc5Mjk3IDEyLjQ5MzUgNS41NzcxNSAxMi4xODQ2QzUuMzYxMzMgMTEuODc1NiA1LjI1MzQyIDExLjM2NzggNS4yNTM0MiAxMC42NjExVjEwLjQ3MDdDNS4yNTM0MiA5Ljc3MjQ2IDUuMzYyMzkgOS4yNjc4MiA1LjU4MDMyIDguOTU2NzlDNS43OTgyNiA4LjY0NTc1IDYuMTIwOTMgOC40OTAyMyA2LjU0ODM0IDguNDkwMjNDNi44OTUzNSA4LjQ5MDIzIDcuMTc0NjQgOC42MDEzMiA3LjM4NjIzIDguODIzNDlDNy41OTc4MiA5LjA0NTY2IDcuNzA3ODQgOS4zMzQ0NyA3LjcxNjMxIDkuNjg5OTRIOS40MzY1MkM5LjQyODA2IDguODc3NDQgOS4xNjQ2NCA4LjIyNjgxIDguNjQ2MjQgNy43MzgwNEM4LjEyNzg1IDcuMjQ5MjcgNy40MzkxMyA3LjAwNDg4IDYuNTgwMDggNy4wMDQ4OFpNMTMuMzU5NCA3LjAwNDg4QzEyLjM3NzYgNy4wMDQ4OCAxMS42MDUzIDcuMzIwMTUgMTEuMDQyNSA3Ljk1MDY4QzEwLjQ3OTcgOC41ODEyMiAxMC4xOTgyIDkuNDI1NDUgMTAuMTk4MiAxMC40ODM0VjEwLjYwNEMxMC4xOTgyIDExLjcwNDMgMTAuNDgxOCAxMi41NjY1IDExLjA0ODggMTMuMTkwN0MxMS42MTU5IDEzLjgxNDkgMTIuMzkwMyAxNC4xMjcgMTMuMzcyMSAxNC4xMjdDMTMuODk2OCAxNC4xMjcgMTQuMzc2MSAxNC4wMjAxIDE0LjgwOTggMTMuODA2NEMxNS4yNDM2IDEzLjU5MjcgMTUuNTg1MyAxMy4yOTIyIDE1LjgzNSAxMi45MDVDMTYuMDg0NiAxMi41MTc4IDE2LjIxMTYgMTIuMDkxNSAxNi4yMTU4IDExLjYyNkgxNC40OTU2QzE0LjQ4NzEgMTEuOTM0OSAxNC4zNzcxIDEyLjE4MjUgMTQuMTY1NSAxMi4zNjg3QzEzLjk1MzkgMTIuNTU0OSAxMy42Nzg5IDEyLjY0NzkgMTMuMzQwMyAxMi42NDc5QzEyLjkwMDIgMTIuNjQ3OSAxMi41NzIzIDEyLjQ5MzUgMTIuMzU2NCAxMi4xODQ2QzEyLjE0MDYgMTEuODc1NiAxMi4wMzI3IDExLjM2NzggMTIuMDMyNyAxMC42NjExVjEwLjQ3MDdDMTIuMDMyNyA5Ljc3MjQ2IDEyLjE0MTcgOS4yNjc4MiAxMi4zNTk2IDguOTU2NzlDMTIuNTc3NiA4LjY0NTc1IDEyLjkwMDIgOC40OTAyMyAxMy4zMjc2IDguNDkwMjNDMTMuNjc0NiA4LjQ5MDIzIDEzLjk1MzkgOC42MDEzMiAxNC4xNjU1IDguODIzNDlDMTQuMzc3MSA5LjA0NTY2IDE0LjQ4NzEgOS4zMzQ0NyAxNC40OTU2IDkuNjg5OTRIMTYuMjE1OEMxNi4yMDc0IDguODc3NDQgMTUuOTQzOSA4LjIyNjgxIDE1LjQyNTUgNy43MzgwNEMxNC45MDcxIDcuMjQ5MjcgMTQuMjE4NCA3LjAwNDg4IDEzLjM1OTQgNy4wMDQ4OFoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxwYXRoIGNsYXNzPSJmaWwwIiBkPSJNLTAgMC4yNzExMDFsMCAxLjczOTM1YzAsMC4xNDkxMTMgMC4xMjE5ODgsMC4yNzExMDEgMC4yNzExMDEsMC4yNzExMDFsMy4xNTEzMSAwIDAgLTIuMjgxNTUgLTMuMTUxMzEgMGMtMC4xNDkxMTMsMCAtMC4yNzExMDEsMC4xMjE5ODggLTAuMjcxMTAxLDAuMjcxMTAxeiIvPg0KICA8cG9seWdvbiBjbGFzcz0iZmlsMSIgcG9pbnRzPSIxLjQwOTIsMC42NzEwMzggMi4wODAyOCwxLjE0MDc3IDEuNDA5MiwxLjYxMDUxICIvPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgMy40MjI0MSAyLjI4MTU1Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8cGF0aCBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMjcxMTAxbDAgMS43MzkzNWMwLDAuMTQ5MTEzIDAuMTIxOTg4LDAuMjcxMTAxIDAuMjcxMTAxLDAuMjcxMTAxbDMuMTUxMzEgMCAwIC0yLjI4MTU1IC0zLjE1MTMxIDBjLTAuMTQ5MTEzLDAgLTAuMjcxMTAxLDAuMTIxOTg4IC0wLjI3MTEwMSwwLjI3MTEwMXoiLz4NCiAgPHBvbHlnb24gY2xhc3M9ImZpbDEiIHBvaW50cz0iMS40MDkyLDAuNjcxMDM4IDIuMDgwMjgsMS4xNDA3NyAxLjQwOTIsMS42MTA1MSAiLz4NCiA8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOndoaXRlfQ0KICAgIC5maWwwIHtmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eTowLjAwMDAwMH0NCiAgIF1dPg0KICA8L3N0eWxlPg0KIDwvZGVmcz4NCiA8ZyBpZD0i0KHQu9C+0LlfeDAwMjBfMSI+DQogIDxtZXRhZGF0YSBpZD0iQ29yZWxDb3JwSURfMENvcmVsLUxheWVyIi8+DQogIDxnIGlkPSJfMTIxOTY2NTUyIj4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NzY4IiBjbGFzcz0iZmlsMCIgZD0iTS0wIDAuMzIzOTU2bDAgMi4wNzg0NmMwLDAuMTc4MTg1IDAuMTQ1NzcxLDAuMzIzOTU2IDAuMzIzOTU2LDAuMzIzOTU2bDMuNzY1NzEgMCAwIC0yLjcyNjM4IC0zLjc2NTcxIDBjLTAuMTc4MTg1LDAgLTAuMzIzOTU2LDAuMTQ1NzcxIC0wLjMyMzk1NiwwLjMyMzk1NnoiLz4NCiAgIDxwYXRoIGlkPSJfMTIxOTY2NTI4IiBjbGFzcz0iZmlsMSIgZD0iTTEuNjAzOCAwLjg4MjAzOGwwLjMyMDc1MSAwIDAgMC45NjIyNTQgLTAuMzIwNzUxIDAgMCAtMC45NjIyNTR6bTAuNTYxMzMyIDBsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0eiIvPg0KICA8L2c+DQogPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiNGRUZFRkV9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4xMDE5NjF9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8IS0tIENyZWF0b3I6IENvcmVsRFJBVyAtLT4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiDQp2aWV3Qm94PSIwIDAgNC4wODk2NyAyLjcyNjM4Ig0KIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiA8ZGVmcz4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgIDwhW0NEQVRBWw0KICAgIC5maWwxIHtmaWxsOiM5Njk2OTZ9DQogICAgLmZpbDAge2ZpbGw6I0ZFRkVGRTtmaWxsLW9wYWNpdHk6MC4wNTA5ODB9DQogICBdXT4NCiAgPC9zdHlsZT4NCiA8L2RlZnM+DQogPGcgaWQ9ItCh0LvQvtC5X3gwMDIwXzEiPg0KICA8bWV0YWRhdGEgaWQ9IkNvcmVsQ29ycElEXzBDb3JlbC1MYXllciIvPg0KICA8ZyBpZD0iXzEyMTk2NjU1MiI+DQogICA8cGF0aCBpZD0iXzEyMTk2Njc2OCIgY2xhc3M9ImZpbDAiIGQ9Ik0tMCAwLjMyMzk1NmwwIDIuMDc4NDZjMCwwLjE3ODE4NSAwLjE0NTc3MSwwLjMyMzk1NiAwLjMyMzk1NiwwLjMyMzk1NmwzLjc2NTcxIDAgMCAtMi43MjYzOCAtMy43NjU3MSAwYy0wLjE3ODE4NSwwIC0wLjMyMzk1NiwwLjE0NTc3MSAtMC4zMjM5NTYsMC4zMjM5NTZ6Ii8+DQogICA8cGF0aCBpZD0iXzEyMTk2NjUyOCIgY2xhc3M9ImZpbDEiIGQ9Ik0xLjYwMzggMC44ODIwMzhsMC4zMjA3NTEgMCAwIDAuOTYyMjU0IC0wLjMyMDc1MSAwIDAgLTAuOTYyMjU0em0wLjU2MTMzMiAwbDAuMzIwNzUxIDAgMCAwLjk2MjI1NCAtMC4zMjA3NTEgMCAwIC0wLjk2MjI1NHoiLz4NCiAgPC9nPg0KIDwvZz4NCjwvc3ZnPg0K", +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAhCAYAAAAYucG/AAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAA+SURBVHicY/H09pViYQACFi4uLgYWbm5uOAHncsG4/Pz8xKv79u0bA8vXr1/hBJz7Dcb9+PEjIXVzZs18BgAgpy6CcHz1VgAAAABJRU5ErkJggg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsLW9wYWNpdHk9IjAiIGQ9Ik01MSw0LjA0MXYyNS45MThDNTEsMzIuMTgyLDQ5LjE4MiwzNCw0Ni45NiwzNEgwVjBoNDYuOTZDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDENCgkJCUw1MSw0LjA0MXoiLz4NCgkJPHBhdGggaWQ9Il8xMjMzNzQxNDQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xOCwxNS43MzdsMi41MjYtMi41MjZsMy4zNjksMy4zNjlsMS42ODQtMS42ODVsLTMuMzY4LTMuMzY4TDI0LjczNiw5aC01LjA1M0gxOHYxLjY4NA0KCQkJVjE1LjczN3ogTTM0LDE4LjI2NGwtMi41MjcsMi41MjVsLTMuMzY4LTMuMzY4bC0xLjY4NSwxLjY4NWwzLjM2OSwzLjM2N0wyNy4yNjMsMjVoNS4wNTNIMzR2LTEuNjg1VjE4LjI2NHoiLz4NCgk8L2c+DQo8L2c+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMTAyIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjRkVGRUZFIiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTFweCIgaGVpZ2h0PSIzNHB4IiB2aWV3Qm94PSIwIDAgNTEgMzQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxIDM0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSLQodC70L7QuV94MDAyMF8xIj4NCgk8ZyBpZD0iXzEyMzM3NDE2OCI+DQoJCTxwYXRoIGlkPSJfMTIzMzc0Mzg0IiBmaWxsPSIjRkVGRUZFIiBmaWxsLW9wYWNpdHk9IjAuMDUxIiBkPSJNNTEsNC4wNDF2MjUuOTE4QzUxLDMyLjE4Miw0OS4xODIsMzQsNDYuOTYsMzRIMFYwaDQ2Ljk2DQoJCQlDNDkuMTgyLDAsNTEsMS44MTgsNTEsNC4wNDFMNTEsNC4wNDF6Ii8+DQoJCTxwYXRoIGlkPSJfMTIzMzc0MTQ0IiBmaWxsPSIjOTY5Njk2IiBkPSJNMTgsMTUuNzM3bDIuNTI2LTIuNTI2bDMuMzY5LDMuMzY5bDEuNjg0LTEuNjg1bC0zLjM2OC0zLjM2OEwyNC43MzYsOWgtNS4wNTNIMTh2MS42ODQNCgkJCVYxNS43Mzd6IE0zNCwxOC4yNjRsLTIuNTI3LDIuNTI1bC0zLjM2OC0zLjM2OGwtMS42ODUsMS42ODVsMy4zNjksMy4zNjdMMjcuMjYzLDI1aDUuMDUzSDM0di0xLjY4NVYxOC4yNjR6Ii8+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTRweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgMTQgMTUiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDU4ICg4NDY2MykgLSBodHRwczovL3NrZXRjaC5jb20gLS0+CiAgICA8dGl0bGU+dGljay1jb21ib2JveDwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJQRC0zNzQ0LeKAlC0yIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNzkwLjAwMDAwMCwgLTQzMS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgaWQ9InRpY2stY29tYm9ib3giIHRyYW5zZm9ybT0idHJhbnNsYXRlKDc4OS4wMDAwMDAsIDQzMC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMy4zNDQ3NjY4LDEuNjU5MzMyNTIgTDUuOCwxMi41ODY3MjE4IEw1LjgsMTIuNTg2NzIxOCBMMi42MDU2MzE3Nyw4LjkzNDE5NjUyIEMyLjM1MzE1MjQxLDguNjQ1NTA0OTMgMS45MTQ0NDY2Nyw4LjYxNjE0OTExIDEuNjI1NzU1MDcsOC44Njg2Mjg0OCBDMS41NzczMDU0Miw4LjkxMTAwMDgyIDEuNTM0OTgxOTMsOC45NTk5MDMyNiAxLjUsOS4wMTM5MzE0OCBDMS4yMDYzNDk0OSw5LjQ2NzQ2MzE2IDEuMjYwMDExMDgsMTAuMDYyODI2MyAxLjYzMDAyNTk4LDEwLjQ1NjU0MDEgTDUuNDc5NzMxMTgsMTQuNTUyODEzNSBDNS42Njg4NDMyLDE0Ljc1NDAzNzkgNS45ODUyNzMzOSwxNC43NjM4NTY5IDYuMTg2NDk3NzcsMTQuNTc0NzQ0OSBDNi4yMTEyMjc0NywxNC41NTE1MDM4IDYuMjMzNTI2NzQsMTQuNTI1ODA1MyA2LjI1MzA1MDY3LDE0LjQ5ODA0NyBMMTQuNTM5MDU1MywyLjcxNzM0NDAzIEMxNC44MDE1Mjc3LDIuMzQ0MTcxNDggMTQuNzQxNjUzNywxLjgzMzM1NzAzIDE0LjQsMS41MzA5OTU4NyBDMTQuMTA2MjM3OCwxLjI3MTAxODMyIDEzLjY1NzM0MywxLjI5ODQwNjIyIDEzLjM5NzM2NTUsMS41OTIxNjg0NCBDMTMuMzc4NTAyNywxLjYxMzQ4MjQgMTMuMzYwOTM4MiwxLjYzNTkxMDg3IDEzLjM0NDc2NjgsMS42NTkzMzI1MiBaIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cG9seWxpbmUgaWQ9IlBhdGgtMiIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjIiIHBvaW50cz0iMiA5LjY1NjUyODE3IDUuODYxNjc5NzcgMTQgMTQgMiI+PC9wb2x5bGluZT4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjIsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9ItCh0LvQvtC5XzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMzVweCIgaGVpZ2h0PSIzNXB4IiB2aWV3Qm94PSIwIDAgMzUgMzUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDM1IDM1IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMTcuNSwzNUMyNy4xMzksMzUsMzUsMjcuMTM4LDM1LDE3LjVDMzUsNy44NjEsMjcuMTM5LDAsMTcuNSwwDQoJQzcuODYxLDAsMCw3Ljg2MSwwLDE3LjVDMCwyNy4xMzgsNy44NjEsMzUsMTcuNSwzNXoiLz4NCjxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTcuNTAwNSIgeTE9IjIuNjQ5OSIgeDI9IjE3LjUwMDUiIHkyPSIzMi4zNDkiPg0KCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiM1Q0IwRkYiLz4NCgk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMTI5MEZGIi8+DQo8L2xpbmVhckdyYWRpZW50Pg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9InVybCgjU1ZHSURfMV8pIiBkPSJNMTcuNSwzMy45OTljOS4wODgsMCwxNi41LTcuNDEyLDE2LjUtMTYuNDk5DQoJUzI2LjU4NywxLDE3LjUsMUM4LjQxMywxLDEuMDAxLDguNDEzLDEuMDAxLDE3LjVTOC40MTMsMzMuOTk5LDE3LjUsMzMuOTk5eiIvPg0KPHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTE4LjM2OCwyMi41aC0zYy0wLjAwOC0wLjQ2MywwLTAuODk3LDAtMWMwLTEuMDM3LDAuMDU1LTEuODgxLDAuMzk2LTIuNTUNCgljMC4zNDQtMC42NzMsMS4wMzMtMS40MjMsMi4wNjMtMi4yNjRjMS4wMjgtMC44MzUsMS42NDYtMS4zODQsMS44NDMtMS42NDZjMC4zMTMtMC40MDcsMC40NjgtMC44NjIsMC40NjgtMS4zNTQNCgljMC0wLjY4Ni0wLjI3NS0xLjI3My0wLjgyNC0xLjc2NmMtMC41NDktMC40ODktMS4yODUtMC43MzMtMi4yMTUtMC43MzNjLTAuODk2LDAtMS42NDYsMC4yNTctMi4yNTEsMC43NjcNCgljLTAuNjAxLDAuNTEtMS4wMTYsMS4yOTEtMS4yNDMsMi4zMzZsLTMuMjM2LTAuNDAzYzAuMDktMS41LDAuNzI5LTIuNzczLDEuOTEyLTMuODE5QzEzLjQ2Nyw5LjAyMiwxNS4wMTgsOC41LDE2Ljk0OCw4LjUNCgljMi4wMjMsMCwzLjYzNSwwLjUzMSw0LjgzNSwxLjU5YzEuMTk2LDEuMDU5LDEuNzk2LDIuMjg5LDEuNzk2LDMuNjk5YzAsMC43NzYtMC4yMjMsMS41MTQtMC42NiwyLjIwOA0KCWMtMC40NDEsMC42OTQtMS40NjEsMS41NS0yLjgyLDIuODM3QzE4Ljg2OCwyMCwxOC4zNjgsMjAuNSwxOC4zNjgsMjIuNUwxOC4zNjgsMjIuNXogTTE1LjM2OCwyNy40OTl2LTNoM3YzSDE1LjM2OHoiLz4NCjwvc3ZnPg0K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjIsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9ItCh0LvQvtC5XzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMzVweCIgaGVpZ2h0PSIzNXB4IiB2aWV3Qm94PSIwIDAgMzUgMzUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDM1IDM1IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMTcuNSwzNUMyNy4xMzgsMzUsMzUsMjcuMTQsMzUsMTcuNUMzNSw3Ljg2MiwyNy4xMzgsMCwxNy41LDANCglDNy44NjEsMCwwLDcuODYyLDAsMTcuNUMwLDI3LjE0LDcuODYxLDM1LDE3LjUsMzV6Ii8+DQo8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE3LjQ5OTUiIHkxPSIyLjY1MDQiIHgyPSIxNy40OTk1IiB5Mj0iMzIuMzUwNCI+DQoJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZGODI1QyIvPg0KCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRjREMTIiLz4NCjwvbGluZWFyR3JhZGllbnQ+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0idXJsKCNTVkdJRF8xXykiIGQ9Ik0xNy41LDM0YzkuMDg3LDAsMTYuNS03LjQxMiwxNi41LTE2LjUNCgljMC05LjA4OC03LjQxMi0xNi41LTE2LjUtMTYuNVMxLDguNDEzLDEsMTcuNUMxLDI2LjU4OCw4LjQxMiwzNCwxNy41LDM0eiIvPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0xNS41LDkuMDAxYzAtMiwzLjk5OS0yLDMuOTk5LDBMMTguOTk5LDIxDQoJYy0wLjA2MSwxLjQ5OC0yLjkzNywxLjUtMywwTDE1LjUsOS4wMDF6Ii8+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbD0iI0ZGRkZGRiIgZD0iTTE3LjUsMjhjMS4xMDIsMCwyLTAuODk3LDItMmMwLTEuMTAyLTAuODk3LTItMi0yDQoJYy0xLjEwMiwwLTEuOTk5LDAuODk4LTEuOTk5LDJDMTUuNSwyNy4xMDMsMTYuMzk4LDI4LDE3LjUsMjh6Ii8+DQo8L3N2Zz4NCg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkNPUlJFQ1QtSUNPTiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IgoJIHk9IjBweCIgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNCAyNDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNGRkZGRkY7fQoJLnN0MXtmaWxsOiM3Q0I5MTE7fQo8L3N0eWxlPgo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPgo8cGF0aCBpZD0iU2hhcGVfM19jb3B5IiBjbGFzcz0ic3QxIiBkPSJNMTIsMkM2LjUsMiwyLDYuNSwyLDEyczQuNSwxMCwxMCwxMHMxMC00LjUsMTAtMTBTMTcuNSwyLDEyLDJ6IE0xNy45LDguOWwtNy43LDcuNwoJYy0wLjQsMC40LTAuOSwwLjQtMS4zLDBsLTMuMi0zLjJjLTAuNC0wLjQtMC40LTAuOSwwLTEuM3MwLjktMC40LDEuMywwbDIuNSwyLjVsNy4xLTcuMWMwLjMtMC40LDAuOS0wLjQsMS4zLDAKCUMxOC4yLDcuOSwxOC4yLDguNSwxNy45LDguOUMxNy45LDguOSwxNy45LDguOSwxNy45LDguOXoiLz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIKCSB5PSIwcHgiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjQgMjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGNpcmNsZSBmaWxsPSIjRkZGRkZGIiBjeD0iMTIiIGN5PSIxMiIgcj0iMTIiLz4KPHBhdGggZmlsbD0iI2Y3YjQ0NSIgZD0iTTEyLDJDNi41LDIsMiw2LjUsMiwxMnM0LjUsMTAsMTAsMTBzMTAtNC41LDEwLTEwUzE3LjUsMiwxMiwyeiBNMTcuOSw4LjlsLTcuNyw3LjcKCWMtMC40LDAuNC0wLjksMC40LTEuMywwbC0zLjItMy4yYy0wLjQtMC40LTAuNC0wLjksMC0xLjNzMC45LTAuNCwxLjMsMGwyLjUsMi41bDcuMS03LjFjMC4zLTAuNCwwLjktMC40LDEuMywwCglDMTguMiw3LjksMTguMiw4LjUsMTcuOSw4LjlDMTcuOSw4LjksMTcuOSw4LjksMTcuOSw4Ljl6Ii8+Cjwvc3ZnPgo=", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IklOQ09SUkVDVC1JQ09OIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiCgkgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDI0IDI0OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6I0ZGRkZGRjt9Cgkuc3Qxe2ZpbGw6I0Y5NjAzRDt9Cjwvc3R5bGU+CjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjEyIiBjeT0iMTIiIHI9IjEyIi8+CjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0xMiwyQzYuNSwyLDIsNi41LDIsMTJzNC41LDEwLDEwLDEwczEwLTQuNSwxMC0xMFMxNy41LDIsMTIsMnogTTE2LjQsOC44TDEzLjIsMTJsMi45LDIuOQoJYzAuMywwLjMsMC4zLDAuOSwwLDEuMmMtMC4zLDAuMy0wLjksMC4zLTEuMiwwbDAsMEwxMiwxMy4ybC0zLjIsMy4yYy0wLjMsMC4zLTAuOSwwLjMtMS4yLDBzLTAuMy0wLjksMC0xLjJsMy4yLTMuMkw3LjksOS4xCgljLTAuMy0wLjMtMC4zLTAuOSwwLTEuMnMwLjktMC4zLDEuMiwwbDIuOSwyLjlsMy4yLTMuMmMwLjMtMC4zLDAuOS0wLjMsMS4yLDBDMTYuNyw3LjksMTYuOCw4LjQsMTYuNCw4LjgKCUMxNi40LDguOCwxNi40LDguOCwxNi40LDguOHoiLz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkFOU1dFUkVELUlDT04iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIKCSB5PSIwcHgiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjQgMjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbDojRkZGRkZGO30KCS5zdDF7ZmlsbDojNTI4QkRGO30KPC9zdHlsZT4KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMTIiIGN5PSIxMiIgcj0iMTIiLz4KPHBhdGggY2xhc3M9InN0MSIgZD0iTTEyLDIyQzYuNSwyMiwyLDE3LjUsMiwxMlM2LjUsMiwxMiwyczEwLDQuNSwxMCwxMFMxNy41LDIyLDEyLDIyeiBNOSwxMUg3djJoMlYxMXogTTEzLDExaC0ydjJoMlYxMXogTTE3LDExCgloLTJ2MmgyVjExeiIvPgo8L3N2Zz4K", +"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIyLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkNPUlJFQ1QtSUNPTiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IgoJIHk9IjBweCIgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNCAyNDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNGRkZGRkY7fQoJLnN0MXtmaWxsOiM1MjhCREY7fQo8L3N0eWxlPgo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPgo8cGF0aCBpZD0iU2hhcGVfM19jb3B5IiBjbGFzcz0ic3QxIiBkPSJNMTIsMkM2LjUsMiwyLDYuNSwyLDEyczQuNSwxMCwxMCwxMHMxMC00LjUsMTAtMTBTMTcuNSwyLDEyLDJ6IE0xNy45LDguOWwtNy43LDcuNwoJYy0wLjQsMC40LTAuOSwwLjQtMS4zLDBsLTMuMi0zLjJjLTAuNC0wLjQtMC40LTAuOSwwLTEuM3MwLjktMC40LDEuMywwbDIuNSwyLjVsNy4xLTcuMWMwLjMtMC40LDAuOS0wLjQsMS4zLDAKCUMxOC4yLDcuOSwxOC4yLDguNSwxNy45LDguOUMxNy45LDguOSwxNy45LDguOSwxNy45LDguOXoiLz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,"+c("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMiAxOCIgd2lkdGg9IjEycHgiIGhlaWdodD0iMTZweCI+DQoJPGRlZnM+DQoJCTxzdHlsZT4NCgkJCS5ub3JtYWwgew0KCQkJCWZpbGw6IHt0ZXh0fTsNCgkJCQlvcGFjaXR5OiAwLjc7DQoJCQkJaXNvbGF0aW9uOmlzb2xhdGU7DQoJCQl9DQoJCTwvc3R5bGU+DQoJPC9kZWZzPg0KCTxwYXRoIGNsYXNzPSJub3JtYWwiIGQ9Ik0xMCwwSDJBMiwyLDAsMCwwLDAsMlYxOGwyLS4yMiw0LTMuNjYsNCwzLjY2TDEyLDE4VjJBMiwyLDAsMCwwLDEwLDBaTTIsMmg4VjE0LjQ5bC00LTMtNCwzWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCkiLz4NCjwvc3ZnPg=="), +"data:image/svg+xml;base64,"+c("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMiAxOCIgd2lkdGg9IjEycHgiIGhlaWdodD0iMTZweCI+DQoJPGRlZnM+DQoJCTxzdHlsZT4NCgkJCS5vdmVyIHsNCgkJCQlmaWxsOiB7bGlzdEl0ZW0ubGFiZWwub3Zlcn07DQoJCQkJb3BhY2l0eTogMC43Ow0KCQkJCWlzb2xhdGlvbjppc29sYXRlOw0KCQkJfQ0KCQk8L3N0eWxlPg0KCTwvZGVmcz4NCgk8cGF0aCBjbGFzcz0ib3ZlciIgZD0iTTEwLDBIMkEyLDIsMCwwLDAsMCwyVjE4bDItLjIyLDQtMy42Niw0LDMuNjZMMTIsMThWMkEyLDIsMCwwLDAsMTAsMFpNMiwyaDhWMTQuNDlsLTQtMy00LDNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwKSIvPg0KPC9zdmc+"), +"data:image/svg+xml;base64,"+c("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMiAxOCIgd2lkdGg9IjEycHgiIGhlaWdodD0iMTZweCI+DQoJPGRlZnM+DQoJCTxzdHlsZT4NCgkJCS5zZWxlY3RlZCB7DQoJCQkJZmlsbDoge2xpc3RJdGVtLmxhYmVsLnByZXNzZWR9Ow0KCQkJCW9wYWNpdHk6IDAuNzsNCgkJCQlpc29sYXRpb246aXNvbGF0ZTsNCgkJCX0NCgkJPC9zdHlsZT4NCgk8L2RlZnM+DQoJPHBhdGggY2xhc3M9InNlbGVjdGVkIiBkPSJNMTAsMEgyQTIsMiwwLDAsMCwwLDJWMThsMi0uMjIsNC0zLjY2LDQsMy42NkwxMiwxOFYyQTIsMiwwLDAsMCwxMCwwWk0yLDJoOFYxNC40OWwtNC0zLTQsM1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDApIi8+DQo8L3N2Zz4="), +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAADcmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmFjOGVjNDFhLTZkYWItODQ0Ni04YzkzLWU1Mjk3N2YwMmE4NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFRThCNzU3NDYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFRThCNzU3MzYzNjcxMUU1QTZDRUE5NTVGOUJGQ0E3MCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cykiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0OWFlZmI1OC00ZWFmLWQ3NDgtYTI0ZS0zNmNhNGQ2M2QwNTYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6N0MwQkFBM0M2MjAxMTFFNUI4QjBERTk4MjY5MjQwQjUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6MGSVVAAAE3klEQVR42uycW4hWVRiG15Q4eYzGQySSQlriEQ9BF2mE4iSdESRRIb0RD+mNmHgICjqQEGUe6sqgCy1i0iRinAzELrooQhHLGQURUTzMiM7omCLj+/F/czX/t/890z6s9e/3hZcZ1l6z19r7mXXca62arq4uR/mjh/gKCIQiEAKhCIRAKAIhEIpACIQiEIpACIQiEAKhCIRAKAIhEMoX9Yu62NbWxjcUobq6OpaQQpcQz/QwPBOeDU+Fx8Oj4UfhoRrnJnwDvgC3wCfgY/Bf8P0QHrImahmQB1VWLfwGvAieqy+/LxJIR+Dv4QPwf75WWb4CGQavg9fo70mqFd4F79DfCSRCA+HN8Hp4cMppdcBfwB/Bt9mo99Sr8Cl4SwYwnKYhaf2jaXMconoE/hL+CR6TQ/pPato7NS+FbtSfgH+Gp8eMfwv+HT6qpakZvqzVT/d//ePw0/BEeI72ygbFvP/f8MvwpSK2IfLSGuGxFeJ1aby98CG4s5fpDNAqaTlcL89cIf45jddcpDZknI4PKsFo0NKzQLusnX1Iq1P/doHe60CF+GM1b+OK0obIYO5XeGREnLPwfHghfDzBtOVeb+q9z0bEG6njltHVDqQ2RuP9HTwDbkoxH02axv4YjX1tNQP5LKIBl7ZiK/yWToGkLUljsaZpNaTTNc9VCeR1eHUEjHfgD3OoQiXNVRFQVmveqwrIEHh3xPXNOp2Rl77WPFiSvA+tJiCb4FHGNanHP/FggCp52Gdck7y/Wy0Dw2Hatx9s9KZmZNRmxC3JMjh8qsy1Du0St4Y+DomaKFzlEQxRu+apnOQZ1oVeZfWPeMCGlLu2/6dL3BDRwPcPGYiMjocbvaoPnL963+h1DddnChbIMiP8cMIj8KQln34be/lM3gOREW69cW2v81/fGOH1aY7e0wTyrNGYyxT6wQCAHNS8lmvcZ4UIZL4RLt8z7gQA5I7mtZyeCxHIS0b4UReOrLw+EyIQqxScDAiIldcJIQLZYTTmvwUEpMUIHxMikB/gta40PXIF/lwHVrcCAnLVCH8srQR9X7mYt2RUbq1yrOFia390N9SReugaYoR3EEg+GmGEtxNIPhpvhJ8nkHw02Qj/l0Dy0Rwj/DSBZC9ZeD3buPYHgWSv11z5RdrSw/qTQLLX20Z4o0toSxyBxJdsKrVmq79NM2ECKa/3XPltC9fgXwgkW81zpVX35fSVS3HahEB6SqZK9hjXujeJOgLJTrLG19qos1OrLALJSLL+eLFx7SL8cRaZIJCSVrrSfnVL8qHtJoFkoy3ablibQeWz849ZZaZfgUHIfg/Z97EkIs5xLR2OQNLv2u5x0Ttt5UShV1wfj91glRVP01xp8UVTBRiyuOFFheJYQpKVzNrKwQErXPyDA2SF+5k8MhsykCnwPdfzaA3ZYy6nREyCX4Cfd/EPs+nV0RoEUlqWsx1eCie9Bkc2nW5wOa87Dg3Ipy75bWXntSd1yIcHDK1RT3KzTIcOBif6AqOo3d42HX/I0tZW3zIXWgnp68chmfaQjZxyoKac0bXNRxghlpCN2m1dpj/btXEfpD0uqYaua89Luq3dx8TKN3AeE1vt4mLrAohACIQiEAKhCIRAKAIhEIpACq7IqROKJYRA+AoIhCIQAqEIhEAoAiEQikCKrQcCDABHPgH2w7NQdAAAAABJRU5ErkJggg==", +"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxOSIgdmlld0JveD0iMCAwIDE3IDE5Ij4KICA8bWV0YWRhdGE+PD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIi8+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PjwvbWV0YWRhdGE+CjxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgICAgZmlsbC1ydWxlOiBldmVub2RkOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBpZD0iU2hhcGVfMTUwMF9jb3B5XzciIGRhdGEtbmFtZT0iU2hhcGUgMTUwMCBjb3B5IDciIGNsYXNzPSJjbHMtMSIgZD0iTTY3NDUsNjc3bC01LTUsNS01djNoMTB2NGgtMTB2M1ptNy0xLDUsNS01LDV2LTNoLTEwdi00aDEwdi0zWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTY3NDAgLTY2NykiLz4KPC9zdmc+Cg==", +"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOSIgaGVpZ2h0PSIxNyIgdmlld0JveD0iMCAwIDE5IDE3Ij4KICA8bWV0YWRhdGE+PD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIi8+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PjwvbWV0YWRhdGE+CjxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgICAgZmlsbC1ydWxlOiBldmVub2RkOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBpZD0iU2hhcGVfMTUwMF9jb3B5XzciIGRhdGEtbmFtZT0iU2hhcGUgMTUwMCBjb3B5IDciIGNsYXNzPSJjbHMtMSIgZD0iTTY3NDksNjgwbC01LDUtNS01aDNWNjcwaDR2MTBoM1ptLTEtNyw1LTUsNSw1aC0zdjEwaC00VjY3M2gtM1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02NzM5IC02NjgpIi8+Cjwvc3ZnPgo=", +"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICB3aWR0aD0iMjhweCIgaGVpZ2h0PSIzM3B4IiB2aWV3Qm94PSIwIDAgMjguMzAyIDMzLjI0MiI+DQoJPHBhdGggZD0iTTAsMS44VjMxLjQ0MmExLjgsMS44LDAsMCwwLDIuNzI2LDEuNTQzbDI0LjctMTQuODJhMS44LDEuOCwwLDAsMCwwLTMuMDg3TDIuNzI2LjI1N0ExLjgsMS44LDAsMCwwLDAsMS44WiIgc3R5bGU9ImZpbGw6IzMzMyIvPg0KPC9zdmc+","data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyOHB4IiBoZWlnaHQ9IjMzcHgiIHZpZXdCb3g9IjAgMCAyOC4zMDIgMzMuMjQyIj4NCgk8cGF0aCBkPSJNMCwxLjhWMzEuNDQyYTEuOCwxLjgsMCwwLDAsMi43MjYsMS41NDNsMjQuNy0xNC44MmExLjgsMS44LDAsMCwwLDAtMy4wODdMMi43MjYuMjU3QTEuOCwxLjgsMCwwLDAsMCwxLjhaIiBzdHlsZT0iZmlsbDojNTI4YmRmIi8+DQo8L3N2Zz4="]; +return"/* reset styles */* {box-sizing: border-box;-webkit-touch-callout: none;-webkit-user-select: none;-ms-user-select: none;user-select: none; }input,textarea {-webkit-user-select: text;-ms-user-select: text;user-select: text; }html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video {margin: 0;padding: 0;border: 0; }/* HTML5 display-role reset for older browsers */article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section {display: block; }ol,ul {list-style: none; }table {border-collapse: collapse;border-spacing: 0; }div {-webkit-tap-highlight-color: rgba(0, 0, 0, 0);-webkit-user-drag: none; }input {-webkit-appearance: none;-moz-appearance: none; } input::-ms-clear {display: none; }.clear {clear: both; }*::-moz-focus-inner {border: 0; }body {margin: 0;padding: 0;overflow: hidden;cursor: default;-ms-touch-action: pan-y;touch-action: pan-y;-webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body .password_form, body .info_panel {position: absolute;background: #F7F7F7;border-radius: 4px;width: 513px;height: 210px;font-family: Arial; } body .password_form *, body .info_panel * {box-sizing: border-box; } body .password_form .password_label {position: absolute;color: #3A3A3A;font-size: 15px;top: 63px;left: 55px; } body .password_form .wrong_password_label {position: absolute;color: #DD4A37;font-size: 12px;top: 131px;left: 55px; } body .password_form input {position: absolute;width: 330px;height: 32px;background: #FFFFFF;border: 1px solid #D1D2D4;padding: 1px;border-radius: 2px;font-size: 18px;color: #231F20;left: 54px;top: 94px;padding-left: 8px; } body .password_form button {border: transparent;background: transparent;color: #343434;font-family: Arial;font-size: 15px;text-shadow: 0 1px 0 rgba(255, 255, 255, 0.4); } body .password_form button::before {background: linear-gradient(to bottom, #D3D3D3, #BABABA);position: absolute;content: '';top: 0;right: 0;bottom: 0;left: 0;border-radius: 4px;z-index: -1; } body .password_form button::after {background: linear-gradient(to bottom, #DCDCDC, #D1D1D1);position: absolute;content: '';top: 1px;right: 1px;bottom: 1px;left: 1px;border-radius: 4px;z-index: -1; } body .password_form .btn_ok {position: absolute;top: 94px;right: 55px;width: 60px;height: 32px;opacity: 0.99; } body .info_panel {display: table; } body .info_panel .label {position: static;display: table-cell;vertical-align: middle;width: 100%;padding-left: 120px;padding-right: 40px;color: #3A3A3A;font-size: 15px; } body .info_panel::after {position: absolute;content: '';width: 63px;height: 63px;top: 73px;left: 46px; } body .info_panel.domain::after {background: transparent url("+ +g[0]+"); } body .info_panel.time::after {background: transparent url("+g[1]+"); }.component_base,.component_container {position: absolute; }:focus {outline: none; }::-moz-focus-inner {border: 0; }input {appearance: none; }button {cursor: pointer;margin: 0;border: 0; }button[disabled] {cursor: default; }.__player_view_id__ {position: absolute; } .__player_view_id__ > * {position: absolute; } .__player_view_id__ .slide {white-space: nowrap;font-size: 0; } .__player_view_id__ .slide a {text-decoration: none;cursor: pointer; } .__player_view_id__ .slide a img {border: 0; } .__player_view_id__ .slide * {-ms-transform-origin: 0 0;transform-origin: 0 0; } .__player_view_id__ .slide.relpos, .__player_view_id__ .slide .relpos {position: relative !important;vertical-align: top; } .__player_view_id__ .slide.kern, .__player_view_id__ .slide .kern {text-rendering: optimizeLegibility;font-feature-settings: 'kern' 1, 'liga' 0; } .__player_view_id__ .slide.nokern, .__player_view_id__ .slide .nokern {text-rendering: optimizeSpeed;font-feature-settings: 'kern' 0, 'liga' 0; } .__player_view_id__ .fullscreen {-ms-transform: none !important;transform: none !important;top: 0 !important;left: 0 !important; } .__player_view_id__ .fullscreen > video, .__player_view_id__ .fullscreen .video_player {background-color: black;width: __slide_width__ !important;height: __slide_height__ !important;z-index: 100;-ms-transform: none !important;transform: none !important; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen {background: url("+ +g[2]+") no-repeat; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen:hover {background: url("+g[3]+") no-repeat; } .__player_view_id__ .fullscreen .video_player .controls button.toggle_fullscreen:active {background: url("+g[4]+") no-repeat; } .__player_view_id__ .video_player video {width: 100%;height: 100%;margin: auto;top: 0;right: 0;bottom: 0;left: 0; } .__player_view_id__ .video_player video::cue {color: #FFFFFF;background-color: rgba(8, 8, 8, 0.75);border-radius: 4px;font-family: Helvetica, Roboto, Arial, sans-serif;line-height: 1.1; } .__player_view_id__ .video_player.poster_frame_hide_video video {display: none; } .__player_view_id__ .video_player.poster_frame video {opacity: 0; } .__player_view_id__ .video_player.poster_frame_hide_video .poster, .__player_view_id__ .video_player.poster_frame .poster {position: absolute;width: 100%;height: 100%; } .__player_view_id__ .video_player .controls {height: 36px;background: rgba(45, 50, 55, 0.85098);border: 1px solid #444648;cursor: default;border-radius: 4px; } .__player_view_id__ .video_player .controls, .__player_view_id__ .video_player .controls * {backface-visibility: hidden; } .__player_view_id__ .video_player .controls .progress {background-color: #75787A;height: 14px;left: 64px;top: 0;bottom: 0;margin-top: auto;margin-bottom: auto;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark {width: 10px;height: 10px;margin-top: -5px;margin-left: -5px;top: 50%;background: url("+ +g[5]+") no-repeat;cursor: pointer; } .__player_view_id__ .video_player .controls .progress .bookmark:hover, .__player_view_id__ .video_player .controls .progress .bookmark:active {background: url("+g[6]+") no-repeat; } .__player_view_id__ .video_player .controls .progress .loading {background-color: #B1B3B5;height: 100%; } .__player_view_id__ .video_player .controls .progress .playing {background-color: #FFFFFF;height: 100%; } .__player_view_id__ .video_player .controls .progress .tooltip {background: url("+ +g[7]+") no-repeat;width: 60px;height: 25px;top: -33px;margin-left: -30px;font-family: Arial;font-size: 12px;padding-top: 2px;text-align: center; } .__player_view_id__ .video_player .controls .volume_popup {border-radius: 3px;background: rgba(45, 50, 55, 0.85098);top: -67px;right: 65px;padding: 8px;box-sizing: border-box;width: 28px;height: 64px; } .__player_view_id__ .video_player .controls .volume_popup .volume {background: url("+g[8]+");position: relative;cursor: pointer;width: 12px;height: 48px; } .__player_view_id__ .video_player .controls .volume_popup .volume .back {background: url("+ +g[9]+");width: 100%; } .__player_view_id__ .video_player .controls button {width: 100%;height: 100%; } .__player_view_id__ .video_player .controls button.rate {background: url("+g[10]+") no-repeat center; } .__player_view_id__ .video_player .controls button.rate.selected {background-color: rgba(255, 255, 255, 0.1); } .__player_view_id__ .video_player .controls button.mute {background: url("+g[11]+"); } .__player_view_id__ .video_player .controls button.mute:hover {background: url("+ +g[12]+"); } .__player_view_id__ .video_player .controls button.mute:active {background: url("+g[13]+"); } .__player_view_id__ .video_player .controls button.mute.selected {background: url("+g[14]+"); } .__player_view_id__ .video_player .controls button.mute.selected:hover {background: url("+g[15]+"); } .__player_view_id__ .video_player .controls button.mute.selected:active {background: url("+g[16]+"); } .__player_view_id__ .video_player .controls button.subtitles {background: url("+ +g[17]+") no-repeat center; } .__player_view_id__ .video_player .controls button.subtitles.selected {background-color: rgba(255, 255, 255, 0.1); } .__player_view_id__ .video_player .controls button.play {background: url("+g[18]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:hover {background: url("+g[19]+") no-repeat; } .__player_view_id__ .video_player .controls button.play:active {background: url("+g[20]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected {background: url("+ +g[21]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:hover {background: url("+g[22]+") no-repeat; } .__player_view_id__ .video_player .controls button.play.selected:active {background: url("+g[23]+") no-repeat; } .__player_view_id__ .video_player .controls button.play::after {background: url("+g[24]+");width: 1px;height: 32px;right: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls button.toggle_fullscreen {background: url("+ +g[25]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:hover {background: url("+g[26]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen:active {background: url("+g[27]+") no-repeat; } .__player_view_id__ .video_player .controls button.toggle_fullscreen::before {background: url("+g[24]+") no-repeat;width: 1px;height: 32px;left: 0;top: 1px;position: absolute;content: ''; } .__player_view_id__ .video_player .controls .subtitles-list {width: 195px;right: 0;border-radius: 4px;border: solid 1px #444648;background-color: rgba(45, 50, 55, 0.85);font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;font-weight: normal;font-stretch: normal;font-style: normal;line-height: normal;letter-spacing: normal;padding: 3px 0;bottom: 37px; } .__player_view_id__ .video_player .controls .subtitles-list__caption {position: relative !important;padding: 12px 0 22px 0;color: #b8b8b8;text-align: center; } .__player_view_id__ .video_player .controls .subtitles-list__caption::after {position: absolute;content: '';width: calc(100% - 20px);left: 0;right: 0;bottom: 5px;margin: auto;border-bottom: 1px solid #444648; } .__player_view_id__ .video_player .controls .subtitles-list__item {color: #b8b8b8;position: relative !important;padding: 10px 2px 10px 35px;cursor: pointer;overflow: hidden;text-overflow: ellipsis; } .__player_view_id__ .video_player .controls .subtitles-list__item.subtitles-list__item_active {background-color: rgba(255, 255, 255, 0.1);color: #FFFFFF; } .__player_view_id__ .video_player .controls .subtitles-list__item[aria-selected='true'] {background-color: rgba(0, 0, 0, 0.24);color: #FFFFFF;padding-left: 12px; } .__player_view_id__ .video_player .controls .subtitles-list__item[aria-selected='true']::before {background: url("+ +g[28]+") no-repeat;width: 14px;height: 15px;padding-right: 23px;content: ''; } .__player_view_id__ .video_player .controls .toggle_fullscreen {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .play {width: 52px;height: 34px; } .__player_view_id__ .video_player .controls .rate {width: 32px;height: 34px;right: 95px;top: 0; } .__player_view_id__ .video_player .controls .rate.rate_subtitle-button-next {right: 127px; } .__player_view_id__ .video_player .controls .playback-rate-menu {width: 120px;right: 51px;border-radius: 4px;border: solid 1px #444648;background-color: rgba(45, 50, 55, 0.85);font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;font-weight: normal;font-stretch: normal;font-style: normal;line-height: normal;letter-spacing: normal;padding: 3px 0;bottom: 37px; } .__player_view_id__ .video_player .controls .playback-rate-menu.playback-rate-menu_subtitle-button-next {right: 83px; } .__player_view_id__ .video_player .controls .playback-rate-menu__caption {position: relative !important;padding: 12px 0 22px 0;color: #b8b8b8;text-align: center; } .__player_view_id__ .video_player .controls .playback-rate-menu__caption::after {position: absolute;content: '';width: calc(100% - 20px);left: 0;right: 0;bottom: 5px;margin: auto;border-bottom: 1px solid #444648; } .__player_view_id__ .video_player .controls .playback-rate-menu__item {color: #b8b8b8;position: relative !important;padding: 10px 2px 10px 35px;cursor: pointer;overflow: hidden;text-overflow: ellipsis; } .__player_view_id__ .video_player .controls .playback-rate-menu__item.playback-rate-menu__item_active {background-color: rgba(255, 255, 255, 0.1);color: #FFFFFF; } .__player_view_id__ .video_player .controls .playback-rate-menu__item[aria-selected='true'] {background-color: rgba(0, 0, 0, 0.24);color: #FFFFFF;padding-left: 12px; } .__player_view_id__ .video_player .controls .playback-rate-menu__item[aria-selected='true']::before {background: url("+ +g[28]+") no-repeat;width: 14px;height: 15px;padding-right: 23px;content: ''; } .__player_view_id__ .video_player .controls .subtitles {width: 32px;height: 34px;right: 95px;top: 0; } .__player_view_id__ .video_player .controls .toggle_fullscreen {right: -1px; } .__player_view_id__ .video_player .controls .mute {width: 22px;height: 22px;right: 67px;top: 6px; }.popup_layer {position: absolute; } .popup_layer .modal_layer {background: #000000;opacity: 0.4;z-index: 10;width: 100%;height: 100%; } .popup_layer .message_box, .popup_layer .confirm_window {background: #FFFFFF;border-radius: 5px;border: 1px solid rgba(0, 0, 0, 0.75);width: 357px;height: 150px;position: absolute;top: 0;right: 0;bottom: 0;left: 0;margin: auto;z-index: 10; } .popup_layer .message_box::after, .popup_layer .confirm_window::after {background-color: #E6E6E6;width: 100%;height: 1px;top: 30px;position: absolute;content: ''; } .popup_layer .message_box .title, .popup_layer .message_box .message, .popup_layer .confirm_window .title, .popup_layer .confirm_window .message {font-family: Helvetica, Roboto, Arial, sans-serif;font-size: 14px;color: #323232; } .popup_layer .message_box .title, .popup_layer .confirm_window .title {position: absolute;left: 13px;top: 7px;font-weight: bold;background: transparent; } .popup_layer .message_box .message, .popup_layer .confirm_window .message {position: absolute;top: 47px;left: 69px;margin-right: 25px; } .popup_layer .message_box .message::before, .popup_layer .confirm_window .message::before {background-color: #E6E6E6;width: 35px;height: 35px;left: -45px;position: absolute;content: ''; } .popup_layer .message_box button, .popup_layer .confirm_window button {font-size: 14px;border-radius: 5px;color: #323232;width: 68px;height: 30px; } .popup_layer .message_box button, .popup_layer .message_box button.mobile:hover, .popup_layer .message_box button.mobile:active, .popup_layer .confirm_window button, .popup_layer .confirm_window button.mobile:hover, .popup_layer .confirm_window button.mobile:active {background: #D4D4D4; } .popup_layer .message_box button:hover, .popup_layer .message_box button:active, .popup_layer .message_box button.mobile.active, .popup_layer .confirm_window button:hover, .popup_layer .confirm_window button:active, .popup_layer .confirm_window button.mobile.active {background: #B8B8B8; } .popup_layer .confirm_window button.btn_yes {left: 101px;top: 98px; } .popup_layer .confirm_window button.btn_no {left: 181px;top: 98px; } .popup_layer .confirm_window .message::before {background: url("+ +g[29]+"); } .popup_layer .message_box button.btn_ok {left: 141px;top: 98px; } .popup_layer .message_box .message::before {background: url("+g[30]+"); }.transitionSlide.paused * {animation-play-state: paused !important; }.framesLayer .video_player {-ms-transform-origin: 0 0;transform-origin: 0 0; }.framesLayer *:not(.framesLayerContent) {pointer-events: all; }.framesLayer .framesLayerContent {position: absolute; } .framesLayer .framesLayerContent > div {pointer-events: all; }.trial_banner {position: relative;transform: translateZ(0); } .trial_banner .banner-content, .trial_banner .banner-content_hover {position: absolute;left: 0;right: 0;top: 0;bottom: 0;width: 100%;height: 100%; } .trial_banner .banner-content {visibility: visible;z-index: 1; } .trial_banner .banner-content_hover {visibility: hidden;z-index: 0; } .trial_banner .days_remaining {position: absolute;font-family: 'Open Sans', Arial, sans-serif;font-weight: normal;font-size: 13px;left: 65px;top: 41px;color: #7C1645;z-index: 1; } .trial_banner:hover .banner-content {visibility: hidden;z-index: 0; } .trial_banner:hover .banner-content_hover {visibility: visible;z-index: 1; }.popup-layer {top: 0;right: 0;bottom: 0;left: 0;z-index: 1;position: absolute;border-radius: inherit; }.modal-layer {background: #000000;opacity: 0.4;position: absolute;width: 100%;height: 100%;border-radius: inherit; }.slide-transiting .quiz-uikit-primary-button {transition: none; }.slide-transiting .quiz-uikit-secondary-button {transition: none; }.slide-transiting .quiz-uikit-link-button {transition: none; }.slide-transiting .visuals-uikit-primary-button {transition: none; }.slide-transiting .visuals-uikit-secondary-button {transition: none; }.slide-transiting .visuals-uikit-link-button {transition: none; }.uikit-primary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-primary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-primary-button.uikit-primary-button_size_medium {padding: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:first-child {margin-left: 10px; } .uikit-primary-button.uikit-primary-button_size_medium .uikit-primary-button__button-text:last-child {margin-right: 10px; } .uikit-primary-button.uikit-primary-button_size_small {padding: 6px 12px; } .uikit-primary-button.uikit-primary-button_size_small .uikit-primary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-primary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-primary-button__button-text {margin-right: 8px; } .uikit-primary-button__left-icon {margin-right: 8px; } .uikit-primary-button__button-text:first-child {margin-left: 0; } .uikit-primary-button__button-text:last-child {margin-right: 0; } .uikit-primary-button__left-icon:first-child {margin-left: 0; } .uikit-primary-button__left-icon:last-child {margin-right: 0; } .uikit-primary-button__right-icon:first-child {margin-left: 0; } .uikit-primary-button__right-icon:last-child {margin-right: 0; } .uikit-primary-button[disabled] {opacity: 0.4; } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-primary-button.uikit-primary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-secondary-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-secondary-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-secondary-button.uikit-secondary-button_size_medium {padding: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 17px;line-height: 20px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:first-child {margin-left: 10px; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text:last-child {margin-right: 10px; } .uikit-secondary-button.uikit-secondary-button_size_small {padding: 6px 12px; } .uikit-secondary-button.uikit-secondary-button_size_small .uikit-secondary-button__button-text {font-size: 14px;line-height: 20px; } .uikit-secondary-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-secondary-button__button-text {margin-right: 8px; } .uikit-secondary-button__left-icon {margin-right: 8px; } .uikit-secondary-button__button-text:first-child {margin-left: 0; } .uikit-secondary-button__button-text:last-child {margin-right: 0; } .uikit-secondary-button__left-icon:first-child {margin-left: 0; } .uikit-secondary-button__left-icon:last-child {margin-right: 0; } .uikit-secondary-button__right-icon:first-child {margin-left: 0; } .uikit-secondary-button__right-icon:last-child {margin-right: 0; } .uikit-secondary-button[disabled] {opacity: 0.4; } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-secondary-button.uikit-secondary-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-link-button {max-width: 260px;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;cursor: pointer;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;border-radius: var(--button-border-radius);position: relative;border: none;transition-property: background, color, border-color, opacity, width;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-link-button__button-text {-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; } .uikit-link-button.uikit-link-button_size_medium {padding: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text {font-size: 17px;line-height: 20px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:first-child {margin-left: 10px; } .uikit-link-button.uikit-link-button_size_medium .uikit-link-button__button-text:last-child {margin-right: 10px; } .uikit-link-button.uikit-link-button_size_small {padding: 6px 12px; } .uikit-link-button.uikit-link-button_size_small .uikit-link-button__button-text {font-size: 14px;line-height: 20px; } .uikit-link-button__left-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__right-icon {-ms-flex-negative: 0;flex-shrink: 0;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center; } .uikit-link-button__button-text {margin-right: 8px; } .uikit-link-button__left-icon {margin-right: 8px; } .uikit-link-button__button-text:first-child {margin-left: 0; } .uikit-link-button__button-text:last-child {margin-right: 0; } .uikit-link-button__left-icon:first-child {margin-left: 0; } .uikit-link-button__left-icon:last-child {margin-right: 0; } .uikit-link-button__right-icon:first-child {margin-left: 0; } .uikit-link-button__right-icon:last-child {margin-right: 0; } .uikit-link-button[disabled] {opacity: 0.4; } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .uikit-link-button.uikit-link-button_withTooltip[data-tooltip]:enabled:hover::before {opacity: 1;visibility: visible; }.uikit-primary-button {background: var(--primary-button-background-color, var(--primary-button-background-color));color: var(--primary-button-text-color, var(--primary-button-text-color)); } .uikit-primary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--primary-button-border-color, var(--primary-button-border-color));background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-primary-button__button-text {font-family: var(--font-family-bold);font-weight: 700; } .uikit-primary-button.uikit-primary-button_active, .uikit-primary-button[aria-pressed='true'], .uikit-primary-button:focus {background: var(--primary-button-background-color-active, var(--primary-button-background-color-active));color: var(--primary-button-text-color-active, var(--primary-button-text-color-active)); } .uikit-primary-button.uikit-primary-button_active::after, .uikit-primary-button[aria-pressed='true']::after, .uikit-primary-button:focus::after {background: var(--primary-button-border-color-active, var(--primary-button-border-color-active));background-origin: border-box; }.uikit-secondary-button {background: var(--secondary-button-background-color, var(--secondary-button-background-color));color: var(--secondary-button-text-color, var(--secondary-button-text-color)); } .uikit-secondary-button::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--secondary-button-border-color, var(--secondary-button-border-color));background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-secondary-button__button-text {font-family: var(--font-family-normal); } .uikit-secondary-button.uikit-secondary-button_active, .uikit-secondary-button[aria-pressed='true'], .uikit-secondary-button:focus {background: var(--secondary-button-background-color-active, var(--secondary-button-background-color-active));color: var(--secondary-button-text-color-active, var(--secondary-button-text-color-active)); } .uikit-secondary-button.uikit-secondary-button_active::after, .uikit-secondary-button[aria-pressed='true']::after, .uikit-secondary-button:focus::after {background: var(--secondary-button-border-color-active, var(--secondary-button-border-color-active));background-origin: border-box; } .uikit-secondary-button.uikit-secondary-button_size_medium .uikit-secondary-button__button-text {font-size: 15px; }.uikit-link-button {background: var(--link-button-background-color);color: var(--link-button-text-color);border: none; } .uikit-link-button.uikit-link-button_active, .uikit-link-button[aria-pressed='true'] {background: var(--link-button-background-color); }.uikit-collapsed-control {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;position: relative;overflow: hidden;padding: 10px;border: none;border-radius: var(--button-border-radius);background: var(--secondary-button-background-color-active);color: var(--secondary-button-text-color-active);transition-property: background, color;transition-duration: 0.28s;transition-timing-function: ease; } .uikit-collapsed-control::after {content: '';position: absolute;top: 0;left: 0;right: 0;bottom: 0;border-radius: inherit;border: 1px solid transparent;background: var(--secondary-button-border-color-active);background-origin: border-box;transition: inherit;-webkit-mask: linear-gradient(#FFFFFF 0, #FFFFFF 0) border-box, linear-gradient(#FFFFFF 0, #FFFFFF 0) padding-box;mask: linear-gradient(#FFFFFF 0 0) border-box, linear-gradient(#FFFFFF 0 0) padding-box;-webkit-mask-composite: xor;mask-composite: exclude;pointer-events: none; } .uikit-collapsed-control__collapsed-component {cursor: pointer;display: -ms-flexbox;display: flex; } .uikit-collapsed-control__expanded-component {margin-left: 8px;opacity: 1;transition-property: width, opacity;transition-duration: 300ms;transition-timing-function: ease; } .uikit-collapsed-control.uikit-collapsed-control_collapsed {background: var(--secondary-button-background-color);color: var(--secondary-button-text-color);padding-right: 2px; } .uikit-collapsed-control.uikit-collapsed-control_collapsed::after {background: var(--secondary-button-border-color);background-origin: border-box; } .uikit-collapsed-control.uikit-collapsed-control_collapsed .uikit-collapsed-control__expanded-component {width: 0;opacity: 0; } .uikit-collapsed-control[data-tooltip]::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 20px);left: 0; } .uikit-collapsed-control[data-tooltip]:hover::before {opacity: 1;visibility: visible; }.menu-base {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: start;align-items: start;font-family: var(--font-family-normal); }.menu-base-item {width: 100%;box-sizing: border-box;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;height: 44px;padding: 0 20px;color: var(--popup-text-color); } .menu-base-item__label {-ms-flex-positive: 1;flex-grow: 1;font-size: 15px;line-height: 20px;margin-left: 12px; } .menu-base-item__icon {width: 20px;height: 20px;-ms-flex-negative: 0;flex-shrink: 0;color: var(--popup-text-color); } .menu-base-item__value {-ms-flex-negative: 0;flex-shrink: 0;margin-left: 16px; } .menu-base-item.menu-base-item_clickable:hover {cursor: pointer;background: var(--popup-background-hover-color);color: var(--popup-text-hover-color); } .menu-base-item.menu-base-item_clickable:hover .menu-base-item__icon {color: var(--popup-text-hover-color); }.rate-menu {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;width: 100%;padding: 12px 0; } .rate-menu__caption {padding: 8px 20px;color: var(--popup-text-color);font-size: 16px;line-height: 22px;font-family: var(--font-family-bold);font-weight: 700; } .rate-menu__delimiter {width: 100%;height: 1px;background: var(--popup-text-color);opacity: 0.08;margin: 8px 0; }.presenter-info {font-family: var(--font-family-normal);box-sizing: border-box;position: relative;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;color: var(--panel-text-color); } .presenter-info__main {display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: start; } .presenter-info__info {display: inline-block;-ms-flex-positive: 1;flex-grow: 1; } .presenter-info__photo {width: 64px;height: 64px;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;overflow: hidden;border-radius: 50%;-ms-flex-negative: 0;flex-shrink: 0;background-repeat: no-repeat;background-position: center;margin-right: 20px; } .presenter-info__photo img {width: auto;height: auto; } .presenter-info__name {font-family: var(--font-family-bold);font-weight: 700;word-wrap: break-word;overflow: hidden;font-size: 16px;line-height: 22px;margin-bottom: 8px;max-height: 53px; } .presenter-info__job {word-wrap: break-word;overflow: hidden;font-size: 14px;line-height: 18px;margin-bottom: 8px; } .presenter-info__phone {word-wrap: break-word;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;font-size: 15px;line-height: 20px; } .presenter-info__links {display: -ms-flexbox;display: flex;margin-top: 8px; } .presenter-info__link {border: 1px solid var(--presenter-info-link-border-color);border-radius: 10px;width: 36px;height: 28px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;position: relative;color: var(--panel-text-color); } .presenter-info__link:not(:last-child) {margin-right: 8px; } .presenter-info__link::before {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;content: attr(data-tooltip);white-space: nowrap;opacity: 0;visibility: hidden;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: calc(100% + 6px);left: 50%;-ms-transform: translateX(-50%);transform: translateX(-50%); } .presenter-info__link:hover::before {opacity: 1;visibility: visible; } .presenter-info__link-icon {width: 20px;height: 20px; } .presenter-info .bio-container {position: relative;display: -webkit-box;white-space: normal;text-overflow: ellipsis;margin-right: -20px;margin-top: 20px;padding-right: 10px;font-size: 14px;line-height: 20px;-ms-flex-positive: 1;flex-grow: 1;height: 100%;max-height: 120px;overflow: hidden; } .presenter-info .bio-container.bio-container_collapsed {max-height: 60px; } .presenter-info .bio-container.bio-container_collapsed .scroll-area__bio {display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .presenter-info .bio-container .scroll-area {word-break: break-word;overflow: hidden; } .presenter-info .bio-container .container-top-shadow {background: __verticalGradient(var(--panel-color), transparent);background: linear-gradient(to bottom, var(--panel-color), transparent);position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; } .presenter-info .bio-container .container-bottom-shadow {background: __verticalGradient(transparent, var(--panel-color));background: linear-gradient(to bottom, transparent, var(--panel-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; } .presenter-info__show-more {font-size: 14px;line-height: 20px;height: 20px;opacity: 0.6;text-decoration: underline; } .presenter-info__show-more:hover {cursor: pointer;opacity: 0.8; } .presenter-info.presenter-info_popup {margin-bottom: 0; } .presenter-info.presenter-info_no-photo .presenter-info__info {width: 100%; }.attachments-info {font-family: var(--font-family-normal);position: relative;width: 100%;overflow: hidden;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column; } .attachments-info__scroll-area {height: 100%;overflow: hidden; } .attachments-info__delimiter {height: 1px;margin: 8px 20px 8px 62px;background: var(--popup-text-color);opacity: 0.08; } .attachments-info .container-top-shadow {background: __verticalGradient(var(--panel-color), transparent);background: linear-gradient(to bottom, var(--panel-color), transparent);position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; } .attachments-info .container-bottom-shadow {background: __verticalGradient(transparent, var(--panel-color));background: linear-gradient(to bottom, transparent, var(--panel-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; }.attach-item {padding: 8px 20px;box-sizing: border-box;display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: start;cursor: pointer; } .attach-item__icon-container {width: 36px;height: 36px;border-radius: 50%;background: var(--top-panel-icon-container-color);display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;-ms-flex-negative: 0;flex-shrink: 0;margin-right: 6px; } .attach-item__icon {width: 20px;height: 20px;color: var(--popup-text-color);opacity: 0.72; } .attach-item__info-container {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-positive: 1;flex-grow: 1;padding-left: 6px; } .attach-item__title {font-size: 15px;line-height: 20px;margin-bottom: 4px;color: var(--popup-text-color);word-break: break-word;max-height: 60px;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .attach-item__subtitle {font-size: 14px;line-height: 18px;color: var(--popup-text-color);opacity: 0.6; } .attach-item:hover {background: var(--list-item-background-hover-color); } .attach-item:hover .attach-item__title {color: var(--popup-text-hover-color); } .attach-item:hover .attach-item__subtitle {color: var(--popup-text-hover-color); } .attach-item:hover .attach-item__icon {color: var(--popup-text-hover-color); }:root {--page-background-color: __pageBackground__;--button-background-color: __primaryButtonBackground__;--button-hover-background-color: __primaryButtonBackgroundHover__;--button-hover-text-color: __primaryButtonTextHover__;--button-text-color: __primaryButtonText__;--company-logo-background-color: __asideLogoBackground__;--hyperlink-text-color: __hyperlink__;--list-item-background-hover-color: __asideElementBackgroundHover__;--list-item-border-color: __outlineItemBorder__;--list-item-background-pressed-color: __asideElementBackgroundActive__;--list-item-text-hover-color: __asideElementTextHover__;--list-item-text-pressed-color: __asideElementTextActive__;--list-item-text-visited-color: __asideElementTextVisited__;--list-item-icon-fill-color: __itemsListIconFill__;--list-item-order-color: __itemsListOrder__;--list-item-icon-stroke-color: __itemsListIconStroke__;--list-item-icon-color: __itemsListIcon__;--panel-color: __asideBackground__;--panel-text-color: __asideElementText__;--panel-video-stub-background-color: __panelVideoStubBackgroundColor__;--panel-video-stub-color: __panelVideoStubColor__;--player-background-color: __playerBackground__;--progressbar-background-color: __progressBackground__;--progressbar-playback-color: __progressPlayback__;--slide-border-color: __slideBorder__;--text-color: __playerText__;--topbar-hover-background-color: __secondaryButtonBackgroundHover__;--topbar-text-color: __secondaryButtonText__;--primary-button-text-color: __primaryButtonText__;--primary-button-text-color-active: __primaryButtonTextHover__;--primary-button-background-color-active: __primaryButtonBackgroundHover__;--primary-button-background-color: __primaryButtonBackground__;--primary-button-border-color: __primaryButtonBorder__;--primary-button-border-color-active: __primaryButtonBorderHover__;--secondary-button-background-color: __secondaryButtonBackground__;--secondary-button-background-color-active: __secondaryButtonBackgroundHover__;--secondary-button-text-color: __secondaryButtonText__;--secondary-button-text-color-active: __secondaryButtonTextHover__;--secondary-button-border-color: __secondaryButtonBorder__;--secondary-button-border-color-active: __secondaryButtonBorderHover__;--volume-control-background-color: __volumeControlBackgroundColor__;--volume-control-playback-color: __volumeControlPlaybackColor__;--volume-control-thumb-color: __volumeControlThumbColor__;--more-menu-volume-control-background-color: __moreMenuVolumeControlBackgroundColor__;--more-menu-volume-control-playbackColor: __moreMenuVolumeControlPlaybackColor__;--more-menu-volume-control-thumb-color: __moreMenuVolumeControlThumbColor__;--popup-background-color: __popupBackground__;--popup-transparent-background-color: __transparentPopupBackground__;--popup-border: __popupBorder__;--popup-background-hover-color: __popupBackgroundHover__;--popup-text-color: __popupText__;--popup-text-hover-color: __popupTextHover__;--link-button-background-color: transparent;--link-button-text-color: __linkButtonTextColor__;--player-text: __playerText__;--button-border-radius: __borderRadius__;--presenter-info-link-border-color: __presenterInfoLinkBorderColor__;--search-field-background-color: __searchFieldBackgroundColor__;--hovered-tab-background-color: __hoveredTabBackgroundColor__;--selected-tab-background-color: __selectedTabBackgroundColor__;--top-panel-icon-container-color: __topPanelIconContainerColor__;--top-panel-icon-color: __topPanelIconColor__;--mini-skin-menu-button-text: __miniSkinMenuButtonText__;--mini-skin-menu-button-background-active: __miniSkinMenuButtonBackgroundActive__;--mini-skin-top-bottom-panel-border: __miniSkinTopBottomPanelBorder__;--mini-skin-presenter-delimiter-color: __miniSkinPresenterDelimiterColor__;--top-bottom-panel-border-color: __topBottomPanelBorderColor__; }.universal-side-panel {width: 280px;height: 100%;overflow: hidden;z-index: 0;position: relative;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-transform-origin: left center;transform-origin: left center;background: var(--panel-color);color: var(--panel-text-color);vertical-align: top;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel__presenter-info {padding: 24px 20px;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel__presenter-info.universal-side-panel__presenter-info_with-delimiter::after {content: '';height: 1px;width: 240px;background: var(--popup-text-color);opacity: 0.08;position: absolute;bottom: 0;left: 20px; } .universal-side-panel .logo {width: 100%;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;-ms-flex-negative: 0;flex-shrink: 0;position: relative;background: var(--company-logo-background-color); } .universal-side-panel .logo.logo_has-logo {padding: 12px 0;min-height: 75px;max-height: 180px;max-width: 280px; } .universal-side-panel .logo a {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;height: 100%; } .universal-side-panel .logo a canvas {max-height: 156px;max-width: 280px; } .universal-side-panel .logo.logo_with-delimiter::after {content: '';height: 1px;width: 240px;background: var(--popup-text-color);opacity: 0.08;position: absolute;bottom: 0;left: 20px; } .universal-side-panel .video-container {box-sizing: border-box;overflow: hidden;margin-bottom: 12px;position: relative;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel .video-container::before {content: '';box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.04);position: absolute;z-index: 1;left: 0;top: 0;width: 100%;height: 100%;pointer-events: none; } .universal-side-panel__video-stub {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;box-sizing: border-box;-ms-flex-negative: 0;flex-shrink: 0;height: 158px;margin-bottom: 12px;background: var(--panel-video-stub-background-color);color: var(--panel-video-stub-color); } .universal-side-panel .playerView {box-sizing: border-box;overflow: hidden;position: relative;margin-bottom: 12px;-ms-flex-negative: 0;flex-shrink: 0; } .universal-side-panel .playerView::before {content: '';box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.04);position: absolute;z-index: 1;left: 0;top: 0;width: 100%;height: 100%;pointer-events: none; } .universal-side-panel__maximized {margin: 0;position: absolute;width: 36px;height: 36px;background: rgba(69, 69, 69, 0.84);color: #FFFFFF;border-radius: 10px;-webkit-backdrop-filter: blur(8px);backdrop-filter: blur(8px);left: 8px;bottom: 5px;z-index: 3;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center; } .universal-side-panel__maximized.universal-side-panel__maximized_at-left {right: 8px;left: auto; } .universal-side-panel__maximized.universal-side-panel__maximized_active {background: #454545; } .universal-side-panel__panel-title {color: var(--text-color);padding: 5px 8px 12px 8px; }.outline-info-panel {font-family: var(--font-family-normal);-ms-flex-positive: 1;flex-grow: 1;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;border-radius: inherit;height: 100%; } .outline-info-panel .outline-panel-header {display: -ms-flexbox;display: flex;-ms-flex-negative: 0;flex-shrink: 0;-ms-flex-align: center;align-items: center;width: 100%;height: 68px;padding: 16px 16px 16px 20px; } .outline-info-panel .outline-panel-header__switcher {display: -ms-flexbox;display: flex;-ms-flex-negative: 0;flex-shrink: 0;-ms-flex-positive: 1;flex-grow: 1; } .outline-info-panel .outline-panel-header__panel-title {font-family: var(--font-family-bold);font-size: 16px;line-height: 20px;color: var(--panel-text-color);-ms-flex-negative: 0;flex-shrink: 0;-ms-flex-positive: 1;flex-grow: 1; } .outline-info-panel .search-button {width: 36px;height: 36px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;color: var(--popup-text-color);cursor: pointer; } .outline-info-panel .search-button svg {width: 20px;height: 20px; } .outline-info-panel .clear-button {width: 36px;height: 36px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;color: var(--popup-text-color);cursor: pointer; } .outline-info-panel .clear-button svg {width: 20px;height: 20px; } .outline-info-panel .search-button {opacity: 0.72; } .outline-info-panel .clear-button {position: absolute;right: 4px;top: 2px;opacity: 0.6; } .outline-info-panel .search-wrapper {-ms-flex-positive: 1;flex-grow: 1;position: relative; } .outline-info-panel .search-field {position: relative;height: 40px;width: 100%;background: var(--search-field-background-color);border-radius: 8px;padding: 10px 44px 10px 16px;font-size: 15px;line-height: 20px;color: var(--panel-text-color);border: none;outline: none; } .outline-info-panel .search-field:-ms-input-placeholder {opacity: 0.4; } .outline-info-panel .search-field::placeholder {opacity: 0.4; } .outline-info-panel .panel-tab-button {font-family: var(--font-family-bold);display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;height: 36px;padding: 0 16px;border-radius: var(--button-border-radius);color: var(--panel-text-color);background: transparent;opacity: 0.72;transition: background 0.3s ease, color 0.3s ease, opacity 0.3s ease; } .outline-info-panel .panel-tab-button.panel-tab-button_active {background: var(--hovered-tab-background-color);color: var(--list-item-text-hover-color);opacity: 1; } .outline-info-panel .panel-tab-button.panel-tab-button_chosen {background: var(--selected-tab-background-color);color: var(--list-item-text-pressed-color);opacity: 1; } .outline-info-panel .panel-tab-button:not(:last-child) {margin-right: 4px; } .outline-info-panel.outline-info-panel_mode_notes .outline-info-panel__outline-container {display: none; } .outline-info-panel__notes-container {-ms-flex-positive: 1;flex-grow: 1;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;height: 100%; } .outline-info-panel__outline-container {-ms-flex-positive: 1;flex-grow: 1;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;height: 100%; } .outline-info-panel__outline-container {border-radius: inherit;border-top-left-radius: 0;border-top-right-radius: 0;height: 100%; } .outline-info-panel__notes-container {padding-bottom: 10px; } .outline-info-panel .outline {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden;border-radius: inherit;height: 100%; } .outline-info-panel .notes {height: 100%;position: relative;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;padding-left: 12px; } .outline-info-panel .notes .notes-text {word-wrap: break-word;padding-right: 10px; } .outline-info-panel .notes .notes-text p {margin-top: 0;margin-bottom: 0;white-space: pre-wrap; } .outline-info-panel .notes .notes-text p, .outline-info-panel .notes .notes-text span {color: var(--panel-text-color) !important; } .outline-info-panel .notes .notes-text p:first-child {margin-top: 0; } .outline-info-panel .notes .notes-text p:last-child {margin-bottom: 0; } .outline-info-panel .notes .notes-text p, .outline-info-panel .notes .notes-text p.bold span.nobold, .outline-info-panel .notes .notes-text p.italic span.noitalic, .outline-info-panel .notes .notes-text p.bold.italic span.nobold.noitalic {font-family: var(--font-family-normal); } .outline-info-panel .notes .notes-text p span.bold, .outline-info-panel .notes .notes-text p.bold, .outline-info-panel .notes .notes-text p.italic span.bold.noitalic, .outline-info-panel .notes .notes-text p.bold.italic span.noitalic {font-family: var(--font-family-bold); } .outline-info-panel .notes .notes-text p span.italic, .outline-info-panel .notes .notes-text p.bold span.nobold.italic, .outline-info-panel .notes .notes-text p.italic, .outline-info-panel .notes .notes-text p.bold.italic span.nobold {font-family: var(--font-family-italic); } .outline-info-panel .notes .notes-text p span.bold.italic, .outline-info-panel .notes .notes-text p.bold span.italic, .outline-info-panel .notes .notes-text p.italic span.bold, .outline-info-panel .notes .notes-text p.bold.italic {font-family: var(--font-family-bold-italic); } .outline-info-panel .notes__scroll-area {overflow: hidden; } .outline-info-panel.outline-info-panel_mode_outline .outline-info-panel__notes-container {display: none; }.logo-container {display: -ms-flexbox;display: flex; } .logo-container > a {display: -ms-flexbox;display: flex; }.top-panel {display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;-ms-flex-pack: justify;justify-content: space-between;height: 52px;padding: 0 16px;border-bottom: 1px solid var(--top-bottom-panel-border-color);box-sizing: border-box;will-change: transform; } .top-panel.top-panel_reversed {-ms-flex-direction: row-reverse;flex-direction: row-reverse; } .top-panel__container {display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;-ms-flex-align: center;align-items: center; } .top-panel__presenter-info {max-width: 400px;padding: 32px 28px; }.top-main-container {display: -ms-flexbox;display: flex;-ms-flex-positive: 1;flex-grow: 1;-ms-flex-pack: justify;justify-content: space-between;max-height: 100%; } .top-main-container .info-container {margin-left: auto; } .top-main-container .info-container__item:first-child {margin-right: 20px; } .top-main-container .info-container__item:last-child {margin-right: 0; } .top-main-container.top-main-container_reversed {-ms-flex-direction: row-reverse;flex-direction: row-reverse; } .top-main-container.top-main-container_reversed .info-container {margin-right: auto;margin-left: 0;-ms-flex-direction: row-reverse;flex-direction: row-reverse; } .top-main-container.top-main-container_reversed .info-container__item:first-child {margin-right: 0; } .top-main-container.top-main-container_reversed .info-container__item:last-child {margin-right: 20px; }.buttons-container {-ms-flex-negative: 0;flex-shrink: 0; } .buttons-container__button {margin-right: 8px; }.info-container {overflow: hidden; } .info-container__title {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;overflow: hidden;color: var(--text-color);max-width: 480px; } .info-container__title > div {font-family: var(--font-family-normal);font-size: 14px;line-height: 20px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; }:root {--page-background-color: __pageBackground__;--button-background-color: __primaryButtonBackground__;--button-hover-background-color: __primaryButtonBackgroundHover__;--button-hover-text-color: __primaryButtonTextHover__;--button-text-color: __primaryButtonText__;--company-logo-background-color: __asideLogoBackground__;--hyperlink-text-color: __hyperlink__;--list-item-background-hover-color: __asideElementBackgroundHover__;--list-item-border-color: __outlineItemBorder__;--list-item-background-pressed-color: __asideElementBackgroundActive__;--list-item-text-hover-color: __asideElementTextHover__;--list-item-text-pressed-color: __asideElementTextActive__;--list-item-text-visited-color: __asideElementTextVisited__;--list-item-icon-fill-color: __itemsListIconFill__;--list-item-order-color: __itemsListOrder__;--list-item-icon-stroke-color: __itemsListIconStroke__;--list-item-icon-color: __itemsListIcon__;--panel-color: __asideBackground__;--panel-text-color: __asideElementText__;--panel-video-stub-background-color: __panelVideoStubBackgroundColor__;--panel-video-stub-color: __panelVideoStubColor__;--player-background-color: __playerBackground__;--progressbar-background-color: __progressBackground__;--progressbar-playback-color: __progressPlayback__;--slide-border-color: __slideBorder__;--text-color: __playerText__;--topbar-hover-background-color: __secondaryButtonBackgroundHover__;--topbar-text-color: __secondaryButtonText__;--primary-button-text-color: __primaryButtonText__;--primary-button-text-color-active: __primaryButtonTextHover__;--primary-button-background-color-active: __primaryButtonBackgroundHover__;--primary-button-background-color: __primaryButtonBackground__;--primary-button-border-color: __primaryButtonBorder__;--primary-button-border-color-active: __primaryButtonBorderHover__;--secondary-button-background-color: __secondaryButtonBackground__;--secondary-button-background-color-active: __secondaryButtonBackgroundHover__;--secondary-button-text-color: __secondaryButtonText__;--secondary-button-text-color-active: __secondaryButtonTextHover__;--secondary-button-border-color: __secondaryButtonBorder__;--secondary-button-border-color-active: __secondaryButtonBorderHover__;--volume-control-background-color: __volumeControlBackgroundColor__;--volume-control-playback-color: __volumeControlPlaybackColor__;--volume-control-thumb-color: __volumeControlThumbColor__;--more-menu-volume-control-background-color: __moreMenuVolumeControlBackgroundColor__;--more-menu-volume-control-playbackColor: __moreMenuVolumeControlPlaybackColor__;--more-menu-volume-control-thumb-color: __moreMenuVolumeControlThumbColor__;--popup-background-color: __popupBackground__;--popup-transparent-background-color: __transparentPopupBackground__;--popup-border: __popupBorder__;--popup-background-hover-color: __popupBackgroundHover__;--popup-text-color: __popupText__;--popup-text-hover-color: __popupTextHover__;--link-button-background-color: transparent;--link-button-text-color: __linkButtonTextColor__;--player-text: __playerText__;--button-border-radius: __borderRadius__;--presenter-info-link-border-color: __presenterInfoLinkBorderColor__;--search-field-background-color: __searchFieldBackgroundColor__;--hovered-tab-background-color: __hoveredTabBackgroundColor__;--selected-tab-background-color: __selectedTabBackgroundColor__;--top-panel-icon-container-color: __topPanelIconContainerColor__;--top-panel-icon-color: __topPanelIconColor__;--mini-skin-menu-button-text: __miniSkinMenuButtonText__;--mini-skin-menu-button-background-active: __miniSkinMenuButtonBackgroundActive__;--mini-skin-top-bottom-panel-border: __miniSkinTopBottomPanelBorder__;--mini-skin-presenter-delimiter-color: __miniSkinPresenterDelimiterColor__;--top-bottom-panel-border-color: __topBottomPanelBorderColor__; }.more-menu-popup {padding: 12px 0; } .more-menu-popup .volume-slider-wrapper {width: 86px; } .more-menu-popup .volume-slider {position: relative;width: 80px;height: 3px; } .more-menu-popup .volume-slider__enlarged-click-area {position: absolute;cursor: pointer;width: 100%;height: 40px;top: 50%;-ms-transform: translateY(-50%);transform: translateY(-50%); } .more-menu-popup .volume-slider__background {position: absolute;width: 100%;height: 100%;background: var(--more-menu-volume-control-background-color); } .more-menu-popup .volume-slider__volume {position: absolute;background: var(--more-menu-volume-control-playbackColor);bottom: 0;left: 0;height: 100%;border-radius: 4px; } .more-menu-popup .volume-slider__track {position: relative;height: 100%; } .more-menu-popup .volume-slider__thumb {position: absolute;width: 12px;height: 12px;border-radius: 50%;background: var(--more-menu-volume-control-thumb-color);bottom: -4.5px;margin-left: -6px; }.collapsable-buttons-group {vertical-align: middle;display: -ms-inline-flexbox;display: inline-flex;-ms-flex-align: center;align-items: center;overflow: hidden;-ms-flex-positive: 1;flex-grow: 1;-ms-flex-negative: 1;flex-shrink: 1; } .collapsable-buttons-group__collapsable-button {margin-right: 8px; }.navigation-controls {display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;-ms-flex-align: center;align-items: center;position: relative; } .navigation-controls__button.navigation-controls__button_next {margin-left: 8px; } .navigation-controls__button.navigation-controls__button_prev {margin-left: 20px; } .navigation-controls__button.navigation-controls__button_locked {pointer-events: auto;cursor: url(data/lock.cur), no-drop; } .navigation-controls__label {font-size: 14px;color: var(--text-color);opacity: 0.72; }.play-controls-container {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative;-ms-flex-positive: 1;flex-grow: 1;-ms-flex-negative: 1;flex-shrink: 1;overflow: hidden;margin: 14px 16px; } .play-controls-container::before {content: '';display: inline-block;height: 100%;vertical-align: middle; } .play-controls-container__play-pause-button {margin-right: 8px; } .play-controls-container__outline-button {margin-right: 8px; }.universal-control-panel {font-family: var(--font-family-normal);display: -ms-flexbox;display: flex;-ms-flex-direction: row;flex-direction: row;width: 100%;position: relative;-ms-transform-origin: 0 0;transform-origin: 0 0;min-height: 66px;will-change: transform; } .universal-control-panel .volume-slider-wrapper {width: 86px; } .universal-control-panel .volume-slider {position: relative;width: 80px;height: 3px; } .universal-control-panel .volume-slider__enlarged-click-area {position: absolute;cursor: pointer;width: 100%;height: 40px;top: 50%;-ms-transform: translateY(-50%);transform: translateY(-50%); } .universal-control-panel .volume-slider__background {position: absolute;width: 100%;height: 100%;background: var(--volume-control-background-color); } .universal-control-panel .volume-slider__volume {position: absolute;background: var(--volume-control-playback-color);bottom: 0;left: 0;height: 100%;border-radius: 4px; } .universal-control-panel .volume-slider__track {position: relative;height: 100%; } .universal-control-panel .volume-slider__thumb {position: absolute;width: 12px;height: 12px;border-radius: 50%;background: var(--volume-control-thumb-color);bottom: -4.5px;margin-left: -6px; } .universal-control-panel__navigation-controls {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative;-ms-flex-positive: 0;flex-grow: 0;-ms-flex-negative: 0;flex-shrink: 0;margin: 14px 16px 14px auto; } .universal-control-panel.universal-control-panel_interaction-mode .universal-control-panel__play-controls-container {display: none; } .universal-control-panel.universal-control-panel_hide-controls {visibility: hidden; }.progress-tooltip {display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;-ms-flex-align: center;align-items: center;-ms-flex-pack: center;justify-content: center;z-index: 1; } .progress-tooltip__thumbnail-tooltip {border: 2px var(--top-bottom-bar-background-color) solid;border-radius: 3px;width: 140px;height: 80px;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out; } .progress-tooltip__timing-tooltip {background: rgba(58, 58, 58, 0.88);border: 1px solid rgba(255, 255, 255, 0.1);border-radius: 4px;-webkit-backdrop-filter: blur(12px);backdrop-filter: blur(12px);color: #FFFFFF;font-size: 14px;line-height: 18px;padding: 2px 8px;position: absolute;transition: margin-top 0.3s ease-in-out, opacity 0.3s ease-in-out;bottom: 4px; }.universal-skin-separator {position: relative;width: 100%;padding-top: 1px; } .universal-skin-separator::after {content: '';display: block;height: 1px;background: var(--top-bottom-panel-border-color); }.progressbar {position: relative;height: 2px;width: 100%; } .progressbar__progress {position: absolute;top: 0;left: 0;width: 100%;height: 100%;background-color: var(--progressbar-background-color);transition: transform 0.3s ease-in-out; } .progressbar__progress-background {position: absolute;background: var(--progressbar-playback-color);top: 0;left: 0;height: 100%;transition: transform 0.3s ease-in-out; } .progressbar__thumb {width: 12px;height: 12px;border-radius: 50%;background: var(--progressbar-playback-color);bottom: -5px;position: absolute;left: -6px;cursor: pointer; } .progressbar__progress-tooltip {position: absolute;top: -14px;-ms-transform: translateY(-100%);transform: translateY(-100%); }.show-side-panel-button {position: absolute;top: 6px;z-index: 1001; } .show-side-panel-button.show-side-panel-button_side_left {left: 0; } .show-side-panel-button.show-side-panel-button_side_left .show-side-panel-button__button {left: -9px;border-radius: 0 25px 25px 0; } .show-side-panel-button.show-side-panel-button_side_right {right: 0; } .show-side-panel-button.show-side-panel-button_side_right .show-side-panel-button__button {left: 9px;border-radius: 25px 0 0 25px; } .show-side-panel-button.show-side-panel-button_side_right .show-side-panel-button__button.show-side-panel-button__button_active, .show-side-panel-button.show-side-panel-button_side_right .show-side-panel-button__button[aria-pressed='true'], .show-side-panel-button.show-side-panel-button_side_left .show-side-panel-button__button.show-side-panel-button__button_active, .show-side-panel-button.show-side-panel-button_side_left .show-side-panel-button__button[aria-pressed='true'] {background: var(--player-background-color);left: 0; } .show-side-panel-button__button {background: var(--player-background-color);box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.2);transition-property: left; }.popups-layer {position: absolute;margin-left: 0 !important;left: 0;top: 0;width: 100%; } .popups-layer .popup {background: var(--popup-background-color);border: 1px solid var(--popup-border);box-shadow: 0 20px 32px rgba(0, 0, 0, 0.16);-webkit-backdrop-filter: blur(8px);backdrop-filter: blur(8px);border-radius: 10px;position: absolute;top: 0;left: 0; } .popups-layer .popup.popup_outline-popup {width: 280px; } .popups-layer .popup.popup_presenter .mask {width: calc(100% - 2px);left: 1px;bottom: 12px; } .popups-layer .popup.popup_attachments {width: 368px;box-sizing: border-box; }.notes-popup {position: relative;font-size: 15px;line-height: 20px;word-wrap: break-word;width: 372px;padding: 16px;border-radius: inherit; } .notes-popup__scroll-area {overflow: hidden;height: 100%; } .notes-popup .notes-text {word-wrap: break-word; } .notes-popup .notes-text p {margin-top: 0;margin-bottom: 0;white-space: pre-wrap; } .notes-popup .notes-text p, .notes-popup .notes-text span {color: var(--panel-text-color) !important; } .notes-popup .notes-text p:first-child {margin-top: 0; } .notes-popup .notes-text p:last-child {margin-bottom: 0; } .notes-popup .notes-text p, .notes-popup .notes-text p.bold span.nobold, .notes-popup .notes-text p.italic span.noitalic, .notes-popup .notes-text p.bold.italic span.nobold.noitalic {font-family: var(--font-family-normal); } .notes-popup .notes-text p span.bold, .notes-popup .notes-text p.bold, .notes-popup .notes-text p.italic span.bold.noitalic, .notes-popup .notes-text p.bold.italic span.noitalic {font-family: var(--font-family-bold); } .notes-popup .notes-text p span.italic, .notes-popup .notes-text p.bold span.nobold.italic, .notes-popup .notes-text p.italic, .notes-popup .notes-text p.bold.italic span.nobold {font-family: var(--font-family-italic); } .notes-popup .notes-text p span.bold.italic, .notes-popup .notes-text p.bold span.italic, .notes-popup .notes-text p.italic span.bold, .notes-popup .notes-text p.bold.italic {font-family: var(--font-family-bold-italic); }.attachments-popup {padding: 12px 0;border-radius: inherit; }.marker-panel {font-family: var(--font-family-normal);padding: 12px 0;width: 260px; } .marker-panel__separator {position: relative;background: var(--popup-text-color);opacity: 0.08;height: 1px;margin: 3px 0; }.marker-panel-button {display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative;padding: 4px 20px;opacity: 1;background-color: transparent;transition: background-color 0.28s ease-in-out;width: 100%; } .marker-panel-button__text {font-size: 15px;text-align: left;color: var(--popup-text-color); } .marker-panel-button.marker-panel-button_type_eraseAll, .marker-panel-button.marker-panel-button_type_endDrawing {padding: 14px 20px 14px 24px; } .marker-panel-button:focus, .marker-panel-button:hover {background-color: var(--list-item-background-hover-color); } .marker-panel-button:focus .marker-panel-button__text, .marker-panel-button:hover .marker-panel-button__text {color: var(--popup-text-hover-color); } .marker-panel-button:focus .marker-panel-button__item-icon, .marker-panel-button:hover .marker-panel-button__item-icon {color: var(--popup-text-hover-color); } .marker-panel-button[disabled] {opacity: 0.5;color: var(--popup-text-color);pointer-events: none; } .marker-panel-button[aria-selected='true'] {background-color: var(--list-item-background-pressed-color);color: var(--list-item-text-pressed-color); }.item-icon {width: 40px;height: 40px;background-color: var(--top-panel-icon-container-color);border-radius: 50%;margin-right: 10px;display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center;-ms-flex-align: center;align-items: center;color: var(--popup-text-color); } .item-icon__item-icon-image {width: 28px;height: 28px;color: inherit; }.outline {font-family: var(--font-family-normal);position: relative; }.search-result {font-family: var(--font-family-bold);padding: 16px 0 8px 20px;position: relative;font-size: 15px;line-height: 20px;color: var(--popup-text-color); } .search-result.search-result_no-results {font-family: var(--font-family-normal);height: 100%;text-align: center;padding: 60px 0 0;opacity: 0.6; }.slide-item-view {position: relative;overflow: hidden;display: table;width: 100%;color: var(--panel-text-color);transition: background 0.28s ease; } .slide-item-view__content {height: 100%;display: table-row; } .slide-item-view__content > * {display: table-cell;vertical-align: middle; } .slide-item-view__open-button {width: 12px;height: 12px;margin: 0 8px 0 12px;opacity: 0.6;padding: 0;color: var(--popup-text-color);transition: transform 0.3s ease;background: transparent; } .slide-item-view__open-button[aria-pressed='true'] {-ms-transform: rotate(90deg);transform: rotate(90deg); } .slide-item-view__thumb {max-width: 100px;max-height: 60px;vertical-align: middle;margin-top: 1px;border: 1px solid rgba(0, 0, 0, 0.04);border-radius: 4px;background-color: var(--player-background-color); } .slide-item-view__status {position: absolute;width: 18px;height: 18px;background-size: 18px 18px; } .slide-item-view__status.slide-item-view__status_status_correct {background-image: url("+ +g[31]+"); } .slide-item-view__status.slide-item-view__status_status_partially {background-image: url("+g[32]+"); } .slide-item-view__status.slide-item-view__status_status_incorrect {background-image: url("+g[33]+"); } .slide-item-view__status.slide-item-view__status_status_answered {background-image: url("+g[34]+"); } .slide-item-view__status.slide-item-view__status_answered {background-image: url("+g[35]+"); } .slide-item-view__mark {position: absolute;width: 12px;height: 18px;top: 0;bottom: 0;margin: auto;background-image: url("+ +g[36]+");background-size: 12px 18px;background-repeat: no-repeat;margin-left: -40px; } .slide-item-view__mark.slide-item-view__mark_with-status {left: 8px; } .slide-item-view__title-container {width: 100%; } .slide-item-view__title {padding: 0 16px;font-size: 14px;line-height: 18px;max-height: 60px;word-break: break-word;overflow: hidden;display: -webkit-box;-webkit-line-clamp: 3;/*! autoprefixer: off */ -webkit-box-orient: vertical;-ms-box-orient: vertical;-moz-box-orient: vertical;/* autoprefixer: on */ } .slide-item-view__title.slide-item-view__title_minimized {max-height: 70px; } .slide-item-view.slide-item-view_with-thumbnail .slide-item-view__title {padding-left: 11px; } .slide-item-view.slide-item-view_with-thumbnail .slide-item-view__mark {margin-left: -20px; } .slide-item-view.slide-item-view_active {background: var(--list-item-background-hover-color);color: var(--list-item-text-hover-color); } .slide-item-view.slide-item-view_active .slide-item-view__mark {background-image: url("+ +g[37]+"); } .slide-item-view[aria-selected='true'] {background: var(--list-item-background-pressed-color);color: var(--list-item-text-pressed-color); } .slide-item-view[aria-selected='true'] .slide-item-view__mark {background-image: url("+g[38]+"); }.treecontrol.treecontrol_highlight-viewed .slide-item-view.slide-item-view_viewed {color: var(--list-item-text-visited-color); }.treecontrol.treecontrol_highlight-viewed .slide-item-view.slide-item-view_viewed.slide-item-view_active {background: var(--list-item-background-hover-color);color: var(--list-item-text-hover-color); }.treecontrol.treecontrol_highlight-viewed .slide-item-view.slide-item-view_viewed[aria-selected='true'] {background: var(--list-item-background-pressed-color);color: var(--list-item-text-pressed-color); }.highlighted {font-family: var(--font-family-bold);padding: 2px 3px;margin: -2px -3px;font-size: 14px;line-height: 18px;color: var(--popup-text-color);opacity: 1; }.search-context {font-size: 14px;line-height: 18px;color: var(--popup-text-color);opacity: 0.6; }:root {--font-family-bold: PFnb;--font-family-bold-italic: PFnbi;--font-family-italic: PFni;--font-family-normal: PFn;--font-family-semibold: PFnsb, PFn;--font-family-semibold-italic: PFnsbi, PFni; }@keyframes preloader_spin {0% {transform: rotate(0deg); } 100% {transform: rotate(360deg); } }.message-box {background: var(--player-background-color);position: absolute;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;border-radius: 7px;min-width: 280px;padding: 40px;box-shadow: 0 8px 16px rgba(0, 0, 0, 0.08); } .message-box::after {content: '';box-sizing: border-box;border: 1px solid var(--popup-border);width: 100%;height: 100%;position: absolute;left: 0;top: 0;border-radius: 7px;pointer-events: none; } .message-box__content {position: relative;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;-ms-flex-direction: column;flex-direction: column; } .message-box__icon {width: 24px;height: 24px;margin-bottom: 24px;position: relative;display: inline-block;color: var(--text-color);opacity: 0.72; } .message-box .message-box-buttons {position: relative;width: 100%;height: 36px; } .message-box .message-box-buttons__buttons {display: -ms-flexbox;display: flex;-ms-flex-pack: center;justify-content: center; } .message-box .message-box-buttons__window-button {margin: 0 4px; } .message-box .vertical-scrollbar {top: 40px; } .message-box__message-container {overflow: hidden;display: inline-block;max-width: 480px;vertical-align: top;position: relative; } .message-box__message {text-align: center;font-size: 16px;color: var(--text-color);text-overflow: ellipsis;overflow: hidden;position: relative;font-family: var(--font-family-normal); } .message-box__buttons {margin-top: 28px; }.universal-tablet {font-family: var(--font-family-normal);position: relative;background: var(--player-background-color); } .universal-tablet__popups-layer {position: absolute;top: 0;left: 0;z-index: 1; } .universal-tablet__popup-layer {z-index: 1; }.universal-layout {width: 100%;height: 100%;display: -ms-flexbox;display: flex;overflow: hidden; } .universal-layout.universal-layout_left-panel {-ms-flex-direction: row-reverse;flex-direction: row-reverse; }.universal-content-area {position: relative;-ms-flex-positive: 1;flex-grow: 1;display: -ms-flexbox;display: flex;-ms-flex-direction: column;flex-direction: column;overflow: hidden; } .universal-content-area__cc {font-family: var(--font-family-normal);width: 100%;height: 110px;margin-top: -110px;background: rgba(41, 41, 41, 0.56);z-index: 1;overflow-x: hidden;overflow-y: auto;-webkit-overflow-scrolling: touch;padding: 0 34px 0 14px;border-width: 13px 0 7px 0;border-style: solid;border-color: transparent;color: #FFFFFF;font-size: 14px;text-shadow: -1.4px 1.4px 2px rgba(0, 0, 0, 0.48);word-wrap: break-word;white-space: pre-wrap; }.video-narration-view {position: relative;top: 0;left: 0;margin-right: 12px;margin-bottom: 12px;border: 1px solid rgba(0, 0, 0, 0.14); } .video-narration-view video {background-color: #000000; } .video-narration-view.video-narration-view_draggable {position: absolute;box-shadow: 0 1px 8px 0 rgba(0, 0, 0, 0.24); } .video-narration-view.video-narration-view_maximized {margin: 12px; }.content-area {-ms-flex-positive: 1;flex-grow: 1;overflow: hidden;display: -ms-flexbox;display: flex;-ms-flex-align: center;align-items: center;position: relative; } .content-area__items-container {display: -ms-flexbox;display: flex;-ms-flex-align: start;align-items: flex-start;-ms-grid-column-align: center;justify-items: center;overflow: hidden;margin: auto; } .content-area .playerView {z-index: 0;position: relative;margin: 0 12px;top: 0;left: 0; } .content-area .playerView.draggable {position: absolute;box-shadow: 0 1px 8px 0 rgba(0, 0, 0, 0.24); } .content-area .playerView .with-border::after {content: '';position: absolute;top: 0;bottom: 0;left: 0;right: 0;border: 1px solid var(--slide-border-color);pointer-events: none; } .content-area.content-area_portrait .content-area__items-container {flex-direction: column-reverse;align-items: flex-end;/* autoprefixer: off */ -webkit-box-orient: vertical;-webkit-box-direction: reverse;/* autoprefixer: on */ } .content-area.content-area_presentation-minimized .playerView {margin: 0 12px 12px 0; } .content-area.content-area_presentation-minimized .content-area__narration-view {margin: 0 12px; } .content-area .preloader {width: 50px;height: 50px;position: absolute;top: 0;left: 0;bottom: 0;right: 0;margin: auto;border-radius: 10px;background-color: rgba(0, 0, 0, 0.5); } .content-area .preloader::after {content: '';position: absolute;background: url("+ +g[39]+");background-size: cover;top: 0;left: 0;bottom: 0;right: 0;animation: preloader_spin 1s infinite linear; }.maximize-button {width: 38px;height: 38px;border: 1px solid #FFFFFF;border-radius: 19px;background: url("+g[40]+") no-repeat center;background-size: 13px 15px;background-color: #4D4D4D;position: absolute;top: 0;left: 0; } .maximize-button.maximize-button_portrait {background-image: url("+g[41]+");background-size: 15px 13px; }.launch-screen {z-index: 100;position: fixed;top: 0;right: 0;bottom: 0;left: 0;background-color: rgba(0, 0, 0, 0.48); } .launch-screen .launch-screen-button {top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 96px;height: 96px;position: absolute; } .launch-screen .launch-screen-button__play-icon {background-color: #FFFFFF;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 0;border-radius: 100%;width: 90px;height: 90px;box-shadow: 0 12px 50px 0 rgba(0, 0, 0, 0.2);transition: 0.3s ease-in-out; } .launch-screen .launch-screen-button__icon {background: url("+ +g[42]+") no-repeat center;position: absolute;top: 0;bottom: 0;margin: auto;right: 0;left: 6px;width: 90px;height: 90px; } .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__play-icon {width: 96px;height: 96px; } .launch-screen .launch-screen-button.launch-screen-button_active .launch-screen-button__icon {background: url("+g[43]+") no-repeat center; }.marker-tool-container {position: absolute;top: 0; }.draw-control {position: absolute; }.treecontrol {background-color: var(--panel-color);position: relative;overflow-y: hidden;border-radius: inherit; }.container-top-shadow {background: __verticalGradient(var(--popup-background-color), var(--popup-transparent-background-color));background: linear-gradient(to bottom, var(--popup-background-color), var(--popup-transparent-background-color));position: absolute;top: 0;left: 0;right: 0;height: 60px;pointer-events: none; }.container-bottom-shadow {background: __verticalGradient(var(--popup-transparent-background-color), var(--popup-background-color));background: linear-gradient(to bottom, var(--popup-transparent-background-color), var(--popup-background-color));position: absolute;bottom: 0;left: 0;right: 0;height: 60px;pointer-events: none;border-radius: inherit; }.mobile-vertical-scrollbar {position: absolute;width: 10px;top: 6px;bottom: 6px;right: 0;opacity: 0; } .mobile-vertical-scrollbar__thumb {position: absolute;width: 3px !important;right: 3px;padding: 1px;border-radius: 5px;background-color: rgba(0, 0, 0, 0.5); }"}(); +var e;for(const [g,h]of Object.entries(null!=(e=a)?e:{}))e=`__${g.replace(RegExp("\\.","g"),"_")}__`,d=d.replace(new RegExp(e,"g"),h);let f;for(const [g,h]of Object.entries(null!=(f=b)?f:{}))d=d.replace(new RegExp(g,"g"),h);d=d.replace(/__verticalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.rn);d=d.replace(/__horizontalGradient\(([#0-9a-z]+), ([#0-9a-z]+)\)/gi,this.pn);return gn(d)}rn(a,b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}pn(a, +b,c){return`url(data:image/svg+xml;base64,${qh(``)})`}};class EG extends kt{constructor(a){super(a);this.jh=new C}};class FG extends P{constructor(a){super({G:a});a=this.displayObject();document.body.appendChild(a);this.Ef();x(this,window,"resize",this.Ef,this)}Ef(){var a=document.documentElement.clientWidth,b=document.documentElement.clientHeight;const c=Math.min(1,(document.documentElement.clientWidth-20)/this.width());wn(this.displayObject(),c);yi(this.displayObject(),"0 0");a=Math.max(10,Math.round((a-this.width()*c)/2));b=Math.max(0,Math.round((b-this.height()*c)/2));this.move(a,b)}rd(){super.rd();Fd(this.displayObject())}} +;class GG extends FG{constructor(a,b){super("info_panel");Ft(this,b);b=new P({G:"label"});b.la(a);b.nf("alert");b.pf("live","assertive");N(this,b)}};class HG extends Mt{constructor(a){super(a,"input");this.za().type="password"}value(){return this.za().value}};function IG(a,b,c,d=!0){a=new P({Yb:a,G:b});a.la(c);a.J(d);return a}function JG(a){x(a,a.Qn.za(),"input",()=>{a.xS.ra(!!a.Qn.value())});x(a,a.Qn.za(),"keypress",b=>{13==b.keyCode&&a.CF()})} +class KG extends FG{constructor(a,b,c,d){super("password_form");this.nf("dialog");this.setAttribute("tabindex","-1");this.CF=this.CF.bind(this,d);this.PL=IG("LABEL","password_label",a);N(this,this.PL);this.Qn=new HG("password_field");N(this,this.Qn);this.WE=IG("DIV","wrong_password_label",b,!1);N(this,this.WE);this.xS=this.Oe("btn_ok",c,this.CF);N(this,this.xS);a=ld();b=ld();this.PL.setAttribute("id",a);this.PL.setAttribute("for",b);this.Qn.setAttribute("id",b);this.Qn.pf("labelledby",a);this.Qn.pf("required", +!0);this.WE.nf("alert");this.WE.pf("live","assertive");JG(this);Ii||this.Qn.displayObject().focus()}Oe(a,b,c){a=new HC({G:a});a.la(b);a.ra(!1);z(this,a.ka,c,this);return a}CF(...a){a=a[0];const b=this.Qn.value();b&&(a(b),this.WE.J(!0))}};function LG(a,b,c){Ii&&(this.ki=wd("DIV"),mn(this.ki,"tap_area"));It.call(this,b);this.ki&&this.V(this.ki);this.YG=!0;this.q4=c?!0:!1;c&&this.Ac(!1);a&&this.ka.addHandler(this.zM,this);Ii&&(a=this.za(),mn(a,"mobile"));this.Ox(0);this.za().setAttribute("tabindex","-1");this.ny()}t(LG,It);k=LG.prototype;k.ft=!1;k.Fb=!0;k.XS=function(a){a=wd("BUTTON",a);Ib&&8>=Vb||(a.type="button");return a};k.selected=function(){return this.ft}; +k.yh=function(a){if(a){var b=this.za();mn(b,"selected")}else b=this.za(),nn(b,"selected");this.q4&&this.Ac(a);this.ft=a};k.enabled=function(){return this.Fb};k.ra=function(a){LG.Mb.ra.call(this,a);const b=this.za();b.disabled=a?"":"disabled";if(a){var c=this.displayObject();nn(c,"disabled")}else c=this.displayObject(),mn(c,"disabled");!a&&b.blur&&b.blur();this.Fb=a};k.Ac=function(a){this.za().setAttribute("aria-pressed",a)};k.zM=function(){this.yh(!this.ft)}; +k.Si=function(a){LG.Mb.Si.call(this,a);-1==this.Xr&&this.za().blur()};k.Vx=function(){return LG.Mb.Vx.call(this)};k.Bp=function(a){this.enabled()&&LG.Mb.Bp.call(this,a)};k.ik=function(a){this.YG=!1;LG.Mb.ik.call(this,a);this.YG=!0};function MG(a,b,c,d){Mt.call(this,"info_panel "+a);this.mF=c;this.qa=Ki();a=new Mt("message");a.la(b);this.V(a);b=this.displayObject();document.body.appendChild(b);this.mF&&(this.In=new LG(!1,"ok"),this.In.la(d),d=this.In.displayObject(),document.body.appendChild(d));yi(this.displayObject(),"0 0");wn(this.displayObject(),this.qa);this.mF&&(yi(this.In.displayObject(),"0 100%"),wn(this.In.displayObject(),this.qa));this.Ef();ve(window,"resize",this.Ef,!1,this)}t(MG,Mt); +MG.prototype.Xc=function(){Fd(this.displayObject());this.mF&&Fd(this.In.displayObject());De(window,"resize",this.Ef,!1,this)};MG.prototype.Ef=function(){const a=document.documentElement.clientWidth/this.qa;let b=document.documentElement.clientHeight/this.qa;this.Zb(a);this.mF&&this.In.Zb(a);ij&&(b+=2);Kt(this,"min-height",b+"px")};function NG(a,b,c,d){MG.call(this,"password",a,!0,c);a=new Mt("password_field");this.V(a);this.In.ra(!1);const e=new HG("");a.V(e);const f=new Mt("wrong_password_label");f.la(b);f.J(!1);this.V(f);const g=()=>{const h=e.value();h&&(d(h),f.J(!0))};ve(e.za(),"input",()=>{this.In.ra(!!e.value())},!1,this);ve(e.za(),"keypress",h=>{13==h.keyCode&&g()},!1,this);this.In.ka.addHandler(g,this)}t(NG,MG);class OG extends kv{nr(){super.nr();F(this.background(),"display","none");F(this.content(),"display","none")}};function PG(a){const b=Object.assign({},a),c={};for(const d in b)"object"==typeof b[d]&&(b[d]=PG(b[d]),a=b[d],a._d&&(c[a._d]=a));b.toString=()=>b._;b.Oha=d=>c[d];return b};const QG={type:"t",id:"i",url:"u",target:"g",RC:"S",JI:"s",KI:"n",DI:"r"};var RG={CI:{_:"s",text:{_:"t"},A1:{_:"f",qba:{_:"p",xi:"s",length:"l",Kt:"b",wI:{_:"r",xi:"s",length:"l",bold:"b",italic:"i",Gca:"u",tx:Object.assign({_:"h"},QG)}}},w_:{_:"a"},tx:Object.assign({_:"h"},QG),e1:{_:"b"},lk:{_:"s"},Bi:{_:"v"},Aaa:{_:"T"}}};const SG={};for(const a in RG)RG.hasOwnProperty(a)&&(SG[a]=PG(RG[a]));var TG=class{constructor(a,b,c){this.type=a;this.id=b;this.DI=this.KI=this.JI=this.target=this.url=this.RC=void 0;this.vaa=c}};const UG=new Map;function VG(a,b,c){c=new TG(a[b.type],a[b.id],c);c.RC=a[b.RC];c.url=a[b.url];c.target=a[b.target];c.JI=a[b.JI];c.KI=a[b.KI];a=a[b.DI];"boolean"===typeof a&&(c.DI=a.toString());a=UG.get(c.type);if(void 0===a)throw Error("unknown hyperlink type");return a(c)}function WG(a,b){return`${a.vaa||""}`}UG.set("u",function(a){return WG(a,"return document.getElementById('$coreSprPlaceholder').getCore().gotoLink(this);")}); +UG.set("N",function(a){return WG(a,`document.getElementById('$coreSprPlaceholder').getCore().gotoSlide(${a.JI}, this);return false;`)});UG.set("f",function(a){return WG(a,"document.getElementById('$coreSprPlaceholder').getCore().gotoFirstSlide(this);return false;")});UG.set("l",function(a){return WG(a,"document.getElementById('$coreSprPlaceholder').getCore().gotoLastSlide(this);return false;")});UG.set("v",function(a){return WG(a,"document.getElementById('$coreSprPlaceholder').getCore().gotoLastViewedSlide(this);return false;")}); +UG.set("n",function(a){return WG(a,"document.getElementById('$coreSprPlaceholder').getCore().gotoNextSlide(this);return false;")});UG.set("p",function(a){return WG(a,"document.getElementById('$coreSprPlaceholder').getCore().gotoPreviousSlide(this);return false;")});UG.set("s",function(a){return WG(a,`document.getElementById('$coreSprPlaceholder').getCore().startSlideshow(this, '${a.KI}', ${a.DI});return false;`)});UG.set("e",function(a){return WG(a,"document.getElementById('$coreSprPlaceholder').getCore().endSlideshow(this);return false;")});function XG(a,b){a:switch(b[0].Kt){case "n":var c="ol";break a;case "u":c="ul";break a;default:c="p"}"p"==c?b.forEach(d=>{a+=`

    ${d.R0}

    `}):(a+=`<${c}>`,b.forEach(d=>{a+=`
  • ${d.R0}
  • `}),a+=``);return a}function YG(a){let b="";const c=[];a.forEach(d=>{d.Kt!=b&&(c.push([]),b=d.Kt);c[c.length-1].push(d)});return c};class ZG{constructor(a){this.qg=a}then(a){this.qg=a(this.qg);return this}result(){return this.qg}};function $G(a,b){const c=a[b.text];a=a[b.A1];if(!c||!a)return c?`${c}`:"";const d=b.A1.qba;b=a[d].map(e=>aH(c,e,d));return YG(b).reduce(XG,"")}function aH(a,b,c){const {xi:d,length:e,Kt:f,wI:g,Vba:h}={xi:b[c.xi],length:b[c.length],Kt:b[c.Kt],wI:b[c.wI],Vba:c.wI},l=a.substr(d,e);return{R0:g.map(n=>bH(l,n,h)).join(""),Kt:f}} +function bH(a,b,c){var d=b[c.xi],e=b[c.length],f=b[c.bold]||!1,g=b[c.italic]||!1,h=b[c.Gca]||!1,l=b[c.tx],n=c.tx;return(new ZG(a)).then(m=>m.substr(d,e)).then(m=>m.replace(/\u000b/g,"
    ")).then(m=>cH(m)).then(m=>{g&&(m=`<${"i"}>${m}`);return m}).then(m=>{f&&(m=`<${"b"}>${m}`);return m}).then(m=>{h&&(m=`<${"u"}>${m}`);return m}).then(m=>{l&&(m=VG(l,n,m));return m}).result()} +function cH(a){return(new ZG(a)).then(b=>b.replace(/(\r\n|\r|\n)+/g," ")).then(b=>b.replace(/\xa0|[ \t]+/g," ")).result()};function dH(a,b){return a[b.Aaa]?(new ZG($G(a,b))).then(c=>c?`

    ${c}

    `:"").result():""};function eH(a,b,c){return a.map(d=>{var e=d[b.lk]||d[b.Bi];if(!(e=e?c.get(e):""))if(d[b.e1]&&(d[b.text]||d[b.w_]||d[b.tx])){e=`${d[b.w_]||d[b.text]||`;const f=d[b.tx];e=f?VG(f,b.tx,e):e}else e="";return e||dH(d,b)||$G(d,b)}).join("")};function fH(a){a=[...a.Md().Sc(),...a.$d().Sc()];return new Map(a.map(b=>{var c=b.Di;c=c.pi()||gH(c);return[b.id(),hH(c)]}))}function gH(a){a=document.getElementById(a.id());return Od(a)}function hH(a){return(new ZG(a)).then(b=>b.includes("controls")?b:b.replace(">"," controls>")).then(b=>iH(b,"width")).then(b=>iH(b,"height")).then(b=>b.replace(RegExp('id="\\w+"'),"")).result()}function iH(a,b){return a.includes(b)?a.replace(new RegExp(`${b}="\\d*\\.*\\d+px"`),""):a};function jH(a,b){b.mf()?kH(a,b):Qe(a,b.gl,()=>kH(a,b))}function lH(a){a.ya&&(Fd(a.tb),Fd(a.qS),Fd(a.ya),a.ya=null)}function kH(a,b){var c=b.jy;b=fH(b.slide());c=JSON.parse(c);const d=SG.CI;b=eH(c[d],d,b).replace(/\$coreSprPlaceholder/g,a.xq);b=Ad(Kc(b));a.tb.appendChild(b);ht(a.tb,"main");(b=a.tb.querySelector("h2"))?(b.id=ld(),it(a.tb,"labelledby",b.id)):it(a.tb,"label",a.fg.PB_ACCESSIBLE_ARIA_LABEL_SLIDE)} +class mH extends wg{constructor(a,b,c){super();this.Di=a;this.fg=b;this.xq=c;this.QY=ld();b=zd("DIV");td(b,{"class":"ppt-accessible-slide-display"});this.fl=b;this.ya=null;b=zd("DIV");td(b,{"class":"ppt-accessible-slide-content"});b.setAttribute("tabindex","-1");b.id=this.QY;this.tb=b;b=zd("A");td(b,{"class":"ppt-accessible-skip-link"});b.innerText=this.fg.PB_ACCESSIBLE_ARIA_LABEL_BACK_TO_BEGIN;b.href=`#${this.QY}`;c=zd("DIV");td(c,{"class":"ppt-accessible-skip-link-container"});c.appendChild(b); +this.qS=c;jH(this,a)}xg(){}ju(a){Th(this.ya,a)}width(){return 0}height(){return 0}slide(){return this.ya}content(){return this.tb}background(){throw Error("no background in accessible mode");}resize(){}nr(){lH(this);this.ya=zd("DIV");td(this.ya,{"class":"ppt-accessible-slide"});this.ya.appendChild(this.tb);this.ya.appendChild(this.qS);this.fl.appendChild(this.ya)}Oc(){lH(this)}k0(){}clone(){throw Error("no clone in accessible mode");}RH(){throw Error("no background in accessible mode");}};class nH extends Rq{constructor(a,b,c,d,e,f){super(a,b,c,d,e,f);f&&f.mf()&&u((f.tb||document).getElementsByTagName("IMG"),g=>{g.style.transform=""})}};function oH(a){const b=document.createElement("div");b.style.width=`${a.width()}px`;b.style.height=`${a.height()}px`;b.style.backgroundColor=a.G2;b.style.position="relative";return b}class pH extends Rq{constructor(a,b,c,d){super(a,-1,b,c);this.G2=d||"#000000";Nq(this,oH(this),oH(this))}};function qH(a,b){a.rp=b;a.pO.appendChild(b.fl)}function rH(a){a.M.splice(0,a.M.length)}class sH{constructor(a){this.M=[];this.pO=a;this.rp=null}};class tH extends mv{constructor(a){super(a);this.ih=null;this.yU=E(this)}fb(){return this.ih}hR(a){this.ih=a;this.yU.C(this.ih)}};class uH extends mv{constructor(a){super(a);this.xb=null;this.EX=E(this)}Oa(){return this.xb}qR(a){this.xb=a;this.EX.C()}};function Us(a,b){return a.zd[b]}function vH(a){F(a.jB,"position","normal"==a.Gb?"absolute":"")}function wH(a){a.CD.forEach(b=>{b.mf()?a.fY(b):Qe(a,b.gl,a.fY,a)})} +function xH(a){Se(a,...a.zd);a.zd.splice(0,a.zd.length);Cd(a.jB);rH(a.uk);qH(a.uk,a.rp);yH(a);zH(a);a.CD.forEach(b=>{if(b instanceof uH)AH(a,new lv(a.uk,a.zd.length,a.Ua,a.Na,a.Yz,b,a.Gb));else if(b instanceof tH){a:switch(a.Gb){case "normal":b=new kv(a.uk,a.zd.length,a.Ua,a.Na,a.Yz,b,a.Gb);break a;case "accessible":b=new OG(a.uk,a.zd.length,a.Ua,a.Na,a.Yz,b,a.Gb);break a;default:throw Error("unknown presentation view mode");}AH(a,b)}else if(b instanceof nv)AH(a,new ov(a.uk,a.zd.length,a.Ua,a.Na, +a.Yz,b,a.Gb));else{a:switch(a.Gb){case "normal":b=new nH(a.uk,a.zd.length,a.Ua,a.Na,a.Yz,b);break a;case "accessible":b=new mH(b,a.fg,a.xq);break a;default:throw Error("unknown presentation view mode");}AH(a,b)}})}function yH(a){a.sK.forEach((b,c)=>{yi(c,`${b.origin.x}px ${b.origin.y}px`);on(c,b.transform)})}function zH(a){Array.from(a.sK.keys()).forEach(b=>{b.style.width="";b.style.height=""})}function AH(a,b){B(a,b);var c=a.uk;c.M.push(b);c.pO.appendChild(b.fl);a.zd.push(b)} +class BH extends wg{constructor({AR:a,Ht:b,width:c,height:d,Paa:e,NI:f,backgroundColor:g,SR:h,messages:l}){super();this.CD=b;this.Ua=c;this.Na=d;this.Yz=e;this.xq=f;this.Gb=h;this.fg=l;this.sK=new Map;this.zd=[];this.jB=zd("DIV");mn(this.jB,"slide-displays-root");a.appendChild(this.jB);vH(this);this.uk=new sH(this.jB);this.rp=new pH(this.uk,c,d,g);wH(this);xH(this)}width(){return this.Ua}height(){return this.Na}background(){return this.rp}resize(a,b){if(this.Ua!=a||this.Na!=b)this.Ua=a,this.Na=b, +this.rp.resize(a,b),this.zd.forEach(c=>c.resize(a,b))}Mm(a){this.Gb!=a&&(this.Gb=a,vH(this),xH(this))}fY(a){const b=Array.from(sd("IMG",null,a.tb));a=Array.from(sd("IMG",null,a.slideBackground()));b.concat(a).forEach(c=>{const d=sn(c)||new gm,e=tn(c)||new Xc;this.sK.set(c,{transform:d,origin:e})})}};class CH{constructor(a,b,c,d){this.ya=a;this.pg=b;this.og=c;this.Qe=d;this.yf=this.ih=this.xb=this.jy=this.tb=null}slide(){return this.ya}slideWidth(){return this.pg}slideHeight(){return this.og}Oa(){return this.xb}qR(a){this.xb=a}fb(){return this.ih}hR(a){this.ih=a}ob(){return this.yf}rR(a){this.yf=a}Vq(){return this.Qe}};class DH{constructor(a){this.le=0;this.I9=void 0!==a?a:0;this.Tz=new C;this.Vz=new C;this.DN=new C;this.Fh=null}weight(){return this.I9}progress(){return this.le}context(){return this.Fh}start(a){this.Fh=a}gr(){return this.Tz}CC(){return this.Vz}it(a){this.le!=a&&(this.le=a,this.DN.C(this))}Qh(){this.le=1;this.Tz.C(this)}Uz(){this.Vz.C(this)}};class EH extends DH{constructor(a){super();this.QJ=a}start(a){super.start(a);const b=rd(document,this.QJ);b?(a.tb=b,this.Qh()):this.Uz()}};var FH,GH,HH=[],IH=new C,JH=new C,KH=new C;q("iSpring.InteractionPlayerFactory.registerCreateQuizPlayerFunction",function(a){FH=a;IH.C()});q("iSpring.InteractionPlayerFactory.registerCreateScenarioPlayerFunction",function(a){GH=a;JH.C()});q("iSpring.InteractionPlayerFactory.registerCreateInteractionPlayerFunction",function(a,b){HH[a]=b;KH.C(a)});function LH(a,b,c,d,e,f,g,h,l,n,m,p){const r=FH;if(!r)throw Error("quiz player is not loaded");r(a,b,c,d,e,f,g,h,l,n,m,p)} +function MH(a,b,c,d,e,f,g,h,l,n,m,p){const r=HH[a];if(!r)throw Error(a+" player is not loaded");r(b,c,d,e,f,g,h,l,n,m,p)}function NH(a,b,c,d,e,f,g,h,l,n,m,p,r,v,y,D,I){const A=GH;if(!A)throw Error("scenario player is not loaded");A(a,b,c,d,e,f,g,h,l,n,m,p,r,v,y,D,I)};function OH(a,b,c){PH[b]=c;a="q_"+a;window[a]||(window[a]=function(d,e,f,g,h){(0,PH[d])(e,f,g,h);PH[d]=null})}function QH(a,b,c){PH[b]=c;a="i_"+a;window[a]||(window[a]=function(d,e,f,g){const h=PH[d];h&&(h(e,f,g),PH[d]=null)})}function RH(a,b,c){PH[b]=c;a="s_"+a;window[a]||(window[a]=function(d,e,f,g,h,l,n,m){const p=PH[d];p&&(p(e,f,g,h,l,n,m),PH[d]=null)})}function SH(a,b,c){PH[b]=c;a="sl_"+a;window[a]||(window[a]=function(d,e,f){const g=PH[d];g&&(g(e,f||null),PH[d]=null)})} +function TH(a){Fd(a.kY);a.kY=void 0}function UH(a,b,c,d){const e=a.Qr.substr(0,a.Qr.lastIndexOf("/")+1);var f=wd("div");const g=wd("div");var h=new P;const l=a.context();h.resize(l.slideWidth(),l.slideHeight());f.appendChild(h.displayObject());f.appendChild(g);l.tb=f;f=VH(a);h=l.slide();const n=h.pQ(),m=WH(a.H.CE,a.H.ia()),p=MH.bind(void 0,n,b,c,d,g,f,l.slideWidth(),l.slideHeight(),a.Z3.bind(a),e,h.index(),m);void 0!==HH[n]?p():(KH.addHandler(r=>{r==n&&p()}),Ui(h.Xo()))} +function XH(a,b,c,d,e,f,g,h){const l=a.Qr.substr(0,a.Qr.lastIndexOf("/")+1);var n=wd("div");const m=wd("div");var p=new P;const r=a.context();p.resize(r.slideWidth(),r.slideHeight());n.appendChild(p.displayObject());n.appendChild(m);r.tb=n;n=VH(a);p=r.slide();const v=YH(a.H.CE),y=NH.bind(void 0,b,c,d,e,m,n,r.slideWidth(),r.slideHeight(),a.b4.bind(a),l,p.index(),f,g,h,a.H.Gt().enabled(),v);void 0!==GH?y():(JH.addHandler(()=>{y()}),Ui(p.Xo()))} +function VH(a){const b=wd("div");a.context().Vq().appendChild(b);mn(b,"framesLayerContent");return b} +class ZH extends DH{constructor(a,b,c,d){super(70);this.$F=a;this.Fd=b;this.Qr=c;this.H=d}start(a){super.start(a);const b=a.slide()instanceof br,c=a.slide()instanceof sq;a=a.slide()instanceof Aq;b?OH(this.$F,this.Fd,this.d6.bind(this)):c?QH(this.$F,this.Fd,this.J5.bind(this)):a?RH(this.$F,this.Fd,this.l6.bind(this)):SH(this.$F,this.Fd,this.B6.bind(this));this.kY=Ui(this.Qr)}B6(a,b){a=ij&&fj&&navigator.connection&&navigator.connection.saveData?a.replace(/{this.Ur=gn(b.response());this.ge.C(this.Ur)});b.send(a,"GET",{})}};let iI=null,jI=0;function kI(a,b){if(sj)if(a=`@import "${b}";`,!iI||30<=jI)iI=gn(a).styleSheet,jI=1;else{var c=a;a=iI;b=void 0;if(void 0==b||0>b)b=fn(a).length;if(a.insertRule)a.insertRule(c,b);else if(c=/^([^\{]+)\{([^\{]+)\}/.exec(c),3==c.length)a.addRule(c[1],c[2],b);else throw Error("Your CSSRule appears to be ill-formatted.");++jI}else a.Rz=wd("link",{rel:"stylesheet",type:"text/css",href:b}),sd("head")[0].appendChild(a.Rz)} +class lI{constructor(){this.Rz=null;this.ge=new C}load(a){const b=Ib||Hb?dn:en,c=b().length;kI(this,a);const d=this,e=setInterval(()=>{try{if(null!=d.Rz&&null!=d.Rz.sheet||b().length!=c)clearInterval(e),d.ge.C(this.Rz)}catch(f){}},100)}};class mI extends DH{constructor(a){super(30);this.l3=a;this.Ur=null}get z$(){return this.Ur}start(a){super.start(a);a=Vi()||sj?new lI:new hI;a.ge.addHandler(b=>{this.Ur=b;this.Qh()},this);a.load(this.l3)}};class nI extends DH{constructor(){super();this.UD=this.TD=0;this.J9=1}weight(){return this.J9*this.TD}start(a){super.start(a);var b=a.tb;if(b){a={};b=b.querySelectorAll("span");for(var c=0;c=b.charCodeAt(c)){c=!0;break a}c=!1}SB(h,c?b.substr(0,1):"0",g,a)}this.Qj()}else this.Qh()}C5(){++this.UD;this.Qj()}B5(){++this.UD;this.Qj()}Qj(){this.UD==this.TD?this.Qh():this.it(this.UD/this.TD)}};class oI extends DH{constructor(){super();this.K9=1;this.Ou=0;this.Wz=[];this.HT={};this.kE=-1}weight(){return this.K9*this.Ou}start(a){super.start(a);if(a=a.tb){a=a.querySelectorAll("img");this.Ou=a.length;for(let b=0;b=a.xn.length)a.Qh();else{var b=a.context(),c=a.xn[a.By];pI(a,c);c.start(b)}}class vI extends rI{constructor(a){super(a)}start(a){super.start(a);uI(this)}Sv(a){super.Sv(a);uI(this)}};class wI{constructor(a){this.QJ=a}gj(){return this.QJ}};class xI{constructor(a,b){this.W3=a;this.bT=b}};const yI=Ii?[0,1,2,-1,3,4,-2,5]:[0,1,2,-1,3,4,-2,5,6,7,8,9,10]; +function zI(a,b){a.XE=b;const c=a.vG[b];c.Pa=1;const d=c.slide();var e=a.H2;const f=[],g=d.src();if(!g)throw Error("slide src can't be null");let h=null;g instanceof xI?(b=new ZH(a.F.vu(),b,e+g.W3,a.F.settings()),g.bT?(h=new mI(e+g.bT),f.push(new sI([h,b],20))):f.push(b)):(e=g.gj(),f.push(new EH(e)));"slide"==d.type()&&f.push(new tI);e=new CH(d,a.F.slideWidth(),a.F.slideHeight(),a.Qe);const l=new vI(f);z(a,l.gr(),n=>{Ue(a,l);var m=n.context();d.GU=!0;n=m.tb;const p=Hd(n);c.$q(p[1],p[0],m.jy);c instanceof +uH?(m=m.Oa(),c.qR(m)):c instanceof tH?(m=m.fb(),c.hR(m)):c instanceof nv&&(m=m.ob(),c.rR(m));d instanceof Am&&(n=a.sO.create(d,n,h?h.z$:null),AI(n.s7.ww,n.A8),n.DO&&n.VW());BI(a);a.gl.C(d)});z(a,l.CC(),()=>{Ue(a,l);BI(a);a.C8.C(d)});l.start(e)}function mF(a){kh(a.G4,100,a)}function BI(a){a.YU[a.XE]=!0;a.XE=void 0;mF(a)} +class CI extends wg{constructor(a,b){super();this.F=a;this.sO=b;this.H2="";a=a.slides();b=[];for(let d=0;d{d==b&&(c.Xc(),GI(a))})}function GI(a){var b=new DI(new CI(a.F,a.sO),a.F.settings().NI(),a.F.settings().ia()||{});b=new AF(a.F,a.o7,b);a.Yv.C(b)} +class HI extends wg{constructor(a,b,c){super();this.F=a;this.o7=b;this.sO=c;this.Yv=E(this)}Tq(){var a=this.F.settings().Hx(),b=a.DH(),c;if(c=b){a:{c=window.location.hostname;for(var d=0;dSr(b, +d),f=0>=Sr(c,b);if(0>Sr(c,d)){b=e&&f;break a}if(0>Sr(d,c)){b=e||f;break a}}b=c&&0>Sr(b,c)?!1:!(d&&0<=Sr(b,d))}b=!b}b?(a=EI(this,"PB_TIME_RESTRICTION","Sorry, the presentation's creator disabled viewing the presentation at the moment"),uj?new MG("time",a,!1):new GG(a,"time")):a.eN?FI(this,a.password()):GI(this)}}};function II(a){a=a.querySelectorAll("*");const b=[];for(const c of a)/^txt\w*/.test(c.id)&&b.push(c);return b}function JI(a,b){const c=new Map;II(a).forEach(d=>{var e=b.find(f=>!!f.selectorText.match(d.id));(e=e?e.style:null)&&c.set(d,e)});return c}function AI(a,b){a.forEach(c=>{rm(c).forEach(d=>{const e=b.querySelector("#"+d.id);Gh(e,0,0);let f=jm(d.Xa.left,d.Xa.top);f=hm(d.nk.clone(),hm(f,d.qj));on(e,f)})})};function KI(a,b){const c=[];a.xca.forEach((d,e)=>{b(d)&&c.push({element:e,O_:d})});return c}class LI{constructor(a,b,c){this.s7=a;this.A8=b;this.Ur=c;this.DO=null;if(c&&c.sheet)try{this.DO=JI(b,Array.from(c.sheet.cssRules))}catch(d){}}get styleSheet(){return this.Ur.sheet}get xca(){return this.DO}};function MI(a){return KI(a,b=>/text-decoration-line: underline/.test(b.cssText))} +class NI extends LI{VW(){for(const {element:e,O_:f}of MI(this)){var a=e,b={},c=f.cssText.match(/text-decoration-.*?(?=;)/g);if(c)for(const g of c){const [h,l]=g.split(": ");b[h]=l}a:{var d=b;c=["solid","dashed","dotted","double"];if(d.hasOwnProperty("text-decoration-style")&&(d=d["text-decoration-style"],-1!=c.indexOf(d))){c=d;break a}c="solid"}if((d=b["text-decoration-thickness"]||"")&&"double"==c){const g=2*parseFloat(d);isNaN(g)||(d=`${g}px`)}a.style.borderBottom=`${c} ${d} ${b["text-decoration-color"]|| +""}`}for(const {element:e}of this.YK())e.style.textDecoration="line-through"}YK(){return KI(this,a=>/text-decoration-line: underline line-through/.test(a.cssText))}};class OI extends LI{VW(){this.YK().forEach(({element:a,O_:b})=>{b.removeProperty("text-decoration-line");b.setProperty("text-decoration-line","underline");const c=b.getPropertyValue("text-decoration-thickness");b=b.getPropertyValue("color")||"black";this.styleSheet.insertRule(`#${a.id}::after { + position: absolute; + content: ''; + width: 100%; + height: 0; + border-top: ${c} solid ${b}; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; + }`)})}YK(){return KI(this,a=>/text-decoration-line: underline line-through/.test(a.cssText))}};class PI{create(a,b,c){return Ib?new NI(a,b,c):new OI(a,b,c)}};class QI extends wg{constructor(){super();this.uf=null;this.Rw="";this.rP="_blank";this.XL=E(this)}logo(){return this.uf}ue(){return this.Rw}xR(a){this.Rw=a}pD(){return this.rP}isEqual(a){if(a.ue()!==this.Rw||a.pD()!==this.rP)return!1;a=a.logo();return this.uf||a?!!this.uf&&!!a&&this.uf.path()===a.path():!0}}QI.prototype.webSiteTarget=QI.prototype.pD;QI.prototype.webSiteUrl=QI.prototype.ue;QI.prototype.logo=QI.prototype.logo;class RI{constructor(){this.Ps=this.Pl=this.Rw=this.uS=this.MU=this.Th="";this.XW=this.yb=null}name(){return this.Th}Pt(){return this.MU}Oq(){return this.uS}ue(){return this.Rw}xR(a){this.Rw=a}email(){return this.Pl}phone(){return this.Ps}Td(){return this.yb}gu(a){this.yb=a}Vt(){return this.XW}}RI.prototype.photo=RI.prototype.Vt;RI.prototype.company=RI.prototype.Td;RI.prototype.phone=RI.prototype.phone;RI.prototype.email=RI.prototype.email;RI.prototype.webSiteUrl=RI.prototype.ue; +RI.prototype.biography=RI.prototype.Oq;RI.prototype.jobTitle=RI.prototype.Pt;RI.prototype.name=RI.prototype.name;class SI extends wg{constructor(){super();this.wv=this.xv=!1;this.le=0;this.Tz=E(this);this.Vz=E(this);this.WU=E(this)}mf(){return this.xv}progress(){return this.le}load(){this.xv||this.wv||(this.wv=!0,this.Rh())}Rh(){}GZ(){}Hca(){if(this.xv||this.wv)this.GZ(),this.wv=this.xv=!1,this.it(0)}it(a){this.le!=a&&(this.le=a,this.WU.C(this))}gr(){return this.Tz}CC(){return this.Vz}Iaa(){return this.WU}}SI.prototype.loadProgressEvent=SI.prototype.Iaa;SI.prototype.loadFailedEvent=SI.prototype.CC; +SI.prototype.loadCompleteEvent=SI.prototype.gr;SI.prototype.unload=SI.prototype.Hca;SI.prototype.load=SI.prototype.load;SI.prototype.progress=SI.prototype.progress;SI.prototype.isLoaded=SI.prototype.mf;function TI(a){a.Ig&&(a.Ig.onload=null,a.Ig.onerror=null)}function UI(a){if(!a.mf())throw Error("asset not loaded");} +class VI extends SI{constructor(a,b,c){var d,e,f;super();this.Ig=null;var g=a.startsWith("data:")?null:void 0;this.wA=g=a;this.Ua=b;this.Na=c}Rh(){this.Ig=new Image;this.Ig.onload=this.rF.bind(this);this.Ig.onerror=this.F5.bind(this);this.Ig.src=this.wA}rF(){TI(this);this.wv=!1;this.xv=!0;this.it(1);this.Tz.C(this)}F5(){TI(this);this.wv=this.xv=!1;this.Vz.C(this);this.it(0)}GZ(){this.Ig&&(TI(this),this.Ig.src="",this.Ig=null)}path(){return this.wA}width(){if(null!=this.Ua)return this.Ua;if(!this.Ig)return 0; +UI(this);return this.Ig.width}height(){if(null!=this.Na)return this.Na;if(!this.Ig)return 0;UI(this);return this.Ig.height}gC(){UI(this);const a=zd("canvas");a.width=this.width();a.height=this.height();a.getContext("2d").drawImage(this.Ig,0,0);return a}w$(){UI(this);return this.Ig.cloneNode(!0)}}VI.prototype.createImgInstance=VI.prototype.w$;VI.prototype.createInstance=VI.prototype.gC;VI.prototype.height=VI.prototype.height;VI.prototype.width=VI.prototype.width;VI.prototype.path=VI.prototype.path;class WI extends VI{url(){return this.wA}}WI.prototype.url=WI.prototype.url;function XI(a,b){const c=a.Sa.actions,d=new rg(YI(a,b));b[c.lu].forEach(e=>{d.uY.push(new qg(e[c.lu.key],w(e,c.lu.zH,!1),w(e,c.lu.shift,!1)))});return d} +function YI(a,b){a=a.Sa.actions.name;switch(b[a]){case a.tba+"":return"playPause";case a.bI+"":return"nextSlide";case a.Cba+"":return"previousSlide";case a.aba+"":return"nextStep";case a.Dba+"":return"previousStep";case a.bca+"":return"seekForward";case a.aca+"":return"seekBackward";case a.Y$+"":return"firstSlide";case a.Eaa+"":return"lastSlide";case a.tQ+"":return"lastViewedSlide";case a.mca+"":return"slideStart";case a.jca+"":return"slideEnd";case a.Qca+"":return"volumeUp";case a.Pca+"":return"volumeDown"; +case a.Bca+"":return"toggleFullscreen"}throw Error("unknown action type");}class ZI{constructor(a){this.Sa=a}vQ(a,b){a.ra(w(b,this.Sa.enabled,!1));const c=a.actions();c.lc.length=0;a.enabled()&&b[this.Sa.actions].forEach(d=>{c.uh(XI(this,d))})}};function $I(a){this.Ea=a}t($I,El);$I.prototype.Ea=0;$I.prototype.duration=function(){return this.Ea};$I.prototype.se=function(){};$I.prototype.gk=function(){};function aJ(a){this.lc=a||[]}t(aJ,Fl);k=aJ.prototype;k.oM=null;k.Ea=-1;k.uh=function(a){if(0<=this.Ea)throw Error("ParallelActions was already initialized");this.lc.push(a)};k.EJ=function(){let a=0;for(let b=0;bthis.Ea&&(this.Ea=this.EJ());return this.Ea}; +function bJ(a){if(a.oM)return a.oM;const b=[],c=a.duration(),d=a.lc.length;for(let e=0;e=this.jK.duration()?a.complete(this.jK,c,d):a.se(this.jK,b,c,d)}};k.Eh=function(a,b,c){a.complete(this.NU,b,c)};function hJ(a){this.Hl=a}t(hJ,Fl);k=hJ.prototype;k.duration=function(){return Gl(this.Hl)};k.se=function(a,b,c){a=this.Mi(a);this.uc(Ml(),a,b,c)};k.complete=function(a,b){this.Eh(Ml(),a,b)};k.gk=function(a,b,c){a=this.Mi(a,!0);this.uc(Jl(),a,b,c)};k.NC=function(a,b){this.Eh(Jl(),a,b)};k.uc=function(a,b,c,d){if(b==this.duration())this.Eh(a,c,d);else{if(!(this.Hl instanceof El))throw Error("can't run not prolonged action");a.se(this.Hl,b,c,d)}};k.Eh=function(a,b,c){a.complete(this.Hl,b,c)};function iJ(a){this.rb=a;this.vZ=[];let b=0;for(let c=0;cthis.Ea)return!1;if(0==a&&b>=this.Ea)return!0;const c=this.rb.length;for(let d=0;dthis.Ea)return!1;if(0==a&&b>=this.Ea)return!0;const c=this.Vs,d=this.Hl.duration();var e=Math.floor(a/(d+c));const f=Math.floor(b/(d+c));if(1=g&&this.Hl.wC(Math.max(a-g,0),b-g))return!0}return!1};jJ.prototype.MR=function(){return[this.Ea]};function kJ(a,b,c,d){this.Uh="__mediaTransforms";this.Hb=a;this.GF=b;this.QN=c;this.Ph=d}kJ.prototype.Hm=function(){return this.GF};kJ.prototype.se=function(a,b){a.yd.add(new Sp(this.Uh,this.Hb,new Vp(this.GF,this.Ph,b)))};function lJ(){}k=lJ.prototype;k.Sa=null;k.FB=0;k.Gg=0;k.sZ=0;k.initialize=function(a,b,c,d){this.Sa=a;this.FB=b;this.Gg=c;this.sZ=d}; +k.load=function(a){const b=this.Sa;var c=this.Sa;if(a[c.lk]||a[c.Bi]){c=this.Sa;const e=a[c.lk]||a[c.Bi];a:{var d=this.Sa;switch(a[d.Hm]){case d.Hm.play+"":d=zp;break a;case d.Hm.pause+"":d=Ap;break a;case d.Hm.stop+"":d=Bp;break a}throw Error("unknown media operation");}c=new yp(e,d,c.xi in a?a[c.xi]:null)}else c=new Cp;return new kJ(b.Bi in a?"video":"sound",c,a[b.timing][b.timing.start]*this.FB+this.Gg,this.sZ)};function mJ(){}k=mJ.prototype;k.Sa=null;k.MO=0;k.py=null;k.Ph=0;k.initialize=function(a,b,c,d){this.Sa=a;this.MO=c;this.py=b;this.Ph=d};k.ta=function(){if(!this.Sa)throw Error("BehaviorLoader isn't initialized");return this.Sa};function nJ(a){if(!a.py)throw Error("BehaviorLoader isn't initialized");return a.py}function oJ(a){if(!a.py)throw Error("BehaviorLoader isn't initialized");return a.py.id()}k.level=function(){return this.Ph}; +k.load=function(a){const b=this.XU(a);let c=this.Rh(a,b);c=this.jJ(c,a,b);b.ui()&&(a=ma(c)+"_rewind",c=new Nl([new eJ(oJ(this),a),c,new fJ(oJ(this),a)]));return 0=a.Ea?1:b/a.Ea}qJ.prototype.se=function(a,b,c){const d=this.Mi(a);this.uc(d>=this.Ea?1:d/this.Ea,b,c,!1,a==this.Ea)};qJ.prototype.gk=function(a,b,c){const d=this.Mi(a,!0);this.uc(1-(d>=this.Ea?1:d/this.Ea),b,c,!0,a==this.Ea)};function sJ(a,b,c,d){b.yd.add(new Sp(a.Uh,c,d))} +function tJ(a,b,c,d){const e=ma(a),f=b.fv.get(e);f?d=f.value:(a=b.y7.get(a.Uh),d=d(a),b.fv.set(e,{value:d,Iha:tk(c)}));return d};function uJ(a,b,c){qJ.call(this,a,b);this.C3=c}t(uJ,qJ);uJ.prototype.uc=function(a,b,c,d,e){if(d=tJ(this,b,c,f=>(f=vl(f))?"font-size"in f.Zh?f.Zh["font-size"]:"":""))a=Yk("font-size",(this.C3-d)*a+d,c,e),sJ(this,b,"cssTextProperties",a)};function vJ(){}t(vJ,mJ);vJ.prototype.XU=function(a){const b=this.ta().timing;return new wJ(this.MO,a[b],b)};function xJ(a){return eval("("+a+")")}vJ.prototype.jJ=function(a,b,c){if(0f&&(e-=360)}return[(e-f)*c+f,(b[1]-a[1])*c+a[1],(b[2]-a[2])*c+a[2]]};function BJ(a,b,c,d){this.fe=a;this.O8=b;this.FK=c;this.jq=d}BJ.prototype.getTransform=function(a,b,c,d,e,f){return new Wk(new Tk(this.fe,AJ(this.O8,this.FK,b,this.fe)),this.jq,!0,d,f)};function CJ(a,b,c,d){this.Hb=a;this.fe=b;this.FK=c;this.jq=d}CJ.prototype.getTransform=function(a,b,c,d,e,f){const g=this.Hb;a=tJ(a,c,d,h=>{let l=null;switch(g){case "textColor":l=kl(h,"textColor");break;case "strokeColor":l=kl(h,"strokeColor");break;case "fillColor":l=kl(h,"fillColor");break;case "imgColor":l=kl(h,"imgColor")}return l?l.color():null});if(!a)return null;a=a.Sc(this.fe);return new Wk(new Tk(this.fe,AJ(a,this.FK,b,this.fe)),this.jq,!0,d,f)};function DJ(a,b,c,d){qJ.call(this,a,b);this.Hb=c;this.Ek=d}t(DJ,qJ);DJ.prototype.uc=function(a,b,c,d,e){(a=this.Ek.getTransform(this,a,b,c,d,e))&&sJ(this,b,this.Hb,a)};function EJ(){}t(EJ,vJ); +EJ.prototype.Rh=function(a,b){var c=this.ta();c=FJ(this,a[c.target]);const d=[];for(let p=0;pa||1=this.Sn&&(b=this.rX,c=this.sX);let d=null;for(;ba){d=e.lI((a-c)/(f-c));break}c=f}this.Sn=a;this.rX=b;this.sX=c;return d?d:this.end()};function OJ(a){this.Ea=a}OJ.prototype.duration=function(){return this.Ea};function KJ(a){this.Ea=0;this.gq=a}t(KJ,OJ);KJ.prototype.end=function(){return this.gq}; +function LJ(a,b,c){this.Ea=a;this.nE=b;this.TG=c}t(LJ,OJ);LJ.prototype.end=function(){return this.TG};LJ.prototype.lI=function(a){const b=this.nE,c=this.TG;return new Xc((c.x-b.x)*a+b.x,(c.y-b.y)*a+b.y)};function NJ(a,b,c,d,e){this.Ea=a;this.DK=e;this.L2=new Un(b.x,b.y,c.x,c.y,d.x,d.y,e.x,e.y)}t(NJ,OJ);NJ.prototype.end=function(){return this.DK}; +NJ.prototype.lI=function(a){var b=this.L2;if(0==a)var c=b.qD;else if(1==a)c=b.rD;else{c=Wc(b.qD,b.x1,a);var d=Wc(b.x1,b.x2,a),e=Wc(b.x2,b.rD,a);c=Wc(c,d,a);d=Wc(d,e,a);c=Wc(c,d,a)}0==a?a=b.sD:1==a?a=b.tD:(d=Wc(b.sD,b.y1,a),e=Wc(b.y1,b.y2,a),b=Wc(b.y2,b.tD,a),d=Wc(d,e,a),e=Wc(e,b,a),a=Wc(d,e,a));return new Xc(c,a)};function PJ(a,b,c){qJ.call(this,a,b);this.wA=c}t(PJ,qJ);PJ.prototype.uc=function(a,b,c,d,e){a=this.wA.lI(a);sJ(this,b,"moveX",new bl(a.x,!0,c,e));sJ(this,b,"moveY",new bl(a.y,!0,c,e))};function QJ(){}t(QJ,vJ);QJ.prototype.Rh=function(a,b){const c=this.ta();return new PJ(oJ(this),b.duration(),RJ(this,a[c.path]))}; +function RJ(a,b){function c(){return new Xc(d()+f,d()+g)}function d(){const h=b.match(/^\s*([-0-9\.]+)/);if(h)return b=b.substr(h[0].length),parseFloat(h[1]);throw Error("incorrect path");}function e(){const h=b.match(/^\s*([m|l|c])/i);return h?(b=b.substr(h[0].length),h[1].toLowerCase()):null}a=nJ(a);const f=a.Xa().left,g=a.Xa().top;b=b.replace(/,/g," ");for(a=new JJ;;){const h=e();if(!h)break;switch(h){case "m":a.moveTo(c());break;case "l":a.lineTo(d(),c());break;case "c":MJ(a,d(),c(),c(),c())}}return a} +;function SJ(a,b){this.Us=a;this.ON=b}SJ.prototype.getTransform=function(a,b,c,d,e,f){b=this.Xg(b,d,f);this.Us&&e&&this.ON&&(a=this.Xg(rJ(a),d,f),b=b.add(a.Tt()));return b};function TJ(a,b,c){SJ.call(this,b,c);this.n7=a}t(TJ,SJ);TJ.prototype.Xg=function(a,b,c){return new bl(this.n7(a),!this.Us,b,c)};function UJ(a,b){SJ.call(this,!0,b);this.n3=a}t(UJ,SJ);UJ.prototype.Xg=function(a,b,c){return new bl(this.n3*a,!1,b,c)};function VJ(a,b,c,d){SJ.call(this,c,d);this.nE=a;this.TG=b}t(VJ,SJ);VJ.prototype.Xg=function(a,b,c){return new bl((this.TG-this.nE)*a+this.nE,!this.Us,b,c)};function WJ(a,b){this.D3=a;this.Hb=b}WJ.prototype.getTransform=function(a,b,c,d,e,f){const g=this.Hb;a=tJ(a,c,d,h=>"moveX"==g?nl(h).sc:ol(h).sc);return null===a?null:new bl((this.D3-a)*b+a,!0,d,f)};function XJ(a,b,c,d){qJ.call(this,a,b);this.Hb=c;this.Ek=d}t(XJ,qJ);XJ.prototype.uc=function(a,b,c,d,e){(a=this.Ek.getTransform(this,a,b,c,d,e))&&sJ(this,b,this.Hb,a)};function YJ(a){this.Hb=a}t(YJ,vJ);YJ.prototype.Rh=function(a,b){const c=this.ta();if(c.Fo in a){var d=oJ(this),e=b.duration();b=!b.ui();a=new XJ(d,e,this.Hb,new UJ(a[c.Fo],b))}else if(c.GH in a){d=oJ(this);e=b.duration();var f=xJ(a[c.GH]);b=!b.ui();a=new XJ(d,e,this.Hb,new TJ(f,w(a,c.rI,!1),b))}else c.from in a?(d=oJ(this),e=b.duration(),b=!b.ui(),a=new XJ(d,e,this.Hb,new VJ(a[c.from],a[c.Bh],w(a,c.rI,!1),b))):(d=oJ(this),b=b.duration(),e=this.Hb,a=new XJ(d,b,e,new WJ(a[c.Bh],e)));return a}; +function ZJ(){this.Hb="moveX"}t(ZJ,YJ);function $J(){this.Hb="moveY"}t($J,YJ);function aK(a,b,c){this.ZY=a;this.EK=b;this.Ph=c}aK.prototype.getTransform=function(a,b,c,d,e,f){return new ip((this.EK-this.ZY)*b+this.ZY,this.Ph,d,f)};function bK(a,b){this.EK=a;this.Ph=b}bK.prototype.getTransform=function(a,b,c,d,e,f){a=tJ(a,c,d,g=>(g=kl(g,"filter"))&&g instanceof ip?g.alpha():1);return null===a?null:new ip((this.EK-a)*b+a,this.Ph,d,f)};function cK(a,b,c){qJ.call(this,a,b);this.Ek=c}t(cK,qJ);cK.prototype.uc=function(a,b,c,d,e){(a=this.Ek.getTransform(this,a,b,c,d,e))&&sJ(this,b,"filter",a)};function dK(){}t(dK,vJ);dK.prototype.Rh=function(a,b){const c=this.ta();if(c.Fo in a)throw oJ(this),b.duration(),this.level(),Error("not implemented");if(c.from in a){var d=oJ(this);b=b.duration();var e=this.level();a=new cK(d,b,new aK(a[c.from],a[c.Bh],e))}else d=oJ(this),b=b.duration(),e=this.level(),a=new cK(d,b,new bK(a[c.Bh],e));return a};function eK(a,b){this.Mf=a;this.PN=b}eK.prototype.Xg=function(a,b,c){return new cl(this.Mf*a,!1,b,c)};eK.prototype.getTransform=function(a,b,c,d,e,f){b=this.Xg(b,d,f);e&&this.PN&&(a=this.Xg(rJ(a),d,f),b=b.add(a.Tt()));return b};function fK(a,b){this.PT=a;this.c9=b}fK.prototype.getTransform=function(a,b,c,d,e,f){return new cl((this.c9-this.PT)*b+this.PT,!0,d,f)};function gK(a){this.Mf=a}gK.prototype.getTransform=function(a,b,c,d,e,f){a=tJ(a,c,d,g=>ll(g).angle()+ml(g).angle());return null===a?null:new cl((this.Mf-a)*b+a,!0,d,f)};function hK(a,b,c,d){qJ.call(this,a,b);this.Hb=c;this.Ek=d}t(hK,qJ);hK.prototype.uc=function(a,b,c,d,e){(a=this.Ek.getTransform(this,a,b,c,d,e))&&sJ(this,b,this.Hb,a)};function iK(){}t(iK,vJ);iK.prototype.Rh=function(a,b){const c=this.ta();if(c.Fo in a){var d=oJ(this),e=b.duration();b=!b.ui();a=new hK(d,e,"rotateBy",new eK(a[c.Fo]*Math.PI/180,b))}else c.from in a?(d=oJ(this),b=b.duration(),a=new hK(d,b,"rotateTo",new fK(a[c.from]*Math.PI/180,a[c.Bh]*Math.PI/180))):(d=oJ(this),b=b.duration(),a=new hK(d,b,"rotateTo",new gK(a[c.Bh]*Math.PI/180)));return a};function jK(a,b){this.Us=a;this.ON=b}jK.prototype.getTransform=function(a,b,c,d,e,f){b=this.Xg(b,d,f);this.Us&&e&&this.ON&&(a=this.Xg(rJ(a),d,f),b=b.add(a.Tt()));return b};function kK(a,b,c){jK.call(this,b,c);this.U7=a}t(kK,jK);kK.prototype.Xg=function(a,b,c){return new dl(this.U7(a),!this.Us,b,c)};function lK(a,b){jK.call(this,!0,b);this.qa=a}t(lK,jK);lK.prototype.Xg=function(a,b,c){return new dl((this.qa-1)*a+1,!1,b,c)};function mK(a,b,c,d){jK.call(this,c,d);this.rS=a;this.GK=b}t(mK,jK);mK.prototype.Xg=function(a,b,c){return new dl((this.GK-this.rS)*a+this.rS,!this.Us,b,c)};function nK(a,b){this.GK=a;this.Hb=b}nK.prototype.getTransform=function(a,b,c,d,e,f){const g=this.Hb;a=tJ(a,c,d,h=>{switch(g){case "scaleX":return pl(h).scale();case "scaleX2":return ql(h).scale();case "scaleY":return rl(h).scale();case "scaleY2":return sl(h).scale()}return null});return null===a?null:new dl((this.GK-a)*b+a,!0,d,f)};function oK(a,b,c,d){qJ.call(this,a,b);this.Hb=c;this.Ek=d}t(oK,qJ);oK.prototype.uc=function(a,b,c,d,e){(a=this.Ek.getTransform(this,a,b,c,d,e))&&sJ(this,b,this.Hb,a)};function pK(a){this.Hb=a}t(pK,vJ);pK.prototype.Rh=function(a,b){const c=this.ta();if(c.Fo in a){var d=oJ(this),e=b.duration();b=!b.ui();a=new oK(d,e,this.Hb,new lK(a[c.Fo],b))}else if(c.GH in a){d=oJ(this);e=b.duration();var f=xJ(a[c.GH]);b=!b.ui();a=new oK(d,e,this.Hb,new kK(f,w(a,c.rI,!1),b))}else c.from in a?(d=oJ(this),e=b.duration(),b=!b.ui(),a=new oK(d,e,this.Hb,new mK(a[c.from],a[c.Bh],w(a,c.rI,!1),b))):(d=oJ(this),b=b.duration(),e=this.Hb,a=new oK(d,b,e,new nK(a[c.Bh],e)));return a}; +function qK(){this.Hb="scaleX"}t(qK,pK);function rK(){this.Hb="scaleY"}t(rK,pK);function sK(){this.Hb="scaleX2"}t(sK,pK);function tK(){this.Hb="scaleY2"}t(tK,pK);function uK(a,b,c,d){this.Uh=a;this.z7=b;this.A7=c;this.Hb=d?"cssTextProperties":"cssProperties"}t(uK,Al);uK.prototype.se=function(a,b){b=Yk(this.z7,this.A7,b,!0);a.yd.add(new Sp(this.Uh,this.Hb,b))};uK.prototype.gk=function(){};function vK(){}t(vK,mJ);vK.prototype.Rh=function(a){const b=this.ta(),c=a[b.Gba],d=a[b.zaa];if(d){var e=nJ(this);Pa(e.mJ,c)||e.mJ.push(c)}else e=nJ(this),Pa(e.lJ,c)||e.lJ.push(c);return new uK(oJ(this),c,a[b.Bh],d)};function wK(a,b){this.$Y=a;this.HK=b}wK.prototype.getTransform=function(a,b,c,d,e,f){return new el((this.HK-this.$Y)*b+this.$Y,d,f)};function xK(a){this.HK=a}xK.prototype.getTransform=function(a,b,c,d,e,f){a=tJ(a,c,d,g=>ul(g).shift());return null===a?null:new el((this.HK-a)*b+a,d,f)};function yK(a,b,c){qJ.call(this,a,b);this.Ek=c}t(yK,qJ);yK.prototype.uc=function(a,b,c,d,e){(a=this.Ek.getTransform(this,a,b,c,d,e))&&sJ(this,b,"shiftX",a)};function zK(){}t(zK,vJ);zK.prototype.Rh=function(a,b){const c=this.ta();if(c.from in a){var d=oJ(this);b=b.duration();a=new yK(d,b,new wK(a[c.from],a[c.Bh]))}else d=oJ(this),b=b.duration(),a=new yK(d,b,new xK(a[c.Bh]));return a};function AK(a,b){this.Uh=a;this.Qa=b}t(AK,Al);AK.prototype.se=function(a,b){this.uc(this.Qa,a,b)};AK.prototype.gk=function(a,b){this.uc(!this.Qa,a,b)};AK.prototype.uc=function(a,b,c){b.yd.add(new Sp(this.Uh,"visibility",new il(a,c)))};function BK(){}t(BK,mJ);BK.prototype.Rh=function(a){const b=this.ta();return new AK(oJ(this),a[b.Bh])};function CK(a){this.Qg=a;this.ml=1;this.P8=0} +CK.prototype.load=function(a,b){var c=this.ta();c.BP in b&&DK(this,a,b[c.BP]);var d=this.ta(),e=null;d.xQ in b&&d.yi in b[d.xQ]&&(e=b[d.xQ]);var f=e?e[d.yi].length:0,g=a.nb().count(),h=!1;if(g==f+1)f=a.yv,g=a.nb().pc(0),f.vh(Tl(this.Qg,"__step",!0)),Vl(f,new $I(1E3*g.duration())),h=!0;else if(g!==f)throw Error("count of slide animation steps must be equal to steps in mainSequence");e&&EK(this,a,a.Au,a.yv,0,e[d.yi],new FK(a,this,h));if(c.qQ in b)for(b=b[c.qQ],c=0;cp?p/(D+.001):1;D>m.P8&&(m.ml=p);m=p;p=new aJ;v=!1;n=n[h.Rj];for(r=0;r{const v=new tm(p[m.type],e(p[m.ym]),r),y=m.item;p[m.Nc]&&(v.Nc=f(p[m.Nc],y),v.B_= +p[m.Nc][m.naa]);u(p[m.Dl],D=>{D=f(D,y);v.Dl.push(D)});u(p[m.Qq]||[],D=>{D=new l(D[m.type],D[m.text],D[m.mj]);v.Qq.push(D)});v.text=p[m.text];v.fr=p[m.fr]||0;v.rotation=p[m.rotation]/180*Math.PI;v.ul=p[m.ul];v.Fl=p[m.Fl];v.mj=p[m.mj];r=v.kx;r.line=p[m.line];r.fill=p[m.fill];r.Nt=p[m.Nt];r.Zt=p[m.Zt];r.ku=p[m.ku];r.pu=p[m.pu];r.qu=p[m.qu];sm(v);p[m.ne]&&(v.ne=g(p[m.ne],m.ne));b.ww.push(v)},a)}} +function WK(a,b,c){function d(f){switch(f[e.action.type]){case e.action.type.bba+"":return new KK;case e.action.type.pe+"":return new es(f[e.action.L])}throw Error("unknown branching action");}const e=a.ta().slides.fj;e.Oo in c&&Pf(b,d(c[e.Oo]));e.Gx in c&&Qf(b,d(c[e.Gx]))}function XK(a,b,c){function d(f){return new $r(f[e.link.url],f[e.link.target])}const e=a.ta().settings.xu;Yr(b,e.HI in c?d(c[e.HI]):null);Zr(b,e.mI in c?d(c[e.mI]):null)} +function YK(a,b,c){function d(e){return e?new Pr(new Date(1E3*e)):null}a=a.ta().settings.Hx;a.password in c&&(b.eN=c[a.password]);if(a.Xx in c){const e=c[a.Xx];Vr(b,new Tr(d(e[a.Xx.I$]),d(e[a.Xx.J$])))}a.DH in c&&(b.mT=c[a.DH])}function RK(a,b){if(!a)return 1;if("number"===typeof a)return a;switch(a){case b.repeat.E1+"":return"untilNextClick";case b.repeat.F1+"":return"untilNextSlide";case b.repeat.G1+"":return"untilNextSound"}return 1} +function SK(a,b,c){if(c.Sj in b){b=b[c.Sj];for(let e=0;e{d.push(a.xO.Du[e]||null)});return new pf(d,c)} +function QK(a,b,c){const d=a.ta();if(d.nd in c){const e=b.nd();c=c[d.nd];if(d.nd.xm in c){const f=b.xO,g=e.xm();ZK(a,c[d.nd.xm],(h,l,n,m)=>{g.q_(new rr(f.Du[h]||null,n,m,l))})}if(d.nd.Lf in c){const f=b.b_,g=e.Lf();ZK(a,c[d.nd.Lf],(h,l,n,m)=>{g.s_(new ur(f.Du[h]||null,n,m,l))})}}}function ZK(a,b,c){const d=a.ta().nd.track;for(let f=0;fn;++n)l.push(m),m+=1<<(n>>1);for(n=0;3>n;++n)d.push(n+16);for(n=0;7>=n;++n)d.push((8-n)%8),d.push(8+n);for(n=1;3>n;++n)e.push(n);for(n=0;28>n;++n){var p=n>>1<<16;m=n%8;p+=(l[m]<< +(n-m)/2)+1;e.push(p)}for(n=3;7>n;++n)f.push(n);m=7;for(n=0;24>n;++n)l=n>>2,p=(l<<16)+m,m+=1<n;++n)f.push(258)})();c.prototype.UP=function(l){var n=this.uH,m=n?n.length:0;if(l>l; +this.eC=n-l;this.Ww=r;return m&(1<>16;m&=65535;(0==l||l>n;this.eC=l-n;this.Ww=v;return m};c.prototype.oC=function(l){for(var n=l.length,m=0,p=0;pm&&(m=l[p]);for(var r=1<>=1;for(p=J;p< +r;p+=I)v[p]=y<<16|A;++D}return[v,m]};c.prototype.Mba=function(){function l(J,T,U,X,aa){for(J=J.Wq(U)+X;0>=1;if(0==n){var m=this.GP,p=this.Ww,r;b(r=m[p++])&&a();var v=r;b(r=m[p++])&&a();v|=r<<8;b(r=m[p++])&&a();n=r;b(r=m[p++])&&a();(n|r<<8)!=(~v&65535)&&a();this.eC=this.dC=0;r=this.$B;n=this.UP(r+v);this.$B=v=r+v;for(var y=r;y=D;++D)m[D]=8; +for(;255>=D;++D)m[D]=9;for(;279>=D;++D)m[D]=7;for(;287>=D;++D)m[D]=8;g=this.oC(m);n=Array(31);for(D=0;32>D;++D)n[D]=5;h=this.oC(n);h[0][15]=0;h[0][31]=0}p=g;r=h}else if(2==n){n=this.Wq(5)+257;r=this.Wq(5)+1;p=this.Wq(4)+4;m=Array(d.length);for(D=0;DI)y+1>=v&&(n=this.UP(y+1),v=n.length),n[y++]=I;else{if(256==I){this.$B=y;break}I-=257;I=f[I];var A=I>>16;0>16;0=v&&(n=this.UP(y+m),v=n.length);for(A=0;Ae?(c[++h]=String.fromCharCode(e),++d):191e?(f=a[d+1],c[++h]=String.fromCharCode((e&31)<<6|f&63),d+=2):(f=a[d+1],g=a[d+2],c[++h]=String.fromCharCode((e&15)<<12|(f&63)<<6|g&63),d+=3):++d;b(c.join(""))};function cL(a,b,c,d){var e=(new LK(c)).load(b);b=parseInt(w(b,c.yba,"2007"),10);c=new PI;a.nX.C(e);e=new HI(e,b,c);Qe(a,e.Yv,f=>{f.view().wi().id=d;mn(f.view().displayObject(),d);a.Yv.C(f)});e.Tq()}function dL(a,b,c,d){bL(b,e=>{e=JSON.parse(e);if(!e)throw Error("invalid presentation json!");cL(a,e,c,d)})}class eL extends wg{constructor(){super();this.Yv=E(this);this.nX=E(this)}Tq(a,b,c){la(a)?cL(this,a,b,c):dL(this,a,b,c)}};function fL(){return Ej||gL()||void 0===window.orientation?window.innerWidth>window.innerHeight:!!(window.orientation%180)}function gL(){return 0<=window.location.search.indexOf("ispringpreview=1")};function hL(a,b){z(a,b.ZU,a.TL,a);z(a,b.HZ,a.UO,a);b=b.$C();z(a,b.tu(),a.TL,a);z(a,b.UI(),a.UO,a)}function iL(a,b){z(a,b.Xk,a.TL,a);z(a,b.Dk,a.UO,a)}class jL extends wg{constructor(a){super();this.dJ=a;a=Oi();this.Gb=a.hasOwnProperty("accessibility")&&"1"==a.accessibility&&this.wm()?"accessible":"normal";this.kP=!1;this.pX=E(this);this.aV=E(this);this.IZ=E(this)}mode(){return this.Gb}wm(){return this.dJ&&!Ii&&!gL()}TL(){this.kP=!0;this.aV.C()}UO(){this.kP=!1;this.IZ.C()}};function kL(a,b,c,d){if(a.wm()){const e=new P({Yb:"SECTION"});e.nf("region");e.fp(d.PB_ACCESSIBLE_ARIA_LABEL_SETTINGS);d=rd(document,c);c=e.displayObject();d.appendChild(c);c=new HC({G:"presentation-view-mode-switch-control",tabIndex:0});N(e,c);lL(c,a);mL(c,a);nL(c,b);return c}return null} +function lL(a,b){a.ka.addHandler(()=>{if(b.kP)Ga("view mode change is locked");else{const d="normal"==b.Gb?"accessible":"normal";a:switch(d){case "normal":var c=!0;break a;case "accessible":c=b.wm();break a;default:throw Error("unknown presentation view mode");}c&&(b.Gb=d,b.pX.C(d))}})}function mL(a,b){let c=!1;b.aV.addHandler(()=>{document.activeElement==a.displayObject()&&(c=!0);a.ra(!1)});b.IZ.addHandler(()=>{a.ra(!0);c&&(a.focus(),c=!1)})} +function nL(a,b){b.un.addHandler(()=>{a.focus()});b.gS.addHandler(c=>{"normal"==c&&a.focus()})};function oL(a,b){var c=Po(a).concat(b);a=c[0];b=c[1];var d=c[2];c=c[3];if(isNaN(a)||0>a||255b||255d||255c||1oL(b.color,b.opacity)).join(", ");return`linear-gradient(${this.Oy}deg, ${a})`}kc(a){return sL({ij:this.Oy,jj:this.kz.map(b=>({color:b,opacity:b.opacity*a}))})}Am(){return sL({ij:this.Oy,jj:this.kz.map(a=>({color:a.color,opacity:a.opacity}))})}};function uL(a){const b={};Object.keys(a).forEach(c=>{const d=a[c];"SOLID"===d.type?b[c]=qL({color:d.color,opacity:d.opacity}):"GRADIENT"===d.type&&(b[c]=sL({ij:d.degree,jj:d.gradient}))});return b}function vL(a){const b={};for(const [c,d]of Object.entries(a))b[c]=d.RI();return b};class wL{constructor(){var a=new fG;this.dba=new BG;this.uP=a;this.oQ=zG}};class xL{constructor({Ba:a,RQ:b,colors:c,Km:d}){this.F=a;this.pN=b;this.Nb=c;this.Xs=d;this.Qf=null;(a=this.Nb)&&(a.popupBorder=a.playerText.kc(.08))}wP(a){Fd(this.Qf);this.Qf=null;if("normal"==a){a=this.Xs.dba;const b={__slide_width__:`${this.F.slideWidth()}px`,__slide_height__:`${this.F.slideHeight()}px`,__player_view_id__:this.pN,__borderRadius__:`${this.F.settings().skin().borderRadius}px`};this.Qf=a.Uq(this.Nb&&vL(this.Nb),b)}else if("accessible"==a)this.hJ();else throw Error("unknown presentation view mode"); +}hJ(){this.Qf=this.Xs.uP.Uq()}};function Z(a,b){if(a.Pd.hasOwnProperty(b))a=a.Pd[b];else throw Error("unknown template id: "+b);a=Ad(Kc(a));return a instanceof DocumentFragment?a.firstChild:a}class yL{constructor(a){this.Pd=a}ST(a){return"{"+a+"}"}};class zL extends yL{};function AL(a){if(a.oa&&a.oa.visible()){a.oa.focus();var b=!0}else b=!1;b||(a.kh&&a.kh.isActive()?(a.kh.focus(),b=!0):b=!1);!b&&(a=a.vc.zd[a.B.ma()].content(),a=void 0!==a.firstElementChild?a.firstElementChild:Jd(a.firstChild))&&(a.setAttribute("tabindex",0),a.focus())}function BL(a,{N1:b,Jha:c=200}){if(a.TE()||a.Hz())b?setTimeout(()=>AL(a),c):AL(a)} +class CL extends wg{constructor({W:a,Pm:b}){super();this.B=a;this.vc=b;this.kh=this.oa=null}TE(){return-1!=this.B.ma()&&this.B.$()instanceof Am}Hz(){return-1!=this.B.ma()&&this.B.$()instanceof Aq}};function DL(a){if(0GL(a,b)).map(b=>b.audio())}function HL(a){return a.kh.Lf().Sc().filter(b=>GL(a,b)).map(b=>b.video())}function GL(a,b){return a.U()>=b.jc().L()&&a.U()<=b.jf().L()}function EL(a,b){return a.I.ha(b instanceof HTMLAudioElement?"PB_ACCESSIBLE_AUDIO_NARRATION_LABEL":"PB_ACCESSIBLE_VIDEO_NARRATION_LABEL")} +class IL extends P{constructor({nd:a,W:b,ia:c}){super({Yb:"SECTION",G:"ppt-accessible-narration"});this.kh=a;this.B=b;this.I=c;this.Cj=[];this.uV=new Map;z(this,this.B.Bc(),this.s9,this)}isActive(){return 0Fd(b));this.Cj.splice(0,this.Cj.length);[...FL(this),...HL(this)].forEach(b=>{var c=this.Cj,d=c.push,e;if(!(e=this.uV.get(b.id()))){e=hH(b.pi()||gH(b));e=Ad(Kc(e));const f=EL(this,e);it(e, +"label",f);e=this.uV.set(b.id(),e).get(b.id())}d.call(c,e)});this.Cj.forEach(b=>{!a.includes(b)&&b.readyState&&(b.currentTime=0)});this.Cj.forEach(b=>this.V(b));this.J(!!this.Cj.length);DL(this)}U(){return this.B.ma()}};class JL extends P{constructor({W:a,vba:b,ia:c}){super({Yb:"NAV",G:"simple-navigation-panel"});this.nf("navigation");this.fp(c.ha("PB_ACCESSIBLE_ARIA_LABEL_NAVIGATION_BUTTONS"));this.B=a;this.mN=b;this.I=c;this.XT=E(this);this.VT=E(this);const {k$:d,i$:e}=this.Pu();N(this,e);N(this,d);z(this,this.B.Bc(),()=>{setTimeout(()=>{var f=d.ra,g=!this.B.gf("switchToPreviousSlide"),h=-1!=this.B.Vg();f.call(d,g&&h);f=e.ra;g=!this.B.gf("switchToNextSlide");h=-1!=this.B.Ug();f.call(e,g&&h||this.B.ma()==this.B.Em()&& +this.mN.Fm())},200)})}Pu(){const a=this.Oe({caption:this.I.ha("PB_ACCESSIBLE_NAVIGATION_PREV_BUTTON"),G_:()=>this.XT.C()}),b=this.Oe({caption:this.I.ha("PB_ACCESSIBLE_NAVIGATION_NEXT_BUTTON"),G_:()=>this.VT.C()});return{k$:a,i$:b}}Oe({caption:a,G_:b}){const c=new HC({ga:O(this,"button")});c.la(a);z(this,c.ka,b,this);return c}};function KL(a){a.lb.C()}class LL extends wg{constructor(){super();this.Qa=!1;this.fO=this.Fb=!0;this.Cv=ML;this.lb=E(this);this.yc=E(this)}get visible(){return this.Qa}set visible(a){this.Qa!=a&&(this.Qa=a,this.yc.C())}get enabled(){return this.Fb}set enabled(a){this.Fb!=a&&(this.Fb=a,KL(this))}get rr(){return this.fO}set rr(a){this.fO!=a&&(this.fO=a,KL(this))}get mode(){return this.Cv}set mode(a){this.Cv!=a&&(this.Cv=a,KL(this))}}var ML="presentationTimeline";class NL extends wg{constructor(){super();this.kt=this.Pb=this.Qa=!1;this.wa=new LL;this.fo=this.io=this.lO=this.lt=this.cO=this.nO=this.kO=!1;this.ze=OL;this.mO=!1;this.lb=E(this);this.yc=E(this)}get visible(){return this.Qa}set visible(a){this.Qa!=a&&(this.Qa=a,this.yc.C())}get showOutline(){return this.Pb}set showOutline(a){this.Pb!=a&&(this.Pb=a,KL(this))}get Jf(){return this.kt}set Jf(a){this.kt!=a&&(this.kt=a,KL(this))}get zc(){return this.wa}get Rx(){return this.kO}set Rx(a){this.kO!=a&&(this.kO= +a,KL(this))}get sr(){return this.nO}set sr(a){this.nO!=a&&(this.nO=a,KL(this))}get Bl(){return this.cO}set Bl(a){this.cO!=a&&(this.cO=a,KL(this))}get Zd(){return this.lt}set Zd(a){this.lt!=a&&(this.lt=a,KL(this))}get ou(){return this.lO}set ou(a){this.lO!=a&&(this.lO=a,KL(this))}get Kf(){return this.io}set Kf(a){this.io!=a&&(this.io=a,KL(this))}get qf(){return this.fo}set qf(a){this.fo!=a&&(this.fo=a,KL(this))}get Tg(){return this.ze}set Tg(a){this.ze!=a&&(this.ze=a,KL(this))}get jp(){return this.mO}set jp(a){this.mO!= +a&&(this.mO=a,KL(this))}}var OL="bySlides";function PL(a){return("presentationNavigationType"!=a.$o()||"presentationSeeking"==a.AQ())&&"quizNavigationSettings"!=a.$o()&&"scenarioNavigationSettings"!=a.$o()} +class QL extends wg{constructor(a,b){super();this.B=a;this.ze=b}Cc(){return this.B.Z().Cc()}isNextAvailable(){const a=this.B.gf(this.ze==OL?"switchToNextSlide":"switchToNextStep");return!(a&&PL(a))}isPrevAvailable(){const a=this.B.gf(this.ze?"switchToPreviousSlide":"switchToPreviousStep");return!(a&&PL(a))}prev(){this.ze==OL?this.B.ni():"bySteps"==this.ze&&this.B.Ot()}next(){this.ze==OL?this.B.lf():"bySteps"==this.ze&&this.B.Lo()}};class RL extends wg{constructor(a,b,c){super();this.B=a;this.lg=b;this.SE=c;z(this,this.lg.Cc(),()=>{this.B.invalidate()})}isNextAvailable(){return this.SE?this.lg.isNextAvailable():this.B.isNextAvailable()||this.lg.isNextAvailable()}isPrevAvailable(){return this.SE?this.lg.isPrevAvailable():this.B.isPrevAvailable()||this.lg.isPrevAvailable()}prev(){this.SE?this.lg.prev():this.B.isPrevAvailable()?this.B.prev():this.lg.prev()}next(){this.SE?this.lg.next():this.B.isNextAvailable()?this.B.next():this.lg.next()}} +;function SL(a,b,c){const d=a.od().type();var e=b.settings().navigation().navigationType();c=c.$();if(e=TL(d,e,c)){c={};b=b.slides();a=a.od().Jd();if(a=null!=a?`${b.ja(a).Ci()+1}`:"")b=c,"precedingQuizFailed precedingQuizNotPassed precedingQuizNotCompleted precedingScenarioNotPassed precedingScenarioFailed precedingScenarioNotCompleted".split(" ").includes(d)&&(b.SLIDE_INDEX=a);return{yg:e,z0:c}}return null} +function TL(a,b,c){switch(a){case "currentSlideIsNotCompleted":return"PB_CURRENT_SLIDE_IS_NOT_COMPLETED";case "backwardNavigationIsRestricted":case "forwardNavigationIsRestricted":return"sequential"==b?"PB_NAVIGATION_IS_SEQUENTIAL":"PB_NAVIGATION_IS_RESTRICTED";case "interactionNotCompleted":return c instanceof Aq?"PB_SCENARIO_SLIDE_WINDOW_TEXT":c instanceof sq?"PB_INTERACTION_SLIDE_WINDOW_TEXT":"PB_QUIZ_SLIDE_WINDOW_TEXT";case "precedingQuizFailed":return"PB_PRECEDING_QUIZ_FAILED_WINDOW_TEXT";case "precedingQuizNotPassed":return"PB_PRECEDING_QUIZ_NOT_PASSED_WINDOW_TEXT"; +case "precedingQuizNotCompleted":return"PB_PRECEDING_QUIZ_NOT_COMPLETED_WINDOW_TEXT";case "precedingScenarioNotPassed":return"PB_PRECEDING_SCENARIO_NOT_PASSED_WINDOW_TEXT";case "precedingScenarioFailed":return"PB_PRECEDING_SCENARIO_FAILED_WINDOW_TEXT";case "precedingScenarioNotCompleted":return"PB_PRECEDING_SCENARIO_NOT_COMPLETED_WINDOW_TEXT";default:return""}};function UL(a){const b=a.B;z(a,a.D.Tx(),a.Mn,a);z(a,a.R.Xd().Dx(),a.Ln,a);z(a,b.Bc(),a.ke,a);z(a,b.sJ,a.I2,a);z(a,b.Dr,a.kJ,a);Qe(a,a.D.vx(),a.I5,a);z(a,a.dA.XT,()=>{VL(a,a.B.ni.bind(a.B,!1))});z(a,a.dA.VT,()=>{VL(a,a.B.lf.bind(a.B,!1))})}function VL(a,b){const c=WL(a);c&&a.pf("busy","true");b();c&&setTimeout(()=>a.pf("busy","false"),200)}function WL(a){return a.BG?"slide"==a.BG.B$&&"slide"==a.BG.$aa:!1} +class XL extends P{constructor({G:a,ic:b,messages:c,skinSettings:d}){super({G:a});this.D=b;this.Wa=d;this.I=new EG(c);this.F=b.Ba();this.R=b.view();this.B=this.R.W();this.tc=this.R.Xd();this.Ca=this.B.Z();this.Wm=this.R.Wm;this.lg=B(this,new QL(this.tc,OL));this.ez=B(this,new CL({W:this.B,Pm:this.R.Pm()}));this.dA=new JL({W:this.tc,vba:this.F.settings().Pc(),ia:this.I});a=this.F.nd();this.kh=a.xm().count()||a.Lf().count()?new IL({nd:a,W:this.B,ia:this.I}):null;a=new P({Yb:"SECTION",G:"ppt-accessible-footer"}); +a.nf("region");a.fp(this.I.ha("PB_ACCESSIBLE_ARIA_LABEL_BOTTOM_PANEL"));this.xj=a;this.BG=null;bv(this.Wm,this.displayObject());UL(this);this.Zb(this.F.slideWidth());-1==this.B.ma()&&this.J(!1);x(this,window,"resize",this.PZ,this);this.PZ()}Mn(a){var b=a.action(),c=this.F.settings().Pc().eu();"resumePlayback"==b&&"prompt"==c&&(a.fu("delayStartup"),b=a.Fw,c=this.I.ha("PB_RESUME_PRESENTATION_WINDOW_TEXT"),confirm(c)?b.resume(a.L(),!0):b.start(this.B.Gf(),!0))}I5(){this.J(!0);BL(this.ez,{N1:!1})}ke(){if(this.Ec()instanceof +sq){var a=this.B.fb(),b=this.Ec(),c=a,d=c.setExternalNavigationController;a=new RL(a.playerController(),this.lg,2==b.Bn);d.call(c,a)}this.dA.J(this.TE()||this.Hz())}I2(a,b){this.Ec()instanceof br?this.B.Oa().skin().bottomPanel().setExternalParent(null):this.Ec()instanceof sq?this.B.fb().setExternalParentForAccessibleNavigationControls(null):this.Hz()&&this.B.ob().setExternalParentForAccessibleBottomPanel(null);this.BG={B$:a,$aa:b}}kJ(){if(this.Ec()instanceof br){var a=this.xj;this.B.Oa().skin().bottomPanel().setExternalParent(a? +a.displayObject():null)}else this.Ec()instanceof sq?(a=this.xj,this.B.fb().setExternalParentForAccessibleNavigationControls(a?a.displayObject():null)):this.Hz()&&(a=this.xj,this.B.ob().setExternalParentForAccessibleBottomPanel(a?a.displayObject():null));BL(this.ez,{N1:WL(this)})}Ec(){return-1!=this.B.ma()?this.B.$():null}TE(){return this.Ec()instanceof Am}Hz(){return this.Ec()instanceof Aq}Ln(a){(a=SL(a,this.F,this.B))&&this.$n(a)}$n({yg:a,z0:b}){const c=this.B.Z().suspended();Vs(this.Ca,!0);alert(this.I.ha(a, +b));Vs(this.Ca,c)}PZ(){L(this,"min-height",`${window.innerHeight}px`)}};class YL extends XL{constructor({ic:a,messages:b,skinSettings:c}){super({G:"accessible-null-skin",ic:a,messages:b,skinSettings:c});(a=this.kh)&&N(this,a);this.V(this.R.displayObject());(a=this.dA)&&N(this.xj,a);(a=this.xj)&&N(this,a);this.ez.kh=this.kh}};class ZL extends P{constructor(){super({G:"launch-screen"});const a=new P({G:"launch-screen-button"});Ii||z(this,a.ka,()=>this.ka.C());const b=new P({ga:O(a,"play-icon")}),c=new P({ga:O(a,"icon")});a.V(b);a.V(c);this.V(a)}};function $L(a){return a.Fc?new P({za:a.Fc.element,ga:O(a,`${a.Fc.Ie}-icon`)}):null}function aM(a){if(a.qg){const b=new P({Yb:"SPAN",ga:O(a,"button-text")});b.la(a.qg);return b}return null} +class bM extends P{constructor({icon:a,type:b,size:c="medium",text:d,prefix:e}){super({G:`${e?e:""}${b}`,Yb:"BUTTON"});this.Rn=!1;this.qg=d||null;this.Fc=a||null;this.ms=$L(this);(this.Cq=aM(this))&&N(this,this.Cq,this.Fc?"right"===this.Fc.Ie?0:1:0);this.ms&&N(this,this.ms,this.Fc?"right"===this.Fc.Ie?1:0:0);this.B3=E(this);this.fa("size",c);this.ny()}pressed(){return this.Rn}Ac(a){this.Rn=a;this.pf("pressed",a);this.fa("withTooltip",!this.Rn)}la(a){(this.qg=a)?this.Cq?this.Cq.la(a):(this.Cq=aM(this), +N(this,this.Cq,this.Fc?"right"===this.Fc.Ie?0:1:0)):(Se(this,this.Cq),this.Cq=null)}Tm(a){this.ms&&Se(this,this.ms);this.Fc={element:a,Ie:"left"};(this.ms=$L(this))&&N(this,this.ms,this.Fc?"right"===this.Fc.Ie?1:0:0)}ra(a){super.ra(a);this.B3.C(a)}};function cM(a,b){He.call(this);this.kC=a;a=Kd(this.kC)?this.kC:this.kC?this.kC.body:null;this.yaa=!!a&&Uh(a);this.t0=ve(this.kC,Lb?"DOMMouseScroll":"mousewheel",this,b)}t(cM,He); +cM.prototype.handleEvent=function(a){var b=0,c=0,d=a.oe;"mousewheel"==d.type?(a=dM(-d.wheelDelta),void 0!==d.wheelDeltaX?(b=dM(-d.wheelDeltaX),c=dM(-d.wheelDeltaY)):c=a):(a=d.detail,100a&&(a=-3),void 0!==d.axis&&d.axis===d.HORIZONTAL_AXIS?b=a:c=a);"number"===typeof this.w0&&(b=Vc(b,-this.w0,this.w0));"number"===typeof this.x0&&(c=Vc(c,-this.x0,this.x0));this.yaa&&(b=-b);b=new eM(a,d,b,c);this.dispatchEvent(b)};function dM(a){return Mb&&(Nb||Pb)&&0!=a%40?a:a/40} +cM.prototype.hf=function(){cM.Mb.hf.call(this);Ee(this.t0);this.t0=null};function eM(a,b,c,d){ie.call(this,b);this.type="mousewheel";this.detail=a;this.deltaX=c;this.deltaY=d}t(eM,ie);function fM(a){return a.Bj-a.Ki} +class gM extends P{constructor(a){super({G:a.G,rf:!0});this.cF=15;this.Bb=this.Bj=this.Ki=this.Ok=0;this.Qz=a.Je||1;this.hG=this.Ns=0;this.J7=100;this.Ze=B(this,new P({ga:O(this,"up")}));this.V(this.Ze);this.La=B(this,new P({G:"thumb"}));this.V(this.La);this.La.V(B(this,new P({ga:O(this.La,"background")})));this.fh=B(this,new P({ga:O(this,"down")}));this.V(this.fh);this.pq=this.km=null;this.Ui=E(this);this.CB=E(this);this.Ti=new jh(this.J7);x(this,this.Ti,"tick",this.QM,this);x(this,this,Km,this.Kw, +this,Om);x(this,this.Ze,Km,this.YM,this,Om);x(this,this.La,Km,this.pA,this,Om);x(this,this.fh,Km,this.CM,this,Om);x(this,document.body,Lm,this.qF,this)}If(a){this.jt(a)}Je(){return this.Qz}scale(){return this.Os}setScale(a){this.setParentScale(a)}vi(a,b,c,d=0){this.Ok=a;this.Ki=b;this.Bj=c;this.Ns=d;this.rs();this.If(this.Bb)}jt(a){a=wv(a,this.Ki,this.Bj);this.Bb!=a&&(this.Bb=a,this.Mp(),this.Ui.C())}$s(a){this.jt(this.Bb+a)}Kw(){}YM(a){a.preventDefault();this.$s(-this.Je());this.qB(this.Ze,-this.Je())}CM(a){a.preventDefault(); +this.$s(this.Je());this.qB(this.fh,this.Je())}qB(a,b){this.km=a;x(this,this.km,"mouseover",this.mA,this);x(this,this.km,"mouseout",this.lA,this);x(this,document,Lm,this.NA,this);this.Ti.stop();this.pq=function(){this.$s(this.hG)};this.hG=b;this.Ti.start()}NA(){Ne(this,this.km,"mouseover",this.mA,this);Ne(this,this.km,"mouseout",this.lA,this);Ne(this,document,Lm,this.NA,this);this.Ti.stop();this.pq=null}mA(){this.Ti.start()}lA(){this.Ti.stop()}QM(){this.pq&&this.pq()}pA(a){this.CB.C();a.preventDefault(); +x(this,document.body,Mm,this.Xl,this);this.cP(!0)}cP(a){this.La.fa("active",a)}qF(){Ne(this,document.body,Mm,this.Xl,this);this.cP(!1)}Xl(){}$a(){this.rs()}};class hM extends gM{constructor(a){super(a);this.qV=0}rs(){const a=this.height()-this.Ze.height()-this.fh.height();this.La.Kd(0==fM(this)?a:Math.max(this.cF,Math.ceil(this.Ok/(fM(this)+this.Ok)*a)));this.Mp()}Mp(){const a=this.li();0==fM(this)?this.La.Cg(a.top):this.La.Cg(a.top+Math.round((this.Bb-this.Ki)/fM(this)*a.height));this.Ze.ra(!!this.Bb);this.fh.ra(this.Bb!=this.Bj)}li(){const a=new Wf(0,0,0,0);a.top=this.Ze.height();a.height=this.height()-this.fh.height()-this.La.height()-a.top;a.left= +this.La.x();return a}GO(){return this.li()}Kw(a){var b;if(b=!a.defaultPrevented)b=this.La.displayObject().getBoundingClientRect(),b=!(a.clientY>=b.top&&a.clientY<=b.top+b.height);if(b){b=this.displayObject().getBoundingClientRect();var c=this.li(),d=0==this.Ns?this.Ok:this.Ns;a=(a.clientY-(b.top-c.top))/this.Os<=this.La.y()?-d:d;this.If(this.Bb+a)}}pA(a){super.pA(a);const b=this.La.displayObject().getBoundingClientRect();this.qV=a.clientY-Math.round(b.top);this.Xl(a)}Xl(a){const b=this.displayObject().getBoundingClientRect(), +c=this.li();this.jt((a.clientY-b.top-c.top*this.Os-this.qV)/(c.height*this.Os)*fM(this)+this.Ki)}};var iM=new ae;function jM(a){a.U3&&a.Hf(a.pZ||a.dM?.5:0)}function kM(a,b){x(a,new cM(b.displayObject(),{passive:!0}),iM,c=>{!ih(c.oe)&&c.deltaY&&(c=0{c.displayObject().scrollTop=this.Bb});x(this,c,"scroll",()=>{this.If(c.displayObject().scrollTop)},this);this.VA?kM(this,this.VA):(kM(this,this.iw),kM(this,this));d?(this.Hf(0),this.VA?(x(this,this.VA,"mouseenter",this.Xp,this),x(this,this.VA,"mouseleave",this.Vl,this)):(x(this,this.iw,"mouseover",this.Xp,this),x(this,this, +"mouseover",this.Xp,this),x(this,this.iw,"mouseout",this.Vl,this),x(this,this,"mouseout",this.Vl,this))):this.Hf(1)}vi(a,b,c,d=0){this.J(0{this.oA.C()})}scrollY(){return this.P.scrollTop}eI(){return this.oA}Nx(a){this.P.scrollTop=a}} +class pM extends wg{constructor({G:a="vertical-scrollbar",Pha:b="mobile-vertical-scrollbar",lr:c,Uha:d,FP:e,b1:f=null,Je:g=20,preventDefault:h=!0}){super();this.ua=this.sd=null;this.zZ=d||null;this.vS=e||null;this.Bj=0;if(Ii){const l=E(this);a={fadeScrollbars:!0,scrollX:!1,scrollY:!0,bounce:!1,deceleration:.006,useTransition:!1,preventDefault:h,disablePointer:!0,disableTouch:!1,disableMouse:!1,onScrollHandler:()=>{l.C()}};b=new mM(b);a.indicators={el:b.displayObject(),shrink:"scale"};this.sd=new IScroll(c.displayObject(), +a);this.fi=new nM(this.sd,l)}else this.ua=B(this,new lM({G:a,Je:g,lr:c,oaa:!0,b1:f})),this.fi=new oM(c.displayObject()),b=this.ua;z(this,this.fi.eI(),this.IX,this);this.g8=b}Tj(){return this.g8}vi(a,b){this.Bj=Math.max(0,b-a);this.sd?this.sd.setScrollHeight(b):this.ua&&this.ua.vi(a,0,Math.max(this.Bj,0));this.IX()}setParentScale(a){this.ua&&this.ua.setParentScale(a)}yx(){this.ua&&this.ua.yx()}IX(){if(this.zZ){var a=Math.min(this.fi.scrollY(),60);Ph(this.zZ,a)}this.vS&&(a=this.Bj-this.fi.scrollY(), +Ph(this.vS,Math.min(a,60)))}rd(){super.rd();this.sd&&this.sd.destroy()}};class qM extends P{constructor(){super({G:"message-box"});this.nf("alertdialog");this.ZM=E(this);this.PD=E(this);this.FF=!1}open(){this.FF=!0;this.rA();this.ZM.C(this)}close(){this.FF=!1;this.J(!1);this.PD.C(this);Ne(this,document,"keydown",this.vX,this)}J(a){super.J(a);this.Rp&&this.Rp.J(a)}Rq(){return this.PD}vX(a){const b=a.target.nodeName;"INPUT"!=b&&"TEXTAREA"!=b&&a.preventDefault()}rA(){this.J(!0);x(this,document,"keydown",this.vX,this)}};class rM extends zC{constructor(a){super(null,[0],[1],75,b=>b*b);this.u3=a}mp(){this.u3.Hf(this.coords[0])}};class sM extends qM{constructor(){super();this.rK=this.XD=void 0}rA(){Ii&&super.rA();this.XD&&this.XD.stop();this.J(!0);!Ii&&this.rK&&this.rK.focus();this.XD=new rM(this);this.XD.play()}};function tM(a){var b=a.Rp;const c=Math.floor(.5*(b.width()-a.width()));b=Math.floor(.5*(b.height()-a.height()));a.move(c,b)} +class uM extends sM{constructor({Rm:a,icon:b,buttons:c,ia:d,px:e}){super();if(this.Rp)throw Error("already modal");this.Rp=new P({G:"modal-layer"});this.I=d;this.sa=new P({ga:O(this,"content")});this.Fc=null;b&&(this.Fc=new P({za:b,ga:O(this,"icon")}),this.sa.V(this.Fc));this.Jl=new P({ga:O(this,"message-container")});this.Bv=new P({ga:O(this,"message"),tabIndex:-1});Ht(this.Bv,this.I,a,e);N(this.sa,this.Jl);this.V(this.sa);this.rK=this.Bv.displayObject();this.mY=new P({});N(this.mY,this.Bv);N(this.Jl, +this.mY);this.xd=new P({G:"message-box-buttons"});Ft(this.xd,O(this,"buttons"));N(this,this.xd);this.Pu(c);this.ua=new pM({lr:this.Jl});this.sa.V(this.ua.Tj());B(this,this.ua);this.QX=""}jA(){super.jA();this.ua.setParentScale(this.Os)}rA(){super.rA();this.ub();Gi(()=>{tM(this)},this,0)}Pu(a){const b=new P({ga:O(this.xd,"buttons")});a.forEach(({yg:c,result:d})=>{const e=new bM({type:"uikit-primary-button"});Ft(e,O(this.xd,"window-button"));Ht(e,this.I,c);N(b,e);z(this,e.ka,()=>{this.QX=d;this.close()})}); +this.xd.V(b)}$a(){var a=$h(this.sa.displayObject()),b=this.Fc?$h(this.Fc.displayObject()):null;b=this.Fc?this.Fc.width()+b.left+b.right:0;L(this.Jl,"max-width",Math.min(screen.width-b-a.right-a.left-80,480)+"px");L(this.Jl,"height","");a=this.Rp;b=$h(this.Jl.displayObject());const c=$h(this.xd.displayObject());a=.9*a.height()-b.top-b.bottom-this.xd.height()-c.top-c.bottom;b=Math.min(a,this.Bv.height());a=Vb||yi(this.Co.displayObject(),"0 0");x(this,a,"touchstart",c=>{for(let d=0;d{const g=new uM({Rm:b,icon:c,buttons:d,ia:a.I,px:e});vM(a.vg,g);g.open();z(a,g.Rq(),()=>{var h=a.vg,l=Ia(h.jH,g);0<=l&&(Sa(h.jH,l),g.FF&&g.close(),Ue(h,g),Fd(g.displayObject()),(l=g.Rp)&&Fd(l.displayObject()));h.Co.J(0{Ni&&uj?setTimeout(()=>{DM(this)},100):DM(this)})).observe(this.P);window.invalidatePlayerSize=()=> +{};window.setPlayerSize=()=>{};window.removeResizeListeners=()=>{};document.addEventListener("touchend",c=>{0==c.touches.length&&(this.UG=!1,setTimeout(()=>{DM(this,!1,!1)},100))},!0);document.addEventListener("touchstart",c=>{1==window.event.touches.length&&(this.UG=!0);1{b&&b();DM(this)};a.onorientationchange=()=>{const c=Ud();c&&Ii&&(Ni?setTimeout(()=>{c.blur();rj&&DM(this)},800):c.blur())};dj&&window.frameElement&&window.frameElement.setAttribute("scrolling", +"no")}CM.prototype.nC=function(){DM(this,!0)}; +function DM(a,b=!1,c=!0){function d(m,p){if(b||n.Ny!=m||n.lK!=p){const r=n.Ny;n.Ny=m;n.lK=p;n.pB.C(n.Ny,n.lK);r!=n.Ny&&Ni&&!n.UG&&setTimeout(()=>{e(0,0)},100)}}const e=AM;if(b||!a.UG){var f=Ni?2*a.P.clientHeight:a.P.clientHeight;if(aj||!(ij&&.7>f/screen.height||ah&&.7>window.innerHeight/f)){var g=1,h=a.P.clientWidth;c&&dj&&window.frameElement&&(h=0,g=h/window.innerWidth);var l=window.innerHeight*g,n=a;d(h,l);c&&dj&&window.frameElement&&setTimeout(()=>{h=window.frameElement.clientWidth;g=h/window.innerWidth; +l=window.innerHeight*g;d(h,l)},0)}}};function EM(a,b,c){null==a.ii&&(a.ii=new CM,a.ii.pB.addHandler(a.E6,a));a.sE=b;a.Fh=c}class FM{constructor(){this.Fh=this.sE=this.ii=null}nC(){this.ii&&this.ii.nC()}E6(a,b){this.sE&&this.sE.apply(this.Fh,[a,b])}};const GM=[{hx:Ib,G:"ie"},{hx:Ji,G:"android_default"},{hx:Mb,G:"webkit"},{hx:Hb,G:"opera"},{hx:Lb,G:"gecko"}];function HM(a){Ft(a,Ii?"mobile":"desktop");GM.find(b=>{b.hx&&Ft(a,b.G);return b.hx})};class IM{constructor(a){this.Jz=a;this.qo=!1;this.mK=void 0}suspend(){this.mK=this.Jz.LL;$B(this.Jz,!1);this.qo=!0}resume(){$B(this.Jz,this.mK);this.mK=void 0;this.qo=!1}};function JM(a,b){if(a.Nk){var c=a.qv;a=a.D.view();b=b||a.displayObject();b.appendChild(c.displayObject())}}function KM(a,b){Me(a,b,"click",a.iq,a);setTimeout(()=>{Ne(a,b,"click",a.iq,a)},500)} +class LM extends wg{constructor(a,b){super();this.D=a;this.qv=b;this.yA=E(this);this.Nk=!1;B(this,this.qv)}show(a){const b=this.qv;b.ra(!1);const c=this.D.view(),d=c.W().Z();this.Nk=!0;JM(this,a);c.setOverlayDisplayed(!0);z(this,d.Cl(),this.zF,this);b.ra(!0);z(this,b.ka,this.zF,this)}zF(){const a=this.D.view();var b=a.W().Z();this.Mr(b);this.Mr(this.qv);(Ji||yj)&&(b=Ld(this.qv.displayObject()))&&KM(this,b);Fd(this.qv.displayObject());a.setOverlayDisplayed(!1);this.Nk=!1;this.yA.C()}iq(a){a.preventDefault()}} +;class MM extends P{constructor(){super({G:"preloader"});this.aZ=0;this.ko=!1;this.J(!1)}show(){this.ko||(this.ko=!0,clearTimeout(this.pz),clearTimeout(this.fB),this.fB=Gi(this.n8,this,800))}Oc(){if(this.ko&&(this.ko=!1,clearTimeout(this.pz),clearTimeout(this.fB),this.visible())){var a=500-(this.kn()-this.aZ);0{h?(f=new ZL,f=new LM(a,f),Qe(this,f.yA,()=>{this.os();this.B.play()}),f.show()):this.os()});e?EM(e,this.Aj,this):(this.ii=new CM,z(this,this.ii.pB,this.Aj,this),Gi(this.ii.nC,this.ii));this.wn=new IM(this.B.Qt());this.Xk=E(this);this.Dk=E(this);this.un=E(this);this.os()}Hy(){const a=new MM;this.R.displayObject().appendChild(a.displayObject());return a}os(){this.LB();z(this,this.B.Z().aC(),this.LB,this)}LB(){this.B.Z().kd()? +this.xf.show():this.xf.Oc()}Aj(a,b){const c=this.F9?170:0,d=a-c,e=b-c;this.qN{this.wn.resume();this.R.setOverlayDisplayed(!1);this.Dk.C();this.un.C();"yes"==e?d.resume(c,!0):d.start(b,!0)});this.wn.suspend();this.R.setOverlayDisplayed(!0);this.Xk.C()}}Ln(a){(a=SL(a,this.F,this.B))&&this.$n(a)}$n({yg:a,z0:b}){const c=this.B.Z().suspended();this.wn.suspend(); +this.R.setOverlayDisplayed(!0);this.Xk.C();yM(this.vk,{Rm:a,icon:Z(this.K,"mb_warning_icon"),buttons:[{yg:"PB_MESSAGE_BOX_OK",result:"ok"}],px:()=>b}).then(()=>{this.wn.resume();this.R.setOverlayDisplayed(!1);this.Dk.C();this.iA(c)})}iA(a){Vs(this.Ca,a)}rd(){super.rd();it(this.R.displayObject(),"hidden",!1)}};class OM extends wg{constructor({fk:a,messages:b,gj:c}){super();this.fw=a;this.fg=b;this.ii=new FM;this.w8=rd(document,c);this.Zk=null;this.Xk=E(this);this.Dk=E(this);this.un=E(this);this.gS=E(this)}D(){return this.fw}};class PM extends P{constructor({G:a="back_to_app",label:b,vca:c}){super({G:a});b&&(a=new P({ga:O(this,"text")}),a.la(b),this.V(a));c&&this.V(c);z(this,this.ka,()=>ISPlayer.backToApp())}};class QM extends P{constructor({ia:a}){super({G:"title-panel"});this.Eu=new PM({label:a.ha("PB_BACK_TO_APP_BUTTON_LABEL")});this.V(this.Eu)}};class RM extends NM{constructor(a,b,c){super(a,b,c,!1);this.sb=new QM({ia:this.I});this.V(this.sb);ISPlayer.initWithData(vh({version:9.3}))}Aj(a,b){this.fa("landscape",a>b);super.Aj(a,b)}};function SM(a){if(Dj)return new RM(a.D(),a.K,a.fg);const b=new NM(a.D(),a.K,a.fg,a.h2,a.ii);z(a,b.Xk,()=>a.Xk.C());z(a,b.Dk,()=>a.Dk.C());z(a,b.un,()=>a.un.C());return b} +class TM extends OM{constructor({fk:a,messages:b,gj:c,Km:d,wm:e}){super({fk:a,messages:b,gj:c});this.h2=e;this.K=this.hK(d)}hK(a){return new zL(a.oQ)}$S(a){"normal"==a?this.Zk=SM(this):"accessible"==a&&(this.Zk=new YL({ic:this.fw,messages:this.fg,skinSettings:this.UJ()}));B(this,this.Zk)}UJ(){return{l1:!1,showSlideList:!1,te:!1,j1:!1,i1:!1}}};class UM{constructor({fk:a,skinSettings:b,ia:c}){this.D=a;this.Wa=b;this.I=c}fk(){return this.D}skinSettings(){return this.Wa}ia(){return this.I}};class VM{constructor(){var a=new DG,b=new CG,c=new fG;this.y$=new yG;this.wca=a;this.Raa=b;this.uP=c;this.oQ=zG;this.Saa=AG}};function WM(a){const b="SOLID"===a.type?a:null;if(!b)return a.Am();a=Po(b.color.toUpperCase());return 60Math.min(c+10,255))),opacity:.8}):qL({color:Uk(...a.map(c=>Math.max(c-10,0))),opacity:.8})};class XM{constructor({Ba:a,RQ:b,colors:c,Km:d}){this.F=a;this.pN=b;this.Nb=c;this.Xs=d;this.Qf=null;if(a=this.Nb)a.transparentPopupBackground=a.asideBackground.kc(0),a.progressBackground=a.playerText.kc(.1),c=a.playerBackground,b=a.primaryButtonBackground,b=b instanceof rL&&c instanceof rL&&b.color==c.color||c instanceof rL&&0==c.opacity?a.primaryButtonText.Am():a.primaryButtonBackground.Am(),a.progressPlayback=b,a.slideBorder=qL({color:"#000000",opacity:.06}),a.asideElementTextVisited=a.asideElementBackgroundActive.kc(.4), +a.hyperlink=a.asideElementText.kc(.6),a.itemsListOrder=a.asideElementText.kc(.6),a.popupBackground=a.asideBackground.kc(.92),a.popupBackgroundHover=a.asideElementBackgroundHover.Am(),a.popupText=a.asideElementText.Am(),a.itemsListIconFill=a.asideElementText.kc(.2),a.itemsListIconStroke=a.asideElementText.kc(.48),a.popupTextHover=a.asideElementTextHover.Am(),a.popupBorder=a.asideBackground.kc(.08),a.linkButtonTextColor=a.playerText.kc(.72),a.presenterInfoLinkBorderColor=a.asideElementText.kc(.16), +a.outlineItemBorder=a.asideElementText.kc(.1),a.searchFieldBackgroundColor=a.asideElementBackgroundActive.kc(.6),a.hoveredTabBackgroundColor=a.asideElementBackgroundHover.kc(.8),a.selectedTabBackgroundColor=a.asideElementBackgroundActive.kc(.8),a.topPanelIconContainerColor=WM(a.asideBackground),a.volumeControlBackgroundColor=a.secondaryButtonTextHover.kc(.2),a.volumeControlPlaybackColor=a.secondaryButtonTextHover.kc(.8),a.volumeControlThumbColor=a.secondaryButtonTextHover.Am(),a.moreMenuVolumeControlBackgroundColor= +a.popupText.kc(.2),a.moreMenuVolumeControlPlaybackColor=a.popupText.kc(.8),a.moreMenuVolumeControlThumbColor=a.popupText.Am(),a.moreMenuVolumeControlBackgroundColor=a.asideElementText.kc(.2),a.moreMenuVolumeControlPlaybackColor=a.asideElementText.kc(.8),a.moreMenuVolumeControlThumbColor=a.asideElementText.Am(),a.topPanelIconColor=a.asideElementText.kc(.72),a.miniSkinMenuButtonText=a.playerText.kc(.72),a.miniSkinMenuButtonBackgroundActive=a.playerText.kc(.1),a.miniSkinTopBottomPanelBorder=a.playerText.kc(.1), +a.miniSkinPresenterDelimiterColor=a.popupText.kc(.08),a.panelVideoStubColor=a.asideElementTextActive.kc(.6),a.panelVideoStubBackgroundColor=a.asideElementBackgroundActive.kc(.4),a.topBottomPanelBorderColor=a.playerText.kc(.1)}wP(a){if("normal"==a)Fd(this.Qf),this.Qf=null,a={__slide_width__:`${this.F.slideWidth()}px`,__slide_height__:`${this.F.slideHeight()}px`,__player_view_id__:this.pN,__borderRadius__:`${this.F.settings().skin().borderRadius}px`},this.Nb&&this.Nb.contentBackground&&Object.assign(a, +{__skin_background__:this.Nb.contentBackground.RI()}),this.Qf=(uj?this.Xs.Raa:Ii?this.Xs.wca:this.Xs.y$).Uq(this.Nb&&vL(this.Nb),a);else if("accessible"==a)this.hJ();else throw Error("unknown presentation view mode");}hJ(){Fd(this.Qf);this.Qf=null;this.Qf=this.Xs.uP.Uq()}};class YM extends P{constructor({G:a,title:b}){super({Yb:"DETAILS",G:a});a=new P({Yb:"SUMMARY",ga:O(this,"summary")});a.la(b);this.KG=a;N(this,this.KG);x(this,this,"toggle",this.JZ,this);this.JZ()}JZ(){const a=this.displayObject().hasAttribute("open");this.pf("expanded",a)}};class ZM extends YM{constructor(a){super({G:"ppt-accessible-slide-notes",title:a.ha("PB_TAB_NOTES_LABEL")});this.CV=new P({ga:O(this,"notes-container")});N(this,this.CV)}mR(a){this.CV.gp($G(a.g2,SG.CI))}};function $M(a){if(a){const b=new P({Yb:"P"});b.la(a);return b}return null}function aN({Haa:a="",link:b,title:c,text:d}){if(b){const e=new P({Yb:"A"});e.setAttribute("href",`${a}${b}`);e.setAttribute("title",c||b);e.la(d);return e}return null} +class bN extends YM{constructor({zg:a,ia:b}){super({G:"ppt-accessible-presenter",title:b.ha("PB_ACCESSIBLE_PRESENTER_INFO")});this.Vb=a;this.I=b;this.ZJ().forEach(c=>c&&N(this,c))}ZJ(){const a=[];var b=this.Vb.Vt();var c=this.I.ha("PB_ACCESSIBLE_SKIN_PRESENTER_PHOTO");if(b){const d=new P({Yb:"IMG"});d.setAttribute("src",b.path());d.setAttribute("alt",c);b=d}else b=null;b&&a.push(b);(b=$M(this.Vb.name()))&&a.push(b);(b=$M(this.Vb.Pt()))&&a.push(b);(b=aN({link:this.Vb.ue(),title:this.Vb.ue(),text:this.I.ha("PB_PRESENTER_WEBSITE")}))&& +a.push(b);(b=aN({Haa:"mailto:",link:this.Vb.email(),title:this.Vb.email(),text:this.I.ha("PB_PRESENTER_EMAIL")}))&&a.push(b);(b=$M(this.Vb.phone()))&&a.push(b);(b=$M(this.Vb.Oq()))&&a.push(b);return a}};const cN={image:[".jpg","jpeg",".png",".gif"],video:[".mp4"],document:[".doc",".docx",".xls",".xlsx",".pdf"]};function dN(a){let b=a.url();try{if("attachment"==a.type()){const c=b.lastIndexOf("/");b=b.substring(0,c+1)+encodeURIComponent(b.substring(c+1))}}catch(c){b=""}return b} +function eN(a){const b=a.title(),c=a.type(),d=dN(a);a=a.target();if("webLink"==c)return{type:"link",title:b,X_:null,href:d,target:a};const e=b.substring(b.lastIndexOf("."));return{type:Object.keys(cN).find(f=>cN[f].includes(e))||"file",title:b,X_:e,href:d,target:a}}function fN(a){const b=gN(a);if(!b)return null;a=new P({ga:O(a,"subtitle")});a.la(b);return a} +function hN(a){switch(a.Fr.type){case "file":return Z(a.K,"attachment-unknown");case "image":return Z(a.K,"attachment-image");case "link":return Z(a.K,"attachment-link");case "video":return Z(a.K,"attachment-video");case "document":return Z(a.K,"attachment-doc")}return null} +function gN(a){const b=a.Fr.X_;switch(a.Fr.type){case "file":return a.I.ha(a.Oj.file,{EXTENSION:b});case "document":return a.I.ha(a.Oj.document,{EXTENSION:b});case "image":return a.I.ha(a.Oj.image);case "link":return a.I.ha(a.Oj.link);case "video":return a.I.ha(a.Oj.video)}return null} +class iN extends P{constructor(a,b,c,d){super({G:"attach-item",tabIndex:0});this.K=b;this.I=c;this.Oj=d;this.Fr=eN(a);(a=this.jn())&&N(this,a);a=this.YJ();N(this,a);b=this.Ky();N(a,b);(this.JG=fN(this))&&N(a,this.JG);this.nf("row");const e=this.$J();z(this,this.ka,()=>e.click());z(this,this.I.jh,this.$i,this)}jn(){var a=hN(this);if(!a)return null;const b=new P({ga:O(this,"icon-container")});a=new P({za:a,ga:O(this,"icon")});N(b,a);return b}Ky(){const a=new P({ga:O(this,"title")});a.la(this.Fr.title); +return a}YJ(){return new P({ga:O(this,"info-container")})}$J(){const a=wd("A");a.setAttribute("title",this.Fr.href);a.setAttribute("href",this.Fr.href);a.setAttribute("target",this.Fr.target);return a}$i(a){switch(a){case this.Oj.file:case this.Oj.document:case this.Oj.image:case this.Oj.link:case this.Oj.video:(a=gN(this))&&this.JG&&this.JG.la(a)}}}function jN(a,b){b=new iN(b,a.K,a.I,a.Oj);z(a,b.ka,()=>{Gi(()=>{a.nS.C()},a,1E3)},a);return b} +function kN(a){a.ua.vi(a.Wn.height(),a.Iz.height());a.ua.yx()} +var lN=class extends P{constructor(a,b,c){super({G:"attachments-info",tabIndex:-1});this.nS=E(this);this.K=b;this.I=c;this.Oj={file:"PB_ATTACHMENT_FILE_SUBTITLE",document:"PB_ATTACHMENT_DOCUMENT_SUBTITLE",link:"PB_ATTACHMENT_LINK_SUBTITLE",video:"PB_ATTACHMENT_VIDEO_SUBTITLE",image:"PB_ATTACHMENT_IMAGE_SUBTITLE"};this.Wn=new P({ga:O(this,"scroll-area")});N(this,this.Wn);this.Iz=new P;N(this.Wn,this.Iz);b=new P({G:"container-bottom-shadow"});N(this,b);this.ua=new pM({lr:this.Wn,FP:b.displayObject()}); +B(this,this.ua);this.V(this.ua.Tj());this.aK(a);this.nf("region");this.fp("Resources")}aK(a){const b=a.count();for(let d=0;dN(this.UU,d))}aK(){return new P({Yb:"UL"})}};class pN extends oN{constructor({resources:a,ia:b}){super({G:"ppt-accessible-resources",title:b.ha("PB_ACCESSIBLE_TITLE_PANEL_ATTACHMENTS"),s0:a})}ZS(a){return a.ti().Sc().map(b=>this.bK(b))}bK(a){const b=nN(this,!1);a=this.$J(a);N(b,a);return b}$J(a){const b=new P({Yb:"A"});b.setAttribute("title",a.url());b.setAttribute("href",dN(a));b.setAttribute("target",a.target());b.la(a.title());return b}};class qN extends oN{constructor({slides:a,ia:b}){super({G:"ppt-accessible-slide-list",title:b.ha("PB_ACCESSIBLE_SLIDES"),s0:a});this.nf("navigation");this.KG.nf("heading");this.KG.setAttribute("aria-level","2");a=this.KG;a.P.id||a.gR(ld());this.pf("labelledby",a.P.id);this.nY=E(this)}ZS(a){return a.OB.map(b=>this.bK(b))}bK(a){const b=nN(this),c=a.title()?a.title():"---";b.la(`${a.index()+1}. ${c}`);z(this,b.ka,()=>{this.nY.C(a)});return b}};class rN extends P{constructor(a){super({Yb:"SECTION",G:"ppt-accessible-top-panel",tabIndex:-1});this.nf("region");this.fp(a.ha("PB_ACCESSIBLE_ARIA_LABEL_TOP_PANEL"));this.I=a;this.TY=new P({Yb:"H1",ga:O(this,"slide-status")});N(this,this.TY)}};function sN(a){a.kB&&z(a,a.kB.nY,b=>{a.tc.pe(b.index())})} +class tN extends XL{constructor({ic:a,messages:b,skinSettings:c}){super({G:"ppt-accessible-skin",ic:a,messages:b,skinSettings:c});this.oa=this.Tr();this.kB=this.Wa.showSlideList?new qN({slides:this.F.slides(),ia:this.I}):null;this.gg=this.Wa.te?new ZM(this.I):null;this.OA=this.Wa.j1&&this.F.resources().ti().count()?new pN({resources:this.F.resources(),ia:this.I}):null;this.Vb=null;this.nv()}Tr(){return this.Wa.l1?new rN(this.I):null}nv(){var a=this.dA;a&&N(this.xj,a);this.kB&&(Ib||Jb)?(a=new P({G:"ppt-accessible-slide-list-wrapper"}), +N(a,this.kB)):a=this.kB;a&&N(this.xj,a);(a=this.gg)&&N(this.xj,a);(a=this.OA)&&N(this.xj,a);(a=this.oa)&&N(this,a);(a=this.kh)&&N(this,a);this.V(this.R.displayObject());(a=this.xj)&&N(this,a);this.ez.oa=this.oa;this.ez.kh=this.kh;sN(this)}ke(){super.ke();if(this.oa)if(this.TE()){var a=-1!=this.B.ma()&&this.B.$().visible()?`${this.B.$().Ci()+1}`:"-";const c=this.F.slides().np();var b=this.oa;a=b.I.ha("PB_ACCESSIBLE_SLIDE_N_OF_COUNT",{SLIDE_NUMBER:a,TOTAL_SLIDES:c});b.TY.la(a);this.oa.J(!0)}else this.oa.J(!1); +this.Wa.te&&this.gg&&((b=(b=this.Ec())?b.pj():null)&&b.text()?(this.gg.mR(b),this.gg.J(!0)):this.gg.J(!1));this.YO()}YO(){this.Vb&&(Se(this.xj,this.Vb),this.Vb=null);const a=this.Ec().zg();this.Wa.i1&&a&&(this.Vb=new bN({zg:a,ia:this.I}),N(this.xj,this.Vb))}};function uN(a){const b=[],c=[];let d=-1;for(let f=0;fd?d+=1:e{var d=a[c];var e="SOLID"===d.type?d:null;d="GRADIENT"===d.type?d:null;if(e)d={type:"solid",value:{color:BN(e.color),alpha:e.opacity}};else if(!d||2!==d.jj.length||180!==d.ij&&90!==d.ij)d=null;else{e=d.ij;const f=d.jj[0];d=d.jj[1];d={type:"gradient",value:{firstColor:{color:BN(f.color),alpha:f.opacity},secondColor:{color:BN(d.color),alpha:d.opacity},direction:180===e?"vertical":"horizontal"}}}b[c]=d;return b},{})};function FN(a,b){var c=0-1!=b.indexOf(c))} +class LN extends wg{constructor({Ba:a,W:b,settings:c,ia:d,view:e,sidePanelController:f}){super();this.F=a;this.B=b;z(this,this.B.Bc(),this.ke,this);this.H=c;this.I=d;this.pa=e;this.Cb=f;z(this,this.pa.Le(),this.a6,this);z(this,this.pa.So(),this.Mv,this);this.xb=null}RR(a){this.Cb=a}ke(){this.xb&&(Pe(this,this.xb.showTopPanelPopupEvent(),this.nW,this),Pe(this,this.xb.showOutlineEvent(),this.mW,this),this.Mv());if(this.xb=this.B.Oa()){z(this,this.xb.showTopPanelPopupEvent(),this.nW,this);z(this,this.xb.showOutlineEvent(), +this.mW,this);var a=this.B.$(),b=this.UT(a),c=b&&this.yY()?b.logo():null;a=this.xb.skin();var d=a.setPresentationContext,e=this.Cb,f=KN(this),g=!!this.F.resources().ti().count();c=c?c.path():null;var h=b?b.ue():"";b=b?b.pD():"";var l=this.dO(),n=this.F.courseTitle(),m;m=(m=this.H.xa.Hc||null)&&m.visible&&wN(m,"outline")?!0:(m=this.H.xa.Qc||null)&&m.visible&&m.showOutline?!0:(m=this.H.xa.controlPanel||null)&&m.visible&&m.showOutline?!0:!1;d.call(a,{sidePanelController:e,buttonsOrder:f,resourcesButtonEnabled:g, +logo:c,logoUrl:h,logoTarget:b,showTitle:l,courseTitle:n,hasOutline:m})}}a6(){this.xb&&this.xb.setPanelScale(this.pa.scale())}UT(a){return(a=a.zg())&&a.Td()?a.Td():this.F.Td()}yY(){const a=this.H.xa.Hc;return a?a.visible&&a.pd:!1}dO(){const a=this.H.xa.Hc||null;return a?a.visible&&a.Sq:!1}nW(a){this.pa.m1(a)}mW(a){this.pa.YC(a)}Mv(){this.xb&&(this.xb.onTopPanelPopupClosed(),this.xb.outlinePopupClosed())}};function MN(a,b,c){return(a-2/3*c)/(b+c/3)}function NN(a){if(1>=a)return a;a=1+(a-1)/3;return Ib?yv(a,4):a};function ON(a,b){this.wc=a;this.sn=b}ON.prototype.getData=function(a){return null==this.Pd?null:this.Pd[a]};ON.prototype.setData=function(a,b){null==this.Pd&&(this.Pd={});this.Pd[a]=b};function PN(a,b){F(a.wc,"pointer-events",b)}function QN(a,b){for(const c in b)a.wc.setAttribute(c,b[c])}ON.prototype.remove=function(){var a=this.sn;const b=a.wp.indexOf(this);if(-1==b)throw Error();a.wp.splice(b,1);a.wc.removeChild(this.wc)};function RN(a){x(a,a.rh.wc,Km,a.TM,a,Nm);x(a,a.Bo,Lm,a.F6,a)} +class SN extends wg{constructor(a){super();this.rh=a;this.xD=null;this.qa=1;this.Bo=window;this.Xu=E(this);this.Wu=E(this)}setScale(a){this.qa=a}gz(a){a=Lh(a,this.rh.wc);return new Xc(a.x/this.qa,a.y/this.qa)}TM(a){this.Xu.C();a.preventDefault();a.stopPropagation();a=this.gz(a);this.xD.P0(a.x,a.y);x(this,this.Bo,Mm,this.rW,this)}rW(a){const b=this.gz(a);this.xD.dI(b.x,b.y);a.preventDefault()}F6(){Ne(this,this.Bo,Mm,this.rW,this);this.Wu.C()}};function TN(a,b,c){ON.call(this,a,b);this.wc.setAttribute("d",c)}t(TN,ON);function UN(a,b){ON.call(this,a,b);this.wp=[]}t(UN,ON);function VN(a,b){const c=document.createElementNS("http://www.w3.org/2000/svg","path");b=new TN(c,a,b);a.wc.appendChild(c);a.wp.push(b);return b}function WN(a){const b=document.createElementNS("http://www.w3.org/2000/svg","g"),c=new UN(b,a);a.wc.appendChild(b);a.wp.push(c);return c}UN.prototype.forEach=function(a){for(let b=0;b{d.wc===b&&(c=d)});return c}UN.prototype.mr=function(){this.wp=[];Cd(this.wc)};function YN(a,b,c){const d=document.createElementNS("http://www.w3.org/2000/svg","svg");d.setAttribute("width",b);d.setAttribute("height",c);d.setAttribute("version","1.1");F(d,{overflow:"hidden",position:"relative"});a.appendChild(d);UN.call(this,d,this)}t(YN,UN);function ZN(a,b){a.sn.forEach(c=>{c!==a.rh&&b(c)})}function $N(a){x(a,a.rh.wc,Km,a.UM,a,Nm);x(a,a.Bo,Lm,a.sW,a);ZN(a,b=>{PN(b,"painted");x(a,b.wc,Km,a.vF,a,Nm)})}function aO(a){Ne(a,a.rh.wc,Km,a.UM,a);Ne(a,a.Bo,Lm,a.sW,a);ZN(a,b=>{PN(b,"none");Ne(a,b.wc,Km,a.vF,a)})} +function bO(a,b){if(b&&b!==a.rh.wc&&b instanceof SVGElement&&(b=XN(a.sn,b))){var c=b.getData("drawingId");if(c){const d=[];a.sn.forEach(e=>{e.getData("drawingId")===c&&d.push(e)});for(b=0;bd?[["M",c-5,",",d-10],["L",c+5,",",d-10],["L",e+5,",",f-10],["L",e+5,",",f+10],["L",e-5,",",f+10],["L",c-5,",",d+10]]:[["M",c-5,",",d-10],["L",e-5,",",f-10],["L",e+5,",",f-10],["L",e+5,",", +f+10],["L",c+5,",",d+10],["L",c-5,",",d+10]];for(d=0;d"g"==f.nodeName);c.removeAttribute("opacity");var d=zd("div");d.appendChild(b);Fd(c);const e=d.innerHTML;Cd(b);b.appendChild(c);b={ignoreMouse:!0,ignoreAnimation:!0};canvg(a.YL,d.innerHTML,b);canvg(a.SL,e,b);if(d=a.Fi.getContext("2d"))d.clearRect(0,0,a.Fi.width,a.Fi.height),d.globalAlpha=.4,d.drawImage(a.YL,0,0),d.globalAlpha=1,d.drawImage(a.SL,0,0)} +function gO(a,b){a.aO=b;a.cA("nothing"!=b);switch(b){case "nothing":b=a.Ol;Ne(b,b.rh.wc,Km,b.TM,b);aO(a.fs);break;case "line":b=a.Ol;b.xD=a.E4;RN(b);aO(a.fs);break;case "marker":b=a.Ol;b.xD=a.K4;RN(b);aO(a.fs);break;case "eraser":b=a.Ol,Ne(b,b.rh.wc,Km,b.TM,b),$N(a.fs)}} +class hO extends P{constructor(a,b){super({G:"draw-control"});this.SL=this.YL=this.Fi=null;var c=this.Xh=new YN(this.displayObject(),a,b);const d=document.createElementNS("http://www.w3.org/2000/svg","rect"),e=new ON(d,c);QN(e,{x:0,y:0,width:a,height:b});c.wc.appendChild(d);c.wp.push(e);this.rh=e;QN(this.rh,{opacity:0});this.Ol=new SN(this.rh);this.ZL=WN(this.Xh);QN(this.ZL,{opacity:.4});this.D4=WN(this.Xh);this.E4=new dO(this.D4);this.K4=new eO(this.ZL,new Wf(0,0,a,b));this.fs=new cO({group:this.Xh, +nca:this.rh,pba:this.Xh,Vca:void 0});this.aO="nothing";if(eh||Ni)this.Fi=zd("canvas"),F(this.Fi,"position","relative"),this.Fi.width=a,this.Fi.height=b,this.YL=zd("canvas"),this.SL=zd("canvas");this.Xu=E(this,[this.Ol.Xu,this.fs.Xu]);this.Wu=E(this,[this.Ol.Wu,this.fs.Wu]);this.cA(!1)}setScale(a,b){super.setScale(a,b);this.Ol.setScale(a);this.fs.setScale(a)}cA(a){L(this,"pointer-events",a?"all":"none");if(eh||Ni){const b=null!=this.Xh.wc.parentNode;a&&!b?Gd(this.Xh.wc,this.Fi):!a&&b&&(fO(this),Gd(this.Fi, +this.Xh.wc))}}FH(){this.ZL.mr();const a=[];this.Xh.forEach(b=>{b!==this.rh&&a.push(b)});for(let b=0;b{a++});return 1==a}};class iO{constructor(a){this.Nd=a;a instanceof XB&&(this.gG=this.width()/this.height())}V(a){a=a.displayObject();(this.Nd instanceof Element?this.Nd:this.Nd.displayObject()).appendChild(a)}removeChild(a){a=a.displayObject();this.dL(a)&&this.displayObject().removeChild(a)}dL(a){return a.parentNode==this.displayObject()}displayObject(){return this.Nd instanceof Element?this.Nd:this.Nd.displayObject()}ratio(){return this.gG}width(){return this.Nd instanceof Element?this.Nd.offsetWidth:this.Nd.width()}Zb(a){const b= +Math.round(a/this.gG);this.Nd instanceof Element?Nh(this.Nd,a,b):this.Nd.resize(a,b)}height(){return this.Nd instanceof Element?this.Nd.offsetHeight:this.Nd.height()}Kd(a){const b=Math.round(a*this.gG);this.Nd instanceof Element?Nh(this.Nd,b,a):this.Nd.resize(b,a)}resize(a,b){this.Nd instanceof XB&&this.Nd.resize(a||this.Nd.width(),b||this.Nd.height())}zl(a,b){a/b>this.gG?this.resize(a,b):this.Zb(a)}};function jO(a){a.oi(a.R.displayObject())&&a.R.resize(a.width(),a.height());a.qq()}function kO(a,b){"nothing"!=b&&(a.qb||a.pL());a.Se&&a.Se.fa("tool",b);a.qb&&gO(a.qb,b)} +class lO extends P{constructor(a){super({G:"content-area"});this.qb=null;this.F=a.Ba();a=a.view();this.tc=a.Xd();this.B=a.W();z(this,this.B.Bc(),this.ke,this);this.R=new iO(a);z(this,a.Le(),this.kA,this);this.V(this.R.displayObject());B(this,this.R);this.Se=this.cK();this.Uy=[];this.qa=1;this.zN=new cd(this.R.width(),this.R.height())}setScale(a){this.qa=a;jO(this)}FH(){this.qb&&this.qb.FH()}invalidate(a,b){this.Zy=b;this.resize(a.width,a.height)}Fx(){return this.R}kA(a,b,c,d){this.xN=a/this.R.width(); +this.ew=new Xc(c,d);this.qq()}qq(){if(this.qb){this.qb.move(this.ew.x,this.ew.y);const a=this.R.width()/this.zN.width*this.xN;this.qb.setScale(a);this.qb.setParentScale(a)}}ke(){this.Se&&this.eO()}eO(){let a="nothing";this.qb&&(a=this.B.Oa()||this.B.ob()||this.B.fb()?"nothing":this.qb.aO,gO(this.qb,"nothing"));const b=this.B.ma();Cd(this.Se.displayObject());const c=d=>{-1!=d.timestamp().Aa()&&(Pe(this,d.Sb(),c,this),this.qb&&this.Se.V(this.qb),kO(this,a))};this.qb=this.Uy[b];z(this,this.B.Z().Sb(), +c,this);this.qq()}cK(){const a=new P({G:"marker-tool-container"});this.R.V(a);return a}pL(){this.qb=new hO(this.zN.width,this.zN.height);this.Se.V(this.qb);this.qb.setParentScale(this.qa);this.Uy[this.B.ma()]=this.qb;this.qq()}rd(){super.rd();this.R.removeChild(this.Se)}};function mO(a,b,c,d){eu.call(this,a,b,c,d);this.K2=new C;this.q2=new C;this.xT=new C}t(mO,eu);function nO(a,b){a.Cu=b}mO.prototype.cI=function(){this.Cu&&this.Cu.animate(this.coords);this.q2.C()};mO.prototype.K0=function(){};mO.prototype.yl=function(){this.Cu&&this.Cu.animate(this.coords);this.xT.C()};mO.prototype.Ro=function(){this.K2.C();this.Cu&&this.Cu.animate(this.coords)};function oO(a,b){const c=b.displayObject();yi(c,"0 0");a.P.V(c);a.Hq=b}function pO(a,b,c){a.jP=new cd(b,c);a.YE&&a.LE()} +class qO{constructor(a){this.w9=a||!1;this.YE=!1;this.Kk=this.Pp=this.Na=this.Ua=0;this.jP=new cd(0,0);this.Hq=null;this.Qa=!0;this.xf=new MM;this.P=new P({G:"video-container"});this.P.V(this.xf);this.P.fa("force-fit-video",Ib||Jb)}displayObject(){return this.P.displayObject()}visible(){return this.Qa}J(a){this.Qa=a;this.w9?(H(this.displayObject(),a?1:0),F(this.displayObject(),"pointer-events",a?"":"none")):Th(this.displayObject(),a)}width(){return this.Ua}height(){return this.Na}zl(a,b){this.rY(a); +this.Kk=b;this.LE();this.YE=!0}rY(a){this.Pp=a}LE(){const a=this.jP.width/this.jP.height,b=this.Pp;this.resize(Math.round(b),Math.round(this.Pp/this.Kk>a||isNaN(a)?this.Kk:b/a));this.YE=!0}resize(a,b){this.Ua=a;this.Na=b;this.Hq&&this.Hq.resize(a,b);this.P.resize(a,b);this.YE=!1}V(a){a=a.displayObject();this.displayObject().appendChild(a)}removeChild(a){a=a.displayObject();this.dL(a)&&this.displayObject().removeChild(a)}dL(a){return a.parentNode==this.displayObject()}};class rO extends P{constructor({ga:a,G:b,I1:c=!0,rf:d=!0,Ica:e=!0}){super({ga:a,G:b,rf:d});this.x9=c;this.y9=e;this.yE=this.wt=!1;this.p9=E(this)}$a(a,b){super.$a(a,b);this.yE=!0;a=this.wt;const c=this.displayObject().textContent;this.tY(c,Jb||Ib?b+1:b);this.yE=!1;a!=this.wt&&(this.x9&&this.setAttribute("title",this.wt?jt(this.P,"label"):""),this.p9.C())}tY(a,b){function c(){g=f=e)&&(this.wt=!0,this.y9)){var f=Math.floor(b/d.displayObject().scrollHeight*a.length),g="";for(c();d.displayObject().scrollHeight<=b;)f+=10,c();for(;0b;)c(),--f;c()}}}la(a){super.la(a);this.yE||(this.fp(a),this.ub())}gp(){throw Error("html text is not supported");}};function sO(a,b){const c=a instanceof It?a.za():a instanceof P?a.displayObject():a;b&&"slideNavigationSettings"==b.$o()?a instanceof P?a.fa("locked",!0):mn(c,"locked"):a instanceof P?a.fa("locked",!1):nn(c,"locked");b=b&&("presentationNavigationType"!=b.$o()||"presentationSeeking"==b.AQ())&&"quizNavigationSettings"!=b.$o()&&"scenarioNavigationSettings"!=b.$o();a instanceof It||a instanceof P?a.ra(!b):b?c.setAttribute("disabled",""):c.removeAttribute("disabled")};function tO(a){if(a.H.ou){const b=new rO({ga:O(a,"label")});Ht(b,a.I,"PB_CONTROL_PANEL_SLIDE_COUNTER",a.P3.bind(a));return b}return null}function uO(a){if(a.Lj){const b=-1!=a.B.ma()&&a.B.$().visible();a.Lj.J(b);a=a.Lj;a.wL?a.wL():Ga("bindI18nMessage is required")}} +class vO extends P{constructor({ia:a,W:b,settings:c,Ia:d,OI:e}){super({G:"navigation-controls"});this.I=a;this.K=d;this.B=b;this.H=c;this.ze=c.Tg;this.Ly=this.lg=new QL(this.B,this.ze);this.H8=e;(this.Lj=tO(this))&&N(this,this.Lj);(this.Ob=this.Iy())&&N(this,this.Ob);(this.zb=this.Ey())&&N(this,this.zb);z(this,this.B.Z().Sb(),this.wb,this);z(this,this.B.Bc(),this.On,this);z(this,this.I.jh,this.VO,this)}io(a){a&&!this.Ob&&(this.Ob=this.Iy())&&N(this,this.Ob,this.Rl("prevButton"));this.Ob&&this.Ob.J(a)}fo(a){a&& +!this.zb&&(this.zb=this.Ey())&&N(this,this.zb,this.Rl("nextButton"));this.zb&&this.zb.J(a)}$a(){var a=this.B.fb();this.io(this.H.visible&&this.H.Kf||!!a);this.fo(this.H.visible&&this.H.qf||!!a);a=this.H.visible&&this.H.ou;this.Lj?this.Lj.J(a):a&&((this.Lj=tO(this))&&N(this,this.Lj,this.Rl("slidesCounterLabel")),uO(this))}Rl(a){const b=[this.Lj,this.Ob,this.zb].filter(c=>c);switch(a){case "slidesCounterLabel":return b.indexOf(this.Lj);case "prevButton":return b.indexOf(this.Ob);case "nextButton":return b.indexOf(this.zb); +default:return-1}}Ey(){var a=this.B.fb();return this.H.qf||a?(a=new bM({type:"uikit-primary-button",icon:{element:Z(this.K,"chevron_right"),Ie:"right"},text:this.I.ha("PB_CONTROL_PANEL_NEXT")}),Ft(a,O(this,"button")),a.fa("next",!0),z(this,a.ka,this.MM,this),a):null}Iy(){var a=this.B.fb();return this.H.Kf||a?(a=new bM({type:"uikit-secondary-button",icon:{element:Z(this.K,"chevron_left"),Ie:"left"},text:this.I.ha("PB_CONTROL_PANEL_PREV")}),Ft(a,O(this,"button")),a.fa("prev",!0),z(this,a.ka,this.OM, +this),a):null}MM(){this.enabled()&&this.Ly.next()}OM(){this.enabled()&&this.Ly.prev()}On(){uO(this);const a=this.B.fb();if(a){const b=this.B.$();this.Ly=new RL(a.playerController(),this.lg,2==b.Bn);a.setExternalNavigationController(this.Ly)}else this.Ly=this.lg}wb(){if(this.Ob){var a=this.B.gf(this.ze==OL?"switchToPreviousSlide":"switchToPreviousStep");sO(this.Ob,a)}this.zb&&(a=this.B.gf(this.ze==OL?"switchToNextSlide":"switchToNextStep"),sO(this.zb,a));var b=this.B.ob();this.zb&&b&&(a=this.B.$(), +b=b.currentSession().completed(),a="atAnyTime"!=a.um,!b&&a&&this.zb.ra(!1));a=this.B.fb();(this.Ob||this.zb)&&a&&1==this.B.$().navigationType()&&(a=a.playerController(),this.Ob&&this.Ob.ra(this.Ob.enabled()||a.isPrevAvailable()),this.zb&&this.zb.ra(this.zb.enabled()||a.isNextAvailable()))}P3(){let a="-";-1!=this.B.ma()&&this.B.$().visible()&&(a=this.B.$().Ci()+1);return{SLIDE_NUMBER:a,TOTAL_SLIDES:this.H8}}VO(a){switch(a){case "PB_CONTROL_PANEL_NEXT":this.zb&&this.zb.la(this.I.ha(a));break;case "PB_CONTROL_PANEL_PREV":this.Ob&& +this.Ob.la(this.I.ha(a))}}};function wO(a){a.ua.vi(a.displayObject().offsetHeight-2*a.$Z,a.ss.height());a.ua.yx()} +class xO extends P{constructor({G:a,W:b}){super({G:a,rf:!0});this.B=b;this.$Z=0;this.Wn=new P({ga:O(this,"scroll-area")});N(this,this.Wn);this.ss=new P({G:"notes-text"});N(this.Wn,this.ss);a=new P({G:"container-bottom-shadow"});N(this,a);this.ua=new pM({lr:this.Wn,FP:a.displayObject()});B(this,this.ua);this.V(this.ua.Tj());this.gg=null;this.nf("tabpanel");z(this,this.B.Bc(),this.yF,this);-1!=this.B.ma()&&this.yF();wO(this)}$a(a,b){super.$a(a,b);a=Zh(this.displayObject());a=a.top+a.bottom;this.Wn.Kd(this.height()- +a);wO(this)}yF(){var a=this.B.$().pj();this.gg!=a&&(this.gg=a,this.ss.J(!!this.gg),this.gg&&(a=this.gg.pi().replace(//g,"
    "),this.ss.gp(a)),wO(this),this.ua.fi.Nx(0),this.ua.yx())}};class yO extends P{constructor({ga:a,G:b,prompt:c}){super({ga:a,G:b,Yb:"INPUT"});c&&this.setAttribute("placeholder",c);this.SK=!1;this.MD=E(this);x(this,this,"change",()=>{this.MD.C()});this.uL=E(this);x(this,this,"input",()=>{this.uL.C()});this.J3=E(this);x(this,this,"focus",()=>{this.SK=!0;this.J3.C()});this.N2=E(this);x(this,this,"blur",()=>{this.SK=!1;this.N2.C()});x(this,this,"keydown",this.Nv,this)}focused(){return this.SK}value(){return this.displayObject().value}Px(a){a!=this.value()&&(this.displayObject().value= +a)}Nv(a){switch(a.keyCode){case 46:this.focused()&&a.stopPropagation();break;case 13:this.focused()&&this.displayObject().blur()}}};class zO extends P{constructor({selected:a}){super({G:"panel-tab-button",Yb:"BUTTON"});this.fa("chosen",a)}selected(){return this.NH("chosen")}yh(a){this.fa("chosen",a)}}function AO(a){if(a.vd&&!a.Pb||!a.vd&&a.Pb){const b=new P({ga:O(a,"panel-title")}),c=a.Pb?"PB_TAB_OUTLINE_LABEL":"PB_TAB_NOTES_LABEL";b.la(a.I.ha(c));Ht(b,a.I,c);return b}return null} +function BO(a){a.Jj=new P({G:"search-wrapper"});N(a,a.Jj);a.ng=new yO({G:"search-field",prompt:a.I.ha("PB_SEARCH_PANEL_DEFAULT_TEXT")});N(a.Jj,a.ng);const b=new P({G:"clear-button"}),c=new P({za:Z(a.K,"erase_search")});N(b,c);z(a,b.ka,a.m5,a);a.xp=b;N(a.Jj,a.xp);a.De=a.fK();N(a,a.De);z(a,a.ng.uL,a.S3,a)}function CO(a){a.Gc&&a.Gc.J(!a.Xn);a.Pk&&a.Pk.J(!a.Xn);a.De&&a.De.J(!a.Xn);a.Jj&&a.Jj.J(a.Xn);a.ng&&a.ng.J(a.Xn);a.xp&&a.xp.J(a.Xn)} +class DO extends P{constructor({ia:a,mu:b,nu:c,$j:d,Ia:e}){super({G:"outline-panel-header"});this.K=e;this.I=a;this.Xn=!1;this.ig=d;this.bA=E(this);this.VN=E(this);this.xp=this.De=this.ng=this.Jj=null;this.Pb=c;this.vd=b;(this.Gc=this.yp())&&N(this,this.Gc);(this.Pk=AO(this))&&N(this,this.Pk);this.ig.search&&this.Pb&&BO(this);z(this,this.I.jh,this.$i,this);z(this,this.ig.lb,this.OZ,this);CO(this)}tR(a){this.Pb=a}sR(a){this.vd=a}ra(a){super.ra(a);this.ng&&this.ng.ra(a)}OZ(){!this.ig.search||!this.Pb|| +this.ng||this.De||this.xp||this.Jj||BO(this);(!this.ig.search||!this.Pb)&&this.ng&&this.De&&this.xp&&this.Jj&&(Se(this.Jj,this.ng),Se(this.Jj,this.xp),Se(this,this.Jj),Se(this,this.De),this.Jj=this.xp=this.De=this.ng=null,this.Xn=!1);CO(this)}S3(){this.VN.C(this.ng.value())}fK(){const a=new P({G:"search-button"}),b=new P({za:Z(this.K,"search")});N(a,b);z(this,a.ka,this.p6,this);return a}p6(){this.Xn=!0;this.bA.C("outline");CO(this);this.ng.displayObject().focus()}m5(){this.Xn=!1;this.ng.Px("");this.ng.displayObject().blur(); +CO(this);this.VN.C("")}yp(){if(this.Pb&&this.vd){const a=new P({ga:O(this,"switcher")}),b=new zO({selected:!0});Ht(b,this.I,"PB_TAB_OUTLINE_LABEL");N(a,b);const c=new zO({selected:!1});Ht(c,this.I,"PB_TAB_NOTES_LABEL");N(a,c);z(this,this.bA,d=>{b.yh("outline"===d);c.yh("notes"===d)});z(this,b.ka,()=>{this.bA.C("outline")});z(this,c.ka,()=>{this.bA.C("notes")});return a}return null}$i(){this.ng&&this.ng.setAttribute("placeholder",this.I.ha("PB_SEARCH_PANEL_DEFAULT_TEXT"))}};class EO extends wg{constructor(){super();this.hs="";this.OK=E(this)}};class FO extends wg{constructor(a){super();this.P=a;this.oA=E(this);x(this,this.P,"scroll",()=>{this.oA.C()})}scrollY(){return this.P.scrollTop}eI(){return this.oA}Nx(a){this.P.scrollTop=a}}function GO(a,b){Se(a,a.fi);a.fi=b;B(a,a.fi);z(a,a.fi.eI(),()=>{document.body.contains(a.displayObject())&&a.F.If(a.fi.scrollY())})} +function HO(a){const b=IO(a.F);a.Dt.forEach((c,d)=>{0>b.indexOf(d)&&(a.Dt.delete(d),a.sa.removeChild(c),Se(a,c))});for(let c=0;cthis.F.Iq);this.sa.Kd(this.F.ut);this.fi.Nx(this.F.Bb);L(this.sa,"padding-top",this.F.fL+"px");HO(this)}};function IO(a){return a.rb.slice(a.jE,a.jE+a.KU)}function LO(a){a.Bb=wv(a.Bb,0,Math.max(a.ut-a.Iq,0));a.ps()} +class MO extends wg{constructor(){super();this.Ik=this.ut=this.Iq=this.Bb=0;this.rb=[];this.KU=this.jE=this.fL=0;this.MD=E(this)}invalidate(){this.ps()}sQ(){return this.Ik}If(a){void 0!==this.Iq&&this.Bb!=a&&(this.Bb=a,LO(this))}ps(){this.jE=Math.floor(Math.max(0,this.Bb-(Ii?this.Iq:0))/this.Ik);this.fL=this.Ik*this.jE;this.KU=Math.ceil((Math.min(this.ut,this.Bb+this.Iq+(Ii?this.Iq:0))-this.fL)/this.Ik);this.MD.C()}};class NO extends P{constructor(a){super({G:"slide-item-view",xI:!0});this.s4=a}item(){return this.s4}};function OO(a){a.ru()?a=Promise.resolve(a.ru()):(a.id(),a=Promise.resolve(null));return a};function PO(a,b){const c=Math.round(a.width());let d=b.toLocaleLowerCase().indexOf(a.Fh),e=d+a.Fh.length;const f=(g,h)=>`${0{const g=f(d-1,e+1).split(" ");for(let h=0;2>h;++h){let l=c;for(;l&&g.length;){const n=7*g[0].length+4;n<=l?(l-=n,g.shift()):l=0}}return!g.length};f(d,e)!=b&&a();)--d,++e;return{oca:d,Q$:e}} +class QO extends rO{constructor({ga:a,G:b,I1:c}){super({ga:a,G:b,I1:c});this.Fh="";this.BA=0}la(a){if(this.Fh){const b=a.slice(0,this.BA)+a.slice(this.BA).replace(new RegExp(`(${this.Fh})`,"gi"),"$1");this.displayObject().innerHTML=b}else super.la(a);this.yE||(this.fp(a),this.ub())}tY(a,b){if(b){this.wt=!1;var c=this;c.la(a);var d=a.substr(0,this.BA);a=a.substr(this.BA);if(void 0!==b&&this.displayObject().parentNode&&(c.displayObject().style.height="",!(b>=c.displayObject().scrollHeight))){var {oca:e, +Q$:f}=PO(this,a),g=()=>{c.la(`${d}${0{var h=this.Pa,l=!this.Zp.pressed();h.Wy!=l&&(h.Wy=l,h.fE.C())});z(this,this.Pa.fE,this.CU,this);this.CU();this.Zp.J(a.tE&&!g.hs);a.jo&& +(this.Df=new P({ga:O(this,"thumb"),Yb:"IMG"}),WO(this,this.Df),this.Df.J(!1),OO(a.slide()).then(h=>{if(h){const l=An({width:h.width(),height:h.height(),boundingWidth:d,boundingHeight:e,TB:!1});this.Df.resize(l.width,l.height);this.Df.setAttribute("src",h.url().replace(/\\/g,"/"));this.Df.J(!0);this.fa("with-thumbnail",!0)}}));this.me=this.Ky(a);b=WO(this,this.me,"title-container");this.js=new QO({ga:O(this,"title")});this.js.fa("minimized",!a.jo);N(b,this.js);z(this,this.Pa.GS,this.EV,this);this.EV(); +z(this,this.Pa.IS,this.FV,this);this.FV();z(this,g.OK,()=>{this.Zp.J(a.tE&&!g.hs);XO(this);YO(this)});z(this,this.I.jh,this.$i,this);YO(this);XO(this);this.ra(a.enabled());qt(()=>{this.me.visible()?this.me.ub():this.js.ub()})}FV(){this.fa("viewed",this.Pa.hH)}EV(){this.yh(this.Pa.selected())}CU(){this.Zp.Ac(this.Pa.Cm())}Ky(a){const b=new rO({ga:O(this,"title"),Ica:!1});b.fa("minimized",!a.jo);b.la(this.Pd.prefix()+a.title());b.fp(a.title());return b}FJ(a,b,c,d){let e=null,f=null;b.some(g=>{if(0> +g.toLocaleLowerCase().indexOf(a))return!1;e=g;f=`${this.I.ha(d)}
    `+c;return!0});return e&&f?{text:e,Zaa:f}:null}BL(){if(this.sh)if(this.sh.fa("answered",!1),this.mg.submitted()){if(this.Hj.wK||this.Hj.HU){var a=this.mg.review();a=a?a.status():"answered";this.sh.fa("status",a)}}else"allAtOnce"==this.Hj.submitType()&&(a=this.mg.hasBeenVisited()&&(this.mg.submitted()||this.mg.initiated()),this.sh.fa("answered",a));this.yn&&this.yn.fa("with-status",this.mg.submitted())}m4(){this.mg&& +this.yn&&this.yn.J(this.mg.isMarked())}$a(a,b){super.$a(a,b);if(this.sh)if(a=this.sh.P.getBoundingClientRect().width/this.sh.width(),b=this.P.getBoundingClientRect(),this.Df){var c=this.Df.P.getBoundingClientRect(),d=(c.bottom-b.top)/a;this.sh.move((c.left-b.left)/a-this.sh.width()/2,d-this.sh.height()+2)}else{c=this.me.P.getBoundingClientRect();d=(c.top-b.top)/a;const e=c.height/a;this.sh.move((c.left-b.left)/a-this.sh.width()-7,d+(e-this.sh.height())/2)}this.yn&&this.mg&&this.yn.fa("with-status", +this.mg.submitted())}$i(a){"PB_SEARCH_RESULT_IN_TEXT_LABEL"!==a&&"PB_SEARCH_RESULT_IN_NOTES"!==a||YO(this)}};class $O{constructor(){this.L=-1;this.Po=this.text=this.title=0}}var aP={value:1E4,name:"title"},bP={value:100,name:"text"},cP={value:1,name:"notes"};function dP(a){const b=[];for(let c=0;c({id:e.id,slide:e.slide,location:e.location}))} +class gP{a3(a,b){function c(d,e){return d.L>e.L?-1:d.Lb.title?1:a.titleb.text?1:a.textb.Po?1:a.Po{a.enabled()&&!e.defaultPrevented&&(d=b.JC(),void 0!==d?a.Og.slidePoolState().activeSlideIndex()!=d&&a.Og.slidePoolState().setActiveSlideIndex(d):(a.B.pe(b.slide().index()),a.Az()))});return c}function iP(a,b){return Oa(a.Li,c=>c.slide().index()==b)} +function jP(a,b,c,d){if(!(0>c||c>=a.Li.length)){b=b||a.Li[c];var e=kP(a,b.vu());if(e){e.yh(d);if(d)for(e=Number.MAX_VALUE;0<=c;--c){const f=a.Li[c];f.Iva)){a*=b.Ik;var c=a+b.Ik;a>=b.Bb&&c<=b.Bb+b.Iq||(b.Bb=a{0==d.Zc()&&(d=oP(a,b,e,c+"."),a.MJ.push(d),++c)});a.uB.clear();u(a.Li,d=>{a.uB.set(d.vu(),d.state())});u(a.MJ,()=>{})}function pP(a,b){a.Li=[];a.MJ=[];nP(a,b);a.Li.sort((c,d)=>c.id()-d.id());a.Az();a.ps()}function kP(a,b){return a.uB.has(b)?a.uB.get(b):null} +function oP(a,b,c,d,e=!1){var f=[];const g=b[c];for(var h=c+1;hb)return b;a=a.M.ja(b);return a.visible()?a.Ci():-1} +class rP extends KO{constructor(a,b,c,d,e,f){const g=a.Qo,h=a.Mo,l=a.lp,n=a.locked,m=a.lj,p=a.sQ,r=a.Daa,v=a.Caa,y=a.LR,D=a.KR,I=new MO;a=new P;super({rf:!0,G:"treecontrol",Ba:I,u$:a});B(this,I);N(this,a);this.Tf=n;this.fa("locked",this.Tf);this.M=b;this.B=c;this.zk=d;this.Og=this.xb=null;this.Bs=m;this.jo=l;this.Kp=h;this.WG=!1;this.hO=g;this.I=e;this.K=f;this.Ik=p;this.u4=r;this.t4=v;this.a9=y;this.Z8=D;this.uB=new Map;this.qO=new Map;this.Li=[];this.MJ=[];this.gi=0;this.pG=null;z(this,this.zk.OK, +this.ps,this);this.GE();z(this,c.Bc(),this.HQ,this);z(this,b.UY,this.D6,this);this.fa("highlight-viewed",this.Kp);b=new P({G:"container-bottom-shadow"});N(this,b);this.ua=new pM({lr:a,FP:b.displayObject()});B(this,this.ua);this.V(this.ua.Tj());(b=this.ua.fi)&&GO(this,b);Et(a,{height:"inherit"})}ri(){return 0==this.F.ut}D6(a){if(a=iP(this,a))a=a.state(),1!=a.hH&&(a.hH=!0,a.IS.C())}reset(){}ps(){const a=[];if(this.zk.hs){var b=fP(this.M,this.zk.hs);for(var c of b)b=c.slide.index(),b=iP(this,b),b.state().jZ= +c.location,a.push(b)}else{c=Number.MAX_VALUE;for(b of this.Li){const d=kP(this,b.vu());b.Iv<=c&&d&&(a.push(b),c=d.Cm()?Number.MAX_VALUE:b.Iv)}}c=this.F;if(b=this.jo?this.u4:this.Ik)c.Ik=b;c.rb=a;c.ut=c.Ik*a.length;c.ps();this.KE()}lv(a){pP(this,a)}GE(){const a=this.Og&&"completed"!=this.Og.sessionMode()&&this.Og.slidePoolState().slides(),b=qP(this),c=[];for(let e=0;e{const n=h.slide().description().text(),m=this.xb.skinSettings().questionListInfo().displayQuestionStatus(),p="free"==this.xb.navigationType(),r=this.Og.settings().submitType(),v="reviewing"==this.Og.sessionMode();c.push(new SO(n,g+1,f,l,p,new RO(h,m,r,v)))})}}this.lv(c);this.Az()}HQ(){Ue(this,this.xb);(this.xb=this.B.Oa())&&z(this,this.xb.currentSessionChangedEvent(),this.lW,this);this.lW(); +this.Az()}jA(){super.jA();this.ua.setParentScale(this.Os)}lW(){const a=this.Og,b=this.B.Oa();this.Og=this.B.$().visible()&&b&&b.skinSettings().questionListInfo().showSlideList()?b.currentSession()&&b.currentSession().started()?b.currentSession():null:null;a!=this.Og&&(a&&Ue(this,a,a.slidePoolState()),this.GE(),this.Og&&(z(this,this.Og.slidePoolState().activeSlideChangedEvent(),this.Az,this),z(this,this.Og.sessionModeChangedEvent(),this.GE,this)))}Az(){const a=qP(this);if(this.Og&&"completed"!=this.Og.sessionMode()){const b= +this.Og.slidePoolState().activeSlideIndex()+1;mP(this,this.Li[a+b],a+b)}else mP(this,this.Li[a],a)}$a(a,b){super.$a(a,b);this.KE();lP(this)}KE(){const a=this.height();this.ua&&a&&this.ua.vi(a,this.F.ut)}};function sP(a){return a.H.search?(a=new P({G:"search-result"}),a.J(!1),a):null}function tP(a){if(a.Tk&&a.Tk.visible()){const b=a.vo.ri();a.Tk.la(a.I.ha(b?"PB_SEARCH_NO_RESULTS_LABEL":"PB_SEARCH_RESULTS_LABEL"));a.Tk.fa("no-results",b)}} +class uP extends P{constructor(a,b,c,d,e){super({G:"outline",rf:!0});this.nf("tabpanel");this.M=a;this.B=b;this.H=c;this.I=d;this.K=e;(this.Tk=sP(this))&&N(this,this.Tk);this.zk=new EO;this.vo=new rP({locked:this.H.locked,lj:this.H.lj,Qo:this.H.Qo,lp:this.H.lp,Mo:this.H.Mo,sQ:60,Daa:76,Caa:20,KR:56,LR:120},a,b,this.zk,this.I,this.K);N(this,this.vo);z(this,this.B.Bc(),this.yF,this);z(this,this.H.lb,this.T5,this);z(this,this.I.jh,this.$i,this)}invalidate(){Ga("deprecated");this.ub()}T5(){this.H.search&& +!this.Tk&&(this.Tk=sP(this))&&N(this,this.Tk,0);var a=this.vo,b=this.H.lp,c=this.H.Qo,d=this.H.Mo,e=this.H.lj;if(b!==a.jo||c!==a.hO||e!==a.Bs)a.jo=b,a.hO=c,a.Bs=e,a.qO.clear(),a.GE();a.Kp!==d&&(a.Kp=d,a.fa("highlight-viewed",a.Kp))}yF(){for(let f=0;fc.KA===b?(Se(a,c),!1):!0)}function FP(a,b,c,d){GP(a,b,c,d);c.Hf(0);c.O0();a.Ab.V(c);a.Zg=c;a.vY="top"===d.Om;a.jX.C()}function HP(a,b,c,d={Om:"top",align:"center"}){CP(a);b&&(b=a.YF.find(e=>e.KA===c))&&FP(a,c,b,d)} +function EP(a){if(a.qh){var b=150;1==a.qh.Rc&&(b*=a.LK.progress,a.qh.stop(!1),a.qh.Xc());var c=Sh(a.Zg.displayObject());"number"!==typeof c&&(c=1);var d=Dh(a.Zg.displayObject(),"top");d=Number(d.substr(0,d.length-2));a.qh=new zP;var e=new BC(a.Zg.displayObject(),c,0,b);a.qh.add(e);c=[a.Zv.x,d];d=[a.Zv.x,a.Zv.y+(a.vY?10:-10)];b=new AC(a.Zg.displayObject(),c,d,b);a.qh.add(b);a.qh.play();var f=a.Zg,g=()=>{e.hD("finish",g,!1,a);e.hD("stop",g,!1,a);a.Ab.removeChild(f)};e.wl("finish",g,!1,a);e.wl("stop", +g,!1,a);a.Zg=void 0;a.QS.C()}}function IP(a,b){!a.Zg||Md(a.Zg.displayObject(),b)||Md(a.Zg.KA,b)||CP(a)} +function GP(a,b,c,d){Gi(()=>{c.dR(1,a.Kk);var e="top"===d.Om?a.cJ:a.tJ,f=JP(a,b,c,d.align);const g=b.getBoundingClientRect(),h=a.Ab.displayObject().getBoundingClientRect(),{x:l,y:n}=KP(a,new Xc(f,(g.top-h.top)/e),c,{relativeElement:b,Om:d.Om||"top",eba:0});a.Zv=new Xc(l,n);e=c.displayObject();f=d.Om||"bottom";a.qh&&(a.qh.stop(!1),a.qh.Xc());a.qh=new zP;a.LK=new BC(e,0,1,150);a.qh.add(a.LK);e=new AC(e,[l,n+("top"===f?10:-10)],[l,n],150);a.qh.add(e);a.qh.play()})} +function JP(a,b,c,d="center"){if(void 0!==c.Zv)c=c.Zv;else a:{b=b.getBoundingClientRect();a=a.Ab.displayObject().getBoundingClientRect();a=b.left-a.left;const e=a+b.width;b=a+b.width/2;switch(d){case "center":c=b-c.width()/2;break a;case "left":c=a;break a;case "right":c=e-c.width();break a;default:throw Error(`unknown horizontal align: ${d}`);}}return c} +function KP(a,b,c,{relativeElement:d,Om:e,eba:f}){e="top"===e;let g=b.x;b=b.y;d=d.getBoundingClientRect();const h=e?a.cJ:a.tJ,l=Ii?Math.min(1,a.Kk/c.height()):h;c.dR(l,a.Kk);yi(c.displayObject(),"0 0");b=e?b-(c.height()+(6+f)*l):b+(d.height/h+(12+f));g+=(h-l)*c.width()/2;g=Math.round(wv(g,a.QU*h,a.WX*h-c.width()*l));b=Math.round(b*h);e&&(b+=Math.round((h-l)*c.height()));return new Xc(g,b)} +class LP extends wg{constructor(a){super();this.Ab=a;this.YF=[];this.Zg=void 0;this.tJ=this.cJ=this.Kk=this.WX=this.QU=0;this.qh=null;this.vY=!0;this.LK=this.Zv=void 0;this.QS=E(this);this.jX=E(this);x(this,document,Km,this.zM,this,Nm);x(this,document,"keydown",this.Nv,this,!0);x(this,document,"focus",this.v5,this,!0)}So(){return this.QS}zl(a,b,c){this.QU=a;this.WX=b;this.Kk=c}setScale(a,b){this.tJ=a;this.cJ=b}createPopup(a,b,c){a=new AP(a);a.Lx(b);a.fa(c,!0);BP(this,a);return a}zM(a){this.Zg&&IP(this, +a.target)}Nv(a){this.Zg&&27==a.keyCode&&(a=this.Zg.KA,CP(this),a.focus())}v5(a){Ib&&a.target==document.body||this.Zg&&IP(this,a.target)}};class MP extends bM{constructor({Ia:a,nj:b}){super({type:"uikit-primary-button",icon:{element:Z(a,"outline"),Ie:"left"}});this.KX=E(this);z(this,this.ka,this.lz,this);z(this,b.So(),this.Mv,this)}lz(){this.Ac(!this.Rn);this.KX.C(this.Rn)}Mv(){this.Ac(!1)}};class NP extends bM{constructor({Ia:a,W:b,slides:c}){super({type:"uikit-primary-button",icon:{element:Z(a,"play"),Ie:"left"}});this.K=a;this.B=b;this.M=c;this.iN=!1;z(this,this.ka,this.lz,this);-1==this.B.ma()&&(this.ra(!1),Qe(this,this.B.Bc(),()=>{this.ra(!0)}));z(this,this.B.Z().Cc(),this.yz,this);z(this,this.B.Z().Sb(),this.wb,this);this.yz()}lz(){const a=this.B.Z().state();"stopped"===a||"suspended"===a?this.B.play():this.B.pause()}wb(){if(-1!=this.B.ma()){var a=this.B.$(),b=a.startTime()+a.duration(); +const c=this.M.mi(this.B.Z().timestamp());a=a.type();"interaction"!=a&&"quiz"!=a&&"scenario"!=a||c!=b?(b=this.B.gf("playPauseControl"),sO(this,b)):this.ra(!1)}}yz(){var a=this.B.Z().state();a=!("started"==a||"buffering"==a);if(this.iN!=a){const b=Z(this.K,a?"play":"pause");this.Tm(b);this.iN=!this.iN}a||sO(this,null)}};function OP(a){a.Ac(!1);HP(a.Ja,!1,a.displayObject(),a.sT)}class PP extends bM{constructor({j$:a,N$:b,nj:c,O$:d}){super({icon:a.icon,type:a.type,size:a.size,text:a.text,toggle:!0});this.Ja=c;this.z3=b;this.sT=d;this.Ja.createPopup(this.displayObject(),this.z3,"");z(this,this.ka,this.lz,this);z(this,this.Ja.So(),()=>this.Ac(!1))}lz(){this.Ac(!this.Rn);HP(this.Ja,this.Rn,this.displayObject(),this.sT)}};function QP(a,b){return b?(Ft(b,O(a,"value")),b):null}class RP extends P{constructor({id:a,icon:b,textContent:c,value:d,H_:e=!0}){super({G:"menu-base-item"});this.$b=a;(this.Fc=this.jn(b))&&N(this,this.Fc);b=new P({ga:O(this,"label")});b.la(c);this.ss=b;N(this,this.ss);(this.At=QP(this,d))&&N(this,this.At);this.fa(a,!0);this.fa("clickable",e)}get id(){return this.$b}Px(a){this.At&&Se(this,this.At);(this.At=QP(this,a))&&N(this,this.At,2)}jn(a){return new P({za:a,ga:O(this,"icon")})}} +function SP(a,b,c){a.rb.has(b)&&c(a.rb.get(b))}function TP(a,b,c){SP(a,b,d=>d.J(c))}function UP(a,b,c){SP(a,b,d=>{Se(d,d.Fc);d.Fc=d.jn(c);N(d,d.Fc,0)})}function VP(a,b,c){SP(a,b,d=>{d.ss.la(c)})}class WP extends P{constructor(){super({G:"menu-base"});this.rb=new Map;this.jV=E(this)}GC(){return this.jV}Uw({id:a,textContent:b,icon:c,value:d,H_:e}){if(!this.rb.has(a)){const f=new RP({id:a,textContent:b,icon:c,value:d,H_:e});this.rb.set(a,f);N(this,f);z(this,f.ka,()=>this.jV.C(f.id))}}};function XP(a,b){a.YA&&UP(a,a.YA,(new P).displayObject());a.YA=b;a.YA&&UP(a,a.YA,a.b9)}function YP(a,{id:b,value:c}){a.Uw({id:b,textContent:c,icon:(new P).displayObject()})}class ZP extends WP{constructor({Ia:a}){super();this.YA=null;this.b9=Z(a,"tick")}};function $P(a,b){const c=new P({ga:O(a,"caption")});Ht(c,b,a.R2);return c}function aQ(a,b,c){const d=new ZP({Ia:b});a.F7.forEach((e,f)=>{YP(d,{id:String(e),value:f})});z(a,c.jh,e=>{e==a.gT&&(e=c.ha(e),VP(d,"1",e))});return d} +class bQ extends P{constructor(a,b){super({G:"rate-menu"});this.gT="PB_RATE_MENU_DEFAULT_RATE";this.R2="PB_RATE_MENU_CAPTION";this.F7=new Map(xg.map(d=>{const e=String(d);return 1===d?[a.ha(this.gT),e]:[e,e]}));var c=$P(this,a);N(this,c);c=new P({ga:O(this,"delimiter")});N(this,c);this.oG=aQ(this,b,a);N(this,this.oG)}GC(){return this.oG.GC()}};function cQ(a,b,c){b=b instanceof P?b:new P({za:b});Ft(b,O(a,"collapsed"===c?"collapsed-component":"expanded-component"));N(a,b)}function dQ(a){a.NH("active")||a.fa("collapsed",!0)}class eQ extends P{constructor({q$:a,X$:b}){super({G:"uikit-collapsed-control"});cQ(this,a,"collapsed");cQ(this,b,"expanded");x(this,this.displayObject(),"mouseenter",()=>{this.fa("collapsed",!1)});x(this,this.displayObject(),"mouseleave",()=>dQ(this));dQ(this)}};class fQ extends P{constructor({ga:a,volume:b}){super({ga:a,HH:!0});this.setVolume(b)}setVolume(a){this.wo(a)}wo(a){L(this,"left",`${Math.round(100*a)}%`)}};var gQ=class extends P{constructor(){super({G:"volume-slider"});this.He=1;this.ql=E(this);this.An=!1;this.Sp=E(this);this.rp=new P({ga:O(this,"background")});N(this,this.rp);this.h_=new P({ga:O(this,"volume")});N(this,this.h_);this.HO=new P({ga:O(this,"track")});N(this,this.HO);this.La=new fQ({ga:O(this,"thumb"),volume:this.He});N(this.HO,this.La);this.yT=new P({ga:O(this,"enlarged-click-area")});N(this,this.yT);this.Sy=E(this);this.Ry=E(this);x(this,this.yT.displayObject(),Km,this.G6,this,Nm);this.wo()}Um(){return this.ql}Cx(){return this.Sp}setVolume(a){this.He!== +a&&(this.He=a,this.ql.C(a),this.wo())}volume(){return this.He}hu(a){this.An!==a&&(this.An=a,this.Sp.C(a),this.wo())}muted(){return this.An}G6(a){this.Sy.C();this.DM(a);x(this,document,Mm,this.DM,this);x(this,document,Lm,this.LV,this)}DM(a){a=a.clientX-this.displayObject().getBoundingClientRect().x;const b=this.HO.width();a=parseFloat(wv(wv(a,0,b)/b,0,1).toFixed(2));isNaN(a)||(this.hu(!1),this.setVolume(a))}LV(){this.Ry.C();Ne(this,document,Mm,this.DM,this);Ne(this,document,Lm,this.LV,this)}wo(){const a= +this.An?0:this.He;L(this.h_,"width",`${Math.round(100*a)}%`);this.La.setVolume(a)}};class hQ extends P{constructor(){super({G:"volume-slider-wrapper"});this.ql=E(this);this.Sp=E(this);this.Sy=E(this);this.Ry=E(this);this.wd=new gQ;df(this.wd.Um(),this.ql);df(this.wd.Cx(),this.Sp);df(this.wd.Sy,this.Sy);df(this.wd.Ry,this.Ry);N(this,this.wd)}Um(){return this.ql}Cx(){return this.Sp}setVolume(a){this.wd.setVolume(a)}volume(){return this.wd.volume()}hu(a){this.wd.hu(a)}muted(){return this.wd.muted()}} +class iQ extends P{constructor({TR:a}){super();a=this.jn(a.high);N(this,a)}Tm(a){this.Zo();a=this.jn(a);N(this,a)}jn(a){return new P({za:a})}}function jQ(a){const b=a.ZK(a.wd.volume(),a.wd.muted());a.g_.Tm(b)} +class kQ extends eQ{constructor({TR:a}){const b=new hQ,c=new iQ({TR:a});super({q$:c,X$:b});this.qP=a;this.ql=E(this);this.Sp=E(this);this.wd=b;df(this.wd.Um(),this.ql);df(this.wd.Cx(),this.Sp);this.g_=c;z(this,this.g_.ka,this.a7,this);z(this,this.wd.Sy,this.u5,this);z(this,this.wd.Ry,this.t5,this)}setVolume(a){this.wd.setVolume(a);jQ(this)}hu(a){this.wd.hu(a);jQ(this)}Um(){return this.ql}Cx(){return this.Sp}a7(){this.hu(!this.wd.muted())}u5(){this.fa("active",!0)}t5(){this.fa("active",!1)}ZK(a,b){if(0=== +a||b)return this.qP.Zj;if(0=a)return this.qP.Qaa;if(.5=a)return this.qP.high;throw Error(`incorrect volume ${a}`);}};const lQ=["volume","fullscreen"];function mQ(a){a.P.Zo();a.Xm.filter(b=>lQ.includes(b.type)).forEach(b=>a.P.V(b.Tj));nQ(a)}function oQ(a){a.P.Zo();3a.P.V(b.Tj));nQ(a)}function nQ(a){a.yS.C(new Map(a.Xm.map(b=>[b.type,a.P.oi(b.Tj)])))}function pQ(a){var b=3;--b;for(let c=0;c=b);++c)a.P.V(a.Xm[c].Tj);a.P.V(a.Dv.Tj)} +var qQ=class extends wg{constructor(a){super();this.P=a;this.Xm=[];this.Dv=null;this.yS=E(this)}get l$(){return this.yS}vP(a){"more"==a.type?this.Dv=a:this.Xm.push(a)}Dg(a){a?mQ(this):oQ(this)}};function rQ(a,b,c,d){b.includes("replay")&&a.zs.Uw({id:"replay",textContent:c.ha("PB_CONTROL_PANEL_REPLAY"),icon:Z(d,"replay")});b.includes("fullscreen")&&a.zs.Uw({id:"fullscreen",textContent:c.ha("PB_CONTROL_PANEL_FULL_SCREEN"),icon:Z(d,"fullscreen")});b.includes("volume")&&(a.wd=sQ(a),a.zs.Uw({id:"volume",textContent:c.ha("PB_CONTROL_PANEL_VOLUME_CONTROL"),icon:Z(d,"volume_high"),value:a.wd}))}function sQ(a){const b=new gQ;z(a,b.Um(),c=>a.Wb.setVolume(c));return b} +var tQ=class extends P{constructor({Baa:a,ia:b,Ia:c,soundController:d}){super({G:"more-menu-popup"});this.zs=new WP;N(this,this.zs);this.Wb=d;this.wd=null;rQ(this,a,b,c);z(this,b.jh,()=>{VP(this.zs,"volume",b.ha("PB_CONTROL_PANEL_VOLUME_CONTROL"));VP(this.zs,"replay",b.ha("PB_CONTROL_PANEL_REPLAY"))})}get Ke(){return this.zs}};const uQ=["replay","fullscreen","volume"];function vQ(a,b,c){a.QD.vP({type:c,Tj:b})} +function wQ(a){a.Sk||(a.Sk=a.eK());if(!a.gd){if(a.H.Zd&&a.Sk){var b=a.Qi.playbackRate();b=xQ(a,Z(a.K,`rate-${b}x`),a.Sk)}else b=null;a.gd=b}a.Or||(a.Or=yQ(a));a.iG||(a.H.Rx?(b=a.Oe(Z(a.K,"replay")),z(a,b.ka,a.iW,a)):b=null,a.iG=b);a.Gp||(a.Gp=a.XJ());a.Jq||(a.Jq=zQ(a));b=a.QD;b.Xm.splice(0,b.Xm.length);a.H.Zd&&a.gd&&vQ(a,a.gd,"rate");a.H.Bl&&a.Or&&vQ(a,a.Or,"cc");a.H.Rx&&a.iG&&vQ(a,a.iG,"replay");a.H.jp&&a.Gp&&vQ(a,a.Gp,"fullscreen");a.H.sr&&a.Jq&&vQ(a,a.Jq,"volume")} +function yQ(a){if(a.H.Bl){const b=a.Oe(AQ(a));z(a,b.ka,a.n5,a);z(a,a.tk.Ay,()=>{a.Or&&a.Or.Tm(AQ(a))});return b}return null}function zQ(a){if(a.H.sr){const b=new kQ({TR:{Zj:Z(a.K,"volume_mute"),Qaa:Z(a.K,"volume_middle"),high:Z(a.K,"volume_high")}});Ft(b,O(a,"collapsable-button"));z(a,b.Um(),c=>a.Wb.setVolume(c));z(a,b.Cx(),c=>a.Wb.Zj(c));return B(a,b)}return null}function AQ(a){return a.tk.$c.visible()?Z(a.K,"cc_on"):Z(a.K,"cc")} +function xQ(a,b,c,d){b=new PP({j$:{type:"uikit-secondary-button",icon:{Ie:"left",element:b}},nj:a.Ja,N$:c,O$:{Om:"top",align:d}});Ft(b,O(a,"collapsable-button"));return B(a,b)}function BQ(a){if(a.Sk){var b=a.Qi.playbackRate();XP(a.Sk.oG,String(b))}}function CQ(a){var b=a.ZK(a.Wb.volume(),a.Wb.muted());UP(a.As.Ke,"volume",b);b=a.As;a=a.Wb.volume();b.wd&&b.wd.setVolume(a)} +function DQ(a){const b=iC()?"PB_CONTROL_PANEL_EXIT_FULL_SCREEN":"PB_CONTROL_PANEL_FULL_SCREEN";VP(a.As.Ke,"fullscreen",a.I.ha(b));UP(a.As.Ke,"fullscreen",EQ(a))}function EQ(a){return iC()?Z(a.K,"exit_fullscreen"):Z(a.K,"fullscreen")}function FQ(a){z(a,a.Wb.A0(),()=>{a.Jq&&a.Jq.hu(a.Wb.muted())});z(a,a.Wb.Um(),()=>{a.Jq&&(a.Jq.setVolume(a.Wb.volume()),CQ(a))})}function GQ(a){z(a,a.Qi.Rk,()=>{BQ(a);if(a.gd){var b=a.Qi.playbackRate();b=Z(a.K,`rate-${b}x`);a.gd.Tm(b)}})} +function HQ(a){z(a,a.Hg.UK,()=>{a.Gp&&(a.Gp.Tm(EQ(a)),DQ(a))})}function IQ(a){z(a,a.I.jh,()=>{DQ(a)})} +class JQ extends P{constructor({settings:a,nj:b,soundController:c,zba:d,ia:e,Uj:f,Xw:g,Ia:h}){super({G:"collapsable-buttons-group"});this.H=a;this.Ja=b;this.Wb=c;this.r7=d;this.I=e;this.Hg=f;this.tk=g;this.K=h;this.nV=!1;this.Qi=d.Wo();this.QD=new qQ(this);this.iG=this.Gp=this.Jq=this.Or=this.gd=this.Sk=null;a=new tQ({Baa:uQ,ia:this.I,Ia:this.K,soundController:this.Wb});z(this,a.Ke.GC(),this.N5,this);this.As=a;B(this,this.As);this.Dv=xQ(this,Z(this.K,"more"),this.As,"left");vQ(this,this.Dv,"more"); +wQ(this);FQ(this);GQ(this);HQ(this);z(this,this.QD.l$,this.l5,this);IQ(this);BQ(this);CQ(this);DQ(this)}kR(a){this.nV=a;this.$a()}xt(){!this.H.Bl&&this.tk.$c.visible()&&KQ(this.tk)}$a(){this.gd&&this.gd.Rn&&OP(this.gd);this.Dv.Rn&&OP(this.Dv);this.QD.Dg(this.nV)}XJ(){if(this.H.jp&&jC()){const a=this.Oe(Z(this.K,"fullscreen"));z(this,a.ka,this.ES,this);return a}return null}n5(){this.enabled()&&this.Or&&(this.tk.$c.visible()?KQ(this.tk):this.tk.h1())}eK(){if(this.H.Zd){const a=new bQ(this.I,this.K); +z(this,a.GC(),this.PM,this);return a}return null}PM(a){this.Qi.jk(Number(a));CP(this.Ja)}N5(a){switch(a){case "replay":CP(this.Ja);this.iW();break;case "fullscreen":this.ES()}}ZK(a,b){if(0===a||b)return Z(this.K,"volume_mute");if(0=a)return Z(this.K,"volume_middle");if(.5=a)return Z(this.K,"volume_high");throw Error(`incorrect volume ${a}`);}Oe(a){a=new bM({type:"uikit-secondary-button",icon:{Ie:"left",element:a}});Ft(a,O(this,"collapsable-button"));return B(this,a)}l5(a){(new Map(uQ.map(b=> +[b,a.has(b)?!a.get(b):!1]))).forEach((b,c)=>TP(this.As.Ke,c,b))}ES(){jC()&&(iC()?hC():gC())}iW(){this.enabled()&&this.r7.YQ()}};class LQ extends AP{dR(a,b){const c=this.content();b/=a;c&&c.Kd(b);this.Kd(b);this.ub();wn(this.displayObject(),a)}};class MQ extends LQ{constructor(a,b){super(a);this.Ub=b;this.Lx(this.Ub)}O0(){var a=this.Ub.Ls;a.vo&&lP(a.vo)}};function NQ(a){if(a.Kl.showOutline){const b=new MP({Ia:a.K,nj:a.Ja});Ft(b,O(a,"outline-button"));z(a,b.KX,a.iO,a);a.Ub=new xP({mu:!1,nu:!0,$j:a.ig,Ia:a.K,ia:a.I,W:a.B,slides:a.M});a.KF=new MQ(b.displayObject(),a.Ub);a.KF.fa("outline-popup",!0);BP(a.Ja,a.KF);return b}return null}function OQ(a){return PQ(a)?new JQ({settings:a.Kl,nj:a.Ja,soundController:a.Wb,zba:a.B,ia:a.I,Uj:a.Hg,Xw:a.tk,Ia:a.K}):null}function PQ(a){return a.Kl.Rx||a.Kl.sr||a.Kl.Bl||a.Kl.Zd||a.Kl.jp} +class QQ extends P{constructor({v$:a,$j:b,nj:c,ia:d,Ia:e,W:f,slides:g,Uj:h,soundController:l,Xw:n}){super({G:"play-controls-container"});this.Kl=a;this.B=f;this.Ja=c;this.I=d;this.K=e;this.M=g;this.Hg=h;this.Wb=l;this.tk=n;this.ig=b;this.mq=this.KF=this.Ub=null;this.Mk=NQ(this);this.fc=this.Gy();this.Dh=OQ(this);this.Mk&&N(this,this.Mk);this.fc&&N(this,this.fc);this.Dh&&N(this,this.Dh)}BI(a){this.KF&&this.Ub&&this.Ub.resize(void 0,a)}ra(a){this.Dh&&this.Dh.ra(a)}kR(a){this.fc&&this.fc.J(!a);this.Dh&& +this.Dh.kR(a)}$a(){var a=this.Kl.Jf;a&&!this.fc&&(this.fc=this.Gy())&&N(this,this.fc,this.Rl("playButton"));this.fc&&this.fc.J(a);(a=this.Kl.showOutline)&&!this.Mk&&(this.Mk=NQ(this))&&N(this,this.Mk,this.Rl("outlineButton"));this.Mk&&this.Mk.J(a);PQ(this)&&!this.Dh&&(this.Dh=OQ(this))&&N(this,this.Dh,this.Rl("collapsableButtons"));this.Dh&&(a=this.Dh,wQ(a),a.$a(),a.xt(),BQ(a),CQ(a),DQ(a))}Rl(a){const b=[this.Mk,this.fc,this.Dh].filter(c=>c);switch(a){case "outlineButton":return b.indexOf(this.Mk); +case "playButton":return b.indexOf(this.fc);case "collapsableButtons":return b.indexOf(this.Dh);default:return-1}}Gy(){if(this.Kl.Jf){const a=new NP({Ia:this.K,W:this.B,slides:this.M});Ft(a,O(this,"play-pause-button"));return a}return null}iO(a){HP(this.Ja,a,this.Mk.displayObject())}};function SQ(a){let b=!1,c=!1,d=!1;for(let e=0;e=a?"":b.I.ha("PB_CONTROL_PANEL_NEXT"),b.zb.la(a))}}Dy(){var a=this.H.visible&&(this.H.qf||this.H.Kf||this.H.ou);return this.oz||a?(a=new vO({ia:this.I,W:this.B,Ia:this.K,settings:this.H,OI:this.M.np()}),Ft(a,O(this,"navigation-controls")),a):null}$a(){rR(this);sR(this)}On(){var a=this.B.fb();const b=this.B.ob();a=!!a||!!b;sR(this);this.vf&&this.vf.kR(a);this.vf&&(a=this.vf,a.mq&&DP(a.Ja,a.mq.relativeElement),a.mq=null)}};class wR extends P{constructor({Yb:a,ga:b}){super({Yb:a,ga:b});this.vK=!1;x(this,this.displayObject(),he,()=>{this.vK&&this.J(!1)})}show(){this.J(!0);this.vK=!1;requestAnimationFrame(()=>{Et(this,{opacity:1})})}Oc(){this.vK=!0;requestAnimationFrame(()=>{Et(this,{opacity:0})})}} +class xR extends P{constructor(){super({G:"progress-tooltip"});this.uv=0;this.JO=this.PG=!1;var a=new wR({Yb:"img",ga:O(this,"thumbnail-tooltip")});a.Oc();this.Hw=a;N(this,this.Hw);a=new wR({ga:O(this,"timing-tooltip")});a.Oc();this.Iw=a;N(this,this.Iw)}show(){this.PG&&this.Hw.show();this.JO&&this.Iw.show()}Oc(){this.Hw&&this.Hw.Oc();this.Iw&&this.Iw.Oc()}};function yR(a,b,c,d,e){if(2!=b.length||2!=c.length)throw Error("Start and end points must be 2D");zC.call(this,null,b,c,d,e);this.j8=a}t(yR,zC);yR.prototype.mp=function(){this.j8(this.coords[0],this.coords[1])};function zR(a){const b=d=>1-Math.pow(1-d,2),c=d=>{a.qa=d;a.Ef()};Gi(()=>{var d=6/a.height(),e=new yR(c,[d,d],[1,1],200,b);const f=new FC(a.displayObject(),200);a.rt=new zP;a.rt.add(e);a.rt.add(f);d=new yR(c,[1,1],[d,d],400,b);e=new EC(a.displayObject(),400);a.st=new zP;a.st.add(d);a.st.add(e)},a)} +class AR extends P{constructor(a){super();this.rM=0;this.qa=1;this.to=this.st=this.rt=null;(Ii||sj)&&a||this.Hf(0);sj||(zR(this),this.to=new jh(500),this.to.wl("tick",this.I6,!1,this))}offset(){return this.rM}ra(a){Ii&&!sj?a?this.show():this.Oc():sj&&this.Hf(a?1:0)}show(){this.to&&this.st&&this.rt&&(this.to.enabled?this.to.stop():(this.st.stop(),1!=Dh(this.displayObject(),"opacity")&&this.rt.play()))}Oc(){var a;if(a=this.to)a=Sh(this.displayObject()),a=0!==("number"===typeof a?a:1);a&&this.to.start()}Ef(){const a= +new gm;a.translate(this.rM,0);a.scale(this.qa,this.qa);on(this.displayObject(),a)}I6(){this.to&&this.st&&this.rt&&(this.to.stop(),this.rt.stop(),this.st.play())}};function BR(a){a=a.toString();1==a.length&&(a="0"+a);return a};class CR extends wg{constructor(a){super();this.b3=a;this.HL=!1;this.$X=E(this);this.rV=E(this);this.ZX=E(this);a.forEach(b=>{x(this,b,"mouseover",this.Xp,this);x(this,b,Mm,this.wF,this);x(this,b,"mouseout",this.Vl,this)},this)}Xp(a){this.HL||(this.HL=!0,this.$X.C(a))}wF(a){this.rV.C(a)}Vl(a){-1==Ia(this.b3,a.relatedTarget)&&(this.HL=!1,this.ZX.C(a))}};function DR(a,b){Ii||(b?(z(a,a.kG.$X,a.j6,a),z(a,a.kG.rV,a.Q5,a),z(a,a.kG.ZX,a.i6,a)):a.Mr(a.kG))}function ER(a){L(a,"cursor",a.WA?"pointer":"default")}function FR(a){return a.B.$().nb().duration()}function GR(a,b){const c=a.displayObject().getBoundingClientRect();a=Lh(b,a.displayObject());return Vc(a.x/c.width,0,1)}function HR(a,b){b=a.M.Io(b*a.M.wu(),!1,!0);a=a.M.ja(b.L());return OO(a)} +function IR(a,b){b=b.target===a.La.displayObject()?a.La.offset():b.offsetX;var c=a.width(),d=b/c;a.H.mode===ML&&JR(a,d);if(a.H.rr){d="slideTimeline"===a.H.mode?d*FR(a):d*a.M.wu();d=Math.round(d);if(3600<=d){const e=Math.floor(d/3600);d-=3600*e;d=e+":"+BR(Math.floor(d/60))+":"+BR(d%60)}else d=Math.floor(d/60)+":"+BR(d%60);a.kq.Iw.la(d)}a=a.kq;a.uv=b-a.width()/2;d=a.PG?a.Hw.width():a.Iw.width();c-=b+d/2;b-=d/2;0>c&&(a.uv-=Math.abs(c));0>b&&(a.uv+=Math.abs(b));L(a,"left",`${a.uv}px`)} +function JR(a,b){HR(a,b).then(c=>{c=c.url();a.kq.Hw.setAttribute("src",c)})} +class KR extends P{constructor({settings:a,slides:b,W:c}){super({G:"progressbar",rf:!0});this.M=b;this.B=c;this.H=a;this.Ap=0;this.WA=this.H.enabled;this.pK=null;this.AX=E(this);this.BX=E(this);this.zX=E(this);this.le=new P({ga:O(this,"progress")});this.nK=new P({ga:O(this,"progress-background")});a=new AR(this.WA);Ft(a,O(this,"thumb"));this.La=a;a=new xR;a.PG=this.H.mode===ML;a.JO=this.H.rr;Ft(a,O(this,"progress-tooltip"));this.kq=a;this.kG=new CR([this.le.displayObject(),this.nK.displayObject(), +this.La.displayObject()]);N(this,this.le);N(this,this.La);N(this,this.kq);N(this.le,this.nK);DR(this,this.H.enabled);x(this,this.le.displayObject(),Km,this.Rv,this,Nm);x(this,this.La.displayObject(),Km,this.Rv,this,Nm);z(this,this.H.lb,this.RM,this);ER(this)}Bg(a){this.width()&&(this.Ap=wv(a,0,1),this.ub())}progress(){return this.Ap}finished(){return 1===Vc(this.Ap,0,1)}$a(a,b){super.$a(a,b);a*=this.Ap;this.nK.Zb(a);b=this.La;b.rM=a;b.Ef()}RM(){const a=(this.WA=this.H.enabled)&&this.H.rr;this.kq.PG= +this.H.enabled&&this.H.mode===ML;this.kq.JO=a;this.H.enabled||wn(this.le.displayObject(),1,1);this.H.enabled?this.La.ra(!0):this.La.Oc();ER(this);DR(this,this.WA)}Rv(a){this.WA&&this.enabled()&&(x(this,document,Mm,this.wF,this),x(this,document,Lm,this.xF,this),this.Bg(GR(this,a)),this.BX.C())}wF(a){this.Bg(GR(this,a));this.AX.C()}xF(a){Ne(this,document,Mm,this.wF,this);Ne(this,document,Lm,this.xF,this);this.Bg(GR(this,a));this.zX.C();if(Ii)return yn(this.displayObject())}j6(a){clearTimeout(this.pK); +this.H.enabled&&(IR(this,a),this.kq.show());this.La.show();a=6/this.height();wn(this.le.displayObject(),1,a)}Q5(a){this.H.enabled&&IR(this,a)}i6(){clearTimeout(this.pK);this.La.Oc();this.pK=setTimeout(()=>{this.kq.Oc();wn(this.le.displayObject(),1,1)},400)}};function LR(a,b){if(-1!==a.B.ma()){var c=b&&a.Zl;a.ZN.C(!0);var d=a.wa.progress();"slideTimeline"===a.QG?(b=a.B.$(),d*=FR(a),d=b.Io(d,!1),a.B.Vj(d.L(),d.Aa(),d.ib(),c)):(d*=a.M.wu(),d=a.M.Io(d,!1,!0),(b||"slide"===a.M.ja(d.L()).type())&&a.B.Vj(d.L(),d.Aa(),d.ib(),c));if(c=a.B.gf("presentationSeeking",d.L(),d)){c=c.od().Jd();if(null==c)return;d=a.M.ja(c).nb();b=d.count()-1;d=d.pc(b).duration();a.B.Vj(c,b,d,!1)}a.ZN.C(!1)}} +function MR(a){var b=a.B.Z().timestamp();a=a.B.$().nb();b=0<=b.Aa()?a.getTime(b.Aa(),b.ib()):0;a=a.duration();return 0{LR(this,!1)},100)}RM(){this.QG=this.Ri.mode;this.Qj()}wb(){if(!this.FA&&this.wa){const a=-1===this.B.Z().timestamp().Aa()&&!!this.wa.Ap,b=this.wa.finished()&&MR(this)*FR(this)===FR(this);a||b||this.Qj()}}Qj(){if("slideTimeline"===this.QG)-1!==this.B.ma()&&this.wa.Bg(MR(this));else{var a=this.B.Z().timestamp();a=this.M.mi(a,!1,!0);this.wa.Bg(a/this.M.wu())}}zz(){var a=this.B.gf("slideTimeline"===this.QG?"slideSeeking":"presentationSeeking"); +sO(this.wa.displayObject(),a)}};class OR{constructor(a){this.Fc=a}animate(a){this.Fc.Hf(a[0]);wn(this.Fc.displayObject(),a[1])}}function PR(a){a.kb=new qO;a.kb.J(!1);yi(a.kb.displayObject(),"left top");oO(a.kb,a.D.Ar().view());const b=a.F.nd().Lf();for(let c=0;c{a.kb.removeChild(b)},a);return c} +class RR extends wg{constructor({ic:a,Ia:b,controlPanel:c,Fba:d}){super();this.D=a;this.K=b;this.pb=c;this.jm=d;this.F=this.D.Ba();this.B=this.D.view().W();this.tc=this.D.view().Xd();this.Nr=null;this.Jh=void 0;this.Xe=!1;this.Xv=null;this.iT=!1;this.Eb=void 0;this.hP=E(this);PR(this);this.jm&&z(this,this.jm.ZN,e=>{this.iT=e})}invalidate(){const a=this.VK();void 0!==a?(this.Xe=!0,pO(this.kb,a.width(),a.height())):this.Xe=!1}EW(){const a=this.tc;a.Z().Ag()?a.pause():a.play()}JV(a){if(!this.iT){var b= +this.Nr;this.Nr=a.state();a="started"==this.Nr||"buffering"==this.Nr;if("suspended"!=b&&"suspended"!=this.Nr&&"rewinding"!=this.Nr&&(!b||("started"==b||"buffering"==b)!=a)){a=!a;this.Xv&&1==this.Xv.Rc&&this.Xv.stop(!0);b=new P;a?b.V(Z(this.K,"btn_pause_big.svg")):b.V(Z(this.K,"btn_play_big.svg"));b.resize(104,76);L(b,"position","absolute");L(b,"pointer-events","none");var c=this.kb;a=(c.width()-b.width())/2;c=(c.height()-b.height())/2;b.move(a,c);this.kb.V(b);Ue(this,this.Xv);this.Xv=QR(this,b);this.Xv.play()}}}VK(){let a= +this.Jh;const b=this.F.nd().Lf();if(!a)for(let c=0;c=this.B.ma()){a=d;break}}return a}X5(a){"activated"==a.playbackState()?this.Jh!=a&&(this.Jh=a,pO(this.kb,a.width(),a.height()),this.hP.C()):"deactivated"==a.playbackState()&&(this.Jh=void 0,this.hP.C())}video(){return this.kb}};function SR(a,b,c){const d=new P({ga:O(a,"link"),Yb:"A",HH:!0,nI:!1});d.setAttribute("target","_blank");d.setAttribute("data-tooltip",c);a=new P({ga:O(a,"link-icon"),za:b});N(d,a);return d}function TR(a){const b=a.sk.displayObject().offsetHeight;a.ua.vi(b,b)}function UR(a){const b=new P({ga:O(a,"show-more")});b.la(a.I.ha(a.so.YP));z(a,b.ka,()=>VR(a));return b}function VR(a){var b=!a.Cm();a.sk.fa("collapsed",!b);a.Cm()?a.uq.la(a.I.ha(a.so.I_)):a.uq.la(a.I.ha(a.so.YP));a.CT.C();WR(a)} +function WR(a){a.Cm()?(a.ua.vi(a.sk.height(),a.JD.height()),a.ua.yx()):TR(a)} +class YR extends P{constructor(a,b,c){super({G:"presenter-info",rf:!0});this.I=a;this.so={V_:"PB_PRESENTER_EMAIL",M1:"PB_PRESENTER_WEBSITE",I_:"PB_PRESENTER_COLLAPSE_BIO",YP:"PB_PRESENTER_EXPAND_BIO"};this.tG=c;this.fa("popup",this.tG);this.Vb=null;this.Fa=new P({ga:O(this,"main")});N(this,this.Fa);this.Ss=new P({ga:O(this,"photo")});N(this.Fa,this.Ss);c=new P({ga:O(this,"info")});N(this.Fa,c);this.Th=new rO({ga:O(this,"name")});N(c,this.Th);const d=new rO({ga:O(this,"job")});$g&&L(d,"line-height", +"20px");this.KL=d;N(c,this.KL);this.Ps=new P({ga:O(this,"phone"),Yb:Ii?"A":"DIV",HH:!0,nI:!Ii});N(c,this.Ps);this.Sz=new P({ga:O(this,"links")});N(c,this.Sz);this.Pl=SR(this,Z(b,"mail-link"),this.I.ha(this.so.V_));B(this,this.Pl);this.Ft=SR(this,Z(b,"external-link"),this.I.ha(this.so.M1));B(this,this.Ft);this.sk=new P({G:"bio-container"});N(this,this.sk);b=new P({G:"scroll-area"});N(this.sk,b);this.JD=new P({ga:O(b,"bio")});N(b,this.JD);this.ua=new pM({lr:b});this.sk.V(this.ua.Tj());TR(this);this.tG|| +this.sk.fa("collapsed",!0);this.uq=UR(this);N(this,this.uq);this.J(!1);this.CT=E(this);this.b5=E(this);this.PK=!0;z(this,this.Ss.Le(),this.b5.C,this);z(this,a.jh,this.$i,this)}Cm(){return!this.sk.NH("collapsed")}UC(a){this.Vb!=a&&((this.Vb=a)?(this.J(!0),a=this.Vb.Vt(),this.fa("no-photo",!a),this.Ss.J(!!a),this.Ss.Zo(),a&&(a.mf()?this.aU(a):(a.load(),z(this,a.gr(),this.aU,this))),a=this.Vb.name(),this.Th.J(!!a),a&&this.Th.la(a),a=this.Vb.Pt(),this.KL.J(!!a),a&&this.KL.la(a),a=this.Vb.phone(),this.Ps.J(!!a), +a&&(this.Ps.la(a),this.Ps.setAttribute("href",`tel:${a}`)),(a=this.Vb.email())?(this.Pl.setAttribute("href",`mailto:${a}`),this.Pl.setAttribute("title",a),this.Sz.V(this.Pl)):this.Sz.removeChild(this.Pl),(a=this.Vb.ue())?(this.Ft.setAttribute("href",a),this.Ft.setAttribute("title",a),this.Sz.V(this.Ft)):this.Sz.removeChild(this.Ft),a=this.Vb.Oq(),this.sk.J(!!a),a&&this.JD.la(a),this.PK=!0,this.tG?this.uq.J(!1):(this.uq.J(this.sk.visible()),!this.sk.visible()&&this.Cm()&&VR(this)),this.ua.fi.Nx(0), +WR(this)):this.J(!1))}aU(a){const b=a.width(),c=a.height();L(this.Ss,"background-image",Pi(a.path()));bc.offsetHeight);this.PK=!1}WR(this)}}$i(a){switch(a){case this.so.I_:this.Cm()&&this.uq.la(this.I.ha(a));break;case this.so.YP:this.Cm()||this.uq.la(this.I.ha(a)); +break;case this.so.V_:this.Pl&&this.Pl.setAttribute("data-tooltip",this.I.ha(a));break;case this.so.M1:this.Ft&&this.Ft.setAttribute("data-tooltip",this.I.ha(a))}}};class ZR extends P{constructor(){super({G:"logo"});this.Pp=280;this.WL=this.uf=this.yb=null;E(this)}gu(a){this.yb!=a&&(this.fa("has-logo",!1),this.yb&&Ue(this,this.yb.logo(),this.yb),(this.yb=a)?(z(this,this.yb.XL,this.KB,this),this.KB()):this.FM(null))}KB(){if(this.yb){var a=this.yb.logo();a.mf()?this.FM(a):(a.load(),z(this,a.gr(),this.FM,this))}}FM(a){a?(Cd(this.displayObject()),this.uf=new P({Yb:"A"}),this.yb&&this.yb.ue()&&""!=this.yb.ue()?(this.uf.setAttribute("href",this.yb.ue()),this.uf.setAttribute("target", +"_blank"),this.uf.setAttribute("title",this.yb.ue())):(this.uf.removeAttribute("title"),this.uf.removeAttribute("href"),this.uf.removeAttribute("target")),this.WL=a.gC(),this.V(this.uf),this.uf.V(this.WL),this.fa("has-logo",!0)):this.uf&&(this.removeChild(this.uf),this.WL=null)}};function $R(a){const b=new HC({ga:O(a,"maximized")}),c=new P({za:Z(a.K,"video_maximize")});N(b,c);b.fa("at-left",a.Ta.Yd);b.Hf(0);z(a,b.ka,()=>a.GM.C());return b}function aS(a){if(a.Ta.pd){const b=new ZR;z(a,a.F.OJ,a.pY,a);z(a,b.Le(),()=>{bS(a)});a.Ff(b,0);return b}return null} +function cS(a){if(a.Ta.Wg){const b=new YR(a.I,a.K,!1);Ft(b,O(a,"presenter-info"));b.J(!1);z(a,b.CT,()=>{if(a.Mc&&a.Mc.visible())if(a.Mc.Cm()){var c=Zh(a.displayObject());c=a.height()-a.Mc.y()-c.bottom;L(a.Mc,"max-height",`${c}px`)}else L(a.Mc,"max-height","");a.ub()});return b}return null}function dS(a){return a.Ta.showOutline||a.Ta.te?new xP({nu:a.Ta.showOutline,mu:a.Ta.te,$j:a.ig,W:a.B,slides:a.F.slides(),Ia:a.K,ia:a.I}):null} +function bS(a){if(a.Xb){var b=Zh(a.displayObject());b=a.Ub?Math.max(.2*a.height(),156)+b.bottom:0;b=a.height()-b;if(!a.qd||0>=a.qd.height())var c=0;else c=$h(a.qd.displayObject()),c=a.qd.height()+c.top+c.bottom;b-=c;a.Xb.zl(a.width(),b)}}function eS(a){let b=Sh(a.Qp.displayObject());"number"!==typeof b&&(b=0);a.GT=new BC(a.Qp.displayObject(),b,0,250,c=>Math.max(0,250*c)/250);a.GT.play()} +function fS(a){a.Mc&&(a.Xb?a.oi(a.Mc)&&a.removeChild(a.Mc):a.qd?Dd(a.Mc.displayObject(),a.qd.displayObject()):a.Ff(a.Mc,0))} +function gS(a,b){a.dH&&a.dH&&a.oi(a.dH.displayObject())&&a.removeChild(a.dH.displayObject());a.Xb&&a.Xb&&(a.oi(a.Xb.displayObject())&&a.removeChild(a.Xb.displayObject()),a.Xb.removeChild(a.Qp),a.Xb.removeChild(a.mE),Ne(a,a.Xb.displayObject(),"mouseover",a.Xp,a),Ne(a,a.Xb.displayObject(),"mouseout",a.Vl,a));a.Xb=b;a.Xb&&(a.qd?Dd(a.Xb.displayObject(),a.qd.displayObject()):a.Ff(a.Xb.displayObject(),0),x(a,a.Xb.displayObject(),"mouseover",a.Xp,a),x(a,a.Xb.displayObject(),"mouseout",a.Vl,a),a.Xb.V(a.Qp), +a.Xb.V(a.mE));bS(a);fS(a);a.ub()} +class hS extends P{constructor(a,b,c,d,e,f=!0){super({G:"universal-side-panel",Yb:"ASIDE"});this.F=b;this.B=c;this.I=d;this.K=e;this.Ta=a.xa.Qc;this.ig=a.outline;this.GT=this.FT=void 0;this.qa=1;this.Xb=void 0;this.dH=null;this.IY=f;this.Qp=$R(this);B(this,this.Qp);this.mE=new P({G:"float-panel-overlay"});B(this,this.mE);(this.qd=aS(this))&&B(this,this.qd);(this.Mc=cS(this))&&B(this,this.Mc);(this.Ub=dS(this))&&N(this,this.Ub);this.GM=E(this);this.JY=E(this);z(this,this.B.Bc(),this.ke,this);z(this, +this.Ta.lb,this.t9,this);this.ke()}show(a){this.IY=a;L(this,"transition","margin 300ms ease-in-out");Gi(()=>L(this,"transition",""),this,300);this.JY.C()}showed(){return this.IY}showedStateChanged(){return this.JY}setScale(a,b){this.qa=a;super.setScale(a,b)}J(a){this.visible()!=a&&(super.J(a),a&&this.ub())}ra(a){super.ra(a);this.Ub&&this.Ub.ra(a)}t9(){this.Ta.pd?this.qd||(this.qd=aS(this),B(this,this.qd)):this.qd&&(this.removeChild(this.qd.displayObject()),Se(this,this.qd),this.qd=null);this.Ta.Wg? +this.Mc||(this.Mc=cS(this),B(this,this.Mc)):this.Mc&&(this.removeChild(this.Mc.displayObject()),Se(this,this.Mc),this.Mc=null);var a=this.Ta.showOutline,b=this.Ta.te;if(a||b)if(this.Ub){this.Ub.tR(a);this.Ub.sR(b);a=this.Ub;if(a.Pb||a.vd)if(a.Oi){a.Oi.tR(a.Pb);a.Oi.sR(a.vd);b=a.Oi;if(b.Pb&&b.vd)b.Gc||(b.Gc=b.yp(),b.Gc&&N(b,b.Gc,0)),b.Pk&&(Se(b,b.Pk),b.Pk=null);else if(b.Pb||b.vd)b.Pk||(b.Pk=AO(b),b.Pk&&N(b,b.Pk,0)),b.Gc&&(Se(b,b.Gc),b.Gc=null);b.OZ()}else a.Oi=vP(a),a.Oi&&N(a,a.Oi);else Se(a,a.Oi), +a.Oi=null;a.vd?(a.Es||wP(a),a.fa("mode","notes"),a.kF.ub()):a.Es&&(Se(a,a.Es),a.Es=null);a.Pb?(a.Ms||a.Fy(),a.fa("mode","outline")):a.Ms&&(Se(a,a.Ms),a.Ms=null)}else(this.Ub=dS(this))&&N(this,this.Ub);else Se(this,this.Ub),this.Ub=null;this.ke()}Xp(a){a.relatedTarget&&Md(this.Xb.displayObject(),a.relatedTarget)||(a=Sh(this.Qp.displayObject()),"number"!==typeof a&&(a=0),this.FT=new BC(this.Qp.displayObject(),a,1,150),this.FT.play())}Vl(a){a.relatedTarget&&Md(this.Xb.displayObject(),a.relatedTarget)|| +eS(this)}ke(){-1!=this.B.ma()&&(fS(this),this.YO(),this.pY(),this.ub())}pY(){if(this.qd&&-1!=this.B.ma()){var a=this.B.$().zg();a?(a=a.Td())&&a.logo()?this.qd.gu(a):this.ZA():this.ZA()}}ZA(){const a=this.F.Td();a&&a.logo()?this.qd.gu(a):this.qd.gu(null)}YO(){if(this.Mc&&-1!=this.B.ma()){var a=this.B.$();this.Mc.UC(a.zg())}}$a(){if(this.visible()){var a=!!this.qd&&this.qd.visible(),b=!!this.Mc&&this.Mc.visible(),c=!!this.Ub&&this.Ub.visible(),d=!!this.Xb&&!!this.oi(this.Xb.displayObject());a&&this.qd.fa("with-delimiter", +b||!b&&!d&&c);b&&this.Mc.fa("with-delimiter",c);this.Mc&&this.Mc.ub()}}rd(){super.rd();Fd(this.mE.displayObject());Fd(this.Qp.displayObject())}};function iS({pd:a,$:b,Ba:c,zg:d}){const e=d&&d.Td(),f=e&&e.logo(),g=(c=c.Td())&&c.logo();return a&&(!!b&&!!d&&!!e&&!!f||!!c&&!!g)}function jS({W:a,kp:b,Ba:c,kD:d}){let e=null;0<=a.ma()&&(e=a.$());a=e&&e.zg();c=iS({pd:b.pd,zg:a,Ba:c,$:e});return!!(b.te||b.showOutline||c||b.Wg&&e&&a||d&&d.Xe)};function kS(a,b){a.Eb=b;b=a.ug;b.Eb=a.Eb;a=b.B.Z().Cc();const c=b.kb.displayObject();Ne(b,c,Km,b.EW,b);Pe(b,a,b.JV,b);"MaximizedVideo"==b.Eb&&(x(b,c,Km,b.EW,b),b.Nr=null,z(b,a,b.JV,b))}function lS(a,b){const c=a.F.slides().ja(b).No();let d;for(let e=0;e{this.KZ()});Ft(a,O(this,"button"));L(a,"padding","9px 10px");z(this,a.ka,()=>{this.Cb.show(!this.Cb.showed())});return a}};function tS(a){return(a=a.B.Oa())?a.skin().controlPanel().displayObject():null} +class uS extends wg{constructor({W:a,B1:b,K_:c}){super();this.B=a;this.q7=this.Ru=c;this.v7=this.Wr=b;z(this,a.Bc(),this.T8,this);this.SW=E(this)}T8(){var a,b=this.B.Oa();(a=(b=b&&b.skin().topPanel())?b.displayObject():null)&&F(a,"height",`${this.Wr.offsetHeight}px`);(b=tS(this))&&F(b,"height",`${this.Ru.offsetHeight}px`);b=!1;a=a||this.v7;a!=this.Wr&&(Gd(a,this.Wr),this.Wr=a,b=!0);a=tS(this)||this.q7;a!=this.Ru&&(Gd(a,this.Ru),this.Ru=a,b=!0);b&&this.SW.C()}};function vS(a,b){switch(b){case "pen":return Z(a.K,"marker_pen");case "highlighter":return Z(a.K,"marker_highlighter");case "eraser":return Z(a.K,"marker_eraser");default:return null}} +class wS extends P{constructor({type:a,ia:b,yg:c,Ia:d}){super({G:"marker-panel-button",tabIndex:0});this.K=d;this.fa("mobile",Ii);this.fa("type",a);a=this.jn(a);d=new P({ga:O(this,"text")});Ht(d,b,c);a&&N(this,a);N(this,d)}jn(a){var b=vS(this,a);if(!b)return null;a=new P({G:"item-icon"});Ft(a,O(this,"item-icon"));b=new P({ga:O(a,"item-icon-image"),za:b});N(a,b);return a}} +function xS(a,b,c){c=new wS({type:b,ia:a.I,yg:c,Ia:a.K});z(a,c.ka,()=>a.Wp(b),a);x(a,c.displayObject(),"keydown",d=>{if(13==d.keyCode||32==d.keyCode)a.Wp(b),d.stopPropagation(),d.preventDefault()},a);N(a,c);return c}function yS(a,b){a.wT=b;a.Nf.has("endDrawing")&&a.Nf.get("endDrawing").ra(b)} +class zS extends P{constructor(a,b){super({G:"marker-panel"});this.Nf=new Map;this.zT=this.wT=!0;this.xZ=E(this);this.AT=E(this);this.fz=[];this.I=a;this.K=b}open(){for(const a of this.Nf.values())a&&Se(this,a);this.Zo();this.ZJ();this.fz=[]}ZJ(){var a=xS(this,"pen","PB_DRAWING_TOOLS_PEN");this.Nf.set("pen",a);a=xS(this,"highlighter","PB_DRAWING_TOOLS_HIGHLIGHTER");this.Nf.set("highlighter",a);a=xS(this,"eraser","PB_DRAWING_TOOLS_ERASER");this.Nf.set("eraser",a);a=new P({ga:O(this,"separator")}); +this.V(a);a=xS(this,"eraseAll","PB_DRAWING_TOOLS_ERASE_ALL");this.Nf.set("eraseAll",a);a.ra(this.zT);a=xS(this,"endDrawing","PB_DRAWING_TOOLS_END_DRAWING");this.Nf.set("endDrawing",a);a.ra(this.wT)}Wp(a){(a={pen:"line",highlighter:"marker",eraser:"eraser",endDrawing:"nothing"}[a])?this.xZ.C(a):this.AT.C()}freeze(){this.fz=[];for(const a of this.Nf.values())a.enabled()&&(a.ra(!1),this.fz.push(a))}};class AS extends xO{constructor({G:a,W:b}){super({G:a,W:b});this.$Z=16}};class BS extends LQ{constructor(a,b){super(a);this.Tp=b;L(this.Tp,"height","100%");this.Lx(this.Tp)}};const CS={markerTools:"PB_TITLE_PANEL_MARKER_TOOLS",attachments:"PB_TITLE_PANEL_ATTACHMENTS",marker:"PB_DRAWING_TOOLS_PEN",highlighter:"PB_DRAWING_TOOLS_HIGHLIGHTER",eraser:"PB_DRAWING_TOOLS_ERASER",presenterInfo:"PB_TITLE_PANEL_PRESENTER_INFO",notes:"PB_TITLE_PANEL_NOTES",outline:"PB_TITLE_PANEL_OUTLINE"};function DS(a,b,c,d){b&&(a=d?"":a.I.ha(CS[c]),b.la(a))}function ES(a){a.buttons().forEach(b=>b.Ac(!1))} +function FS(a,{Laa:b,cba:c,Aba:d,a$:e}){var f=a.ud;f&&f.ra(b);(b=a.Kj)&&b.ra(c);(c=a.nm)&&c.ra(d);(a=a.Wk)&&a.ra(e)} +class GS extends P{constructor({settings:a,Ia:b,ia:c}){super({G:"buttons-container"});this.K=b;this.I=c;this.wY=E(this);this.zY=E(this);this.DY=E(this);this.AY=E(this);this.BY=E(this);this.Yk=this.Kj=this.nm=this.ud=this.Wk=null;this.Ym={};this.H=a;this.rw="nothing";a=Z(b,"attachments_button_icon");const d=Z(b,"marker_panel_button_icon"),e=Z(b,"presenter_info_button_icon"),f=Z(b,"notes_button_icon");b=Z(b,"outline_button_icon");this.Ym.attachments={icon:a,label:c.ha("PB_TITLE_PANEL_ATTACHMENTS")}; +this.Ym.markerTools={icon:d,label:c.ha("PB_TITLE_PANEL_MARKER_TOOLS")};this.Ym.marker={icon:d,label:c.ha("PB_DRAWING_TOOLS_PEN")};this.Ym.highlighter={icon:d,label:c.ha("PB_DRAWING_TOOLS_HIGHLIGHTER")};this.Ym.eraser={icon:d,label:c.ha("PB_DRAWING_TOOLS_ERASER")};this.Ym.presenterInfo={icon:e,label:c.ha("PB_TITLE_PANEL_PRESENTER_INFO")};this.Ym.notes={icon:f,label:c.ha("PB_TITLE_PANEL_NOTES")};this.Ym.outline={icon:b,label:c.ha("PB_TITLE_PANEL_OUTLINE")};this.Pu();z(this,this.I.jh,this.VO,this)}buttons(){return[this.Wk, +this.ud,this.nm,this.Kj,this.Yk].filter(a=>!!a)}invalidate(){Se(this,this.ud);Se(this,this.Kj);Se(this,this.nm);Se(this,this.Wk);Se(this,this.Yk);this.Pu()}Pu(){if(this.H.visible){var a=this.H.buttonsOrder;for(let b=0;bc);switch(a){case "logo":return b.indexOf(this.he);case "courseTitle":return b.indexOf(this.Gh);default:return-1}}KB(){if(this.yb){var a=this.yb.logo();a&&(a.mf()?this.XV(a):(a.load(),z(this,a.gr(),this.XV,this)))}}ZA(){const a=this.F.Td(),b=a&&a.logo();a&&b?(this.he&&this.he.J(!0),this.yb!=a&&OS(this,a)):(this.yb=null,this.he&&(this.he.J(!1),HS(this.he)))}XV(a){if(this.he){var b=this.he;b.Sl.Zo();const c=a.gC();b.Sl.V(c);const d=Ni?a.width():c.width;a=Ni?a.height():c.height; +b=Math.min(1,Math.min(b.Pp/d,b.Kk/a));Nh(c,d*b,a*b)}}};function QS(a){const b=new GS({parent:a,settings:a.Kb,Ia:a.K,ia:a.I});Ft(b,O(a,"container"));var c=0!=a.F.resources().ti().count(),d=b.Wk;d&&d.ra(c);z(a,b.DY,a.ho,a);z(a,b.wY,a.bB,a);z(a,b.BY,a.Pb,a);z(a,b.AY,a.vd,a);z(a,b.zY,a.o8,a);return b}function RS(a){return a.xd.Kj?new AS({G:"notes-popup",W:a.B}):null}function SS(a){a=new MQ(a.xd.Yk.displayObject(),a.Ub);a.fa("outline-popup",!0);return a} +function TS(a){if(a.xd.ud){const b=new zS(a.I,a.K);yS(b,!1);z(a,b.xZ,a.Wp,a);z(a,b.AT,a.y5,a);return b}return null}function US(a){a.xd.buttons().forEach(b=>{DP(a.Ja,b.displayObject())})}function VS(a){const b=!!a.B.$().zg(),c=!a.B.Oa()&&!a.B.ob()&&!a.B.fb(),d=WS(a);FS(a.xd,{cba:d,Laa:c,Aba:b,a$:!!a.F.resources().ti().count()});c||a.Wp("nothing")}function XS(a){a.Jb&&a.Jb.Tm(a.Ta.Yd?YS(a):ZS(a))} +function $S(a,b){switch(b.buttonType){case "attachments":const c=b.pressed;b=b.relativeElement;const d=aT(a,b);HP(a.Ja,c,b,{Om:"bottom"});d.focus();break;case "outline":a.iO(b)}}function ZS(a){return a.Cb.showed()?Z(a.K,"arrows_right"):Z(a.K,"arrows_left")}function YS(a){return a.Cb.showed()?Z(a.K,"arrows_left"):Z(a.K,"arrows_right")}function WS(a){return(a=a.B.$().pj())&&""!=a.text().replace(/[\s\xa0]+/g," ").replace(/^\s+|\s+$/g,"")} +function aT(a,b){b=new LQ(b);b.Lx(bT(a));b.fa("attachments",!0);BP(a.Ja,b);return b}function bT(a){const b=new lN(a.F.resources().ti(),a.K,a.I);Ft(b,"attachments-popup");z(a,b.nS,()=>{CP(a.Ja)},a);return b}function cT(a,b){HP(a.Ja,b.pressed(),b.displayObject(),{Om:"bottom",align:"left"})} +class dT extends P{constructor({su:a,$j:b,kp:c,Ba:d,W:e,nj:f,Ia:g,ia:h,sidePanelController:l}){super({G:"top-panel",rf:!0});this.Kb=a;this.ig=b;this.Ta=c;this.Cb=l;this.F=d;this.B=e;this.Ja=f;this.K=g;this.I=h;this.HA=this.BN=this.Hv=this.yb=null;this.$L=E(this);this.cV=E(this);this.JK=E(this);this.Fa=new P({G:"top-main-container"});N(this,this.Fa);this.fa("reversed",this.Ta.Yd);this.Fa.fa("reversed",!this.Kb.Lt);this.xd=QS(this);N(this.Fa,this.xd);this.AE=this.YJ();N(this.Fa,this.AE);(this.Jb=this.Jy())&& +N(this,this.Jb);this.Ub=this.Fy();this.Tp=RS(this);this.Ub&&(B(this,this.Ub),a=SS(this),BP(this.Ja,a));(this.Jg=TS(this))&&B(this,this.Jg);z(this,this.Kb.lb,this.Nn,this);z(this,this.F.OJ,()=>NS(this.AE),this);z(this,this.B.Bc(),this.On,this);z(this,this.B.tu(),this.M6,this);z(this,this.B.NR(),this.L6,this);z(this,this.Ja.So(),this.Mv,this);z(this,this.Ta.lb,this.z6,this)}Nn(){CP(this.Ja);US(this);this.AE.invalidate();this.Fa.fa("reversed",!this.Kb.Lt);this.xd.invalidate();VS(this);this.ub()}z6(){this.fa("reversed", +this.Ta.Yd);XS(this)}ip(a){this.Cb=a;this.Ta.visible&&this.Cb&&this.Cb.visible()?this.Jb||(this.Jb=this.Jy())&&N(this,this.Jb):(Se(this,this.Jb),this.Jb=null)}ra(a){super.ra(a);this.xd.ra(a)}Jy(){if(this.Cb&&this.Cb.visible()){const a=new bM({type:"uikit-link-button",size:"small",icon:{element:this.Ta.Yd?YS(this):ZS(this),Ie:"left"}});L(a,"padding","4px");z(this,this.Cb.showedStateChanged(),()=>{XS(this)});z(this,a.ka,()=>{this.Cb.show(!this.Cb.showed())});return a}return null}YJ(){const a=new PS({su:this.Kb, +Ba:this.F,W:this.B});Ft(a,O(this,"container"));a.fa("reversed",this.Ta.Yd);return a}On(){if(-1!=this.B.ma()){this.HA=null;var a=WS(this);this.Hv&&this.Hv.visible()&&!a&&CP(this.Ja);VS(this);a=this.B.$().zg();const b=!!a;this.BN&&this.BN.visible()&&(b?this.BN.content().UC(a):CP(this.Ja));NS(this.AE)}}iO(a){const b=a.pressed;a=a.relativeElement;if(!this.HA){const c=new xP({mu:!1,nu:!0,$j:this.ig,Ia:this.K,ia:this.I,W:this.B,slides:this.F.slides()});c.Ls.vo.HQ();this.HA=new MQ(a,c);this.HA.fa("outline-popup", +!0);BP(this.Ja,this.HA)}HP(this.Ja,b,a,{Om:"bottom"})}Fy(){return this.xd.Yk?new xP({mu:!1,nu:!0,$j:this.ig,Ia:this.K,ia:this.I,W:this.B,slides:this.F.slides()}):null}Pb(a){a.Ac(!a.pressed());this.Ub||(this.Ub=this.Fy())&&B(this,this.Ub);const b=a.pressed(),c=SS(this);BP(this.Ja,c);b!=a.pressed()&&a.Ac(b);cT(this,a)}bB(a){a.Ac(!a.pressed());const b=a.pressed(),c=aT(this,a.displayObject());b!=a.pressed()&&a.Ac(b);cT(this,a);c.focus()}vd(a){this.Tp||(this.Tp=RS(this))&&B(this,this.Tp);if(!this.Hv){var b= +new BS(this.xd.Kj.displayObject(),this.Tp);b.fa("notes-popup",!0);this.Hv=b;BP(this.Ja,this.Hv)}b=a.pressed();a.Ac(!b);cT(this,a)}o8(a){var b=!a.pressed();a.Ac(b);if(b){this.Jg||(this.Jg=TS(this))&&B(this,this.Jg);b&&this.Jg.open();b=a.pressed();var c=this.Ja.createPopup(a.displayObject(),this.Jg,"marker");b!=a.pressed()&&a.Ac(b);cT(this,a);this.cV.C();c.focus()}else CP(this.Ja)}ho(a){const b=this.B.$().zg();a.Ac(!a.pressed());const c=new YR(this.I,this.K,!0);Ft(c,O(this,"presenter-info"));const d= +a.pressed();this.AN=this.Ja.createPopup(a.displayObject(),c,"presenter");d!=a.pressed()&&a.Ac(d);cT(this,a);c.UC(b);c.ub();this.AN&&this.AN.focus()}Wp(a){if(this.Jg){var b=this.xd;if(b.ud)switch(b.rw=a,b.rw){case "nothing":b.ud.la(b.I.ha("PB_TITLE_PANEL_MARKER_TOOLS"));break;case "line":b.ud.la(b.I.ha("PB_DRAWING_TOOLS_PEN"));break;case "marker":b.ud.la(b.I.ha("PB_DRAWING_TOOLS_HIGHLIGHTER"));break;case "eraser":b.ud.la(b.I.ha("PB_DRAWING_TOOLS_ERASER"))}this.$L.C(a);CP(this.Ja);yS(this.Jg,"nothing"!= +a)}}y5(){this.JK.C();CP(this.Ja)}Mv(){ES(this.xd);this.AN=this.Hv=null}M6(){const a=this.xd.ud;a&&this.Jg&&(a.ra(!1),this.Jg.freeze())}L6(){var a=this.xd.ud;if(a&&this.Jg){a.ra(!0);a=this.Jg;for(const b of a.fz)b.ra(!0);a.fz=[]}}$a(a){var b=this.Jb?`calc(100% - ${this.Jb.width()}px)`:"100%";L(this.Fa,"width",b);b=this.displayObject();const c=qn().getTransform(b);b=this.xd;a=480>a*(c?c.md:1);DS(b,b.Wk,"attachments",a);DS(b,b.ud,"markerTools",a);DS(b,b.nm,"presenterInfo",a);DS(b,b.Kj,"notes",a);DS(b, +b.Yk,"outline",a)}};function eT(a,b,c,d){var e,f=d=null!=(e=d)?e:fT(a);e=a.qE();var g=new cd(a.iB()+24,gT(a)+16);var h=new cd(b,c);e.width+g.width=c?c:Math.min(MN(b.width,a.width,d.width),MN(b.height,a.height,d.height))}function jT(a){a=iT(a);return NN(a)}function hT(a){return iC()||a.L3} +function gT(a){let b=0;if(a.Gc){const c=a.Gc.Wr,d=a.Gc.Ru;c&&(b+=Vh(c).height);b+=Vh(d).height}else b+=a.sb&&a.sb.visible()?a.sb.height():0,b+=a.pb&&a.pb.visible()?a.pb.height():0;b+=a.wa&&a.wa.visible()?a.wa.height():0;return b+=a.Rd&&a.Rd.visible()?a.Rd.height():0}function fT(a){if(hT(a)||a.Zy)return!0;const b=eT(a,a.Ew,a.Dw,!1);return b.width>a.Ew||b.height>a.Dw} +class kT{constructor({Ba:a,Uj:b,oba:c,Hc:d,controlPanel:e,Qc:f,zc:g,separator:h}){this.F=a;this.Hg=b;this.Gc=c;this.sb=d;this.pb=e;this.Y=f;this.wa=g;this.Rd=h;this.Zy=this.F.settings().Lq().fitToWindow();this.L3=1==Oi().fit_content;this.Dw=this.Ew=0}WC(a,b){this.Ew=a;this.Dw=b}qE(){let a=this.F.slideWidth(),b=this.F.slideHeight(),c=Math.max(540/a,540/b);c=Math.max(c,1);return new cd(a*c,b*c)}iB(){return this.Y?280:0}};class lT extends P{constructor(){super({G:"closed-caption-panel"});x(this,this.displayObject(),"click",this.gZ,this);x(this,this.displayObject(),Km,this.gZ,this,Nm);const a=new P({ga:O(this,"scroll-area")});N(this,a);this.gg=new P({G:"closed-captions"});N(a,this.gg);this.ua=new pM({lr:a});B(this,this.ua);this.V(this.ua.Tj())}gZ(a){a.stopPropagation()}mR(a){this.gg.la(a)}$a(a,b){super.$a(a,b);a=Zh(this.displayObject());a=a.top&&a.bottom?a.top+a.bottom:0;this.ua.vi(this.height()-a,this.gg.height())}} +;function KQ(a){a.$c.visible()&&(a.$c.J(!1),a.Ay.C())}function mT(a){const b=new LP(a.kX);B(a,b);z(a,b.jX,()=>{a.ik(!0)},a);z(a,b.So(),()=>{a.ik(!1)},a);return b}function nT(a){const b=new RR({ic:a.D,Ia:a.K,controlPanel:a.pb,Fba:a.jm});B(a,b);z(a,b.hP,a.P6,a);return b}function oT(a){return new kT({Ba:a.F,Uj:a.Hg,oba:a.Gc,Hc:a.sb,controlPanel:a.pb,Qc:a.Y,zc:a.wa,separator:a.Rd})}function pT(a,b){a.sb&&a.sb.ra(b);a.pb&&a.pb.ra(b);a.Y&&a.Y.ra(b)} +function qT(a,b){var c=a.tv;c="MaximizedVideo"==c.Eb?c.ug.video().width():c.R.width();a.$c.Zb(c/b);const d=new gm;d.translate((c-c/b)/2,110*(1-b)/2);d.scale(b,b);on(a.$c.displayObject(),d);a.$c.ub()}function rT(a){a.Kb.visible||!a.Ta.visible||a.ls||a.Jb?(a.Kb.visible||!a.Ta.visible||a.ls)&&a.Jb&&a.Jb&&(a.Fa.removeChild(a.Jb),Se(a,a.Jb),a.Jb=null):a.Jy();a.Jb&&a.Fa.Ff(a.Jb,0)} +function sT(a){(a.eL||a.oz||a.Rr.visible)&&!a.pb?(a.pb=a.YS(),B(a,a.pb)):a.eL||a.oz||a.Rr.visible||!a.pb||a.JX();a.pb&&a.Fa.V(a.pb)}function tT(a){a.Rd=new P({G:"universal-skin-separator"});B(a,a.Rd)}function uT(a){a.sb=new dT({su:a.Kb,$j:a.H.outline,kp:a.Ta,sidePanelController:a.Y,Ba:a.F,W:a.tc,nj:a.Ja,Ia:a.K,ia:a.I});a.sb.fa("hide-controls",!a.Kb.visible);B(a,a.sb);z(a,a.sb.cV,a.L5,a);z(a,a.sb.JK,a.x5,a);wN(a.Kb,"markerTools")&&z(a,a.sb.$L,b=>kO(a.vb,b))} +class vT extends P{constructor({ic:a,settings:b,ia:c,Ia:d}){super({G:"universal"});Ib?(this.fa("ie",!0),sj&&this.fa("ie9",!0)):Mb?this.fa("webkit",!0):Hb?this.fa("opera",!0):Lb&&this.fa("gecko",!0);L(this,"opacity",0);this.fa("embedded-mode",Kj);this.D=a;this.H=b;this.I=c;this.K=d;this.jd=new cd(0,0);this.F=this.D.Ba();this.R=this.D.view();this.tc=this.R.Xd();this.B=this.R.W();this.Hg=this.D.Uj();this.kX=new P({G:"popups-layer"});this.Ja=mT(this);this.sv=E(this);this.AM=E(this,this.Ja.So());this.Ay= +E(this);this.LZ=E(this);a=new P({G:"main-container"});N(this,a);this.Fa=a;N(this,this.kX);this.$c=new lT;B(this,this.$c);this.$c.J(!1);const {f0:e,g0:f,mQ:g}=SQ(this.F.slides());this.eL=e;this.ls=f;this.oz=g;this.Kb=this.H.xa.Hc;this.Rr=this.H.xa.controlPanel;this.Ri=this.Rr.zc;this.Ta=this.H.xa.Qc;this.vb=this.WJ();a=new P({G:"presentation-container"});N(this.Fa,a);this.wN=a;N(this.wN,this.vb);this.jm=this.Rd=this.wa=this.Y=this.pb=this.Jb=this.sb=null;this.ug=nT(this);this.Hk();a=new pS({ic:this.D, +settings:this.H,kD:this.ug,fC:this.vb,Qc:this.Y});B(this,a);z(this,a.sv,this.hA,this);this.tv=a;this.Gc=this.yp();this.Ra=oT(this);z(this,this.D.LX,this.g6,this);z(this,this.B.Bc(),this.On,this);z(this,this.Hg.UK,this.MV,this);z(this,this.Kb.yc,this.K6,this);z(this,this.Rr.yc,this.Nn,this);z(this,this.Ri.yc,this.Nn,this);z(this,this.Ta.yc,this.Nn,this);z(this,this.Ta.lb,this.Nn,this);this.MV()}scale(){var a=this.Ra;({scale:a}=eT(a,a.Ew,a.Dw));return a}So(){return this.AM}initialize(a){lS(this.tv, +a)}resize(a,b){if(a&&b){this.jd=new cd(a,b);Mb&&Nh(document.body,`${a}px`,`${b}px`);var c=Kj||hT(this.Ra)?new Wf(0,0,a,b):new Wf(16,16,a-32,b-32);this.H.accessibilityModeEnabled&&!iC()&&(c.width-=150);this.Ra.WC(c.width,c.height);hT(this.Ra)?(super.resize(a,b),this.move(0,0)):({kI:c}=eT(this.Ra,c.width,c.height),this.move(Math.floor((a-c.width)/2),Math.floor((b-c.height)/2)),super.resize(c.width,c.height));L(this,"opacity","")}}YC(a){this.pb&&this.pb.YC(a)}m1(a){this.sb&&$S(this.sb,a)}$a(a,b){this.Ji(a, +b);this.tv.invalidate()}Ji(a){var b=iT(this.Ra);const c=jT(this.Ra);var d=this.Ra;({kI:g}=eT(d,d.Ew,d.Dw));var e=jT(d),f=gT(d)*e;e*=d.iB();d=iT(d);var g=(new cd(g.width-(e+24*d),g.height-(f+16*d))).round();f=g.height/b;d="100%";this.Y&&this.Y.showed()&&(d=`calc(100% - ${this.Y.width()*c}px)`);L(this.Fa,"width",d);this.zz(c);if(this.Gc){if(d=this.Gc.Wr)wn(d,c),yi(d,"0 0"),F(d,"width",`calc(100% / ${c})`);d=this.Gc.Ru;wn(d,c);yi(d,"0 0");F(d,"width",`calc(100% / ${c})`);F(d,"top","")}this.sb&&!this.Gc&& +(wn(this.sb.displayObject(),c),yi(this.sb.displayObject(),"0 0"),F(this.sb.displayObject(),"width",`calc(100% / ${c})`));this.vb.invalidate(g,fT(this.Ra));this.vb.setScale(b);d=this.Gc?this.Gc.Wr:this.sb&&this.sb.displayObject();e=8*b;const h=12*b;L(this.wN,"margin-top",`${-(d?Vh(d).height:0)*(1-c)}px`);L(this.wN,"padding",`${e}px ${h}px`);this.pb&&(this.pb.BI(f-20),this.pb.ub());this.Y&&this.Y.visible()&&(this.Y.setScale(c),L(this.Y,"height",`calc(100% / ${c})`),this.Y.ub(),this.Ta.Yd?this.aP(c): +this.bP(c));f=this.scale();a={left:12+(this.Y&&this.Y.showed()&&this.Ta.Yd?this.Y.width():0),right:a/f-12};const {left:l,right:n}=a;this.Ja.zl(l,n,g.height);this.Ja.setScale(b,b);CP(this.Ja);b=Kj?0:Math.round(7*c);L(this,"-webkit-border-radius",`${b}px`);L(this,"-moz-border-radius",`${b}px`);L(this,"border-radius",`${b}px`);qT(this,c)}aP(a){this.Y.showed()?L(this.Y,"margin-left",""):L(this.Y,"margin-left",`${-280*a}px`);L(this.Y,"margin-right",`${-280*(1-a)}px`)}bP(a){this.Y.showed()?L(this.Y,"margin-right", +`${-280*(1-a)}px`):L(this.Y,"margin-right","-280px");L(this.Y,"margin-left","")}zz(a){if(this.wa){const b=this.wa.displayObject();wn(b,a);yi(b,"0 0");F(b,"width",`calc(100% / ${a})`);F(b,"top","")}}P6(){this.Y&&this.Y.ub()}hA(){this.fa("side-panel-hidden",!this.Y||!this.Y.visible());this.resize(this.jd.width,this.jd.height);this.$c.visible()&&mS(this.tv).appendChild(this.$c.displayObject());qT(this,this.scale());this.sv.C()}g6(a){const {kI:b}=eT(this.Ra,a.width,a.height);a.width=b.width;a.height= +b.height;a.D_=!0}On(){var a=this.B.Oa(),b=this.B.fb();const c=this.B.ob();this.wa&&this.wa.J(!a&&!b&&!c);this.Rd&&this.Rd.J(!this.wa||!this.wa.visible());(a||b||c)&&KQ(this);CP(this.Ja);this.Bz();Se(this,this.Ra);this.Ra=oT(this);a=this.tv;b=this.Y;a.Y!==b&&(a.Y=b,a.Y&&a.Y.GM.addHandler(a.kZ,a),kS(a,a.Y?"Full":"NoSidebar"),a.Ji());this.xt();this.hA();this.sb&&this.sb.ip(this.Y);this.Jb&&this.Jb.ip(this.Y)}xt(){if(this.$c){const a=this.B.$().pj();this.$c.mR(a?a.text():"")}}MV(){document.body.style.overflow= +fT(this.Ra)?"hidden":"auto";sj||requestAnimationFrame(()=>{this.resize(this.jd.width,this.jd.height)})}WJ(){return new lO(this.D)}Hk(){this.Bz();this.CL();rT(this);this.ov();sT(this)}ov(){!this.Rd&&tT(this);this.Ri.visible?(!this.wa&&this.Sr(),this.Rd.J(!1)):(this.wa&&this.MA(),this.Rd.J(!0));this.wa&&N(this.Fa,this.wa);this.Rd&&N(this.Fa,this.Rd)}MA(){Se(this.Fa,this.wa);this.jm=this.wa=null}Sr(){this.wa=new KR({slides:this.F.slides(),settings:this.Ri,W:this.tc});this.jm=new NR({zc:this.wa,W:this.tc, +Ba:this.F,settings:this.Ri});B(this,this.wa)}CL(){this.iM()?uT(this):this.jM()&&(this.Fa.removeChild(this.sb),Se(this,this.sb),this.sb=null);this.sb&&this.Fa.Ff(this.sb,0)}iM(){return(this.ls||this.Kb.visible)&&!this.sb}jM(){return!(this.ls||this.Kb.visible)&&!!this.sb}Jy(){this.Jb=new sS({su:this.Kb,kp:this.Ta,Ia:this.K,sidePanelController:this.Y});B(this,this.Jb)}YS(){return new vR({skinSettings:this.H,Ba:this.F,W:this.tc,soundController:this.R.soundController(),nj:this.Ja,ia:this.I,Ia:this.K,Uj:this.Hg, +Xw:this})}JX(){this.Fa.removeChild(this.pb);Se(this,this.pb);this.pb=null}Bz(){!this.Y&&this.nz()&&this.Ta.visible?this.gK():!this.Y||this.nz()&&this.Ta.visible||this.HN();this.Y&&this.Ff(this.Y,1);this.LZ.C(this.Y)}nz(){return jS({Ba:this.F,W:this.B,kD:this.ug,kp:this.Ta})}gK(){this.Y=new hS(this.H,this.F,this.tc,this.I,this.K);B(this,this.Y);this.fa("left-panel",this.Ta.Yd);z(this,this.Y.showedStateChanged(),()=>this.ub())}HN(){Se(this,this.Y);this.Y=null}yp(){if(this.pb){const a=new uS({W:this.B, +B1:this.sb&&this.sb.displayObject(),K_:this.pb.displayObject()});B(this,a);z(this,a.SW,this.ub,this);return a}return null}L5(){var a=this.sb;var b=this.vb;b=b.qb?b.qb.ri():!0;a.Jg&&(a=a.Jg,b=!b,a.zT=b,a.Nf.has("eraseAll")&&a.Nf.get("eraseAll").ra(b))}x5(){this.vb.FH()}Nn(){this.Hk();Se(this,this.Gc);this.Gc=this.yp();Se(this,this.Ra);this.Ra=oT(this);Se(this,this.ug);this.ug=nT(this);this.hA();this.fa("left-panel",this.Ta.Yd);this.sb&&this.sb.ip(this.Y);this.Jb&&this.Jb.ip(this.Y)}K6(){this.Nn(); +this.sb&&(VS(this.sb),this.sb.fa("hide-controls",!this.Kb.visible))}rd(){super.rd();Fd(this.$c.displayObject())}h1(){this.$c.visible()||(this.$c.J(!0),this.xt(),mS(this.tv).appendChild(this.$c.displayObject()),this.$c.ub(),this.Ay.C())}};function wT(a,b){const c=a.R,d=b.Fw,e=b.L();a.wn.suspend();c.setOverlayDisplayed(!0);a.Xk.C();yM(a.vk,{Rm:"PB_RESUME_PRESENTATION_WINDOW_TEXT",icon:Z(a.K,"mb_question_icon"),buttons:[{yg:"PB_MESSAGE_BOX_YES",result:"yes"},{yg:"PB_MESSAGE_BOX_NO",result:"no"}]}).then(f=>{a.wn.resume();c.setOverlayDisplayed(!1);a.Dk.C();a.un.C();"yes"==f?(a.pa.initialize(e),d.resume(e,!0)):(f=a.B.Gf(),d.start(f,!0))})} +class xT extends wg{constructor(a,b,c,d,e){super();e&&EM(e,this.resize,this);a.Uj();var f=b.xa;e=f.Hc;const g=f.controlPanel;f=f.Qc;e.pd&&f.visible&&(e.pd=!1,f.pd=!0);g.visible&&!jC()&&(g.jp=!1);this.D=a;z(this,this.D.Tx(),this.Mn,this);z(this,this.D.vx(),this.H5,this);this.H=b;this.I=c;this.K=d;this.F=this.D.Ba();this.R=this.D.view();this.tc=this.R.Xd();z(this,this.tc.Dx(),this.Ln,this);this.B=this.R.W();this.xf=this.Hy();this.VE=new LM(this.D,new ZL);B(this,this.VE);a=B(this,new vT({ic:this.D,settings:this.H, +ia:this.I,Ia:this.K}));a.Fa.ik(!0);a.Y&&a.Y.ik(!0);z(this,a.Le(),this.V6,this);z(this,a.sv,this.hA,this);this.pa=a;this.vg=B(this,new xM(this.pa.displayObject()));this.vk=new zM({ia:this.I,XI:this.vg});this.gw=new LN({Ba:this.F,W:this.B,settings:this.H,ia:this.I,view:this.pa,sidePanelController:null});B(this,this.gw);this.wn=new IM(this.B.Qt());this.Xk=E(this);this.Dk=E(this);this.un=E(this);this.os(this.xf,this.D.Ar());z(this,this.pa.LZ,this.gw.RR,this.gw)}resize(a,b){this.pa.resize(a,b)}displayObject(){return this.pa.displayObject()}Hy(){const a= +new MM;this.R.displayObject().appendChild(a.displayObject());return a}V6(){const a=this.pa.scale();wn(this.xf.displayObject(),this.pa.scale(),this.pa.scale());this.vg.zl(this.pa.width()/a,this.pa.height()/a);this.vg.setScale(a)}hA(){let a;null==(a=this.VE)||JM(a)}H5(a,b,c){c?(pT(this.pa,!1),Qe(this,this.VE.yA,()=>{pT(this.pa,!0);this.os(this.xf,this.D.Ar());this.B.play()},this),this.VE.show(this.displayObject())):this.os(this.xf,this.D.Ar())}os(a,b){this.LB(a,b);z(this,this.B.Z().aC(),()=>{this.LB(a, +b)},this)}LB(a,b){const c=this.B.Z().kd();b=b.xC()&&this.pa.ug.video().visible();c&&!b?a.show():a.Oc();a=this.pa.ug.video();b?a.xf.show():a.xf.Oc()}Mn(a){if("resumePlayback"==a.action()){const b=this.B.Gf();this.pa.initialize(b);"prompt"==this.F.settings().Pc().eu()&&(a.fu("delayStartup"),wT(this,a))}else"gotoSlide"==a.action()&&this.pa.initialize(a.L())}$n(a,b){if(!(0b}).then(()=>{this.wn.resume();c.setOverlayDisplayed(!1);Vs(d,e);this.Dk.C()})}}Ln(a){const b={},c=this.F.slides(),d=f=>{f=c.ja(f).Ci();if(this.H.outline.lj){const g=uN(c);b.SLIDE_INDEX=g[f]}else b.SLIDE_INDEX=f+1};let e="";switch(a.od().type()){case "currentSlideIsNotCompleted":e="PB_CURRENT_SLIDE_IS_NOT_COMPLETED";break;case "backwardNavigationIsRestricted":case "forwardNavigationIsRestricted":e= +"sequential"==this.F.settings().navigation().navigationType()?"PB_NAVIGATION_IS_SEQUENTIAL":"PB_NAVIGATION_IS_RESTRICTED";break;case "interactionNotCompleted":e="PB_QUIZ_SLIDE_WINDOW_TEXT";a=this.B.$();a instanceof Aq?e="PB_SCENARIO_SLIDE_WINDOW_TEXT":a instanceof sq&&(e="PB_INTERACTION_SLIDE_WINDOW_TEXT");break;case "precedingQuizFailed":e="PB_PRECEDING_QUIZ_FAILED_WINDOW_TEXT";d.call(this,a.od().Jd());break;case "precedingQuizNotPassed":e="PB_PRECEDING_QUIZ_NOT_PASSED_WINDOW_TEXT";d.call(this,a.od().Jd()); +break;case "precedingQuizNotCompleted":e="PB_PRECEDING_QUIZ_NOT_COMPLETED_WINDOW_TEXT";d.call(this,a.od().Jd());break;case "precedingScenarioNotPassed":e="PB_PRECEDING_SCENARIO_NOT_PASSED_WINDOW_TEXT";d.call(this,a.od().Jd());break;case "precedingScenarioFailed":e="PB_PRECEDING_SCENARIO_FAILED_WINDOW_TEXT";d.call(this,a.od().Jd());break;case "precedingScenarioNotCompleted":e="PB_PRECEDING_SCENARIO_NOT_COMPLETED_WINDOW_TEXT";d.call(this,a.od().Jd());break;default:return}this.$n(e,b)}rd(){super.rd(); +Fd(this.xf.displayObject())}};class yT{constructor(a){this.Wa=a}create(){return{l1:this.Wa.xa.controlPanel.visible&&this.Wa.xa.controlPanel.zc.visible&&this.Wa.xa.controlPanel.zc.rr,showSlideList:this.hB()&&this.Wa.xa.Qc.showOutline||this.Wa.xa.Hc.visible&&wN(this.Wa.xa.Hc,"outline")||this.Wa.xa.controlPanel.visible&&this.Wa.xa.controlPanel.showOutline,te:this.hB()&&this.Wa.xa.Qc.te||this.Wa.xa.Hc.visible&&wN(this.Wa.xa.Hc,"notes")||this.Wa.xa.controlPanel.visible&&this.Wa.xa.controlPanel.Bl,j1:this.Wa.xa.Hc.visible&&wN(this.Wa.xa.Hc, +"attachments"),i1:this.Wa.xa.Hc.visible&&wN(this.Wa.xa.Hc,"presenterInfo")||this.hB()&&this.Wa.xa.Qc.Wg}}hB(){return this.Wa.xa.Qc.visible}};class zT extends wg{constructor(){super();this.fo=this.io=this.kt=this.Qa=!1;this.ze="";this.lt=!1;this.lb=E(this);this.yc=E(this)}set visible(a){this.Qa!==a&&(this.Qa=a,this.yc.C())}get visible(){return this.Qa}set Jf(a){this.kt!==a&&(this.kt=a,this.lb.C())}get Jf(){return this.kt}set Kf(a){this.io!==a&&(this.io=a,this.lb.C())}get Kf(){return this.io}set qf(a){this.fo!==a&&(this.fo=a,this.lb.C())}get qf(){return this.fo}set Tg(a){this.ze!==a&&(this.ze=a,this.lb.C())}get Tg(){return this.ze}set Zd(a){this.lt!== +a&&(this.lt=a,this.lb.C())}get Zd(){return this.lt}};class AT extends wg{constructor(a){super();this.d7=a;this.vd=this.Pb=this.ho=this.bB=!1;this.lb=E(this);this.yc=E(this)}get outline(){return this.d7}set EI(a){this.bB!==a&&(this.bB=a,this.lb.C())}get EI(){return this.bB}set Wg(a){this.ho!==a&&(this.ho=a,this.lb.C())}get Wg(){return this.ho}set showOutline(a){this.Pb!==a&&(this.Pb=a,this.lb.C())}get showOutline(){return this.Pb}set te(a){this.vd!==a&&(this.vd=a,this.lb.C())}get te(){return this.vd}};class BT extends wg{constructor(){super();this.CN=this.Qa=!1;this.lb=E(this);this.yc=E(this)}get visible(){return this.Qa}set visible(a){this.Qa!==a&&(this.Qa=a,this.yc.C())}get oI(){return this.CN}set oI(a){this.CN!==a&&(this.CN=a,this.lb.C())}};class CT extends wg{constructor(){super();this.gO=this.Qa=!1;this.lb=E(this);this.yc=E(this)}set visible(a){this.Qa!==a&&(this.Qa=a,this.yc.C())}get visible(){return this.Qa}set kk(a){this.gO!==a&&(this.gO=a,this.lb.C())}get kk(){return this.gO}};class DT extends wg{constructor(a,b){super();this.F=a;this.H=b;a:{for(a=0;aa.height}function FT(a){return ET(a)?a.hB()?new Vf(0,a.iB(),0,0):new Vf(0,0,0,0):new Vf(a.Wa.topPanel.visible?a.Wa.hC?52:46:0,0,a.Wa.bottomPanel.visible?a.Wa.hC?55:66:0,0)}function GT(a){const b=FT(a);return new Wf(b.left,b.top,a.jd.width-b.right-b.left,a.jd.height-b.top-b.bottom)}function HT(a,b){a=b?a.aA:GT(a);return new cd(a.width,a.height)} +class IT{constructor(a){this.Wa=a;this.aA=this.jd=null}WC(a){this.jd=a}on(a){a=a?this.aA:GT(this);return new Xc(a.left,a.top)}hB(){return this.Wa.topPanel.visible||this.Wa.bottomPanel.visible?this.Wa.topPanel.kk||this.Wa.bottomPanel.qf||this.Wa.bottomPanel.Kf||this.Wa.bottomPanel.Jf:!1}iB(){return this.Wa.hC?52:56}};function JT(){let a=Ii?"mobile":"desktop";Ib?a+=" ie":Ji?a+=" android_default":Mb?a+=" webkit":Hb?a+=" opera":Lb&&(a+=" gecko");return a} +class KT extends P{constructor({ic:a,Ia:b,ia:c,G:d,b$:e}){super({G:d});JT().split(" ").forEach(f=>Ft(this,f));this.D=a;this.R=a.view();this.F=a.Ba();this.B=a.view().W();this.Ca=this.B.Z();this.tc=a.view().Xd();this.vg=new xM(this.displayObject());this.I=c;this.K=b;this.vk=new zM({ia:this.I,XI:this.vg});if(e){const f=new CM;z(this,f.pB,(g,h)=>this.Aj(g,h));setTimeout(()=>f.nC())}z(this,a.Tx(),this.Mn,this);z(this,a.view().Xd().Dx(),this.Ln,this)}Aj(a,b){this.resize(a,b);this.vg.zl(a,b)}Mn(a){if("resumePlayback"== +a.action()&&"prompt"==this.F.settings().Pc().eu()){const b=this.B.Gf(),c=a.L();a.fu("delayStartup");const d=a.Fw;(()=>{yM(this.vk,{Rm:"PB_RESUME_PRESENTATION_WINDOW_TEXT",icon:Z(this.K,"mb_question_icon"),buttons:[{yg:"PB_MESSAGE_BOX_YES",result:"yes"},{yg:"PB_MESSAGE_BOX_NO",result:"no"}]}).then(e=>{this.R.setOverlayDisplayed(!1);"yes"==e?d.resume(c,!0):d.start(b,!0)});this.R.setOverlayDisplayed(!0)})()}}gh(a,b){return(a.ja(b).Ci()+1).toString()}Ln(a){const b={},c=this.F.slides();let d;switch(a.od().type()){case "currentSlideIsNotCompleted":d= +"PB_CURRENT_SLIDE_IS_NOT_COMPLETED";break;case "backwardNavigationIsRestricted":case "forwardNavigationIsRestricted":d="sequential"==this.F.settings().navigation().navigationType()?"PB_NAVIGATION_IS_SEQUENTIAL":"PB_NAVIGATION_IS_RESTRICTED";break;case "interactionNotCompleted":d="PB_QUIZ_SLIDE_WINDOW_TEXT";a=this.B.$();a instanceof Aq?d="PB_SCENARIO_SLIDE_WINDOW_TEXT":a instanceof sq&&(d="PB_INTERACTION_SLIDE_WINDOW_TEXT");break;case "precedingQuizFailed":d="PB_PRECEDING_QUIZ_FAILED_WINDOW_TEXT"; +b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;case "precedingQuizNotPassed":d="PB_PRECEDING_QUIZ_NOT_PASSED_WINDOW_TEXT";b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;case "precedingQuizNotCompleted":d="PB_PRECEDING_QUIZ_NOT_COMPLETED_WINDOW_TEXT";b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;case "precedingScenarioNotPassed":d="PB_PRECEDING_SCENARIO_NOT_PASSED_WINDOW_TEXT";b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;case "precedingScenarioFailed":d="PB_PRECEDING_SCENARIO_FAILED_WINDOW_TEXT";b.SLIDE_INDEX= +this.gh(c,a.od().Jd());break;case "precedingScenarioNotCompleted":d="PB_PRECEDING_SCENARIO_NOT_COMPLETED_WINDOW_TEXT";b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;default:return}this.$n(d,b)}iA(a){Vs(this.Ca,a)}$n(a,b){const c=this.B.Z().suspended(),d=this.R;Vs(this.Ca,!0);yM(this.vk,{Rm:a,icon:Z(this.K,"mb_warning_icon"),buttons:[{yg:"PB_MESSAGE_BOX_OK",result:"ok"}],px:()=>b}).then(()=>{d.setOverlayDisplayed(!1);this.iA(c)});d.setOverlayDisplayed(!0)}};function LT(a){var b=a.B.ma();-1!=b&&(b=Us(a.R.Pm(),b),b instanceof lv?b.Oa().resize(a.width(),a.height()):b instanceof kv?b.fb().resize(a.width(),a.height()):b instanceof ov&&b.ob().resize(a.width(),a.height()))}function MT(a){a.IL()?(a=a.displayObject(),mn(a,"quiz_mode")):(a=a.displayObject(),nn(a,"quiz_mode"))} +class NT extends KT{constructor(a,b,c){super({ic:a,ia:b,Ia:c,G:"universal_mini",b$:!0});this.F=a.Ba();this.qa=Ki();this.iV=new C;b=a.view();this.V(b.displayObject());z(this,this.B.Dr,this.ke,this);z(this,a.mC(),this.uF,this)}uF(){}zL(a,b){this.R.resize(a,b)}Aj(a,b){L(this,"min-height",`${b+0}px`);this.zL(a,b,0);super.Aj(a,b);LT(this)}ke(){var a=this.B.ma();const b=-1!=a?this.B.$():null;this.ZD&&(this.ZD.Nq(),this.ZD=void 0);this.YD&&(this.YD.Nq(),this.YD=void 0);this.$D&&(this.$D.Nq(),this.$D=void 0); +var c=this.displayObject();nn(c,"interaction_slide");b instanceof br?(this.lq=!0,this.fJ(Us(this.R.Pm(),a)),LT(this),MT(this)):b instanceof sq?(this.lq=!0,this.eJ(Us(this.R.Pm(),a)),LT(this),MT(this),a=this.displayObject(),mn(a,"interaction_slide")):b instanceof Aq?(this.lq=!0,this.gJ(Us(this.R.Pm(),a)),LT(this),MT(this)):(this.lq=!1,MT(this),this.J(!0));0{if((a instanceof Node||a.enabled())&&!(1{1{1{var d=a.Ra.aA;d=new Xc(d.left,d.top);a.mn||(a.hm=d.x,a.im=d.y);b=a.hm;c=a.im},L0:d=>{a.mn=!0;var e=a.Ra.jd;a.hm=wv(b+d.x,0,e.width-FT(a.Ra).right-a.Uc.width());a.im=wv(c+d.y,0,e.height-a.Uc.height());d=a.Uc.width();e=a.Uc.height();a.Ra.aA=new Wf(a.hm,a.im,d,e);vn(a.Uc.displayObject(),a.hm,a.im)},fba:()=>{}});B(a,a.xk)}}else VT(a)} +function XT(a){var b=a.Uc==a.kb;var c=a.Ra;var d=c.jd;if(ET(c)){c=Math.floor(.4*d.width);var e=Math.floor(.4*d.height);d=b?new cd(c,e):new cd(d.width,d.height)}else d=new cd(d.width,Math.floor((d.height-48)*(1-.8)));a.kb.zl(d.width,d.height);!a.mn&&b&&(b=a.Ra,d=a.Uc.width(),a=a.Uc.height(),c=FT(b),b.aA=new Wf(Math.floor(b.jd.width-c.right-d),c.top,d,a))} +class ZT extends wg{constructor({Lca:a,Fx:b,IP:c}){super();this.EL=!1;this.Ra=c;this.kb=a;this.R=b;this.Uc=a;this.Xe=!1;ST(this,!1);this.hm=1;this.im=0;this.xk=null;this.mn=!1;this.Lr=new P({G:"change-layout-button"});B(this,this.Lr);this.kb.V(this.Lr);z(this,this.Lr.ka,()=>{this.hp(this.Uc==this.kb?this.R:this.kb)},this);this.$z=E(this);TT(this,!1)}hr(){return this.Uc}hp(a){VT(this);const b=this.Uc!=a;this.Uc=a;this.$z.C(b);UT(this);WT(this)}vl(){this.JE();this.xL()}iR(a){this.EL="MaximizedVideo"== +a;this.hp(this.EL?this.R:this.kb)}JE(){var a=this.Xe?this.Uc==this.R:!1;var b=this.Ra;if(ET(b))var c=HT(b,a);else this.Xe?(c=b.jd,b=FT(b),c=new cd(c.width,Math.floor(.8*(c.height-b.bottom-b.top)))):(c=GT(b),c=new cd(c.width,c.height));b=this.Ra;var d=this.Xe;const e=FT(b);a=ET(b)?b.on(a):d?new Xc(e.left,e.top+Math.floor((b.jd.height-e.bottom-e.top)*(1-.8))-24):new Xc(e.left,e.top);this.R.resize(c.width,c.height);this.ht(this.R.displayObject(),a);!ET(this.Ra)&&this.Xe&&(b=this.R.wi().getBoundingClientRect(), +a.y+=c.height-b.height,this.R.resize(b.width,b.height),this.ht(this.R.displayObject(),a))}xL(){var a=this.Uc==this.kb;var b=this.Ra;if(ET(b))var c=HT(b,a);else c=b.jd,b=FT(b),c=new cd(c.width,Math.floor(.5*(c.height-b.bottom-b.top)));b=this.Ra;const d=FT(b);a=ET(b)?b.on(a):new Xc(d.left,d.top);this.kb.resize(c.width,c.height);this.ht(this.kb.displayObject(),a);!ET(this.Ra)&&this.Xe&&(a=FT(this.Ra),this.kb.resize(c.width,Math.floor(this.Ra.jd.height-a.bottom-a.top-this.R.height()-24)))}ht(a,b){F(a, +"transform",`translate(${b.x}px, ${b.y}px)`)}WC(a){const b=this.Ra.jd;!a||b&&b.width==a.width&&b.height==a.height||(this.Ra.WC(a),WT(this));XT(this)}};class $T extends P{constructor(){super({G:"progress"});this.Ap=0;this.qa=Ki();wn(this.displayObject(),this.qa);yi(this.displayObject(),"0 100%")}Bg(a){this.Ap=wv(a,0,1);this.ub()}Zb(a){super.Zb(a/this.qa)}};class aU extends $T{constructor(){super();this.cX=new P({G:"playback-progress"});N(this,this.cX)}$a(a,b){super.$a(a,b);this.cX.Zb(a*this.Ap)}};function bU(a){var b=a.Tc.Tg===OL;const c=a.B.gf(b?"switchToNextSlide":"switchToNextStep");b=a.B.gf(b?"switchToPreviousSlide":"switchToPreviousStep");var d=a.Ka;d.zb&&sO(d.zb.displayObject(),c);a=a.Ka;a.Ob&&sO(a.Ob.displayObject(),b)} +class cU extends wg{constructor({zm:a,Sm:b,W:c,bottomPanel:d}){super();this.Tc=a;this.Jw=b;this.B=c;this.Ka=d;this.TF=void 0;z(this,this.B.Z().Cc(),this.yz,this);z(this,this.B.Z().Sb(),this.wb,this);bU(this);this.yz();z(this,this.Ka.eW,this.U5,this);z(this,this.Ka.dW,this.MM,this);z(this,this.Ka.fW,this.OM,this);z(this,this.Ka.hW,this.PM,this)}U5(){const a=this.B.Z().state();"started"===a||"buffering"===a?this.B.pause():this.B.play()}OM(){this.Ka.enabled()&&(this.Tc.Tg===OL?this.B.ni():"bySteps"=== +this.Tc.Tg&&this.B.Ot())}MM(){this.Ka.enabled()&&(this.Tc.Tg===OL?this.B.lf():"bySteps"===this.Tc.Tg&&this.B.Lo())}PM(a){this.B.Wo().jk(a);this.Ka.tC()}wb(){if(!this.B.Z().Ag()&&-1!=this.B.ma()){const a=this.B.gf("playPauseControl");dU(this.Ka,a)}bU(this)}yz(){var a=this.B.Z().state();const b="started"===a||"buffering"===a;this.TF&&(clearTimeout(this.TF),this.TF=void 0);this.TF=setTimeout(()=>this.Ka.H1(b),50);-1!==this.B.ma()&&(a=this.B.gf("playPauseControl"),dU(this.Ka,a))}};function dU(a,b){a.fc&&sO(a.fc.displayObject(),b)} +class eU extends P{constructor({G:a,Ia:b,zm:c,Sm:d,W:e,ia:f}){super({G:a});this.Tc=c;this.Jw=d;this.B=e;this.I=f;this.K=b;this.Yf=this.Cy();this.fc=this.Gy();this.gd=this.dK();this.zb=this.Ey();this.Ob=this.Iy();this.qa=Ki();wn(this.displayObject(),this.qa);yi(this.displayObject(),"0 100%");this.eW=E(this);this.fW=E(this);this.dW=E(this);this.hW=E(this);B(this,new cU({zm:c,Sm:d,W:e,bottomPanel:this}));z(this,this.Tc.lb,this.xr,this);z(this,this.Jw.lb,this.xr,this)}rH(){return!this.Tc.qf&&!this.Tc.Kf&& +!this.Tc.Jf&&!this.Tc.Zd}xr(){this.Jw.kk&&!this.Yf&&(this.Yf=this.Cy());this.Yf&&this.Yf.J(this.Jw.kk);this.Tc.Jf&&!this.fc&&(this.fc=this.Gy());this.fc&&this.fc.J(this.Tc.Jf);this.Tc.Zd&&!this.gd&&(this.gd=this.dK());this.gd&&this.gd.J(this.Tc.Zd);this.Tc.Zd||this.tC();this.Tc.Kf&&!this.Ob&&(this.Ob=this.Iy());this.Ob&&this.Ob.J(this.Tc.Kf);this.Tc.qf&&!this.zb&&(this.zb=this.Ey());this.zb&&this.zb.J(this.Tc.qf);this.KJ()}tC(){}XC(){}H1(){}xx(){}Cy(){return null}KJ(){}};function fU(a){x(a,document,Km,b=>{a.Ij.visible()&&(b=b.target,Md(a.gd.displayObject(),b)||Md(a.Ij.displayObject(),b)||a.Ij.J(!1))})} +class gU extends eU{constructor({G:a,Sm:b,zm:c,W:d,ia:e,Ia:f}){super({G:a,zm:c,Sm:b,W:d,ia:e,Ia:f});this.fc&&N(this,this.fc);this.gd&&N(this,this.gd);this.Ed=this.Dy();this.Ij=new P({G:"rate-menu-popup"});N(this,this.Ij);this.Sk=this.eK();N(this.Ij,this.Sk);this.gd&&(fU(this),z(this,this.B.Wo().Rk,this.XG,this),this.XG())}xr(){super.xr();this.fc&&!this.oi(this.fc)&&N(this,this.fc,1);this.gd&&!this.oi(this.gd)&&N(this,this.gd,2);!this.Ob&&!this.zb||this.Ed||(this.Ed=this.Dy())&&N(this,this.Ed);this.Ed&& +(this.Ed.J(!!this.Ob||!!this.zb),this.Ob&&!this.Ed.oi(this.Ob)&&N(this.Ed,this.Ob,0),this.zb&&!this.Ed.oi(this.zb)&&N(this.Ed,this.zb,1))}tC(){this.Ij.J(!1)}H1(a){this.fc&&this.fc.Tm(Z(this.K,a?"pause":"play"))}XG(){const a=this.B.Wo().playbackRate();XP(this.Sk.oG,String(a))}gW(){const a=!this.Ij.visible();a&&this.xx();this.Ij.J(a)}Dy(){if(this.Ob||this.zb){const a=new P({G:"navigation-controls"});N(this,a);this.Ob&&N(a,this.Ob);this.zb&&N(a,this.zb);return a}return null}Gy(){if(this.Tc.Jf){const a= +new bM({type:"uikit-secondary-button",icon:{element:Z(this.K,"play"),Ie:"left"}});z(this,a.ka,()=>this.eW.C(),this);-1==this.B.ma()&&(a.ra(!1),Qe(this,this.B.Bc(),()=>a.ra(!0)));return a}return null}Iy(){if(this.Tc.Kf){const a=new bM({type:"uikit-secondary-button",icon:{element:Z(this.K,"prev"),Ie:"left"}});z(this,a.ka,()=>this.fW.C(),this);this.Tc.qf||a.fa("next-button-hidden",!0);return a}return null}Ey(){if(this.Tc.qf){const a=new bM({type:"uikit-primary-button",icon:{element:Z(this.K,"next"), +Ie:"left"}});z(this,a.ka,()=>this.dW.C(),this);return a}return null}eK(){const a=new bQ(this.I,this.K);z(this,a.GC(),b=>this.hW.C(Number(b)),this);return a}};class hU extends gU{constructor({W:a,Sm:b,slides:c,zm:d,ia:e,Ia:f}){super({G:"bottom-panel",zm:d,Sm:b,W:a,ia:e,Ia:f});this.M=c;this.rH()&&this.Kd(0);this.xx()}xr(){super.xr();this.xx()}Zb(a){super.Zb(a/this.qa)}xx(){if(this.gd){const a=this.gd.displayObject().offsetLeft;L(this.Ij,"left",`${a}px`);L(this.Ij,"bottom","56px")}}dK(){if(this.Tc.Zd){var a=Z(this.K,`rate-${this.B.Wo().playbackRate()}x`);a=new bM({type:"uikit-secondary-button",icon:{element:a,Ie:"left"}});z(this,a.ka,this.gW,this);return a}return null}XG(){const a= +this.B.Wo().playbackRate();this.gd.Tm(Z(this.K,`rate-${a}x`));super.XG()}};class iU extends gU{constructor({zm:a,Sm:b,W:c,ia:d,Ia:e}){super({G:"landscape-bottom-panel",zm:a,Sm:b,W:c,ia:d,Ia:e});this.Yf&&N(this,this.Yf,0);this.Sk&&this.Sk.fa("landscape",!0);this.KJ();this.xx();this.eB=E(this)}xr(){super.xr();this.Yf&&!this.oi(this.Yf)&&N(this,this.Yf,0)}rH(){return!this.Jw.kk&&super.rH()}XC(){return this.eB}Kd(a){super.Kd(a/this.qa)}xx(){this.gd&&(L(this.Ij,"right","56px"),L(this.Ij,"top","8px"))}KJ(){this.rH()?this.Zb(0):L(this,"width","")}Cy(){if(this.Jw.kk){const a=new bM({type:"uikit-secondary-button", +icon:{element:Z(this.K,"outline_landscape"),Ie:"left"}});z(this,a.ka,()=>this.eB.C(),this);return a}return null}dK(){if(this.Tc.Zd){const a=new bM({type:"uikit-secondary-button",icon:{element:Z(this.K,"rate"),Ie:"left"}});z(this,a.ka,this.gW,this);return a}return null}};class jU extends zC{constructor(a,b,c,d){super(null,[0],[1],300);this.Ec=a;this.xy=b;this.$G=c;this.SZ=d}mp(){const a=Math.round(this.coords[0]*this.Ec.width());this.SZ?(vn(this.Ec.displayObject(),a,0),vn(this.xy.displayObject(),a-this.Ec.width(),this.$G)):(vn(this.Ec.displayObject(),-a,0),vn(this.xy.displayObject(),this.Ec.width()-a,this.$G))}Ro(){this.SZ?vn(this.xy.displayObject(),-this.Ec.width(),this.$G):vn(this.xy.displayObject(),this.Ec.width(),this.$G);super.Ro()}yl(){super.yl();vn(this.Ec.displayObject(), +0,0);vn(this.xy.displayObject(),0,0)}};function kU(a){for(let b=0;bthis.i0)if(this.dispatchEvent(new sU("start",this,a.clientX,a.clientY,a)))this.Mt=!0;else{this.gx||this.EH(a);return}}c=vU(this,b,c);b=c.x;c=c.y;this.Mt&&this.dispatchEvent(new sU("beforedrag",this,a.clientX,a.clientY,a,b,c))&& +(wU(this,a,b,c),a.preventDefault())}};function vU(a,b,c){var d=vd(od(a.ld).ld);b+=d.x-a.KQ.x;c+=d.y-a.KQ.y;a.KQ=d;a.deltaX+=b;a.deltaY+=c;return new Xc(tU(a,a.deltaX),uU(a,a.deltaY))}k.lba=function(a){var b=vU(this,0,0);a.clientX=this.clientX;a.clientY=this.clientY;wU(this,a,b.x,b.y)};function wU(a,b,c,d){a.iD&&rU(a)?a.target.style.right=c+"px":a.target.style.left=c+"px";a.target.style.top=d+"px";a.dispatchEvent(new sU("drag",a,b.clientX,b.clientY,b,c,d))} +function tU(a,b){var c=a.r0;a=isNaN(c.left)?null:c.left;c=isNaN(c.width)?0:c.width;return Math.min(null!=a?a+c:Infinity,Math.max(null!=a?a:-Infinity,b))}function uU(a,b){var c=a.r0;a=isNaN(c.top)?null:c.top;c=isNaN(c.height)?0:c.height;return Math.min(null!=a?a+c:Infinity,Math.max(null!=a?a:-Infinity,b))}function sU(a,b,c,d,e,f,g){ce.call(this,a);this.clientX=c;this.clientY=d;this.Jt=e;this.left=void 0!==f?f:b.deltaX;this.top=void 0!==g?g:b.deltaY}t(sU,ce);function xU(a,b,c,d,e){It.call(this,a);void 0===e&&(e={});void 0!==d&&(e.snap=d);yU(this,e,b,c);this.Ui=new C}t(xU,It); +function yU(a,b,c,d){d=d||"auto";c=c||"auto";if(Ii){Kt(a,"overflow","hidden");a.sa=new It(a.za());let e=!1;b.hideScrollbar=void 0!==b.hideScrollbar?b.hideScrollbar:!0;b.onBeforeScrollEnd=function(f){e&&(f.preventDefault(),f instanceof ie&&(f=f.oe),gh||(gh=new WeakMap),gh.set(f,!0))};b.vScroll="hidden"!=d;b.hScroll="hidden"!=c;b.scrollbarClass="scrollbar";b.onBeforeScrollMove=function(f){f.preventDefault()};b.onBeforeScrollStart=function(f){e=!1;f.target&&"INPUT"!=f.target.nodeName&&"A"!=f.target.nodeName&& +f.preventDefault()};a.sd=new iScroll(a.displayObject(),b);a.sd.options.onScrollMove=function(){e=!0;a.Ui.C()};a.sd.options.onScrollEnd=function(){a.Ui.C()}}else F(a.za(),"overflow","hidden"),F(a.za(),"width","100%"),F(a.za(),"height","100%"),a.sa=new Mt,a.sa.displayObject().className=a.za().className,Bd(a.za(),a.sa.displayObject()),"hidden"!=d&&(a.ua=zU(a),a.ua.CB.addHandler(a.uW,a),a.V(a.ua)),"hidden"!=c&&(a.Ic=AU(a),a.Ic.CB.addHandler(a.uW,a),a.V(a.Ic)),b=new cM(a.displayObject()),a.f8=!0,ve(a.displayObject(), +"mouseover",a.s8,!1,a),ve(a.displayObject(),"mouseout",a.Vl,!1,a),ve(b,"mousewheel",a.P5,!1,a),ve(document,Lm,a.xF,!1,a),ve(a.za(),"scroll",a.o6,!1,a)}k=xU.prototype;k.FL=!1;k.PE=!1;k.invalidate=function(){const a=this;setTimeout(()=>{a.sd?a.sd.refresh():BU(a)},0)};k.uW=function(){this.PE=!0};k.xF=function(a){this.PE&&(a.oe.stopImmediatePropagation(),this.PE=!1,!this.FL&&this.f8&&CU(this))}; +k.P5=function(a){if(this.ua&&a.deltaY){var b=0c)throw Error("minScrollPosition must be less or equal than maxScrollPosition");this.Ok=a;this.Ki=b;this.Bj=c;this.Ns=d;this.rs();this.If(this.Bb)}; +k.rs=function(){};k.Mp=function(){};k.jt=function(a){a=wv(a,this.Ki,this.Bj);this.Bb!=a&&(this.Bb=a,this.Ui.C())};k.$s=function(a){this.If(this.Bb+a)};k.Kw=function(){};k.YM=function(a){a.stopPropagation();this.$s(-this.Je());this.qB(this.Ze,-this.Je())};k.CM=function(a){a.stopPropagation();this.$s(this.Je());this.qB(this.fh,this.Je())}; +k.qB=function(a,b){this.km=a;ve(this.km.displayObject(),"mouseover",this.mA,!1,this);ve(this.km.displayObject(),"mouseout",this.lA,!1,this);ve(document,Lm,this.NA,!1,this);this.Ti.stop();this.pq=function(){this.$s(this.hG)};this.hG=b;this.Ti.start()};k.NA=function(){De(this.km.displayObject(),"mouseover",this.mA,!1,this);De(this.km.displayObject(),"mouseout",this.lA,!1,this);De(document,Lm,this.NA,!1,this);this.Ti.stop();this.pq=null};k.mA=function(){this.Ti.start()};k.lA=function(){this.Ti.stop()}; +k.QM=function(){this.pq&&this.pq()};k.pA=function(a){this.CB.C();a.stopPropagation();const b=this.GO();this.Vr=new pU(this.La.displayObject(),null,b);this.Vr.CR(a);this.Vr.deltaY=this.La.displayObject().offsetTop-this.Ze.height();this.Vr.deltaX=this.La.displayObject().offsetLeft-this.Ze.width();ve(this.Vr,"drag",this.Xl,!1,this);a=this.La.displayObject();mn(a,"active")};k.qF=function(a){this.Vr&&(a.preventDefault(),this.Vr.Xc(),this.Vr=void 0,a=this.La.displayObject(),nn(a,"active"))};k.Xl=function(){}; +k.resize=function(a,b){KU.Mb.resize.call(this,a,b);this.rs()};k.Xc=function(){Te(this.La);Te(this.fh);Te(this.Ze)};function FU(){KU.call(this,"vscrollbar")}t(FU,KU);k=FU.prototype;k.rs=function(){const a=this.height()-this.Ze.height()-this.fh.height();0==fM(this)?this.La.Kd(a):this.La.Kd(Math.max(this.cF,Math.ceil(this.Ok/(fM(this)+this.Ok)*a)));this.Mp()};k.Mp=function(){const a=this.li();0==fM(this)?this.La.Cg(a.top):this.La.Cg(Math.round((this.Bb-this.Ki)/fM(this)*a.height))}; +k.li=function(){const a=new Wf(0,0,0,0);a.top=this.Ze.height();a.height=this.height()-this.fh.height()-this.La.height()-a.top;a.left=this.La.x();return a};k.GO=function(){const a=this.li();a.top=0;return a};k.Kw=function(a){var b=this.li();a=a.offsetY-this.Ze.height()-this.La.height()/2;a=wv(a,0,b.height);b=0!=this.Ns?this.Ns:this.Ok;b=a<=this.La.y()?-b:b;this.If(this.Bb+b);this.Xl()};k.Xl=function(){var a=this.li();a=parseFloat(this.La.displayObject().style.top)/a.height;this.jt(a*fM(this)+this.Ki)}; +function HU(){KU.call(this,"hscrollbar")}t(HU,KU);k=HU.prototype;k.rs=function(){const a=this.width()-this.Ze.width()-this.fh.width();0==fM(this)?this.La.Zb(a):this.La.Zb(Math.max(this.cF,Math.ceil(this.Ok/(fM(this)+this.Ok)*a)));this.Mp()};k.Mp=function(){const a=this.li();0==fM(this)?this.La.oj(a.left):this.La.oj(Math.round((this.Bb-this.Ki)/fM(this)*a.width))}; +k.li=function(){const a=new Wf(0,0,0,0);a.left=this.Ze.width();a.width=this.width()-this.fh.width()-this.La.width()-a.left;a.top=this.La.y();return a};k.GO=function(){const a=this.li();a.left=0;return a};k.Kw=function(a){const b=this.li();a=a.offsetX-this.Ze.width()-this.La.width()/2;a=wv(a,0,b.width);this.La.oj(a);this.Xl()};k.Xl=function(){var a=this.li();a=parseFloat(this.La.displayObject().style.left)/a.width;this.jt(a*fM(this)+this.Ki)};function LU(a){a.Tv=[a.H.showOutline&&"outline",a.H.te&&"notes",a.H.Wg&&"presenterInfo",a.H.EI&&"attachments"].filter(b=>!!b);MU(a)}function NU(a,b,c){const d=b&&a.Tv.includes(b)?b:a.Tv[0];if(c||a.Su!=b)a.Su=d,a.oa.iR(d),a.Ka&&OU(a.Ka,d),(b=PU(a,d))&&QU(a,b)} +function MU(a){var b=a.displayObject();nn(b,"tab_control");Se(a,a.Ka);a.Ka=null;if(1d||(d=f,fb.top?e=b.top:c+lb.left?f=b.left:d+h{var d=this.sa.displayObject();nn(d,"animation");this.Wh&&this.sa.content().removeChild(this.Wh);this.Wh=c;IU(this.sa,0,0);this.Uv=a;this.FE()}, +!1,this);b.play()}jT(){this.Rq().C()}q8(){this.FY(void 0,!0)}FE(){var a=this.oa;a.Uv=this.Uv;a.ub();this.sa.invalidate();this.oa.ub()}};function OU(a,b){Object.keys(a.Nf).forEach(c=>{a.Nf[c].yh(b===c)})}function UU(a,b){switch(b){case "outline":return a.I.ha("PB_TITLE_PANEL_OUTLINE");case "notes":return a.I.ha("PB_TITLE_PANEL_NOTES");case "attachments":return a.I.ha("PB_TITLE_PANEL_ATTACHMENTS");case "presenterInfo":return a.I.ha("PB_TITLE_PANEL_PRESENTER_INFO")}throw Error("unknown page type");} +function VU(a){switch(a){case "PB_TITLE_PANEL_OUTLINE":return"outline";case "PB_TITLE_PANEL_NOTES":return"notes";case "PB_TITLE_PANEL_PRESENTER_INFO":return"presenterInfo";case "PB_TITLE_PANEL_ATTACHMENTS":return"attachments"}throw Error("unexpected message id");} +class WU extends P{constructor(a){super({G:"bottom-panel"});this.I=a;this.Nf={};this.Zm=[];this.CY=new C;z(this,this.I.jh,this.g4,this)}vP(a){const b=this.Oe(a);this.V(b);z(this,b.ka,()=>this.CY.C(a));this.Nf[a]=b;this.Zm.push(a)}resize(a,b){super.resize(a,b);b=Math.floor(a);a=Math.floor(b/this.Zm.length);b-=this.Zm.length*a;for(let c=0;c{a.yC?this.xY.C(this):this.HY.C(this)})}slide(){return this.ya}l0(){}};class eV{constructor({slide:a,Zc:b,QH:c,location:d,Kx:e}){this.slide=a;this.Zc=b;this.QH=c||"";this.location=d||null;this.Kx=e||null;this.selected=this.yC=!1}};function fV(a){const b=a.Fk.QH?a.Fk.QH+". ":"";if(a.Fk.Kx&&a.Fk.location&&(-1$1"),b+(a||"---")):b+(c||"---")} +class gV extends dV{constructor(a,b,c){super({selected:a.selected,Zc:a.Zc,yC:a.yC,slide:a.slide},b);this.I=c;this.Fk=a;this.BB.gp(fV(this));z(this,this.I.jh,this.$i,this)}l0(){const a=parseFloat(Eh(this.displayObject(),"min-height"));if(this.Qk){var b=$h(this.Qk.displayObject());var c=ci(this.Qk.displayObject());b=this.Qk.height()+b.top+b.bottom+c.top+c.bottom}else b=0;c=this.BB?this.BB.height():0;this.Kd(Math.max(a,b,c))}FJ(a,b,c,d){let e=null,f=null;b.some(g=>{if(0>g.toLocaleLowerCase().indexOf(a))return!1; +e=g.replace(new RegExp(`(${a.toLocaleLowerCase()})`,"gi"),"$1");f=`${this.I.ha(d)}
    `+c;return!0});return e&&f?f+e:null}$i(a){switch(a){case "PB_SEARCH_RESULT_IN_TEXT_LABEL":case "PB_SEARCH_RESULT_IN_NOTES":this.BB.gp(fV(this))}}};class hV extends lU{constructor(a,b,c){super();a.forEach(d=>{d=new gV(d,b,c);z(this,d.HY,this.K5,this);z(this,d.xY,this.s6,this);this.V(d);this.rb.push(d)})}};class iV extends P{constructor(a,b){super({G:"search_panel"});this.I=a;this.pw=new C;this.jL=!1;this.K=b;b=new P({za:Z(this.K,"search"),ga:O(this,"search-icon")});N(this,b);this.rq=new yO({G:"search_input",prompt:a.ha("PB_SEARCH_PANEL_DEFAULT_TEXT")});N(this,this.rq);b=new P({ga:O(this,"cancel-button")});const c=new P({za:Z(this.K,"close")});N(b,c);this.AS=b;N(this,this.AS);z(this,this.rq.uL,this.H6,this);z(this,a.jh,this.$i,this)}XQ(){this.rq.displayObject().blur()}J(a){super.J(a);a||(this.jL=!0, +this.rq.Px(""),this.jL=!1)}VC(a){this.rq.Px(a)}H6(){this.jL||this.pw.C(this.rq.value())}$i(a){"PB_SEARCH_PANEL_DEFAULT_TEXT"===a&&this.rq.setAttribute("placeholder",this.I.ha("PB_SEARCH_PANEL_DEFAULT_TEXT"))}};function jV(a){let b;"outline"==a.Eb&&void 0!==a.Uv?(b=a.TW,a.Eu.J(!0),kV(a,!1)):(a.Eu.J(!1),"outline"===a.Eb&&a.H.outline.search&&kV(a,!0));void 0===b&&(b=lV(a,a.Eb));a.me.la(b)}function kV(a,b){a.De&&a.De.J(b)}function mV(a){return a.H.outline.search&&"outline"===a.Eb&&(!a.hd||!a.hd.visible())} +function lV(a,b){switch(b){case "outline":return a.I.ha("PB_TITLE_PANEL_OUTLINE");case "notes":return a.I.ha("PB_TITLE_PANEL_NOTES");case "attachments":return a.I.ha("PB_TITLE_PANEL_ATTACHMENTS");case "presenterInfo":return a.I.ha("PB_TITLE_PANEL_PRESENTER_INFO")}throw Error("unknown page type");} +class nV extends P{constructor(a,b,c){super({G:"menu-layer-top-panel"});this.I=a;this.K=b;this.H=c;this.Uv=void 0;this.TW="";this.Eb="outline";this.pw=E(this);this.pS=E(this);this.PD=E(this);this.me=this.Ky();N(this,this.me);this.OD=this.Oe(Z(this.K,"close"),"close-button");z(this,this.OD.ka,()=>this.Rq().C());N(this,this.OD);this.hd=this.De=null;this.FU();this.Eu=this.Oe(Z(this.K,"back"),"back-button");z(this,this.Eu.ka,()=>this.pS.C());N(this,this.Eu);z(this,this.H.outline.lb,this.FU,this);z(this, +this.I.jh,this.n4,this)}Rq(){return this.PD}iR(a){this.Eb=a;jV(this);"outline"==this.Eb&&this.H.outline.search?kV(this,!0):(kV(this,!1),oV(this))}XQ(){this.hd&&this.hd.XQ()}VC(a){this.hd&&(this.hd.VC(a),a&&this.EY(!1))}FU(){!this.H.outline.search||this.De||this.hd||(this.De=this.fK(),this.De.J(mV(this)),N(this,this.De),z(this,this.De.ka,this.EY,this),this.hd=new iV(this.I,this.K),this.hd.J(!1),z(this,this.hd.pw,this.q6,this),N(this,this.hd),z(this,this.hd.AS.ka,this.DV,this));this.hd&&this.hd.visible()&& +!(this.H.outline.search&&"outline"===this.Eb&&this.hd&&this.hd.visible())&&this.DV();this.De&&this.De.J(mV(this))}q6(a){this.pw.C(a)}DV(){this.pw.C("");oV(this)}$a(){jV(this);this.hd&&this.hd.visible()&&this.hd.ub()}nR(a){this.TW=a}n4(a){switch(a){case "PB_TITLE_PANEL_OUTLINE":case "PB_TITLE_PANEL_NOTES":case "PB_TITLE_PANEL_ATTACHMENTS":case "PB_TITLE_PANEL_PRESENTER_INFO":jV(this)}}};function oV(a){a.hd&&(a.hd.J(!1),a.OD.J(!0),a.me.J(!0),"outline"===a.Eb&&a.H.outline.search&&a.De.J(!0))}class pV extends nV{fK(){return this.Oe(Z(this.K,"search"),"search-button")}Ky(){return new P({G:"tab-title"})}Oe(a,b){b=new P({G:b});a=new P({za:a});N(b,a);return b}EY(a){void 0===a&&(a=!0);this.hd.J(!0);this.De.J(!1);this.OD.J(!1);this.me.J(!1);a&&this.hd.rq.focus()}};function PU(a,b){if("outline"==b){if(a.mm){a.oa.VC(a.mm);return}return void 0!==a.Ng&&a.Uv==a.Yn&&a.Ng?new P({za:a.Ng.displayObject()}):TU(a)}if("attachments"==b)return new lN(a.OA,a.K,a.I);if("presenterInfo"==b)return new bV(a.I,a.K,a.Yn.zg());if("notes"==b)return b=new P({G:"notes"}),(a=a.Yn.pj())&&a.text()&&b.la(a.text()),b;throw Error("unknown page type");} +function TU(a){const b=[];for(let d=0;dqV(a,b.slide,!0,RU(a,b.slide),b.location))} +class tV extends SU{constructor({ia:a,Ia:b,slides:c,resources:d,settings:e}){super({ia:a,Ia:b,slides:c,resources:d,settings:e})}Tr(){return new pV(this.I,this.K,this.H)}VJ(){return new ZU(this.I,this.K)}WN(a){if(this.mm=a.toLowerCase()){var b=sV(this);a=new P({G:"search-result-layout"});const c=new P({G:"result-label"});Ht(c,this.I,"PB_SEARCH_RESULTS_LABEL");a.V(c);b.length?a.V(rV(this,b)):(b=new P({G:"no-matches-label"}),Ht(b,this.I,"PB_SEARCH_NO_RESULTS_LABEL"),a.V(b));QU(this,a)}else NU(this,this.Su, +!0)}};function uV(a,b){a.RY.gp(b)}function vV(a){a.Yf&&z(a,a.Yf.ka,()=>a.eB.C(),a)} +class wV extends P{constructor(a,b,c){super({G:"top-panel"});this.K=a;this.B=b;this.H=c;this.eB=E(this);this.qa=Ki();this.RY=new P({G:"slide-info"});N(this,this.RY);this.Yf=null;this.DU();wn(this.displayObject(),this.qa);yi(this.displayObject(),"0 0");z(this,this.H.lb,this.DU,this)}XC(){return this.eB}Zb(a){super.Zb(a/this.qa)}DU(){this.H.kk&&!this.Yf&&(this.Yf=this.Cy(),vV(this),N(this,this.Yf));this.Yf&&this.Yf.J(this.H.kk)}};class xV extends wV{constructor(a,b,c){super(a,b,c);Dj&&this.V(new PM({G:"back-to-app-button",vca:Z(a,"back_to_app")}))}Cy(){const a=new P({G:"menu-button"});Ft(a,"menu");z(this,a.ka,()=>this.XC().C(),this);const b=new P({za:Z(this.K,"outline")});N(a,b);return a}};function yV(a,b){a.kb=new RT(!Mi);a.kb.J(!1);yi(a.kb.displayObject(),"left top");a.V(a.kb.displayObject());x(a,a.kb.displayObject(),"click",a.SM,a,!0);z(a,a.B.Z().Cc(),()=>{const c="buffering"==a.B.Z().state();var d=a.kb;c?d.xf.show():d.xf.Oc()});oO(a.kb,b.Ar().view());b=a.F.nd().Lf();for(let c=0;c{"activated"==e.playbackState()?(pO(a.kb,e.width(),e.height()),XT(a.fd),a.Jh!=e&&(a.Jh=e)):"deactivated"==e.playbackState()&&(a.Jh=void 0); +a.Cz()})}a.fd=new ZT({Lca:a.kb,Fx:a.R,IP:new IT(a.H)});z(a,a.fd.$z,a.WM,a)}function zV(a){if(a.wa){const b=a.Ka?a.Ka.height()*a.qa:0;L(a.wa,"bottom",`${b}px`)}}function AV(a,b){z(a,b.LY,(c,d,e)=>{BV(a)&&(e.preventAction(),a.SM())})} +function CV(a){if(a.H.topPanel.kk){var b=a.D.Ba().resources().ti();b={ia:a.I,Ia:a.K,slides:a.D.Ba().slides(),resources:b,settings:a.H.Ke};a.Dd=new tV(b);a.Dd.J(!1);B(a,a.Dd);z(a,a.Dd.Rq(),a.X2,a);z(a,a.Dd.$T,c=>{a.zy();a.R.Xd().pe(c.index(),!0)});1a.dB())}function EV(a){if(a.H.zc.oI)return!0;if(-1===a.B.ma())return!1;a=a.B.$().nb();return 1{wt(this.displayObject(),"not_loaded");zV(this);g&&(e=new ZL,e=new LM(a,e),Qe(this,e.yA,()=>this.B.play()),e.show(this.displayObject()))});b=this.Hy();this.R.displayObject().appendChild(b.displayObject());AV(this,a.view().yr());x(this,this.R.displayObject(), +"click",this.SM,this,!0);z(this,this.B.Z().Sb(),this.zz,this);z(this,this.H.topPanel.yc,this.Hk,this);z(this,this.H.topPanel.lb,this.Hk,this);z(this,this.H.bottomPanel.yc,this.Hk,this);z(this,this.H.zc.yc,this.Hk,this)}Hk(){this.H.topPanel.visible&&!this.oa?this.Tr():!this.H.topPanel.visible&&this.oa&&this.IN();this.oa&&this.V(this.oa);this.H.bottomPanel.visible&&!this.Ka?this.VJ():!this.H.bottomPanel.visible&&this.Ka&&(Se(this,this.Ka),this.Ka=null);this.Ka&&this.V(this.Ka);this.ov();!this.H.bottomPanel.visible&& +!this.H.topPanel.visible||this.td?this.H.bottomPanel.visible||this.H.topPanel.visible||!this.td||(Se(this,this.td),this.td=null):DV(this);this.td&&this.V(this.td);this.H.topPanel.kk&&!this.Dd?CV(this):!this.H.topPanel.kk&&this.Dd&&(this.Dd.visible()&&this.zy(),Se(this,this.Dd),this.Dd=null);this.Dd&&this.V(this.Dd);this.Aj(this.jd.width,this.jd.height);this.Ka&&this.Ka.fa("with-border",!this.wa)}IN(){Se(this,this.oa);this.oa=null}Tr(){this.H.topPanel.visible&&(this.oa=new xV(this.K,this.tc,this.H.topPanel), +z(this,this.oa.ka,()=>this.Ji()),z(this,this.oa.XC(),()=>this.dB()),B(this,this.oa))}VJ(){this.H.bottomPanel.visible&&(this.Ka=new hU({W:this.R.Xd(),slides:this.D.Ba().slides(),zm:this.H.bottomPanel,Sm:this.H.topPanel,ia:this.I,Ia:this.K}),B(this,this.Ka),z(this,this.Ka.ka,()=>this.Ji()))}ov(){this.H.zc.visible&&EV(this)&&!this.wa?this.Sr():this.H.zc.visible&&EV(this)||!this.wa||this.MA();this.wa&&this.V(this.wa)}MA(){Se(this,this.wa);this.wa=null}Sr(){this.H.zc.visible&&(this.wa=new aU,B(this,this.wa))}zz(){if(this.wa){var a= +this.D.Ba().slides();if(this.H.zc.oI){var b=this.B.Z().timestamp();a=a.mi(b,!1,!0)/a.wu()}else{var c=this.B;if(-1==c.ma())a=0;else{var d=c.$();b=c.Z().timestamp();b=a.mi(b,!1,!1);c=-1==c.ma()?0:c.$().nb().duration();d=new gf(d.index(),0,0);a=a.mi(d,!1,!1);a=0a.J(b.kd()));return a}dB(a,b){super.dB(a,b);this.Dd&&(this.Dd.nR(b||""),this.Dd.show(this.B.$(),a));this.oa&&this.oa.J(!1);this.Ka&& +this.Ka.J(!1);this.td&&this.td.J(!1)}zy(){this.Dd&&this.Dd.Oc();const a=this.lq;this.oa&&this.oa.J(!a);this.Ka&&this.Ka.J(!a);this.td&&this.td.J(!a);super.zy()}uF(a){"changeLayout"==a.name()&&(a=a.params().type,this.fd.iR(a),this.Ji())}Aj(a,b){this.jd=new cd(a,b);a>b?(vt(this.displayObject(),"landscape"),this.kb&&vt(this.kb.displayObject(),"landscape")):(wt(this.displayObject(),"landscape"),this.kb&&wt(this.kb.displayObject(),"landscape"));this.td&&this.td.tC();this.Ka&&this.Ka.tC();this.fd.WC(this.jd); +super.Aj(a,b)}zL(a,b,c){var d=BV(this);var e=0;if(this.oa&&!BV(this)){var f=parseFloat(Eh(this.oa.displayObject(),"height"));isNaN(f)||(e+=f)}this.lq&&(e=0);a:{if(this.Ka&&!BV(this)&&(f=parseFloat(Eh(this.Ka.displayObject(),"height")),!isNaN(f)))break a;f=0}e+=f;f=0;this.td&&d&&(d=this.td.width(),f+=d*this.qa,this.td.Kd(b),this.td.Cg(-(b/this.qa)+b),L(this.td,"right",`${-d*(1-this.qa)}px`));d=a-f;super.zL(d,b-e,c);FV(this,!0);this.Cz();zV(this);this.Dd&&(this.Dd.resize(a,b),this.Dd.visible()&&this.Dd.ub()); +this.wa&&this.wa.Zb(d);this.oa&&this.oa.Zb(a);this.Ka&&(L(this.Ka,"bottom",`${c}px`),this.Ka.Zb(a))}Cz(){ST(this.fd,this.Xe&&!!this.Jh);this.fd.vl();BV(this)||this.fd.hp(this.kb)}WM(a){this.fd.vl();a&&(this.fd.hr()==this.R?this.displayObject().insertBefore(this.kb.displayObject(),this.R.displayObject()):this.displayObject().insertBefore(this.R.displayObject(),this.kb.displayObject()))}ke(){super.ke();var a=this.Jh,b=this.F.nd().Lf();if(!a)for(var c=0;c=this.B.ma()){a=e;break}}this.Xe=!!a;ST(this.fd,this.Xe);a=-1!=this.B.ma()?this.B.$():null;this.oa&&(b="-",a&&a.visible()&&(b=this.B.$().Ci()+1),uV(this.oa,b+"/"+this.F.slides().np()));const d=this.lq;[this.oa,this.Ka,this.wa,this.td].forEach(e=>e&&e.J(!d));if(a=this.B.fb())b=this.B.$(),c=new QL(this.tc,OL),b=new RL(a.playerController(),c,2==b.Bn),a.setExternalNavigationController(b);this.Ji();FV(this);this.ov();this.Aj(this.jd.width,this.jd.height);this.fd.vl()}Ji(){yj&&this.Xe&& +yn(this.kb.displayObject())}SM(a){if(BV(this)){var b=!1,c=this.B.Ud();a&&a.target&&(b=c.view(),b=null===b.jv?!1:-1!=Ia(b.jv,Ld(a.target)));a=!1;this.oa&&(a=0==this.oa.opacity());b&&a||HV(this,a)}}showTopPanel(a){this.oa&&L(this.oa,"z-index",a?"99":"")}showBottomPanel(a){this.Ka&&L(this.Ka,"z-index",a?"99":"");this.td&&L(this.td,"z-index",a?"99":"")}}IV.prototype.showBottomPanel=IV.prototype.showBottomPanel;IV.prototype.showTopPanel=IV.prototype.showTopPanel;class JV extends P{constructor({G:a,ic:b,ia:c,Ia:d}){super({G:a,rf:!0});this.D=b;this.R=b.view();this.F=b.Ba();this.I=c;this.K=d;this.B=b.view().W();this.Ca=this.B.Z();this.tc=b.view().Xd();this.vg=new xM(this.displayObject(),"popup-layer");Ft(this.vg.Co,O(this,"popup-layer"));this.vk=new zM({ia:this.I,XI:this.vg});this.qa=1;z(this,b.Tx(),this.Mn,this);z(this,b.view().Xd().Dx(),this.Ln,this);z(this,b.vx(),(e,f,g)=>{if(g){e=new ZL;e=new LM(b,e);var h=z(this,e.yA,()=>{Ke(this,h);this.B.play()},this); +e.show(this.displayObject())}},this)}$a(a,b){a&&b&&this.vg.zl(a,b)}Mn(a){if("resumePlayback"==a.action()&&"prompt"==this.F.settings().Pc().eu()){const b=this.B.Gf();this.sL(b);const c=a.L();a.fu("delayStartup");const d=a.Fw;(()=>{yM(this.vk,{Rm:"PB_RESUME_PRESENTATION_WINDOW_TEXT",icon:Z(this.K,"mb_question_icon"),buttons:[{yg:"PB_MESSAGE_BOX_YES",result:"yes"},{yg:"PB_MESSAGE_BOX_NO",result:"no"}]}).then(e=>{this.R.setOverlayDisplayed(!1);"yes"==e?d.resume(c,!0):d.start(b,!0)});this.R.setOverlayDisplayed(!0)})()}else"gotoSlide"== +a.action()&&this.sL(a.L())}sL(){}gh(a,b){return(a.ja(b).Ci()+1).toString()}Ln(a){const b={},c=this.F.slides();let d;switch(a.od().type()){case "currentSlideIsNotCompleted":d="PB_CURRENT_SLIDE_IS_NOT_COMPLETED";break;case "backwardNavigationIsRestricted":case "forwardNavigationIsRestricted":d="sequential"==this.F.settings().navigation().navigationType()?"PB_NAVIGATION_IS_SEQUENTIAL":"PB_NAVIGATION_IS_RESTRICTED";break;case "interactionNotCompleted":d="PB_QUIZ_SLIDE_WINDOW_TEXT";a=this.B.$();a instanceof +Aq?d="PB_SCENARIO_SLIDE_WINDOW_TEXT":a instanceof sq&&(d="PB_INTERACTION_SLIDE_WINDOW_TEXT");break;case "precedingQuizFailed":d="PB_PRECEDING_QUIZ_FAILED_WINDOW_TEXT";b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;case "precedingQuizNotPassed":d="PB_PRECEDING_QUIZ_NOT_PASSED_WINDOW_TEXT";b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;case "precedingQuizNotCompleted":d="PB_PRECEDING_QUIZ_NOT_COMPLETED_WINDOW_TEXT";b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;case "precedingScenarioNotPassed":d="PB_PRECEDING_SCENARIO_NOT_PASSED_WINDOW_TEXT"; +b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;case "precedingScenarioFailed":d="PB_PRECEDING_SCENARIO_FAILED_WINDOW_TEXT";b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;case "precedingScenarioNotCompleted":d="PB_PRECEDING_SCENARIO_NOT_COMPLETED_WINDOW_TEXT";b.SLIDE_INDEX=this.gh(c,a.od().Jd());break;default:return}this.$n(d,b)}iA(a){Vs(this.Ca,a)}$n(a,b){const c=this.B.Z().suspended();this.R.setOverlayDisplayed(!0);yM(this.vk,{Rm:a,icon:Z(this.K,"mb_warning_icon"),buttons:[{yg:"PB_MESSAGE_BOX_OK",result:"ok"}], +px:()=>b}).then(()=>{this.R.setOverlayDisplayed(!1);this.iA(c)})}};class KV extends P{constructor(){super({G:"preloader"});this.l8=800;this.V4=500;this.ko=!1;this.m8=E(this);this.T3=E(this);this.J(!1)}show(){this.ko||(this.ko=!0,clearTimeout(this.pz),clearTimeout(this.fB),this.fB=Gi(this.y6,this,this.l8))}Oc(){if(this.ko&&(this.ko=!1,clearTimeout(this.pz),clearTimeout(this.fB),this.visible())){var a=this.V4-((new Date).getTime()-this.r8);0{this.Tl.contains(g.target)||(this.Te.contains(g.target)||!this.R.displayObject().contains(g.target)? +(QV(this,!this.Tl.visible()),RV(this),g.preventDefault()):QV(this,!1))},Nm)}hr(){return this.Uc}$H(){return this.Uc==this.Te?this.R:this.Te}vl(){this.JE();this.xL();var a=this.vb;if(LV(this.Ra))a.Te.fa("draggable",!1),TV(a,!1);else{const b=a.fd.hr();a.Te.fa("draggable",b==a.Te);TV(a,b==a.R)}RV(this)}JE(){const a=this.qE(),b=this.on(this.R);this.R.resize(a.width,a.height);this.ht(this.R.displayObject(),b)}qE(){if(this.Uc==this.R){var a=this.Ra;var b=a.F.slideWidth();var c=a.F.slideHeight();a=NV(a); +const {width:d,height:e}=An({width:b,height:c,boundingWidth:a.width,boundingHeight:a.height,TB:!0});b=new cd(d,e)}else b=this.Ra,a=null,c=b.B,-1!=c.ma()&&(c.Oa()&&(a=c.Oa().quiz().quizSize(),a=new cd(a.width,a.height)),c.fb()&&(a=c.fb().currentSession().interaction().interactionSize(),a=new cd(a.width,a.height)),c.ob()),c=a||new cd(b.F.slideWidth(),b.F.slideHeight()),b=OV(b,c.width,c.height);return b}xL(){if(this.Uc==this.Te)var a=NV(this.Ra);else a=this.Ra,a=a.ln?OV(a,a.ln.width(),a.ln.height()): +new cd(0,0);this.Te.resize(a.width,a.height);const b=ci(this.Te.displayObject());this.Hq.resize(a.width-b.left-b.right,a.height-b.top-b.bottom);this.Cz()}Cz(){const a=this.on(this.Te);this.ht(this.Te.displayObject(),a)}on(a){a=this.Uc!=a;return LV(this.Ra)||a?new Xc(0,0):this.mn?new Xc(this.hm,this.im):MV(this.Ra)}ht(a,b){F(a,"transform",`translate(${b.x}px, ${b.y}px)`)}oW(){this.vl();this.xk&&Se(this,this.xk);this.mn=!1;QV(this,!1);if(fL()&&this.Cb&&this.Cb.showed()){let a=0,b=0;this.xk=new QT(this.Uc.displayObject(), +{M0:()=>{if(!this.mn){const c=MV(this.Ra);this.hm=c.x;this.im=c.y}a=this.hm;b=this.im},L0:c=>{this.mn=!0;this.hm=wv(a+c.x,0,this.vb.width()-this.Uc.width());this.im=wv(b+c.y,0,this.vb.height()-this.Uc.height());this.JE();this.Cz()},fba:()=>{}});B(this,this.xk)}}WM(){this.hp(this.$H())}hp(a){this.Uc=a;QV(this,!1);this.$z.C()}};function UV(a){const b=new P({G:"video-narration-view"});Ft(b,O(a,"narration-view"));b.J(!1);b.V(a.Hq);N(a.Gi,b);return b}function VV(a,b){return new PV({fC:a,sidePanelController:a.Cb,Ba:b.Ba(),W:b.view().W()})}function WV(a){const b=new SV({fC:a,IP:a.Ra,Xaa:a.Te,Fx:a.R,sidePanelController:a.Cb,Mca:a.Hq});B(a,b);z(a,b.$z,a.ZV,a);return b}function XV(a){const b=a.VK(),c=void 0!==b;YV(a,c);c?a.Ra.ln=b:(a.Ra.ln=null,a.fd.hp(a.Te))} +function ZV(a,b){for(let c=0;c{"activated"==e.playbackState()?a.Jh!=e&&(a.Jh=e,YV(a,!0),a.Ra.ln=e):"deactivated"==e.playbackState()&&(a.Jh=void 0,XV(a));a.fd.vl()},a)}}function $V(a,b){const c=a.F.slides().ja(b).No();let d;for(let e=0;e{var f=this.fd;f.vl();f.oW();QV(f,!1)},this);z(this,this.B.Z().aC(),this.l4,this);z(this,this.B.Bc(),()=>{XV(this);this.fd.vl()}, +this);ZV(this,d);this.ZV();this.fa("portrait",!fL())}gn(a){"MaximizedVideo"==a&&this.fd.hp(this.R)}hr(){return this.fd.hr()}$H(){return this.fd.$H()}VK(){let a=this.Jh;const b=this.F.nd().Lf();if(!a)for(let c=0;c=this.B.ma()){a=d;break}}return a}$a(a,b){super.$a(a,b);this.fd.vl();this.fa("portrait",!fL())}l4(){this.B.Z().kd()?this.xf.show():this.xf.Oc()}ZV(){this.fd.vl();const a=this.fd.hr()==this.R;this.fa("presentation-minimized", +a);a?this.Gi.Ff(this.Te,0):this.Gi.Ff(this.R,0)}};function bW(a){a=new P({ga:O(a.Fa,"cc")});a.J(!1);return a}function cW(a){const b=new LN({Ba:a.F,W:a.R.W(),settings:a.H,ia:a.I,view:a,sidePanelController:a.Y});B(a,b);return b}function dW(a){a.H.xa.Qc.Yd?a.aP():a.bP()} +class eW extends JV{constructor(a,b,c,d){super({G:"universal-tablet",ic:a,ia:c,Ia:d});this.H=b;this.Hg=a.Uj();this.Ay=E(this);this.ew=new Xc(0,0);this.xN=1;this.qb=this.Se=null;this.Uy=[];this.Rd=this.jm=this.wa=this.Jb=this.pb=this.oa=this.Y=null;const {mQ:e,f0:f,g0:g}=SQ(this.F.slides());this.eL=f;this.ls=g;this.oz=e;this.Kb=this.H.xa.Hc;this.Rr=this.H.xa.controlPanel;this.Ri=this.Rr.zc;this.Ta=this.H.xa.Qc;this.rv=new P({G:"universal-layout",rf:!0});this.rv.fa("left-panel",this.Ta.Yd);N(this,this.rv, +0);this.Fa=new P({G:"universal-content-area"});N(this.rv,this.Fa);b=new P({G:"popups-layer"});Ft(b,O(this,"popups-layer"));N(this,b);this.Ja=new LP(b);this.Ja.setScale(1,1);this.AM=E(this,this.Ja.So());a.view();this.vb=this.WJ();N(this.Fa,this.vb);this.$c=bW(this);N(this.Fa,this.$c);this.gw=cW(this);this.Hk();this.Gc=this.yp();z(this,this.R.Le(),this.kA,this);z(this,this.B.Bc(),this.ke,this);z(this,this.Ta.lb,this.Yp,this);z(this,this.Ta.yc,this.Yp,this);z(this,this.Kb.yc,this.Yp,this);z(this,this.Rr.yc, +this.Yp,this);z(this,this.Ri.yc,this.Yp,this);a=new CM;z(this,a.pB,(h,l)=>this.resize(h,l))}sL(a){$V(this.vb,a)}m1(a){this.oa&&$S(this.oa,a)}YC(a){this.pb&&this.pb.YC(a)}So(){return this.AM}scale(){return 1}Yp(){this.Hk();Se(this,this.Gc);this.Gc=this.yp();this.rv.fa("left-panel",this.Ta.Yd);this.oa&&this.oa.ip(this.Y);this.Jb&&this.Jb.ip(this.Y);this.ub()}Hk(){this.Bz();this.CL();this.ov();sT(this);rT(this)}JX(){Se(this.Fa,this.pb);this.pb=null}YS(){return new vR({skinSettings:this.H,Ba:this.F,W:this.R.Xd(), +soundController:this.R.soundController(),nj:this.Ja,ia:this.I,Ia:this.K,Uj:this.Hg,Xw:this})}nz(){return jS({Ba:this.F,W:this.B,kD:null,kp:this.Ta})}Bz(){!this.Y&&this.nz()&&this.Ta.visible?this.gK():!this.Y||this.nz()&&this.Ta.visible||this.HN();this.Y&&this.rv.Ff(this.Y,1);this.gw.RR(this.Y)}HN(){Se(this.rv,this.Y);this.Y=null}gK(){this.Y=new hS(this.H,this.F,this.tc,this.I,this.K,!1);B(this,this.Y);dW(this);z(this,this.Y.showedStateChanged(),this.ub,this);this.gw.RR(this.Y)}CL(){this.iM()?this.Tr(): +this.jM()&&this.IN();this.oa&&this.Fa.Ff(this.oa,0)}iM(){return(this.ls||this.Kb.visible)&&!this.oa}jM(){return!(this.ls||this.Kb.visible)&&!!this.oa}IN(){Se(this.Fa,this.oa);this.oa=null}Tr(){this.oa=new dT({su:this.Kb,$j:this.H.outline,kp:this.Ta,Ba:this.F,W:this.tc,nj:this.Ja,ia:this.I,Ia:this.K,sidePanelController:this.Y});B(this,this.oa);z(this,this.oa.$L,this.Wp,this);z(this,this.oa.JK,this.w5,this)}Jy(){this.Jb=new sS({su:this.Kb,kp:this.Ta,Ia:this.K,sidePanelController:this.Y});B(this,this.Jb)}WJ(){return new aW({W:this.B, +ic:this.D,sidePanelController:this.Y,Ba:this.F,Lf:this.F.nd().Lf()})}yp(){if(this.pb){const a=new uS({W:this.B,B1:this.oa&&this.oa.displayObject(),K_:this.pb.displayObject()});B(this,a);return a}return null}ov(){!this.Rd&&tT(this);this.Ri.visible?(!this.wa&&this.Sr(),this.Rd.J(!1)):(this.wa&&this.MA(),this.Rd.J(!0));this.wa&&N(this.Fa,this.wa);this.Rd&&N(this.Fa,this.Rd)}MA(){Se(this.Fa,this.wa);this.jm=this.wa=null}Sr(){this.Ri.visible&&(this.wa=new KR({slides:this.F.slides(),settings:this.Ri,W:this.tc}), +this.jm=new NR({zc:this.wa,W:this.tc,Ba:this.F,settings:this.Ri}),B(this,this.wa),B(this,this.jm))}$a(a,b){super.$a(a,b);a&&b&&(a=(a=this.H.xa.Qc)&&a.visible&&a.Yd,a=this.Y&&this.Y.showed()&&a?this.Y.width():0,this.Ja.zl(12+a,this.width()-12,this.vb.height()),CP(this.Ja),a=0+(this.oa&&this.oa.visible()?this.oa.height():12),a+=this.pb&&this.pb.visible()?this.pb.height():12,b-=a,this.oa&&this.oa.ub(),this.pb&&(this.pb.BI(b-40),this.pb.ub()),this.Y&&(dW(this),this.Y.ub()),this.vb.ub())}aP(){this.Y.showed()? +L(this.Y,"margin-left",""):L(this.Y,"margin-left","-280px");L(this.Y,"margin-right","")}bP(){this.Y.showed()?L(this.Y,"margin-right",""):L(this.Y,"margin-right","-280px");L(this.Y,"margin-left","")}yY(){const a=this.H.xa.Hc;return a?a.visible&&a.pd:!1}UT(a){return(a=a.zg())&&a.Td()?a.Td():this.F.Td()}w5(){this.qb&&this.qb.FH()}Wp(a){"nothing"!=a&&(this.Se||this.cK(),this.qb||this.pL());this.Se&&this.Se.fa("tool",a);this.qb&&gO(this.qb,a)}cK(){this.Se=new P({G:"marker-tool-container"});this.Se.Cg(0); +this.R.displayObject().appendChild(this.Se.displayObject())}pL(){this.qb=new hO(this.R.wi().offsetWidth,this.R.wi().offsetHeight);this.Se.V(this.qb);this.qb.setScale(1);this.Uy[this.B.ma()]=this.qb;this.qq()}qq(){if(this.qb){this.qb.move(this.ew.x,this.ew.y);const a=this.R.scale();this.qb.setScale(a)}}kA(a,b,c,d){this.xN=a/this.R.width();this.ew=new Xc(c,d);this.qq()}ke(){var a=this.B.Oa(),b=this.B.fb();a||b?xn(this.R.wi(),"with-border")&&(a=this.R.wi(),nn(a,"with-border")):(a=this.R.wi(),mn(a,"with-border")); +CP(this.Ja);a=this.B.Oa();b=this.B.fb();const c=this.B.ob();this.wa&&this.wa.J(!a&&!b&&!c);this.Rd&&this.Rd.J(!this.wa||!this.wa.visible());this.xt();this.Se&&this.eO();this.pb&&(a=!!this.B.fb()||!!this.B.ob(),this.pb.fa("minimize",a));this.Bz();this.oa&&this.oa.ip(this.Y);this.Jb&&this.Jb.ip(this.Y)}eO(){let a="nothing";this.qb&&(a=this.qb.aO,gO(this.qb,"nothing"));const b=this.B.ma();Cd(this.Se.displayObject());this.qb=this.Uy[b];const c=this.B.Z(),d=z(this,c.Sb(),()=>{-1!=c.timestamp().Aa()&&(Ke(this, +d),this.qb&&this.Se&&this.Se.V(this.qb),this.Wp(a))},this);this.qq()}gh(a,b){b=a.ja(b).Ci();return this.H.outline.lj?uN(a)[b]:(b+1).toString()}xt(){if(this.$c.visible()){const a=this.B.$().pj();this.$c.la(a?a.text():"")}}h1(){this.$c.visible()||(this.$c.J(!0),this.xt(),this.Ay.C())}};function fW(a){const b=new xT(a.D(),a.Wa,a.I,a.K,a.ii);z(a,b.Xk,()=>a.Xk.C());z(a,b.Dk,()=>a.Dk.C());z(a,b.un,()=>a.un.C());return b} +class gW extends OM{constructor({fk:a,skinSettings:b,messages:c,ia:d,gj:e,Km:f}){super({fk:a,messages:c,gj:e});this.Wa=b;this.I=d;this.K=this.hK(f)}hK(a){return new zL(uj?a.Saa:a.oQ)}$S(a){if("normal"==a){if(uj){a=this.D();var b=this.Wa,c=this.I,d=this.K;try{window.isLearn()}catch(e){}a=new IV(a,b,c,d)}else a=Ii?new eW(this.D(),this.Wa,this.I,this.K):fW(this);this.Zk=a}else"accessible"==a&&(this.Zk=new tN({ic:this.fw,messages:this.fg,skinSettings:this.UJ()}));B(this,this.Zk)}UJ(){return(new yT(this.Wa)).create()}} +;var hW=class{constructor(){const a={colors:{A:"colors"},controlPanel:{A:"controlPanel",visible:{A:"visible"},showOutline:{A:"showOutline"},Jf:{A:"showPlayPause"},zc:{A:"progressBar",visible:{A:"visible"},enabled:{A:"enabled"},rr:{A:"showLabels"},mode:{A:"mode"}},ica:{A:"showRewind"},sr:{A:"showVolumeControl"},Bl:{A:"showCCButton"},jp:{A:"showSlideOnlyButton"},ou:{A:"showSlideNumbers"},Kf:{A:"showPrevButton"},qf:{A:"showNextButton"},Tg:{A:"navigationMode"},Zd:{A:"showPlaybackRateButton"}},Qc:{A:"sidePanel", +visible:{A:"visible"},Yd:{A:"showAtLeft"},pd:{A:"showLogo"},Wg:{A:"showPresenterInfo"},GI:{A:"showPresenterVideo"},te:{A:"showNotes"},showOutline:{A:"showOutline"}},Hc:{A:"titlePanel",Sq:{A:"courseTitleVisible"},Lt:{A:"buttonsAtLeft"},pd:{A:"showLogo"},buttons:{A:"buttons"},visible:{A:"visible"}},IQ:{A:"outlinePanel",Qo:{A:"numberEntries"},Mo:{A:"highlightViewedEntries"},lp:{A:"thumbnails"},search:{A:"search"},lj:{A:"multilevel"}},miniskinCustomizationEnabled:{A:"miniskinCustomizationEnabled"},fontFamily:{A:"fontFamily"}, +borderRadius:{A:"borderRadius"}},b=$F();YF(a,b);this.Sa=a}vQ(a={}){const b=new JN;a[this.Sa.colors]&&(b.colors=uL(a[this.Sa.colors]));if(a[this.Sa.Hc]){var c=a[this.Sa.Hc],d=b.xa.Hc,e=this.Sa.Hc;d.pd=c[e.pd];d.Sq=c[e.Sq];d.Lt=c[e.Lt];d.buttonsOrder=c[e.buttons];d.visible=c[e.visible]}a[this.Sa.Qc]&&(c=a[this.Sa.Qc],d=b.xa.Qc,e=this.Sa.Qc,d.visible=c[e.visible],d.Yd=c[e.Yd],d.pd=c[e.pd],d.Wg=c[e.Wg],d.GI=c[e.GI],d.te=c[e.te],d.showOutline=c[e.showOutline]);if(a[this.Sa.controlPanel]){c=a[this.Sa.controlPanel]; +e=b.xa.controlPanel;const f=this.Sa.controlPanel;e.visible=c[f.visible];e.showOutline=c[f.showOutline];e.Jf=c[f.Jf];e.Bl=c[f.Bl];e.Zd=c[f.Zd];e.jp=c[f.jp];e.Rx=c[f.ica];e.Tg=c[f.Tg];if(c[f.zc]){d=c[f.zc];const g=b.xa.controlPanel.zc,h=this.Sa.controlPanel.zc;g.visible=d[h.visible];g.enabled=d[h.enabled];g.rr=d[h.rr];g.mode=d[h.mode]}e.sr=!Ii&&c[f.sr];e.ou=c[f.ou];e.Kf=c[f.Kf];e.qf=c[f.qf]}a[this.Sa.IQ]&&(c=a[this.Sa.IQ],d=b.outline,e=this.Sa.IQ,d.Qo=c[e.Qo],d.Mo=c[e.Mo],d.lp=c[e.lp],d.search=c[e.search], +d.lj=c[e.lj]);void 0!==a[this.Sa.miniskinCustomizationEnabled]&&(b.miniskinCustomizationEnabled=a[this.Sa.miniskinCustomizationEnabled]);a[this.Sa.fontFamily]&&(b.fontFamily=a[this.Sa.fontFamily]);null!==a[this.Sa.borderRadius]&&(b.borderRadius=a[this.Sa.borderRadius]);return b}};function iW(a,b,c,d,e){return new Promise(f=>{const g=new eL;e&&g.Yv.addHandler(e);let h=null,l=null,n,m=!1,p,r;g.nX.addHandler(v=>{l=v;v=new hW;const y=l.settings();p=new jL(y.Gt().enabled());h=v.vQ(y.skin());h.accessibilityModeEnabled=p.wm();l.settings().CE=h;m=FN(Ii&&!h.xa.Qc.visible&&!h.xa.Hc.visible&&!h.xa.controlPanel.visible,l);v=h.colors;m?(n=new wL,r=new xL({Ba:l,RQ:d,colors:v,Km:n})):(n=new VM,r=new XM({Ba:l,RQ:d,colors:v,Km:n}));r.wP(p.mode())});g.Yv.addHandler(v=>{const y=jW(l),D=new EG(y), +I=v.view().W();I.Wo().Nw=h.xa.controlPanel.Zd;hL(p,I);const A=kW({fk:v,skinSettings:h,messages:y,ia:D,gj:c,hca:m,Km:n,wm:p.wm()});iL(p,A);const J=kL(p,A,c,y),T=U=>{v.Mm(U);if(A.Zk){Fd(A.Zk.displayObject());var X=A.ii;X.sE=null;X.Fh=null;Se(A,A.Zk);A.Zk=null}A.$S(U);X=A.Zk.displayObject();A.w8.appendChild(X);A.ii.nC();X=A.fw.view().W();const aa=X.ma();-1!=aa&&(X.Bc().C(aa),ok(X.Ud()),A.fw.z_().P_(),A.fw.Ar().P_(),X.Dr.C());"accessible"==U&&document.body.removeAttribute("style");A.gS.C(U);J&&("accessible"== +U?(J.setAttribute("title",y.PB_ACCESSIBLE_SKIN_ENABLE_NORMAL_MODE),J.Ox(-1),J.pf("hidden",!0)):(J.setAttribute("title",y.PB_ACCESSIBLE_SKIN_ENABLE_ACCESSIBILITY_MODE),J.Ox(0),J.displayObject().removeAttribute("aria-hidden")))};T(p.mode());p.pX.addHandler(U=>{r.wP(U);T(U)});f(new UM({fk:v,skinSettings:h,ia:D}))});g.Tq(a,b,d)})} +function jW(a){a=rc(a.settings().ia());a.PB_ACCESSIBLE_SLIDES=a.PB_TAB_OUTLINE_LABEL;a.PB_ACCESSIBLE_PRESENTER_INFO=a.PB_TITLE_PANEL_PRESENTER_INFO;a.PB_ACCESSIBLE_TITLE_PANEL_ATTACHMENTS=a.PB_TITLE_PANEL_ATTACHMENTS;return a}function kW(a){const b=a.fk,c=a.skinSettings,d=a.messages,e=a.ia,f=a.gj,g=a.wm;return a.hca?new TM({fk:b,messages:d,gj:f,wm:g,Km:a.Km}):new gW({fk:b,skinSettings:c,messages:d,ia:e,gj:f,Km:a.Km,wm:g})};q("PresentationPlayer.start",function(a,b,c,d,e){iW(a,aG(),b,c,d).then(f=>{XF(f,e)})});let Pj=()=>!1;function Te(a){a&&("function"===typeof a.Xc&&a.Xc(),a.disposed=!0)}function lW(a,b){Pj()&&(b?ia.console.error(a):ia.console.warn(a))}function ef(a,b){const c=a.stack||a.toString();0>String(c).indexOf(a.message)&&lW(a.message,b);lW(c,b)}window.onerror=function(...a){const [b,,,,c]=a;c?ef(c,!0):lW(b,!0);return!0};Ea=a=>{try{throw Error(a.message);}catch(b){ef(b,!1)}}; +ia.console||(window._log="",ia.console={log:function(a){window._log+="\n"+a},warn:function(a){window._log+="\nwarn: "+a},error:function(a){window._log+="\nerror: "+a}});})(); +/*! iScroll v5.2.0-snapshot ~ (c) 2008-2018 Matteo Spinelli ~ http://cubiq.org/license */ +!function(t,i,s){function e(s,e){this.wrapper="string"==typeof s?i.querySelector(s):s,this.scroller=this.wrapper.children[0],this.scrollerStyle=this.scroller.style,this.options={resizeScrollbars:!0,mouseWheelSpeed:20,snapThreshold:.334,disablePointer:!h.hasPointer,disableTouch:h.hasPointer||!h.hasTouch,disableMouse:h.hasPointer||h.hasTouch,startX:0,startY:0,scrollY:!0,directionLockThreshold:5,momentum:!0,onScrollHandler:Function.prototype,bounce:!0,bounceTime:600,bounceEasing:"",preventDefault:!0,preventDefaultException:{tagName:/^(A|INPUT|TEXTAREA|BUTTON|SELECT)$/},HWCompositing:!0,useTransition:!0,useTransform:!0,bindToWrapper:"undefined"==typeof t.onmousedown};for(var o in e)this.options[o]=e[o];this.translateZ=this.options.HWCompositing&&h.hasPerspective?" translateZ(0)":"",this.options.useTransition=h.hasTransition&&this.options.useTransition,this.options.useTransform=h.hasTransform&&this.options.useTransform,this.options.eventPassthrough=this.options.eventPassthrough===!0?"vertical":this.options.eventPassthrough,this.options.preventDefault=!this.options.eventPassthrough&&this.options.preventDefault,this.options.scrollY="vertical"!=this.options.eventPassthrough&&this.options.scrollY,this.options.scrollX="horizontal"!=this.options.eventPassthrough&&this.options.scrollX,this.options.freeScroll=this.options.freeScroll&&!this.options.eventPassthrough,this.options.directionLockThreshold=this.options.eventPassthrough?0:this.options.directionLockThreshold,this.options.bounceEasing="string"==typeof this.options.bounceEasing?h.ease[this.options.bounceEasing]||h.ease.circular:this.options.bounceEasing,this.options.resizePolling=void 0===this.options.resizePolling?60:this.options.resizePolling,this.options.tap===!0&&(this.options.tap="tap"),this.options.useTransition||this.options.useTransform||/relative|absolute/i.test(this.scrollerStyle.position)||(this.scrollerStyle.position="relative"),"scale"==this.options.shrinkScrollbars&&(this.options.useTransition=!1),this.options.invertWheelDirection=this.options.invertWheelDirection?-1:1,this.x=0,this.y=0,this.directionX=0,this.directionY=0,this._events={},this._init(),this.refresh(),this.scrollTo(this.options.startX,this.options.startY),this.enable()}function o(t,s,e){var o=i.createElement("div"),n=i.createElement("div");return e===!0&&(o.style.cssText="position:absolute;z-index:9999",n.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:absolute;background:rgba(0,0,0,0.5);border:1px solid rgba(255,255,255,0.9);border-radius:3px"),n.className="iScrollIndicator","h"==t?(e===!0&&(o.style.cssText+=";height:7px;left:2px;right:2px;bottom:0",n.style.height="100%"),o.className="iScrollHorizontalScrollbar"):(e===!0&&(o.style.cssText+=";width:7px;bottom:2px;top:2px;right:1px",n.style.width="100%"),o.className="iScrollVerticalScrollbar"),o.style.cssText+=";overflow:hidden",s||(o.style.pointerEvents="none"),o.appendChild(n),o}function n(s,e){this.wrapper="string"==typeof e.el?i.querySelector(e.el):e.el,this.wrapperStyle=this.wrapper.style,this.indicator=this.wrapper.children[0],this.indicatorStyle=this.indicator.style,this.scroller=s,this.options={listenX:!0,listenY:!0,interactive:!1,resize:!0,defaultScrollbars:!1,shrink:!1,fade:!1,speedRatioX:0,speedRatioY:0};for(var o in e)this.options[o]=e[o];if(this.sizeRatioX=1,this.sizeRatioY=1,this.maxPosX=0,this.maxPosY=0,this.options.interactive&&(this.options.disableTouch||(h.addEvent(this.indicator,"touchstart",this),h.addEvent(t,"touchend",this)),this.options.disablePointer||(h.addEvent(this.indicator,h.prefixPointerEvent("pointerdown"),this),h.addEvent(t,h.prefixPointerEvent("pointerup"),this)),this.options.disableMouse||(h.addEvent(this.indicator,"mousedown",this),h.addEvent(t,"mouseup",this))),this.options.fade){this.wrapperStyle[h.style.transform]=this.scroller.translateZ;var n=h.style.transitionDuration;if(!n)return;this.wrapperStyle[n]=h.isBadAndroid?"0.0001ms":"0ms";var a=this;h.isBadAndroid&&r(function(){"0.0001ms"===a.wrapperStyle[n]&&(a.wrapperStyle[n]="0s")}),this.wrapperStyle.opacity="0"}}var r=t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||t.msRequestAnimationFrame||function(i){t.setTimeout(i,1e3/60)},h=function(){function e(t){return r!==!1&&(""===r?t:r+t.charAt(0).toUpperCase()+t.substr(1))}var o={},n=i.createElement("div").style,r=function(){for(var t,i=["t","webkitT","MozT","msT","OT"],s=0,e=i.length;s0&&(h=n?n/2.5*(c/8):0,l=s.abs(t)+h,a=l/c),{destination:s.round(h),duration:a}};var h=e("transform");return o.extend(o,{hasTransform:h!==!1,hasPerspective:e("perspective")in n,hasTouch:"ontouchstart"in t,hasPointer:!(!t.PointerEvent&&!t.MSPointerEvent),hasTransition:e("transition")in n}),o.isBadAndroid=function(){var i=t.navigator.appVersion;if(/Android/.test(i)&&!/Chrome\/\d/.test(i)){var s=i.match(/Safari\/(\d+.\d)/);return!(s&&"object"==typeof s&&s.length>=2)||parseFloat(s[1])<535.19}return!1}(),o.extend(o.style={},{transform:h,transitionTimingFunction:e("transitionTimingFunction"),transitionDuration:e("transitionDuration"),transitionDelay:e("transitionDelay"),transformOrigin:e("transformOrigin"),touchAction:e("touchAction")}),o.hasClass=function(t,i){var s=new RegExp("(^|\\s)"+i+"(\\s|$)");return s.test(t.className)},o.addClass=function(t,i){if(!o.hasClass(t,i)){var s=t.className.split(" ");s.push(i),t.className=s.join(" ")}},o.removeClass=function(t,i){if(o.hasClass(t,i)){var s=new RegExp("(^|\\s)"+i+"(\\s|$)","g");t.className=t.className.replace(s," ")}},o.offset=function(t){for(var i=-t.offsetLeft,s=-t.offsetTop;t=t.offsetParent;)i-=t.offsetLeft,s-=t.offsetTop;return{left:i,top:s}},o.isHyperlink=function(t){if(!t)return!1;for(;t;){if("A"==t.nodeName.toLocaleUpperCase())return!0;t=t.parentNode}return!1},o.preventDefaultException=function(t,i){if(o.isHyperlink(t))return!0;for(var s in i)if(i[s].test(t[s]))return!0;return!1},o.extend(o.eventType={},{touchstart:1,touchmove:1,touchend:1,mousedown:2,mousemove:2,mouseup:2,pointerdown:3,pointermove:3,pointerup:3,MSPointerDown:3,MSPointerMove:3,MSPointerUp:3}),o.extend(o.ease={},{quadratic:{style:"cubic-bezier(0.25, 0.46, 0.45, 0.94)",fn:function(t){return t*(2-t)}},circular:{style:"cubic-bezier(0.1, 0.57, 0.1, 1)",fn:function(t){return s.sqrt(1- --t*t)}},back:{style:"cubic-bezier(0.175, 0.885, 0.32, 1.275)",fn:function(t){var i=4;return(t-=1)*t*((i+1)*t+i)+1}},bounce:{style:"",fn:function(t){return(t/=1)<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}},elastic:{style:"",fn:function(t){var i=.22,e=.4;return 0===t?0:1==t?1:e*s.pow(2,-10*t)*s.sin((t-i/4)*(2*s.PI)/i)+1}}}),o.tap=function(t,s){var e=i.createEvent("Event");e.initEvent(s,!0,!0),e.pageX=t.pageX,e.pageY=t.pageY,t.target.dispatchEvent(e)},o.click=function(s){var e,o=s.target;/(SELECT|INPUT|TEXTAREA)/i.test(o.tagName)||(e=i.createEvent(t.MouseEvent?"MouseEvents":"Event"),e.initEvent("click",!0,!0),e.view=s.view||t,e.detail=1,e.screenX=o.screenX||0,e.screenY=o.screenY||0,e.clientX=o.clientX||0,e.clientY=o.clientY||0,e.ctrlKey=!!s.ctrlKey,e.altKey=!!s.altKey,e.shiftKey=!!s.shiftKey,e.metaKey=!!s.metaKey,e.button=0,e.relatedTarget=null,e._constructed=!0,o.dispatchEvent(e))},o.getTouchAction=function(t,i){var s="none";return"vertical"===t?s="pan-y":"horizontal"===t&&(s="pan-x"),i&&"none"!=s&&(s+=" pinch-zoom"),s},o.getRect=function(t){if(t instanceof SVGElement){var i=t.getBoundingClientRect();return{top:i.top,left:i.left,width:i.width,height:i.height}}return{top:t.offsetTop,left:t.offsetLeft,width:t.offsetWidth,height:t.offsetHeight}},o}();e.prototype={version:"5.2.0-snapshot",_init:function(){this._initEvents(),(this.options.scrollbars||this.options.indicators)&&this._initIndicators(),this.options.mouseWheel&&this._initWheel(),this.options.snap&&this._initSnap(),this.options.keyBindings&&this._initKeys()},destroy:function(){this._initEvents(!0),clearTimeout(this.resizeTimeout),this.resizeTimeout=null,this._execEvent("destroy")},setScrollHeight:function(t){this.scrollHeight=t,this.refresh()},_transitionEnd:function(t){t.target==this.scroller&&this.isInTransition&&(this._transitionTime(),this.resetPosition(this.options.bounceTime)||(this.isInTransition=!1,this._execEvent("scrollEnd")))},_start:function(t){if(1!=h.eventType[t.type]){var i;if(i=t.which?t.button:t.button<2?0:4==t.button?1:2,0!==i)return}if(this.enabled&&(!this.initiated||h.eventType[t.type]===this.initiated)){!this.options.preventDefault||h.isBadAndroid||h.preventDefaultException(t.target,this.options.preventDefaultException)||t.preventDefault();var e,o=t.touches?t.touches[0]:t;this.initiated=h.eventType[t.type],this.moved=!1,this.distX=0,this.distY=0,this.directionX=0,this.directionY=0,this.directionLocked=0,this.startTime=h.getTime(),this.options.useTransition&&this.isInTransition?(this._transitionTime(),this.isInTransition=!1,e=this.getComputedPosition(),this._translate(s.round(e.x),s.round(e.y)),this._execEvent("scrollEnd")):!this.options.useTransition&&this.isAnimating&&(this.isAnimating=!1,this._execEvent("scrollEnd")),this.startX=this.x,this.startY=this.y,this.absStartX=this.x,this.absStartY=this.y,this.pointX=o.pageX,this.pointY=o.pageY,this._execEvent("beforeScrollStart")}},_move:function(t){if(this.enabled&&h.eventType[t.type]===this.initiated){this.options.preventDefault&&!h.preventDefaultException(t.target,this.options.preventDefaultException)&&t.preventDefault();var i,e,o,n,r=t.touches?t.touches[0]:t,a=r.pageX-this.pointX,l=r.pageY-this.pointY,c=h.getTime();if(this.pointX=r.pageX,this.pointY=r.pageY,this.distX+=a,this.distY+=l,o=s.abs(this.distX),n=s.abs(this.distY),!(c-this.endTime>300&&o<10&&n<10)){if(this.directionLocked||this.options.freeScroll||(o>n+this.options.directionLockThreshold?this.directionLocked="h":n>=o+this.options.directionLockThreshold?this.directionLocked="v":this.directionLocked="n"),"h"==this.directionLocked){if("vertical"==this.options.eventPassthrough)t.preventDefault();else if("horizontal"==this.options.eventPassthrough)return void(this.initiated=!1);l=0}else if("v"==this.directionLocked){if("horizontal"==this.options.eventPassthrough)t.preventDefault();else if("vertical"==this.options.eventPassthrough)return void(this.initiated=!1);a=0}a=this.hasHorizontalScroll?a:0,l=this.hasVerticalScroll?l:0,i=this.x+a,e=this.y+l,(i>0||i0?0:this.maxScrollX),(e>0||e0?0:this.maxScrollY),this.directionX=a>0?-1:a<0?1:0,this.directionY=l>0?-1:l<0?1:0,this.moved||this._execEvent("scrollStart"),this.moved=!0,this._translate(i,e),c-this.startTime>300&&(this.startTime=c,this.startX=this.x,this.startY=this.y)}}},_end:function(t){if(this.enabled&&h.eventType[t.type]===this.initiated){this.options.preventDefault&&!h.preventDefaultException(t.target,this.options.preventDefaultException)&&t.preventDefault();var i,e,o=(t.changedTouches?t.changedTouches[0]:t,h.getTime()-this.startTime),n=s.round(this.x),r=s.round(this.y),a=s.abs(n-this.startX),l=s.abs(r-this.startY),c=0,p="";if(this.isInTransition=0,this.initiated=0,this.endTime=h.getTime(),!this.resetPosition(this.options.bounceTime)){if(this.scrollTo(n,r),!this.moved)return this.options.tap&&h.tap(t,this.options.tap),this.options.click&&h.click(t),void this._execEvent("scrollCancel");if(this._events.flick&&o<200&&a<100&&l<100)return void this._execEvent("flick");if(this.options.momentum&&o<300&&(i=this.hasHorizontalScroll?h.momentum(this.x,this.startX,o,this.maxScrollX,this.options.bounce?this.wrapperWidth:0,this.options.deceleration):{destination:n,duration:0},e=this.hasVerticalScroll?h.momentum(this.y,this.startY,o,this.maxScrollY,this.options.bounce?this.wrapperHeight:0,this.options.deceleration):{destination:r,duration:0},n=i.destination,r=e.destination,c=s.max(i.duration,e.duration),this.isInTransition=1),this.options.snap){var d=this._nearestSnap(n,r);this.currentPage=d,c=this.options.snapSpeed||s.max(s.max(s.min(s.abs(n-d.x),1e3),s.min(s.abs(r-d.y),1e3)),300),n=d.x,r=d.y,this.directionX=0,this.directionY=0,p=this.options.bounceEasing}return n!=this.x||r!=this.y?((n>0||n0||r0?i=0:this.x0?s=0:this.y-1&&this._events[t].splice(s,1)}},_execEvent:function(t){if(this._events[t]){var i=0,s=this._events[t].length;if(s)for(;i0;var o=this.options.useTransition&&e.style;!s||o?(o&&(this._transitionTimingFunction(e.style),this._transitionTime(s)),this._translate(t,i)):this._animate(t,i,s,e.fn)},scrollToElement:function(t,i,e,o,n){if(t=t.nodeType?t:this.scroller.querySelector(t)){var r=h.offset(t);r.left-=this.wrapperOffset.left,r.top-=this.wrapperOffset.top;var a=h.getRect(t),l=h.getRect(this.wrapper);e===!0&&(e=s.round(a.width/2-l.width/2)),o===!0&&(o=s.round(a.height/2-l.height/2)),r.left-=e||0,r.top-=o||0,r.left=r.left>0?0:r.left0?0:r.top0?o--:i<0&&o++,e>0?n--:e<0&&n++,void this.goToPage(o,n);o=this.x+s.round(this.hasHorizontalScroll?i:0),n=this.y+s.round(this.hasVerticalScroll?e:0),this.directionX=i>0?-1:i<0?1:0,this.directionY=e>0?-1:e<0?1:0,o>0?o=0:o0?n=0:n-this.scrollerWidth;){for(this.pages[l]=[],t=0,n=0;n>-this.scrollerHeight;)this.pages[l][t]={x:s.max(p,this.maxScrollX),y:s.max(n,this.maxScrollY),width:d,height:u,cx:p-e,cy:n-o},n-=u,t++;p-=d,l++}else for(r=this.options.snap,t=r.length,i=-1;lthis.maxScrollX&&c++;this.goToPage(this.currentPage.pageX||0,this.currentPage.pageY||0,0),this.options.snapThreshold%1===0?(this.snapThresholdX=this.options.snapThreshold,this.snapThresholdY=this.options.snapThreshold):(this.snapThresholdX=s.round(this.pages[this.currentPage.pageX][this.currentPage.pageY].width*this.options.snapThreshold),this.snapThresholdY=s.round(this.pages[this.currentPage.pageX][this.currentPage.pageY].height*this.options.snapThreshold))}}),this.on("flick",function(){var t=this.options.snapSpeed||s.max(s.max(s.min(s.abs(this.x-this.startX),1e3),s.min(s.abs(this.y-this.startY),1e3)),300);this.goToPage(this.currentPage.pageX+this.directionX,this.currentPage.pageY+this.directionY,t)})},_nearestSnap:function(t,i){if(!this.pages.length)return{x:0,y:0,pageX:0,pageY:0};var e=0,o=this.pages.length,n=0;if(s.abs(t-this.absStartX)0?t=0:t0?i=0:i=this.pages[e][0].cx){t=this.pages[e][0].x;break}for(o=this.pages[e].length;n=this.pages[0][n].cy){i=this.pages[0][n].y;break}return e==this.currentPage.pageX&&(e+=this.directionX,e<0?e=0:e>=this.pages.length&&(e=this.pages.length-1),t=this.pages[e][0].x),n==this.currentPage.pageY&&(n+=this.directionY,n<0?n=0:n>=this.pages[0].length&&(n=this.pages[0].length-1),i=this.pages[0][n].y),{x:t,y:i,pageX:e,pageY:n}},goToPage:function(t,i,e,o){o=o||this.options.bounceEasing,t>=this.pages.length?t=this.pages.length-1:t<0&&(t=0),i>=this.pages[t].length?i=this.pages[t].length-1:i<0&&(i=0);var n=this.pages[t][i].x,r=this.pages[t][i].y;e=void 0===e?this.options.snapSpeed||s.max(s.max(s.min(s.abs(n-this.x),1e3),s.min(s.abs(r-this.y),1e3)),300):e,this.currentPage={x:n,y:r,pageX:t,pageY:i},this.scrollTo(n,r,e,o)},next:function(t,i){var s=this.currentPage.pageX,e=this.currentPage.pageY;s++,s>=this.pages.length&&this.hasVerticalScroll&&(s=0,e++),this.goToPage(s,e,t,i)},prev:function(t,i){var s=this.currentPage.pageX,e=this.currentPage.pageY;s--,s<0&&this.hasVerticalScroll&&(s=0,e--),this.goToPage(s,e,t,i)},_initKeys:function(i){var s,e={pageUp:33,pageDown:34,end:35,home:36,left:37,up:38,right:39,down:40};if("object"==typeof this.options.keyBindings)for(s in this.options.keyBindings)"string"==typeof this.options.keyBindings[s]&&(this.options.keyBindings[s]=this.options.keyBindings[s].toUpperCase().charCodeAt(0));else this.options.keyBindings={};for(s in e)this.options.keyBindings[s]=this.options.keyBindings[s]||e[s];h.addEvent(t,"keydown",this),this.on("destroy",function(){h.removeEvent(t,"keydown",this)})},_key:function(t){if(this.enabled){var i,e=this.options.snap,o=e?this.currentPage.pageX:this.x,n=e?this.currentPage.pageY:this.y,r=h.getTime(),a=this.keyTime||0,l=.25;switch(this.options.useTransition&&this.isInTransition&&(i=this.getComputedPosition(),this._translate(s.round(i.x),s.round(i.y)),this.isInTransition=!1),this.keyAcceleration=r-a<200?s.min(this.keyAcceleration+l,50):0,t.keyCode){case this.options.keyBindings.pageUp:this.hasHorizontalScroll&&!this.hasVerticalScroll?o+=e?1:this.wrapperWidth:n+=e?1:this.wrapperHeight;break;case this.options.keyBindings.pageDown:this.hasHorizontalScroll&&!this.hasVerticalScroll?o-=e?1:this.wrapperWidth:n-=e?1:this.wrapperHeight;break;case this.options.keyBindings.end:o=e?this.pages.length-1:this.maxScrollX,n=e?this.pages[0].length-1:this.maxScrollY;break;case this.options.keyBindings.home:o=0,n=0;break;case this.options.keyBindings.left:o+=e?-1:5+this.keyAcceleration>>0;break;case this.options.keyBindings.up:n+=e?1:5+this.keyAcceleration>>0;break;case this.options.keyBindings.right:o-=e?-1:5+this.keyAcceleration>>0;break;case this.options.keyBindings.down:n-=e?1:5+this.keyAcceleration>>0;break;default:return}if(e)return void this.goToPage(o,n);o>0?(o=0,this.keyAcceleration=0):o0?(n=0,this.keyAcceleration=0):n=p?(n.isAnimating=!1,n._translate(t,i),void(n.resetPosition(n.options.bounceTime)||n._execEvent("scrollEnd"))):(f=(f-c)/s,m=e(f),d=(t-a)*m+a,u=(i-l)*m+l,n._translate(d,u),void(n.isAnimating&&r(o)))}var n=this,a=this.x,l=this.y,c=h.getTime(),p=c+s;this.isAnimating=!0,o()},handleEvent:function(t){switch(t.type){case"touchstart":case"pointerdown":case"MSPointerDown":case"mousedown":t.defaultPrevented||this._start(t);break;case"touchmove":case"pointermove":case"MSPointerMove":case"mousemove":t.defaultPrevented||this._move(t);break;case"touchend":case"pointerup":case"MSPointerUp":case"mouseup":case"touchcancel":case"pointercancel":case"MSPointerCancel":case"mousecancel":this._end(t);break;case"orientationchange":case"resize":this._resize();break;case"transitionend":case"webkitTransitionEnd":case"oTransitionEnd":case"MSTransitionEnd":this._transitionEnd(t);break;case"wheel":case"DOMMouseScroll":case"mousewheel":this._wheel(t);break;case"keydown":this._key(t);break;case"click":this.enabled&&!t._constructed}}},n.prototype={handleEvent:function(t){switch(t.type){case"touchstart":case"pointerdown":case"MSPointerDown":case"mousedown":this._start(t);break;case"touchmove":case"pointermove":case"MSPointerMove":case"mousemove":this._move(t);break;case"touchend":case"pointerup":case"MSPointerUp":case"mouseup":case"touchcancel":case"pointercancel":case"MSPointerCancel":case"mousecancel":this._end(t)}},destroy:function(){this.options.fadeScrollbars&&(clearTimeout(this.fadeTimeout),this.fadeTimeout=null),this.options.interactive&&(h.removeEvent(this.indicator,"touchstart",this),h.removeEvent(this.indicator,h.prefixPointerEvent("pointerdown"),this),h.removeEvent(this.indicator,"mousedown",this),h.removeEvent(t,"touchmove",this),h.removeEvent(t,h.prefixPointerEvent("pointermove"),this),h.removeEvent(t,"mousemove",this),h.removeEvent(t,"touchend",this),h.removeEvent(t,h.prefixPointerEvent("pointerup"),this),h.removeEvent(t,"mouseup",this)),this.options.defaultScrollbars&&this.wrapper.parentNode&&this.wrapper.parentNode.removeChild(this.wrapper)},_start:function(i){var s=i.touches?i.touches[0]:i;i.preventDefault(),i.stopPropagation(),this.transitionTime(),this.initiated=!0,this.moved=!1,this.lastPointX=s.pageX,this.lastPointY=s.pageY,this.startTime=h.getTime(),this.options.disableTouch||h.addEvent(t,"touchmove",this),this.options.disablePointer||h.addEvent(t,h.prefixPointerEvent("pointermove"),this),this.options.disableMouse||h.addEvent(t,"mousemove",this),this.scroller._execEvent("beforeScrollStart")},_move:function(t){var i,s,e,o,n=t.touches?t.touches[0]:t;h.getTime();this.moved||this.scroller._execEvent("scrollStart"),this.moved=!0,i=n.pageX-this.lastPointX,this.lastPointX=n.pageX,s=n.pageY-this.lastPointY,this.lastPointY=n.pageY,e=this.x+i,o=this.y+s,this._pos(e,o),t.preventDefault(),t.stopPropagation()},_end:function(i){if(this.initiated){if(this.initiated=!1,i.preventDefault(),i.stopPropagation(),h.removeEvent(t,"touchmove",this),h.removeEvent(t,h.prefixPointerEvent("pointermove"),this),h.removeEvent(t,"mousemove",this),this.scroller.options.snap){var e=this.scroller._nearestSnap(this.scroller.x,this.scroller.y),o=this.options.snapSpeed||s.max(s.max(s.min(s.abs(this.scroller.x-e.x),1e3),s.min(s.abs(this.scroller.y-e.y),1e3)),300);this.scroller.x==e.x&&this.scroller.y==e.y||(this.scroller.directionX=0,this.scroller.directionY=0,this.scroller.currentPage=e,this.scroller.scrollTo(e.x,e.y,o,this.scroller.options.bounceEasing))}this.moved&&this.scroller._execEvent("scrollEnd")}},transitionTime:function(t){t=t||0;var i=h.style.transitionDuration;if(i&&(this.indicatorStyle[i]=t+"ms",!t&&h.isBadAndroid)){this.indicatorStyle[i]="0.0001ms";var s=this;r(function(){"0.0001ms"===s.indicatorStyle[i]&&(s.indicatorStyle[i]="0s")})}},transitionTimingFunction:function(t){this.indicatorStyle[h.style.transitionTimingFunction]=t},refresh:function(){this.transitionTime(),this.options.listenX&&!this.options.listenY?this.indicatorStyle.display=this.scroller.hasHorizontalScroll?"block":"none":this.options.listenY&&!this.options.listenX?this.indicatorStyle.display=this.scroller.hasVerticalScroll?"block":"none":this.indicatorStyle.display=this.scroller.hasHorizontalScroll||this.scroller.hasVerticalScroll?"block":"none",this.scroller.hasHorizontalScroll&&this.scroller.hasVerticalScroll?(h.addClass(this.wrapper,"iScrollBothScrollbars"),h.removeClass(this.wrapper,"iScrollLoneScrollbar"),this.options.defaultScrollbars&&this.options.customStyle&&(this.options.listenX?this.wrapper.style.right="8px":this.wrapper.style.bottom="8px")):(h.removeClass(this.wrapper,"iScrollBothScrollbars"),h.addClass(this.wrapper,"iScrollLoneScrollbar"),this.options.defaultScrollbars&&this.options.customStyle&&(this.options.listenX?this.wrapper.style.right="2px":this.wrapper.style.bottom="2px")),h.getRect(this.wrapper),this.options.listenX&&(this.wrapperWidth=this.wrapper.clientWidth,this.options.resize?(this.indicatorWidth=s.max(s.round(this.wrapperWidth*this.wrapperWidth/(this.scroller.scrollerWidth||this.wrapperWidth||1)),8),this.indicatorStyle.width=this.indicatorWidth+"px"):this.indicatorWidth=this.indicator.clientWidth,this.maxPosX=this.wrapperWidth-this.indicatorWidth,"clip"==this.options.shrink?(this.minBoundaryX=-this.indicatorWidth+8,this.maxBoundaryX=this.wrapperWidth-8):(this.minBoundaryX=0,this.maxBoundaryX=this.maxPosX),this.sizeRatioX=this.options.speedRatioX||this.scroller.maxScrollX&&this.maxPosX/this.scroller.maxScrollX),this.options.listenY&&(this.wrapperHeight=this.wrapper.clientHeight,this.options.resize?(this.indicatorHeight=s.max(s.round(this.wrapperHeight*this.wrapperHeight/(this.scroller.scrollerHeight||this.wrapperHeight||1)),8),this.indicatorStyle.height=this.indicatorHeight+"px"):this.indicatorHeight=this.indicator.clientHeight,this.maxPosY=this.wrapperHeight-this.indicatorHeight,"clip"==this.options.shrink?(this.minBoundaryY=-this.indicatorHeight+8,this.maxBoundaryY=this.wrapperHeight-8):(this.minBoundaryY=0,this.maxBoundaryY=this.maxPosY), +this.maxPosY=this.wrapperHeight-this.indicatorHeight,this.sizeRatioY=this.options.speedRatioY||this.scroller.maxScrollY&&this.maxPosY/this.scroller.maxScrollY),this.updatePosition()},updatePosition:function(){var t=this.options.listenX&&s.round(this.sizeRatioX*this.scroller.x)||0,i=this.options.listenY&&s.round(this.sizeRatioY*this.scroller.y)||0;this.options.ignoreBoundaries||(tthis.maxBoundaryX?"scale"==this.options.shrink?(this.width=s.max(this.indicatorWidth-(t-this.maxPosX),8),this.indicatorStyle.width=this.width+"px",t=this.maxPosX+this.indicatorWidth-this.width):t=this.maxBoundaryX:"scale"==this.options.shrink&&this.width!=this.indicatorWidth&&(this.width=this.indicatorWidth,this.indicatorStyle.width=this.width+"px"),ithis.maxBoundaryY?"scale"==this.options.shrink?(this.height=s.max(this.indicatorHeight-3*(i-this.maxPosY),8),this.indicatorStyle.height=this.height+"px",i=this.maxPosY+this.indicatorHeight-this.height):i=this.maxBoundaryY:"scale"==this.options.shrink&&this.height!=this.indicatorHeight&&(this.height=this.indicatorHeight,this.indicatorStyle.height=this.height+"px")),this.x=t,this.y=i,this.scroller.options.useTransform?this.indicatorStyle[h.style.transform]="translate("+t+"px,"+i+"px)"+this.scroller.translateZ:(this.indicatorStyle.left=t+"px",this.indicatorStyle.top=i+"px")},_pos:function(t,i){t<0?t=0:t>this.maxPosX&&(t=this.maxPosX),i<0?i=0:i>this.maxPosY&&(i=this.maxPosY),t=this.options.listenX?s.round(t/this.sizeRatioX):this.scroller.x,i=this.options.listenY?s.round(i/this.sizeRatioY):this.scroller.y,this.scroller.scrollTo(t,i)},fade:function(t,i){if(!i||this.visible){clearTimeout(this.fadeTimeout),this.fadeTimeout=null;var s=t?250:500,e=t?0:300;t=t?"1":"0",this.wrapperStyle[h.style.transitionDuration]=s+"ms",this.fadeTimeout=setTimeout(function(t){this.wrapperStyle.opacity=t,this.visible=+t}.bind(this,t),e)}}},e.utils=h,"undefined"!=typeof module&&module.exports?module.exports=e:"function"==typeof define&&define.amd?define(function(){return e}):t.IScroll=e}(window,document,Math);(function(){var r=Math,d=function(m){return m>>0},v=(/webkit/i).test(navigator.appVersion)?"webkit":(/firefox/i).test(navigator.userAgent)?"Moz":(/trident/i).test(navigator.userAgent)?"ms":"opera" in window?"O":"",w=(/android/gi).test(navigator.appVersion),i=(/iphone|ipad/gi).test(navigator.appVersion),c=(/playbook/gi).test(navigator.appVersion),n=(/hp-tablet/gi).test(navigator.appVersion),k=false,u="ontouchstart" in window&&!n,f=v+"Transform" in document.documentElement.style,g=i||c,o=(function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(m){return setTimeout(m,1)}})(),l=(function(){return window.cancelRequestAnimationFrame||window.webkitCancelAnimationFrame||window.webkitCancelRequestAnimationFrame||window.mozCancelRequestAnimationFrame||window.oCancelRequestAnimationFrame||window.msCancelRequestAnimationFrame||clearTimeout})(),h="onorientationchange" in window?"orientationchange":"resize",b=u?"touchstart":"mousedown",p=u?"touchmove":"mousemove",e=u?"touchend":"mouseup",t=u?"touchcancel":"mouseup",q=v=="Moz"?"DOMMouseScroll":"mousewheel",a="translate"+(k?"3d(":"("),j=k?",0)":")",s=function(y,m){var z=this,A=document,x;z.wrapper=typeof y=="object"?y:A.getElementById(y);z.wrapper.style.overflow="hidden";z.scroller=z.wrapper.children[0];z.options={hScroll:true,vScroll:true,x:0,y:0,bounce:true,bounceLock:false,momentum:true,lockDirection:true,useTransform:true,useTransition:false,topOffset:0,checkDOMChanges:false,handleClick:true,ignoreEmptyScroll:false,minThumbSize:16,hScrollbar:true,vScrollbar:true,fixedScrollbar:w,hideScrollbar:i,fadeScrollbar:i&&k,scrollbarClass:"",zoom:false,zoomMin:1,zoomMax:4,doubleTapZoom:2,wheelAction:"scroll",snap:false,snapThreshold:1,onRefresh:null,onBeforeScrollStart:function(B){B.preventDefault()},onScrollStart:null,onBeforeScrollMove:null,onScrollMove:null,onBeforeScrollEnd:null,onScrollEnd:null,onTouchEnd:null,onDestroy:null,onZoomStart:null,onZoom:null,onZoomEnd:null};for(x in m){z.options[x]=m[x]}z.x=z.options.x;z.y=z.options.y;z.options.useTransform=f?z.options.useTransform:false;z.options.hScrollbar=z.options.hScroll&&z.options.hScrollbar;z.options.vScrollbar=z.options.vScroll&&z.options.vScrollbar;z.options.zoom=z.options.useTransform&&z.options.zoom;z.options.useTransition=g&&z.options.useTransition;if(z.options.zoom&&w){a="translate(";j=")"}z.scroller.style[v+"TransformOrigin"]="0 0";if(z.options.useTransition){z.scroller.style[v+"TransitionProperty"]=z.options.useTransform?"-"+v.toLowerCase()+"-transform":"top left";z.scroller.style[v+"TransitionDuration"]="0";z.scroller.style[v+"TransitionTimingFunction"]="cubic-bezier(0.33,0.66,0.66,1)"}if(z.options.useTransform){z.scroller.style[v+"Transform"]=a+z.x+"px,"+z.y+"px"+j}else{z.scroller.style.cssText+=";position:absolute;top:"+z.y+"px;left:"+z.x+"px"}if(z.options.useTransition){z.options.fixedScrollbar=true}z.refresh();z._bind(h,window);z._bind(b);if(!u){z._bind("mouseout",z.wrapper);if(z.options.wheelAction!="none"){z._bind(q)}}if(z.options.checkDOMChanges){z.checkDOMTime=setInterval(function(){z._checkDOMChanges()},500)}};s.prototype={enabled:true,x:0,y:0,steps:[],scale:1,currPageX:0,currPageY:0,pagesX:[],pagesY:[],aniTime:null,wheelZoomCount:0,handleEvent:function(x){var m=this;switch(x.type){case b:if(!u&&x.button!==0){return}m._start(x);break;case p:m._move(x);break;case e:case t:m._end(x);break;case h:m._resize();break;case q:m._wheel(x);break;case"mouseout":m._mouseout(x);break;case"webkitTransitionEnd":m._transitionEnd(x);break}},_checkDOMChanges:function(){if(this.moved||this.zoomed||this.animating||(this.scrollerW==this.scroller.offsetWidth*this.scale&&this.scrollerH==this.scroller.offsetHeight*this.scale)){return}this.refresh()},_scrollbar:function(m){var y=this,z=document,x;if(!y[m+"Scrollbar"]){if(y[m+"ScrollbarWrapper"]){if(f){y[m+"ScrollbarIndicator"].style[v+"Transform"]=""}y[m+"ScrollbarWrapper"].parentNode.removeChild(y[m+"ScrollbarWrapper"]);y[m+"ScrollbarWrapper"]=null;y[m+"ScrollbarIndicator"]=null}return}if(!y[m+"ScrollbarWrapper"]){x=z.createElement("div");if(y.options.scrollbarClass){x.className=m+y.options.scrollbarClass}else{x.style.cssText="position:absolute;z-index:100;"+(m=="h"?"height:7px;bottom:1px;left:2px;right:"+(y.vScrollbar?"7":"2")+"px":"width:7px;bottom:"+(y.hScrollbar?"7":"2")+"px;top:2px;right:1px")}x.style.cssText+=";pointer-events:none;opacity:"+(y.options.hideScrollbar?"0":"1");y.wrapper.appendChild(x);y[m+"ScrollbarWrapper"]=x;x=z.createElement("div");x.id=m+"Thumb";x.className="thumb";if(!y.options.scrollbarClass){x.style.cssText="position:absolute;z-index:100;background:rgba(0,0,0,0.5);border:1px solid rgba(255,255,255,0.5);-"+v+"-background-clip:border-box;-"+v+"-box-sizing:content-box;"+(m=="h"?"height:100%":"width:100%")+";-"+v+"-border-radius:4px;border-radius:4px;"+(m=="h"?"bottom":"right")+":2px;"}x.style.cssText+=";pointer-events:none;-"+v+"-transform:"+a+"0,0"+j;if(y.options.useTransition){x.style.cssText+=";-"+v+"-transition-timing-function:cubic-bezier(0.33,0.66,0.66,1)"}y[m+"ScrollbarWrapper"].appendChild(x);y[m+"ScrollbarIndicator"]=x}if(m=="h"){y.hScrollbarSize=y.hScrollbarWrapper.clientWidth;y.hScrollbarIndicatorSize=r.max(d(y.hScrollbarSize*y.hScrollbarSize/y.scrollerW),y.options.minThumbSize);y.hScrollbarIndicator.style.width=y.hScrollbarIndicatorSize+"px";y.hScrollbarMaxScroll=y.hScrollbarSize-y.hScrollbarIndicatorSize;y.hScrollbarProp=y.hScrollbarMaxScroll/y.maxScrollX}else{y.vScrollbarSize=y.vScrollbarWrapper.clientHeight;y.vScrollbarIndicatorSize=r.max(d(y.vScrollbarSize*y.vScrollbarSize/y.scrollerH),y.options.minThumbSize);y.vScrollbarIndicator.style.height=y.vScrollbarIndicatorSize+"px";y.vScrollbarMaxScroll=y.vScrollbarSize-y.vScrollbarIndicatorSize;y.vScrollbarProp=y.vScrollbarMaxScroll/y.maxScrollY}y._scrollbarPos(m,true)},_resize:function(){var m=this;setTimeout(function(){m.refresh()},w?200:0)},_pos:function(m,z){this._posImpl(m,z);this._scrollbarPos("h");this._scrollbarPos("v")},_posImpl:function(m,z){if(this.zoomed){return}m=this.hScroll?m:0;z=this.vScroll?z:0;if(this.options.useTransform){this.scroller.style[v+"Transform"]=a+m+"px,"+z+"px"+j+" scale("+this.scale+")"}else{m=d(m);z=d(z);this.scroller.style.left=m+"px";this.scroller.style.top=z+"px"}this.x=m;this.y=z;if(this.options.onScrollMove){this.options.onScrollMove.call(this)}},_scrollbarPos:function(m,z){var y=this,A=m=="h"?y.x:y.y,x;if(!y[m+"Scrollbar"]){return}A=y[m+"ScrollbarProp"]*A;if(A<0){if(!y.options.fixedScrollbar){x=y[m+"ScrollbarIndicatorSize"]+d(A*3);if(x<8){x=8}y[m+"ScrollbarIndicator"].style[m=="h"?"width":"height"]=x+"px"}A=0}else{if(A>y[m+"ScrollbarMaxScroll"]){if(!y.options.fixedScrollbar){x=y[m+"ScrollbarIndicatorSize"]-d((A-y[m+"ScrollbarMaxScroll"])*3);if(x<8){x=8}y[m+"ScrollbarIndicator"].style[m=="h"?"width":"height"]=x+"px";A=y[m+"ScrollbarMaxScroll"]+(y[m+"ScrollbarIndicatorSize"]-x)}else{A=y[m+"ScrollbarMaxScroll"]}}}y[m+"ScrollbarWrapper"].style.opacity=z&&y.options.hideScrollbar?"0":"1";y[m+"ScrollbarIndicator"].style[v+"Transform"]=a+(m=="h"?A+"px,0":"0,"+A+"px")+j},_start:function(E){var D=this,z=u?E.touches[0]:E,A,m,F,C,B;if(!D.enabled){return}if(D.options.onBeforeScrollStart){D.options.onBeforeScrollStart.call(D,E)}if(D.options.useTransition||D.options.zoom){D._transitionTime(0)}D.moved=false;D.animating=false;D.zoomed=false;D.distX=0;D.distY=0;D.absDistX=0;D.absDistY=0;D.dirX=0;D.dirY=0;if(D.options.zoom&&u&&E.touches.length>1){C=r.abs(E.touches[0].pageX-E.touches[1].pageX);B=r.abs(E.touches[0].pageY-E.touches[1].pageY);D.touchesDistStart=r.sqrt(C*C+B*B);D.originX=r.abs(E.touches[0].pageX+E.touches[1].pageX-D.wrapperOffsetLeft*2)/2-D.x;D.originY=r.abs(E.touches[0].pageY+E.touches[1].pageY-D.wrapperOffsetTop*2)/2-D.y;if(D.options.onZoomStart){D.options.onZoomStart.call(D,E)}}if(D.options.momentum){if(D.options.useTransform){A=getComputedStyle(D.scroller,null)[v+"Transform"].replace(/[^0-9-.,]/g,"").split(",");m=A[4]*1;F=A[5]*1}else{m=getComputedStyle(D.scroller,null).left.replace(/[^0-9-]/g,"")*1;F=getComputedStyle(D.scroller,null).top.replace(/[^0-9-]/g,"")*1}if(m!=D.x||F!=D.y){if(D.options.useTransition){D._unbind("webkitTransitionEnd")}else{l(D.aniTime)}D.steps=[];D._pos(m,F)}}D.absStartX=D.x;D.absStartY=D.y;D.startX=D.x;D.startY=D.y;D.pointX=z.pageX;D.pointY=z.pageY;D.startTime=E.timeStamp||Date.now();if(D.options.onScrollStart){D.options.onScrollStart.call(D,E)}D._bind(p);D._bind(e);D._bind(t)},_move:function(E){var C=this,F=u?E.touches[0]:E,A=F.pageX-C.pointX,y=F.pageY-C.pointY,m=C.x+A,G=C.y+y,B,z,x,D=E.timeStamp||Date.now();if(C.options.ignoreEmptyScroll){if(C.maxScrollY==C.minScrollY){y=0}if(C.maxScrollX==0){A=0}}if(C.options.onBeforeScrollMove){C.options.onBeforeScrollMove.call(C,E)}if(C.options.zoom&&u&&E.touches.length>1){B=r.abs(E.touches[0].pageX-E.touches[1].pageX);z=r.abs(E.touches[0].pageY-E.touches[1].pageY);C.touchesDist=r.sqrt(B*B+z*z);C.zoomed=true;x=1/C.touchesDistStart*C.touchesDist*this.scale;if(xC.options.zoomMax){x=2*C.options.zoomMax*Math.pow(0.5,C.options.zoomMax/x)}}C.lastScale=x/this.scale;m=this.originX-this.originX*C.lastScale+this.x,G=this.originY-this.originY*C.lastScale+this.y;this.scroller.style[v+"Transform"]=a+m+"px,"+G+"px"+j+" scale("+x+")";if(C.options.onZoom){C.options.onZoom.call(C,E)}return}C.pointX=F.pageX;C.pointY=F.pageY;if(m>0||m=0||C.maxScrollX>=0?0:C.maxScrollX}if(G>C.minScrollY||G=C.minScrollY||C.maxScrollY>=0?C.minScrollY:C.maxScrollY}C.distX+=A;C.distY+=y;C.absDistX=r.abs(C.distX);C.absDistY=r.abs(C.distY);if(C.absDistX<6&&C.absDistY<6){return}if(C.options.lockDirection){if(C.absDistX>C.absDistY+5){G=C.y;y=0}else{if(C.absDistY>C.absDistX+5){m=C.x;A=0}}}C.moved=true;C._pos(m,G);C.dirX=A>0?-1:A<0?1:0;C.dirY=y>0?-1:y<0?1:0;if(D-C.startTime>300){C.startTime=D;C.startX=C.x;C.startY=C.y}if(C.options.onScrollMove){C.options.onScrollMove.call(C,E)}},_end:function(E){if(u&&E.touches.length!=0){return}var C=this,K=u?E.changedTouches[0]:E,F,J,y={dist:0,time:0},m={dist:0,time:0},B=(E.timeStamp||Date.now())-C.startTime,G=C.x,D=C.y,I,H,x,A,z;C._unbind(p);C._unbind(e);C._unbind(t);if(C.options.onBeforeScrollEnd){C.options.onBeforeScrollEnd.call(C,E)}if(C.zoomed){z=C.scale*C.lastScale;z=Math.max(C.options.zoomMin,z);z=Math.min(C.options.zoomMax,z);C.lastScale=z/C.scale;C.scale=z;C.x=C.originX-C.originX*C.lastScale+C.x;C.y=C.originY-C.originY*C.lastScale+C.y;C.scroller.style[v+"TransitionDuration"]="200ms";C.scroller.style[v+"Transform"]=a+C.x+"px,"+C.y+"px"+j+" scale("+C.scale+")";C.zoomed=false;C.refresh();if(C.options.onZoomEnd){C.options.onZoomEnd.call(C,E)}return}if(!C.moved){if(u){if(C.doubleTapTimer&&C.options.zoom){clearTimeout(C.doubleTapTimer);C.doubleTapTimer=null;if(C.options.onZoomStart){C.options.onZoomStart.call(C,E)}C.zoom(C.pointX,C.pointY,C.scale==1?C.options.doubleTapZoom:1);if(C.options.onZoomEnd){setTimeout(function(){C.options.onZoomEnd.call(C,E)},200)}}else{if(this.options.handleClick){C.doubleTapTimer=setTimeout(function(){C.doubleTapTimer=null;F=K.target;while(F.nodeType!=1){F=F.parentNode}if(F.tagName!="SELECT"&&F.tagName!="INPUT"&&F.tagName!="TEXTAREA"){J=document.createEvent("MouseEvents");J.initMouseEvent("click",true,true,E.view,1,K.screenX,K.screenY,K.clientX,K.clientY,E.ctrlKey,E.altKey,E.shiftKey,E.metaKey,0,null);J._fake=true;F.dispatchEvent(J)}},C.options.zoom?250:0)}}}C._resetPos(200);if(C.options.onTouchEnd){C.options.onTouchEnd.call(C,E)}return}if(B<300&&C.options.momentum){y=G?C._momentum(G-C.startX,B,-C.x,C.scrollerW-C.wrapperW+C.x,C.options.bounce?C.wrapperW:0):y;m=D?C._momentum(D-C.startY,B,-C.y,(C.maxScrollY<0?C.scrollerH-C.wrapperH+C.y-C.minScrollY:0),C.options.bounce?C.wrapperH:0):m;G=C.x+y.dist;D=C.y+m.dist;if((C.x>0&&G>0)||(C.xC.minScrollY&&D>C.minScrollY)||(C.y=0?0:m.x=m.minScrollY||m.maxScrollY>0?m.minScrollY:m.yz.options.zoomMax){C=z.options.zoomMax}if(C!=z.scale){if(!z.wheelZoomCount&&z.options.onZoomStart){z.options.onZoomStart.call(z,B)}z.wheelZoomCount++;z.zoom(B.pageX,B.pageY,C,400);setTimeout(function(){z.wheelZoomCount--;if(!z.wheelZoomCount&&z.options.onZoomEnd){z.options.onZoomEnd.call(z,B)}},400)}return}x=z.x+A;m=z.y+y;if(x>0){x=0}else{if(xz.minScrollY){m=z.minScrollY}else{if(m=A+B.time){C._pos(B.x,B.y);C.animating=false;if(C.options.onAnimationEnd){C.options.onAnimationEnd.call(C)}C._startAni();return}D=(D-A)/B.time-1;z=r.sqrt(1-D*D);F=(B.x-x)*z+x;E=(B.y-m)*z+m;C._pos(F,E);if(C.animating){C.aniTime=o(y)}};y()},_transitionTime:function(m){m+="ms";this.scroller.style[v+"TransitionDuration"]=m;if(this.hScrollbar){this.hScrollbarIndicator.style[v+"TransitionDuration"]=m}if(this.vScrollbar){this.vScrollbarIndicator.style[v+"TransitionDuration"]=m}},_momentum:function(D,x,B,m,F){var C=0.0006,y=r.abs(D)/x,z=(y*y)/(2*C),E=0,A=0;if(D>0&&z>B){A=F/(6/(z/y*C));B=B+A;y=y*B/z;z=B}else{if(D<0&&z>m){A=F/(6/(z/y*C));m=m+A;y=y*m/z;z=m}}z=z*(D<0?-1:1);E=y/C;return{dist:z,time:d(E)}},_offset:function(m){var y=-m.offsetLeft,x=-m.offsetTop;while(m=m.offsetParent){y-=m.offsetLeft;x-=m.offsetTop}if(m!=this.wrapper){y*=this.scale;x*=this.scale}return{left:y,top:x}},_snap:function(G,F){var D=this,C,B,E,A,z,m;E=D.pagesX.length-1;for(C=0,B=D.pagesX.length;C=D.pagesX[C]){E=C;break}}if(E==D.currPageX&&E>0&&D.dirX<0){E--}G=D.pagesX[E];z=r.abs(G-D.pagesX[D.currPageX]);z=z?r.abs(D.x-G)/z*500:0;D.currPageX=E;E=D.pagesY.length-1;for(C=0;C=D.pagesY[C]){E=C;break}}if(E==D.currPageY&&E>0&&D.dirY<0){E--}F=D.pagesY[E];m=r.abs(F-D.pagesY[D.currPageY]);m=m?r.abs(D.y-F)/m*500:0;D.currPageY=E;A=200;return{x:G,y:F,time:A}},_bind:function(y,x,m){(x||this.scroller).addEventListener(y,this,!!m)},_unbind:function(y,x,m){(x||this.scroller).removeEventListener(y,this,!!m)},resize:function(x,m){if(x){this.wrapperWidth=x}if(m){this.wrapperHeight=m}this.refresh()},destroy:function(){var m=this;m.scroller.style[v+"Transform"]="";m.hScrollbar=false;m.vScrollbar=false;m._scrollbar("h");m._scrollbar("v");m._unbind(h,window);m._unbind(b);m._unbind(p);m._unbind(e);m._unbind(t);if(!m.options.hasTouch){m._unbind("mouseout",m.wrapper);m._unbind(q)}if(m.options.useTransition){m._unbind("webkitTransitionEnd")}if(m.options.checkDOMChanges){clearInterval(m.checkDOMTime)}if(m.options.onDestroy){m.options.onDestroy.call(m)}},refresh:function(){var B=this,y,A,x,z,D=0,C=0;if(B.scaleB.wrapperH);B.hScrollbar=B.hScroll&&B.options.hScrollbar&&B.maxScrollX<0;B.vScrollbar=B.vScroll&&B.options.vScrollbar&&B.maxScrollY<0;y=B._offset(B.wrapper);B.wrapperOffsetLeft=-y.left;B.wrapperOffsetTop=-y.top;var E=document.defaultView.getComputedStyle(B.scroller,null);B.wrapperOffsetTop+=parseInt(E["padding-top"]);if(typeof B.options.snap=="string"){B.pagesX=[];B.pagesY=[];z=B.scroller.querySelectorAll(B.options.snap);for(A=0,x=z.length;A=B.maxScrollX){B.pagesX[C]=D;D=D-B.wrapperW;C++}if(B.maxScrollX%B.wrapperW){B.pagesX[B.pagesX.length]=B.maxScrollX-B.pagesX[B.pagesX.length-1]+B.pagesX[B.pagesX.length-1]}D=0;C=0;B.pagesY=[];while(D>=B.maxScrollY){B.pagesY[C]=D;D=D-B.wrapperH;C++}if(B.maxScrollY%B.wrapperH){B.pagesY[B.pagesY.length]=B.maxScrollY-B.pagesY[B.pagesY.length-1]+B.pagesY[B.pagesY.length-1]}}}B._scrollbar("h");B._scrollbar("v");if(!B.zoomed){B._resetPos(200)}},scrollTo:function(m,F,E,D){var C=this,B=m,A,z;if(!E){C._posImpl(m,F);return}C.stop();if(!B.length){B=[{x:m,y:F,time:E,relative:D}]}for(A=0,z=B.length;A=x.y-x.wrapper.clientHeight){return}else{if(z.topx.x-x.wrapper.clientWidth){return}else{if(z.left0?0:z.leftx.minScrollY?x.minScrollY:z.topB.pagesX.length-1?B.pagesX.length-1:A;z=z<0?0:z>B.pagesY.length-1?B.pagesY.length-1:z;B.currPageX=A;B.currPageY=z;m=B.pagesX[A];D=B.pagesY[z]}else{m=-B.wrapperW*A;D=-B.wrapperH*z;if(m0?0:z.xz.minScrollY?z.minScrollY:z.yi;i++){var r=g[i],f=r.toUpperCase()+"_"+t;if(f in a)return"@-"+r.toLowerCase()+"-"+n}return!1};l.atRule=m;var g=l._config.usePrefixes?" -webkit- -moz- -o- -ms- ".split(" "):["",""];l._prefixes=g,o(),a(r),delete l.addTest,delete l.addAsyncTest;for(var v=0;v255?255:this.r,this.g=this.g<0||isNaN(this.g)?0:this.g>255?255:this.g,this.b=this.b<0||isNaN(this.b)?0:this.b>255?255:this.b,this.toRGB=function(){return"rgb("+this.r+", "+this.g+", "+this.b+")"},this.toHex=function(){var e=this.r.toString(16),t=this.g.toString(16),n=this.b.toString(16);return e.length==1&&(e="0"+e),t.length==1&&(t="0"+t),n.length==1&&(n="0"+n),"#"+e+t+n},this.getHelpXML=function(){var e=new Array;for(var r=0;r "+f.toRGB()+" -> "+f.toHex());a.appendChild(l),a.appendChild(c),u.appendChild(a)}catch(h){}return u}}canvg=function(){function t(){var e={};return e.FRAMERATE=30,e.MAX_VIRTUAL_PIXELS=3e4,e.init=function(t){e.Definitions={},e.Styles={},e.Animations=[],e.Images=[],e.ctx=t,e.ViewPort=new function(){this.viewPorts=[],this.Clear=function(){this.viewPorts=[]},this.SetCurrent=function(e,t){this.viewPorts.push({width:e,height:t})},this.RemoveCurrent=function(){this.viewPorts.pop()},this.Current=function(){return this.viewPorts[this.viewPorts.length-1]},this.width=function(){return this.Current().width},this.height=function(){return this.Current().height},this.ComputeSize=function(e){return e!=null&&typeof e=="number"?e:e=="x"?this.width():e=="y"?this.height():Math.sqrt(Math.pow(this.width(),2)+Math.pow(this.height(),2))/Math.sqrt(2)}}},e.init(),e.ImagesLoaded=function(){for(var t=0;t]*>/,"");var n=new ActiveXObject("Microsoft.XMLDOM");return n.async="false",n.loadXML(e),n},e.Property=function(t,n){this.name=t,this.value=n,this.hasValue=function(){return this.value!=null&&this.value!==""},this.numValue=function(){if(!this.hasValue())return 0;var e=parseFloat(this.value);return(this.value+"").match(/%$/)&&(e/=100),e},this.valueOrDefault=function(e){return this.hasValue()?this.value:e},this.numValueOrDefault=function(e){return this.hasValue()?this.numValue():e};var r=this;this.Color={addOpacity:function(t){var n=r.value;if(t!=null&&t!=""){var i=new RGBColor_(r.value);i.ok&&(n="rgba("+i.r+", "+i.g+", "+i.b+", "+t+")")}return new e.Property(r.name,n)}},this.Definition={getDefinition:function(){var t=r.value.replace(/^(url\()?#([^\)]+)\)?$/,"$2");return e.Definitions[t]},isUrl:function(){return r.value.indexOf("url(")==0},getFillStyle:function(t){var n=this.getDefinition();return n!=null&&n.createGradient?n.createGradient(e.ctx,t):n!=null&&n.createPattern?n.createPattern(e.ctx,t):null}},this.Length={DPI:function(e){return 96},EM:function(t){var n=12,r=new e.Property("fontSize",e.Font.Parse(e.ctx.font).fontSize);return r.hasValue()&&(n=r.Length.toPixels(t)),n},toPixels:function(t){if(!r.hasValue())return 0;var n=r.value+"";return n.match(/em$/)?r.numValue()*this.EM(t):n.match(/ex$/)?r.numValue()*this.EM(t)/2:n.match(/px$/)?r.numValue():n.match(/pt$/)?r.numValue()*1.25:n.match(/pc$/)?r.numValue()*15:n.match(/cm$/)?r.numValue()*this.DPI(t)/2.54:n.match(/mm$/)?r.numValue()*this.DPI(t)/25.4:n.match(/in$/)?r.numValue()*this.DPI(t):n.match(/%$/)?r.numValue()*e.ViewPort.ComputeSize(t):r.numValue()}},this.Time={toMilliseconds:function(){if(!r.hasValue())return 0;var e=r.value+"";return e.match(/s$/)?r.numValue()*1e3:e.match(/ms$/)?r.numValue():r.numValue()}},this.Angle={toRadians:function(){if(!r.hasValue())return 0;var e=r.value+"";return e.match(/deg$/)?r.numValue()*(Math.PI/180):e.match(/grad$/)?r.numValue()*(Math.PI/200):e.match(/rad$/)?r.numValue():r.numValue()*(Math.PI/180)}}},e.Font=new function(){this.Styles=["normal","italic","oblique","inherit"],this.Variants=["normal","small-caps","inherit"],this.Weights=["normal","bold","bolder","lighter","100","200","300","400","500","600","700","800","900","inherit"],this.CreateFont=function(t,n,r,i,s,o){var u=o!=null?this.Parse(o):this.CreateFont("","","","","",e.ctx.font);return{fontFamily:s||u.fontFamily,fontSize:i||u.fontSize,fontStyle:t||u.fontStyle,fontWeight:r||u.fontWeight,fontVariant:n||u.fontVariant,toString:function(){return[this.fontStyle,this.fontVariant,this.fontWeight,this.fontSize,this.fontFamily].join(" ")}}};var t=this;this.Parse=function(n){var r={},i=e.trim(e.compressSpaces(n||"")).split(" "),s={fontSize:!1,fontStyle:!1,fontWeight:!1,fontVariant:!1},o="";for(var u=0;uthis.x2&&(this.x2=e)}if(t!=null){if(isNaN(this.y1)||isNaN(this.y2))this.y1=t,this.y2=t;tthis.y2&&(this.y2=t)}},this.addX=function(e){this.addPoint(e,null)},this.addY=function(e){this.addPoint(null,e)},this.addBoundingBox=function(e){this.addPoint(e.x1,e.y1),this.addPoint(e.x2,e.y2)},this.addQuadraticCurve=function(e,t,n,r,i,s){var o=e+2/3*(n-e),u=t+2/3*(r-t),a=o+1/3*(i-e),f=u+1/3*(s-t);this.addBezierCurve(e,t,o,a,u,f,i,s)},this.addBezierCurve=function(e,t,n,r,i,s,o,u){var a=[e,t],f=[n,r],l=[i,s],c=[o,u];this.addPoint(a[0],a[1]),this.addPoint(c[0],c[1]);for(var h=0;h<=1;h++){var p=function(e){return Math.pow(1-e,3)*a[h]+3*Math.pow(1-e,2)*e*f[h]+3*(1-e)*Math.pow(e,2)*l[h]+Math.pow(e,3)*c[h]},d=6*a[h]-12*f[h]+6*l[h],v=-3*a[h]+9*f[h]-9*l[h]+3*c[h],m=3*f[h]-3*a[h];if(v==0){if(d==0)continue;var g=-m/d;0=this.tokens.length-1},this.isCommandOrEnd=function(){return this.isEnd()?!0:this.tokens[this.i+1].match(/^[A-Za-z]$/)!=null},this.isRelativeCommand=function(){return this.command==this.command.toLowerCase()},this.getToken=function(){return this.i=this.i+1,this.tokens[this.i]},this.getScalar=function(){return parseFloat(this.getToken())},this.nextCommand=function(){this.previousCommand=this.command,this.command=this.getToken()},this.getPoint=function(){var t=new e.Point(this.getScalar(),this.getScalar());return this.makeAbsolute(t)},this.getAsControlPoint=function(){var e=this.getPoint();return this.control=e,e},this.getAsCurrentPoint=function(){var e=this.getPoint();return this.current=e,e},this.getReflectedControlPoint=function(){if(this.previousCommand.toLowerCase()!="c"&&this.previousCommand.toLowerCase()!="s")return this.current;var t=new e.Point(2*this.current.x-this.control.x,2*this.current.y-this.control.y);return t},this.makeAbsolute=function(e){return this.isRelativeCommand()&&(e.x=this.current.x+e.x,e.y=this.current.y+e.y),e},this.addMarker=function(e,t,n){n!=null&&this.angles.length>0&&this.angles[this.angles.length-1]==null&&(this.angles[this.angles.length-1]=this.points[this.points.length-1].angleTo(n)),this.addMarkerAngle(e,t==null?null:t.angleTo(e))},this.addMarkerAngle=function(e,t){this.points.push(e),this.angles.push(t)},this.getMarkerPoints=function(){return this.points},this.getMarkerAngles=function(){for(var e=0;e1&&(c*=Math.sqrt(g),h*=Math.sqrt(g));var y=(d==v?-1:1)*Math.sqrt((Math.pow(c,2)*Math.pow(h,2)-Math.pow(c,2)*Math.pow(m.y,2)-Math.pow(h,2)*Math.pow(m.x,2))/(Math.pow(c,2)*Math.pow(m.y,2)+Math.pow(h,2)*Math.pow(m.x,2)));isNaN(y)&&(y=0);var b=new e.Point(y*c*m.y/h,y*-h*m.x/c),w=new e.Point((u.x+l.x)/2+Math.cos(p)*b.x-Math.sin(p)*b.y,(u.y+l.y)/2+Math.sin(p)*b.x+Math.cos(p)*b.y),E=function(e){return Math.sqrt(Math.pow(e[0],2)+Math.pow(e[1],2))},S=function(e,t){return(e[0]*t[0]+e[1]*t[1])/(E(e)*E(t))},x=function(e,t){return(e[0]*t[1]=1&&(k=0),v==0&&k>0&&(k-=2*Math.PI),v==1&&k<0&&(k+=2*Math.PI);var L=new e.Point(w.x-c*Math.cos((T+k)/2),w.y-h*Math.sin((T+k)/2));n.addMarkerAngle(L,(T+k)/2+(v==0?1:-1)*Math.PI/2),n.addMarkerAngle(l,k+(v==0?1:-1)*Math.PI/2),r.addPoint(l.x,l.y);if(t!=null){S=c>h?c:h;var A=c>h?1:c/h,O=c>h?h/c:1;t.translate(w.x,w.y),t.rotate(p),t.scale(A,O),t.arc(0,0,S,T,T+k,1-v),t.scale(1/A,1/O),t.rotate(-p),t.translate(-w.x,-w.y)}}break;case"Z":t!=null&&t.closePath(),n.current=n.start}}return r},this.getMarkers=function(){var e=this.PathParser.getMarkerPoints(),t=this.PathParser.getMarkerAngles(),n=[];for(var r=0;rthis.maxDuration){if(this.attribute("repeatCount").value!="indefinite")return this.attribute("fill").valueOrDefault("remove")=="remove"&&!this.removed?(this.removed=!0,this.getProperty().value=this.initialValue,!0):!1;this.duration=0}this.duration=this.duration+e;var t=!1;if(this.begin0&&t[n-1]!=" "&&n0&&t[n-1]!=" "&&(n==t.length-1||t[n+1]==" ")&&(s="initial"),typeof e.glyphs[r]!="undefined"&&(i=e.glyphs[r][s],i==null&&e.glyphs[r].type=="glyph"&&(i=e.glyphs[r]))}else i=e.glyphs[r];return i==null&&(i=e.missingGlyph),i},this.renderChildren=function(t){var n=this.parent.style("font-family").Definition.getDefinition();if(n!=null){var r=this.parent.style("font-size").numValueOrDefault(e.Font.Parse(e.ctx.font).fontSize),i=this.parent.style("font-style").valueOrDefault(e.Font.Parse(e.ctx.font).fontStyle),s=this.getText();n.isRTL&&(s=s.split("").reverse().join(""));var o=e.ToNumberArray(this.parent.attribute("dx").value);for(var u=0;u0?t.childNodes[0].value:t.text,this.getText=function(){return this.text}},e.Element.tspan.prototype=new e.Element.TextElementBase,e.Element.tspan=e.Element.tspan,e.Element.tref=function(t){this.base=e.Element.TextElementBase,this.base(t),this.getText=function(){var e=this.attribute("xlink:href").Definition.getDefinition();if(e!=null)return e.children[0].getText()}},e.Element.tref.prototype=new e.Element.TextElementBase,e.Element.tref=e.Element.tref,e.Element.a=function(t){this.base=e.Element.TextElementBase,this.base(t),this.hasText=!0;for(var n=0;n0){var y=m[g].indexOf("url"),b=m[g].indexOf(")",y),w=m[g].substr(y+5,b-y-6),E=e.parseXml(e.ajax(w)),S=E.getElementsByTagName("font");for(var x=0;x1?n-1:0),i=1;i=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var u=a,c=t["padding-"+u];r[u]=e(c)}return r}function i(t,e,n,r){return{width:t,height:e,top:n,right:t+r,bottom:e+n,left:r}}function o(t){var e=t.getBBox();return i(e.width,e.height,0,0)}function s(){var n=t(document.documentElement),r=e(n.width),o=e(n.height);return i(r,o,0,0)}function a(o){var s=o.clientWidth,a=o.clientHeight;if(!s&&!a)return O;var u=t(o),c=r(u),h=c.left+c.right,f=c.top+c.bottom,l=e(u.width),p=e(u.height);"border-box"===u.boxSizing&&(Math.round(l+h)!==s&&(l-=n(u,"left","right")+h),Math.round(p+f)!==a&&(p-=n(u,"top","bottom")+f));var d=Math.round(l+h)-s,_=Math.round(p+f)-a;return 1!==Math.abs(d)&&(l-=d),1!==Math.abs(_)&&(p-=_),i(l,p,c.top,c.left)}function u(t){return t instanceof window.SVGElement}function c(t){return t===document.documentElement}function h(t){return u(t)?o(t):c(t)?s():a(t)}function f(t,e){for(var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r={configurable:n.configurable||!1,writable:n.writable||!1,enumerable:n.enumerable||!1},i=Object.keys(e),o=Array.isArray(i),s=0,i=o?i:i[Symbol.iterator]();;){var a;if(o){if(s>=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var u=a;r.value=e[u],Object.defineProperty(t,u,r)}return t}var l=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},p=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:null,n=this.__entries__,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;t.call(e,s[1],s[0])}},p(e,[{key:"size",get:function(){return this.__entries__.length}}]),e}(v)}(),w=function(){return"function"==typeof window.requestAnimationFrame?window.requestAnimationFrame:function(t){return setTimeout(function(){return t(Date.now())},1e3/60)}}(),g=function(t){function e(){t.apply.apply(t,s),s=null,a&&(r.apply.apply(r,a),a=null)}function n(){o?w(e):e()}function r(){for(var t=arguments.length,e=Array(t),r=0;r1&&void 0!==arguments[1]?arguments[1]:0,o=arguments.length>2&&void 0!==arguments[2]&&arguments[2],s=null,a=null;return r},m="function"==typeof window.MutationObserver,E=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];l(this,t),this._isCycleContinuous=!m||e,this._listenersEnabled=!1,this._mutationsObserver=null,this._observers=[],this.refresh=g(this.refresh.bind(this),30,!0),this._continuousUpdateHandler=g(this.refresh,70)}return t.prototype.connect=function(t){this.isConnected(t)||this._observers.push(t),this._listenersEnabled||this._addListeners()},t.prototype.disconnect=function(t){var e=this._observers,n=e.indexOf(t);~n&&e.splice(n,1),!e.length&&this._listenersEnabled&&this._removeListeners()},t.prototype.isConnected=function(t){return!!~this._observers.indexOf(t)},t.prototype.refresh=function(){var t=this._updateObservers();t?this.refresh():this._isCycleContinuous&&this._listenersEnabled&&this._continuousUpdateHandler()},t.prototype._updateObservers=function(){for(var t=!1,e=this._observers,n=Array.isArray(e),r=0,e=n?e:e[Symbol.iterator]();;){var i;if(n){if(r>=e.length)break;i=e[r++]}else{if(r=e.next(),r.done)break;i=r.value}var o=i;o.gatherActive(),o.hasActive()&&(t=!0,o.broadcastActive())}return t},t.prototype._addListeners=function(){this._listenersEnabled||(window.addEventListener("resize",this.refresh),m&&(this._mutationsObserver=new MutationObserver(this.refresh),this._mutationsObserver.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})),this._listenersEnabled=!0,this._isCycleContinuous&&this.refresh())},t.prototype._removeListeners=function(){this._listenersEnabled&&(window.removeEventListener("resize",this.refresh),this._mutationsObserver&&this._mutationsObserver.disconnect(),this._mutationsObserver=null,this._listenersEnabled=!1)},p(t,[{key:"continuousUpdates",get:function(){return this._isCycleContinuous},set:function(t){m&&(this._isCycleContinuous=t,this._listenersEnabled&&t&&this.refresh())}}]),t}(),O=i(0,0,0,0),A=function(){function t(e){l(this,t),this.target=e,this._contentRect=O,this.broadcastWidth=0,this.broadcastHeight=0}return t.prototype.broadcastRect=function(){var t=this._contentRect;return this.broadcastWidth=t.width,this.broadcastHeight=t.height,t},t.prototype.isActive=function(){var t=h(this.target);return this._contentRect=t,t.width!==this.broadcastWidth||t.height!==this.broadcastHeight},t}(),ResizeObserverEntry=function ResizeObserverEntry(t,e){l(this,ResizeObserverEntry);var n=window.ClientRect||Object,r=Object.create(n.prototype);f(r,e,{configurable:!0}),f(this,{target:t,contentRect:r},{configurable:!0})},k=function(){function ResizeObserver(t,e,n){if(l(this,ResizeObserver),"function"!=typeof t)throw new TypeError("The callback provided as parameter 1 is not a function.");this._callback=t,this._targets=new y,this._activeTargets=[],this._controller=e,this._publicObserver=n}return ResizeObserver.prototype.observe=function(t){if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");if(!(t instanceof Element))throw new TypeError('parameter 1 is not of type "Element".');var e=this._targets;e.has(t)||(e.set(t,new A(t)),this._controller.isConnected(this)||this._controller.connect(this),this._controller.refresh())},ResizeObserver.prototype.unobserve=function(t){if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");if(!(t instanceof Element))throw new TypeError('parameter 1 is not of type "Element".');var e=this._targets;e.has(t)&&(e.delete(t),e.size||this.disconnect())},ResizeObserver.prototype.disconnect=function(){this.clearActive(),this._targets.clear(),this._controller.disconnect(this)},ResizeObserver.prototype.gatherActive=function(){this.clearActive();var t=this._activeTargets;this._targets.forEach(function(e){e.isActive()&&t.push(e)})},ResizeObserver.prototype.broadcastActive=function(){if(this.hasActive()){var t=this._publicObserver,e=this._activeTargets.map(function(t){return new ResizeObserverEntry(t.target,t.broadcastRect())});this.clearActive(),this._callback.call(t,e,t)}},ResizeObserver.prototype.clearActive=function(){this._activeTargets.splice(0)},ResizeObserver.prototype.hasActive=function(){return!!this._activeTargets.length},ResizeObserver}(),T=new E,C=new v,ResizeObserver=function(){function ResizeObserver(t){if(l(this,ResizeObserver),!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var e=new k(t,T,this);C.set(this,e)}return p(ResizeObserver,null,[{key:"continuousUpdates",get:function(){return T.continuousUpdates},set:function(t){if("boolean"!=typeof t)throw new TypeError('type of "continuousUpdates" value must be boolean.');T.continuousUpdates=t}}]),ResizeObserver}();["observe","unobserve","disconnect"].forEach(function(t){ResizeObserver.prototype[t]=function(){var e;return(e=C.get(this))[t].apply(e,arguments)}}),"function"!=typeof window.ResizeObserver&&Object.defineProperty(window,"ResizeObserver",{value:ResizeObserver,writable:!0,configurable:!0});var x=window.ResizeObserver;return x}); + diff --git a/experiment/simulation/EE6/iframes/data/slide1.css b/experiment/simulation/EE6/iframes/data/slide1.css new file mode 100644 index 0000000..2a8c4a3 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide1.css @@ -0,0 +1 @@ +#spr1_1b1b03c1 {clip:rect(0px,960px,540px,0px);}#txt0_1b1b03c1 {font-family:fnt4; font-size:35px; line-height:41px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt1_1b1b03c1 {font-family:fnt4; font-size:35px; line-height:41px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt2_1b1b03c1 {font-family:fnt4; font-size:35px; line-height:41px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt3_1b1b03c1 {font-family:fnt4; font-size:35px; line-height:41px; font-weight:bold; color:#ffffff;}#txt4_1b1b03c1,#txt8_1b1b03c1,#txt10_1b1b03c1,#txt16_1b1b03c1,#txt20_1b1b03c1,#txt22_1b1b03c1 {font-family:fnt5; font-size:25px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt5_1b1b03c1,#txt9_1b1b03c1,#txt11_1b1b03c1,#txt17_1b1b03c1,#txt21_1b1b03c1,#txt23_1b1b03c1 {font-family:fnt5; font-size:25px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt6_1b1b03c1,#txt12_1b1b03c1,#txt14_1b1b03c1,#txt18_1b1b03c1,#txt24_1b1b03c1,#txt26_1b1b03c1 {font-family:fnt5; font-size:25px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt7_1b1b03c1,#txt13_1b1b03c1,#txt15_1b1b03c1,#txt19_1b1b03c1,#txt25_1b1b03c1,#txt27_1b1b03c1 {font-family:fnt5; font-size:25px; line-height:29px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide1.js b/experiment/simulation/EE6/iframes/data/slide1.js new file mode 100644 index 0000000..f1536e3 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide1.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(0, '
    OVERVIEW
    OVERVIEW
    OVERVIEW
    OVERVIEW
    FUNDAMENTALS
    FUNDAMENTALS
    FUNDAMENTALS
    FUNDAMENTALS
    INSTRUMENTS
    INSTRUMENTS
    REQUIRED
    REQUIRED
    INSTRUMENTS
    INSTRUMENTS
    REQUIRED
    REQUIRED
    PROCEDURE
    PROCEDURE
    PROCEDURE
    PROCEDURE
    VIRTUAL
    VIRTUAL
    EXPERIMENT
    EXPERIMENT
    VIRTUAL
    VIRTUAL
    EXPERIMENT
    EXPERIMENT
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide10.css b/experiment/simulation/EE6/iframes/data/slide10.css new file mode 100644 index 0000000..36dde16 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide10.css @@ -0,0 +1 @@ +#spr1_1b1b2207 {clip:rect(0px,960px,540px,0px);}#spr3_1b1b2207,#spr4_1b1b2207,#spr5_1b1b2207,#spr6_1b1b2207,#spr7_1b1b2207,#svg1_1b1b2207,#spr8_1b1b2207,#spr9_1b1b2207,#spr12_1b1b2207,#spr13_1b1b2207,#spr18_1b1b2207,#spr19_1b1b2207 {display:none;}#svg0_1b1b2207 {-webkit-transform-origin:6.256px 6.256px; -moz-transform-origin:6.256px 6.256px; -o-transform-origin:6.256px 6.256px; -ms-transform-origin:6.256px 6.256px; transform-origin:6.256px 6.256px; display:none;}#txt0_1b1b2207,#txt1_1b1b2207,#txt4_1b1b2207,#txt5_1b1b2207,#txt6_1b1b2207,#txt7_1b1b2207,#txt8_1b1b2207,#txt9_1b1b2207,#txt10_1b1b2207,#txt11_1b1b2207,#txt12_1b1b2207,#txt13_1b1b2207,#txt14_1b1b2207,#txt15_1b1b2207,#txt16_1b1b2207,#txt17_1b1b2207,#txt18_1b1b2207,#txt19_1b1b2207,#txt20_1b1b2207,#txt21_1b1b2207,#txt22_1b1b2207,#txt23_1b1b2207,#txt24_1b1b2207,#txt25_1b1b2207,#txt26_1b1b2207,#txt27_1b1b2207,#txt28_1b1b2207,#txt54_1b1b2207,#txt55_1b1b2207,#txt56_1b1b2207,#txt57_1b1b2207,#txt58_1b1b2207,#txt59_1b1b2207,#txt66_1b1b2207,#txt68_1b1b2207 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt2_1b1b2207,#txt3_1b1b2207,#txt60_1b1b2207,#txt61_1b1b2207,#txt62_1b1b2207,#txt63_1b1b2207,#txt64_1b1b2207,#txt65_1b1b2207 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#ffffff;}#txt29_1b1b2207,#txt30_1b1b2207,#txt31_1b1b2207,#txt32_1b1b2207,#txt33_1b1b2207,#txt34_1b1b2207,#txt35_1b1b2207,#txt36_1b1b2207,#txt37_1b1b2207,#txt38_1b1b2207,#txt39_1b1b2207,#txt40_1b1b2207,#txt41_1b1b2207,#txt42_1b1b2207,#txt43_1b1b2207,#txt44_1b1b2207,#txt45_1b1b2207,#txt46_1b1b2207,#txt47_1b1b2207,#txt48_1b1b2207,#txt49_1b1b2207,#txt50_1b1b2207,#txt51_1b1b2207,#txt52_1b1b2207,#txt53_1b1b2207 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#9900cc;}#spr10_1b1b2207 {-webkit-transform:matrix(0.450672,-0.892689,0.892689,0.450672,0,0); -o-transform:matrix(0.450672,-0.892689,0.892689,0.450672,0,0); -ms-transform:matrix(0.450672,-0.892689,0.892689,0.450672,0,0); -moz-transform:matrix(0.450672,-0.892689,0.892689,0.450672,0,0); transform:matrix(0.450672,-0.892689,0.892689,0.450672,0,0); display:none;}#spr11_1b1b2207 {-webkit-transform:matrix(0.450672,0.89269,-0.89269,0.450672,0,0); -o-transform:matrix(0.450672,0.89269,-0.89269,0.450672,0,0); -ms-transform:matrix(0.450672,0.89269,-0.89269,0.450672,0,0); -moz-transform:matrix(0.450672,0.89269,-0.89269,0.450672,0,0); transform:matrix(0.450672,0.89269,-0.89269,0.450672,0,0);}#svg2_1b1b2207 {-webkit-transform-origin:1.201px 0.812px; -moz-transform-origin:1.201px 0.812px; -o-transform-origin:1.201px 0.812px; -ms-transform-origin:1.201px 0.812px; transform-origin:1.201px 0.812px;}#txt67_1b1b2207 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#005800;}#txt69_1b1b2207 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#254f2f;}#txt70_1b1b2207 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt71_1b1b2207 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt72_1b1b2207 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt73_1b1b2207 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide10.js b/experiment/simulation/EE6/iframes/data/slide10.js new file mode 100644 index 0000000..7865d2c --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide10.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(9, '
    1)  MOSFET
    1)  MOSFET
    It  is  switching  device  mounted
    on  heat  sink  to  extract  the
    heat  generated  within  the  device
    and  transfer  it  to  the  ambient
    environment.
    It  is  switching  device  mounted
    on  heat  sink  to  extract  the
    heat  generated  within  the  device
    and  transfer  it  to  the  ambient
    environment.
    2)  DC  source  (Adjustable  voltage  magnitude):
    2)  DC  source  (Adjustable  voltage  magnitude):
    It is able to provide a range of DC voltages.
    It is able to provide a range of DC voltages.
     Heat sink
     Heat sink
    Instruments Required
    Instruments Required
    Instruments Required
    Instruments Required
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide11.css b/experiment/simulation/EE6/iframes/data/slide11.css new file mode 100644 index 0000000..2bc6dd9 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide11.css @@ -0,0 +1 @@ +#spr1_1b1b24a7 {clip:rect(0px,960px,540px,0px);}#svg0_1b1b24a7 {-webkit-transform-origin:6.256px 6.256px; -moz-transform-origin:6.256px 6.256px; -o-transform-origin:6.256px 6.256px; -ms-transform-origin:6.256px 6.256px; transform-origin:6.256px 6.256px; display:none;}#spr3_1b1b24a7,#spr4_1b1b24a7,#spr5_1b1b24a7,#spr6_1b1b24a7,#spr8_1b1b24a7,#spr12_1b1b24a7,#spr16_1b1b24a7,#spr17_1b1b24a7,#spr18_1b1b24a7,#spr19_1b1b24a7,#spr20_1b1b24a7 {display:none;}#txt0_1b1b24a7,#txt1_1b1b24a7,#txt2_1b1b24a7,#txt6_1b1b24a7,#txt7_1b1b24a7,#txt8_1b1b24a7,#txt9_1b1b24a7,#txt10_1b1b24a7,#txt11_1b1b24a7,#txt12_1b1b24a7,#txt13_1b1b24a7,#txt14_1b1b24a7,#txt15_1b1b24a7,#txt16_1b1b24a7,#txt17_1b1b24a7,#txt18_1b1b24a7,#txt19_1b1b24a7,#txt20_1b1b24a7,#txt21_1b1b24a7,#txt22_1b1b24a7,#txt23_1b1b24a7,#txt24_1b1b24a7,#txt25_1b1b24a7,#txt26_1b1b24a7,#txt27_1b1b24a7,#txt28_1b1b24a7,#txt29_1b1b24a7,#txt54_1b1b24a7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt3_1b1b24a7,#txt4_1b1b24a7,#txt5_1b1b24a7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#ffffff;}#txt30_1b1b24a7,#txt31_1b1b24a7,#txt32_1b1b24a7,#txt33_1b1b24a7,#txt34_1b1b24a7,#txt35_1b1b24a7,#txt36_1b1b24a7,#txt37_1b1b24a7,#txt38_1b1b24a7,#txt39_1b1b24a7,#txt40_1b1b24a7,#txt41_1b1b24a7,#txt42_1b1b24a7,#txt43_1b1b24a7,#txt44_1b1b24a7,#txt45_1b1b24a7,#txt46_1b1b24a7,#txt47_1b1b24a7,#txt48_1b1b24a7,#txt49_1b1b24a7,#txt50_1b1b24a7,#txt51_1b1b24a7,#txt52_1b1b24a7,#txt53_1b1b24a7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#0000ff;}#spr7_1b1b24a7 {-webkit-transform:matrix(0.935179,-0.354175,0.354175,0.935179,0,0); -o-transform:matrix(0.935179,-0.354175,0.354175,0.935179,0,0); -ms-transform:matrix(0.935179,-0.354175,0.354175,0.935179,0,0); -moz-transform:matrix(0.935179,-0.354175,0.354175,0.935179,0,0); transform:matrix(0.935179,-0.354175,0.354175,0.935179,0,0); display:none;}#spr11_1b1b24a7 {-webkit-transform:matrix(0.89332,0.44942,-0.44942,0.89332,0,0); -o-transform:matrix(0.89332,0.44942,-0.44942,0.89332,0,0); -ms-transform:matrix(0.89332,0.44942,-0.44942,0.89332,0,0); -moz-transform:matrix(0.89332,0.44942,-0.44942,0.89332,0,0); transform:matrix(0.89332,0.44942,-0.44942,0.89332,0,0);}#spr14_1b1b24a7 {-webkit-transform:matrix(0.681674,0.731656,-0.731656,0.681674,0,0); -o-transform:matrix(0.681674,0.731656,-0.731656,0.681674,0,0); -ms-transform:matrix(0.681674,0.731656,-0.731656,0.681674,0,0); -moz-transform:matrix(0.681674,0.731656,-0.731656,0.681674,0,0); transform:matrix(0.681674,0.731656,-0.731656,0.681674,0,0);}#spr15_1b1b24a7 {-webkit-transform:matrix(0.952111,0.305752,-0.305752,0.952111,0,0); -o-transform:matrix(0.952111,0.305752,-0.305752,0.952111,0,0); -ms-transform:matrix(0.952111,0.305752,-0.305752,0.952111,0,0); -moz-transform:matrix(0.952111,0.305752,-0.305752,0.952111,0,0); transform:matrix(0.952111,0.305752,-0.305752,0.952111,0,0);}#txt55_1b1b24a7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#0000e2;}#txt56_1b1b24a7 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt57_1b1b24a7 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt58_1b1b24a7 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt59_1b1b24a7 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide11.js b/experiment/simulation/EE6/iframes/data/slide11.js new file mode 100644 index 0000000..772770f --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide11.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(10, '
    3)  LOAD-R   (Resistive)
    3)  LOAD-R   (Resistive)
    The  experiment  is  done  at  fixed  load
    or  resistance  (R).  rheostat  is
    generally  used  which  can  provide  a
    range  of  resistance  values.
    The  experiment  is  done  at  fixed  load
    or  resistance  (R).  rheostat  is
    generally  used  which  can  provide  a
    range  of  resistance  values.
    Multi-meter
    Multi-meter
    Instruments Required
    Instruments Required
    Instruments Required
    Instruments Required
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide12.css b/experiment/simulation/EE6/iframes/data/slide12.css new file mode 100644 index 0000000..d9c95ef --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide12.css @@ -0,0 +1 @@ +#spr1_1b1b27f3 {clip:rect(0px,960px,540px,0px);}#svg0_1b1b27f3 {-webkit-transform-origin:6.256px 6.256px; -moz-transform-origin:6.256px 6.256px; -o-transform-origin:6.256px 6.256px; -ms-transform-origin:6.256px 6.256px; transform-origin:6.256px 6.256px; display:none;}#spr3_1b1b27f3,#spr4_1b1b27f3,#spr5_1b1b27f3,#spr6_1b1b27f3,#spr7_1b1b27f3,#spr8_1b1b27f3,#spr9_1b1b27f3,#spr14_1b1b27f3,#spr19_1b1b27f3,#spr20_1b1b27f3 {display:none;}#txt0_1b1b27f3,#txt1_1b1b27f3,#txt2_1b1b27f3,#txt3_1b1b27f3,#txt9_1b1b27f3,#txt10_1b1b27f3,#txt11_1b1b27f3,#txt12_1b1b27f3,#txt13_1b1b27f3,#txt14_1b1b27f3,#txt15_1b1b27f3,#txt16_1b1b27f3,#txt17_1b1b27f3,#txt18_1b1b27f3,#txt19_1b1b27f3,#txt33_1b1b27f3,#txt34_1b1b27f3,#txt35_1b1b27f3,#txt36_1b1b27f3,#txt37_1b1b27f3,#txt38_1b1b27f3,#txt39_1b1b27f3,#txt40_1b1b27f3,#txt41_1b1b27f3,#txt42_1b1b27f3,#txt43_1b1b27f3,#txt44_1b1b27f3,#txt58_1b1b27f3,#txt60_1b1b27f3,#txt61_1b1b27f3,#txt62_1b1b27f3,#txt63_1b1b27f3,#txt64_1b1b27f3,#txt65_1b1b27f3,#txt66_1b1b27f3,#txt74_1b1b27f3,#txt75_1b1b27f3,#txt76_1b1b27f3,#txt77_1b1b27f3,#txt78_1b1b27f3,#txt79_1b1b27f3,#txt80_1b1b27f3,#txt81_1b1b27f3,#txt82_1b1b27f3,#txt83_1b1b27f3,#txt84_1b1b27f3 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt4_1b1b27f3,#txt5_1b1b27f3,#txt6_1b1b27f3,#txt7_1b1b27f3,#txt67_1b1b27f3,#txt68_1b1b27f3,#txt69_1b1b27f3,#txt70_1b1b27f3,#txt71_1b1b27f3,#txt72_1b1b27f3,#txt73_1b1b27f3 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#ffffff;}#txt8_1b1b27f3,#txt32_1b1b27f3 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt20_1b1b27f3 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#0000ff;}#txt21_1b1b27f3,#txt22_1b1b27f3,#txt23_1b1b27f3,#txt24_1b1b27f3,#txt25_1b1b27f3,#txt26_1b1b27f3,#txt27_1b1b27f3,#txt28_1b1b27f3,#txt29_1b1b27f3,#txt30_1b1b27f3,#txt31_1b1b27f3 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#0000ff;}#txt45_1b1b27f3 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#9900cc;}#txt46_1b1b27f3,#txt47_1b1b27f3,#txt48_1b1b27f3,#txt49_1b1b27f3,#txt50_1b1b27f3,#txt51_1b1b27f3,#txt52_1b1b27f3,#txt53_1b1b27f3,#txt54_1b1b27f3,#txt55_1b1b27f3,#txt56_1b1b27f3,#txt57_1b1b27f3 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#9900cc;}#txt59_1b1b27f3 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#3333ff;}#svg1_1b1b27f3 {-webkit-transform-origin:11.172px 11.172px; -moz-transform-origin:11.172px 11.172px; -o-transform-origin:11.172px 11.172px; -ms-transform-origin:11.172px 11.172px; transform-origin:11.172px 11.172px; display:none;}#txt85_1b1b27f3,#txt86_1b1b27f3,#txt87_1b1b27f3,#txt88_1b1b27f3,#txt89_1b1b27f3,#txt90_1b1b27f3,#txt91_1b1b27f3,#txt92_1b1b27f3,#txt93_1b1b27f3,#txt94_1b1b27f3,#txt95_1b1b27f3 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#9a0000;}#svg2_1b1b27f3,#svg3_1b1b27f3 {pointer-events:none;}#txt96_1b1b27f3,#txt97_1b1b27f3 {font-family:fnt5; font-size:25px; line-height:29px; font-weight:bold; color:#0000ff;}#txt98_1b1b27f3 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt99_1b1b27f3 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt100_1b1b27f3 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt101_1b1b27f3 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide12.js b/experiment/simulation/EE6/iframes/data/slide12.js new file mode 100644 index 0000000..52d43b4 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide12.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(11, '
    4)  VOLTMETER  and  AMMETER
    4)  VOLTMETER  and  AMMETER
    I. Analog  “Voltmeter”  displayed  here
    measures  the  voltage  appearing
    across  two  terminals.
    I. Analog  “Voltmeter”  displayed  here
    measures  the  voltage  appearing
    across  two  terminals.
    II. Analog  “Ammeter”  displayed  here
    measures  the  current  flowing  through
    the  component,  closed-circuit.
    II. Analog  “Ammeter”  displayed  here
    measures  the  current  flowing  through
    the  component,  closed-circuit.
     
     
    5)  DIGITAL  STORAGE  OSCILLOSCOPE  (DSO)
    with  PROBES
    5)  DIGITAL  STORAGE  OSCILLOSCOPE  (DSO)
    with  PROBES
    “DSO”  is  used  to  observe  the
    instantaneous  current  and
    voltage  waveforms.
    “DSO”  is  used  to  observe  the
    instantaneous  current  and
    voltage  waveforms.
    v
    A
    Instruments Required
    Instruments Required
    Instruments Required
    Instruments Required
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide13.css b/experiment/simulation/EE6/iframes/data/slide13.css new file mode 100644 index 0000000..959351f --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide13.css @@ -0,0 +1 @@ +#spr1_1b1b2b8d {clip:rect(0px,960px,540px,0px);}#svg0_1b1b2b8d,#svg1_1b1b2b8d {-webkit-transform-origin:6.256px 6.256px; -moz-transform-origin:6.256px 6.256px; -o-transform-origin:6.256px 6.256px; -ms-transform-origin:6.256px 6.256px; transform-origin:6.256px 6.256px; display:none;}#spr3_1b1b2b8d,#spr4_1b1b2b8d,#spr5_1b1b2b8d,#spr6_1b1b2b8d,#spr10_1b1b2b8d,#spr11_1b1b2b8d {display:none;}#txt0_1b1b2b8d,#txt1_1b1b2b8d,#txt2_1b1b2b8d,#txt6_1b1b2b8d,#txt7_1b1b2b8d,#txt8_1b1b2b8d,#txt16_1b1b2b8d,#txt17_1b1b2b8d,#txt18_1b1b2b8d,#txt19_1b1b2b8d,#txt20_1b1b2b8d,#txt21_1b1b2b8d,#txt22_1b1b2b8d,#txt23_1b1b2b8d,#txt24_1b1b2b8d,#txt25_1b1b2b8d,#txt26_1b1b2b8d,#txt27_1b1b2b8d,#txt28_1b1b2b8d,#txt29_1b1b2b8d,#txt30_1b1b2b8d,#txt46_1b1b2b8d,#txt47_1b1b2b8d,#txt48_1b1b2b8d,#txt49_1b1b2b8d,#txt50_1b1b2b8d,#txt51_1b1b2b8d,#txt52_1b1b2b8d,#txt53_1b1b2b8d,#txt54_1b1b2b8d,#txt55_1b1b2b8d,#txt56_1b1b2b8d,#txt57_1b1b2b8d,#txt58_1b1b2b8d,#txt59_1b1b2b8d,#txt60_1b1b2b8d,#txt61_1b1b2b8d {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt3_1b1b2b8d,#txt4_1b1b2b8d,#txt5_1b1b2b8d,#txt9_1b1b2b8d,#txt10_1b1b2b8d,#txt11_1b1b2b8d {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#ffffff;}#txt12_1b1b2b8d {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt13_1b1b2b8d {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt14_1b1b2b8d {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt15_1b1b2b8d {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#txt31_1b1b2b8d,#txt32_1b1b2b8d,#txt33_1b1b2b8d,#txt34_1b1b2b8d,#txt35_1b1b2b8d,#txt36_1b1b2b8d,#txt37_1b1b2b8d,#txt38_1b1b2b8d,#txt39_1b1b2b8d,#txt40_1b1b2b8d,#txt41_1b1b2b8d,#txt42_1b1b2b8d,#txt43_1b1b2b8d,#txt44_1b1b2b8d,#txt45_1b1b2b8d {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#9a0000;}#txt62_1b1b2b8d,#txt63_1b1b2b8d,#txt64_1b1b2b8d,#txt65_1b1b2b8d,#txt66_1b1b2b8d,#txt67_1b1b2b8d,#txt68_1b1b2b8d,#txt69_1b1b2b8d,#txt70_1b1b2b8d,#txt71_1b1b2b8d,#txt72_1b1b2b8d,#txt73_1b1b2b8d,#txt74_1b1b2b8d,#txt75_1b1b2b8d,#txt76_1b1b2b8d,#txt77_1b1b2b8d {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#0000e2;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide13.js b/experiment/simulation/EE6/iframes/data/slide13.js new file mode 100644 index 0000000..d4c02a1 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide13.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(12, '
    6)  DIFFERENTIAL  PROBE
    6)  DIFFERENTIAL  PROBE
    7)  CURRENT  PROBE
    7)  CURRENT  PROBE
    Instruments Required
    Instruments Required
    Instruments Required
    Instruments Required
    “Differential  voltage  probe”  is  used  to
    observe  (in  DSO)  the  instantaneous
    voltage  across  two  terminals.
    “Differential  voltage  probe”  is  used  to
    observe  (in  DSO)  the  instantaneous
    voltage  across  two  terminals.
    “Current  probe”  is  used  to  observe  (in
    DSO)  the  instantaneous  current  flowing
    in  the  component/closed  circuit.
    “Current  probe”  is  used  to  observe  (in
    DSO)  the  instantaneous  current  flowing
    in  the  component/closed  circuit.
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide14.css b/experiment/simulation/EE6/iframes/data/slide14.css new file mode 100644 index 0000000..77b23b6 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide14.css @@ -0,0 +1 @@ +#spr1_1b1b2d42 {clip:rect(0px,960px,540px,0px);} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide14.js b/experiment/simulation/EE6/iframes/data/slide14.js new file mode 100644 index 0000000..c8f5909 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide14.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(13, '
    Procedure
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide15.css b/experiment/simulation/EE6/iframes/data/slide15.css new file mode 100644 index 0000000..c6c79af --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide15.css @@ -0,0 +1 @@ +#spr1_1b1b2e1d {clip:rect(0px,960px,540px,0px);}#txt0_1b1b2e1d,#txt1_1b1b2e1d,#txt2_1b1b2e1d,#txt3_1b1b2e1d,#txt4_1b1b2e1d {font-family:fnt11; font-size:32px; line-height:45px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide15.js b/experiment/simulation/EE6/iframes/data/slide15.js new file mode 100644 index 0000000..ff738f6 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide15.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(14, '
    Formulation of
    Circuit set-up
    and procedure for
    Output Characteristics
    generation
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide16.css b/experiment/simulation/EE6/iframes/data/slide16.css new file mode 100644 index 0000000..17066d5 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide16.css @@ -0,0 +1 @@ +#spr1_1b1b2f84 {clip:rect(0px,960px,540px,0px);}#spr3_1b1b2f84,#spr4_1b1b2f84,#spr5_1b1b2f84,#spr6_1b1b2f84,#spr7_1b1b2f84,#spr8_1b1b2f84,#spr9_1b1b2f84,#spr10_1b1b2f84,#spr11_1b1b2f84,#spr12_1b1b2f84,#spr17_1b1b2f84,#spr22_1b1b2f84,#spr27_1b1b2f84,#spr28_1b1b2f84,#spr33_1b1b2f84,#spr34_1b1b2f84,#spr38_1b1b2f84,#spr39_1b1b2f84,#spr40_1b1b2f84,#spr41_1b1b2f84,#spr42_1b1b2f84,#spr43_1b1b2f84,#spr44_1b1b2f84,#spr45_1b1b2f84,#spr46_1b1b2f84,#spr47_1b1b2f84,#spr48_1b1b2f84,#spr49_1b1b2f84 {display:none;}#txt0_1b1b2f84,#txt26_1b1b2f84,#txt40_1b1b2f84,#txt58_1b1b2f84,#txt80_1b1b2f84,#txt106_1b1b2f84 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt1_1b1b2f84,#txt2_1b1b2f84,#txt3_1b1b2f84,#txt4_1b1b2f84,#txt5_1b1b2f84,#txt6_1b1b2f84,#txt7_1b1b2f84,#txt8_1b1b2f84,#txt9_1b1b2f84,#txt10_1b1b2f84,#txt11_1b1b2f84,#txt12_1b1b2f84,#txt27_1b1b2f84,#txt28_1b1b2f84,#txt29_1b1b2f84,#txt30_1b1b2f84,#txt31_1b1b2f84,#txt32_1b1b2f84,#txt41_1b1b2f84,#txt42_1b1b2f84,#txt43_1b1b2f84,#txt44_1b1b2f84,#txt45_1b1b2f84,#txt46_1b1b2f84,#txt47_1b1b2f84,#txt48_1b1b2f84,#txt59_1b1b2f84,#txt60_1b1b2f84,#txt61_1b1b2f84,#txt62_1b1b2f84,#txt63_1b1b2f84,#txt64_1b1b2f84,#txt65_1b1b2f84,#txt67_1b1b2f84,#txt68_1b1b2f84,#txt81_1b1b2f84,#txt82_1b1b2f84,#txt83_1b1b2f84,#txt84_1b1b2f84,#txt85_1b1b2f84,#txt86_1b1b2f84,#txt87_1b1b2f84,#txt88_1b1b2f84,#txt89_1b1b2f84,#txt90_1b1b2f84,#txt92_1b1b2f84,#txt107_1b1b2f84,#txt108_1b1b2f84,#txt109_1b1b2f84,#txt110_1b1b2f84,#txt111_1b1b2f84,#txt112_1b1b2f84,#txt113_1b1b2f84,#txt114_1b1b2f84,#txt116_1b1b2f84,#txt130_1b1b2f84,#txt131_1b1b2f84,#txt132_1b1b2f84,#txt133_1b1b2f84,#txt134_1b1b2f84,#txt135_1b1b2f84,#txt136_1b1b2f84,#txt137_1b1b2f84,#txt138_1b1b2f84,#txt139_1b1b2f84,#txt140_1b1b2f84,#txt141_1b1b2f84,#txt142_1b1b2f84,#txt143_1b1b2f84 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt13_1b1b2f84 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#3333ff;}#txt14_1b1b2f84,#txt15_1b1b2f84,#txt16_1b1b2f84,#txt17_1b1b2f84,#txt18_1b1b2f84,#txt19_1b1b2f84,#txt20_1b1b2f84,#txt21_1b1b2f84,#txt22_1b1b2f84,#txt23_1b1b2f84,#txt24_1b1b2f84,#txt25_1b1b2f84 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#3333ff;}#txt33_1b1b2f84 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#c00000;}#txt34_1b1b2f84,#txt35_1b1b2f84,#txt36_1b1b2f84,#txt37_1b1b2f84,#txt38_1b1b2f84,#txt39_1b1b2f84 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#c00000;}#txt49_1b1b2f84 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#008000;}#txt50_1b1b2f84,#txt51_1b1b2f84,#txt52_1b1b2f84,#txt53_1b1b2f84,#txt54_1b1b2f84,#txt55_1b1b2f84,#txt56_1b1b2f84,#txt57_1b1b2f84 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#008000;}#txt66_1b1b2f84,#txt91_1b1b2f84,#txt115_1b1b2f84 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt69_1b1b2f84 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#000000;}#txt70_1b1b2f84,#txt71_1b1b2f84,#txt72_1b1b2f84,#txt73_1b1b2f84,#txt74_1b1b2f84,#txt75_1b1b2f84,#txt76_1b1b2f84,#txt78_1b1b2f84,#txt79_1b1b2f84 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#000000;}#txt77_1b1b2f84 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:#000000;}#txt93_1b1b2f84 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#ff0066;}#txt94_1b1b2f84,#txt95_1b1b2f84,#txt96_1b1b2f84,#txt97_1b1b2f84,#txt98_1b1b2f84,#txt99_1b1b2f84,#txt100_1b1b2f84,#txt101_1b1b2f84,#txt102_1b1b2f84,#txt103_1b1b2f84,#txt105_1b1b2f84 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#ff0066;}#txt104_1b1b2f84 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:#ff0066;}#txt117_1b1b2f84 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#843c0c;}#txt118_1b1b2f84,#txt119_1b1b2f84,#txt120_1b1b2f84,#txt121_1b1b2f84,#txt122_1b1b2f84,#txt123_1b1b2f84,#txt124_1b1b2f84,#txt125_1b1b2f84,#txt127_1b1b2f84 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#843c0c;}#txt126_1b1b2f84 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:#843c0c;}#svg0_1b1b2f84 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#svg1_1b1b2f84,#svg2_1b1b2f84 {pointer-events:none;}#txt128_1b1b2f84 {font-family:fnt5; font-size:40px; line-height:46px; font-weight:bold; color:#0000ff;}#txt129_1b1b2f84 {font-family:fnt5; font-size:30px; line-height:34px; font-weight:bold; color:#0000ff;}#txt144_1b1b2f84,#txt145_1b1b2f84,#txt146_1b1b2f84,#txt147_1b1b2f84,#txt148_1b1b2f84,#txt149_1b1b2f84,#txt150_1b1b2f84,#txt151_1b1b2f84,#txt152_1b1b2f84,#txt153_1b1b2f84,#txt154_1b1b2f84,#txt155_1b1b2f84,#txt156_1b1b2f84,#txt157_1b1b2f84 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#512373;}#txt158_1b1b2f84 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt159_1b1b2f84 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt160_1b1b2f84 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt161_1b1b2f84 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide16.js b/experiment/simulation/EE6/iframes/data/slide16.js new file mode 100644 index 0000000..6b9b6de --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide16.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(15, '
    1. variable  DC  source  as  main
    supply  to  the  circuit  is  taken.
    1. variable  DC  source  as  main
    supply  to  the  circuit  is  taken.
    2. MOSFET  mounted  on  heat  sink.
    2. MOSFET  mounted  on  heat  sink.
    3. load  (variable  resister  or
    rheostat)  is  attached.
    3. load  (variable  resister  or
    rheostat)  is  attached.
    4. low  power  DC  source  for  “V gs
    setting.
    4. low  power  DC  source  for  “V gs
    setting.
    5. An  ammeter  is  attached  in  series
    with  the  MOSFET  (I D ).
    5. An  ammeter  is  attached  in  series
    with  the  MOSFET  (I D ).
    6. voltmeter  is  attached  across  the
    MOSFET  (V DS ).
    6. voltmeter  is  attached  across  the
    MOSFET  (V DS ).
    v
    A
    Observe:  This  is  series  circuit.  The  current  flowing  throughout  the  circuit  is  same.
    Observe:  This  is  series  circuit.  The  current  flowing  throughout  the  circuit  is  same.
    Circuit Diagram To Plot Output Characteristics (Method-1: Using Meters)
    Circuit Diagram To Plot Output Characteristics (Method-1: Using Meters)
    Circuit Diagram To Plot Output Characteristics (Method-1: Using Meters)
    Circuit Diagram To Plot Output Characteristics (Method-1: Using Meters)
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide17.css b/experiment/simulation/EE6/iframes/data/slide17.css new file mode 100644 index 0000000..1b61a7d --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide17.css @@ -0,0 +1 @@ +#spr1_1b1b39a6 {clip:rect(0px,960px,540px,0px);}#spr4_1b1b39a6,#spr8_1b1b39a6,#spr9_1b1b39a6,#spr10_1b1b39a6,#spr14_1b1b39a6,#spr15_1b1b39a6,#spr16_1b1b39a6,#spr17_1b1b39a6 {display:none;}#svg10_1b1b39a6,#svg21_1b1b39a6,#svg32_1b1b39a6 {-webkit-transform-origin:12px 9px; -moz-transform-origin:12px 9px; -o-transform-origin:12px 9px; -ms-transform-origin:12px 9px; transform-origin:12px 9px;}#svg33_1b1b39a6,#svg34_1b1b39a6 {pointer-events:none;}#txt0_1b1b39a6,#txt4_1b1b39a6,#txt67_1b1b39a6,#txt69_1b1b39a6,#txt81_1b1b39a6,#txt83_1b1b39a6 {font-family:fnt10; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt1_1b1b39a6,#txt5_1b1b39a6,#txt68_1b1b39a6,#txt82_1b1b39a6 {font-family:fnt10; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt2_1b1b39a6,#txt6_1b1b39a6,#txt116_1b1b39a6,#txt118_1b1b39a6,#txt130_1b1b39a6,#txt132_1b1b39a6 {font-family:fnt10; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:#000000;}#txt3_1b1b39a6,#txt7_1b1b39a6,#txt117_1b1b39a6,#txt131_1b1b39a6 {font-family:fnt10; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:#000000;}#txt8_1b1b39a6,#txt14_1b1b39a6,#txt18_1b1b39a6,#txt24_1b1b39a6,#txt30_1b1b39a6,#txt36_1b1b39a6 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt9_1b1b39a6,#txt10_1b1b39a6,#txt15_1b1b39a6,#txt19_1b1b39a6,#txt20_1b1b39a6,#txt25_1b1b39a6,#txt26_1b1b39a6,#txt31_1b1b39a6,#txt32_1b1b39a6,#txt37_1b1b39a6,#txt38_1b1b39a6,#txt42_1b1b39a6,#txt43_1b1b39a6,#txt44_1b1b39a6,#txt45_1b1b39a6,#txt46_1b1b39a6,#txt47_1b1b39a6,#txt48_1b1b39a6,#txt49_1b1b39a6,#txt50_1b1b39a6,#txt51_1b1b39a6,#txt52_1b1b39a6,#txt53_1b1b39a6,#txt54_1b1b39a6,#txt55_1b1b39a6,#txt56_1b1b39a6,#txt57_1b1b39a6,#txt58_1b1b39a6,#txt59_1b1b39a6,#txt60_1b1b39a6,#txt61_1b1b39a6,#txt62_1b1b39a6,#txt63_1b1b39a6,#txt64_1b1b39a6,#txt65_1b1b39a6,#txt66_1b1b39a6,#txt70_1b1b39a6,#txt71_1b1b39a6,#txt72_1b1b39a6,#txt73_1b1b39a6,#txt74_1b1b39a6,#txt75_1b1b39a6,#txt76_1b1b39a6,#txt77_1b1b39a6,#txt78_1b1b39a6,#txt79_1b1b39a6,#txt80_1b1b39a6,#txt84_1b1b39a6,#txt85_1b1b39a6,#txt86_1b1b39a6,#txt87_1b1b39a6,#txt88_1b1b39a6,#txt89_1b1b39a6,#txt90_1b1b39a6,#txt144_1b1b39a6,#txt148_1b1b39a6,#txt152_1b1b39a6,#txt154_1b1b39a6,#txt156_1b1b39a6 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt11_1b1b39a6,#txt16_1b1b39a6,#txt21_1b1b39a6,#txt27_1b1b39a6,#txt33_1b1b39a6,#txt39_1b1b39a6 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#254f2f;}#txt12_1b1b39a6,#txt13_1b1b39a6,#txt17_1b1b39a6,#txt22_1b1b39a6,#txt23_1b1b39a6,#txt28_1b1b39a6,#txt29_1b1b39a6,#txt34_1b1b39a6,#txt35_1b1b39a6,#txt40_1b1b39a6,#txt41_1b1b39a6 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#254f2f;}#svg35_1b1b39a6 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px;}#txt91_1b1b39a6,#txt92_1b1b39a6,#txt93_1b1b39a6,#txt94_1b1b39a6,#txt95_1b1b39a6,#txt96_1b1b39a6,#txt97_1b1b39a6,#txt98_1b1b39a6,#txt99_1b1b39a6,#txt100_1b1b39a6,#txt101_1b1b39a6,#txt102_1b1b39a6,#txt103_1b1b39a6,#txt104_1b1b39a6,#txt105_1b1b39a6,#txt106_1b1b39a6,#txt107_1b1b39a6,#txt108_1b1b39a6,#txt109_1b1b39a6,#txt110_1b1b39a6,#txt111_1b1b39a6,#txt112_1b1b39a6,#txt113_1b1b39a6,#txt114_1b1b39a6,#txt115_1b1b39a6,#txt119_1b1b39a6,#txt120_1b1b39a6,#txt121_1b1b39a6,#txt122_1b1b39a6,#txt123_1b1b39a6,#txt124_1b1b39a6,#txt125_1b1b39a6,#txt126_1b1b39a6,#txt127_1b1b39a6,#txt128_1b1b39a6,#txt129_1b1b39a6,#txt133_1b1b39a6,#txt134_1b1b39a6,#txt135_1b1b39a6,#txt136_1b1b39a6,#txt137_1b1b39a6,#txt138_1b1b39a6,#txt139_1b1b39a6 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#000000;}#txt140_1b1b39a6 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt141_1b1b39a6 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt142_1b1b39a6 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt143_1b1b39a6 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#txt145_1b1b39a6,#txt149_1b1b39a6,#txt153_1b1b39a6,#txt155_1b1b39a6 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt146_1b1b39a6,#txt150_1b1b39a6,#txt157_1b1b39a6,#txt159_1b1b39a6,#txt161_1b1b39a6 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#000066;}#txt147_1b1b39a6,#txt151_1b1b39a6,#txt158_1b1b39a6,#txt160_1b1b39a6 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:#000066;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide17.js b/experiment/simulation/EE6/iframes/data/slide17.js new file mode 100644 index 0000000..e3ae7c2 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide17.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(16, '
    V in_1
    V in_1
    V in_n
    V in_n
    1. A variable DC source as main
    supply to the circuit is taken.
    1. A variable DC source as main
    supply to the circuit is taken.
    2. A MOSFET mounted on heat sink.
    2. A MOSFET mounted on heat sink.
    3. A load (variable resister or
    rheostat) is attached.
    3. A load (variable resister or
    rheostat) is attached.
    4. A DC source for the gate of the
    MOSFET is connected.
    4. A DC source for the gate of the
    MOSFET is connected.
    5. An ammeter is attached in series
    with the MOSFET.
    5. An ammeter is attached in series
    with the MOSFET.
    6. A voltmeter is attached across the
    MOSFET.
    6. A voltmeter is attached across the
    MOSFET.
    The  graph  is  plotted  on
    graph  paper  by
    collecting  data  points
    individually.  The  supply
    voltage  is  changed  in
    steps  and  the  Drain-
    to-Source  voltage  (V DS
    )   is  recorded  using  a
    DC  voltage  while  the
    Drain  current  ( I D is
    recorded  using  DC
    ammeter
    simultaneously.
    The  graph  is  plotted  on
    graph  paper  by
    collecting  data  points
    individually.  The  supply
    voltage  is  changed  in
    steps  and  the  Drain-
    to-Source  voltage  (V DS
    )   is  recorded  using  a
    DC  voltage  while  the
    Drain  current  ( I D is
    recorded  using  DC
    ammeter
    simultaneously.
    Circuit Diagram To Plot Output Characteristics (Method-1: Using Meters)
    Circuit Diagram To Plot Output Characteristics (Method-1: Using Meters)
    Circuit Diagram To Plot Output Characteristics (Method-1: Using Meters)
    Circuit Diagram To Plot Output Characteristics (Method-1: Using Meters)
    V DS
    V DS
    I D
    I D
    V GS  -   fixed
    V GS  -   fixed
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide18.css b/experiment/simulation/EE6/iframes/data/slide18.css new file mode 100644 index 0000000..f399729 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide18.css @@ -0,0 +1 @@ +#spr1_1b1b3cf2 {clip:rect(0px,960px,540px,0px);}#spr3_1b1b3cf2,#spr4_1b1b3cf2,#spr5_1b1b3cf2,#spr6_1b1b3cf2,#spr7_1b1b3cf2,#spr8_1b1b3cf2,#spr12_1b1b3cf2,#spr16_1b1b3cf2,#spr21_1b1b3cf2,#spr27_1b1b3cf2,#spr28_1b1b3cf2,#spr33_1b1b3cf2,#spr38_1b1b3cf2,#spr39_1b1b3cf2,#spr40_1b1b3cf2,#spr41_1b1b3cf2,#spr42_1b1b3cf2,#spr43_1b1b3cf2,#spr44_1b1b3cf2,#spr45_1b1b3cf2,#spr50_1b1b3cf2,#spr56_1b1b3cf2,#spr61_1b1b3cf2,#spr66_1b1b3cf2,#spr67_1b1b3cf2,#spr68_1b1b3cf2,#spr69_1b1b3cf2,#spr70_1b1b3cf2,#spr71_1b1b3cf2,#spr73_1b1b3cf2,#spr74_1b1b3cf2,#spr75_1b1b3cf2,#spr76_1b1b3cf2,#spr77_1b1b3cf2,#spr78_1b1b3cf2,#spr79_1b1b3cf2,#spr80_1b1b3cf2,#spr81_1b1b3cf2,#spr85_1b1b3cf2,#spr86_1b1b3cf2 {display:none;}#spr10_1b1b3cf2,#spr14_1b1b3cf2 {-webkit-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); -o-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); -ms-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); -moz-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0);}#svg0_1b1b3cf2 {-webkit-transform-origin:1.215px 0.806px; -moz-transform-origin:1.215px 0.806px; -o-transform-origin:1.215px 0.806px; -ms-transform-origin:1.215px 0.806px; transform-origin:1.215px 0.806px;}#spr11_1b1b3cf2,#spr15_1b1b3cf2 {-webkit-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -o-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -ms-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -moz-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0);}#svg8_1b1b3cf2 {-webkit-transform-origin:1.212px 0.808px; -moz-transform-origin:1.212px 0.808px; -o-transform-origin:1.212px 0.808px; -ms-transform-origin:1.212px 0.808px; transform-origin:1.212px 0.808px;}#svg16_1b1b3cf2 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#svg17_1b1b3cf2,#svg18_1b1b3cf2,#svg19_1b1b3cf2,#svg20_1b1b3cf2 {pointer-events:none;}#txt0_1b1b3cf2 {font-family:fnt5; font-size:30px; line-height:34px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt1_1b1b3cf2 {font-family:fnt5; font-size:30px; line-height:34px; font-weight:bold; color:#0000ff;}#txt2_1b1b3cf2 {font-family:fnt5; font-size:20px; line-height:23px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt3_1b1b3cf2 {font-family:fnt5; font-size:20px; line-height:23px; font-weight:bold; color:#0000ff;}#spr26_1b1b3cf2,#spr55_1b1b3cf2,#spr72_1b1b3cf2 {-webkit-transform:matrix(-0,1,-1,-0,0,0); -o-transform:matrix(-0,1,-1,-0,0,0); -ms-transform:matrix(-0,1,-1,-0,0,0); -moz-transform:matrix(-0,1,-1,-0,0,0); transform:matrix(-0,1,-1,-0,0,0); display:none;}#txt4_1b1b3cf2,#txt5_1b1b3cf2,#txt6_1b1b3cf2,#txt7_1b1b3cf2,#txt8_1b1b3cf2,#txt9_1b1b3cf2,#txt10_1b1b3cf2,#txt11_1b1b3cf2,#txt20_1b1b3cf2,#txt21_1b1b3cf2,#txt22_1b1b3cf2,#txt23_1b1b3cf2,#txt24_1b1b3cf2,#txt25_1b1b3cf2,#txt26_1b1b3cf2,#txt27_1b1b3cf2,#txt28_1b1b3cf2,#txt38_1b1b3cf2,#txt39_1b1b3cf2,#txt40_1b1b3cf2,#txt41_1b1b3cf2,#txt42_1b1b3cf2,#txt43_1b1b3cf2,#txt44_1b1b3cf2,#txt45_1b1b3cf2,#txt46_1b1b3cf2,#txt47_1b1b3cf2,#txt48_1b1b3cf2,#txt49_1b1b3cf2,#txt62_1b1b3cf2,#txt63_1b1b3cf2,#txt64_1b1b3cf2,#txt65_1b1b3cf2,#txt66_1b1b3cf2,#txt67_1b1b3cf2,#txt68_1b1b3cf2,#txt69_1b1b3cf2,#txt70_1b1b3cf2,#txt71_1b1b3cf2,#txt72_1b1b3cf2,#txt73_1b1b3cf2,#txt74_1b1b3cf2,#txt88_1b1b3cf2,#txt89_1b1b3cf2,#txt90_1b1b3cf2,#txt91_1b1b3cf2,#txt92_1b1b3cf2,#txt93_1b1b3cf2,#txt94_1b1b3cf2,#txt95_1b1b3cf2,#txt96_1b1b3cf2,#txt97_1b1b3cf2,#txt98_1b1b3cf2,#txt99_1b1b3cf2,#txt100_1b1b3cf2,#txt114_1b1b3cf2,#txt115_1b1b3cf2,#txt116_1b1b3cf2,#txt117_1b1b3cf2,#txt118_1b1b3cf2,#txt119_1b1b3cf2,#txt120_1b1b3cf2,#txt121_1b1b3cf2,#txt122_1b1b3cf2,#txt123_1b1b3cf2,#txt124_1b1b3cf2,#txt125_1b1b3cf2 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt12_1b1b3cf2,#txt13_1b1b3cf2,#txt14_1b1b3cf2,#txt15_1b1b3cf2,#txt16_1b1b3cf2,#txt17_1b1b3cf2,#txt18_1b1b3cf2,#txt19_1b1b3cf2,#txt29_1b1b3cf2,#txt30_1b1b3cf2,#txt31_1b1b3cf2,#txt32_1b1b3cf2,#txt33_1b1b3cf2,#txt34_1b1b3cf2,#txt35_1b1b3cf2,#txt36_1b1b3cf2,#txt37_1b1b3cf2,#txt50_1b1b3cf2,#txt51_1b1b3cf2,#txt52_1b1b3cf2,#txt53_1b1b3cf2,#txt54_1b1b3cf2,#txt55_1b1b3cf2,#txt56_1b1b3cf2,#txt57_1b1b3cf2,#txt58_1b1b3cf2,#txt59_1b1b3cf2,#txt60_1b1b3cf2,#txt61_1b1b3cf2,#txt75_1b1b3cf2,#txt76_1b1b3cf2,#txt77_1b1b3cf2,#txt78_1b1b3cf2,#txt79_1b1b3cf2,#txt80_1b1b3cf2,#txt81_1b1b3cf2,#txt82_1b1b3cf2,#txt83_1b1b3cf2,#txt84_1b1b3cf2,#txt85_1b1b3cf2,#txt86_1b1b3cf2,#txt87_1b1b3cf2,#txt101_1b1b3cf2,#txt102_1b1b3cf2,#txt103_1b1b3cf2,#txt104_1b1b3cf2,#txt105_1b1b3cf2,#txt106_1b1b3cf2,#txt107_1b1b3cf2,#txt108_1b1b3cf2,#txt109_1b1b3cf2,#txt110_1b1b3cf2,#txt111_1b1b3cf2,#txt112_1b1b3cf2,#txt113_1b1b3cf2,#txt126_1b1b3cf2,#txt127_1b1b3cf2,#txt128_1b1b3cf2,#txt129_1b1b3cf2,#txt130_1b1b3cf2,#txt131_1b1b3cf2,#txt132_1b1b3cf2,#txt133_1b1b3cf2,#txt134_1b1b3cf2,#txt135_1b1b3cf2,#txt136_1b1b3cf2,#txt137_1b1b3cf2 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#512373;}#txt138_1b1b3cf2 {font-family:fnt5; font-size:23px; line-height:26px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt139_1b1b3cf2 {font-family:fnt5; font-size:23px; line-height:26px; font-weight:bold; color:#0000ff;}#txt140_1b1b3cf2 {font-family:fnt5; font-size:17px; line-height:20px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt141_1b1b3cf2 {font-family:fnt5; font-size:17px; line-height:20px; font-weight:bold; color:#0000ff;}#txt142_1b1b3cf2 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt143_1b1b3cf2 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt144_1b1b3cf2 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt145_1b1b3cf2 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide18.js b/experiment/simulation/EE6/iframes/data/slide18.js new file mode 100644 index 0000000..e3f1c33 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide18.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(17, '
    v
    v
    A
    A
    DC   supply  connected  to  the  drain  of  MOSFET.
    DC   supply  connected  to  the  drain  of  MOSFET.
    Source  terminal  is  connected  to   the  positive  of  Ammeter.
    Source  terminal  is  connected  to   the  positive  of  Ammeter.
    Negative  of  the  Ammeter  is  connected  to  one  end  of  the  rheostat
    Negative  of  the  Ammeter  is  connected  to  one  end  of  the  rheostat
    The  other  end  of  the  rheostat  is  connected  to  the  main  DC  source
    The  other  end  of  the  rheostat  is  connected  to  the  main  DC  source
    The  gate  supply  is  given  across  the  gate  and  source  of  the  MOSFET
    The  gate  supply  is  given  across  the  gate  and  source  of  the  MOSFET
    The  voltmeter  is  finally  connected  across  the  MOSFET  drain  and  source  terminals
    The  voltmeter  is  finally  connected  across  the  MOSFET  drain  and  source  terminals
    v
    v
    A
    A
    Test Circuit Connection Diagram (Method-1: Using Meters)
    Test Circuit Connection Diagram (Method-1: Using Meters)
    Test Circuit Connection Diagram (Method-1: Using Meters)
    Test Circuit Connection Diagram (Method-1: Using Meters)
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide19.css b/experiment/simulation/EE6/iframes/data/slide19.css new file mode 100644 index 0000000..deef9ff --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide19.css @@ -0,0 +1 @@ +#spr1_1b1b4ba7 {clip:rect(0px,960px,540px,0px);}#spr3_1b1b4ba7,#spr8_1b1b4ba7,#spr9_1b1b4ba7,#spr10_1b1b4ba7,#spr11_1b1b4ba7,#spr12_1b1b4ba7,#spr13_1b1b4ba7,#spr18_1b1b4ba7,#spr19_1b1b4ba7,#spr20_1b1b4ba7,#spr21_1b1b4ba7,#spr22_1b1b4ba7,#spr23_1b1b4ba7,#spr24_1b1b4ba7,#spr25_1b1b4ba7,#spr26_1b1b4ba7,#spr27_1b1b4ba7,#spr28_1b1b4ba7,#spr29_1b1b4ba7,#spr30_1b1b4ba7,#spr31_1b1b4ba7,#spr36_1b1b4ba7,#spr37_1b1b4ba7,#spr38_1b1b4ba7,#spr42_1b1b4ba7,#spr46_1b1b4ba7,#spr47_1b1b4ba7,#spr48_1b1b4ba7 {display:none;}#txt0_1b1b4ba7,#txt1_1b1b4ba7,#txt2_1b1b4ba7,#txt3_1b1b4ba7,#txt4_1b1b4ba7,#txt5_1b1b4ba7,#txt6_1b1b4ba7,#txt7_1b1b4ba7,#txt8_1b1b4ba7,#txt9_1b1b4ba7,#txt10_1b1b4ba7,#txt11_1b1b4ba7,#txt12_1b1b4ba7,#txt13_1b1b4ba7,#txt14_1b1b4ba7,#txt15_1b1b4ba7,#txt16_1b1b4ba7,#txt17_1b1b4ba7,#txt39_1b1b4ba7,#txt40_1b1b4ba7,#txt41_1b1b4ba7,#txt42_1b1b4ba7,#txt43_1b1b4ba7,#txt44_1b1b4ba7,#txt46_1b1b4ba7,#txt57_1b1b4ba7,#txt58_1b1b4ba7,#txt59_1b1b4ba7,#txt60_1b1b4ba7,#txt61_1b1b4ba7,#txt62_1b1b4ba7,#txt71_1b1b4ba7,#txt72_1b1b4ba7,#txt73_1b1b4ba7,#txt74_1b1b4ba7,#txt75_1b1b4ba7,#txt76_1b1b4ba7,#txt77_1b1b4ba7,#txt78_1b1b4ba7,#txt89_1b1b4ba7,#txt90_1b1b4ba7,#txt91_1b1b4ba7,#txt92_1b1b4ba7,#txt93_1b1b4ba7,#txt94_1b1b4ba7,#txt95_1b1b4ba7,#txt97_1b1b4ba7,#txt98_1b1b4ba7,#txt111_1b1b4ba7,#txt112_1b1b4ba7,#txt113_1b1b4ba7,#txt114_1b1b4ba7,#txt115_1b1b4ba7,#txt116_1b1b4ba7,#txt117_1b1b4ba7,#txt118_1b1b4ba7,#txt119_1b1b4ba7,#txt120_1b1b4ba7,#txt121_1b1b4ba7,#txt123_1b1b4ba7,#txt139_1b1b4ba7,#txt140_1b1b4ba7,#txt141_1b1b4ba7,#txt142_1b1b4ba7,#txt143_1b1b4ba7,#txt144_1b1b4ba7,#txt145_1b1b4ba7,#txt146_1b1b4ba7,#txt147_1b1b4ba7,#txt148_1b1b4ba7,#txt149_1b1b4ba7,#txt151_1b1b4ba7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt18_1b1b4ba7,#txt19_1b1b4ba7,#txt20_1b1b4ba7,#txt21_1b1b4ba7,#txt22_1b1b4ba7,#txt23_1b1b4ba7,#txt24_1b1b4ba7,#txt25_1b1b4ba7,#txt26_1b1b4ba7,#txt27_1b1b4ba7,#txt28_1b1b4ba7,#txt29_1b1b4ba7,#txt30_1b1b4ba7,#txt31_1b1b4ba7,#txt32_1b1b4ba7,#txt33_1b1b4ba7,#txt34_1b1b4ba7,#txt35_1b1b4ba7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#512373;}#svg0_1b1b4ba7 {pointer-events:none;}#txt36_1b1b4ba7,#txt37_1b1b4ba7 {font-family:fnt5; font-size:18px; line-height:21px; font-weight:bold; color:#0000ff;}#txt38_1b1b4ba7,#txt56_1b1b4ba7,#txt70_1b1b4ba7,#txt88_1b1b4ba7,#txt110_1b1b4ba7,#txt138_1b1b4ba7 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt45_1b1b4ba7,#txt96_1b1b4ba7,#txt122_1b1b4ba7,#txt150_1b1b4ba7 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt47_1b1b4ba7 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#843c0c;}#txt48_1b1b4ba7,#txt49_1b1b4ba7,#txt50_1b1b4ba7,#txt51_1b1b4ba7,#txt52_1b1b4ba7,#txt53_1b1b4ba7,#txt55_1b1b4ba7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#843c0c;}#txt54_1b1b4ba7 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:#843c0c;}#txt63_1b1b4ba7 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#3333ff;}#txt64_1b1b4ba7,#txt65_1b1b4ba7,#txt66_1b1b4ba7,#txt67_1b1b4ba7,#txt68_1b1b4ba7,#txt69_1b1b4ba7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#3333ff;}#txt79_1b1b4ba7 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#6a064d;}#txt80_1b1b4ba7,#txt81_1b1b4ba7,#txt82_1b1b4ba7,#txt83_1b1b4ba7,#txt84_1b1b4ba7,#txt85_1b1b4ba7,#txt86_1b1b4ba7,#txt87_1b1b4ba7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#6a064d;}#txt99_1b1b4ba7 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#000000;}#txt100_1b1b4ba7,#txt101_1b1b4ba7,#txt102_1b1b4ba7,#txt103_1b1b4ba7,#txt104_1b1b4ba7,#txt105_1b1b4ba7,#txt106_1b1b4ba7,#txt108_1b1b4ba7,#txt109_1b1b4ba7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#000000;}#txt107_1b1b4ba7 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:#000000;}#txt124_1b1b4ba7 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#c00000;}#txt125_1b1b4ba7,#txt126_1b1b4ba7,#txt127_1b1b4ba7,#txt128_1b1b4ba7,#txt129_1b1b4ba7,#txt130_1b1b4ba7,#txt131_1b1b4ba7,#txt132_1b1b4ba7,#txt133_1b1b4ba7,#txt134_1b1b4ba7,#txt135_1b1b4ba7,#txt137_1b1b4ba7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#c00000;}#txt136_1b1b4ba7 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:#c00000;}#txt152_1b1b4ba7 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#008000;}#txt153_1b1b4ba7,#txt154_1b1b4ba7,#txt155_1b1b4ba7,#txt156_1b1b4ba7,#txt157_1b1b4ba7,#txt158_1b1b4ba7,#txt159_1b1b4ba7,#txt160_1b1b4ba7,#txt161_1b1b4ba7,#txt162_1b1b4ba7,#txt163_1b1b4ba7,#txt165_1b1b4ba7 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#008000;}#txt164_1b1b4ba7 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:#008000;}#svg1_1b1b4ba7 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#txt166_1b1b4ba7,#txt167_1b1b4ba7 {font-family:fnt5; font-size:18px; line-height:21px; font-weight:bold; color:#203864;}#txt168_1b1b4ba7 {font-family:fnt4; font-size:23.5px; line-height:27px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt169_1b1b4ba7 {font-family:fnt4; font-size:23.5px; line-height:27px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt170_1b1b4ba7 {font-family:fnt4; font-size:23.5px; line-height:27px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt171_1b1b4ba7 {font-family:fnt4; font-size:23.5px; line-height:27px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide19.js b/experiment/simulation/EE6/iframes/data/slide19.js new file mode 100644 index 0000000..1a62f48 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide19.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(18, '
    Both  the  voltage  and  current  probes  are  then  attached  to  two  channels  of  DSO  and  the
    characteristics  drawn.
    Both  the  voltage  and  current  probes  are  then  attached  to  two  channels  of  DSO  and  the
    characteristics  drawn.
    Volt
    Probe
    1. DC  source  for  setting  the  “V in ”.
    1. DC  source  for  setting  the  “V in ”.
    2. MOSFET  mounted  on  heat  sink.
    2. MOSFET  mounted  on  heat  sink.
    3. load  (variable  resister  or
    rheostat)  is  attached.
    3. load  (variable  resister  or
    rheostat)  is  attached.
    4. low  power  DC  source  for  “V gs
    setting.
    4. low  power  DC  source  for  “V gs
    setting.
    5. Differential  probe  to  measure
    voltage  is  attached  across  the
    MOSFET  (V DS ).
    5. Differential  probe  to  measure
    voltage  is  attached  across  the
    MOSFET  (V DS ).
    6. Current  probe  is  inserted  to
    measure  the  current  through
    MOSFET  (I D ).
    6. Current  probe  is  inserted  to
    measure  the  current  through
    MOSFET  (I D ).
    Current
    Probe
    Circuit Diagram To Plot Output Characteristics (Method-2: Using Oscilloscope)
    Circuit Diagram To Plot Output Characteristics (Method-2: Using Oscilloscope)
    Circuit Diagram To Plot Output Characteristics (Method-2: Using Oscilloscope)
    Circuit Diagram To Plot Output Characteristics (Method-2: Using Oscilloscope)
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide2.css b/experiment/simulation/EE6/iframes/data/slide2.css new file mode 100644 index 0000000..cede413 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide2.css @@ -0,0 +1 @@ +#spr1_1b1b0586 {clip:rect(0px,960px,540px,0px);} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide2.js b/experiment/simulation/EE6/iframes/data/slide2.js new file mode 100644 index 0000000..08c1853 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide2.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(1, '
    Fundamentals
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide20.css b/experiment/simulation/EE6/iframes/data/slide20.css new file mode 100644 index 0000000..62cae9a --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide20.css @@ -0,0 +1 @@ +#spr1_1b1b5443 {clip:rect(0px,960px,540px,0px);}#txt0_1b1b5443,#txt1_1b1b5443,#txt2_1b1b5443,#txt3_1b1b5443,#txt4_1b1b5443,#txt5_1b1b5443,#txt6_1b1b5443,#txt7_1b1b5443,#txt8_1b1b5443,#txt9_1b1b5443,#txt10_1b1b5443,#txt11_1b1b5443,#txt12_1b1b5443,#txt13_1b1b5443,#txt14_1b1b5443,#txt15_1b1b5443,#txt16_1b1b5443,#txt17_1b1b5443,#txt37_1b1b5443,#txt38_1b1b5443,#txt39_1b1b5443,#txt40_1b1b5443,#txt41_1b1b5443,#txt42_1b1b5443,#txt43_1b1b5443,#txt44_1b1b5443,#txt45_1b1b5443,#txt46_1b1b5443,#txt47_1b1b5443,#txt48_1b1b5443,#txt63_1b1b5443,#txt64_1b1b5443,#txt65_1b1b5443,#txt66_1b1b5443,#txt67_1b1b5443,#txt68_1b1b5443,#txt77_1b1b5443,#txt78_1b1b5443,#txt79_1b1b5443,#txt80_1b1b5443,#txt81_1b1b5443,#txt82_1b1b5443,#txt83_1b1b5443,#txt84_1b1b5443,#txt95_1b1b5443,#txt96_1b1b5443,#txt97_1b1b5443,#txt98_1b1b5443,#txt99_1b1b5443,#txt100_1b1b5443,#txt101_1b1b5443,#txt102_1b1b5443,#txt103_1b1b5443,#txt104_1b1b5443,#txt105_1b1b5443,#txt119_1b1b5443,#txt120_1b1b5443,#txt121_1b1b5443,#txt122_1b1b5443,#txt123_1b1b5443,#txt124_1b1b5443,#txt125_1b1b5443,#txt126_1b1b5443,#txt127_1b1b5443,#txt128_1b1b5443,#txt141_1b1b5443,#txt142_1b1b5443,#txt143_1b1b5443,#txt144_1b1b5443,#txt145_1b1b5443,#txt146_1b1b5443,#txt147_1b1b5443,#txt148_1b1b5443 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt18_1b1b5443,#txt19_1b1b5443,#txt20_1b1b5443,#txt21_1b1b5443,#txt22_1b1b5443,#txt23_1b1b5443,#txt24_1b1b5443,#txt25_1b1b5443,#txt26_1b1b5443,#txt27_1b1b5443,#txt28_1b1b5443,#txt29_1b1b5443,#txt30_1b1b5443,#txt31_1b1b5443,#txt32_1b1b5443,#txt33_1b1b5443,#txt34_1b1b5443,#txt35_1b1b5443 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#512373;}#txt36_1b1b5443,#txt62_1b1b5443,#txt76_1b1b5443,#txt94_1b1b5443,#txt118_1b1b5443,#txt140_1b1b5443 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt49_1b1b5443,#txt69_1b1b5443,#txt85_1b1b5443,#txt106_1b1b5443,#txt129_1b1b5443,#txt149_1b1b5443 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#254f2f;}#txt50_1b1b5443,#txt51_1b1b5443,#txt52_1b1b5443,#txt53_1b1b5443,#txt54_1b1b5443,#txt55_1b1b5443,#txt56_1b1b5443,#txt57_1b1b5443,#txt58_1b1b5443,#txt59_1b1b5443,#txt60_1b1b5443,#txt61_1b1b5443,#txt70_1b1b5443,#txt71_1b1b5443,#txt72_1b1b5443,#txt73_1b1b5443,#txt74_1b1b5443,#txt75_1b1b5443,#txt86_1b1b5443,#txt87_1b1b5443,#txt88_1b1b5443,#txt89_1b1b5443,#txt90_1b1b5443,#txt91_1b1b5443,#txt92_1b1b5443,#txt93_1b1b5443,#txt107_1b1b5443,#txt108_1b1b5443,#txt109_1b1b5443,#txt110_1b1b5443,#txt111_1b1b5443,#txt112_1b1b5443,#txt113_1b1b5443,#txt114_1b1b5443,#txt115_1b1b5443,#txt116_1b1b5443,#txt117_1b1b5443,#txt130_1b1b5443,#txt131_1b1b5443,#txt132_1b1b5443,#txt133_1b1b5443,#txt134_1b1b5443,#txt135_1b1b5443,#txt136_1b1b5443,#txt137_1b1b5443,#txt138_1b1b5443,#txt139_1b1b5443,#txt150_1b1b5443,#txt151_1b1b5443,#txt152_1b1b5443,#txt153_1b1b5443,#txt154_1b1b5443,#txt155_1b1b5443,#txt156_1b1b5443,#txt157_1b1b5443 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#254f2f;}#svg0_1b1b5443 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px;}#txt158_1b1b5443 {font-family:fnt4; font-size:23.5px; line-height:27px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt159_1b1b5443 {font-family:fnt4; font-size:23.5px; line-height:27px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt160_1b1b5443 {font-family:fnt4; font-size:23.5px; line-height:27px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt161_1b1b5443 {font-family:fnt4; font-size:23.5px; line-height:27px; font-weight:bold; color:#ffffff;}#spr8_1b1b5443,#spr10_1b1b5443,#spr11_1b1b5443,#spr12_1b1b5443,#spr15_1b1b5443,#spr16_1b1b5443,#spr17_1b1b5443,#spr18_1b1b5443 {display:none;}#txt162_1b1b5443,#txt186_1b1b5443,#txt248_1b1b5443 {font-family:PFn; font-size:18px; line-height:21px; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt163_1b1b5443,#txt164_1b1b5443,#txt165_1b1b5443,#txt166_1b1b5443,#txt167_1b1b5443,#txt168_1b1b5443,#txt169_1b1b5443,#txt170_1b1b5443,#txt171_1b1b5443,#txt172_1b1b5443,#txt184_1b1b5443,#txt187_1b1b5443,#txt188_1b1b5443,#txt189_1b1b5443,#txt190_1b1b5443,#txt191_1b1b5443,#txt192_1b1b5443,#txt193_1b1b5443,#txt194_1b1b5443,#txt195_1b1b5443,#txt196_1b1b5443,#txt197_1b1b5443,#txt198_1b1b5443,#txt199_1b1b5443,#txt202_1b1b5443,#txt203_1b1b5443,#txt204_1b1b5443,#txt205_1b1b5443,#txt206_1b1b5443,#txt207_1b1b5443,#txt208_1b1b5443,#txt209_1b1b5443,#txt212_1b1b5443,#txt213_1b1b5443,#txt214_1b1b5443,#txt215_1b1b5443,#txt216_1b1b5443,#txt249_1b1b5443,#txt250_1b1b5443,#txt252_1b1b5443,#txt253_1b1b5443,#txt254_1b1b5443,#txt255_1b1b5443,#txt256_1b1b5443,#txt257_1b1b5443,#txt258_1b1b5443,#txt259_1b1b5443,#txt260_1b1b5443,#txt261_1b1b5443,#txt262_1b1b5443,#txt263_1b1b5443,#txt264_1b1b5443,#txt265_1b1b5443,#txt266_1b1b5443,#txt267_1b1b5443,#txt268_1b1b5443 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt173_1b1b5443 {font-family:PFn; font-size:18px; line-height:21px; color:#0000ff;}#txt174_1b1b5443,#txt175_1b1b5443,#txt176_1b1b5443,#txt177_1b1b5443,#txt178_1b1b5443,#txt179_1b1b5443,#txt180_1b1b5443,#txt181_1b1b5443,#txt182_1b1b5443,#txt183_1b1b5443 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:#0000ff;}#txt185_1b1b5443 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:#000000;}#txt200_1b1b5443,#txt210_1b1b5443 {font-family:fnt10; font-size:18px; line-height:24px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt201_1b1b5443,#txt211_1b1b5443 {font-family:fnt10; font-size:12px; line-height:16px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt217_1b1b5443 {font-family:PFn; font-size:18px; line-height:21px; color:#9a0000;}#txt218_1b1b5443,#txt219_1b1b5443,#txt220_1b1b5443,#txt221_1b1b5443,#txt222_1b1b5443,#txt223_1b1b5443,#txt224_1b1b5443,#txt225_1b1b5443,#txt226_1b1b5443,#txt227_1b1b5443,#txt228_1b1b5443,#txt229_1b1b5443,#txt230_1b1b5443,#txt233_1b1b5443,#txt234_1b1b5443,#txt235_1b1b5443,#txt236_1b1b5443,#txt237_1b1b5443,#txt238_1b1b5443,#txt239_1b1b5443,#txt240_1b1b5443,#txt243_1b1b5443,#txt244_1b1b5443,#txt245_1b1b5443,#txt246_1b1b5443,#txt247_1b1b5443 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:#9a0000;}#txt231_1b1b5443,#txt241_1b1b5443 {font-family:fnt10; font-size:18px; line-height:24px; font-weight:bold; font-style:italic; color:#9a0000;}#txt232_1b1b5443,#txt242_1b1b5443 {font-family:fnt10; font-size:12px; line-height:16px; font-weight:bold; font-style:italic; color:#9a0000;}#txt251_1b1b5443 {font-family:fnt9; font-size:12px; line-height:16px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt269_1b1b5443 {font-family:PFn; font-size:18px; line-height:21px; color:#9900cc;}#txt270_1b1b5443,#txt271_1b1b5443,#txt273_1b1b5443,#txt274_1b1b5443,#txt275_1b1b5443,#txt276_1b1b5443,#txt277_1b1b5443,#txt278_1b1b5443,#txt279_1b1b5443,#txt280_1b1b5443,#txt281_1b1b5443,#txt282_1b1b5443,#txt283_1b1b5443,#txt284_1b1b5443,#txt285_1b1b5443,#txt286_1b1b5443,#txt287_1b1b5443,#txt288_1b1b5443,#txt289_1b1b5443 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:#9900cc;}#txt272_1b1b5443 {font-family:fnt9; font-size:12px; line-height:16px; font-weight:bold; color:#9900cc;}#svg11_1b1b5443,#svg22_1b1b5443,#svg33_1b1b5443 {-webkit-transform-origin:12px 9px; -moz-transform-origin:12px 9px; -o-transform-origin:12px 9px; -ms-transform-origin:12px 9px; transform-origin:12px 9px;}#svg34_1b1b5443 {-webkit-transform-origin:3.824px 3.935px; -moz-transform-origin:3.824px 3.935px; -o-transform-origin:3.824px 3.935px; -ms-transform-origin:3.824px 3.935px; transform-origin:3.824px 3.935px;}#svg40_1b1b5443,#svg41_1b1b5443 {pointer-events:none;}#txt290_1b1b5443,#txt294_1b1b5443 {font-family:fnt12; font-size:18px; line-height:21px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt291_1b1b5443,#txt295_1b1b5443 {font-family:fnt12; font-size:12px; line-height:14px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt292_1b1b5443,#txt296_1b1b5443 {font-family:fnt12; font-size:18px; line-height:21px; font-weight:bold; font-style:italic; color:#000000;}#txt293_1b1b5443,#txt297_1b1b5443 {font-family:fnt12; font-size:12px; line-height:14px; font-weight:bold; font-style:italic; color:#000000;}#txt298_1b1b5443,#txt302_1b1b5443 {font-family:fnt5; font-size:25px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt299_1b1b5443,#txt303_1b1b5443 {font-family:fnt5; font-size:16.667px; line-height:19px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt300_1b1b5443,#txt304_1b1b5443 {font-family:fnt5; font-size:25px; line-height:29px; font-weight:bold; color:#000066;}#txt301_1b1b5443,#txt305_1b1b5443 {font-family:fnt5; font-size:16.667px; line-height:19px; font-weight:bold; color:#000066;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide20.js b/experiment/simulation/EE6/iframes/data/slide20.js new file mode 100644 index 0000000..3256fb6 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide20.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(19, '
    Both  the  voltage  and  current  probes  are  then  attached  to  two  channels  of  DSO  and  the
    characteristics  drawn.
    Both  the  voltage  and  current  probes  are  then  attached  to  two  channels  of  DSO  and  the
    characteristics  drawn.
    1. variable  DC  source  as  main
    supply  to  the  circuit  is  taken.
    1. variable  DC  source  as  main
    supply  to  the  circuit  is  taken.
    2. MOSFET  mounted  on  heat  sink.
    2. MOSFET  mounted  on  heat  sink.
    3. load  (variable  resister  or
    rheostat)  is  attached.
    3. load  (variable  resister  or
    rheostat)  is  attached.
    4. DC  source  for  the  gate  of  the
    MOSFET  is  connected.
    4. DC  source  for  the  gate  of  the
    MOSFET  is  connected.
    5. Differential  probe  to  measure
    voltage  is  attached  across  the
    MOSFET.
    5. Differential  probe  to  measure
    voltage  is  attached  across  the
    MOSFET.
    6. Current  probe  is  attached  to
    measure  the  current.
    6. Current  probe  is  attached  to
    measure  the  current.
    Circuit Diagram To Plot Output Characteristics (Method-2: Using Oscilloscope)
    Circuit Diagram To Plot Output Characteristics (Method-2: Using Oscilloscope)
    Circuit Diagram To Plot Output Characteristics (Method-2: Using Oscilloscope)
    Circuit Diagram To Plot Output Characteristics (Method-2: Using Oscilloscope)
    The  graph  is  plotted
    directly  on  digital
    oscilloscope  (DSO).
    The  graph  is  plotted
    directly  on  digital
    oscilloscope  (DSO).
     
     
    The  DSO  should  be   set
    to  “X-Y  mode”.  Connect
    the  voltage  probe  ( V DS )
    to  Ch-1  (X-axis)  and
    current  probe  ( I D to  Ch-
    (Y-axis).
    The  DSO  should  be   set
    to  “X-Y  mode”.  Connect
    the  voltage  probe  ( V DS )
    to  Ch-1  (X-axis)  and
    current  probe  ( I D to  Ch-
    (Y-axis).
    Set  “V gs ”  and  change  the
    input  DC  supply  voltage
    gradually.  “v-i”
    characteristics  gets
    displayed  on  the  DSO
    screen.
    Set  “V gs ”  and  change  the
    input  DC  supply  voltage
    gradually.  “v-i”
    characteristics  gets
    displayed  on  the  DSO
    screen.
    V in_1
    V in_1
    V in_n
    V in_n
    V DS
    V DS
    I D
    I D
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide21.css b/experiment/simulation/EE6/iframes/data/slide21.css new file mode 100644 index 0000000..6481462 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide21.css @@ -0,0 +1 @@ +#spr1_1b1b57fc {clip:rect(0px,960px,540px,0px);}#spr3_1b1b57fc,#spr4_1b1b57fc,#spr5_1b1b57fc,#spr6_1b1b57fc,#spr10_1b1b57fc,#spr14_1b1b57fc,#spr15_1b1b57fc,#spr20_1b1b57fc,#spr25_1b1b57fc,#spr30_1b1b57fc,#spr33_1b1b57fc,#spr34_1b1b57fc,#spr35_1b1b57fc,#spr36_1b1b57fc,#spr37_1b1b57fc,#spr38_1b1b57fc,#spr39_1b1b57fc,#spr40_1b1b57fc,#spr41_1b1b57fc,#spr42_1b1b57fc,#spr43_1b1b57fc,#spr45_1b1b57fc,#spr46_1b1b57fc,#spr47_1b1b57fc,#spr48_1b1b57fc,#spr49_1b1b57fc,#spr50_1b1b57fc,#spr52_1b1b57fc,#spr53_1b1b57fc,#spr54_1b1b57fc,#spr55_1b1b57fc,#spr57_1b1b57fc,#spr58_1b1b57fc,#spr59_1b1b57fc,#spr60_1b1b57fc,#spr61_1b1b57fc {display:none;}#spr8_1b1b57fc,#spr12_1b1b57fc {-webkit-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); -o-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); -ms-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); -moz-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0);}#svg0_1b1b57fc {-webkit-transform-origin:1.215px 0.806px; -moz-transform-origin:1.215px 0.806px; -o-transform-origin:1.215px 0.806px; -ms-transform-origin:1.215px 0.806px; transform-origin:1.215px 0.806px;}#spr9_1b1b57fc,#spr13_1b1b57fc {-webkit-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -o-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -ms-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -moz-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0);}#svg8_1b1b57fc {-webkit-transform-origin:1.212px 0.808px; -moz-transform-origin:1.212px 0.808px; -o-transform-origin:1.212px 0.808px; -ms-transform-origin:1.212px 0.808px; transform-origin:1.212px 0.808px;}#svg16_1b1b57fc {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#svg17_1b1b57fc {pointer-events:none;}#txt0_1b1b57fc,#txt1_1b1b57fc {font-family:fnt5; font-size:15px; line-height:17px; font-weight:bold; color:#0000ff;}#svg18_1b1b57fc {-webkit-transform-origin:9px 9px; -moz-transform-origin:9px 9px; -o-transform-origin:9px 9px; -ms-transform-origin:9px 9px; transform-origin:9px 9px;}#txt2_1b1b57fc,#txt3_1b1b57fc,#txt4_1b1b57fc {font-family:fnt5; font-size:16px; line-height:18px; font-weight:bold; color:#203864;}#svg19_1b1b57fc {-webkit-transform-origin:9px 9px; -moz-transform-origin:9px 9px; -o-transform-origin:9px 9px; -ms-transform-origin:9px 9px; transform-origin:9px 9px; display:none;}#spr44_1b1b57fc {-webkit-transform:matrix(-0,1,-1,-0,0,0); -o-transform:matrix(-0,1,-1,-0,0,0); -ms-transform:matrix(-0,1,-1,-0,0,0); -moz-transform:matrix(-0,1,-1,-0,0,0); transform:matrix(-0,1,-1,-0,0,0); display:none;}#spr51_1b1b57fc {-webkit-transform:matrix(0.901641,-0.432485,0.432485,0.901641,0,0); -o-transform:matrix(0.901641,-0.432485,0.432485,0.901641,0,0); -ms-transform:matrix(0.901641,-0.432485,0.432485,0.901641,0,0); -moz-transform:matrix(0.901641,-0.432485,0.432485,0.901641,0,0); transform:matrix(0.901641,-0.432485,0.432485,0.901641,0,0); display:none;}#spr56_1b1b57fc {-webkit-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); -o-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); -ms-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); -moz-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); display:none;}#txt5_1b1b57fc {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt6_1b1b57fc {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt7_1b1b57fc {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt8_1b1b57fc {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide21.js b/experiment/simulation/EE6/iframes/data/slide21.js new file mode 100644 index 0000000..9c44754 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide21.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(20, '
    Volt
    Probe
    Amp
    Probe
    DSO
    Test Circuit Connection Diagram (Using Oscilloscope)
    Test Circuit Connection Diagram (Using Oscilloscope)
    Test Circuit Connection Diagram (Using Oscilloscope)
    Test Circuit Connection Diagram (Using Oscilloscope)
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide22.css b/experiment/simulation/EE6/iframes/data/slide22.css new file mode 100644 index 0000000..d184b09 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide22.css @@ -0,0 +1 @@ +#spr1_1b1b6049 {clip:rect(0px,960px,540px,0px);}#txt0_1b1b6049,#txt1_1b1b6049,#txt2_1b1b6049,#txt3_1b1b6049,#txt4_1b1b6049 {font-family:fnt11; font-size:32px; line-height:45px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide22.js b/experiment/simulation/EE6/iframes/data/slide22.js new file mode 100644 index 0000000..8d3293c --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide22.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(21, '
    Formulation of
    Circuit set-up
    and procedure for
    Transfer  Characteristics
    generation
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide23.css b/experiment/simulation/EE6/iframes/data/slide23.css new file mode 100644 index 0000000..8322eaf --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide23.css @@ -0,0 +1 @@ +#spr1_1b1b6162 {clip:rect(0px,960px,540px,0px);}#spr3_1b1b6162,#spr4_1b1b6162,#spr5_1b1b6162,#spr6_1b1b6162,#spr7_1b1b6162,#spr8_1b1b6162,#spr9_1b1b6162,#spr10_1b1b6162,#spr11_1b1b6162,#spr12_1b1b6162,#spr17_1b1b6162,#spr22_1b1b6162,#spr23_1b1b6162,#spr24_1b1b6162,#spr28_1b1b6162,#spr29_1b1b6162,#spr30_1b1b6162,#spr31_1b1b6162,#spr32_1b1b6162,#spr33_1b1b6162,#spr34_1b1b6162,#spr35_1b1b6162,#spr36_1b1b6162,#spr37_1b1b6162,#spr42_1b1b6162,#spr48_1b1b6162,#spr49_1b1b6162 {display:none;}#txt0_1b1b6162,#txt6_1b1b6162,#txt10_1b1b6162,#txt16_1b1b6162,#txt26_1b1b6162,#txt32_1b1b6162,#txt40_1b1b6162,#txt41_1b1b6162,#txt42_1b1b6162,#txt43_1b1b6162,#txt44_1b1b6162,#txt45_1b1b6162,#txt46_1b1b6162,#txt47_1b1b6162,#txt48_1b1b6162,#txt49_1b1b6162,#txt50_1b1b6162,#txt51_1b1b6162,#txt52_1b1b6162,#txt53_1b1b6162 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt1_1b1b6162,#txt2_1b1b6162,#txt7_1b1b6162,#txt11_1b1b6162,#txt12_1b1b6162,#txt17_1b1b6162,#txt19_1b1b6162,#txt20_1b1b6162,#txt27_1b1b6162,#txt28_1b1b6162,#txt33_1b1b6162,#txt34_1b1b6162 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt3_1b1b6162 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#254f2f;}#txt4_1b1b6162,#txt5_1b1b6162 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#254f2f;}#txt8_1b1b6162 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#c00000;}#txt9_1b1b6162 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#c00000;}#txt13_1b1b6162 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#0070c0;}#txt14_1b1b6162,#txt15_1b1b6162 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#0070c0;}#txt18_1b1b6162 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt21_1b1b6162 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#7030a0;}#txt22_1b1b6162,#txt24_1b1b6162,#txt25_1b1b6162 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#7030a0;}#txt23_1b1b6162 {font-family:fnt9; font-size:14.667px; line-height:20px; font-weight:bold; color:#7030a0;}#txt29_1b1b6162 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#0d0d0d;}#txt30_1b1b6162,#txt31_1b1b6162 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#0d0d0d;}#txt35_1b1b6162 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#ff0066;}#txt36_1b1b6162,#txt37_1b1b6162 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#ff0066;}#svg0_1b1b6162 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#svg1_1b1b6162,#svg2_1b1b6162 {pointer-events:none;}#txt38_1b1b6162 {font-family:fnt5; font-size:40px; line-height:46px; font-weight:bold; color:#0000ff;}#txt39_1b1b6162 {font-family:fnt5; font-size:30px; line-height:34px; font-weight:bold; color:#0000ff;}#txt54_1b1b6162,#txt55_1b1b6162,#txt56_1b1b6162,#txt57_1b1b6162,#txt58_1b1b6162,#txt59_1b1b6162,#txt60_1b1b6162,#txt61_1b1b6162,#txt62_1b1b6162,#txt63_1b1b6162,#txt64_1b1b6162,#txt65_1b1b6162,#txt66_1b1b6162,#txt67_1b1b6162 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#0000e2;}#txt68_1b1b6162 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt69_1b1b6162 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt70_1b1b6162 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt71_1b1b6162 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide23.js b/experiment/simulation/EE6/iframes/data/slide23.js new file mode 100644 index 0000000..5a54a90 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide23.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(22, '
    1. A DC source as main supply to
    the circuit is taken.
    1. A DC source as main supply to
    the circuit is taken.
    2. A MOSFET mounted on heat sink.
    2. A MOSFET mounted on heat sink.
    3. A load (variable resister or
    rheostat) is attached.
    3. A load (variable resister or
    rheostat) is attached.
    4. A low power DC source for “V gs
    setting.
    4. A low power DC source for “V gs
    setting.
    5. An ammeter is attached in series
    with the MOSFET.
    5. An ammeter is attached in series
    with the MOSFET.
    6. A voltmeter is attached across
    the MOSFET.
    6. A voltmeter is attached across
    the MOSFET.
    v
    A
    Observe:  This  is  series  circuit.  The  current  flowing  throughout  the  circuit  is  same.
    Observe:  This  is  series  circuit.  The  current  flowing  throughout  the  circuit  is  same.
    Circuit Diagram To Plot Transfer Characteristics
    Circuit Diagram To Plot Transfer Characteristics
    Circuit Diagram To Plot Transfer Characteristics
    Circuit Diagram To Plot Transfer Characteristics
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide24.css b/experiment/simulation/EE6/iframes/data/slide24.css new file mode 100644 index 0000000..5325187 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide24.css @@ -0,0 +1 @@ +#spr1_1b1b68d4 {clip:rect(0px,960px,540px,0px);}#txt0_1b1b68d4,#txt6_1b1b68d4,#txt10_1b1b68d4,#txt16_1b1b68d4,#txt22_1b1b68d4,#txt28_1b1b68d4 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt1_1b1b68d4,#txt2_1b1b68d4,#txt7_1b1b68d4,#txt11_1b1b68d4,#txt12_1b1b68d4,#txt17_1b1b68d4,#txt18_1b1b68d4,#txt23_1b1b68d4,#txt24_1b1b68d4,#txt29_1b1b68d4,#txt30_1b1b68d4,#txt34_1b1b68d4,#txt35_1b1b68d4,#txt36_1b1b68d4,#txt37_1b1b68d4,#txt38_1b1b68d4,#txt39_1b1b68d4,#txt40_1b1b68d4,#txt41_1b1b68d4,#txt42_1b1b68d4,#txt43_1b1b68d4,#txt44_1b1b68d4,#txt45_1b1b68d4,#txt46_1b1b68d4,#txt47_1b1b68d4,#txt70_1b1b68d4,#txt71_1b1b68d4,#txt72_1b1b68d4,#txt73_1b1b68d4,#txt74_1b1b68d4,#txt75_1b1b68d4,#txt76_1b1b68d4,#txt77_1b1b68d4,#txt78_1b1b68d4,#txt79_1b1b68d4,#txt80_1b1b68d4,#txt83_1b1b68d4,#txt98_1b1b68d4,#txt99_1b1b68d4,#txt100_1b1b68d4,#txt101_1b1b68d4,#txt104_1b1b68d4,#txt105_1b1b68d4,#txt106_1b1b68d4,#txt116_1b1b68d4,#txt117_1b1b68d4,#txt118_1b1b68d4,#txt119_1b1b68d4,#txt120_1b1b68d4,#txt121_1b1b68d4,#txt122_1b1b68d4,#txt123_1b1b68d4,#txt124_1b1b68d4,#txt128_1b1b68d4,#txt129_1b1b68d4,#txt130_1b1b68d4,#txt133_1b1b68d4,#txt152_1b1b68d4,#txt153_1b1b68d4,#txt154_1b1b68d4,#txt155_1b1b68d4,#txt156_1b1b68d4,#txt157_1b1b68d4,#txt158_1b1b68d4,#txt159_1b1b68d4,#txt160_1b1b68d4,#txt161_1b1b68d4,#txt162_1b1b68d4,#txt163_1b1b68d4 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt3_1b1b68d4,#txt8_1b1b68d4,#txt13_1b1b68d4,#txt19_1b1b68d4,#txt25_1b1b68d4,#txt31_1b1b68d4 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#254f2f;}#txt4_1b1b68d4,#txt5_1b1b68d4,#txt9_1b1b68d4,#txt14_1b1b68d4,#txt15_1b1b68d4,#txt20_1b1b68d4,#txt21_1b1b68d4,#txt26_1b1b68d4,#txt27_1b1b68d4,#txt32_1b1b68d4,#txt33_1b1b68d4 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#254f2f;}#svg0_1b1b68d4 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px;}#txt48_1b1b68d4,#txt49_1b1b68d4,#txt50_1b1b68d4,#txt51_1b1b68d4,#txt52_1b1b68d4,#txt53_1b1b68d4,#txt54_1b1b68d4,#txt55_1b1b68d4,#txt56_1b1b68d4,#txt57_1b1b68d4,#txt58_1b1b68d4,#txt59_1b1b68d4,#txt60_1b1b68d4,#txt61_1b1b68d4 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#512373;}#txt62_1b1b68d4 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt63_1b1b68d4 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#spr9_1b1b68d4,#spr12_1b1b68d4,#spr13_1b1b68d4,#spr14_1b1b68d4,#spr15_1b1b68d4 {display:none;}#svg11_1b1b68d4,#svg22_1b1b68d4,#svg33_1b1b68d4 {-webkit-transform-origin:12px 9px; -moz-transform-origin:12px 9px; -o-transform-origin:12px 9px; -ms-transform-origin:12px 9px; transform-origin:12px 9px;}#svg34_1b1b68d4,#svg35_1b1b68d4 {pointer-events:none;}#txt64_1b1b68d4,#txt67_1b1b68d4 {font-family:fnt12; font-size:18px; line-height:21px; font-weight:bold; font-style:italic; color:#000000;}#txt65_1b1b68d4,#txt66_1b1b68d4,#txt68_1b1b68d4,#txt69_1b1b68d4 {font-family:fnt12; font-size:12px; line-height:14px; font-weight:bold; font-style:italic; color:#000000;}#txt81_1b1b68d4,#txt102_1b1b68d4,#txt125_1b1b68d4,#txt127_1b1b68d4,#txt131_1b1b68d4 {font-family:fnt10; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt82_1b1b68d4,#txt103_1b1b68d4,#txt126_1b1b68d4,#txt132_1b1b68d4 {font-family:fnt10; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt84_1b1b68d4,#txt85_1b1b68d4,#txt86_1b1b68d4,#txt87_1b1b68d4,#txt88_1b1b68d4,#txt89_1b1b68d4,#txt90_1b1b68d4,#txt91_1b1b68d4,#txt92_1b1b68d4,#txt93_1b1b68d4,#txt94_1b1b68d4,#txt97_1b1b68d4 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#c00000;}#txt95_1b1b68d4 {font-family:fnt10; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:#c00000;}#txt96_1b1b68d4 {font-family:fnt10; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:#c00000;}#txt107_1b1b68d4,#txt108_1b1b68d4,#txt109_1b1b68d4,#txt110_1b1b68d4,#txt113_1b1b68d4,#txt114_1b1b68d4,#txt115_1b1b68d4 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#003300;}#txt111_1b1b68d4 {font-family:fnt10; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:#003300;}#txt112_1b1b68d4 {font-family:fnt10; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:#003300;}#txt134_1b1b68d4,#txt135_1b1b68d4,#txt136_1b1b68d4,#txt137_1b1b68d4,#txt138_1b1b68d4,#txt139_1b1b68d4,#txt140_1b1b68d4,#txt141_1b1b68d4,#txt142_1b1b68d4,#txt146_1b1b68d4,#txt147_1b1b68d4,#txt148_1b1b68d4,#txt151_1b1b68d4 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#0000e2;}#txt143_1b1b68d4,#txt145_1b1b68d4,#txt149_1b1b68d4 {font-family:fnt10; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:#0000e2;}#txt144_1b1b68d4,#txt150_1b1b68d4 {font-family:fnt10; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:#0000e2;}#txt164_1b1b68d4,#txt165_1b1b68d4,#txt166_1b1b68d4,#txt167_1b1b68d4,#txt168_1b1b68d4,#txt169_1b1b68d4,#txt170_1b1b68d4,#txt171_1b1b68d4,#txt172_1b1b68d4,#txt173_1b1b68d4,#txt174_1b1b68d4,#txt175_1b1b68d4 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#9900cc;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide24.js b/experiment/simulation/EE6/iframes/data/slide24.js new file mode 100644 index 0000000..331cd31 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide24.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(23, '
    1. A DC source as main supply to
    the circuit is taken.
    1. A DC source as main supply to
    the circuit is taken.
    2. A MOSFET mounted on heat sink.
    2. A MOSFET mounted on heat sink.
    3. A load (variable resister or
    rheostat) is attached.
    3. A load (variable resister or
    rheostat) is attached.
    4. A variable DC source for the gate
    of the MOSFET is connected.
    4. A variable DC source for the gate
    of the MOSFET is connected.
    5. An ammeter is attached in series
    with the MOSFET.
    5. An ammeter is attached in series
    with the MOSFET.
    6. A voltmeter is attached across
    the MOSFET.
    6. A voltmeter is attached across
    the MOSFET.
    Observe:  This  is  series  circuit.  The  current  flowing  throughout  the  circuit  is  same.
    Observe:  This  is  series  circuit.  The  current  flowing  throughout  the  circuit  is  same.
    Circuit Diagram To Plot Transfer Characteristics
    Circuit Diagram To Plot Transfer Characteristics
    V g _1
    V g _n
    Set  input  DC  supply  voltage  i.e.
    maintain  constant  Drain-to-Source
    voltage  ( V DS  ).
    Set  input  DC  supply  voltage  i.e.
    maintain  constant  Drain-to-Source
    voltage  ( V DS  ).
    Change  gate-to-source  voltage  ( V GS )
    in  steps.
    Change  gate-to-source  voltage  ( V GS )
    in  steps.
    Ammeter  and  Voltmeter  show  the
    corresponding  Drain  current  ( I D and
    the  voltage  V GS .
    Ammeter  and  Voltmeter  show  the
    corresponding  Drain  current  ( I D and
    the  voltage  V GS .
    Plot  these  data  points  on  graph  to
    observe  the  “Transfer  Characteristic”.
    Plot  these  data  points  on  graph  to
    observe  the  “Transfer  Characteristic”.
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide25.css b/experiment/simulation/EE6/iframes/data/slide25.css new file mode 100644 index 0000000..6765040 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide25.css @@ -0,0 +1 @@ +#spr1_1b1b6b55 {clip:rect(0px,960px,540px,0px);}#spr3_1b1b6b55,#spr4_1b1b6b55,#spr5_1b1b6b55,#spr6_1b1b6b55,#spr7_1b1b6b55,#spr8_1b1b6b55,#spr12_1b1b6b55,#spr16_1b1b6b55,#spr21_1b1b6b55,#spr27_1b1b6b55,#spr28_1b1b6b55,#spr33_1b1b6b55,#spr38_1b1b6b55,#spr39_1b1b6b55,#spr44_1b1b6b55,#spr50_1b1b6b55,#spr55_1b1b6b55,#spr60_1b1b6b55,#spr61_1b1b6b55,#spr62_1b1b6b55,#spr63_1b1b6b55,#spr64_1b1b6b55,#spr65_1b1b6b55,#spr66_1b1b6b55,#spr67_1b1b6b55,#spr68_1b1b6b55,#spr69_1b1b6b55,#spr70_1b1b6b55,#spr71_1b1b6b55,#spr72_1b1b6b55,#spr73_1b1b6b55,#spr74_1b1b6b55,#spr75_1b1b6b55,#spr76_1b1b6b55,#spr77_1b1b6b55 {display:none;}#spr10_1b1b6b55,#spr14_1b1b6b55 {-webkit-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); -o-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); -ms-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); -moz-transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0); transform:matrix(0.998451,0.055645,-0.055645,0.998451,0,0);}#svg0_1b1b6b55 {-webkit-transform-origin:1.215px 0.806px; -moz-transform-origin:1.215px 0.806px; -o-transform-origin:1.215px 0.806px; -ms-transform-origin:1.215px 0.806px; transform-origin:1.215px 0.806px;}#spr11_1b1b6b55,#spr15_1b1b6b55 {-webkit-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -o-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -ms-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -moz-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0);}#svg8_1b1b6b55 {-webkit-transform-origin:1.212px 0.808px; -moz-transform-origin:1.212px 0.808px; -o-transform-origin:1.212px 0.808px; -ms-transform-origin:1.212px 0.808px; transform-origin:1.212px 0.808px;}#svg16_1b1b6b55 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#svg17_1b1b6b55,#svg18_1b1b6b55,#svg19_1b1b6b55,#svg20_1b1b6b55 {pointer-events:none;}#txt0_1b1b6b55 {font-family:fnt5; font-size:30px; line-height:34px; font-weight:bold; color:#0000ff;}#txt1_1b1b6b55 {font-family:fnt5; font-size:20px; line-height:23px; font-weight:bold; color:#0000ff;}#spr26_1b1b6b55,#spr49_1b1b6b55 {-webkit-transform:matrix(-0,1,-1,-0,0,0); -o-transform:matrix(-0,1,-1,-0,0,0); -ms-transform:matrix(-0,1,-1,-0,0,0); -moz-transform:matrix(-0,1,-1,-0,0,0); transform:matrix(-0,1,-1,-0,0,0); display:none;}#txt2_1b1b6b55 {font-family:fnt5; font-size:23px; line-height:26px; font-weight:bold; color:#0000ff;}#txt3_1b1b6b55 {font-family:fnt5; font-size:17px; line-height:20px; font-weight:bold; color:#0000ff;}#txt4_1b1b6b55 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt5_1b1b6b55 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt6_1b1b6b55 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt7_1b1b6b55 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide25.js b/experiment/simulation/EE6/iframes/data/slide25.js new file mode 100644 index 0000000..410a0f5 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide25.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(24, '
    v
    A
    v
    A
    Test Circuit Connection Diagram for Transfer Characteristics
    Test Circuit Connection Diagram for Transfer Characteristics
    Test Circuit Connection Diagram for Transfer Characteristics
    Test Circuit Connection Diagram for Transfer Characteristics
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide26.css b/experiment/simulation/EE6/iframes/data/slide26.css new file mode 100644 index 0000000..bb25a09 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide26.css @@ -0,0 +1 @@ +#spr1_1b1b77b9 {clip:rect(0px,960px,540px,0px);}#txt0_1b1b77b9,#txt1_1b1b77b9,#txt2_1b1b77b9,#txt3_1b1b77b9,#txt4_1b1b77b9 {font-family:fnt11; font-size:32px; line-height:45px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide26.js b/experiment/simulation/EE6/iframes/data/slide26.js new file mode 100644 index 0000000..0414fbb --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide26.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(25, '
    Formulation of
    Circuit set-up
    and procedure for
    Switching Characteristics
    generation
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide27.css b/experiment/simulation/EE6/iframes/data/slide27.css new file mode 100644 index 0000000..5782184 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide27.css @@ -0,0 +1 @@ +#spr1_1b1b78f1 {clip:rect(0px,960px,540px,0px);}#svg0_1b1b78f1 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#spr3_1b1b78f1,#spr8_1b1b78f1,#spr13_1b1b78f1,#spr14_1b1b78f1,#spr15_1b1b78f1,#spr16_1b1b78f1,#spr30_1b1b78f1,#spr35_1b1b78f1,#spr40_1b1b78f1,#spr41_1b1b78f1,#spr42_1b1b78f1,#spr43_1b1b78f1,#spr44_1b1b78f1,#spr45_1b1b78f1,#spr46_1b1b78f1,#spr47_1b1b78f1,#spr48_1b1b78f1,#spr49_1b1b78f1,#spr50_1b1b78f1,#spr51_1b1b78f1,#spr52_1b1b78f1,#spr53_1b1b78f1,#spr54_1b1b78f1,#spr55_1b1b78f1,#spr56_1b1b78f1,#spr57_1b1b78f1,#spr64_1b1b78f1 {display:none;}#svg1_1b1b78f1,#svg2_1b1b78f1 {pointer-events:none;}#txt0_1b1b78f1 {font-family:fnt5; font-size:40px; line-height:46px; font-weight:bold; color:#0000ff;}#txt1_1b1b78f1 {font-family:fnt5; font-size:30px; line-height:34px; font-weight:bold; color:#0000ff;}#txt2_1b1b78f1,#txt3_1b1b78f1 {font-family:fnt5; font-size:18px; line-height:21px; font-weight:bold; color:#203864;}#txt4_1b1b78f1 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt5_1b1b78f1 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt6_1b1b78f1 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt7_1b1b78f1 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#txt8_1b1b78f1,#txt9_1b1b78f1,#txt10_1b1b78f1,#txt11_1b1b78f1,#txt12_1b1b78f1,#txt13_1b1b78f1,#txt14_1b1b78f1,#txt15_1b1b78f1,#txt16_1b1b78f1,#txt17_1b1b78f1,#txt18_1b1b78f1,#txt30_1b1b78f1,#txt31_1b1b78f1,#txt32_1b1b78f1,#txt33_1b1b78f1,#txt34_1b1b78f1,#txt35_1b1b78f1,#txt36_1b1b78f1,#txt37_1b1b78f1,#txt38_1b1b78f1,#txt39_1b1b78f1,#txt40_1b1b78f1,#txt41_1b1b78f1,#txt42_1b1b78f1,#txt43_1b1b78f1,#txt44_1b1b78f1,#txt45_1b1b78f1,#txt46_1b1b78f1,#txt47_1b1b78f1,#txt48_1b1b78f1 {font-family:fnt13; font-size:22px; line-height:29px; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt19_1b1b78f1,#txt20_1b1b78f1,#txt21_1b1b78f1,#txt22_1b1b78f1,#txt23_1b1b78f1,#txt24_1b1b78f1,#txt25_1b1b78f1,#txt26_1b1b78f1,#txt27_1b1b78f1,#txt28_1b1b78f1,#txt29_1b1b78f1 {font-family:fnt13; font-size:22px; line-height:29px; color:#c00000;}#txt49_1b1b78f1,#txt50_1b1b78f1,#txt51_1b1b78f1,#txt52_1b1b78f1,#txt53_1b1b78f1,#txt54_1b1b78f1,#txt55_1b1b78f1,#txt56_1b1b78f1,#txt57_1b1b78f1,#txt58_1b1b78f1,#txt59_1b1b78f1,#txt60_1b1b78f1,#txt61_1b1b78f1,#txt62_1b1b78f1,#txt63_1b1b78f1,#txt64_1b1b78f1,#txt65_1b1b78f1,#txt66_1b1b78f1,#txt67_1b1b78f1 {font-family:fnt13; font-size:22px; line-height:29px; color:#003300;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide27.js b/experiment/simulation/EE6/iframes/data/slide27.js new file mode 100644 index 0000000..22ff154 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide27.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(26, '
    v
    A
    Gate
    Pulses
    MOSFET Switching Characteristics Using Buck Converter (Circuit Diagram)
    MOSFET Switching Characteristics Using Buck Converter (Circuit Diagram)
    MOSFET Switching Characteristics Using Buck Converter (Circuit Diagram)
    MOSFET Switching Characteristics Using Buck Converter (Circuit Diagram)
    To  study  the  switching
    characteristics  of
    MOSFET,  Buck  converter
    is  taken.
    To  study  the  switching
    characteristics  of
    MOSFET,  Buck  converter
    is  taken.
    The  MOSFET  acts  as  a
    switch.  It  is  turned  ON
    and  OFF  via  the  Pulses
    given  across  the  Gate.
    The  MOSFET  acts  as  a
    switch.  It  is  turned  ON
    and  OFF  via  the  Pulses
    given  across  the  Gate.
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide28.css b/experiment/simulation/EE6/iframes/data/slide28.css new file mode 100644 index 0000000..5e44bf5 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide28.css @@ -0,0 +1 @@ +#spr1_1b1b868e {clip:rect(0px,960px,540px,0px);}#spr3_1b1b868e,#spr4_1b1b868e,#spr5_1b1b868e,#spr7_1b1b868e,#spr8_1b1b868e,#spr9_1b1b868e,#spr10_1b1b868e,#spr11_1b1b868e,#spr12_1b1b868e,#spr13_1b1b868e,#spr14_1b1b868e,#spr15_1b1b868e,#spr29_1b1b868e,#spr34_1b1b868e,#spr39_1b1b868e,#spr43_1b1b868e,#spr44_1b1b868e,#spr45_1b1b868e,#spr50_1b1b868e,#spr54_1b1b868e,#spr55_1b1b868e,#spr56_1b1b868e,#spr57_1b1b868e,#spr58_1b1b868e,#spr59_1b1b868e,#spr60_1b1b868e,#spr62_1b1b868e,#spr63_1b1b868e,#spr64_1b1b868e,#spr65_1b1b868e,#spr66_1b1b868e,#spr67_1b1b868e,#spr69_1b1b868e,#spr73_1b1b868e,#spr74_1b1b868e,#spr75_1b1b868e,#spr76_1b1b868e,#spr77_1b1b868e,#spr81_1b1b868e,#spr85_1b1b868e,#spr86_1b1b868e,#spr87_1b1b868e,#spr88_1b1b868e,#spr90_1b1b868e {display:none;}#spr6_1b1b868e,#spr68_1b1b868e {-webkit-transform:matrix(0.997793,-0.066406,0.066406,0.997793,0,0); -o-transform:matrix(0.997793,-0.066406,0.066406,0.997793,0,0); -ms-transform:matrix(0.997793,-0.066406,0.066406,0.997793,0,0); -moz-transform:matrix(0.997793,-0.066406,0.066406,0.997793,0,0); transform:matrix(0.997793,-0.066406,0.066406,0.997793,0,0); display:none;}#svg0_1b1b868e {-webkit-transform-origin:4.5px 4.5px; -moz-transform-origin:4.5px 4.5px; -o-transform-origin:4.5px 4.5px; -ms-transform-origin:4.5px 4.5px; transform-origin:4.5px 4.5px; display:none;}#txt0_1b1b868e,#txt1_1b1b868e {font-family:fnt5; font-size:15px; line-height:17px; font-weight:bold; color:#203864;}#svg1_1b1b868e {pointer-events:none;}#txt2_1b1b868e,#txt3_1b1b868e {font-family:fnt5; font-size:13px; line-height:15px; font-weight:bold; color:#0000ff;}#txt4_1b1b868e,#txt5_1b1b868e {font-family:fnt5; font-size:14px; line-height:16px; font-weight:bold; color:#203864;}#svg2_1b1b868e {-webkit-transform-origin:9px 9px; -moz-transform-origin:9px 9px; -o-transform-origin:9px 9px; -ms-transform-origin:9px 9px; transform-origin:9px 9px; display:none;}#txt6_1b1b868e {font-family:fnt5; font-size:16px; line-height:18px; font-weight:bold; color:#203864;}#spr61_1b1b868e {-webkit-transform:matrix(-0,1,-1,-0,0,0); -o-transform:matrix(-0,1,-1,-0,0,0); -ms-transform:matrix(-0,1,-1,-0,0,0); -moz-transform:matrix(-0,1,-1,-0,0,0); transform:matrix(-0,1,-1,-0,0,0); display:none;}#txt7_1b1b868e {font-family:fnt14; font-size:18px; line-height:26px; color:#ffffff;}#txt8_1b1b868e {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt9_1b1b868e {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt10_1b1b868e {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt11_1b1b868e {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#spr80_1b1b868e {-webkit-transform:matrix(0.997124,-0.075794,0.075794,0.997124,0,0); -o-transform:matrix(0.997124,-0.075794,0.075794,0.997124,0,0); -ms-transform:matrix(0.997124,-0.075794,0.075794,0.997124,0,0); -moz-transform:matrix(0.997124,-0.075794,0.075794,0.997124,0,0); transform:matrix(0.997124,-0.075794,0.075794,0.997124,0,0); display:none;}#spr84_1b1b868e {-webkit-transform:matrix(0.936959,-0.34944,0.34944,0.936959,0,0); -o-transform:matrix(0.936959,-0.34944,0.34944,0.936959,0,0); -ms-transform:matrix(0.936959,-0.34944,0.34944,0.936959,0,0); -moz-transform:matrix(0.936959,-0.34944,0.34944,0.936959,0,0); transform:matrix(0.936959,-0.34944,0.34944,0.936959,0,0); display:none;}#spr89_1b1b868e {-webkit-transform:matrix(0.648236,0.76144,-0.76144,0.648236,0,0); -o-transform:matrix(0.648236,0.76144,-0.76144,0.648236,0,0); -ms-transform:matrix(0.648236,0.76144,-0.76144,0.648236,0,0); -moz-transform:matrix(0.648236,0.76144,-0.76144,0.648236,0,0); transform:matrix(0.648236,0.76144,-0.76144,0.648236,0,0); display:none;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide28.js b/experiment/simulation/EE6/iframes/data/slide28.js new file mode 100644 index 0000000..55502f5 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide28.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(27, '
    Gate
    Pulses
    Volt
    Probe
    Amp
    Probe
    DSO
     
    MOSFET Switching Characteristics Using Buck Converter (Circuit Diagram)
    MOSFET Switching Characteristics Using Buck Converter (Circuit Diagram)
    MOSFET Switching Characteristics Using Buck Converter (Circuit Diagram)
    MOSFET Switching Characteristics Using Buck Converter (Circuit Diagram)
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide29.css b/experiment/simulation/EE6/iframes/data/slide29.css new file mode 100644 index 0000000..efe9be6 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide29.css @@ -0,0 +1 @@ +#spr1_1b1b98ae {clip:rect(0px,960px,540px,0px);}#txt0_1b1b98ae,#txt1_1b1b98ae {font-family:fnt11; font-size:40px; line-height:56px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide29.js b/experiment/simulation/EE6/iframes/data/slide29.js new file mode 100644 index 0000000..c2fd8d4 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide29.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(28, '
    MOSFET as:
    Current limiter
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide3.css b/experiment/simulation/EE6/iframes/data/slide3.css new file mode 100644 index 0000000..77ba15a --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide3.css @@ -0,0 +1 @@ +#spr1_1b1b06bf {clip:rect(0px,960px,540px,0px);}#spr3_1b1b06bf,#spr4_1b1b06bf,#spr5_1b1b06bf,#spr6_1b1b06bf,#spr7_1b1b06bf,#spr8_1b1b06bf,#spr12_1b1b06bf,#spr13_1b1b06bf,#spr14_1b1b06bf,#spr15_1b1b06bf,#spr16_1b1b06bf {display:none;}#txt0_1b1b06bf,#txt1_1b1b06bf,#txt2_1b1b06bf {font-family:fnt6; font-size:18px; line-height:26px; font-weight:bold; color:#0d0d0d;}#txt3_1b1b06bf,#txt4_1b1b06bf,#txt5_1b1b06bf,#txt6_1b1b06bf,#txt7_1b1b06bf,#txt8_1b1b06bf,#txt9_1b1b06bf,#txt10_1b1b06bf,#txt11_1b1b06bf,#txt12_1b1b06bf,#txt13_1b1b06bf,#txt14_1b1b06bf,#txt15_1b1b06bf,#txt16_1b1b06bf,#txt17_1b1b06bf,#txt18_1b1b06bf,#txt19_1b1b06bf,#txt20_1b1b06bf,#txt21_1b1b06bf,#txt22_1b1b06bf,#txt23_1b1b06bf,#txt24_1b1b06bf,#txt25_1b1b06bf,#txt26_1b1b06bf,#txt27_1b1b06bf,#txt28_1b1b06bf,#txt29_1b1b06bf,#txt30_1b1b06bf,#txt31_1b1b06bf,#txt32_1b1b06bf,#txt33_1b1b06bf,#txt34_1b1b06bf,#txt35_1b1b06bf,#txt36_1b1b06bf,#txt37_1b1b06bf,#txt38_1b1b06bf,#txt39_1b1b06bf,#txt40_1b1b06bf,#txt41_1b1b06bf,#txt42_1b1b06bf,#txt43_1b1b06bf,#txt44_1b1b06bf,#txt45_1b1b06bf,#txt46_1b1b06bf,#txt47_1b1b06bf,#txt48_1b1b06bf,#txt49_1b1b06bf,#txt50_1b1b06bf,#txt51_1b1b06bf,#txt52_1b1b06bf,#txt53_1b1b06bf,#txt54_1b1b06bf,#txt55_1b1b06bf,#txt56_1b1b06bf,#txt57_1b1b06bf,#txt58_1b1b06bf,#txt59_1b1b06bf,#txt60_1b1b06bf,#txt61_1b1b06bf,#txt62_1b1b06bf,#txt63_1b1b06bf,#txt64_1b1b06bf,#txt65_1b1b06bf,#txt66_1b1b06bf,#txt67_1b1b06bf,#txt68_1b1b06bf,#txt69_1b1b06bf,#txt70_1b1b06bf,#txt81_1b1b06bf,#txt82_1b1b06bf,#txt83_1b1b06bf,#txt84_1b1b06bf,#txt85_1b1b06bf,#txt86_1b1b06bf,#txt87_1b1b06bf,#txt88_1b1b06bf,#txt89_1b1b06bf,#txt90_1b1b06bf,#txt91_1b1b06bf,#txt92_1b1b06bf,#txt93_1b1b06bf,#txt94_1b1b06bf,#txt95_1b1b06bf,#txt96_1b1b06bf,#txt97_1b1b06bf,#txt98_1b1b06bf {font-family:fnt6; font-size:22px; line-height:32px; font-weight:bold; color:#ffffff;}#svg0_1b1b06bf {-webkit-transform-origin:46.066px 0.13px; -moz-transform-origin:46.066px 0.13px; -o-transform-origin:46.066px 0.13px; -ms-transform-origin:46.066px 0.13px; transform-origin:46.066px 0.13px; display:none;}#txt71_1b1b06bf {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt72_1b1b06bf {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt73_1b1b06bf {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt74_1b1b06bf {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#txt75_1b1b06bf,#txt77_1b1b06bf {font-family:fnt6; font-size:16px; line-height:23px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt76_1b1b06bf {font-family:fnt7; font-size:16px; line-height:23px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt78_1b1b06bf,#txt80_1b1b06bf {font-family:fnt6; font-size:16px; line-height:23px; font-weight:bold; color:#0000ff;}#txt79_1b1b06bf {font-family:fnt7; font-size:16px; line-height:23px; font-weight:bold; font-style:italic; color:#0000ff;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide3.js b/experiment/simulation/EE6/iframes/data/slide3.js new file mode 100644 index 0000000..b377d05 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide3.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(2, '
    But why do we plot
    these characteristics?
    How are they useful?
    To  use  device  in  any  power  conversion  applications,  its  behavior  under
    prevailing  conditions  in  the  circuit  (forward  and  reverse  biased)  should
    be  known  in  advance.  Manufacturer’s  datasheet  provides  all  the
    relevant  parameters  and  characteristics.
    To  study  the  performance  characteristics  of  MOSFET  :
    1. Output  Characteristics  (Drain  current-vs-Drain-to-source  voltage)
    2. Transfer  Characteristics  (Drain  current-vs-Gate-to-source  voltage)
    3. Switching  Characteristics  (Switch  Current  and  Switch  Voltage  pattern  during  turn-
    ON/OFF  transitions)
    AIM
    AIM
    AIM
    AIM
    What is meant by “ v-i
    characteristics”?
    What is meant by “ v-i
    characteristics”?
    Characteristics  of  any  device  is  the  tracing  of  current
    flowing  through  it  against  the  voltage  appearing  across
    it.
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide30.css b/experiment/simulation/EE6/iframes/data/slide30.css new file mode 100644 index 0000000..5d011a5 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide30.css @@ -0,0 +1 @@ +#spr1_1b1b99b8 {clip:rect(0px,960px,540px,0px);}#spr3_1b1b99b8,#spr4_1b1b99b8,#spr5_1b1b99b8,#spr6_1b1b99b8,#spr11_1b1b99b8,#spr12_1b1b99b8,#spr13_1b1b99b8,#spr14_1b1b99b8,#spr15_1b1b99b8,#spr20_1b1b99b8,#spr21_1b1b99b8,#spr22_1b1b99b8,#spr23_1b1b99b8,#spr24_1b1b99b8,#spr29_1b1b99b8,#spr30_1b1b99b8,#spr31_1b1b99b8,#spr35_1b1b99b8,#spr36_1b1b99b8,#spr37_1b1b99b8,#spr38_1b1b99b8,#spr39_1b1b99b8,#spr40_1b1b99b8,#spr44_1b1b99b8,#spr45_1b1b99b8 {display:none;}#svg0_1b1b99b8 {pointer-events:none;}#txt0_1b1b99b8,#txt1_1b1b99b8 {font-family:fnt5; font-size:18px; line-height:21px; font-weight:bold; color:#0000ff;}#svg1_1b1b99b8 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#txt2_1b1b99b8,#txt3_1b1b99b8 {font-family:fnt5; font-size:18px; line-height:21px; font-weight:bold; color:#203864;}#txt4_1b1b99b8,#txt32_1b1b99b8,#txt48_1b1b99b8,#txt76_1b1b99b8 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt5_1b1b99b8,#txt6_1b1b99b8,#txt7_1b1b99b8,#txt8_1b1b99b8,#txt9_1b1b99b8,#txt10_1b1b99b8,#txt11_1b1b99b8,#txt12_1b1b99b8,#txt13_1b1b99b8,#txt14_1b1b99b8,#txt15_1b1b99b8,#txt16_1b1b99b8,#txt17_1b1b99b8,#txt33_1b1b99b8,#txt34_1b1b99b8,#txt35_1b1b99b8,#txt36_1b1b99b8,#txt37_1b1b99b8,#txt38_1b1b99b8,#txt39_1b1b99b8,#txt49_1b1b99b8,#txt50_1b1b99b8,#txt51_1b1b99b8,#txt52_1b1b99b8,#txt53_1b1b99b8,#txt54_1b1b99b8,#txt55_1b1b99b8,#txt56_1b1b99b8,#txt57_1b1b99b8,#txt58_1b1b99b8,#txt59_1b1b99b8,#txt60_1b1b99b8,#txt61_1b1b99b8,#txt77_1b1b99b8,#txt78_1b1b99b8,#txt79_1b1b99b8,#txt80_1b1b99b8,#txt81_1b1b99b8,#txt82_1b1b99b8,#txt83_1b1b99b8,#txt84_1b1b99b8,#txt85_1b1b99b8,#txt86_1b1b99b8,#txt99_1b1b99b8,#txt100_1b1b99b8,#txt101_1b1b99b8,#txt102_1b1b99b8,#txt103_1b1b99b8,#txt104_1b1b99b8,#txt105_1b1b99b8,#txt106_1b1b99b8,#txt107_1b1b99b8,#txt108_1b1b99b8,#txt109_1b1b99b8,#txt110_1b1b99b8,#txt111_1b1b99b8 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt18_1b1b99b8 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#c00000;}#txt19_1b1b99b8,#txt20_1b1b99b8,#txt21_1b1b99b8,#txt22_1b1b99b8,#txt23_1b1b99b8,#txt24_1b1b99b8,#txt25_1b1b99b8,#txt26_1b1b99b8,#txt27_1b1b99b8,#txt28_1b1b99b8,#txt29_1b1b99b8,#txt30_1b1b99b8,#txt31_1b1b99b8 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#c00000;}#txt40_1b1b99b8 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#7030a0;}#txt41_1b1b99b8,#txt42_1b1b99b8,#txt43_1b1b99b8,#txt44_1b1b99b8,#txt45_1b1b99b8,#txt46_1b1b99b8,#txt47_1b1b99b8 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#7030a0;}#txt62_1b1b99b8 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#3333ff;}#txt63_1b1b99b8,#txt64_1b1b99b8,#txt65_1b1b99b8,#txt66_1b1b99b8,#txt67_1b1b99b8,#txt68_1b1b99b8,#txt69_1b1b99b8,#txt70_1b1b99b8,#txt71_1b1b99b8,#txt72_1b1b99b8,#txt73_1b1b99b8,#txt74_1b1b99b8,#txt75_1b1b99b8 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#3333ff;}#txt87_1b1b99b8 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#548235;}#txt88_1b1b99b8,#txt89_1b1b99b8,#txt90_1b1b99b8,#txt91_1b1b99b8,#txt92_1b1b99b8,#txt93_1b1b99b8,#txt94_1b1b99b8,#txt95_1b1b99b8,#txt96_1b1b99b8,#txt97_1b1b99b8 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#548235;}#txt98_1b1b99b8 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; text-decoration-line:underline; text-decoration-skip:none; text-decoration-skip-ink:none; text-decoration-thickness:1.467px; text-decoration-style:solid; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt112_1b1b99b8 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; text-decoration-line:underline; text-decoration-skip:none; text-decoration-skip-ink:none; text-decoration-thickness:1.467px; text-decoration-style:solid; color:#0d0d0d;}#txt113_1b1b99b8,#txt114_1b1b99b8,#txt115_1b1b99b8,#txt116_1b1b99b8,#txt117_1b1b99b8,#txt118_1b1b99b8,#txt119_1b1b99b8,#txt120_1b1b99b8,#txt121_1b1b99b8,#txt122_1b1b99b8,#txt123_1b1b99b8,#txt124_1b1b99b8,#txt125_1b1b99b8 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#0d0d0d;}#txt126_1b1b99b8 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt127_1b1b99b8 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt128_1b1b99b8 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt129_1b1b99b8 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide30.js b/experiment/simulation/EE6/iframes/data/slide30.js new file mode 100644 index 0000000..75ecf5a --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide30.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(29, '
    Volt
    Probe
    Amp
    Probe
    1. circuit  similar  to  the  one  used  to
    plot  the  characteristics  is  taken.
    1. circuit  similar  to  the  one  used  to
    plot  the  characteristics  is  taken.
    2. Fixed  source  and  gate  voltage  are
    taken.
    2. Fixed  source  and  gate  voltage  are
    taken.
    3. The  load  resistance  is  now  varied
    to  vary  the  current  across  the
    circuit.
    3. The  load  resistance  is  now  varied
    to  vary  the  current  across  the
    circuit.
    4. The  current  variation  versus  the
    voltage  variation  is  now  plotted.
    4. The  current  variation  versus  the
    voltage  variation  is  now  plotted.
    Observe This  is  series  circuit.
    Current  is  the  same  throughout  the
    circuit.
    Observe This  is  series  circuit.
    Current  is  the  same  throughout  the
    circuit.
    MOSFET As Current Limiter
    MOSFET As Current Limiter
    MOSFET As Current Limiter
    MOSFET As Current Limiter
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide31.css b/experiment/simulation/EE6/iframes/data/slide31.css new file mode 100644 index 0000000..bb3f4d4 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide31.css @@ -0,0 +1 @@ +#spr1_1b1ba178 {clip:rect(0px,960px,540px,0px);}#spr3_1b1ba178,#spr4_1b1ba178,#spr5_1b1ba178,#spr6_1b1ba178,#spr9_1b1ba178,#spr12_1b1ba178,#spr13_1b1ba178,#spr14_1b1ba178,#spr15_1b1ba178,#spr16_1b1ba178,#spr18_1b1ba178,#spr20_1b1ba178,#spr21_1b1ba178,#spr22_1b1ba178,#spr23_1b1ba178,#spr24_1b1ba178,#spr25_1b1ba178,#spr26_1b1ba178,#spr28_1b1ba178,#spr29_1b1ba178,#spr30_1b1ba178,#spr31_1b1ba178,#spr32_1b1ba178,#spr33_1b1ba178,#spr34_1b1ba178,#spr36_1b1ba178,#spr37_1b1ba178 {display:none;}#spr7_1b1ba178,#spr10_1b1ba178 {-webkit-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -o-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -ms-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); -moz-transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); transform:matrix(0.499648,-0.866229,0.866229,0.499648,0,0); display:none;}#spr8_1b1ba178,#spr11_1b1ba178 {-webkit-transform:matrix(0.450673,0.892689,-0.892689,0.450673,0,0); -o-transform:matrix(0.450673,0.892689,-0.892689,0.450673,0,0); -ms-transform:matrix(0.450673,0.892689,-0.892689,0.450673,0,0); -moz-transform:matrix(0.450673,0.892689,-0.892689,0.450673,0,0); transform:matrix(0.450673,0.892689,-0.892689,0.450673,0,0);}#svg11_1b1ba178 {-webkit-transform-origin:1.214px 0.807px; -moz-transform-origin:1.214px 0.807px; -o-transform-origin:1.214px 0.807px; -ms-transform-origin:1.214px 0.807px; transform-origin:1.214px 0.807px;}#svg19_1b1ba178 {-webkit-transform-origin:1.211px 0.808px; -moz-transform-origin:1.211px 0.808px; -o-transform-origin:1.211px 0.808px; -ms-transform-origin:1.211px 0.808px; transform-origin:1.211px 0.808px;}#spr17_1b1ba178 {-webkit-transform:matrix(0.953953,-0.299956,0.299956,0.953953,0,0); -o-transform:matrix(0.953953,-0.299956,0.299956,0.953953,0,0); -ms-transform:matrix(0.953953,-0.299956,0.299956,0.953953,0,0); -moz-transform:matrix(0.953953,-0.299956,0.299956,0.953953,0,0); transform:matrix(0.953953,-0.299956,0.299956,0.953953,0,0); display:none;}#spr19_1b1ba178 {-webkit-transform:matrix(0.990979,-0.134018,0.134018,0.990979,0,0); -o-transform:matrix(0.990979,-0.134018,0.134018,0.990979,0,0); -ms-transform:matrix(0.990979,-0.134018,0.134018,0.990979,0,0); -moz-transform:matrix(0.990979,-0.134018,0.134018,0.990979,0,0); transform:matrix(0.990979,-0.134018,0.134018,0.990979,0,0); display:none;}#spr27_1b1ba178 {-webkit-transform:matrix(-0,1,-1,-0,0,0); -o-transform:matrix(-0,1,-1,-0,0,0); -ms-transform:matrix(-0,1,-1,-0,0,0); -moz-transform:matrix(-0,1,-1,-0,0,0); transform:matrix(-0,1,-1,-0,0,0); display:none;}#spr35_1b1ba178 {-webkit-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); -o-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); -ms-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); -moz-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); display:none;}#svg10_1b1ba178 {-webkit-transform-origin:21.621px 21px; -moz-transform-origin:21.621px 21px; -o-transform-origin:21.621px 21px; -ms-transform-origin:21.621px 21px; transform-origin:21.621px 21px; display:none;}#txt0_1b1ba178 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt1_1b1ba178 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt2_1b1ba178 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt3_1b1ba178 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide31.js b/experiment/simulation/EE6/iframes/data/slide31.js new file mode 100644 index 0000000..ffab6c2 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide31.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(30, '
    MOSFET As Current Limiter (Test Circuit)
    MOSFET As Current Limiter (Test Circuit)
    MOSFET As Current Limiter (Test Circuit)
    MOSFET As Current Limiter (Test Circuit)
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide32.css b/experiment/simulation/EE6/iframes/data/slide32.css new file mode 100644 index 0000000..9281448 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide32.css @@ -0,0 +1 @@ +#spr1_1b1ba745 {clip:rect(0px,960px,540px,0px);}#spr7_1b1ba745 {-webkit-transform:matrix(0.997932,0.064275,-0.064275,0.997932,0,0); -o-transform:matrix(0.997932,0.064275,-0.064275,0.997932,0,0); -ms-transform:matrix(0.997932,0.064275,-0.064275,0.997932,0,0); -moz-transform:matrix(0.997932,0.064275,-0.064275,0.997932,0,0); transform:matrix(0.997932,0.064275,-0.064275,0.997932,0,0);}#spr8_1b1ba745 {-webkit-transform:matrix(0.450672,0.892689,-0.892689,0.450672,0,0); -o-transform:matrix(0.450672,0.892689,-0.892689,0.450672,0,0); -ms-transform:matrix(0.450672,0.892689,-0.892689,0.450672,0,0); -moz-transform:matrix(0.450672,0.892689,-0.892689,0.450672,0,0); transform:matrix(0.450672,0.892689,-0.892689,0.450672,0,0);}#svg33_1b1ba745 {-webkit-transform-origin:1.214px 0.807px; -moz-transform-origin:1.214px 0.807px; -o-transform-origin:1.214px 0.807px; -ms-transform-origin:1.214px 0.807px; transform-origin:1.214px 0.807px;}#spr10_1b1ba745 {-webkit-transform:matrix(0.757836,-0.652445,0.652445,0.757836,0,0); -o-transform:matrix(0.757836,-0.652445,0.652445,0.757836,0,0); -ms-transform:matrix(0.757836,-0.652445,0.652445,0.757836,0,0); -moz-transform:matrix(0.757836,-0.652445,0.652445,0.757836,0,0); transform:matrix(0.757836,-0.652445,0.652445,0.757836,0,0);}#spr11_1b1ba745 {-webkit-transform:matrix(0.450672,0.89269,-0.89269,0.450672,0,0); -o-transform:matrix(0.450672,0.89269,-0.89269,0.450672,0,0); -ms-transform:matrix(0.450672,0.89269,-0.89269,0.450672,0,0); -moz-transform:matrix(0.450672,0.89269,-0.89269,0.450672,0,0); transform:matrix(0.450672,0.89269,-0.89269,0.450672,0,0);}#svg41_1b1ba745 {-webkit-transform-origin:1.211px 0.808px; -moz-transform-origin:1.211px 0.808px; -o-transform-origin:1.211px 0.808px; -ms-transform-origin:1.211px 0.808px; transform-origin:1.211px 0.808px;}#spr16_1b1ba745,#spr35_1b1ba745 {-webkit-transform:matrix(0.953953,-0.299956,0.299956,0.953953,0,0); -o-transform:matrix(0.953953,-0.299956,0.299956,0.953953,0,0); -ms-transform:matrix(0.953953,-0.299956,0.299956,0.953953,0,0); -moz-transform:matrix(0.953953,-0.299956,0.299956,0.953953,0,0); transform:matrix(0.953953,-0.299956,0.299956,0.953953,0,0);}#spr18_1b1ba745,#spr37_1b1ba745 {-webkit-transform:matrix(0.990979,-0.134018,0.134018,0.990979,0,0); -o-transform:matrix(0.990979,-0.134018,0.134018,0.990979,0,0); -ms-transform:matrix(0.990979,-0.134018,0.134018,0.990979,0,0); -moz-transform:matrix(0.990979,-0.134018,0.134018,0.990979,0,0); transform:matrix(0.990979,-0.134018,0.134018,0.990979,0,0);}#spr24_1b1ba745 {-webkit-transform:matrix(-0,1,-1,-0,0,0); -o-transform:matrix(-0,1,-1,-0,0,0); -ms-transform:matrix(-0,1,-1,-0,0,0); -moz-transform:matrix(-0,1,-1,-0,0,0); transform:matrix(-0,1,-1,-0,0,0);}#spr32_1b1ba745 {-webkit-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); -o-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); -ms-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); -moz-transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0); transform:matrix(0.572812,0.819687,-0.819687,0.572812,0,0);}#svg10_1b1ba745 {-webkit-transform-origin:21.621px 21.372px; -moz-transform-origin:21.621px 21.372px; -o-transform-origin:21.621px 21.372px; -ms-transform-origin:21.621px 21.372px; transform-origin:21.621px 21.372px;}#svg21_1b1ba745 {-webkit-transform-origin:4.5px 2.25px; -moz-transform-origin:4.5px 2.25px; -o-transform-origin:4.5px 2.25px; -ms-transform-origin:4.5px 2.25px; transform-origin:4.5px 2.25px; display:none;}#svg32_1b1ba745 {-webkit-transform-origin:2.25px 2.25px; -moz-transform-origin:2.25px 2.25px; -o-transform-origin:2.25px 2.25px; -ms-transform-origin:2.25px 2.25px; transform-origin:2.25px 2.25px; display:none;}#txt0_1b1ba745 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt1_1b1ba745 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt2_1b1ba745 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt3_1b1ba745 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#spr46_1b1ba745,#spr47_1b1ba745,#spr48_1b1ba745,#spr49_1b1ba745,#spr50_1b1ba745 {display:none;}#txt4_1b1ba745,#txt28_1b1ba745,#txt54_1b1ba745 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt5_1b1ba745,#txt6_1b1ba745,#txt7_1b1ba745,#txt8_1b1ba745,#txt9_1b1ba745,#txt10_1b1ba745,#txt11_1b1ba745,#txt12_1b1ba745,#txt13_1b1ba745,#txt14_1b1ba745,#txt15_1b1ba745,#txt29_1b1ba745,#txt30_1b1ba745,#txt31_1b1ba745,#txt32_1b1ba745,#txt33_1b1ba745,#txt34_1b1ba745,#txt35_1b1ba745,#txt36_1b1ba745,#txt37_1b1ba745,#txt38_1b1ba745,#txt39_1b1ba745,#txt40_1b1ba745,#txt55_1b1ba745,#txt56_1b1ba745,#txt57_1b1ba745,#txt58_1b1ba745,#txt59_1b1ba745,#txt60_1b1ba745,#txt61_1b1ba745,#txt62_1b1ba745,#txt63_1b1ba745,#txt64_1b1ba745,#txt76_1b1ba745,#txt77_1b1ba745,#txt78_1b1ba745,#txt79_1b1ba745,#txt80_1b1ba745,#txt81_1b1ba745,#txt82_1b1ba745,#txt83_1b1ba745,#txt84_1b1ba745,#txt85_1b1ba745,#txt86_1b1ba745,#txt87_1b1ba745,#txt88_1b1ba745,#txt89_1b1ba745,#txt90_1b1ba745,#txt91_1b1ba745,#txt92_1b1ba745,#txt93_1b1ba745,#txt94_1b1ba745,#txt95_1b1ba745,#txt96_1b1ba745,#txt97_1b1ba745,#txt98_1b1ba745 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt16_1b1ba745 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#0000ff;}#txt17_1b1ba745,#txt18_1b1ba745,#txt19_1b1ba745,#txt20_1b1ba745,#txt21_1b1ba745,#txt22_1b1ba745,#txt23_1b1ba745,#txt24_1b1ba745,#txt25_1b1ba745,#txt26_1b1ba745,#txt27_1b1ba745 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#0000ff;}#txt41_1b1ba745 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#c00000;}#txt42_1b1ba745,#txt43_1b1ba745,#txt44_1b1ba745,#txt45_1b1ba745,#txt46_1b1ba745,#txt47_1b1ba745,#txt48_1b1ba745,#txt49_1b1ba745,#txt50_1b1ba745,#txt51_1b1ba745,#txt52_1b1ba745,#txt53_1b1ba745 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#c00000;}#txt65_1b1ba745 {font-family:fnt5; font-size:22px; line-height:25px; font-weight:bold; color:#000000;}#txt66_1b1ba745,#txt67_1b1ba745,#txt68_1b1ba745,#txt69_1b1ba745,#txt70_1b1ba745,#txt71_1b1ba745,#txt72_1b1ba745,#txt73_1b1ba745,#txt74_1b1ba745,#txt75_1b1ba745 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#000000;}#txt99_1b1ba745,#txt100_1b1ba745,#txt101_1b1ba745,#txt102_1b1ba745,#txt103_1b1ba745,#txt104_1b1ba745,#txt105_1b1ba745,#txt106_1b1ba745,#txt107_1b1ba745,#txt108_1b1ba745,#txt109_1b1ba745,#txt110_1b1ba745,#txt111_1b1ba745,#txt112_1b1ba745,#txt113_1b1ba745,#txt114_1b1ba745,#txt115_1b1ba745,#txt116_1b1ba745,#txt117_1b1ba745,#txt118_1b1ba745,#txt119_1b1ba745,#txt120_1b1ba745,#txt121_1b1ba745 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide32.js b/experiment/simulation/EE6/iframes/data/slide32.js new file mode 100644 index 0000000..392e607 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide32.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(31, '
    MOSFET As Current Limiter (Test Circuit)
    MOSFET As Current Limiter (Test Circuit)
    MOSFET As Current Limiter (Test Circuit)
    MOSFET As Current Limiter (Test Circuit)
    1. The  load  resistance  is  now  been
    decreased.  The  current,  consequently,
    increases.
    1. The  load  resistance  is  now  been
    decreased.  The  current,  consequently,
    increases.
    2. From  this  point  onwards,  the
    increment  in  the  drain  current  is  low.
    2. From  this  point  onwards,  the
    increment  in  the  drain  current  is  low.
    3. Decreasing  the  load  resistance  further
    doesn’t  change  the  current  rapidly.
    3. Decreasing  the  load  resistance  further
    doesn’t  change  the  current  rapidly.
    Current  limiting  feature:  Even  with  the
    decreasing  load  resistance,  the  current  in
    the  circuit  doesn’t  increase  rapidly  as  the
    MOSFET-switch  enters  into  saturation.
    Current  limiting  feature:  Even  with  the
    decreasing  load  resistance,  the  current  in
    the  circuit  doesn’t  increase  rapidly  as  the
    MOSFET-switch  enters  into  saturation.
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide4.css b/experiment/simulation/EE6/iframes/data/slide4.css new file mode 100644 index 0000000..5fa3905 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide4.css @@ -0,0 +1 @@ +#spr1_1b1b0a88 {clip:rect(0px,960px,540px,0px);}#spr3_1b1b0a88,#spr4_1b1b0a88,#spr5_1b1b0a88,#spr6_1b1b0a88,#spr7_1b1b0a88,#spr8_1b1b0a88,#spr12_1b1b0a88,#spr13_1b1b0a88,#spr14_1b1b0a88,#spr15_1b1b0a88,#spr16_1b1b0a88,#spr17_1b1b0a88,#spr18_1b1b0a88 {display:none;}#txt0_1b1b0a88,#txt2_1b1b0a88,#txt4_1b1b0a88,#txt6_1b1b0a88,#txt8_1b1b0a88,#txt10_1b1b0a88,#txt16_1b1b0a88 {font-family:fnt8; font-size:32px; line-height:37px; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt1_1b1b0a88 {font-family:fnt8; font-size:32px; line-height:37px; color:#254f2f;}#txt3_1b1b0a88,#txt5_1b1b0a88,#txt7_1b1b0a88,#txt9_1b1b0a88,#txt11_1b1b0a88,#txt17_1b1b0a88 {font-family:fnt8; font-size:32px; line-height:37px; color:#c00000;}#txt12_1b1b0a88 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt13_1b1b0a88 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt14_1b1b0a88 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt15_1b1b0a88 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide4.js b/experiment/simulation/EE6/iframes/data/slide4.js new file mode 100644 index 0000000..c1c0c39 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide4.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(3, '
    Metal-Oxide-Semiconductor-Field-Effect-Transistor
    Metal-Oxide-Semiconductor-Field-Effect-Transistor
    O
    O
    S
    S
    F
    F
    E
    E
    T
    T
    What is ‘MOSFET’
    What is ‘MOSFET’
    What is ‘MOSFET’
    What is ‘MOSFET’
    M
    M
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide5.css b/experiment/simulation/EE6/iframes/data/slide5.css new file mode 100644 index 0000000..34df306 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide5.css @@ -0,0 +1 @@ +#spr1_1b1b0d95 {clip:rect(0px,960px,540px,0px);}#spr4_1b1b0d95,#spr5_1b1b0d95,#spr6_1b1b0d95,#spr7_1b1b0d95,#spr8_1b1b0d95,#spr9_1b1b0d95,#spr10_1b1b0d95,#spr11_1b1b0d95,#spr12_1b1b0d95,#spr13_1b1b0d95,#spr14_1b1b0d95,#spr15_1b1b0d95,#spr16_1b1b0d95,#spr17_1b1b0d95,#spr18_1b1b0d95,#spr19_1b1b0d95,#spr20_1b1b0d95,#spr21_1b1b0d95,#spr22_1b1b0d95,#spr23_1b1b0d95,#spr24_1b1b0d95,#spr25_1b1b0d95,#spr26_1b1b0d95,#spr27_1b1b0d95,#spr28_1b1b0d95,#spr29_1b1b0d95,#spr30_1b1b0d95,#spr31_1b1b0d95,#spr35_1b1b0d95,#spr36_1b1b0d95,#spr37_1b1b0d95,#spr38_1b1b0d95 {display:none;}#txt0_1b1b0d95,#txt2_1b1b0d95,#txt4_1b1b0d95,#txt6_1b1b0d95,#txt8_1b1b0d95,#txt9_1b1b0d95,#txt12_1b1b0d95,#txt14_1b1b0d95,#txt16_1b1b0d95,#txt18_1b1b0d95,#txt20_1b1b0d95,#txt22_1b1b0d95,#txt24_1b1b0d95,#txt26_1b1b0d95 {font-family:fnt9; font-size:25px; line-height:33px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt1_1b1b0d95,#txt3_1b1b0d95,#txt5_1b1b0d95,#txt7_1b1b0d95,#txt10_1b1b0d95,#txt11_1b1b0d95,#txt13_1b1b0d95,#txt15_1b1b0d95,#txt17_1b1b0d95,#txt19_1b1b0d95,#txt21_1b1b0d95,#txt23_1b1b0d95,#txt25_1b1b0d95,#txt27_1b1b0d95 {font-family:fnt9; font-size:25px; line-height:33px; font-weight:bold; color:#ffffff;}#svg0_1b1b0d95,#svg1_1b1b0d95 {-webkit-transform-origin:6.256px 6.256px; -moz-transform-origin:6.256px 6.256px; -o-transform-origin:6.256px 6.256px; -ms-transform-origin:6.256px 6.256px; transform-origin:6.256px 6.256px; display:none;}#txt28_1b1b0d95,#txt29_1b1b0d95,#txt32_1b1b0d95 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt30_1b1b0d95,#txt31_1b1b0d95,#txt33_1b1b0d95 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#ffffff;}#txt34_1b1b0d95 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt35_1b1b0d95 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt36_1b1b0d95 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt37_1b1b0d95 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide5.js b/experiment/simulation/EE6/iframes/data/slide5.js new file mode 100644 index 0000000..e803b03 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide5.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(4, '
    Drain
    Drain
    (D)
    (D)
    Source
    Source
    (S)
    (S)
    Body
    Diode
    Body
    Diode
    Gate
    Gate
    (G)
    (G)
    Gate
    Gate
    (G)
    (G)
    Drain
    Drain
    (D)
    (D)
    Source
    Source
    (S)
    (S)
    Symbolic 
    representation
    Symbolic 
    representation
    A typical MOSFET (TO220 Package)
    A typical MOSFET (TO220 Package)
    Representation
    Representation
    Representation
    Representation
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide6.css b/experiment/simulation/EE6/iframes/data/slide6.css new file mode 100644 index 0000000..94062a9 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide6.css @@ -0,0 +1 @@ +#spr1_1b1b14e8 {clip:rect(0px,960px,540px,0px);}#txt0_1b1b14e8 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.333px rgba(0,0,0,0.133); Text-shadow:0 0 3.333px 0.01em rgba(0,0,0,0.133);}#txt1_1b1b14e8 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt2_1b1b14e8 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt3_1b1b14e8 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#spr6_1b1b14e8,#spr7_1b1b14e8,#spr8_1b1b14e8,#spr20_1b1b14e8,#spr21_1b1b14e8,#spr22_1b1b14e8,#spr23_1b1b14e8,#spr24_1b1b14e8,#spr25_1b1b14e8,#spr26_1b1b14e8,#spr27_1b1b14e8,#spr28_1b1b14e8,#spr29_1b1b14e8,#spr30_1b1b14e8,#spr31_1b1b14e8,#spr32_1b1b14e8,#spr33_1b1b14e8,#spr34_1b1b14e8,#spr35_1b1b14e8 {display:none;}#txt4_1b1b14e8,#txt5_1b1b14e8,#txt44_1b1b14e8,#txt45_1b1b14e8,#txt46_1b1b14e8,#txt48_1b1b14e8,#txt54_1b1b14e8,#txt56_1b1b14e8,#txt60_1b1b14e8,#txt61_1b1b14e8,#txt63_1b1b14e8,#txt72_1b1b14e8,#txt73_1b1b14e8,#txt74_1b1b14e8,#txt75_1b1b14e8,#txt76_1b1b14e8,#txt77_1b1b14e8,#txt80_1b1b14e8,#txt81_1b1b14e8,#txt82_1b1b14e8,#txt83_1b1b14e8,#txt84_1b1b14e8,#txt85_1b1b14e8,#txt86_1b1b14e8,#txt87_1b1b14e8,#txt88_1b1b14e8,#txt89_1b1b14e8,#txt90_1b1b14e8,#txt91_1b1b14e8,#txt114_1b1b14e8,#txt117_1b1b14e8,#txt118_1b1b14e8,#txt119_1b1b14e8,#txt120_1b1b14e8,#txt122_1b1b14e8,#txt123_1b1b14e8,#txt124_1b1b14e8,#txt137_1b1b14e8,#txt138_1b1b14e8,#txt139_1b1b14e8,#txt140_1b1b14e8,#txt141_1b1b14e8,#txt142_1b1b14e8,#txt145_1b1b14e8,#txt146_1b1b14e8,#txt147_1b1b14e8,#txt148_1b1b14e8,#txt149_1b1b14e8,#txt150_1b1b14e8,#txt151_1b1b14e8,#txt152_1b1b14e8,#txt153_1b1b14e8,#txt154_1b1b14e8,#txt157_1b1b14e8,#txt158_1b1b14e8,#txt159_1b1b14e8,#txt160_1b1b14e8,#txt161_1b1b14e8,#txt162_1b1b14e8,#txt163_1b1b14e8,#txt164_1b1b14e8,#txt165_1b1b14e8,#txt166_1b1b14e8,#txt167_1b1b14e8,#txt168_1b1b14e8,#txt169_1b1b14e8,#txt204_1b1b14e8,#txt207_1b1b14e8,#txt208_1b1b14e8,#txt209_1b1b14e8,#txt212_1b1b14e8,#txt213_1b1b14e8,#txt214_1b1b14e8,#txt217_1b1b14e8,#txt233_1b1b14e8,#txt234_1b1b14e8,#txt235_1b1b14e8,#txt236_1b1b14e8,#txt237_1b1b14e8,#txt238_1b1b14e8,#txt241_1b1b14e8,#txt242_1b1b14e8,#txt243_1b1b14e8,#txt244_1b1b14e8,#txt245_1b1b14e8,#txt246_1b1b14e8,#txt247_1b1b14e8,#txt248_1b1b14e8,#txt251_1b1b14e8,#txt252_1b1b14e8,#txt253_1b1b14e8,#txt254_1b1b14e8,#txt255_1b1b14e8,#txt256_1b1b14e8,#txt257_1b1b14e8,#txt258_1b1b14e8,#txt259_1b1b14e8,#txt260_1b1b14e8,#txt261_1b1b14e8,#txt292_1b1b14e8,#txt295_1b1b14e8,#txt296_1b1b14e8,#txt297_1b1b14e8,#txt300_1b1b14e8,#txt301_1b1b14e8,#txt302_1b1b14e8,#txt305_1b1b14e8,#txt320_1b1b14e8,#txt322_1b1b14e8,#txt323_1b1b14e8,#txt324_1b1b14e8,#txt330_1b1b14e8,#txt331_1b1b14e8 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt6_1b1b14e8,#txt7_1b1b14e8,#txt65_1b1b14e8,#txt66_1b1b14e8,#txt68_1b1b14e8,#txt94_1b1b14e8,#txt95_1b1b14e8,#txt96_1b1b14e8,#txt97_1b1b14e8,#txt98_1b1b14e8,#txt99_1b1b14e8,#txt102_1b1b14e8,#txt103_1b1b14e8,#txt104_1b1b14e8,#txt105_1b1b14e8,#txt106_1b1b14e8,#txt107_1b1b14e8,#txt108_1b1b14e8,#txt109_1b1b14e8,#txt110_1b1b14e8,#txt111_1b1b14e8,#txt112_1b1b14e8,#txt113_1b1b14e8,#txt125_1b1b14e8,#txt128_1b1b14e8,#txt129_1b1b14e8,#txt130_1b1b14e8,#txt131_1b1b14e8,#txt133_1b1b14e8,#txt134_1b1b14e8,#txt135_1b1b14e8,#txt171_1b1b14e8,#txt172_1b1b14e8,#txt173_1b1b14e8,#txt174_1b1b14e8,#txt175_1b1b14e8,#txt176_1b1b14e8,#txt179_1b1b14e8,#txt180_1b1b14e8,#txt181_1b1b14e8,#txt182_1b1b14e8,#txt183_1b1b14e8,#txt184_1b1b14e8,#txt185_1b1b14e8,#txt186_1b1b14e8,#txt187_1b1b14e8,#txt188_1b1b14e8,#txt191_1b1b14e8,#txt192_1b1b14e8,#txt193_1b1b14e8,#txt194_1b1b14e8,#txt195_1b1b14e8,#txt196_1b1b14e8,#txt197_1b1b14e8,#txt198_1b1b14e8,#txt199_1b1b14e8,#txt200_1b1b14e8,#txt201_1b1b14e8,#txt202_1b1b14e8,#txt203_1b1b14e8,#txt218_1b1b14e8,#txt221_1b1b14e8,#txt222_1b1b14e8,#txt223_1b1b14e8,#txt226_1b1b14e8,#txt227_1b1b14e8,#txt228_1b1b14e8,#txt231_1b1b14e8,#txt263_1b1b14e8,#txt264_1b1b14e8,#txt265_1b1b14e8,#txt266_1b1b14e8,#txt267_1b1b14e8,#txt268_1b1b14e8,#txt271_1b1b14e8,#txt272_1b1b14e8,#txt273_1b1b14e8,#txt274_1b1b14e8,#txt275_1b1b14e8,#txt276_1b1b14e8,#txt277_1b1b14e8,#txt278_1b1b14e8,#txt281_1b1b14e8,#txt282_1b1b14e8,#txt283_1b1b14e8,#txt284_1b1b14e8,#txt285_1b1b14e8,#txt286_1b1b14e8,#txt287_1b1b14e8,#txt288_1b1b14e8,#txt289_1b1b14e8,#txt290_1b1b14e8,#txt291_1b1b14e8,#txt306_1b1b14e8,#txt309_1b1b14e8,#txt310_1b1b14e8,#txt311_1b1b14e8,#txt314_1b1b14e8,#txt315_1b1b14e8,#txt316_1b1b14e8,#txt319_1b1b14e8,#txt325_1b1b14e8,#txt327_1b1b14e8,#txt328_1b1b14e8,#txt329_1b1b14e8,#txt332_1b1b14e8,#txt333_1b1b14e8 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:#ffffff;}#svg0_1b1b14e8,#svg1_1b1b14e8,#svg2_1b1b14e8,#svg3_1b1b14e8,#svg4_1b1b14e8,#svg5_1b1b14e8,#svg6_1b1b14e8,#svg7_1b1b14e8,#svg8_1b1b14e8,#svg9_1b1b14e8 {pointer-events:none;}#txt8_1b1b14e8,#txt9_1b1b14e8,#txt12_1b1b14e8,#txt13_1b1b14e8,#txt16_1b1b14e8,#txt17_1b1b14e8,#txt28_1b1b14e8,#txt32_1b1b14e8,#txt36_1b1b14e8,#txt38_1b1b14e8,#txt40_1b1b14e8 {font-family:fnt4; font-size:20px; line-height:23px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt10_1b1b14e8,#txt11_1b1b14e8 {font-family:fnt4; font-size:20px; line-height:23px; font-weight:bold; color:#006600;}#txt14_1b1b14e8,#txt15_1b1b14e8 {font-family:fnt4; font-size:20px; line-height:23px; font-weight:bold; color:#660066;}#txt18_1b1b14e8,#txt19_1b1b14e8 {font-family:fnt4; font-size:20px; line-height:23px; font-weight:bold; color:#a40000;}#txt20_1b1b14e8 {font-family:fnt4; font-size:13px; line-height:15px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt21_1b1b14e8 {font-family:fnt4; font-size:8.667px; line-height:10px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt22_1b1b14e8 {font-family:fnt4; font-size:13px; line-height:15px; font-weight:bold; color:#000000;}#txt23_1b1b14e8 {font-family:fnt4; font-size:8.667px; line-height:10px; font-weight:bold; color:#000000;}#txt24_1b1b14e8 {font-family:fnt4; font-size:25px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt25_1b1b14e8 {font-family:fnt4; font-size:16.667px; line-height:19px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt26_1b1b14e8 {font-family:fnt4; font-size:25px; line-height:29px; font-weight:bold; color:#000000;}#txt27_1b1b14e8 {font-family:fnt4; font-size:16.667px; line-height:19px; font-weight:bold; color:#000000;}#txt29_1b1b14e8,#txt33_1b1b14e8,#txt41_1b1b14e8 {font-family:fnt4; font-size:13.333px; line-height:15px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt30_1b1b14e8,#txt34_1b1b14e8,#txt37_1b1b14e8,#txt39_1b1b14e8,#txt42_1b1b14e8 {font-family:fnt4; font-size:20px; line-height:23px; font-weight:bold; color:#ffffff;}#txt31_1b1b14e8,#txt35_1b1b14e8,#txt43_1b1b14e8 {font-family:fnt4; font-size:13.333px; line-height:15px; font-weight:bold; color:#ffffff;}#txt47_1b1b14e8,#txt55_1b1b14e8,#txt62_1b1b14e8,#txt64_1b1b14e8,#txt121_1b1b14e8,#txt321_1b1b14e8 {font-family:fnt9; font-size:12px; line-height:16px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt49_1b1b14e8,#txt50_1b1b14e8,#txt51_1b1b14e8,#txt53_1b1b14e8,#txt57_1b1b14e8,#txt59_1b1b14e8 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:#000000;}#txt52_1b1b14e8,#txt58_1b1b14e8 {font-family:fnt9; font-size:12px; line-height:16px; font-weight:bold; color:#000000;}#txt67_1b1b14e8,#txt69_1b1b14e8,#txt132_1b1b14e8,#txt326_1b1b14e8 {font-family:fnt9; font-size:12px; line-height:16px; font-weight:bold; color:#ffffff;}#txt70_1b1b14e8,#txt71_1b1b14e8,#txt136_1b1b14e8,#txt232_1b1b14e8 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; text-decoration-line:underline; text-decoration-skip:none; text-decoration-skip-ink:none; text-decoration-thickness:1.200px; text-decoration-style:solid; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt78_1b1b14e8,#txt115_1b1b14e8,#txt143_1b1b14e8,#txt155_1b1b14e8,#txt205_1b1b14e8,#txt210_1b1b14e8,#txt215_1b1b14e8,#txt239_1b1b14e8,#txt249_1b1b14e8,#txt293_1b1b14e8,#txt298_1b1b14e8,#txt303_1b1b14e8 {font-family:fnt10; font-size:18px; line-height:24px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt79_1b1b14e8,#txt116_1b1b14e8,#txt144_1b1b14e8,#txt156_1b1b14e8,#txt206_1b1b14e8,#txt211_1b1b14e8,#txt216_1b1b14e8,#txt240_1b1b14e8,#txt250_1b1b14e8,#txt294_1b1b14e8,#txt299_1b1b14e8,#txt304_1b1b14e8 {font-family:fnt10; font-size:12px; line-height:16px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt92_1b1b14e8,#txt93_1b1b14e8,#txt170_1b1b14e8,#txt262_1b1b14e8 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; text-decoration-line:underline; text-decoration-skip:none; text-decoration-skip-ink:none; text-decoration-thickness:1.200px; text-decoration-style:solid; color:#ffffff;}#txt100_1b1b14e8,#txt126_1b1b14e8,#txt177_1b1b14e8,#txt189_1b1b14e8,#txt219_1b1b14e8,#txt224_1b1b14e8,#txt229_1b1b14e8,#txt269_1b1b14e8,#txt279_1b1b14e8,#txt307_1b1b14e8,#txt312_1b1b14e8,#txt317_1b1b14e8 {font-family:fnt10; font-size:18px; line-height:24px; font-weight:bold; font-style:italic; color:#ffffff;}#txt101_1b1b14e8,#txt127_1b1b14e8,#txt178_1b1b14e8,#txt190_1b1b14e8,#txt220_1b1b14e8,#txt225_1b1b14e8,#txt230_1b1b14e8,#txt270_1b1b14e8,#txt280_1b1b14e8,#txt308_1b1b14e8,#txt313_1b1b14e8,#txt318_1b1b14e8 {font-family:fnt10; font-size:12px; line-height:16px; font-weight:bold; font-style:italic; color:#ffffff;}#svg10_1b1b14e8,#svg11_1b1b14e8,#svg12_1b1b14e8 {-webkit-transform-origin:6.75px 6.75px; -moz-transform-origin:6.75px 6.75px; -o-transform-origin:6.75px 6.75px; -ms-transform-origin:6.75px 6.75px; transform-origin:6.75px 6.75px; display:none;}#svg14_1b1b14e8 {-webkit-transform-origin:3.375px 3.375px; -moz-transform-origin:3.375px 3.375px; -o-transform-origin:3.375px 3.375px; -ms-transform-origin:3.375px 3.375px; transform-origin:3.375px 3.375px; -webkit-transform:matrix(0.808076,-0.589078,0.589078,0.808076,0,0); -o-transform:matrix(0.808076,-0.589078,0.589078,0.808076,0,0); -ms-transform:matrix(0.808076,-0.589078,0.589078,0.808076,0,0); -moz-transform:matrix(0.808076,-0.589078,0.589078,0.808076,0,0); transform:matrix(0.808076,-0.589078,0.589078,0.808076,0,0); display:none;}#svg22_1b1b14e8 {-webkit-transform-origin:1.727px 1.57px; -moz-transform-origin:1.727px 1.57px; -o-transform-origin:1.727px 1.57px; -ms-transform-origin:1.727px 1.57px; transform-origin:1.727px 1.57px;}#svg23_1b1b14e8,#svg37_1b1b14e8 {-webkit-transform-origin:3px 1.5px; -moz-transform-origin:3px 1.5px; -o-transform-origin:3px 1.5px; -ms-transform-origin:3px 1.5px; transform-origin:3px 1.5px;}#svg36_1b1b14e8 {-webkit-transform-origin:1.594px 1.031px; -moz-transform-origin:1.594px 1.031px; -o-transform-origin:1.594px 1.031px; -ms-transform-origin:1.594px 1.031px; transform-origin:1.594px 1.031px;}#svg44_1b1b14e8,#svg53_1b1b14e8 {-webkit-transform-origin:3.375px 3.375px; -moz-transform-origin:3.375px 3.375px; -o-transform-origin:3.375px 3.375px; -ms-transform-origin:3.375px 3.375px; transform-origin:3.375px 3.375px; display:none;}#svg46_1b1b14e8 {-webkit-transform-origin:3.375px 3.375px; -moz-transform-origin:3.375px 3.375px; -o-transform-origin:3.375px 3.375px; -ms-transform-origin:3.375px 3.375px; transform-origin:3.375px 3.375px; -webkit-transform:matrix(-1,-0,0,-1,0,0); -o-transform:matrix(-1,-0,0,-1,0,0); -ms-transform:matrix(-1,-0,0,-1,0,0); -moz-transform:matrix(-1,-0,0,-1,0,0); transform:matrix(-1,-0,0,-1,0,0); display:none;}#svg47_1b1b14e8,#svg48_1b1b14e8,#svg49_1b1b14e8,#svg50_1b1b14e8,#svg51_1b1b14e8,#svg54_1b1b14e8 {-webkit-transform-origin:4.5px 4.5px; -moz-transform-origin:4.5px 4.5px; -o-transform-origin:4.5px 4.5px; -ms-transform-origin:4.5px 4.5px; transform-origin:4.5px 4.5px; display:none;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide6.js b/experiment/simulation/EE6/iframes/data/slide6.js new file mode 100644 index 0000000..b9353e9 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide6.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(5, '
    Brief Description of MOSFET
    Brief Description of MOSFET
    Brief Description of MOSFET
    Brief Description of MOSFET
    MOSFET has three terminals:
    Drain (D), Source (S), Gate (G)
    MOSFET has three terminals:
    Drain (D), Source (S), Gate (G)
    Source
    (S)
    Source
    (S)
    Gate
    (G)
    Gate
    (G)
    Drain
    (D)
    Drain
    (D)
    SiO 2
    SiO 2
    n -
    n -
    n +
    n +
    n +
    n +
    p
    p
    p
    p
    n +
    n +
    It has three layers: N-
    type doped (heavy doped
    (n + ) and lightly doped
    It has three layers: N-
    type doped (heavy doped
    (n + ) and lightly doped
    (n - )), P-type doped (p)
    (n - )), P-type doped (p)
    There are two junctions:
    p-n +  and p-n -
    There are two junctions:
    p-n +  and p-n -
    Forward     Blocking When  Drain-to-
    Source  voltage  ( v DS  is  given,  both  the
    junctions  remain  reverse  biased.
    MOSFET  doesn’t  conduct.
    Forward     Blocking When  Drain-to-
    Source  voltage  ( v DS  is  given,  both  the
    junctions  remain  reverse  biased.
    MOSFET  doesn’t  conduct.
    ( v DS   0,  v GS   0)
    ( v DS   0,  v GS   0)
    ON-state Now  again,  Drain-to-Source
    voltage  ( v DS  is  given,  with  sufficiently
    high  positive  Gate-to-Source  voltage
    ( v GS ).  MOSFET  channel  starts
    conducting  and  hence,  current  flows
    from 
    drain  to  source.
    ON-state Now  again,  Drain-to-Source
    voltage  ( v DS  is  given,  with  sufficiently
    high  positive  Gate-to-Source  voltage
    ( v GS ).  MOSFET  channel  starts
    conducting  and  hence,  current  flows
    from 
    drain  to  source.
    ( v DS   0,  v GS     V )
    ( v DS   0,  v GS     V )
    OFF-state When  the  Gate-to-Source
    voltage  ( v GS is  withdrawn  or  is  below
    threshold  ( V T ),  the  junctions  become
    reverse  biased  again  and  MOSFET
    stops  conducting.
    OFF-state When  the  Gate-to-Source
    voltage  ( v GS is  withdrawn  or  is  below
    threshold  ( V T ),  the  junctions  become
    reverse  biased  again  and  MOSFET
    stops  conducting.
    ( v DS   0,  v GS     V )
    ( v DS   0,  v GS     V )
    Silicon oxide (SiO 2 )
    provides insulation to
    the Gate
    Silicon oxide (SiO 2 )
    provides insulation to
    the Gate
    Metal
    Contacts
    Metal
    Contacts
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide7.css b/experiment/simulation/EE6/iframes/data/slide7.css new file mode 100644 index 0000000..873ffb0 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide7.css @@ -0,0 +1 @@ +#spr1_1b1b1c1c {clip:rect(0px,960px,540px,0px);}#svg18_1b1b1c1c {-webkit-transform-origin:1.5px 3px; -moz-transform-origin:1.5px 3px; -o-transform-origin:1.5px 3px; -ms-transform-origin:1.5px 3px; transform-origin:1.5px 3px;}#spr3_1b1b1c1c,#spr4_1b1b1c1c,#spr5_1b1b1c1c,#spr6_1b1b1c1c,#spr7_1b1b1c1c,#spr8_1b1b1c1c,#spr9_1b1b1c1c,#svg24_1b1b1c1c,#spr10_1b1b1c1c,#spr11_1b1b1c1c,#spr12_1b1b1c1c,#spr13_1b1b1c1c,#spr14_1b1b1c1c,#spr15_1b1b1c1c,#spr16_1b1b1c1c,#spr17_1b1b1c1c,#spr18_1b1b1c1c,#spr19_1b1b1c1c,#spr20_1b1b1c1c,#svg36_1b1b1c1c,#spr21_1b1b1c1c,#spr22_1b1b1c1c,#spr23_1b1b1c1c {display:none;}#txt0_1b1b1c1c,#txt1_1b1b1c1c,#txt2_1b1b1c1c,#txt3_1b1b1c1c,#txt4_1b1b1c1c,#txt5_1b1b1c1c,#txt6_1b1b1c1c,#txt7_1b1b1c1c,#txt10_1b1b1c1c,#txt11_1b1b1c1c,#txt12_1b1b1c1c,#txt13_1b1b1c1c,#txt14_1b1b1c1c,#txt15_1b1b1c1c,#txt18_1b1b1c1c,#txt19_1b1b1c1c,#txt20_1b1b1c1c,#txt21_1b1b1c1c,#txt22_1b1b1c1c,#txt23_1b1b1c1c,#txt24_1b1b1c1c,#txt27_1b1b1c1c,#txt56_1b1b1c1c,#txt57_1b1b1c1c,#txt58_1b1b1c1c,#txt59_1b1b1c1c,#txt60_1b1b1c1c,#txt61_1b1b1c1c,#txt62_1b1b1c1c,#txt63_1b1b1c1c,#txt66_1b1b1c1c,#txt67_1b1b1c1c,#txt68_1b1b1c1c,#txt69_1b1b1c1c,#txt70_1b1b1c1c,#txt71_1b1b1c1c,#txt74_1b1b1c1c,#txt75_1b1b1c1c,#txt76_1b1b1c1c,#txt77_1b1b1c1c,#txt78_1b1b1c1c,#txt79_1b1b1c1c,#txt80_1b1b1c1c,#txt83_1b1b1c1c,#txt112_1b1b1c1c,#txt113_1b1b1c1c,#txt114_1b1b1c1c,#txt115_1b1b1c1c,#txt146_1b1b1c1c,#txt147_1b1b1c1c,#txt148_1b1b1c1c,#txt172_1b1b1c1c,#txt173_1b1b1c1c,#txt174_1b1b1c1c,#txt175_1b1b1c1c {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt8_1b1b1c1c,#txt16_1b1b1c1c,#txt25_1b1b1c1c,#txt64_1b1b1c1c,#txt72_1b1b1c1c,#txt81_1b1b1c1c,#txt116_1b1b1c1c,#txt118_1b1b1c1c,#txt126_1b1b1c1c,#txt128_1b1b1c1c,#txt129_1b1b1c1c,#txt130_1b1b1c1c,#txt149_1b1b1c1c,#txt151_1b1b1c1c,#txt158_1b1b1c1c,#txt162_1b1b1c1c,#txt176_1b1b1c1c,#txt178_1b1b1c1c {font-family:fnt10; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt9_1b1b1c1c,#txt17_1b1b1c1c,#txt26_1b1b1c1c,#txt65_1b1b1c1c,#txt73_1b1b1c1c,#txt82_1b1b1c1c,#txt117_1b1b1c1c,#txt127_1b1b1c1c,#txt131_1b1b1c1c,#txt150_1b1b1c1c,#txt159_1b1b1c1c,#txt163_1b1b1c1c,#txt177_1b1b1c1c {font-family:fnt10; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt28_1b1b1c1c,#txt29_1b1b1c1c,#txt30_1b1b1c1c,#txt31_1b1b1c1c,#txt32_1b1b1c1c,#txt33_1b1b1c1c,#txt34_1b1b1c1c,#txt35_1b1b1c1c,#txt38_1b1b1c1c,#txt39_1b1b1c1c,#txt40_1b1b1c1c,#txt41_1b1b1c1c,#txt42_1b1b1c1c,#txt43_1b1b1c1c,#txt46_1b1b1c1c,#txt47_1b1b1c1c,#txt48_1b1b1c1c,#txt49_1b1b1c1c,#txt50_1b1b1c1c,#txt51_1b1b1c1c,#txt52_1b1b1c1c,#txt55_1b1b1c1c,#txt119_1b1b1c1c,#txt120_1b1b1c1c,#txt121_1b1b1c1c,#txt122_1b1b1c1c,#txt152_1b1b1c1c,#txt153_1b1b1c1c,#txt154_1b1b1c1c,#txt179_1b1b1c1c,#txt180_1b1b1c1c,#txt181_1b1b1c1c,#txt182_1b1b1c1c {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#0d0d0d;}#txt36_1b1b1c1c,#txt44_1b1b1c1c,#txt53_1b1b1c1c,#txt123_1b1b1c1c,#txt125_1b1b1c1c,#txt135_1b1b1c1c,#txt155_1b1b1c1c,#txt157_1b1b1c1c,#txt183_1b1b1c1c,#txt185_1b1b1c1c {font-family:fnt10; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:#0d0d0d;}#txt37_1b1b1c1c,#txt45_1b1b1c1c,#txt54_1b1b1c1c,#txt124_1b1b1c1c,#txt156_1b1b1c1c,#txt184_1b1b1c1c {font-family:fnt10; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:#0d0d0d;}#txt84_1b1b1c1c,#txt85_1b1b1c1c,#txt86_1b1b1c1c,#txt87_1b1b1c1c,#txt88_1b1b1c1c,#txt89_1b1b1c1c,#txt90_1b1b1c1c,#txt91_1b1b1c1c,#txt94_1b1b1c1c,#txt95_1b1b1c1c,#txt96_1b1b1c1c,#txt97_1b1b1c1c,#txt98_1b1b1c1c,#txt99_1b1b1c1c,#txt102_1b1b1c1c,#txt103_1b1b1c1c,#txt104_1b1b1c1c,#txt105_1b1b1c1c,#txt106_1b1b1c1c,#txt107_1b1b1c1c,#txt108_1b1b1c1c,#txt111_1b1b1c1c {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#008000;}#txt92_1b1b1c1c,#txt100_1b1b1c1c,#txt109_1b1b1c1c {font-family:fnt10; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:#008000;}#txt93_1b1b1c1c,#txt101_1b1b1c1c,#txt110_1b1b1c1c {font-family:fnt10; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:#008000;}#svg21_1b1b1c1c,#svg33_1b1b1c1c {-webkit-transform-origin:3px -0px; -moz-transform-origin:3px -0px; -o-transform-origin:3px -0px; -ms-transform-origin:3px -0px; transform-origin:3px -0px; display:none;}#svg27_1b1b1c1c,#svg28_1b1b1c1c,#svg29_1b1b1c1c,#svg39_1b1b1c1c {-webkit-transform-origin:0.375px 0.375px; -moz-transform-origin:0.375px 0.375px; -o-transform-origin:0.375px 0.375px; -ms-transform-origin:0.375px 0.375px; transform-origin:0.375px 0.375px; display:none; pointer-events:none;}#txt132_1b1b1c1c,#txt134_1b1b1c1c,#txt136_1b1b1c1c,#txt160_1b1b1c1c,#txt164_1b1b1c1c {font-family:fnt10; font-size:22px; line-height:29px; font-weight:bold; font-style:italic; color:#ff0000;}#txt133_1b1b1c1c,#txt137_1b1b1c1c,#txt161_1b1b1c1c,#txt165_1b1b1c1c {font-family:fnt10; font-size:14.667px; line-height:20px; font-weight:bold; font-style:italic; color:#ff0000;}#txt138_1b1b1c1c,#txt142_1b1b1c1c,#txt166_1b1b1c1c {font-family:fnt10; font-size:25px; line-height:33px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt139_1b1b1c1c,#txt143_1b1b1c1c,#txt167_1b1b1c1c {font-family:fnt10; font-size:16.667px; line-height:22px; font-weight:bold; font-style:italic; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt140_1b1b1c1c,#txt144_1b1b1c1c,#txt168_1b1b1c1c,#txt170_1b1b1c1c {font-family:fnt10; font-size:25px; line-height:33px; font-weight:bold; font-style:italic; color:#203864;}#txt141_1b1b1c1c,#txt145_1b1b1c1c,#txt169_1b1b1c1c,#txt171_1b1b1c1c {font-family:fnt10; font-size:16.667px; line-height:22px; font-weight:bold; font-style:italic; color:#203864;}#svg30_1b1b1c1c {-webkit-transform-origin:3px 1.5px; -moz-transform-origin:3px 1.5px; -o-transform-origin:3px 1.5px; -ms-transform-origin:3px 1.5px; transform-origin:3px 1.5px;}#txt186_1b1b1c1c {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt187_1b1b1c1c {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt188_1b1b1c1c {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt189_1b1b1c1c {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide7.js b/experiment/simulation/EE6/iframes/data/slide7.js new file mode 100644 index 0000000..957dc26 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide7.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(6, '
    1. Output Characteristics
    2. Transfer Characteristics
    It  is  the  tracing  of  drain  current  ( I profile
    against  drain-to-source  voltage  ( V DS  for  a
    fixed  gate-to-source  voltage  ( V GS  ).
    It  is  the  tracing  of  drain  current  ( I profile
    against  drain-to-source  voltage  ( V DS  for  a
    fixed  gate-to-source  voltage  ( V GS  ).
    It  is  the  tracing  of  drain  current  ( I profile
    against  gate-to-source  voltage  ( V GS  for  a
    fixed  drain-to-source  voltage  ( V DS  ).
    It  is  the  tracing  of  drain  current  ( I profile
    against  gate-to-source  voltage  ( V GS  for  a
    fixed  drain-to-source  voltage  ( V DS  ).
    For  particular  V GS
    For  particular  V GS
    V GS_2   >  V GS_1
    V GS_2   >  V GS_1
    V DS
    V DS
    I D
    I D
    For  another  V GS
    For  another  V GS
    V GS_2
    V GS_2
    V GS_1
    V GS_1
    V GS
    V GS
    I D
    For  given  V DS
    For  given  V DS
    Characteristics Of MOSFET
    Characteristics Of MOSFET
    Characteristics Of MOSFET
    Characteristics Of MOSFET
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide8.css b/experiment/simulation/EE6/iframes/data/slide8.css new file mode 100644 index 0000000..9e7e0da --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide8.css @@ -0,0 +1 @@ +#spr1_1b1b1f19 {clip:rect(0px,960px,540px,0px);}#spr4_1b1b1f19,#spr5_1b1b1f19,#spr9_1b1b1f19 {display:none;}#txt0_1b1b1f19,#txt1_1b1b1f19,#txt2_1b1b1f19,#txt3_1b1b1f19,#txt4_1b1b1f19,#txt5_1b1b1f19,#txt6_1b1b1f19,#txt7_1b1b1f19,#txt8_1b1b1f19,#txt9_1b1b1f19,#txt20_1b1b1f19,#txt21_1b1b1f19,#txt22_1b1b1f19,#txt23_1b1b1f19,#txt24_1b1b1f19,#txt25_1b1b1f19,#txt26_1b1b1f19,#txt27_1b1b1f19,#txt28_1b1b1f19,#txt29_1b1b1f19,#txt30_1b1b1f19,#txt31_1b1b1f19,#txt32_1b1b1f19,#txt33_1b1b1f19,#txt34_1b1b1f19,#txt35_1b1b1f19,#txt36_1b1b1f19,#txt37_1b1b1f19,#txt38_1b1b1f19,#txt39_1b1b1f19,#txt40_1b1b1f19,#txt41_1b1b1f19 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt10_1b1b1f19,#txt11_1b1b1f19,#txt12_1b1b1f19,#txt13_1b1b1f19,#txt14_1b1b1f19,#txt15_1b1b1f19,#txt16_1b1b1f19,#txt17_1b1b1f19,#txt18_1b1b1f19,#txt19_1b1b1f19 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#003300;}#txt42_1b1b1f19,#txt43_1b1b1f19,#txt44_1b1b1f19,#txt45_1b1b1f19,#txt46_1b1b1f19,#txt47_1b1b1f19,#txt48_1b1b1f19,#txt49_1b1b1f19,#txt50_1b1b1f19,#txt51_1b1b1f19,#txt52_1b1b1f19,#txt53_1b1b1f19,#txt54_1b1b1f19,#txt55_1b1b1f19,#txt56_1b1b1f19,#txt57_1b1b1f19,#txt58_1b1b1f19,#txt59_1b1b1f19,#txt60_1b1b1f19,#txt61_1b1b1f19,#txt62_1b1b1f19,#txt63_1b1b1f19 {font-family:fnt9; font-size:22px; line-height:29px; font-weight:bold; color:#ff0066;}#txt64_1b1b1f19 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 3.833px rgba(0,0,0,0.318); Text-shadow:0 0 3.833px 0.01em rgba(0,0,0,0.318);}#txt65_1b1b1f19 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.333px rgba(0,0,0,0.318); Text-shadow:0 0 2.333px 0.01em rgba(0,0,0,0.318);}#txt66_1b1b1f19 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2.667px #000000; Text-shadow:0 0 2.667px 0.01em #000000;}#txt67_1b1b1f19 {font-family:fnt4; font-size:24px; line-height:28px; font-weight:bold; color:#ffffff;}#svg0_1b1b1f19,#svg1_1b1b1f19 {-webkit-transform-origin:0.375px 0.375px; -moz-transform-origin:0.375px 0.375px; -o-transform-origin:0.375px 0.375px; -ms-transform-origin:0.375px 0.375px; transform-origin:0.375px 0.375px;}#svg2_1b1b1f19 {-webkit-transform-origin:1.15px 2.3px; -moz-transform-origin:1.15px 2.3px; -o-transform-origin:1.15px 2.3px; -ms-transform-origin:1.15px 2.3px; transform-origin:1.15px 2.3px;}#svg8_1b1b1f19 {-webkit-transform-origin:4.5px 2.25px; -moz-transform-origin:4.5px 2.25px; -o-transform-origin:4.5px 2.25px; -ms-transform-origin:4.5px 2.25px; transform-origin:4.5px 2.25px;}#svg14_1b1b1f19 {-webkit-transform-origin:2.793px 3.825px; -moz-transform-origin:2.793px 3.825px; -o-transform-origin:2.793px 3.825px; -ms-transform-origin:2.793px 3.825px; transform-origin:2.793px 3.825px;}#svg20_1b1b1f19,#svg68_1b1b1f19,#svg69_1b1b1f19,#svg70_1b1b1f19,#svg71_1b1b1f19,#svg72_1b1b1f19 {pointer-events:none;}#svg21_1b1b1f19 {-webkit-transform-origin:4.97px 2.5px; -moz-transform-origin:4.97px 2.5px; -o-transform-origin:4.97px 2.5px; -ms-transform-origin:4.97px 2.5px; transform-origin:4.97px 2.5px;}#svg27_1b1b1f19 {-webkit-transform-origin:2.55px 4.502px; -moz-transform-origin:2.55px 4.502px; -o-transform-origin:2.55px 4.502px; -ms-transform-origin:2.55px 4.502px; transform-origin:2.55px 4.502px;}#svg33_1b1b1f19 {-webkit-transform-origin:5px 2.5px; -moz-transform-origin:5px 2.5px; -o-transform-origin:5px 2.5px; -ms-transform-origin:5px 2.5px; transform-origin:5px 2.5px;}#svg49_1b1b1f19 {-webkit-transform-origin:2.313px 4.653px; -moz-transform-origin:2.313px 4.653px; -o-transform-origin:2.313px 4.653px; -ms-transform-origin:2.313px 4.653px; transform-origin:2.313px 4.653px;}#svg50_1b1b1f19 {-webkit-transform-origin:4.625px 2.312px; -moz-transform-origin:4.625px 2.312px; -o-transform-origin:4.625px 2.312px; -ms-transform-origin:4.625px 2.312px; transform-origin:4.625px 2.312px;}#svg56_1b1b1f19 {-webkit-transform-origin:2.745px 3.921px; -moz-transform-origin:2.745px 3.921px; -o-transform-origin:2.745px 3.921px; -ms-transform-origin:2.745px 3.921px; transform-origin:2.745px 3.921px;}#svg62_1b1b1f19 {-webkit-transform-origin:4.992px 2.5px; -moz-transform-origin:4.992px 2.5px; -o-transform-origin:4.992px 2.5px; -ms-transform-origin:4.992px 2.5px; transform-origin:4.992px 2.5px;}#txt68_1b1b1f19,#txt69_1b1b1f19,#txt72_1b1b1f19,#txt73_1b1b1f19,#txt75_1b1b1f19,#txt80_1b1b1f19,#txt81_1b1b1f19,#txt83_1b1b1f19 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt70_1b1b1f19,#txt71_1b1b1f19 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:#2a421a;}#txt74_1b1b1f19,#txt82_1b1b1f19 {font-family:fnt9; font-size:12px; line-height:16px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt76_1b1b1f19,#txt77_1b1b1f19,#txt79_1b1b1f19 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:#ff0000;}#txt78_1b1b1f19 {font-family:fnt9; font-size:12px; line-height:16px; font-weight:bold; color:#ff0000;}#txt84_1b1b1f19,#txt85_1b1b1f19,#txt87_1b1b1f19 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:#a40000;}#txt86_1b1b1f19 {font-family:fnt9; font-size:12px; line-height:16px; font-weight:bold; color:#a40000;}#txt88_1b1b1f19,#txt89_1b1b1f19,#txt92_1b1b1f19,#txt93_1b1b1f19 {font-family:fnt9; font-size:20px; line-height:27px; font-weight:bold; color:rgba(0,0,0,0); text-shadow:0 0 2px rgba(0,0,0,0.427); Text-shadow:0 0 2px 0.01em rgba(0,0,0,0.427);}#txt90_1b1b1f19,#txt91_1b1b1f19 {font-family:fnt9; font-size:20px; line-height:27px; font-weight:bold; color:#a40000;}#txt94_1b1b1f19,#txt95_1b1b1f19 {font-family:fnt9; font-size:20px; line-height:27px; font-weight:bold; color:#0000ff;}#svg73_1b1b1f19 {-webkit-transform-origin:11.783px 11.783px; -moz-transform-origin:11.783px 11.783px; -o-transform-origin:11.783px 11.783px; -ms-transform-origin:11.783px 11.783px; transform-origin:11.783px 11.783px; display:none;}#svg74_1b1b1f19 {-webkit-transform-origin:12.626px 12.626px; -moz-transform-origin:12.626px 12.626px; -o-transform-origin:12.626px 12.626px; -ms-transform-origin:12.626px 12.626px; transform-origin:12.626px 12.626px; display:none;}#txt96_1b1b1f19 {font-family:fnt9; font-size:18px; line-height:24px; font-weight:bold; color:#000000;} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide8.js b/experiment/simulation/EE6/iframes/data/slide8.js new file mode 100644 index 0000000..5dfcda7 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide8.js @@ -0,0 +1 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(7, '
    3. Switching Characteristics
    MOSFETs  are  generally  used  as
    switching  devices  in  power  converters.
    MOSFETs  are  generally  used  as
    switching  devices  in  power  converters.
    Switching  characteristics  of  MOSFET
    refers  to  its  current  and  voltage
    profiles  when  they  are  turned-  ON-to-
    OFF  and  OFF-to-ON  (during  transition).
    Switching  characteristics  of  MOSFET
    refers  to  its  current  and  voltage
    profiles  when  they  are  turned-  ON-to-
    OFF  and  OFF-to-ON  (during  transition).
    Characteristics Of MOSFET
    Characteristics Of MOSFET
    Characteristics Of MOSFET
    Characteristics Of MOSFET
    Gate
    Pulses
    Gate
    Pulses
    Switch
    Current (I SW )
    Switch
    Current (I SW )
    Switch
    Voltage (V SW )
    Switch
    Voltage (V SW )
    OFF-to-ON
    Characteristics
    OFF-to-ON
    Characteristics
    ON-to-OFF
    Characteristics
    ON-to-OFF
    Characteristics
    t
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide9.css b/experiment/simulation/EE6/iframes/data/slide9.css new file mode 100644 index 0000000..a66424e --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide9.css @@ -0,0 +1 @@ +#spr1_1b1b20fe {clip:rect(0px,960px,540px,0px);} \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/slide9.js b/experiment/simulation/EE6/iframes/data/slide9.js new file mode 100644 index 0000000..cba0815 --- /dev/null +++ b/experiment/simulation/EE6/iframes/data/slide9.js @@ -0,0 +1,2 @@ +(function(){var loadHandler=window['sl_{5B23B3C0-4052-4088-9016-36B1A5DB4FBC}'];loadHandler&&loadHandler(8, '
    Instruments\
+Required
    ', '{"s":[]}');})(); \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/data/thmb1.png b/experiment/simulation/EE6/iframes/data/thmb1.png new file mode 100644 index 0000000..66cc779 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb1.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb10.png b/experiment/simulation/EE6/iframes/data/thmb10.png new file mode 100644 index 0000000..b11bba4 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb10.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb11.png b/experiment/simulation/EE6/iframes/data/thmb11.png new file mode 100644 index 0000000..57f516a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb11.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb12.png b/experiment/simulation/EE6/iframes/data/thmb12.png new file mode 100644 index 0000000..1601b6c Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb12.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb13.png b/experiment/simulation/EE6/iframes/data/thmb13.png new file mode 100644 index 0000000..3367c3c Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb13.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb14.png b/experiment/simulation/EE6/iframes/data/thmb14.png new file mode 100644 index 0000000..974a777 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb14.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb15.png b/experiment/simulation/EE6/iframes/data/thmb15.png new file mode 100644 index 0000000..a24cebb Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb15.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb16.png b/experiment/simulation/EE6/iframes/data/thmb16.png new file mode 100644 index 0000000..bd48ea9 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb16.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb17.png b/experiment/simulation/EE6/iframes/data/thmb17.png new file mode 100644 index 0000000..ce07cf8 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb17.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb18.png b/experiment/simulation/EE6/iframes/data/thmb18.png new file mode 100644 index 0000000..1a40ff9 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb18.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb19.png b/experiment/simulation/EE6/iframes/data/thmb19.png new file mode 100644 index 0000000..15702c6 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb19.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb2.png b/experiment/simulation/EE6/iframes/data/thmb2.png new file mode 100644 index 0000000..640666f Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb2.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb20.png b/experiment/simulation/EE6/iframes/data/thmb20.png new file mode 100644 index 0000000..b00412c Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb20.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb21.png b/experiment/simulation/EE6/iframes/data/thmb21.png new file mode 100644 index 0000000..9817ed4 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb21.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb22.png b/experiment/simulation/EE6/iframes/data/thmb22.png new file mode 100644 index 0000000..c57bfb9 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb22.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb23.png b/experiment/simulation/EE6/iframes/data/thmb23.png new file mode 100644 index 0000000..3c7a170 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb23.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb24.png b/experiment/simulation/EE6/iframes/data/thmb24.png new file mode 100644 index 0000000..e810073 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb24.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb25.png b/experiment/simulation/EE6/iframes/data/thmb25.png new file mode 100644 index 0000000..b001762 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb25.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb26.png b/experiment/simulation/EE6/iframes/data/thmb26.png new file mode 100644 index 0000000..3f19a35 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb26.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb27.png b/experiment/simulation/EE6/iframes/data/thmb27.png new file mode 100644 index 0000000..1e5c02f Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb27.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb28.png b/experiment/simulation/EE6/iframes/data/thmb28.png new file mode 100644 index 0000000..ccf3365 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb28.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb29.png b/experiment/simulation/EE6/iframes/data/thmb29.png new file mode 100644 index 0000000..593e4cb Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb29.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb3.png b/experiment/simulation/EE6/iframes/data/thmb3.png new file mode 100644 index 0000000..bcf790b Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb3.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb30.png b/experiment/simulation/EE6/iframes/data/thmb30.png new file mode 100644 index 0000000..14e4df6 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb30.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb31.png b/experiment/simulation/EE6/iframes/data/thmb31.png new file mode 100644 index 0000000..e0554f1 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb31.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb32.png b/experiment/simulation/EE6/iframes/data/thmb32.png new file mode 100644 index 0000000..9ec9fad Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb32.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb4.png b/experiment/simulation/EE6/iframes/data/thmb4.png new file mode 100644 index 0000000..c3257cc Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb4.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb5.png b/experiment/simulation/EE6/iframes/data/thmb5.png new file mode 100644 index 0000000..b487ede Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb5.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb6.png b/experiment/simulation/EE6/iframes/data/thmb6.png new file mode 100644 index 0000000..0598c25 Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb6.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb7.png b/experiment/simulation/EE6/iframes/data/thmb7.png new file mode 100644 index 0000000..adbc15c Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb7.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb8.png b/experiment/simulation/EE6/iframes/data/thmb8.png new file mode 100644 index 0000000..4420f8a Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb8.png differ diff --git a/experiment/simulation/EE6/iframes/data/thmb9.png b/experiment/simulation/EE6/iframes/data/thmb9.png new file mode 100644 index 0000000..64338be Binary files /dev/null and b/experiment/simulation/EE6/iframes/data/thmb9.png differ diff --git a/experiment/simulation/EE6/iframes/index.html b/experiment/simulation/EE6/iframes/index.html new file mode 100644 index 0000000..0042f38 --- /dev/null +++ b/experiment/simulation/EE6/iframes/index.html @@ -0,0 +1,80 @@ + + + + + MOSFET_chac_feb_24 + + + + + +
    + + +
    +
    + + + + + \ No newline at end of file diff --git a/experiment/simulation/EE6/iframes/overplayer.js b/experiment/simulation/EE6/iframes/overplayer.js new file mode 100644 index 0000000..7826fe8 --- /dev/null +++ b/experiment/simulation/EE6/iframes/overplayer.js @@ -0,0 +1,138 @@ +const overPlayer = { + trial_banner: null, + playBtn: null, + playerNextBtn: null, + headTitle: null, + sliderIsPlaying: false, + + init() { + this.trial_banner = document.querySelector(".trial_banner") + this.playBtn = document.querySelector(".play-controls-container__play-pause-button") + this.playerNextBtn = document.querySelector(".navigation-controls__button_next") + this.headTitle = document.querySelector(".info-container__title div") + + this.hideTrialBanner(); + this.updateTitle(); + + // * Hide player next btn + this.playerNextBtn.style.opacity = 0 + + // * slide is running state + localStorage.setItem("isSlideEnded",false) + + + // remove wher do you left + for(let key in localStorage){ + if(key.indexOf("ispring")!=-1){ + localStorage.removeItem(key) + break + } + } + }, + + slidePlay() { + const touchStartOn = function (el, x, y) { + var e, err; + if (x == null) { + x = 0; + } + if (y == null) { + y = 0; + } + try { + e = document.createEvent("TouchEvent"); + e.initTouchEvent("touchstart", true, true); + } catch (error) { + err = error; + try { + e = document.createEvent("UIEvent"); + e.initUIEvent("touchstart", true, true); + } catch (error) { + err = error; + e = document.createEvent("Event"); + e.initEvent("touchstart", true, true); + } + } + e.targetTouches = [ + { + pageX: x, + pageY: y, + }, + ]; + console.log(e) + return el.dispatchEvent(e); + }; + + let btn = $(this.playBtn) + let btnOffset = btn.offset() + + touchStartOn(this.playBtn, btnOffset.left + 5, btnOffset.top + 5) + }, + slidePause() {}, + hideTrialBanner() { + this.trial_banner.style.opacity = 0; + }, + updateTitle() { + this.headTitle.innerHTML = "Buck Converter"; + }, + isSlidePlaying() { + let playBtnPath = document.querySelector( + ".play-controls-container__play-pause-button svg path" + ); + // if playing then the path.d[1] == 5 else == 7 pause + // ! playing + if (playBtnPath.attributes.d.value[1] == 5) { + return true; + } + // ! pause + return false; + }, + addClassNameListener(elemId, callback) { + var elem = document.getElementById(elemId); + var lastClassName = elem.className; + window.setInterval( function() { + var className = elem.className; + if (className !== lastClassName) { + callback(); + lastClassName = className; + } + },10) + }, + onPlayBtn(){ + window.setInterval(()=>{ + let pauseBtnName = 7 + let playBtnName = 5 + let btnName = this.playBtn.firstChild.firstChild.attributes.d.value[1] + if(btnName == pauseBtnName){ + // capturing pause + console.log(btnName,"pause") + }else{ + // capturing play + console.log(btnName,"Play") + } + },1000) + }, + onSlidesEnd(){ + // * Capture the slides end + + var interval = window.setInterval(()=>{ + let isSlideEnded = localStorage.getItem("isSlideEnded") + if(isSlideEnded=="false"){ + if(this.playerNextBtn.disabled == true){ + localStorage.setItem("isSlideEnded",true) + } + }else{ + window.clearInterval(interval) + } + + },1000) + }, +}; + +overPlayer.init() +window.setTimeout(()=>{ + overPlayer.onSlidesEnd() + console.log("work") +},2000) +// overPlayer.onPlayBtn() + diff --git a/experiment/simulation/EE6/index.html b/experiment/simulation/EE6/index.html new file mode 100644 index 0000000..845c61c --- /dev/null +++ b/experiment/simulation/EE6/index.html @@ -0,0 +1,1261 @@ + + + + + + +Document + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +

    For Better User Experience, reset zoom to 100%
    (by pressing 'Ctrl + 0')
    and refresh the page (by pressing 'Ctrl + R')

    +
    + + + + +
    + + +
    +
    + +
    +
    +
    +
    +
    + + + + + + +
    +
    +
    + +
    +
    +

    Output Characteristics of IGBT

    + + +
    + +
    +Objective: +

    To Set the Beam and Slab using Flex System.

    +Apparatus Materials: +

    + Tripod Stand, CT prop, fourway head, Aluminium Beam, Timber Beam, Plywood Sheathing, Beam Forming support. +

    +
    + +
    +

    Step 1

    +

    + Calculation of cross-sectional area: +

    +
    + +
      + +
    + + +
    + + +
    + +
    +Welcome to +Foundation in Beam Formwork Experiment +of Formwork Technology in Civil Engineering Virtual + Lab +developed by Prof. K. N. Jha, Department of Civil + Engineering, IIT Delhi. +
    +
    +Prof. K. N. Jha Image +Prof. K. N. Jha +IIT Delhi +
    +
    + +
    +

    Enter your name:

    + +

    Please enter your name before start

    + +
    + + + + + + + + + + + + + + + + + + + +
    Calculations:
    Total Length(m)
    Weight(kg)
    + Cross-sectional area (mm2) +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    S.No.Vin(V)R(Ω)DV0(V)MIin(A)I0(A)P0(W)
    1
    2
    3
    4
    5
    6
    7
    8
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    VGE = 6VVGE = 7VVGE = 8VVGE = 9VVGE = 10V
    VCE(V)IC(A)IC(A)IC(A)IC(A)IC(A)
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    VCE = 50 V
    VGE(V)IC(A)
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FromP1SA2R2P2N2V1V2
    ToDA1R1N1GSDS
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FromP1SR1P2N2DVPCPA1V1v2
    ToDR2N1GSCH1CH2WireDS
    + + +
    + +
    +From +To +
    + + + + + + + + + + +
    + +
    + +
    +From +To +
    + + + + + + + + + + +
    + +
    + +
    +From +To +
    + + + + + + + + + + +
    + + + + + +
    + +
    + +
    + +

    + +
    + +
    + +
    +
    +
    +

    Question text

    + +
    +
      +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • +

      India

      +
    • +
    +
    + +
    + +
    +
    + +Certificate of Completion +
    +
    +
    +Utkarsh Sharma +
    +
    +has succesfully performed Virtaul Lab Experiment on + +Foundation in foamwork +
    +
    + +Date 10-10-2023 +
    +
    +which is developed by + VIRTUAL LABS - IIT Delhi + +
    +
    +
    + + + + + + + + + +
    + Record +
    +
    + Reset +
    +
    + Delete +
    +
    + Check Connections +
    +
    + Circuit Diagram +
    + +
    + Check +
    +
    + Reset +
    +
    + Hint +
    + + + + + + + + +arrow + +laerrow +laerrow2 +logo +man +measurearrow +measurearrow2 +redsize +speech_off_btn +speech_on_btn +talk_cloud +iit-delhi-logo + + + + + + + + +btn_connections.png +btn_connectons_completed.png +btn_instructions.png +btn_nomenclature.png + + +btn_procedure.png +btn_reset.png +btn_start_experiment.png +part_1_slide_3_compo_1_off.png +part_1_slide_3_compo_1_on.png +part_1_slide_3_compo_1_text.png +part_1_slide_3_compo_2_off.png +part_1_slide_3_compo_2_on.png +part_1_slide_3_compo_2_text.png +part_1_incomplete_connection.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +Title + +
    +
    + +
    ?
    +
    ?
    +
    ?
    +
    ?
    +
    ?
    +
    ?
    + +
    + +

    Image Box

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    +
    + +
    +
    + + +
    + +
    +
    + + + + + + + + + + + diff --git a/experiment/simulation/EE6/js/Anime.js b/experiment/simulation/EE6/js/Anime.js new file mode 100644 index 0000000..2f0eeaa --- /dev/null +++ b/experiment/simulation/EE6/js/Anime.js @@ -0,0 +1,62 @@ +const Anime = { + // time in second + fade(target,duration=1,endDelay=10,complete=null,begin=null){ + duration = duration * 1000 + endDelay = endDelay * 1000 + anime({ + targets: target, + duration: duration, + easing: "linear", + delay: 2000, + opacity: [0,1], + complete(){ + if(complete) + complete() + if(begin) + begin() + + setTimeout(()=>{ + anime({ + targets: target, + duration: duration, + easing: "linear", + opacity: 0, + }) + },endDelay) + } + }) + }, + fadeIn(target,duration=1,endDelay=10,complete=null,begin=null){ + duration = duration * 1000 + endDelay = endDelay * 1000 + anime({ + targets: target, + duration: duration, + easing: "linear", + delay: 2000, + opacity: [0,1], + complete(){ + if(complete) + complete() + if(begin) + begin() + } + }) + }, + moveLeft(target,leftPixel,duration=1,complete=null,begin=null){ + anime({ + targets: target, + easing: "easeInOutExpo", + left: leftPixel, + duration: duration*1000, + begin(){ + if(begin) + begin() + }, + complete(){ + if(complete) + complete() + } + }) + }, +} \ No newline at end of file diff --git a/experiment/simulation/EE6/js/Dom.js b/experiment/simulation/EE6/js/Dom.js new file mode 100644 index 0000000..ac17df0 --- /dev/null +++ b/experiment/simulation/EE6/js/Dom.js @@ -0,0 +1,234 @@ + +// global for document object +const get = (query) => { + return document.querySelector(query); +}; + +const getAll = (query) => { + return document.querySelectorAll(query); +}; + +class Dom { + constructor(selector) { + this.item = null; + if (selector[0] == "." || selector[0] == "#") { + this.item = get(selector); + } else if (selector instanceof HTMLElement) { + this.item = selector; + } else { + this.item = src.get(selector); + } + this.selector = selector; + // push + } + getValue(){ + return this.item.attributes['value'].value + } + setValue(val){ + this.item.attributes['value'].value = val; + } + hidden(isHidden) { + if (isHidden == false) this.item.style.visibility = "visible"; + else this.item.style.visibility = "hidden"; + } + setContent(text) { + this.item.innerHTML = text; + return this; + } + zIndex(idx) { + this.item.style.zIndex = idx; + return this; + } + opacity(val = 1) { + this.item.style.opacity = val; + return this; + } + rotate(deg) { + this.item.style.transform = `rotate(${deg}deg)`; + return this; + } + addClass(className) { + this.item.classList.add(className); + return this; + } + removeClass(className) { + this.item.classList.remove(className); + return this; + } + borderRadius(amount) { + amount += "px"; + this.styles({ + borderRadius: amount, + }); + } + scale(val = 1) { + this.item.style.scale = val; + return this; + } + get() { + return this.item; + } + set( + left = null, + top = null, + height = null, + width = null, + bottom = null, + right = null, + disp = "block" + ) { + // coordinates + this.left = left; + this.top = top; + this.bottom = bottom; + this.right = right; + this.height = height; + this.width = width; + this.item.style.opacity = 1; + this.item.style.transform = "translateX(0) translateY(0)"; + + if (this.left !== null) this.item.style.left = String(this.left) + "px"; + if (this.top !== null) this.item.style.top = String(this.top) + "px"; + if (this.bottom !== null) + this.item.style.bottom = String(this.bottom) + "px"; + if (this.right !== null) this.item.style.right = String(this.right) + "px"; + if (this.height !== null) + this.item.style.height = String(this.height) + "px"; + if (this.width !== null) this.item.style.width = String(this.width) + "px"; + this.show(disp); + return this; + } + show(disp = "block") { + //! push for every element + this.push(); + + this.item.style.display = disp; + // this.opacity(); + return this; + } + hide() { + this.item.style.display = "none"; + return this; + } + play(speed = 1) { + this.item.play(); + this.item.playbackRate = speed; + return this; + } + // for setting styles + styles(props) { + for (let property in props) { + this.item.style[property] = props[property]; + } + return this; + } + // * static elements/objects of anime + static arrayOfAnimes = []; + static arrayOfItems = []; + static animePush(animeObj) { + Dom.arrayOfAnimes.push(animeObj); + } + static resetAnimeItems() { + Dom.arrayOfAnimes = []; + } + static hideAll() { + //to empty the setCC + setCC(""); + // to delete all content of content adder menu + Scenes.items.contentAdderBox.setContent(""); + for (let i of Dom.arrayOfItems) { + i.hide(); + i.opacity(); + } + // * reset animes + for (let i of Dom.arrayOfAnimes) { + // to reset each anime after back btn pressed + i.reset(); + } + Dom.resetItems(); + } + static resetItems() { + Dom.arrayOfItems = []; + } + static setBlinkArrowRed( + isX = true, + left = null, + top = null, + height = 30, + width = null, + rotate = 0 + ) { + let blinkArrow = new Dom(".blinkArrowRed") + .set(left, top, height, width) + .rotate(rotate) + .zIndex(10000); + if (isX === -1) { + blinkArrow.hide(); + return; + } + let x = 0, + y = 0; + if (isX) { + x = 20; + } else { + y = 20; + } + var blink = anime({ + targets: blinkArrow.item, + easing: "easeInOutQuad", + opacity: 1, + translateX: x, + translateY: y, + direction: "alternate", + loop: true, + autoplay: false, + duration: 300, + }); + + return blink; + } + static setBlinkArrow( + isX = true, + left = null, + top = null, + height = 60, + width = 60, + rotate = 0 + ) { + // because we added the blinkArrow image out of the anime-main + top += 130; + let blinkArrow = new Dom(".blinkArrow") + .set(left, top, height, width) + .rotate(rotate) + .zIndex(10000); + if (isX === -1) { + blinkArrow.hide(); + return; + } + let x = 0, + y = 0; + if (isX) { + x = 20; + } else { + y = 20; + } + var blink = anime({ + targets: blinkArrow.item, + easing: "easeInOutQuad", + opacity: 1, + translateX: x, + translateY: y, + direction: "alternate", + loop: true, + autoplay: false, + duration: 300, + }); + + return blink; + } + push() { + if (this.selector != ".anime-header") Dom.arrayOfItems.push(this); + return this; + } + forMathematicalExpressionBtn = 0; + } \ No newline at end of file diff --git a/experiment/simulation/EE6/js/cables.js b/experiment/simulation/EE6/js/cables.js new file mode 100644 index 0000000..a9e77d2 --- /dev/null +++ b/experiment/simulation/EE6/js/cables.js @@ -0,0 +1,262 @@ +(function () { + // todo change this check with yours + // var yy = document.getElementById("check"); + // yy.onclick = checkk; + + // ! check + function checkk() { + if (connections.length == 0) { + alert("Please make the connections first"); + return false; + } + + if (connections.length < 6) { + alert("Wrong Connections\nPlease go through the instructions once"); + return false; + } + let isConnectionRight = false + if (connections.length >= 6) { + let matrixForCheckGraph = [ + // 0 1 2 3 4 5 6 7 8 9 10 + [0,0,0,0,0,0,0,0,0,0,0], // 0 + [0,0,0,1,0,0,0,0,0,0,0], // 1 + [0,0,0,0,0,0,1,0,1,0,0], // 2 + [0,1,0,0,0,0,0,0,0,0,0], // 3 + [0,0,0,0,0,0,0,1,0,1,0], // 4 + [0,0,0,0,0,0,0,0,0,0,1], // 5 + [0,0,1,0,0,0,0,0,1,0,0], // 6 + [0,0,0,0,1,0,0,0,0,1,0], // 7 + [0,0,1,0,0,0,1,0,0,0,0], // 8 + [0,0,0,0,1,0,0,1,0,0,0], // 9 + [0,0,0,0,0,1,0,0,0,0,0], // 10 + ] + var listDiv = []; + for (var j = 0; j < connections.length; j++) { + let pos = [connections[j].targetId,connections[j].sourceId] + listDiv.push(pos) + } + for(let i=0;i 0) { + var listDiv = []; + for (var j = 0; j < connections.length; j++) { + let pos = [connections[j].targetId,connections[j].sourceId] + listDiv.push(pos) + } + showConnectionInfo(listDiv); + } + }); + + jsPlumb.ready(function () { + var instance = jsPlumb.getInstance(); + + // suspend drawing and initialise. + instance.batch(function () { + // bind to connection/connectionDetached events, and update the list of connections on screen. + instance.bind("connection", function (info, originalEvent) { + updateConnections(info.connection); + }); + instance.bind("connectionDetached", function (info, originalEvent) { + updateConnections(info.connection, true); + }); + + instance.bind("connectionMoved", function (info, originalEvent) { + // only remove here, because a 'connection' event is also fired. + // in a future release of jsplumb this extra connection event will not + // be fired. + updateConnections(info.connection, true); + }); + + // configure some drop options for use by all endpoints. + var exampleDropOptions = { + tolerance: "touch", + hoverClass: "dropHover", + activeClass: "dragActive", + }; + let radius = 14 + var exampleEndpoint1 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "pink" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "pink", strokeWidth: 6 }, + connector: ["Bezier", { curviness: 10 }], + maxConnections: 1, + isTarget: true, + dropOptions: exampleDropOptions, + }; + var exampleEndpoint2 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "black" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "black", strokeWidth: 6 }, + connector: ["Bezier", { curviness: -50 }], + maxConnections: 3, + isTarget: true, + dropOptions: exampleDropOptions, + }; + var exampleEndpoint3 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "red" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "red", strokeWidth: 6 }, + connector: ["Bezier", { curviness: -30 }], + maxConnections: 3, + isTarget: true, + dropOptions: exampleDropOptions, + }; + var exampleEndpoint4 = { + endpoint: ["Dot", { radius: radius }], + paintStyle: { fill: "green" }, + isSource: true, + scope: "green", + connectorStyle: { stroke: "green", strokeWidth: 6 }, + connector: ["Bezier", { curviness: -50 }], + maxConnections: 1, + isTarget: true, + dropOptions: exampleDropOptions, + }; + // conn 1 + instance.addEndpoint( + "vertex1", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint1 + ); + instance.addEndpoint( + "vertex3", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint1 + ); + + // conn 2 + instance.addEndpoint( + "vertex4", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint2 + ); + instance.addEndpoint( + "vertex7", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint2 + ); + instance.addEndpoint( + "vertex9", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint2 + ); + + // conn 3 + instance.addEndpoint( + "vertex8", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint3 + ); + instance.addEndpoint( + "vertex6", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint3 + ); + instance.addEndpoint( + "vertex2", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint3 + ); + + // conn 4 + instance.addEndpoint( + "vertex10", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint4 + ); + instance.addEndpoint( + "vertex5", + { anchor: [0.75, 0, 0, -1] }, + exampleEndpoint4 + ); + /*instance.addEndpoint("vertex9", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint4); + instance.addEndpoint("vertex10", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint4); + instance.addEndpoint("vertex11", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint3); + instance.addEndpoint("vertex12", { anchor: [0.75, 0, 0, -1] }, exampleEndpoint3);*/ + + instance.draggable(jsPlumb.getSelector(".drag-drop-demo .window")); + + var hideLinks = jsPlumb.getSelector(".drag-drop-demo .hide"); + instance.on(hideLinks, "click", function (e) { + instance.toggleVisible(this.getAttribute("rel")); + jsPlumbUtil.consume(e); + }); + + var dragLinks = jsPlumb.getSelector(".drag-drop-demo .drag"); + instance.on(dragLinks, "click", function (e) { + var s = instance.toggleDraggable(this.getAttribute("rel")); + this.innerHTML = s ? "disable dragging" : "enable dragging"; + jsPlumbUtil.consume(e); + }); + + var detachLinks = jsPlumb.getSelector(".drag-drop-demo .detach"); + instance.on(detachLinks, "click", function (e) { + instance.deleteConnectionsForElement(this.getAttribute("rel")); + jsPlumbUtil.consume(e); + }); + + // ! reset + instance.on(document.getElementById("reset"), "click", function (e) { + // instance.detachEveryConnection(); + instance.deleteEveryConnection() + showConnectionInfo(""); + jsPlumbUtil.consume(e); + }); + }); + + jsPlumb.fire("jsPlumbDemoLoaded", instance); + }); + +})(); diff --git a/experiment/simulation/EE6/js/formulas.js b/experiment/simulation/EE6/js/formulas.js new file mode 100644 index 0000000..02ed671 --- /dev/null +++ b/experiment/simulation/EE6/js/formulas.js @@ -0,0 +1,108 @@ +const Formulas = { + usingMeters:{ + // ! vCE is written as vDS in every formula also + // vGE -> vGS + iD(values,colIdx,vDS_idx){ + + const + k0_values = [25,3,2.04,2.1,2.2], + x0_values = [3,3,3.4,3.5,3.5], + m_values = [0,0.5179,0.3418,0.5,1.0417], + c_values = [20,40.05,85.8,116,154.005], + l_values = [21.646,44.235,88.47,120,161], + vS_values = [4,4,6,8,6] + + colIdx = colIdx - 1 + let k0 = k0_values[colIdx], + x0 = x0_values[colIdx], + m = m_values[colIdx], + c = c_values[colIdx], + l = l_values[colIdx], + vS = vS_values[colIdx], + vCE = this.vDS(vDS_idx) + + + let ans = 0 + if(0 <= vCE && vCE <= vS){ + let upper = l + let lower = 1 + Math.exp( (-k0 * (vCE - x0)) ) + ans = upper / lower + }else + if( vCE >= vS){ + ans = m * vCE + c + } + + return Number(ans.toFixed(2)) + }, + vDS(vDS_idx){ + const vDS_values = [0,2,4,6,8,10,12,14,16,18,20] + return vDS_values[vDS_idx] + }, + }, + usingOscilloscope:{ + iD(values,colIdx,vDS_idx){ + + const + k0_values = [25,3,2.04,2.1,2.2], + x0_values = [3,3,3.4,3.5,3.5], + m_values = [0,0.5179,0.3418,0.5,1.0417], + c_values = [20,40.05,85.8,116,154.005], + l_values = [21.646,44.235,88.47,120,161], + vS_values = [4,4,6,8,6] + + colIdx = colIdx - 1 + let k0 = k0_values[colIdx], + x0 = x0_values[colIdx], + m = m_values[colIdx], + c = c_values[colIdx], + l = l_values[colIdx], + vS = vS_values[colIdx], + vCE = this.vDS(vDS_idx) + + + let ans = 0 + if(0 <= vCE && vCE <= vS){ + let upper = l + let lower = 1 + Math.exp( (-k0 * (vCE - x0)) ) + ans = upper / lower + }else + if( vCE >= vS){ + ans = m * vCE + c + } + + return Number(ans.toFixed(2)) + }, + vDS(vDS_idx){ + const vDS_values = [0,2,4,6,8,10] + return vDS_values[vDS_idx] + }, + }, + transferCharacteristics:{ + iD(values){ + let upper = 251; + let valueOfPower = (-0.9 * (values.vGS - 9)) + let lower = 1 + Math.exp(valueOfPower) + let ans = upper / lower + + return Number(ans.toFixed(2)) + }, + vDS(vDS_idx){ + const vDS_values = [0,2,4,6,8,10] + return vDS_values[vDS_idx] + }, + } +} + +let values = { + vIn:0, + vGS:0, + R:0, +} + +function updateValues(vIn,vGS,R){ + values = { + vIn:vIn, + vGS:vGS, + R:R, + } +} \ No newline at end of file diff --git a/experiment/simulation/EE6/js/graph.js b/experiment/simulation/EE6/js/graph.js new file mode 100644 index 0000000..e69de29 diff --git a/experiment/simulation/EE6/js/jsplumb.js b/experiment/simulation/EE6/js/jsplumb.js new file mode 100644 index 0000000..5c66789 --- /dev/null +++ b/experiment/simulation/EE6/js/jsplumb.js @@ -0,0 +1,15949 @@ +/** + * jsBezier + * + * Copyright (c) 2010 - 2017 jsPlumb (hello@jsplumbtoolkit.com) + * + * licensed under the MIT license. + * + * a set of Bezier curve functions that deal with Beziers, used by jsPlumb, and perhaps useful for other people. These functions work with Bezier + * curves of arbitrary degree. + * + * - functions are all in the 'jsBezier' namespace. + * + * - all input points should be in the format {x:.., y:..}. all output points are in this format too. + * + * - all input curves should be in the format [ {x:.., y:..}, {x:.., y:..}, {x:.., y:..}, {x:.., y:..} ] + * + * - 'location' as used as an input here refers to a decimal in the range 0-1 inclusive, which indicates a point some proportion along the length + * of the curve. location as output has the same format and meaning. + * + * + * Function List: + * -------------- + * + * distanceFromCurve(point, curve) + * + * Calculates the distance that the given point lies from the given Bezier. Note that it is computed relative to the center of the Bezier, + * so if you have stroked the curve with a wide pen you may wish to take that into account! The distance returned is relative to the values + * of the curve and the point - it will most likely be pixels. + * + * gradientAtPoint(curve, location) + * + * Calculates the gradient to the curve at the given location, as a decimal between 0 and 1 inclusive. + * + * gradientAtPointAlongCurveFrom (curve, location) + * + * Calculates the gradient at the point on the given curve that is 'distance' units from location. + * + * nearestPointOnCurve(point, curve) + * + * Calculates the nearest point to the given point on the given curve. The return value of this is a JS object literal, containing both the + *point's coordinates and also the 'location' of the point (see above), for example: { point:{x:551,y:150}, location:0.263365 }. + * + * pointOnCurve(curve, location) + * + * Calculates the coordinates of the point on the given Bezier curve at the given location. + * + * pointAlongCurveFrom(curve, location, distance) + * + * Calculates the coordinates of the point on the given curve that is 'distance' units from location. 'distance' should be in the same coordinate + * space as that used to construct the Bezier curve. For an HTML Canvas usage, for example, distance would be a measure of pixels. + * + * locationAlongCurveFrom(curve, location, distance) + * + * Calculates the location on the given curve that is 'distance' units from location. 'distance' should be in the same coordinate + * space as that used to construct the Bezier curve. For an HTML Canvas usage, for example, distance would be a measure of pixels. + * + * perpendicularToCurveAt(curve, location, length, distance) + * + * Calculates the perpendicular to the given curve at the given location. length is the length of the line you wish for (it will be centered + * on the point at 'location'). distance is optional, and allows you to specify a point along the path from the given location as the center of + * the perpendicular returned. The return value of this is an array of two points: [ {x:...,y:...}, {x:...,y:...} ]. + * + * + */ + + (function() { + + var root = this; + + if(typeof Math.sgn == "undefined") { + Math.sgn = function(x) { return x == 0 ? 0 : x > 0 ? 1 :-1; }; + } + + var Vectors = { + subtract : function(v1, v2) { return {x:v1.x - v2.x, y:v1.y - v2.y }; }, + dotProduct : function(v1, v2) { return (v1.x * v2.x) + (v1.y * v2.y); }, + square : function(v) { return Math.sqrt((v.x * v.x) + (v.y * v.y)); }, + scale : function(v, s) { return {x:v.x * s, y:v.y * s }; } + }, + + maxRecursion = 64, + flatnessTolerance = Math.pow(2.0,-maxRecursion-1); + + /** + * Calculates the distance that the point lies from the curve. + * + * @param point a point in the form {x:567, y:3342} + * @param curve a Bezier curve in the form [{x:..., y:...}, {x:..., y:...}, {x:..., y:...}, {x:..., y:...}]. note that this is currently + * hardcoded to assume cubiz beziers, but would be better off supporting any degree. + * @return a JS object literal containing location and distance, for example: {location:0.35, distance:10}. Location is analogous to the location + * argument you pass to the pointOnPath function: it is a ratio of distance travelled along the curve. Distance is the distance in pixels from + * the point to the curve. + */ + var _distanceFromCurve = function(point, curve) { + var candidates = [], + w = _convertToBezier(point, curve), + degree = curve.length - 1, higherDegree = (2 * degree) - 1, + numSolutions = _findRoots(w, higherDegree, candidates, 0), + v = Vectors.subtract(point, curve[0]), dist = Vectors.square(v), t = 0.0; + + for (var i = 0; i < numSolutions; i++) { + v = Vectors.subtract(point, _bezier(curve, degree, candidates[i], null, null)); + var newDist = Vectors.square(v); + if (newDist < dist) { + dist = newDist; + t = candidates[i]; + } + } + v = Vectors.subtract(point, curve[degree]); + newDist = Vectors.square(v); + if (newDist < dist) { + dist = newDist; + t = 1.0; + } + return {location:t, distance:dist}; + }; + /** + * finds the nearest point on the curve to the given point. + */ + var _nearestPointOnCurve = function(point, curve) { + var td = _distanceFromCurve(point, curve); + return {point:_bezier(curve, curve.length - 1, td.location, null, null), location:td.location}; + }; + var _convertToBezier = function(point, curve) { + var degree = curve.length - 1, higherDegree = (2 * degree) - 1, + c = [], d = [], cdTable = [], w = [], + z = [ [1.0, 0.6, 0.3, 0.1], [0.4, 0.6, 0.6, 0.4], [0.1, 0.3, 0.6, 1.0] ]; + + for (var i = 0; i <= degree; i++) c[i] = Vectors.subtract(curve[i], point); + for (var i = 0; i <= degree - 1; i++) { + d[i] = Vectors.subtract(curve[i+1], curve[i]); + d[i] = Vectors.scale(d[i], 3.0); + } + for (var row = 0; row <= degree - 1; row++) { + for (var column = 0; column <= degree; column++) { + if (!cdTable[row]) cdTable[row] = []; + cdTable[row][column] = Vectors.dotProduct(d[row], c[column]); + } + } + for (i = 0; i <= higherDegree; i++) { + if (!w[i]) w[i] = []; + w[i].y = 0.0; + w[i].x = parseFloat(i) / higherDegree; + } + var n = degree, m = degree-1; + for (var k = 0; k <= n + m; k++) { + var lb = Math.max(0, k - m), + ub = Math.min(k, n); + for (i = lb; i <= ub; i++) { + var j = k - i; + w[i+j].y += cdTable[j][i] * z[j][i]; + } + } + return w; + }; + /** + * counts how many roots there are. + */ + var _findRoots = function(w, degree, t, depth) { + var left = [], right = [], + left_count, right_count, + left_t = [], right_t = []; + + switch (_getCrossingCount(w, degree)) { + case 0 : { + return 0; + } + case 1 : { + if (depth >= maxRecursion) { + t[0] = (w[0].x + w[degree].x) / 2.0; + return 1; + } + if (_isFlatEnough(w, degree)) { + t[0] = _computeXIntercept(w, degree); + return 1; + } + break; + } + } + _bezier(w, degree, 0.5, left, right); + left_count = _findRoots(left, degree, left_t, depth+1); + right_count = _findRoots(right, degree, right_t, depth+1); + for (var i = 0; i < left_count; i++) t[i] = left_t[i]; + for (var i = 0; i < right_count; i++) t[i+left_count] = right_t[i]; + return (left_count+right_count); + }; + var _getCrossingCount = function(curve, degree) { + var n_crossings = 0, sign, old_sign; + sign = old_sign = Math.sgn(curve[0].y); + for (var i = 1; i <= degree; i++) { + sign = Math.sgn(curve[i].y); + if (sign != old_sign) n_crossings++; + old_sign = sign; + } + return n_crossings; + }; + var _isFlatEnough = function(curve, degree) { + var error, + intercept_1, intercept_2, left_intercept, right_intercept, + a, b, c, det, dInv, a1, b1, c1, a2, b2, c2; + a = curve[0].y - curve[degree].y; + b = curve[degree].x - curve[0].x; + c = curve[0].x * curve[degree].y - curve[degree].x * curve[0].y; + + var max_distance_above, max_distance_below; + max_distance_above = max_distance_below = 0.0; + + for (var i = 1; i < degree; i++) { + var value = a * curve[i].x + b * curve[i].y + c; + if (value > max_distance_above) + max_distance_above = value; + else if (value < max_distance_below) + max_distance_below = value; + } + + a1 = 0.0; b1 = 1.0; c1 = 0.0; a2 = a; b2 = b; + c2 = c - max_distance_above; + det = a1 * b2 - a2 * b1; + dInv = 1.0/det; + intercept_1 = (b1 * c2 - b2 * c1) * dInv; + a2 = a; b2 = b; c2 = c - max_distance_below; + det = a1 * b2 - a2 * b1; + dInv = 1.0/det; + intercept_2 = (b1 * c2 - b2 * c1) * dInv; + left_intercept = Math.min(intercept_1, intercept_2); + right_intercept = Math.max(intercept_1, intercept_2); + error = right_intercept - left_intercept; + return (error < flatnessTolerance)? 1 : 0; + }; + var _computeXIntercept = function(curve, degree) { + var XLK = 1.0, YLK = 0.0, + XNM = curve[degree].x - curve[0].x, YNM = curve[degree].y - curve[0].y, + XMK = curve[0].x - 0.0, YMK = curve[0].y - 0.0, + det = XNM*YLK - YNM*XLK, detInv = 1.0/det, + S = (XNM*YMK - YNM*XMK) * detInv; + return 0.0 + XLK * S; + }; + var _bezier = function(curve, degree, t, left, right) { + var temp = [[]]; + for (var j =0; j <= degree; j++) temp[0][j] = curve[j]; + for (var i = 1; i <= degree; i++) { + for (var j =0 ; j <= degree - i; j++) { + if (!temp[i]) temp[i] = []; + if (!temp[i][j]) temp[i][j] = {}; + temp[i][j].x = (1.0 - t) * temp[i-1][j].x + t * temp[i-1][j+1].x; + temp[i][j].y = (1.0 - t) * temp[i-1][j].y + t * temp[i-1][j+1].y; + } + } + if (left != null) + for (j = 0; j <= degree; j++) left[j] = temp[j][0]; + if (right != null) + for (j = 0; j <= degree; j++) right[j] = temp[degree-j][j]; + + return (temp[degree][0]); + }; + + var _curveFunctionCache = {}; + var _getCurveFunctions = function(order) { + var fns = _curveFunctionCache[order]; + if (!fns) { + fns = []; + var f_term = function() { return function(t) { return Math.pow(t, order); }; }, + l_term = function() { return function(t) { return Math.pow((1-t), order); }; }, + c_term = function(c) { return function(t) { return c; }; }, + t_term = function() { return function(t) { return t; }; }, + one_minus_t_term = function() { return function(t) { return 1-t; }; }, + _termFunc = function(terms) { + return function(t) { + var p = 1; + for (var i = 0; i < terms.length; i++) p = p * terms[i](t); + return p; + }; + }; + + fns.push(new f_term()); // first is t to the power of the curve order + for (var i = 1; i < order; i++) { + var terms = [new c_term(order)]; + for (var j = 0 ; j < (order - i); j++) terms.push(new t_term()); + for (var j = 0 ; j < i; j++) terms.push(new one_minus_t_term()); + fns.push(new _termFunc(terms)); + } + fns.push(new l_term()); // last is (1-t) to the power of the curve order + + _curveFunctionCache[order] = fns; + } + + return fns; + }; + + + /** + * calculates a point on the curve, for a Bezier of arbitrary order. + * @param curve an array of control points, eg [{x:10,y:20}, {x:50,y:50}, {x:100,y:100}, {x:120,y:100}]. For a cubic bezier this should have four points. + * @param location a decimal indicating the distance along the curve the point should be located at. this is the distance along the curve as it travels, taking the way it bends into account. should be a number from 0 to 1, inclusive. + */ + var _pointOnPath = function(curve, location) { + var cc = _getCurveFunctions(curve.length - 1), + _x = 0, _y = 0; + for (var i = 0; i < curve.length ; i++) { + _x = _x + (curve[i].x * cc[i](location)); + _y = _y + (curve[i].y * cc[i](location)); + } + + return {x:_x, y:_y}; + }; + + var _dist = function(p1,p2) { + return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2)); + }; + + var _isPoint = function(curve) { + return curve[0].x === curve[1].x && curve[0].y === curve[1].y; + }; + + /** + * finds the point that is 'distance' along the path from 'location'. this method returns both the x,y location of the point and also + * its 'location' (proportion of travel along the path); the method below - _pointAlongPathFrom - calls this method and just returns the + * point. + */ + var _pointAlongPath = function(curve, location, distance) { + + if (_isPoint(curve)) { + return { + point:curve[0], + location:location + }; + } + + var prev = _pointOnPath(curve, location), + tally = 0, + curLoc = location, + direction = distance > 0 ? 1 : -1, + cur = null; + + while (tally < Math.abs(distance)) { + curLoc += (0.005 * direction); + cur = _pointOnPath(curve, curLoc); + tally += _dist(cur, prev); + prev = cur; + } + + return {point:cur, location:curLoc}; + }; + + var _length = function(curve) { + + var d = new Date().getTime(); + + if (_isPoint(curve)) return 0; + + var prev = _pointOnPath(curve, 0), + tally = 0, + curLoc = 0, + direction = 1, + cur = null; + + while (curLoc < 1) { + curLoc += (0.005 * direction); + cur = _pointOnPath(curve, curLoc); + tally += _dist(cur, prev); + prev = cur; + } + console.log("length", new Date().getTime() - d); + + return tally; + }; + + /** + * finds the point that is 'distance' along the path from 'location'. + */ + var _pointAlongPathFrom = function(curve, location, distance) { + return _pointAlongPath(curve, location, distance).point; + }; + + /** + * finds the location that is 'distance' along the path from 'location'. + */ + var _locationAlongPathFrom = function(curve, location, distance) { + return _pointAlongPath(curve, location, distance).location; + }; + + /** + * returns the gradient of the curve at the given location, which is a decimal between 0 and 1 inclusive. + * + * thanks // http://bimixual.org/AnimationLibrary/beziertangents.html + */ + var _gradientAtPoint = function(curve, location) { + + var p1 = _pointOnPath(curve, location), + p2 = _pointOnPath(curve.slice(0, curve.length - 1), location), + dy = p2.y - p1.y, dx = p2.x - p1.x; + + return dy === 0 ? Infinity : Math.atan(dy / dx); + }; + + /** + returns the gradient of the curve at the point which is 'distance' from the given location. + if this point is greater than location 1, the gradient at location 1 is returned. + if this point is less than location 0, the gradient at location 0 is returned. + */ + var _gradientAtPointAlongPathFrom = function(curve, location, distance) { + var p = _pointAlongPath(curve, location, distance); + if (p.location > 1) p.location = 1; + if (p.location < 0) p.location = 0; + return _gradientAtPoint(curve, p.location); + }; + + /** + * calculates a line that is 'length' pixels long, perpendicular to, and centered on, the path at 'distance' pixels from the given location. + * if distance is not supplied, the perpendicular for the given location is computed (ie. we set distance to zero). + */ + var _perpendicularToPathAt = function(curve, location, length, distance) { + distance = distance == null ? 0 : distance; + var p = _pointAlongPath(curve, location, distance), + m = _gradientAtPoint(curve, p.location), + _theta2 = Math.atan(-1 / m), + y = length / 2 * Math.sin(_theta2), + x = length / 2 * Math.cos(_theta2); + return [{x:p.point.x + x, y:p.point.y + y}, {x:p.point.x - x, y:p.point.y - y}]; + }; + + /** + * Calculates all intersections of the given line with the given curve. + * @param x1 + * @param y1 + * @param x2 + * @param y2 + * @param curve + * @returns {Array} + */ + var _lineIntersection = function(x1, y1, x2, y2, curve) { + var a = y2 - y1, + b = x1 - x2, + c = (x1 * (y1 - y2)) + (y1 * (x2-x1)), + coeffs = _computeCoefficients(curve), + p = [ + (a*coeffs[0][0]) + (b * coeffs[1][0]), + (a*coeffs[0][1])+(b*coeffs[1][1]), + (a*coeffs[0][2])+(b*coeffs[1][2]), + (a*coeffs[0][3])+(b*coeffs[1][3]) + c + ], + r = _cubicRoots.apply(null, p), + intersections = []; + + if (r != null) { + + for (var i = 0; i < 3; i++) { + var t = r[i], + t2 = Math.pow(t, 2), + t3 = Math.pow(t, 3), + x = [ + (coeffs[0][0] * t3) + (coeffs[0][1] * t2) + (coeffs[0][2] * t) + coeffs[0][3], + (coeffs[1][0] * t3) + (coeffs[1][1] * t2) + (coeffs[1][2] * t) + coeffs[1][3] + ]; + + // check bounds of the line + var s; + if ((x2 - x1) !== 0) { + s = (x[0] - x1) / (x2 - x1); + } + else { + s = (x[1] - y1) / (y2 - y1); + } + + if (t >= 0 && t <= 1.0 && s >= 0 && s <= 1.0) { + intersections.push(x); + } + } + } + + return intersections; + }; + + /** + * Calculates all intersections of the given box with the given curve. + * @param x X position of top left corner of box + * @param y Y position of top left corner of box + * @param w width of box + * @param h height of box + * @param curve + * @returns {Array} + */ + var _boxIntersection = function(x, y, w, h, curve) { + var i = []; + i.push.apply(i, _lineIntersection(x, y, x + w, y, curve)); + i.push.apply(i, _lineIntersection(x + w, y, x + w, y + h, curve)); + i.push.apply(i, _lineIntersection(x + w, y + h, x, y + h, curve)); + i.push.apply(i, _lineIntersection(x, y + h, x, y, curve)); + return i; + }; + + /** + * Calculates all intersections of the given bounding box with the given curve. + * @param boundingBox Bounding box, in { x:.., y:..., w:..., h:... } format. + * @param curve + * @returns {Array} + */ + var _boundingBoxIntersection = function(boundingBox, curve) { + var i = []; + i.push.apply(i, _lineIntersection(boundingBox.x, boundingBox.y, boundingBox.x + boundingBox.w, boundingBox.y, curve)); + i.push.apply(i, _lineIntersection(boundingBox.x + boundingBox.w, boundingBox.y, boundingBox.x + boundingBox.w, boundingBox.y + boundingBox.h, curve)); + i.push.apply(i, _lineIntersection(boundingBox.x + boundingBox.w, boundingBox.y + boundingBox.h, boundingBox.x, boundingBox.y + boundingBox.h, curve)); + i.push.apply(i, _lineIntersection(boundingBox.x, boundingBox.y + boundingBox.h, boundingBox.x, boundingBox.y, curve)); + return i; + }; + + + function _computeCoefficientsForAxis(curve, axis) { + return [ + -(curve[0][axis]) + (3*curve[1][axis]) + (-3 * curve[2][axis]) + curve[3][axis], + (3*(curve[0][axis])) - (6*(curve[1][axis])) + (3*(curve[2][axis])), + -3*curve[0][axis] + 3*curve[1][axis], + curve[0][axis] + ]; + } + + function _computeCoefficients(curve) + { + return [ + _computeCoefficientsForAxis(curve, "x"), + _computeCoefficientsForAxis(curve, "y") + ]; + } + + function sgn(x) { + return x < 0 ? -1 : x > 0 ? 1 : 0; + } + + function _cubicRoots(a, b, c, d) { + var A = b / a, + B = c / a, + C = d / a, + Q = (3*B - Math.pow(A, 2))/9, + R = (9*A*B - 27*C - 2*Math.pow(A, 3))/54, + D = Math.pow(Q, 3) + Math.pow(R, 2), + S, + T, + t = []; + + if (D >= 0) // complex or duplicate roots + { + S = sgn(R + Math.sqrt(D))*Math.pow(Math.abs(R + Math.sqrt(D)),(1/3)); + T = sgn(R - Math.sqrt(D))*Math.pow(Math.abs(R - Math.sqrt(D)),(1/3)); + + t[0] = -A/3 + (S + T); + t[1] = -A/3 - (S + T)/2; + t[2] = -A/3 - (S + T)/2; + + /*discard complex roots*/ + if (Math.abs(Math.sqrt(3)*(S - T)/2) !== 0) { + t[1] = -1; + t[2] = -1; + } + } + else // distinct real roots + { + var th = Math.acos(R/Math.sqrt(-Math.pow(Q, 3))); + t[0] = 2*Math.sqrt(-Q)*Math.cos(th/3) - A/3; + t[1] = 2*Math.sqrt(-Q)*Math.cos((th + 2*Math.PI)/3) - A/3; + t[2] = 2*Math.sqrt(-Q)*Math.cos((th + 4*Math.PI)/3) - A/3; + } + + // discard out of spec roots + for (var i = 0; i < 3; i++) { + if (t[i] < 0 || t[i] > 1.0) { + t[i] = -1; + } + } + + return t; + } + + var jsBezier = this.jsBezier = { + distanceFromCurve : _distanceFromCurve, + gradientAtPoint : _gradientAtPoint, + gradientAtPointAlongCurveFrom : _gradientAtPointAlongPathFrom, + nearestPointOnCurve : _nearestPointOnCurve, + pointOnCurve : _pointOnPath, + pointAlongCurveFrom : _pointAlongPathFrom, + perpendicularToCurveAt : _perpendicularToPathAt, + locationAlongCurveFrom:_locationAlongPathFrom, + getLength:_length, + lineIntersection:_lineIntersection, + boxIntersection:_boxIntersection, + boundingBoxIntersection:_boundingBoxIntersection, + version:"0.9.0" + }; + + if (typeof exports !== "undefined") { + exports.jsBezier = jsBezier; + } + +}).call(typeof window !== 'undefined' ? window : this); + +/** + * Biltong v0.4.0 + * + * Various geometry functions written as part of jsPlumb and perhaps useful for others. + * + * Copyright (c) 2017 jsPlumb + * https://jsplumbtoolkit.com + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +;(function() { + + "use strict"; + var root = this; + + var Biltong = root.Biltong = { + version:"0.4.0" + }; + + if (typeof exports !== "undefined") { + exports.Biltong = Biltong; + } + + var _isa = function(a) { return Object.prototype.toString.call(a) === "[object Array]"; }, + _pointHelper = function(p1, p2, fn) { + p1 = _isa(p1) ? p1 : [p1.x, p1.y]; + p2 = _isa(p2) ? p2 : [p2.x, p2.y]; + return fn(p1, p2); + }, + /** + * @name Biltong.gradient + * @function + * @desc Calculates the gradient of a line between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The gradient of a line between the two points. + */ + _gradient = Biltong.gradient = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + if (_p2[0] == _p1[0]) + return _p2[1] > _p1[1] ? Infinity : -Infinity; + else if (_p2[1] == _p1[1]) + return _p2[0] > _p1[0] ? 0 : -0; + else + return (_p2[1] - _p1[1]) / (_p2[0] - _p1[0]); + }); + }, + /** + * @name Biltong.normal + * @function + * @desc Calculates the gradient of a normal to a line between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The gradient of a normal to a line between the two points. + */ + _normal = Biltong.normal = function(p1, p2) { + return -1 / _gradient(p1, p2); + }, + /** + * @name Biltong.lineLength + * @function + * @desc Calculates the length of a line between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The length of a line between the two points. + */ + _lineLength = Biltong.lineLength = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + return Math.sqrt(Math.pow(_p2[1] - _p1[1], 2) + Math.pow(_p2[0] - _p1[0], 2)); + }); + }, + /** + * @name Biltong.quadrant + * @function + * @desc Calculates the quadrant in which the angle between the two points lies. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Integer} The quadrant - 1 for upper right, 2 for lower right, 3 for lower left, 4 for upper left. + */ + _quadrant = Biltong.quadrant = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + if (_p2[0] > _p1[0]) { + return (_p2[1] > _p1[1]) ? 2 : 1; + } + else if (_p2[0] == _p1[0]) { + return _p2[1] > _p1[1] ? 2 : 1; + } + else { + return (_p2[1] > _p1[1]) ? 3 : 4; + } + }); + }, + /** + * @name Biltong.theta + * @function + * @desc Calculates the angle between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The angle between the two points. + */ + _theta = Biltong.theta = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + var m = _gradient(_p1, _p2), + t = Math.atan(m), + s = _quadrant(_p1, _p2); + if ((s == 4 || s== 3)) t += Math.PI; + if (t < 0) t += (2 * Math.PI); + + return t; + }); + }, + /** + * @name Biltong.intersects + * @function + * @desc Calculates whether or not the two rectangles intersect. + * @param {Rectangle} r1 First rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @param {Rectangle} r2 Second rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @return {Boolean} True if the rectangles intersect, false otherwise. + */ + _intersects = Biltong.intersects = function(r1, r2) { + var x1 = r1.x, x2 = r1.x + r1.w, y1 = r1.y, y2 = r1.y + r1.h, + a1 = r2.x, a2 = r2.x + r2.w, b1 = r2.y, b2 = r2.y + r2.h; + + return ( (x1 <= a1 && a1 <= x2) && (y1 <= b1 && b1 <= y2) ) || + ( (x1 <= a2 && a2 <= x2) && (y1 <= b1 && b1 <= y2) ) || + ( (x1 <= a1 && a1 <= x2) && (y1 <= b2 && b2 <= y2) ) || + ( (x1 <= a2 && a1 <= x2) && (y1 <= b2 && b2 <= y2) ) || + ( (a1 <= x1 && x1 <= a2) && (b1 <= y1 && y1 <= b2) ) || + ( (a1 <= x2 && x2 <= a2) && (b1 <= y1 && y1 <= b2) ) || + ( (a1 <= x1 && x1 <= a2) && (b1 <= y2 && y2 <= b2) ) || + ( (a1 <= x2 && x1 <= a2) && (b1 <= y2 && y2 <= b2) ); + }, + /** + * @name Biltong.encloses + * @function + * @desc Calculates whether or not r2 is completely enclosed by r1. + * @param {Rectangle} r1 First rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @param {Rectangle} r2 Second rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @param {Boolean} [allowSharedEdges=false] If true, the concept of enclosure allows for one or more edges to be shared by the two rectangles. + * @return {Boolean} True if r1 encloses r2, false otherwise. + */ + _encloses = Biltong.encloses = function(r1, r2, allowSharedEdges) { + var x1 = r1.x, x2 = r1.x + r1.w, y1 = r1.y, y2 = r1.y + r1.h, + a1 = r2.x, a2 = r2.x + r2.w, b1 = r2.y, b2 = r2.y + r2.h, + c = function(v1, v2, v3, v4) { return allowSharedEdges ? v1 <= v2 && v3>= v4 : v1 < v2 && v3 > v4; }; + + return c(x1,a1,x2,a2) && c(y1,b1,y2,b2); + }, + _segmentMultipliers = [null, [1, -1], [1, 1], [-1, 1], [-1, -1] ], + _inverseSegmentMultipliers = [null, [-1, -1], [-1, 1], [1, 1], [1, -1] ], + /** + * @name Biltong.pointOnLine + * @function + * @desc Calculates a point on the line from `fromPoint` to `toPoint` that is `distance` units along the length of the line. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Point} Point on the line, in the form `{ x:..., y:... }`. + */ + _pointOnLine = Biltong.pointOnLine = function(fromPoint, toPoint, distance) { + var m = _gradient(fromPoint, toPoint), + s = _quadrant(fromPoint, toPoint), + segmentMultiplier = distance > 0 ? _segmentMultipliers[s] : _inverseSegmentMultipliers[s], + theta = Math.atan(m), + y = Math.abs(distance * Math.sin(theta)) * segmentMultiplier[1], + x = Math.abs(distance * Math.cos(theta)) * segmentMultiplier[0]; + return { x:fromPoint.x + x, y:fromPoint.y + y }; + }, + /** + * @name Biltong.perpendicularLineTo + * @function + * @desc Calculates a line of length `length` that is perpendicular to the line from `fromPoint` to `toPoint` and passes through `toPoint`. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Line} Perpendicular line, in the form `[ { x:..., y:... }, { x:..., y:... } ]`. + */ + _perpendicularLineTo = Biltong.perpendicularLineTo = function(fromPoint, toPoint, length) { + var m = _gradient(fromPoint, toPoint), + theta2 = Math.atan(-1 / m), + y = length / 2 * Math.sin(theta2), + x = length / 2 * Math.cos(theta2); + return [{x:toPoint.x + x, y:toPoint.y + y}, {x:toPoint.x - x, y:toPoint.y - y}]; + }; +}).call(typeof window !== 'undefined' ? window : this); +; +(function () { + + "use strict"; + + /** + * Creates a Touch object. + * @param view + * @param target + * @param pageX + * @param pageY + * @param screenX + * @param screenY + * @param clientX + * @param clientY + * @returns {Touch} + * @private + */ + function _touch(view, target, pageX, pageY, screenX, screenY, clientX, clientY) { + + return new Touch({ + target:target, + identifier:_uuid(), + pageX: pageX, + pageY: pageY, + screenX: screenX, + screenY: screenY, + clientX: clientX || screenX, + clientY: clientY || screenY + }); + } + + /** + * Create a synthetic touch list from the given list of Touch objects. + * @returns {Array} + * @private + */ + function _touchList() { + var list = []; + Array.prototype.push.apply(list, arguments); + list.item = function(index) { return this[index]; }; + return list; + } + + /** + * Create a Touch object and then insert it into a synthetic touch list, returning the list.s + * @param view + * @param target + * @param pageX + * @param pageY + * @param screenX + * @param screenY + * @param clientX + * @param clientY + * @returns {Array} + * @private + */ + function _touchAndList(view, target, pageX, pageY, screenX, screenY, clientX, clientY) { + return _touchList(_touch.apply(null, arguments)); + } + + var root = this, + matchesSelector = function (el, selector, ctx) { + ctx = ctx || el.parentNode; + var possibles = ctx.querySelectorAll(selector); + for (var i = 0; i < possibles.length; i++) { + if (possibles[i] === el) { + return true; + } + } + return false; + }, + _gel = function (el) { + return (typeof el == "string" || el.constructor === String) ? document.getElementById(el) : el; + }, + _t = function (e) { + return e.srcElement || e.target; + }, + // + // gets path info for the given event - the path from target to obj, in the event's bubble chain. if doCompute + // is false we just return target for the path. + // + _pi = function(e, target, obj, doCompute) { + if (!doCompute) return { path:[target], end:1 }; + else if (typeof e.path !== "undefined" && e.path.indexOf) { + return { path: e.path, end: e.path.indexOf(obj) }; + } else { + var out = { path:[], end:-1 }, _one = function(el) { + out.path.push(el); + if (el === obj) { + out.end = out.path.length - 1; + } + else if (el.parentNode != null) { + _one(el.parentNode) + } + }; + _one(target); + return out; + } + }, + _d = function (l, fn) { + for (var i = 0, j = l.length; i < j; i++) { + if (l[i] == fn) break; + } + if (i < l.length) l.splice(i, 1); + }, + guid = 1, + // + // this function generates a guid for every handler, sets it on the handler, then adds + // it to the associated object's map of handlers for the given event. this is what enables us + // to unbind all events of some type, or all events (the second of which can be requested by the user, + // but it also used by Mottle when an element is removed.) + _store = function (obj, event, fn) { + var g = guid++; + obj.__ta = obj.__ta || {}; + obj.__ta[event] = obj.__ta[event] || {}; + // store each handler with a unique guid. + obj.__ta[event][g] = fn; + // set the guid on the handler. + fn.__tauid = g; + return g; + }, + _unstore = function (obj, event, fn) { + obj.__ta && obj.__ta[event] && delete obj.__ta[event][fn.__tauid]; + // a handler might have attached extra functions, so we unbind those too. + if (fn.__taExtra) { + for (var i = 0; i < fn.__taExtra.length; i++) { + _unbind(obj, fn.__taExtra[i][0], fn.__taExtra[i][1]); + } + fn.__taExtra.length = 0; + } + // a handler might have attached an unstore callback + fn.__taUnstore && fn.__taUnstore(); + }, + _curryChildFilter = function (children, obj, fn, evt) { + if (children == null) return fn; + else { + var c = children.split(","), + _fn = function (e) { + _fn.__tauid = fn.__tauid; + var t = _t(e), target = t; // t is the target element on which the event occurred. it is the + // element we will wish to pass to any callbacks. + var pathInfo = _pi(e, t, obj, children != null) + if (pathInfo.end != -1) { + for (var p = 0; p < pathInfo.end; p++) { + target = pathInfo.path[p]; + for (var i = 0; i < c.length; i++) { + if (matchesSelector(target, c[i], obj)) { + fn.apply(target, arguments); + } + } + } + } + }; + registerExtraFunction(fn, evt, _fn); + return _fn; + } + }, + // + // registers an 'extra' function on some event listener function we were given - a function that we + // created and bound to the element as part of our housekeeping, and which we want to unbind and remove + // whenever the given function is unbound. + registerExtraFunction = function (fn, evt, newFn) { + fn.__taExtra = fn.__taExtra || []; + fn.__taExtra.push([evt, newFn]); + }, + DefaultHandler = function (obj, evt, fn, children) { + if (isTouchDevice && touchMap[evt]) { + var tfn = _curryChildFilter(children, obj, fn, touchMap[evt]); + _bind(obj, touchMap[evt], tfn , fn); + } + if (evt === "focus" && obj.getAttribute("tabindex") == null) { + obj.setAttribute("tabindex", "1"); + } + _bind(obj, evt, _curryChildFilter(children, obj, fn, evt), fn); + }, + SmartClickHandler = function (obj, evt, fn, children) { + if (obj.__taSmartClicks == null) { + var down = function (e) { + obj.__tad = _pageLocation(e); + }, + up = function (e) { + obj.__tau = _pageLocation(e); + }, + click = function (e) { + if (obj.__tad && obj.__tau && obj.__tad[0] === obj.__tau[0] && obj.__tad[1] === obj.__tau[1]) { + for (var i = 0; i < obj.__taSmartClicks.length; i++) + obj.__taSmartClicks[i].apply(_t(e), [ e ]); + } + }; + DefaultHandler(obj, "mousedown", down, children); + DefaultHandler(obj, "mouseup", up, children); + DefaultHandler(obj, "click", click, children); + obj.__taSmartClicks = []; + } + + // store in the list of callbacks + obj.__taSmartClicks.push(fn); + // the unstore function removes this function from the object's listener list for this type. + fn.__taUnstore = function () { + _d(obj.__taSmartClicks, fn); + }; + }, + _tapProfiles = { + "tap": {touches: 1, taps: 1}, + "dbltap": {touches: 1, taps: 2}, + "contextmenu": {touches: 2, taps: 1} + }, + TapHandler = function (clickThreshold, dblClickThreshold) { + return function (obj, evt, fn, children) { + // if event is contextmenu, for devices which are mouse only, we want to + // use the default bind. + if (evt == "contextmenu" && isMouseDevice) + DefaultHandler(obj, evt, fn, children); + else { + // the issue here is that this down handler gets registered only for the + // child nodes in the first registration. in fact it should be registered with + // no child selector and then on down we should cycle through the registered + // functions to see if one of them matches. on mouseup we should execute ALL of + // the functions whose children are either null or match the element. + if (obj.__taTapHandler == null) { + var tt = obj.__taTapHandler = { + tap: [], + dbltap: [], + contextmenu: [], + down: false, + taps: 0, + downSelectors: [] + }; + var down = function (e) { + var target = _t(e), pathInfo = _pi(e, target, obj, children != null), finished = false; + for (var p = 0; p < pathInfo.end; p++) { + if (finished) return; + target = pathInfo.path[p]; + for (var i = 0; i < tt.downSelectors.length; i++) { + if (tt.downSelectors[i] == null || matchesSelector(target, tt.downSelectors[i], obj)) { + tt.down = true; + setTimeout(clearSingle, clickThreshold); + setTimeout(clearDouble, dblClickThreshold); + finished = true; + break; // we only need one match on mousedown + } + } + } + }, + up = function (e) { + if (tt.down) { + var target = _t(e), currentTarget, pathInfo; + tt.taps++; + var tc = _touchCount(e); + for (var eventId in _tapProfiles) { + if (_tapProfiles.hasOwnProperty(eventId)) { + var p = _tapProfiles[eventId]; + if (p.touches === tc && (p.taps === 1 || p.taps === tt.taps)) { + for (var i = 0; i < tt[eventId].length; i++) { + pathInfo = _pi(e, target, obj, tt[eventId][i][1] != null); + for (var pLoop = 0; pLoop < pathInfo.end; pLoop++) { + currentTarget = pathInfo.path[pLoop]; + // this is a single event registration handler. + if (tt[eventId][i][1] == null || matchesSelector(currentTarget, tt[eventId][i][1], obj)) { + tt[eventId][i][0].apply(currentTarget, [ e ]); + break; + } + } + } + } + } + } + } + }, + clearSingle = function () { + tt.down = false; + }, + clearDouble = function () { + tt.taps = 0; + }; + + DefaultHandler(obj, "mousedown", down); + DefaultHandler(obj, "mouseup", up); + } + // add this child selector (it can be null, that's fine). + obj.__taTapHandler.downSelectors.push(children); + + obj.__taTapHandler[evt].push([fn, children]); + // the unstore function removes this function from the object's listener list for this type. + fn.__taUnstore = function () { + _d(obj.__taTapHandler[evt], fn); + }; + } + }; + }, + meeHelper = function (type, evt, obj, target) { + for (var i in obj.__tamee[type]) { + if (obj.__tamee[type].hasOwnProperty(i)) { + obj.__tamee[type][i].apply(target, [ evt ]); + } + } + }, + MouseEnterExitHandler = function () { + var activeElements = []; + return function (obj, evt, fn, children) { + if (!obj.__tamee) { + // __tamee holds a flag saying whether the mouse is currently "in" the element, and a list of + // both mouseenter and mouseexit functions. + obj.__tamee = { over: false, mouseenter: [], mouseexit: [] }; + // register over and out functions + var over = function (e) { + var t = _t(e); + if ((children == null && (t == obj && !obj.__tamee.over)) || (matchesSelector(t, children, obj) && (t.__tamee == null || !t.__tamee.over))) { + meeHelper("mouseenter", e, obj, t); + t.__tamee = t.__tamee || {}; + t.__tamee.over = true; + activeElements.push(t); + } + }, + out = function (e) { + var t = _t(e); + // is the current target one of the activeElements? and is the + // related target NOT a descendant of it? + for (var i = 0; i < activeElements.length; i++) { + if (t == activeElements[i] && !matchesSelector((e.relatedTarget || e.toElement), "*", t)) { + t.__tamee.over = false; + activeElements.splice(i, 1); + meeHelper("mouseexit", e, obj, t); + } + } + }; + + _bind(obj, "mouseover", _curryChildFilter(children, obj, over, "mouseover"), over); + _bind(obj, "mouseout", _curryChildFilter(children, obj, out, "mouseout"), out); + } + + fn.__taUnstore = function () { + delete obj.__tamee[evt][fn.__tauid]; + }; + + _store(obj, evt, fn); + obj.__tamee[evt][fn.__tauid] = fn; + }; + }, + isTouchDevice = "ontouchstart" in document.documentElement || navigator.maxTouchPoints, + isMouseDevice = "onmousedown" in document.documentElement, + touchMap = { "mousedown": "touchstart", "mouseup": "touchend", "mousemove": "touchmove" }, + touchstart = "touchstart", touchend = "touchend", touchmove = "touchmove", + iev = (function () { + var rv = -1; + if (navigator.appName == 'Microsoft Internet Explorer') { + var ua = navigator.userAgent, + re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); + if (re.exec(ua) != null) + rv = parseFloat(RegExp.$1); + } + return rv; + })(), + isIELT9 = iev > -1 && iev < 9, + _genLoc = function (e, prefix) { + if (e == null) return [ 0, 0 ]; + var ts = _touches(e), t = _getTouch(ts, 0); + return [t[prefix + "X"], t[prefix + "Y"]]; + }, + _pageLocation = function (e) { + if (e == null) return [ 0, 0 ]; + if (isIELT9) { + return [ e.clientX + document.documentElement.scrollLeft, e.clientY + document.documentElement.scrollTop ]; + } + else { + return _genLoc(e, "page"); + } + }, + _screenLocation = function (e) { + return _genLoc(e, "screen"); + }, + _clientLocation = function (e) { + return _genLoc(e, "client"); + }, + _getTouch = function (touches, idx) { + return touches.item ? touches.item(idx) : touches[idx]; + }, + _touches = function (e) { + return e.touches && e.touches.length > 0 ? e.touches : + e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches : + e.targetTouches && e.targetTouches.length > 0 ? e.targetTouches : + [ e ]; + }, + _touchCount = function (e) { + return _touches(e).length; + }, + //http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html + _bind = function (obj, type, fn, originalFn) { + _store(obj, type, fn); + originalFn.__tauid = fn.__tauid; + if (obj.addEventListener) + obj.addEventListener(type, fn, false); + else if (obj.attachEvent) { + var key = type + fn.__tauid; + obj["e" + key] = fn; + // TODO look at replacing with .call(..) + obj[key] = function () { + obj["e" + key] && obj["e" + key](window.event); + }; + obj.attachEvent("on" + type, obj[key]); + } + }, + _unbind = function (obj, type, fn) { + if (fn == null) return; + _each(obj, function () { + var _el = _gel(this); + _unstore(_el, type, fn); + // it has been bound if there is a tauid. otherwise it was not bound and we can ignore it. + if (fn.__tauid != null) { + if (_el.removeEventListener) { + _el.removeEventListener(type, fn, false); + if (isTouchDevice && touchMap[type]) _el.removeEventListener(touchMap[type], fn, false); + } + else if (this.detachEvent) { + var key = type + fn.__tauid; + _el[key] && _el.detachEvent("on" + type, _el[key]); + _el[key] = null; + _el["e" + key] = null; + } + } + + // if a touch event was also registered, deregister now. + if (fn.__taTouchProxy) { + _unbind(obj, fn.__taTouchProxy[1], fn.__taTouchProxy[0]); + } + }); + }, + _each = function (obj, fn) { + if (obj == null) return; + // if a list (or list-like), use it. if a string, get a list + // by running the string through querySelectorAll. else, assume + // it's an Element. + // obj.top is "unknown" in IE8. + obj = (typeof Window !== "undefined" && (typeof obj.top !== "unknown" && obj == obj.top)) ? [ obj ] : + (typeof obj !== "string") && (obj.tagName == null && obj.length != null) ? obj : + typeof obj === "string" ? document.querySelectorAll(obj) + : [ obj ]; + + for (var i = 0; i < obj.length; i++) + fn.apply(obj[i]); + }, + _uuid = function () { + return ('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + })); + }; + + /** + * Mottle offers support for abstracting out the differences + * between touch and mouse devices, plus "smart click" functionality + * (don't fire click if the mouse has moved between mousedown and mouseup), + * and synthesized click/tap events. + * @class Mottle + * @constructor + * @param {Object} params Constructor params + * @param {Number} [params.clickThreshold=250] Threshold, in milliseconds beyond which a touchstart followed by a touchend is not considered to be a click. + * @param {Number} [params.dblClickThreshold=450] Threshold, in milliseconds beyond which two successive tap events are not considered to be a click. + * @param {Boolean} [params.smartClicks=false] If true, won't fire click events if the mouse has moved between mousedown and mouseup. Note that this functionality + * requires that Mottle consume the mousedown event, and so may not be viable in all use cases. + */ + root.Mottle = function (params) { + params = params || {}; + var clickThreshold = params.clickThreshold || 250, + dblClickThreshold = params.dblClickThreshold || 450, + mouseEnterExitHandler = new MouseEnterExitHandler(), + tapHandler = new TapHandler(clickThreshold, dblClickThreshold), + _smartClicks = params.smartClicks, + _doBind = function (obj, evt, fn, children) { + if (fn == null) return; + _each(obj, function () { + var _el = _gel(this); + if (_smartClicks && evt === "click") + SmartClickHandler(_el, evt, fn, children); + else if (evt === "tap" || evt === "dbltap" || evt === "contextmenu") { + tapHandler(_el, evt, fn, children); + } + else if (evt === "mouseenter" || evt == "mouseexit") + mouseEnterExitHandler(_el, evt, fn, children); + else + DefaultHandler(_el, evt, fn, children); + }); + }; + + /** + * Removes an element from the DOM, and deregisters all event handlers for it. You should use this + * to ensure you don't leak memory. + * @method remove + * @param {String|Element} el Element, or id of the element, to remove. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.remove = function (el) { + _each(el, function () { + var _el = _gel(this); + if (_el.__ta) { + for (var evt in _el.__ta) { + if (_el.__ta.hasOwnProperty(evt)) { + for (var h in _el.__ta[evt]) { + if (_el.__ta[evt].hasOwnProperty(h)) + _unbind(_el, evt, _el.__ta[evt][h]); + } + } + } + } + _el.parentNode && _el.parentNode.removeChild(_el); + }); + return this; + }; + + /** + * Register an event handler, optionally as a delegate for some set of descendant elements. Note + * that this method takes either 3 or 4 arguments - if you supply 3 arguments it is assumed you have + * omitted the `children` parameter, and that the event handler should be bound directly to the given element. + * @method on + * @param {Element[]|Element|String} el Either an Element, or a CSS spec for a list of elements, or an array of Elements. + * @param {String} [children] Comma-delimited list of selectors identifying allowed children. + * @param {String} event Event ID. + * @param {Function} fn Event handler function. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.on = function (el, event, children, fn) { + var _el = arguments[0], + _c = arguments.length == 4 ? arguments[2] : null, + _e = arguments[1], + _f = arguments[arguments.length - 1]; + + _doBind(_el, _e, _f, _c); + return this; + }; + + /** + * Cancel delegate event handling for the given function. Note that unlike with 'on' you do not supply + * a list of child selectors here: it removes event delegation from all of the child selectors for which the + * given function was registered (if any). + * @method off + * @param {Element[]|Element|String} el Element - or ID of element - from which to remove event listener. + * @param {String} event Event ID. + * @param {Function} fn Event handler function. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.off = function (el, event, fn) { + _unbind(el, event, fn); + return this; + }; + + /** + * Triggers some event for a given element. + * @method trigger + * @param {Element} el Element for which to trigger the event. + * @param {String} event Event ID. + * @param {Event} originalEvent The original event. Should be optional of course, but currently is not, due + * to the jsPlumb use case that caused this method to be added. + * @param {Object} [payload] Optional object to set as `payload` on the generated event; useful for message passing. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.trigger = function (el, event, originalEvent, payload) { + // MouseEvent undefined in old IE; that's how we know it's a mouse event. A fine Microsoft paradox. + var originalIsMouse = isMouseDevice && (typeof MouseEvent === "undefined" || originalEvent == null || originalEvent.constructor === MouseEvent); + + var eventToBind = (isTouchDevice && !isMouseDevice && touchMap[event]) ? touchMap[event] : event, + bindingAMouseEvent = !(isTouchDevice && !isMouseDevice && touchMap[event]); + + var pl = _pageLocation(originalEvent), sl = _screenLocation(originalEvent), cl = _clientLocation(originalEvent); + _each(el, function () { + var _el = _gel(this), evt; + originalEvent = originalEvent || { + screenX: sl[0], + screenY: sl[1], + clientX: cl[0], + clientY: cl[1] + }; + + var _decorate = function (_evt) { + if (payload) _evt.payload = payload; + }; + + var eventGenerators = { + "TouchEvent": function (evt) { + + var touchList = _touchAndList(window, _el, 0, pl[0], pl[1], sl[0], sl[1], cl[0], cl[1]), + init = evt.initTouchEvent || evt.initEvent; + + init(eventToBind, true, true, window, null, sl[0], sl[1], + cl[0], cl[1], false, false, false, false, + touchList, touchList, touchList, 1, 0); + }, + "MouseEvents": function (evt) { + evt.initMouseEvent(eventToBind, true, true, window, 0, + sl[0], sl[1], + cl[0], cl[1], + false, false, false, false, 1, _el); + } + }; + + if (document.createEvent) { + + var ite = !bindingAMouseEvent && !originalIsMouse && (isTouchDevice && touchMap[event]), + evtName = ite ? "TouchEvent" : "MouseEvents"; + + evt = document.createEvent(evtName); + eventGenerators[evtName](evt); + _decorate(evt); + _el.dispatchEvent(evt); + } + else if (document.createEventObject) { + evt = document.createEventObject(); + evt.eventType = evt.eventName = eventToBind; + evt.screenX = sl[0]; + evt.screenY = sl[1]; + evt.clientX = cl[0]; + evt.clientY = cl[1]; + _decorate(evt); + _el.fireEvent('on' + eventToBind, evt); + } + }); + return this; + } + }; + + /** + * Static method to assist in 'consuming' an element: uses `stopPropagation` where available, or sets + * `e.returnValue=false` where it is not. + * @method Mottle.consume + * @param {Event} e Event to consume + * @param {Boolean} [doNotPreventDefault=false] If true, does not call `preventDefault()` on the event. + */ + root.Mottle.consume = function (e, doNotPreventDefault) { + if (e.stopPropagation) + e.stopPropagation(); + else + e.returnValue = false; + + if (!doNotPreventDefault && e.preventDefault) + e.preventDefault(); + }; + + /** + * Gets the page location corresponding to the given event. For touch events this means get the page location of the first touch. + * @method Mottle.pageLocation + * @param {Event} e Event to get page location for. + * @return {Number[]} [left, top] for the given event. + */ + root.Mottle.pageLocation = _pageLocation; + + /** + * Forces touch events to be turned "on". Useful for testing: even if you don't have a touch device, you can still + * trigger a touch event when this is switched on and it will be captured and acted on. + * @method setForceTouchEvents + * @param {Boolean} value If true, force touch events to be on. + */ + root.Mottle.setForceTouchEvents = function (value) { + isTouchDevice = value; + }; + + /** + * Forces mouse events to be turned "on". Useful for testing: even if you don't have a mouse, you can still + * trigger a mouse event when this is switched on and it will be captured and acted on. + * @method setForceMouseEvents + * @param {Boolean} value If true, force mouse events to be on. + */ + root.Mottle.setForceMouseEvents = function (value) { + isMouseDevice = value; + }; + + root.Mottle.version = "0.8.0"; + + if (typeof exports !== "undefined") { + exports.Mottle = root.Mottle; + } + +}).call(typeof window === "undefined" ? this : window); + +/** + drag/drop functionality for use with jsPlumb but with + no knowledge of jsPlumb. supports multiple scopes (separated by whitespace), dragging + multiple elements, constrain to parent, drop filters, drag start filters, custom + css classes. + + a lot of the functionality of this script is expected to be plugged in: + + addClass + removeClass + + addEvent + removeEvent + + getPosition + setPosition + getSize + + indexOf + intersects + + the name came from here: + + http://mrsharpoblunto.github.io/foswig.js/ + + copyright 2016 jsPlumb + */ + +;(function() { + + "use strict"; + var root = this; + + var _suggest = function(list, item, head) { + if (list.indexOf(item) === -1) { + head ? list.unshift(item) : list.push(item); + return true; + } + return false; + }; + + var _vanquish = function(list, item) { + var idx = list.indexOf(item); + if (idx !== -1) list.splice(idx, 1); + }; + + var _difference = function(l1, l2) { + var d = []; + for (var i = 0; i < l1.length; i++) { + if (l2.indexOf(l1[i]) === -1) + d.push(l1[i]); + } + return d; + }; + + var _isString = function(f) { + return f == null ? false : (typeof f === "string" || f.constructor === String); + }; + + var getOffsetRect = function (elem) { + // (1) + var box = elem.getBoundingClientRect(), + body = document.body, + docElem = document.documentElement, + // (2) + scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop, + scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft, + // (3) + clientTop = docElem.clientTop || body.clientTop || 0, + clientLeft = docElem.clientLeft || body.clientLeft || 0, + // (4) + top = box.top + scrollTop - clientTop, + left = box.left + scrollLeft - clientLeft; + + return { top: Math.round(top), left: Math.round(left) }; + }; + + var matchesSelector = function(el, selector, ctx) { + ctx = ctx || el.parentNode; + var possibles = ctx.querySelectorAll(selector); + for (var i = 0; i < possibles.length; i++) { + if (possibles[i] === el) + return true; + } + return false; + }; + + var findDelegateElement = function(parentElement, childElement, selector) { + if (matchesSelector(childElement, selector, parentElement)) { + return childElement; + } else { + var currentParent = childElement.parentNode; + while (currentParent != null && currentParent !== parentElement) { + if (matchesSelector(currentParent, selector, parentElement)) { + return currentParent; + } else { + currentParent = currentParent.parentNode; + } + } + } + }; + + /** + * Finds all elements matching the given selector, for the given parent. In order to support "scoped root" selectors, + * ie. things like "> .someClass", that is .someClass elements that are direct children of `parentElement`, we have to + * jump through a small hoop here: when a delegate draggable is registered, we write a `katavorio-draggable` attribute + * on the element on which the draggable is registered. Then when this method runs, we grab the value of that attribute and + * prepend it as part of the selector we're looking for. So "> .someClass" ends up being written as + * "[katavorio-draggable='...' > .someClass]", which works with querySelectorAll. + * + * @param availableSelectors + * @param parentElement + * @param childElement + * @returns {*} + */ + var findMatchingSelector = function(availableSelectors, parentElement, childElement) { + var el = null; + var draggableId = parentElement.getAttribute("katavorio-draggable"), + prefix = draggableId != null ? "[katavorio-draggable='" + draggableId + "'] " : ""; + + for (var i = 0; i < availableSelectors.length; i++) { + el = findDelegateElement(parentElement, childElement, prefix + availableSelectors[i].selector); + if (el != null) { + if (availableSelectors[i].filter) { + var matches = matchesSelector(childElement, availableSelectors[i].filter, el), + exclude = availableSelectors[i].filterExclude === true; + + if ( (exclude && !matches) || matches) { + return null; + } + + } + return [ availableSelectors[i], el ]; + } + } + return null; + }; + + var iev = (function() { + var rv = -1; + if (navigator.appName === 'Microsoft Internet Explorer') { + var ua = navigator.userAgent, + re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); + if (re.exec(ua) != null) + rv = parseFloat(RegExp.$1); + } + return rv; + })(), + DEFAULT_GRID_X = 10, + DEFAULT_GRID_Y = 10, + isIELT9 = iev > -1 && iev < 9, + isIE9 = iev === 9, + _pl = function(e) { + if (isIELT9) { + return [ e.clientX + document.documentElement.scrollLeft, e.clientY + document.documentElement.scrollTop ]; + } + else { + var ts = _touches(e), t = _getTouch(ts, 0); + // for IE9 pageX might be null if the event was synthesized. We try for pageX/pageY first, + // falling back to clientX/clientY if necessary. In every other browser we want to use pageX/pageY. + return isIE9 ? [t.pageX || t.clientX, t.pageY || t.clientY] : [t.pageX, t.pageY]; + } + }, + _getTouch = function(touches, idx) { return touches.item ? touches.item(idx) : touches[idx]; }, + _touches = function(e) { + return e.touches && e.touches.length > 0 ? e.touches : + e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches : + e.targetTouches && e.targetTouches.length > 0 ? e.targetTouches : + [ e ]; + }, + _classes = { + delegatedDraggable:"katavorio-delegated-draggable", // elements that are the delegated drag handler for a bunch of other elements + draggable:"katavorio-draggable", // draggable elements + droppable:"katavorio-droppable", // droppable elements + drag : "katavorio-drag", // elements currently being dragged + selected:"katavorio-drag-selected", // elements in current drag selection + active : "katavorio-drag-active", // droppables that are targets of a currently dragged element + hover : "katavorio-drag-hover", // droppables over which a matching drag element is hovering + noSelect : "katavorio-drag-no-select", // added to the body to provide a hook to suppress text selection + ghostProxy:"katavorio-ghost-proxy", // added to a ghost proxy element in use when a drag has exited the bounds of its parent. + clonedDrag:"katavorio-clone-drag" // added to a node that is a clone of an element created at the start of a drag + }, + _defaultScope = "katavorio-drag-scope", + _events = [ "stop", "start", "drag", "drop", "over", "out", "beforeStart" ], + _devNull = function() {}, + _true = function() { return true; }, + _foreach = function(l, fn, from) { + for (var i = 0; i < l.length; i++) { + if (l[i] != from) + fn(l[i]); + } + }, + _setDroppablesActive = function(dd, val, andHover, drag) { + _foreach(dd, function(e) { + e.setActive(val); + if (val) e.updatePosition(); + if (andHover) e.setHover(drag, val); + }); + }, + _each = function(obj, fn) { + if (obj == null) return; + obj = !_isString(obj) && (obj.tagName == null && obj.length != null) ? obj : [ obj ]; + for (var i = 0; i < obj.length; i++) + fn.apply(obj[i], [ obj[i] ]); + }, + _consume = function(e) { + if (e.stopPropagation) { + e.stopPropagation(); + e.preventDefault(); + } + else { + e.returnValue = false; + } + }, + _defaultInputFilterSelector = "input,textarea,select,button,option", + // + // filters out events on all input elements, like textarea, checkbox, input, select. + _inputFilter = function(e, el, _katavorio) { + var t = e.srcElement || e.target; + return !matchesSelector(t, _katavorio.getInputFilterSelector(), el); + }; + + var Super = function(el, params, css, scope) { + this.params = params || {}; + this.el = el; + this.params.addClass(this.el, this._class); + this.uuid = _uuid(); + var enabled = true; + this.setEnabled = function(e) { enabled = e; }; + this.isEnabled = function() { return enabled; }; + this.toggleEnabled = function() { enabled = !enabled; }; + this.setScope = function(scopes) { + this.scopes = scopes ? scopes.split(/\s+/) : [ scope ]; + }; + this.addScope = function(scopes) { + var m = {}; + _each(this.scopes, function(s) { m[s] = true;}); + _each(scopes ? scopes.split(/\s+/) : [], function(s) { m[s] = true;}); + this.scopes = []; + for (var i in m) this.scopes.push(i); + }; + this.removeScope = function(scopes) { + var m = {}; + _each(this.scopes, function(s) { m[s] = true;}); + _each(scopes ? scopes.split(/\s+/) : [], function(s) { delete m[s];}); + this.scopes = []; + for (var i in m) this.scopes.push(i); + }; + this.toggleScope = function(scopes) { + var m = {}; + _each(this.scopes, function(s) { m[s] = true;}); + _each(scopes ? scopes.split(/\s+/) : [], function(s) { + if (m[s]) delete m[s]; + else m[s] = true; + }); + this.scopes = []; + for (var i in m) this.scopes.push(i); + }; + this.setScope(params.scope); + this.k = params.katavorio; + return params.katavorio; + }; + + var TRUE = function() { return true; }; + var FALSE = function() { return false; }; + + var Drag = function(el, params, css, scope) { + this._class = css.draggable; + var k = Super.apply(this, arguments); + this.rightButtonCanDrag = this.params.rightButtonCanDrag; + var downAt = [0,0], posAtDown = null, pagePosAtDown = null, pageDelta = [0,0], moving = false, initialScroll = [0,0], + consumeStartEvent = this.params.consumeStartEvent !== false, + dragEl = this.el, + clone = this.params.clone, + scroll = this.params.scroll, + _multipleDrop = params.multipleDrop !== false, + isConstrained = false, + useGhostProxy = params.ghostProxy === true ? TRUE : params.ghostProxy && typeof params.ghostProxy === "function" ? params.ghostProxy : FALSE, + ghostProxy = function(el) { return el.cloneNode(true); }, + elementToDrag = null, + availableSelectors = [], + activeSelectorParams = null, // which, if any, selector config is currently active. + ghostProxyParent = params.ghostProxyParent, + currentParentPosition, + ghostParentPosition, + ghostDx, + ghostDy; + + // if an initial selector was provided, push the entire set of params as a selector config. + if (params.selector) { + var draggableId = el.getAttribute("katavorio-draggable"); + if (draggableId == null) { + draggableId = "" + new Date().getTime(); + el.setAttribute("katavorio-draggable", draggableId); + } + + availableSelectors.push(params); + } + + var snapThreshold = params.snapThreshold, + _snap = function(pos, gridX, gridY, thresholdX, thresholdY) { + var _dx = Math.floor(pos[0] / gridX), + _dxl = gridX * _dx, + _dxt = _dxl + gridX, + _x = Math.abs(pos[0] - _dxl) <= thresholdX ? _dxl : Math.abs(_dxt - pos[0]) <= thresholdX ? _dxt : pos[0]; + + var _dy = Math.floor(pos[1] / gridY), + _dyl = gridY * _dy, + _dyt = _dyl + gridY, + _y = Math.abs(pos[1] - _dyl) <= thresholdY ? _dyl : Math.abs(_dyt - pos[1]) <= thresholdY ? _dyt : pos[1]; + + return [ _x, _y]; + }; + + this.posses = []; + this.posseRoles = {}; + + this.toGrid = function(pos) { + if (this.params.grid == null) { + return pos; + } + else { + var tx = this.params.grid ? this.params.grid[0] / 2 : snapThreshold ? snapThreshold : DEFAULT_GRID_X / 2, + ty = this.params.grid ? this.params.grid[1] / 2 : snapThreshold ? snapThreshold : DEFAULT_GRID_Y / 2; + + return _snap(pos, this.params.grid[0], this.params.grid[1], tx, ty); + } + }; + + this.snap = function(x, y) { + if (dragEl == null) return; + x = x || (this.params.grid ? this.params.grid[0] : DEFAULT_GRID_X); + y = y || (this.params.grid ? this.params.grid[1] : DEFAULT_GRID_Y); + var p = this.params.getPosition(dragEl), + tx = this.params.grid ? this.params.grid[0] / 2 : snapThreshold, + ty = this.params.grid ? this.params.grid[1] / 2 : snapThreshold, + snapped = _snap(p, x, y, tx, ty); + + this.params.setPosition(dragEl, snapped); + return snapped; + }; + + this.setUseGhostProxy = function(val) { + useGhostProxy = val ? TRUE : FALSE; + }; + + var constrain; + var negativeFilter = function(pos) { + return (params.allowNegative === false) ? [ Math.max (0, pos[0]), Math.max(0, pos[1]) ] : pos; + }; + + var _setConstrain = function(value) { + constrain = typeof value === "function" ? value : value ? function(pos, dragEl, _constrainRect, _size) { + return negativeFilter([ + Math.max(0, Math.min(_constrainRect.w - _size[0], pos[0])), + Math.max(0, Math.min(_constrainRect.h - _size[1], pos[1])) + ]); + }.bind(this) : function(pos) { return negativeFilter(pos); }; + }.bind(this); + + _setConstrain(typeof this.params.constrain === "function" ? this.params.constrain : (this.params.constrain || this.params.containment)); + + + /** + * Sets whether or not the Drag is constrained. A value of 'true' means constrain to parent bounds; a function + * will be executed and returns true if the position is allowed. + * @param value + */ + this.setConstrain = function(value) { + _setConstrain(value); + }; + + var revertFunction; + /** + * Sets a function to call on drag stop, which, if it returns true, indicates that the given element should + * revert to its position before the previous drag. + * @param fn + */ + this.setRevert = function(fn) { + revertFunction = fn; + }; + + if (this.params.revert) { + revertFunction = this.params.revert; + } + + var _assignId = function(obj) { + if (typeof obj === "function") { + obj._katavorioId = _uuid(); + return obj._katavorioId; + } else { + return obj; + } + }, + // a map of { spec -> [ fn, exclusion ] } entries. + _filters = {}, + _testFilter = function(e) { + for (var key in _filters) { + var f = _filters[key]; + var rv = f[0](e); + if (f[1]) rv = !rv; + if (!rv) return false; + } + return true; + }, + _setFilter = this.setFilter = function(f, _exclude) { + if (f) { + var key = _assignId(f); + _filters[key] = [ + function(e) { + var t = e.srcElement || e.target, m; + if (_isString(f)) { + m = matchesSelector(t, f, el); + } + else if (typeof f === "function") { + m = f(e, el); + } + return m; + }, + _exclude !== false + ]; + + } + }, + _addFilter = this.addFilter = _setFilter, + _removeFilter = this.removeFilter = function(f) { + var key = typeof f === "function" ? f._katavorioId : f; + delete _filters[key]; + }; + + this.clearAllFilters = function() { + _filters = {}; + }; + + this.canDrag = this.params.canDrag || _true; + + var constrainRect, + matchingDroppables = [], + intersectingDroppables = []; + + this.addSelector = function(params) { + if (params.selector) { + availableSelectors.push(params); + } + }; + + this.downListener = function(e) { + if (e.defaultPrevented) { return; } + var isNotRightClick = this.rightButtonCanDrag || (e.which !== 3 && e.button !== 2); + if (isNotRightClick && this.isEnabled() && this.canDrag()) { + + var _f = _testFilter(e) && _inputFilter(e, this.el, this.k); + if (_f) { + + activeSelectorParams = null; + elementToDrag = null; + + // if (selector) { + // elementToDrag = findDelegateElement(this.el, e.target || e.srcElement, selector); + // if(elementToDrag == null) { + // return; + // } + // } + if (availableSelectors.length > 0) { + var match = findMatchingSelector(availableSelectors, this.el, e.target || e.srcElement); + if (match != null) { + activeSelectorParams = match[0]; + elementToDrag = match[1]; + } + // elementToDrag = findDelegateElement(this.el, e.target || e.srcElement, selector); + if(elementToDrag == null) { + return; + } + } + else { + elementToDrag = this.el; + } + + if (clone) { + dragEl = elementToDrag.cloneNode(true); + this.params.addClass(dragEl, _classes.clonedDrag); + + dragEl.setAttribute("id", null); + dragEl.style.position = "absolute"; + + if (this.params.parent != null) { + var p = this.params.getPosition(this.el); + dragEl.style.left = p[0] + "px"; + dragEl.style.top = p[1] + "px"; + this.params.parent.appendChild(dragEl); + } else { + // the clone node is added to the body; getOffsetRect gives us a value + // relative to the body. + var b = getOffsetRect(elementToDrag); + dragEl.style.left = b.left + "px"; + dragEl.style.top = b.top + "px"; + + document.body.appendChild(dragEl); + } + + } else { + dragEl = elementToDrag; + } + + consumeStartEvent && _consume(e); + downAt = _pl(e); + if (dragEl && dragEl.parentNode) + { + initialScroll = [dragEl.parentNode.scrollLeft, dragEl.parentNode.scrollTop]; + } + // + this.params.bind(document, "mousemove", this.moveListener); + this.params.bind(document, "mouseup", this.upListener); + k.markSelection(this); + k.markPosses(this); + this.params.addClass(document.body, css.noSelect); + _dispatch("beforeStart", {el:this.el, pos:posAtDown, e:e, drag:this}); + } + else if (this.params.consumeFilteredEvents) { + _consume(e); + } + } + }.bind(this); + + this.moveListener = function(e) { + if (downAt) { + if (!moving) { + var _continue = _dispatch("start", {el:this.el, pos:posAtDown, e:e, drag:this}); + if (_continue !== false) { + if (!downAt) { + return; + } + this.mark(true); + moving = true; + } else { + this.abort(); + } + } + + // it is possible that the start event caused the drag to be aborted. So we check + // again that we are currently dragging. + if (downAt) { + intersectingDroppables.length = 0; + var pos = _pl(e), dx = pos[0] - downAt[0], dy = pos[1] - downAt[1], + z = this.params.ignoreZoom ? 1 : k.getZoom(); + if (dragEl && dragEl.parentNode) + { + dx += dragEl.parentNode.scrollLeft - initialScroll[0]; + dy += dragEl.parentNode.scrollTop - initialScroll[1]; + } + dx /= z; + dy /= z; + this.moveBy(dx, dy, e); + k.updateSelection(dx, dy, this); + k.updatePosses(dx, dy, this); + } + } + }.bind(this); + + this.upListener = function(e) { + if (downAt) { + downAt = null; + this.params.unbind(document, "mousemove", this.moveListener); + this.params.unbind(document, "mouseup", this.upListener); + this.params.removeClass(document.body, css.noSelect); + this.unmark(e); + k.unmarkSelection(this, e); + k.unmarkPosses(this, e); + this.stop(e); + + k.notifyPosseDragStop(this, e); + moving = false; + intersectingDroppables.length = 0; + + if (clone) { + dragEl && dragEl.parentNode && dragEl.parentNode.removeChild(dragEl); + dragEl = null; + } else { + if (revertFunction && revertFunction(dragEl, this.params.getPosition(dragEl)) === true) { + this.params.setPosition(dragEl, posAtDown); + _dispatch("revert", dragEl); + } + } + + } + }.bind(this); + + this.getFilters = function() { return _filters; }; + + this.abort = function() { + if (downAt != null) { + this.upListener(); + } + }; + + /** + * Returns the element that was last dragged. This may be some original element from the DOM, or if `clone` is + * set, then its actually a copy of some original DOM element. In some client calls to this method, it is the + * actual element that was dragged that is desired. In others, it is the original DOM element that the user + * wishes to get - in which case, pass true for `retrieveOriginalElement`. + * + * @returns {*} + */ + this.getDragElement = function(retrieveOriginalElement) { + return retrieveOriginalElement ? elementToDrag || this.el : dragEl || this.el; + }; + + var listeners = {"start":[], "drag":[], "stop":[], "over":[], "out":[], "beforeStart":[], "revert":[] }; + if (params.events.start) listeners.start.push(params.events.start); + if (params.events.beforeStart) listeners.beforeStart.push(params.events.beforeStart); + if (params.events.stop) listeners.stop.push(params.events.stop); + if (params.events.drag) listeners.drag.push(params.events.drag); + if (params.events.revert) listeners.revert.push(params.events.revert); + + this.on = function(evt, fn) { + if (listeners[evt]) listeners[evt].push(fn); + }; + + this.off = function(evt, fn) { + if (listeners[evt]) { + var l = []; + for (var i = 0; i < listeners[evt].length; i++) { + if (listeners[evt][i] !== fn) l.push(listeners[evt][i]); + } + listeners[evt] = l; + } + }; + + var _dispatch = function(evt, value) { + var result = null; + if (activeSelectorParams && activeSelectorParams[evt]) { + result = activeSelectorParams[evt](value); + } else if (listeners[evt]) { + for (var i = 0; i < listeners[evt].length; i++) { + try { + var v = listeners[evt][i](value); + if (v != null) { + result = v; + } + } + catch (e) { } + } + } + return result; + }; + + this.notifyStart = function(e) { + _dispatch("start", {el:this.el, pos:this.params.getPosition(dragEl), e:e, drag:this}); + }; + + this.stop = function(e, force) { + if (force || moving) { + var positions = [], + sel = k.getSelection(), + dPos = this.params.getPosition(dragEl); + + if (sel.length > 0) { + for (var i = 0; i < sel.length; i++) { + var p = this.params.getPosition(sel[i].el); + positions.push([ sel[i].el, { left: p[0], top: p[1] }, sel[i] ]); + } + } + else { + positions.push([ dragEl, {left:dPos[0], top:dPos[1]}, this ]); + } + + _dispatch("stop", { + el: dragEl, + pos: ghostProxyOffsets || dPos, + finalPos:dPos, + e: e, + drag: this, + selection:positions + }); + } + }; + + this.mark = function(andNotify) { + posAtDown = this.params.getPosition(dragEl); + pagePosAtDown = this.params.getPosition(dragEl, true); + pageDelta = [pagePosAtDown[0] - posAtDown[0], pagePosAtDown[1] - posAtDown[1]]; + this.size = this.params.getSize(dragEl); + matchingDroppables = k.getMatchingDroppables(this); + _setDroppablesActive(matchingDroppables, true, false, this); + this.params.addClass(dragEl, this.params.dragClass || css.drag); + + var cs; + if (this.params.getConstrainingRectangle) { + cs = this.params.getConstrainingRectangle(dragEl) + } else { + cs = this.params.getSize(dragEl.parentNode); + } + constrainRect = {w: cs[0], h: cs[1]}; + + ghostDx = 0; + ghostDy = 0; + + if (andNotify) { + k.notifySelectionDragStart(this); + } + }; + var ghostProxyOffsets; + this.unmark = function(e, doNotCheckDroppables) { + _setDroppablesActive(matchingDroppables, false, true, this); + + if (isConstrained && useGhostProxy(elementToDrag, dragEl)) { + ghostProxyOffsets = [dragEl.offsetLeft - ghostDx, dragEl.offsetTop - ghostDy]; + dragEl.parentNode.removeChild(dragEl); + dragEl = elementToDrag; + } + else { + ghostProxyOffsets = null; + } + + this.params.removeClass(dragEl, this.params.dragClass || css.drag); + matchingDroppables.length = 0; + isConstrained = false; + if (!doNotCheckDroppables) { + if (intersectingDroppables.length > 0 && ghostProxyOffsets) { + params.setPosition(elementToDrag, ghostProxyOffsets); + } + intersectingDroppables.sort(_rankSort); + for (var i = 0; i < intersectingDroppables.length; i++) { + var retVal = intersectingDroppables[i].drop(this, e); + if (retVal === true) break; + } + } + }; + this.moveBy = function(dx, dy, e) { + intersectingDroppables.length = 0; + + var desiredLoc = this.toGrid([posAtDown[0] + dx, posAtDown[1] + dy]), + cPos = constrain(desiredLoc, dragEl, constrainRect, this.size); + + // if we should use a ghost proxy... + if (useGhostProxy(this.el, dragEl)) { + // and the element has been dragged outside of its parent bounds + if (desiredLoc[0] !== cPos[0] || desiredLoc[1] !== cPos[1]) { + + // ...if ghost proxy not yet created + if (!isConstrained) { + // create it + var gp = ghostProxy(elementToDrag); + params.addClass(gp, _classes.ghostProxy); + + if (ghostProxyParent) { + ghostProxyParent.appendChild(gp); + // find offset between drag el's parent the ghost parent + currentParentPosition = params.getPosition(elementToDrag.parentNode, true); + ghostParentPosition = params.getPosition(params.ghostProxyParent, true); + ghostDx = currentParentPosition[0] - ghostParentPosition[0]; + ghostDy = currentParentPosition[1] - ghostParentPosition[1]; + + } else { + elementToDrag.parentNode.appendChild(gp); + } + + // the ghost proxy is the drag element + dragEl = gp; + // set this flag so we dont recreate the ghost proxy + isConstrained = true; + } + // now the drag position can be the desired position, as the ghost proxy can support it. + cPos = desiredLoc; + } + else { + // if the element is not outside of its parent bounds, and ghost proxy is in place, + if (isConstrained) { + // remove the ghost proxy from the dom + dragEl.parentNode.removeChild(dragEl); + // reset the drag element to the original element + dragEl = elementToDrag; + // clear this flag. + isConstrained = false; + currentParentPosition = null; + ghostParentPosition = null; + ghostDx = 0; + ghostDy = 0; + } + } + } + + var rect = { x:cPos[0], y:cPos[1], w:this.size[0], h:this.size[1]}, + pageRect = { x:rect.x + pageDelta[0], y:rect.y + pageDelta[1], w:rect.w, h:rect.h}, + focusDropElement = null; + + this.params.setPosition(dragEl, [cPos[0] + ghostDx, cPos[1] + ghostDy]); + + for (var i = 0; i < matchingDroppables.length; i++) { + var r2 = { x:matchingDroppables[i].pagePosition[0], y:matchingDroppables[i].pagePosition[1], w:matchingDroppables[i].size[0], h:matchingDroppables[i].size[1]}; + if (this.params.intersects(pageRect, r2) && (_multipleDrop || focusDropElement == null || focusDropElement === matchingDroppables[i].el) && matchingDroppables[i].canDrop(this)) { + if (!focusDropElement) focusDropElement = matchingDroppables[i].el; + intersectingDroppables.push(matchingDroppables[i]); + matchingDroppables[i].setHover(this, true, e); + } + else if (matchingDroppables[i].isHover()) { + matchingDroppables[i].setHover(this, false, e); + } + } + + _dispatch("drag", {el:this.el, pos:cPos, e:e, drag:this}); + + /* test to see if the parent needs to be scrolled (future) + if (scroll) { + var pnsl = dragEl.parentNode.scrollLeft, pnst = dragEl.parentNode.scrollTop; + console.log("scroll!", pnsl, pnst); + }*/ + }; + this.destroy = function() { + this.params.unbind(this.el, "mousedown", this.downListener); + this.params.unbind(document, "mousemove", this.moveListener); + this.params.unbind(document, "mouseup", this.upListener); + this.downListener = null; + this.upListener = null; + this.moveListener = null; + }; + + // init:register mousedown, and perhaps set a filter + this.params.bind(this.el, "mousedown", this.downListener); + + // if handle provided, use that. otherwise, try to set a filter. + // note that a `handle` selector always results in filterExclude being set to false, ie. + // the selector defines the handle element(s). + if (this.params.handle) + _setFilter(this.params.handle, false); + else + _setFilter(this.params.filter, this.params.filterExclude); + }; + + var Drop = function(el, params, css, scope) { + this._class = css.droppable; + this.params = params || {}; + this.rank = params.rank || 0; + this._activeClass = this.params.activeClass || css.active; + this._hoverClass = this.params.hoverClass || css.hover; + Super.apply(this, arguments); + var hover = false; + this.allowLoopback = this.params.allowLoopback !== false; + + this.setActive = function(val) { + this.params[val ? "addClass" : "removeClass"](this.el, this._activeClass); + }; + + this.updatePosition = function() { + this.position = this.params.getPosition(this.el); + this.pagePosition = this.params.getPosition(this.el, true); + this.size = this.params.getSize(this.el); + }; + + this.canDrop = this.params.canDrop || function(drag) { + return true; + }; + + this.isHover = function() { return hover; }; + + this.setHover = function(drag, val, e) { + // if turning off hover but this was not the drag that caused the hover, ignore. + if (val || this.el._katavorioDragHover == null || this.el._katavorioDragHover === drag.el._katavorio) { + this.params[val ? "addClass" : "removeClass"](this.el, this._hoverClass); + this.el._katavorioDragHover = val ? drag.el._katavorio : null; + if (hover !== val) { + this.params.events[val ? "over" : "out"]({el: this.el, e: e, drag: drag, drop: this}); + } + hover = val; + } + }; + + /** + * A drop event. `drag` is the corresponding Drag object, which may be a Drag for some specific element, or it + * may be a Drag on some element acting as a delegate for elements contained within it. + * @param drag + * @param event + * @returns {*} + */ + this.drop = function(drag, event) { + return this.params.events["drop"]({ drag:drag, e:event, drop:this }); + }; + + this.destroy = function() { + this._class = null; + this._activeClass = null; + this._hoverClass = null; + hover = null; + }; + }; + + var _uuid = function() { + return ('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = Math.random()*16|0, v = c === 'x' ? r : (r&0x3|0x8); + return v.toString(16); + })); + }; + + var _rankSort = function(a,b) { + return a.rank < b.rank ? 1 : a.rank > b.rank ? -1 : 0; + }; + + var _gel = function(el) { + if (el == null) return null; + el = (typeof el === "string" || el.constructor === String) ? document.getElementById(el) : el; + if (el == null) return null; + el._katavorio = el._katavorio || _uuid(); + return el; + }; + + root.Katavorio = function(katavorioParams) { + + var _selection = [], + _selectionMap = {}; + + this._dragsByScope = {}; + this._dropsByScope = {}; + var _zoom = 1, + _reg = function(obj, map) { + _each(obj, function(_obj) { + for(var i = 0; i < _obj.scopes.length; i++) { + map[_obj.scopes[i]] = map[_obj.scopes[i]] || []; + map[_obj.scopes[i]].push(_obj); + } + }); + }, + _unreg = function(obj, map) { + var c = 0; + _each(obj, function(_obj) { + for(var i = 0; i < _obj.scopes.length; i++) { + if (map[_obj.scopes[i]]) { + var idx = katavorioParams.indexOf(map[_obj.scopes[i]], _obj); + if (idx !== -1) { + map[_obj.scopes[i]].splice(idx, 1); + c++; + } + } + } + }); + + return c > 0 ; + }, + _getMatchingDroppables = this.getMatchingDroppables = function(drag) { + var dd = [], _m = {}; + for (var i = 0; i < drag.scopes.length; i++) { + var _dd = this._dropsByScope[drag.scopes[i]]; + if (_dd) { + for (var j = 0; j < _dd.length; j++) { + if (_dd[j].canDrop(drag) && !_m[_dd[j].uuid] && (_dd[j].allowLoopback || _dd[j].el !== drag.el)) { + _m[_dd[j].uuid] = true; + dd.push(_dd[j]); + } + } + } + } + dd.sort(_rankSort); + return dd; + }, + _prepareParams = function(p) { + p = p || {}; + var _p = { + events:{} + }, i; + for (i in katavorioParams) _p[i] = katavorioParams[i]; + for (i in p) _p[i] = p[i]; + // events + + for (i = 0; i < _events.length; i++) { + _p.events[_events[i]] = p[_events[i]] || _devNull; + } + _p.katavorio = this; + return _p; + }.bind(this), + _mistletoe = function(existingDrag, params) { + for (var i = 0; i < _events.length; i++) { + if (params[_events[i]]) { + existingDrag.on(_events[i], params[_events[i]]); + } + } + }.bind(this), + _css = {}, + overrideCss = katavorioParams.css || {}, + _scope = katavorioParams.scope || _defaultScope; + + // prepare map of css classes based on defaults frst, then optional overrides + for (var i in _classes) _css[i] = _classes[i]; + for (var i in overrideCss) _css[i] = overrideCss[i]; + + var inputFilterSelector = katavorioParams.inputFilterSelector || _defaultInputFilterSelector; + /** + * Gets the selector identifying which input elements to filter from drag events. + * @method getInputFilterSelector + * @return {String} Current input filter selector. + */ + this.getInputFilterSelector = function() { return inputFilterSelector; }; + + /** + * Sets the selector identifying which input elements to filter from drag events. + * @method setInputFilterSelector + * @param {String} selector Input filter selector to set. + * @return {Katavorio} Current instance; method may be chained. + */ + this.setInputFilterSelector = function(selector) { + inputFilterSelector = selector; + return this; + }; + + /** + * Either makes the given element draggable, or identifies it as an element inside which some identified list + * of elements may be draggable. + * @param el + * @param params + * @returns {Array} + */ + this.draggable = function(el, params) { + var o = []; + _each(el, function (_el) { + _el = _gel(_el); + if (_el != null) { + if (_el._katavorioDrag == null) { + var p = _prepareParams(params); + _el._katavorioDrag = new Drag(_el, p, _css, _scope); + _reg(_el._katavorioDrag, this._dragsByScope); + o.push(_el._katavorioDrag); + katavorioParams.addClass(_el, p.selector ? _css.delegatedDraggable : _css.draggable); + } + else { + _mistletoe(_el._katavorioDrag, params); + } + } + }.bind(this)); + return o; + }; + + this.droppable = function(el, params) { + var o = []; + _each(el, function(_el) { + _el = _gel(_el); + if (_el != null) { + var drop = new Drop(_el, _prepareParams(params), _css, _scope); + _el._katavorioDrop = _el._katavorioDrop || []; + _el._katavorioDrop.push(drop); + _reg(drop, this._dropsByScope); + o.push(drop); + katavorioParams.addClass(_el, _css.droppable); + } + }.bind(this)); + return o; + }; + + /** + * @name Katavorio#select + * @function + * @desc Adds an element to the current selection (for multiple node drag) + * @param {Element|String} DOM element - or id of the element - to add. + */ + this.select = function(el) { + _each(el, function() { + var _el = _gel(this); + if (_el && _el._katavorioDrag) { + if (!_selectionMap[_el._katavorio]) { + _selection.push(_el._katavorioDrag); + _selectionMap[_el._katavorio] = [ _el, _selection.length - 1 ]; + katavorioParams.addClass(_el, _css.selected); + } + } + }); + return this; + }; + + /** + * @name Katavorio#deselect + * @function + * @desc Removes an element from the current selection (for multiple node drag) + * @param {Element|String} DOM element - or id of the element - to remove. + */ + this.deselect = function(el) { + _each(el, function() { + var _el = _gel(this); + if (_el && _el._katavorio) { + var e = _selectionMap[_el._katavorio]; + if (e) { + var _s = []; + for (var i = 0; i < _selection.length; i++) + if (_selection[i].el !== _el) _s.push(_selection[i]); + _selection = _s; + delete _selectionMap[_el._katavorio]; + katavorioParams.removeClass(_el, _css.selected); + } + } + }); + return this; + }; + + this.deselectAll = function() { + for (var i in _selectionMap) { + var d = _selectionMap[i]; + katavorioParams.removeClass(d[0], _css.selected); + } + + _selection.length = 0; + _selectionMap = {}; + }; + + this.markSelection = function(drag) { + _foreach(_selection, function(e) { e.mark(); }, drag); + }; + + this.markPosses = function(drag) { + if (drag.posses) { + _each(drag.posses, function(p) { + if (drag.posseRoles[p] && _posses[p]) { + _foreach(_posses[p].members, function (d) { + d.mark(); + }, drag); + } + }) + } + }; + + this.unmarkSelection = function(drag, event) { + _foreach(_selection, function(e) { e.unmark(event); }, drag); + }; + + this.unmarkPosses = function(drag, event) { + if (drag.posses) { + _each(drag.posses, function(p) { + if (drag.posseRoles[p] && _posses[p]) { + _foreach(_posses[p].members, function (d) { + d.unmark(event, true); + }, drag); + } + }); + } + }; + + this.getSelection = function() { return _selection.slice(0); }; + + this.updateSelection = function(dx, dy, drag) { + _foreach(_selection, function(e) { e.moveBy(dx, dy); }, drag); + }; + + var _posseAction = function(fn, drag) { + if (drag.posses) { + _each(drag.posses, function(p) { + if (drag.posseRoles[p] && _posses[p]) { + _foreach(_posses[p].members, function (e) { + fn(e); + }, drag); + } + }); + } + }; + + this.updatePosses = function(dx, dy, drag) { + _posseAction(function(e) { e.moveBy(dx, dy); }, drag); + }; + + this.notifyPosseDragStop = function(drag, evt) { + _posseAction(function(e) { e.stop(evt, true); }, drag); + }; + + this.notifySelectionDragStop = function(drag, evt) { + _foreach(_selection, function(e) { e.stop(evt, true); }, drag); + }; + + this.notifySelectionDragStart = function(drag, evt) { + _foreach(_selection, function(e) { e.notifyStart(evt);}, drag); + }; + + this.setZoom = function(z) { _zoom = z; }; + this.getZoom = function() { return _zoom; }; + + // does the work of changing scopes + var _scopeManip = function(kObj, scopes, map, fn) { + _each(kObj, function(_kObj) { + _unreg(_kObj, map); // deregister existing scopes + _kObj[fn](scopes); // set scopes + _reg(_kObj, map); // register new ones + }); + }; + + _each([ "set", "add", "remove", "toggle"], function(v) { + this[v + "Scope"] = function(el, scopes) { + _scopeManip(el._katavorioDrag, scopes, this._dragsByScope, v + "Scope"); + _scopeManip(el._katavorioDrop, scopes, this._dropsByScope, v + "Scope"); + }.bind(this); + this[v + "DragScope"] = function(el, scopes) { + _scopeManip(el.constructor === Drag ? el : el._katavorioDrag, scopes, this._dragsByScope, v + "Scope"); + }.bind(this); + this[v + "DropScope"] = function(el, scopes) { + _scopeManip(el.constructor === Drop ? el : el._katavorioDrop, scopes, this._dropsByScope, v + "Scope"); + }.bind(this); + }.bind(this)); + + this.snapToGrid = function(x, y) { + for (var s in this._dragsByScope) { + _foreach(this._dragsByScope[s], function(d) { d.snap(x, y); }); + } + }; + + this.getDragsForScope = function(s) { return this._dragsByScope[s]; }; + this.getDropsForScope = function(s) { return this._dropsByScope[s]; }; + + var _destroy = function(el, type, map) { + el = _gel(el); + if (el[type]) { + + // remove from selection, if present. + var selIdx = _selection.indexOf(el[type]); + if (selIdx >= 0) { + _selection.splice(selIdx, 1); + } + + if (_unreg(el[type], map)) { + _each(el[type], function(kObj) { kObj.destroy() }); + } + + delete el[type]; + } + }; + + var _removeListener = function(el, type, evt, fn) { + el = _gel(el); + if (el[type]) { + el[type].off(evt, fn); + } + }; + + this.elementRemoved = function(el) { + this.destroyDraggable(el); + this.destroyDroppable(el); + }; + + /** + * Either completely remove drag functionality from the given element, or remove a specific event handler. If you + * call this method with a single argument - the element - all drag functionality is removed from it. Otherwise, if + * you provide an event name and listener function, this function is de-registered (if found). + * @param el Element to update + * @param {string} [evt] Optional event name to unsubscribe + * @param {Function} [fn] Optional function to unsubscribe + */ + this.destroyDraggable = function(el, evt, fn) { + if (arguments.length === 1) { + _destroy(el, "_katavorioDrag", this._dragsByScope); + } else { + _removeListener(el, "_katavorioDrag", evt, fn); + } + }; + + /** + * Either completely remove drop functionality from the given element, or remove a specific event handler. If you + * call this method with a single argument - the element - all drop functionality is removed from it. Otherwise, if + * you provide an event name and listener function, this function is de-registered (if found). + * @param el Element to update + * @param {string} [evt] Optional event name to unsubscribe + * @param {Function} [fn] Optional function to unsubscribe + */ + this.destroyDroppable = function(el, evt, fn) { + if (arguments.length === 1) { + _destroy(el, "_katavorioDrop", this._dropsByScope); + } else { + _removeListener(el, "_katavorioDrop", evt, fn); + } + }; + + this.reset = function() { + this._dragsByScope = {}; + this._dropsByScope = {}; + _selection = []; + _selectionMap = {}; + _posses = {}; + }; + + // ----- groups + var _posses = {}; + + var _processOneSpec = function(el, _spec, dontAddExisting) { + var posseId = _isString(_spec) ? _spec : _spec.id; + var active = _isString(_spec) ? true : _spec.active !== false; + var posse = _posses[posseId] || (function() { + var g = {name:posseId, members:[]}; + _posses[posseId] = g; + return g; + })(); + _each(el, function(_el) { + if (_el._katavorioDrag) { + + if (dontAddExisting && _el._katavorioDrag.posseRoles[posse.name] != null) return; + + _suggest(posse.members, _el._katavorioDrag); + _suggest(_el._katavorioDrag.posses, posse.name); + _el._katavorioDrag.posseRoles[posse.name] = active; + } + }); + return posse; + }; + + /** + * Add the given element to the posse with the given id, creating the group if it at first does not exist. + * @method addToPosse + * @param {Element} el Element to add. + * @param {String...|Object...} spec Variable args parameters. Each argument can be a either a String, indicating + * the ID of a Posse to which the element should be added as an active participant, or an Object containing + * `{ id:"posseId", active:false/true}`. In the latter case, if `active` is not provided it is assumed to be + * true. + * @returns {Posse|Posse[]} The Posse(s) to which the element(s) was/were added. + */ + this.addToPosse = function(el, spec) { + + var posses = []; + + for (var i = 1; i < arguments.length; i++) { + posses.push(_processOneSpec(el, arguments[i])); + } + + return posses.length === 1 ? posses[0] : posses; + }; + + /** + * Sets the posse(s) for the element with the given id, creating those that do not yet exist, and removing from + * the element any current Posses that are not specified by this method call. This method will not change the + * active/passive state if it is given a posse in which the element is already a member. + * @method setPosse + * @param {Element} el Element to set posse(s) on. + * @param {String...|Object...} spec Variable args parameters. Each argument can be a either a String, indicating + * the ID of a Posse to which the element should be added as an active participant, or an Object containing + * `{ id:"posseId", active:false/true}`. In the latter case, if `active` is not provided it is assumed to be + * true. + * @returns {Posse|Posse[]} The Posse(s) to which the element(s) now belongs. + */ + this.setPosse = function(el, spec) { + + var posses = []; + + for (var i = 1; i < arguments.length; i++) { + posses.push(_processOneSpec(el, arguments[i], true).name); + } + + _each(el, function(_el) { + if (_el._katavorioDrag) { + var diff = _difference(_el._katavorioDrag.posses, posses); + var p = []; + Array.prototype.push.apply(p, _el._katavorioDrag.posses); + for (var i = 0; i < diff.length; i++) { + this.removeFromPosse(_el, diff[i]); + } + } + }.bind(this)); + + return posses.length === 1 ? posses[0] : posses; + }; + + /** + * Remove the given element from the given posse(s). + * @method removeFromPosse + * @param {Element} el Element to remove. + * @param {String...} posseId Varargs parameter: one value for each posse to remove the element from. + */ + this.removeFromPosse = function(el, posseId) { + if (arguments.length < 2) throw new TypeError("No posse id provided for remove operation"); + for(var i = 1; i < arguments.length; i++) { + posseId = arguments[i]; + _each(el, function (_el) { + if (_el._katavorioDrag && _el._katavorioDrag.posses) { + var d = _el._katavorioDrag; + _each(posseId, function (p) { + _vanquish(_posses[p].members, d); + _vanquish(d.posses, p); + delete d.posseRoles[p]; + }); + } + }); + } + }; + + /** + * Remove the given element from all Posses to which it belongs. + * @method removeFromAllPosses + * @param {Element|Element[]} el Element to remove from Posses. + */ + this.removeFromAllPosses = function(el) { + _each(el, function(_el) { + if (_el._katavorioDrag && _el._katavorioDrag.posses) { + var d = _el._katavorioDrag; + _each(d.posses, function(p) { + _vanquish(_posses[p].members, d); + }); + d.posses.length = 0; + d.posseRoles = {}; + } + }); + }; + + /** + * Changes the participation state for the element in the Posse with the given ID. + * @param {Element|Element[]} el Element(s) to change state for. + * @param {String} posseId ID of the Posse to change element state for. + * @param {Boolean} state True to make active, false to make passive. + */ + this.setPosseState = function(el, posseId, state) { + var posse = _posses[posseId]; + if (posse) { + _each(el, function(_el) { + if (_el._katavorioDrag && _el._katavorioDrag.posses) { + _el._katavorioDrag.posseRoles[posse.name] = state; + } + }); + } + }; + + }; + + root.Katavorio.version = "1.0.0"; + + if (typeof exports !== "undefined") { + exports.Katavorio = root.Katavorio; + } + +}).call(typeof window !== 'undefined' ? window : this); + + +(function() { + + var root = this; + root.jsPlumbUtil = root.jsPlumbUtil || {}; + var jsPlumbUtil = root.jsPlumbUtil; + + if (typeof exports !=='undefined') { exports.jsPlumbUtil = jsPlumbUtil;} + + + /** + * Tests if the given object is an Array. + * @param a + */ + function isArray(a) { + return Object.prototype.toString.call(a) === "[object Array]"; + } + jsPlumbUtil.isArray = isArray; + /** + * Tests if the given object is a Number. + * @param n + */ + function isNumber(n) { + return Object.prototype.toString.call(n) === "[object Number]"; + } + jsPlumbUtil.isNumber = isNumber; + function isString(s) { + return typeof s === "string"; + } + jsPlumbUtil.isString = isString; + function isBoolean(s) { + return typeof s === "boolean"; + } + jsPlumbUtil.isBoolean = isBoolean; + function isNull(s) { + return s == null; + } + jsPlumbUtil.isNull = isNull; + function isObject(o) { + return o == null ? false : Object.prototype.toString.call(o) === "[object Object]"; + } + jsPlumbUtil.isObject = isObject; + function isDate(o) { + return Object.prototype.toString.call(o) === "[object Date]"; + } + jsPlumbUtil.isDate = isDate; + function isFunction(o) { + return Object.prototype.toString.call(o) === "[object Function]"; + } + jsPlumbUtil.isFunction = isFunction; + function isNamedFunction(o) { + return isFunction(o) && o.name != null && o.name.length > 0; + } + jsPlumbUtil.isNamedFunction = isNamedFunction; + function isEmpty(o) { + for (var i in o) { + if (o.hasOwnProperty(i)) { + return false; + } + } + return true; + } + jsPlumbUtil.isEmpty = isEmpty; + function clone(a) { + if (isString(a)) { + return "" + a; + } + else if (isBoolean(a)) { + return !!a; + } + else if (isDate(a)) { + return new Date(a.getTime()); + } + else if (isFunction(a)) { + return a; + } + else if (isArray(a)) { + var b = []; + for (var i = 0; i < a.length; i++) { + b.push(clone(a[i])); + } + return b; + } + else if (isObject(a)) { + var c = {}; + for (var j in a) { + c[j] = clone(a[j]); + } + return c; + } + else { + return a; + } + } + jsPlumbUtil.clone = clone; + function merge(a, b, collations, overwrites) { + // first change the collations array - if present - into a lookup table, because its faster. + var cMap = {}, ar, i, oMap = {}; + collations = collations || []; + overwrites = overwrites || []; + for (i = 0; i < collations.length; i++) { + cMap[collations[i]] = true; + } + for (i = 0; i < overwrites.length; i++) { + oMap[overwrites[i]] = true; + } + var c = clone(a); + for (i in b) { + if (c[i] == null || oMap[i]) { + c[i] = b[i]; + } + else if (isString(b[i]) || isBoolean(b[i])) { + if (!cMap[i]) { + c[i] = b[i]; // if we dont want to collate, just copy it in. + } + else { + ar = []; + // if c's object is also an array we can keep its values. + ar.push.apply(ar, isArray(c[i]) ? c[i] : [c[i]]); + ar.push.apply(ar, isBoolean(b[i]) ? b[i] : [b[i]]); + c[i] = ar; + } + } + else { + if (isArray(b[i])) { + ar = []; + // if c's object is also an array we can keep its values. + if (isArray(c[i])) { + ar.push.apply(ar, c[i]); + } + ar.push.apply(ar, b[i]); + c[i] = ar; + } + else if (isObject(b[i])) { + // overwrite c's value with an object if it is not already one. + if (!isObject(c[i])) { + c[i] = {}; + } + for (var j in b[i]) { + c[i][j] = b[i][j]; + } + } + } + } + return c; + } + jsPlumbUtil.merge = merge; + function replace(inObj, path, value) { + if (inObj == null) { + return; + } + var q = inObj, t = q; + path.replace(/([^\.])+/g, function (term, lc, pos, str) { + var array = term.match(/([^\[0-9]+){1}(\[)([0-9+])/), last = pos + term.length >= str.length, _getArray = function () { + return t[array[1]] || (function () { + t[array[1]] = []; + return t[array[1]]; + })(); + }; + if (last) { + // set term = value on current t, creating term as array if necessary. + if (array) { + _getArray()[array[3]] = value; + } + else { + t[term] = value; + } + } + else { + // set to current t[term], creating t[term] if necessary. + if (array) { + var a_1 = _getArray(); + t = a_1[array[3]] || (function () { + a_1[array[3]] = {}; + return a_1[array[3]]; + })(); + } + else { + t = t[term] || (function () { + t[term] = {}; + return t[term]; + })(); + } + } + return ""; + }); + return inObj; + } + jsPlumbUtil.replace = replace; + // + // chain a list of functions, supplied by [ object, method name, args ], and return on the first + // one that returns the failValue. if none return the failValue, return the successValue. + // + function functionChain(successValue, failValue, fns) { + for (var i = 0; i < fns.length; i++) { + var o = fns[i][0][fns[i][1]].apply(fns[i][0], fns[i][2]); + if (o === failValue) { + return o; + } + } + return successValue; + } + jsPlumbUtil.functionChain = functionChain; + /** + * + * Take the given model and expand out any parameters. 'functionPrefix' is optional, and if present, helps jsplumb figure out what to do if a value is a Function. + * if you do not provide it (and doNotExpandFunctions is null, or false), jsplumb will run the given values through any functions it finds, and use the function's + * output as the value in the result. if you do provide the prefix, only functions that are named and have this prefix + * will be executed; other functions will be passed as values to the output. + * + * @param model + * @param values + * @param functionPrefix + * @param doNotExpandFunctions + * @returns {any} + */ + function populate(model, values, functionPrefix, doNotExpandFunctions) { + // for a string, see if it has parameter matches, and if so, try to make the substitutions. + var getValue = function (fromString) { + var matches = fromString.match(/(\${.*?})/g); + if (matches != null) { + for (var i = 0; i < matches.length; i++) { + var val = values[matches[i].substring(2, matches[i].length - 1)] || ""; + if (val != null) { + fromString = fromString.replace(matches[i], val); + } + } + } + return fromString; + }; + // process one entry. + var _one = function (d) { + if (d != null) { + if (isString(d)) { + return getValue(d); + } + else if (isFunction(d) && !doNotExpandFunctions && (functionPrefix == null || (d.name || "").indexOf(functionPrefix) === 0)) { + return d(values); + } + else if (isArray(d)) { + var r = []; + for (var i = 0; i < d.length; i++) { + r.push(_one(d[i])); + } + return r; + } + else if (isObject(d)) { + var s = {}; + for (var j in d) { + s[j] = _one(d[j]); + } + return s; + } + else { + return d; + } + } + }; + return _one(model); + } + jsPlumbUtil.populate = populate; + /** + * Find the index of a given object in an array. + * @param a The array to search + * @param f The function to run on each element. Return true if the element matches. + * @returns {number} -1 if not found, otherwise the index in the array. + */ + function findWithFunction(a, f) { + if (a) { + for (var i = 0; i < a.length; i++) { + if (f(a[i])) { + return i; + } + } + } + return -1; + } + jsPlumbUtil.findWithFunction = findWithFunction; + /** + * Remove some element from an array by matching each element in the array against some predicate function. Note that this + * is an in-place removal; the array is altered. + * @param a The array to search + * @param f The function to run on each element. Return true if the element matches. + * @returns {boolean} true if removed, false otherwise. + */ + function removeWithFunction(a, f) { + var idx = findWithFunction(a, f); + if (idx > -1) { + a.splice(idx, 1); + } + return idx !== -1; + } + jsPlumbUtil.removeWithFunction = removeWithFunction; + /** + * Remove some element from an array by simple lookup in the array for the given element. Note that this + * is an in-place removal; the array is altered. + * @param l The array to search + * @param v The value to remove. + * @returns {boolean} true if removed, false otherwise. + */ + function remove(l, v) { + var idx = l.indexOf(v); + if (idx > -1) { + l.splice(idx, 1); + } + return idx !== -1; + } + jsPlumbUtil.remove = remove; + /** + * Add some element to the given array, unless it is determined that it is already in the array. + * @param list The array to add the element to. + * @param item The item to add. + * @param hashFunction A function to use to determine if the given item already exists in the array. + */ + function addWithFunction(list, item, hashFunction) { + if (findWithFunction(list, hashFunction) === -1) { + list.push(item); + } + } + jsPlumbUtil.addWithFunction = addWithFunction; + /** + * Add some element to a list that is contained in a map of lists. + * @param map The map of [ key -> list ] entries + * @param key The name of the list to insert into + * @param value The value to insert + * @param insertAtStart Whether or not to insert at the start; defaults to false. + */ + function addToList(map, key, value, insertAtStart) { + var l = map[key]; + if (l == null) { + l = []; + map[key] = l; + } + l[insertAtStart ? "unshift" : "push"](value); + return l; + } + jsPlumbUtil.addToList = addToList; + /** + * Add an item to a list, unless it is already in the list. The test for pre-existence is a simple list lookup. + * If you want to do something more complex, perhaps #addWithFunction might help. + * @param list List to add the item to + * @param item Item to add + * @param insertAtHead Whether or not to insert at the start; defaults to false. + */ + function suggest(list, item, insertAtHead) { + if (list.indexOf(item) === -1) { + if (insertAtHead) { + list.unshift(item); + } + else { + list.push(item); + } + return true; + } + return false; + } + jsPlumbUtil.suggest = suggest; + /** + * Extends the given obj (which can be an array) with the given constructor function, prototype functions, and class members, any of which may be null. + * @param child + * @param parent + * @param _protoFn + */ + function extend(child, parent, _protoFn) { + var i; + parent = isArray(parent) ? parent : [parent]; + var _copyProtoChain = function (focus) { + var proto = focus.__proto__; + while (proto != null) { + if (proto.prototype != null) { + for (var j in proto.prototype) { + if (proto.prototype.hasOwnProperty(j) && !child.prototype.hasOwnProperty(j)) { + child.prototype[j] = proto.prototype[j]; + } + } + proto = proto.prototype.__proto__; + } + else { + proto = null; + } + } + }; + for (i = 0; i < parent.length; i++) { + for (var j in parent[i].prototype) { + if (parent[i].prototype.hasOwnProperty(j) && !child.prototype.hasOwnProperty(j)) { + child.prototype[j] = parent[i].prototype[j]; + } + } + _copyProtoChain(parent[i]); + } + var _makeFn = function (name, protoFn) { + return function () { + for (i = 0; i < parent.length; i++) { + if (parent[i].prototype[name]) { + parent[i].prototype[name].apply(this, arguments); + } + } + return protoFn.apply(this, arguments); + }; + }; + var _oneSet = function (fns) { + for (var k in fns) { + child.prototype[k] = _makeFn(k, fns[k]); + } + }; + if (arguments.length > 2) { + for (i = 2; i < arguments.length; i++) { + _oneSet(arguments[i]); + } + } + return child; + } + jsPlumbUtil.extend = extend; + /** + * Generate a UUID. + */ + // export function uuid(): string { + // return ('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + // let r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8); + // return v.toString(16); + // })); + // } + var lut = []; + for (var i = 0; i < 256; i++) { + lut[i] = (i < 16 ? '0' : '') + (i).toString(16); + } + function uuid() { + var d0 = Math.random() * 0xffffffff | 0; + var d1 = Math.random() * 0xffffffff | 0; + var d2 = Math.random() * 0xffffffff | 0; + var d3 = Math.random() * 0xffffffff | 0; + return lut[d0 & 0xff] + lut[d0 >> 8 & 0xff] + lut[d0 >> 16 & 0xff] + lut[d0 >> 24 & 0xff] + '-' + + lut[d1 & 0xff] + lut[d1 >> 8 & 0xff] + '-' + lut[d1 >> 16 & 0x0f | 0x40] + lut[d1 >> 24 & 0xff] + '-' + + lut[d2 & 0x3f | 0x80] + lut[d2 >> 8 & 0xff] + '-' + lut[d2 >> 16 & 0xff] + lut[d2 >> 24 & 0xff] + + lut[d3 & 0xff] + lut[d3 >> 8 & 0xff] + lut[d3 >> 16 & 0xff] + lut[d3 >> 24 & 0xff]; + } + jsPlumbUtil.uuid = uuid; + /** + * Trim a string. + * @param s String to trim + * @returns the String with leading and trailing whitespace removed. + */ + function fastTrim(s) { + if (s == null) { + return null; + } + var str = s.replace(/^\s\s*/, ''), ws = /\s/, i = str.length; + while (ws.test(str.charAt(--i))) { + } + return str.slice(0, i + 1); + } + jsPlumbUtil.fastTrim = fastTrim; + function each(obj, fn) { + obj = obj.length == null || typeof obj === "string" ? [obj] : obj; + for (var i = 0; i < obj.length; i++) { + fn(obj[i]); + } + } + jsPlumbUtil.each = each; + function map(obj, fn) { + var o = []; + for (var i = 0; i < obj.length; i++) { + o.push(fn(obj[i])); + } + return o; + } + jsPlumbUtil.map = map; + function mergeWithParents(type, map, parentAttribute) { + parentAttribute = parentAttribute || "parent"; + var _def = function (id) { + return id ? map[id] : null; + }; + var _parent = function (def) { + return def ? _def(def[parentAttribute]) : null; + }; + var _one = function (parent, def) { + if (parent == null) { + return def; + } + else { + var overrides = ["anchor", "anchors", "cssClass", "connector", "paintStyle", "hoverPaintStyle", "endpoint", "endpoints"]; + if (def.mergeStrategy === "override") { + Array.prototype.push.apply(overrides, ["events", "overlays"]); + } + var d_1 = merge(parent, def, [], overrides); + return _one(_parent(parent), d_1); + } + }; + var _getDef = function (t) { + if (t == null) { + return {}; + } + if (typeof t === "string") { + return _def(t); + } + else if (t.length) { + var done = false, i = 0, _dd = void 0; + while (!done && i < t.length) { + _dd = _getDef(t[i]); + if (_dd) { + done = true; + } + else { + i++; + } + } + return _dd; + } + }; + var d = _getDef(type); + if (d) { + return _one(_parent(d), d); + } + else { + return {}; + } + } + jsPlumbUtil.mergeWithParents = mergeWithParents; + jsPlumbUtil.logEnabled = true; + function log() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (jsPlumbUtil.logEnabled && typeof console !== "undefined") { + try { + var msg = arguments[arguments.length - 1]; + console.log(msg); + } + catch (e) { + } + } + } + jsPlumbUtil.log = log; + /** + * Wraps one function with another, creating a placeholder for the + * wrapped function if it was null. this is used to wrap the various + * drag/drop event functions - to allow jsPlumb to be notified of + * important lifecycle events without imposing itself on the user's + * drag/drop functionality. + * @method jsPlumbUtil.wrap + * @param {Function} wrappedFunction original function to wrap; may be null. + * @param {Function} newFunction function to wrap the original with. + * @param {Object} [returnOnThisValue] Optional. Indicates that the wrappedFunction should + * not be executed if the newFunction returns a value matching 'returnOnThisValue'. + * note that this is a simple comparison and only works for primitives right now. + */ + function wrap(wrappedFunction, newFunction, returnOnThisValue) { + return function () { + var r = null; + try { + if (newFunction != null) { + r = newFunction.apply(this, arguments); + } + } + catch (e) { + log("jsPlumb function failed : " + e); + } + if ((wrappedFunction != null) && (returnOnThisValue == null || (r !== returnOnThisValue))) { + try { + r = wrappedFunction.apply(this, arguments); + } + catch (e) { + log("wrapped function failed : " + e); + } + } + return r; + }; + } + jsPlumbUtil.wrap = wrap; + var EventGenerator = /** @class */ (function () { + function EventGenerator() { + var _this = this; + this._listeners = {}; + this.eventsSuspended = false; + this.tick = false; + // this is a list of events that should re-throw any errors that occur during their dispatch. + this.eventsToDieOn = { "ready": true }; + this.queue = []; + this.bind = function (event, listener, insertAtStart) { + var _one = function (evt) { + addToList(_this._listeners, evt, listener, insertAtStart); + listener.__jsPlumb = listener.__jsPlumb || {}; + listener.__jsPlumb[uuid()] = evt; + }; + if (typeof event === "string") { + _one(event); + } + else if (event.length != null) { + for (var i = 0; i < event.length; i++) { + _one(event[i]); + } + } + return _this; + }; + this.fire = function (event, value, originalEvent) { + if (!this.tick) { + this.tick = true; + if (!this.eventsSuspended && this._listeners[event]) { + var l = this._listeners[event].length, i = 0, _gone = false, ret = null; + if (!this.shouldFireEvent || this.shouldFireEvent(event, value, originalEvent)) { + while (!_gone && i < l && ret !== false) { + // doing it this way rather than catching and then possibly re-throwing means that an error propagated by this + // method will have the whole call stack available in the debugger. + if (this.eventsToDieOn[event]) { + this._listeners[event][i].apply(this, [value, originalEvent]); + } + else { + try { + ret = this._listeners[event][i].apply(this, [value, originalEvent]); + } + catch (e) { + log("jsPlumb: fire failed for event " + event + " : " + e); + } + } + i++; + if (this._listeners == null || this._listeners[event] == null) { + _gone = true; + } + } + } + } + this.tick = false; + this._drain(); + } + else { + this.queue.unshift(arguments); + } + return this; + }; + this._drain = function () { + var n = _this.queue.pop(); + if (n) { + _this.fire.apply(_this, n); + } + }; + this.unbind = function (eventOrListener, listener) { + if (arguments.length === 0) { + this._listeners = {}; + } + else if (arguments.length === 1) { + if (typeof eventOrListener === "string") { + delete this._listeners[eventOrListener]; + } + else if (eventOrListener.__jsPlumb) { + var evt = void 0; + for (var i in eventOrListener.__jsPlumb) { + evt = eventOrListener.__jsPlumb[i]; + remove(this._listeners[evt] || [], eventOrListener); + } + } + } + else if (arguments.length === 2) { + remove(this._listeners[eventOrListener] || [], listener); + } + return this; + }; + this.getListener = function (forEvent) { + return _this._listeners[forEvent]; + }; + this.setSuspendEvents = function (val) { + _this.eventsSuspended = val; + }; + this.isSuspendEvents = function () { + return _this.eventsSuspended; + }; + this.silently = function (fn) { + _this.setSuspendEvents(true); + try { + fn(); + } + catch (e) { + log("Cannot execute silent function " + e); + } + _this.setSuspendEvents(false); + }; + this.cleanupListeners = function () { + for (var i in _this._listeners) { + _this._listeners[i] = null; + } + }; + } + return EventGenerator; + }()); + jsPlumbUtil.EventGenerator = EventGenerator; + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains utility functions that run in browsers only. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ + ;(function() { + + "use strict"; + + var root = this; + + root.jsPlumbUtil.matchesSelector = function(el, selector, ctx) { + ctx = ctx || el.parentNode; + var possibles = ctx.querySelectorAll(selector); + for (var i = 0; i < possibles.length; i++) { + if (possibles[i] === el) { + return true; + } + } + return false; + }; + + root.jsPlumbUtil.consume = function(e, doNotPreventDefault) { + if (e.stopPropagation) { + e.stopPropagation(); + } + else { + e.returnValue = false; + } + + if (!doNotPreventDefault && e.preventDefault){ + e.preventDefault(); + } + }; + + /* + * Function: sizeElement + * Helper to size and position an element. You would typically use + * this when writing your own Connector or Endpoint implementation. + * + * Parameters: + * x - [int] x position for the element origin + * y - [int] y position for the element origin + * w - [int] width of the element + * h - [int] height of the element + * + */ + root.jsPlumbUtil.sizeElement = function(el, x, y, w, h) { + if (el) { + el.style.height = h + "px"; + el.height = h; + el.style.width = w + "px"; + el.width = w; + el.style.left = x + "px"; + el.style.top = y + "px"; + } + }; + + }).call(typeof window !== 'undefined' ? window : this); + +;(function() { + + var DEFAULT_OPTIONS = { + deriveAnchor:function(edge, index, ep, conn) { + return { + top:["TopRight", "TopLeft"], + bottom:["BottomRight", "BottomLeft"] + }[edge][index]; + } + }; + + var root = this; + + var ListManager = function(jsPlumbInstance, params) { + + this.count = 0; + this.instance = jsPlumbInstance; + this.lists = {}; + this.options = params || {}; + + this.instance.addList = function(el, options) { + return this.listManager.addList(el, options); + }; + + this.instance.removeList = function(el) { + this.listManager.removeList(el); + }; + + this.instance.bind("manageElement", function(p) { + + //look for [jtk-scrollable-list] elements and attach scroll listeners if necessary + var scrollableLists = this.instance.getSelector(p.el, "[jtk-scrollable-list]"); + for (var i = 0; i < scrollableLists.length; i++) { + this.addList(scrollableLists[i]); + } + + }.bind(this)); + + this.instance.bind("unmanageElement", function(p) { + this.removeList(p.el); + }); + + + this.instance.bind("connection", function(c, evt) { + if (evt == null) { + // not added by mouse. look for an ancestor of the source and/or target element that is a scrollable list, and run + // its scroll method. + this._maybeUpdateParentList(c.source); + this._maybeUpdateParentList(c.target); + } + }.bind(this)); + }; + + root.jsPlumbListManager = ListManager; + + ListManager.prototype = { + + addList : function(el, options) { + var dp = this.instance.extend({}, DEFAULT_OPTIONS); + this.instance.extend(dp, this.options); + options = this.instance.extend(dp, options || {}); + var id = [this.instance.getInstanceIndex(), this.count++].join("_"); + this.lists[id] = new List(this.instance, el, options, id); + }, + + removeList:function(el) { + var list = this.lists[el._jsPlumbList]; + if (list) { + list.destroy(); + delete this.lists[el._jsPlumbList]; + } + }, + + _maybeUpdateParentList:function (el) { + var parent = el.parentNode, container = this.instance.getContainer(); + while(parent != null && parent !== container) { + if (parent._jsPlumbList != null && this.lists[parent._jsPlumbList] != null) { + parent._jsPlumbScrollHandler(); + return + } + parent = parent.parentNode; + } + } + + + }; + + var List = function(instance, el, options, id) { + + el["_jsPlumbList"] = id; + + // + // Derive an anchor to use for the current situation. In contrast to the way we derive an endpoint, here we use `anchor` from the options, if present, as + // our first choice, and then `deriveAnchor` as our next choice. There is a default `deriveAnchor` implementation that uses TopRight/TopLeft for top and + // BottomRight/BottomLeft for bottom. + // + // edge - "top" or "bottom" + // index - 0 when endpoint is connection source, 1 when endpoint is connection target + // ep - the endpoint that is being proxied + // conn - the connection that is being proxied + // + function deriveAnchor(edge, index, ep, conn) { + return options.anchor ? options.anchor : options.deriveAnchor(edge, index, ep, conn); + } + + // + // Derive an endpoint to use for the current situation. We'll use a `deriveEndpoint` function passed in to the options as our first choice, + // followed by `endpoint` (an endpoint spec) from the options, and failing either of those we just use the `type` of the endpoint that is being proxied. + // + // edge - "top" or "bottom" + // index - 0 when endpoint is connection source, 1 when endpoint is connection target + // endpoint - the endpoint that is being proxied + // connection - the connection that is being proxied + // + function deriveEndpoint(edge, index, ep, conn) { + return options.deriveEndpoint ? options.deriveEndpoint(edge, index, ep, conn) : options.endpoint ? options.endpoint : ep.type; + } + + // + // look for a parent of the given scrollable list that is draggable, and then update the child offsets for it. this should not + // be necessary in the delegated drag stuff from the upcoming 3.0.0 release. + // + function _maybeUpdateDraggable(el) { + var parent = el.parentNode, container = instance.getContainer(); + while(parent != null && parent !== container) { + if (instance.hasClass(parent, "jtk-managed")) { + instance.recalculateOffsets(parent); + return + } + parent = parent.parentNode; + } + } + + var scrollHandler = function(e) { + + var children = instance.getSelector(el, ".jtk-managed"); + var elId = instance.getId(el); + + for (var i = 0; i < children.length; i++) { + + if (children[i].offsetTop < el.scrollTop) { + if (!children[i]._jsPlumbProxies) { + children[i]._jsPlumbProxies = children[i]._jsPlumbProxies || []; + instance.select({source: children[i]}).each(function (c) { + + + instance.proxyConnection(c, 0, el, elId, function () { + return deriveEndpoint("top", 0, c.endpoints[0], c); + }, function () { + return deriveAnchor("top", 0, c.endpoints[0], c); + }); + children[i]._jsPlumbProxies.push([c, 0]); + }); + + instance.select({target: children[i]}).each(function (c) { + instance.proxyConnection(c, 1, el, elId, function () { + return deriveEndpoint("top", 1, c.endpoints[1], c); + }, function () { + return deriveAnchor("top", 1, c.endpoints[1], c); + }); + children[i]._jsPlumbProxies.push([c, 1]); + }); + } + } + // + else if (children[i].offsetTop + children[i].offsetHeight > el.scrollTop + el.offsetHeight) { + if (!children[i]._jsPlumbProxies) { + children[i]._jsPlumbProxies = children[i]._jsPlumbProxies || []; + + instance.select({source: children[i]}).each(function (c) { + instance.proxyConnection(c, 0, el, elId, function () { + return deriveEndpoint("bottom", 0, c.endpoints[0], c); + }, function () { + return deriveAnchor("bottom", 0, c.endpoints[0], c); + }); + children[i]._jsPlumbProxies.push([c, 0]); + }); + + instance.select({target: children[i]}).each(function (c) { + instance.proxyConnection(c, 1, el, elId, function () { + return deriveEndpoint("bottom", 1, c.endpoints[1], c); + }, function () { + return deriveAnchor("bottom", 1, c.endpoints[1], c); + }); + children[i]._jsPlumbProxies.push([c, 1]); + }); + } + } else if (children[i]._jsPlumbProxies) { + for (var j = 0; j < children[i]._jsPlumbProxies.length; j++) { + instance.unproxyConnection(children[i]._jsPlumbProxies[j][0], children[i]._jsPlumbProxies[j][1], elId); + } + + delete children[i]._jsPlumbProxies; + } + + instance.revalidate(children[i]); + } + + _maybeUpdateDraggable(el); + }; + + instance.setAttribute(el, "jtk-scrollable-list", "true"); + el._jsPlumbScrollHandler = scrollHandler; + instance.on(el, "scroll", scrollHandler); + scrollHandler(); // run it once; there may be connections already. + + this.destroy = function() { + instance.off(el, "scroll", scrollHandler); + delete el._jsPlumbScrollHandler; + + var children = instance.getSelector(el, ".jtk-managed"); + var elId = instance.getId(el); + + for (var i = 0; i < children.length; i++) { + if (children[i]._jsPlumbProxies) { + for (var j = 0; j < children[i]._jsPlumbProxies.length; j++) { + instance.unproxyConnection(children[i]._jsPlumbProxies[j][0], children[i]._jsPlumbProxies[j][1], elId); + } + + delete children[i]._jsPlumbProxies; + } + } + }; + }; + + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the core code. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function () { + + "use strict"; + + var root = this; + + var _ju = root.jsPlumbUtil, + + /** + * creates a timestamp, using milliseconds since 1970, but as a string. + */ + _timestamp = function () { + return "" + (new Date()).getTime(); + }, + + // helper method to update the hover style whenever it, or paintStyle, changes. + // we use paintStyle as the foundation and merge hoverPaintStyle over the + // top. + _updateHoverStyle = function (component) { + if (component._jsPlumb.paintStyle && component._jsPlumb.hoverPaintStyle) { + var mergedHoverStyle = {}; + jsPlumb.extend(mergedHoverStyle, component._jsPlumb.paintStyle); + jsPlumb.extend(mergedHoverStyle, component._jsPlumb.hoverPaintStyle); + delete component._jsPlumb.hoverPaintStyle; + // we want the fill of paintStyle to override a gradient, if possible. + if (mergedHoverStyle.gradient && component._jsPlumb.paintStyle.fill) { + delete mergedHoverStyle.gradient; + } + component._jsPlumb.hoverPaintStyle = mergedHoverStyle; + } + }, + events = ["tap", "dbltap", "click", "dblclick", "mouseover", "mouseout", "mousemove", "mousedown", "mouseup", "contextmenu" ], + eventFilters = { "mouseout": "mouseleave", "mouseexit": "mouseleave" }, + _updateAttachedElements = function (component, state, timestamp, sourceElement) { + var affectedElements = component.getAttachedElements(); + if (affectedElements) { + for (var i = 0, j = affectedElements.length; i < j; i++) { + if (!sourceElement || sourceElement !== affectedElements[i]) { + affectedElements[i].setHover(state, true, timestamp); // tell the attached elements not to inform their own attached elements. + } + } + } + }, + _splitType = function (t) { + return t == null ? null : t.split(" "); + }, + _mapType = function(map, obj, typeId) { + for (var i in obj) { + map[i] = typeId; + } + }, + _each = function(fn, obj) { + obj = _ju.isArray(obj) || (obj.length != null && !_ju.isString(obj)) ? obj : [ obj ]; + for (var i = 0; i < obj.length; i++) { + try { + fn.apply(obj[i], [ obj[i] ]); + } + catch (e) { + _ju.log(".each iteration failed : " + e); + } + } + }, + _applyTypes = function (component, params, doNotRepaint) { + if (component.getDefaultType) { + var td = component.getTypeDescriptor(), map = {}; + var defType = component.getDefaultType(); + var o = _ju.merge({}, defType); + _mapType(map, defType, "__default"); + for (var i = 0, j = component._jsPlumb.types.length; i < j; i++) { + var tid = component._jsPlumb.types[i]; + if (tid !== "__default") { + var _t = component._jsPlumb.instance.getType(tid, td); + if (_t != null) { + + var overrides = ["anchor", "anchors", "connector", "paintStyle", "hoverPaintStyle", "endpoint", "endpoints", "connectorOverlays", "connectorStyle", "connectorHoverStyle", "endpointStyle", "endpointHoverStyle"]; + var collations = [ ]; + + if (_t.mergeStrategy === "override") { + Array.prototype.push.apply(overrides, ["events", "overlays", "cssClass"]); + } else { + collations.push("cssClass"); + } + + o = _ju.merge(o, _t, collations, overrides); + _mapType(map, _t, tid); + } + } + } + + if (params) { + o = _ju.populate(o, params, "_"); + } + + component.applyType(o, doNotRepaint, map); + if (!doNotRepaint) { + component.repaint(); + } + } + }, + +// ------------------------------ BEGIN jsPlumbUIComponent -------------------------------------------- + + jsPlumbUIComponent = root.jsPlumbUIComponent = function (params) { + + _ju.EventGenerator.apply(this, arguments); + + var self = this, + a = arguments, + idPrefix = self.idPrefix, + id = idPrefix + (new Date()).getTime(); + + this._jsPlumb = { + instance: params._jsPlumb, + parameters: params.parameters || {}, + paintStyle: null, + hoverPaintStyle: null, + paintStyleInUse: null, + hover: false, + beforeDetach: params.beforeDetach, + beforeDrop: params.beforeDrop, + overlayPlacements: [], + hoverClass: params.hoverClass || params._jsPlumb.Defaults.HoverClass, + types: [], + typeCache:{} + }; + + this.cacheTypeItem = function(key, item, typeId) { + this._jsPlumb.typeCache[typeId] = this._jsPlumb.typeCache[typeId] || {}; + this._jsPlumb.typeCache[typeId][key] = item; + }; + this.getCachedTypeItem = function(key, typeId) { + return this._jsPlumb.typeCache[typeId] ? this._jsPlumb.typeCache[typeId][key] : null; + }; + + this.getId = function () { + return id; + }; + +// ----------------------------- default type -------------------------------------------- + + + var o = params.overlays || [], oo = {}; + if (this.defaultOverlayKeys) { + for (var i = 0; i < this.defaultOverlayKeys.length; i++) { + Array.prototype.push.apply(o, this._jsPlumb.instance.Defaults[this.defaultOverlayKeys[i]] || []); + } + + for (i = 0; i < o.length; i++) { + // if a string, convert to object representation so that we can store the typeid on it. + // also assign an id. + var fo = jsPlumb.convertToFullOverlaySpec(o[i]); + oo[fo[1].id] = fo; + } + } + + var _defaultType = { + overlays:oo, + parameters: params.parameters || {}, + scope: params.scope || this._jsPlumb.instance.getDefaultScope() + }; + this.getDefaultType = function() { + return _defaultType; + }; + this.appendToDefaultType = function(obj) { + for (var i in obj) { + _defaultType[i] = obj[i]; + } + }; + +// ----------------------------- end default type -------------------------------------------- + + // all components can generate events + + if (params.events) { + for (var evtName in params.events) { + self.bind(evtName, params.events[evtName]); + } + } + + // all components get this clone function. + // TODO issue 116 showed a problem with this - it seems 'a' that is in + // the clone function's scope is shared by all invocations of it, the classic + // JS closure problem. for now, jsPlumb does a version of this inline where + // it used to call clone. but it would be nice to find some time to look + // further at this. + this.clone = function () { + var o = Object.create(this.constructor.prototype); + this.constructor.apply(o, a); + return o; + }.bind(this); + + // user can supply a beforeDetach callback, which will be executed before a detach + // is performed; returning false prevents the detach. + this.isDetachAllowed = function (connection) { + var r = true; + if (this._jsPlumb.beforeDetach) { + try { + r = this._jsPlumb.beforeDetach(connection); + } + catch (e) { + _ju.log("jsPlumb: beforeDetach callback failed", e); + } + } + return r; + }; + + // user can supply a beforeDrop callback, which will be executed before a dropped + // connection is confirmed. user can return false to reject connection. + this.isDropAllowed = function (sourceId, targetId, scope, connection, dropEndpoint, source, target) { + var r = this._jsPlumb.instance.checkCondition("beforeDrop", { + sourceId: sourceId, + targetId: targetId, + scope: scope, + connection: connection, + dropEndpoint: dropEndpoint, + source: source, target: target + }); + if (this._jsPlumb.beforeDrop) { + try { + r = this._jsPlumb.beforeDrop({ + sourceId: sourceId, + targetId: targetId, + scope: scope, + connection: connection, + dropEndpoint: dropEndpoint, + source: source, target: target + }); + } + catch (e) { + _ju.log("jsPlumb: beforeDrop callback failed", e); + } + } + return r; + }; + + var domListeners = []; + + // sets the component associated with listener events. for instance, an overlay delegates + // its events back to a connector. but if the connector is swapped on the underlying connection, + // then this component must be changed. This is called by setConnector in the Connection class. + this.setListenerComponent = function (c) { + for (var i = 0; i < domListeners.length; i++) { + domListeners[i][3] = c; + } + }; + + + }; + + var _removeTypeCssHelper = function (component, typeIndex) { + var typeId = component._jsPlumb.types[typeIndex], + type = component._jsPlumb.instance.getType(typeId, component.getTypeDescriptor()); + + if (type != null && type.cssClass && component.canvas) { + component._jsPlumb.instance.removeClass(component.canvas, type.cssClass); + } + }; + + _ju.extend(root.jsPlumbUIComponent, _ju.EventGenerator, { + + getParameter: function (name) { + return this._jsPlumb.parameters[name]; + }, + + setParameter: function (name, value) { + this._jsPlumb.parameters[name] = value; + }, + + getParameters: function () { + return this._jsPlumb.parameters; + }, + + setParameters: function (p) { + this._jsPlumb.parameters = p; + }, + + getClass:function() { + return jsPlumb.getClass(this.canvas); + }, + + hasClass:function(clazz) { + return jsPlumb.hasClass(this.canvas, clazz); + }, + + addClass: function (clazz) { + jsPlumb.addClass(this.canvas, clazz); + }, + + removeClass: function (clazz) { + jsPlumb.removeClass(this.canvas, clazz); + }, + + updateClasses: function (classesToAdd, classesToRemove) { + jsPlumb.updateClasses(this.canvas, classesToAdd, classesToRemove); + }, + + setType: function (typeId, params, doNotRepaint) { + this.clearTypes(); + this._jsPlumb.types = _splitType(typeId) || []; + _applyTypes(this, params, doNotRepaint); + }, + + getType: function () { + return this._jsPlumb.types; + }, + + reapplyTypes: function (params, doNotRepaint) { + _applyTypes(this, params, doNotRepaint); + }, + + hasType: function (typeId) { + return this._jsPlumb.types.indexOf(typeId) !== -1; + }, + + addType: function (typeId, params, doNotRepaint) { + var t = _splitType(typeId), _cont = false; + if (t != null) { + for (var i = 0, j = t.length; i < j; i++) { + if (!this.hasType(t[i])) { + this._jsPlumb.types.push(t[i]); + _cont = true; + } + } + if (_cont) { + _applyTypes(this, params, doNotRepaint); + } + } + }, + + removeType: function (typeId, params, doNotRepaint) { + var t = _splitType(typeId), _cont = false, _one = function (tt) { + var idx = this._jsPlumb.types.indexOf(tt); + if (idx !== -1) { + // remove css class if necessary + _removeTypeCssHelper(this, idx); + this._jsPlumb.types.splice(idx, 1); + return true; + } + return false; + }.bind(this); + + if (t != null) { + for (var i = 0, j = t.length; i < j; i++) { + _cont = _one(t[i]) || _cont; + } + if (_cont) { + _applyTypes(this, params, doNotRepaint); + } + } + }, + clearTypes: function (params, doNotRepaint) { + var i = this._jsPlumb.types.length; + for (var j = 0; j < i; j++) { + _removeTypeCssHelper(this, 0); + this._jsPlumb.types.splice(0, 1); + } + _applyTypes(this, params, doNotRepaint); + }, + + toggleType: function (typeId, params, doNotRepaint) { + var t = _splitType(typeId); + if (t != null) { + for (var i = 0, j = t.length; i < j; i++) { + var idx = this._jsPlumb.types.indexOf(t[i]); + if (idx !== -1) { + _removeTypeCssHelper(this, idx); + this._jsPlumb.types.splice(idx, 1); + } + else { + this._jsPlumb.types.push(t[i]); + } + } + + _applyTypes(this, params, doNotRepaint); + } + }, + applyType: function (t, doNotRepaint) { + this.setPaintStyle(t.paintStyle, doNotRepaint); + this.setHoverPaintStyle(t.hoverPaintStyle, doNotRepaint); + if (t.parameters) { + for (var i in t.parameters) { + this.setParameter(i, t.parameters[i]); + } + } + this._jsPlumb.paintStyleInUse = this.getPaintStyle(); + }, + setPaintStyle: function (style, doNotRepaint) { + // this._jsPlumb.paintStyle = jsPlumb.extend({}, style); + // TODO figure out if we want components to clone paintStyle so as not to share it. + this._jsPlumb.paintStyle = style; + this._jsPlumb.paintStyleInUse = this._jsPlumb.paintStyle; + _updateHoverStyle(this); + if (!doNotRepaint) { + this.repaint(); + } + }, + getPaintStyle: function () { + return this._jsPlumb.paintStyle; + }, + setHoverPaintStyle: function (style, doNotRepaint) { + //this._jsPlumb.hoverPaintStyle = jsPlumb.extend({}, style); + // TODO figure out if we want components to clone paintStyle so as not to share it. + this._jsPlumb.hoverPaintStyle = style; + _updateHoverStyle(this); + if (!doNotRepaint) { + this.repaint(); + } + }, + getHoverPaintStyle: function () { + return this._jsPlumb.hoverPaintStyle; + }, + destroy: function (force) { + if (force || this.typeId == null) { + this.cleanupListeners(); // this is on EventGenerator + this.clone = null; + this._jsPlumb = null; + } + }, + + isHover: function () { + return this._jsPlumb.hover; + }, + + setHover: function (hover, ignoreAttachedElements, timestamp) { + // while dragging, we ignore these events. this keeps the UI from flashing and + // swishing and whatevering. + if (this._jsPlumb && !this._jsPlumb.instance.currentlyDragging && !this._jsPlumb.instance.isHoverSuspended()) { + + this._jsPlumb.hover = hover; + var method = hover ? "addClass" : "removeClass"; + + if (this.canvas != null) { + if (this._jsPlumb.instance.hoverClass != null) { + this._jsPlumb.instance[method](this.canvas, this._jsPlumb.instance.hoverClass); + } + if (this._jsPlumb.hoverClass != null) { + this._jsPlumb.instance[method](this.canvas, this._jsPlumb.hoverClass); + } + } + if (this._jsPlumb.hoverPaintStyle != null) { + this._jsPlumb.paintStyleInUse = hover ? this._jsPlumb.hoverPaintStyle : this._jsPlumb.paintStyle; + if (!this._jsPlumb.instance.isSuspendDrawing()) { + timestamp = timestamp || _timestamp(); + this.repaint({timestamp: timestamp, recalc: false}); + } + } + // get the list of other affected elements, if supported by this component. + // for a connection, its the endpoints. for an endpoint, its the connections! surprise. + if (this.getAttachedElements && !ignoreAttachedElements) { + _updateAttachedElements(this, hover, _timestamp(), this); + } + } + } + }); + +// ------------------------------ END jsPlumbUIComponent -------------------------------------------- + + var _jsPlumbInstanceIndex = 0, + getInstanceIndex = function () { + var i = _jsPlumbInstanceIndex + 1; + _jsPlumbInstanceIndex++; + return i; + }; + + var jsPlumbInstance = root.jsPlumbInstance = function (_defaults) { + + this.version = "2.13.2"; + + this.Defaults = { + Anchor: "Bottom", + Anchors: [ null, null ], + ConnectionsDetachable: true, + ConnectionOverlays: [ ], + Connector: "Bezier", + Container: null, + DoNotThrowErrors: false, + DragOptions: { }, + DropOptions: { }, + Endpoint: "Dot", + EndpointOverlays: [ ], + Endpoints: [ null, null ], + EndpointStyle: { fill: "#456" }, + EndpointStyles: [ null, null ], + EndpointHoverStyle: null, + EndpointHoverStyles: [ null, null ], + HoverPaintStyle: null, + LabelStyle: { color: "black" }, + ListStyle: { }, + LogEnabled: false, + Overlays: [ ], + MaxConnections: 1, + PaintStyle: { "stroke-width": 4, stroke: "#456" }, + ReattachConnections: false, + RenderMode: "svg", + Scope: "jsPlumb_DefaultScope" + }; + + if (_defaults) { + jsPlumb.extend(this.Defaults, _defaults); + } + + this.logEnabled = this.Defaults.LogEnabled; + this._connectionTypes = {}; + this._endpointTypes = {}; + + _ju.EventGenerator.apply(this); + + var _currentInstance = this, + _instanceIndex = getInstanceIndex(), + _bb = _currentInstance.bind, + _initialDefaults = {}, + _zoom = 1, + _info = function (el) { + if (el == null) { + return null; + } + else if (el.nodeType === 3 || el.nodeType === 8) { + return { el:el, text:true }; + } + else { + var _el = _currentInstance.getElement(el); + return { el: _el, id: (_ju.isString(el) && _el == null) ? el : _getId(_el) }; + } + }; + + this.getInstanceIndex = function () { + return _instanceIndex; + }; + + // CONVERTED + this.setZoom = function (z, repaintEverything) { + _zoom = z; + _currentInstance.fire("zoom", _zoom); + if (repaintEverything) { + _currentInstance.repaintEverything(); + } + return true; + }; + // CONVERTED + this.getZoom = function () { + return _zoom; + }; + + for (var i in this.Defaults) { + _initialDefaults[i] = this.Defaults[i]; + } + + var _container, _containerDelegations = []; + this.unbindContainer = function() { + if (_container != null && _containerDelegations.length > 0) { + for (var i = 0; i < _containerDelegations.length; i++) { + _currentInstance.off(_container, _containerDelegations[i][0], _containerDelegations[i][1]); + } + } + }; + this.setContainer = function (c) { + + this.unbindContainer(); + + // get container as dom element. + c = this.getElement(c); + // move existing connections and endpoints, if any. + this.select().each(function (conn) { + conn.moveParent(c); + }); + this.selectEndpoints().each(function (ep) { + ep.moveParent(c); + }); + + // set container. + var previousContainer = _container; + _container = c; + _containerDelegations.length = 0; + var eventAliases = { + "endpointclick":"endpointClick", + "endpointdblclick":"endpointDblClick" + }; + + var _oneDelegateHandler = function (id, e, componentType) { + var t = e.srcElement || e.target, + jp = (t && t.parentNode ? t.parentNode._jsPlumb : null) || (t ? t._jsPlumb : null) || (t && t.parentNode && t.parentNode.parentNode ? t.parentNode.parentNode._jsPlumb : null); + if (jp) { + jp.fire(id, jp, e); + var alias = componentType ? eventAliases[componentType + id] || id : id; + // jsplumb also fires every event coming from components/overlays. That's what the test for `jp.component` is for. + _currentInstance.fire(alias, jp.component || jp, e); + } + }; + + var _addOneDelegate = function(eventId, selector, fn) { + _containerDelegations.push([eventId, fn]); + _currentInstance.on(_container, eventId, selector, fn); + }; + + // delegate one event on the container to jsplumb elements. it might be possible to + // abstract this out: each of endpoint, connection and overlay could register themselves with + // jsplumb as "component types" or whatever, and provide a suitable selector. this would be + // done by the renderer (although admittedly from 2.0 onwards we're not supporting vml anymore) + var _oneDelegate = function (id) { + // connections. + _addOneDelegate(id, ".jtk-connector", function (e) { + _oneDelegateHandler(id, e); + }); + // endpoints. note they can have an enclosing div, or not. + _addOneDelegate(id, ".jtk-endpoint", function (e) { + _oneDelegateHandler(id, e, "endpoint"); + }); + // overlays + _addOneDelegate(id, ".jtk-overlay", function (e) { + _oneDelegateHandler(id, e); + }); + }; + + for (var i = 0; i < events.length; i++) { + _oneDelegate(events[i]); + } + + // managed elements + for (var elId in managedElements) { + var el = managedElements[elId].el; + if (el.parentNode === previousContainer) { + previousContainer.removeChild(el); + _container.appendChild(el); + } + } + + }; + this.getContainer = function () { + return _container; + }; + + this.bind = function (event, fn) { + if ("ready" === event && initialized) { + fn(); + } + else { + _bb.apply(_currentInstance, [event, fn]); + } + }; + + _currentInstance.importDefaults = function (d) { + for (var i in d) { + _currentInstance.Defaults[i] = d[i]; + } + if (d.Container) { + _currentInstance.setContainer(d.Container); + } + + return _currentInstance; + }; + + _currentInstance.restoreDefaults = function () { + _currentInstance.Defaults = jsPlumb.extend({}, _initialDefaults); + return _currentInstance; + }; + + var log = null, + initialized = false, + // TODO remove from window scope + connections = [], + // map of element id -> endpoint lists. an element can have an arbitrary + // number of endpoints on it, and not all of them have to be connected + // to anything. + endpointsByElement = {}, + endpointsByUUID = {}, + managedElements = {}, + offsets = {}, + offsetTimestamps = {}, + draggableStates = {}, + connectionBeingDragged = false, + sizes = [], + _suspendDrawing = false, + _suspendedAt = null, + DEFAULT_SCOPE = this.Defaults.Scope, + _curIdStamp = 1, + _idstamp = function () { + return "" + _curIdStamp++; + }, + + // + // appends an element to some other element, which is calculated as follows: + // + // 1. if Container exists, use that element. + // 2. if the 'parent' parameter exists, use that. + // 3. otherwise just use the root element. + // + // + _appendElement = function (el, parent) { + if (_container) { + _container.appendChild(el); + } + else if (!parent) { + this.appendToRoot(el); + } + else { + this.getElement(parent).appendChild(el); + } + }.bind(this), + + // + // Draws an endpoint and its connections. this is the main entry point into drawing connections as well + // as endpoints, since jsPlumb is endpoint-centric under the hood. + // + // @param element element to draw (of type library specific element object) + // @param ui UI object from current library's event system. optional. + // @param timestamp timestamp for this paint cycle. used to speed things up a little by cutting down the amount of offset calculations we do. + // @param clearEdits defaults to false; indicates that mouse edits for connectors should be cleared + /// + _draw = function (element, ui, timestamp, clearEdits) { + + if (!_suspendDrawing) { + + element = _currentInstance.getElement(element); + + if (element != null) { + + var id = _getId(element), + repaintEls = element.querySelectorAll(".jtk-managed"); + + if (timestamp == null) { + timestamp = _timestamp(); + } + + // update the offset of everything _before_ we try to draw anything. + var o = _updateOffset({elId: id, offset: ui, recalc: false, timestamp: timestamp}); + + for (var i = 0; i < repaintEls.length; i++) { + _updateOffset({ + elId: repaintEls[i].getAttribute("id"), + // offset: { + // left: o.o.left + repaintEls[i].offset.left, + // top: o.o.top + repaintEls[i].offset.top + // }, + recalc: true, + timestamp: timestamp + }); + } + + _currentInstance.anchorManager.redraw(id, ui, timestamp, null, clearEdits); + + if (repaintEls) { + for (var j = 0; j < repaintEls.length; j++) { + _currentInstance.anchorManager.redraw(repaintEls[j].getAttribute("id"), null, timestamp, null, clearEdits, true); + } + } + } + } + }, + + // + // gets an Endpoint by uuid. + // + _getEndpoint = function (uuid) { + return endpointsByUUID[uuid]; + }, + + /** + * inits a draggable if it's not already initialised. + * TODO: somehow abstract this to the adapter, because the concept of "draggable" has no + * place on the server. + */ + + + _scopeMatch = function (e1, e2) { + var s1 = e1.scope.split(/\s/), s2 = e2.scope.split(/\s/); + for (var i = 0; i < s1.length; i++) { + for (var j = 0; j < s2.length; j++) { + if (s2[j] === s1[i]) { + return true; + } + } + } + + return false; + }, + + _mergeOverrides = function (def, values) { + var m = jsPlumb.extend({}, def); + for (var i in values) { + if (values[i]) { + m[i] = values[i]; + } + } + return m; + }, + + /* + * prepares a final params object that can be passed to _newConnection, taking into account defaults, events, etc. + */ + _prepareConnectionParams = function (params, referenceParams) { + var _p = jsPlumb.extend({ }, params); + if (referenceParams) { + jsPlumb.extend(_p, referenceParams); + } + + // hotwire endpoints passed as source or target to sourceEndpoint/targetEndpoint, respectively. + if (_p.source) { + if (_p.source.endpoint) { + _p.sourceEndpoint = _p.source; + } + else { + _p.source = _currentInstance.getElement(_p.source); + } + } + if (_p.target) { + if (_p.target.endpoint) { + _p.targetEndpoint = _p.target; + } + else { + _p.target = _currentInstance.getElement(_p.target); + } + } + + // test for endpoint uuids to connect + if (params.uuids) { + _p.sourceEndpoint = _getEndpoint(params.uuids[0]); + _p.targetEndpoint = _getEndpoint(params.uuids[1]); + } + + // now ensure that if we do have Endpoints already, they're not full. + // source: + if (_p.sourceEndpoint && _p.sourceEndpoint.isFull()) { + _ju.log(_currentInstance, "could not add connection; source endpoint is full"); + return; + } + + // target: + if (_p.targetEndpoint && _p.targetEndpoint.isFull()) { + _ju.log(_currentInstance, "could not add connection; target endpoint is full"); + return; + } + + // if source endpoint mandates connection type and nothing specified in our params, use it. + if (!_p.type && _p.sourceEndpoint) { + _p.type = _p.sourceEndpoint.connectionType; + } + + // copy in any connectorOverlays that were specified on the source endpoint. + // it doesnt copy target endpoint overlays. i'm not sure if we want it to or not. + if (_p.sourceEndpoint && _p.sourceEndpoint.connectorOverlays) { + _p.overlays = _p.overlays || []; + for (var i = 0, j = _p.sourceEndpoint.connectorOverlays.length; i < j; i++) { + _p.overlays.push(_p.sourceEndpoint.connectorOverlays[i]); + } + } + + // scope + if (_p.sourceEndpoint && _p.sourceEndpoint.scope) { + _p.scope = _p.sourceEndpoint.scope; + } + + // pointer events + if (!_p["pointer-events"] && _p.sourceEndpoint && _p.sourceEndpoint.connectorPointerEvents) { + _p["pointer-events"] = _p.sourceEndpoint.connectorPointerEvents; + } + + + var _addEndpoint = function (el, def, idx) { + var params = _mergeOverrides(def, { + anchor: _p.anchors ? _p.anchors[idx] : _p.anchor, + endpoint: _p.endpoints ? _p.endpoints[idx] : _p.endpoint, + paintStyle: _p.endpointStyles ? _p.endpointStyles[idx] : _p.endpointStyle, + hoverPaintStyle: _p.endpointHoverStyles ? _p.endpointHoverStyles[idx] : _p.endpointHoverStyle + }); + return _currentInstance.addEndpoint(el, params); + }; + + // check for makeSource/makeTarget specs. + + var _oneElementDef = function (type, idx, defs, matchType) { + if (_p[type] && !_p[type].endpoint && !_p[type + "Endpoint"] && !_p.newConnection) { + var tid = _getId(_p[type]), tep = defs[tid]; + + tep = tep ? tep[matchType] : null; + + if (tep) { + // if not enabled, return. + if (!tep.enabled) { + return false; + } + + var epDef = jsPlumb.extend({}, tep.def); + delete epDef.label; + + var newEndpoint = tep.endpoint != null && tep.endpoint._jsPlumb ? tep.endpoint : _addEndpoint(_p[type], epDef, idx); + if (newEndpoint.isFull()) { + return false; + } + _p[type + "Endpoint"] = newEndpoint; + if (!_p.scope && epDef.scope) { + _p.scope = epDef.scope; + } // provide scope if not already provided and endpoint def has one. + if (tep.uniqueEndpoint) { + if (!tep.endpoint) { + tep.endpoint = newEndpoint; + newEndpoint.setDeleteOnEmpty(false); + } + else { + newEndpoint.finalEndpoint = tep.endpoint; + } + } else { + newEndpoint.setDeleteOnEmpty(true); + } + + // + // copy in connector overlays if present on the source definition. + // + if (idx === 0 && tep.def.connectorOverlays) { + _p.overlays = _p.overlays || []; + Array.prototype.push.apply(_p.overlays, tep.def.connectorOverlays); + } + } + } + }; + + if (_oneElementDef("source", 0, this.sourceEndpointDefinitions, _p.type || "default") === false) { + return; + } + if (_oneElementDef("target", 1, this.targetEndpointDefinitions, _p.type || "default") === false) { + return; + } + + // last, ensure scopes match + if (_p.sourceEndpoint && _p.targetEndpoint) { + if (!_scopeMatch(_p.sourceEndpoint, _p.targetEndpoint)) { + _p = null; + } + } + + return _p; + }.bind(_currentInstance), + + _newConnection = function (params) { + var connectionFunc = _currentInstance.Defaults.ConnectionType || _currentInstance.getDefaultConnectionType(); + + params._jsPlumb = _currentInstance; + params.newConnection = _newConnection; + params.newEndpoint = _newEndpoint; + params.endpointsByUUID = endpointsByUUID; + params.endpointsByElement = endpointsByElement; + params.finaliseConnection = _finaliseConnection; + params.id = "con_" + _idstamp(); + var con = new connectionFunc(params); + + // if the connection is draggable, then maybe we need to tell the target endpoint to init the + // dragging code. it won't run again if it already configured to be draggable. + if (con.isDetachable()) { + con.endpoints[0].initDraggable("_jsPlumbSource"); + con.endpoints[1].initDraggable("_jsPlumbTarget"); + } + + return con; + }, + + // + // adds the connection to the backing model, fires an event if necessary and then redraws + // + _finaliseConnection = _currentInstance.finaliseConnection = function (jpc, params, originalEvent, doInformAnchorManager) { + params = params || {}; + // add to list of connections (by scope). + if (!jpc.suspendedEndpoint) { + connections.push(jpc); + } + + jpc.pending = null; + + // turn off isTemporarySource on the source endpoint (only viable on first draw) + jpc.endpoints[0].isTemporarySource = false; + + // always inform the anchor manager + // except that if jpc has a suspended endpoint it's not true to say the + // connection is new; it has just (possibly) moved. the question is whether + // to make that call here or in the anchor manager. i think perhaps here. + if (doInformAnchorManager !== false) { + _currentInstance.anchorManager.newConnection(jpc); + } + + // force a paint + _draw(jpc.source); + + // fire an event + if (!params.doNotFireConnectionEvent && params.fireEvent !== false) { + + var eventArgs = { + connection: jpc, + source: jpc.source, target: jpc.target, + sourceId: jpc.sourceId, targetId: jpc.targetId, + sourceEndpoint: jpc.endpoints[0], targetEndpoint: jpc.endpoints[1] + }; + + _currentInstance.fire("connection", eventArgs, originalEvent); + } + }, + + /* + factory method to prepare a new endpoint. this should always be used instead of creating Endpoints + manually, since this method attaches event listeners and an id. + */ + _newEndpoint = function (params, id) { + var endpointFunc = _currentInstance.Defaults.EndpointType || jsPlumb.Endpoint; + var _p = jsPlumb.extend({}, params); + //delete _p.label; // not supported by endpoint. + _p._jsPlumb = _currentInstance; + _p.newConnection = _newConnection; + _p.newEndpoint = _newEndpoint; + _p.endpointsByUUID = endpointsByUUID; + _p.endpointsByElement = endpointsByElement; + _p.fireDetachEvent = fireDetachEvent; + _p.elementId = id || _getId(_p.source); + var ep = new endpointFunc(_p); + ep.id = "ep_" + _idstamp(); + _manage(_p.elementId, _p.source); + + if (!jsPlumb.headless) { + _currentInstance.getDragManager().endpointAdded(_p.source, id); + } + + return ep; + }, + + /* + * performs the given function operation on all the connections found + * for the given element id; this means we find all the endpoints for + * the given element, and then for each endpoint find the connectors + * connected to it. then we pass each connection in to the given + * function. + */ + _operation = function (elId, func, endpointFunc) { + var endpoints = endpointsByElement[elId]; + if (endpoints && endpoints.length) { + for (var i = 0, ii = endpoints.length; i < ii; i++) { + for (var j = 0, jj = endpoints[i].connections.length; j < jj; j++) { + var retVal = func(endpoints[i].connections[j]); + // if the function passed in returns true, we exit. + // most functions return false. + if (retVal) { + return; + } + } + if (endpointFunc) { + endpointFunc(endpoints[i]); + } + } + } + }, + + _setDraggable = function (element, draggable) { + return jsPlumb.each(element, function (el) { + if (_currentInstance.isDragSupported(el)) { + draggableStates[_currentInstance.getAttribute(el, "id")] = draggable; + _currentInstance.setElementDraggable(el, draggable); + } + }); + }, + /* + * private method to do the business of hiding/showing. + * + * @param el + * either Id of the element in question or a library specific + * object for the element. + * @param state + * String specifying a value for the css 'display' property + * ('block' or 'none'). + */ + _setVisible = function (el, state, alsoChangeEndpoints) { + state = state === "block"; + var endpointFunc = null; + if (alsoChangeEndpoints) { + endpointFunc = function (ep) { + ep.setVisible(state, true, true); + }; + } + var info = _info(el); + _operation(info.id, function (jpc) { + if (state && alsoChangeEndpoints) { + // this test is necessary because this functionality is new, and i wanted to maintain backwards compatibility. + // this block will only set a connection to be visible if the other endpoint in the connection is also visible. + var oidx = jpc.sourceId === info.id ? 1 : 0; + if (jpc.endpoints[oidx].isVisible()) { + jpc.setVisible(true); + } + } + else { // the default behaviour for show, and what always happens for hide, is to just set the visibility without getting clever. + jpc.setVisible(state); + } + }, endpointFunc); + }, + /** + * private method to do the business of toggling hiding/showing. + */ + _toggleVisible = function (elId, changeEndpoints) { + var endpointFunc = null; + if (changeEndpoints) { + endpointFunc = function (ep) { + var state = ep.isVisible(); + ep.setVisible(!state); + }; + } + _operation(elId, function (jpc) { + var state = jpc.isVisible(); + jpc.setVisible(!state); + }, endpointFunc); + }, + + // TODO comparison performance + _getCachedData = function (elId) { + var o = offsets[elId]; + if (!o) { + return _updateOffset({elId: elId}); + } + else { + return {o: o, s: sizes[elId]}; + } + }, + + /** + * gets an id for the given element, creating and setting one if + * necessary. the id is of the form + * + * jsPlumb__ + * + * where "index in instance" is a monotonically increasing integer that starts at 0, + * for each instance. this method is used not only to assign ids to elements that do not + * have them but also to connections and endpoints. + */ + _getId = function (element, uuid, doNotCreateIfNotFound) { + if (_ju.isString(element)) { + return element; + } + if (element == null) { + return null; + } + var id = _currentInstance.getAttribute(element, "id"); + if (!id || id === "undefined") { + // check if fixed uuid parameter is given + if (arguments.length === 2 && arguments[1] !== undefined) { + id = uuid; + } + else if (arguments.length === 1 || (arguments.length === 3 && !arguments[2])) { + id = "jsPlumb_" + _instanceIndex + "_" + _idstamp(); + } + + if (!doNotCreateIfNotFound) { + _currentInstance.setAttribute(element, "id", id); + } + } + return id; + }; + + this.setConnectionBeingDragged = function (v) { + connectionBeingDragged = v; + }; + this.isConnectionBeingDragged = function () { + return connectionBeingDragged; + }; + + /** + * Returns a map of all the elements this jsPlumbInstance is currently managing. + * @returns {Object} Map of [id-> {el, endpoint[], connection, position}] information. + */ + this.getManagedElements = function() { + return managedElements; + }; + + this.connectorClass = "jtk-connector"; + this.connectorOutlineClass = "jtk-connector-outline"; + this.connectedClass = "jtk-connected"; + this.hoverClass = "jtk-hover"; + this.endpointClass = "jtk-endpoint"; + this.endpointConnectedClass = "jtk-endpoint-connected"; + this.endpointFullClass = "jtk-endpoint-full"; + this.endpointDropAllowedClass = "jtk-endpoint-drop-allowed"; + this.endpointDropForbiddenClass = "jtk-endpoint-drop-forbidden"; + this.overlayClass = "jtk-overlay"; + this.draggingClass = "jtk-dragging";// CONVERTED + this.elementDraggingClass = "jtk-element-dragging";// CONVERTED + this.sourceElementDraggingClass = "jtk-source-element-dragging"; // CONVERTED + this.targetElementDraggingClass = "jtk-target-element-dragging";// CONVERTED + this.endpointAnchorClassPrefix = "jtk-endpoint-anchor"; + this.hoverSourceClass = "jtk-source-hover"; + this.hoverTargetClass = "jtk-target-hover"; + this.dragSelectClass = "jtk-drag-select"; + + this.Anchors = {}; + this.Connectors = { "svg": {} }; + this.Endpoints = { "svg": {} }; + this.Overlays = { "svg": {} } ; + this.ConnectorRenderers = {}; + this.SVG = "svg"; + +// --------------------------- jsPlumbInstance public API --------------------------------------------------------- + + + this.addEndpoint = function (el, params, referenceParams) { + referenceParams = referenceParams || {}; + var p = jsPlumb.extend({}, referenceParams); + jsPlumb.extend(p, params); + p.endpoint = p.endpoint || _currentInstance.Defaults.Endpoint; + p.paintStyle = p.paintStyle || _currentInstance.Defaults.EndpointStyle; + + var results = [], + inputs = (_ju.isArray(el) || (el.length != null && !_ju.isString(el))) ? el : [ el ]; + + for (var i = 0, j = inputs.length; i < j; i++) { + p.source = _currentInstance.getElement(inputs[i]); + _ensureContainer(p.source); + + var id = _getId(p.source), e = _newEndpoint(p, id); + + // ensure element is managed. force a recalc if drawing not suspended, to ensure the cached value is fresh + var myOffset = _manage(id, p.source, null, !_suspendDrawing).info.o; + _ju.addToList(endpointsByElement, id, e); + + if (!_suspendDrawing) { + e.paint({ + anchorLoc: e.anchor.compute({ xy: [ myOffset.left, myOffset.top ], wh: sizes[id], element: e, timestamp: _suspendedAt }), + timestamp: _suspendedAt + }); + } + + results.push(e); + } + + return results.length === 1 ? results[0] : results; + }; + + this.addEndpoints = function (el, endpoints, referenceParams) { + var results = []; + for (var i = 0, j = endpoints.length; i < j; i++) { + var e = _currentInstance.addEndpoint(el, endpoints[i], referenceParams); + if (_ju.isArray(e)) { + Array.prototype.push.apply(results, e); + } + else { + results.push(e); + } + } + return results; + }; + + this.animate = function (el, properties, options) { + if (!this.animationSupported) { + return false; + } + + options = options || {}; + var del = _currentInstance.getElement(el), + id = _getId(del), + stepFunction = jsPlumb.animEvents.step, + completeFunction = jsPlumb.animEvents.complete; + + options[stepFunction] = _ju.wrap(options[stepFunction], function () { + _currentInstance.revalidate(id); + }); + + // onComplete repaints, just to make sure everything looks good at the end of the animation. + options[completeFunction] = _ju.wrap(options[completeFunction], function () { + _currentInstance.revalidate(id); + }); + + _currentInstance.doAnimate(del, properties, options); + }; + + /** + * checks for a listener for the given condition, executing it if found, passing in the given value. + * condition listeners would have been attached using "bind" (which is, you could argue, now overloaded, since + * firing click events etc is a bit different to what this does). i thought about adding a "bindCondition" + * or something, but decided against it, for the sake of simplicity. jsPlumb will never fire one of these + * condition events anyway. + */ + this.checkCondition = function (conditionName, args) { + var l = _currentInstance.getListener(conditionName), + r = true; + + if (l && l.length > 0) { + var values = Array.prototype.slice.call(arguments, 1); + try { + for (var i = 0, j = l.length; i < j; i++) { + r = r && l[i].apply(l[i], values); + } + } + catch (e) { + _ju.log(_currentInstance, "cannot check condition [" + conditionName + "]" + e); + } + } + return r; + }; + + this.connect = function (params, referenceParams) { + // prepare a final set of parameters to create connection with + var _p = _prepareConnectionParams(params, referenceParams), jpc; + // TODO probably a nicer return value if the connection was not made. _prepareConnectionParams + // will return null (and log something) if either endpoint was full. what would be nicer is to + // create a dedicated 'error' object. + if (_p) { + if (_p.source == null && _p.sourceEndpoint == null) { + _ju.log("Cannot establish connection - source does not exist"); + return; + } + if (_p.target == null && _p.targetEndpoint == null) { + _ju.log("Cannot establish connection - target does not exist"); + return; + } + _ensureContainer(_p.source); + // create the connection. it is not yet registered + jpc = _newConnection(_p); + // now add it the model, fire an event, and redraw + _finaliseConnection(jpc, _p); + } + return jpc; + }; + + var stTypes = [ + { el: "source", elId: "sourceId", epDefs: "sourceEndpointDefinitions" }, + { el: "target", elId: "targetId", epDefs: "targetEndpointDefinitions" } + ]; + + var _set = function (c, el, idx, doNotRepaint) { + var ep, _st = stTypes[idx], cId = c[_st.elId], cEl = c[_st.el], sid, sep, + oldEndpoint = c.endpoints[idx]; + + var evtParams = { + index: idx, + originalSourceId: idx === 0 ? cId : c.sourceId, + newSourceId: c.sourceId, + originalTargetId: idx === 1 ? cId : c.targetId, + newTargetId: c.targetId, + connection: c + }; + + if (el.constructor === jsPlumb.Endpoint) { + ep = el; + ep.addConnection(c); + el = ep.element; + } + else { + sid = _getId(el); + sep = this[_st.epDefs][sid]; + + if (sid === c[_st.elId]) { + ep = null; // dont change source/target if the element is already the one given. + } + else if (sep) { + for (var t in sep) { + if (!sep[t].enabled) { + return; + } + ep = sep[t].endpoint != null && sep[t].endpoint._jsPlumb ? sep[t].endpoint : this.addEndpoint(el, sep[t].def); + if (sep[t].uniqueEndpoint) { + sep[t].endpoint = ep; + } + ep.addConnection(c); + } + } + else { + ep = c.makeEndpoint(idx === 0, el, sid); + } + } + + if (ep != null) { + oldEndpoint.detachFromConnection(c); + c.endpoints[idx] = ep; + c[_st.el] = ep.element; + c[_st.elId] = ep.elementId; + evtParams[idx === 0 ? "newSourceId" : "newTargetId"] = ep.elementId; + + fireMoveEvent(evtParams); + + if (!doNotRepaint) { + c.repaint(); + } + } + + evtParams.element = el; + return evtParams; + + }.bind(this); + + this.setSource = function (connection, el, doNotRepaint) { + var p = _set(connection, el, 0, doNotRepaint); + this.anchorManager.sourceChanged(p.originalSourceId, p.newSourceId, connection, p.el); + }; + this.setTarget = function (connection, el, doNotRepaint) { + var p = _set(connection, el, 1, doNotRepaint); + this.anchorManager.updateOtherEndpoint(p.originalSourceId, p.originalTargetId, p.newTargetId, connection); + }; + + this.deleteEndpoint = function (object, dontUpdateHover, deleteAttachedObjects) { + var endpoint = (typeof object === "string") ? endpointsByUUID[object] : object; + if (endpoint) { + _currentInstance.deleteObject({ endpoint: endpoint, dontUpdateHover: dontUpdateHover, deleteAttachedObjects:deleteAttachedObjects }); + } + return _currentInstance; + }; + + this.deleteEveryEndpoint = function () { + var _is = _currentInstance.setSuspendDrawing(true); + for (var id in endpointsByElement) { + var endpoints = endpointsByElement[id]; + if (endpoints && endpoints.length) { + for (var i = 0, j = endpoints.length; i < j; i++) { + _currentInstance.deleteEndpoint(endpoints[i], true); + } + } + } + endpointsByElement = {}; + managedElements = {}; + endpointsByUUID = {}; + offsets = {}; + offsetTimestamps = {}; + _currentInstance.anchorManager.reset(); + var dm = _currentInstance.getDragManager(); + if (dm) { + dm.reset(); + } + if (!_is) { + _currentInstance.setSuspendDrawing(false); + } + return _currentInstance; + }; + + var fireDetachEvent = function (jpc, doFireEvent, originalEvent) { + // may have been given a connection, or in special cases, an object + var connType = _currentInstance.Defaults.ConnectionType || _currentInstance.getDefaultConnectionType(), + argIsConnection = jpc.constructor === connType, + params = argIsConnection ? { + connection: jpc, + source: jpc.source, target: jpc.target, + sourceId: jpc.sourceId, targetId: jpc.targetId, + sourceEndpoint: jpc.endpoints[0], targetEndpoint: jpc.endpoints[1] + } : jpc; + + if (doFireEvent) { + _currentInstance.fire("connectionDetached", params, originalEvent); + } + + // always fire this. used by internal jsplumb stuff. + _currentInstance.fire("internal.connectionDetached", params, originalEvent); + + _currentInstance.anchorManager.connectionDetached(params); + }; + + var fireMoveEvent = _currentInstance.fireMoveEvent = function (params, evt) { + _currentInstance.fire("connectionMoved", params, evt); + }; + + this.unregisterEndpoint = function (endpoint) { + if (endpoint._jsPlumb.uuid) { + endpointsByUUID[endpoint._jsPlumb.uuid] = null; + } + _currentInstance.anchorManager.deleteEndpoint(endpoint); + // TODO at least replace this with a removeWithFunction call. + for (var e in endpointsByElement) { + var endpoints = endpointsByElement[e]; + if (endpoints) { + var newEndpoints = []; + for (var i = 0, j = endpoints.length; i < j; i++) { + if (endpoints[i] !== endpoint) { + newEndpoints.push(endpoints[i]); + } + } + + endpointsByElement[e] = newEndpoints; + } + if (endpointsByElement[e].length < 1) { + delete endpointsByElement[e]; + } + } + }; + + var IS_DETACH_ALLOWED = "isDetachAllowed"; + var BEFORE_DETACH = "beforeDetach"; + var CHECK_CONDITION = "checkCondition"; + + /** + * Deletes a Connection. + * @method deleteConnection + * @param connection Connection to delete + * @param {Object} [params] Optional delete parameters + * @param {Boolean} [params.doNotFireEvent=false] If true, a connection detached event will not be fired. Otherwise one will. + * @param {Boolean} [params.force=false] If true, the connection will be deleted even if a beforeDetach interceptor tries to stop the deletion. + * @returns {Boolean} True if the connection was deleted, false otherwise. + */ + this.deleteConnection = function(connection, params) { + + if (connection != null) { + params = params || {}; + + if (params.force || _ju.functionChain(true, false, [ + [ connection.endpoints[0], IS_DETACH_ALLOWED, [ connection ] ], + [ connection.endpoints[1], IS_DETACH_ALLOWED, [ connection ] ], + [ connection, IS_DETACH_ALLOWED, [ connection ] ], + [ _currentInstance, CHECK_CONDITION, [ BEFORE_DETACH, connection ] ] + ])) { + + connection.setHover(false); + fireDetachEvent(connection, !connection.pending && params.fireEvent !== false, params.originalEvent); + + connection.endpoints[0].detachFromConnection(connection); + connection.endpoints[1].detachFromConnection(connection); + _ju.removeWithFunction(connections, function (_c) { + return connection.id === _c.id; + }); + + connection.cleanup(); + connection.destroy(); + return true; + } + } + return false; + }; + + /** + * Remove all Connections from all elements, but leaves Endpoints in place ((unless a connection is set to auto delete its Endpoints). + * @method deleteEveryConnection + * @param {Object} [params] optional params object for the call + * @param {Boolean} [params.fireEvent=true] Whether or not to fire detach events + * @param {Boolean} [params.forceDetach=false] If true, this call will ignore any `beforeDetach` interceptors. + * @returns {Number} The number of connections that were deleted. + */ + this.deleteEveryConnection = function (params) { + params = params || {}; + var count = connections.length, deletedCount = 0; + _currentInstance.batch(function () { + for (var i = 0; i < count; i++) { + deletedCount += _currentInstance.deleteConnection(connections[0], params) ? 1 : 0; + } + }); + return deletedCount; + }; + + /** + * Removes all an element's Connections. + * @method deleteConnectionsForElement + * @param {Object} el Either the id of the element, or a selector for the element. + * @param {Object} [params] Optional parameters. + * @param {Boolean} [params.fireEvent=true] Whether or not to fire the detach event. + * @param {Boolean} [params.forceDetach=false] If true, this call will ignore any `beforeDetach` interceptors. + * @return {jsPlumbInstance} The current jsPlumb instance. + */ + this.deleteConnectionsForElement = function (el, params) { + params = params || {}; + el = _currentInstance.getElement(el); + var id = _getId(el), endpoints = endpointsByElement[id]; + if (endpoints && endpoints.length) { + for (var i = 0, j = endpoints.length; i < j; i++) { + endpoints[i].deleteEveryConnection(params); + } + } + return _currentInstance; + }; + + /// not public. but of course its exposed. how to change this. + this.deleteObject = function (params) { + var result = { + endpoints: {}, + connections: {}, + endpointCount: 0, + connectionCount: 0 + }, + deleteAttachedObjects = params.deleteAttachedObjects !== false; + + var unravelConnection = function (connection) { + if (connection != null && result.connections[connection.id] == null) { + if (!params.dontUpdateHover && connection._jsPlumb != null) { + connection.setHover(false); + } + result.connections[connection.id] = connection; + result.connectionCount++; + } + }; + var unravelEndpoint = function (endpoint) { + if (endpoint != null && result.endpoints[endpoint.id] == null) { + if (!params.dontUpdateHover && endpoint._jsPlumb != null) { + endpoint.setHover(false); + } + result.endpoints[endpoint.id] = endpoint; + result.endpointCount++; + + if (deleteAttachedObjects) { + for (var i = 0; i < endpoint.connections.length; i++) { + var c = endpoint.connections[i]; + unravelConnection(c); + } + } + } + }; + + if (params.connection) { + unravelConnection(params.connection); + } + else { + unravelEndpoint(params.endpoint); + } + + // loop through connections + for (var i in result.connections) { + var c = result.connections[i]; + if (c._jsPlumb) { + _ju.removeWithFunction(connections, function (_c) { + return c.id === _c.id; + }); + + fireDetachEvent(c, params.fireEvent === false ? false : !c.pending, params.originalEvent); + var doNotCleanup = params.deleteAttachedObjects == null ? null : !params.deleteAttachedObjects; + + c.endpoints[0].detachFromConnection(c, null, doNotCleanup); + c.endpoints[1].detachFromConnection(c, null, doNotCleanup); + + c.cleanup(true); + c.destroy(true); + } + } + + // loop through endpoints + for (var j in result.endpoints) { + var e = result.endpoints[j]; + if (e._jsPlumb) { + _currentInstance.unregisterEndpoint(e); + // FIRE some endpoint deleted event? + e.cleanup(true); + e.destroy(true); + } + } + + return result; + }; + + + // helpers for select/selectEndpoints + var _setOperation = function (list, func, args, selector) { + for (var i = 0, j = list.length; i < j; i++) { + list[i][func].apply(list[i], args); + } + return selector(list); + }, + _getOperation = function (list, func, args) { + var out = []; + for (var i = 0, j = list.length; i < j; i++) { + out.push([ list[i][func].apply(list[i], args), list[i] ]); + } + return out; + }, + setter = function (list, func, selector) { + return function () { + return _setOperation(list, func, arguments, selector); + }; + }, + getter = function (list, func) { + return function () { + return _getOperation(list, func, arguments); + }; + }, + prepareList = function (input, doNotGetIds) { + var r = []; + if (input) { + if (typeof input === 'string') { + if (input === "*") { + return input; + } + r.push(input); + } + else { + if (doNotGetIds) { + r = input; + } + else { + if (input.length) { + for (var i = 0, j = input.length; i < j; i++) { + r.push(_info(input[i]).id); + } + } + else { + r.push(_info(input).id); + } + } + } + } + return r; + }, + filterList = function (list, value, missingIsFalse) { + if (list === "*") { + return true; + } + return list.length > 0 ? list.indexOf(value) !== -1 : !missingIsFalse; + }; + + // get some connections, specifying source/target/scope + this.getConnections = function (options, flat) { + if (!options) { + options = {}; + } else if (options.constructor === String) { + options = { "scope": options }; + } + var scope = options.scope || _currentInstance.getDefaultScope(), + scopes = prepareList(scope, true), + sources = prepareList(options.source), + targets = prepareList(options.target), + results = (!flat && scopes.length > 1) ? {} : [], + _addOne = function (scope, obj) { + if (!flat && scopes.length > 1) { + var ss = results[scope]; + if (ss == null) { + ss = results[scope] = []; + } + ss.push(obj); + } else { + results.push(obj); + } + }; + + for (var j = 0, jj = connections.length; j < jj; j++) { + var c = connections[j], + sourceId = c.proxies && c.proxies[0] ? c.proxies[0].originalEp.elementId : c.sourceId, + targetId = c.proxies && c.proxies[1] ? c.proxies[1].originalEp.elementId : c.targetId; + + if (filterList(scopes, c.scope) && filterList(sources, sourceId) && filterList(targets, targetId)) { + _addOne(c.scope, c); + } + } + + return results; + }; + + var _curryEach = function (list, executor) { + return function (f) { + for (var i = 0, ii = list.length; i < ii; i++) { + f(list[i]); + } + return executor(list); + }; + }, + _curryGet = function (list) { + return function (idx) { + return list[idx]; + }; + }; + + var _makeCommonSelectHandler = function (list, executor) { + var out = { + length: list.length, + each: _curryEach(list, executor), + get: _curryGet(list) + }, + setters = ["setHover", "removeAllOverlays", "setLabel", "addClass", "addOverlay", "removeOverlay", + "removeOverlays", "showOverlay", "hideOverlay", "showOverlays", "hideOverlays", "setPaintStyle", + "setHoverPaintStyle", "setSuspendEvents", "setParameter", "setParameters", "setVisible", + "repaint", "addType", "toggleType", "removeType", "removeClass", "setType", "bind", "unbind" ], + + getters = ["getLabel", "getOverlay", "isHover", "getParameter", "getParameters", "getPaintStyle", + "getHoverPaintStyle", "isVisible", "hasType", "getType", "isSuspendEvents" ], + i, ii; + + for (i = 0, ii = setters.length; i < ii; i++) { + out[setters[i]] = setter(list, setters[i], executor); + } + + for (i = 0, ii = getters.length; i < ii; i++) { + out[getters[i]] = getter(list, getters[i]); + } + + return out; + }; + + var _makeConnectionSelectHandler = function (list) { + var common = _makeCommonSelectHandler(list, _makeConnectionSelectHandler); + return jsPlumb.extend(common, { + // setters + setDetachable: setter(list, "setDetachable", _makeConnectionSelectHandler), + setReattach: setter(list, "setReattach", _makeConnectionSelectHandler), + setConnector: setter(list, "setConnector", _makeConnectionSelectHandler), + delete: function () { + for (var i = 0, ii = list.length; i < ii; i++) { + _currentInstance.deleteConnection(list[i]); + } + }, + // getters + isDetachable: getter(list, "isDetachable"), + isReattach: getter(list, "isReattach") + }); + }; + + var _makeEndpointSelectHandler = function (list) { + var common = _makeCommonSelectHandler(list, _makeEndpointSelectHandler); + return jsPlumb.extend(common, { + setEnabled: setter(list, "setEnabled", _makeEndpointSelectHandler), + setAnchor: setter(list, "setAnchor", _makeEndpointSelectHandler), + isEnabled: getter(list, "isEnabled"), + deleteEveryConnection: function () { + for (var i = 0, ii = list.length; i < ii; i++) { + list[i].deleteEveryConnection(); + } + }, + "delete": function () { + for (var i = 0, ii = list.length; i < ii; i++) { + _currentInstance.deleteEndpoint(list[i]); + } + } + }); + }; + + this.select = function (params) { + params = params || {}; + params.scope = params.scope || "*"; + return _makeConnectionSelectHandler(params.connections || _currentInstance.getConnections(params, true)); + }; + + this.selectEndpoints = function (params) { + params = params || {}; + params.scope = params.scope || "*"; + var noElementFilters = !params.element && !params.source && !params.target, + elements = noElementFilters ? "*" : prepareList(params.element), + sources = noElementFilters ? "*" : prepareList(params.source), + targets = noElementFilters ? "*" : prepareList(params.target), + scopes = prepareList(params.scope, true); + + var ep = []; + + for (var el in endpointsByElement) { + var either = filterList(elements, el, true), + source = filterList(sources, el, true), + sourceMatchExact = sources !== "*", + target = filterList(targets, el, true), + targetMatchExact = targets !== "*"; + + // if they requested 'either' then just match scope. otherwise if they requested 'source' (not as a wildcard) then we have to match only endpoints that have isSource set to to true, and the same thing with isTarget. + if (either || source || target) { + inner: + for (var i = 0, ii = endpointsByElement[el].length; i < ii; i++) { + var _ep = endpointsByElement[el][i]; + if (filterList(scopes, _ep.scope, true)) { + + var noMatchSource = (sourceMatchExact && sources.length > 0 && !_ep.isSource), + noMatchTarget = (targetMatchExact && targets.length > 0 && !_ep.isTarget); + + if (noMatchSource || noMatchTarget) { + continue inner; + } + + ep.push(_ep); + } + } + } + } + + return _makeEndpointSelectHandler(ep); + }; + + // get all connections managed by the instance of jsplumb. + this.getAllConnections = function () { + return connections; + }; + this.getDefaultScope = function () { + return DEFAULT_SCOPE; + }; + // get an endpoint by uuid. + this.getEndpoint = _getEndpoint; + /** + * Gets the list of Endpoints for a given element. + * @method getEndpoints + * @param {String|Element|Selector} el The element to get endpoints for. + * @return {Endpoint[]} An array of Endpoints for the specified element. + */ + this.getEndpoints = function (el) { + return endpointsByElement[_info(el).id] || []; + }; + // gets the default endpoint type. used when subclassing. see wiki. + this.getDefaultEndpointType = function () { + return jsPlumb.Endpoint; + }; + // gets the default connection type. used when subclassing. see wiki. + this.getDefaultConnectionType = function () { + return jsPlumb.Connection; + }; + /* + * Gets an element's id, creating one if necessary. really only exposed + * for the lib-specific functionality to access; would be better to pass + * the current instance into the lib-specific code (even though this is + * a static call. i just don't want to expose it to the public API). + */ + this.getId = _getId; + this.draw = _draw; + this.info = _info; + + this.appendElement = _appendElement; + + var _hoverSuspended = false; + this.isHoverSuspended = function () { + return _hoverSuspended; + }; + this.setHoverSuspended = function (s) { + _hoverSuspended = s; + }; + + // set an element's connections to be hidden + this.hide = function (el, changeEndpoints) { + _setVisible(el, "none", changeEndpoints); + return _currentInstance; + }; + + // exposed for other objects to use to get a unique id. + this.idstamp = _idstamp; + + // ensure that, if the current container exists, it is a DOM element and not a selector. + // if it does not exist and `candidate` is supplied, the offset parent of that element will be set as the Container. + // this is used to do a better default behaviour for the case that the user has not set a container: + // addEndpoint, makeSource, makeTarget and connect all call this method with the offsetParent of the + // element in question (for connect it is the source element). So if no container is set, it is inferred + // to be the offsetParent of the first element the user tries to connect. + var _ensureContainer = function (candidate) { + if (!_container && candidate) { + var can = _currentInstance.getElement(candidate); + if (can.offsetParent) { + _currentInstance.setContainer(can.offsetParent); + } + } + }; + + var _getContainerFromDefaults = function () { + if (_currentInstance.Defaults.Container) { + _currentInstance.setContainer(_currentInstance.Defaults.Container); + } + }; + + // check if a given element is managed or not. if not, add to our map. if drawing is not suspended then + // we'll also stash its dimensions; otherwise we'll do this in a lazy way through updateOffset. + var _manage = _currentInstance.manage = function (id, element, _transient, _recalc) { + if (!managedElements[id]) { + managedElements[id] = { + el: element, + endpoints: [], + connections: [] + }; + + managedElements[id].info = _updateOffset({ elId: id, timestamp: _suspendedAt }); + _currentInstance.addClass(element, "jtk-managed"); + + if (!_transient) { + _currentInstance.fire("manageElement", { id:id, info:managedElements[id].info, el:element }); + } + } else { + if (_recalc) { + managedElements[id].info = _updateOffset({ elId: id, timestamp: _suspendedAt, recalc:true }); + } + } + + return managedElements[id]; + }; + + var _unmanage = _currentInstance.unmanage = function(id) { + if (managedElements[id]) { + var el = managedElements[id].el; + _currentInstance.removeClass(el, "jtk-managed"); + delete managedElements[id]; + _currentInstance.fire("unmanageElement", {id:id, el:el}); + } + }; + + /** + * updates the offset and size for a given element, and stores the + * values. if 'offset' is not null we use that (it would have been + * passed in from a drag call) because it's faster; but if it is null, + * or if 'recalc' is true in order to force a recalculation, we get the current values. + * @method updateOffset + */ + var _updateOffset = function (params) { + + var timestamp = params.timestamp, recalc = params.recalc, offset = params.offset, elId = params.elId, s; + if (_suspendDrawing && !timestamp) { + timestamp = _suspendedAt; + } + if (!recalc) { + if (timestamp && timestamp === offsetTimestamps[elId]) { + return {o: params.offset || offsets[elId], s: sizes[elId]}; + } + } + if (recalc || (!offset && offsets[elId] == null)) { // if forced repaint or no offset available, we recalculate. + + // get the current size and offset, and store them + s = managedElements[elId] ? managedElements[elId].el : null; + if (s != null) { + sizes[elId] = _currentInstance.getSize(s); + offsets[elId] = _currentInstance.getOffset(s); + offsetTimestamps[elId] = timestamp; + } + } else { + offsets[elId] = offset || offsets[elId]; + if (sizes[elId] == null) { + s = managedElements[elId].el; + if (s != null) { + sizes[elId] = _currentInstance.getSize(s); + } + } + offsetTimestamps[elId] = timestamp; + } + + if (offsets[elId] && !offsets[elId].right) { + offsets[elId].right = offsets[elId].left + sizes[elId][0]; + offsets[elId].bottom = offsets[elId].top + sizes[elId][1]; + offsets[elId].width = sizes[elId][0]; + offsets[elId].height = sizes[elId][1]; + offsets[elId].centerx = offsets[elId].left + (offsets[elId].width / 2); + offsets[elId].centery = offsets[elId].top + (offsets[elId].height / 2); + } + + return {o: offsets[elId], s: sizes[elId]}; + }; + + this.updateOffset = _updateOffset; + + /** + * callback from the current library to tell us to prepare ourselves (attach + * mouse listeners etc; can't do that until the library has provided a bind method) + */ + this.init = function () { + if (!initialized) { + _getContainerFromDefaults(); + _currentInstance.anchorManager = new root.jsPlumb.AnchorManager({jsPlumbInstance: _currentInstance}); + initialized = true; + _currentInstance.fire("ready", _currentInstance); + } + }.bind(this); + + this.log = log; + this.jsPlumbUIComponent = jsPlumbUIComponent; + + /* + * Creates an anchor with the given params. + * + * + * Returns: The newly created Anchor. + * Throws: an error if a named anchor was not found. + */ + this.makeAnchor = function () { + var pp, _a = function (t, p) { + if (root.jsPlumb.Anchors[t]) { + return new root.jsPlumb.Anchors[t](p); + } + if (!_currentInstance.Defaults.DoNotThrowErrors) { + throw { msg: "jsPlumb: unknown anchor type '" + t + "'" }; + } + }; + if (arguments.length === 0) { + return null; + } + var specimen = arguments[0], elementId = arguments[1], jsPlumbInstance = arguments[2], newAnchor = null; + // if it appears to be an anchor already... + if (specimen.compute && specimen.getOrientation) { + return specimen; + } //TODO hazy here about whether it should be added or is already added somehow. + // is it the name of an anchor type? + else if (typeof specimen === "string") { + newAnchor = _a(arguments[0], {elementId: elementId, jsPlumbInstance: _currentInstance}); + } + // is it an array? it will be one of: + // an array of [spec, params] - this defines a single anchor, which may be dynamic, but has parameters. + // an array of arrays - this defines some dynamic anchors + // an array of numbers - this defines a single anchor. + else if (_ju.isArray(specimen)) { + if (_ju.isArray(specimen[0]) || _ju.isString(specimen[0])) { + // if [spec, params] format + if (specimen.length === 2 && _ju.isObject(specimen[1])) { + // if first arg is a string, its a named anchor with params + if (_ju.isString(specimen[0])) { + pp = root.jsPlumb.extend({elementId: elementId, jsPlumbInstance: _currentInstance}, specimen[1]); + newAnchor = _a(specimen[0], pp); + } + // otherwise first arg is array, second is params. we treat as a dynamic anchor, which is fine + // even if the first arg has only one entry. you could argue all anchors should be implicitly dynamic in fact. + else { + pp = root.jsPlumb.extend({elementId: elementId, jsPlumbInstance: _currentInstance, anchors: specimen[0]}, specimen[1]); + newAnchor = new root.jsPlumb.DynamicAnchor(pp); + } + } + else { + newAnchor = new jsPlumb.DynamicAnchor({anchors: specimen, selector: null, elementId: elementId, jsPlumbInstance: _currentInstance}); + } + + } + else { + var anchorParams = { + x: specimen[0], y: specimen[1], + orientation: (specimen.length >= 4) ? [ specimen[2], specimen[3] ] : [0, 0], + offsets: (specimen.length >= 6) ? [ specimen[4], specimen[5] ] : [ 0, 0 ], + elementId: elementId, + jsPlumbInstance: _currentInstance, + cssClass: specimen.length === 7 ? specimen[6] : null + }; + newAnchor = new root.jsPlumb.Anchor(anchorParams); + newAnchor.clone = function () { + return new root.jsPlumb.Anchor(anchorParams); + }; + } + } + + if (!newAnchor.id) { + newAnchor.id = "anchor_" + _idstamp(); + } + return newAnchor; + }; + + /** + * makes a list of anchors from the given list of types or coords, eg + * ["TopCenter", "RightMiddle", "BottomCenter", [0, 1, -1, -1] ] + */ + this.makeAnchors = function (types, elementId, jsPlumbInstance) { + var r = []; + for (var i = 0, ii = types.length; i < ii; i++) { + if (typeof types[i] === "string") { + r.push(root.jsPlumb.Anchors[types[i]]({elementId: elementId, jsPlumbInstance: jsPlumbInstance})); + } + else if (_ju.isArray(types[i])) { + r.push(_currentInstance.makeAnchor(types[i], elementId, jsPlumbInstance)); + } + } + return r; + }; + + /** + * Makes a dynamic anchor from the given list of anchors (which may be in shorthand notation as strings or dimension arrays, or Anchor + * objects themselves) and the given, optional, anchorSelector function (jsPlumb uses a default if this is not provided; most people will + * not need to provide this - i think). + */ + this.makeDynamicAnchor = function (anchors, anchorSelector) { + return new root.jsPlumb.DynamicAnchor({anchors: anchors, selector: anchorSelector, elementId: null, jsPlumbInstance: _currentInstance}); + }; + +// --------------------- makeSource/makeTarget ---------------------------------------------- + + this.targetEndpointDefinitions = {}; + this.sourceEndpointDefinitions = {}; + + var selectorFilter = function (evt, _el, selector, _instance, negate) { + var t = evt.target || evt.srcElement, ok = false, + sel = _instance.getSelector(_el, selector); + for (var j = 0; j < sel.length; j++) { + if (sel[j] === t) { + ok = true; + break; + } + } + return negate ? !ok : ok; + }; + + var _makeElementDropHandler = function (elInfo, p, dropOptions, isSource, isTarget) { + var proxyComponent = new jsPlumbUIComponent(p); + var _drop = p._jsPlumb.EndpointDropHandler({ + jsPlumb: _currentInstance, + enabled: function () { + return elInfo.def.enabled; + }, + isFull: function () { + var targetCount = _currentInstance.select({target: elInfo.id}).length; + return elInfo.def.maxConnections > 0 && targetCount >= elInfo.def.maxConnections; + }, + element: elInfo.el, + elementId: elInfo.id, + isSource: isSource, + isTarget: isTarget, + addClass: function (clazz) { + _currentInstance.addClass(elInfo.el, clazz); + }, + removeClass: function (clazz) { + _currentInstance.removeClass(elInfo.el, clazz); + }, + onDrop: function (jpc) { + var source = jpc.endpoints[0]; + source.anchor.unlock(); + }, + isDropAllowed: function () { + return proxyComponent.isDropAllowed.apply(proxyComponent, arguments); + }, + isRedrop:function(jpc) { + return (jpc.suspendedElement != null && jpc.suspendedEndpoint != null && jpc.suspendedEndpoint.element === elInfo.el); + }, + getEndpoint: function (jpc) { + + // make a new Endpoint for the target, or get it from the cache if uniqueEndpoint + // is set. if its a redrop the new endpoint will be immediately cleaned up. + + var newEndpoint = elInfo.def.endpoint; + + // if no cached endpoint, or there was one but it has been cleaned up + // (ie. detached), create a new one + if (newEndpoint == null || newEndpoint._jsPlumb == null) { + var eps = _currentInstance.deriveEndpointAndAnchorSpec(jpc.getType().join(" "), true); + var pp = eps.endpoints ? root.jsPlumb.extend(p, { + endpoint:elInfo.def.def.endpoint || eps.endpoints[1] + }) :p; + if (eps.anchors) { + pp = root.jsPlumb.extend(pp, { + anchor:elInfo.def.def.anchor || eps.anchors[1] + }); + } + newEndpoint = _currentInstance.addEndpoint(elInfo.el, pp); + newEndpoint._mtNew = true; + } + + if (p.uniqueEndpoint) { + elInfo.def.endpoint = newEndpoint; + } + + newEndpoint.setDeleteOnEmpty(true); + + // if connection is detachable, init the new endpoint to be draggable, to support that happening. + if (jpc.isDetachable()) { + newEndpoint.initDraggable(); + } + + // if the anchor has a 'positionFinder' set, then delegate to that function to find + // out where to locate the anchor. + if (newEndpoint.anchor.positionFinder != null) { + var dropPosition = _currentInstance.getUIPosition(arguments, _currentInstance.getZoom()), + elPosition = _currentInstance.getOffset(elInfo.el), + elSize = _currentInstance.getSize(elInfo.el), + ap = dropPosition == null ? [0,0] : newEndpoint.anchor.positionFinder(dropPosition, elPosition, elSize, newEndpoint.anchor.constructorParams); + + newEndpoint.anchor.x = ap[0]; + newEndpoint.anchor.y = ap[1]; + // now figure an orientation for it..kind of hard to know what to do actually. probably the best thing i can do is to + // support specifying an orientation in the anchor's spec. if one is not supplied then i will make the orientation + // be what will cause the most natural link to the source: it will be pointing at the source, but it needs to be + // specified in one axis only, and so how to make that choice? i think i will use whichever axis is the one in which + // the target is furthest away from the source. + } + + return newEndpoint; + }, + maybeCleanup: function (ep) { + if (ep._mtNew && ep.connections.length === 0) { + _currentInstance.deleteObject({endpoint: ep}); + } + else { + delete ep._mtNew; + } + } + }); + + // wrap drop events as needed and initialise droppable + var dropEvent = root.jsPlumb.dragEvents.drop; + dropOptions.scope = dropOptions.scope || (p.scope || _currentInstance.Defaults.Scope); + dropOptions[dropEvent] = _ju.wrap(dropOptions[dropEvent], _drop, true); + dropOptions.rank = p.rank || 0; + + // if target, return true from the over event. this will cause katavorio to stop setting drops to hover + // if multipleDrop is set to false. + if (isTarget) { + dropOptions[root.jsPlumb.dragEvents.over] = function () { return true; }; + } + + // vanilla jsplumb only + if (p.allowLoopback === false) { + dropOptions.canDrop = function (_drag) { + var de = _drag.getDragElement()._jsPlumbRelatedElement; + return de !== elInfo.el; + }; + } + _currentInstance.initDroppable(elInfo.el, dropOptions, "internal"); + + return _drop; + + }; + + // see API docs + this.makeTarget = function (el, params, referenceParams) { + + // put jsplumb ref into params without altering the params passed in + var p = root.jsPlumb.extend({_jsPlumb: this}, referenceParams); + root.jsPlumb.extend(p, params); + + var maxConnections = p.maxConnections || -1, + + _doOne = function (el) { + + // get the element's id and store the endpoint definition for it. jsPlumb.connect calls will look for one of these, + // and use the endpoint definition if found. + // decode the info for this element (id and element) + var elInfo = _info(el), + elid = elInfo.id, + dropOptions = root.jsPlumb.extend({}, p.dropOptions || {}), + type = p.connectionType || "default"; + + this.targetEndpointDefinitions[elid] = this.targetEndpointDefinitions[elid] || {}; + + _ensureContainer(elid); + + // if this is a group and the user has not mandated a rank, set to -1 so that Nodes takes + // precedence. + if (elInfo.el._isJsPlumbGroup && dropOptions.rank == null) { + dropOptions.rank = -1; + } + + // store the definition + var _def = { + def: root.jsPlumb.extend({}, p), + uniqueEndpoint: p.uniqueEndpoint, + maxConnections: maxConnections, + enabled: true + }; + + if (p.createEndpoint) { + _def.uniqueEndpoint = true; + _def.endpoint = _currentInstance.addEndpoint(el, _def.def); + _def.endpoint.setDeleteOnEmpty(false); + } + + elInfo.def = _def; + this.targetEndpointDefinitions[elid][type] = _def; + _makeElementDropHandler(elInfo, p, dropOptions, p.isSource === true, true); + // stash the definition on the drop + elInfo.el._katavorioDrop[elInfo.el._katavorioDrop.length - 1].targetDef = _def; + + }.bind(this); + + // make an array if only given one element + var inputs = el.length && el.constructor !== String ? el : [ el ]; + + // register each one in the list. + for (var i = 0, ii = inputs.length; i < ii; i++) { + _doOne(inputs[i]); + } + + return this; + }; + + // see api docs + this.unmakeTarget = function (el, doNotClearArrays) { + var info = _info(el); + _currentInstance.destroyDroppable(info.el, "internal"); + if (!doNotClearArrays) { + delete this.targetEndpointDefinitions[info.id]; + } + + return this; + }; + + // see api docs + this.makeSource = function (el, params, referenceParams) { + var p = root.jsPlumb.extend({_jsPlumb: this}, referenceParams); + root.jsPlumb.extend(p, params); + var type = p.connectionType || "default"; + var aae = _currentInstance.deriveEndpointAndAnchorSpec(type); + p.endpoint = p.endpoint || aae.endpoints[0]; + p.anchor = p.anchor || aae.anchors[0]; + var maxConnections = p.maxConnections || -1, + onMaxConnections = p.onMaxConnections, + _doOne = function (elInfo) { + // get the element's id and store the endpoint definition for it. jsPlumb.connect calls will look for one of these, + // and use the endpoint definition if found. + var elid = elInfo.id, + _del = this.getElement(elInfo.el); + + this.sourceEndpointDefinitions[elid] = this.sourceEndpointDefinitions[elid] || {}; + _ensureContainer(elid); + + var _def = { + def:root.jsPlumb.extend({}, p), + uniqueEndpoint: p.uniqueEndpoint, + maxConnections: maxConnections, + enabled: true + }; + + if (p.createEndpoint) { + _def.uniqueEndpoint = true; + _def.endpoint = _currentInstance.addEndpoint(el, _def.def); + _def.endpoint.setDeleteOnEmpty(false); + } + + this.sourceEndpointDefinitions[elid][type] = _def; + elInfo.def = _def; + + var stopEvent = root.jsPlumb.dragEvents.stop, + dragEvent = root.jsPlumb.dragEvents.drag, + dragOptions = root.jsPlumb.extend({ }, p.dragOptions || {}), + existingDrag = dragOptions.drag, + existingStop = dragOptions.stop, + ep = null, + endpointAddedButNoDragYet = false; + + // set scope if its not set in dragOptions but was passed in in params + dragOptions.scope = dragOptions.scope || p.scope; + + dragOptions[dragEvent] = _ju.wrap(dragOptions[dragEvent], function () { + if (existingDrag) { + existingDrag.apply(this, arguments); + } + endpointAddedButNoDragYet = false; + }); + + dragOptions[stopEvent] = _ju.wrap(dragOptions[stopEvent], function () { + + if (existingStop) { + existingStop.apply(this, arguments); + } + this.currentlyDragging = false; + if (ep._jsPlumb != null) { // if not cleaned up... + + // reset the anchor to the anchor that was initially provided. the one we were using to drag + // the connection was just a placeholder that was located at the place the user pressed the + // mouse button to initiate the drag. + var anchorDef = p.anchor || this.Defaults.Anchor, + oldAnchor = ep.anchor, + oldConnection = ep.connections[0]; + + var newAnchor = this.makeAnchor(anchorDef, elid, this), + _el = ep.element; + + // if the anchor has a 'positionFinder' set, then delegate to that function to find + // out where to locate the anchor. issue 117. + if (newAnchor.positionFinder != null) { + var elPosition = _currentInstance.getOffset(_el), + elSize = this.getSize(_el), + dropPosition = { left: elPosition.left + (oldAnchor.x * elSize[0]), top: elPosition.top + (oldAnchor.y * elSize[1]) }, + ap = newAnchor.positionFinder(dropPosition, elPosition, elSize, newAnchor.constructorParams); + + newAnchor.x = ap[0]; + newAnchor.y = ap[1]; + } + + ep.setAnchor(newAnchor, true); + ep.repaint(); + this.repaint(ep.elementId); + if (oldConnection != null) { + this.repaint(oldConnection.targetId); + } + } + }.bind(this)); + + // when the user presses the mouse, add an Endpoint, if we are enabled. + var mouseDownListener = function (e) { + // on right mouse button, abort. + if (e.which === 3 || e.button === 2) { + return; + } + + elid = this.getId(this.getElement(elInfo.el)); // elid might have changed since this method was called to configure the element. + + // TODO store def on element. + var def = this.sourceEndpointDefinitions[elid][type]; + + // if disabled, return. + if (!def.enabled) { + return; + } + + // if a filter was given, run it, and return if it says no. + if (p.filter) { + var r = _ju.isString(p.filter) ? selectorFilter(e, elInfo.el, p.filter, this, p.filterExclude) : p.filter(e, elInfo.el); + if (r === false) { + return; + } + } + + // if maxConnections reached + var sourceCount = this.select({source: elid}).length; + if (def.maxConnections >= 0 && (sourceCount >= def.maxConnections)) { + if (onMaxConnections) { + onMaxConnections({ + element: elInfo.el, + maxConnections: maxConnections + }, e); + } + return false; + } + + // find the position on the element at which the mouse was pressed; this is where the endpoint + // will be located. + var elxy = root.jsPlumb.getPositionOnElement(e, _del, _zoom); + + // we need to override the anchor in here, and force 'isSource', but we don't want to mess with + // the params passed in, because after a connection is established we're going to reset the endpoint + // to have the anchor we were given. + var tempEndpointParams = {}; + root.jsPlumb.extend(tempEndpointParams, def.def); + tempEndpointParams.isTemporarySource = true; + tempEndpointParams.anchor = [ elxy[0], elxy[1] , 0, 0]; + tempEndpointParams.dragOptions = dragOptions; + + if (def.def.scope) { + tempEndpointParams.scope = def.def.scope; + } + + ep = this.addEndpoint(elid, tempEndpointParams); + endpointAddedButNoDragYet = true; + ep.setDeleteOnEmpty(true); + + // if unique endpoint and it's already been created, push it onto the endpoint we create. at the end + // of a successful connection we'll switch to that endpoint. + // TODO this is the same code as the programmatic endpoints create on line 1050 ish + if (def.uniqueEndpoint) { + if (!def.endpoint) { + def.endpoint = ep; + ep.setDeleteOnEmpty(false); + } + else { + ep.finalEndpoint = def.endpoint; + } + } + + var _delTempEndpoint = function () { + // this mouseup event is fired only if no dragging occurred, by jquery and yui, but for mootools + // it is fired even if dragging has occurred, in which case we would blow away a perfectly + // legitimate endpoint, were it not for this check. the flag is set after adding an + // endpoint and cleared in a drag listener we set in the dragOptions above. + _currentInstance.off(ep.canvas, "mouseup", _delTempEndpoint); + _currentInstance.off(elInfo.el, "mouseup", _delTempEndpoint); + if (endpointAddedButNoDragYet) { + endpointAddedButNoDragYet = false; + _currentInstance.deleteEndpoint(ep); + } + }; + + _currentInstance.on(ep.canvas, "mouseup", _delTempEndpoint); + _currentInstance.on(elInfo.el, "mouseup", _delTempEndpoint); + + // optionally check for attributes to extract from the source element + var payload = {}; + if (def.def.extract) { + for (var att in def.def.extract) { + var v = (e.srcElement || e.target).getAttribute(att); + if (v) { + payload[def.def.extract[att]] = v; + } + } + } + + // and then trigger its mousedown event, which will kick off a drag, which will start dragging + // a new connection from this endpoint. + _currentInstance.trigger(ep.canvas, "mousedown", e, payload); + + _ju.consume(e); + + }.bind(this); + + this.on(elInfo.el, "mousedown", mouseDownListener); + _def.trigger = mouseDownListener; + + // if a filter was provided, set it as a dragFilter on the element, + // to prevent the element drag function from kicking in when we want to + // drag a new connection + if (p.filter && (_ju.isString(p.filter) || _ju.isFunction(p.filter))) { + _currentInstance.setDragFilter(elInfo.el, p.filter); + } + + var dropOptions = root.jsPlumb.extend({}, p.dropOptions || {}); + + _makeElementDropHandler(elInfo, p, dropOptions, true, p.isTarget === true); + + }.bind(this); + + var inputs = el.length && el.constructor !== String ? el : [ el ]; + for (var i = 0, ii = inputs.length; i < ii; i++) { + _doOne(_info(inputs[i])); + } + + return this; + }; + + // see api docs + this.unmakeSource = function (el, connectionType, doNotClearArrays) { + var info = _info(el); + _currentInstance.destroyDroppable(info.el, "internal"); + var eldefs = this.sourceEndpointDefinitions[info.id]; + if (eldefs) { + for (var def in eldefs) { + if (connectionType == null || connectionType === def) { + var mouseDownListener = eldefs[def].trigger; + if (mouseDownListener) { + _currentInstance.off(info.el, "mousedown", mouseDownListener); + } + if (!doNotClearArrays) { + delete this.sourceEndpointDefinitions[info.id][def]; + } + } + } + } + + return this; + }; + + // see api docs + this.unmakeEverySource = function () { + for (var i in this.sourceEndpointDefinitions) { + _currentInstance.unmakeSource(i, null, true); + } + + this.sourceEndpointDefinitions = {}; + return this; + }; + + var _getScope = function (el, types, connectionType) { + types = _ju.isArray(types) ? types : [ types ]; + var id = _getId(el); + connectionType = connectionType || "default"; + for (var i = 0; i < types.length; i++) { + var eldefs = this[types[i]][id]; + if (eldefs && eldefs[connectionType]) { + return eldefs[connectionType].def.scope || this.Defaults.Scope; + } + } + }.bind(this); + + var _setScope = function (el, scope, types, connectionType) { + types = _ju.isArray(types) ? types : [ types ]; + var id = _getId(el); + connectionType = connectionType || "default"; + for (var i = 0; i < types.length; i++) { + var eldefs = this[types[i]][id]; + if (eldefs && eldefs[connectionType]) { + eldefs[connectionType].def.scope = scope; + } + } + + }.bind(this); + + this.getScope = function (el, scope) { + return _getScope(el, [ "sourceEndpointDefinitions", "targetEndpointDefinitions" ]); + }; + this.getSourceScope = function (el) { + return _getScope(el, "sourceEndpointDefinitions"); + }; + this.getTargetScope = function (el) { + return _getScope(el, "targetEndpointDefinitions"); + }; + this.setScope = function (el, scope, connectionType) { + this.setSourceScope(el, scope, connectionType); + this.setTargetScope(el, scope, connectionType); + }; + this.setSourceScope = function (el, scope, connectionType) { + _setScope(el, scope, "sourceEndpointDefinitions", connectionType); + // we get the source scope during the mousedown event, but we also want to set this. + this.setDragScope(el, scope); + }; + this.setTargetScope = function (el, scope, connectionType) { + _setScope(el, scope, "targetEndpointDefinitions", connectionType); + this.setDropScope(el, scope); + }; + + // see api docs + this.unmakeEveryTarget = function () { + for (var i in this.targetEndpointDefinitions) { + _currentInstance.unmakeTarget(i, true); + } + + this.targetEndpointDefinitions = {}; + return this; + }; + + // does the work of setting a source enabled or disabled. + var _setEnabled = function (type, el, state, toggle, connectionType) { + var a = type === "source" ? this.sourceEndpointDefinitions : this.targetEndpointDefinitions, + originalState, info, newState; + + connectionType = connectionType || "default"; + + // a selector or an array + if (el.length && !_ju.isString(el)) { + originalState = []; + for (var i = 0, ii = el.length; i < ii; i++) { + info = _info(el[i]); + if (a[info.id] && a[info.id][connectionType]) { + originalState[i] = a[info.id][connectionType].enabled; + newState = toggle ? !originalState[i] : state; + a[info.id][connectionType].enabled = newState; + _currentInstance[newState ? "removeClass" : "addClass"](info.el, "jtk-" + type + "-disabled"); + } + } + } + // otherwise a DOM element or a String ID. + else { + info = _info(el); + var id = info.id; + if (a[id] && a[id][connectionType]) { + originalState = a[id][connectionType].enabled; + newState = toggle ? !originalState : state; + a[id][connectionType].enabled = newState; + _currentInstance[newState ? "removeClass" : "addClass"](info.el, "jtk-" + type + "-disabled"); + } + } + return originalState; + }.bind(this); + + var _first = function (el, fn) { + if (_ju.isString(el) || !el.length) { + return fn.apply(this, [ el ]); + } + else if (el.length) { + return fn.apply(this, [ el[0] ]); + } + + }.bind(this); + + this.toggleSourceEnabled = function (el, connectionType) { + _setEnabled("source", el, null, true, connectionType); + return this.isSourceEnabled(el, connectionType); + }; + + this.setSourceEnabled = function (el, state, connectionType) { + return _setEnabled("source", el, state, null, connectionType); + }; + this.isSource = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var eldefs = this.sourceEndpointDefinitions[_info(_el).id]; + return eldefs != null && eldefs[connectionType] != null; + }.bind(this)); + }; + this.isSourceEnabled = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var sep = this.sourceEndpointDefinitions[_info(_el).id]; + return sep && sep[connectionType] && sep[connectionType].enabled === true; + }.bind(this)); + }; + + this.toggleTargetEnabled = function (el, connectionType) { + _setEnabled("target", el, null, true, connectionType); + return this.isTargetEnabled(el, connectionType); + }; + + this.isTarget = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var eldefs = this.targetEndpointDefinitions[_info(_el).id]; + return eldefs != null && eldefs[connectionType] != null; + }.bind(this)); + }; + this.isTargetEnabled = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var tep = this.targetEndpointDefinitions[_info(_el).id]; + return tep && tep[connectionType] && tep[connectionType].enabled === true; + }.bind(this)); + }; + this.setTargetEnabled = function (el, state, connectionType) { + return _setEnabled("target", el, state, null, connectionType); + }; + +// --------------------- end makeSource/makeTarget ---------------------------------------------- + + this.ready = function (fn) { + _currentInstance.bind("ready", fn); + }; + + var _elEach = function(el, fn) { + // support both lists... + if (typeof el === 'object' && el.length) { + for (var i = 0, ii = el.length; i < ii; i++) { + fn(el[i]); + } + } + else {// ...and single strings or elements. + fn(el); + } + + return _currentInstance; + }; + + // repaint some element's endpoints and connections + this.repaint = function (el, ui, timestamp) { + return _elEach(el, function(_el) { + _draw(_el, ui, timestamp); + }); + }; + + this.revalidate = function (el, timestamp, isIdAlready) { + return _elEach(el, function(_el) { + var elId = isIdAlready ? _el : _currentInstance.getId(_el); + _currentInstance.updateOffset({ elId: elId, recalc: true, timestamp:timestamp }); + var dm = _currentInstance.getDragManager(); + if (dm) { + dm.updateOffsets(elId); + } + _currentInstance.repaint(_el); + }); + }; + + // repaint every endpoint and connection. + this.repaintEverything = function () { + // TODO this timestamp causes continuous anchors to not repaint properly. + // fix this. do not just take out the timestamp. it runs a lot faster with + // the timestamp included. + var timestamp = _timestamp(), elId; + + for (elId in endpointsByElement) { + _currentInstance.updateOffset({ elId: elId, recalc: true, timestamp: timestamp }); + } + + for (elId in endpointsByElement) { + _draw(elId, null, timestamp); + } + + return this; + }; + + this.removeAllEndpoints = function (el, recurse, affectedElements) { + affectedElements = affectedElements || []; + var _one = function (_el) { + var info = _info(_el), + ebe = endpointsByElement[info.id], + i, ii; + + if (ebe) { + affectedElements.push(info); + for (i = 0, ii = ebe.length; i < ii; i++) { + _currentInstance.deleteEndpoint(ebe[i], false); + } + } + delete endpointsByElement[info.id]; + + if (recurse) { + if (info.el && info.el.nodeType !== 3 && info.el.nodeType !== 8) { + for (i = 0, ii = info.el.childNodes.length; i < ii; i++) { + _one(info.el.childNodes[i]); + } + } + } + + }; + _one(el); + return this; + }; + + var _doRemove = function(info, affectedElements) { + _currentInstance.removeAllEndpoints(info.id, true, affectedElements); + var dm = _currentInstance.getDragManager(); + var _one = function(_info) { + + if (dm) { + dm.elementRemoved(_info.id); + } + _currentInstance.anchorManager.clearFor(_info.id); + _currentInstance.anchorManager.removeFloatingConnection(_info.id); + + if (_currentInstance.isSource(_info.el)) { + _currentInstance.unmakeSource(_info.el); + } + if (_currentInstance.isTarget(_info.el)) { + _currentInstance.unmakeTarget(_info.el); + } + _currentInstance.destroyDraggable(_info.el); + _currentInstance.destroyDroppable(_info.el); + + + delete _currentInstance.floatingConnections[_info.id]; + delete managedElements[_info.id]; + delete offsets[_info.id]; + if (_info.el) { + _currentInstance.removeElement(_info.el); + _info.el._jsPlumb = null; + } + }; + + // remove all affected child elements + for (var ae = 1; ae < affectedElements.length; ae++) { + _one(affectedElements[ae]); + } + // and always remove the requested one from the dom. + _one(info); + }; + + /** + * Remove the given element, including cleaning up all endpoints registered for it. + * This is exposed in the public API but also used internally by jsPlumb when removing the + * element associated with a connection drag. + */ + this.remove = function (el, doNotRepaint) { + var info = _info(el), affectedElements = []; + if (info.text && info.el.parentNode) { + info.el.parentNode.removeChild(info.el); + } + else if (info.id) { + _currentInstance.batch(function () { + _doRemove(info, affectedElements); + }, doNotRepaint === true); + } + return _currentInstance; + }; + + this.empty = function (el, doNotRepaint) { + var affectedElements = []; + var _one = function(el, dontRemoveFocus) { + var info = _info(el); + if (info.text) { + info.el.parentNode.removeChild(info.el); + } + else if (info.el) { + while(info.el.childNodes.length > 0) { + _one(info.el.childNodes[0]); + } + if (!dontRemoveFocus) { + _doRemove(info, affectedElements); + } + } + }; + + _currentInstance.batch(function() { + _one(el, true); + }, doNotRepaint === false); + + return _currentInstance; + }; + + this.reset = function (doNotUnbindInstanceEventListeners) { + _currentInstance.silently(function() { + _hoverSuspended = false; + _currentInstance.removeAllGroups(); + _currentInstance.removeGroupManager(); + _currentInstance.deleteEveryEndpoint(); + if (!doNotUnbindInstanceEventListeners) { + _currentInstance.unbind(); + } + this.targetEndpointDefinitions = {}; + this.sourceEndpointDefinitions = {}; + connections.length = 0; + if (this.doReset) { + this.doReset(); + } + }.bind(this)); + }; + + var _clearObject = function (obj) { + if (obj.canvas && obj.canvas.parentNode) { + obj.canvas.parentNode.removeChild(obj.canvas); + } + obj.cleanup(); + obj.destroy(); + }; + + this.clear = function () { + _currentInstance.select().each(_clearObject); + _currentInstance.selectEndpoints().each(_clearObject); + + endpointsByElement = {}; + endpointsByUUID = {}; + }; + + this.setDefaultScope = function (scope) { + DEFAULT_SCOPE = scope; + return _currentInstance; + }; + + this.deriveEndpointAndAnchorSpec = function(type, dontPrependDefault) { + var bits = ((dontPrependDefault ? "" : "default ") + type).split(/[\s]/), eps = null, ep = null, a = null, as = null; + for (var i = 0; i < bits.length; i++) { + var _t = _currentInstance.getType(bits[i], "connection"); + if (_t) { + if (_t.endpoints) { + eps = _t.endpoints; + } + if (_t.endpoint) { + ep = _t.endpoint; + } + if (_t.anchors) { + as = _t.anchors; + } + if (_t.anchor) { + a = _t.anchor; + } + } + } + return { endpoints: eps ? eps : [ ep, ep ], anchors: as ? as : [a, a ]}; + }; + + // sets the id of some element, changing whatever we need to to keep track. + this.setId = function (el, newId, doNotSetAttribute) { + // + var id; + + if (_ju.isString(el)) { + id = el; + } + else { + el = this.getElement(el); + id = this.getId(el); + } + + var sConns = this.getConnections({source: id, scope: '*'}, true), + tConns = this.getConnections({target: id, scope: '*'}, true); + + newId = "" + newId; + + if (!doNotSetAttribute) { + el = this.getElement(id); + this.setAttribute(el, "id", newId); + } + else { + el = this.getElement(newId); + } + + endpointsByElement[newId] = endpointsByElement[id] || []; + for (var i = 0, ii = endpointsByElement[newId].length; i < ii; i++) { + endpointsByElement[newId][i].setElementId(newId); + endpointsByElement[newId][i].setReferenceElement(el); + } + delete endpointsByElement[id]; + + this.sourceEndpointDefinitions[newId] = this.sourceEndpointDefinitions[id]; + delete this.sourceEndpointDefinitions[id]; + this.targetEndpointDefinitions[newId] = this.targetEndpointDefinitions[id]; + delete this.targetEndpointDefinitions[id]; + + this.anchorManager.changeId(id, newId); + var dm = this.getDragManager(); + if (dm) { + dm.changeId(id, newId); + } + managedElements[newId] = managedElements[id]; + delete managedElements[id]; + + var _conns = function (list, epIdx, type) { + for (var i = 0, ii = list.length; i < ii; i++) { + list[i].endpoints[epIdx].setElementId(newId); + list[i].endpoints[epIdx].setReferenceElement(el); + list[i][type + "Id"] = newId; + list[i][type] = el; + } + }; + _conns(sConns, 0, "source"); + _conns(tConns, 1, "target"); + + this.repaint(newId); + }; + + this.setDebugLog = function (debugLog) { + log = debugLog; + }; + + this.setSuspendDrawing = function (val, repaintAfterwards) { + var curVal = _suspendDrawing; + _suspendDrawing = val; + if (val) { + _suspendedAt = new Date().getTime(); + } else { + _suspendedAt = null; + } + if (repaintAfterwards) { + this.repaintEverything(); + } + return curVal; + }; + + // returns whether or not drawing is currently suspended. + this.isSuspendDrawing = function () { + return _suspendDrawing; + }; + + // return timestamp for when drawing was suspended. + this.getSuspendedAt = function () { + return _suspendedAt; + }; + + this.batch = function (fn, doNotRepaintAfterwards) { + var _wasSuspended = this.isSuspendDrawing(); + if (!_wasSuspended) { + this.setSuspendDrawing(true); + } + try { + fn(); + } + catch (e) { + _ju.log("Function run while suspended failed", e); + } + if (!_wasSuspended) { + this.setSuspendDrawing(false, !doNotRepaintAfterwards); + } + }; + + this.doWhileSuspended = this.batch; + + this.getCachedData = _getCachedData; + this.timestamp = _timestamp; + this.show = function (el, changeEndpoints) { + _setVisible(el, "block", changeEndpoints); + return _currentInstance; + }; + + // TODO: update this method to return the current state. + this.toggleVisible = _toggleVisible; + this.addListener = this.bind; + + var floatingConnections = []; + this.registerFloatingConnection = function(info, conn, ep) { + floatingConnections[info.id] = conn; + // only register for the target endpoint; we will not be dragging the source at any time + // before this connection is either discarded or made into a permanent connection. + _ju.addToList(endpointsByElement, info.id, ep); + }; + this.getFloatingConnectionFor = function(id) { + return floatingConnections[id]; + }; + + this.listManager = new root.jsPlumbListManager(this, this.Defaults.ListStyle); + }; + + _ju.extend(root.jsPlumbInstance, _ju.EventGenerator, { + setAttribute: function (el, a, v) { + this.setAttribute(el, a, v); + }, + getAttribute: function (el, a) { + return this.getAttribute(root.jsPlumb.getElement(el), a); + }, + convertToFullOverlaySpec: function(spec) { + if (_ju.isString(spec)) { + spec = [ spec, { } ]; + } + spec[1].id = spec[1].id || _ju.uuid(); + return spec; + }, + registerConnectionType: function (id, type) { + this._connectionTypes[id] = root.jsPlumb.extend({}, type); + if (type.overlays) { + var to = {}; + for (var i = 0; i < type.overlays.length; i++) { + // if a string, convert to object representation so that we can store the typeid on it. + // also assign an id. + var fo = this.convertToFullOverlaySpec(type.overlays[i]); + to[fo[1].id] = fo; + } + this._connectionTypes[id].overlays = to; + } + }, + registerConnectionTypes: function (types) { + for (var i in types) { + this.registerConnectionType(i, types[i]); + } + }, + registerEndpointType: function (id, type) { + this._endpointTypes[id] = root.jsPlumb.extend({}, type); + if (type.overlays) { + var to = {}; + for (var i = 0; i < type.overlays.length; i++) { + // if a string, convert to object representation so that we can store the typeid on it. + // also assign an id. + var fo = this.convertToFullOverlaySpec(type.overlays[i]); + to[fo[1].id] = fo; + } + this._endpointTypes[id].overlays = to; + } + }, + registerEndpointTypes: function (types) { + for (var i in types) { + this.registerEndpointType(i, types[i]); + } + }, + getType: function (id, typeDescriptor) { + return typeDescriptor === "connection" ? this._connectionTypes[id] : this._endpointTypes[id]; + }, + setIdChanged: function (oldId, newId) { + this.setId(oldId, newId, true); + }, + // set parent: change the parent for some node and update all the registrations we need to. + setParent: function (el, newParent) { + var _dom = this.getElement(el), + _id = this.getId(_dom), + _pdom = this.getElement(newParent), + _pid = this.getId(_pdom), + dm = this.getDragManager(); + + _dom.parentNode.removeChild(_dom); + _pdom.appendChild(_dom); + if (dm) { + dm.setParent(_dom, _id, _pdom, _pid); + } + }, + extend: function (o1, o2, names) { + var i; + if (names) { + for (i = 0; i < names.length; i++) { + o1[names[i]] = o2[names[i]]; + } + } + else { + for (i in o2) { + o1[i] = o2[i]; + } + } + + return o1; + }, + floatingConnections: {}, + getFloatingAnchorIndex: function (jpc) { + return jpc.endpoints[0].isFloating() ? 0 : jpc.endpoints[1].isFloating() ? 1 : -1; + }, + proxyConnection :function(connection, index, proxyEl, proxyElId, endpointGenerator, anchorGenerator) { + var proxyEp, + originalElementId = connection.endpoints[index].elementId, + originalEndpoint = connection.endpoints[index]; + + connection.proxies = connection.proxies || []; + if(connection.proxies[index]) { + proxyEp = connection.proxies[index].ep; + }else { + proxyEp = this.addEndpoint(proxyEl, { + endpoint:endpointGenerator(connection, index), + anchor:anchorGenerator(connection, index), + parameters:{ + isProxyEndpoint:true + } + }); + } + proxyEp.setDeleteOnEmpty(true); + + // for this index, stash proxy info: the new EP, the original EP. + connection.proxies[index] = { ep:proxyEp, originalEp: originalEndpoint }; + + // and advise the anchor manager + if (index === 0) { + // TODO why are there two differently named methods? Why is there not one method that says "some end of this + // connection changed (you give the index), and here's the new element and element id." + this.anchorManager.sourceChanged(originalElementId, proxyElId, connection, proxyEl); + } + else { + this.anchorManager.updateOtherEndpoint(connection.endpoints[0].elementId, originalElementId, proxyElId, connection); + connection.target = proxyEl; + connection.targetId = proxyElId; + } + + // detach the original EP from the connection. + originalEndpoint.detachFromConnection(connection, null, true); + + // set the proxy as the new ep + proxyEp.connections = [ connection ]; + connection.endpoints[index] = proxyEp; + + originalEndpoint.setVisible(false); + + connection.setVisible(true); + + this.revalidate(proxyEl); + }, + unproxyConnection : function(connection, index, proxyElId) { + // if connection cleaned up, no proxies, or none for this end of the connection, abort. + if (connection._jsPlumb == null || connection.proxies == null || connection.proxies[index] == null) { + return; + } + + var originalElement = connection.proxies[index].originalEp.element, + originalElementId = connection.proxies[index].originalEp.elementId; + + connection.endpoints[index] = connection.proxies[index].originalEp; + // and advise the anchor manager + if (index === 0) { + // TODO why are there two differently named methods? Why is there not one method that says "some end of this + // connection changed (you give the index), and here's the new element and element id." + this.anchorManager.sourceChanged(proxyElId, originalElementId, connection, originalElement); + } + else { + this.anchorManager.updateOtherEndpoint(connection.endpoints[0].elementId, proxyElId, originalElementId, connection); + connection.target = originalElement; + connection.targetId = originalElementId; + } + + // detach the proxy EP from the connection (which will cause it to be removed as we no longer need it) + connection.proxies[index].ep.detachFromConnection(connection, null); + + connection.proxies[index].originalEp.addConnection(connection); + if(connection.isVisible()) { + connection.proxies[index].originalEp.setVisible(true); + } + + // cleanup + delete connection.proxies[index]; + } + }); + +// --------------------- static instance + module registration ------------------------------------------- + +// create static instance and assign to window if window exists. + var jsPlumb = new jsPlumbInstance(); + // register on 'root' (lets us run on server or browser) + root.jsPlumb = jsPlumb; + // add 'getInstance' method to static instance + jsPlumb.getInstance = function (_defaults, overrideFns) { + var j = new jsPlumbInstance(_defaults); + if (overrideFns) { + for (var ovf in overrideFns) { + j[ovf] = overrideFns[ovf]; + } + } + j.init(); + return j; + }; + jsPlumb.each = function (spec, fn) { + if (spec == null) { + return; + } + if (typeof spec === "string") { + fn(jsPlumb.getElement(spec)); + } + else if (spec.length != null) { + for (var i = 0; i < spec.length; i++) { + fn(jsPlumb.getElement(spec[i])); + } + } + else { + fn(spec); + } // assume it's an element. + }; + + // CommonJS + if (typeof exports !== 'undefined') { + exports.jsPlumb = jsPlumb; + } + +// --------------------- end static instance + AMD registration ------------------------------------------- + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function() { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + // ------------------------------ BEGIN OverlayCapablejsPlumbUIComponent -------------------------------------------- + + var _internalLabelOverlayId = "__label", + // this is a shortcut helper method to let people add a label as + // overlay. + _makeLabelOverlay = function (component, params) { + + var _params = { + cssClass: params.cssClass, + labelStyle: component.labelStyle, + id: _internalLabelOverlayId, + component: component, + _jsPlumb: component._jsPlumb.instance // TODO not necessary, since the instance can be accessed through the component. + }, + mergedParams = _jp.extend(_params, params); + + return new _jp.Overlays[component._jsPlumb.instance.getRenderMode()].Label(mergedParams); + }, + _processOverlay = function (component, o) { + var _newOverlay = null; + if (_ju.isArray(o)) { // this is for the shorthand ["Arrow", { width:50 }] syntax + // there's also a three arg version: + // ["Arrow", { width:50 }, {location:0.7}] + // which merges the 3rd arg into the 2nd. + var type = o[0], + // make a copy of the object so as not to mess up anyone else's reference... + p = _jp.extend({component: component, _jsPlumb: component._jsPlumb.instance}, o[1]); + if (o.length === 3) { + _jp.extend(p, o[2]); + } + _newOverlay = new _jp.Overlays[component._jsPlumb.instance.getRenderMode()][type](p); + } else if (o.constructor === String) { + _newOverlay = new _jp.Overlays[component._jsPlumb.instance.getRenderMode()][o]({component: component, _jsPlumb: component._jsPlumb.instance}); + } else { + _newOverlay = o; + } + + _newOverlay.id = _newOverlay.id || _ju.uuid(); + component.cacheTypeItem("overlay", _newOverlay, _newOverlay.id); + component._jsPlumb.overlays[_newOverlay.id] = _newOverlay; + + return _newOverlay; + }; + + _jp.OverlayCapableJsPlumbUIComponent = function (params) { + + root.jsPlumbUIComponent.apply(this, arguments); + this._jsPlumb.overlays = {}; + this._jsPlumb.overlayPositions = {}; + + if (params.label) { + this.getDefaultType().overlays[_internalLabelOverlayId] = ["Label", { + label: params.label, + location: params.labelLocation || this.defaultLabelLocation || 0.5, + labelStyle: params.labelStyle || this._jsPlumb.instance.Defaults.LabelStyle, + id:_internalLabelOverlayId + }]; + } + + this.setListenerComponent = function (c) { + if (this._jsPlumb) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].setListenerComponent(c); + } + } + }; + }; + + _jp.OverlayCapableJsPlumbUIComponent.applyType = function (component, t) { + if (t.overlays) { + // loop through the ones in the type. if already present on the component, + // dont remove or re-add. + var keep = {}, i; + + for (i in t.overlays) { + + var existing = component._jsPlumb.overlays[t.overlays[i][1].id]; + if (existing) { + // maybe update from data, if there were parameterised values for instance. + existing.updateFrom(t.overlays[i][1]); + keep[t.overlays[i][1].id] = true; + + existing.reattach(component._jsPlumb.instance, component); + } + else { + var c = component.getCachedTypeItem("overlay", t.overlays[i][1].id); + if (c != null) { + c.reattach(component._jsPlumb.instance, component); + c.setVisible(true); + // maybe update from data, if there were parameterised values for instance. + c.updateFrom(t.overlays[i][1]); + component._jsPlumb.overlays[c.id] = c; + } + else { + c = component.addOverlay(t.overlays[i], true); + } + keep[c.id] = true; + } + } + + // now loop through the full overlays and remove those that we dont want to keep + for (i in component._jsPlumb.overlays) { + if (keep[component._jsPlumb.overlays[i].id] == null) { + component.removeOverlay(component._jsPlumb.overlays[i].id, true); // remove overlay but dont clean it up. + // that would remove event listeners etc; overlays are never discarded by the types stuff, they are + // just detached/reattached. + } + } + } + }; + + _ju.extend(_jp.OverlayCapableJsPlumbUIComponent, root.jsPlumbUIComponent, { + + setHover: function (hover, ignoreAttachedElements) { + if (this._jsPlumb && !this._jsPlumb.instance.isConnectionBeingDragged()) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i][hover ? "addClass" : "removeClass"](this._jsPlumb.instance.hoverClass); + } + } + }, + addOverlay: function (overlay, doNotRepaint) { + var o = _processOverlay(this, overlay); + + if (this.getData && o.type === "Label" && _ju.isArray(overlay)) { + // + // component data might contain label location - look for it here. + var d = this.getData(), p = overlay[1]; + if (d) { + var locationAttribute = p.labelLocationAttribute || "labelLocation"; + var loc = d ? d[locationAttribute] : null; + + if (loc) { + o.loc = loc; + } + } + } + + if (!doNotRepaint) { + this.repaint(); + } + return o; + }, + getOverlay: function (id) { + return this._jsPlumb.overlays[id]; + }, + getOverlays: function () { + return this._jsPlumb.overlays; + }, + hideOverlay: function (id) { + var o = this.getOverlay(id); + if (o) { + o.hide(); + } + }, + hideOverlays: function () { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].hide(); + } + }, + showOverlay: function (id) { + var o = this.getOverlay(id); + if (o) { + o.show(); + } + }, + showOverlays: function () { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].show(); + } + }, + removeAllOverlays: function (doNotRepaint) { + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays[i].cleanup) { + this._jsPlumb.overlays[i].cleanup(); + } + } + + this._jsPlumb.overlays = {}; + this._jsPlumb.overlayPositions = null; + this._jsPlumb.overlayPlacements= {}; + if (!doNotRepaint) { + this.repaint(); + } + }, + removeOverlay: function (overlayId, dontCleanup) { + var o = this._jsPlumb.overlays[overlayId]; + if (o) { + o.setVisible(false); + if (!dontCleanup && o.cleanup) { + o.cleanup(); + } + delete this._jsPlumb.overlays[overlayId]; + if (this._jsPlumb.overlayPositions) { + delete this._jsPlumb.overlayPositions[overlayId]; + } + + if (this._jsPlumb.overlayPlacements) { + delete this._jsPlumb.overlayPlacements[overlayId]; + } + } + }, + removeOverlays: function () { + for (var i = 0, j = arguments.length; i < j; i++) { + this.removeOverlay(arguments[i]); + } + }, + moveParent: function (newParent) { + if (this.bgCanvas) { + this.bgCanvas.parentNode.removeChild(this.bgCanvas); + newParent.appendChild(this.bgCanvas); + } + + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + newParent.appendChild(this.canvas); + + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays[i].isAppendedAtTopLevel) { + var el = this._jsPlumb.overlays[i].getElement(); + el.parentNode.removeChild(el); + newParent.appendChild(el); + } + } + } + }, + getLabel: function () { + var lo = this.getOverlay(_internalLabelOverlayId); + return lo != null ? lo.getLabel() : null; + }, + getLabelOverlay: function () { + return this.getOverlay(_internalLabelOverlayId); + }, + setLabel: function (l) { + var lo = this.getOverlay(_internalLabelOverlayId); + if (!lo) { + var params = l.constructor === String || l.constructor === Function ? { label: l } : l; + lo = _makeLabelOverlay(this, params); + this._jsPlumb.overlays[_internalLabelOverlayId] = lo; + } + else { + if (l.constructor === String || l.constructor === Function) { + lo.setLabel(l); + } + else { + if (l.label) { + lo.setLabel(l.label); + } + if (l.location) { + lo.setLocation(l.location); + } + } + } + + if (!this._jsPlumb.instance.isSuspendDrawing()) { + this.repaint(); + } + }, + cleanup: function (force) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].cleanup(force); + this._jsPlumb.overlays[i].destroy(force); + } + if (force) { + this._jsPlumb.overlays = {}; + this._jsPlumb.overlayPositions = null; + } + }, + setVisible: function (v) { + this[v ? "showOverlays" : "hideOverlays"](); + }, + setAbsoluteOverlayPosition: function (overlay, xy) { + this._jsPlumb.overlayPositions[overlay.id] = xy; + }, + getAbsoluteOverlayPosition: function (overlay) { + return this._jsPlumb.overlayPositions ? this._jsPlumb.overlayPositions[overlay.id] : null; + }, + _clazzManip:function(action, clazz, dontUpdateOverlays) { + if (!dontUpdateOverlays) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i][action + "Class"](clazz); + } + } + }, + addClass:function(clazz, dontUpdateOverlays) { + this._clazzManip("add", clazz, dontUpdateOverlays); + }, + removeClass:function(clazz, dontUpdateOverlays) { + this._clazzManip("remove", clazz, dontUpdateOverlays); + } + }); + +// ------------------------------ END OverlayCapablejsPlumbUIComponent -------------------------------------------- + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the code for Endpoints. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + // create the drag handler for a connection + var _makeConnectionDragHandler = function (endpoint, placeholder, _jsPlumb) { + var stopped = false; + return { + drag: function () { + if (stopped) { + stopped = false; + return true; + } + + if (placeholder.element) { + var _ui = _jsPlumb.getUIPosition(arguments, _jsPlumb.getZoom()); + if (_ui != null) { + _jsPlumb.setPosition(placeholder.element, _ui); + } + _jsPlumb.repaint(placeholder.element, _ui); + // always repaint the source endpoint, because only continuous/dynamic anchors cause the endpoint + // to be repainted, so static anchors need to be told (or the endpoint gets dragged around) + endpoint.paint({anchorPoint:endpoint.anchor.getCurrentLocation({element:endpoint})}); + } + }, + stopDrag: function () { + stopped = true; + } + }; + }; + + // creates a placeholder div for dragging purposes, adds it, and pre-computes its offset. + var _makeDraggablePlaceholder = function (placeholder, _jsPlumb, ipco, ips) { + var n = _jsPlumb.createElement("div", { position : "absolute" }); + _jsPlumb.appendElement(n); + var id = _jsPlumb.getId(n); + _jsPlumb.setPosition(n, ipco); + n.style.width = ips[0] + "px"; + n.style.height = ips[1] + "px"; + _jsPlumb.manage(id, n, true); // TRANSIENT MANAGE + // create and assign an id, and initialize the offset. + placeholder.id = id; + placeholder.element = n; + }; + + // create a floating endpoint (for drag connections) + var _makeFloatingEndpoint = function (paintStyle, referenceAnchor, endpoint, referenceCanvas, sourceElement, _jsPlumb, _newEndpoint, scope) { + var floatingAnchor = new _jp.FloatingAnchor({ reference: referenceAnchor, referenceCanvas: referenceCanvas, jsPlumbInstance: _jsPlumb }); + //setting the scope here should not be the way to fix that mootools issue. it should be fixed by not + // adding the floating endpoint as a droppable. that makes more sense anyway! + // TRANSIENT MANAGE + return _newEndpoint({ + paintStyle: paintStyle, + endpoint: endpoint, + anchor: floatingAnchor, + source: sourceElement, + scope: scope + }); + }; + + var typeParameters = [ "connectorStyle", "connectorHoverStyle", "connectorOverlays", + "connector", "connectionType", "connectorClass", "connectorHoverClass" ]; + + // a helper function that tries to find a connection to the given element, and returns it if so. if elementWithPrecedence is null, + // or no connection to it is found, we return the first connection in our list. + var findConnectionToUseForDynamicAnchor = function (ep, elementWithPrecedence) { + var idx = 0; + if (elementWithPrecedence != null) { + for (var i = 0; i < ep.connections.length; i++) { + if (ep.connections[i].sourceId === elementWithPrecedence || ep.connections[i].targetId === elementWithPrecedence) { + idx = i; + break; + } + } + } + + return ep.connections[idx]; + }; + + _jp.Endpoint = function (params) { + var _jsPlumb = params._jsPlumb, + _newConnection = params.newConnection, + _newEndpoint = params.newEndpoint; + + this.idPrefix = "_jsplumb_e_"; + this.defaultLabelLocation = [ 0.5, 0.5 ]; + this.defaultOverlayKeys = ["Overlays", "EndpointOverlays"]; + _jp.OverlayCapableJsPlumbUIComponent.apply(this, arguments); + +// TYPE + + this.appendToDefaultType({ + connectionType:params.connectionType, + maxConnections: params.maxConnections == null ? this._jsPlumb.instance.Defaults.MaxConnections : params.maxConnections, // maximum number of connections this endpoint can be the source of., + paintStyle: params.endpointStyle || params.paintStyle || params.style || this._jsPlumb.instance.Defaults.EndpointStyle || _jp.Defaults.EndpointStyle, + hoverPaintStyle: params.endpointHoverStyle || params.hoverPaintStyle || this._jsPlumb.instance.Defaults.EndpointHoverStyle || _jp.Defaults.EndpointHoverStyle, + connectorStyle: params.connectorStyle, + connectorHoverStyle: params.connectorHoverStyle, + connectorClass: params.connectorClass, + connectorHoverClass: params.connectorHoverClass, + connectorOverlays: params.connectorOverlays, + connector: params.connector, + connectorTooltip: params.connectorTooltip + }); + +// END TYPE + + this._jsPlumb.enabled = !(params.enabled === false); + this._jsPlumb.visible = true; + this.element = _jp.getElement(params.source); + this._jsPlumb.uuid = params.uuid; + this._jsPlumb.floatingEndpoint = null; + var inPlaceCopy = null; + if (this._jsPlumb.uuid) { + params.endpointsByUUID[this._jsPlumb.uuid] = this; + } + this.elementId = params.elementId; + this.dragProxy = params.dragProxy; + + this._jsPlumb.connectionCost = params.connectionCost; + this._jsPlumb.connectionsDirected = params.connectionsDirected; + this._jsPlumb.currentAnchorClass = ""; + this._jsPlumb.events = {}; + + var deleteOnEmpty = params.deleteOnEmpty === true; + this.setDeleteOnEmpty = function(d) { + deleteOnEmpty = d; + }; + + var _updateAnchorClass = function () { + // stash old, get new + var oldAnchorClass = _jsPlumb.endpointAnchorClassPrefix + "-" + this._jsPlumb.currentAnchorClass; + this._jsPlumb.currentAnchorClass = this.anchor.getCssClass(); + var anchorClass = _jsPlumb.endpointAnchorClassPrefix + (this._jsPlumb.currentAnchorClass ? "-" + this._jsPlumb.currentAnchorClass : ""); + + this.removeClass(oldAnchorClass); + this.addClass(anchorClass); + // add and remove at the same time to reduce the number of reflows. + _jp.updateClasses(this.element, anchorClass, oldAnchorClass); + }.bind(this); + + this.prepareAnchor = function(anchorParams) { + var a = this._jsPlumb.instance.makeAnchor(anchorParams, this.elementId, _jsPlumb); + a.bind("anchorChanged", function (currentAnchor) { + this.fire("anchorChanged", {endpoint: this, anchor: currentAnchor}); + _updateAnchorClass(); + }.bind(this)); + return a; + }; + + this.setPreparedAnchor = function(anchor, doNotRepaint) { + this._jsPlumb.instance.continuousAnchorFactory.clear(this.elementId); + this.anchor = anchor; + _updateAnchorClass(); + + if (!doNotRepaint) { + this._jsPlumb.instance.repaint(this.elementId); + } + + return this; + }; + + this.setAnchor = function (anchorParams, doNotRepaint) { + var a = this.prepareAnchor(anchorParams); + this.setPreparedAnchor(a, doNotRepaint); + return this; + }; + + var internalHover = function (state) { + if (this.connections.length > 0) { + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].setHover(state, false); + } + } + else { + this.setHover(state); + } + }.bind(this); + + this.bind("mouseover", function () { + internalHover(true); + }); + this.bind("mouseout", function () { + internalHover(false); + }); + + // ANCHOR MANAGER + if (!params._transient) { // in place copies, for example, are transient. they will never need to be retrieved during a paint cycle, because they dont move, and then they are deleted. + this._jsPlumb.instance.anchorManager.add(this, this.elementId); + } + + this.prepareEndpoint = function(ep, typeId) { + var _e = function (t, p) { + var rm = _jsPlumb.getRenderMode(); + if (_jp.Endpoints[rm][t]) { + return new _jp.Endpoints[rm][t](p); + } + if (!_jsPlumb.Defaults.DoNotThrowErrors) { + throw { msg: "jsPlumb: unknown endpoint type '" + t + "'" }; + } + }; + + var endpointArgs = { + _jsPlumb: this._jsPlumb.instance, + cssClass: params.cssClass, + container: params.container, + tooltip: params.tooltip, + connectorTooltip: params.connectorTooltip, + endpoint: this + }; + + var endpoint; + + if (_ju.isString(ep)) { + endpoint = _e(ep, endpointArgs); + } + else if (_ju.isArray(ep)) { + endpointArgs = _ju.merge(ep[1], endpointArgs); + endpoint = _e(ep[0], endpointArgs); + } + else { + endpoint = ep.clone(); + } + + // assign a clone function using a copy of endpointArgs. this is used when a drag starts: the endpoint that was dragged is cloned, + // and the clone is left in its place while the original one goes off on a magical journey. + // the copy is to get around a closure problem, in which endpointArgs ends up getting shared by + // the whole world. + //var argsForClone = jsPlumb.extend({}, endpointArgs); + endpoint.clone = function () { + // TODO this, and the code above, can be refactored to be more dry. + if (_ju.isString(ep)) { + return _e(ep, endpointArgs); + } + else if (_ju.isArray(ep)) { + endpointArgs = _ju.merge(ep[1], endpointArgs); + return _e(ep[0], endpointArgs); + } + }.bind(this); + + endpoint.typeId = typeId; + return endpoint; + }; + + this.setEndpoint = function(ep, doNotRepaint) { + var _ep = this.prepareEndpoint(ep); + this.setPreparedEndpoint(_ep, true); + }; + + this.setPreparedEndpoint = function (ep, doNotRepaint) { + if (this.endpoint != null) { + this.endpoint.cleanup(); + this.endpoint.destroy(); + } + this.endpoint = ep; + this.type = this.endpoint.type; + this.canvas = this.endpoint.canvas; + }; + + _jp.extend(this, params, typeParameters); + + this.isSource = params.isSource || false; + this.isTemporarySource = params.isTemporarySource || false; + this.isTarget = params.isTarget || false; + + this.connections = params.connections || []; + this.connectorPointerEvents = params["connector-pointer-events"]; + + this.scope = params.scope || _jsPlumb.getDefaultScope(); + this.timestamp = null; + this.reattachConnections = params.reattach || _jsPlumb.Defaults.ReattachConnections; + this.connectionsDetachable = _jsPlumb.Defaults.ConnectionsDetachable; + if (params.connectionsDetachable === false || params.detachable === false) { + this.connectionsDetachable = false; + } + this.dragAllowedWhenFull = params.dragAllowedWhenFull !== false; + + if (params.onMaxConnections) { + this.bind("maxConnections", params.onMaxConnections); + } + + // + // add a connection. not part of public API. + // + this.addConnection = function (connection) { + this.connections.push(connection); + this[(this.connections.length > 0 ? "add" : "remove") + "Class"](_jsPlumb.endpointConnectedClass); + this[(this.isFull() ? "add" : "remove") + "Class"](_jsPlumb.endpointFullClass); + }; + + this.detachFromConnection = function (connection, idx, doNotCleanup) { + idx = idx == null ? this.connections.indexOf(connection) : idx; + if (idx >= 0) { + this.connections.splice(idx, 1); + this[(this.connections.length > 0 ? "add" : "remove") + "Class"](_jsPlumb.endpointConnectedClass); + this[(this.isFull() ? "add" : "remove") + "Class"](_jsPlumb.endpointFullClass); + } + + if (!doNotCleanup && deleteOnEmpty && this.connections.length === 0) { + _jsPlumb.deleteObject({ + endpoint: this, + fireEvent: false, + deleteAttachedObjects: doNotCleanup !== true + }); + } + }; + + this.deleteEveryConnection = function(params) { + var c = this.connections.length; + for (var i = 0; i < c; i++) { + _jsPlumb.deleteConnection(this.connections[0], params); + } + }; + + this.detachFrom = function (targetEndpoint, fireEvent, originalEvent) { + var c = []; + for (var i = 0; i < this.connections.length; i++) { + if (this.connections[i].endpoints[1] === targetEndpoint || this.connections[i].endpoints[0] === targetEndpoint) { + c.push(this.connections[i]); + } + } + for (var j = 0, count = c.length; j < count; j++) { + _jsPlumb.deleteConnection(c[0]); + } + return this; + }; + + this.getElement = function () { + return this.element; + }; + + this.setElement = function (el) { + var parentId = this._jsPlumb.instance.getId(el), + curId = this.elementId; + // remove the endpoint from the list for the current endpoint's element + _ju.removeWithFunction(params.endpointsByElement[this.elementId], function (e) { + return e.id === this.id; + }.bind(this)); + this.element = _jp.getElement(el); + this.elementId = _jsPlumb.getId(this.element); + _jsPlumb.anchorManager.rehomeEndpoint(this, curId, this.element); + _jsPlumb.dragManager.endpointAdded(this.element); + _ju.addToList(params.endpointsByElement, parentId, this); + return this; + }; + + /** + * private but must be exposed. + */ + this.makeInPlaceCopy = function () { + var loc = this.anchor.getCurrentLocation({element: this}), + o = this.anchor.getOrientation(this), + acc = this.anchor.getCssClass(), + inPlaceAnchor = { + bind: function () { + }, + compute: function () { + return [ loc[0], loc[1] ]; + }, + getCurrentLocation: function () { + return [ loc[0], loc[1] ]; + }, + getOrientation: function () { + return o; + }, + getCssClass: function () { + return acc; + } + }; + + return _newEndpoint({ + dropOptions: params.dropOptions, + anchor: inPlaceAnchor, + source: this.element, + paintStyle: this.getPaintStyle(), + endpoint: params.hideOnDrag ? "Blank" : this.endpoint, + _transient: true, + scope: this.scope, + reference:this + }); + }; + + /** + * returns a connection from the pool; used when dragging starts. just gets the head of the array if it can. + */ + this.connectorSelector = function () { + return this.connections[0]; + }; + + this.setStyle = this.setPaintStyle; + + this.paint = function (params) { + params = params || {}; + var timestamp = params.timestamp, recalc = !(params.recalc === false); + if (!timestamp || this.timestamp !== timestamp) { + + var info = _jsPlumb.updateOffset({ elId: this.elementId, timestamp: timestamp }); + + var xy = params.offset ? params.offset.o : info.o; + if (xy != null) { + var ap = params.anchorPoint, connectorPaintStyle = params.connectorPaintStyle; + if (ap == null) { + var wh = params.dimensions || info.s, + anchorParams = { xy: [ xy.left, xy.top ], wh: wh, element: this, timestamp: timestamp }; + if (recalc && this.anchor.isDynamic && this.connections.length > 0) { + var c = findConnectionToUseForDynamicAnchor(this, params.elementWithPrecedence), + oIdx = c.endpoints[0] === this ? 1 : 0, + oId = oIdx === 0 ? c.sourceId : c.targetId, + oInfo = _jsPlumb.getCachedData(oId), + oOffset = oInfo.o, oWH = oInfo.s; + + anchorParams.index = oIdx === 0 ? 1 : 0; + anchorParams.connection = c; + anchorParams.txy = [ oOffset.left, oOffset.top ]; + anchorParams.twh = oWH; + anchorParams.tElement = c.endpoints[oIdx]; + } else if (this.connections.length > 0) { + anchorParams.connection = this.connections[0]; + } + ap = this.anchor.compute(anchorParams); + } + + this.endpoint.compute(ap, this.anchor.getOrientation(this), this._jsPlumb.paintStyleInUse, connectorPaintStyle || this.paintStyleInUse); + this.endpoint.paint(this._jsPlumb.paintStyleInUse, this.anchor); + this.timestamp = timestamp; + + // paint overlays + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays.hasOwnProperty(i)) { + var o = this._jsPlumb.overlays[i]; + if (o.isVisible()) { + this._jsPlumb.overlayPlacements[i] = o.draw(this.endpoint, this._jsPlumb.paintStyleInUse); + o.paint(this._jsPlumb.overlayPlacements[i]); + } + } + } + } + } + }; + + this.getTypeDescriptor = function () { + return "endpoint"; + }; + this.isVisible = function () { + return this._jsPlumb.visible; + }; + + this.repaint = this.paint; + + var draggingInitialised = false; + this.initDraggable = function () { + + // is this a connection source? we make it draggable and have the + // drag listener maintain a connection with a floating endpoint. + if (!draggingInitialised && _jp.isDragSupported(this.element)) { + var placeholderInfo = { id: null, element: null }, + jpc = null, + existingJpc = false, + existingJpcParams = null, + _dragHandler = _makeConnectionDragHandler(this, placeholderInfo, _jsPlumb), + dragOptions = params.dragOptions || {}, + defaultOpts = {}, + startEvent = _jp.dragEvents.start, + stopEvent = _jp.dragEvents.stop, + dragEvent = _jp.dragEvents.drag, + beforeStartEvent = _jp.dragEvents.beforeStart, + payload; + + // respond to beforeStart from katavorio; this will have, optionally, a payload of attribute values + // that were placed there by the makeSource mousedown listener. + var beforeStart = function(beforeStartParams) { + payload = beforeStartParams.e.payload || {}; + }; + + var start = function (startParams) { + +// ------------- first, get a connection to drag. this may be null, in which case we are dragging a new one. + + jpc = this.connectorSelector(); + +// -------------------------------- now a bunch of tests about whether or not to proceed ------------------------- + + var _continue = true; + // if not enabled, return + if (!this.isEnabled()) { + _continue = false; + } + // if no connection and we're not a source - or temporarily a source, as is the case with makeSource - return. + if (jpc == null && !this.isSource && !this.isTemporarySource) { + _continue = false; + } + // otherwise if we're full and not allowed to drag, also return false. + if (this.isSource && this.isFull() && !(jpc != null && this.dragAllowedWhenFull)) { + _continue = false; + } + // if the connection was setup as not detachable or one of its endpoints + // was setup as connectionsDetachable = false, or Defaults.ConnectionsDetachable + // is set to false... + if (jpc != null && !jpc.isDetachable(this)) { + // .. and the endpoint is full + if (this.isFull()) { + _continue = false; + } else { + // otherwise, if not full, set the connection to null, and we will now proceed + // to drag a new connection. + jpc = null; + } + } + + var beforeDrag = _jsPlumb.checkCondition(jpc == null ? "beforeDrag" : "beforeStartDetach", { + endpoint:this, + source:this.element, + sourceId:this.elementId, + connection:jpc + }); + if (beforeDrag === false) { + _continue = false; + } + // else we might have been given some data. we'll pass it in to a new connection as 'data'. + // here we also merge in the optional payload we were given on mousedown. + else if (typeof beforeDrag === "object") { + _jp.extend(beforeDrag, payload || {}); + } + else { + // or if no beforeDrag data, maybe use the payload on its own. + beforeDrag = payload || {}; + } + + if (_continue === false) { + // this is for mootools and yui. returning false from this causes jquery to stop drag. + // the events are wrapped in both mootools and yui anyway, but i don't think returning + // false from the start callback would stop a drag. + if (_jsPlumb.stopDrag) { + _jsPlumb.stopDrag(this.canvas); + } + _dragHandler.stopDrag(); + return false; + } + +// --------------------------------------------------------------------------------------------------------------------- + + // ok to proceed. + + // clear hover for all connections for this endpoint before continuing. + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].setHover(false); + } + + this.addClass("endpointDrag"); + _jsPlumb.setConnectionBeingDragged(true); + + // if we're not full but there was a connection, make it null. we'll create a new one. + if (jpc && !this.isFull() && this.isSource) { + jpc = null; + } + + _jsPlumb.updateOffset({ elId: this.elementId }); + +// ---------------- make the element we will drag around, and position it ----------------------------- + + var ipco = this._jsPlumb.instance.getOffset(this.canvas), + canvasElement = this.canvas, + ips = this._jsPlumb.instance.getSize(this.canvas); + + _makeDraggablePlaceholder(placeholderInfo, _jsPlumb, ipco, ips); + + // store the id of the dragging div and the source element. the drop function will pick these up. + _jsPlumb.setAttributes(this.canvas, { + "dragId": placeholderInfo.id, + "elId": this.elementId + }); + +// ------------------- create an endpoint that will be our floating endpoint ------------------------------------ + + var endpointToFloat = this.dragProxy || this.endpoint; + if (this.dragProxy == null && this.connectionType != null) { + var aae = this._jsPlumb.instance.deriveEndpointAndAnchorSpec(this.connectionType); + if (aae.endpoints[1]) { + endpointToFloat = aae.endpoints[1]; + } + } + var centerAnchor = this._jsPlumb.instance.makeAnchor("Center"); + centerAnchor.isFloating = true; + this._jsPlumb.floatingEndpoint = _makeFloatingEndpoint(this.getPaintStyle(), centerAnchor, endpointToFloat, this.canvas, placeholderInfo.element, _jsPlumb, _newEndpoint, this.scope); + var _savedAnchor = this._jsPlumb.floatingEndpoint.anchor; + + + if (jpc == null) { + + this.setHover(false, false); + // create a connection. one end is this endpoint, the other is a floating endpoint. + jpc = _newConnection({ + sourceEndpoint: this, + targetEndpoint: this._jsPlumb.floatingEndpoint, + source: this.element, // for makeSource with parent option. ensure source element is represented correctly. + target: placeholderInfo.element, + anchors: [ this.anchor, this._jsPlumb.floatingEndpoint.anchor ], + paintStyle: params.connectorStyle, // this can be null. Connection will use the default. + hoverPaintStyle: params.connectorHoverStyle, + connector: params.connector, // this can also be null. Connection will use the default. + overlays: params.connectorOverlays, + type: this.connectionType, + cssClass: this.connectorClass, + hoverClass: this.connectorHoverClass, + scope:params.scope, + data:beforeDrag + }); + jpc.pending = true; + jpc.addClass(_jsPlumb.draggingClass); + this._jsPlumb.floatingEndpoint.addClass(_jsPlumb.draggingClass); + this._jsPlumb.floatingEndpoint.anchor = _savedAnchor; + // fire an event that informs that a connection is being dragged + _jsPlumb.fire("connectionDrag", jpc); + + // register the new connection on the drag manager. This connection, at this point, is 'pending', + // and has as its target a temporary element (the 'placeholder'). If the connection subsequently + // becomes established, the anchor manager is informed that the target of the connection has + // changed. + + _jsPlumb.anchorManager.newConnection(jpc); + + } else { + existingJpc = true; + jpc.setHover(false); + // new anchor idx + var anchorIdx = jpc.endpoints[0].id === this.id ? 0 : 1; + this.detachFromConnection(jpc, null, true); // detach from the connection while dragging is occurring. but dont cleanup automatically. + + // store the original scope (issue 57) + var dragScope = _jsPlumb.getDragScope(canvasElement); + _jsPlumb.setAttribute(this.canvas, "originalScope", dragScope); + + // fire an event that informs that a connection is being dragged. we do this before + // replacing the original target with the floating element info. + _jsPlumb.fire("connectionDrag", jpc); + + // now we replace ourselves with the temporary div we created above: + if (anchorIdx === 0) { + existingJpcParams = [ jpc.source, jpc.sourceId, canvasElement, dragScope ]; + _jsPlumb.anchorManager.sourceChanged(jpc.endpoints[anchorIdx].elementId, placeholderInfo.id, jpc, placeholderInfo.element); + + } else { + existingJpcParams = [ jpc.target, jpc.targetId, canvasElement, dragScope ]; + jpc.target = placeholderInfo.element; + jpc.targetId = placeholderInfo.id; + + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.endpoints[anchorIdx].elementId, jpc.targetId, jpc); + } + + // store the original endpoint and assign the new floating endpoint for the drag. + jpc.suspendedEndpoint = jpc.endpoints[anchorIdx]; + + // PROVIDE THE SUSPENDED ELEMENT, BE IT A SOURCE OR TARGET (ISSUE 39) + jpc.suspendedElement = jpc.endpoints[anchorIdx].getElement(); + jpc.suspendedElementId = jpc.endpoints[anchorIdx].elementId; + jpc.suspendedElementType = anchorIdx === 0 ? "source" : "target"; + + jpc.suspendedEndpoint.setHover(false); + this._jsPlumb.floatingEndpoint.referenceEndpoint = jpc.suspendedEndpoint; + jpc.endpoints[anchorIdx] = this._jsPlumb.floatingEndpoint; + + jpc.addClass(_jsPlumb.draggingClass); + this._jsPlumb.floatingEndpoint.addClass(_jsPlumb.draggingClass); + } + + _jsPlumb.registerFloatingConnection(placeholderInfo, jpc, this._jsPlumb.floatingEndpoint); + + // // register it and register connection on it. + // _jsPlumb.floatingConnections[placeholderInfo.id] = jpc; + // + // // only register for the target endpoint; we will not be dragging the source at any time + // // before this connection is either discarded or made into a permanent connection. + // _ju.addToList(params.endpointsByElement, placeholderInfo.id, this._jsPlumb.floatingEndpoint); + + + // tell jsplumb about it + _jsPlumb.currentlyDragging = true; + }.bind(this); + + var stop = function () { + _jsPlumb.setConnectionBeingDragged(false); + + if (jpc && jpc.endpoints != null) { + // get the actual drop event (decode from library args to stop function) + var originalEvent = _jsPlumb.getDropEvent(arguments); + // unlock the other endpoint (if it is dynamic, it would have been locked at drag start) + var idx = _jsPlumb.getFloatingAnchorIndex(jpc); + jpc.endpoints[idx === 0 ? 1 : 0].anchor.unlock(); + // TODO: Dont want to know about css classes inside jsplumb, ideally. + jpc.removeClass(_jsPlumb.draggingClass); + + // if we have the floating endpoint then the connection has not been dropped + // on another endpoint. If it is a new connection we throw it away. If it is an + // existing connection we check to see if we should reattach it, throwing it away + // if not. + if (this._jsPlumb && (jpc.deleteConnectionNow || jpc.endpoints[idx] === this._jsPlumb.floatingEndpoint)) { + // 6a. if the connection was an existing one... + if (existingJpc && jpc.suspendedEndpoint) { + // fix for issue35, thanks Sylvain Gizard: when firing the detach event make sure the + // floating endpoint has been replaced. + if (idx === 0) { + jpc.floatingElement = jpc.source; + jpc.floatingId = jpc.sourceId; + jpc.floatingEndpoint = jpc.endpoints[0]; + jpc.floatingIndex = 0; + jpc.source = existingJpcParams[0]; + jpc.sourceId = existingJpcParams[1]; + } else { + // keep a copy of the floating element; the anchor manager will want to clean up. + jpc.floatingElement = jpc.target; + jpc.floatingId = jpc.targetId; + jpc.floatingEndpoint = jpc.endpoints[1]; + jpc.floatingIndex = 1; + jpc.target = existingJpcParams[0]; + jpc.targetId = existingJpcParams[1]; + } + + var fe = this._jsPlumb.floatingEndpoint; // store for later removal. + // restore the original scope (issue 57) + _jsPlumb.setDragScope(existingJpcParams[2], existingJpcParams[3]); + jpc.endpoints[idx] = jpc.suspendedEndpoint; + // if the connection should be reattached, or the other endpoint refuses detach, then + // reset the connection to its original state + if (jpc.isReattach() || jpc._forceReattach || jpc._forceDetach || !_jsPlumb.deleteConnection(jpc, {originalEvent: originalEvent})) { + + jpc.setHover(false); + jpc._forceDetach = null; + jpc._forceReattach = null; + this._jsPlumb.floatingEndpoint.detachFromConnection(jpc); + jpc.suspendedEndpoint.addConnection(jpc); + + // TODO this code is duplicated in lots of places...and there is nothing external + // in the code; it all refers to the connection itself. we could add a + // `checkSanity(connection)` method to anchorManager that did this. + if (idx === 1) { + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.floatingId, jpc.targetId, jpc); + } + else { + _jsPlumb.anchorManager.sourceChanged(jpc.floatingId, jpc.sourceId, jpc, jpc.source); + } + + _jsPlumb.repaint(existingJpcParams[1]); + } + else { + _jsPlumb.deleteObject({endpoint: fe}); + } + } + } + + // makeTargets sets this flag, to tell us we have been replaced and should delete this object. + if (this.deleteAfterDragStop) { + _jsPlumb.deleteObject({endpoint: this}); + } + else { + if (this._jsPlumb) { + this.paint({recalc: false}); + } + } + + // although the connection is no longer valid, there are use cases where this is useful. + _jsPlumb.fire("connectionDragStop", jpc, originalEvent); + // fire this event to give people more fine-grained control (connectionDragStop fires a lot) + if (jpc.pending) { + _jsPlumb.fire("connectionAborted", jpc, originalEvent); + } + // tell jsplumb that dragging is finished. + _jsPlumb.currentlyDragging = false; + jpc.suspendedElement = null; + jpc.suspendedEndpoint = null; + jpc = null; + } + + // if no endpoints, jpc already cleaned up. but still we want to ensure we're reset properly. + // remove the element associated with the floating endpoint + // (and its associated floating endpoint and visual artefacts) + if (placeholderInfo && placeholderInfo.element) { + _jsPlumb.remove(placeholderInfo.element, false, false); + } + // remove the inplace copy + if (inPlaceCopy) { + _jsPlumb.deleteObject({endpoint: inPlaceCopy}); + } + + if (this._jsPlumb) { + // make our canvas visible (TODO: hand off to library; we should not know about DOM) + this.canvas.style.visibility = "visible"; + // unlock our anchor + this.anchor.unlock(); + // clear floating anchor. + this._jsPlumb.floatingEndpoint = null; + } + + }.bind(this); + + dragOptions = _jp.extend(defaultOpts, dragOptions); + dragOptions.scope = this.scope || dragOptions.scope; + dragOptions[beforeStartEvent] = _ju.wrap(dragOptions[beforeStartEvent], beforeStart, false); + dragOptions[startEvent] = _ju.wrap(dragOptions[startEvent], start, false); + // extracted drag handler function so can be used by makeSource + dragOptions[dragEvent] = _ju.wrap(dragOptions[dragEvent], _dragHandler.drag); + dragOptions[stopEvent] = _ju.wrap(dragOptions[stopEvent], stop); + dragOptions.multipleDrop = false; + + dragOptions.canDrag = function () { + return this.isSource || this.isTemporarySource || (this.connections.length > 0 && this.connectionsDetachable !== false); + }.bind(this); + + _jsPlumb.initDraggable(this.canvas, dragOptions, "internal"); + + this.canvas._jsPlumbRelatedElement = this.element; + + draggingInitialised = true; + } + }; + + var ep = params.endpoint || this._jsPlumb.instance.Defaults.Endpoint || _jp.Defaults.Endpoint; + this.setEndpoint(ep, true); + var anchorParamsToUse = params.anchor ? params.anchor : params.anchors ? params.anchors : (_jsPlumb.Defaults.Anchor || "Top"); + this.setAnchor(anchorParamsToUse, true); + + // finally, set type if it was provided + var type = [ "default", (params.type || "")].join(" "); + this.addType(type, params.data, true); + this.canvas = this.endpoint.canvas; + this.canvas._jsPlumb = this; + + this.initDraggable(); + + // pulled this out into a function so we can reuse it for the inPlaceCopy canvas; you can now drop detached connections + // back onto the endpoint you detached it from. + var _initDropTarget = function (canvas, isTransient, endpoint, referenceEndpoint) { + + if (_jp.isDropSupported(this.element)) { + var dropOptions = params.dropOptions || _jsPlumb.Defaults.DropOptions || _jp.Defaults.DropOptions; + dropOptions = _jp.extend({}, dropOptions); + dropOptions.scope = dropOptions.scope || this.scope; + var dropEvent = _jp.dragEvents.drop, + overEvent = _jp.dragEvents.over, + outEvent = _jp.dragEvents.out, + _ep = this, + drop = _jsPlumb.EndpointDropHandler({ + getEndpoint: function () { + return _ep; + }, + jsPlumb: _jsPlumb, + enabled: function () { + return endpoint != null ? endpoint.isEnabled() : true; + }, + isFull: function () { + return endpoint.isFull(); + }, + element: this.element, + elementId: this.elementId, + isSource: this.isSource, + isTarget: this.isTarget, + addClass: function (clazz) { + _ep.addClass(clazz); + }, + removeClass: function (clazz) { + _ep.removeClass(clazz); + }, + isDropAllowed: function () { + return _ep.isDropAllowed.apply(_ep, arguments); + }, + reference:referenceEndpoint, + isRedrop:function(jpc, dhParams) { + return jpc.suspendedEndpoint && dhParams.reference && (jpc.suspendedEndpoint.id === dhParams.reference.id); + } + }); + + dropOptions[dropEvent] = _ju.wrap(dropOptions[dropEvent], drop, true); + dropOptions[overEvent] = _ju.wrap(dropOptions[overEvent], function () { + var draggable = _jp.getDragObject(arguments), + id = _jsPlumb.getAttribute(_jp.getElement(draggable), "dragId"), + _jpc = _jsPlumb.getFloatingConnectionFor(id);//_jsPlumb.floatingConnections[id]; + + if (_jpc != null) { + var idx = _jsPlumb.getFloatingAnchorIndex(_jpc); + // here we should fire the 'over' event if we are a target and this is a new connection, + // or we are the same as the floating endpoint. + var _cont = (this.isTarget && idx !== 0) || (_jpc.suspendedEndpoint && this.referenceEndpoint && this.referenceEndpoint.id === _jpc.suspendedEndpoint.id); + if (_cont) { + var bb = _jsPlumb.checkCondition("checkDropAllowed", { + sourceEndpoint: _jpc.endpoints[idx], + targetEndpoint: this, + connection: _jpc + }); + this[(bb ? "add" : "remove") + "Class"](_jsPlumb.endpointDropAllowedClass); + this[(bb ? "remove" : "add") + "Class"](_jsPlumb.endpointDropForbiddenClass); + _jpc.endpoints[idx].anchor.over(this.anchor, this); + } + } + }.bind(this)); + + dropOptions[outEvent] = _ju.wrap(dropOptions[outEvent], function () { + var draggable = _jp.getDragObject(arguments), + id = draggable == null ? null : _jsPlumb.getAttribute(_jp.getElement(draggable), "dragId"), + _jpc = id ? _jsPlumb.getFloatingConnectionFor(id) : null; + + if (_jpc != null) { + var idx = _jsPlumb.getFloatingAnchorIndex(_jpc); + var _cont = (this.isTarget && idx !== 0) || (_jpc.suspendedEndpoint && this.referenceEndpoint && this.referenceEndpoint.id === _jpc.suspendedEndpoint.id); + if (_cont) { + this.removeClass(_jsPlumb.endpointDropAllowedClass); + this.removeClass(_jsPlumb.endpointDropForbiddenClass); + _jpc.endpoints[idx].anchor.out(); + } + } + }.bind(this)); + + _jsPlumb.initDroppable(canvas, dropOptions, "internal", isTransient); + } + }.bind(this); + + // Initialise the endpoint's canvas as a drop target. The drop handler will take care of the logic of whether + // something can actually be dropped. + if (!this.anchor.isFloating) { + _initDropTarget(this.canvas, !(params._transient || this.anchor.isFloating), this, params.reference); + } + + return this; + }; + + _ju.extend(_jp.Endpoint, _jp.OverlayCapableJsPlumbUIComponent, { + + setVisible: function (v, doNotChangeConnections, doNotNotifyOtherEndpoint) { + this._jsPlumb.visible = v; + if (this.canvas) { + this.canvas.style.display = v ? "block" : "none"; + } + this[v ? "showOverlays" : "hideOverlays"](); + if (!doNotChangeConnections) { + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].setVisible(v); + if (!doNotNotifyOtherEndpoint) { + var oIdx = this === this.connections[i].endpoints[0] ? 1 : 0; + // only change the other endpoint if this is its only connection. + if (this.connections[i].endpoints[oIdx].connections.length === 1) { + this.connections[i].endpoints[oIdx].setVisible(v, true, true); + } + } + } + } + }, + getAttachedElements: function () { + return this.connections; + }, + applyType: function (t, doNotRepaint) { + this.setPaintStyle(t.endpointStyle || t.paintStyle, doNotRepaint); + this.setHoverPaintStyle(t.endpointHoverStyle || t.hoverPaintStyle, doNotRepaint); + if (t.maxConnections != null) { + this._jsPlumb.maxConnections = t.maxConnections; + } + if (t.scope) { + this.scope = t.scope; + } + _jp.extend(this, t, typeParameters); + if (t.cssClass != null && this.canvas) { + this._jsPlumb.instance.addClass(this.canvas, t.cssClass); + } + _jp.OverlayCapableJsPlumbUIComponent.applyType(this, t); + }, + isEnabled: function () { + return this._jsPlumb.enabled; + }, + setEnabled: function (e) { + this._jsPlumb.enabled = e; + }, + cleanup: function () { + var anchorClass = this._jsPlumb.instance.endpointAnchorClassPrefix + (this._jsPlumb.currentAnchorClass ? "-" + this._jsPlumb.currentAnchorClass : ""); + _jp.removeClass(this.element, anchorClass); + this.anchor = null; + this.endpoint.cleanup(true); + this.endpoint.destroy(); + this.endpoint = null; + // drag/drop + this._jsPlumb.instance.destroyDraggable(this.canvas, "internal"); + this._jsPlumb.instance.destroyDroppable(this.canvas, "internal"); + }, + setHover: function (h) { + if (this.endpoint && this._jsPlumb && !this._jsPlumb.instance.isConnectionBeingDragged()) { + this.endpoint.setHover(h); + } + }, + isFull: function () { + return this._jsPlumb.maxConnections === 0 ? true : !(this.isFloating() || this._jsPlumb.maxConnections < 0 || this.connections.length < this._jsPlumb.maxConnections); + }, + /** + * private but needs to be exposed. + */ + isFloating: function () { + return this.anchor != null && this.anchor.isFloating; + }, + isConnectedTo: function (endpoint) { + var found = false; + if (endpoint) { + for (var i = 0; i < this.connections.length; i++) { + if (this.connections[i].endpoints[1] === endpoint || this.connections[i].endpoints[0] === endpoint) { + found = true; + break; + } + } + } + return found; + }, + getConnectionCost: function () { + return this._jsPlumb.connectionCost; + }, + setConnectionCost: function (c) { + this._jsPlumb.connectionCost = c; + }, + areConnectionsDirected: function () { + return this._jsPlumb.connectionsDirected; + }, + setConnectionsDirected: function (b) { + this._jsPlumb.connectionsDirected = b; + }, + setElementId: function (_elId) { + this.elementId = _elId; + this.anchor.elementId = _elId; + }, + setReferenceElement: function (_el) { + this.element = _jp.getElement(_el); + }, + setDragAllowedWhenFull: function (allowed) { + this.dragAllowedWhenFull = allowed; + }, + equals: function (endpoint) { + return this.anchor.equals(endpoint.anchor); + }, + getUuid: function () { + return this._jsPlumb.uuid; + }, + computeAnchor: function (params) { + return this.anchor.compute(params); + } + }); + + root.jsPlumbInstance.prototype.EndpointDropHandler = function (dhParams) { + return function (e) { + + var _jsPlumb = dhParams.jsPlumb; + + // remove the classes that are added dynamically. drop is neither forbidden nor allowed now that + // the drop is finishing. + dhParams.removeClass(_jsPlumb.endpointDropAllowedClass); + dhParams.removeClass(_jsPlumb.endpointDropForbiddenClass); + + var originalEvent = _jsPlumb.getDropEvent(arguments), + draggable = _jsPlumb.getDragObject(arguments), + id = _jsPlumb.getAttribute(draggable, "dragId"), + elId = _jsPlumb.getAttribute(draggable, "elId"), + scope = _jsPlumb.getAttribute(draggable, "originalScope"), + jpc = _jsPlumb.getFloatingConnectionFor(id); + + // if no active connection, bail. + if (jpc == null) { + return; + } + + // calculate if this is an existing connection. + var existingConnection = jpc.suspendedEndpoint != null; + + // if suspended endpoint exists but has been cleaned up, bail. This means it's an existing connection + // that has been detached and will shortly be discarded. + if (existingConnection && jpc.suspendedEndpoint._jsPlumb == null) { + return; + } + + // get the drop endpoint. for a normal connection this is just the one that would replace the currently + // floating endpoint. for a makeTarget this is a new endpoint that is created on drop. But we leave that to + // the handler to figure out. + var _ep = dhParams.getEndpoint(jpc); + + // If we're not given an endpoint to use, bail. + if (_ep == null) { + return; + } + + // if this is a drop back where the connection came from, mark it force reattach and + // return; the stop handler will reattach. without firing an event. + if (dhParams.isRedrop(jpc, dhParams)) { + jpc._forceReattach = true; + jpc.setHover(false); + if (dhParams.maybeCleanup) { + dhParams.maybeCleanup(_ep); + } + return; + } + + // ensure we dont bother trying to drop sources on non-source eps, and same for target. + var idx = _jsPlumb.getFloatingAnchorIndex(jpc); + if ((idx === 0 && !dhParams.isSource)|| (idx === 1 && !dhParams.isTarget)){ + if (dhParams.maybeCleanup) { + dhParams.maybeCleanup(_ep); + } + return; + } + + if (dhParams.onDrop) { + dhParams.onDrop(jpc); + } + + // restore the original scope if necessary (issue 57) + if (scope) { + _jsPlumb.setDragScope(draggable, scope); + } + + // if the target of the drop is full, fire an event (we abort below) + // makeTarget: keep. + var isFull = dhParams.isFull(e); + if (isFull) { + _ep.fire("maxConnections", { + endpoint: this, + connection: jpc, + maxConnections: _ep._jsPlumb.maxConnections + }, originalEvent); + } + // + // if endpoint enabled, not full, and matches the index of the floating endpoint... + if (!isFull && dhParams.enabled()) { + var _doContinue = true; + + // before testing for beforeDrop, reset the connection's source/target to be the actual DOM elements + // involved (that is, stash any temporary stuff used for dragging. but we need to keep it around in + // order that the anchor manager can clean things up properly). + if (idx === 0) { + jpc.floatingElement = jpc.source; + jpc.floatingId = jpc.sourceId; + jpc.floatingEndpoint = jpc.endpoints[0]; + jpc.floatingIndex = 0; + jpc.source = dhParams.element; + jpc.sourceId = _jsPlumb.getId(dhParams.element); + } else { + jpc.floatingElement = jpc.target; + jpc.floatingId = jpc.targetId; + jpc.floatingEndpoint = jpc.endpoints[1]; + jpc.floatingIndex = 1; + jpc.target = dhParams.element; + jpc.targetId = _jsPlumb.getId(dhParams.element); + } + + // if this is an existing connection and detach is not allowed we won't continue. The connection's + // endpoints have been reinstated; everything is back to how it was. + if (existingConnection && jpc.suspendedEndpoint.id !== _ep.id) { + if (!jpc.isDetachAllowed(jpc) || !jpc.endpoints[idx].isDetachAllowed(jpc) || !jpc.suspendedEndpoint.isDetachAllowed(jpc) || !_jsPlumb.checkCondition("beforeDetach", jpc)) { + _doContinue = false; + } + } + +// ------------ wrap the execution path in a function so we can support asynchronous beforeDrop + + var continueFunction = function (optionalData) { + // remove this jpc from the current endpoint, which is a floating endpoint that we will + // subsequently discard. + jpc.endpoints[idx].detachFromConnection(jpc); + + // if there's a suspended endpoint, detach it from the connection. + if (jpc.suspendedEndpoint) { + jpc.suspendedEndpoint.detachFromConnection(jpc); + } + + jpc.endpoints[idx] = _ep; + _ep.addConnection(jpc); + + // copy our parameters in to the connection: + var params = _ep.getParameters(); + for (var aParam in params) { + jpc.setParameter(aParam, params[aParam]); + } + + if (!existingConnection) { + // if not an existing connection and + if (params.draggable) { + _jsPlumb.initDraggable(this.element, dhParams.dragOptions, "internal", _jsPlumb); + } + } + else { + var suspendedElementId = jpc.suspendedEndpoint.elementId; + _jsPlumb.fireMoveEvent({ + index: idx, + originalSourceId: idx === 0 ? suspendedElementId : jpc.sourceId, + newSourceId: idx === 0 ? _ep.elementId : jpc.sourceId, + originalTargetId: idx === 1 ? suspendedElementId : jpc.targetId, + newTargetId: idx === 1 ? _ep.elementId : jpc.targetId, + originalSourceEndpoint: idx === 0 ? jpc.suspendedEndpoint : jpc.endpoints[0], + newSourceEndpoint: idx === 0 ? _ep : jpc.endpoints[0], + originalTargetEndpoint: idx === 1 ? jpc.suspendedEndpoint : jpc.endpoints[1], + newTargetEndpoint: idx === 1 ? _ep : jpc.endpoints[1], + connection: jpc + }, originalEvent); + } + + if (idx === 1) { + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.floatingId, jpc.targetId, jpc); + } + else { + _jsPlumb.anchorManager.sourceChanged(jpc.floatingId, jpc.sourceId, jpc, jpc.source); + } + + // when makeSource has uniqueEndpoint:true, we want to create connections with new endpoints + // that are subsequently deleted. So makeSource sets `finalEndpoint`, which is the Endpoint to + // which the connection should be attached. The `detachFromConnection` call below results in the + // temporary endpoint being cleaned up. + if (jpc.endpoints[0].finalEndpoint) { + var _toDelete = jpc.endpoints[0]; + _toDelete.detachFromConnection(jpc); + jpc.endpoints[0] = jpc.endpoints[0].finalEndpoint; + jpc.endpoints[0].addConnection(jpc); + } + + // if optionalData was given, merge it onto the connection's data. + if (_ju.isObject(optionalData)) { + jpc.mergeData(optionalData); + } + // finalise will inform the anchor manager and also add to + // connectionsByScope if necessary. + _jsPlumb.finaliseConnection(jpc, null, originalEvent, false); + jpc.setHover(false); + + // SP continuous anchor flush + _jsPlumb.revalidate(jpc.endpoints[0].element); + + }.bind(this); + + var dontContinueFunction = function () { + // otherwise just put it back on the endpoint it was on before the drag. + if (jpc.suspendedEndpoint) { + jpc.endpoints[idx] = jpc.suspendedEndpoint; + jpc.setHover(false); + jpc._forceDetach = true; + if (idx === 0) { + jpc.source = jpc.suspendedEndpoint.element; + jpc.sourceId = jpc.suspendedEndpoint.elementId; + } else { + jpc.target = jpc.suspendedEndpoint.element; + jpc.targetId = jpc.suspendedEndpoint.elementId; + } + jpc.suspendedEndpoint.addConnection(jpc); + + // TODO checkSanity + if (idx === 1) { + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.floatingId, jpc.targetId, jpc); + } + else { + _jsPlumb.anchorManager.sourceChanged(jpc.floatingId, jpc.sourceId, jpc, jpc.source); + } + + _jsPlumb.repaint(jpc.sourceId); + jpc._forceDetach = false; + } + }; + +// -------------------------------------- + // now check beforeDrop. this will be available only on Endpoints that are setup to + // have a beforeDrop condition (although, secretly, under the hood all Endpoints and + // the Connection have them, because they are on jsPlumbUIComponent. shhh!), because + // it only makes sense to have it on a target endpoint. + _doContinue = _doContinue && dhParams.isDropAllowed(jpc.sourceId, jpc.targetId, jpc.scope, jpc, _ep);// && jpc.pending; + + if (_doContinue) { + continueFunction(_doContinue); + return true; + } + else { + dontContinueFunction(); + } + } + + if (dhParams.maybeCleanup) { + dhParams.maybeCleanup(_ep); + } + + _jsPlumb.currentlyDragging = false; + }; + }; +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the code for Connections. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, + _jp = root.jsPlumb, + _ju = root.jsPlumbUtil; + + var makeConnector = function (_jsPlumb, renderMode, connectorName, connectorArgs, forComponent) { + // first make sure we have a cache for the specified renderer + _jp.Connectors[renderMode] = _jp.Connectors[renderMode] || {}; + + // now see if the one we want exists; if not we will try to make it + if (_jp.Connectors[renderMode][connectorName] == null) { + + if (_jp.Connectors[connectorName] == null) { + if (!_jsPlumb.Defaults.DoNotThrowErrors) { + throw new TypeError("jsPlumb: unknown connector type '" + connectorName + "'"); + } else { + return null; + } + } + + _jp.Connectors[renderMode][connectorName] = function() { + _jp.Connectors[connectorName].apply(this, arguments); + _jp.ConnectorRenderers[renderMode].apply(this, arguments); + }; + + _ju.extend(_jp.Connectors[renderMode][connectorName], [ _jp.Connectors[connectorName], _jp.ConnectorRenderers[renderMode]]); + + } + + return new _jp.Connectors[renderMode][connectorName](connectorArgs, forComponent); + }, + _makeAnchor = function (anchorParams, elementId, _jsPlumb) { + return (anchorParams) ? _jsPlumb.makeAnchor(anchorParams, elementId, _jsPlumb) : null; + }, + _updateConnectedClass = function (conn, element, _jsPlumb, remove) { + if (element != null) { + element._jsPlumbConnections = element._jsPlumbConnections || {}; + if (remove) { + delete element._jsPlumbConnections[conn.id]; + } + else { + element._jsPlumbConnections[conn.id] = true; + } + + if (_ju.isEmpty(element._jsPlumbConnections)) { + _jsPlumb.removeClass(element, _jsPlumb.connectedClass); + } + else { + _jsPlumb.addClass(element, _jsPlumb.connectedClass); + } + } + }; + + _jp.Connection = function (params) { + var _newEndpoint = params.newEndpoint; + + this.id = params.id; + this.connector = null; + this.idPrefix = "_jsplumb_c_"; + this.defaultLabelLocation = 0.5; + this.defaultOverlayKeys = ["Overlays", "ConnectionOverlays"]; + // if a new connection is the result of moving some existing connection, params.previousConnection + // will have that Connection in it. listeners for the jsPlumbConnection event can look for that + // member and take action if they need to. + this.previousConnection = params.previousConnection; + this.source = _jp.getElement(params.source); + this.target = _jp.getElement(params.target); + + + _jp.OverlayCapableJsPlumbUIComponent.apply(this, arguments); + + // sourceEndpoint and targetEndpoint override source/target, if they are present. but + // source is not overridden if the Endpoint has declared it is not the final target of a connection; + // instead we use the source that the Endpoint declares will be the final source element. + if (params.sourceEndpoint) { + this.source = params.sourceEndpoint.getElement(); + this.sourceId = params.sourceEndpoint.elementId; + } else { + this.sourceId = this._jsPlumb.instance.getId(this.source); + } + + if (params.targetEndpoint) { + this.target = params.targetEndpoint.getElement(); + this.targetId = params.targetEndpoint.elementId; + } else { + this.targetId = this._jsPlumb.instance.getId(this.target); + } + + + this.scope = params.scope; // scope may have been passed in to the connect call. if it wasn't, we will pull it from the source endpoint, after having initialised the endpoints. + this.endpoints = []; + this.endpointStyles = []; + + var _jsPlumb = this._jsPlumb.instance; + + _jsPlumb.manage(this.sourceId, this.source); + _jsPlumb.manage(this.targetId, this.target); + + this._jsPlumb.visible = true; + + this._jsPlumb.params = { + cssClass: params.cssClass, + container: params.container, + "pointer-events": params["pointer-events"], + editorParams: params.editorParams, + overlays: params.overlays + }; + this._jsPlumb.lastPaintedAt = null; + + // listen to mouseover and mouseout events passed from the container delegate. + this.bind("mouseover", function () { + this.setHover(true); + }.bind(this)); + this.bind("mouseout", function () { + this.setHover(false); + }.bind(this)); + + +// INITIALISATION CODE + + this.makeEndpoint = function (isSource, el, elId, ep, definition) { + elId = elId || this._jsPlumb.instance.getId(el); + return this.prepareEndpoint(_jsPlumb, _newEndpoint, this, ep, isSource ? 0 : 1, params, el, elId, definition); + }; + + // if type given, get the endpoint definitions mapping to that type from the jsplumb instance, and use those. + // we apply types at the end of this constructor but endpoints are only honoured in a type definition at + // create time. + if (params.type) { + params.endpoints = params.endpoints || this._jsPlumb.instance.deriveEndpointAndAnchorSpec(params.type).endpoints; + } + + var eS = this.makeEndpoint(true, this.source, this.sourceId, params.sourceEndpoint), + eT = this.makeEndpoint(false, this.target, this.targetId, params.targetEndpoint); + + if (eS) { + _ju.addToList(params.endpointsByElement, this.sourceId, eS); + } + if (eT) { + _ju.addToList(params.endpointsByElement, this.targetId, eT); + } + // if scope not set, set it to be the scope for the source endpoint. + if (!this.scope) { + this.scope = this.endpoints[0].scope; + } + + // if explicitly told to (or not to) delete endpoints when empty, override endpoint's preferences + if (params.deleteEndpointsOnEmpty != null) { + this.endpoints[0].setDeleteOnEmpty(params.deleteEndpointsOnEmpty); + this.endpoints[1].setDeleteOnEmpty(params.deleteEndpointsOnEmpty); + } + +// -------------------------- DEFAULT TYPE --------------------------------------------- + + // DETACHABLE + var _detachable = _jsPlumb.Defaults.ConnectionsDetachable; + if (params.detachable === false) { + _detachable = false; + } + if (this.endpoints[0].connectionsDetachable === false) { + _detachable = false; + } + if (this.endpoints[1].connectionsDetachable === false) { + _detachable = false; + } + // REATTACH + var _reattach = params.reattach || this.endpoints[0].reattachConnections || this.endpoints[1].reattachConnections || _jsPlumb.Defaults.ReattachConnections; + + this.appendToDefaultType({ + detachable: _detachable, + reattach: _reattach, + paintStyle:this.endpoints[0].connectorStyle || this.endpoints[1].connectorStyle || params.paintStyle || _jsPlumb.Defaults.PaintStyle || _jp.Defaults.PaintStyle, + hoverPaintStyle:this.endpoints[0].connectorHoverStyle || this.endpoints[1].connectorHoverStyle || params.hoverPaintStyle || _jsPlumb.Defaults.HoverPaintStyle || _jp.Defaults.HoverPaintStyle + }); + + var _suspendedAt = _jsPlumb.getSuspendedAt(); + if (!_jsPlumb.isSuspendDrawing()) { + // paint the endpoints + var myInfo = _jsPlumb.getCachedData(this.sourceId), + myOffset = myInfo.o, myWH = myInfo.s, + otherInfo = _jsPlumb.getCachedData(this.targetId), + otherOffset = otherInfo.o, + otherWH = otherInfo.s, + initialTimestamp = _suspendedAt || _jsPlumb.timestamp(), + anchorLoc = this.endpoints[0].anchor.compute({ + xy: [ myOffset.left, myOffset.top ], wh: myWH, element: this.endpoints[0], + elementId: this.endpoints[0].elementId, + txy: [ otherOffset.left, otherOffset.top ], twh: otherWH, tElement: this.endpoints[1], + timestamp: initialTimestamp + }); + + this.endpoints[0].paint({ anchorLoc: anchorLoc, timestamp: initialTimestamp }); + + anchorLoc = this.endpoints[1].anchor.compute({ + xy: [ otherOffset.left, otherOffset.top ], wh: otherWH, element: this.endpoints[1], + elementId: this.endpoints[1].elementId, + txy: [ myOffset.left, myOffset.top ], twh: myWH, tElement: this.endpoints[0], + timestamp: initialTimestamp + }); + this.endpoints[1].paint({ anchorLoc: anchorLoc, timestamp: initialTimestamp }); + } + + this.getTypeDescriptor = function () { + return "connection"; + }; + this.getAttachedElements = function () { + return this.endpoints; + }; + + this.isDetachable = function (ep) { + return this._jsPlumb.detachable === false ? false : ep != null ? ep.connectionsDetachable === true : this._jsPlumb.detachable === true; + }; + this.setDetachable = function (detachable) { + this._jsPlumb.detachable = detachable === true; + }; + this.isReattach = function () { + return this._jsPlumb.reattach === true || this.endpoints[0].reattachConnections === true || this.endpoints[1].reattachConnections === true; + }; + this.setReattach = function (reattach) { + this._jsPlumb.reattach = reattach === true; + }; + +// END INITIALISATION CODE + + +// COST + DIRECTIONALITY + // if cost not supplied, try to inherit from source endpoint + this._jsPlumb.cost = params.cost || this.endpoints[0].getConnectionCost(); + this._jsPlumb.directed = params.directed; + // inherit directed flag if set no source endpoint + if (params.directed == null) { + this._jsPlumb.directed = this.endpoints[0].areConnectionsDirected(); + } +// END COST + DIRECTIONALITY + +// PARAMETERS + // merge all the parameters objects into the connection. parameters set + // on the connection take precedence; then source endpoint params, then + // finally target endpoint params. + var _p = _jp.extend({}, this.endpoints[1].getParameters()); + _jp.extend(_p, this.endpoints[0].getParameters()); + _jp.extend(_p, this.getParameters()); + this.setParameters(_p); +// END PARAMETERS + +// PAINTING + + this.setConnector(this.endpoints[0].connector || this.endpoints[1].connector || params.connector || _jsPlumb.Defaults.Connector || _jp.Defaults.Connector, true); + var data = params.data == null || !_ju.isObject(params.data) ? {} : params.data; + this.getData = function() { return data; }; + this.setData = function(d) { data = d || {}; }; + this.mergeData = function(d) { data = _jp.extend(data, d); }; + + // the very last thing we do is apply types, if there are any. + var _types = [ "default", this.endpoints[0].connectionType, this.endpoints[1].connectionType, params.type ].join(" "); + if (/[^\s]/.test(_types)) { + this.addType(_types, params.data, true); + } + + this.updateConnectedClass(); + +// END PAINTING + }; + + _ju.extend(_jp.Connection, _jp.OverlayCapableJsPlumbUIComponent, { + applyType: function (t, doNotRepaint, typeMap) { + + var _connector = null; + if (t.connector != null) { + _connector = this.getCachedTypeItem("connector", typeMap.connector); + if (_connector == null) { + _connector = this.prepareConnector(t.connector, typeMap.connector); + this.cacheTypeItem("connector", _connector, typeMap.connector); + } + this.setPreparedConnector(_connector); + } + + // none of these things result in the creation of objects so can be ignored. + if (t.detachable != null) { + this.setDetachable(t.detachable); + } + if (t.reattach != null) { + this.setReattach(t.reattach); + } + if (t.scope) { + this.scope = t.scope; + } + + if (t.cssClass != null && this.canvas) { + this._jsPlumb.instance.addClass(this.canvas, t.cssClass); + } + + var _anchors = null; + // this also results in the creation of objects. + if (t.anchor) { + // note that even if the param was anchor, we store `anchors`. + _anchors = this.getCachedTypeItem("anchors", typeMap.anchor); + if (_anchors == null) { + _anchors = [ this._jsPlumb.instance.makeAnchor(t.anchor), this._jsPlumb.instance.makeAnchor(t.anchor) ]; + this.cacheTypeItem("anchors", _anchors, typeMap.anchor); + } + } + else if (t.anchors) { + _anchors = this.getCachedTypeItem("anchors", typeMap.anchors); + if (_anchors == null) { + _anchors = [ + this._jsPlumb.instance.makeAnchor(t.anchors[0]), + this._jsPlumb.instance.makeAnchor(t.anchors[1]) + ]; + this.cacheTypeItem("anchors", _anchors, typeMap.anchors); + } + } + if (_anchors != null) { + this.endpoints[0].anchor = _anchors[0]; + this.endpoints[1].anchor = _anchors[1]; + if (this.endpoints[1].anchor.isDynamic) { + this._jsPlumb.instance.repaint(this.endpoints[1].elementId); + } + } + + _jp.OverlayCapableJsPlumbUIComponent.applyType(this, t); + }, + addClass: function (c, informEndpoints) { + if (informEndpoints) { + this.endpoints[0].addClass(c); + this.endpoints[1].addClass(c); + if (this.suspendedEndpoint) { + this.suspendedEndpoint.addClass(c); + } + } + if (this.connector) { + this.connector.addClass(c); + } + }, + removeClass: function (c, informEndpoints) { + if (informEndpoints) { + this.endpoints[0].removeClass(c); + this.endpoints[1].removeClass(c); + if (this.suspendedEndpoint) { + this.suspendedEndpoint.removeClass(c); + } + } + if (this.connector) { + this.connector.removeClass(c); + } + }, + isVisible: function () { + return this._jsPlumb.visible; + }, + setVisible: function (v) { + this._jsPlumb.visible = v; + if (this.connector) { + this.connector.setVisible(v); + } + this.repaint(); + }, + cleanup: function () { + this.updateConnectedClass(true); + this.endpoints = null; + this.source = null; + this.target = null; + if (this.connector != null) { + this.connector.cleanup(true); + this.connector.destroy(true); + } + this.connector = null; + }, + updateConnectedClass:function(remove) { + if (this._jsPlumb) { + _updateConnectedClass(this, this.source, this._jsPlumb.instance, remove); + _updateConnectedClass(this, this.target, this._jsPlumb.instance, remove); + } + }, + setHover: function (state) { + if (this.connector && this._jsPlumb && !this._jsPlumb.instance.isConnectionBeingDragged()) { + this.connector.setHover(state); + root.jsPlumb[state ? "addClass" : "removeClass"](this.source, this._jsPlumb.instance.hoverSourceClass); + root.jsPlumb[state ? "addClass" : "removeClass"](this.target, this._jsPlumb.instance.hoverTargetClass); + } + }, + getUuids:function() { + return [ this.endpoints[0].getUuid(), this.endpoints[1].getUuid() ]; + }, + getCost: function () { + return this._jsPlumb ? this._jsPlumb.cost : -Infinity; + }, + setCost: function (c) { + this._jsPlumb.cost = c; + }, + isDirected: function () { + return this._jsPlumb.directed; + }, + getConnector: function () { + return this.connector; + }, + prepareConnector:function(connectorSpec, typeId) { + var connectorArgs = { + _jsPlumb: this._jsPlumb.instance, + cssClass: this._jsPlumb.params.cssClass, + container: this._jsPlumb.params.container, + "pointer-events": this._jsPlumb.params["pointer-events"] + }, + renderMode = this._jsPlumb.instance.getRenderMode(), + connector; + + if (_ju.isString(connectorSpec)) { + connector = makeConnector(this._jsPlumb.instance, renderMode, connectorSpec, connectorArgs, this); + } // lets you use a string as shorthand. + else if (_ju.isArray(connectorSpec)) { + if (connectorSpec.length === 1) { + connector = makeConnector(this._jsPlumb.instance, renderMode, connectorSpec[0], connectorArgs, this); + } + else { + connector = makeConnector(this._jsPlumb.instance, renderMode, connectorSpec[0], _ju.merge(connectorSpec[1], connectorArgs), this); + } + } + if (typeId != null) { + connector.typeId = typeId; + } + return connector; + }, + setPreparedConnector: function(connector, doNotRepaint, doNotChangeListenerComponent, typeId) { + + if (this.connector !== connector) { + + var previous, previousClasses = ""; + // the connector will not be cleaned up if it was set as part of a type, because `typeId` will be set on it + // and we havent passed in `true` for "force" here. + if (this.connector != null) { + previous = this.connector; + previousClasses = previous.getClass(); + this.connector.cleanup(); + this.connector.destroy(); + } + + this.connector = connector; + if (typeId) { + this.cacheTypeItem("connector", connector, typeId); + } + + this.canvas = this.connector.canvas; + this.bgCanvas = this.connector.bgCanvas; + + this.connector.reattach(this._jsPlumb.instance); + + // put classes from prior connector onto the canvas + this.addClass(previousClasses); + + // new: instead of binding listeners per connector, we now just have one delegate on the container. + // so for that handler we set the connection as the '_jsPlumb' member of the canvas element, and + // bgCanvas, if it exists, which it does right now in the VML renderer, so it won't from v 2.0.0 onwards. + if (this.canvas) { + this.canvas._jsPlumb = this; + } + if (this.bgCanvas) { + this.bgCanvas._jsPlumb = this; + } + + if (previous != null) { + var o = this.getOverlays(); + for (var i = 0; i < o.length; i++) { + if (o[i].transfer) { + o[i].transfer(this.connector); + } + } + } + + if (!doNotChangeListenerComponent) { + this.setListenerComponent(this.connector); + } + if (!doNotRepaint) { + this.repaint(); + } + } + }, + setConnector: function (connectorSpec, doNotRepaint, doNotChangeListenerComponent, typeId) { + var connector = this.prepareConnector(connectorSpec, typeId); + this.setPreparedConnector(connector, doNotRepaint, doNotChangeListenerComponent, typeId); + }, + paint: function (params) { + + if (!this._jsPlumb.instance.isSuspendDrawing() && this._jsPlumb.visible) { + params = params || {}; + var timestamp = params.timestamp, + // if the moving object is not the source we must transpose the two references. + swap = false, + tId = swap ? this.sourceId : this.targetId, sId = swap ? this.targetId : this.sourceId, + tIdx = swap ? 0 : 1, sIdx = swap ? 1 : 0; + + if (timestamp == null || timestamp !== this._jsPlumb.lastPaintedAt) { + var sourceInfo = this._jsPlumb.instance.updateOffset({elId:sId}).o, + targetInfo = this._jsPlumb.instance.updateOffset({elId:tId}).o, + sE = this.endpoints[sIdx], tE = this.endpoints[tIdx]; + + var sAnchorP = sE.anchor.getCurrentLocation({xy: [sourceInfo.left, sourceInfo.top], wh: [sourceInfo.width, sourceInfo.height], element: sE, timestamp: timestamp}), + tAnchorP = tE.anchor.getCurrentLocation({xy: [targetInfo.left, targetInfo.top], wh: [targetInfo.width, targetInfo.height], element: tE, timestamp: timestamp}); + + this.connector.resetBounds(); + + this.connector.compute({ + sourcePos: sAnchorP, + targetPos: tAnchorP, + sourceOrientation:sE.anchor.getOrientation(sE), + targetOrientation:tE.anchor.getOrientation(tE), + sourceEndpoint: this.endpoints[sIdx], + targetEndpoint: this.endpoints[tIdx], + "stroke-width": this._jsPlumb.paintStyleInUse.strokeWidth, + sourceInfo: sourceInfo, + targetInfo: targetInfo + }); + + var overlayExtents = { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity }; + + // compute overlays. we do this first so we can get their placements, and adjust the + // container if needs be (if an overlay would be clipped) + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays.hasOwnProperty(i)) { + var o = this._jsPlumb.overlays[i]; + if (o.isVisible()) { + this._jsPlumb.overlayPlacements[i] = o.draw(this.connector, this._jsPlumb.paintStyleInUse, this.getAbsoluteOverlayPosition(o)); + overlayExtents.minX = Math.min(overlayExtents.minX, this._jsPlumb.overlayPlacements[i].minX); + overlayExtents.maxX = Math.max(overlayExtents.maxX, this._jsPlumb.overlayPlacements[i].maxX); + overlayExtents.minY = Math.min(overlayExtents.minY, this._jsPlumb.overlayPlacements[i].minY); + overlayExtents.maxY = Math.max(overlayExtents.maxY, this._jsPlumb.overlayPlacements[i].maxY); + } + } + } + + var lineWidth = parseFloat(this._jsPlumb.paintStyleInUse.strokeWidth || 1) / 2, + outlineWidth = parseFloat(this._jsPlumb.paintStyleInUse.strokeWidth || 0), + extents = { + xmin: Math.min(this.connector.bounds.minX - (lineWidth + outlineWidth), overlayExtents.minX), + ymin: Math.min(this.connector.bounds.minY - (lineWidth + outlineWidth), overlayExtents.minY), + xmax: Math.max(this.connector.bounds.maxX + (lineWidth + outlineWidth), overlayExtents.maxX), + ymax: Math.max(this.connector.bounds.maxY + (lineWidth + outlineWidth), overlayExtents.maxY) + }; + // paint the connector. + this.connector.paintExtents = extents; + this.connector.paint(this._jsPlumb.paintStyleInUse, null, extents); + // and then the overlays + for (var j in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays.hasOwnProperty(j)) { + var p = this._jsPlumb.overlays[j]; + if (p.isVisible()) { + p.paint(this._jsPlumb.overlayPlacements[j], extents); + } + } + } + } + this._jsPlumb.lastPaintedAt = timestamp; + } + }, + repaint: function (params) { + var p = jsPlumb.extend(params || {}, {}); + p.elId = this.sourceId; + this.paint(p); + }, + prepareEndpoint: function (_jsPlumb, _newEndpoint, conn, existing, index, params, element, elementId, definition) { + var e; + if (existing) { + conn.endpoints[index] = existing; + existing.addConnection(conn); + } else { + if (!params.endpoints) { + params.endpoints = [ null, null ]; + } + var ep = definition || params.endpoints[index] || params.endpoint || _jsPlumb.Defaults.Endpoints[index] || _jp.Defaults.Endpoints[index] || _jsPlumb.Defaults.Endpoint || _jp.Defaults.Endpoint; + if (!params.endpointStyles) { + params.endpointStyles = [ null, null ]; + } + if (!params.endpointHoverStyles) { + params.endpointHoverStyles = [ null, null ]; + } + var es = params.endpointStyles[index] || params.endpointStyle || _jsPlumb.Defaults.EndpointStyles[index] || _jp.Defaults.EndpointStyles[index] || _jsPlumb.Defaults.EndpointStyle || _jp.Defaults.EndpointStyle; + // Endpoints derive their fill from the connector's stroke, if no fill was specified. + if (es.fill == null && params.paintStyle != null) { + es.fill = params.paintStyle.stroke; + } + + if (es.outlineStroke == null && params.paintStyle != null) { + es.outlineStroke = params.paintStyle.outlineStroke; + } + if (es.outlineWidth == null && params.paintStyle != null) { + es.outlineWidth = params.paintStyle.outlineWidth; + } + + var ehs = params.endpointHoverStyles[index] || params.endpointHoverStyle || _jsPlumb.Defaults.EndpointHoverStyles[index] || _jp.Defaults.EndpointHoverStyles[index] || _jsPlumb.Defaults.EndpointHoverStyle || _jp.Defaults.EndpointHoverStyle; + // endpoint hover fill style is derived from connector's hover stroke style + if (params.hoverPaintStyle != null) { + if (ehs == null) { + ehs = {}; + } + if (ehs.fill == null) { + ehs.fill = params.hoverPaintStyle.stroke; + } + } + var a = params.anchors ? params.anchors[index] : + params.anchor ? params.anchor : + _makeAnchor(_jsPlumb.Defaults.Anchors[index], elementId, _jsPlumb) || + _makeAnchor(_jp.Defaults.Anchors[index], elementId, _jsPlumb) || + _makeAnchor(_jsPlumb.Defaults.Anchor, elementId, _jsPlumb) || + _makeAnchor(_jp.Defaults.Anchor, elementId, _jsPlumb), + u = params.uuids ? params.uuids[index] : null; + + e = _newEndpoint({ + paintStyle: es, hoverPaintStyle: ehs, endpoint: ep, connections: [ conn ], + uuid: u, anchor: a, source: element, scope: params.scope, + reattach: params.reattach || _jsPlumb.Defaults.ReattachConnections, + detachable: params.detachable || _jsPlumb.Defaults.ConnectionsDetachable + }); + if (existing == null) { + e.setDeleteOnEmpty(true); + } + conn.endpoints[index] = e; + + if (params.drawEndpoints === false) { + e.setVisible(false, true, true); + } + + } + return e; + }, + replaceEndpoint:function(idx, endpointDef) { + + var current = this.endpoints[idx], + elId = current.elementId, + ebe = this._jsPlumb.instance.getEndpoints(elId), + _idx = ebe.indexOf(current), + _new = this.makeEndpoint(idx === 0, current.element, elId, null, endpointDef); + + this.endpoints[idx] = _new; + + ebe.splice(_idx, 1, _new); + this._jsPlumb.instance.deleteObject({endpoint:current, deleteAttachedObjects:false}); + this._jsPlumb.instance.fire("endpointReplaced", {previous:current, current:_new}); + + this._jsPlumb.instance.anchorManager.updateOtherEndpoint(this.endpoints[0].elementId, this.endpoints[1].elementId, this.endpoints[1].elementId, this); + + } + + }); // END Connection class +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the code for creating and manipulating anchors. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + + var root = this, + _ju = root.jsPlumbUtil, + _jp = root.jsPlumb; + + // + // manages anchors for all elements. + // + _jp.AnchorManager = function (params) { + var _amEndpoints = {}, + continuousAnchorLocations = {}, + continuousAnchorOrientations = {}, + connectionsByElementId = {}, + self = this, + anchorLists = {}, + jsPlumbInstance = params.jsPlumbInstance, + floatingConnections = {}, + // used by placeAnchors function + placeAnchorsOnLine = function (desc, elementDimensions, elementPosition, connections, horizontal, otherMultiplier, reverse) { + var a = [], step = elementDimensions[horizontal ? 0 : 1] / (connections.length + 1); + + for (var i = 0; i < connections.length; i++) { + var val = (i + 1) * step, other = otherMultiplier * elementDimensions[horizontal ? 1 : 0]; + if (reverse) { + val = elementDimensions[horizontal ? 0 : 1] - val; + } + + var dx = (horizontal ? val : other), x = elementPosition[0] + dx, xp = dx / elementDimensions[0], + dy = (horizontal ? other : val), y = elementPosition[1] + dy, yp = dy / elementDimensions[1]; + + a.push([ x, y, xp, yp, connections[i][1], connections[i][2] ]); + } + + return a; + }, + rightAndBottomSort = function(a, b) { + return b[0][0] - a[0][0]; + }, + // used by edgeSortFunctions + leftAndTopSort = function (a, b) { + var p1 = a[0][0] < 0 ? -Math.PI - a[0][0] : Math.PI - a[0][0], + p2 = b[0][0] < 0 ? -Math.PI - b[0][0] : Math.PI - b[0][0]; + + return p1 - p2; + }, + // used by placeAnchors + edgeSortFunctions = { + "top":leftAndTopSort, + "right": rightAndBottomSort, + "bottom": rightAndBottomSort, + "left": leftAndTopSort + }, + // used by placeAnchors + _sortHelper = function (_array, _fn) { + return _array.sort(_fn); + }, + // used by AnchorManager.redraw + placeAnchors = function (elementId, _anchorLists) { + var cd = jsPlumbInstance.getCachedData(elementId), sS = cd.s, sO = cd.o, + placeSomeAnchors = function (desc, elementDimensions, elementPosition, unsortedConnections, isHorizontal, otherMultiplier, orientation) { + if (unsortedConnections.length > 0) { + var sc = _sortHelper(unsortedConnections, edgeSortFunctions[desc]), // puts them in order based on the target element's pos on screen + reverse = desc === "right" || desc === "top", + anchors = placeAnchorsOnLine(desc, elementDimensions, + elementPosition, sc, + isHorizontal, otherMultiplier, reverse); + + // takes a computed anchor position and adjusts it for parent offset and scroll, then stores it. + var _setAnchorLocation = function (endpoint, anchorPos) { + continuousAnchorLocations[endpoint.id] = [ anchorPos[0], anchorPos[1], anchorPos[2], anchorPos[3] ]; + continuousAnchorOrientations[endpoint.id] = orientation; + }; + + for (var i = 0; i < anchors.length; i++) { + var c = anchors[i][4], weAreSource = c.endpoints[0].elementId === elementId, weAreTarget = c.endpoints[1].elementId === elementId; + if (weAreSource) { + _setAnchorLocation(c.endpoints[0], anchors[i]); + } + if (weAreTarget) { + _setAnchorLocation(c.endpoints[1], anchors[i]); + } + } + } + }; + + placeSomeAnchors("bottom", sS, [sO.left, sO.top], _anchorLists.bottom, true, 1, [0, 1]); + placeSomeAnchors("top", sS, [sO.left, sO.top], _anchorLists.top, true, 0, [0, -1]); + placeSomeAnchors("left", sS, [sO.left, sO.top], _anchorLists.left, false, 0, [-1, 0]); + placeSomeAnchors("right", sS, [sO.left, sO.top], _anchorLists.right, false, 1, [1, 0]); + }; + + this.reset = function () { + _amEndpoints = {}; + connectionsByElementId = {}; + anchorLists = {}; + }; + this.addFloatingConnection = function (key, conn) { + floatingConnections[key] = conn; + }; + this.removeFloatingConnection = function (key) { + delete floatingConnections[key]; + }; + this.newConnection = function (conn) { + var sourceId = conn.sourceId, targetId = conn.targetId, + ep = conn.endpoints, + doRegisterTarget = true, + registerConnection = function (otherIndex, otherEndpoint, otherAnchor, elId, c) { + if ((sourceId === targetId) && otherAnchor.isContinuous) { + // remove the target endpoint's canvas. we dont need it. + conn._jsPlumb.instance.removeElement(ep[1].canvas); + doRegisterTarget = false; + } + _ju.addToList(connectionsByElementId, elId, [c, otherEndpoint, otherAnchor.constructor === _jp.DynamicAnchor]); + }; + + registerConnection(0, ep[0], ep[0].anchor, targetId, conn); + if (doRegisterTarget) { + registerConnection(1, ep[1], ep[1].anchor, sourceId, conn); + } + }; + var removeEndpointFromAnchorLists = function (endpoint) { + (function (list, eId) { + if (list) { // transient anchors dont get entries in this list. + var f = function (e) { + return e[4] === eId; + }; + _ju.removeWithFunction(list.top, f); + _ju.removeWithFunction(list.left, f); + _ju.removeWithFunction(list.bottom, f); + _ju.removeWithFunction(list.right, f); + } + })(anchorLists[endpoint.elementId], endpoint.id); + }; + this.connectionDetached = function (connInfo, doNotRedraw) { + var connection = connInfo.connection || connInfo, + sourceId = connInfo.sourceId, + targetId = connInfo.targetId, + ep = connection.endpoints, + removeConnection = function (otherIndex, otherEndpoint, otherAnchor, elId, c) { + _ju.removeWithFunction(connectionsByElementId[elId], function (_c) { + return _c[0].id === c.id; + }); + }; + + removeConnection(1, ep[1], ep[1].anchor, sourceId, connection); + removeConnection(0, ep[0], ep[0].anchor, targetId, connection); + if (connection.floatingId) { + removeConnection(connection.floatingIndex, connection.floatingEndpoint, connection.floatingEndpoint.anchor, connection.floatingId, connection); + removeEndpointFromAnchorLists(connection.floatingEndpoint); + } + + // remove from anchorLists + removeEndpointFromAnchorLists(connection.endpoints[0]); + removeEndpointFromAnchorLists(connection.endpoints[1]); + + if (!doNotRedraw) { + self.redraw(connection.sourceId); + if (connection.targetId !== connection.sourceId) { + self.redraw(connection.targetId); + } + } + }; + this.add = function (endpoint, elementId) { + _ju.addToList(_amEndpoints, elementId, endpoint); + }; + this.changeId = function (oldId, newId) { + connectionsByElementId[newId] = connectionsByElementId[oldId]; + _amEndpoints[newId] = _amEndpoints[oldId]; + delete connectionsByElementId[oldId]; + delete _amEndpoints[oldId]; + }; + this.getConnectionsFor = function (elementId) { + return connectionsByElementId[elementId] || []; + }; + this.getEndpointsFor = function (elementId) { + return _amEndpoints[elementId] || []; + }; + this.deleteEndpoint = function (endpoint) { + _ju.removeWithFunction(_amEndpoints[endpoint.elementId], function (e) { + return e.id === endpoint.id; + }); + removeEndpointFromAnchorLists(endpoint); + }; + this.clearFor = function (elementId) { + delete _amEndpoints[elementId]; + _amEndpoints[elementId] = []; + }; + // updates the given anchor list by either updating an existing anchor's info, or adding it. this function + // also removes the anchor from its previous list, if the edge it is on has changed. + // all connections found along the way (those that are connected to one of the faces this function + // operates on) are added to the connsToPaint list, as are their endpoints. in this way we know to repaint + // them wthout having to calculate anything else about them. + var _updateAnchorList = function (lists, theta, order, conn, aBoolean, otherElId, idx, reverse, edgeId, elId, connsToPaint, endpointsToPaint) { + // first try to find the exact match, but keep track of the first index of a matching element id along the way.s + var exactIdx = -1, + firstMatchingElIdx = -1, + endpoint = conn.endpoints[idx], + endpointId = endpoint.id, + oIdx = [1, 0][idx], + values = [ + [ theta, order ], + conn, + aBoolean, + otherElId, + endpointId + ], + listToAddTo = lists[edgeId], + listToRemoveFrom = endpoint._continuousAnchorEdge ? lists[endpoint._continuousAnchorEdge] : null, + i, + candidate; + + if (listToRemoveFrom) { + var rIdx = _ju.findWithFunction(listToRemoveFrom, function (e) { + return e[4] === endpointId; + }); + if (rIdx !== -1) { + listToRemoveFrom.splice(rIdx, 1); + // get all connections from this list + for (i = 0; i < listToRemoveFrom.length; i++) { + candidate = listToRemoveFrom[i][1]; + _ju.addWithFunction(connsToPaint, candidate, function (c) { + return c.id === candidate.id; + }); + _ju.addWithFunction(endpointsToPaint, listToRemoveFrom[i][1].endpoints[idx], function (e) { + return e.id === candidate.endpoints[idx].id; + }); + _ju.addWithFunction(endpointsToPaint, listToRemoveFrom[i][1].endpoints[oIdx], function (e) { + return e.id === candidate.endpoints[oIdx].id; + }); + } + } + } + + for (i = 0; i < listToAddTo.length; i++) { + candidate = listToAddTo[i][1]; + if (params.idx === 1 && listToAddTo[i][3] === otherElId && firstMatchingElIdx === -1) { + firstMatchingElIdx = i; + } + _ju.addWithFunction(connsToPaint, candidate, function (c) { + return c.id === candidate.id; + }); + _ju.addWithFunction(endpointsToPaint, listToAddTo[i][1].endpoints[idx], function (e) { + return e.id === candidate.endpoints[idx].id; + }); + _ju.addWithFunction(endpointsToPaint, listToAddTo[i][1].endpoints[oIdx], function (e) { + return e.id === candidate.endpoints[oIdx].id; + }); + } + if (exactIdx !== -1) { + listToAddTo[exactIdx] = values; + } + else { + var insertIdx = reverse ? firstMatchingElIdx !== -1 ? firstMatchingElIdx : 0 : listToAddTo.length; // of course we will get this from having looked through the array shortly. + listToAddTo.splice(insertIdx, 0, values); + } + + // store this for next time. + endpoint._continuousAnchorEdge = edgeId; + }; + + // + // find the entry in an endpoint's list for this connection and update its target endpoint + // with the current target in the connection. + // This method and sourceChanged need to be folder into one. + // + this.updateOtherEndpoint = function (sourceElId, oldTargetId, newTargetId, connection) { + var sIndex = _ju.findWithFunction(connectionsByElementId[sourceElId], function (i) { + return i[0].id === connection.id; + }), + tIndex = _ju.findWithFunction(connectionsByElementId[oldTargetId], function (i) { + return i[0].id === connection.id; + }); + + // update or add data for source + if (sIndex !== -1) { + connectionsByElementId[sourceElId][sIndex][0] = connection; + connectionsByElementId[sourceElId][sIndex][1] = connection.endpoints[1]; + connectionsByElementId[sourceElId][sIndex][2] = connection.endpoints[1].anchor.constructor === _jp.DynamicAnchor; + } + + // remove entry for previous target (if there) + if (tIndex > -1) { + connectionsByElementId[oldTargetId].splice(tIndex, 1); + // add entry for new target + _ju.addToList(connectionsByElementId, newTargetId, [connection, connection.endpoints[0], connection.endpoints[0].anchor.constructor === _jp.DynamicAnchor]); + } + + connection.updateConnectedClass(); + }; + + // + // notification that the connection given has changed source from the originalId to the newId. + // This involves: + // 1. removing the connection from the list of connections stored for the originalId + // 2. updating the source information for the target of the connection + // 3. re-registering the connection in connectionsByElementId with the newId + // + this.sourceChanged = function (originalId, newId, connection, newElement) { + if (originalId !== newId) { + + connection.sourceId = newId; + connection.source = newElement; + + // remove the entry that points from the old source to the target + _ju.removeWithFunction(connectionsByElementId[originalId], function (info) { + return info[0].id === connection.id; + }); + // find entry for target and update it + var tIdx = _ju.findWithFunction(connectionsByElementId[connection.targetId], function (i) { + return i[0].id === connection.id; + }); + if (tIdx > -1) { + connectionsByElementId[connection.targetId][tIdx][0] = connection; + connectionsByElementId[connection.targetId][tIdx][1] = connection.endpoints[0]; + connectionsByElementId[connection.targetId][tIdx][2] = connection.endpoints[0].anchor.constructor === _jp.DynamicAnchor; + } + // add entry for new source + _ju.addToList(connectionsByElementId, newId, [connection, connection.endpoints[1], connection.endpoints[1].anchor.constructor === _jp.DynamicAnchor]); + + // TODO SP not final on this yet. when a user drags an existing connection and it turns into a self + // loop, then this code hides the target endpoint (by removing it from the DOM) But I think this should + // occur only if the anchor is Continuous + if (connection.endpoints[1].anchor.isContinuous) { + if (connection.source === connection.target) { + connection._jsPlumb.instance.removeElement(connection.endpoints[1].canvas); + } + else { + if (connection.endpoints[1].canvas.parentNode == null) { + connection._jsPlumb.instance.appendElement(connection.endpoints[1].canvas); + } + } + } + + connection.updateConnectedClass(); + } + }; + + // + // moves the given endpoint from `currentId` to `element`. + // This involves: + // + // 1. changing the key in _amEndpoints under which the endpoint is stored + // 2. changing the source or target values in all of the endpoint's connections + // 3. changing the array in connectionsByElementId in which the endpoint's connections + // are stored (done by either sourceChanged or updateOtherEndpoint) + // + this.rehomeEndpoint = function (ep, currentId, element) { + var eps = _amEndpoints[currentId] || [], + elementId = jsPlumbInstance.getId(element); + + if (elementId !== currentId) { + var idx = eps.indexOf(ep); + if (idx > -1) { + var _ep = eps.splice(idx, 1)[0]; + self.add(_ep, elementId); + } + } + + for (var i = 0; i < ep.connections.length; i++) { + if (ep.connections[i].sourceId === currentId) { + self.sourceChanged(currentId, ep.elementId, ep.connections[i], ep.element); + } + else if (ep.connections[i].targetId === currentId) { + ep.connections[i].targetId = ep.elementId; + ep.connections[i].target = ep.element; + self.updateOtherEndpoint(ep.connections[i].sourceId, currentId, ep.elementId, ep.connections[i]); + } + } + }; + + this.redraw = function (elementId, ui, timestamp, offsetToUI, clearEdits, doNotRecalcEndpoint) { + + if (!jsPlumbInstance.isSuspendDrawing()) { + // get all the endpoints for this element + var ep = _amEndpoints[elementId] || [], + endpointConnections = connectionsByElementId[elementId] || [], + connectionsToPaint = [], + endpointsToPaint = [], + anchorsToUpdate = []; + + timestamp = timestamp || jsPlumbInstance.timestamp(); + // offsetToUI are values that would have been calculated in the dragManager when registering + // an endpoint for an element that had a parent (somewhere in the hierarchy) that had been + // registered as draggable. + offsetToUI = offsetToUI || {left: 0, top: 0}; + if (ui) { + ui = { + left: ui.left + offsetToUI.left, + top: ui.top + offsetToUI.top + }; + } + + // valid for one paint cycle. + var myOffset = jsPlumbInstance.updateOffset({ elId: elementId, offset: ui, recalc: false, timestamp: timestamp }), + orientationCache = {}; + + // actually, first we should compute the orientation of this element to all other elements to which + // this element is connected with a continuous anchor (whether both ends of the connection have + // a continuous anchor or just one) + + for (var i = 0; i < endpointConnections.length; i++) { + var conn = endpointConnections[i][0], + sourceId = conn.sourceId, + targetId = conn.targetId, + sourceContinuous = conn.endpoints[0].anchor.isContinuous, + targetContinuous = conn.endpoints[1].anchor.isContinuous; + + if (sourceContinuous || targetContinuous) { + var oKey = sourceId + "_" + targetId, + o = orientationCache[oKey], + oIdx = conn.sourceId === elementId ? 1 : 0; + + if (sourceContinuous && !anchorLists[sourceId]) { + anchorLists[sourceId] = { top: [], right: [], bottom: [], left: [] }; + } + if (targetContinuous && !anchorLists[targetId]) { + anchorLists[targetId] = { top: [], right: [], bottom: [], left: [] }; + } + + if (elementId !== targetId) { + jsPlumbInstance.updateOffset({ elId: targetId, timestamp: timestamp }); + } + if (elementId !== sourceId) { + jsPlumbInstance.updateOffset({ elId: sourceId, timestamp: timestamp }); + } + + var td = jsPlumbInstance.getCachedData(targetId), + sd = jsPlumbInstance.getCachedData(sourceId); + + if (targetId === sourceId && (sourceContinuous || targetContinuous)) { + // here we may want to improve this by somehow determining the face we'd like + // to put the connector on. ideally, when drawing, the face should be calculated + // by determining which face is closest to the point at which the mouse button + // was released. for now, we're putting it on the top face. + _updateAnchorList( anchorLists[sourceId], -Math.PI / 2, 0, conn, false, targetId, 0, false, "top", sourceId, connectionsToPaint, endpointsToPaint); + _updateAnchorList( anchorLists[targetId], -Math.PI / 2, 0, conn, false, sourceId, 1, false, "top", targetId, connectionsToPaint, endpointsToPaint); + } + else { + if (!o) { + o = this.calculateOrientation(sourceId, targetId, sd.o, td.o, conn.endpoints[0].anchor, conn.endpoints[1].anchor, conn); + orientationCache[oKey] = o; + // this would be a performance enhancement, but the computed angles need to be clamped to + //the (-PI/2 -> PI/2) range in order for the sorting to work properly. + /* orientationCache[oKey2] = { + orientation:o.orientation, + a:[o.a[1], o.a[0]], + theta:o.theta + Math.PI, + theta2:o.theta2 + Math.PI + };*/ + } + if (sourceContinuous) { + _updateAnchorList(anchorLists[sourceId], o.theta, 0, conn, false, targetId, 0, false, o.a[0], sourceId, connectionsToPaint, endpointsToPaint); + } + if (targetContinuous) { + _updateAnchorList(anchorLists[targetId], o.theta2, -1, conn, true, sourceId, 1, true, o.a[1], targetId, connectionsToPaint, endpointsToPaint); + } + } + + if (sourceContinuous) { + _ju.addWithFunction(anchorsToUpdate, sourceId, function (a) { + return a === sourceId; + }); + } + if (targetContinuous) { + _ju.addWithFunction(anchorsToUpdate, targetId, function (a) { + return a === targetId; + }); + } + _ju.addWithFunction(connectionsToPaint, conn, function (c) { + return c.id === conn.id; + }); + if ((sourceContinuous && oIdx === 0) || (targetContinuous && oIdx === 1)) { + _ju.addWithFunction(endpointsToPaint, conn.endpoints[oIdx], function (e) { + return e.id === conn.endpoints[oIdx].id; + }); + } + } + } + + // place Endpoints whose anchors are continuous but have no Connections + for (i = 0; i < ep.length; i++) { + if (ep[i].connections.length === 0 && ep[i].anchor.isContinuous) { + if (!anchorLists[elementId]) { + anchorLists[elementId] = { top: [], right: [], bottom: [], left: [] }; + } + _updateAnchorList(anchorLists[elementId], -Math.PI / 2, 0, {endpoints: [ep[i], ep[i]], paint: function () { + }}, false, elementId, 0, false, ep[i].anchor.getDefaultFace(), elementId, connectionsToPaint, endpointsToPaint); + _ju.addWithFunction(anchorsToUpdate, elementId, function (a) { + return a === elementId; + }); + } + } + + // now place all the continuous anchors we need to; + for (i = 0; i < anchorsToUpdate.length; i++) { + placeAnchors(anchorsToUpdate[i], anchorLists[anchorsToUpdate[i]]); + } + + // now that continuous anchors have been placed, paint all the endpoints for this element + for (i = 0; i < ep.length; i++) { + ep[i].paint({ timestamp: timestamp, offset: myOffset, dimensions: myOffset.s, recalc: doNotRecalcEndpoint !== true }); + } + + // ... and any other endpoints we came across as a result of the continuous anchors. + for (i = 0; i < endpointsToPaint.length; i++) { + var cd = jsPlumbInstance.getCachedData(endpointsToPaint[i].elementId); + //endpointsToPaint[i].paint({ timestamp: timestamp, offset: cd, dimensions: cd.s }); + endpointsToPaint[i].paint({ timestamp: null, offset: cd, dimensions: cd.s }); + } + + // paint all the standard and "dynamic connections", which are connections whose other anchor is + // static and therefore does need to be recomputed; we make sure that happens only one time. + + // TODO we could have compiled a list of these in the first pass through connections; might save some time. + for (i = 0; i < endpointConnections.length; i++) { + var otherEndpoint = endpointConnections[i][1]; + if (otherEndpoint.anchor.constructor === _jp.DynamicAnchor) { + otherEndpoint.paint({ elementWithPrecedence: elementId, timestamp: timestamp }); + _ju.addWithFunction(connectionsToPaint, endpointConnections[i][0], function (c) { + return c.id === endpointConnections[i][0].id; + }); + // all the connections for the other endpoint now need to be repainted + for (var k = 0; k < otherEndpoint.connections.length; k++) { + if (otherEndpoint.connections[k] !== endpointConnections[i][0]) { + _ju.addWithFunction(connectionsToPaint, otherEndpoint.connections[k], function (c) { + return c.id === otherEndpoint.connections[k].id; + }); + } + } + } else { + _ju.addWithFunction(connectionsToPaint, endpointConnections[i][0], function (c) { + return c.id === endpointConnections[i][0].id; + }); + } + } + + // paint current floating connection for this element, if there is one. + var fc = floatingConnections[elementId]; + if (fc) { + fc.paint({timestamp: timestamp, recalc: false, elId: elementId}); + } + + // paint all the connections + for (i = 0; i < connectionsToPaint.length; i++) { + connectionsToPaint[i].paint({elId: elementId, timestamp: null, recalc: false, clearEdits: clearEdits}); + } + } + }; + + var ContinuousAnchor = function (anchorParams) { + _ju.EventGenerator.apply(this); + this.type = "Continuous"; + this.isDynamic = true; + this.isContinuous = true; + var faces = anchorParams.faces || ["top", "right", "bottom", "left"], + clockwise = !(anchorParams.clockwise === false), + availableFaces = { }, + opposites = { "top": "bottom", "right": "left", "left": "right", "bottom": "top" }, + clockwiseOptions = { "top": "right", "right": "bottom", "left": "top", "bottom": "left" }, + antiClockwiseOptions = { "top": "left", "right": "top", "left": "bottom", "bottom": "right" }, + secondBest = clockwise ? clockwiseOptions : antiClockwiseOptions, + lastChoice = clockwise ? antiClockwiseOptions : clockwiseOptions, + cssClass = anchorParams.cssClass || "", + _currentFace = null, _lockedFace = null, X_AXIS_FACES = ["left", "right"], Y_AXIS_FACES = ["top", "bottom"], + _lockedAxis = null; + + for (var i = 0; i < faces.length; i++) { + availableFaces[faces[i]] = true; + } + + this.getDefaultFace = function () { + return faces.length === 0 ? "top" : faces[0]; + }; + + this.isRelocatable = function() { return true; }; + this.isSnapOnRelocate = function() { return true; }; + + // if the given edge is supported, returns it. otherwise looks for a substitute that _is_ + // supported. if none supported we also return the request edge. + this.verifyEdge = function (edge) { + if (availableFaces[edge]) { + return edge; + } + else if (availableFaces[opposites[edge]]) { + return opposites[edge]; + } + else if (availableFaces[secondBest[edge]]) { + return secondBest[edge]; + } + else if (availableFaces[lastChoice[edge]]) { + return lastChoice[edge]; + } + return edge; // we have to give them something. + }; + + this.isEdgeSupported = function (edge) { + return _lockedAxis == null ? + + (_lockedFace == null ? availableFaces[edge] === true : _lockedFace === edge) + + : _lockedAxis.indexOf(edge) !== -1; + }; + + this.setCurrentFace = function(face, overrideLock) { + _currentFace = face; + // if currently locked, and the user wants to override, do that. + if (overrideLock && _lockedFace != null) { + _lockedFace = _currentFace; + } + }; + + this.getCurrentFace = function() { return _currentFace; }; + this.getSupportedFaces = function() { + var af = []; + for (var k in availableFaces) { + if (availableFaces[k]) { + af.push(k); + } + } + return af; + }; + + this.lock = function() { + _lockedFace = _currentFace; + }; + this.unlock = function() { + _lockedFace = null; + }; + this.isLocked = function() { + return _lockedFace != null; + }; + + this.lockCurrentAxis = function() { + if (_currentFace != null) { + _lockedAxis = (_currentFace === "left" || _currentFace === "right") ? X_AXIS_FACES : Y_AXIS_FACES; + } + }; + + this.unlockCurrentAxis = function() { + _lockedAxis = null; + }; + + this.compute = function (params) { + return continuousAnchorLocations[params.element.id] || [0, 0]; + }; + this.getCurrentLocation = function (params) { + return continuousAnchorLocations[params.element.id] || [0, 0]; + }; + this.getOrientation = function (endpoint) { + return continuousAnchorOrientations[endpoint.id] || [0, 0]; + }; + this.getCssClass = function () { + return cssClass; + }; + }; + + // continuous anchors + jsPlumbInstance.continuousAnchorFactory = { + get: function (params) { + return new ContinuousAnchor(params); + }, + clear: function (elementId) { + delete continuousAnchorLocations[elementId]; + } + }; + }; + + _jp.AnchorManager.prototype.calculateOrientation = function (sourceId, targetId, sd, td, sourceAnchor, targetAnchor) { + + var Orientation = { HORIZONTAL: "horizontal", VERTICAL: "vertical", DIAGONAL: "diagonal", IDENTITY: "identity" }, + axes = ["left", "top", "right", "bottom"]; + + if (sourceId === targetId) { + return { + orientation: Orientation.IDENTITY, + a: ["top", "top"] + }; + } + + var theta = Math.atan2((td.centery - sd.centery), (td.centerx - sd.centerx)), + theta2 = Math.atan2((sd.centery - td.centery), (sd.centerx - td.centerx)); + +// -------------------------------------------------------------------------------------- + + // improved face calculation. get midpoints of each face for source and target, then put in an array with all combinations of + // source/target faces. sort this array by distance between midpoints. the entry at index 0 is our preferred option. we can + // go through the array one by one until we find an entry in which each requested face is supported. + var candidates = [], midpoints = { }; + (function (types, dim) { + for (var i = 0; i < types.length; i++) { + midpoints[types[i]] = { + "left": [ dim[i].left, dim[i].centery ], + "right": [ dim[i].right, dim[i].centery ], + "top": [ dim[i].centerx, dim[i].top ], + "bottom": [ dim[i].centerx , dim[i].bottom] + }; + } + })([ "source", "target" ], [ sd, td ]); + + for (var sf = 0; sf < axes.length; sf++) { + for (var tf = 0; tf < axes.length; tf++) { + candidates.push({ + source: axes[sf], + target: axes[tf], + dist: Biltong.lineLength(midpoints.source[axes[sf]], midpoints.target[axes[tf]]) + }); + } + } + + candidates.sort(function (a, b) { + return a.dist < b.dist ? -1 : a.dist > b.dist ? 1 : 0; + }); + + // now go through this list and try to get an entry that satisfies both (there will be one, unless one of the anchors + // declares no available faces) + var sourceEdge = candidates[0].source, targetEdge = candidates[0].target; + for (var i = 0; i < candidates.length; i++) { + + if (!sourceAnchor.isContinuous || sourceAnchor.isEdgeSupported(candidates[i].source)) { + sourceEdge = candidates[i].source; + } + else { + sourceEdge = null; + } + + if (!targetAnchor.isContinuous || targetAnchor.isEdgeSupported(candidates[i].target)) { + targetEdge = candidates[i].target; + } + else { + targetEdge = null; + } + + if (sourceEdge != null && targetEdge != null) { + break; + } + } + + if (sourceAnchor.isContinuous) { + sourceAnchor.setCurrentFace(sourceEdge); + } + + if (targetAnchor.isContinuous) { + targetAnchor.setCurrentFace(targetEdge); + } + +// -------------------------------------------------------------------------------------- + + return { + a: [ sourceEdge, targetEdge ], + theta: theta, + theta2: theta2 + }; + }; + + /** + * Anchors model a position on some element at which an Endpoint may be located. They began as a first class citizen of jsPlumb, ie. a user + * was required to create these themselves, but over time this has been replaced by the concept of referring to them either by name (eg. "TopMiddle"), + * or by an array describing their coordinates (eg. [ 0, 0.5, 0, -1 ], which is the same as "TopMiddle"). jsPlumb now handles all of the + * creation of Anchors without user intervention. + */ + _jp.Anchor = function (params) { + this.x = params.x || 0; + this.y = params.y || 0; + this.elementId = params.elementId; + this.cssClass = params.cssClass || ""; + this.userDefinedLocation = null; + this.orientation = params.orientation || [ 0, 0 ]; + this.lastReturnValue = null; + this.offsets = params.offsets || [ 0, 0 ]; + this.timestamp = null; + + var relocatable = params.relocatable !== false; + this.isRelocatable = function() { return relocatable; }; + this.setRelocatable = function(_relocatable) { relocatable = _relocatable; }; + var snapOnRelocate = params.snapOnRelocate !== false; + this.isSnapOnRelocate = function() { return snapOnRelocate; }; + + var locked = false; + this.lock = function() { locked = true; }; + this.unlock = function() { locked = false; }; + this.isLocked = function() { return locked; }; + + _ju.EventGenerator.apply(this); + + this.compute = function (params) { + + var xy = params.xy, wh = params.wh, timestamp = params.timestamp; + + if (params.clearUserDefinedLocation) { + this.userDefinedLocation = null; + } + + if (timestamp && timestamp === this.timestamp) { + return this.lastReturnValue; + } + + if (this.userDefinedLocation != null) { + this.lastReturnValue = this.userDefinedLocation; + } + else { + this.lastReturnValue = [ xy[0] + (this.x * wh[0]) + this.offsets[0], xy[1] + (this.y * wh[1]) + this.offsets[1], this.x, this.y ]; + } + + this.timestamp = timestamp; + return this.lastReturnValue; + }; + + this.getCurrentLocation = function (params) { + params = params || {}; + return (this.lastReturnValue == null || (params.timestamp != null && this.timestamp !== params.timestamp)) ? this.compute(params) : this.lastReturnValue; + }; + + this.setPosition = function(x, y, ox, oy, overrideLock) { + if (!locked || overrideLock) { + this.x = x; + this.y = y; + this.orientation = [ ox, oy ]; + this.lastReturnValue = null; + } + }; + }; + _ju.extend(_jp.Anchor, _ju.EventGenerator, { + equals: function (anchor) { + if (!anchor) { + return false; + } + var ao = anchor.getOrientation(), + o = this.getOrientation(); + return this.x === anchor.x && this.y === anchor.y && this.offsets[0] === anchor.offsets[0] && this.offsets[1] === anchor.offsets[1] && o[0] === ao[0] && o[1] === ao[1]; + }, + getUserDefinedLocation: function () { + return this.userDefinedLocation; + }, + setUserDefinedLocation: function (l) { + this.userDefinedLocation = l; + }, + clearUserDefinedLocation: function () { + this.userDefinedLocation = null; + }, + getOrientation: function () { + return this.orientation; + }, + getCssClass: function () { + return this.cssClass; + } + }); + + /** + * An Anchor that floats. its orientation is computed dynamically from + * its position relative to the anchor it is floating relative to. It is used when creating + * a connection through drag and drop. + * + * TODO FloatingAnchor could totally be refactored to extend Anchor just slightly. + */ + _jp.FloatingAnchor = function (params) { + + _jp.Anchor.apply(this, arguments); + + // this is the anchor that this floating anchor is referenced to for + // purposes of calculating the orientation. + var ref = params.reference, + // the canvas this refers to. + refCanvas = params.referenceCanvas, + size = _jp.getSize(refCanvas), + // these are used to store the current relative position of our + // anchor wrt the reference anchor. they only indicate + // direction, so have a value of 1 or -1 (or, very rarely, 0). these + // values are written by the compute method, and read + // by the getOrientation method. + xDir = 0, yDir = 0, + // temporary member used to store an orientation when the floating + // anchor is hovering over another anchor. + orientation = null, + _lastResult = null; + + // clear from parent. we want floating anchor orientation to always be computed. + this.orientation = null; + + // set these to 0 each; they are used by certain types of connectors in the loopback case, + // when the connector is trying to clear the element it is on. but for floating anchor it's not + // very important. + this.x = 0; + this.y = 0; + + this.isFloating = true; + + this.compute = function (params) { + var xy = params.xy, + result = [ xy[0] + (size[0] / 2), xy[1] + (size[1] / 2) ]; // return origin of the element. we may wish to improve this so that any object can be the drag proxy. + _lastResult = result; + return result; + }; + + this.getOrientation = function (_endpoint) { + if (orientation) { + return orientation; + } + else { + var o = ref.getOrientation(_endpoint); + // here we take into account the orientation of the other + // anchor: if it declares zero for some direction, we declare zero too. this might not be the most awesome. perhaps we can come + // up with a better way. it's just so that the line we draw looks like it makes sense. maybe this wont make sense. + return [ Math.abs(o[0]) * xDir * -1, + Math.abs(o[1]) * yDir * -1 ]; + } + }; + + /** + * notification the endpoint associated with this anchor is hovering + * over another anchor; we want to assume that anchor's orientation + * for the duration of the hover. + */ + this.over = function (anchor, endpoint) { + orientation = anchor.getOrientation(endpoint); + }; + + /** + * notification the endpoint associated with this anchor is no + * longer hovering over another anchor; we should resume calculating + * orientation as we normally do. + */ + this.out = function () { + orientation = null; + }; + + this.getCurrentLocation = function (params) { + return _lastResult == null ? this.compute(params) : _lastResult; + }; + }; + _ju.extend(_jp.FloatingAnchor, _jp.Anchor); + + var _convertAnchor = function (anchor, jsPlumbInstance, elementId) { + return anchor.constructor === _jp.Anchor ? anchor : jsPlumbInstance.makeAnchor(anchor, elementId, jsPlumbInstance); + }; + + /* + * A DynamicAnchor is an Anchor that contains a list of other Anchors, which it cycles + * through at compute time to find the one that is located closest to + * the center of the target element, and returns that Anchor's compute + * method result. this causes endpoints to follow each other with + * respect to the orientation of their target elements, which is a useful + * feature for some applications. + * + */ + _jp.DynamicAnchor = function (params) { + _jp.Anchor.apply(this, arguments); + + this.isDynamic = true; + this.anchors = []; + this.elementId = params.elementId; + this.jsPlumbInstance = params.jsPlumbInstance; + + for (var i = 0; i < params.anchors.length; i++) { + this.anchors[i] = _convertAnchor(params.anchors[i], this.jsPlumbInstance, this.elementId); + } + + this.getAnchors = function () { + return this.anchors; + }; + + var _curAnchor = this.anchors.length > 0 ? this.anchors[0] : null, + _lastAnchor = _curAnchor, + self = this, + + // helper method to calculate the distance between the centers of the two elements. + _distance = function (anchor, cx, cy, xy, wh) { + var ax = xy[0] + (anchor.x * wh[0]), ay = xy[1] + (anchor.y * wh[1]), + acx = xy[0] + (wh[0] / 2), acy = xy[1] + (wh[1] / 2); + return (Math.sqrt(Math.pow(cx - ax, 2) + Math.pow(cy - ay, 2)) + + Math.sqrt(Math.pow(acx - ax, 2) + Math.pow(acy - ay, 2))); + }, + // default method uses distance between element centers. you can provide your own method in the dynamic anchor + // constructor (and also to jsPlumb.makeDynamicAnchor). the arguments to it are four arrays: + // xy - xy loc of the anchor's element + // wh - anchor's element's dimensions + // txy - xy loc of the element of the other anchor in the connection + // twh - dimensions of the element of the other anchor in the connection. + // anchors - the list of selectable anchors + _anchorSelector = params.selector || function (xy, wh, txy, twh, anchors) { + var cx = txy[0] + (twh[0] / 2), cy = txy[1] + (twh[1] / 2); + var minIdx = -1, minDist = Infinity; + for (var i = 0; i < anchors.length; i++) { + var d = _distance(anchors[i], cx, cy, xy, wh); + if (d < minDist) { + minIdx = i + 0; + minDist = d; + } + } + return anchors[minIdx]; + }; + + this.compute = function (params) { + var xy = params.xy, wh = params.wh, txy = params.txy, twh = params.twh; + + this.timestamp = params.timestamp; + + var udl = self.getUserDefinedLocation(); + if (udl != null) { + return udl; + } + + // if anchor is locked or an opposite element was not given, we + // maintain our state. anchor will be locked + // if it is the source of a drag and drop. + if (this.isLocked() || txy == null || twh == null) { + return _curAnchor.compute(params); + } + else { + params.timestamp = null; // otherwise clear this, i think. we want the anchor to compute. + } + + _curAnchor = _anchorSelector(xy, wh, txy, twh, this.anchors); + this.x = _curAnchor.x; + this.y = _curAnchor.y; + + if (_curAnchor !== _lastAnchor) { + this.fire("anchorChanged", _curAnchor); + } + + _lastAnchor = _curAnchor; + + return _curAnchor.compute(params); + }; + + this.getCurrentLocation = function (params) { + return this.getUserDefinedLocation() || (_curAnchor != null ? _curAnchor.getCurrentLocation(params) : null); + }; + + this.getOrientation = function (_endpoint) { + return _curAnchor != null ? _curAnchor.getOrientation(_endpoint) : [ 0, 0 ]; + }; + this.over = function (anchor, endpoint) { + if (_curAnchor != null) { + _curAnchor.over(anchor, endpoint); + } + }; + this.out = function () { + if (_curAnchor != null) { + _curAnchor.out(); + } + }; + + this.setAnchor = function(a) { + _curAnchor = a; + }; + + this.getCssClass = function () { + return (_curAnchor && _curAnchor.getCssClass()) || ""; + }; + + /** + * Attempt to match an anchor with the given coordinates and then set it. + * @param coords + * @returns true if matching anchor found, false otherwise. + */ + this.setAnchorCoordinates = function(coords) { + var idx = jsPlumbUtil.findWithFunction(this.anchors, function(a) { + return a.x === coords[0] && a.y === coords[1]; + }); + if (idx !== -1) { + this.setAnchor(this.anchors[idx]); + return true; + } else { + return false; + } + }; + }; + _ju.extend(_jp.DynamicAnchor, _jp.Anchor); + +// -------- basic anchors ------------------ + var _curryAnchor = function (x, y, ox, oy, type, fnInit) { + _jp.Anchors[type] = function (params) { + var a = params.jsPlumbInstance.makeAnchor([ x, y, ox, oy, 0, 0 ], params.elementId, params.jsPlumbInstance); + a.type = type; + if (fnInit) { + fnInit(a, params); + } + return a; + }; + }; + + _curryAnchor(0.5, 0, 0, -1, "TopCenter"); + _curryAnchor(0.5, 1, 0, 1, "BottomCenter"); + _curryAnchor(0, 0.5, -1, 0, "LeftMiddle"); + _curryAnchor(1, 0.5, 1, 0, "RightMiddle"); + + _curryAnchor(0.5, 0, 0, -1, "Top"); + _curryAnchor(0.5, 1, 0, 1, "Bottom"); + _curryAnchor(0, 0.5, -1, 0, "Left"); + _curryAnchor(1, 0.5, 1, 0, "Right"); + _curryAnchor(0.5, 0.5, 0, 0, "Center"); + _curryAnchor(1, 0, 0, -1, "TopRight"); + _curryAnchor(1, 1, 0, 1, "BottomRight"); + _curryAnchor(0, 0, 0, -1, "TopLeft"); + _curryAnchor(0, 1, 0, 1, "BottomLeft"); + +// ------- dynamic anchors ------------------- + + // default dynamic anchors chooses from Top, Right, Bottom, Left + _jp.Defaults.DynamicAnchors = function (params) { + return params.jsPlumbInstance.makeAnchors(["TopCenter", "RightMiddle", "BottomCenter", "LeftMiddle"], params.elementId, params.jsPlumbInstance); + }; + + // default dynamic anchors bound to name 'AutoDefault' + _jp.Anchors.AutoDefault = function (params) { + var a = params.jsPlumbInstance.makeDynamicAnchor(_jp.Defaults.DynamicAnchors(params)); + a.type = "AutoDefault"; + return a; + }; + +// ------- continuous anchors ------------------- + + var _curryContinuousAnchor = function (type, faces) { + _jp.Anchors[type] = function (params) { + var a = params.jsPlumbInstance.makeAnchor(["Continuous", { faces: faces }], params.elementId, params.jsPlumbInstance); + a.type = type; + return a; + }; + }; + + _jp.Anchors.Continuous = function (params) { + return params.jsPlumbInstance.continuousAnchorFactory.get(params); + }; + + _curryContinuousAnchor("ContinuousLeft", ["left"]); + _curryContinuousAnchor("ContinuousTop", ["top"]); + _curryContinuousAnchor("ContinuousBottom", ["bottom"]); + _curryContinuousAnchor("ContinuousRight", ["right"]); + +// ------- position assign anchors ------------------- + + // this anchor type lets you assign the position at connection time. + _curryAnchor(0, 0, 0, 0, "Assign", function (anchor, params) { + // find what to use as the "position finder". the user may have supplied a String which represents + // the id of a position finder in jsPlumb.AnchorPositionFinders, or the user may have supplied the + // position finder as a function. we find out what to use and then set it on the anchor. + var pf = params.position || "Fixed"; + anchor.positionFinder = pf.constructor === String ? params.jsPlumbInstance.AnchorPositionFinders[pf] : pf; + // always set the constructor params; the position finder might need them later (the Grid one does, + // for example) + anchor.constructorParams = params; + }); + + // these are the default anchor positions finders, which are used by the makeTarget function. supplying + // a position finder argument to that function allows you to specify where the resulting anchor will + // be located + root.jsPlumbInstance.prototype.AnchorPositionFinders = { + "Fixed": function (dp, ep, es) { + return [ (dp.left - ep.left) / es[0], (dp.top - ep.top) / es[1] ]; + }, + "Grid": function (dp, ep, es, params) { + var dx = dp.left - ep.left, dy = dp.top - ep.top, + gx = es[0] / (params.grid[0]), gy = es[1] / (params.grid[1]), + mx = Math.floor(dx / gx), my = Math.floor(dy / gy); + return [ ((mx * gx) + (gx / 2)) / es[0], ((my * gy) + (gy / 2)) / es[1] ]; + } + }; + +// ------- perimeter anchors ------------------- + + _jp.Anchors.Perimeter = function (params) { + params = params || {}; + var anchorCount = params.anchorCount || 60, + shape = params.shape; + + if (!shape) { + throw new Error("no shape supplied to Perimeter Anchor type"); + } + + var _circle = function () { + var r = 0.5, step = Math.PI * 2 / anchorCount, current = 0, a = []; + for (var i = 0; i < anchorCount; i++) { + var x = r + (r * Math.sin(current)), + y = r + (r * Math.cos(current)); + a.push([ x, y, 0, 0 ]); + current += step; + } + return a; + }, + _path = function (segments) { + var anchorsPerFace = anchorCount / segments.length, a = [], + _computeFace = function (x1, y1, x2, y2, fractionalLength, ox, oy) { + anchorsPerFace = anchorCount * fractionalLength; + var dx = (x2 - x1) / anchorsPerFace, dy = (y2 - y1) / anchorsPerFace; + for (var i = 0; i < anchorsPerFace; i++) { + a.push([ + x1 + (dx * i), + y1 + (dy * i), + ox == null ? 0 : ox, + oy == null ? 0 : oy + ]); + } + }; + + for (var i = 0; i < segments.length; i++) { + _computeFace.apply(null, segments[i]); + } + + return a; + }, + _shape = function (faces) { + var s = []; + for (var i = 0; i < faces.length; i++) { + s.push([faces[i][0], faces[i][1], faces[i][2], faces[i][3], 1 / faces.length, faces[i][4], faces[i][5]]); + } + return _path(s); + }, + _rectangle = function () { + return _shape([ + [ 0, 0, 1, 0, 0, -1 ], + [ 1, 0, 1, 1, 1, 0 ], + [ 1, 1, 0, 1, 0, 1 ], + [ 0, 1, 0, 0, -1, 0 ] + ]); + }; + + var _shapes = { + "Circle": _circle, + "Ellipse": _circle, + "Diamond": function () { + return _shape([ + [ 0.5, 0, 1, 0.5 ], + [ 1, 0.5, 0.5, 1 ], + [ 0.5, 1, 0, 0.5 ], + [ 0, 0.5, 0.5, 0 ] + ]); + }, + "Rectangle": _rectangle, + "Square": _rectangle, + "Triangle": function () { + return _shape([ + [ 0.5, 0, 1, 1 ], + [ 1, 1, 0, 1 ], + [ 0, 1, 0.5, 0] + ]); + }, + "Path": function (params) { + var points = params.points, p = [], tl = 0; + for (var i = 0; i < points.length - 1; i++) { + var l = Math.sqrt(Math.pow(points[i][2] - points[i][0]) + Math.pow(points[i][3] - points[i][1])); + tl += l; + p.push([points[i][0], points[i][1], points[i + 1][0], points[i + 1][1], l]); + } + for (var j = 0; j < p.length; j++) { + p[j][4] = p[j][4] / tl; + } + return _path(p); + } + }, + _rotate = function (points, amountInDegrees) { + var o = [], theta = amountInDegrees / 180 * Math.PI; + for (var i = 0; i < points.length; i++) { + var _x = points[i][0] - 0.5, + _y = points[i][1] - 0.5; + + o.push([ + 0.5 + ((_x * Math.cos(theta)) - (_y * Math.sin(theta))), + 0.5 + ((_x * Math.sin(theta)) + (_y * Math.cos(theta))), + points[i][2], + points[i][3] + ]); + } + return o; + }; + + if (!_shapes[shape]) { + throw new Error("Shape [" + shape + "] is unknown by Perimeter Anchor type"); + } + + var da = _shapes[shape](params); + if (params.rotation) { + da = _rotate(da, params.rotation); + } + var a = params.jsPlumbInstance.makeDynamicAnchor(da); + a.type = "Perimeter"; + return a; + }; +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains the default Connectors, Endpoint and Overlay definitions. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil, _jg = root.Biltong; + + _jp.Segments = { + + /* + * Class: AbstractSegment + * A Connector is made up of 1..N Segments, each of which has a Type, such as 'Straight', 'Arc', + * 'Bezier'. This is new from 1.4.2, and gives us a lot more flexibility when drawing connections: things such + * as rounded corners for flowchart connectors, for example, or a straight line stub for Bezier connections, are + * much easier to do now. + * + * A Segment is responsible for providing coordinates for painting it, and also must be able to report its length. + * + */ + AbstractSegment: function (params) { + this.params = params; + + /** + * Function: findClosestPointOnPath + * Finds the closest point on this segment to the given [x, y], + * returning both the x and y of the point plus its distance from + * the supplied point, and its location along the length of the + * path inscribed by the segment. This implementation returns + * Infinity for distance and null values for everything else; + * subclasses are expected to override. + */ + this.findClosestPointOnPath = function (x, y) { + return { + d: Infinity, + x: null, + y: null, + l: null + }; + }; + + this.getBounds = function () { + return { + minX: Math.min(params.x1, params.x2), + minY: Math.min(params.y1, params.y2), + maxX: Math.max(params.x1, params.x2), + maxY: Math.max(params.y1, params.y2) + }; + }; + + /** + * Computes the list of points on the segment that intersect the given line. + * @method lineIntersection + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @returns {Array<[number, number]>} + */ + this.lineIntersection = function(x1, y1, x2, y2) { + return []; + }; + + /** + * Computes the list of points on the segment that intersect the box with the given origin and size. + * @method boxIntersection + * @param {number} x1 + * @param {number} y1 + * @param {number} w + * @param {number} h + * @returns {Array<[number, number]>} + */ + this.boxIntersection = function(x, y, w, h) { + var a = []; + a.push.apply(a, this.lineIntersection(x, y, x + w, y)); + a.push.apply(a, this.lineIntersection(x + w, y, x + w, y + h)); + a.push.apply(a, this.lineIntersection(x + w, y + h, x, y + h)); + a.push.apply(a, this.lineIntersection(x, y + h, x, y)); + return a; + }; + + /** + * Computes the list of points on the segment that intersect the given bounding box, which is an object of the form { x:.., y:.., w:.., h:.. }. + * @method lineIntersection + * @param {BoundingRectangle} box + * @returns {Array<[number, number]>} + */ + this.boundingBoxIntersection = function(box) { + return this.boxIntersection(box.x, box.y, box.w, box.y); + }; + }, + Straight: function (params) { + var _super = _jp.Segments.AbstractSegment.apply(this, arguments), + length, m, m2, x1, x2, y1, y2, + _recalc = function () { + length = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); + m = _jg.gradient({x: x1, y: y1}, {x: x2, y: y2}); + m2 = -1 / m; + }; + + this.type = "Straight"; + + this.getLength = function () { + return length; + }; + this.getGradient = function () { + return m; + }; + + this.getCoordinates = function () { + return { x1: x1, y1: y1, x2: x2, y2: y2 }; + }; + this.setCoordinates = function (coords) { + x1 = coords.x1; + y1 = coords.y1; + x2 = coords.x2; + y2 = coords.y2; + _recalc(); + }; + this.setCoordinates({x1: params.x1, y1: params.y1, x2: params.x2, y2: params.y2}); + + this.getBounds = function () { + return { + minX: Math.min(x1, x2), + minY: Math.min(y1, y2), + maxX: Math.max(x1, x2), + maxY: Math.max(y1, y2) + }; + }; + + /** + * returns the point on the segment's path that is 'location' along the length of the path, where 'location' is a decimal from + * 0 to 1 inclusive. for the straight line segment this is simple maths. + */ + this.pointOnPath = function (location, absolute) { + if (location === 0 && !absolute) { + return { x: x1, y: y1 }; + } + else if (location === 1 && !absolute) { + return { x: x2, y: y2 }; + } + else { + var l = absolute ? location > 0 ? location : length + location : location * length; + return _jg.pointOnLine({x: x1, y: y1}, {x: x2, y: y2}, l); + } + }; + + /** + * returns the gradient of the segment at the given point - which for us is constant. + */ + this.gradientAtPoint = function (_) { + return m; + }; + + /** + * returns the point on the segment's path that is 'distance' along the length of the path from 'location', where + * 'location' is a decimal from 0 to 1 inclusive, and 'distance' is a number of pixels. + * this hands off to jsPlumbUtil to do the maths, supplying two points and the distance. + */ + this.pointAlongPathFrom = function (location, distance, absolute) { + var p = this.pointOnPath(location, absolute), + farAwayPoint = distance <= 0 ? {x: x1, y: y1} : {x: x2, y: y2 }; + + /* + location == 1 ? { + x:x1 + ((x2 - x1) * 10), + y:y1 + ((y1 - y2) * 10) + } : + */ + + if (distance <= 0 && Math.abs(distance) > 1) { + distance *= -1; + } + + return _jg.pointOnLine(p, farAwayPoint, distance); + }; + + // is c between a and b? + var within = function (a, b, c) { + return c >= Math.min(a, b) && c <= Math.max(a, b); + }; + // find which of a and b is closest to c + var closest = function (a, b, c) { + return Math.abs(c - a) < Math.abs(c - b) ? a : b; + }; + + /** + Function: findClosestPointOnPath + Finds the closest point on this segment to [x,y]. See + notes on this method in AbstractSegment. + */ + this.findClosestPointOnPath = function (x, y) { + var out = { + d: Infinity, + x: null, + y: null, + l: null, + x1: x1, + x2: x2, + y1: y1, + y2: y2 + }; + + if (m === 0) { + out.y = y1; + out.x = within(x1, x2, x) ? x : closest(x1, x2, x); + } + else if (m === Infinity || m === -Infinity) { + out.x = x1; + out.y = within(y1, y2, y) ? y : closest(y1, y2, y); + } + else { + // closest point lies on normal from given point to this line. + var b = y1 - (m * x1), + b2 = y - (m2 * x), + // y1 = m.x1 + b and y1 = m2.x1 + b2 + // so m.x1 + b = m2.x1 + b2 + // x1(m - m2) = b2 - b + // x1 = (b2 - b) / (m - m2) + _x1 = (b2 - b) / (m - m2), + _y1 = (m * _x1) + b; + + out.x = within(x1, x2, _x1) ? _x1 : closest(x1, x2, _x1);//_x1; + out.y = within(y1, y2, _y1) ? _y1 : closest(y1, y2, _y1);//_y1; + } + + var fractionInSegment = _jg.lineLength([ out.x, out.y ], [ x1, y1 ]); + out.d = _jg.lineLength([x, y], [out.x, out.y]); + out.l = fractionInSegment / length; + return out; + }; + + var _pointLiesBetween = function(q, p1, p2) { + return (p2 > p1) ? (p1 <= q && q <= p2) : (p1 >= q && q >= p2); + }, _plb = _pointLiesBetween; + + /** + * Calculates all intersections of the given line with this segment. + * @param _x1 + * @param _y1 + * @param _x2 + * @param _y2 + * @returns {Array} + */ + this.lineIntersection = function(_x1, _y1, _x2, _y2) { + var m2 = Math.abs(_jg.gradient({x: _x1, y: _y1}, {x: _x2, y: _y2})), + m1 = Math.abs(m), + b = m1 === Infinity ? x1 : y1 - (m1 * x1), + out = [], + b2 = m2 === Infinity ? _x1 : _y1 - (m2 * _x1); + + // if lines parallel, no intersection + if (m2 !== m1) { + // perpendicular, segment horizontal + if(m2 === Infinity && m1 === 0) { + if (_plb(_x1, x1, x2) && _plb(y1, _y1, _y2)) { + out = [ _x1, y1 ]; // we return X on the incident line and Y from the segment + } + } else if(m2 === 0 && m1 === Infinity) { + // perpendicular, segment vertical + if(_plb(_y1, y1, y2) && _plb(x1, _x1, _x2)) { + out = [x1, _y1]; // we return X on the segment and Y from the incident line + } + } else { + var X, Y; + if (m2 === Infinity) { + // test line is a vertical line. where does it cross the segment? + X = _x1; + if (_plb(X, x1, x2)) { + Y = (m1 * _x1) + b; + if (_plb(Y, _y1, _y2)) { + out = [ X, Y ]; + } + } + } else if (m2 === 0) { + Y = _y1; + // test line is a horizontal line. where does it cross the segment? + if (_plb(Y, y1, y2)) { + X = (_y1 - b) / m1; + if (_plb(X, _x1, _x2)) { + out = [ X, Y ]; + } + } + } else { + // mX + b = m2X + b2 + // mX - m2X = b2 - b + // X(m - m2) = b2 - b + // X = (b2 - b) / (m - m2) + // Y = mX + b + X = (b2 - b) / (m1 - m2); + Y = (m1 * X) + b; + if(_plb(X, x1, x2) && _plb(Y, y1, y2)) { + out = [ X, Y]; + } + } + } + } + + return out; + }; + + /** + * Calculates all intersections of the given box with this segment. By default this method simply calls `lineIntersection` with each of the four + * faces of the box; subclasses can override this if they think there's a faster way to compute the entire box at once. + * @param x X position of top left corner of box + * @param y Y position of top left corner of box + * @param w width of box + * @param h height of box + * @returns {Array} + */ + this.boxIntersection = function(x, y, w, h) { + var a = []; + a.push.apply(a, this.lineIntersection(x, y, x + w, y)); + a.push.apply(a, this.lineIntersection(x + w, y, x + w, y + h)); + a.push.apply(a, this.lineIntersection(x + w, y + h, x, y + h)); + a.push.apply(a, this.lineIntersection(x, y + h, x, y)); + return a; + }; + + /** + * Calculates all intersections of the given bounding box with this segment. By default this method simply calls `lineIntersection` with each of the four + * faces of the box; subclasses can override this if they think there's a faster way to compute the entire box at once. + * @param box Bounding box, in { x:.., y:..., w:..., h:... } format. + * @returns {Array} + */ + this.boundingBoxIntersection = function(box) { + return this.boxIntersection(box.x, box.y, box.w, box.h); + }; + }, + + /* + Arc Segment. You need to supply: + + r - radius + cx - center x for the arc + cy - center y for the arc + ac - whether the arc is anticlockwise or not. default is clockwise. + + and then either: + + startAngle - startAngle for the arc. + endAngle - endAngle for the arc. + + or: + + x1 - x for start point + y1 - y for start point + x2 - x for end point + y2 - y for end point + + */ + Arc: function (params) { + var _super = _jp.Segments.AbstractSegment.apply(this, arguments), + _calcAngle = function (_x, _y) { + return _jg.theta([params.cx, params.cy], [_x, _y]); + }, + _calcAngleForLocation = function (segment, location) { + if (segment.anticlockwise) { + var sa = segment.startAngle < segment.endAngle ? segment.startAngle + TWO_PI : segment.startAngle, + s = Math.abs(sa - segment.endAngle); + return sa - (s * location); + } + else { + var ea = segment.endAngle < segment.startAngle ? segment.endAngle + TWO_PI : segment.endAngle, + ss = Math.abs(ea - segment.startAngle); + + return segment.startAngle + (ss * location); + } + }, + TWO_PI = 2 * Math.PI; + + this.radius = params.r; + this.anticlockwise = params.ac; + this.type = "Arc"; + + if (params.startAngle && params.endAngle) { + this.startAngle = params.startAngle; + this.endAngle = params.endAngle; + this.x1 = params.cx + (this.radius * Math.cos(params.startAngle)); + this.y1 = params.cy + (this.radius * Math.sin(params.startAngle)); + this.x2 = params.cx + (this.radius * Math.cos(params.endAngle)); + this.y2 = params.cy + (this.radius * Math.sin(params.endAngle)); + } + else { + this.startAngle = _calcAngle(params.x1, params.y1); + this.endAngle = _calcAngle(params.x2, params.y2); + this.x1 = params.x1; + this.y1 = params.y1; + this.x2 = params.x2; + this.y2 = params.y2; + } + + if (this.endAngle < 0) { + this.endAngle += TWO_PI; + } + if (this.startAngle < 0) { + this.startAngle += TWO_PI; + } + + // segment is used by vml + //this.segment = _jg.quadrant([this.x1, this.y1], [this.x2, this.y2]); + + // we now have startAngle and endAngle as positive numbers, meaning the + // absolute difference (|d|) between them is the sweep (s) of this arc, unless the + // arc is 'anticlockwise' in which case 's' is given by 2PI - |d|. + + var ea = this.endAngle < this.startAngle ? this.endAngle + TWO_PI : this.endAngle; + this.sweep = Math.abs(ea - this.startAngle); + if (this.anticlockwise) { + this.sweep = TWO_PI - this.sweep; + } + var circumference = 2 * Math.PI * this.radius, + frac = this.sweep / TWO_PI, + length = circumference * frac; + + this.getLength = function () { + return length; + }; + + this.getBounds = function () { + return { + minX: params.cx - params.r, + maxX: params.cx + params.r, + minY: params.cy - params.r, + maxY: params.cy + params.r + }; + }; + + var VERY_SMALL_VALUE = 0.0000000001, + gentleRound = function (n) { + var f = Math.floor(n), r = Math.ceil(n); + if (n - f < VERY_SMALL_VALUE) { + return f; + } + else if (r - n < VERY_SMALL_VALUE) { + return r; + } + return n; + }; + + /** + * returns the point on the segment's path that is 'location' along the length of the path, where 'location' is a decimal from + * 0 to 1 inclusive. + */ + this.pointOnPath = function (location, absolute) { + + if (location === 0) { + return { x: this.x1, y: this.y1, theta: this.startAngle }; + } + else if (location === 1) { + return { x: this.x2, y: this.y2, theta: this.endAngle }; + } + + if (absolute) { + location = location / length; + } + + var angle = _calcAngleForLocation(this, location), + _x = params.cx + (params.r * Math.cos(angle)), + _y = params.cy + (params.r * Math.sin(angle)); + + return { x: gentleRound(_x), y: gentleRound(_y), theta: angle }; + }; + + /** + * returns the gradient of the segment at the given point. + */ + this.gradientAtPoint = function (location, absolute) { + var p = this.pointOnPath(location, absolute); + var m = _jg.normal([ params.cx, params.cy ], [p.x, p.y ]); + if (!this.anticlockwise && (m === Infinity || m === -Infinity)) { + m *= -1; + } + return m; + }; + + this.pointAlongPathFrom = function (location, distance, absolute) { + var p = this.pointOnPath(location, absolute), + arcSpan = distance / circumference * 2 * Math.PI, + dir = this.anticlockwise ? -1 : 1, + startAngle = p.theta + (dir * arcSpan), + startX = params.cx + (this.radius * Math.cos(startAngle)), + startY = params.cy + (this.radius * Math.sin(startAngle)); + + return {x: startX, y: startY}; + }; + + // TODO: lineIntersection + }, + + Bezier: function (params) { + this.curve = [ + { x: params.x1, y: params.y1}, + { x: params.cp1x, y: params.cp1y }, + { x: params.cp2x, y: params.cp2y }, + { x: params.x2, y: params.y2 } + ]; + + var _isPoint = function(c) { + return c[0].x === c[1].x && c[0].y === c[1].y; + }; + + var _dist = function(p1, p2 ) { + return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2)); + }; + + var _compute = function(loc) { + + var EMPTY_POINT = {x:0, y:0}; + + if (loc === 0) { + return this.curve[0]; + } + + var degree = this.curve.length - 1; + + if (loc === 1) { + return this.curve[degree]; + } + + var o = this.curve; + var s = 1 - loc; + + if (degree === 0) { + return this.curve[0]; + } + + if (degree === 1) { + return { + x: s * o[0].x + loc * o[1].x, + y: s * o[0].y + loc * o[1].y + }; + } + + if (degree < 4) { + + var l = s * s, h = loc * loc, u = 0, m, g, f; + + if (degree === 2) { + o = [o[0], o[1], o[2], EMPTY_POINT]; + m = l; + g = 2 * (s * loc); + f = h; + } else if (degree === 3) { + m = l * s; + g = 3 * (l * loc); + f = 3 * (s * h); + u = loc * h; + } + + return { + x: m * o[0].x + g * o[1].x + f * o[2].x + u * o[3].x, + y: m * o[0].y + g * o[1].y + f * o[2].y + u * o[3].y + }; + } else { + return EMPTY_POINT; // not supported. + } + }.bind(this); + + var _getLUT = function(steps) { + var out = []; + steps--; + for (var n = 0; n <= steps; n++) { + out.push(_compute(n / steps)); + } + return out; + }; + + var _computeLength = function() { + + if (_isPoint(this.curve)) { + this.length = 0; + } + + var steps = 16; + var lut = _getLUT(steps); + this.length = 0; + + for (var i = 0; i < steps - 1; i++) { + var a = lut[i], b = lut[i + 1]; + this.length += _dist(a, b); + } + }.bind(this); + + var _super = _jp.Segments.AbstractSegment.apply(this, arguments); + // although this is not a strictly rigorous determination of bounds + // of a bezier curve, it works for the types of curves that this segment + // type produces. + this.bounds = { + minX: Math.min(params.x1, params.x2, params.cp1x, params.cp2x), + minY: Math.min(params.y1, params.y2, params.cp1y, params.cp2y), + maxX: Math.max(params.x1, params.x2, params.cp1x, params.cp2x), + maxY: Math.max(params.y1, params.y2, params.cp1y, params.cp2y) + }; + + this.type = "Bezier"; + + _computeLength(); + + var _translateLocation = function (_curve, location, absolute) { + if (absolute) { + location = root.jsBezier.locationAlongCurveFrom(_curve, location > 0 ? 0 : 1, location); + } + + return location; + }; + + /** + * returns the point on the segment's path that is 'location' along the length of the path, where 'location' is a decimal from + * 0 to 1 inclusive. + */ + this.pointOnPath = function (location, absolute) { + location = _translateLocation(this.curve, location, absolute); + return root.jsBezier.pointOnCurve(this.curve, location); + }; + + /** + * returns the gradient of the segment at the given point. + */ + this.gradientAtPoint = function (location, absolute) { + location = _translateLocation(this.curve, location, absolute); + return root.jsBezier.gradientAtPoint(this.curve, location); + }; + + this.pointAlongPathFrom = function (location, distance, absolute) { + location = _translateLocation(this.curve, location, absolute); + return root.jsBezier.pointAlongCurveFrom(this.curve, location, distance); + }; + + this.getLength = function () { + return this.length; + }; + + this.getBounds = function () { + return this.bounds; + }; + + this.findClosestPointOnPath = function (x, y) { + var p = root.jsBezier.nearestPointOnCurve({x:x,y:y}, this.curve); + return { + d:Math.sqrt(Math.pow(p.point.x - x, 2) + Math.pow(p.point.y - y, 2)), + x:p.point.x, + y:p.point.y, + l:1 - p.location, + s:this + }; + }; + + this.lineIntersection = function(x1, y1, x2, y2) { + return root.jsBezier.lineIntersection(x1, y1, x2, y2, this.curve); + }; + } + }; + + _jp.SegmentRenderer = { + getPath: function (segment, isFirstSegment) { + return ({ + "Straight": function (isFirstSegment) { + var d = segment.getCoordinates(); + return (isFirstSegment ? "M " + d.x1 + " " + d.y1 + " " : "") + "L " + d.x2 + " " + d.y2; + }, + "Bezier": function (isFirstSegment) { + var d = segment.params; + return (isFirstSegment ? "M " + d.x2 + " " + d.y2 + " " : "") + + "C " + d.cp2x + " " + d.cp2y + " " + d.cp1x + " " + d.cp1y + " " + d.x1 + " " + d.y1; + }, + "Arc": function (isFirstSegment) { + var d = segment.params, + laf = segment.sweep > Math.PI ? 1 : 0, + sf = segment.anticlockwise ? 0 : 1; + + return (isFirstSegment ? "M" + segment.x1 + " " + segment.y1 + " " : "") + "A " + segment.radius + " " + d.r + " 0 " + laf + "," + sf + " " + segment.x2 + " " + segment.y2; + } + })[segment.type](isFirstSegment); + } + }; + + /* + Class: UIComponent + Superclass for Connector and AbstractEndpoint. + */ + var AbstractComponent = function () { + this.resetBounds = function () { + this.bounds = { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity }; + }; + this.resetBounds(); + }; + + /* + * Class: Connector + * Superclass for all Connectors; here is where Segments are managed. This is exposed on jsPlumb just so it + * can be accessed from other files. You should not try to instantiate one of these directly. + * + * When this class is asked for a pointOnPath, or gradient etc, it must first figure out which segment to dispatch + * that request to. This is done by keeping track of the total connector length as segments are added, and also + * their cumulative ratios to the total length. Then when the right segment is found it is a simple case of dispatching + * the request to it (and adjusting 'location' so that it is relative to the beginning of that segment.) + */ + _jp.Connectors.AbstractConnector = function (params) { + + AbstractComponent.apply(this, arguments); + + var segments = [], + totalLength = 0, + segmentProportions = [], + segmentProportionalLengths = [], + stub = params.stub || 0, + sourceStub = _ju.isArray(stub) ? stub[0] : stub, + targetStub = _ju.isArray(stub) ? stub[1] : stub, + gap = params.gap || 0, + sourceGap = _ju.isArray(gap) ? gap[0] : gap, + targetGap = _ju.isArray(gap) ? gap[1] : gap, + userProvidedSegments = null, + paintInfo = null; + + this.getPathData = function() { + var p = ""; + for (var i = 0; i < segments.length; i++) { + p += _jp.SegmentRenderer.getPath(segments[i], i === 0); + p += " "; + } + return p; + }; + + /** + * Function: findSegmentForPoint + * Returns the segment that is closest to the given [x,y], + * null if nothing found. This function returns a JS + * object with: + * + * d - distance from segment + * l - proportional location in segment + * x - x point on the segment + * y - y point on the segment + * s - the segment itself. + * connectorLocation - the location on the connector of the point, expressed as a decimal between 0 and 1 inclusive. + */ + this.findSegmentForPoint = function (x, y) { + var out = { d: Infinity, s: null, x: null, y: null, l: null }; + for (var i = 0; i < segments.length; i++) { + var _s = segments[i].findClosestPointOnPath(x, y); + if (_s.d < out.d) { + out.d = _s.d; + out.l = _s.l; + out.x = _s.x; + out.y = _s.y; + out.s = segments[i]; + out.x1 = _s.x1; + out.x2 = _s.x2; + out.y1 = _s.y1; + out.y2 = _s.y2; + out.index = i; + out.connectorLocation = segmentProportions[i][0] + (_s.l * (segmentProportions[i][1] - segmentProportions[i][0])); + } + } + + return out; + }; + + this.lineIntersection = function(x1, y1, x2, y2) { + var out = []; + for (var i = 0; i < segments.length; i++) { + out.push.apply(out, segments[i].lineIntersection(x1, y1, x2, y2)); + } + return out; + }; + + this.boxIntersection = function(x, y, w, h) { + var out = []; + for (var i = 0; i < segments.length; i++) { + out.push.apply(out, segments[i].boxIntersection(x, y, w, h)); + } + return out; + }; + + this.boundingBoxIntersection = function(box) { + var out = []; + for (var i = 0; i < segments.length; i++) { + out.push.apply(out, segments[i].boundingBoxIntersection(box)); + } + return out; + }; + + var _updateSegmentProportions = function () { + var curLoc = 0; + for (var i = 0; i < segments.length; i++) { + var sl = segments[i].getLength(); + segmentProportionalLengths[i] = sl / totalLength; + segmentProportions[i] = [curLoc, (curLoc += (sl / totalLength)) ]; + } + }, + + /** + * returns [segment, proportion of travel in segment, segment index] for the segment + * that contains the point which is 'location' distance along the entire path, where + * 'location' is a decimal between 0 and 1 inclusive. in this connector type, paths + * are made up of a list of segments, each of which contributes some fraction to + * the total length. + * From 1.3.10 this also supports the 'absolute' property, which lets us specify a location + * as the absolute distance in pixels, rather than a proportion of the total path. + */ + _findSegmentForLocation = function (location, absolute) { + + var idx, i, inSegmentProportion; + + if (absolute) { + location = location > 0 ? location / totalLength : (totalLength + location) / totalLength; + } + + // if location 1 we know its the last segment + if (location === 1) { + idx = segments.length - 1; + inSegmentProportion = 1; + } else if (location === 0) { + // if location 0 we know its the first segment + inSegmentProportion = 0; + idx = 0; + } else { + + // if location >= 0.5, traverse backwards (of course not exact, who knows the segment proportions. but + // an educated guess at least) + if (location >= 0.5) { + + idx = 0; + inSegmentProportion = 0; + for (i = segmentProportions.length - 1; i > -1; i--) { + if (segmentProportions[i][1] >= location && segmentProportions[i][0] <= location) { + idx = i; + inSegmentProportion = (location - segmentProportions[i][0]) / segmentProportionalLengths[i]; + break; + } + } + + } else { + idx = segmentProportions.length - 1; + inSegmentProportion = 1; + for (i = 0; i < segmentProportions.length; i++) { + if (segmentProportions[i][1] >= location) { + idx = i; + inSegmentProportion = (location - segmentProportions[i][0]) / segmentProportionalLengths[i]; + break; + } + } + } + } + + return { segment: segments[idx], proportion: inSegmentProportion, index: idx }; + }, + _addSegment = function (conn, type, params) { + if (params.x1 === params.x2 && params.y1 === params.y2) { + return; + } + var s = new _jp.Segments[type](params); + segments.push(s); + totalLength += s.getLength(); + conn.updateBounds(s); + }, + _clearSegments = function () { + totalLength = segments.length = segmentProportions.length = segmentProportionalLengths.length = 0; + }; + + this.setSegments = function (_segs) { + userProvidedSegments = []; + totalLength = 0; + for (var i = 0; i < _segs.length; i++) { + userProvidedSegments.push(_segs[i]); + totalLength += _segs[i].getLength(); + } + }; + + this.getLength = function() { + return totalLength; + }; + + var _prepareCompute = function (params) { + this.strokeWidth = params.strokeWidth; + var segment = _jg.quadrant(params.sourcePos, params.targetPos), + swapX = params.targetPos[0] < params.sourcePos[0], + swapY = params.targetPos[1] < params.sourcePos[1], + lw = params.strokeWidth || 1, + so = params.sourceEndpoint.anchor.getOrientation(params.sourceEndpoint), + to = params.targetEndpoint.anchor.getOrientation(params.targetEndpoint), + x = swapX ? params.targetPos[0] : params.sourcePos[0], + y = swapY ? params.targetPos[1] : params.sourcePos[1], + w = Math.abs(params.targetPos[0] - params.sourcePos[0]), + h = Math.abs(params.targetPos[1] - params.sourcePos[1]); + + // if either anchor does not have an orientation set, we derive one from their relative + // positions. we fix the axis to be the one in which the two elements are further apart, and + // point each anchor at the other element. this is also used when dragging a new connection. + if (so[0] === 0 && so[1] === 0 || to[0] === 0 && to[1] === 0) { + var index = w > h ? 0 : 1, oIndex = [1, 0][index]; + so = []; + to = []; + so[index] = params.sourcePos[index] > params.targetPos[index] ? -1 : 1; + to[index] = params.sourcePos[index] > params.targetPos[index] ? 1 : -1; + so[oIndex] = 0; + to[oIndex] = 0; + } + + var sx = swapX ? w + (sourceGap * so[0]) : sourceGap * so[0], + sy = swapY ? h + (sourceGap * so[1]) : sourceGap * so[1], + tx = swapX ? targetGap * to[0] : w + (targetGap * to[0]), + ty = swapY ? targetGap * to[1] : h + (targetGap * to[1]), + oProduct = ((so[0] * to[0]) + (so[1] * to[1])); + + var result = { + sx: sx, sy: sy, tx: tx, ty: ty, lw: lw, + xSpan: Math.abs(tx - sx), + ySpan: Math.abs(ty - sy), + mx: (sx + tx) / 2, + my: (sy + ty) / 2, + so: so, to: to, x: x, y: y, w: w, h: h, + segment: segment, + startStubX: sx + (so[0] * sourceStub), + startStubY: sy + (so[1] * sourceStub), + endStubX: tx + (to[0] * targetStub), + endStubY: ty + (to[1] * targetStub), + isXGreaterThanStubTimes2: Math.abs(sx - tx) > (sourceStub + targetStub), + isYGreaterThanStubTimes2: Math.abs(sy - ty) > (sourceStub + targetStub), + opposite: oProduct === -1, + perpendicular: oProduct === 0, + orthogonal: oProduct === 1, + sourceAxis: so[0] === 0 ? "y" : "x", + points: [x, y, w, h, sx, sy, tx, ty ], + stubs:[sourceStub, targetStub] + }; + result.anchorOrientation = result.opposite ? "opposite" : result.orthogonal ? "orthogonal" : "perpendicular"; + return result; + }; + + this.getSegments = function () { + return segments; + }; + + this.updateBounds = function (segment) { + var segBounds = segment.getBounds(); + this.bounds.minX = Math.min(this.bounds.minX, segBounds.minX); + this.bounds.maxX = Math.max(this.bounds.maxX, segBounds.maxX); + this.bounds.minY = Math.min(this.bounds.minY, segBounds.minY); + this.bounds.maxY = Math.max(this.bounds.maxY, segBounds.maxY); + }; + + var dumpSegmentsToConsole = function () { + console.log("SEGMENTS:"); + for (var i = 0; i < segments.length; i++) { + console.log(segments[i].type, segments[i].getLength(), segmentProportions[i]); + } + }; + + this.pointOnPath = function (location, absolute) { + var seg = _findSegmentForLocation(location, absolute); + return seg.segment && seg.segment.pointOnPath(seg.proportion, false) || [0, 0]; + }; + + this.gradientAtPoint = function (location, absolute) { + var seg = _findSegmentForLocation(location, absolute); + return seg.segment && seg.segment.gradientAtPoint(seg.proportion, false) || 0; + }; + + this.pointAlongPathFrom = function (location, distance, absolute) { + var seg = _findSegmentForLocation(location, absolute); + // TODO what happens if this crosses to the next segment? + return seg.segment && seg.segment.pointAlongPathFrom(seg.proportion, distance, false) || [0, 0]; + }; + + this.compute = function (params) { + paintInfo = _prepareCompute.call(this, params); + + _clearSegments(); + this._compute(paintInfo, params); + this.x = paintInfo.points[0]; + this.y = paintInfo.points[1]; + this.w = paintInfo.points[2]; + this.h = paintInfo.points[3]; + this.segment = paintInfo.segment; + _updateSegmentProportions(); + }; + + return { + addSegment: _addSegment, + prepareCompute: _prepareCompute, + sourceStub: sourceStub, + targetStub: targetStub, + maxStub: Math.max(sourceStub, targetStub), + sourceGap: sourceGap, + targetGap: targetGap, + maxGap: Math.max(sourceGap, targetGap) + }; + }; + _ju.extend(_jp.Connectors.AbstractConnector, AbstractComponent); + + + // ********************************* END OF CONNECTOR TYPES ******************************************************************* + + // ********************************* ENDPOINT TYPES ******************************************************************* + + _jp.Endpoints.AbstractEndpoint = function (params) { + AbstractComponent.apply(this, arguments); + var compute = this.compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + var out = this._compute.apply(this, arguments); + this.x = out[0]; + this.y = out[1]; + this.w = out[2]; + this.h = out[3]; + this.bounds.minX = this.x; + this.bounds.minY = this.y; + this.bounds.maxX = this.x + this.w; + this.bounds.maxY = this.y + this.h; + return out; + }; + return { + compute: compute, + cssClass: params.cssClass + }; + }; + _ju.extend(_jp.Endpoints.AbstractEndpoint, AbstractComponent); + + /** + * Class: Endpoints.Dot + * A round endpoint, with default radius 10 pixels. + */ + + /** + * Function: Constructor + * + * Parameters: + * + * radius - radius of the endpoint. defaults to 10 pixels. + */ + _jp.Endpoints.Dot = function (params) { + this.type = "Dot"; + var _super = _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + params = params || {}; + this.radius = params.radius || 10; + this.defaultOffset = 0.5 * this.radius; + this.defaultInnerRadius = this.radius / 3; + + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + this.radius = endpointStyle.radius || this.radius; + var x = anchorPoint[0] - this.radius, + y = anchorPoint[1] - this.radius, + w = this.radius * 2, + h = this.radius * 2; + + if (endpointStyle.stroke) { + var lw = endpointStyle.strokeWidth || 1; + x -= lw; + y -= lw; + w += (lw * 2); + h += (lw * 2); + } + return [ x, y, w, h, this.radius ]; + }; + }; + _ju.extend(_jp.Endpoints.Dot, _jp.Endpoints.AbstractEndpoint); + + _jp.Endpoints.Rectangle = function (params) { + this.type = "Rectangle"; + var _super = _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + params = params || {}; + this.width = params.width || 20; + this.height = params.height || 20; + + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + var width = endpointStyle.width || this.width, + height = endpointStyle.height || this.height, + x = anchorPoint[0] - (width / 2), + y = anchorPoint[1] - (height / 2); + + return [ x, y, width, height]; + }; + }; + _ju.extend(_jp.Endpoints.Rectangle, _jp.Endpoints.AbstractEndpoint); + + var DOMElementEndpoint = function (params) { + _jp.jsPlumbUIComponent.apply(this, arguments); + this._jsPlumb.displayElements = []; + }; + _ju.extend(DOMElementEndpoint, _jp.jsPlumbUIComponent, { + getDisplayElements: function () { + return this._jsPlumb.displayElements; + }, + appendDisplayElement: function (el) { + this._jsPlumb.displayElements.push(el); + } + }); + + /** + * Class: Endpoints.Image + * Draws an image as the Endpoint. + */ + /** + * Function: Constructor + * + * Parameters: + * + * src - location of the image to use. + + TODO: multiple references to self. not sure quite how to get rid of them entirely. perhaps self = null in the cleanup + function will suffice + + TODO this class still might leak memory. + + */ + _jp.Endpoints.Image = function (params) { + + this.type = "Image"; + DOMElementEndpoint.apply(this, arguments); + _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + + var _onload = params.onload, + src = params.src || params.url, + clazz = params.cssClass ? " " + params.cssClass : ""; + + this._jsPlumb.img = new Image(); + this._jsPlumb.ready = false; + this._jsPlumb.initialized = false; + this._jsPlumb.deleted = false; + this._jsPlumb.widthToUse = params.width; + this._jsPlumb.heightToUse = params.height; + this._jsPlumb.endpoint = params.endpoint; + + this._jsPlumb.img.onload = function () { + if (this._jsPlumb != null) { + this._jsPlumb.ready = true; + this._jsPlumb.widthToUse = this._jsPlumb.widthToUse || this._jsPlumb.img.width; + this._jsPlumb.heightToUse = this._jsPlumb.heightToUse || this._jsPlumb.img.height; + if (_onload) { + _onload(this); + } + } + }.bind(this); + + /* + Function: setImage + Sets the Image to use in this Endpoint. + + Parameters: + img - may be a URL or an Image object + onload - optional; a callback to execute once the image has loaded. + */ + this._jsPlumb.endpoint.setImage = function (_img, onload) { + var s = _img.constructor === String ? _img : _img.src; + _onload = onload; + this._jsPlumb.img.src = s; + + if (this.canvas != null) { + this.canvas.setAttribute("src", this._jsPlumb.img.src); + } + }.bind(this); + + this._jsPlumb.endpoint.setImage(src, _onload); + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + this.anchorPoint = anchorPoint; + if (this._jsPlumb.ready) { + return [anchorPoint[0] - this._jsPlumb.widthToUse / 2, anchorPoint[1] - this._jsPlumb.heightToUse / 2, + this._jsPlumb.widthToUse, this._jsPlumb.heightToUse]; + } + else { + return [0, 0, 0, 0]; + } + }; + + this.canvas = _jp.createElement("img", { + position:"absolute", + margin:0, + padding:0, + outline:0 + }, this._jsPlumb.instance.endpointClass + clazz); + + if (this._jsPlumb.widthToUse) { + this.canvas.setAttribute("width", this._jsPlumb.widthToUse); + } + if (this._jsPlumb.heightToUse) { + this.canvas.setAttribute("height", this._jsPlumb.heightToUse); + } + this._jsPlumb.instance.appendElement(this.canvas); + + this.actuallyPaint = function (d, style, anchor) { + if (!this._jsPlumb.deleted) { + if (!this._jsPlumb.initialized) { + this.canvas.setAttribute("src", this._jsPlumb.img.src); + this.appendDisplayElement(this.canvas); + this._jsPlumb.initialized = true; + } + var x = this.anchorPoint[0] - (this._jsPlumb.widthToUse / 2), + y = this.anchorPoint[1] - (this._jsPlumb.heightToUse / 2); + _ju.sizeElement(this.canvas, x, y, this._jsPlumb.widthToUse, this._jsPlumb.heightToUse); + } + }; + + this.paint = function (style, anchor) { + if (this._jsPlumb != null) { // may have been deleted + if (this._jsPlumb.ready) { + this.actuallyPaint(style, anchor); + } + else { + root.setTimeout(function () { + this.paint(style, anchor); + }.bind(this), 200); + } + } + }; + }; + _ju.extend(_jp.Endpoints.Image, [ DOMElementEndpoint, _jp.Endpoints.AbstractEndpoint ], { + cleanup: function (force) { + if (force) { + this._jsPlumb.deleted = true; + if (this.canvas) { + this.canvas.parentNode.removeChild(this.canvas); + } + this.canvas = null; + } + } + }); + + /* + * Class: Endpoints.Blank + * An Endpoint that paints nothing (visible) on the screen. Supports cssClass and hoverClass parameters like all Endpoints. + */ + _jp.Endpoints.Blank = function (params) { + var _super = _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + this.type = "Blank"; + DOMElementEndpoint.apply(this, arguments); + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + return [anchorPoint[0], anchorPoint[1], 10, 0]; + }; + + var clazz = params.cssClass ? " " + params.cssClass : ""; + + this.canvas = _jp.createElement("div", { + display: "block", + width: "1px", + height: "1px", + background: "transparent", + position: "absolute" + }, this._jsPlumb.instance.endpointClass + clazz); + + this._jsPlumb.instance.appendElement(this.canvas); + + this.paint = function (style, anchor) { + _ju.sizeElement(this.canvas, this.x, this.y, this.w, this.h); + }; + }; + _ju.extend(_jp.Endpoints.Blank, [_jp.Endpoints.AbstractEndpoint, DOMElementEndpoint], { + cleanup: function () { + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + } + }); + + /* + * Class: Endpoints.Triangle + * A triangular Endpoint. + */ + /* + * Function: Constructor + * + * Parameters: + * + * width width of the triangle's base. defaults to 55 pixels. + * height height of the triangle from base to apex. defaults to 55 pixels. + */ + _jp.Endpoints.Triangle = function (params) { + this.type = "Triangle"; + _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + var self = this; + params = params || { }; + params.width = params.width || 55; + params.height = params.height || 55; + this.width = params.width; + this.height = params.height; + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + var width = endpointStyle.width || self.width, + height = endpointStyle.height || self.height, + x = anchorPoint[0] - (width / 2), + y = anchorPoint[1] - (height / 2); + return [ x, y, width, height ]; + }; + }; +// ********************************* END OF ENDPOINT TYPES ******************************************************************* + + +// ********************************* OVERLAY DEFINITIONS *********************************************************************** + + var AbstractOverlay = _jp.Overlays.AbstractOverlay = function (params) { + this.visible = true; + this.isAppendedAtTopLevel = true; + this.component = params.component; + this.loc = params.location == null ? 0.5 : params.location; + this.endpointLoc = params.endpointLocation == null ? [ 0.5, 0.5] : params.endpointLocation; + this.visible = params.visible !== false; + }; + AbstractOverlay.prototype = { + cleanup: function (force) { + if (force) { + this.component = null; + this.canvas = null; + this.endpointLoc = null; + } + }, + reattach:function(instance, component) { }, + setVisible: function (val) { + this.visible = val; + this.component.repaint(); + }, + isVisible: function () { + return this.visible; + }, + hide: function () { + this.setVisible(false); + }, + show: function () { + this.setVisible(true); + }, + incrementLocation: function (amount) { + this.loc += amount; + this.component.repaint(); + }, + setLocation: function (l) { + this.loc = l; + this.component.repaint(); + }, + getLocation: function () { + return this.loc; + }, + updateFrom:function() { } + }; + + + /* + * Class: Overlays.Arrow + * + * An arrow overlay, defined by four points: the head, the two sides of the tail, and a 'foldback' point at some distance along the length + * of the arrow that lines from each tail point converge into. The foldback point is defined using a decimal that indicates some fraction + * of the length of the arrow and has a default value of 0.623. A foldback point value of 1 would mean that the arrow had a straight line + * across the tail. + */ + /* + * @constructor + * + * @param {Object} params Constructor params. + * @param {Number} [params.length] Distance in pixels from head to tail baseline. default 20. + * @param {Number} [params.width] Width in pixels of the tail baseline. default 20. + * @param {String} [params.fill] Style to use when filling the arrow. defaults to "black". + * @param {String} [params.stroke] Style to use when stroking the arrow. defaults to null, which means the arrow is not stroked. + * @param {Number} [params.stroke-width] Line width to use when stroking the arrow. defaults to 1, but only used if stroke is not null. + * @param {Number} [params.foldback] Distance (as a decimal from 0 to 1 inclusive) along the length of the arrow marking the point the tail points should fold back to. defaults to 0.623. + * @param {Number} [params.location] Distance (as a decimal from 0 to 1 inclusive) marking where the arrow should sit on the connector. defaults to 0.5. + * @param {NUmber} [params.direction] Indicates the direction the arrow points in. valid values are -1 and 1; 1 is default. + */ + _jp.Overlays.Arrow = function (params) { + this.type = "Arrow"; + AbstractOverlay.apply(this, arguments); + this.isAppendedAtTopLevel = false; + params = params || {}; + var self = this; + + this.length = params.length || 20; + this.width = params.width || 20; + this.id = params.id; + this.direction = (params.direction || 1) < 0 ? -1 : 1; + var paintStyle = params.paintStyle || { "stroke-width": 1 }, + // how far along the arrow the lines folding back in come to. default is 62.3%. + foldback = params.foldback || 0.623; + + this.computeMaxSize = function () { + return self.width * 1.5; + }; + + this.elementCreated = function(p, component) { + this.path = p; + if (params.events) { + for (var i in params.events) { + _jp.on(p, i, params.events[i]); + } + } + }; + + this.draw = function (component, currentConnectionPaintStyle) { + + var hxy, mid, txy, tail, cxy; + if (component.pointAlongPathFrom) { + + if (_ju.isString(this.loc) || this.loc > 1 || this.loc < 0) { + var l = parseInt(this.loc, 10), + fromLoc = this.loc < 0 ? 1 : 0; + hxy = component.pointAlongPathFrom(fromLoc, l, false); + mid = component.pointAlongPathFrom(fromLoc, l - (this.direction * this.length / 2), false); + txy = _jg.pointOnLine(hxy, mid, this.length); + } + else if (this.loc === 1) { + hxy = component.pointOnPath(this.loc); + mid = component.pointAlongPathFrom(this.loc, -(this.length)); + txy = _jg.pointOnLine(hxy, mid, this.length); + + if (this.direction === -1) { + var _ = txy; + txy = hxy; + hxy = _; + } + } + else if (this.loc === 0) { + txy = component.pointOnPath(this.loc); + mid = component.pointAlongPathFrom(this.loc, this.length); + hxy = _jg.pointOnLine(txy, mid, this.length); + if (this.direction === -1) { + var __ = txy; + txy = hxy; + hxy = __; + } + } + else { + hxy = component.pointAlongPathFrom(this.loc, this.direction * this.length / 2); + mid = component.pointOnPath(this.loc); + txy = _jg.pointOnLine(hxy, mid, this.length); + } + + tail = _jg.perpendicularLineTo(hxy, txy, this.width); + cxy = _jg.pointOnLine(hxy, txy, foldback * this.length); + + var d = { hxy: hxy, tail: tail, cxy: cxy }, + stroke = paintStyle.stroke || currentConnectionPaintStyle.stroke, + fill = paintStyle.fill || currentConnectionPaintStyle.stroke, + lineWidth = paintStyle.strokeWidth || currentConnectionPaintStyle.strokeWidth; + + return { + component: component, + d: d, + "stroke-width": lineWidth, + stroke: stroke, + fill: fill, + minX: Math.min(hxy.x, tail[0].x, tail[1].x), + maxX: Math.max(hxy.x, tail[0].x, tail[1].x), + minY: Math.min(hxy.y, tail[0].y, tail[1].y), + maxY: Math.max(hxy.y, tail[0].y, tail[1].y) + }; + } + else { + return {component: component, minX: 0, maxX: 0, minY: 0, maxY: 0}; + } + }; + }; + _ju.extend(_jp.Overlays.Arrow, AbstractOverlay, { + updateFrom:function(d) { + this.length = d.length || this.length; + this.width = d.width|| this.width; + this.direction = d.direction != null ? d.direction : this.direction; + this.foldback = d.foldback|| this.foldback; + }, + cleanup:function() { + if (this.path && this.path.parentNode) { + this.path.parentNode.removeChild(this.path); + } + } + }); + + /* + * Class: Overlays.PlainArrow + * + * A basic arrow. This is in fact just one instance of the more generic case in which the tail folds back on itself to some + * point along the length of the arrow: in this case, that foldback point is the full length of the arrow. so it just does + * a 'call' to Arrow with foldback set appropriately. + */ + /* + * Function: Constructor + * See for allowed parameters for this overlay. + */ + _jp.Overlays.PlainArrow = function (params) { + params = params || {}; + var p = _jp.extend(params, {foldback: 1}); + _jp.Overlays.Arrow.call(this, p); + this.type = "PlainArrow"; + }; + _ju.extend(_jp.Overlays.PlainArrow, _jp.Overlays.Arrow); + + /* + * Class: Overlays.Diamond + * + * A diamond. Like PlainArrow, this is a concrete case of the more generic case of the tail points converging on some point...it just + * happens that in this case, that point is greater than the length of the the arrow. + * + * this could probably do with some help with positioning...due to the way it reuses the Arrow paint code, what Arrow thinks is the + * center is actually 1/4 of the way along for this guy. but we don't have any knowledge of pixels at this point, so we're kind of + * stuck when it comes to helping out the Arrow class. possibly we could pass in a 'transpose' parameter or something. the value + * would be -l/4 in this case - move along one quarter of the total length. + */ + /* + * Function: Constructor + * See for allowed parameters for this overlay. + */ + _jp.Overlays.Diamond = function (params) { + params = params || {}; + var l = params.length || 40, + p = _jp.extend(params, {length: l / 2, foldback: 2}); + _jp.Overlays.Arrow.call(this, p); + this.type = "Diamond"; + }; + _ju.extend(_jp.Overlays.Diamond, _jp.Overlays.Arrow); + + var _getDimensions = function (component, forceRefresh) { + if (component._jsPlumb.cachedDimensions == null || forceRefresh) { + component._jsPlumb.cachedDimensions = component.getDimensions(); + } + return component._jsPlumb.cachedDimensions; + }; + + // abstract superclass for overlays that add an element to the DOM. + var AbstractDOMOverlay = function (params) { + _jp.jsPlumbUIComponent.apply(this, arguments); + AbstractOverlay.apply(this, arguments); + + // hand off fired events to associated component. + var _f = this.fire; + this.fire = function () { + _f.apply(this, arguments); + if (this.component) { + this.component.fire.apply(this.component, arguments); + } + }; + + this.detached=false; + this.id = params.id; + this._jsPlumb.div = null; + this._jsPlumb.initialised = false; + this._jsPlumb.component = params.component; + this._jsPlumb.cachedDimensions = null; + this._jsPlumb.create = params.create; + this._jsPlumb.initiallyInvisible = params.visible === false; + + this.getElement = function () { + if (this._jsPlumb.div == null) { + var div = this._jsPlumb.div = _jp.getElement(this._jsPlumb.create(this._jsPlumb.component)); + div.style.position = "absolute"; + jsPlumb.addClass(div, this._jsPlumb.instance.overlayClass + " " + + (this.cssClass ? this.cssClass : + params.cssClass ? params.cssClass : "")); + this._jsPlumb.instance.appendElement(div); + this._jsPlumb.instance.getId(div); + this.canvas = div; + + // in IE the top left corner is what it placed at the desired location. This will not + // be fixed. IE8 is not going to be supported for much longer. + var ts = "translate(-50%, -50%)"; + div.style.webkitTransform = ts; + div.style.mozTransform = ts; + div.style.msTransform = ts; + div.style.oTransform = ts; + div.style.transform = ts; + + // write the related component into the created element + div._jsPlumb = this; + + if (params.visible === false) { + div.style.display = "none"; + } + } + return this._jsPlumb.div; + }; + + this.draw = function (component, currentConnectionPaintStyle, absolutePosition) { + var td = _getDimensions(this); + if (td != null && td.length === 2) { + var cxy = { x: 0, y: 0 }; + + // absolutePosition would have been set by a call to connection.setAbsoluteOverlayPosition. + if (absolutePosition) { + cxy = { x: absolutePosition[0], y: absolutePosition[1] }; + } + else if (component.pointOnPath) { + var loc = this.loc, absolute = false; + if (_ju.isString(this.loc) || this.loc < 0 || this.loc > 1) { + loc = parseInt(this.loc, 10); + absolute = true; + } + cxy = component.pointOnPath(loc, absolute); // a connection + } + else { + var locToUse = this.loc.constructor === Array ? this.loc : this.endpointLoc; + cxy = { x: locToUse[0] * component.w, + y: locToUse[1] * component.h }; + } + + var minx = cxy.x - (td[0] / 2), + miny = cxy.y - (td[1] / 2); + + return { + component: component, + d: { minx: minx, miny: miny, td: td, cxy: cxy }, + minX: minx, + maxX: minx + td[0], + minY: miny, + maxY: miny + td[1] + }; + } + else { + return {minX: 0, maxX: 0, minY: 0, maxY: 0}; + } + }; + }; + _ju.extend(AbstractDOMOverlay, [_jp.jsPlumbUIComponent, AbstractOverlay], { + getDimensions: function () { + return [1,1]; + }, + setVisible: function (state) { + if (this._jsPlumb.div) { + this._jsPlumb.div.style.display = state ? "block" : "none"; + // if initially invisible, dimensions are 0,0 and never get updated + if (state && this._jsPlumb.initiallyInvisible) { + _getDimensions(this, true); + this.component.repaint(); + this._jsPlumb.initiallyInvisible = false; + } + } + }, + /* + * Function: clearCachedDimensions + * Clears the cached dimensions for the label. As a performance enhancement, label dimensions are + * cached from 1.3.12 onwards. The cache is cleared when you change the label text, of course, but + * there are other reasons why the text dimensions might change - if you make a change through CSS, for + * example, you might change the font size. in that case you should explicitly call this method. + */ + clearCachedDimensions: function () { + this._jsPlumb.cachedDimensions = null; + }, + cleanup: function (force) { + if (force) { + if (this._jsPlumb.div != null) { + this._jsPlumb.div._jsPlumb = null; + this._jsPlumb.instance.removeElement(this._jsPlumb.div); + } + } + else { + // if not a forced cleanup, just detach child from parent for now. + if (this._jsPlumb && this._jsPlumb.div && this._jsPlumb.div.parentNode) { + this._jsPlumb.div.parentNode.removeChild(this._jsPlumb.div); + } + this.detached = true; + } + + }, + reattach:function(instance, component) { + if (this._jsPlumb.div != null) { + instance.getContainer().appendChild(this._jsPlumb.div); + } + this.detached = false; + }, + computeMaxSize: function () { + var td = _getDimensions(this); + return Math.max(td[0], td[1]); + }, + paint: function (p, containerExtents) { + if (!this._jsPlumb.initialised) { + this.getElement(); + p.component.appendDisplayElement(this._jsPlumb.div); + this._jsPlumb.initialised = true; + if (this.detached) { + this._jsPlumb.div.parentNode.removeChild(this._jsPlumb.div); + } + } + this._jsPlumb.div.style.left = (p.component.x + p.d.minx) + "px"; + this._jsPlumb.div.style.top = (p.component.y + p.d.miny) + "px"; + } + }); + + /* + * Class: Overlays.Custom + * A Custom overlay. You supply a 'create' function which returns some DOM element, and jsPlumb positions it. + * The 'create' function is passed a Connection or Endpoint. + */ + /* + * Function: Constructor + * + * Parameters: + * create - function for jsPlumb to call that returns a DOM element. + * location - distance (as a decimal from 0 to 1 inclusive) marking where the label should sit on the connector. defaults to 0.5. + * id - optional id to use for later retrieval of this overlay. + * + */ + _jp.Overlays.Custom = function (params) { + this.type = "Custom"; + AbstractDOMOverlay.apply(this, arguments); + }; + _ju.extend(_jp.Overlays.Custom, AbstractDOMOverlay); + + _jp.Overlays.GuideLines = function () { + var self = this; + self.length = 50; + self.strokeWidth = 5; + this.type = "GuideLines"; + AbstractOverlay.apply(this, arguments); + _jp.jsPlumbUIComponent.apply(this, arguments); + this.draw = function (connector, currentConnectionPaintStyle) { + + var head = connector.pointAlongPathFrom(self.loc, self.length / 2), + mid = connector.pointOnPath(self.loc), + tail = _jg.pointOnLine(head, mid, self.length), + tailLine = _jg.perpendicularLineTo(head, tail, 40), + headLine = _jg.perpendicularLineTo(tail, head, 20); + + return { + connector: connector, + head: head, + tail: tail, + headLine: headLine, + tailLine: tailLine, + minX: Math.min(head.x, tail.x, headLine[0].x, headLine[1].x), + minY: Math.min(head.y, tail.y, headLine[0].y, headLine[1].y), + maxX: Math.max(head.x, tail.x, headLine[0].x, headLine[1].x), + maxY: Math.max(head.y, tail.y, headLine[0].y, headLine[1].y) + }; + }; + + // this.cleanup = function() { }; // nothing to clean up for GuideLines + }; + + /* + * Class: Overlays.Label + + */ + /* + * Function: Constructor + * + * Parameters: + * cssClass - optional css class string to append to css class. This string is appended "as-is", so you can of course have multiple classes + * defined. This parameter is preferred to using labelStyle, borderWidth and borderStyle. + * label - the label to paint. May be a string or a function that returns a string. Nothing will be painted if your label is null or your + * label function returns null. empty strings _will_ be painted. + * location - distance (as a decimal from 0 to 1 inclusive) marking where the label should sit on the connector. defaults to 0.5. + * id - optional id to use for later retrieval of this overlay. + * + * + */ + _jp.Overlays.Label = function (params) { + this.labelStyle = params.labelStyle; + + var labelWidth = null, labelHeight = null, labelText = null, labelPadding = null; + this.cssClass = this.labelStyle != null ? this.labelStyle.cssClass : null; + var p = _jp.extend({ + create: function () { + return _jp.createElement("div"); + }}, params); + _jp.Overlays.Custom.call(this, p); + this.type = "Label"; + this.label = params.label || ""; + this.labelText = null; + if (this.labelStyle) { + var el = this.getElement(); + this.labelStyle.font = this.labelStyle.font || "12px sans-serif"; + el.style.font = this.labelStyle.font; + el.style.color = this.labelStyle.color || "black"; + if (this.labelStyle.fill) { + el.style.background = this.labelStyle.fill; + } + if (this.labelStyle.borderWidth > 0) { + var dStyle = this.labelStyle.borderStyle ? this.labelStyle.borderStyle : "black"; + el.style.border = this.labelStyle.borderWidth + "px solid " + dStyle; + } + if (this.labelStyle.padding) { + el.style.padding = this.labelStyle.padding; + } + } + + }; + _ju.extend(_jp.Overlays.Label, _jp.Overlays.Custom, { + cleanup: function (force) { + if (force) { + this.div = null; + this.label = null; + this.labelText = null; + this.cssClass = null; + this.labelStyle = null; + } + }, + getLabel: function () { + return this.label; + }, + /* + * Function: setLabel + * sets the label's, um, label. you would think i'd call this function + * 'setText', but you can pass either a Function or a String to this, so + * it makes more sense as 'setLabel'. This uses innerHTML on the label div, so keep + * that in mind if you need escaped HTML. + */ + setLabel: function (l) { + this.label = l; + this.labelText = null; + this.clearCachedDimensions(); + this.update(); + this.component.repaint(); + }, + getDimensions: function () { + this.update(); + return AbstractDOMOverlay.prototype.getDimensions.apply(this, arguments); + }, + update: function () { + if (typeof this.label === "function") { + var lt = this.label(this); + this.getElement().innerHTML = lt.replace(/\r\n/g, "
    "); + } + else { + if (this.labelText == null) { + this.labelText = this.label; + this.getElement().innerHTML = this.labelText.replace(/\r\n/g, "
    "); + } + } + }, + updateFrom:function(d) { + if(d.label != null){ + this.setLabel(d.label); + } + } + }); + + // ********************************* END OF OVERLAY DEFINITIONS *********************************************************************** + +}).call(typeof window !== 'undefined' ? window : this); + +/* + * Copyright (c) 2010 - 2020 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function() { + "use strict"; + + var root = this, + _ju = root.jsPlumbUtil, + _jpi = root.jsPlumbInstance; + + var GROUP_COLLAPSED_CLASS = "jtk-group-collapsed"; + var GROUP_EXPANDED_CLASS = "jtk-group-expanded"; + var GROUP_CONTAINER_SELECTOR = "[jtk-group-content]"; + var ELEMENT_DRAGGABLE_EVENT = "elementDraggable"; + var STOP = "stop"; + var REVERT = "revert"; + var GROUP_MANAGER = "_groupManager"; + var GROUP = "_jsPlumbGroup"; + var GROUP_DRAG_SCOPE = "_jsPlumbGroupDrag"; + var EVT_CHILD_ADDED = "group:addMember"; + var EVT_CHILD_REMOVED = "group:removeMember"; + var EVT_GROUP_ADDED = "group:add"; + var EVT_GROUP_REMOVED = "group:remove"; + var EVT_EXPAND = "group:expand"; + var EVT_COLLAPSE = "group:collapse"; + var EVT_GROUP_DRAG_STOP = "groupDragStop"; + var EVT_CONNECTION_MOVED = "connectionMoved"; + var EVT_INTERNAL_CONNECTION_DETACHED = "internal.connectionDetached"; + + var CMD_REMOVE_ALL = "removeAll"; + var CMD_ORPHAN_ALL = "orphanAll"; + var CMD_SHOW = "show"; + var CMD_HIDE = "hide"; + + var GroupManager = function(_jsPlumb) { + var _managedGroups = {}, _connectionSourceMap = {}, _connectionTargetMap = {}, self = this; + + // function findGroupFor(el) { + // var c = _jsPlumb.getContainer(); + // var abort = false, g = null, child = null; + // while (!abort) { + // if (el == null || el === c) { + // abort = true; + // } else { + // if (el[GROUP]) { + // g = el[GROUP]; + // child = el; + // abort = true; + // } else { + // el = el.parentNode; + // } + // } + // } + // return g; + // } + + function isDescendant(el, parentEl) { + var c = _jsPlumb.getContainer(); + var abort = false, g = null, child = null; + while (!abort) { + if (el == null || el === c) { + return false; + } else { + if (el === parentEl) { + return true; + } else { + el = el.parentNode; + } + } + } + } + + _jsPlumb.bind("connection", function(p) { + + var sourceGroup = _jsPlumb.getGroupFor(p.source); + var targetGroup = _jsPlumb.getGroupFor(p.target); + + if (sourceGroup != null && targetGroup != null && sourceGroup === targetGroup) { + _connectionSourceMap[p.connection.id] = sourceGroup; + _connectionTargetMap[p.connection.id] = sourceGroup; + } + else { + if (sourceGroup != null) { + _ju.suggest(sourceGroup.connections.source, p.connection); + _connectionSourceMap[p.connection.id] = sourceGroup; + } + if (targetGroup != null) { + _ju.suggest(targetGroup.connections.target, p.connection); + _connectionTargetMap[p.connection.id] = targetGroup; + } + } + }); + + function _cleanupDetachedConnection(conn) { + delete conn.proxies; + var group = _connectionSourceMap[conn.id], f; + if (group != null) { + f = function(c) { return c.id === conn.id; }; + _ju.removeWithFunction(group.connections.source, f); + _ju.removeWithFunction(group.connections.target, f); + delete _connectionSourceMap[conn.id]; + } + + group = _connectionTargetMap[conn.id]; + if (group != null) { + f = function(c) { return c.id === conn.id; }; + _ju.removeWithFunction(group.connections.source, f); + _ju.removeWithFunction(group.connections.target, f); + delete _connectionTargetMap[conn.id]; + } + } + + _jsPlumb.bind(EVT_INTERNAL_CONNECTION_DETACHED, function(p) { + _cleanupDetachedConnection(p.connection); + }); + + _jsPlumb.bind(EVT_CONNECTION_MOVED, function(p) { + var connMap = p.index === 0 ? _connectionSourceMap : _connectionTargetMap; + var group = connMap[p.connection.id]; + if (group) { + var list = group.connections[p.index === 0 ? "source" : "target"]; + var idx = list.indexOf(p.connection); + if (idx !== -1) { + list.splice(idx, 1); + } + } + }); + + this.addGroup = function(group) { + _jsPlumb.addClass(group.getEl(), GROUP_EXPANDED_CLASS); + _managedGroups[group.id] = group; + group.manager = this; + _updateConnectionsForGroup(group); + _jsPlumb.fire(EVT_GROUP_ADDED, { group:group }); + }; + + this.addToGroup = function(group, el, doNotFireEvent) { + group = this.getGroup(group); + if (group) { + var groupEl = group.getEl(); + + if (el._isJsPlumbGroup) { + return; + } + var currentGroup = el._jsPlumbGroup; + // if already a member of this group, do nothing + if (currentGroup !== group) { + + _jsPlumb.removeFromDragSelection(el); + + var elpos = _jsPlumb.getOffset(el, true); + var cpos = group.collapsed ? _jsPlumb.getOffset(groupEl, true) : _jsPlumb.getOffset(group.getDragArea(), true); + + // otherwise, transfer to this group. + if (currentGroup != null) { + currentGroup.remove(el, false, doNotFireEvent, false, group); + self.updateConnectionsForGroup(currentGroup); + } + group.add(el, doNotFireEvent/*, currentGroup*/); + + var handleDroppedConnections = function (list, index) { + var oidx = index === 0 ? 1 : 0; + list.each(function (c) { + c.setVisible(false); + if (c.endpoints[oidx].element._jsPlumbGroup === group) { + c.endpoints[oidx].setVisible(false); + _expandConnection(c, oidx, group); + } + else { + c.endpoints[index].setVisible(false); + _collapseConnection(c, index, group); + } + }); + }; + + if (group.collapsed) { + handleDroppedConnections(_jsPlumb.select({source: el}), 0); + handleDroppedConnections(_jsPlumb.select({target: el}), 1); + } + + var elId = _jsPlumb.getId(el); + _jsPlumb.dragManager.setParent(el, elId, groupEl, _jsPlumb.getId(groupEl), elpos); + + var newPosition = { left: elpos.left - cpos.left, top: elpos.top - cpos.top }; + + _jsPlumb.setPosition(el, newPosition); + + _jsPlumb.dragManager.revalidateParent(el, elId, elpos); + + self.updateConnectionsForGroup(group); + + _jsPlumb.revalidate(elId); + + if (!doNotFireEvent) { + var p = {group: group, el: el, pos:newPosition}; + if (currentGroup) { + p.sourceGroup = currentGroup; + } + _jsPlumb.fire(EVT_CHILD_ADDED, p); + } + } + } + }; + + this.removeFromGroup = function(group, el, doNotFireEvent) { + group = this.getGroup(group); + if (group) { + + // if this group is currently collapsed then any proxied connections for the given el (or its descendants) need + // to be put back on their original element, and unproxied + if (group.collapsed) { + var _expandSet = function (conns, index) { + for (var i = 0; i < conns.length; i++) { + var c = conns[i]; + if (c.proxies) { + for(var j = 0; j < c.proxies.length; j++) { + if (c.proxies[j] != null) { + var proxiedElement = c.proxies[j].originalEp.element; + if (proxiedElement === el || isDescendant(proxiedElement, el)) { + _expandConnection(c, index, group); + } + } + + } + } + } + }; + + // setup proxies for sources and targets + _expandSet(group.connections.source.slice(), 0); + _expandSet(group.connections.target.slice(), 1); + } + + group.remove(el, null, doNotFireEvent); + } + }; + + this.getGroup = function(groupId) { + var group = groupId; + if (_ju.isString(groupId)) { + group = _managedGroups[groupId]; + if (group == null) { + throw new TypeError("No such group [" + groupId + "]"); + } + } + return group; + }; + + this.getGroups = function() { + var o = []; + for (var g in _managedGroups) { + o.push(_managedGroups[g]); + } + return o; + }; + + this.removeGroup = function(group, deleteMembers, manipulateDOM, doNotFireEvent) { + group = this.getGroup(group); + this.expandGroup(group, true); // this reinstates any original connections and removes all proxies, but does not fire an event. + var newPositions = group[deleteMembers ? CMD_REMOVE_ALL : CMD_ORPHAN_ALL](manipulateDOM, doNotFireEvent); + _jsPlumb.remove(group.getEl()); + delete _managedGroups[group.id]; + delete _jsPlumb._groups[group.id]; + _jsPlumb.fire(EVT_GROUP_REMOVED, { group:group }); + return newPositions; // this will be null in the case or remove, but be a map of {id->[x,y]} in the case of orphan + }; + + this.removeAllGroups = function(deleteMembers, manipulateDOM, doNotFireEvent) { + for (var g in _managedGroups) { + this.removeGroup(_managedGroups[g], deleteMembers, manipulateDOM, doNotFireEvent); + } + }; + + function _setVisible(group, state) { + + // TODO discovering the list of elements would ideally be a pluggable function. + var m = group.getEl().querySelectorAll(".jtk-managed"); + for (var i = 0; i < m.length; i++) { + _jsPlumb[state ? CMD_SHOW : CMD_HIDE](m[i], true); + } + } + + var _collapseConnection = function(c, index, group) { + + var otherEl = c.endpoints[index === 0 ? 1 : 0].element; + if (otherEl[GROUP] && (!otherEl[GROUP].shouldProxy() && otherEl[GROUP].collapsed)) { + return; + } + + var groupEl = group.getEl(), groupElId = _jsPlumb.getId(groupEl); + + _jsPlumb.proxyConnection(c, index, groupEl, groupElId, function(c, index) { return group.getEndpoint(c, index); }, function(c, index) { return group.getAnchor(c, index); }); + }; + + this.collapseGroup = function(group) { + group = this.getGroup(group); + if (group == null || group.collapsed) { + return; + } + var groupEl = group.getEl(); + + // todo remove old proxy endpoints first, just in case? + //group.proxies.length = 0; + + // hide all connections + _setVisible(group, false); + + if (group.shouldProxy()) { + // collapses all connections in a group. + var _collapseSet = function (conns, index) { + for (var i = 0; i < conns.length; i++) { + var c = conns[i]; + _collapseConnection(c, index, group); + } + }; + + // setup proxies for sources and targets + _collapseSet(group.connections.source, 0); + _collapseSet(group.connections.target, 1); + } + + group.collapsed = true; + _jsPlumb.removeClass(groupEl, GROUP_EXPANDED_CLASS); + _jsPlumb.addClass(groupEl, GROUP_COLLAPSED_CLASS); + _jsPlumb.revalidate(groupEl); + _jsPlumb.fire(EVT_COLLAPSE, { group:group }); + }; + + var _expandConnection = function(c, index, group) { + _jsPlumb.unproxyConnection(c, index, _jsPlumb.getId(group.getEl())); + }; + + this.expandGroup = function(group, doNotFireEvent) { + + group = this.getGroup(group); + + if (group == null || !group.collapsed) { + return; + } + var groupEl = group.getEl(); + + _setVisible(group, true); + + if (group.shouldProxy()) { + // expands all connections in a group. + var _expandSet = function (conns, index) { + for (var i = 0; i < conns.length; i++) { + var c = conns[i]; + _expandConnection(c, index, group); + } + }; + + // setup proxies for sources and targets + _expandSet(group.connections.source, 0); + _expandSet(group.connections.target, 1); + } + + group.collapsed = false; + _jsPlumb.addClass(groupEl, GROUP_EXPANDED_CLASS); + _jsPlumb.removeClass(groupEl, GROUP_COLLAPSED_CLASS); + _jsPlumb.revalidate(groupEl); + this.repaintGroup(group); + if (!doNotFireEvent) { + _jsPlumb.fire(EVT_EXPAND, { group: group}); + } + }; + + this.repaintGroup = function(group) { + group = this.getGroup(group); + var m = group.getMembers(); + for (var i = 0; i < m.length; i++) { + _jsPlumb.revalidate(m[i]); + } + }; + + // TODO refactor this with the code that responds to `connection` events. + function _updateConnectionsForGroup(group) { + var members = group.getMembers().slice(); + + var childMembers = []; + for (var i = 0; i < members.length; i++) { + Array.prototype.push.apply(childMembers, members[i].querySelectorAll(".jtk-managed")); + } + Array.prototype.push.apply(members, childMembers); + + var c1 = _jsPlumb.getConnections({source:members, scope:"*"}, true); + var c2 = _jsPlumb.getConnections({target:members, scope:"*"}, true); + + var processed = {}; + group.connections.source.length = 0; + group.connections.target.length = 0; + var oneSet = function(c) { + for (var i = 0; i < c.length; i++) { + if (processed[c[i].id]) { + continue; + } + processed[c[i].id] = true; + var gs = _jsPlumb.getGroupFor(c[i].source), + gt = _jsPlumb.getGroupFor(c[i].target); + + if (gs === group) { + if (gt !== group) { + group.connections.source.push(c[i]); + } + _connectionSourceMap[c[i].id] = group; + } + else if (gt === group) { + group.connections.target.push(c[i]); + _connectionTargetMap[c[i].id] = group; + } + } + }; + oneSet(c1); oneSet(c2); + } + + this.updateConnectionsForGroup = _updateConnectionsForGroup; + this.refreshAllGroups = function() { + for (var g in _managedGroups) { + _updateConnectionsForGroup(_managedGroups[g]); + _jsPlumb.dragManager.updateOffsets(_jsPlumb.getId(_managedGroups[g].getEl())); + } + }; + }; + + /** + * + * @param {jsPlumbInstance} _jsPlumb Associated jsPlumb instance. + * @param {Object} params + * @param {Element} params.el The DOM element representing the Group. + * @param {String} [params.id] Optional ID for the Group. A UUID will be assigned as the Group's ID if you do not provide one. + * @param {Boolean} [params.constrain=false] If true, child elements will not be able to be dragged outside of the Group container. + * @param {Boolean} [params.revert=true] By default, child elements revert to the container if dragged outside. You can change this by setting `revert:false`. This behaviour is also overridden if you set `orphan` or `prune`. + * @param {Boolean} [params.orphan=false] If true, child elements dropped outside of the Group container will be removed from the Group (but not from the DOM). + * @param {Boolean} [params.prune=false] If true, child elements dropped outside of the Group container will be removed from the Group and also from the DOM. + * @param {Boolean} [params.dropOverride=false] If true, a child element that has been dropped onto some other Group will not be subject to the controls imposed by `prune`, `revert` or `orphan`. + * @constructor + */ + var Group = function(_jsPlumb, params) { + var self = this; + var el = params.el; + this.getEl = function() { return el; }; + this.id = params.id || _ju.uuid(); + el._isJsPlumbGroup = true; + + var getDragArea = this.getDragArea = function() { + var da = _jsPlumb.getSelector(el, GROUP_CONTAINER_SELECTOR); + return da && da.length > 0 ? da[0] : el; + }; + + var ghost = params.ghost === true; + var constrain = ghost || (params.constrain === true); + var revert = params.revert !== false; + var orphan = params.orphan === true; + var prune = params.prune === true; + var dropOverride = params.dropOverride === true; + var proxied = params.proxied !== false; + var elements = []; + this.connections = { source:[], target:[], internal:[] }; + + // this function, and getEndpoint below, are stubs for a future setup in which we can choose endpoint + // and anchor based upon the connection and the index (source/target) of the endpoint to be proxied. + this.getAnchor = function(conn, endpointIndex) { + return params.anchor || "Continuous"; + }; + + this.getEndpoint = function(conn, endpointIndex) { + return params.endpoint || [ "Dot", { radius:10 }]; + }; + + this.collapsed = false; + if (params.draggable !== false) { + var opts = { + drag:function() { + for (var i = 0; i < elements.length; i++) { + _jsPlumb.draw(elements[i]); + } + }, + stop:function(params) { + _jsPlumb.fire(EVT_GROUP_DRAG_STOP, jsPlumb.extend(params, {group:self})); + }, + scope:GROUP_DRAG_SCOPE + }; + if (params.dragOptions) { + root.jsPlumb.extend(opts, params.dragOptions); + } + _jsPlumb.draggable(params.el, opts); + } + if (params.droppable !== false) { + _jsPlumb.droppable(params.el, { + drop:function(p) { + var el = p.drag.el; + if (el._isJsPlumbGroup) { + return; + } + var currentGroup = el._jsPlumbGroup; + if (currentGroup !== self) { + if (currentGroup != null) { + if (currentGroup.overrideDrop(el, self)) { + return; + } + } + _jsPlumb.getGroupManager().addToGroup(self, el, false); + } + + } + }); + } + var _each = function(_el, fn) { + var els = _el.nodeType == null ? _el : [ _el ]; + for (var i = 0; i < els.length; i++) { + fn(els[i]); + } + }; + + this.overrideDrop = function(_el, targetGroup) { + return dropOverride && (revert || prune || orphan); + }; + + this.add = function(_el, doNotFireEvent/*, sourceGroup*/) { + var dragArea = getDragArea(); + _each(_el, function(__el) { + + if (__el._jsPlumbGroup != null) { + if (__el._jsPlumbGroup === self) { + return; + } else { + __el._jsPlumbGroup.remove(__el, true, doNotFireEvent, false); + } + } + + __el._jsPlumbGroup = self; + elements.push(__el); + // test if draggable and add handlers if so. + if (_jsPlumb.isAlreadyDraggable(__el)) { + _bindDragHandlers(__el); + } + + if (__el.parentNode !== dragArea) { + dragArea.appendChild(__el); + } + + // if (!doNotFireEvent) { + // var p = {group: self, el: __el}; + // if (sourceGroup) { + // p.sourceGroup = sourceGroup; + // } + // //_jsPlumb.fire(EVT_CHILD_ADDED, p); + // } + }); + + _jsPlumb.getGroupManager().updateConnectionsForGroup(self); + }; + + this.remove = function(el, manipulateDOM, doNotFireEvent, doNotUpdateConnections, targetGroup) { + + _each(el, function(__el) { + if (__el._jsPlumbGroup === self) { + delete __el._jsPlumbGroup; + _ju.removeWithFunction(elements, function (e) { + return e === __el; + }); + + + if (manipulateDOM) { + try { + self.getDragArea().removeChild(__el); + } catch (e) { + jsPlumbUtil.log("Could not remove element from Group " + e); + } + } + _unbindDragHandlers(__el); + + if (!doNotFireEvent) { + var p = {group: self, el: __el}; + if (targetGroup) { + p.targetGroup = targetGroup; + } + _jsPlumb.fire(EVT_CHILD_REMOVED, p); + } + } + }); + if (!doNotUpdateConnections) { + _jsPlumb.getGroupManager().updateConnectionsForGroup(self); + } + }; + this.removeAll = function(manipulateDOM, doNotFireEvent) { + for (var i = 0, l = elements.length; i < l; i++) { + var el = elements[0]; + self.remove(el, manipulateDOM, doNotFireEvent, true); + _jsPlumb.remove(el, true); + } + elements.length = 0; + _jsPlumb.getGroupManager().updateConnectionsForGroup(self); + }; + this.orphanAll = function() { + var orphanedPositions = {}; + for (var i = 0; i < elements.length; i++) { + var newPosition = _orphan(elements[i]); + orphanedPositions[newPosition[0]] = newPosition[1]; + } + elements.length = 0; + + return orphanedPositions; + }; + this.getMembers = function() { return elements; }; + + el[GROUP] = this; + + _jsPlumb.bind(ELEMENT_DRAGGABLE_EVENT, function(dragParams) { + // if its for the current group, + if (dragParams.el._jsPlumbGroup === this) { + _bindDragHandlers(dragParams.el); + } + }.bind(this)); + + function _findParent(_el) { + return _el.offsetParent; + } + + function _isInsideParent(_el, pos) { + var p = _findParent(_el), + s = _jsPlumb.getSize(p), + ss = _jsPlumb.getSize(_el), + leftEdge = pos[0], + rightEdge = leftEdge + ss[0], + topEdge = pos[1], + bottomEdge = topEdge + ss[1]; + + return rightEdge > 0 && leftEdge < s[0] && bottomEdge > 0 && topEdge < s[1]; + } + + // + // orphaning an element means taking it out of the group and adding it to the main jsplumb container. + // we return the new calculated position from this method and the element's id. + // + function _orphan(_el) { + var id = _jsPlumb.getId(_el); + var pos = _jsPlumb.getOffset(_el); + _el.parentNode.removeChild(_el); + _jsPlumb.getContainer().appendChild(_el); + _jsPlumb.setPosition(_el, pos); + _unbindDragHandlers(_el); + _jsPlumb.dragManager.clearParent(_el, id); + return [id, pos]; + } + + // + // remove an element from the group, then either prune it from the jsplumb instance, or just orphan it. + // + function _pruneOrOrphan(p) { + + var out = []; + + function _one(el, left, top) { + var orphanedPosition = null; + if (!_isInsideParent(el, [left, top])) { + var group = el._jsPlumbGroup; + if (prune) { + _jsPlumb.remove(el); + } else { + orphanedPosition = _orphan(el); + } + + group.remove(el); + } + + return orphanedPosition; + } + + for (var i = 0; i < p.selection.length; i++) { + out.push(_one(p.selection[i][0], p.selection[i][1].left, p.selection[i][1].top)); + } + + return out.length === 1 ? out[0] : out; + + } + + // + // redraws the element + // + function _revalidate(_el) { + var id = _jsPlumb.getId(_el); + _jsPlumb.revalidate(_el); + _jsPlumb.dragManager.revalidateParent(_el, id); + } + + // + // unbind the group specific drag/revert handlers. + // + function _unbindDragHandlers(_el) { + if (!_el._katavorioDrag) { + return; + } + if (prune || orphan) { + _el._katavorioDrag.off(STOP, _pruneOrOrphan); + } + if (!prune && !orphan && revert) { + _el._katavorioDrag.off(REVERT, _revalidate); + _el._katavorioDrag.setRevert(null); + } + } + + function _bindDragHandlers(_el) { + if (!_el._katavorioDrag) { + return; + } + if (prune || orphan) { + _el._katavorioDrag.on(STOP, _pruneOrOrphan); + } + + if (constrain) { + _el._katavorioDrag.setConstrain(true); + } + + if (ghost) { + _el._katavorioDrag.setUseGhostProxy(true); + } + + if (!prune && !orphan && revert) { + _el._katavorioDrag.on(REVERT, _revalidate); + _el._katavorioDrag.setRevert(function(__el, pos) { + return !_isInsideParent(__el, pos); + }); + } + } + + this.shouldProxy = function() { + return proxied; + }; + + _jsPlumb.getGroupManager().addGroup(this); + }; + + /** + * Adds a group to the jsPlumb instance. + * @method addGroup + * @param {Object} params + * @return {Group} The newly created Group. + */ + _jpi.prototype.addGroup = function(params) { + var j = this; + j._groups = j._groups || {}; + if (j._groups[params.id] != null) { + throw new TypeError("cannot create Group [" + params.id + "]; a Group with that ID exists"); + } + if (params.el[GROUP] != null) { + throw new TypeError("cannot create Group [" + params.id + "]; the given element is already a Group"); + } + var group = new Group(j, params); + j._groups[group.id] = group; + if (params.collapsed) { + this.collapseGroup(group); + } + return group; + }; + + /** + * Add an element to a group. + * @method addToGroup + * @param {String} group Group, or ID of the group, to add the element to. + * @param {Element} el Element to add to the group. + */ + _jpi.prototype.addToGroup = function(group, el, doNotFireEvent) { + + var _one = function(_el) { + var id = this.getId(_el); + this.manage(id, _el); + this.getGroupManager().addToGroup(group, _el, doNotFireEvent); + }.bind(this); + + if (Array.isArray(el)) { + for (var i = 0; i < el.length; i++) { + _one(el[i]); + } + } else { + _one(el); + } + }; + + /** + * Remove an element from a group, and sets its DOM element to be a child of the container again. ?? + * @method removeFromGroup + * @param {String} group Group, or ID of the group, to remove the element from. + * @param {Element} el Element to add to the group. + */ + _jpi.prototype.removeFromGroup = function(group, el, doNotFireEvent) { + this.getGroupManager().removeFromGroup(group, el, doNotFireEvent); + this.getContainer().appendChild(el); + }; + + /** + * Remove a group, and optionally remove its members from the jsPlumb instance. + * @method removeGroup + * @param {String|Group} group Group to delete, or ID of Group to delete. + * @param {Boolean} [deleteMembers=false] If true, group members will be removed along with the group. Otherwise they will + * just be 'orphaned' (returned to the main container). + * @returns {Map[String, Position}} When deleteMembers is false, this method returns a map of {id->position} + */ + _jpi.prototype.removeGroup = function(group, deleteMembers, manipulateDOM, doNotFireEvent) { + return this.getGroupManager().removeGroup(group, deleteMembers, manipulateDOM, doNotFireEvent); + }; + + /** + * Remove all groups, and optionally remove their members from the jsPlumb instance. + * @method removeAllGroup + * @param {Boolean} [deleteMembers=false] If true, group members will be removed along with the groups. Otherwise they will + * just be 'orphaned' (returned to the main container). + */ + _jpi.prototype.removeAllGroups = function(deleteMembers, manipulateDOM, doNotFireEvent) { + this.getGroupManager().removeAllGroups(deleteMembers, manipulateDOM, doNotFireEvent); + }; + + /** + * Get a Group + * @method getGroup + * @param {String} groupId ID of the group to get + * @return {Group} Group with the given ID, null if not found. + */ + _jpi.prototype.getGroup = function(groupId) { + return this.getGroupManager().getGroup(groupId); + }; + + /** + * Gets all the Groups managed by the jsPlumb instance. + * @returns {Group[]} List of Groups. Empty if none. + */ + _jpi.prototype.getGroups = function() { + return this.getGroupManager().getGroups(); + }; + + /** + * Expands a group element. jsPlumb doesn't do "everything" for you here, because what it means to expand a Group + * will vary from application to application. jsPlumb does these things: + * + * - Hides any connections that are internal to the group (connections between members, and connections from member of + * the group to the group itself) + * - Proxies all connections for which the source or target is a member of the group. + * - Hides the proxied connections. + * - Adds the jtk-group-expanded class to the group's element + * - Removes the jtk-group-collapsed class from the group's element. + * + * @method expandGroup + * @param {String|Group} group Group to expand, or ID of Group to expand. + */ + _jpi.prototype.expandGroup = function(group) { + this.getGroupManager().expandGroup(group); + }; + + /** + * Collapses a group element. jsPlumb doesn't do "everything" for you here, because what it means to collapse a Group + * will vary from application to application. jsPlumb does these things: + * + * - Shows any connections that are internal to the group (connections between members, and connections from member of + * the group to the group itself) + * - Removes proxies for all connections for which the source or target is a member of the group. + * - Shows the previously proxied connections. + * - Adds the jtk-group-collapsed class to the group's element + * - Removes the jtk-group-expanded class from the group's element. + * + * @method expandGroup + * @param {String|Group} group Group to expand, or ID of Group to expand. + */ + _jpi.prototype.collapseGroup = function(groupId) { + this.getGroupManager().collapseGroup(groupId); + }; + + + _jpi.prototype.repaintGroup = function(group) { + this.getGroupManager().repaintGroup(group); + }; + + /** + * Collapses or expands a group element depending on its current state. See notes in the collapseGroup and expandGroup method. + * + * @method toggleGroup + * @param {String|Group} group Group to expand/collapse, or ID of Group to expand/collapse. + */ + _jpi.prototype.toggleGroup = function(group) { + group = this.getGroupManager().getGroup(group); + if (group != null) { + this.getGroupManager()[group.collapsed ? "expandGroup" : "collapseGroup"](group); + } + }; + + // + // lazy init a group manager for the given jsplumb instance. + // + _jpi.prototype.getGroupManager = function() { + var mgr = this[GROUP_MANAGER]; + if (mgr == null) { + mgr = this[GROUP_MANAGER] = new GroupManager(this); + } + return mgr; + }; + + _jpi.prototype.removeGroupManager = function() { + delete this[GROUP_MANAGER]; + }; + + /** + * Gets the Group that the given element belongs to, null if none. + * @method getGroupFor + * @param {String|Element} el Element, or element ID. + * @returns {Group} A Group, if found, or null. + */ + _jpi.prototype.getGroupFor = function(el) { + el = this.getElement(el); + if (el) { + var c = this.getContainer(); + var abort = false, g = null, child = null; + while (!abort) { + if (el == null || el === c) { + abort = true; + } else { + if (el[GROUP]) { + g = el[GROUP]; + child = el; + abort = true; + } else { + el = el.parentNode; + } + } + } + return g; + } + }; + +}).call(typeof window !== 'undefined' ? window : this); + + +/* + * This file contains the 'flowchart' connectors, consisting of vertical and horizontal line segments. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + var STRAIGHT = "Straight"; + var ARC = "Arc"; + + var Flowchart = function (params) { + this.type = "Flowchart"; + params = params || {}; + params.stub = params.stub == null ? 30 : params.stub; + var segments, + _super = _jp.Connectors.AbstractConnector.apply(this, arguments), + midpoint = params.midpoint == null ? 0.5 : params.midpoint, + alwaysRespectStubs = params.alwaysRespectStubs === true, + lastx = null, lasty = null, lastOrientation, + cornerRadius = params.cornerRadius != null ? params.cornerRadius : 0, + + // TODO now common between this and AbstractBezierEditor; refactor into superclass? + loopbackRadius = params.loopbackRadius || 25, + isLoopbackCurrently = false, + + sgn = function (n) { + return n < 0 ? -1 : n === 0 ? 0 : 1; + }, + segmentDirections = function(segment) { + return [ + sgn( segment[2] - segment[0] ), + sgn( segment[3] - segment[1] ) + ]; + }, + /** + * helper method to add a segment. + */ + addSegment = function (segments, x, y, paintInfo) { + if (lastx === x && lasty === y) { + return; + } + var lx = lastx == null ? paintInfo.sx : lastx, + ly = lasty == null ? paintInfo.sy : lasty, + o = lx === x ? "v" : "h"; + + lastx = x; + lasty = y; + segments.push([ lx, ly, x, y, o ]); + }, + segLength = function (s) { + return Math.sqrt(Math.pow(s[0] - s[2], 2) + Math.pow(s[1] - s[3], 2)); + }, + _cloneArray = function (a) { + var _a = []; + _a.push.apply(_a, a); + return _a; + }, + writeSegments = function (conn, segments, paintInfo) { + var current = null, next, currentDirection, nextDirection; + for (var i = 0; i < segments.length - 1; i++) { + + current = current || _cloneArray(segments[i]); + next = _cloneArray(segments[i + 1]); + + currentDirection = segmentDirections(current); + nextDirection = segmentDirections(next); + + if (cornerRadius > 0 && current[4] !== next[4]) { + + var minSegLength = Math.min(segLength(current), segLength(next)); + var radiusToUse = Math.min(cornerRadius, minSegLength / 2); + + current[2] -= currentDirection[0] * radiusToUse; + current[3] -= currentDirection[1] * radiusToUse; + next[0] += nextDirection[0] * radiusToUse; + next[1] += nextDirection[1] * radiusToUse; + + var ac = (currentDirection[1] === nextDirection[0] && nextDirection[0] === 1) || + ((currentDirection[1] === nextDirection[0] && nextDirection[0] === 0) && currentDirection[0] !== nextDirection[1]) || + (currentDirection[1] === nextDirection[0] && nextDirection[0] === -1), + sgny = next[1] > current[3] ? 1 : -1, + sgnx = next[0] > current[2] ? 1 : -1, + sgnEqual = sgny === sgnx, + cx = (sgnEqual && ac || (!sgnEqual && !ac)) ? next[0] : current[2], + cy = (sgnEqual && ac || (!sgnEqual && !ac)) ? current[3] : next[1]; + + _super.addSegment(conn, STRAIGHT, { + x1: current[0], y1: current[1], x2: current[2], y2: current[3] + }); + + _super.addSegment(conn, ARC, { + r: radiusToUse, + x1: current[2], + y1: current[3], + x2: next[0], + y2: next[1], + cx: cx, + cy: cy, + ac: ac + }); + } + else { + // dx + dy are used to adjust for line width. + var dx = (current[2] === current[0]) ? 0 : (current[2] > current[0]) ? (paintInfo.lw / 2) : -(paintInfo.lw / 2), + dy = (current[3] === current[1]) ? 0 : (current[3] > current[1]) ? (paintInfo.lw / 2) : -(paintInfo.lw / 2); + + _super.addSegment(conn, STRAIGHT, { + x1: current[0] - dx, y1: current[1] - dy, x2: current[2] + dx, y2: current[3] + dy + }); + } + current = next; + } + if (next != null) { + // last segment + _super.addSegment(conn, STRAIGHT, { + x1: next[0], y1: next[1], x2: next[2], y2: next[3] + }); + } + }; + + this._compute = function (paintInfo, params) { + + segments = []; + lastx = null; + lasty = null; + lastOrientation = null; + + var commonStubCalculator = function () { + return [paintInfo.startStubX, paintInfo.startStubY, paintInfo.endStubX, paintInfo.endStubY]; + }, + stubCalculators = { + perpendicular: commonStubCalculator, + orthogonal: commonStubCalculator, + opposite: function (axis) { + var pi = paintInfo, + idx = axis === "x" ? 0 : 1, + areInProximity = { + "x": function () { + return ( (pi.so[idx] === 1 && ( + ( (pi.startStubX > pi.endStubX) && (pi.tx > pi.startStubX) ) || + ( (pi.sx > pi.endStubX) && (pi.tx > pi.sx))))) || + + ( (pi.so[idx] === -1 && ( + ( (pi.startStubX < pi.endStubX) && (pi.tx < pi.startStubX) ) || + ( (pi.sx < pi.endStubX) && (pi.tx < pi.sx))))); + }, + "y": function () { + return ( (pi.so[idx] === 1 && ( + ( (pi.startStubY > pi.endStubY) && (pi.ty > pi.startStubY) ) || + ( (pi.sy > pi.endStubY) && (pi.ty > pi.sy))))) || + + ( (pi.so[idx] === -1 && ( + ( (pi.startStubY < pi.endStubY) && (pi.ty < pi.startStubY) ) || + ( (pi.sy < pi.endStubY) && (pi.ty < pi.sy))))); + } + }; + + if (!alwaysRespectStubs && areInProximity[axis]()) { + return { + "x": [(paintInfo.sx + paintInfo.tx) / 2, paintInfo.startStubY, (paintInfo.sx + paintInfo.tx) / 2, paintInfo.endStubY], + "y": [paintInfo.startStubX, (paintInfo.sy + paintInfo.ty) / 2, paintInfo.endStubX, (paintInfo.sy + paintInfo.ty) / 2] + }[axis]; + } + else { + return [paintInfo.startStubX, paintInfo.startStubY, paintInfo.endStubX, paintInfo.endStubY]; + } + } + }; + + // calculate Stubs. + var stubs = stubCalculators[paintInfo.anchorOrientation](paintInfo.sourceAxis), + idx = paintInfo.sourceAxis === "x" ? 0 : 1, + oidx = paintInfo.sourceAxis === "x" ? 1 : 0, + ss = stubs[idx], + oss = stubs[oidx], + es = stubs[idx + 2], + oes = stubs[oidx + 2]; + + // add the start stub segment. use stubs for loopback as it will look better, with the loop spaced + // away from the element. + addSegment(segments, stubs[0], stubs[1], paintInfo); + + // if its a loopback and we should treat it differently. + // if (false && params.sourcePos[0] === params.targetPos[0] && params.sourcePos[1] === params.targetPos[1]) { + // + // // we use loopbackRadius here, as statemachine connectors do. + // // so we go radius to the left from stubs[0], then upwards by 2*radius, to the right by 2*radius, + // // down by 2*radius, left by radius. + // addSegment(segments, stubs[0] - loopbackRadius, stubs[1], paintInfo); + // addSegment(segments, stubs[0] - loopbackRadius, stubs[1] - (2 * loopbackRadius), paintInfo); + // addSegment(segments, stubs[0] + loopbackRadius, stubs[1] - (2 * loopbackRadius), paintInfo); + // addSegment(segments, stubs[0] + loopbackRadius, stubs[1], paintInfo); + // addSegment(segments, stubs[0], stubs[1], paintInfo); + // + // } + // else { + + + var midx = paintInfo.startStubX + ((paintInfo.endStubX - paintInfo.startStubX) * midpoint), + midy = paintInfo.startStubY + ((paintInfo.endStubY - paintInfo.startStubY) * midpoint); + + var orientations = {x: [0, 1], y: [1, 0]}, + lineCalculators = { + perpendicular: function (axis) { + var pi = paintInfo, + sis = { + x: [ + [[1, 2, 3, 4], null, [2, 1, 4, 3]], + null, + [[4, 3, 2, 1], null, [3, 4, 1, 2]] + ], + y: [ + [[3, 2, 1, 4], null, [2, 3, 4, 1]], + null, + [[4, 1, 2, 3], null, [1, 4, 3, 2]] + ] + }, + stubs = { + x: [[pi.startStubX, pi.endStubX], null, [pi.endStubX, pi.startStubX]], + y: [[pi.startStubY, pi.endStubY], null, [pi.endStubY, pi.startStubY]] + }, + midLines = { + x: [[midx, pi.startStubY], [midx, pi.endStubY]], + y: [[pi.startStubX, midy], [pi.endStubX, midy]] + }, + linesToEnd = { + x: [[pi.endStubX, pi.startStubY]], + y: [[pi.startStubX, pi.endStubY]] + }, + startToEnd = { + x: [[pi.startStubX, pi.endStubY], [pi.endStubX, pi.endStubY]], + y: [[pi.endStubX, pi.startStubY], [pi.endStubX, pi.endStubY]] + }, + startToMidToEnd = { + x: [[pi.startStubX, midy], [pi.endStubX, midy], [pi.endStubX, pi.endStubY]], + y: [[midx, pi.startStubY], [midx, pi.endStubY], [pi.endStubX, pi.endStubY]] + }, + otherStubs = { + x: [pi.startStubY, pi.endStubY], + y: [pi.startStubX, pi.endStubX] + }, + soIdx = orientations[axis][0], toIdx = orientations[axis][1], + _so = pi.so[soIdx] + 1, + _to = pi.to[toIdx] + 1, + otherFlipped = (pi.to[toIdx] === -1 && (otherStubs[axis][1] < otherStubs[axis][0])) || (pi.to[toIdx] === 1 && (otherStubs[axis][1] > otherStubs[axis][0])), + stub1 = stubs[axis][_so][0], + stub2 = stubs[axis][_so][1], + segmentIndexes = sis[axis][_so][_to]; + + if (pi.segment === segmentIndexes[3] || (pi.segment === segmentIndexes[2] && otherFlipped)) { + return midLines[axis]; + } + else if (pi.segment === segmentIndexes[2] && stub2 < stub1) { + return linesToEnd[axis]; + } + else if ((pi.segment === segmentIndexes[2] && stub2 >= stub1) || (pi.segment === segmentIndexes[1] && !otherFlipped)) { + return startToMidToEnd[axis]; + } + else if (pi.segment === segmentIndexes[0] || (pi.segment === segmentIndexes[1] && otherFlipped)) { + return startToEnd[axis]; + } + }, + orthogonal: function (axis, startStub, otherStartStub, endStub, otherEndStub) { + var pi = paintInfo, + extent = { + "x": pi.so[0] === -1 ? Math.min(startStub, endStub) : Math.max(startStub, endStub), + "y": pi.so[1] === -1 ? Math.min(startStub, endStub) : Math.max(startStub, endStub) + }[axis]; + + return { + "x": [ + [extent, otherStartStub], + [extent, otherEndStub], + [endStub, otherEndStub] + ], + "y": [ + [otherStartStub, extent], + [otherEndStub, extent], + [otherEndStub, endStub] + ] + }[axis]; + }, + opposite: function (axis, ss, oss, es) { + var pi = paintInfo, + otherAxis = {"x": "y", "y": "x"}[axis], + dim = {"x": "height", "y": "width"}[axis], + comparator = pi["is" + axis.toUpperCase() + "GreaterThanStubTimes2"]; + + if (params.sourceEndpoint.elementId === params.targetEndpoint.elementId) { + var _val = oss + ((1 - params.sourceEndpoint.anchor[otherAxis]) * params.sourceInfo[dim]) + _super.maxStub; + return { + "x": [ + [ss, _val], + [es, _val] + ], + "y": [ + [_val, ss], + [_val, es] + ] + }[axis]; + + } + else if (!comparator || (pi.so[idx] === 1 && ss > es) || (pi.so[idx] === -1 && ss < es)) { + return { + "x": [ + [ss, midy], + [es, midy] + ], + "y": [ + [midx, ss], + [midx, es] + ] + }[axis]; + } + else if ((pi.so[idx] === 1 && ss < es) || (pi.so[idx] === -1 && ss > es)) { + return { + "x": [ + [midx, pi.sy], + [midx, pi.ty] + ], + "y": [ + [pi.sx, midy], + [pi.tx, midy] + ] + }[axis]; + } + } + }; + + // compute the rest of the line + var p = lineCalculators[paintInfo.anchorOrientation](paintInfo.sourceAxis, ss, oss, es, oes); + if (p) { + for (var i = 0; i < p.length; i++) { + addSegment(segments, p[i][0], p[i][1], paintInfo); + } + } + + // line to end stub + addSegment(segments, stubs[2], stubs[3], paintInfo); + + //} + + // end stub to end (common) + addSegment(segments, paintInfo.tx, paintInfo.ty, paintInfo); + + + + // write out the segments. + writeSegments(this, segments, paintInfo); + + }; + }; + + _jp.Connectors.Flowchart = Flowchart; + _ju.extend(_jp.Connectors.Flowchart, _jp.Connectors.AbstractConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the code for the Bezier connector type. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + _jp.Connectors.AbstractBezierConnector = function(params) { + params = params || {}; + var showLoopback = params.showLoopback !== false, + curviness = params.curviness || 10, + margin = params.margin || 5, + proximityLimit = params.proximityLimit || 80, + clockwise = params.orientation && params.orientation === "clockwise", + loopbackRadius = params.loopbackRadius || 25, + isLoopbackCurrently = false, + _super; + + this._compute = function (paintInfo, p) { + + var sp = p.sourcePos, + tp = p.targetPos, + _w = Math.abs(sp[0] - tp[0]), + _h = Math.abs(sp[1] - tp[1]); + + if (!showLoopback || (p.sourceEndpoint.elementId !== p.targetEndpoint.elementId)) { + isLoopbackCurrently = false; + this._computeBezier(paintInfo, p, sp, tp, _w, _h); + } else { + isLoopbackCurrently = true; + // a loopback connector. draw an arc from one anchor to the other. + var x1 = p.sourcePos[0], y1 = p.sourcePos[1] - margin, + cx = x1, cy = y1 - loopbackRadius, + // canvas sizing stuff, to ensure the whole painted area is visible. + _x = cx - loopbackRadius, + _y = cy - loopbackRadius; + + _w = 2 * loopbackRadius; + _h = 2 * loopbackRadius; + + paintInfo.points[0] = _x; + paintInfo.points[1] = _y; + paintInfo.points[2] = _w; + paintInfo.points[3] = _h; + + // ADD AN ARC SEGMENT. + _super.addSegment(this, "Arc", { + loopback: true, + x1: (x1 - _x) + 4, + y1: y1 - _y, + startAngle: 0, + endAngle: 2 * Math.PI, + r: loopbackRadius, + ac: !clockwise, + x2: (x1 - _x) - 4, + y2: y1 - _y, + cx: cx - _x, + cy: cy - _y + }); + } + }; + + _super = _jp.Connectors.AbstractConnector.apply(this, arguments); + return _super; + }; + _ju.extend(_jp.Connectors.AbstractBezierConnector, _jp.Connectors.AbstractConnector); + + var Bezier = function (params) { + params = params || {}; + this.type = "Bezier"; + + var _super = _jp.Connectors.AbstractBezierConnector.apply(this, arguments), + majorAnchor = params.curviness || 150, + minorAnchor = 10; + + this.getCurviness = function () { + return majorAnchor; + }; + + this._findControlPoint = function (point, sourceAnchorPosition, targetAnchorPosition, sourceEndpoint, targetEndpoint, soo, too) { + // determine if the two anchors are perpendicular to each other in their orientation. we swap the control + // points around if so (code could be tightened up) + var perpendicular = soo[0] !== too[0] || soo[1] === too[1], + p = []; + + if (!perpendicular) { + if (soo[0] === 0) { + p.push(sourceAnchorPosition[0] < targetAnchorPosition[0] ? point[0] + minorAnchor : point[0] - minorAnchor); + } + else { + p.push(point[0] - (majorAnchor * soo[0])); + } + + if (soo[1] === 0) { + p.push(sourceAnchorPosition[1] < targetAnchorPosition[1] ? point[1] + minorAnchor : point[1] - minorAnchor); + } + else { + p.push(point[1] + (majorAnchor * too[1])); + } + } + else { + if (too[0] === 0) { + p.push(targetAnchorPosition[0] < sourceAnchorPosition[0] ? point[0] + minorAnchor : point[0] - minorAnchor); + } + else { + p.push(point[0] + (majorAnchor * too[0])); + } + + if (too[1] === 0) { + p.push(targetAnchorPosition[1] < sourceAnchorPosition[1] ? point[1] + minorAnchor : point[1] - minorAnchor); + } + else { + p.push(point[1] + (majorAnchor * soo[1])); + } + } + + return p; + }; + + this._computeBezier = function (paintInfo, p, sp, tp, _w, _h) { + + var _CP, _CP2, + _sx = sp[0] < tp[0] ? _w : 0, + _sy = sp[1] < tp[1] ? _h : 0, + _tx = sp[0] < tp[0] ? 0 : _w, + _ty = sp[1] < tp[1] ? 0 : _h; + + _CP = this._findControlPoint([_sx, _sy], sp, tp, p.sourceEndpoint, p.targetEndpoint, paintInfo.so, paintInfo.to); + _CP2 = this._findControlPoint([_tx, _ty], tp, sp, p.targetEndpoint, p.sourceEndpoint, paintInfo.to, paintInfo.so); + + + _super.addSegment(this, "Bezier", { + x1: _sx, y1: _sy, x2: _tx, y2: _ty, + cp1x: _CP[0], cp1y: _CP[1], cp2x: _CP2[0], cp2y: _CP2[1] + }); + }; + + + }; + + _jp.Connectors.Bezier = Bezier; + _ju.extend(Bezier, _jp.Connectors.AbstractBezierConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the state machine connectors, which extend AbstractBezierConnector. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + var _segment = function (x1, y1, x2, y2) { + if (x1 <= x2 && y2 <= y1) { + return 1; + } + else if (x1 <= x2 && y1 <= y2) { + return 2; + } + else if (x2 <= x1 && y2 >= y1) { + return 3; + } + return 4; + }, + + // the control point we will use depends on the faces to which each end of the connection is assigned, specifically whether or not the + // two faces are parallel or perpendicular. if they are parallel then the control point lies on the midpoint of the axis in which they + // are parellel and varies only in the other axis; this variation is proportional to the distance that the anchor points lie from the + // center of that face. if the two faces are perpendicular then the control point is at some distance from both the midpoints; the amount and + // direction are dependent on the orientation of the two elements. 'seg', passed in to this method, tells you which segment the target element + // lies in with respect to the source: 1 is top right, 2 is bottom right, 3 is bottom left, 4 is top left. + // + // sourcePos and targetPos are arrays of info about where on the source and target each anchor is located. their contents are: + // + // 0 - absolute x + // 1 - absolute y + // 2 - proportional x in element (0 is left edge, 1 is right edge) + // 3 - proportional y in element (0 is top edge, 1 is bottom edge) + // + _findControlPoint = function (midx, midy, segment, sourceEdge, targetEdge, dx, dy, distance, proximityLimit) { + // TODO (maybe) + // - if anchor pos is 0.5, make the control point take into account the relative position of the elements. + if (distance <= proximityLimit) { + return [midx, midy]; + } + + if (segment === 1) { + if (sourceEdge[3] <= 0 && targetEdge[3] >= 1) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] >= 1 && targetEdge[2] <= 0) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + (-1 * dx) , midy + (-1 * dy) ]; + } + } + else if (segment === 2) { + if (sourceEdge[3] >= 1 && targetEdge[3] <= 0) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] >= 1 && targetEdge[2] <= 0) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + dx, midy + (-1 * dy) ]; + } + } + else if (segment === 3) { + if (sourceEdge[3] >= 1 && targetEdge[3] <= 0) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] <= 0 && targetEdge[2] >= 1) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + (-1 * dx) , midy + (-1 * dy) ]; + } + } + else if (segment === 4) { + if (sourceEdge[3] <= 0 && targetEdge[3] >= 1) { + return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + } + else if (sourceEdge[2] <= 0 && targetEdge[2] >= 1) { + return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + } + else { + return [ midx + dx , midy + (-1 * dy) ]; + } + } + + }; + + var StateMachine = function (params) { + params = params || {}; + this.type = "StateMachine"; + + var _super = _jp.Connectors.AbstractBezierConnector.apply(this, arguments), + curviness = params.curviness || 10, + margin = params.margin || 5, + proximityLimit = params.proximityLimit || 80, + clockwise = params.orientation && params.orientation === "clockwise", + _controlPoint; + + this._computeBezier = function(paintInfo, params, sp, tp, w, h) { + var _sx = params.sourcePos[0] < params.targetPos[0] ? 0 : w, + _sy = params.sourcePos[1] < params.targetPos[1] ? 0 : h, + _tx = params.sourcePos[0] < params.targetPos[0] ? w : 0, + _ty = params.sourcePos[1] < params.targetPos[1] ? h : 0; + + // now adjust for the margin + if (params.sourcePos[2] === 0) { + _sx -= margin; + } + if (params.sourcePos[2] === 1) { + _sx += margin; + } + if (params.sourcePos[3] === 0) { + _sy -= margin; + } + if (params.sourcePos[3] === 1) { + _sy += margin; + } + if (params.targetPos[2] === 0) { + _tx -= margin; + } + if (params.targetPos[2] === 1) { + _tx += margin; + } + if (params.targetPos[3] === 0) { + _ty -= margin; + } + if (params.targetPos[3] === 1) { + _ty += margin; + } + + // + // these connectors are quadratic bezier curves, having a single control point. if both anchors + // are located at 0.5 on their respective faces, the control point is set to the midpoint and you + // get a straight line. this is also the case if the two anchors are within 'proximityLimit', since + // it seems to make good aesthetic sense to do that. outside of that, the control point is positioned + // at 'curviness' pixels away along the normal to the straight line connecting the two anchors. + // + // there may be two improvements to this. firstly, we might actually support the notion of avoiding nodes + // in the UI, or at least making a good effort at doing so. if a connection would pass underneath some node, + // for example, we might increase the distance the control point is away from the midpoint in a bid to + // steer it around that node. this will work within limits, but i think those limits would also be the likely + // limits for, once again, aesthetic good sense in the layout of a chart using these connectors. + // + // the second possible change is actually two possible changes: firstly, it is possible we should gradually + // decrease the 'curviness' as the distance between the anchors decreases; start tailing it off to 0 at some + // point (which should be configurable). secondly, we might slightly increase the 'curviness' for connectors + // with respect to how far their anchor is from the center of its respective face. this could either look cool, + // or stupid, and may indeed work only in a way that is so subtle as to have been a waste of time. + // + + var _midx = (_sx + _tx) / 2, + _midy = (_sy + _ty) / 2, + segment = _segment(_sx, _sy, _tx, _ty), + distance = Math.sqrt(Math.pow(_tx - _sx, 2) + Math.pow(_ty - _sy, 2)), + cp1x, cp2x, cp1y, cp2y; + + + // calculate the control point. this code will be where we'll put in a rudimentary element avoidance scheme; it + // will work by extending the control point to force the curve to be, um, curvier. + _controlPoint = _findControlPoint(_midx, + _midy, + segment, + params.sourcePos, + params.targetPos, + curviness, curviness, + distance, + proximityLimit); + + cp1x = _controlPoint[0]; + cp2x = _controlPoint[0]; + cp1y = _controlPoint[1]; + cp2y = _controlPoint[1]; + + _super.addSegment(this, "Bezier", { + x1: _tx, y1: _ty, x2: _sx, y2: _sy, + cp1x: cp1x, cp1y: cp1y, + cp2x: cp2x, cp2y: cp2y + }); + }; + }; + + _jp.Connectors.StateMachine = StateMachine; + _ju.extend(StateMachine, _jp.Connectors.AbstractBezierConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the 'flowchart' connectors, consisting of vertical and horizontal line segments. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + var STRAIGHT = "Straight"; + + var Straight = function (params) { + this.type = STRAIGHT; + var _super = _jp.Connectors.AbstractConnector.apply(this, arguments); + + this._compute = function (paintInfo, _) { + _super.addSegment(this, STRAIGHT, {x1: paintInfo.sx, y1: paintInfo.sy, x2: paintInfo.startStubX, y2: paintInfo.startStubY}); + _super.addSegment(this, STRAIGHT, {x1: paintInfo.startStubX, y1: paintInfo.startStubY, x2: paintInfo.endStubX, y2: paintInfo.endStubY}); + _super.addSegment(this, STRAIGHT, {x1: paintInfo.endStubX, y1: paintInfo.endStubY, x2: paintInfo.tx, y2: paintInfo.ty}); + }; + }; + + _jp.Connectors.Straight = Straight; + _ju.extend(Straight, _jp.Connectors.AbstractConnector); + +}).call(typeof window !== 'undefined' ? window : this); +/* + * This file contains the SVG renderers. + * + * Copyright (c) 2010 - 2018 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + +// ************************** SVG utility methods ******************************************** + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + var svgAttributeMap = { + "stroke-linejoin": "stroke-linejoin", + "stroke-dashoffset": "stroke-dashoffset", + "stroke-linecap": "stroke-linecap" + }, + STROKE_DASHARRAY = "stroke-dasharray", + DASHSTYLE = "dashstyle", + LINEAR_GRADIENT = "linearGradient", + RADIAL_GRADIENT = "radialGradient", + DEFS = "defs", + FILL = "fill", + STOP = "stop", + STROKE = "stroke", + STROKE_WIDTH = "stroke-width", + STYLE = "style", + NONE = "none", + JSPLUMB_GRADIENT = "jsplumb_gradient_", + LINE_WIDTH = "strokeWidth", + ns = { + svg: "http://www.w3.org/2000/svg" + }, + _attr = function (node, attributes) { + for (var i in attributes) { + node.setAttribute(i, "" + attributes[i]); + } + }, + _node = function (name, attributes) { + attributes = attributes || {}; + attributes.version = "1.1"; + attributes.xmlns = ns.svg; + return _jp.createElementNS(ns.svg, name, null, null, attributes); + }, + _pos = function (d) { + return "position:absolute;left:" + d[0] + "px;top:" + d[1] + "px"; + }, + _clearGradient = function (parent) { + var els = parent.querySelectorAll(" defs,linearGradient,radialGradient"); + for (var i = 0; i < els.length; i++) { + els[i].parentNode.removeChild(els[i]); + } + }, + _updateGradient = function (parent, node, style, dimensions, uiComponent) { + var id = JSPLUMB_GRADIENT + uiComponent._jsPlumb.instance.idstamp(); + // first clear out any existing gradient + _clearGradient(parent); + // this checks for an 'offset' property in the gradient, and in the absence of it, assumes + // we want a linear gradient. if it's there, we create a radial gradient. + // it is possible that a more explicit means of defining the gradient type would be + // better. relying on 'offset' means that we can never have a radial gradient that uses + // some default offset, for instance. + // issue 244 suggested the 'gradientUnits' attribute; without this, straight/flowchart connectors with gradients would + // not show gradients when the line was perfectly horizontal or vertical. + var g; + if (!style.gradient.offset) { + g = _node(LINEAR_GRADIENT, {id: id, gradientUnits: "userSpaceOnUse"}); + } + else { + g = _node(RADIAL_GRADIENT, { id: id }); + } + + var defs = _node(DEFS); + parent.appendChild(defs); + defs.appendChild(g); + + // the svg radial gradient seems to treat stops in the reverse + // order to how canvas does it. so we want to keep all the maths the same, but + // iterate the actual style declarations in reverse order, if the x indexes are not in order. + for (var i = 0; i < style.gradient.stops.length; i++) { + var styleToUse = uiComponent.segment === 1 || uiComponent.segment === 2 ? i : style.gradient.stops.length - 1 - i, + stopColor = style.gradient.stops[styleToUse][1], + s = _node(STOP, {"offset": Math.floor(style.gradient.stops[i][0] * 100) + "%", "stop-color": stopColor}); + + g.appendChild(s); + } + var applyGradientTo = style.stroke ? STROKE : FILL; + node.setAttribute(applyGradientTo, "url(#" + id + ")"); + }, + _applyStyles = function (parent, node, style, dimensions, uiComponent) { + + node.setAttribute(FILL, style.fill ? style.fill : NONE); + node.setAttribute(STROKE, style.stroke ? style.stroke : NONE); + + if (style.gradient) { + _updateGradient(parent, node, style, dimensions, uiComponent); + } + else { + // make sure we clear any existing gradient + _clearGradient(parent); + node.setAttribute(STYLE, ""); + } + + if (style.strokeWidth) { + node.setAttribute(STROKE_WIDTH, style.strokeWidth); + } + + // in SVG there is a stroke-dasharray attribute we can set, and its syntax looks like + // the syntax in VML but is actually kind of nasty: values are given in the pixel + // coordinate space, whereas in VML they are multiples of the width of the stroked + // line, which makes a lot more sense. for that reason, jsPlumb is supporting both + // the native svg 'stroke-dasharray' attribute, and also the 'dashstyle' concept from + // VML, which will be the preferred method. the code below this converts a dashstyle + // attribute given in terms of stroke width into a pixel representation, by using the + // stroke's lineWidth. + if (style[DASHSTYLE] && style[LINE_WIDTH] && !style[STROKE_DASHARRAY]) { + var sep = style[DASHSTYLE].indexOf(",") === -1 ? " " : ",", + parts = style[DASHSTYLE].split(sep), + styleToUse = ""; + parts.forEach(function (p) { + styleToUse += (Math.floor(p * style.strokeWidth) + sep); + }); + node.setAttribute(STROKE_DASHARRAY, styleToUse); + } + else if (style[STROKE_DASHARRAY]) { + node.setAttribute(STROKE_DASHARRAY, style[STROKE_DASHARRAY]); + } + + // extra attributes such as join type, dash offset. + for (var i in svgAttributeMap) { + if (style[i]) { + node.setAttribute(svgAttributeMap[i], style[i]); + } + } + }, + _appendAtIndex = function (svg, path, idx) { + if (svg.childNodes.length > idx) { + svg.insertBefore(path, svg.childNodes[idx]); + } + else { + svg.appendChild(path); + } + }; + + /** + utility methods for other objects to use. + */ + _ju.svg = { + node: _node, + attr: _attr, + pos: _pos + }; + + // ************************** / SVG utility methods ******************************************** + + /* + * Base class for SVG components. + */ + var SvgComponent = function (params) { + var pointerEventsSpec = params.pointerEventsSpec || "all", renderer = {}; + + _jp.jsPlumbUIComponent.apply(this, params.originalArgs); + this.canvas = null; + this.path = null; + this.svg = null; + this.bgCanvas = null; + + var clazz = params.cssClass + " " + (params.originalArgs[0].cssClass || ""), + svgParams = { + "style": "", + "width": 0, + "height": 0, + "pointer-events": pointerEventsSpec, + "position": "absolute" + }; + + this.svg = _node("svg", svgParams); + + if (params.useDivWrapper) { + this.canvas = _jp.createElement("div", { position : "absolute" }); + _ju.sizeElement(this.canvas, 0, 0, 1, 1); + this.canvas.className = clazz; + } + else { + _attr(this.svg, { "class": clazz }); + this.canvas = this.svg; + } + + params._jsPlumb.appendElement(this.canvas, params.originalArgs[0].parent); + if (params.useDivWrapper) { + this.canvas.appendChild(this.svg); + } + + var displayElements = [ this.canvas ]; + this.getDisplayElements = function () { + return displayElements; + }; + + this.appendDisplayElement = function (el) { + displayElements.push(el); + }; + + this.paint = function (style, anchor, extents) { + if (style != null) { + + var xy = [ this.x, this.y ], wh = [ this.w, this.h ], p; + if (extents != null) { + if (extents.xmin < 0) { + xy[0] += extents.xmin; + } + if (extents.ymin < 0) { + xy[1] += extents.ymin; + } + wh[0] = extents.xmax + ((extents.xmin < 0) ? -extents.xmin : 0); + wh[1] = extents.ymax + ((extents.ymin < 0) ? -extents.ymin : 0); + } + + if (params.useDivWrapper) { + _ju.sizeElement(this.canvas, xy[0], xy[1], wh[0], wh[1]); + xy[0] = 0; + xy[1] = 0; + p = _pos([ 0, 0 ]); + } + else { + p = _pos([ xy[0], xy[1] ]); + } + + renderer.paint.apply(this, arguments); + + _attr(this.svg, { + "style": p, + "width": wh[0] || 0, + "height": wh[1] || 0 + }); + } + }; + + return { + renderer: renderer + }; + }; + + _ju.extend(SvgComponent, _jp.jsPlumbUIComponent, { + cleanup: function (force) { + if (force || this.typeId == null) { + if (this.canvas) { + this.canvas._jsPlumb = null; + } + if (this.svg) { + this.svg._jsPlumb = null; + } + if (this.bgCanvas) { + this.bgCanvas._jsPlumb = null; + } + + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + if (this.bgCanvas && this.bgCanvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + + this.svg = null; + this.canvas = null; + this.path = null; + this.group = null; + } + else { + // if not a forced cleanup, just detach from DOM for now. + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + if (this.bgCanvas && this.bgCanvas.parentNode) { + this.bgCanvas.parentNode.removeChild(this.bgCanvas); + } + } + }, + reattach:function(instance) { + var c = instance.getContainer(); + if (this.canvas && this.canvas.parentNode == null) { + c.appendChild(this.canvas); + } + if (this.bgCanvas && this.bgCanvas.parentNode == null) { + c.appendChild(this.bgCanvas); + } + }, + setVisible: function (v) { + if (this.canvas) { + this.canvas.style.display = v ? "block" : "none"; + } + } + }); + + /* + * Base class for SVG connectors. + */ + _jp.ConnectorRenderers.svg = function (params) { + var self = this, + _super = SvgComponent.apply(this, [ + { + cssClass: params._jsPlumb.connectorClass, + originalArgs: arguments, + pointerEventsSpec: "none", + _jsPlumb: params._jsPlumb + } + ]); + + _super.renderer.paint = function (style, anchor, extents) { + + var segments = self.getSegments(), p = "", offset = [0, 0]; + if (extents.xmin < 0) { + offset[0] = -extents.xmin; + } + if (extents.ymin < 0) { + offset[1] = -extents.ymin; + } + + if (segments.length > 0) { + + p = self.getPathData(); + + var a = { + d: p, + transform: "translate(" + offset[0] + "," + offset[1] + ")", + "pointer-events": params["pointer-events"] || "visibleStroke" + }, + outlineStyle = null, + d = [self.x, self.y, self.w, self.h]; + + // outline style. actually means drawing an svg object underneath the main one. + if (style.outlineStroke) { + var outlineWidth = style.outlineWidth || 1, + outlineStrokeWidth = style.strokeWidth + (2 * outlineWidth); + outlineStyle = _jp.extend({}, style); + delete outlineStyle.gradient; + outlineStyle.stroke = style.outlineStroke; + outlineStyle.strokeWidth = outlineStrokeWidth; + + if (self.bgPath == null) { + self.bgPath = _node("path", a); + _jp.addClass(self.bgPath, _jp.connectorOutlineClass); + _appendAtIndex(self.svg, self.bgPath, 0); + } + else { + _attr(self.bgPath, a); + } + + _applyStyles(self.svg, self.bgPath, outlineStyle, d, self); + } + + if (self.path == null) { + self.path = _node("path", a); + _appendAtIndex(self.svg, self.path, style.outlineStroke ? 1 : 0); + } + else { + _attr(self.path, a); + } + + _applyStyles(self.svg, self.path, style, d, self); + } + }; + }; + _ju.extend(_jp.ConnectorRenderers.svg, SvgComponent); + +// ******************************* svg segment renderer ***************************************************** + + +// ******************************* /svg segments ***************************************************** + + /* + * Base class for SVG endpoints. + */ + var SvgEndpoint = _jp.SvgEndpoint = function (params) { + var _super = SvgComponent.apply(this, [ + { + cssClass: params._jsPlumb.endpointClass, + originalArgs: arguments, + pointerEventsSpec: "all", + useDivWrapper: true, + _jsPlumb: params._jsPlumb + } + ]); + + _super.renderer.paint = function (style) { + var s = _jp.extend({}, style); + if (s.outlineStroke) { + s.stroke = s.outlineStroke; + } + + if (this.node == null) { + this.node = this.makeNode(s); + this.svg.appendChild(this.node); + } + else if (this.updateNode != null) { + this.updateNode(this.node); + } + _applyStyles(this.svg, this.node, s, [ this.x, this.y, this.w, this.h ], this); + _pos(this.node, [ this.x, this.y ]); + }.bind(this); + + }; + _ju.extend(SvgEndpoint, SvgComponent); + + /* + * SVG Dot Endpoint + */ + _jp.Endpoints.svg.Dot = function () { + _jp.Endpoints.Dot.apply(this, arguments); + SvgEndpoint.apply(this, arguments); + this.makeNode = function (style) { + return _node("circle", { + "cx": this.w / 2, + "cy": this.h / 2, + "r": this.radius + }); + }; + this.updateNode = function (node) { + _attr(node, { + "cx": this.w / 2, + "cy": this.h / 2, + "r": this.radius + }); + }; + }; + _ju.extend(_jp.Endpoints.svg.Dot, [_jp.Endpoints.Dot, SvgEndpoint]); + + /* + * SVG Rectangle Endpoint + */ + _jp.Endpoints.svg.Rectangle = function () { + _jp.Endpoints.Rectangle.apply(this, arguments); + SvgEndpoint.apply(this, arguments); + this.makeNode = function (style) { + return _node("rect", { + "width": this.w, + "height": this.h + }); + }; + this.updateNode = function (node) { + _attr(node, { + "width": this.w, + "height": this.h + }); + }; + }; + _ju.extend(_jp.Endpoints.svg.Rectangle, [_jp.Endpoints.Rectangle, SvgEndpoint]); + + /* + * SVG Image Endpoint is the default image endpoint. + */ + _jp.Endpoints.svg.Image = _jp.Endpoints.Image; + /* + * Blank endpoint in svg renderer is the default Blank endpoint. + */ + _jp.Endpoints.svg.Blank = _jp.Endpoints.Blank; + /* + * Label overlay in svg renderer is the default Label overlay. + */ + _jp.Overlays.svg.Label = _jp.Overlays.Label; + /* + * Custom overlay in svg renderer is the default Custom overlay. + */ + _jp.Overlays.svg.Custom = _jp.Overlays.Custom; + + var AbstractSvgArrowOverlay = function (superclass, originalArgs) { + superclass.apply(this, originalArgs); + _jp.jsPlumbUIComponent.apply(this, originalArgs); + this.isAppendedAtTopLevel = false; + var self = this; + this.path = null; + this.paint = function (params, containerExtents) { + // only draws on connections, not endpoints. + if (params.component.svg && containerExtents) { + if (this.path == null) { + this.path = _node("path", { + "pointer-events": "all" + }); + params.component.svg.appendChild(this.path); + if (this.elementCreated) { + this.elementCreated(this.path, params.component); + } + + this.canvas = params.component.svg; // for the sake of completeness; this behaves the same as other overlays + } + var clazz = originalArgs && (originalArgs.length === 1) ? (originalArgs[0].cssClass || "") : "", + offset = [0, 0]; + + if (containerExtents.xmin < 0) { + offset[0] = -containerExtents.xmin; + } + if (containerExtents.ymin < 0) { + offset[1] = -containerExtents.ymin; + } + + _attr(this.path, { + "d": makePath(params.d), + "class": clazz, + stroke: params.stroke ? params.stroke : null, + fill: params.fill ? params.fill : null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + } + }; + var makePath = function (d) { + return (isNaN(d.cxy.x) || isNaN(d.cxy.y)) ? "" : "M" + d.hxy.x + "," + d.hxy.y + + " L" + d.tail[0].x + "," + d.tail[0].y + + " L" + d.cxy.x + "," + d.cxy.y + + " L" + d.tail[1].x + "," + d.tail[1].y + + " L" + d.hxy.x + "," + d.hxy.y; + }; + this.transfer = function(target) { + if (target.canvas && this.path && this.path.parentNode) { + this.path.parentNode.removeChild(this.path); + target.canvas.appendChild(this.path); + } + }; + }; + + var svgProtoFunctions = { + cleanup : function (force) { + if (this.path != null) { + if (force) { + this._jsPlumb.instance.removeElement(this.path); + } + else { + if (this.path.parentNode) { + this.path.parentNode.removeChild(this.path); + } + } + } + }, reattach :function(instance, component) { + if (this.path && component.canvas) { + component.canvas.appendChild(this.path); + } + }, + setVisible : function (v) { + if (this.path != null) { + (this.path.style.display = (v ? "block" : "none")); + } + } + }; + + _ju.extend(AbstractSvgArrowOverlay, [_jp.jsPlumbUIComponent, _jp.Overlays.AbstractOverlay]); + + _jp.Overlays.svg.Arrow = function () { + AbstractSvgArrowOverlay.apply(this, [_jp.Overlays.Arrow, arguments]); + }; + _ju.extend(_jp.Overlays.svg.Arrow, [ _jp.Overlays.Arrow, AbstractSvgArrowOverlay ], svgProtoFunctions); + + _jp.Overlays.svg.PlainArrow = function () { + AbstractSvgArrowOverlay.apply(this, [_jp.Overlays.PlainArrow, arguments]); + }; + _ju.extend(_jp.Overlays.svg.PlainArrow, [ _jp.Overlays.PlainArrow, AbstractSvgArrowOverlay ], svgProtoFunctions); + + _jp.Overlays.svg.Diamond = function () { + AbstractSvgArrowOverlay.apply(this, [_jp.Overlays.Diamond, arguments]); + }; + _ju.extend(_jp.Overlays.svg.Diamond, [ _jp.Overlays.Diamond, AbstractSvgArrowOverlay ], svgProtoFunctions); + + // a test + _jp.Overlays.svg.GuideLines = function () { + var path = null, self = this, p1_1, p1_2; + _jp.Overlays.GuideLines.apply(this, arguments); + this.paint = function (params, containerExtents) { + if (path == null) { + path = _node("path"); + params.connector.svg.appendChild(path); + self.attachListeners(path, params.connector); + self.attachListeners(path, self); + + p1_1 = _node("path"); + params.connector.svg.appendChild(p1_1); + self.attachListeners(p1_1, params.connector); + self.attachListeners(p1_1, self); + + p1_2 = _node("path"); + params.connector.svg.appendChild(p1_2); + self.attachListeners(p1_2, params.connector); + self.attachListeners(p1_2, self); + } + + var offset = [0, 0]; + if (containerExtents.xmin < 0) { + offset[0] = -containerExtents.xmin; + } + if (containerExtents.ymin < 0) { + offset[1] = -containerExtents.ymin; + } + + _attr(path, { + "d": makePath(params.head, params.tail), + stroke: "red", + fill: null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + + _attr(p1_1, { + "d": makePath(params.tailLine[0], params.tailLine[1]), + stroke: "blue", + fill: null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + + _attr(p1_2, { + "d": makePath(params.headLine[0], params.headLine[1]), + stroke: "green", + fill: null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + }; + + var makePath = function (d1, d2) { + return "M " + d1.x + "," + d1.y + + " L" + d2.x + "," + d2.y; + }; + }; + _ju.extend(_jp.Overlays.svg.GuideLines, _jp.Overlays.GuideLines); +}).call(typeof window !== 'undefined' ? window : this); + +/* + * This file contains code used when jsPlumb is being rendered in a DOM. + * + * Copyright (c) 2010 - 2019 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * https://github.com/jsplumb/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil, + _jk = root.Katavorio, _jg = root.Biltong; + + var _getEventManager = function(instance) { + var e = instance._mottle; + if (!e) { + e = instance._mottle = new root.Mottle(); + } + return e; + }; + + var _getDragManager = function (instance, category) { + + category = category || "main"; + var key = "_katavorio_" + category; + var k = instance[key], + e = instance.getEventManager(); + + if (!k) { + k = new _jk({ + bind: e.on, + unbind: e.off, + getSize: _jp.getSize, + getConstrainingRectangle:function(el) { + return [ el.parentNode.scrollWidth, el.parentNode.scrollHeight ]; + }, + getPosition: function (el, relativeToRoot) { + // if this is a nested draggable then compute the offset against its own offsetParent, otherwise + // compute against the Container's origin. see also the getUIPosition method below. + var o = instance.getOffset(el, relativeToRoot, el._katavorioDrag ? el.offsetParent : null); + return [o.left, o.top]; + }, + setPosition: function (el, xy) { + el.style.left = xy[0] + "px"; + el.style.top = xy[1] + "px"; + }, + addClass: _jp.addClass, + removeClass: _jp.removeClass, + intersects: _jg.intersects, + indexOf: function(l, i) { return l.indexOf(i); }, + scope:instance.getDefaultScope(), + css: { + noSelect: instance.dragSelectClass, + droppable: "jtk-droppable", + draggable: "jtk-draggable", + drag: "jtk-drag", + selected: "jtk-drag-selected", + active: "jtk-drag-active", + hover: "jtk-drag-hover", + ghostProxy:"jtk-ghost-proxy" + } + }); + k.setZoom(instance.getZoom()); + instance[key] = k; + instance.bind("zoom", k.setZoom); + } + return k; + }; + + var _dragStart=function(params) { + var options = params.el._jsPlumbDragOptions; + var cont = true; + if (options.canDrag) { + cont = options.canDrag(); + } + if (cont) { + this.setHoverSuspended(true); + this.select({source: params.el}).addClass(this.elementDraggingClass + " " + this.sourceElementDraggingClass, true); + this.select({target: params.el}).addClass(this.elementDraggingClass + " " + this.targetElementDraggingClass, true); + this.setConnectionBeingDragged(true); + } + return cont; + }; + var _dragMove=function(params) { + var ui = this.getUIPosition(arguments, this.getZoom()); + if (ui != null) { + var o = params.el._jsPlumbDragOptions; + this.draw(params.el, ui, null, true); + if (o._dragging) { + this.addClass(params.el, "jtk-dragged"); + } + o._dragging = true; + } + }; + var _dragStop=function(params) { + var elements = params.selection, uip; + + var _one = function (_e) { + if (_e[1] != null) { + // run the reported offset through the code that takes parent containers + // into account, to adjust if necessary (issue 554) + uip = this.getUIPosition([{ + el:_e[2].el, + pos:[_e[1].left, _e[1].top] + }]); + this.draw(_e[2].el, uip); + } + + if (_e[0]._jsPlumbDragOptions != null) { + delete _e[0]._jsPlumbDragOptions._dragging; + } + + this.removeClass(_e[0], "jtk-dragged"); + this.select({source: _e[2].el}).removeClass(this.elementDraggingClass + " " + this.sourceElementDraggingClass, true); + this.select({target: _e[2].el}).removeClass(this.elementDraggingClass + " " + this.targetElementDraggingClass, true); + this.getDragManager().dragEnded(_e[2].el); + }.bind(this); + + for (var i = 0; i < elements.length; i++) { + _one(elements[i]); + } + + this.setHoverSuspended(false); + this.setConnectionBeingDragged(false); + }; + + var _animProps = function (o, p) { + var _one = function (pName) { + if (p[pName] != null) { + if (_ju.isString(p[pName])) { + var m = p[pName].match(/-=/) ? -1 : 1, + v = p[pName].substring(2); + return o[pName] + (m * v); + } + else { + return p[pName]; + } + } + else { + return o[pName]; + } + }; + return [ _one("left"), _one("top") ]; + }; + + var _genLoc = function (prefix, e) { + if (e == null) { + return [ 0, 0 ]; + } + var ts = _touches(e), t = _getTouch(ts, 0); + return [t[prefix + "X"], t[prefix + "Y"]]; + }, + _pageLocation = _genLoc.bind(this, "page"), + _screenLocation = _genLoc.bind(this, "screen"), + _clientLocation = _genLoc.bind(this, "client"), + _getTouch = function (touches, idx) { + return touches.item ? touches.item(idx) : touches[idx]; + }, + _touches = function (e) { + return e.touches && e.touches.length > 0 ? e.touches : + e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches : + e.targetTouches && e.targetTouches.length > 0 ? e.targetTouches : + [ e ]; + }; + + /** + Manages dragging for some instance of jsPlumb. + + TODO instead of this being accessed directly, it should subscribe to events on the jsPlumb instance: every method + in here is called directly by jsPlumb. But what should happen is that we have unpublished events that this listens + to. The only trick is getting one of these instantiated with every jsPlumb instance: it needs to have a hook somehow. + Basically the general idea is to pull ALL the drag code out (prototype method registrations plus this) into a + dedicated drag script), that does not necessarily need to be included. + + + */ + var DragManager = function (_currentInstance) { + var _draggables = {}, _dlist = [], _delements = {}, _elementsWithEndpoints = {}, + // elementids mapped to the draggable to which they belong. + _draggablesForElements = {}; + + /** + register some element as draggable. right now the drag init stuff is done elsewhere, and it is + possible that will continue to be the case. + */ + this.register = function (el) { + var id = _currentInstance.getId(el), + parentOffset; + + if (!_draggables[id]) { + _draggables[id] = el; + _dlist.push(el); + _delements[id] = {}; + } + + // look for child elements that have endpoints and register them against this draggable. + var _oneLevel = function (p) { + if (p) { + for (var i = 0; i < p.childNodes.length; i++) { + if (p.childNodes[i].nodeType !== 3 && p.childNodes[i].nodeType !== 8) { + var cEl = jsPlumb.getElement(p.childNodes[i]), + cid = _currentInstance.getId(p.childNodes[i], null, true); + if (cid && _elementsWithEndpoints[cid] && _elementsWithEndpoints[cid] > 0) { + if (!parentOffset) { + parentOffset = _currentInstance.getOffset(el); + } + var cOff = _currentInstance.getOffset(cEl); + _delements[id][cid] = { + id: cid, + offset: { + left: cOff.left - parentOffset.left, + top: cOff.top - parentOffset.top + } + }; + _draggablesForElements[cid] = id; + } + _oneLevel(p.childNodes[i]); + } + } + } + }; + + _oneLevel(el); + }; + + // refresh the offsets for child elements of this element. + this.updateOffsets = function (elId, childOffsetOverrides) { + if (elId != null) { + childOffsetOverrides = childOffsetOverrides || {}; + var domEl = jsPlumb.getElement(elId), + id = _currentInstance.getId(domEl), + children = _delements[id], + parentOffset; + + if (children) { + for (var i in children) { + if (children.hasOwnProperty(i)) { + var cel = jsPlumb.getElement(i), + cOff = childOffsetOverrides[i] || _currentInstance.getOffset(cel); + + // do not update if we have a value already and we'd just be writing 0,0 + if (cel.offsetParent == null && _delements[id][i] != null) { + continue; + } + + if (!parentOffset) { + parentOffset = _currentInstance.getOffset(domEl); + } + + _delements[id][i] = { + id: i, + offset: { + left: cOff.left - parentOffset.left, + top: cOff.top - parentOffset.top + } + }; + _draggablesForElements[i] = id; + } + } + } + } + }; + + /** + notification that an endpoint was added to the given el. we go up from that el's parent + node, looking for a parent that has been registered as a draggable. if we find one, we add this + el to that parent's list of elements to update on drag (if it is not there already) + */ + this.endpointAdded = function (el, id) { + + id = id || _currentInstance.getId(el); + + var b = document.body, + p = el.parentNode; + + _elementsWithEndpoints[id] = _elementsWithEndpoints[id] ? _elementsWithEndpoints[id] + 1 : 1; + + while (p != null && p !== b) { + var pid = _currentInstance.getId(p, null, true); + if (pid && _draggables[pid]) { + var pLoc = _currentInstance.getOffset(p); + + if (_delements[pid][id] == null) { + var cLoc = _currentInstance.getOffset(el); + _delements[pid][id] = { + id: id, + offset: { + left: cLoc.left - pLoc.left, + top: cLoc.top - pLoc.top + } + }; + _draggablesForElements[id] = pid; + } + break; + } + p = p.parentNode; + } + }; + + this.endpointDeleted = function (endpoint) { + if (_elementsWithEndpoints[endpoint.elementId]) { + _elementsWithEndpoints[endpoint.elementId]--; + if (_elementsWithEndpoints[endpoint.elementId] <= 0) { + for (var i in _delements) { + if (_delements.hasOwnProperty(i) && _delements[i]) { + delete _delements[i][endpoint.elementId]; + delete _draggablesForElements[endpoint.elementId]; + } + } + } + } + }; + + this.changeId = function (oldId, newId) { + _delements[newId] = _delements[oldId]; + _delements[oldId] = {}; + _draggablesForElements[newId] = _draggablesForElements[oldId]; + _draggablesForElements[oldId] = null; + }; + + this.getElementsForDraggable = function (id) { + return _delements[id]; + }; + + this.elementRemoved = function (elementId) { + var elId = _draggablesForElements[elementId]; + if (elId) { + delete _delements[elId][elementId]; + delete _draggablesForElements[elementId]; + } + }; + + this.reset = function () { + _draggables = {}; + _dlist = []; + _delements = {}; + _elementsWithEndpoints = {}; + }; + + // + // notification drag ended. We check automatically if need to update some + // ancestor's offsets. + // + this.dragEnded = function (el) { + if (el.offsetParent != null) { + var id = _currentInstance.getId(el), + ancestor = _draggablesForElements[id]; + + if (ancestor) { + this.updateOffsets(ancestor); + } + } + }; + + this.setParent = function (el, elId, p, pId, currentChildLocation) { + var current = _draggablesForElements[elId]; + if (!_delements[pId]) { + _delements[pId] = {}; + } + var pLoc = _currentInstance.getOffset(p), + cLoc = currentChildLocation || _currentInstance.getOffset(el); + + if (current && _delements[current]) { + delete _delements[current][elId]; + } + + _delements[pId][elId] = { + id:elId, + offset : { + left: cLoc.left - pLoc.left, + top: cLoc.top - pLoc.top + } + }; + _draggablesForElements[elId] = pId; + }; + + this.clearParent = function(el, elId) { + var current = _draggablesForElements[elId]; + if (current) { + delete _delements[current][elId]; + delete _draggablesForElements[elId]; + } + }; + + this.revalidateParent = function(el, elId, childOffset) { + var current = _draggablesForElements[elId]; + if (current) { + var co = {}; + co[elId] = childOffset; + this.updateOffsets(current, co); + _currentInstance.revalidate(current); + } + }; + + this.getDragAncestor = function (el) { + var de = jsPlumb.getElement(el), + id = _currentInstance.getId(de), + aid = _draggablesForElements[id]; + + if (aid) { + return jsPlumb.getElement(aid); + } + else { + return null; + } + }; + + }; + + var _setClassName = function (el, cn, classList) { + cn = _ju.fastTrim(cn); + if (typeof el.className.baseVal !== "undefined") { + el.className.baseVal = cn; + } + else { + el.className = cn; + } + + // recent (i currently have 61.0.3163.100) version of chrome do not update classList when you set the base val + // of an svg element's className. in the long run we'd like to move to just using classList anyway + try { + var cl = el.classList; + if (cl != null) { + while (cl.length > 0) { + cl.remove(cl.item(0)); + } + for (var i = 0; i < classList.length; i++) { + if (classList[i]) { + cl.add(classList[i]); + } + } + } + } + catch(e) { + // not fatal + _ju.log("JSPLUMB: cannot set class list", e); + } + }, + _getClassName = function (el) { + return (typeof el.className.baseVal === "undefined") ? el.className : el.className.baseVal; + }, + _classManip = function (el, classesToAdd, classesToRemove) { + classesToAdd = classesToAdd == null ? [] : _ju.isArray(classesToAdd) ? classesToAdd : classesToAdd.split(/\s+/); + classesToRemove = classesToRemove == null ? [] : _ju.isArray(classesToRemove) ? classesToRemove : classesToRemove.split(/\s+/); + + var className = _getClassName(el), + curClasses = className.split(/\s+/); + + var _oneSet = function (add, classes) { + for (var i = 0; i < classes.length; i++) { + if (add) { + if (curClasses.indexOf(classes[i]) === -1) { + curClasses.push(classes[i]); + } + } + else { + var idx = curClasses.indexOf(classes[i]); + if (idx !== -1) { + curClasses.splice(idx, 1); + } + } + } + }; + + _oneSet(true, classesToAdd); + _oneSet(false, classesToRemove); + + _setClassName(el, curClasses.join(" "), curClasses); + }; + + root.jsPlumb.extend(root.jsPlumbInstance.prototype, { + + headless: false, + + pageLocation: _pageLocation, + screenLocation: _screenLocation, + clientLocation: _clientLocation, + + getDragManager:function() { + if (this.dragManager == null) { + this.dragManager = new DragManager(this); + } + + return this.dragManager; + }, + + recalculateOffsets:function(elId) { + this.getDragManager().updateOffsets(elId); + }, + + createElement:function(tag, style, clazz, atts) { + return this.createElementNS(null, tag, style, clazz, atts); + }, + + createElementNS:function(ns, tag, style, clazz, atts) { + var e = ns == null ? document.createElement(tag) : document.createElementNS(ns, tag); + var i; + style = style || {}; + for (i in style) { + e.style[i] = style[i]; + } + + if (clazz) { + e.className = clazz; + } + + atts = atts || {}; + for (i in atts) { + e.setAttribute(i, "" + atts[i]); + } + + return e; + }, + + getAttribute: function (el, attName) { + return el.getAttribute != null ? el.getAttribute(attName) : null; + }, + + setAttribute: function (el, a, v) { + if (el.setAttribute != null) { + el.setAttribute(a, v); + } + }, + + setAttributes: function (el, atts) { + for (var i in atts) { + if (atts.hasOwnProperty(i)) { + el.setAttribute(i, atts[i]); + } + } + }, + appendToRoot: function (node) { + document.body.appendChild(node); + }, + getRenderModes: function () { + return [ "svg" ]; + }, + getClass:_getClassName, + addClass: function (el, clazz) { + jsPlumb.each(el, function (e) { + _classManip(e, clazz); + }); + }, + hasClass: function (el, clazz) { + el = jsPlumb.getElement(el); + if (el.classList) { + return el.classList.contains(clazz); + } + else { + return _getClassName(el).indexOf(clazz) !== -1; + } + }, + removeClass: function (el, clazz) { + jsPlumb.each(el, function (e) { + _classManip(e, null, clazz); + }); + }, + toggleClass:function(el, clazz) { + if (jsPlumb.hasClass(el, clazz)) { + jsPlumb.removeClass(el, clazz); + } else { + jsPlumb.addClass(el, clazz); + } + }, + updateClasses: function (el, toAdd, toRemove) { + jsPlumb.each(el, function (e) { + _classManip(e, toAdd, toRemove); + }); + }, + setClass: function (el, clazz) { + if (clazz != null) { + jsPlumb.each(el, function (e) { + _setClassName(e, clazz, clazz.split(/\s+/)); + }); + } + }, + setPosition: function (el, p) { + el.style.left = p.left + "px"; + el.style.top = p.top + "px"; + }, + getPosition: function (el) { + var _one = function (prop) { + var v = el.style[prop]; + return v ? v.substring(0, v.length - 2) : 0; + }; + return { + left: _one("left"), + top: _one("top") + }; + }, + getStyle:function(el, prop) { + if (typeof window.getComputedStyle !== 'undefined') { + return getComputedStyle(el, null).getPropertyValue(prop); + } else { + return el.currentStyle[prop]; + } + }, + getSelector: function (ctx, spec) { + var sel = null; + if (arguments.length === 1) { + sel = ctx.nodeType != null ? ctx : document.querySelectorAll(ctx); + } + else { + sel = ctx.querySelectorAll(spec); + } + + return sel; + }, + getOffset:function(el, relativeToRoot, container) { + el = jsPlumb.getElement(el); + container = container || this.getContainer(); + var out = { + left: el.offsetLeft, + top: el.offsetTop + }, + op = (relativeToRoot || (container != null && (el !== container && el.offsetParent !== container))) ? el.offsetParent : null, + _maybeAdjustScroll = function(offsetParent) { + if (offsetParent != null && offsetParent !== document.body && (offsetParent.scrollTop > 0 || offsetParent.scrollLeft > 0)) { + out.left -= offsetParent.scrollLeft; + out.top -= offsetParent.scrollTop; + } + }.bind(this); + + while (op != null) { + out.left += op.offsetLeft; + out.top += op.offsetTop; + _maybeAdjustScroll(op); + op = relativeToRoot ? op.offsetParent : + op.offsetParent === container ? null : op.offsetParent; + } + + // if container is scrolled and the element (or its offset parent) is not absolute or fixed, adjust accordingly. + if (container != null && !relativeToRoot && (container.scrollTop > 0 || container.scrollLeft > 0)) { + var pp = el.offsetParent != null ? this.getStyle(el.offsetParent, "position") : "static", + p = this.getStyle(el, "position"); + if (p !== "absolute" && p !== "fixed" && pp !== "absolute" && pp !== "fixed") { + out.left -= container.scrollLeft; + out.top -= container.scrollTop; + } + } + return out; + }, + // + // return x+y proportion of the given element's size corresponding to the location of the given event. + // + getPositionOnElement: function (evt, el, zoom) { + var box = typeof el.getBoundingClientRect !== "undefined" ? el.getBoundingClientRect() : { left: 0, top: 0, width: 0, height: 0 }, + body = document.body, + docElem = document.documentElement, + scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop, + scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft, + clientTop = docElem.clientTop || body.clientTop || 0, + clientLeft = docElem.clientLeft || body.clientLeft || 0, + pst = 0, + psl = 0, + top = box.top + scrollTop - clientTop + (pst * zoom), + left = box.left + scrollLeft - clientLeft + (psl * zoom), + cl = jsPlumb.pageLocation(evt), + w = box.width || (el.offsetWidth * zoom), + h = box.height || (el.offsetHeight * zoom), + x = (cl[0] - left) / w, + y = (cl[1] - top) / h; + + return [ x, y ]; + }, + + /** + * Gets the absolute position of some element as read from the left/top properties in its style. + * @method getAbsolutePosition + * @param {Element} el The element to retrieve the absolute coordinates from. **Note** this is a DOM element, not a selector from the underlying library. + * @return {Number[]} [left, top] pixel values. + */ + getAbsolutePosition: function (el) { + var _one = function (s) { + var ss = el.style[s]; + if (ss) { + return parseFloat(ss.substring(0, ss.length - 2)); + } + }; + return [ _one("left"), _one("top") ]; + }, + + /** + * Sets the absolute position of some element by setting the left/top properties in its style. + * @method setAbsolutePosition + * @param {Element} el The element to set the absolute coordinates on. **Note** this is a DOM element, not a selector from the underlying library. + * @param {Number[]} xy x and y coordinates + * @param {Number[]} [animateFrom] Optional previous xy to animate from. + * @param {Object} [animateOptions] Options for the animation. + */ + setAbsolutePosition: function (el, xy, animateFrom, animateOptions) { + if (animateFrom) { + this.animate(el, { + left: "+=" + (xy[0] - animateFrom[0]), + top: "+=" + (xy[1] - animateFrom[1]) + }, animateOptions); + } + else { + el.style.left = xy[0] + "px"; + el.style.top = xy[1] + "px"; + } + }, + /** + * gets the size for the element, in an array : [ width, height ]. + */ + getSize: function (el) { + return [ el.offsetWidth, el.offsetHeight ]; + }, + getWidth: function (el) { + return el.offsetWidth; + }, + getHeight: function (el) { + return el.offsetHeight; + }, + getRenderMode : function() { return "svg"; }, + draggable : function (el, options) { + var info; + el = _ju.isArray(el) || (el.length != null && !_ju.isString(el)) ? el: [ el ]; + Array.prototype.slice.call(el).forEach(function(_el) { + info = this.info(_el); + if (info.el) { + this._initDraggableIfNecessary(info.el, true, options, info.id, true); + } + }.bind(this)); + return this; + }, + snapToGrid : function(el, x, y) { + var out = []; + var _oneEl = function(_el) { + var info = this.info(_el); + if (info.el != null && info.el._katavorioDrag) { + var snapped = info.el._katavorioDrag.snap(x, y); + this.revalidate(info.el); + out.push([info.el, snapped]); + } + }.bind(this); + + // if you call this method with 0 arguments or 2 arguments it is assumed you want to snap all managed elements to + // a grid. if you supply one argument or 3, then you are assumed to be specifying one element. + if(arguments.length === 1 || arguments.length === 3) { + _oneEl(el, x, y); + } else { + var _me = this.getManagedElements(); + for (var mel in _me) { + _oneEl(mel, arguments[0], arguments[1]); + } + } + + return out; + }, + initDraggable: function (el, options, category) { + _getDragManager(this, category).draggable(el, options); + el._jsPlumbDragOptions = options; + }, + destroyDraggable: function (el, category) { + _getDragManager(this, category).destroyDraggable(el); + delete el._jsPlumbDragOptions; + }, + unbindDraggable: function (el, evt, fn, category) { + _getDragManager(this, category).destroyDraggable(el, evt, fn); + }, + setDraggable : function (element, draggable) { + return jsPlumb.each(element, function (el) { + if (this.isDragSupported(el)) { + this._draggableStates[this.getAttribute(el, "id")] = draggable; + this.setElementDraggable(el, draggable); + } + }.bind(this)); + }, + _draggableStates : {}, + /* + * toggles the draggable state of the given element(s). + * el is either an id, or an element object, or a list of ids/element objects. + */ + toggleDraggable : function (el) { + var state; + jsPlumb.each(el, function (el) { + var elId = this.getAttribute(el, "id"); + state = this._draggableStates[elId] == null ? false : this._draggableStates[elId]; + state = !state; + this._draggableStates[elId] = state; + this.setDraggable(el, state); + return state; + }.bind(this)); + return state; + }, + _initDraggableIfNecessary : function (element, isDraggable, dragOptions, id, fireEvent) { + // TODO FIRST: move to DragManager. including as much of the decision to init dragging as possible. + if (!jsPlumb.headless) { + var _draggable = isDraggable == null ? false : isDraggable; + if (_draggable) { + if (jsPlumb.isDragSupported(element, this)) { + var options = dragOptions || this.Defaults.DragOptions; + options = jsPlumb.extend({}, options); // make a copy. + if (!jsPlumb.isAlreadyDraggable(element, this)) { + var dragEvent = jsPlumb.dragEvents.drag, + stopEvent = jsPlumb.dragEvents.stop, + startEvent = jsPlumb.dragEvents.start; + + this.manage(id, element); + + options[startEvent] = _ju.wrap(options[startEvent], _dragStart.bind(this)); + + options[dragEvent] = _ju.wrap(options[dragEvent], _dragMove.bind(this)); + + options[stopEvent] = _ju.wrap(options[stopEvent], _dragStop.bind(this)); + + var elId = this.getId(element); // need ID + + this._draggableStates[elId] = true; + var draggable = this._draggableStates[elId]; + + options.disabled = draggable == null ? false : !draggable; + this.initDraggable(element, options); + this.getDragManager().register(element); + if (fireEvent) { + this.fire("elementDraggable", {el:element, options:options}); + } + } + else { + // already draggable. attach any start, drag or stop listeners to the current Drag. + if (dragOptions.force) { + this.initDraggable(element, options); + } + } + } + } + } + }, + animationSupported:true, + getElement: function (el) { + if (el == null) { + return null; + } + // here we pluck the first entry if el was a list of entries. + // this is not my favourite thing to do, but previous versions of + // jsplumb supported jquery selectors, and it is possible a selector + // will be passed in here. + el = typeof el === "string" ? el : el.length != null && el.enctype == null ? el[0] : el; + return typeof el === "string" ? document.getElementById(el) : el; + }, + removeElement: function (element) { + _getDragManager(this).elementRemoved(element); + this.getEventManager().remove(element); + }, + // + // this adapter supports a rudimentary animation function. no easing is supported. only + // left/top properties are supported. property delta args are expected to be in the form + // + // +=x.xxxx + // + // or + // + // -=x.xxxx + // + doAnimate: function (el, properties, options) { + options = options || {}; + var o = this.getOffset(el), + ap = _animProps(o, properties), + ldist = ap[0] - o.left, + tdist = ap[1] - o.top, + d = options.duration || 250, + step = 15, steps = d / step, + linc = (step / d) * ldist, + tinc = (step / d) * tdist, + idx = 0, + _int = setInterval(function () { + _jp.setPosition(el, { + left: o.left + (linc * (idx + 1)), + top: o.top + (tinc * (idx + 1)) + }); + if (options.step != null) { + options.step(idx, Math.ceil(steps)); + } + idx++; + if (idx >= steps) { + window.clearInterval(_int); + if (options.complete != null) { + options.complete(); + } + } + }, step); + }, + // DRAG/DROP + + + destroyDroppable: function (el, category) { + _getDragManager(this, category).destroyDroppable(el); + }, + unbindDroppable: function (el, evt, fn, category) { + _getDragManager(this, category).destroyDroppable(el, evt, fn); + }, + + droppable :function(el, options) { + el = _ju.isArray(el) || (el.length != null && !_ju.isString(el)) ? el: [ el ]; + var info; + options = options || {}; + options.allowLoopback = false; + Array.prototype.slice.call(el).forEach(function(_el) { + info = this.info(_el); + if (info.el) { + this.initDroppable(info.el, options); + } + }.bind(this)); + return this; + }, + + initDroppable: function (el, options, category) { + _getDragManager(this, category).droppable(el, options); + }, + isAlreadyDraggable: function (el) { + return el._katavorioDrag != null; + }, + isDragSupported: function (el, options) { + return true; + }, + isDropSupported: function (el, options) { + return true; + }, + isElementDraggable: function (el) { + el = _jp.getElement(el); + return el._katavorioDrag && el._katavorioDrag.isEnabled(); + }, + getDragObject: function (eventArgs) { + return eventArgs[0].drag.getDragElement(); + }, + getDragScope: function (el) { + return el._katavorioDrag && el._katavorioDrag.scopes.join(" ") || ""; + }, + getDropEvent: function (args) { + return args[0].e; + }, + getUIPosition: function (eventArgs, zoom) { + // here the position reported to us by Katavorio is relative to the element's offsetParent. For top + // level nodes that is fine, but if we have a nested draggable then its offsetParent is actually + // not going to be the jsplumb container; it's going to be some child of that element. In that case + // we want to adjust the UI position to account for the offsetParent's position relative to the Container + // origin. + var el = eventArgs[0].el; + if (el.offsetParent == null) { + return null; + } + var finalPos = eventArgs[0].finalPos || eventArgs[0].pos; + var p = { left:finalPos[0], top:finalPos[1] }; + if (el._katavorioDrag && el.offsetParent !== this.getContainer()) { + var oc = this.getOffset(el.offsetParent); + p.left += oc.left; + p.top += oc.top; + } + return p; + }, + setDragFilter: function (el, filter, _exclude) { + if (el._katavorioDrag) { + el._katavorioDrag.setFilter(filter, _exclude); + } + }, + setElementDraggable: function (el, draggable) { + el = _jp.getElement(el); + if (el._katavorioDrag) { + el._katavorioDrag.setEnabled(draggable); + } + }, + setDragScope: function (el, scope) { + if (el._katavorioDrag) { + el._katavorioDrag.k.setDragScope(el, scope); + } + }, + setDropScope:function(el, scope) { + if (el._katavorioDrop && el._katavorioDrop.length > 0) { + el._katavorioDrop[0].k.setDropScope(el, scope); + } + }, + addToPosse:function(el, spec) { + var specs = Array.prototype.slice.call(arguments, 1); + var dm = _getDragManager(this); + _jp.each(el, function(_el) { + _el = [ _jp.getElement(_el) ]; + _el.push.apply(_el, specs ); + dm.addToPosse.apply(dm, _el); + }); + }, + setPosse:function(el, spec) { + var specs = Array.prototype.slice.call(arguments, 1); + var dm = _getDragManager(this); + _jp.each(el, function(_el) { + _el = [ _jp.getElement(_el) ]; + _el.push.apply(_el, specs ); + dm.setPosse.apply(dm, _el); + }); + }, + removeFromPosse:function(el, posseId) { + var specs = Array.prototype.slice.call(arguments, 1); + var dm = _getDragManager(this); + _jp.each(el, function(_el) { + _el = [ _jp.getElement(_el) ]; + _el.push.apply(_el, specs ); + dm.removeFromPosse.apply(dm, _el); + }); + }, + removeFromAllPosses:function(el) { + var dm = _getDragManager(this); + _jp.each(el, function(_el) { dm.removeFromAllPosses(_jp.getElement(_el)); }); + }, + setPosseState:function(el, posseId, state) { + var dm = _getDragManager(this); + _jp.each(el, function(_el) { dm.setPosseState(_jp.getElement(_el), posseId, state); }); + }, + dragEvents: { + 'start': 'start', 'stop': 'stop', 'drag': 'drag', 'step': 'step', + 'over': 'over', 'out': 'out', 'drop': 'drop', 'complete': 'complete', + 'beforeStart':'beforeStart' + }, + animEvents: { + 'step': "step", 'complete': 'complete' + }, + stopDrag: function (el) { + if (el._katavorioDrag) { + el._katavorioDrag.abort(); + } + }, + addToDragSelection: function (spec) { + var el = this.getElement(spec); + if (el != null && (el._isJsPlumbGroup || el._jsPlumbGroup == null)) { + _getDragManager(this).select(spec); + } + }, + removeFromDragSelection: function (spec) { + _getDragManager(this).deselect(spec); + }, + getDragSelection:function() { + return _getDragManager(this).getSelection(); + }, + clearDragSelection: function () { + _getDragManager(this).deselectAll(); + }, + trigger: function (el, event, originalEvent, payload) { + this.getEventManager().trigger(el, event, originalEvent, payload); + }, + doReset:function() { + // look for katavorio instances and reset each one if found. + for (var key in this) { + if (key.indexOf("_katavorio_") === 0) { + this[key].reset(); + } + } + }, + getEventManager:function() { + return _getEventManager(this); + }, + on : function(el, event, callback) { + // TODO: here we would like to map the tap event if we know its + // an internal bind to a click. we have to know its internal because only + // then can we be sure that the UP event wont be consumed (tap is a synthesized + // event from a mousedown followed by a mouseup). + //event = { "click":"tap", "dblclick":"dbltap"}[event] || event; + this.getEventManager().on.apply(this, arguments); + return this; + }, + off : function(el, event, callback) { + this.getEventManager().off.apply(this, arguments); + return this; + } + + }); + + var ready = function (f) { + var _do = function () { + if (/complete|loaded|interactive/.test(document.readyState) && typeof(document.body) !== "undefined" && document.body != null) { + f(); + } + else { + setTimeout(_do, 9); + } + }; + + _do(); + }; + ready(_jp.init); + +}).call(typeof window !== 'undefined' ? window : this); diff --git a/experiment/simulation/EE6/js/layout.js b/experiment/simulation/EE6/js/layout.js new file mode 100644 index 0000000..d52e4ff --- /dev/null +++ b/experiment/simulation/EE6/js/layout.js @@ -0,0 +1,30 @@ +let listItems = document.querySelectorAll(".steps ol li"); +let activeIdx = 0; +// handle list items click +// for (const item of listItems) { +// item.addEventListener("click", (event) => { +// event. +// }); +// } +function nextDrawerItem() { + if (activeIdx < listItems.length) { + listItems[activeIdx].classList.add("active"); + if (activeIdx > 0) { + listItems[activeIdx - 1].classList.add("completed"); + listItems[activeIdx - 1].classList.remove("active"); + } + } + activeIdx = activeIdx < listItems.length ? activeIdx + 1 : activeIdx; +} + +function backDrawerItem() { + if (activeIdx <= 1) return; + activeIdx--; + listItems[activeIdx].classList.remove("active"); + listItems[activeIdx].classList.add("completed"); + if (activeIdx > 0) { + listItems[activeIdx - 1].classList.add("active"); + } +} + + diff --git a/experiment/simulation/EE6/js/main.js b/experiment/simulation/EE6/js/main.js new file mode 100644 index 0000000..26b01eb --- /dev/null +++ b/experiment/simulation/EE6/js/main.js @@ -0,0 +1,2210 @@ +// * Audio Mute +let isMute = false; + +// * Current Date +let cd = new Date(); +var currentDateGlobal = `${cd.getDate()} - ${ + cd.getMonth() + 1 +} - ${cd.getFullYear()}`; +console.log(currentDateGlobal); + +// * Quiz object +const Quiz = { + quizData: [ + { + question: + "Which of the following machine is used to measure compressive strength?", + a: "Universal testing machine", + b: "Impact testing machine", + c: "Fatigue testing machine", + d: "Erichsen machine", + correct: "a", + }, + { + question: + "Which one of the following, is not a unit of ultimate tensile strength?", + a: "MPa", + b: "N/m2", + c: "Kg/m3", + d: "PSI", + correct: "c", + }, + { + question: "The extensometer can be attached anywhere to the specimen _", + a: "Yes", + b: "No", + c: "No but sometime yes", + d: "None of the above", + correct: "b", + }, + + { + question: + "What is the smallest measurement that is possible by vernier calliper?", + a: "Least count", + b: "Actual reading", + c: "Main scale division", + d: "Vernier scale division", + correct: "a", + }, + { + question: "What is the least count of a standard metric vernier caliper", + a: "0.002mm", + b: "0.02mm", + c: "0.1mm", + d: "0.2mm", + correct: "b", + }, + ], + quiz_contianer: document.querySelector(".quiz-container"), + quiz: document.getElementById("quiz"), + answerEls: document.querySelectorAll(".answer"), + questionEl: document.getElementById("question"), + a_text: document.getElementById("a_text"), + b_text: document.getElementById("b_text"), + c_text: document.getElementById("c_text"), + d_text: document.getElementById("d_text"), + ansDom: document.getElementById("quizAns"), + opsDom: [this.a_text, this.b_text, this.c_text, this.d_text], + loadQuizCallCount: 0, + currentQuiz: 0, + score: 0, + loadQuiz() { + if (this.currentQuiz >= this.quizData.length) { + return; + } + document.querySelector(".transparent-box").style.display = "block"; + this.loadQuizCallCount++; + window.speechSynthesis.cancel(); + setCC("Choose the correct answer."); + this.deselectAnswers(); + this.quiz_contianer.style.display = "block"; + const currentQuizData = this.quizData[this.currentQuiz]; + + this.questionEl.innerText = currentQuizData.question; + this.a_text.innerText = currentQuizData.a; + this.b_text.innerText = currentQuizData.b; + this.c_text.innerText = currentQuizData.c; + this.d_text.innerText = currentQuizData.d; + }, + + getSelected() { + let answer = undefined; + this.answerEls.forEach((answerEl) => { + if (answerEl.checked) { + answer = answerEl.id; + } + }); + this.answerEls.forEach((answerEl) => { + if (answer != undefined) { + answerEl.disabled = true; + } + }); + + return answer; + }, + + deselectAnswers() { + this.answerEls.forEach((answerEl) => { + answerEl.checked = false; + answerEl.disabled = false; + }); + }, + close() { + this.quiz_contianer.style.display = "none"; + for (let od of this.opsDom) { + od.style.color = ""; + } + document.querySelector(".transparent-box").style.display = "none"; + + // this.ansDom.style.display = "none"; + }, + init() { + let okBtn = document.getElementById("quizSubmit"); + okBtn.textContent = "Submit"; + // onclick for quiz close btn + // document.querySelector("#closeQuiz").onclick = () => { + // this.close(); + // }; + // onclick for quiz submit btn + document.getElementById("quizSubmit").onclick = () => { + // for disable multiple submit + if (this.loadQuizCallCount - 1 !== this.currentQuiz) { + return; + } + // subtitle for quiz + const answer = this.getSelected(); + if (answer) { + // this.ansDom.style.display = "block"; + // this.ansDom.innerHTML = "✔ "+ this.quizData[this.currentQuiz][this.quizData[this.currentQuiz].correct]; + + // updating options with the right and wrong emoji + let ops = "abcd"; + for (let o in ops) { + if (ops[o] == this.quizData[this.currentQuiz].correct) { + this.opsDom[o].innerHTML += " ✔️"; + this.opsDom[o].style.color = "green"; + } else { + this.opsDom[o].innerHTML += " ❌"; + this.opsDom[o].style.color = "red"; + } + } + + if (answer === this.quizData[this.currentQuiz].correct) { + this.score++; + } + this.currentQuiz++; + + //for ok button + + okBtn.textContent = "Ok"; + okBtn.onclick = function () { + Quiz.close(); + Quiz.init(); + }; + + // to stop the next question + // if (this.currentQuiz < this.quizData.length) { + // this.loadQuiz(); + // } else { + // this.quiz.innerHTML = `

    You answered correctly at ${this.score}/${this.quizData.length} questions.

    + // + // `; + // todo show above string to certificate + // } + } + // this.close(); + }; + }, +}; + +// * ChartJs +const ChartGraph = { + ctx: document.getElementById("myChart"), + ctxBox: document.querySelector(".chart"), + graphs: [ + (Graph1 = { + labels: [0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07], + datapoints: [0, 100, 185, 260, 360, 435, 452], + }), + (Graph2 = { + labels: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6], + datapoints: [0, 470, 488, 512, 515, 570], + }), + (Graph3 = { + labels: [0, 0.02, 0.04, 0.06, 0.08, 1, 1.2], + datapoints: [0, 480, 520, 560, 602, 535], + }), + (Graph4 = { + labels: [0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07], + datapoints: [0, 100, 185, 260, 360, 435, 452], + }), + ], + currGr: null, + delete: function () { + this.ctxBox.style.display = "none"; + this.currGr.destroy(); + }, + view: function (num, left, top, height = null, width = null) { + if (height != null) this.ctxBox.style.height = height + "px!important"; + if (width != null) this.ctxBox.style.width = width + "px!important"; + this.ctxBox.style.left = left + "px"; + this.ctxBox.style.top = top + "px"; + this.ctxBox.style.display = "block"; + this.currGr = new Chart(this.ctx, { + type: "line", + data: { + labels: this.graphs[num].labels, + datasets: [ + { + label: "Engineering Stress-Strain Curve", + data: this.graphs[num].datapoints, + borderWidth: 1, + tension: 0.4, + }, + // { + // label: "_", + // data: [0, 470], + // borderWidth: 1, + // }, + ], + }, + options: { + borderWidth: 3, + scales: { + y: { + beginAtZero: true, + }, + }, + }, + }); + return this; + }, +}; + +Quiz.init(); + +// for restriction on next button ; +let isPerformNext = false; + +// animation is running +let isRunning = false; +// to set isProcessRunning and also sync the progressbar + drawer +// ! and toggle the next btn active / deactive +function toggleNextBtn() { + let nextBtn = document.querySelector(".btn-next"); + nextBtn.classList.toggle("btn-deactive"); +} +const cancelSpeech = ()=>{ + window.speechSynthesis.cancel() + ccQueue = [] +} + +const setIsProcessRunning = (value) => { + // calling toggle the next + if(value != isRunning){ + toggleNextBtn() + } + + isRunning = value; + if(value){ + cancelSpeech() + Dom.hideAll() + } +}; + +const show = (ele, disp = "block", opa = 1) => { + ele.style.display = disp; + ele.style.opacity = opa; +}; +const opacity = (ele, val = 1) => { + ele.style.opacity = val; +}; +const hide = (ele, disp = "none") => { + ele.style.display = disp; +}; +const hideAll = (elesName, disp = "none") => { + let eles = getAll(elesName); + for (let ele of eles) { + hide(ele); + } +}; +const showAll = (elesName, disp = "none", opa = 1) => { + let eles = getAll(elesName); + for (let ele of eles) { + show(ele, "block", opa); + } +}; + +const set = (ele, l = null, t = null) => { + if (l !== null) { + ele.style.left = l + "px"; + } + if (t !== null) { + ele.style.top = t + "px"; + } + show(ele); +}; + +let student_name = ""; +// let currentDateGlobal = ""; + +// ! text to audio + +const textToSpeach = (text,speak=true) => { + // for filter + text = text.replaceAll(""," ").replaceAll(""," ") + let utterance = new SpeechSynthesisUtterance(); + utterance.text = text; + utterance.voice = window.speechSynthesis.getVoices()[0]; + if(isMute || !speak){ + utterance.volume = 0 + utterance.rate = 10 + } + window.speechSynthesis.speak(utterance); + return utterance; +}; + +//queue for +let ccQueue = []; +// for subtitile +let ccObj = null; +function setCC(text = null, speed = 25, speak = true) { + if (ccObj != null) { + ccObj.destroy(); + } + + let ccDom = get(".steps-subtitle .subtitle"); + ccQueue.push(text); + ccObj = new Typed(ccDom, { + strings: ["", ...ccQueue], + typeSpeed: speed, + onStringTyped(){ + ccQueue.shift() + // if(ccQueue.length != 0){ + // setCC(ccQueue.shift())` + // } + } + }); + let utterance = textToSpeach(text,speak) + return utterance +} + +// ! class Dom{} is send to seperate file +// * for cursor pointer +function cursorPointer(ele) { + ele.style.cursor = "pointer"; +} + +// Img.setBlinkArrow(true,790,444).play(); + + +const Scenes = { + items: { + anime_main_dom: new Dom(".anime-main"), + arrowRound: new Dom("arrowRound"), + blinkArrow: new Dom("blinkArrow"), + larrow: new Dom("laerrow"), + larrow2: new Dom("laerrow2"), + logo: new Dom("logo"), + man: new Dom("man"), + arrow: new Dom("measurearrow"), + arrow2: new Dom("measurearrow2"), + redsize: new Dom("redsize"), + speech_off_btn: new Dom("speech_off_btn"), + speech_on_btn: new Dom("speech_on_btn"), + talk_cloud: new Dom("talk_cloud"), + projectIntro: new Dom(".project-intro"), + header: new Dom(".anime-header"), + stepHeading: new Dom(".step-heading"), + stepTitle: new Dom(".step-title"), + stepDescription: new Dom(".step-description"), + tableCalc: new Dom(".measurements"), + tempText: new Dom(".temp-text"), + tempText2: new Dom(".temp-text2"), + tempInputBox: new Dom(".temp-input"), + tempInputBoxInput: new Dom(".temp-input #ipnum"), + tempInputT1: new Dom(".temp-input .text1"), + tempInputT2: new Dom(".temp-input .text2"), + tempInputError: new Dom(".temp-input .error"), + tempInputBtn: new Dom(".temp-input .submit-btn"), + utmBtn: new Dom(".utm-button"), + inputWindow: new Dom(".user-input"), + resultTable: new Dom(".result-table"), + certificate: new Dom(".certificate"), + welcomeBox: new Dom(".welcome-box"), + videoBox: new Dom(".video-box"), + videoBoxSrc: new Dom(".video-box .video"), + videoBoxTitle: new Dom(".video-box .title"), + videoBoxRestartBtn: new Dom(".video-box .controls .restart"), + imageBox: new Dom(".image-box"), + imageBoxSrc: new Dom(".image-box .image"), + imageBoxTitle: new Dom(".image-box .title"), + tempTitle1: new Dom(".temp-title1"), + tempTitle2: new Dom(".temp-title2"), + tempTitle3: new Dom(".temp-title3"), + tempTitle4: new Dom(".temp-title4"), + tempTitle5: new Dom(".temp-title5"), + tempTitle6: new Dom(".temp-title6"), + tempTitle7: new Dom(".temp-title7"), + tempTitle8: new Dom(".temp-title8"), + tempTitle9: new Dom(".temp-title9"), + tempTitle10: new Dom(".temp-title10"), + tempTitle11: new Dom(".temp-title11"), + tempTitle12: new Dom(".temp-title12"), + tempTitle13: new Dom(".temp-title13"), + tempTitle14: new Dom(".temp-title14"), + tempTitle15: new Dom(".temp-title15"), + tempTitle16: new Dom(".temp-title16"), + tempTitle17: new Dom(".temp-title17"), + tempTitle18: new Dom(".temp-title18"), + tempTitle19: new Dom(".temp-title19"), + tempTitle20: new Dom(".temp-title20"), + tempTitle21: new Dom(".temp-title21"), + tempTitle22: new Dom(".temp-title22"), + tempTitle23: new Dom(".temp-title23"), + tempTitle24: new Dom(".temp-title24"), + tempTitle25: new Dom(".temp-title25"), + tempTitle26: new Dom(".temp-title26"), + tempTitle27: new Dom(".temp-title27"), + tempTitle28: new Dom(".temp-title28"), + tempTitle29: new Dom(".temp-title29"), + tempTitle30: new Dom(".temp-title30"), + tempTitle31: new Dom(".temp-title31"), + tempTitle32: new Dom(".temp-title32"), + tempTitle33: new Dom(".temp-title33"), + tempTitle34: new Dom(".temp-title34"), + tempTitle35: new Dom(".temp-title35"), + tempTitle36: new Dom(".temp-title36"), + tempTitle37: new Dom(".temp-title37"), + tempTitle38: new Dom(".temp-title38"), + tempTitle39: new Dom(".temp-title39"), + tempTitle40: new Dom(".temp-title40"), + tempTitle41: new Dom(".temp-title41"), + tempTitle42: new Dom(".temp-title42"), + tempTitle43: new Dom(".temp-title43"), + tempTitle44: new Dom(".temp-title44"), + tempTitle45: new Dom(".temp-title45"), + tempTitle46: new Dom(".temp-title46"), + tempTitle47: new Dom(".temp-title47"), + tempTitle48: new Dom(".temp-title48"), + tempTitle49: new Dom(".temp-title49"), + tempTitle50: new Dom(".temp-title50"), + tempTitle51: new Dom(".temp-title51"), + tempTitle52: new Dom(".temp-title52"), + tempTitle53: new Dom(".temp-title53"), + tempTitle54: new Dom(".temp-title54"), + tempTitle55: new Dom(".temp-title55"), + tempTitle56: new Dom(".temp-title56"), + tempTitle57: new Dom(".temp-title57"), + tempTitle58: new Dom(".temp-title58"), + tempTitle59: new Dom(".temp-title59"), + tempTitle60: new Dom(".temp-title60"), + + concept_development: new Dom(".concept_development"), + + contentAdderBox: new Dom(".content-adder-box"), + btn_save: new Dom(".btn-save"), + btn_next: new Dom(".btn-next"), + graph1: new Dom(".graph1"), + graph2: new Dom(".graph2"), + graph3: new Dom(".graph3"), + graph4: new Dom(".graph4"), + graph5: new Dom(".graph5"), + graph_box_1: new Dom(".graph_box1"), + graph_box_2: new Dom(".graph_box2"), + graph_box_3: new Dom(".graph_box3"), + graph_box_4: new Dom(".graph_box4"), + graph_box_5: new Dom(".graph_box5"), + xLabel: new Dom(".xLabel"), + yLabel: new Dom(".yLabel"), + + part3_table_one: new Dom(".part3_table_one"), + part3_table_two: new Dom(".part3_table_two"), + part3_table_three: new Dom(".part3_table_three"), + part3_table_four: new Dom(".part3_table_four"), + part3_table_four_2: new Dom(".part3_table_four_2"), + + slider_vIn: new Dom(".slider_vIn"), + slider_vGs: new Dom(".slider_vGs"), + slider_R: new Dom(".slider_R"), + + btn_delete: new Dom(".btn-delete"), + btn_reset: new Dom(".btn-reset"), + btn_record: new Dom(".btn-record"), + btn_check_connections: new Dom(".btn-check-connections"), + btn_circuit_diagram: new Dom(".btn-circuit-diagram"), + + btn_transparent: new Dom(".btn-transparent"), + + formulas_component_stress: new Dom("formulas_component_stress"), + formulas_efficiency: new Dom("formulas_efficiency"), + formulas_ideal: new Dom("formulas_ideal"), + formulas_nomenclautre: new Dom("formulas_nomenclautre"), + formulas_non_ideal: new Dom("formulas_non_ideal"), + formulas_procedure: new Dom("formulas_procedure"), + formulas_universal: new Dom("formulas_universal"), + part_3_option_select: new Dom("part_3_option_select"), + part_1_text_for_crrct: new Dom("part_1_text_for_crrct"), + part_1_text_for_wrong: new Dom("part_1_text_for_wrong"), + + + // !EE4 images added + + + + //! EE4 tables added + part_1_table_1: new Dom(".part_1_table_1"), + part_1_table_2: new Dom(".part_1_table_2"), + + part_1_table_1_col_1: new Dom(".part_1_table_1_col_1"), + part_1_table_1_col_2: new Dom(".part_1_table_1_col_2"), + part_1_table_1_col_3: new Dom(".part_1_table_1_col_3"), + part_1_table_1_col_4: new Dom(".part_1_table_1_col_4"), + part_1_table_1_col_5: new Dom(".part_1_table_1_col_5"), + part_1_table_1_col_6: new Dom(".part_1_table_1_col_6"), + part_1_table_1_col_7: new Dom(".part_1_table_1_col_7"), + part_1_table_1_col_8: new Dom(".part_1_table_1_col_8"), + + part_1_table_2_col_1: new Dom(".part_1_table_2_col_1"), + part_1_table_2_col_2: new Dom(".part_1_table_2_col_2"), + part_1_table_2_col_3: new Dom(".part_1_table_2_col_3"), + part_1_table_2_col_4: new Dom(".part_1_table_2_col_4"), + part_1_table_2_col_5: new Dom(".part_1_table_2_col_5"), + part_1_table_2_col_7: new Dom(".part_1_table_2_col_7"), + part_1_table_2_col_8: new Dom(".part_1_table_2_col_8"), + part_1_table_2_col_9: new Dom(".part_1_table_2_col_9"), + part_1_table_2_col_10: new Dom(".part_1_table_2_col_10"), + // ! new items dom + + //part 2 cable added + + + + //* connection box table + part_2_connections_box: new Dom(".part_2_connections_box"), + part_1_1_connections_box: new Dom(".part_1_1_connections_box"), + part_1_2_connections_box: new Dom(".part_1_2_connections_box"), + + //new images added for part1 + + + // part2 calculation + + + + //* 29 feb new imgs + + + //* part3 images added + + + + // * useful images from previous Experiment + + btn_connections: new Dom("btn_connections"), + btn_connectons_completed: new Dom("btn_connectons_completed"), + btn_instructions: new Dom("btn_instructions"), + btn_nomenclature: new Dom("btn_nomenclature"), + // btn_plot: new Dom("btn_plot"), + btn_procedure: new Dom("btn_procedure"), + btn_reset: new Dom("btn_reset"), + btn_start_experiment: new Dom("btn_start_experiment"), + + part_1_slide_3_compo_1_off: new Dom("part_1_slide_3_compo_1_off"), + part_1_slide_3_compo_1_on: new Dom("part_1_slide_3_compo_1_on"), + part_1_slide_3_compo_1_text: new Dom("part_1_slide_3_compo_1_text"), + part_1_slide_3_compo_2_off: new Dom("part_1_slide_3_compo_2_off"), + part_1_slide_3_compo_2_on: new Dom("part_1_slide_3_compo_2_on"), + part_1_slide_3_compo_2_text: new Dom("part_1_slide_3_compo_2_text"), + part_1_incomplete_connection: new Dom("part_1_incomplete_connection"), + part_2_conncection_supply_1_red_button : new Dom("part_2_conncection_supply_1_red_button"), + part_2_conncection_supply_2_red_button : new Dom("part_2_conncection_supply_2_red_button"), + niddle_vGs: new Dom("niddle_vGs"), + niddle_vIn: new Dom("niddle_vIn"), + + + // * for PROCEDURE and instruction NOMENCLATURE + + + + //*EE6 images added + + btn_begin_experiment : new Dom("btn_begin_experiment"), + btn_conclusion : new Dom("btn_conclusion"), + btn_connection_completed : new Dom("btn_connection_completed"), + btn_make_connection : new Dom("btn_make_connection"), + btn_plot : new Dom("btn_plot"), + btn_procedure : new Dom("btn_procedure"), + component_1_on_text : new Dom("component_1_on_text"), + component_2_on_text : new Dom("component_2_on_text"), + part_1_1_cable_a2 : new Dom("part_1_1_cable_a2"), + part_1_1_cable_e : new Dom("part_1_1_cable_e"), + part_1_1_cable_n2 : new Dom("part_1_1_cable_n2"), + part_1_1_cable_p1 : new Dom("part_1_1_cable_p1"), + part_1_1_cable_p2 : new Dom("part_1_1_cable_p2"), + part_1_1_cable_r2 : new Dom("part_1_1_cable_r2"), + part_1_1_cable_v1 : new Dom("part_1_1_cable_v1"), + part_1_1_cable_v2 : new Dom("part_1_1_cable_v2"), + part_1_1_calculations : new Dom("part_1_1_calculations"), + part_1_1_components : new Dom("part_1_1_components"), + part_1_1_conclusion_box : new Dom("part_1_1_conclusion_box"), + part_1_1_instruction_box : new Dom("part_1_1_instruction_box"), + part_1_1_nomenclature_box : new Dom("part_1_1_nomenclature_box"), + part_1_1_procedure_box : new Dom("part_1_1_procedure_box"), + part_1_2_cable_a1 : new Dom("part_1_2_cable_a1"), + part_1_2_cable_cp : new Dom("part_1_2_cable_cp"), + part_1_2_cable_dvp : new Dom("part_1_2_cable_dvp"), + part_1_2_cable_e : new Dom("part_1_2_cable_e"), + part_1_2_cable_n2 : new Dom("part_1_2_cable_n2"), + part_1_2_cable_p1 : new Dom("part_1_2_cable_p1"), + part_1_2_cable_p2 : new Dom("part_1_2_cable_p2"), + part_1_2_cable_r2 : new Dom("part_1_2_cable_r2"), + part_1_2_cable_v1 : new Dom("part_1_2_cable_v1"), + part_1_2_cable_v2 : new Dom("part_1_2_cable_v2"), + part_1_2_calculations : new Dom("part_1_2_calculations"), + part_1_2_components : new Dom("part_1_2_components"), + part_1_2_conclusion_box : new Dom("part_1_2_conclusion_box"), + part_1_2_instruction_box : new Dom("part_1_2_instruction_box"), + part_1_2_nomenclature_box : new Dom("part_1_2_nomenclature_box"), + part_1_2_procedure_box : new Dom("part_1_2_procedure_box"), + part_2_cable_a2 : new Dom("part_2_cable_a2"), + part_2_cable_e : new Dom("part_2_cable_e"), + part_2_cable_n2 : new Dom("part_2_cable_n2"), + part_2_cable_p1 : new Dom("part_2_cable_p1"), + part_2_cable_p2 : new Dom("part_2_cable_p2"), + part_2_cable_r2 : new Dom("part_2_cable_r2"), + part_2_cable_v1 : new Dom("part_2_cable_v1"), + part_2_cable_v2 : new Dom("part_2_cable_v2"), + part_2_cable_vg1 : new Dom("part_2_cable_vg1"), + part_2_cable_vg2 : new Dom("part_2_cable_vg2"), + part_2_calculations : new Dom("part_2_calculations"), + part_2_components : new Dom("part_2_components"), + part_2_conclusion_box : new Dom("part_2_conclusion_box"), + part_2_nomenclature_box : new Dom("part_2_nomenclature_box"), + part_2_procedure_box : new Dom("part_2_procedure_box"), + select_option_1_1 : new Dom("select_option_1_1"), + select_option_1_2 : new Dom("select_option_1_2"), + select_option_2 : new Dom("select_option_2"), + select_option_full : new Dom("select_option_full"), + slider_thumb : new Dom("slider_thumb"), + part_2_instruction_box : new Dom("part_2_instruction_box"), + btn_procedure_calculations : new Dom("btn_procedure_calculations"), + + //! Experimental section images added + + btn_1: new Dom("btn_1"), + btn_2: new Dom("btn_2"), + btn_click: new Dom("btn_click"), + circle: new Dom("circle"), + frame_1: new Dom("frame_1"), + frame_2: new Dom("frame_2"), + frame_3: new Dom("frame_3"), + menu_page: new Dom("menu_page"), + val_vgs: new Dom("val_vgs"), + val_vin: new Dom("val_vin"), + + domQs1: new Dom("domQs1"), + domQs2: new Dom("domQs2"), + domQs3: new Dom("domQs3"), + domQs4: new Dom("domQs4"), + domQs5: new Dom("domQs5"), + domQs6: new Dom("domQs6"), + + chart: [ + (graph1 = null), + (graph2 = null), + (graph3 = null), + (graph4 = null), + (graph5 = null), + (graph6 = null), + (graph7 = null), + ], + + chart: { + label1: { + x: "Label 2", + y: "Label 1", + }, + label2: { + x: "Label 2", + y: "Label 1", + }, + label3: { + x: "Label 2", + y: "Label 1", + }, + label4: { + x: "Label 2", + y: "Label 1", + }, + label5: { + x: "Label 2", + y: "Label 1", + }, + label6: { + x: "Label 2", + y: "Label 1", + }, + label7: { + x: "Label 2", + y: "Label 1", + }, + }, + }, + // ! To Plot graph + plotGraph( + ctx, + graphIdx, + data, + dataLabel, + xLabel = null, + yLabel = null, + beginAtZero = false, + startEmpty = false, + ) { + // for label + Scenes.items.yLabel.set(504, 263).setContent(yLabel).styles({ + backgroundColor: "transperant", + textAlign: "center", + color: "black", + width: "170px", + rotate: "-90deg", + zIndex: 10, + }); + Scenes.items.xLabel.set(664, 375).setContent(xLabel).styles({ + backgroundColor: "transperant", + color: "black", + width: "fit-content", + zIndex: 10, + }); + + // ! Destroy old graph + let graphRef = Scenes.items.chart[graphIdx]; + if (graphRef != null) { + graphRef.destroy(); + } + + // temprory dataset + let datasets = [ + { + label: dataLabel, + fill: false, + borderColor: "red", + backgroundColor: "red", + data: data, + display: false, + }, + ] + + if(startEmpty){ + datasets=[] + } + + graphRef = new Chart(ctx, { + type: "scatter", + plugins: [ + { + // afterDraw: chart => { + // var ctx = chart.chart.ctx; + // ctx.save(); + // ctx.textAlign = 'center'; + // ctx.font = '18px Arial'; + // ctx.fillStyle = 'black'; + // ctx.fillText('Output Power (P )', chart.chart.width / 2, chart.chart.height - 24); + // ctx.textAlign = 'left'; + // ctx.font = '10px Arial'; + // ctx.fillText('0', chart.chart.width - 119, chart.chart.height - 12); + // ctx.restore(); + // }, + }, + ], + data: { + datasets: datasets + }, + options: { + responsive: true, + maintainAspectRatio: false, + scales: { + yAxes: [ + { + scaleLabel: { + display: false, + labelString: yLabel, + fontColor: "black", + fontSize: 17, + }, + ticks: { + beginAtZero: beginAtZero, + fontColor: "black", + fontSize: 14, + }, + }, + ], + xAxes: [ + { + scaleLabel: { + display: false, + labelString: xLabel, + fontColor: "black", + fontSize: 17, + }, + ticks: { + beginAtZero: beginAtZero, + fontColor: "black", + fontSize: 14, + }, + }, + ], + }, + }, + }); + + Scenes.items.chart[graphIdx] = graphRef; + return graphRef + }, + + // for adding new datasets to graph + graphFeatures: { + addDataset(chart, label, bgColor, data) { + chart.data.datasets.push({ + label: label, + fill: false, + borderColor: bgColor, + backgroundColor: bgColor, + data: data, + }); + chart.update(); + }, + addData(chart, index, data) { + console.log(data); + if (data.length > 0) { + chart.data.datasets[index].data = data; + } else { + chart.data.datasets[index].data.push(data); + } + chart.update(); + }, + getSizeOfDatasets(chart){ + return chart.data.datasets.length + } + }, + deleteAll() { + for (i in this.img) { + Scenes.img[i].hide(); + } + for (i in this.items) { + if (i == "header" || i == "stepTitle" || i == "stepDescription") { + continue; + } + hide(Scenes.items[i]); + } + }, + // for content adder btn box + contentAdderAddBtn(text) { + Scenes.items.contentAdderBox.item.innerHTML += `
  • ${text}
  • `; + }, + currentStep: 0, + subCurrentStep: 0, + resetSubStep() { + this.subCurrentStep = 0; + }, + incCurrentSubStep() { + this.subCurrentStep++; + }, + setStepHeading(step, description,hide) { + Scenes.items.stepTitle.setContent(step); + Scenes.items.stepDescription.setContent(description); + Scenes.items.stepHeading.show("flex").push(); + if(hide){ + let st={ + visibility: "hidden" + } + Scenes.items.stepTitle.styles(st) + Scenes.items.stepDescription.styles(st) + } + }, + + //* for hover on instuction , procedure and nomenclature + + // not done yet + popupImgHoverdConclusion:[false,false,false], + showPopup(step){ + + let instructionBtn = Scenes.items.btn_instructions.zIndex(100) + let procedureBtn = Scenes.items.btn_procedure_calculations.zIndex(100) + let nomenclatureBtn = Scenes.items.btn_nomenclature.zIndex(100) + let conclusionBtn = Scenes.items.btn_conclusion.zIndex(100) + let instructionImg, procedureImg, nomenclatureImg, conclusionImg; + + let imgs = [ + instructionImg, + procedureImg, + nomenclatureImg, + conclusionImg + ] + + let btn = [ + instructionBtn, + procedureBtn, + nomenclatureBtn, + conclusionBtn, + ] + + let speakConclusion = null + let calledFor = -1 // index of conclusion btn + + switch(step){ + case "1_1" : + instructionImg = Scenes.items.part_1_1_instruction_box.set(-242,-329,800).zIndex(50).hide() + procedureImg = Scenes.items.part_1_1_procedure_box.set(-150,-500).zIndex(50).hide() + nomenclatureImg = Scenes.items.part_1_1_nomenclature_box.set(-374,null,800).zIndex(50).hide() + conclusionImg = Scenes.items.part_1_1_conclusion_box.set(null,-140,600).zIndex(50).hide() + speakConclusion = ()=>{ + setCC("From these experiments and the plots it is clear that, Since IGBT is a voltage controlled device, by changing the gate-to-emitter voltage,", 25) + setCC(" the output characteristics were generated. These characteristics clearly display three operating regions of IGBT which are cutoff, linear and saturation.",25) + } + calledFor = 0 + break; + + case "1_2" : + instructionImg = Scenes.items.part_1_2_instruction_box.set(-135,-46,500).hide().zIndex(50) + procedureImg = Scenes.items.part_1_2_procedure_box.set(-100,80,500).hide().zIndex(50) + nomenclatureImg = Scenes.items.part_1_2_nomenclature_box.set(-100,0,400).hide().zIndex(50) + conclusionImg = Scenes.items.part_1_1_conclusion_box.set(10,5,700).hide().zIndex(50) + speakConclusion = ()=>{ + setCC("From these experiments and the plots it is clear that, Since IGBT is a voltage controlled device, by changing the gate-to-emitter voltage,", 25) + setCC("the output characteristics were generated. These characteristics clearly display three operating regions of IGBT which are cutoff, linear and saturation.",25) + } + calledFor = 1 + break; + + case "2" : + instructionImg = Scenes.items.part_2_instruction_box.set(-135,-46,500).hide().zIndex(50) + procedureImg = Scenes.items.part_2_procedure_box.set(-80,-100,500).hide().zIndex(50) + nomenclatureImg = Scenes.items.part_2_nomenclature_box.set(-100,0,500).hide().zIndex(50) + conclusionImg = Scenes.items.part_1_1_conclusion_box.set(10,-10,700).hide().zIndex(50) + speakConclusion = ()=>{ + setCC("From these experiments and the plots it is clear that, In IGBT, the collector current increases with increasing gate-to-emitter voltage.") + } + calledFor = 2 + break; + } + + + + let showInstructionImg = function(){ + instructionImg.show().zIndex(40) + } + + let showProcedureImg = function(){ + procedureImg.show().zIndex(40) + } + + let showNomenclatureImg = function(){ + nomenclatureImg.show().zIndex(40) + } + let showConclusionImg = function(){ + // Dom.setBlinkArrowRed(-1) + conclusionImg.show().zIndex(40) + if(!Scenes.popupImgHoverdConclusion[calledFor]){ + speakConclusion() + Scenes.popupImgHoverdConclusion[calledFor] = true + setTimeout(()=>{ + Dom.setBlinkArrow(true, 790, 544).play(); + Dom.setBlinkArrowRed(-1) + // setCC("Click 'Next' to go to next step"); + setIsProcessRunning(false); + },25000) + } + } + + let hideInstructionImg = function(){ + instructionImg.hide() + } + + let hideProcedureImg = function(){ + procedureImg.hide() + } + + let hideNomenclatureImg = function(){ + nomenclatureImg.hide() + + } + let hideConclusionImg = function(){ + conclusionImg.hide() + + } + + + btn[0].item.onmouseover = showInstructionImg + btn[0].item.onmouseout = hideInstructionImg + + btn[1].item.onmouseover = showProcedureImg + btn[1].item.onmouseout = hideProcedureImg + + btn[2].item.onmouseover = showNomenclatureImg + btn[2].item.onmouseout = hideNomenclatureImg + + btn[3].item.onmouseover = showConclusionImg + btn[3].item.onmouseout = hideConclusionImg + }, + // for typing hello text + intru: null, + intruVoice: null, + optionsDone: [0, 0, 0, 0], + steps: [ + (intro = () => { + // remove all dom element for back and setProcessRunning + setIsProcessRunning(true); + + // starting elements + + // subtitle + setTimeout(() => { + setCC("Enter your name and click on 'Start' to start the experiment"); + }, 500); + Scenes.items.header.set(0, 120).show("flex"); + let inputWindow = get(".user-input"); + show(inputWindow, "flex"); + let man = new Dom("man").set(650, 80).push(); + + let submitBtn = get("#nameSubmitBtn"); + submitBtn.onclick = () => { + student_name = get("#stuName").value; + let error = get(".user-input .error"); + // todo remove comment + if (student_name.trim() == "") { + show(error); + return; + } + // take only first space + let fName = student_name.slice(0, student_name.indexOf(" ")); + hide(error); + let tl = anime.timeline({ + easing: "easeOutExpo", + duration: 1000, + }); + tl.add({ + targets: ".anime-header", + top: 0, + }) + .add({ + targets: ".user-input", + opacity: 0, + }) + .add({ + targets: man.item, + translateX: -280, + }) + .add({ + targets: Scenes.items.talk_cloud.item, + begin() { + // Scenes.items.tempText.innerHTML = `👋 Hey!
    ${fName}`; + Scenes.items.tempText.item.style.fontWeight = "bold"; + // show(Scenes.items.tempText); + intru = new Typed(Scenes.items.tempText.item, { + strings: ["", `Hey!👋
    ${fName}`], + typeSpeed: 25, + }); + Scenes.items.tempText.set(482, 1); + textToSpeach(`Hey! ${fName}`); + textToSpeach( + "Welcome to Foundation Wall in Foamwork Experiment of Foamwork Technology in Civil Engineering Virtual Lab developed by Prof. K. N. Jha, Department of Civil Engineering, IIT Delhi." + ); + Scenes.items.talk_cloud.set(450, -40, 180).push(); + setCC(""); + }, + endDelay: 2000, + opacity: [0, 1], + }) + .add({ + begin() { + // to hide previous step images + intru.destroy(); + Dom.hideAll(); + Scenes.items.welcomeBox.show("flex"); + }, + }) + .add({ + duration: 12000, + complete() { + setCC("Click 'Next' to go to next step"); + Dom.setBlinkArrow(true, 790, 444).play(); + setIsProcessRunning(false); + }, + }); + }; + return true; + }), + (objective = function () { + setIsProcessRunning(true); + Dom.hideAll(); + + // require + let btn_transparent = Scenes.items.btn_transparent.set().zIndex(6000).item; + + Scenes.items.concept_development.set().styles({ + zIndex: "5000", + scale: "1 0.914", + top: "-143px", + position: "absolute", + }) + + // ! Slide ended enable the button next button + function checkIsSlideEnded(){ + let isSlideEnded = localStorage.getItem("isSlideEnded") + if(isSlideEnded=="true"){ + btn_transparent.disabled = false + setIsProcessRunning(false) + btn_transparent.classList.remove("btn-disabled") + // setCC("Click next to goto next slide.") + Dom.setBlinkArrowRed(true, 866, 420,30,null,-90).play(); + btn_transparent.onclick = ()=>{ + Scenes.next() + localStorage.setItem("isSlideEnded",false) + window.clearInterval(interval) + } + } + } + var interval = window.setInterval(checkIsSlideEnded, 1000) + + return true; + }), + //! EE6 step 1 + (step1 = function () { + Scenes.items.btn_next.show(); + + // todo all previous elements hide + Dom.hideAll(); + Scenes.items.contentAdderBox.item.innerHTML = ""; + + Scenes.setStepHeading("Step-1", "To Plot Different Characteristics."); + setCC("Click on the 'ICON' to plot the characteristics.") + + // * remove all previous restrictions + + //! * Required Elements + + Scenes.items.select_option_full.set(40, -20, 404, 850); + Scenes.items.select_option_1_1.set(680-45, -18, 70, 260).zIndex(1); + Scenes.items.select_option_1_2.set(675-45, 175-23, 70, 270).zIndex(1); + + + // ! onclicks for all options + let options = [ + Scenes.items.select_option_1_1, + Scenes.items.select_option_1_2, + ]; + + // ! Destroy Graphs + function destroyGraphs() { + for (let i = 0; i < 7; i++) { + if (Scenes.items.chart[i] != null) { + Scenes.items.chart[i].destroy(); + } + } + } + // destroyGraphs() + + Scenes.forMathematicalExpressionBtn = 0; + + const opOne = () => { + Scenes.optionsDone[0] = 1; + Scenes.forMathematicalExpressionBtn = 1; + Scenes.currentStep = 3 + Scenes.next() + } + const opTwo = () => { + Scenes.optionsDone[1] = 1; + Scenes.forMathematicalExpressionBtn = 2; + Scenes.currentStep = 4 + Scenes.next() + } + options[0].item.onclick = opOne; + options[1].item.onclick = opTwo; + + // ! if all options done then exit + let exit = true + for (let i of Scenes.optionsDone) { + if (i == 0) { + exit = false; + break; + } + } + + if (exit) { + // after complete + // Dom.setBlinkArrow(true, 790, 408).play(); + setCC("Simulation Done"); + setIsProcessRunning(false); + } + + return true; + }), + + (step2 = function () { + setIsProcessRunning(true); + + Scenes.setStepHeading("", "using meteres",true); + Scenes.items.btn_next.show(); + // ! Step Connection + + // required elements + let btns = [ + Scenes.items.btn_instructions.set(750 + 40, 190, 50).zIndex(10), + Scenes.items.btn_make_connection.set(750 + 40, 190 + 55, 50).zIndex(10), + Scenes.items.btn_connectons_completed + .set(750 + 40, 190 + 110, 50, 147) + .zIndex(10), + Scenes.items.btn_begin_experiment + .set(750 + 40, 190 + 165, 50, 147) + .zIndex(10), + Scenes.items.btn_reset.set(660, 190 + 165, 40).zIndex(10) + ] + + + // required images + let images = [ + Scenes.items.part_1_1_components.set(0,-70,495,975).zIndex(1), + Scenes.items.part_2_conncection_supply_1_red_button.set(171,79,28,25).zIndex(10), + Scenes.items.part_2_conncection_supply_2_red_button.set(178,315,29,25).zIndex(10), + Scenes.items.part_1_1_connections_box, + ] + + let cables = [ + Scenes.items.part_1_1_cable_p1.set(0,0).zIndex(2).hide(), + Scenes.items.part_1_1_cable_e.set(0,0).zIndex(3).hide(), + Scenes.items.part_1_1_cable_a2.set(0,0).zIndex(4).hide(), + Scenes.items.part_1_1_cable_r2.set(0,0).zIndex(5).hide(), + Scenes.items.part_1_1_cable_p2.set(0,0).zIndex(6).hide(), + Scenes.items.part_1_1_cable_n2.set(0,0).zIndex(7).hide(), + Scenes.items.part_1_1_cable_v1.set(0,0).zIndex(8).hide(), + Scenes.items.part_1_1_cable_v2.set(0,0).zIndex(9).hide(), + ] + + // ! for increasing the size + let l = 0,t = -70, h = 495, w = 975 + Scenes.items.part_1_1_components.set(l,t,h,w).zIndex(1) + cables.forEach(ele=>{ + ele.set(l,t,h,w).hide() + }) + + let cables_color = [ + "#970101", + "#1a2f55", + "#186a3b", + "#181818", + "#ffd90e", + "#181818", + "#cf426d", + "#560056", + ] + + + function hideConnectionStepImgs(){ + let allImages = [ + ...btns,...images,...cables + ] + allImages.forEach(ele=>{ + ele.hide() + }) + Dom.setBlinkArrowRed(-1) + } + + + //! Connection Part + // to enable startExp Button + let partConnectionsIsComplete = false + function partConnections(){ + // Connection Logic + Scenes.items.part_1_1_connections_box.set(514,-70).hide() + + // ! btn_reset onclick + Scenes.items.btn_reset.item.onclick = ()=>{ + let box_buttons_reset = document.querySelectorAll(".part_1_1_connections_box button") + let temps = { + textShadow: "none", + color: "black", + backgroundColor: "transparent" + } + box_buttons_reset.forEach(ele=>{ + let ele_Dom = new Dom(ele) + ele_Dom.styles(temps) + }) + Scenes.steps[3]() + } + + //! connection box onclick + Scenes.items.btn_make_connection.item.onclick = ()=>{ + Scenes.items.part_1_1_connections_box.show("flex") + // ! connection table arrow move + Dom.setBlinkArrowRed(true,580,5,35,null,90).play() + setCC("") + } + let box_buttons = document.querySelectorAll(".part_1_1_connections_box button") + + //! connection box onclick + let btnClickedCount = 0 + let connectionBtnArrow = 580 + let arrowLeftGap = 46 + box_buttons.forEach((ele,i)=>{ + ele.onclick = ()=>{ + // increasing count of complete connection + if(ele.style.color!="white"){ + btnClickedCount++ + //! move arrow + connectionBtnArrow += arrowLeftGap + Dom.setBlinkArrowRed(true,connectionBtnArrow,5,35,null,90).play() + + if(btnClickedCount==8){ + Dom.setBlinkArrowRed(true,745,305,35,null,180).play() + setCC("Click on 'Connections Completed'") + + Scenes.items.btn_connections.item.onclick = ()=>{} + } + } + + cables[i].show() + ele.style.backgroundColor = cables_color[i] + ele.style.color = "white" + ele.style.textShadow = "1px 1px black" + } + }) + + Dom.setBlinkArrowRed(true,745,250,35,null,180).play() + setCC("Click on 'Make Connections'") + + //! Onclick for check connections + Scenes.items.btn_connectons_completed.item.onclick = ()=>{ + + if(btnClickedCount==8){ + + //! First red button click + Scenes.items.part_1_slide_3_compo_1_text.set(208,114,50).zIndex(10) + Dom.setBlinkArrowRed(true,206,73).play() + setCC("Switch on Main Supply") + Scenes.items.part_2_conncection_supply_1_red_button.item.onclick = ()=>{ + + Scenes.items.part_2_conncection_supply_1_red_button.hide() + Scenes.items.part_1_slide_3_compo_1_text.hide() + //! Second red button click + + Scenes.items.part_1_slide_3_compo_2_text.set(212,348,56).zIndex(10) + Dom.setBlinkArrowRed(true,206,308).play() + setCC("Switch on Gate Supply") + + Scenes.items.part_2_conncection_supply_2_red_button.item.onclick = ()=>{ + Scenes.items.part_2_conncection_supply_2_red_button.hide() + Scenes.items.part_1_slide_3_compo_2_text.hide() + + Dom.setBlinkArrowRed(true,748,360,35,null,180).play() + setCC("Click on 'Begin Experiment'") + partConnectionsIsComplete = true + } + } + + } + else{ + Scenes.items.part_1_incomplete_connection.set(570,300,50).zIndex(10) + anime({ + targets: Scenes.items.part_1_incomplete_connection.item, + delay: 2000, + complete(){ + Scenes.items.part_1_incomplete_connection.hide() + } + }) + } + } + } + partConnections() + + //! Graph Part + function partCalculation(){ + // show arrow for R + Dom.setBlinkArrowRed(true,254,310,35,null,-90).play() + setCC("Select R") + // for recrod btn + let recordBtnIdx = 0 + Scenes.items.part_1_1_calculations.set(-15,-70,480,983) + Scenes.items.btn_plot.set(517, 381, 34, 70).zIndex(10) + Scenes.items.btn_procedure_calculations.set(494, -75, 35,123) + Scenes.items.btn_nomenclature.set(620, -75, 37, 160) + Scenes.items.btn_conclusion.set(787, -75, 37) + // * Calling slider + sliders.showSliderFor("1_1") + + // * Graph section + Scenes.items.graph_box_1.set(493,173,null,451).zIndex(10) + let ctx = Scenes.items.graph1.item + let graphIdx = 0 + let yLabel = "Collector Current (I)" + let xLabel = "Collector-to-Emitter Voltage(VCE)" + + let dataLabel = "" + // for setting xy label of graph in position + function setXYLabel(){ + Scenes.items.xLabel.set(619,387) + Scenes.items.yLabel.set(421,277) + } + // ploting empty graph + let graphRef = Scenes.plotGraph(ctx,graphIdx,[],dataLabel,xLabel,yLabel,true,true) + setXYLabel() + + // let table = new Dom(".part_2_table").set(600,-76).item + + let table = new Dom(".part3_table_two").set(493,-35).zIndex(10).item + + // * assume tempTitle10 as a btn record + let btn_record = sliders.btn_record.item + + // * StepTutorial + // show arrow for R + // and other blink arrow is on sliders.js + + // ! btn_record onclick + recordBtnIdx = 0 + btn_record.onclick = ()=>{ + let rows = table.tBodies[0].rows + if(recordBtnIdx > rows.length){ + return + } + + // * Filling Table + let colIdx = { + 6:1, + 7:2, + 8:3, + 9:4, + 10:5, + } + + let first_vGs_value = 6 + let last_vGs_value = 10 + let vGs_value = sliders.slider_vGs.getValue() + let vIn_value = sliders.slider_vIn.getValue() + let R_value = sliders.slider_R.getValue() + + updateValues(vIn_value,vGs_value,R_value) + + // seting column index for filling the table + if(vGs_value == first_vGs_value){ + // vds value + rows[recordBtnIdx+1].cells[0].innerHTML = Formulas.usingMeters.vDS(recordBtnIdx) + } + rows[recordBtnIdx+1].cells[colIdx[vGs_value]].innerHTML = Formulas.usingMeters.iD(values,colIdx[vGs_value],recordBtnIdx) + recordBtnIdx++ + // to plot the data + if(recordBtnIdx == rows.length - 1){ + + + // ! btn Plot onclick + Scenes.items.btn_plot.item.onclick = ()=>{ + // shwo arrwo for vGs + Dom.setBlinkArrowRed(true,0,320,35,null,-90).play() + setCC("Select VGE") + + // goto default position for vIn value and recordBtnIdx = 0 + function resetFun(){ + recordBtnIdx=0 + let defaultLeftPos = 10 + Anime.moveLeft(sliders.slider_vIn.item,defaultLeftPos) + } + // for adding data to graph + function addDataToGraph(){ + let data = [] + for(let row of rows){ + let x = row.cells[0].innerHTML + let y = row.cells[colIdx[vGs_value]].innerHTML + data.push({x,y}) + } + let bgColors = [ + "-", + "#da120f", + "#0607c2", + "#e413e6", + "#25de22", + "#000000" + ] + let bgColor = bgColors[colIdx[vGs_value]] + let labelForDataSet = `Vgs = ${vGs_value}V` + + // add data set + Scenes.graphFeatures.addDataset(graphRef,labelForDataSet,bgColor,data) + } + + if(vGs_value!=last_vGs_value){ + resetFun() + } + let totalDatasets = 5 + if(Scenes.graphFeatures.getSizeOfDatasets(graphRef) < totalDatasets){ + addDataToGraph() + } + + // end the slide + if(vGs_value==last_vGs_value){ + Dom.setBlinkArrowRed(true,840,-30,null,null,90).play() + setCC("Goto 'Conclusion'") + // for going to the second step + Scenes.currentStep = 2 + } + } + } + } + + } + + //to show btn popup + Scenes.showPopup("1_1") + + // todo remove + // hideConnectionStepImgs() + // partCalculation() + + //! onclick start btn + Scenes.items.btn_begin_experiment.item.onclick = ()=>{ + // to enable the button + if(partConnectionsIsComplete){ + // * Hide preivous + hideConnectionStepImgs() + // * calculation part + partCalculation() + //to show btn popup + Scenes.showPopup("1_1") + } + } + + return true + }), + + (step3 = function () { + setIsProcessRunning(true); + Scenes.setStepHeading("", "using oscilloscope",true) + Scenes.items.btn_next.show(); + // ! Step Connection + + // required elements + let temp = 16 + let btns = [ + Scenes.items.btn_instructions.set(750 + 75,210+ 10-temp, 40).zIndex(20), + Scenes.items.btn_connections.set(750 + 75,210+ 55-temp, 40).zIndex(20), + Scenes.items.btn_connectons_completed + .set(750 + 75,210+ 100-temp, 50, 120) + .zIndex(20), + Scenes.items.btn_start_experiment + .set(750 + 75,210+ 153-temp, 50, 120) + .zIndex(20), + Scenes.items.btn_reset.set(755, 207+175-temp, 30).zIndex(20), + ] + + // required images + let images = [ + Scenes.items.part_1_2_components.set(-0,-70,480,983).zIndex(1), + Scenes.items.part_2_conncection_supply_1_red_button.set(145, 68, 29, 27).zIndex(20), + Scenes.items.part_2_conncection_supply_2_red_button.set(149, 320, 27, 23).zIndex(20), + Scenes.items.part_1_2_connections_box, + ] + + let cables = [ + Scenes.items.part_1_2_cable_p1.set(0,0).zIndex(10).hide(), + Scenes.items.part_1_2_cable_e.set(0,0).zIndex(11).hide(), + Scenes.items.part_1_2_cable_r2.set(0,0).zIndex(12).hide(), + Scenes.items.part_1_2_cable_p2.set(0,0).zIndex(13).hide(), + Scenes.items.part_1_2_cable_n2.set(0,0).zIndex(14).hide(), + Scenes.items.part_1_2_cable_dvp.set(0,0).zIndex(15).hide(), + Scenes.items.part_1_2_cable_cp.set(0,0).zIndex(16).hide(), + Scenes.items.part_1_2_cable_a1.set(0,0).zIndex(17).hide(), + Scenes.items.part_1_2_cable_v1.set(0,0).zIndex(18).hide(), + Scenes.items.part_1_2_cable_v2.set(0,0).zIndex(19).hide(), + ] + + // ! for increasing the size + let l = 0,t = -70, h = 485, w = 945 + Scenes.items.part_1_2_components.set(l,t,h,w).zIndex(1) + cables.forEach(ele=>{ + ele.set(l,t,h,w).hide() + }) + + let cables_color = [ + "#e40d0d", + "#162848", + "#037c3a", + "#020202", + "#ffe714", + "#555252", + "#9d9d9d", + "#0f1f3b", + "#974f1e", + "#670202", + ] + + function hideConnectionStepImgs(){ + let allImages = [ + ...btns,...images,...cables + ] + allImages.forEach(ele=>{ + ele.hide() + }) + Dom.setBlinkArrowRed(-1) + } + + //! Connection Part + // to enable startExp Button + let partConnectionsIsComplete = false + function partConnections(){ + // Connection Logic + Scenes.items.part_1_2_connections_box.set(410,-78).hide() + + // ! btn_reset onclick + Scenes.items.btn_reset.item.onclick = ()=>{ + let box_buttons_reset = document.querySelectorAll(".part_1_2_connections_box button") + let temps = { + textShadow: "none", + color: "black", + backgroundColor: "transparent" + } + box_buttons_reset.forEach(ele=>{ + let ele_Dom = new Dom(ele) + ele_Dom.styles(temps) + }) + Scenes.steps[4]() + } + + //! connection box onclick + Scenes.items.btn_connections.item.onclick = ()=>{ + Scenes.items.part_1_2_connections_box.show("flex") + // ! connection table arrow move + Dom.setBlinkArrowRed(true,469,-4,35,null,90).play() + setCC("") + } + let box_buttons = document.querySelectorAll(".part_1_2_connections_box button") + + //! connection box onclick + let btnClickedCount = 0 + let connectionBtnArrow = 469 + let arrowLeftGap = 43 + box_buttons.forEach((ele,i)=>{ + ele.onclick = ()=>{ + // increasing count of complete connection + if(ele.style.color!="white"){ + btnClickedCount++ + //! move arrow + connectionBtnArrow += arrowLeftGap + Dom.setBlinkArrowRed(true,connectionBtnArrow,-4,35,null,90).play() + + if(btnClickedCount==10){ + Dom.setBlinkArrowRed(true,776,305,35,null,180).play() + setCC("Click on 'Connections Completed'") + + Scenes.items.btn_connections.item.onclick = ()=>{} + } + } + + cables[i].show() + ele.style.backgroundColor = cables_color[i] + ele.style.color = "white" + ele.style.textShadow = "1px 1px black" + } + }) + + Dom.setBlinkArrowRed(true,776,250,35,null,180).play() + setCC("Click on 'Make Connections'") + + //! Onclick for check connections + Scenes.items.btn_connectons_completed.item.onclick = ()=>{ + + if(btnClickedCount==10){ + + //! First red button click + Scenes.items.component_1_on_text.set(178,96,50).zIndex(20) + Dom.setBlinkArrowRed(true,170,65).play() + setCC("Switch on Main Supply") + Scenes.items.part_2_conncection_supply_1_red_button.item.onclick = ()=>{ + + Scenes.items.part_2_conncection_supply_1_red_button.hide() + Scenes.items.component_1_on_text.hide() + //! Second red button click + + Scenes.items.component_2_on_text.set(168,338,56).zIndex(20) + Dom.setBlinkArrowRed(true,166,306).play() + setCC("Switch on Gate Supply") + + Scenes.items.part_2_conncection_supply_2_red_button.item.onclick = ()=>{ + Scenes.items.part_2_conncection_supply_2_red_button.hide() + Scenes.items.component_2_on_text.hide() + + Dom.setBlinkArrowRed(true,776,360,35,null,180).play() + setCC("Click on 'Begin Experiment'") + partConnectionsIsComplete = true + } + } + + } + else{ + Scenes.items.part_1_incomplete_connection.set(660,100,50).zIndex(10) + anime({ + targets: Scenes.items.part_1_incomplete_connection.item, + delay: 2000, + complete(){ + Scenes.items.part_1_incomplete_connection.hide() + } + }) + } + } + } + partConnections() + + //! Graph Part + function partCalculation(){ + // show arrow for R + Dom.setBlinkArrowRed(true,254,310,35,null,-90).play() + setCC("Select R") + Scenes.items.part_1_2_calculations.set(3,-70,480,963) + Scenes.items.btn_procedure_calculations.set(511,-57,37,110).zIndex(10) + Scenes.items.btn_nomenclature.set(624,-57,37,160).zIndex(10) + Scenes.items.btn_conclusion.set(787, -57, 37).zIndex(10) + + // neddle vGs rotate (-1,multipoint) deg + Scenes.items.niddle_vGs.set(547,71,74).rotate(-1).zIndex(10) + // neddle vIn rotate (-1,126) deg + Scenes.items.niddle_vIn.set(765,71,74).rotate(-1).zIndex(10) + + // * Calling slider + sliders.showSliderFor("1_2") + + // * Graph section + Scenes.items.graph_box_2.set(511,131,282,432).zIndex(10) + let ctx = Scenes.items.graph2.item + let graphIdx = 1 + let xLabel = "Collector-to-Emitter Voltage(VCE)" + let yLabel = "Collector Current (I)" + + let dataLabel = "" + // for setting xy label of graph in position + function setXYLabel(){ + Scenes.items.xLabel.set(616,383) + Scenes.items.yLabel.set(442,262) + } + // ploting empty graph + let graphRef = Scenes.plotGraph(ctx,graphIdx,[],dataLabel,xLabel,yLabel,true,true) + setXYLabel() + + // let table = new Dom(".part_2_table").set(600,-76).item + + let table = null + + // * assume tempTitle10 as a btn record + let btn_record = sliders.btn_record.item + + // ! btn_record onclick + let recordBtnIdx = 0 + // ! calculation value object + let calculationValues = { + vDs: [0,10,20,30,40,50,60], + iD: [ + [],[],[],[],[] + ], + } + btn_record.onclick = ()=>{ + let vGs_value = sliders.slider_vGs.getValue() + let vIn_value = Math.round(sliders.slider_vIn.getValue()) + let R_value = sliders.slider_R.getValue() + let firstValue = 0 + + updateValues(vIn_value,vGs_value,R_value) + + let vGs_idx = { + 6:1, + 7:2, + 8:3, + 9:4, + 10:5, + } + let first_vGs_value = 4 + let last_vGs_value = 15 + + // vIn values + let vIn_accept_range = [0,40,80,120,160,200,240] + let acceptedValueIndex = vIn_accept_range.indexOf(vIn_value) + let datasetIndex = vGs_idx[vGs_value] - 1 // which value perform for vgs + + // for the first value add data set + if(vIn_value == firstValue){ + // add datasets to graph + let bgColors = [ + "_", + "#da120f", + "#0607c2", + "#e413e6", + "#25de22", + "#000000" + ] + let bgColor = bgColors[vGs_idx[vGs_value]] + let labelForDataSet = `Vgs = ${vGs_value}V` + + // add data set + Scenes.graphFeatures.addDataset(graphRef,labelForDataSet,bgColor,[]) + + // * add first value also + let x = Formulas.usingOscilloscope.vDS(acceptedValueIndex) + let y = Formulas.usingOscilloscope.iD(values,vGs_idx[vGs_value],x) + Scenes.graphFeatures.addData(graphRef,datasetIndex,{x,y}) + } + else{ + // adding data to graph + // datasetIndex = vGs_idx[vGs_value] - 1 + + //! add formula value here + let x = Formulas.usingOscilloscope.vDS(acceptedValueIndex) + let y = Formulas.usingOscilloscope.iD(values,vGs_idx[vGs_value],acceptedValueIndex) + let data = {x,y} + console.log("S: ",vGs_value,vGs_idx[vGs_value]) + + Scenes.graphFeatures.addData(graphRef,datasetIndex,data) + } + } + + } + + // todo remove + // hideConnectionStepImgs() + // partCalculation() + + //to show btn popup + Scenes.showPopup("1_2") + + //! onclick start btn + Scenes.items.btn_start_experiment.item.onclick = ()=>{ + // to enable the button + if(partConnectionsIsComplete){ + // * Hide preivous + hideConnectionStepImgs() + + Scenes.realCurrentStep = 4 + console.log(`RealCurrentStep: ${Scenes.realCurrentStep}`) + + // * calculation part + partCalculation() + + //to show btn popup + Scenes.showPopup("1_2") + } + } + + return true + }), + + // !Experimental result section + //! R LOAD Waveforms section + (step6 = function () { + setIsProcessRunning(true); + // to hide previous step + Scenes.items.btn_transparent.hide() + //! Required Items + Scenes.items.btn_next.show(); + setCC("") + + //r load click + let arrowIdx = 0; + let arrows = [ + // () => { + // Dom.setBlinkArrowRed(true, 669, 73, 30, null, 180).play(); + // arrowIdx++; + // }, + () => { + Dom.setBlinkArrowRed(true, 518, 177, 30, null, 180).play(); + arrowIdx++; + }, + () => { + Dom.setBlinkArrowRed(true, 518, 177 + 85, 30, null, 180).play(); + arrowIdx++; + }, + () => { + Dom.setBlinkArrowRed(-1); + }, + ]; + + arrows[arrowIdx](); + // setCC( + // "To View the experimental waveforms select the parameters and proceed further." + // ); + Scenes.items.menu_page.set(30, -11, 435); + // Scenes.items.circle.set(426, 362, 76).hide(); + + let btns = [ + // Scenes.items.btn_input_voltage.set(719, 159 - 92, 47).zIndex(1), + Scenes.items.btn_1.set(558, 166, 52).zIndex(1), + Scenes.items.btn_2.set(558, 166 + 84, 60).zIndex(1), + ]; + + let vals = [ + // Scenes.items.val_v + // .set(719, 35 + 159 - 92, 47) + // .zIndex(1) + // .hide(), + Scenes.items.val_vin.set(763, 169, 47).zIndex(1).hide(), + Scenes.items.val_vgs.set(767, 255, 47).zIndex(1).hide(), + ]; + + let optionsClick = [0, 0]; + let btn_see_waveforms = Scenes.items.btn_click + .set(442, 374, 51) + .zIndex(1); + + btns.forEach((btn, idx) => { + btn.item.onclick = () => { + arrows[arrowIdx](); + vals[idx].show(); + optionsClick[idx] = 1; + if (optionsClick.indexOf(0) == -1) { + Scenes.items.circle.set(426, 362, 76); + btn_see_waveforms.item.classList.add("btn-img"); + let scaleBtn = anime({ + targets: Scenes.items.circle.item, + scale: [1, 1.1], + duration: 1000, + easing: "linear", + loop: true, + }); + btn_see_waveforms.item.onclick = () => { + scaleBtn.reset(); + waveformShow(); + }; + } + }; + }); + + let scenes = [ + Scenes.items.frame_1.set(0, 9, 420).hide(), + Scenes.items.frame_2.set(0, 9, 420).hide(), + Scenes.items.frame_3.set(0, 9, 420).hide(), + ]; + + let waveformShow = () => { + vals.forEach((_, idx) => { + btns[idx].hide(); + vals[idx].hide(); + }); + Scenes.items.circle.set(580, 346, 93).hide(); + Scenes.items.btn_click.hide(); + Scenes.items.menu_page.hide(); + + // Dom.setBlinkArrowRed(true, 555, 162, 30, null, 0).play(); + Dom.setBlinkArrowRed(-1); + + scenes[0].show(); + setCC( + "The purple curves are the output characteristics plots for different Gate-to-Emitter voltages." + ); + setCC( + "The x-axis is Collector-to-Emitter voltage while the y-axis is the collector current." + ); + + setTimeout(() => { + // setCC("Click 'Next' to go to next step"); + Dom.setBlinkArrow(true, 790, 415).play(); + setIsProcessRunning(false); + }, 9000); + }; + + return true; + }), + //! R LOAD CLICK 2 + (step7 = function () { + setIsProcessRunning(true); + + //! Required Items + Scenes.items.btn_next.show(); + // to hide previous step + Scenes.items.frame_2.set(0, 9, 420); + Dom.setBlinkArrowRed(true, 532, 280, 30, null, 0).play(); + + setCC( + "IGBT starts conducting at threshold Gate-to-Emitter voltage value of 5 V. Below this value, IGBT is in cutoff region." + ); + + setTimeout(() => { + // setCC("Click 'Next' to go to next step"); + Dom.setBlinkArrow(true, 790, 415).play(); + setIsProcessRunning(false); + }, 7000); + + //! Required Items + + return true; + }), + //! R LOAD CLICK 3 + (step8 = function () { + setIsProcessRunning(true); + + //! Required Items + Scenes.items.btn_next.show(); + // Scenes.items.slider_box.hide(); + + // to hide previous step + Scenes.items.frame_3.set(0, 9, 420); + // Dom.setBlinkArrowRed(true, 555, 317, 30, null, 0).play(); + // Dom.setBlinkArrowRed(-1) + + setCC( + "These characteristics clearly indicate three distinct regions: Cutoff, Linear and Active region." + ); + + setTimeout(() => { + setCC("IGBT Done ✅"); + // ! Merge Helper + nextBtn.addEventListener("click", () => { + Scenes.mergeProcessHelper() + }); + setIsProcessRunning(false); + // setCC("Click 'Next' to go to next step"); + // Dom.setBlinkArrow(true, 790, 415).play(); + }, 3000); + + //! Required Items + + return true; + }), + + ], + // ! For adding realcurrentstep in every step + // ! For tracking the current step accuratly + realCurrentStep: null, + setRealCurrentStep(){ + let count = 0 + this.steps.forEach((step,idx) => { + const constCount = count + let newStep = () => { + this.realCurrentStep = constCount; + console.log(`RealCurrentStep: ${this.realCurrentStep}`) + return step(); + }; + + count++; + let ignoreStepsForAdding = [4] + if(ignoreStepsForAdding.indexOf(idx) != -1) return + this.steps[idx] = newStep + }); + }, + back() { + //! animation isRunning + // if (isRunning) { + // return; + // } + if (this.currentStep > 1) { + Scenes.items.btn_next.setContent("Next"); + Scenes.items.btn_next.item.onclick = () => {}; + this.currentStep -= 2; + this.steps[this.currentStep](); + this.currentStep++; + backDrawerItem(); + backProgressBar(); + } + }, + next() { + if(!this.realCurrentStep){ + Scenes.setRealCurrentStep() + } + //! animation isRunning + if (isRunning) { + return; + } + if (this.currentStep < this.steps.length) { + if (this.steps[this.currentStep]()) { + nextDrawerItem(); + nextProgressBar(); + this.currentStep++; + } + } else { + } + }, + // ! For Merge Process Helper + mergeProcessHelper(goto="menu",done=true){ + let StepDone = JSON.parse(localStorage.getItem("StepDone")) + StepDone.IGBT = done + StepDone.goto = goto + localStorage.setItem("StepDone",JSON.stringify(StepDone)) + } +}; + +// * slider +// var rangeSlider = function () { +// var slider = $(".range-slider"), +// range = $(".range-slider__range"), +// value = $(".range-slider__value"); + +// slider.each(function () { +// value.each(function () { +// var value = $(this).prev().attr("value"); +// $(this).html(value); +// }); + +// range.on("input", function () { +// $(this).next(value).html(this.value); +// $(this).next(value).val(this.value); +// }); +// }); +// }; +// $(".resistance-input").on("keyup", () => { +// let slider = $(".slider_R .range-slider__range"); +// let input = document.querySelector(".resistance-input"); + +// let min = 1; +// let max = Number(slider.attr("max")); +// // if (input.value < min) { +// // input.value = min; +// // } +// if (input.value > max) { +// input.value = max; +// } +// slider.val(input.value); +// }); +// rangeSlider(); + +// stepcalling +Scenes.currentStep = 4 +Scenes.next() +// Scenes.steps[3]() +// Scenes.next() +// Scenes.next() + +const nextBtn = get(".btn-next"); + +const backBtn = get(".btn-back"); +nextBtn.addEventListener("click", () => { + Scenes.next(); +}); +backBtn.addEventListener("click", () => { + Scenes.back(); +}); + +// print certificate +get(".btn-save").addEventListener("click", () => { + window.print(); +}); + +let muteBtn = get(".btn-mute"); +muteBtn.addEventListener("click", () => { + if (isMute) { + isMute = false; + muteBtn.src = "./src/images/template_imgs/speech_off_btn.png"; + muteBtn.title = "Click to Mute"; + } else { + isMute = true; + muteBtn.src = "./src/images/template_imgs/speech_on_btn.png"; + muteBtn.title = "Click to Unmute"; + } +}); + +// ! Anime Header Hover Buttons +function btnPopupBox() { + let popupBtns = document.querySelectorAll(".btn-popup"); + let popupWindow = document.querySelector(".btn-popup-window"); + + popupBtns[0].onmouseover = () => { + popupWindow.src = Scenes.items.formulas_procedure.item.src; + }; + popupBtns[1].onmouseover = () => { + popupWindow.src = Scenes.items.formulas_nomenclautre.item.src; + }; + popupBtns[2].onmouseover = () => { + switch (Scenes.forMathematicalExpressionBtn) { + case 1: + popupWindow.src = Scenes.items.formulas_ideal.item.src; + break; + + case 2: + popupWindow.src = Scenes.items.formulas_non_ideal.item.src; + break; + + case 3: + popupWindow.src = Scenes.items.formulas_efficiency.item.src; + break; + + case 4: + popupWindow.src = Scenes.items.formulas_component_stress.item.src; + break; + + default: + popupWindow.src = Scenes.items.formulas_universal.item.src; + break; + } + }; +} +// btnPopupBox(); + +// i really enjoyed the voice of keybord +// its amazing + +// mouse position +// function getCursor(event) { +// let x = event.clientX; +// let y = event.clientY; +// let _position = `X: ${x - 419}
    Y: ${y - 169}`; + +// const infoElement = document.getElementById("info"); +// infoElement.innerHTML = _position; +// infoElement.style.top = y + "px"; +// infoElement.style.left = x + 20 + "px"; +// } + diff --git a/experiment/simulation/EE6/js/progressBar.js b/experiment/simulation/EE6/js/progressBar.js new file mode 100644 index 0000000..3bd0277 --- /dev/null +++ b/experiment/simulation/EE6/js/progressBar.js @@ -0,0 +1,39 @@ +// * progress bar +const prevBtns = document.querySelector(".btn-prev"); +const nextBtns = document.querySelector(".btn-next"); +const progress = document.getElementById("progress"); +const progressSteps = document.querySelectorAll(".progress-step"); + + +let currProgressStep = -1; +// total steps from the number of drawer items +let totalProgressSteps = document.querySelectorAll(".step").length; + +const nextProgressBar = () => { + if(currProgressStep < totalProgressSteps - 1){ + currProgressStep++; + updateProgressbar(); + } +}; + +const backProgressBar = () => { + if(currProgressStep > 0){ + currProgressStep--; + updateProgressbar(); + } +}; + +function updateProgressbar() { + progressSteps.forEach((progressStep, idx) => { + if (idx < currProgressStep + 1) { + progressStep.classList.add("progress-step-active"); + } else { + progressStep.classList.remove("progress-step-active"); + } + }); + + const progressActive = document.querySelectorAll(".progress-step-active"); + + progress.style.width = + ((progressActive.length - 1) / (progressSteps.length - 1)) * 100 + "%"; +} diff --git a/experiment/simulation/EE6/js/sliders.js b/experiment/simulation/EE6/js/sliders.js new file mode 100644 index 0000000..e9014bf --- /dev/null +++ b/experiment/simulation/EE6/js/sliders.js @@ -0,0 +1,391 @@ +const sliders = { + slider_vIn: new Dom(".slider_vIn"), + slider_vGs: new Dom(".slider_vGs"), + slider_R: new Dom(".slider_R"), + + slider_vIn_label: new Dom(".temp-title5"), + slider_vGs_label: new Dom(".temp-title6"), + slider_R_label: new Dom(".temp-title7"), + + //! we using temptitle10 as a record btn + // show we can update the table according to the button click + btn_record: new Dom(".temp-title10"), + + init(){ + this.updateLabels() + let styles = { + fontSize: "small", + padding: "0 5px", + textAlign: "center", + width: "fit-content", + color: "black", + border: "2px solid black", + backgroundColor: "white", + } + this.slider_vIn_label.styles(styles) + this.slider_vGs_label.styles(styles) + this.slider_R_label.styles(styles) + }, + + // part: 1_1, 1_2, 2 + showSliderFor(part){ + switch(part){ + case "1_1": + var temp2 = -10 + var temp1 = -62 + this.slider_vIn.set(10,31+temp1,23).zIndex(10) + this.slider_vIn_label.set(180+temp2,65+temp1) + + this.slider_vGs.set(2,370,23).zIndex(10) + this.slider_vGs_label.set(157,327) + + this.slider_R.set(253,365,23).zIndex(10) + this.slider_R_label.set(433,360) + + + // ! vGs onclick + var differences_vGs = [80, 103, 128, 153, 175]; + var vals_vGs = [6,7,8,9,10] + var currentDifferenceIndex_vGs = 0; + // for the slider vgs + var value_vGs = 0 + this.slider_vGs.item.onclick = ( )=>{ + if (currentDifferenceIndex_vGs < differences_vGs.length) { + // Get the current difference + var currentDifference = differences_vGs[currentDifferenceIndex_vGs]; + + // setting the value of label + value_vGs = vals_vGs[currentDifferenceIndex_vGs] + + // Animate the translation on each click + this.sliderAnime(this.slider_vGs,null,value_vGs,currentDifference) + currentDifferenceIndex_vGs++; + + // !we using temptitle10 as a record btn + // this.btn_record.item.click() + + // * show arrow for vIn + Dom.setBlinkArrowRed(true,13,-72,35,null,-90).play() + setCC("Select Vin") + } + } + + // ! vIn onclick + var defaultLeftPos = 10 + var differences_vIn = [44,67,92,116,141,165]; + var vals_vIn = [40,80,120,160,200,240] + var currentDifferenceIndex_vIn = 0; + // for slider vIn + this.slider_vIn.item.onclick = ()=>{ + if (currentDifferenceIndex_vIn < differences_vIn.length) { + // Get the current difference + var currentDifference = differences_vIn[currentDifferenceIndex_vIn]; + + // setting the value of label + var value = vals_vIn[currentDifferenceIndex_vIn] + + // Animate the translation on each click + this.sliderAnime(this.slider_vIn,null,value,currentDifference) + currentDifferenceIndex_vIn++; + + // !we using temptitle10 as a record btn + this.btn_record.item.click() + + // * show arrow for vIn + Dom.setBlinkArrowRed(true,13,-72,35,null,-90).play() + setCC("Select Vin") + + if(currentDifferenceIndex_vIn == differences_vIn.length){ + // * show arrow for plot + Dom.setBlinkArrowRed(true,529,343,35,null,-90).play() + setCC("Click on 'Plot'") + } + }else{ + // reset this value because of behaviour of slide + currentDifferenceIndex_vIn = 0 + } + } + + // ! R onclick + this.slider_R.item.onclick = ()=>{ + let value_R = 50 + var left = 304 + this.sliderAnime(this.slider_R,0,value_R,left) + + // * show arrow for vGs + Dom.setBlinkArrowRed(true,0,320,35,null,-90).play() + setCC("Select vGE") + + } + break + + case "1_2": + var temp2 = -23 + var temp1 = -80 + this.slider_vIn.set(62,-50,23).zIndex(10) + this.slider_vIn_label.set(252,-56) + + this.slider_vGs.set(8,369,23).zIndex(10) + this.slider_vGs_label.set(176,326) + + this.slider_R.set(275,354,23).zIndex(10) + this.slider_R_label.set(453,348) + + + // ! vGs onclick + var differences_vGs = [82,104,128,151,173]; + var vals_vGs = [6,7,8,9,10] + var niddle_vGs_deg = [63,74,84.5,96,106] + var currentDifferenceIndex_vGs = 0; + // for the slider vgs + var value_vGs = 0 + this.slider_vGs.item.onclick = ( )=>{ + Dom.setBlinkArrowRed(-1) + if (currentDifferenceIndex_vGs < differences_vGs.length) { + // Get the current difference + var currentDifference = differences_vGs[currentDifferenceIndex_vGs]; + + // setting the value of label + value_vGs = vals_vGs[currentDifferenceIndex_vGs] + + // Animate the translation on each click + this.sliderAnime(this.slider_vGs,null,value_vGs,currentDifference) + + // ! we using temptitle10 as a record btn + // this.btn_record.item.click() + // * rotate neddle + anime({ + targets: Scenes.items.niddle_vGs.item, + easing: "linear", + duration: 1000, + rotate: niddle_vGs_deg[currentDifferenceIndex_vGs], + complete(){ + // * show arrow for vIn + Dom.setBlinkArrowRed(true,53,-89,35,null,-90).play() + setCC("Select Vin") + } + }) + + currentDifferenceIndex_vGs++; + + } + } + + // ! vIn onclick + // neddle vIn rotate (-1,126) deg + var defaultRotatePos = -1 + // slider (11, 160) + var defaultLeftPos = 62 + // for slider vIn + var leftEndPixel = 212 + // 11, 160 + // label value 0 to 240 + let currentLabelValue = 0 + // vIn values + let vIn_accept_range = [0,40,80,120,160,200,240] + // onclick accept range for vgs + let vGs_accept_range = vals_vGs + this.slider_vIn.item.onclick = ()=>{ + Dom.setBlinkArrowRed(-1) + // vIn + if(currentDifferenceIndex_vGs > differences_vGs.length){ + return + } + // rotate slider with neddle + anime.timeline({ + easing: "linear", + duration: 8000, + }) + .add({ + targets: this.slider_vIn.item, + left: [defaultLeftPos, leftEndPixel,leftEndPixel, defaultLeftPos], + value: [0,240,240, 0], + update: ()=>{ + let labelValue = this.slider_vIn.getValue() + labelValue = Math.round(labelValue) + this.slider_vIn_label.setContent( + `${labelValue}
    volts` + ) + + // ! click the recrod btn + let acceptedValueIndex = vIn_accept_range.indexOf(labelValue) + if(acceptedValueIndex!=-1){ + this.btn_record.item.click() + // for disabling for old value + vIn_accept_range[acceptedValueIndex] = -1 + return + } + }, + complete:()=>{ + if(currentDifferenceIndex_vGs < differences_vGs.length){ + vIn_accept_range = [0,40,80,120,160,200,leftEndPixel] + + // * show arrow for vGs + Dom.setBlinkArrowRed(true,0,328,35,null,-90).play() + setCC("Select vGE") + } + else{ + currentDifferenceIndex_vGs++ + Dom.setBlinkArrowRed(true,840,-15,null,null,90).play() + setCC("Goto 'Conclusion'") + setTimeout(()=>{ + // Dom.setBlinkArrowRed(true, 790, 444).play(); + // setCC("IGBT Done ✅"); + setIsProcessRunning(false); + setCC("Click 'Next' to go to next step"); + + // ! Merge Helper + // nextBtn.addEventListener("click", () => { + // Scenes.mergeProcessHelper() + // }); + + },25000) + // for going to the second step + // Scenes.currentStep = 2 + } + } + },0) + .add({ + targets: Scenes.items.niddle_vIn.item, + rotate: [-1,126,126, -1] + },0) + } + + // ! R onclick + this.slider_R.item.onclick = ()=>{ + let value_R = 50 + var left = 323 + this.sliderAnime(this.slider_R,0,value_R,left) + + // * show arrow for vGs + Dom.setBlinkArrowRed(true,0,328,35,null,-90).play() + setCC("Select vGE") + } + break + + case "2": + this.slider_vIn.set(34,-44,23).zIndex(10) + this.slider_vIn_label.set(185,-10) + + this.slider_vGs.set(15,347,23).zIndex(10) + this.slider_vGs_label.set(248,343) + + this.slider_R.set(329,362-18,23).zIndex(10) + this.slider_R_label.set(502,347) + + + // ! vGs onclick + var differences = [43,70,96,123,150,176,202,222]; + var vals_vGs = [2,4,6,8,10,12,14,16] + var currentDifferenceIndex = 0; + // for the slider vgs + var value_vGs = 0 + this.slider_vGs.item.onclick = ( )=>{ + if (currentDifferenceIndex < differences.length) { + // Get the current difference + var currentDifference = differences[currentDifferenceIndex]; + // vals + value_vGs = vals_vGs[currentDifferenceIndex] + + // Animate the translation on each click + this.sliderAnime(this.slider_vGs,null,value_vGs, currentDifference) + + if(currentDifferenceIndex==0){ + // * show arrow for vIn + Dom.setBlinkArrowRed(true,22,-90,35,null,-90).play() + setCC("Select Vin") + } + else if(currentDifferenceIndex == differences.length - 1){ + // * show arrow for plot + Dom.setBlinkArrowRed(true,802,30,35,null,-90).play() + setCC("Click on 'Plot'") + } + else{ + // * show arrow for vGs + Dom.setBlinkArrowRed(true,0,302,35,null,-90).play() + setCC("Select vGE") + } + + currentDifferenceIndex++; + + // !we using temptitle10 as a record btn + this.btn_record.item.click() + } + } + + // ! vIn onclick + this.slider_vIn.item.onclick = ()=>{ + let value_vIn = 200 + let leftEndPixel = 162 + this.sliderAnime(this.slider_vIn,0,value_vIn,leftEndPixel) + + // * show arrow for vGs + Dom.setBlinkArrowRed(true,0,302,35,null,-90).play() + setCC("Select vGE") + } + + // ! R onclick + this.slider_R.item.onclick = ()=>{ + let value_R = 50 + this.sliderAnime(this.slider_R,0,value_R,376) + + // * show arrow for vGs + Dom.setBlinkArrowRed(true,0,302,35,null,-90).play() + setCC("Select vGE") + } + break + } + }, + sliderAnime(target,translateX,value,left="",complete=null){ + anime({ + targets: target.item, + translateX: `+=${translateX}`, + left: left, + easing: 'easeInOutQuad', + duration: 600, + complete: ()=> { + this.updateLabels() + if(complete!=null){ + complete() + } + } + }); + // set value of slider + target.item.attributes['value'].value = value + }, + updateLabels(){ + this.slider_vIn_label.setContent( + `${this.getVal(this.slider_vIn)}
    volts` + ) + this.slider_vGs_label.setContent( + `${this.getVal(this.slider_vGs)}
    volts` + ) + this.slider_R_label.setContent( + `${this.getVal(this.slider_R)}
    ohms` + ) + }, + labelAnime(target,value){ + // let currentValue = Number(target.item.innerHTML.slice(0,target.item.innerHTML.indexOf("<"))) + + // anime({ + // targets: target.item, + // duration: 600, + // easing: "linear", + // innerHTML: [currentValue,] + // }) + }, + getVal(dom){ + return dom.item.attributes['value'].value + }, + showSlider(part){ + setTimeout(() => { + sliders.init() + // Change this for your step + sliders.showSliderFor(part) + }, 1000); + } +} + +sliders.init() + + diff --git a/experiment/simulation/EE6/js/src.js b/experiment/simulation/EE6/js/src.js new file mode 100644 index 0000000..f53e836 --- /dev/null +++ b/experiment/simulation/EE6/js/src.js @@ -0,0 +1,187 @@ +const src = { + // pick imgs from the dom + + allImgs: [], + allImgsDom: document.querySelectorAll(".main-window-imgs"), + allVideosDom: document.querySelectorAll(".main-window-videos"), + + // ! new added + allQsDom: document.querySelectorAll(".qs"), + + set() { + let index = 0 + this.allItems = { + + // * Tempalte Buttons + arrowRound: this.allImgsDom[index++], + blinkArrow: this.allImgsDom[index++], + laerrow: this.allImgsDom[index++], + laerrow2: this.allImgsDom[index++], + logo: this.allImgsDom[index++], + man: this.allImgsDom[index++], + measurearrow: this.allImgsDom[index++], + measurearrow2: this.allImgsDom[index++], + redsize: this.allImgsDom[index++], + speech_off_btn: this.allImgsDom[index++], + speech_on_btn: this.allImgsDom[index++], + talk_cloud: this.allImgsDom[index++], + iit_delhi_logo: this.allImgsDom[index++], + // * --xx Tempalte Buttons Ended xx-- + + + // !EE 4 images added + + + + // part2 + + + + //* new images added + + + + // part2 calculation + + + + //part3 images added + + + + + // * for PROCEDURE and instruction NOMENCLATURE + + //* useful images from previous experiment + + btn_connections:this.allImgsDom[index++], + btn_connectons_completed:this.allImgsDom[index++], + btn_instructions:this.allImgsDom[index++], + btn_nomenclature:this.allImgsDom[index++], + // btn_plot:this.allImgsDom[index++], + btn_procedure:this.allImgsDom[index++], + btn_reset:this.allImgsDom[index++], + btn_start_experiment:this.allImgsDom[index++], + + part_1_slide_3_compo_1_off:this.allImgsDom[index++], + part_1_slide_3_compo_1_on:this.allImgsDom[index++], + part_1_slide_3_compo_1_text:this.allImgsDom[index++], + part_1_slide_3_compo_2_off:this.allImgsDom[index++], + part_1_slide_3_compo_2_on:this.allImgsDom[index++], + part_1_slide_3_compo_2_text:this.allImgsDom[index++], + + part_1_incomplete_connection:this.allImgsDom[index++], + + part_2_conncection_supply_1_red_button:this.allImgsDom[index++], + part_2_conncection_supply_2_red_button:this.allImgsDom[index++], + + + // ! Slider Thumbs + slider_vGs: this.allImgsDom[index++], + slider_vIn: this.allImgsDom[index++], + slider_R: this.allImgsDom[index++], + + niddle_vGs: this.allImgsDom[index++], + niddle_vIn: this.allImgsDom[index++], + + + //* EE6 images added + +btn_begin_experiment:this.allImgsDom[index++], +btn_conclusion:this.allImgsDom[index++], +btn_connection_completed:this.allImgsDom[index++], +btn_make_connection:this.allImgsDom[index++], +btn_plot:this.allImgsDom[index++], +btn_procedure:this.allImgsDom[index++], +component_1_on_text:this.allImgsDom[index++], +component_2_on_text:this.allImgsDom[index++], +part_1_1_cable_a2:this.allImgsDom[index++], +part_1_1_cable_e:this.allImgsDom[index++], +part_1_1_cable_n2:this.allImgsDom[index++], +part_1_1_cable_p1:this.allImgsDom[index++], +part_1_1_cable_p2:this.allImgsDom[index++], +part_1_1_cable_r2:this.allImgsDom[index++], +part_1_1_cable_v1:this.allImgsDom[index++], +part_1_1_cable_v2:this.allImgsDom[index++], +part_1_1_calculations:this.allImgsDom[index++], +part_1_1_components:this.allImgsDom[index++], +part_1_1_conclusion_box:this.allImgsDom[index++], +part_1_1_instruction_box:this.allImgsDom[index++], +part_1_1_nomenclature_box:this.allImgsDom[index++], +part_1_1_procedure_box:this.allImgsDom[index++], +part_1_2_cable_a1:this.allImgsDom[index++], +part_1_2_cable_cp:this.allImgsDom[index++], +part_1_2_cable_dvp:this.allImgsDom[index++], +part_1_2_cable_e:this.allImgsDom[index++], +part_1_2_cable_n2:this.allImgsDom[index++], +part_1_2_cable_p1:this.allImgsDom[index++], +part_1_2_cable_p2:this.allImgsDom[index++], +part_1_2_cable_r2:this.allImgsDom[index++], +part_1_2_cable_v1:this.allImgsDom[index++], +part_1_2_cable_v2:this.allImgsDom[index++], +part_1_2_calculations:this.allImgsDom[index++], +part_1_2_components:this.allImgsDom[index++], +part_1_2_conclusion_box:this.allImgsDom[index++], +part_1_2_instruction_box:this.allImgsDom[index++], +part_1_2_nomenclature_box:this.allImgsDom[index++], +part_1_2_procedure_box:this.allImgsDom[index++], +part_2_cable_a2:this.allImgsDom[index++], +part_2_cable_e:this.allImgsDom[index++], +part_2_cable_n2:this.allImgsDom[index++], +part_2_cable_p1:this.allImgsDom[index++], +part_2_cable_p2:this.allImgsDom[index++], +part_2_cable_r2:this.allImgsDom[index++], +part_2_cable_v1:this.allImgsDom[index++], +part_2_cable_v2:this.allImgsDom[index++], +part_2_cable_vg1:this.allImgsDom[index++], +part_2_cable_vg2:this.allImgsDom[index++], +part_2_calculations:this.allImgsDom[index++], +part_2_components:this.allImgsDom[index++], +part_2_conclusion_box:this.allImgsDom[index++], +part_2_nomenclature_box:this.allImgsDom[index++], +part_2_procedure_box:this.allImgsDom[index++], +select_option_1_1:this.allImgsDom[index++], +select_option_1_2:this.allImgsDom[index++], +select_option_2:this.allImgsDom[index++], +select_option_full:this.allImgsDom[index++], +slider_thumb:this.allImgsDom[index++], +part_2_instruction_box:this.allImgsDom[index++], +btn_procedure_calculations:this.allImgsDom[index++], + +//! Experimental section images added here +btn_1: this.allImgsDom[index++], +btn_2: this.allImgsDom[index++], +btn_click: this.allImgsDom[index++], +circle: this.allImgsDom[index++], +frame_1: this.allImgsDom[index++], +frame_2: this.allImgsDom[index++], +frame_3: this.allImgsDom[index++], +menu_page: this.allImgsDom[index++], +val_vgs: this.allImgsDom[index++], +val_vin: this.allImgsDom[index++], + + // * Question Mark + domQs1: this.allQsDom[0], + domQs2: this.allQsDom[1], + domQs3: this.allQsDom[2], + domQs4: this.allQsDom[3], + domQs5: this.allQsDom[4], + domQs6: this.allQsDom[5], + + + // * Videos + // yoke_front_to_back: this.allVideosDom[0], + // yoke_front_to_side: this.allVideosDom[1], + // panel1: this.allVideosDom[2], + // panel2: this.allVideosDom[3], + + bfs_video: this.allVideosDom[0], + }; + }, + allImgsInitialAxis: [], + get(itemName) { + return this.allItems[itemName]; + }, +}; +// setting src +src.set(); diff --git a/experiment/simulation/EE6/js/typed.js b/experiment/simulation/EE6/js/typed.js new file mode 100644 index 0000000..faaac4d --- /dev/null +++ b/experiment/simulation/EE6/js/typed.js @@ -0,0 +1,1045 @@ +/*! + * + * typed.js - A JavaScript Typing Animation Library + * Author: Matt Boldt + * Version: v2.0.9 + * Url: https://github.com/mattboldt/typed.js + * License(s): MIT + * + */ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["Typed"] = factory(); + else + root["Typed"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + var _initializerJs = __webpack_require__(1); + + var _htmlParserJs = __webpack_require__(3); + + /** + * Welcome to Typed.js! + * @param {string} elementId HTML element ID _OR_ HTML element + * @param {object} options options object + * @returns {object} a new Typed object + */ + + var Typed = (function () { + function Typed(elementId, options) { + _classCallCheck(this, Typed); + + // Initialize it up + _initializerJs.initializer.load(this, options, elementId); + // All systems go! + this.begin(); + } + + /** + * Toggle start() and stop() of the Typed instance + * @public + */ + + _createClass(Typed, [{ + key: 'toggle', + value: function toggle() { + this.pause.status ? this.start() : this.stop(); + } + + /** + * Stop typing / backspacing and enable cursor blinking + * @public + */ + }, { + key: 'stop', + value: function stop() { + if (this.typingComplete) return; + if (this.pause.status) return; + this.toggleBlinking(true); + this.pause.status = true; + this.options.onStop(this.arrayPos, this); + } + + /** + * Start typing / backspacing after being stopped + * @public + */ + }, { + key: 'start', + value: function start() { + if (this.typingComplete) return; + if (!this.pause.status) return; + this.pause.status = false; + if (this.pause.typewrite) { + this.typewrite(this.pause.curString, this.pause.curStrPos); + } else { + this.backspace(this.pause.curString, this.pause.curStrPos); + } + this.options.onStart(this.arrayPos, this); + } + + /** + * Destroy this instance of Typed + * @public + */ + }, { + key: 'destroy', + value: function destroy() { + this.reset(false); + this.options.onDestroy(this); + } + + /** + * Reset Typed and optionally restarts + * @param {boolean} restart + * @public + */ + }, { + key: 'reset', + value: function reset() { + var restart = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0]; + + clearInterval(this.timeout); + this.replaceText(''); + if (this.cursor && this.cursor.parentNode) { + this.cursor.parentNode.removeChild(this.cursor); + this.cursor = null; + } + this.strPos = 0; + this.arrayPos = 0; + this.curLoop = 0; + if (restart) { + this.insertCursor(); + this.options.onReset(this); + this.begin(); + } + } + + /** + * Begins the typing animation + * @private + */ + }, { + key: 'begin', + value: function begin() { + var _this = this; + + this.typingComplete = false; + this.shuffleStringsIfNeeded(this); + this.insertCursor(); + if (this.bindInputFocusEvents) this.bindFocusEvents(); + this.timeout = setTimeout(function () { + // Check if there is some text in the element, if yes start by backspacing the default message + if (!_this.currentElContent || _this.currentElContent.length === 0) { + _this.typewrite(_this.strings[_this.sequence[_this.arrayPos]], _this.strPos); + } else { + // Start typing + _this.backspace(_this.currentElContent, _this.currentElContent.length); + } + }, this.startDelay); + } + + /** + * Called for each character typed + * @param {string} curString the current string in the strings array + * @param {number} curStrPos the current position in the curString + * @private + */ + }, { + key: 'typewrite', + value: function typewrite(curString, curStrPos) { + var _this2 = this; + + if (this.fadeOut && this.el.classList.contains(this.fadeOutClass)) { + this.el.classList.remove(this.fadeOutClass); + if (this.cursor) this.cursor.classList.remove(this.fadeOutClass); + } + + var humanize = this.humanizer(this.typeSpeed); + var numChars = 1; + + if (this.pause.status === true) { + this.setPauseStatus(curString, curStrPos, true); + return; + } + + // contain typing function in a timeout humanize'd delay + this.timeout = setTimeout(function () { + // skip over any HTML chars + curStrPos = _htmlParserJs.htmlParser.typeHtmlChars(curString, curStrPos, _this2); + + var pauseTime = 0; + var substr = curString.substr(curStrPos); + // check for an escape character before a pause value + // format: \^\d+ .. eg: ^1000 .. should be able to print the ^ too using ^^ + // single ^ are removed from string + if (substr.charAt(0) === '^') { + if (/^\^\d+/.test(substr)) { + var skip = 1; // skip at least 1 + substr = /\d+/.exec(substr)[0]; + skip += substr.length; + pauseTime = parseInt(substr); + _this2.temporaryPause = true; + _this2.options.onTypingPaused(_this2.arrayPos, _this2); + // strip out the escape character and pause value so they're not printed + curString = curString.substring(0, curStrPos) + curString.substring(curStrPos + skip); + _this2.toggleBlinking(true); + } + } + + // check for skip characters formatted as + // "this is a `string to print NOW` ..." + if (substr.charAt(0) === '`') { + while (curString.substr(curStrPos + numChars).charAt(0) !== '`') { + numChars++; + if (curStrPos + numChars > curString.length) break; + } + // strip out the escape characters and append all the string in between + var stringBeforeSkip = curString.substring(0, curStrPos); + var stringSkipped = curString.substring(stringBeforeSkip.length + 1, curStrPos + numChars); + var stringAfterSkip = curString.substring(curStrPos + numChars + 1); + curString = stringBeforeSkip + stringSkipped + stringAfterSkip; + numChars--; + } + + // timeout for any pause after a character + _this2.timeout = setTimeout(function () { + // Accounts for blinking while paused + _this2.toggleBlinking(false); + + // We're done with this sentence! + if (curStrPos >= curString.length) { + _this2.doneTyping(curString, curStrPos); + } else { + _this2.keepTyping(curString, curStrPos, numChars); + } + // end of character pause + if (_this2.temporaryPause) { + _this2.temporaryPause = false; + _this2.options.onTypingResumed(_this2.arrayPos, _this2); + } + }, pauseTime); + + // humanized value for typing + }, humanize); + } + + /** + * Continue to the next string & begin typing + * @param {string} curString the current string in the strings array + * @param {number} curStrPos the current position in the curString + * @private + */ + }, { + key: 'keepTyping', + value: function keepTyping(curString, curStrPos, numChars) { + // call before functions if applicable + if (curStrPos === 0) { + this.toggleBlinking(false); + this.options.preStringTyped(this.arrayPos, this); + } + // start typing each new char into existing string + // curString: arg, this.el.html: original text inside element + curStrPos += numChars; + var nextString = curString.substr(0, curStrPos); + this.replaceText(nextString); + // loop the function + this.typewrite(curString, curStrPos); + } + + /** + * We're done typing all strings + * @param {string} curString the current string in the strings array + * @param {number} curStrPos the current position in the curString + * @private + */ + }, { + key: 'doneTyping', + value: function doneTyping(curString, curStrPos) { + var _this3 = this; + + // fires callback function + this.options.onStringTyped(this.arrayPos, this); + this.toggleBlinking(true); + // is this the final string + if (this.arrayPos === this.strings.length - 1) { + // callback that occurs on the last typed string + this.complete(); + // quit if we wont loop back + if (this.loop === false || this.curLoop === this.loopCount) { + return; + } + } + this.timeout = setTimeout(function () { + _this3.backspace(curString, curStrPos); + }, this.backDelay); + } + + /** + * Backspaces 1 character at a time + * @param {string} curString the current string in the strings array + * @param {number} curStrPos the current position in the curString + * @private + */ + }, { + key: 'backspace', + value: function backspace(curString, curStrPos) { + var _this4 = this; + + if (this.pause.status === true) { + this.setPauseStatus(curString, curStrPos, true); + return; + } + if (this.fadeOut) return this.initFadeOut(); + + this.toggleBlinking(false); + var humanize = this.humanizer(this.backSpeed); + + this.timeout = setTimeout(function () { + curStrPos = _htmlParserJs.htmlParser.backSpaceHtmlChars(curString, curStrPos, _this4); + // replace text with base text + typed characters + var curStringAtPosition = curString.substr(0, curStrPos); + _this4.replaceText(curStringAtPosition); + + // if smartBack is enabled + if (_this4.smartBackspace) { + // the remaining part of the current string is equal of the same part of the new string + var nextString = _this4.strings[_this4.arrayPos + 1]; + if (nextString && curStringAtPosition === nextString.substr(0, curStrPos)) { + _this4.stopNum = curStrPos; + } else { + _this4.stopNum = 0; + } + } + + // if the number (id of character in current string) is + // less than the stop number, keep going + if (curStrPos > _this4.stopNum) { + // subtract characters one by one + curStrPos--; + // loop the function + _this4.backspace(curString, curStrPos); + } else if (curStrPos <= _this4.stopNum) { + // if the stop number has been reached, increase + // array position to next string + _this4.arrayPos++; + // When looping, begin at the beginning after backspace complete + if (_this4.arrayPos === _this4.strings.length) { + _this4.arrayPos = 0; + _this4.options.onLastStringBackspaced(); + _this4.shuffleStringsIfNeeded(); + _this4.begin(); + } else { + _this4.typewrite(_this4.strings[_this4.sequence[_this4.arrayPos]], curStrPos); + } + } + // humanized value for typing + }, humanize); + } + + /** + * Full animation is complete + * @private + */ + }, { + key: 'complete', + value: function complete() { + this.options.onComplete(this); + if (this.loop) { + this.curLoop++; + } else { + this.typingComplete = true; + } + } + + /** + * Has the typing been stopped + * @param {string} curString the current string in the strings array + * @param {number} curStrPos the current position in the curString + * @param {boolean} isTyping + * @private + */ + }, { + key: 'setPauseStatus', + value: function setPauseStatus(curString, curStrPos, isTyping) { + this.pause.typewrite = isTyping; + this.pause.curString = curString; + this.pause.curStrPos = curStrPos; + } + + /** + * Toggle the blinking cursor + * @param {boolean} isBlinking + * @private + */ + }, { + key: 'toggleBlinking', + value: function toggleBlinking(isBlinking) { + if (!this.cursor) return; + // if in paused state, don't toggle blinking a 2nd time + if (this.pause.status) return; + if (this.cursorBlinking === isBlinking) return; + this.cursorBlinking = isBlinking; + if (isBlinking) { + this.cursor.classList.add('typed-cursor--blink'); + } else { + this.cursor.classList.remove('typed-cursor--blink'); + } + } + + /** + * Speed in MS to type + * @param {number} speed + * @private + */ + }, { + key: 'humanizer', + value: function humanizer(speed) { + return Math.round(Math.random() * speed / 2) + speed; + } + + /** + * Shuffle the sequence of the strings array + * @private + */ + }, { + key: 'shuffleStringsIfNeeded', + value: function shuffleStringsIfNeeded() { + if (!this.shuffle) return; + this.sequence = this.sequence.sort(function () { + return Math.random() - 0.5; + }); + } + + /** + * Adds a CSS class to fade out current string + * @private + */ + }, { + key: 'initFadeOut', + value: function initFadeOut() { + var _this5 = this; + + this.el.className += ' ' + this.fadeOutClass; + if (this.cursor) this.cursor.className += ' ' + this.fadeOutClass; + return setTimeout(function () { + _this5.arrayPos++; + _this5.replaceText(''); + + // Resets current string if end of loop reached + if (_this5.strings.length > _this5.arrayPos) { + _this5.typewrite(_this5.strings[_this5.sequence[_this5.arrayPos]], 0); + } else { + _this5.typewrite(_this5.strings[0], 0); + _this5.arrayPos = 0; + } + }, this.fadeOutDelay); + } + + /** + * Replaces current text in the HTML element + * depending on element type + * @param {string} str + * @private + */ + }, { + key: 'replaceText', + value: function replaceText(str) { + if (this.attr) { + this.el.setAttribute(this.attr, str); + } else { + if (this.isInput) { + this.el.value = str; + } else if (this.contentType === 'html') { + this.el.innerHTML = str; + } else { + this.el.textContent = str; + } + } + } + + /** + * If using input elements, bind focus in order to + * start and stop the animation + * @private + */ + }, { + key: 'bindFocusEvents', + value: function bindFocusEvents() { + var _this6 = this; + + if (!this.isInput) return; + this.el.addEventListener('focus', function (e) { + _this6.stop(); + }); + this.el.addEventListener('blur', function (e) { + if (_this6.el.value && _this6.el.value.length !== 0) { + return; + } + _this6.start(); + }); + } + + /** + * On init, insert the cursor element + * @private + */ + }, { + key: 'insertCursor', + value: function insertCursor() { + if (!this.showCursor) return; + if (this.cursor) return; + this.cursor = document.createElement('span'); + this.cursor.className = 'typed-cursor'; + this.cursor.innerHTML = this.cursorChar; + this.el.parentNode && this.el.parentNode.insertBefore(this.cursor, this.el.nextSibling); + } + }]); + + return Typed; + })(); + + exports['default'] = Typed; + module.exports = exports['default']; + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + var _defaultsJs = __webpack_require__(2); + + var _defaultsJs2 = _interopRequireDefault(_defaultsJs); + + /** + * Initialize the Typed object + */ + + var Initializer = (function () { + function Initializer() { + _classCallCheck(this, Initializer); + } + + _createClass(Initializer, [{ + key: 'load', + + /** + * Load up defaults & options on the Typed instance + * @param {Typed} self instance of Typed + * @param {object} options options object + * @param {string} elementId HTML element ID _OR_ instance of HTML element + * @private + */ + + value: function load(self, options, elementId) { + // chosen element to manipulate text + if (typeof elementId === 'string') { + self.el = document.querySelector(elementId); + } else { + self.el = elementId; + } + + self.options = _extends({}, _defaultsJs2['default'], options); + + // attribute to type into + self.isInput = self.el.tagName.toLowerCase() === 'input'; + self.attr = self.options.attr; + self.bindInputFocusEvents = self.options.bindInputFocusEvents; + + // show cursor + self.showCursor = self.isInput ? false : self.options.showCursor; + + // custom cursor + self.cursorChar = self.options.cursorChar; + + // Is the cursor blinking + self.cursorBlinking = true; + + // text content of element + self.elContent = self.attr ? self.el.getAttribute(self.attr) : self.el.textContent; + + // html or plain text + self.contentType = self.options.contentType; + + // typing speed + self.typeSpeed = self.options.typeSpeed; + + // add a delay before typing starts + self.startDelay = self.options.startDelay; + + // backspacing speed + self.backSpeed = self.options.backSpeed; + + // only backspace what doesn't match the previous string + self.smartBackspace = self.options.smartBackspace; + + // amount of time to wait before backspacing + self.backDelay = self.options.backDelay; + + // Fade out instead of backspace + self.fadeOut = self.options.fadeOut; + self.fadeOutClass = self.options.fadeOutClass; + self.fadeOutDelay = self.options.fadeOutDelay; + + // variable to check whether typing is currently paused + self.isPaused = false; + + // input strings of text + self.strings = self.options.strings.map(function (s) { + return s.trim(); + }); + + // div containing strings + if (typeof self.options.stringsElement === 'string') { + self.stringsElement = document.querySelector(self.options.stringsElement); + } else { + self.stringsElement = self.options.stringsElement; + } + + if (self.stringsElement) { + self.strings = []; + self.stringsElement.style.display = 'none'; + var strings = Array.prototype.slice.apply(self.stringsElement.children); + var stringsLength = strings.length; + + if (stringsLength) { + for (var i = 0; i < stringsLength; i += 1) { + var stringEl = strings[i]; + self.strings.push(stringEl.innerHTML.trim()); + } + } + } + + // character number position of current string + self.strPos = 0; + + // current array position + self.arrayPos = 0; + + // index of string to stop backspacing on + self.stopNum = 0; + + // Looping logic + self.loop = self.options.loop; + self.loopCount = self.options.loopCount; + self.curLoop = 0; + + // shuffle the strings + self.shuffle = self.options.shuffle; + // the order of strings + self.sequence = []; + + self.pause = { + status: false, + typewrite: true, + curString: '', + curStrPos: 0 + }; + + // When the typing is complete (when not looped) + self.typingComplete = false; + + // Set the order in which the strings are typed + for (var i in self.strings) { + self.sequence[i] = i; + } + + // If there is some text in the element + self.currentElContent = this.getCurrentElContent(self); + + self.autoInsertCss = self.options.autoInsertCss; + + this.appendAnimationCss(self); + } + }, { + key: 'getCurrentElContent', + value: function getCurrentElContent(self) { + var elContent = ''; + if (self.attr) { + elContent = self.el.getAttribute(self.attr); + } else if (self.isInput) { + elContent = self.el.value; + } else if (self.contentType === 'html') { + elContent = self.el.innerHTML; + } else { + elContent = self.el.textContent; + } + return elContent; + } + }, { + key: 'appendAnimationCss', + value: function appendAnimationCss(self) { + var cssDataName = 'data-typed-js-css'; + if (!self.autoInsertCss) { + return; + } + if (!self.showCursor && !self.fadeOut) { + return; + } + if (document.querySelector('[' + cssDataName + ']')) { + return; + } + + var css = document.createElement('style'); + css.type = 'text/css'; + css.setAttribute(cssDataName, true); + + var innerCss = ''; + if (self.showCursor) { + innerCss += '\n .typed-cursor{\n opacity: 1;\n }\n .typed-cursor.typed-cursor--blink{\n animation: typedjsBlink 0.7s infinite;\n -webkit-animation: typedjsBlink 0.7s infinite;\n animation: typedjsBlink 0.7s infinite;\n }\n @keyframes typedjsBlink{\n 50% { opacity: 0.0; }\n }\n @-webkit-keyframes typedjsBlink{\n 0% { opacity: 1; }\n 50% { opacity: 0.0; }\n 100% { opacity: 1; }\n }\n '; + } + if (self.fadeOut) { + innerCss += '\n .typed-fade-out{\n opacity: 0;\n transition: opacity .25s;\n }\n .typed-cursor.typed-cursor--blink.typed-fade-out{\n -webkit-animation: 0;\n animation: 0;\n }\n '; + } + if (css.length === 0) { + return; + } + css.innerHTML = innerCss; + document.body.appendChild(css); + } + }]); + + return Initializer; + })(); + + exports['default'] = Initializer; + var initializer = new Initializer(); + exports.initializer = initializer; + +/***/ }), +/* 2 */ +/***/ (function(module, exports) { + + /** + * Defaults & options + * @returns {object} Typed defaults & options + * @public + */ + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + var defaults = { + /** + * @property {array} strings strings to be typed + * @property {string} stringsElement ID of element containing string children + */ + strings: ['These are the default values...', 'You know what you should do?', 'Use your own!', 'Have a great day!'], + stringsElement: null, + + /** + * @property {number} typeSpeed type speed in milliseconds + */ + typeSpeed: 0, + + /** + * @property {number} startDelay time before typing starts in milliseconds + */ + startDelay: 0, + + /** + * @property {number} backSpeed backspacing speed in milliseconds + */ + backSpeed: 0, + + /** + * @property {boolean} smartBackspace only backspace what doesn't match the previous string + */ + smartBackspace: true, + + /** + * @property {boolean} shuffle shuffle the strings + */ + shuffle: false, + + /** + * @property {number} backDelay time before backspacing in milliseconds + */ + backDelay: 700, + + /** + * @property {boolean} fadeOut Fade out instead of backspace + * @property {string} fadeOutClass css class for fade animation + * @property {boolean} fadeOutDelay Fade out delay in milliseconds + */ + fadeOut: false, + fadeOutClass: 'typed-fade-out', + fadeOutDelay: 500, + + /** + * @property {boolean} loop loop strings + * @property {number} loopCount amount of loops + */ + loop: false, + loopCount: Infinity, + + /** + * @property {boolean} showCursor show cursor + * @property {string} cursorChar character for cursor + * @property {boolean} autoInsertCss insert CSS for cursor and fadeOut into HTML + */ + showCursor: true, + cursorChar: '|', + autoInsertCss: true, + + /** + * @property {string} attr attribute for typing + * Ex: input placeholder, value, or just HTML text + */ + attr: null, + + /** + * @property {boolean} bindInputFocusEvents bind to focus and blur if el is text input + */ + bindInputFocusEvents: false, + + /** + * @property {string} contentType 'html' or 'null' for plaintext + */ + contentType: 'html', + + /** + * All typing is complete + * @param {Typed} self + */ + onComplete: function onComplete(self) {}, + + /** + * Before each string is typed + * @param {number} arrayPos + * @param {Typed} self + */ + preStringTyped: function preStringTyped(arrayPos, self) {}, + + /** + * After each string is typed + * @param {number} arrayPos + * @param {Typed} self + */ + onStringTyped: function onStringTyped(arrayPos, self) {}, + + /** + * During looping, after last string is typed + * @param {Typed} self + */ + onLastStringBackspaced: function onLastStringBackspaced(self) {}, + + /** + * Typing has been stopped + * @param {number} arrayPos + * @param {Typed} self + */ + onTypingPaused: function onTypingPaused(arrayPos, self) {}, + + /** + * Typing has been started after being stopped + * @param {number} arrayPos + * @param {Typed} self + */ + onTypingResumed: function onTypingResumed(arrayPos, self) {}, + + /** + * After reset + * @param {Typed} self + */ + onReset: function onReset(self) {}, + + /** + * After stop + * @param {number} arrayPos + * @param {Typed} self + */ + onStop: function onStop(arrayPos, self) {}, + + /** + * After start + * @param {number} arrayPos + * @param {Typed} self + */ + onStart: function onStart(arrayPos, self) {}, + + /** + * After destroy + * @param {Typed} self + */ + onDestroy: function onDestroy(self) {} + }; + + exports['default'] = defaults; + module.exports = exports['default']; + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + + + /** + * TODO: These methods can probably be combined somehow + * Parse HTML tags & HTML Characters + */ + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + var HTMLParser = (function () { + function HTMLParser() { + _classCallCheck(this, HTMLParser); + } + + _createClass(HTMLParser, [{ + key: 'typeHtmlChars', + + /** + * Type HTML tags & HTML Characters + * @param {string} curString Current string + * @param {number} curStrPos Position in current string + * @param {Typed} self instance of Typed + * @returns {number} a new string position + * @private + */ + + value: function typeHtmlChars(curString, curStrPos, self) { + if (self.contentType !== 'html') return curStrPos; + var curChar = curString.substr(curStrPos).charAt(0); + if (curChar === '<' || curChar === '&') { + var endTag = ''; + if (curChar === '<') { + endTag = '>'; + } else { + endTag = ';'; + } + while (curString.substr(curStrPos + 1).charAt(0) !== endTag) { + curStrPos++; + if (curStrPos + 1 > curString.length) { + break; + } + } + curStrPos++; + } + return curStrPos; + } + + /** + * Backspace HTML tags and HTML Characters + * @param {string} curString Current string + * @param {number} curStrPos Position in current string + * @param {Typed} self instance of Typed + * @returns {number} a new string position + * @private + */ + }, { + key: 'backSpaceHtmlChars', + value: function backSpaceHtmlChars(curString, curStrPos, self) { + if (self.contentType !== 'html') return curStrPos; + var curChar = curString.substr(curStrPos).charAt(0); + if (curChar === '>' || curChar === ';') { + var endTag = ''; + if (curChar === '>') { + endTag = '<'; + } else { + endTag = '&'; + } + while (curString.substr(curStrPos - 1).charAt(0) !== endTag) { + curStrPos--; + if (curStrPos < 0) { + break; + } + } + curStrPos--; + } + return curStrPos; + } + }]); + + return HTMLParser; + })(); + + exports['default'] = HTMLParser; + var htmlParser = new HTMLParser(); + exports.htmlParser = htmlParser; + +/***/ }) +/******/ ]) +}); +; \ No newline at end of file diff --git a/experiment/simulation/EE6/new_edited.js b/experiment/simulation/EE6/new_edited.js new file mode 100644 index 0000000..8ff6641 --- /dev/null +++ b/experiment/simulation/EE6/new_edited.js @@ -0,0 +1,2261 @@ +// * Audio Mute +let isMute = false; + +// * Current Date +let cd = new Date(); +var currentDateGlobal = `${cd.getDate()} - ${ + cd.getMonth() + 1 +} - ${cd.getFullYear()}`; +console.log(currentDateGlobal); + +// * Quiz object +const Quiz = { + quizData: [ + { + question: + "Which of the following machine is used to measure compressive strength?", + a: "Universal testing machine", + b: "Impact testing machine", + c: "Fatigue testing machine", + d: "Erichsen machine", + correct: "a", + }, + { + question: + "Which one of the following, is not a unit of ultimate tensile strength?", + a: "MPa", + b: "N/m2", + c: "Kg/m3", + d: "PSI", + correct: "c", + }, + { + question: "The extensometer can be attached anywhere to the specimen _", + a: "Yes", + b: "No", + c: "No but sometime yes", + d: "None of the above", + correct: "b", + }, + + { + question: + "What is the smallest measurement that is possible by vernier calliper?", + a: "Least count", + b: "Actual reading", + c: "Main scale division", + d: "Vernier scale division", + correct: "a", + }, + { + question: "What is the least count of a standard metric vernier caliper", + a: "0.002mm", + b: "0.02mm", + c: "0.1mm", + d: "0.2mm", + correct: "b", + }, + ], + quiz_contianer: document.querySelector(".quiz-container"), + quiz: document.getElementById("quiz"), + answerEls: document.querySelectorAll(".answer"), + questionEl: document.getElementById("question"), + a_text: document.getElementById("a_text"), + b_text: document.getElementById("b_text"), + c_text: document.getElementById("c_text"), + d_text: document.getElementById("d_text"), + ansDom: document.getElementById("quizAns"), + opsDom: [this.a_text, this.b_text, this.c_text, this.d_text], + loadQuizCallCount: 0, + currentQuiz: 0, + score: 0, + loadQuiz() { + if (this.currentQuiz >= this.quizData.length) { + return; + } + document.querySelector(".transparent-box").style.display = "block"; + this.loadQuizCallCount++; + window.speechSynthesis.cancel(); + setCC("Choose the correct answer."); + this.deselectAnswers(); + this.quiz_contianer.style.display = "block"; + const currentQuizData = this.quizData[this.currentQuiz]; + + this.questionEl.innerText = currentQuizData.question; + this.a_text.innerText = currentQuizData.a; + this.b_text.innerText = currentQuizData.b; + this.c_text.innerText = currentQuizData.c; + this.d_text.innerText = currentQuizData.d; + }, + + getSelected() { + let answer = undefined; + this.answerEls.forEach((answerEl) => { + if (answerEl.checked) { + answer = answerEl.id; + } + }); + this.answerEls.forEach((answerEl) => { + if (answer != undefined) { + answerEl.disabled = true; + } + }); + + return answer; + }, + + deselectAnswers() { + this.answerEls.forEach((answerEl) => { + answerEl.checked = false; + answerEl.disabled = false; + }); + }, + close() { + this.quiz_contianer.style.display = "none"; + for (let od of this.opsDom) { + od.style.color = ""; + } + document.querySelector(".transparent-box").style.display = "none"; + + // this.ansDom.style.display = "none"; + }, + init() { + let okBtn = document.getElementById("quizSubmit"); + okBtn.textContent = "Submit"; + // onclick for quiz close btn + // document.querySelector("#closeQuiz").onclick = () => { + // this.close(); + // }; + // onclick for quiz submit btn + document.getElementById("quizSubmit").onclick = () => { + // for disable multiple submit + if (this.loadQuizCallCount - 1 !== this.currentQuiz) { + return; + } + // subtitle for quiz + const answer = this.getSelected(); + if (answer) { + // this.ansDom.style.display = "block"; + // this.ansDom.innerHTML = "✔ "+ this.quizData[this.currentQuiz][this.quizData[this.currentQuiz].correct]; + + // updating options with the right and wrong emoji + let ops = "abcd"; + for (let o in ops) { + if (ops[o] == this.quizData[this.currentQuiz].correct) { + this.opsDom[o].innerHTML += " ✔️"; + this.opsDom[o].style.color = "green"; + } else { + this.opsDom[o].innerHTML += " ❌"; + this.opsDom[o].style.color = "red"; + } + } + + if (answer === this.quizData[this.currentQuiz].correct) { + this.score++; + } + this.currentQuiz++; + + //for ok button + + okBtn.textContent = "Ok"; + okBtn.onclick = function () { + Quiz.close(); + Quiz.init(); + }; + + // to stop the next question + // if (this.currentQuiz < this.quizData.length) { + // this.loadQuiz(); + // } else { + // this.quiz.innerHTML = `

    You answered correctly at ${this.score}/${this.quizData.length} questions.

    + // + // `; + // todo show above string to certificate + // } + } + // this.close(); + }; + }, +}; + +// * ChartJs +const ChartGraph = { + ctx: document.getElementById("myChart"), + ctxBox: document.querySelector(".chart"), + graphs: [ + (Graph1 = { + labels: [0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07], + datapoints: [0, 100, 185, 260, 360, 435, 452], + }), + (Graph2 = { + labels: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6], + datapoints: [0, 470, 488, 512, 515, 570], + }), + (Graph3 = { + labels: [0, 0.02, 0.04, 0.06, 0.08, 1, 1.2], + datapoints: [0, 480, 520, 560, 602, 535], + }), + (Graph4 = { + labels: [0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07], + datapoints: [0, 100, 185, 260, 360, 435, 452], + }), + ], + currGr: null, + delete: function () { + this.ctxBox.style.display = "none"; + this.currGr.destroy(); + }, + view: function (num, left, top, height = null, width = null) { + if (height != null) this.ctxBox.style.height = height + "px!important"; + if (width != null) this.ctxBox.style.width = width + "px!important"; + this.ctxBox.style.left = left + "px"; + this.ctxBox.style.top = top + "px"; + this.ctxBox.style.display = "block"; + this.currGr = new Chart(this.ctx, { + type: "line", + data: { + labels: this.graphs[num].labels, + datasets: [ + { + label: "Engineering Stress-Strain Curve", + data: this.graphs[num].datapoints, + borderWidth: 1, + tension: 0.4, + }, + // { + // label: "_", + // data: [0, 470], + // borderWidth: 1, + // }, + ], + }, + options: { + borderWidth: 3, + scales: { + y: { + beginAtZero: true, + }, + }, + }, + }); + return this; + }, +}; + +Quiz.init(); + +// for restriction on next button ; +let isPerformNext = false; + +// animation is running +let isRunning = false; +// to set isProcessRunning and also sync the progressbar + drawer +// ! and toggle the next btn active / deactive +function toggleNextBtn() { + let nextBtn = document.querySelector(".btn-next"); + nextBtn.classList.toggle("btn-deactive"); +} +const cancelSpeech = ()=>{ + window.speechSynthesis.cancel() + ccQueue = [] +} + +const setIsProcessRunning = (value) => { + // calling toggle the next + if(value != isRunning){ + toggleNextBtn() + } + + isRunning = value; + if(value){ + cancelSpeech() + Dom.hideAll() + } +}; + +const show = (ele, disp = "block", opa = 1) => { + ele.style.display = disp; + ele.style.opacity = opa; +}; +const opacity = (ele, val = 1) => { + ele.style.opacity = val; +}; +const hide = (ele, disp = "none") => { + ele.style.display = disp; +}; +const hideAll = (elesName, disp = "none") => { + let eles = getAll(elesName); + for (let ele of eles) { + hide(ele); + } +}; +const showAll = (elesName, disp = "none", opa = 1) => { + let eles = getAll(elesName); + for (let ele of eles) { + show(ele, "block", opa); + } +}; + +const set = (ele, l = null, t = null) => { + if (l !== null) { + ele.style.left = l + "px"; + } + if (t !== null) { + ele.style.top = t + "px"; + } + show(ele); +}; + +let student_name = ""; +// let currentDateGlobal = ""; + +// ! text to audio + +const textToSpeach = (text,speak=true) => { + let utterance = new SpeechSynthesisUtterance(); + utterance.text = text; + utterance.voice = window.speechSynthesis.getVoices()[0]; + if(isMute || !speak){ + utterance.volume = 0 + utterance.rate = 10 + } + window.speechSynthesis.speak(utterance); + return utterance; +}; + +//queue for +let ccQueue = []; +// for subtitile +let ccObj = null; +function setCC(text = null, speed = 25, speak = true) { + if (ccObj != null) { + ccObj.destroy(); + } + + let ccDom = get(".steps-subtitle .subtitle"); + ccQueue.push(text); + ccObj = new Typed(ccDom, { + strings: ["", ...ccQueue], + typeSpeed: speed, + onStringTyped(){ + ccQueue.shift() + // if(ccQueue.length != 0){ + // setCC(ccQueue.shift())` + // } + } + }); + let utterance = textToSpeach(text,speak) + return utterance +} + +// ! class Dom{} is send to seperate file +// * for cursor pointer +function cursorPointer(ele) { + ele.style.cursor = "pointer"; +} + +// Img.setBlinkArrow(true,790,444).play(); + + +const Scenes = { + items: { + anime_main_dom: new Dom(".anime-main"), + arrowRound: new Dom("arrowRound"), + blinkArrow: new Dom("blinkArrow"), + larrow: new Dom("laerrow"), + larrow2: new Dom("laerrow2"), + logo: new Dom("logo"), + man: new Dom("man"), + arrow: new Dom("measurearrow"), + arrow2: new Dom("measurearrow2"), + redsize: new Dom("redsize"), + speech_off_btn: new Dom("speech_off_btn"), + speech_on_btn: new Dom("speech_on_btn"), + talk_cloud: new Dom("talk_cloud"), + projectIntro: new Dom(".project-intro"), + header: new Dom(".anime-header"), + stepHeading: new Dom(".step-heading"), + stepTitle: new Dom(".step-title"), + stepDescription: new Dom(".step-description"), + tableCalc: new Dom(".measurements"), + tempText: new Dom(".temp-text"), + tempText2: new Dom(".temp-text2"), + tempInputBox: new Dom(".temp-input"), + tempInputBoxInput: new Dom(".temp-input #ipnum"), + tempInputT1: new Dom(".temp-input .text1"), + tempInputT2: new Dom(".temp-input .text2"), + tempInputError: new Dom(".temp-input .error"), + tempInputBtn: new Dom(".temp-input .submit-btn"), + utmBtn: new Dom(".utm-button"), + inputWindow: new Dom(".user-input"), + resultTable: new Dom(".result-table"), + certificate: new Dom(".certificate"), + welcomeBox: new Dom(".welcome-box"), + videoBox: new Dom(".video-box"), + videoBoxSrc: new Dom(".video-box .video"), + videoBoxTitle: new Dom(".video-box .title"), + videoBoxRestartBtn: new Dom(".video-box .controls .restart"), + imageBox: new Dom(".image-box"), + imageBoxSrc: new Dom(".image-box .image"), + imageBoxTitle: new Dom(".image-box .title"), + tempTitle1: new Dom(".temp-title1"), + tempTitle2: new Dom(".temp-title2"), + tempTitle3: new Dom(".temp-title3"), + tempTitle4: new Dom(".temp-title4"), + tempTitle5: new Dom(".temp-title5"), + tempTitle6: new Dom(".temp-title6"), + tempTitle7: new Dom(".temp-title7"), + tempTitle8: new Dom(".temp-title8"), + tempTitle9: new Dom(".temp-title9"), + tempTitle10: new Dom(".temp-title10"), + tempTitle11: new Dom(".temp-title11"), + tempTitle12: new Dom(".temp-title12"), + tempTitle13: new Dom(".temp-title13"), + tempTitle14: new Dom(".temp-title14"), + tempTitle15: new Dom(".temp-title15"), + tempTitle16: new Dom(".temp-title16"), + tempTitle17: new Dom(".temp-title17"), + tempTitle18: new Dom(".temp-title18"), + tempTitle19: new Dom(".temp-title19"), + tempTitle20: new Dom(".temp-title20"), + tempTitle21: new Dom(".temp-title21"), + tempTitle22: new Dom(".temp-title22"), + tempTitle23: new Dom(".temp-title23"), + tempTitle24: new Dom(".temp-title24"), + tempTitle25: new Dom(".temp-title25"), + tempTitle26: new Dom(".temp-title26"), + tempTitle27: new Dom(".temp-title27"), + tempTitle28: new Dom(".temp-title28"), + tempTitle29: new Dom(".temp-title29"), + tempTitle30: new Dom(".temp-title30"), + tempTitle31: new Dom(".temp-title31"), + tempTitle32: new Dom(".temp-title32"), + tempTitle33: new Dom(".temp-title33"), + tempTitle34: new Dom(".temp-title34"), + tempTitle35: new Dom(".temp-title35"), + tempTitle36: new Dom(".temp-title36"), + tempTitle37: new Dom(".temp-title37"), + tempTitle38: new Dom(".temp-title38"), + tempTitle39: new Dom(".temp-title39"), + tempTitle40: new Dom(".temp-title40"), + tempTitle41: new Dom(".temp-title41"), + tempTitle42: new Dom(".temp-title42"), + tempTitle43: new Dom(".temp-title43"), + tempTitle44: new Dom(".temp-title44"), + tempTitle45: new Dom(".temp-title45"), + tempTitle46: new Dom(".temp-title46"), + tempTitle47: new Dom(".temp-title47"), + tempTitle48: new Dom(".temp-title48"), + tempTitle49: new Dom(".temp-title49"), + tempTitle50: new Dom(".temp-title50"), + tempTitle51: new Dom(".temp-title51"), + tempTitle52: new Dom(".temp-title52"), + tempTitle53: new Dom(".temp-title53"), + tempTitle54: new Dom(".temp-title54"), + tempTitle55: new Dom(".temp-title55"), + tempTitle56: new Dom(".temp-title56"), + tempTitle57: new Dom(".temp-title57"), + tempTitle58: new Dom(".temp-title58"), + tempTitle59: new Dom(".temp-title59"), + tempTitle60: new Dom(".temp-title60"), + + concept_development: new Dom(".concept_development"), + + contentAdderBox: new Dom(".content-adder-box"), + btn_save: new Dom(".btn-save"), + btn_next: new Dom(".btn-next"), + graph1: new Dom(".graph1"), + graph2: new Dom(".graph2"), + graph3: new Dom(".graph3"), + graph4: new Dom(".graph4"), + graph5: new Dom(".graph5"), + graph_box_1: new Dom(".graph_box1"), + graph_box_2: new Dom(".graph_box2"), + graph_box_3: new Dom(".graph_box3"), + graph_box_4: new Dom(".graph_box4"), + graph_box_5: new Dom(".graph_box5"), + xLabel: new Dom(".xLabel"), + yLabel: new Dom(".yLabel"), + + part3_table_one: new Dom(".part3_table_one"), + part3_table_two: new Dom(".part3_table_two"), + part3_table_three: new Dom(".part3_table_three"), + part3_table_four: new Dom(".part3_table_four"), + part3_table_four_2: new Dom(".part3_table_four_2"), + + slider_vIn: new Dom(".slider_vIn"), + slider_vGs: new Dom(".slider_vGs"), + slider_R: new Dom(".slider_R"), + + btn_delete: new Dom(".btn-delete"), + btn_reset: new Dom(".btn-reset"), + btn_record: new Dom(".btn-record"), + btn_check_connections: new Dom(".btn-check-connections"), + btn_circuit_diagram: new Dom(".btn-circuit-diagram"), + + btn_transparent: new Dom(".btn-transparent"), + + formulas_component_stress: new Dom("formulas_component_stress"), + formulas_efficiency: new Dom("formulas_efficiency"), + formulas_ideal: new Dom("formulas_ideal"), + formulas_nomenclautre: new Dom("formulas_nomenclautre"), + formulas_non_ideal: new Dom("formulas_non_ideal"), + formulas_procedure: new Dom("formulas_procedure"), + formulas_universal: new Dom("formulas_universal"), + part_3_option_select: new Dom("part_3_option_select"), + part_1_text_for_crrct: new Dom("part_1_text_for_crrct"), + part_1_text_for_wrong: new Dom("part_1_text_for_wrong"), + + + // !EE4 images added + + + + //! EE4 tables added + part_1_table_1: new Dom(".part_1_table_1"), + part_1_table_2: new Dom(".part_1_table_2"), + + part_1_table_1_col_1: new Dom(".part_1_table_1_col_1"), + part_1_table_1_col_2: new Dom(".part_1_table_1_col_2"), + part_1_table_1_col_3: new Dom(".part_1_table_1_col_3"), + part_1_table_1_col_4: new Dom(".part_1_table_1_col_4"), + part_1_table_1_col_5: new Dom(".part_1_table_1_col_5"), + part_1_table_1_col_6: new Dom(".part_1_table_1_col_6"), + part_1_table_1_col_7: new Dom(".part_1_table_1_col_7"), + part_1_table_1_col_8: new Dom(".part_1_table_1_col_8"), + + part_1_table_2_col_1: new Dom(".part_1_table_2_col_1"), + part_1_table_2_col_2: new Dom(".part_1_table_2_col_2"), + part_1_table_2_col_3: new Dom(".part_1_table_2_col_3"), + part_1_table_2_col_4: new Dom(".part_1_table_2_col_4"), + part_1_table_2_col_5: new Dom(".part_1_table_2_col_5"), + part_1_table_2_col_7: new Dom(".part_1_table_2_col_7"), + part_1_table_2_col_8: new Dom(".part_1_table_2_col_8"), + part_1_table_2_col_9: new Dom(".part_1_table_2_col_9"), + part_1_table_2_col_10: new Dom(".part_1_table_2_col_10"), + // ! new items dom + + //part 2 cable added + + + + //* connection box table + part_2_connections_box: new Dom(".part_2_connections_box"), + part_1_1_connections_box: new Dom(".part_1_1_connections_box"), + part_1_2_connections_box: new Dom(".part_1_2_connections_box"), + + //new images added for part1 + + + // part2 calculation + + + + //* 29 feb new imgs + + + //* part3 images added + + + + // * useful images from previous Experiment + + btn_connections: new Dom("btn_connections"), + btn_connectons_completed: new Dom("btn_connectons_completed"), + btn_instructions: new Dom("btn_instructions"), + btn_nomenclature: new Dom("btn_nomenclature"), + // btn_plot: new Dom("btn_plot"), + btn_procedure: new Dom("btn_procedure"), + btn_reset: new Dom("btn_reset"), + btn_start_experiment: new Dom("btn_start_experiment"), + + part_1_slide_3_compo_1_off: new Dom("part_1_slide_3_compo_1_off"), + part_1_slide_3_compo_1_on: new Dom("part_1_slide_3_compo_1_on"), + part_1_slide_3_compo_1_text: new Dom("part_1_slide_3_compo_1_text"), + part_1_slide_3_compo_2_off: new Dom("part_1_slide_3_compo_2_off"), + part_1_slide_3_compo_2_on: new Dom("part_1_slide_3_compo_2_on"), + part_1_slide_3_compo_2_text: new Dom("part_1_slide_3_compo_2_text"), + part_1_incomplete_connection: new Dom("part_1_incomplete_connection"), + part_2_conncection_supply_1_red_button : new Dom("part_2_conncection_supply_1_red_button"), + part_2_conncection_supply_2_red_button : new Dom("part_2_conncection_supply_2_red_button"), + niddle_vGs: new Dom("niddle_vGs"), + niddle_vIn: new Dom("niddle_vIn"), + + + // * for PROCEDURE and instruction NOMENCLATURE + + + + //*EE6 images added + + btn_begin_experiment : new Dom("btn_begin_experiment"), + btn_conclusion : new Dom("btn_conclusion"), + btn_connection_completed : new Dom("btn_connection_completed"), + btn_make_connection : new Dom("btn_make_connection"), + btn_plot : new Dom("btn_plot"), + btn_procedure : new Dom("btn_procedure"), + component_1_on_text : new Dom("component_1_on_text"), + component_2_on_text : new Dom("component_2_on_text"), + part_1_1_cable_a2 : new Dom("part_1_1_cable_a2"), + part_1_1_cable_e : new Dom("part_1_1_cable_e"), + part_1_1_cable_n2 : new Dom("part_1_1_cable_n2"), + part_1_1_cable_p1 : new Dom("part_1_1_cable_p1"), + part_1_1_cable_p2 : new Dom("part_1_1_cable_p2"), + part_1_1_cable_r2 : new Dom("part_1_1_cable_r2"), + part_1_1_cable_v1 : new Dom("part_1_1_cable_v1"), + part_1_1_cable_v2 : new Dom("part_1_1_cable_v2"), + part_1_1_calculations : new Dom("part_1_1_calculations"), + part_1_1_components : new Dom("part_1_1_components"), + part_1_1_conclusion_box : new Dom("part_1_1_conclusion_box"), + part_1_1_instruction_box : new Dom("part_1_1_instruction_box"), + part_1_1_nomenclature_box : new Dom("part_1_1_nomenclature_box"), + part_1_1_procedure_box : new Dom("part_1_1_procedure_box"), + part_1_2_cable_a1 : new Dom("part_1_2_cable_a1"), + part_1_2_cable_cp : new Dom("part_1_2_cable_cp"), + part_1_2_cable_dvp : new Dom("part_1_2_cable_dvp"), + part_1_2_cable_e : new Dom("part_1_2_cable_e"), + part_1_2_cable_n2 : new Dom("part_1_2_cable_n2"), + part_1_2_cable_p1 : new Dom("part_1_2_cable_p1"), + part_1_2_cable_p2 : new Dom("part_1_2_cable_p2"), + part_1_2_cable_r2 : new Dom("part_1_2_cable_r2"), + part_1_2_cable_v1 : new Dom("part_1_2_cable_v1"), + part_1_2_cable_v2 : new Dom("part_1_2_cable_v2"), + part_1_2_calculations : new Dom("part_1_2_calculations"), + part_1_2_components : new Dom("part_1_2_components"), + part_1_2_conclusion_box : new Dom("part_1_2_conclusion_box"), + part_1_2_instruction_box : new Dom("part_1_2_instruction_box"), + part_1_2_nomenclature_box : new Dom("part_1_2_nomenclature_box"), + part_1_2_procedure_box : new Dom("part_1_2_procedure_box"), + part_2_cable_a2 : new Dom("part_2_cable_a2"), + part_2_cable_e : new Dom("part_2_cable_e"), + part_2_cable_n2 : new Dom("part_2_cable_n2"), + part_2_cable_p1 : new Dom("part_2_cable_p1"), + part_2_cable_p2 : new Dom("part_2_cable_p2"), + part_2_cable_r2 : new Dom("part_2_cable_r2"), + part_2_cable_v1 : new Dom("part_2_cable_v1"), + part_2_cable_v2 : new Dom("part_2_cable_v2"), + part_2_cable_vg1 : new Dom("part_2_cable_vg1"), + part_2_cable_vg2 : new Dom("part_2_cable_vg2"), + part_2_calculations : new Dom("part_2_calculations"), + part_2_components : new Dom("part_2_components"), + part_2_conclusion_box : new Dom("part_2_conclusion_box"), + part_2_nomenclature_box : new Dom("part_2_nomenclature_box"), + part_2_procedure_box : new Dom("part_2_procedure_box"), + select_option_1_1 : new Dom("select_option_1_1"), + select_option_1_2 : new Dom("select_option_1_2"), + select_option_2 : new Dom("select_option_2"), + select_option_full : new Dom("select_option_full"), + slider_thumb : new Dom("slider_thumb"), + part_2_instruction_box : new Dom("part_2_instruction_box"), + + + + domQs1: new Dom("domQs1"), + domQs2: new Dom("domQs2"), + domQs3: new Dom("domQs3"), + domQs4: new Dom("domQs4"), + domQs5: new Dom("domQs5"), + domQs6: new Dom("domQs6"), + + chart: [ + (graph1 = null), + (graph2 = null), + (graph3 = null), + (graph4 = null), + (graph5 = null), + (graph6 = null), + (graph7 = null), + ], + + chart: { + label1: { + x: "Label 2", + y: "Label 1", + }, + label2: { + x: "Label 2", + y: "Label 1", + }, + label3: { + x: "Label 2", + y: "Label 1", + }, + label4: { + x: "Label 2", + y: "Label 1", + }, + label5: { + x: "Label 2", + y: "Label 1", + }, + label6: { + x: "Label 2", + y: "Label 1", + }, + label7: { + x: "Label 2", + y: "Label 1", + }, + }, + }, + // ! To Plot graph + plotGraph( + ctx, + graphIdx, + data, + dataLabel, + xLabel = null, + yLabel = null, + beginAtZero = false, + startEmpty = false, + ) { + // for label + Scenes.items.yLabel.set(504, 263).setContent(yLabel).styles({ + backgroundColor: "transperant", + textAlign: "center", + color: "black", + width: "170px", + rotate: "-90deg", + zIndex: 10, + }); + Scenes.items.xLabel.set(664, 375).setContent(xLabel).styles({ + backgroundColor: "transperant", + color: "black", + width: "fit-content", + zIndex: 10, + }); + + // ! Destroy old graph + let graphRef = Scenes.items.chart[graphIdx]; + if (graphRef != null) { + graphRef.destroy(); + } + + // temprory dataset + let datasets = [ + { + label: dataLabel, + fill: false, + borderColor: "red", + backgroundColor: "red", + data: data, + display: false, + }, + ] + + if(startEmpty){ + datasets=[] + } + + graphRef = new Chart(ctx, { + type: "scatter", + plugins: [ + { + // afterDraw: chart => { + // var ctx = chart.chart.ctx; + // ctx.save(); + // ctx.textAlign = 'center'; + // ctx.font = '18px Arial'; + // ctx.fillStyle = 'black'; + // ctx.fillText('Output Power (P )', chart.chart.width / 2, chart.chart.height - 24); + // ctx.textAlign = 'left'; + // ctx.font = '10px Arial'; + // ctx.fillText('0', chart.chart.width - 119, chart.chart.height - 12); + // ctx.restore(); + // }, + }, + ], + data: { + datasets: datasets + }, + options: { + responsive: true, + maintainAspectRatio: false, + scales: { + yAxes: [ + { + scaleLabel: { + display: false, + labelString: yLabel, + fontColor: "black", + fontSize: 17, + }, + ticks: { + beginAtZero: beginAtZero, + fontColor: "black", + fontSize: 14, + }, + }, + ], + xAxes: [ + { + scaleLabel: { + display: false, + labelString: xLabel, + fontColor: "black", + fontSize: 17, + }, + ticks: { + beginAtZero: beginAtZero, + fontColor: "black", + fontSize: 14, + }, + }, + ], + }, + }, + }); + + Scenes.items.chart[graphIdx] = graphRef; + return graphRef + }, + + // for adding new datasets to graph + graphFeatures: { + addDataset(chart, label, bgColor, data) { + chart.data.datasets.push({ + label: label, + fill: false, + borderColor: bgColor, + backgroundColor: bgColor, + data: data, + }); + chart.update(); + }, + addData(chart, index, data) { + console.log(data); + if (data.length > 0) { + chart.data.datasets[index].data = data; + } else { + chart.data.datasets[index].data.push(data); + } + chart.update(); + }, + getSizeOfDatasets(chart){ + return chart.data.datasets.length + } + }, + deleteAll() { + for (i in this.img) { + Scenes.img[i].hide(); + } + for (i in this.items) { + if (i == "header" || i == "stepTitle" || i == "stepDescription") { + continue; + } + hide(Scenes.items[i]); + } + }, + // for content adder btn box + contentAdderAddBtn(text) { + Scenes.items.contentAdderBox.item.innerHTML += `
  • ${text}
  • `; + }, + currentStep: 0, + subCurrentStep: 0, + resetSubStep() { + this.subCurrentStep = 0; + }, + incCurrentSubStep() { + this.subCurrentStep++; + }, + setStepHeading(step, description,hide) { + Scenes.items.stepTitle.setContent(step); + Scenes.items.stepDescription.setContent(description); + Scenes.items.stepHeading.show("flex").push(); + if(hide){ + let st={ + visibility: "hidden" + } + Scenes.items.stepTitle.styles(st) + Scenes.items.stepDescription.styles(st) + } + }, + + //* for hover on instuction , procedure and nomenclature + + // not done yet + showPopup(step){ + + let instructionBtn = Scenes.items.btn_instructions.zIndex(1000) + let procedureBtn = Scenes.items.btn_procedure.zIndex(1000) + let nomenclatureBtn = Scenes.items.btn_nomenclature.zIndex(1000) + let instructionImg, procedureImg, nomenclatureImg; + + let btn = [ + instructionBtn, + procedureBtn, + nomenclatureBtn, + ] + + switch(step){ + case "1_1" : + instructionImg = Scenes.items.part_1_1_instruction_box.set(404, 950).hide(); + procedureImg = Scenes.items.part_1_1_procedure_box.set(-150).hide(); + nomenclatureImg = Scenes.items.part_1_1_nomenclature_box; + + console.log("case3") + + break; + + case "1_2" : instructionImg = Scenes.items.part_1_2_instruction_box; + procedureImg = Scenes.items.part_1_2_procedure_box.set(-80,null,320).hide(); + nomenclatureImg = Scenes.items.part_1_2_nomenclature_box.set(-100).hide(); + console.log("case4") + break; + + case "2" : instructionImg = Scenes.items.part_2_instruction_box; + procedureImg = Scenes.items.part_2_procedure_box.set(null,-80).hide(); + nomenclatureImg = Scenes.items.part_2_nomenclature_box.set(null,-80).hide(); + + break; + } + + let showInstructionImg = function(){ + instructionImg.show().zIndex(40) + } + + let showProcedureImg = function(){ + procedureImg.show().zIndex(40) + + } + + let showNomenclatureImg = function(){ + nomenclatureImg.show().zIndex(40) + + } + + let hideInstructionImg = function(){ + instructionImg.hide() + } + + let hideProcedureImg = function(){ + procedureImg.hide() + + } + + let hideNomenclatureImg = function(){ + nomenclatureImg.hide() + + } + + + btn[0].item.onmouseover = showInstructionImg + btn[0].item.onmouseout = hideInstructionImg + + btn[1].item.onmouseover = showProcedureImg + btn[1].item.onmouseout = hideProcedureImg + + btn[2].item.onmouseover = showNomenclatureImg + btn[2].item.onmouseout = hideNomenclatureImg + + }, + // for typing hello text + intru: null, + intruVoice: null, + optionsDone: [0, 0, 0, 0], + steps: [ + (intro = () => { + // remove all dom element for back and setProcessRunning + setIsProcessRunning(true); + + // starting elements + + // subtitle + setTimeout(() => { + setCC("Enter your name and click on 'Start' to start the experiment"); + }, 500); + Scenes.items.header.set(0, 120).show("flex"); + let inputWindow = get(".user-input"); + show(inputWindow, "flex"); + let man = new Dom("man").set(650, 80).push(); + + let submitBtn = get("#nameSubmitBtn"); + submitBtn.onclick = () => { + student_name = get("#stuName").value; + let error = get(".user-input .error"); + // todo remove comment + if (student_name.trim() == "") { + show(error); + return; + } + // take only first space + let fName = student_name.slice(0, student_name.indexOf(" ")); + hide(error); + let tl = anime.timeline({ + easing: "easeOutExpo", + duration: 1000, + }); + tl.add({ + targets: ".anime-header", + top: 0, + }) + .add({ + targets: ".user-input", + opacity: 0, + }) + .add({ + targets: man.item, + translateX: -280, + }) + .add({ + targets: Scenes.items.talk_cloud.item, + begin() { + // Scenes.items.tempText.innerHTML = `👋 Hey!
    ${fName}`; + Scenes.items.tempText.item.style.fontWeight = "bold"; + // show(Scenes.items.tempText); + intru = new Typed(Scenes.items.tempText.item, { + strings: ["", `Hey!👋
    ${fName}`], + typeSpeed: 25, + }); + Scenes.items.tempText.set(482, 1); + textToSpeach(`Hey! ${fName}`); + textToSpeach( + "Welcome to Foundation Wall in Foamwork Experiment of Foamwork Technology in Civil Engineering Virtual Lab developed by Prof. K. N. Jha, Department of Civil Engineering, IIT Delhi." + ); + Scenes.items.talk_cloud.set(450, -40, 180).push(); + setCC(""); + }, + endDelay: 2000, + opacity: [0, 1], + }) + .add({ + begin() { + // to hide previous step images + intru.destroy(); + Dom.hideAll(); + Scenes.items.welcomeBox.show("flex"); + }, + }) + .add({ + duration: 12000, + complete() { + setCC("Click 'Next' to go to next step"); + Dom.setBlinkArrow(true, 790, 444).play(); + setIsProcessRunning(false); + }, + }); + }; + return true; + }), + (objective = function () { + setIsProcessRunning(true); + Dom.hideAll(); + + // require + let btn_transparent = Scenes.items.btn_transparent.set().zIndex(6000).item; + + Scenes.items.concept_development.set().styles({ + zIndex: "5000", + scale: "1 0.914", + top: "-143px", + position: "absolute", + }) + + // ! Slide ended enable the button next button + function checkIsSlideEnded(){ + let isSlideEnded = localStorage.getItem("isSlideEnded") + if(isSlideEnded=="true"){ + btn_transparent.disabled = false + setIsProcessRunning(false) + btn_transparent.classList.remove("btn-disabled") + // setCC("Click next to goto next slide.") + Dom.setBlinkArrowRed(true, 866, 420,30,null,-90).play(); + btn_transparent.onclick = ()=>{ + Scenes.next() + localStorage.setItem("isSlideEnded",false) + window.clearInterval(interval) + } + } + } + var interval = window.setInterval(checkIsSlideEnded, 1000) + + return true; + }), + //! EE6 step 1 + (step1 = function () { + setIsProcessRunning(true); + Scenes.items.btn_next.show(); + + // todo all previous elements hide + Dom.hideAll(); + Scenes.items.contentAdderBox.item.innerHTML = ""; + + Scenes.setStepHeading("Step-1", "To Plot Different Characteristics."); + setCC("Click on the 'ICON' to plot the performance characteristics.") + + // * remove all previous restrictions + + //! * Required Elements + + Scenes.items.select_option_full.set(40, -20, 404, 850); + Scenes.items.select_option_1_1.set(680-45, -18, 70, 260).zIndex(1); + Scenes.items.select_option_1_2.set(675-45, 175-23, 70, 270).zIndex(1); + Scenes.items.select_option_2.set(372,215,175, 260).zIndex(1); + + // ! onclicks for all options + let options = [ + Scenes.items.select_option_1_1, + Scenes.items.select_option_1_2, + Scenes.items.select_option_2, + ]; + + // ! Destroy Graphs + function destroyGraphs() { + for (let i = 0; i < 7; i++) { + if (Scenes.items.chart[i] != null) { + Scenes.items.chart[i].destroy(); + } + } + } + // destroyGraphs() + + Scenes.forMathematicalExpressionBtn = 0; + + const opOne = () => { + Scenes.optionsDone[0] = 1; + Scenes.forMathematicalExpressionBtn = 1; + Scenes.steps[0 + 3](); + }; + const opTwo = () => { + Scenes.optionsDone[1] = 1; + Scenes.forMathematicalExpressionBtn = 2; + Scenes.steps[1 + 3](); + }; + const opThree = () => { + Scenes.optionsDone[2] = 1; + Scenes.forMathematicalExpressionBtn = 3; + Scenes.steps[2 + 3](); + }; + const opFour = () => { + Scenes.optionsDone[3] = 1; + Scenes.forMathematicalExpressionBtn = 4; + Scenes.steps[3 + 3](); + }; + options[0].item.onclick = opOne; + options[1].item.onclick = opTwo; + options[2].item.onclick = opThree; + options[3].item.onclick = opFour; + + // ! if all options done then exit + let exit = true; + for (let i of Scenes.optionsDone) { + if (i == 0) { + exit = false; + break; + } + } + + if (exit) { + // after complete + // Dom.setBlinkArrow(true, 790, 408).play(); + setCC("Simulation Done"); + setIsProcessRunning(false); + } + + return true; + }), + + (step2 = function () { + setIsProcessRunning(true); + + Scenes.setStepHeading("", "using meteres",true); + Scenes.items.btn_next.show(); + // ! Step Connection + + // required elements + let btns = [ + Scenes.items.btn_procedure.set(750 + 40, 190, 50).zIndex(10), + Scenes.items.btn_make_connection.set(750 + 40, 190 + 55, 50).zIndex(10), + Scenes.items.btn_connectons_completed + .set(750 + 40, 190 + 110, 50, 147) + .zIndex(10), + Scenes.items.btn_begin_experiment + .set(750 + 40, 190 + 165, 50, 147) + .zIndex(10), + Scenes.items.btn_reset.set(660, 190 + 165, 40).zIndex(10) + ] + + + // required images + let images = [ + Scenes.items.part_1_1_components.set(0,-70,495,975).zIndex(1), + Scenes.items.part_2_conncection_supply_1_red_button.set(171,76,28,25).zIndex(10), + Scenes.items.part_2_conncection_supply_2_red_button.set(178,312,29,25).zIndex(10), + Scenes.items.part_1_1_connections_box, + ] + + let cables = [ + Scenes.items.part_1_1_cable_p1.set(0,0).zIndex(2).hide(), + Scenes.items.part_1_1_cable_e.set(0,0).zIndex(3).hide(), + Scenes.items.part_1_1_cable_a2.set(0,0).zIndex(4).hide(), + Scenes.items.part_1_1_cable_r2.set(0,0).zIndex(5).hide(), + Scenes.items.part_1_1_cable_p2.set(0,0).zIndex(6).hide(), + Scenes.items.part_1_1_cable_n2.set(0,0).zIndex(7).hide(), + Scenes.items.part_1_1_cable_v1.set(0,0).zIndex(8).hide(), + Scenes.items.part_1_1_cable_v2.set(0,0).zIndex(9).hide(), + ] + + // ! for increasing the size + let l = 0,t = -70, h = 495, w = 975 + Scenes.items.part_1_1_components.set(l,t,h,w).zIndex(1) + cables.forEach(ele=>{ + ele.set(l,t,h,w).hide() + }) + + let cables_color = [ + "#970101", + "#1a2f55", + "#186a3b", + "#181818", + "#ffd90e", + "#181818", + "#cf426d", + "#560056", + ] + + + function hideConnectionStepImgs(){ + let allImages = [ + ...btns,...images,...cables + ] + allImages.forEach(ele=>{ + ele.hide() + }) + Dom.setBlinkArrowRed(-1) + } + + + //! Connection Part + // to enable startExp Button + let partConnectionsIsComplete = false + function partConnections(){ + // Connection Logic + Scenes.items.part_1_1_connections_box.set(514,-70).hide() + + // ! btn_reset onclick + Scenes.items.btn_reset.item.onclick = ()=>{ + let box_buttons_reset = document.querySelectorAll(".part_1_1_connections_box button") + let temps = { + textShadow: "none", + color: "black", + backgroundColor: "transparent" + } + box_buttons_reset.forEach(ele=>{ + let ele_Dom = new Dom(ele) + ele_Dom.styles(temps) + }) + Scenes.steps[3]() + } + + //! connection box onclick + Scenes.items.btn_connections.item.onclick = ()=>{ + Scenes.items.part_1_1_connections_box.show("flex") + // ! connection table arrow move + Dom.setBlinkArrowRed(true,580,5,35,null,90).play() + setCC("") + } + let box_buttons = document.querySelectorAll(".part_1_1_connections_box button") + + //! connection box onclick + let btnClickedCount = 0 + let connectionBtnArrow = 580 + let arrowLeftGap = 46 + box_buttons.forEach((ele,i)=>{ + ele.onclick = ()=>{ + // increasing count of complete connection + if(ele.style.color!="white"){ + btnClickedCount++ + //! move arrow + connectionBtnArrow += arrowLeftGap + Dom.setBlinkArrowRed(true,connectionBtnArrow,5,35,null,90).play() + + if(btnClickedCount==8){ + Dom.setBlinkArrowRed(true,745,305,35,null,180).play() + setCC("Click on Connections Completed") + + Scenes.items.btn_connections.item.onclick = ()=>{} + } + } + + cables[i].show() + ele.style.backgroundColor = cables_color[i] + ele.style.color = "white" + ele.style.textShadow = "1px 1px black" + } + }) + + Dom.setBlinkArrowRed(true,745,250,35,null,180).play() + setCC("Click on Connections") + + //! Onclick for check connections + Scenes.items.btn_connectons_completed.item.onclick = ()=>{ + + if(btnClickedCount==8){ + + //! First red button click + Scenes.items.part_1_slide_3_compo_1_text.set(208,114,50).zIndex(10) + Dom.setBlinkArrowRed(true,206,73).play() + setCC("Switch on Main Supply") + Scenes.items.part_2_conncection_supply_1_red_button.item.onclick = ()=>{ + + Scenes.items.part_2_conncection_supply_1_red_button.hide() + Scenes.items.part_1_slide_3_compo_1_text.hide() + //! Second red button click + + Scenes.items.part_1_slide_3_compo_2_text.set(212,348,56).zIndex(10) + Dom.setBlinkArrowRed(true,206,308).play() + setCC("Switch on Gate Supply") + + Scenes.items.part_2_conncection_supply_2_red_button.item.onclick = ()=>{ + Scenes.items.part_2_conncection_supply_2_red_button.hide() + Scenes.items.part_1_slide_3_compo_2_text.hide() + + Dom.setBlinkArrowRed(true,748,360,35,null,180).play() + setCC("Click on Start Experiment") + partConnectionsIsComplete = true + } + } + + } + else{ + Scenes.items.part_1_incomplete_connection.set(570,300,50).zIndex(10) + anime({ + targets: Scenes.items.part_1_incomplete_connection.item, + delay: 2000, + complete(){ + Scenes.items.part_1_incomplete_connection.hide() + } + }) + } + } + } + partConnections() + + //! Graph Part + function partCalculation(){ + // for recrod btn + let recordBtnIdx = 0 + Scenes.items.part_1_1_calculations.set(-15,-70,480,983) + Scenes.items.btn_procedure.set(790,132,37).zIndex(10) + Scenes.items.btn_nomenclature.set(610,132,37,160).zIndex(10) + Scenes.items.btn_plot.set(512,129,43,80).zIndex(10) + // * Calling slider + sliders.showSliderFor("1_1") + + // * Graph section + Scenes.items.graph_box_1.set(514,174,null,428).zIndex(10) + let ctx = Scenes.items.graph1.item + let graphIdx = 0 + let xLabel = "Gate to source voltage (VGS)" + let yLabel = "Drain Current (ID)" + let dataLabel = "" + // for setting xy label of graph in position + function setXYLabel(){ + Scenes.items.xLabel.set(633,387) + Scenes.items.yLabel.set(443,277) + } + // ploting empty graph + let graphRef = Scenes.plotGraph(ctx,graphIdx,[],dataLabel,xLabel,yLabel,true,true) + setXYLabel() + + // let table = new Dom(".part_2_table").set(600,-76).item + + let table = new Dom(".part3_table_two").set(513,-76).zIndex(10).item + + // * assume tempTitle10 as a btn record + let btn_record = sliders.btn_record.item + + // * StepTutorial + // show arrow for R + Dom.setBlinkArrowRed(true,254,320,35,null,-90).play() + setCC("Select R") + // and other blink arrow is on sliders.js + + // ! btn_record onclick + recordBtnIdx = 0 + btn_record.onclick = ()=>{ + let rows = table.tBodies[0].rows + if(recordBtnIdx > rows.length){ + return + } + + // * Filling Table + let colIdx = { + 4:1, + 6:2, + 8:3, + 10:4, + 15:5, + } + let first_vGs_value = 4 + let last_vGs_value = 15 + let vGs_value = sliders.slider_vGs.getValue() + let vIn_value = sliders.slider_vIn.getValue() + let R_value = sliders.slider_R.getValue() + + updateValues(vIn_value,vGs_value,R_value) + + // seting column index for filling the table + if(vGs_value == first_vGs_value){ + // vds value + rows[recordBtnIdx+1].cells[0].innerHTML = Formulas.usingMeters.vDS(recordBtnIdx) + } + rows[recordBtnIdx+1].cells[colIdx[vGs_value]].innerHTML = Formulas.usingMeters.iD(values,colIdx[vGs_value],recordBtnIdx) + recordBtnIdx++ + // to plot the data + if(recordBtnIdx == rows.length - 1){ + + + // ! btn Plot onclick + Scenes.items.btn_plot.item.onclick = ()=>{ + // shwo arrwo for vGs + Dom.setBlinkArrowRed(true,0,320,35,null,-90).play() + setCC("Select VGS") + + // goto default position for vIn value and recordBtnIdx = 0 + function resetFun(){ + recordBtnIdx=0 + let defaultLeftPos = 24 + Anime.moveLeft(sliders.slider_vIn.item,defaultLeftPos) + } + // for adding data to graph + function addDataToGraph(){ + let data = [] + for(let row of rows){ + let x = row.cells[0].innerHTML + let y = row.cells[colIdx[vGs_value]].innerHTML + data.push({x,y}) + } + let bgColors = [ + "-", + "#da120f", + "#0607c2", + "#e413e6", + "#25de22", + "#000000" + ] + let bgColor = bgColors[colIdx[vGs_value]] + let labelForDataSet = `Vgs = ${vGs_value}V` + + // add data set + Scenes.graphFeatures.addDataset(graphRef,labelForDataSet,bgColor,data) + } + + if(vGs_value!=last_vGs_value){ + resetFun() + } + let totalDatasets = 5 + if(Scenes.graphFeatures.getSizeOfDatasets(graphRef) < totalDatasets){ + addDataToGraph() + } + + // end the slide + if(vGs_value==last_vGs_value){ + Dom.setBlinkArrowRed(-1) + Dom.setBlinkArrow(true, 790, 544).play(); + setCC("Click 'Next' to go to next step"); + setIsProcessRunning(false); + // for going to the second step + Scenes.currentStep = 2 + } + } + } + } + + } + + + //to show btn popup + Scenes.showPopup("1_1") + + //! onclick start btn + Scenes.items.btn_start_experiment.item.onclick = ()=>{ + // to enable the button + if(partConnectionsIsComplete){ + // * Hide preivous + hideConnectionStepImgs() + // * calculation part + partCalculation() + //to show btn popup + Scenes.showPopup("1_1") + } + } + + return true + }), + + (step3 = function () { + setIsProcessRunning(true); + Scenes.setStepHeading("", "using oscilloscope",true) + Scenes.items.btn_next.show(); + // ! Step Connection + + // required elements + let temp = 16 + let btns = [ + Scenes.items.btn_instructions.set(750 + 75, 10-temp, 40).zIndex(20), + Scenes.items.btn_connections.set(750 + 75, 55-temp, 40).zIndex(20), + Scenes.items.btn_connectons_completed + .set(750 + 75, 100-temp, 50, 120) + .zIndex(20), + Scenes.items.btn_start_experiment + .set(750 + 75, 153-temp, 50, 120) + .zIndex(20), + Scenes.items.btn_reset.set(730, 175-temp, 30).zIndex(20), + ] + + // required images + let images = [ + Scenes.items.part_1_components_2.set(0,0).zIndex(1), + Scenes.items.part_2_conncection_supply_1_red_button.set(144,68,24,22).zIndex(20), + Scenes.items.part_2_conncection_supply_2_red_button.set(140,306,27,23).zIndex(20), + Scenes.items.part_1_2_connections_box, + ] + + let cables = [ + Scenes.items.part_1_2_cable_p1.set(0,0).zIndex(10).hide(), + Scenes.items.part_1_2_cable_s.set(0,0).zIndex(11).hide(), + Scenes.items.part_1_2_cable_r1.set(0,0).zIndex(12).hide(), + Scenes.items.part_1_2_cable_p2.set(0,0).zIndex(13).hide(), + Scenes.items.part_1_2_cable_n2.set(0,0).zIndex(14).hide(), + Scenes.items.part_1_2_cable_dvp.set(0,0).zIndex(15).hide(), + Scenes.items.part_1_2_cable_cp.set(0,0).zIndex(16).hide(), + Scenes.items.part_1_2_cable_a1.set(0,0).zIndex(17).hide(), + Scenes.items.part_1_2_cable_v1.set(0,0).zIndex(18).hide(), + Scenes.items.part_1_2_cable_v2.set(0,0).zIndex(19).hide(), + ] + + // ! for increasing the size + let l = 0,t = -70, h = 485, w = 945 + Scenes.items.part_1_components_2.set(l,t,h,w).zIndex(1) + cables.forEach(ele=>{ + ele.set(l,t,h,w).hide() + }) + + let cables_color = [ + "#e40d0d", + "#162848", + "#037c3a", + "#020202", + "#ffe714", + "#555252", + "#9d9d9d", + "#0f1f3b", + "#974f1e", + "#670202", + ] + + function hideConnectionStepImgs(){ + let allImages = [ + ...btns,...images,...cables + ] + allImages.forEach(ele=>{ + ele.hide() + }) + Dom.setBlinkArrowRed(-1) + } + + //! Connection Part + // to enable startExp Button + let partConnectionsIsComplete = false + function partConnections(){ + // Connection Logic + Scenes.items.part_1_2_connections_box.set(442,-78).hide() + + // ! btn_reset onclick + Scenes.items.btn_reset.item.onclick = ()=>{ + let box_buttons_reset = document.querySelectorAll(".part_1_2_connections_box button") + let temps = { + textShadow: "none", + color: "black", + backgroundColor: "transparent" + } + box_buttons_reset.forEach(ele=>{ + let ele_Dom = new Dom(ele) + ele_Dom.styles(temps) + }) + Scenes.steps[4]() + } + + //! connection box onclick + Scenes.items.btn_connections.item.onclick = ()=>{ + Scenes.items.part_1_2_connections_box.show("flex") + // ! connection table arrow move + Dom.setBlinkArrowRed(true,513,-4,35,null,90).play() + setCC("") + } + let box_buttons = document.querySelectorAll(".part_1_2_connections_box button") + + //! connection box onclick + let btnClickedCount = 0 + let connectionBtnArrow = 513 + let arrowLeftGap = 43 + box_buttons.forEach((ele,i)=>{ + ele.onclick = ()=>{ + // increasing count of complete connection + if(ele.style.color!="white"){ + btnClickedCount++ + //! move arrow + connectionBtnArrow += arrowLeftGap + Dom.setBlinkArrowRed(true,connectionBtnArrow,-4,35,null,90).play() + + if(btnClickedCount==10){ + Dom.setBlinkArrowRed(true,778,105-temp,35,null,180).play() + setCC("Click on Connections Completed") + + Scenes.items.btn_connections.item.onclick = ()=>{} + } + } + + cables[i].show() + ele.style.backgroundColor = cables_color[i] + ele.style.color = "white" + ele.style.textShadow = "1px 1px black" + } + }) + + Dom.setBlinkArrowRed(true,778,55-temp,35,null,180).play() + setCC("Click on Connections") + + //! Onclick for check connections + Scenes.items.btn_connectons_completed.item.onclick = ()=>{ + + if(btnClickedCount==10){ + + //! First red button click + Scenes.items.part_1_slide_3_compo_1_text.set(178,96,50).zIndex(20) + Dom.setBlinkArrowRed(true,170,65).play() + setCC("Switch on Main Supply") + Scenes.items.part_2_conncection_supply_1_red_button.item.onclick = ()=>{ + + Scenes.items.part_2_conncection_supply_1_red_button.hide() + Scenes.items.part_1_slide_3_compo_1_text.hide() + //! Second red button click + + Scenes.items.part_1_slide_3_compo_2_text.set(168,338,56).zIndex(20) + Dom.setBlinkArrowRed(true,166,306).play() + setCC("Switch on Gate Supply") + + Scenes.items.part_2_conncection_supply_2_red_button.item.onclick = ()=>{ + Scenes.items.part_2_conncection_supply_2_red_button.hide() + Scenes.items.part_1_slide_3_compo_2_text.hide() + + Dom.setBlinkArrowRed(true,778,165-temp,35,null,180).play() + setCC("Click on Start Experiment") + partConnectionsIsComplete = true + } + } + + } + else{ + Scenes.items.part_1_incomplete_connection.set(660,100,50).zIndex(10) + anime({ + targets: Scenes.items.part_1_incomplete_connection.item, + delay: 2000, + complete(){ + Scenes.items.part_1_incomplete_connection.hide() + } + }) + } + } + } + partConnections() + + //! Graph Part + function partCalculation(){ + // show arrow for R + Dom.setBlinkArrowRed(true,254,310,35,null,-90).play() + setCC("Select R") + + Scenes.items.part_1_2_calculations.set(3,-70,480,963) + Scenes.items.btn_procedure.set(790-10,90,37).zIndex(10) + Scenes.items.btn_nomenclature.set(610-10,90,37,160).zIndex(10) + // Scenes.items.btn_plot.set(512-10,88,43,80).zIndex(10) + + // neddle vGs rotate (-1,multipoint) deg + Scenes.items.niddle_vGs.set(536,29,74).rotate(-1).zIndex(10) + // neddle vIn rotate (-1,126) deg + Scenes.items.niddle_vIn.set(755,29,74).rotate(-1).zIndex(10) + + // * Calling slider + sliders.showSliderFor("1_2") + + // * Graph section + Scenes.items.graph_box_2.set(499,138,270,440).zIndex(10) + let ctx = Scenes.items.graph2.item + let graphIdx = 1 + let xLabel = "Dra to source voltage (VDS)" + let yLabel = "Drain Current (ID)" + let dataLabel = "" + // for setting xy label of graph in position + function setXYLabel(){ + Scenes.items.xLabel.set(615,377) + Scenes.items.yLabel.set(428,257) + } + // ploting empty graph + let graphRef = Scenes.plotGraph(ctx,graphIdx,[],dataLabel,xLabel,yLabel,true,true) + setXYLabel() + + // let table = new Dom(".part_2_table").set(600,-76).item + + let table = null + + // * assume tempTitle10 as a btn record + let btn_record = sliders.btn_record.item + + // ! btn_record onclick + let recordBtnIdx = 0 + // ! calculation value object + let calculationValues = { + vDs: [0,10,20,30,40,50,60], + iD: [ + [],[],[],[],[] + ], + } + btn_record.onclick = ()=>{ + let vGs_value = sliders.slider_vGs.getValue() + let vIn_value = Math.round(sliders.slider_vIn.getValue()) + let R_value = sliders.slider_R.getValue() + let firstValue = 0 + + updateValues(vIn_value,vGs_value,R_value) + + let vGs_idx = { + 4:1, + 6:2, + 8:3, + 10:4, + 15:5, + } + let first_vGs_value = 4 + let last_vGs_value = 15 + + // vIn values + let vIn_accept_range = [0,40,80,120,160,200,240] + let acceptedValueIndex = vIn_accept_range.indexOf(vIn_value) + let datasetIndex = vGs_idx[vGs_value] - 1 // which value perform for vgs + + // for the first value add data set + if(vIn_value == firstValue){ + // add datasets to graph + let bgColors = [ + "_", + "#da120f", + "#0607c2", + "#e413e6", + "#25de22", + "#000000" + ] + let bgColor = bgColors[vGs_idx[vGs_value]] + let labelForDataSet = `Vgs = ${vGs_value}V` + + // add data set + Scenes.graphFeatures.addDataset(graphRef,labelForDataSet,bgColor,[]) + + // * add first value also + let x = Formulas.usingOscilloscope.vDS(acceptedValueIndex) + let y = Formulas.usingOscilloscope.iD(values,vGs_idx[vGs_value],x) + Scenes.graphFeatures.addData(graphRef,datasetIndex,{x,y}) + } + else{ + // adding data to graph + // datasetIndex = vGs_idx[vGs_value] - 1 + + //! add formula value here + let x = Formulas.usingOscilloscope.vDS(acceptedValueIndex) + let y = Formulas.usingOscilloscope.iD(values,vGs_idx[vGs_value],acceptedValueIndex) + let data = {x,y} + console.log("S: ",vGs_value,vGs_idx[vGs_value]) + + Scenes.graphFeatures.addData(graphRef,datasetIndex,data) + } + } + + } + + //to show btn popup + Scenes.showPopup("1_2") + + //! onclick start btn + Scenes.items.btn_start_experiment.item.onclick = ()=>{ + // to enable the button + if(partConnectionsIsComplete){ + // * Hide preivous + hideConnectionStepImgs() + // * calculation part + partCalculation() + + //to show btn popup + Scenes.showPopup("1_2") + } + } + + return true + }), + + (step4 = function () { + setIsProcessRunning(true); + + Scenes.setStepHeading("Step-2", "Transfer Characteristics.",true); + Scenes.items.btn_next.show(); + // ! Step Connection + + // required elements + let btns = [ + Scenes.items.btn_instructions.set(750 + 40, 190, 50).zIndex(10), + Scenes.items.btn_connections.set(750 + 40, 190 + 55, 50).zIndex(10), + Scenes.items.btn_connectons_completed + .set(750 + 40, 190 + 110, 50, 147) + .zIndex(10), + Scenes.items.btn_start_experiment + .set(750 + 40, 190 + 165, 50, 147) + .zIndex(10), + Scenes.items.btn_reset.set(660, 190 + 165, 40).zIndex(10) + ] + + // required images + let images = [ + Scenes.items.part_2_connections_components.set(0,0).zIndex(1), + Scenes.items.part_2_conncection_supply_1_red_button.set(153,60,24,23).zIndex(10), + Scenes.items.part_2_conncection_supply_2_red_button.set(158,296,27,23).zIndex(10), + Scenes.items.part_2_connections_box, + ] + + let cables = [ + Scenes.items.part_2_conncection_cable_p1.set(0,0).zIndex(5).hide(), + Scenes.items.part_2_conncection_cable_s.set(0,0).zIndex(5).hide(), + Scenes.items.part_2_conncection_cable_a2.set(0,0).zIndex(5).hide(), + Scenes.items.part_2_conncection_cable_r2.set(0,0).zIndex(5).hide(), + Scenes.items.part_2_conncection_cable_p2.set(0,0).zIndex(5).hide(), + Scenes.items.part_2_conncection_cable_n2.set(0,0).zIndex(5).hide(), + Scenes.items.part_2_conncection_cable_v1.set(0,0).zIndex(5).hide(), + Scenes.items.part_2_conncection_cable_v2.set(0,0).zIndex(5).hide(), + Scenes.items.part_2_conncection_cable_vg1.set(0,0).zIndex(5).hide(), + Scenes.items.part_2_conncection_cable_vg2.set(0,0).zIndex(5).hide(), + ] + + // ! for increasing the size + let l = 0,t = -85, h = 495, w = 965 + Scenes.items.part_2_connections_components.set(l,t,h,w).zIndex(1) + cables.forEach(ele=>{ + ele.set(l,t,h,w).hide() + }) + + let cables_color = [ + "#e40000", + "#4f699a", + "#008039", + "#0d0d0d", + "#f9c101", + "#7f3a0b", + "#b6355d", + "#851b85", + "#073007", + "#7c5565", + ] + + function hideConnectionStepImgs(){ + let allImages = [ + ...btns,...images,...cables + ] + allImages.forEach(ele=>{ + ele.hide() + }) + Dom.setBlinkArrowRed(-1) + } + //! Connection Part + // to enable startExp Button + let partConnectionsIsComplete = false + function partConnections(){ + // Connection Logic + Scenes.items.part_2_connections_box.set(442,-84).hide() + + // ! btn_reset onclick + Scenes.items.btn_reset.item.onclick = ()=>{ + let box_buttons_reset = document.querySelectorAll(".part_2_connections_box button") + let temps = { + textShadow: "none", + color: "black", + backgroundColor: "transparent" + } + box_buttons_reset.forEach(ele=>{ + let ele_Dom = new Dom(ele) + ele_Dom.styles(temps) + }) + Scenes.steps[5]() + } + + //! connection box onclick + Scenes.items.btn_connections.item.onclick = ()=>{ + Scenes.items.part_2_connections_box.show("flex") + // ! connection table arrow move + Dom.setBlinkArrowRed(true,510,-7,35,null,90).play() + setCC("") + } + let box_buttons = document.querySelectorAll(".part_2_connections_box button") + + //! connection box onclick + let btnClickedCount = 0 + let connectionBtnArrow = 510 + let arrowLeftGap = 43 + box_buttons.forEach((ele,i)=>{ + ele.onclick = ()=>{ + // increasing count of complete connection + if(ele.style.color!="white"){ + btnClickedCount++ + //! move arrow + connectionBtnArrow += arrowLeftGap + Dom.setBlinkArrowRed(true,connectionBtnArrow,-7,35,null,90).play() + + if(btnClickedCount==10){ + Dom.setBlinkArrowRed(true,745,305,35,null,180).play() + setCC("Click on Connections Completed") + + Scenes.items.btn_connections.item.onclick = ()=>{} + } + } + + cables[i].show() + ele.style.backgroundColor = cables_color[i] + ele.style.color = "white" + ele.style.textShadow = "1px 1px black" + } + }) + + Dom.setBlinkArrowRed(true,745,250,35,null,180).play() + setCC("Click on Connections") + + //! Onclick for check connections + Scenes.items.btn_connectons_completed.item.onclick = ()=>{ + + if(btnClickedCount==10){ + + //! First red button click + Scenes.items.part_1_slide_3_compo_1_text.set(178,144-55,50).zIndex(10) + Dom.setBlinkArrowRed(true,186,113-55).play() + setCC("Switch on Main Supply") + Scenes.items.part_2_conncection_supply_1_red_button.item.onclick = ()=>{ + + Scenes.items.part_2_conncection_supply_1_red_button.hide() + Scenes.items.part_1_slide_3_compo_1_text.hide() + //! Second red button click + + Scenes.items.part_1_slide_3_compo_2_text.set(178,338-13,56).zIndex(10) + Dom.setBlinkArrowRed(true,186,306-13).play() + setCC("Switch on Gate Supply") + + Scenes.items.part_2_conncection_supply_2_red_button.item.onclick = ()=>{ + Scenes.items.part_2_conncection_supply_2_red_button.hide() + Scenes.items.part_1_slide_3_compo_2_text.hide() + + Dom.setBlinkArrowRed(true,745,360,35,null,180).play() + setCC("Click on Start Experiment") + partConnectionsIsComplete = true + } + } + + } + else{ + Scenes.items.part_1_incomplete_connection.set(570,300,50).zIndex(10) + anime({ + targets: Scenes.items.part_1_incomplete_connection.item, + delay: 2000, + complete(){ + Scenes.items.part_1_incomplete_connection.hide() + } + }) + } + } + } + partConnections() + + //! Graph Part + function partCalculation(){ + // show arrow for R + Dom.setBlinkArrowRed(true,317,302,35,null,-90).play() + setCC("Select R") + + Scenes.items.part_2_calculation_components.set(0,-85,475,950) + Scenes.items.btn_nomenclature.set(785,-75,30).zIndex(10) + Scenes.items.btn_procedure.set(785,-10,33).zIndex(10) + Scenes.items.btn_plot.set(785,70,50).zIndex(10) + // * Calling slider + sliders.showSliderFor("2") + + // * Graph section + Scenes.items.graph_box_3.set(580,162,242,365).zIndex(10) + let ctx = Scenes.items.graph3.item + let graphIdx = 2 + let xLabel = "Gate to source voltage (VGS)" + let yLabel = "Drain Current (ID)" + let dataLabel = "vDS = 50" + // ploting empty graph + let graphRef = Scenes.plotGraph(ctx,graphIdx,[],dataLabel,xLabel,yLabel,true) + // for setting xy label of graph in position + function setXYLabel(){ + Scenes.items.xLabel.set(664, 375) + Scenes.items.yLabel.set(507, 263) + } + setXYLabel() + + let table = new Dom(".part_2_table").set(600,-76).item + // * assume tempTitle10 as a btn record + let btn_record = sliders.btn_record.item + + // ! btn_record onclick + let recordBtnIdx = 0 + btn_record.onclick = ()=>{ + let rows = table.tBodies[0].rows + if(recordBtnIdx >= rows.length){ + return + } + + let vGs_value = sliders.slider_vGs.getValue() + let vIn_value = Math.round(sliders.slider_vIn.getValue()) + let R_value = sliders.slider_R.getValue() + updateValues(vIn_value,vGs_value,R_value) + + // * Filling Table + rows[recordBtnIdx].cells[0].innerHTML = vGs_value + rows[recordBtnIdx].cells[1].innerHTML = Formulas.transferCharacteristics.iD(values,recordBtnIdx) + recordBtnIdx++ + + // to plot the data + if(recordBtnIdx == rows.length){ + // ! btn Plot onclick + Scenes.items.btn_plot.item.onclick = ()=>{ + let data = [] + for(let row of rows){ + let x = row.cells[0].innerHTML + let y = row.cells[1].innerHTML + data.push({x,y}) + } + + Scenes.graphFeatures.addData(graphRef,0,data) + + Dom.setBlinkArrowRed(-1) + Dom.setBlinkArrow(true, 790, 544).play(); + setCC("Click 'Next' to go to next step"); + setIsProcessRunning(false); + // for going to the second step + Scenes.currentStep = 2 + } + } + } + + } + + //to show btn popup + Scenes.showPopup("2") + + //! onclick start btn + Scenes.items.btn_start_experiment.item.onclick = ()=>{ + // to enable the button + if(partConnectionsIsComplete){ + // * Hide preivous + hideConnectionStepImgs() + // * calculation part + partCalculation() + //to show btn popup + Scenes.showPopup("2") + } + } + + return true + }), + + (step5 = function () { + setIsProcessRunning(true); + Dom.hideAll(); + Scenes.setStepHeading("Step-3", "Switching Characteristics."); + // setCC("Record 7 reading for 3 different load resistances.") + // ! show the slider + // Scenes.items.slider_box.set(25, 15).scale(0.95); + Scenes.items.btn_next.show(); + + //! Required Items + Scenes.items.part_3_components.set(0,-55,null, 950 ) + Scenes.items.part_3_off_button.set(100, 65, 42, 65) + Scenes.items.part_3_text.set(90, 175, 80, 100) + Scenes.items.btn_procedure.set(20,298, 38, 170) + Scenes.items.btn_nomenclature.set(20,340, 38, 190) + Dom.setBlinkArrowRed(true,112,115,35,null,90).play() + + + + + let offBtn = Scenes.items.part_3_off_button.item + + offBtn.onclick = ()=>{ + Dom.setBlinkArrowRed(-1) + Scenes.items.part_3_graph.set( -10, -56, 404, 965) + Scenes.items.part_3_off_button.hide() + Scenes.items.part_3_text.hide() + Scenes.items.part_3_table_1.set(220,270, 135, 300) + Scenes.items.part_3_table_2.set(590,330, 50) + Scenes.items.part_3_table_3.set(742,330, 50) + + + + } + + //to show btn popup + Scenes.showPopup("3") + + return true; + }), + + ], + back() { + //! animation isRunning + // if (isRunning) { + // return; + // } + if (this.currentStep > 1) { + Scenes.items.btn_next.setContent("Next"); + Scenes.items.btn_next.item.onclick = () => {}; + this.currentStep -= 2; + this.steps[this.currentStep](); + this.currentStep++; + backDrawerItem(); + backProgressBar(); + } + }, + next() { + //! animation isRunning + if (isRunning) { + return; + } + if (this.currentStep < this.steps.length) { + if (this.steps[this.currentStep]()) { + nextDrawerItem(); + nextProgressBar(); + this.currentStep++; + } + } else { + } + }, +}; + +// * slider +// var rangeSlider = function () { +// var slider = $(".range-slider"), +// range = $(".range-slider__range"), +// value = $(".range-slider__value"); + +// slider.each(function () { +// value.each(function () { +// var value = $(this).prev().attr("value"); +// $(this).html(value); +// }); + +// range.on("input", function () { +// $(this).next(value).html(this.value); +// $(this).next(value).val(this.value); +// }); +// }); +// }; +// $(".resistance-input").on("keyup", () => { +// let slider = $(".slider_R .range-slider__range"); +// let input = document.querySelector(".resistance-input"); + +// let min = 1; +// let max = Number(slider.attr("max")); +// // if (input.value < min) { +// // input.value = min; +// // } +// if (input.value > max) { +// input.value = max; +// } +// slider.val(input.value); +// }); +// rangeSlider(); + +// stepcalling +Scenes.currentStep = 3 + +Scenes.next() +// Scenes.steps[3]() +// Scenes.next() +// Scenes.next() + +const nextBtn = get(".btn-next"); + +const backBtn = get(".btn-back"); +nextBtn.addEventListener("click", () => { + Scenes.next(); +}); +backBtn.addEventListener("click", () => { + Scenes.back(); +}); + +// print certificate +get(".btn-save").addEventListener("click", () => { + window.print(); +}); + +let muteBtn = get(".btn-mute"); +muteBtn.addEventListener("click", () => { + if (isMute) { + isMute = false; + muteBtn.src = "./src/images/template_imgs/speech_off_btn.png"; + muteBtn.title = "Click to Mute"; + } else { + isMute = true; + muteBtn.src = "./src/images/template_imgs/speech_on_btn.png"; + muteBtn.title = "Click to Unmute"; + } +}); + +// ! Anime Header Hover Buttons +function btnPopupBox() { + let popupBtns = document.querySelectorAll(".btn-popup"); + let popupWindow = document.querySelector(".btn-popup-window"); + + popupBtns[0].onmouseover = () => { + popupWindow.src = Scenes.items.formulas_procedure.item.src; + }; + popupBtns[1].onmouseover = () => { + popupWindow.src = Scenes.items.formulas_nomenclautre.item.src; + }; + popupBtns[2].onmouseover = () => { + switch (Scenes.forMathematicalExpressionBtn) { + case 1: + popupWindow.src = Scenes.items.formulas_ideal.item.src; + break; + + case 2: + popupWindow.src = Scenes.items.formulas_non_ideal.item.src; + break; + + case 3: + popupWindow.src = Scenes.items.formulas_efficiency.item.src; + break; + + case 4: + popupWindow.src = Scenes.items.formulas_component_stress.item.src; + break; + + default: + popupWindow.src = Scenes.items.formulas_universal.item.src; + break; + } + }; +} +// btnPopupBox(); + +// i really enjoyed the voice of keybord +// its amazing + +// mouse position +// function getCursor(event) { +// let x = event.clientX; +// let y = event.clientY; +// let _position = `X: ${x - 419}
    Y: ${y - 169}`; + +// const infoElement = document.getElementById("info"); +// infoElement.innerHTML = _position; +// infoElement.style.top = y + "px"; +// infoElement.style.left = x + 20 + "px"; +// } + diff --git a/experiment/simulation/EE6/src/images/EE6 photoscape/part_1_1_calculation.psxprj b/experiment/simulation/EE6/src/images/EE6 photoscape/part_1_1_calculation.psxprj new file mode 100644 index 0000000..d9f1b3b Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6 photoscape/part_1_1_calculation.psxprj differ diff --git a/experiment/simulation/EE6/src/images/EE6 photoscape/part_1_1_components.psxprj b/experiment/simulation/EE6/src/images/EE6 photoscape/part_1_1_components.psxprj new file mode 100644 index 0000000..417fddf Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6 photoscape/part_1_1_components.psxprj differ diff --git a/experiment/simulation/EE6/src/images/EE6 photoscape/part_1_1_instruction_box.psxprj b/experiment/simulation/EE6/src/images/EE6 photoscape/part_1_1_instruction_box.psxprj new file mode 100644 index 0000000..8b96691 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6 photoscape/part_1_1_instruction_box.psxprj differ diff --git a/experiment/simulation/EE6/src/images/EE6 photoscape/part_1_2_calculations.psxprj b/experiment/simulation/EE6/src/images/EE6 photoscape/part_1_2_calculations.psxprj new file mode 100644 index 0000000..9c2a70b Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6 photoscape/part_1_2_calculations.psxprj differ diff --git a/experiment/simulation/EE6/src/images/EE6 photoscape/part_1_2_components.psxprj b/experiment/simulation/EE6/src/images/EE6 photoscape/part_1_2_components.psxprj new file mode 100644 index 0000000..fcbc213 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6 photoscape/part_1_2_components.psxprj differ diff --git a/experiment/simulation/EE6/src/images/EE6 photoscape/part_1_2_components_full.psxprj b/experiment/simulation/EE6/src/images/EE6 photoscape/part_1_2_components_full.psxprj new file mode 100644 index 0000000..2ea5dc0 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6 photoscape/part_1_2_components_full.psxprj differ diff --git a/experiment/simulation/EE6/src/images/EE6 photoscape/part_2_calculations.psxprj b/experiment/simulation/EE6/src/images/EE6 photoscape/part_2_calculations.psxprj new file mode 100644 index 0000000..18706c6 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6 photoscape/part_2_calculations.psxprj differ diff --git a/experiment/simulation/EE6/src/images/EE6 photoscape/part_2_components.psxprj b/experiment/simulation/EE6/src/images/EE6 photoscape/part_2_components.psxprj new file mode 100644 index 0000000..43eb69c Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6 photoscape/part_2_components.psxprj differ diff --git a/experiment/simulation/EE6/src/images/EE6 photoscape/part_2_new_calc.psxprj b/experiment/simulation/EE6/src/images/EE6 photoscape/part_2_new_calc.psxprj new file mode 100644 index 0000000..4ecff0a Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6 photoscape/part_2_new_calc.psxprj differ diff --git a/experiment/simulation/EE6/src/images/EE6/EE6 photoscape.zip b/experiment/simulation/EE6/src/images/EE6/EE6 photoscape.zip new file mode 100644 index 0000000..5db7d20 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/EE6 photoscape.zip differ diff --git a/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_1_1_calculation.psxprj b/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_1_1_calculation.psxprj new file mode 100644 index 0000000..d9f1b3b Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_1_1_calculation.psxprj differ diff --git a/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_1_1_components.psxprj b/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_1_1_components.psxprj new file mode 100644 index 0000000..417fddf Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_1_1_components.psxprj differ diff --git a/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_1_1_instruction_box.psxprj b/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_1_1_instruction_box.psxprj new file mode 100644 index 0000000..8b96691 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_1_1_instruction_box.psxprj differ diff --git a/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_1_2_calculations.psxprj b/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_1_2_calculations.psxprj new file mode 100644 index 0000000..9c2a70b Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_1_2_calculations.psxprj differ diff --git a/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_1_2_components.psxprj b/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_1_2_components.psxprj new file mode 100644 index 0000000..fcbc213 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_1_2_components.psxprj differ diff --git a/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_1_2_components_full.psxprj b/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_1_2_components_full.psxprj new file mode 100644 index 0000000..2ea5dc0 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_1_2_components_full.psxprj differ diff --git a/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_2_calculations.psxprj b/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_2_calculations.psxprj new file mode 100644 index 0000000..18706c6 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_2_calculations.psxprj differ diff --git a/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_2_components.psxprj b/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_2_components.psxprj new file mode 100644 index 0000000..43eb69c Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_2_components.psxprj differ diff --git a/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_2_new_calc.psxprj b/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_2_new_calc.psxprj new file mode 100644 index 0000000..4ecff0a Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/EE6 photoscape/part_2_new_calc.psxprj differ diff --git a/experiment/simulation/EE6/src/images/EE6/btn_begin_experiment.png b/experiment/simulation/EE6/src/images/EE6/btn_begin_experiment.png new file mode 100644 index 0000000..590c504 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/btn_begin_experiment.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/btn_conclusion.png b/experiment/simulation/EE6/src/images/EE6/btn_conclusion.png new file mode 100644 index 0000000..426927b Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/btn_conclusion.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/btn_connection_completed.png b/experiment/simulation/EE6/src/images/EE6/btn_connection_completed.png new file mode 100644 index 0000000..f486779 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/btn_connection_completed.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/btn_make_connection.png b/experiment/simulation/EE6/src/images/EE6/btn_make_connection.png new file mode 100644 index 0000000..b3505df Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/btn_make_connection.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/btn_plot.png b/experiment/simulation/EE6/src/images/EE6/btn_plot.png new file mode 100644 index 0000000..c048c78 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/btn_plot.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/btn_procedure.png b/experiment/simulation/EE6/src/images/EE6/btn_procedure.png new file mode 100644 index 0000000..220198f Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/btn_procedure.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/btn_procedure_calculations.png b/experiment/simulation/EE6/src/images/EE6/btn_procedure_calculations.png new file mode 100644 index 0000000..315de4d Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/btn_procedure_calculations.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/component_1_on_text.png b/experiment/simulation/EE6/src/images/EE6/component_1_on_text.png new file mode 100644 index 0000000..d099d4f Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/component_1_on_text.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/component_2_on_text.png b/experiment/simulation/EE6/src/images/EE6/component_2_on_text.png new file mode 100644 index 0000000..9a418f5 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/component_2_on_text.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_a2.png b/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_a2.png new file mode 100644 index 0000000..2dd1925 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_a2.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_e.png b/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_e.png new file mode 100644 index 0000000..787caca Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_e.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_n2.png b/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_n2.png new file mode 100644 index 0000000..c4e15a5 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_n2.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_p1.png b/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_p1.png new file mode 100644 index 0000000..d44b24f Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_p1.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_p2.png b/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_p2.png new file mode 100644 index 0000000..9dcaf88 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_p2.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_r2.png b/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_r2.png new file mode 100644 index 0000000..f363a23 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_r2.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_v1.png b/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_v1.png new file mode 100644 index 0000000..c7c042c Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_v1.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_v2.png b/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_v2.png new file mode 100644 index 0000000..0253f89 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_1_cable_v2.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_1_calculations.png b/experiment/simulation/EE6/src/images/EE6/part_1_1_calculations.png new file mode 100644 index 0000000..f990f1c Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_1_calculations.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_1_components.png b/experiment/simulation/EE6/src/images/EE6/part_1_1_components.png new file mode 100644 index 0000000..6a7357c Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_1_components.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_1_conclusion_box.png b/experiment/simulation/EE6/src/images/EE6/part_1_1_conclusion_box.png new file mode 100644 index 0000000..4e722af Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_1_conclusion_box.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_1_instruction_box.png b/experiment/simulation/EE6/src/images/EE6/part_1_1_instruction_box.png new file mode 100644 index 0000000..48e231a Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_1_instruction_box.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_1_nomenclature_box.png b/experiment/simulation/EE6/src/images/EE6/part_1_1_nomenclature_box.png new file mode 100644 index 0000000..399d096 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_1_nomenclature_box.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_1_procedure_box.png b/experiment/simulation/EE6/src/images/EE6/part_1_1_procedure_box.png new file mode 100644 index 0000000..3afe6b5 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_1_procedure_box.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_a1.png b/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_a1.png new file mode 100644 index 0000000..d49a012 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_a1.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_cp.png b/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_cp.png new file mode 100644 index 0000000..6e0f207 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_cp.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_dvp.png b/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_dvp.png new file mode 100644 index 0000000..00fdcdd Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_dvp.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_e.png b/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_e.png new file mode 100644 index 0000000..d57d08d Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_e.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_n2.png b/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_n2.png new file mode 100644 index 0000000..2594fdf Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_n2.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_p1.png b/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_p1.png new file mode 100644 index 0000000..77d2772 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_p1.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_p2.png b/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_p2.png new file mode 100644 index 0000000..b7b552e Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_p2.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_r2.png b/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_r2.png new file mode 100644 index 0000000..a9b4fc7 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_r2.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_v1.png b/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_v1.png new file mode 100644 index 0000000..8ad395d Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_v1.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_v2.png b/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_v2.png new file mode 100644 index 0000000..3ada93d Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_2_cable_v2.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_2_calculations.png b/experiment/simulation/EE6/src/images/EE6/part_1_2_calculations.png new file mode 100644 index 0000000..0053230 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_2_calculations.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_2_components.png b/experiment/simulation/EE6/src/images/EE6/part_1_2_components.png new file mode 100644 index 0000000..6f931e8 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_2_components.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_2_conclusion_box.png b/experiment/simulation/EE6/src/images/EE6/part_1_2_conclusion_box.png new file mode 100644 index 0000000..ce04fcc Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_2_conclusion_box.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_2_instruction_box.png b/experiment/simulation/EE6/src/images/EE6/part_1_2_instruction_box.png new file mode 100644 index 0000000..0db0a73 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_2_instruction_box.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_2_nomenclature_box.png b/experiment/simulation/EE6/src/images/EE6/part_1_2_nomenclature_box.png new file mode 100644 index 0000000..4b18ec7 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_2_nomenclature_box.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_1_2_procedure_box.png b/experiment/simulation/EE6/src/images/EE6/part_1_2_procedure_box.png new file mode 100644 index 0000000..5834dcc Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_1_2_procedure_box.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_2_cable_a2.png b/experiment/simulation/EE6/src/images/EE6/part_2_cable_a2.png new file mode 100644 index 0000000..2c2bfac Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_2_cable_a2.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_2_cable_e.png b/experiment/simulation/EE6/src/images/EE6/part_2_cable_e.png new file mode 100644 index 0000000..b5b8bdb Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_2_cable_e.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_2_cable_n2.png b/experiment/simulation/EE6/src/images/EE6/part_2_cable_n2.png new file mode 100644 index 0000000..9442d6f Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_2_cable_n2.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_2_cable_p1.png b/experiment/simulation/EE6/src/images/EE6/part_2_cable_p1.png new file mode 100644 index 0000000..2eeec31 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_2_cable_p1.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_2_cable_p2.png b/experiment/simulation/EE6/src/images/EE6/part_2_cable_p2.png new file mode 100644 index 0000000..7dc6798 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_2_cable_p2.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_2_cable_r2.png b/experiment/simulation/EE6/src/images/EE6/part_2_cable_r2.png new file mode 100644 index 0000000..2bed6f1 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_2_cable_r2.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_2_cable_v1.png b/experiment/simulation/EE6/src/images/EE6/part_2_cable_v1.png new file mode 100644 index 0000000..39d08e9 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_2_cable_v1.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_2_cable_v2.png b/experiment/simulation/EE6/src/images/EE6/part_2_cable_v2.png new file mode 100644 index 0000000..f2b5af9 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_2_cable_v2.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_2_cable_vg1.png b/experiment/simulation/EE6/src/images/EE6/part_2_cable_vg1.png new file mode 100644 index 0000000..4e77eff Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_2_cable_vg1.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_2_cable_vg2.png b/experiment/simulation/EE6/src/images/EE6/part_2_cable_vg2.png new file mode 100644 index 0000000..c1007e5 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_2_cable_vg2.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_2_calculations.png b/experiment/simulation/EE6/src/images/EE6/part_2_calculations.png new file mode 100644 index 0000000..eef182d Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_2_calculations.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_2_components.png b/experiment/simulation/EE6/src/images/EE6/part_2_components.png new file mode 100644 index 0000000..dfa434d Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_2_components.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_2_conclusion_box.png b/experiment/simulation/EE6/src/images/EE6/part_2_conclusion_box.png new file mode 100644 index 0000000..5495aee Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_2_conclusion_box.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_2_instruction_box.png b/experiment/simulation/EE6/src/images/EE6/part_2_instruction_box.png new file mode 100644 index 0000000..bff9508 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_2_instruction_box.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_2_nomenclature_box.png b/experiment/simulation/EE6/src/images/EE6/part_2_nomenclature_box.png new file mode 100644 index 0000000..b439198 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_2_nomenclature_box.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/part_2_procedure_box.png b/experiment/simulation/EE6/src/images/EE6/part_2_procedure_box.png new file mode 100644 index 0000000..3450c53 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/part_2_procedure_box.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/select_option_1_1.png b/experiment/simulation/EE6/src/images/EE6/select_option_1_1.png new file mode 100644 index 0000000..37ffd34 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/select_option_1_1.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/select_option_1_2.png b/experiment/simulation/EE6/src/images/EE6/select_option_1_2.png new file mode 100644 index 0000000..77344cd Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/select_option_1_2.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/select_option_2.png b/experiment/simulation/EE6/src/images/EE6/select_option_2.png new file mode 100644 index 0000000..4ce1dc4 Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/select_option_2.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/select_option_full.png b/experiment/simulation/EE6/src/images/EE6/select_option_full.png new file mode 100644 index 0000000..6896bfb Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/select_option_full.png differ diff --git a/experiment/simulation/EE6/src/images/EE6/slider_thumb.png b/experiment/simulation/EE6/src/images/EE6/slider_thumb.png new file mode 100644 index 0000000..25cf97b Binary files /dev/null and b/experiment/simulation/EE6/src/images/EE6/slider_thumb.png differ diff --git a/experiment/simulation/EE6/src/images/box1.png b/experiment/simulation/EE6/src/images/box1.png new file mode 100644 index 0000000..9d11802 Binary files /dev/null and b/experiment/simulation/EE6/src/images/box1.png differ diff --git a/experiment/simulation/EE6/src/images/box2.png b/experiment/simulation/EE6/src/images/box2.png new file mode 100644 index 0000000..66d9f3d Binary files /dev/null and b/experiment/simulation/EE6/src/images/box2.png differ diff --git a/experiment/simulation/EE6/src/images/box3.png b/experiment/simulation/EE6/src/images/box3.png new file mode 100644 index 0000000..38c94c3 Binary files /dev/null and b/experiment/simulation/EE6/src/images/box3.png differ diff --git a/experiment/simulation/EE6/src/images/box4.png b/experiment/simulation/EE6/src/images/box4.png new file mode 100644 index 0000000..fb0d391 Binary files /dev/null and b/experiment/simulation/EE6/src/images/box4.png differ diff --git a/experiment/simulation/EE6/src/images/box5.png b/experiment/simulation/EE6/src/images/box5.png new file mode 100644 index 0000000..7dbbb83 Binary files /dev/null and b/experiment/simulation/EE6/src/images/box5.png differ diff --git a/experiment/simulation/EE6/src/images/box6.png b/experiment/simulation/EE6/src/images/box6.png new file mode 100644 index 0000000..ea92b72 Binary files /dev/null and b/experiment/simulation/EE6/src/images/box6.png differ diff --git a/experiment/simulation/EE6/src/images/box_img.png b/experiment/simulation/EE6/src/images/box_img.png new file mode 100644 index 0000000..4fa944a Binary files /dev/null and b/experiment/simulation/EE6/src/images/box_img.png differ diff --git a/experiment/simulation/EE6/src/images/btn_connections.png b/experiment/simulation/EE6/src/images/btn_connections.png new file mode 100644 index 0000000..cadcf8e Binary files /dev/null and b/experiment/simulation/EE6/src/images/btn_connections.png differ diff --git a/experiment/simulation/EE6/src/images/btn_connectons_completed.png b/experiment/simulation/EE6/src/images/btn_connectons_completed.png new file mode 100644 index 0000000..abecdff Binary files /dev/null and b/experiment/simulation/EE6/src/images/btn_connectons_completed.png differ diff --git a/experiment/simulation/EE6/src/images/btn_instructions.png b/experiment/simulation/EE6/src/images/btn_instructions.png new file mode 100644 index 0000000..fbf93e9 Binary files /dev/null and b/experiment/simulation/EE6/src/images/btn_instructions.png differ diff --git a/experiment/simulation/EE6/src/images/btn_nomenclature.png b/experiment/simulation/EE6/src/images/btn_nomenclature.png new file mode 100644 index 0000000..91422ca Binary files /dev/null and b/experiment/simulation/EE6/src/images/btn_nomenclature.png differ diff --git a/experiment/simulation/EE6/src/images/btn_plot.png b/experiment/simulation/EE6/src/images/btn_plot.png new file mode 100644 index 0000000..cf77ae7 Binary files /dev/null and b/experiment/simulation/EE6/src/images/btn_plot.png differ diff --git a/experiment/simulation/EE6/src/images/btn_procedure.png b/experiment/simulation/EE6/src/images/btn_procedure.png new file mode 100644 index 0000000..315de4d Binary files /dev/null and b/experiment/simulation/EE6/src/images/btn_procedure.png differ diff --git a/experiment/simulation/EE6/src/images/btn_reset.png b/experiment/simulation/EE6/src/images/btn_reset.png new file mode 100644 index 0000000..45dc15f Binary files /dev/null and b/experiment/simulation/EE6/src/images/btn_reset.png differ diff --git a/experiment/simulation/EE6/src/images/btn_start_experiment.png b/experiment/simulation/EE6/src/images/btn_start_experiment.png new file mode 100644 index 0000000..be6d519 Binary files /dev/null and b/experiment/simulation/EE6/src/images/btn_start_experiment.png differ diff --git a/experiment/simulation/EE6/src/images/circuit_full_2.png b/experiment/simulation/EE6/src/images/circuit_full_2.png new file mode 100644 index 0000000..cd461b3 Binary files /dev/null and b/experiment/simulation/EE6/src/images/circuit_full_2.png differ diff --git a/experiment/simulation/EE6/src/images/circuit_full_3.png b/experiment/simulation/EE6/src/images/circuit_full_3.png new file mode 100644 index 0000000..03005d0 Binary files /dev/null and b/experiment/simulation/EE6/src/images/circuit_full_3.png differ diff --git a/experiment/simulation/EE6/src/images/component_battery.png b/experiment/simulation/EE6/src/images/component_battery.png new file mode 100644 index 0000000..6fe4cee Binary files /dev/null and b/experiment/simulation/EE6/src/images/component_battery.png differ diff --git a/experiment/simulation/EE6/src/images/component_capacitor.png b/experiment/simulation/EE6/src/images/component_capacitor.png new file mode 100644 index 0000000..5509553 Binary files /dev/null and b/experiment/simulation/EE6/src/images/component_capacitor.png differ diff --git a/experiment/simulation/EE6/src/images/component_diode.png b/experiment/simulation/EE6/src/images/component_diode.png new file mode 100644 index 0000000..903cb79 Binary files /dev/null and b/experiment/simulation/EE6/src/images/component_diode.png differ diff --git a/experiment/simulation/EE6/src/images/component_inductor.png b/experiment/simulation/EE6/src/images/component_inductor.png new file mode 100644 index 0000000..197d4fb Binary files /dev/null and b/experiment/simulation/EE6/src/images/component_inductor.png differ diff --git a/experiment/simulation/EE6/src/images/component_mosfet.png b/experiment/simulation/EE6/src/images/component_mosfet.png new file mode 100644 index 0000000..44ab6bb Binary files /dev/null and b/experiment/simulation/EE6/src/images/component_mosfet.png differ diff --git a/experiment/simulation/EE6/src/images/component_register.png b/experiment/simulation/EE6/src/images/component_register.png new file mode 100644 index 0000000..abfc8c2 Binary files /dev/null and b/experiment/simulation/EE6/src/images/component_register.png differ diff --git a/experiment/simulation/EE6/src/images/formulas_component_stress.png b/experiment/simulation/EE6/src/images/formulas_component_stress.png new file mode 100644 index 0000000..5a1d148 Binary files /dev/null and b/experiment/simulation/EE6/src/images/formulas_component_stress.png differ diff --git a/experiment/simulation/EE6/src/images/formulas_efficiency.png b/experiment/simulation/EE6/src/images/formulas_efficiency.png new file mode 100644 index 0000000..c776c78 Binary files /dev/null and b/experiment/simulation/EE6/src/images/formulas_efficiency.png differ diff --git a/experiment/simulation/EE6/src/images/formulas_ideal.png b/experiment/simulation/EE6/src/images/formulas_ideal.png new file mode 100644 index 0000000..adbd8bc Binary files /dev/null and b/experiment/simulation/EE6/src/images/formulas_ideal.png differ diff --git a/experiment/simulation/EE6/src/images/formulas_nomenclautre.png b/experiment/simulation/EE6/src/images/formulas_nomenclautre.png new file mode 100644 index 0000000..affb964 Binary files /dev/null and b/experiment/simulation/EE6/src/images/formulas_nomenclautre.png differ diff --git a/experiment/simulation/EE6/src/images/formulas_non_ideal.png b/experiment/simulation/EE6/src/images/formulas_non_ideal.png new file mode 100644 index 0000000..a984e3d Binary files /dev/null and b/experiment/simulation/EE6/src/images/formulas_non_ideal.png differ diff --git a/experiment/simulation/EE6/src/images/formulas_procedure.png b/experiment/simulation/EE6/src/images/formulas_procedure.png new file mode 100644 index 0000000..62e92eb Binary files /dev/null and b/experiment/simulation/EE6/src/images/formulas_procedure.png differ diff --git a/experiment/simulation/EE6/src/images/formulas_universal.png b/experiment/simulation/EE6/src/images/formulas_universal.png new file mode 100644 index 0000000..40c4aec Binary files /dev/null and b/experiment/simulation/EE6/src/images/formulas_universal.png differ diff --git a/experiment/simulation/EE6/src/images/full_circuit.png b/experiment/simulation/EE6/src/images/full_circuit.png new file mode 100644 index 0000000..82a7322 Binary files /dev/null and b/experiment/simulation/EE6/src/images/full_circuit.png differ diff --git a/experiment/simulation/EE6/src/images/full_circuit2.png b/experiment/simulation/EE6/src/images/full_circuit2.png new file mode 100644 index 0000000..e546fb1 Binary files /dev/null and b/experiment/simulation/EE6/src/images/full_circuit2.png differ diff --git a/experiment/simulation/EE6/src/images/graph2_arrow.png b/experiment/simulation/EE6/src/images/graph2_arrow.png new file mode 100644 index 0000000..841a8b7 Binary files /dev/null and b/experiment/simulation/EE6/src/images/graph2_arrow.png differ diff --git a/experiment/simulation/EE6/src/images/method_1_cable_black_bottom.png b/experiment/simulation/EE6/src/images/method_1_cable_black_bottom.png new file mode 100644 index 0000000..f520a74 Binary files /dev/null and b/experiment/simulation/EE6/src/images/method_1_cable_black_bottom.png differ diff --git a/experiment/simulation/EE6/src/images/method_1_cable_black_top.png b/experiment/simulation/EE6/src/images/method_1_cable_black_top.png new file mode 100644 index 0000000..878ae2e Binary files /dev/null and b/experiment/simulation/EE6/src/images/method_1_cable_black_top.png differ diff --git a/experiment/simulation/EE6/src/images/method_1_cable_blue.png b/experiment/simulation/EE6/src/images/method_1_cable_blue.png new file mode 100644 index 0000000..892e6e4 Binary files /dev/null and b/experiment/simulation/EE6/src/images/method_1_cable_blue.png differ diff --git a/experiment/simulation/EE6/src/images/method_1_cable_green.png b/experiment/simulation/EE6/src/images/method_1_cable_green.png new file mode 100644 index 0000000..5f10fc9 Binary files /dev/null and b/experiment/simulation/EE6/src/images/method_1_cable_green.png differ diff --git a/experiment/simulation/EE6/src/images/method_1_cable_pink.png b/experiment/simulation/EE6/src/images/method_1_cable_pink.png new file mode 100644 index 0000000..4216909 Binary files /dev/null and b/experiment/simulation/EE6/src/images/method_1_cable_pink.png differ diff --git a/experiment/simulation/EE6/src/images/method_1_cable_purple.png b/experiment/simulation/EE6/src/images/method_1_cable_purple.png new file mode 100644 index 0000000..bdfefb4 Binary files /dev/null and b/experiment/simulation/EE6/src/images/method_1_cable_purple.png differ diff --git a/experiment/simulation/EE6/src/images/method_1_cable_red.png b/experiment/simulation/EE6/src/images/method_1_cable_red.png new file mode 100644 index 0000000..20ab6a0 Binary files /dev/null and b/experiment/simulation/EE6/src/images/method_1_cable_red.png differ diff --git a/experiment/simulation/EE6/src/images/method_1_cable_yellow.png b/experiment/simulation/EE6/src/images/method_1_cable_yellow.png new file mode 100644 index 0000000..0447460 Binary files /dev/null and b/experiment/simulation/EE6/src/images/method_1_cable_yellow.png differ diff --git a/experiment/simulation/EE6/src/images/method_2_cable_green.png b/experiment/simulation/EE6/src/images/method_2_cable_green.png new file mode 100644 index 0000000..fa3a8d2 Binary files /dev/null and b/experiment/simulation/EE6/src/images/method_2_cable_green.png differ diff --git a/experiment/simulation/EE6/src/images/method_2_cable_red.png b/experiment/simulation/EE6/src/images/method_2_cable_red.png new file mode 100644 index 0000000..ba1a5cb Binary files /dev/null and b/experiment/simulation/EE6/src/images/method_2_cable_red.png differ diff --git a/experiment/simulation/EE6/src/images/method_2_cable_yellow.png b/experiment/simulation/EE6/src/images/method_2_cable_yellow.png new file mode 100644 index 0000000..fcca8c1 Binary files /dev/null and b/experiment/simulation/EE6/src/images/method_2_cable_yellow.png differ diff --git a/experiment/simulation/EE6/src/images/new/btn_1.png b/experiment/simulation/EE6/src/images/new/btn_1.png new file mode 100644 index 0000000..427b2ff Binary files /dev/null and b/experiment/simulation/EE6/src/images/new/btn_1.png differ diff --git a/experiment/simulation/EE6/src/images/new/btn_2.png b/experiment/simulation/EE6/src/images/new/btn_2.png new file mode 100644 index 0000000..fa82db1 Binary files /dev/null and b/experiment/simulation/EE6/src/images/new/btn_2.png differ diff --git a/experiment/simulation/EE6/src/images/new/btn_click.png b/experiment/simulation/EE6/src/images/new/btn_click.png new file mode 100644 index 0000000..21dabb4 Binary files /dev/null and b/experiment/simulation/EE6/src/images/new/btn_click.png differ diff --git a/experiment/simulation/EE6/src/images/new/circle.png b/experiment/simulation/EE6/src/images/new/circle.png new file mode 100644 index 0000000..b6ca4fa Binary files /dev/null and b/experiment/simulation/EE6/src/images/new/circle.png differ diff --git a/experiment/simulation/EE6/src/images/new/frame_1.png b/experiment/simulation/EE6/src/images/new/frame_1.png new file mode 100644 index 0000000..710e8a1 Binary files /dev/null and b/experiment/simulation/EE6/src/images/new/frame_1.png differ diff --git a/experiment/simulation/EE6/src/images/new/frame_2.png b/experiment/simulation/EE6/src/images/new/frame_2.png new file mode 100644 index 0000000..0c7c0ad Binary files /dev/null and b/experiment/simulation/EE6/src/images/new/frame_2.png differ diff --git a/experiment/simulation/EE6/src/images/new/frame_3.png b/experiment/simulation/EE6/src/images/new/frame_3.png new file mode 100644 index 0000000..c5f7bfa Binary files /dev/null and b/experiment/simulation/EE6/src/images/new/frame_3.png differ diff --git a/experiment/simulation/EE6/src/images/new/menu_page.png b/experiment/simulation/EE6/src/images/new/menu_page.png new file mode 100644 index 0000000..f879ef0 Binary files /dev/null and b/experiment/simulation/EE6/src/images/new/menu_page.png differ diff --git a/experiment/simulation/EE6/src/images/new/val_vgs.png b/experiment/simulation/EE6/src/images/new/val_vgs.png new file mode 100644 index 0000000..1e35206 Binary files /dev/null and b/experiment/simulation/EE6/src/images/new/val_vgs.png differ diff --git a/experiment/simulation/EE6/src/images/new/val_vin.png b/experiment/simulation/EE6/src/images/new/val_vin.png new file mode 100644 index 0000000..f48093c Binary files /dev/null and b/experiment/simulation/EE6/src/images/new/val_vin.png differ diff --git a/experiment/simulation/EE6/src/images/niddle.png b/experiment/simulation/EE6/src/images/niddle.png new file mode 100644 index 0000000..ee0612b Binary files /dev/null and b/experiment/simulation/EE6/src/images/niddle.png differ diff --git a/experiment/simulation/EE6/src/images/part1_circuit.png b/experiment/simulation/EE6/src/images/part1_circuit.png new file mode 100644 index 0000000..13ebad3 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part1_circuit.png differ diff --git a/experiment/simulation/EE6/src/images/part1_circuit_ new.png b/experiment/simulation/EE6/src/images/part1_circuit_ new.png new file mode 100644 index 0000000..9c61499 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part1_circuit_ new.png differ diff --git a/experiment/simulation/EE6/src/images/part1_component_capacitor.png b/experiment/simulation/EE6/src/images/part1_component_capacitor.png new file mode 100644 index 0000000..499f8e4 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part1_component_capacitor.png differ diff --git a/experiment/simulation/EE6/src/images/part1_component_diode.png b/experiment/simulation/EE6/src/images/part1_component_diode.png new file mode 100644 index 0000000..e0cda66 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part1_component_diode.png differ diff --git a/experiment/simulation/EE6/src/images/part1_component_inductor.png b/experiment/simulation/EE6/src/images/part1_component_inductor.png new file mode 100644 index 0000000..3d2d353 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part1_component_inductor.png differ diff --git a/experiment/simulation/EE6/src/images/part1_component_mosfet.png b/experiment/simulation/EE6/src/images/part1_component_mosfet.png new file mode 100644 index 0000000..38a55b7 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part1_component_mosfet.png differ diff --git a/experiment/simulation/EE6/src/images/part1_component_resistance.png b/experiment/simulation/EE6/src/images/part1_component_resistance.png new file mode 100644 index 0000000..6ac2f0f Binary files /dev/null and b/experiment/simulation/EE6/src/images/part1_component_resistance.png differ diff --git a/experiment/simulation/EE6/src/images/part1_component_voltage.png b/experiment/simulation/EE6/src/images/part1_component_voltage.png new file mode 100644 index 0000000..010b1c9 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part1_component_voltage.png differ diff --git a/experiment/simulation/EE6/src/images/part1_crrct_circuit.png b/experiment/simulation/EE6/src/images/part1_crrct_circuit.png new file mode 100644 index 0000000..5322909 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part1_crrct_circuit.png differ diff --git a/experiment/simulation/EE6/src/images/part1_crrct_text.png b/experiment/simulation/EE6/src/images/part1_crrct_text.png new file mode 100644 index 0000000..b4c5049 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part1_crrct_text.png differ diff --git a/experiment/simulation/EE6/src/images/part1_incrrct_text.png b/experiment/simulation/EE6/src/images/part1_incrrct_text.png new file mode 100644 index 0000000..ac12e2c Binary files /dev/null and b/experiment/simulation/EE6/src/images/part1_incrrct_text.png differ diff --git a/experiment/simulation/EE6/src/images/part4_table_graph.png b/experiment/simulation/EE6/src/images/part4_table_graph.png new file mode 100644 index 0000000..17f73b9 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part4_table_graph.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_1_cable_a2.png b/experiment/simulation/EE6/src/images/part_1_1_cable_a2.png new file mode 100644 index 0000000..163a93c Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_1_cable_a2.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_1_cable_n2.png b/experiment/simulation/EE6/src/images/part_1_1_cable_n2.png new file mode 100644 index 0000000..35416b0 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_1_cable_n2.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_1_cable_p1.png b/experiment/simulation/EE6/src/images/part_1_1_cable_p1.png new file mode 100644 index 0000000..d8a2031 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_1_cable_p1.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_1_cable_p2.png b/experiment/simulation/EE6/src/images/part_1_1_cable_p2.png new file mode 100644 index 0000000..bac9408 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_1_cable_p2.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_1_cable_r2.png b/experiment/simulation/EE6/src/images/part_1_1_cable_r2.png new file mode 100644 index 0000000..3c52cf1 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_1_cable_r2.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_1_cable_s.png b/experiment/simulation/EE6/src/images/part_1_1_cable_s.png new file mode 100644 index 0000000..52954de Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_1_cable_s.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_1_cable_v1.png b/experiment/simulation/EE6/src/images/part_1_1_cable_v1.png new file mode 100644 index 0000000..7073894 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_1_cable_v1.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_1_cable_v2.png b/experiment/simulation/EE6/src/images/part_1_1_cable_v2.png new file mode 100644 index 0000000..b96745b Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_1_cable_v2.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_1_calculations.png b/experiment/simulation/EE6/src/images/part_1_1_calculations.png new file mode 100644 index 0000000..3b6b98b Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_1_calculations.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_2_cable_a1.png b/experiment/simulation/EE6/src/images/part_1_2_cable_a1.png new file mode 100644 index 0000000..5f06e85 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_2_cable_a1.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_2_cable_cp.png b/experiment/simulation/EE6/src/images/part_1_2_cable_cp.png new file mode 100644 index 0000000..3a2e2cb Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_2_cable_cp.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_2_cable_dvp.png b/experiment/simulation/EE6/src/images/part_1_2_cable_dvp.png new file mode 100644 index 0000000..b9f9bad Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_2_cable_dvp.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_2_cable_n2.png b/experiment/simulation/EE6/src/images/part_1_2_cable_n2.png new file mode 100644 index 0000000..a25ba69 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_2_cable_n2.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_2_cable_p1.png b/experiment/simulation/EE6/src/images/part_1_2_cable_p1.png new file mode 100644 index 0000000..dc90d3c Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_2_cable_p1.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_2_cable_p2.png b/experiment/simulation/EE6/src/images/part_1_2_cable_p2.png new file mode 100644 index 0000000..0d71b32 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_2_cable_p2.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_2_cable_r1.png b/experiment/simulation/EE6/src/images/part_1_2_cable_r1.png new file mode 100644 index 0000000..0e580c4 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_2_cable_r1.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_2_cable_s.png b/experiment/simulation/EE6/src/images/part_1_2_cable_s.png new file mode 100644 index 0000000..9d42133 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_2_cable_s.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_2_cable_v1.png b/experiment/simulation/EE6/src/images/part_1_2_cable_v1.png new file mode 100644 index 0000000..5eee81c Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_2_cable_v1.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_2_cable_v2.png b/experiment/simulation/EE6/src/images/part_1_2_cable_v2.png new file mode 100644 index 0000000..e2d0f7f Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_2_cable_v2.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_2_calculations.png b/experiment/simulation/EE6/src/images/part_1_2_calculations.png new file mode 100644 index 0000000..f72f2b5 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_2_calculations.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_components_1.png b/experiment/simulation/EE6/src/images/part_1_components_1.png new file mode 100644 index 0000000..b9321c3 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_components_1.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_components_2.png b/experiment/simulation/EE6/src/images/part_1_components_2.png new file mode 100644 index 0000000..a798154 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_components_2.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_incomplete_connection.png b/experiment/simulation/EE6/src/images/part_1_incomplete_connection.png new file mode 100644 index 0000000..168284a Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_incomplete_connection.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_instructions_box.png b/experiment/simulation/EE6/src/images/part_1_instructions_box.png new file mode 100644 index 0000000..7475c89 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_instructions_box.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_procedure_box.png b/experiment/simulation/EE6/src/images/part_1_procedure_box.png new file mode 100644 index 0000000..49e5e3c Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_procedure_box.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_procedure_box_2.png b/experiment/simulation/EE6/src/images/part_1_procedure_box_2.png new file mode 100644 index 0000000..529d6ca Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_procedure_box_2.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_select_option_1_1.png b/experiment/simulation/EE6/src/images/part_1_select_option_1_1.png new file mode 100644 index 0000000..9547f34 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_select_option_1_1.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_select_option_1_2.png b/experiment/simulation/EE6/src/images/part_1_select_option_1_2.png new file mode 100644 index 0000000..7b9c5ad Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_select_option_1_2.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_select_option_2.png b/experiment/simulation/EE6/src/images/part_1_select_option_2.png new file mode 100644 index 0000000..ea2d340 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_select_option_2.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_select_option_3.png b/experiment/simulation/EE6/src/images/part_1_select_option_3.png new file mode 100644 index 0000000..284755c Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_select_option_3.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_select_option_full.png b/experiment/simulation/EE6/src/images/part_1_select_option_full.png new file mode 100644 index 0000000..c69f8c3 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_select_option_full.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_slide_1.png b/experiment/simulation/EE6/src/images/part_1_slide_1.png new file mode 100644 index 0000000..75c48bf Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_slide_1.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_slide_2.png b/experiment/simulation/EE6/src/images/part_1_slide_2.png new file mode 100644 index 0000000..09312e2 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_slide_2.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_slide_3.png b/experiment/simulation/EE6/src/images/part_1_slide_3.png new file mode 100644 index 0000000..9500a5a Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_slide_3.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_slide_3_compo_1_off.png b/experiment/simulation/EE6/src/images/part_1_slide_3_compo_1_off.png new file mode 100644 index 0000000..2720f35 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_slide_3_compo_1_off.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_slide_3_compo_1_on.png b/experiment/simulation/EE6/src/images/part_1_slide_3_compo_1_on.png new file mode 100644 index 0000000..58021b9 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_slide_3_compo_1_on.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_slide_3_compo_1_text.png b/experiment/simulation/EE6/src/images/part_1_slide_3_compo_1_text.png new file mode 100644 index 0000000..214e894 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_slide_3_compo_1_text.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_slide_3_compo_2_off.png b/experiment/simulation/EE6/src/images/part_1_slide_3_compo_2_off.png new file mode 100644 index 0000000..6d4ae66 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_slide_3_compo_2_off.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_slide_3_compo_2_on.png b/experiment/simulation/EE6/src/images/part_1_slide_3_compo_2_on.png new file mode 100644 index 0000000..4b2c012 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_slide_3_compo_2_on.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_slide_3_compo_2_text.png b/experiment/simulation/EE6/src/images/part_1_slide_3_compo_2_text.png new file mode 100644 index 0000000..4ae8cd1 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_slide_3_compo_2_text.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_slide_4.png b/experiment/simulation/EE6/src/images/part_1_slide_4.png new file mode 100644 index 0000000..e858a54 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_slide_4.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_text_for_crrct.png b/experiment/simulation/EE6/src/images/part_1_text_for_crrct.png new file mode 100644 index 0000000..5c48952 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_text_for_crrct.png differ diff --git a/experiment/simulation/EE6/src/images/part_1_text_for_wrong.png b/experiment/simulation/EE6/src/images/part_1_text_for_wrong.png new file mode 100644 index 0000000..5731168 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_1_text_for_wrong.png differ diff --git a/experiment/simulation/EE6/src/images/part_2_calculation_components.png b/experiment/simulation/EE6/src/images/part_2_calculation_components.png new file mode 100644 index 0000000..9b69e8a Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_2_calculation_components.png differ diff --git a/experiment/simulation/EE6/src/images/part_2_circuit.png b/experiment/simulation/EE6/src/images/part_2_circuit.png new file mode 100644 index 0000000..22dab95 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_2_circuit.png differ diff --git a/experiment/simulation/EE6/src/images/part_2_conncection_cable_a2.png b/experiment/simulation/EE6/src/images/part_2_conncection_cable_a2.png new file mode 100644 index 0000000..0daaeaf Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_2_conncection_cable_a2.png differ diff --git a/experiment/simulation/EE6/src/images/part_2_conncection_cable_n2.png b/experiment/simulation/EE6/src/images/part_2_conncection_cable_n2.png new file mode 100644 index 0000000..2a2b942 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_2_conncection_cable_n2.png differ diff --git a/experiment/simulation/EE6/src/images/part_2_conncection_cable_p1.png b/experiment/simulation/EE6/src/images/part_2_conncection_cable_p1.png new file mode 100644 index 0000000..7abde0a Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_2_conncection_cable_p1.png differ diff --git a/experiment/simulation/EE6/src/images/part_2_conncection_cable_p2.png b/experiment/simulation/EE6/src/images/part_2_conncection_cable_p2.png new file mode 100644 index 0000000..0167ddf Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_2_conncection_cable_p2.png differ diff --git a/experiment/simulation/EE6/src/images/part_2_conncection_cable_r2.png b/experiment/simulation/EE6/src/images/part_2_conncection_cable_r2.png new file mode 100644 index 0000000..5340155 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_2_conncection_cable_r2.png differ diff --git a/experiment/simulation/EE6/src/images/part_2_conncection_cable_s.png b/experiment/simulation/EE6/src/images/part_2_conncection_cable_s.png new file mode 100644 index 0000000..f43f54e Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_2_conncection_cable_s.png differ diff --git a/experiment/simulation/EE6/src/images/part_2_conncection_cable_v1.png b/experiment/simulation/EE6/src/images/part_2_conncection_cable_v1.png new file mode 100644 index 0000000..26f9d6d Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_2_conncection_cable_v1.png differ diff --git a/experiment/simulation/EE6/src/images/part_2_conncection_cable_v2.png b/experiment/simulation/EE6/src/images/part_2_conncection_cable_v2.png new file mode 100644 index 0000000..adb945f Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_2_conncection_cable_v2.png differ diff --git a/experiment/simulation/EE6/src/images/part_2_conncection_cable_vg1.png b/experiment/simulation/EE6/src/images/part_2_conncection_cable_vg1.png new file mode 100644 index 0000000..94675f8 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_2_conncection_cable_vg1.png differ diff --git a/experiment/simulation/EE6/src/images/part_2_conncection_cable_vg2.png b/experiment/simulation/EE6/src/images/part_2_conncection_cable_vg2.png new file mode 100644 index 0000000..ebfa0a8 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_2_conncection_cable_vg2.png differ diff --git a/experiment/simulation/EE6/src/images/part_2_conncection_supply_1_green_button.png b/experiment/simulation/EE6/src/images/part_2_conncection_supply_1_green_button.png new file mode 100644 index 0000000..b7e9b04 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_2_conncection_supply_1_green_button.png differ diff --git a/experiment/simulation/EE6/src/images/part_2_conncection_supply_1_red_button.png b/experiment/simulation/EE6/src/images/part_2_conncection_supply_1_red_button.png new file mode 100644 index 0000000..7667726 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_2_conncection_supply_1_red_button.png differ diff --git a/experiment/simulation/EE6/src/images/part_2_conncection_supply_2_green_button.png b/experiment/simulation/EE6/src/images/part_2_conncection_supply_2_green_button.png new file mode 100644 index 0000000..607ee36 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_2_conncection_supply_2_green_button.png differ diff --git a/experiment/simulation/EE6/src/images/part_2_conncection_supply_2_red_button.png b/experiment/simulation/EE6/src/images/part_2_conncection_supply_2_red_button.png new file mode 100644 index 0000000..7667726 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_2_conncection_supply_2_red_button.png differ diff --git a/experiment/simulation/EE6/src/images/part_2_connections_components.png b/experiment/simulation/EE6/src/images/part_2_connections_components.png new file mode 100644 index 0000000..b6436e3 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_2_connections_components.png differ diff --git a/experiment/simulation/EE6/src/images/part_2_graph_1.png b/experiment/simulation/EE6/src/images/part_2_graph_1.png new file mode 100644 index 0000000..182163e Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_2_graph_1.png differ diff --git a/experiment/simulation/EE6/src/images/part_2_graph_2.png b/experiment/simulation/EE6/src/images/part_2_graph_2.png new file mode 100644 index 0000000..1ee0caa Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_2_graph_2.png differ diff --git a/experiment/simulation/EE6/src/images/part_2_graph_3.png b/experiment/simulation/EE6/src/images/part_2_graph_3.png new file mode 100644 index 0000000..845d580 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_2_graph_3.png differ diff --git a/experiment/simulation/EE6/src/images/part_2_graph_empty.png b/experiment/simulation/EE6/src/images/part_2_graph_empty.png new file mode 100644 index 0000000..a5f0d6c Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_2_graph_empty.png differ diff --git a/experiment/simulation/EE6/src/images/part_3_components.png b/experiment/simulation/EE6/src/images/part_3_components.png new file mode 100644 index 0000000..f1f098d Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_3_components.png differ diff --git a/experiment/simulation/EE6/src/images/part_3_graph.png b/experiment/simulation/EE6/src/images/part_3_graph.png new file mode 100644 index 0000000..1409ef6 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_3_graph.png differ diff --git a/experiment/simulation/EE6/src/images/part_3_graph_arrow.png b/experiment/simulation/EE6/src/images/part_3_graph_arrow.png new file mode 100644 index 0000000..d56101d Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_3_graph_arrow.png differ diff --git a/experiment/simulation/EE6/src/images/part_3_off_button.png b/experiment/simulation/EE6/src/images/part_3_off_button.png new file mode 100644 index 0000000..b84e493 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_3_off_button.png differ diff --git a/experiment/simulation/EE6/src/images/part_3_option_1.png b/experiment/simulation/EE6/src/images/part_3_option_1.png new file mode 100644 index 0000000..99191c8 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_3_option_1.png differ diff --git a/experiment/simulation/EE6/src/images/part_3_option_2.png b/experiment/simulation/EE6/src/images/part_3_option_2.png new file mode 100644 index 0000000..51034f1 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_3_option_2.png differ diff --git a/experiment/simulation/EE6/src/images/part_3_option_3.png b/experiment/simulation/EE6/src/images/part_3_option_3.png new file mode 100644 index 0000000..8812c14 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_3_option_3.png differ diff --git a/experiment/simulation/EE6/src/images/part_3_option_4.png b/experiment/simulation/EE6/src/images/part_3_option_4.png new file mode 100644 index 0000000..a057dc6 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_3_option_4.png differ diff --git a/experiment/simulation/EE6/src/images/part_3_option_4_graph.png b/experiment/simulation/EE6/src/images/part_3_option_4_graph.png new file mode 100644 index 0000000..d9feb3c Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_3_option_4_graph.png differ diff --git a/experiment/simulation/EE6/src/images/part_3_option_5.png b/experiment/simulation/EE6/src/images/part_3_option_5.png new file mode 100644 index 0000000..864c1d8 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_3_option_5.png differ diff --git a/experiment/simulation/EE6/src/images/part_3_option_select.png b/experiment/simulation/EE6/src/images/part_3_option_select.png new file mode 100644 index 0000000..d9feb3c Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_3_option_select.png differ diff --git a/experiment/simulation/EE6/src/images/part_3_option_select_dummy.png b/experiment/simulation/EE6/src/images/part_3_option_select_dummy.png new file mode 100644 index 0000000..e661a61 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_3_option_select_dummy.png differ diff --git a/experiment/simulation/EE6/src/images/part_3_table_1.png b/experiment/simulation/EE6/src/images/part_3_table_1.png new file mode 100644 index 0000000..62fa932 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_3_table_1.png differ diff --git a/experiment/simulation/EE6/src/images/part_3_table_2.png b/experiment/simulation/EE6/src/images/part_3_table_2.png new file mode 100644 index 0000000..946562c Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_3_table_2.png differ diff --git a/experiment/simulation/EE6/src/images/part_3_table_3.png b/experiment/simulation/EE6/src/images/part_3_table_3.png new file mode 100644 index 0000000..fcd4a72 Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_3_table_3.png differ diff --git a/experiment/simulation/EE6/src/images/part_3_text.png b/experiment/simulation/EE6/src/images/part_3_text.png new file mode 100644 index 0000000..4b7ea1e Binary files /dev/null and b/experiment/simulation/EE6/src/images/part_3_text.png differ diff --git a/experiment/simulation/EE6/src/images/photoscape/exp-4 part1.psxprj b/experiment/simulation/EE6/src/images/photoscape/exp-4 part1.psxprj new file mode 100644 index 0000000..e11112d Binary files /dev/null and b/experiment/simulation/EE6/src/images/photoscape/exp-4 part1.psxprj differ diff --git a/experiment/simulation/EE6/src/images/photoscape/exp-4 part1_cmplt.psxprj b/experiment/simulation/EE6/src/images/photoscape/exp-4 part1_cmplt.psxprj new file mode 100644 index 0000000..b69baf2 Binary files /dev/null and b/experiment/simulation/EE6/src/images/photoscape/exp-4 part1_cmplt.psxprj differ diff --git a/experiment/simulation/EE6/src/images/photoscape/part1_2.psxprj b/experiment/simulation/EE6/src/images/photoscape/part1_2.psxprj new file mode 100644 index 0000000..777ae96 Binary files /dev/null and b/experiment/simulation/EE6/src/images/photoscape/part1_2.psxprj differ diff --git a/experiment/simulation/EE6/src/images/photoscape/part_2_calculation_components.psxprj b/experiment/simulation/EE6/src/images/photoscape/part_2_calculation_components.psxprj new file mode 100644 index 0000000..c8a3634 Binary files /dev/null and b/experiment/simulation/EE6/src/images/photoscape/part_2_calculation_components.psxprj differ diff --git a/experiment/simulation/EE6/src/images/photoscape/part_2_connections.psxprj b/experiment/simulation/EE6/src/images/photoscape/part_2_connections.psxprj new file mode 100644 index 0000000..050c00a Binary files /dev/null and b/experiment/simulation/EE6/src/images/photoscape/part_2_connections.psxprj differ diff --git a/experiment/simulation/EE6/src/images/popup_imgs/nomenclature.png b/experiment/simulation/EE6/src/images/popup_imgs/nomenclature.png new file mode 100644 index 0000000..8306ca7 Binary files /dev/null and b/experiment/simulation/EE6/src/images/popup_imgs/nomenclature.png differ diff --git a/experiment/simulation/EE6/src/images/record_btn.png b/experiment/simulation/EE6/src/images/record_btn.png new file mode 100644 index 0000000..4d621f0 Binary files /dev/null and b/experiment/simulation/EE6/src/images/record_btn.png differ diff --git a/experiment/simulation/EE6/src/images/right_tick.png b/experiment/simulation/EE6/src/images/right_tick.png new file mode 100644 index 0000000..9d81e00 Binary files /dev/null and b/experiment/simulation/EE6/src/images/right_tick.png differ diff --git a/experiment/simulation/EE6/src/images/run_btn.png b/experiment/simulation/EE6/src/images/run_btn.png new file mode 100644 index 0000000..5a52c7a Binary files /dev/null and b/experiment/simulation/EE6/src/images/run_btn.png differ diff --git a/experiment/simulation/EE6/src/images/slider_thumb.png b/experiment/simulation/EE6/src/images/slider_thumb.png new file mode 100644 index 0000000..25cf97b Binary files /dev/null and b/experiment/simulation/EE6/src/images/slider_thumb.png differ diff --git a/experiment/simulation/EE6/src/images/symbol_C.png b/experiment/simulation/EE6/src/images/symbol_C.png new file mode 100644 index 0000000..1d7b61d Binary files /dev/null and b/experiment/simulation/EE6/src/images/symbol_C.png differ diff --git a/experiment/simulation/EE6/src/images/symbol_D.png b/experiment/simulation/EE6/src/images/symbol_D.png new file mode 100644 index 0000000..1a487e6 Binary files /dev/null and b/experiment/simulation/EE6/src/images/symbol_D.png differ diff --git a/experiment/simulation/EE6/src/images/symbol_L.png b/experiment/simulation/EE6/src/images/symbol_L.png new file mode 100644 index 0000000..42554b8 Binary files /dev/null and b/experiment/simulation/EE6/src/images/symbol_L.png differ diff --git a/experiment/simulation/EE6/src/images/symbol_R.png b/experiment/simulation/EE6/src/images/symbol_R.png new file mode 100644 index 0000000..58ed73f Binary files /dev/null and b/experiment/simulation/EE6/src/images/symbol_R.png differ diff --git a/experiment/simulation/EE6/src/images/symbol_S.png b/experiment/simulation/EE6/src/images/symbol_S.png new file mode 100644 index 0000000..b2a72fa Binary files /dev/null and b/experiment/simulation/EE6/src/images/symbol_S.png differ diff --git a/experiment/simulation/EE6/src/images/symbol_vIn.png b/experiment/simulation/EE6/src/images/symbol_vIn.png new file mode 100644 index 0000000..267db56 Binary files /dev/null and b/experiment/simulation/EE6/src/images/symbol_vIn.png differ diff --git a/experiment/simulation/EE6/src/images/temp/box_img.png b/experiment/simulation/EE6/src/images/temp/box_img.png new file mode 100644 index 0000000..4fa944a Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/box_img.png differ diff --git a/experiment/simulation/EE6/src/images/temp/changed/part_2_graph_1.png b/experiment/simulation/EE6/src/images/temp/changed/part_2_graph_1.png new file mode 100644 index 0000000..fd17b41 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/changed/part_2_graph_1.png differ diff --git a/experiment/simulation/EE6/src/images/temp/changed/part_2_graph_2.png b/experiment/simulation/EE6/src/images/temp/changed/part_2_graph_2.png new file mode 100644 index 0000000..eb5ab51 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/changed/part_2_graph_2.png differ diff --git a/experiment/simulation/EE6/src/images/temp/changed/part_2_graph_3.png b/experiment/simulation/EE6/src/images/temp/changed/part_2_graph_3.png new file mode 100644 index 0000000..b460f09 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/changed/part_2_graph_3.png differ diff --git a/experiment/simulation/EE6/src/images/temp/changed/part_2_graph_empty.png b/experiment/simulation/EE6/src/images/temp/changed/part_2_graph_empty.png new file mode 100644 index 0000000..279a753 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/changed/part_2_graph_empty.png differ diff --git a/experiment/simulation/EE6/src/images/temp/circuit_full_2.png b/experiment/simulation/EE6/src/images/temp/circuit_full_2.png new file mode 100644 index 0000000..2cc1ed6 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/circuit_full_2.png differ diff --git a/experiment/simulation/EE6/src/images/temp/circuit_full_3.png b/experiment/simulation/EE6/src/images/temp/circuit_full_3.png new file mode 100644 index 0000000..91b7394 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/circuit_full_3.png differ diff --git a/experiment/simulation/EE6/src/images/temp/component_battery.png b/experiment/simulation/EE6/src/images/temp/component_battery.png new file mode 100644 index 0000000..4d20651 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/component_battery.png differ diff --git a/experiment/simulation/EE6/src/images/temp/component_capacitor.png b/experiment/simulation/EE6/src/images/temp/component_capacitor.png new file mode 100644 index 0000000..afdf5f9 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/component_capacitor.png differ diff --git a/experiment/simulation/EE6/src/images/temp/component_diode.png b/experiment/simulation/EE6/src/images/temp/component_diode.png new file mode 100644 index 0000000..856b82d Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/component_diode.png differ diff --git a/experiment/simulation/EE6/src/images/temp/component_inductor.png b/experiment/simulation/EE6/src/images/temp/component_inductor.png new file mode 100644 index 0000000..703bd4a Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/component_inductor.png differ diff --git a/experiment/simulation/EE6/src/images/temp/component_mosfet.png b/experiment/simulation/EE6/src/images/temp/component_mosfet.png new file mode 100644 index 0000000..920b733 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/component_mosfet.png differ diff --git a/experiment/simulation/EE6/src/images/temp/component_register.png b/experiment/simulation/EE6/src/images/temp/component_register.png new file mode 100644 index 0000000..abfc8c2 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/component_register.png differ diff --git a/experiment/simulation/EE6/src/images/temp/full_circuit.png b/experiment/simulation/EE6/src/images/temp/full_circuit.png new file mode 100644 index 0000000..82a7322 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/full_circuit.png differ diff --git a/experiment/simulation/EE6/src/images/temp/full_circuit2.png b/experiment/simulation/EE6/src/images/temp/full_circuit2.png new file mode 100644 index 0000000..e546fb1 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/full_circuit2.png differ diff --git a/experiment/simulation/EE6/src/images/temp/graph2_arrow.png b/experiment/simulation/EE6/src/images/temp/graph2_arrow.png new file mode 100644 index 0000000..841a8b7 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/graph2_arrow.png differ diff --git a/experiment/simulation/EE6/src/images/temp/part_2_circuit.png b/experiment/simulation/EE6/src/images/temp/part_2_circuit.png new file mode 100644 index 0000000..6095e94 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/part_2_circuit.png differ diff --git a/experiment/simulation/EE6/src/images/temp/part_2_graph_1.png b/experiment/simulation/EE6/src/images/temp/part_2_graph_1.png new file mode 100644 index 0000000..c9cc17a Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/part_2_graph_1.png differ diff --git a/experiment/simulation/EE6/src/images/temp/part_2_graph_2.png b/experiment/simulation/EE6/src/images/temp/part_2_graph_2.png new file mode 100644 index 0000000..1e83ca9 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/part_2_graph_2.png differ diff --git a/experiment/simulation/EE6/src/images/temp/part_2_graph_3.png b/experiment/simulation/EE6/src/images/temp/part_2_graph_3.png new file mode 100644 index 0000000..a4ec0bf Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/part_2_graph_3.png differ diff --git a/experiment/simulation/EE6/src/images/temp/part_2_graph_empty.png b/experiment/simulation/EE6/src/images/temp/part_2_graph_empty.png new file mode 100644 index 0000000..1540f5b Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/part_2_graph_empty.png differ diff --git a/experiment/simulation/EE6/src/images/temp/part_3_graph_arrow.png b/experiment/simulation/EE6/src/images/temp/part_3_graph_arrow.png new file mode 100644 index 0000000..d56101d Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/part_3_graph_arrow.png differ diff --git a/experiment/simulation/EE6/src/images/temp/part_3_option_1.png b/experiment/simulation/EE6/src/images/temp/part_3_option_1.png new file mode 100644 index 0000000..c5377ac Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/part_3_option_1.png differ diff --git a/experiment/simulation/EE6/src/images/temp/part_3_option_2.png b/experiment/simulation/EE6/src/images/temp/part_3_option_2.png new file mode 100644 index 0000000..506a3d7 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/part_3_option_2.png differ diff --git a/experiment/simulation/EE6/src/images/temp/part_3_option_3.png b/experiment/simulation/EE6/src/images/temp/part_3_option_3.png new file mode 100644 index 0000000..7477cf2 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/part_3_option_3.png differ diff --git a/experiment/simulation/EE6/src/images/temp/part_3_option_4.png b/experiment/simulation/EE6/src/images/temp/part_3_option_4.png new file mode 100644 index 0000000..d196120 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/part_3_option_4.png differ diff --git a/experiment/simulation/EE6/src/images/temp/part_3_option_4_graph.png b/experiment/simulation/EE6/src/images/temp/part_3_option_4_graph.png new file mode 100644 index 0000000..1a9c6b4 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/part_3_option_4_graph.png differ diff --git a/experiment/simulation/EE6/src/images/temp/record_btn.png b/experiment/simulation/EE6/src/images/temp/record_btn.png new file mode 100644 index 0000000..4d621f0 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/record_btn.png differ diff --git a/experiment/simulation/EE6/src/images/temp/right_tick.png b/experiment/simulation/EE6/src/images/temp/right_tick.png new file mode 100644 index 0000000..9d81e00 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/right_tick.png differ diff --git a/experiment/simulation/EE6/src/images/temp/run_btn.png b/experiment/simulation/EE6/src/images/temp/run_btn.png new file mode 100644 index 0000000..5a52c7a Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/run_btn.png differ diff --git a/experiment/simulation/EE6/src/images/temp/temp23/formulas_component_stress.png b/experiment/simulation/EE6/src/images/temp/temp23/formulas_component_stress.png new file mode 100644 index 0000000..5a1d148 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/temp23/formulas_component_stress.png differ diff --git a/experiment/simulation/EE6/src/images/temp/temp23/formulas_efficiency.png b/experiment/simulation/EE6/src/images/temp/temp23/formulas_efficiency.png new file mode 100644 index 0000000..c776c78 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/temp23/formulas_efficiency.png differ diff --git a/experiment/simulation/EE6/src/images/temp/temp23/formulas_ideal.png b/experiment/simulation/EE6/src/images/temp/temp23/formulas_ideal.png new file mode 100644 index 0000000..adbd8bc Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/temp23/formulas_ideal.png differ diff --git a/experiment/simulation/EE6/src/images/temp/temp23/formulas_nomenclautre.png b/experiment/simulation/EE6/src/images/temp/temp23/formulas_nomenclautre.png new file mode 100644 index 0000000..affb964 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/temp23/formulas_nomenclautre.png differ diff --git a/experiment/simulation/EE6/src/images/temp/temp23/formulas_non_ideal.png b/experiment/simulation/EE6/src/images/temp/temp23/formulas_non_ideal.png new file mode 100644 index 0000000..a984e3d Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/temp23/formulas_non_ideal.png differ diff --git a/experiment/simulation/EE6/src/images/temp/temp23/formulas_procedure.png b/experiment/simulation/EE6/src/images/temp/temp23/formulas_procedure.png new file mode 100644 index 0000000..62e92eb Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/temp23/formulas_procedure.png differ diff --git a/experiment/simulation/EE6/src/images/temp/temp23/formulas_universal.png b/experiment/simulation/EE6/src/images/temp/temp23/formulas_universal.png new file mode 100644 index 0000000..40c4aec Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/temp23/formulas_universal.png differ diff --git a/experiment/simulation/EE6/src/images/temp/temp23/graph2_arrow.png b/experiment/simulation/EE6/src/images/temp/temp23/graph2_arrow.png new file mode 100644 index 0000000..841a8b7 Binary files /dev/null and b/experiment/simulation/EE6/src/images/temp/temp23/graph2_arrow.png differ diff --git a/experiment/simulation/EE6/src/images/template_imgs/arrow.png b/experiment/simulation/EE6/src/images/template_imgs/arrow.png new file mode 100644 index 0000000..6b13356 Binary files /dev/null and b/experiment/simulation/EE6/src/images/template_imgs/arrow.png differ diff --git a/experiment/simulation/EE6/src/images/template_imgs/blinkArrow.webp b/experiment/simulation/EE6/src/images/template_imgs/blinkArrow.webp new file mode 100644 index 0000000..db974c1 Binary files /dev/null and b/experiment/simulation/EE6/src/images/template_imgs/blinkArrow.webp differ diff --git a/experiment/simulation/EE6/src/images/template_imgs/blinkArrowRed.png b/experiment/simulation/EE6/src/images/template_imgs/blinkArrowRed.png new file mode 100644 index 0000000..afb6427 Binary files /dev/null and b/experiment/simulation/EE6/src/images/template_imgs/blinkArrowRed.png differ diff --git a/experiment/simulation/EE6/src/images/template_imgs/iit-delhi-logo.png b/experiment/simulation/EE6/src/images/template_imgs/iit-delhi-logo.png new file mode 100644 index 0000000..0806e3e Binary files /dev/null and b/experiment/simulation/EE6/src/images/template_imgs/iit-delhi-logo.png differ diff --git a/experiment/simulation/EE6/src/images/template_imgs/laerrow.png b/experiment/simulation/EE6/src/images/template_imgs/laerrow.png new file mode 100644 index 0000000..9bd9bea Binary files /dev/null and b/experiment/simulation/EE6/src/images/template_imgs/laerrow.png differ diff --git a/experiment/simulation/EE6/src/images/template_imgs/laerrow2.png b/experiment/simulation/EE6/src/images/template_imgs/laerrow2.png new file mode 100644 index 0000000..d69fb87 Binary files /dev/null and b/experiment/simulation/EE6/src/images/template_imgs/laerrow2.png differ diff --git a/experiment/simulation/EE6/src/images/template_imgs/logo.png b/experiment/simulation/EE6/src/images/template_imgs/logo.png new file mode 100644 index 0000000..ec94212 Binary files /dev/null and b/experiment/simulation/EE6/src/images/template_imgs/logo.png differ diff --git a/experiment/simulation/EE6/src/images/template_imgs/man.png b/experiment/simulation/EE6/src/images/template_imgs/man.png new file mode 100644 index 0000000..e2b1673 Binary files /dev/null and b/experiment/simulation/EE6/src/images/template_imgs/man.png differ diff --git a/experiment/simulation/EE6/src/images/template_imgs/measurearrow.png b/experiment/simulation/EE6/src/images/template_imgs/measurearrow.png new file mode 100644 index 0000000..cbd8709 Binary files /dev/null and b/experiment/simulation/EE6/src/images/template_imgs/measurearrow.png differ diff --git a/experiment/simulation/EE6/src/images/template_imgs/measurearrow2.png b/experiment/simulation/EE6/src/images/template_imgs/measurearrow2.png new file mode 100644 index 0000000..cbd8709 Binary files /dev/null and b/experiment/simulation/EE6/src/images/template_imgs/measurearrow2.png differ diff --git a/experiment/simulation/EE6/src/images/template_imgs/prof_image_kn_jha.jpeg b/experiment/simulation/EE6/src/images/template_imgs/prof_image_kn_jha.jpeg new file mode 100644 index 0000000..a4c5860 Binary files /dev/null and b/experiment/simulation/EE6/src/images/template_imgs/prof_image_kn_jha.jpeg differ diff --git a/experiment/simulation/EE6/src/images/template_imgs/redsize.png b/experiment/simulation/EE6/src/images/template_imgs/redsize.png new file mode 100644 index 0000000..f6c8d4b Binary files /dev/null and b/experiment/simulation/EE6/src/images/template_imgs/redsize.png differ diff --git a/experiment/simulation/EE6/src/images/template_imgs/restart_btn.png b/experiment/simulation/EE6/src/images/template_imgs/restart_btn.png new file mode 100644 index 0000000..ed885ad Binary files /dev/null and b/experiment/simulation/EE6/src/images/template_imgs/restart_btn.png differ diff --git a/experiment/simulation/EE6/src/images/template_imgs/speech_off_btn.png b/experiment/simulation/EE6/src/images/template_imgs/speech_off_btn.png new file mode 100644 index 0000000..3605745 Binary files /dev/null and b/experiment/simulation/EE6/src/images/template_imgs/speech_off_btn.png differ diff --git a/experiment/simulation/EE6/src/images/template_imgs/speech_on_btn.png b/experiment/simulation/EE6/src/images/template_imgs/speech_on_btn.png new file mode 100644 index 0000000..de93bb3 Binary files /dev/null and b/experiment/simulation/EE6/src/images/template_imgs/speech_on_btn.png differ diff --git a/experiment/simulation/EE6/src/images/template_imgs/talk_cloud.png b/experiment/simulation/EE6/src/images/template_imgs/talk_cloud.png new file mode 100644 index 0000000..15a36cd Binary files /dev/null and b/experiment/simulation/EE6/src/images/template_imgs/talk_cloud.png differ diff --git a/experiment/simulation/EE6/temp.cpp b/experiment/simulation/EE6/temp.cpp new file mode 100644 index 0000000..e69de29 diff --git a/experiment/simulation/EE6/temp2.txt b/experiment/simulation/EE6/temp2.txt new file mode 100644 index 0000000..3056ce0 --- /dev/null +++ b/experiment/simulation/EE6/temp2.txt @@ -0,0 +1,410 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +btn_begin_experiment:this.allImgsDom[index++], +btn_conclusion:this.allImgsDom[index++], +btn_connection_completed:this.allImgsDom[index++], +btn_make_connection:this.allImgsDom[index++], +btn_plot:this.allImgsDom[index++], +btn_procedure:this.allImgsDom[index++], +component_1_on_text:this.allImgsDom[index++], +component_2_on_text:this.allImgsDom[index++], +part_1_1_cable_a2:this.allImgsDom[index++], +part_1_1_cable_e:this.allImgsDom[index++], +part_1_1_cable_n2:this.allImgsDom[index++], +part_1_1_cable_p1:this.allImgsDom[index++], +part_1_1_cable_p2:this.allImgsDom[index++], +part_1_1_cable_r2:this.allImgsDom[index++], +part_1_1_cable_v1:this.allImgsDom[index++], +part_1_1_cable_v2:this.allImgsDom[index++], +part_1_1_calculations:this.allImgsDom[index++], +part_1_1_components:this.allImgsDom[index++], +part_1_1_conclusion_box:this.allImgsDom[index++], +part_1_1_instruction_box:this.allImgsDom[index++], +part_1_1_nomenclature_box:this.allImgsDom[index++], +part_1_1_procedure_box:this.allImgsDom[index++], +part_1_2_cable_a1:this.allImgsDom[index++], +part_1_2_cable_cp:this.allImgsDom[index++], +part_1_2_cable_dvp:this.allImgsDom[index++], +part_1_2_cable_e:this.allImgsDom[index++], +part_1_2_cable_n2:this.allImgsDom[index++], +part_1_2_cable_p1:this.allImgsDom[index++], +part_1_2_cable_p2:this.allImgsDom[index++], +part_1_2_cable_r2:this.allImgsDom[index++], +part_1_2_cable_v1:this.allImgsDom[index++], +part_1_2_cable_v2:this.allImgsDom[index++], +part_1_2_calculations:this.allImgsDom[index++], +part_1_2_components:this.allImgsDom[index++], +part_1_2_conclusion_box:this.allImgsDom[index++], +part_1_2_instruction_box:this.allImgsDom[index++], +part_1_2_nomenclature_box:this.allImgsDom[index++], +part_1_2_procedure_box:this.allImgsDom[index++], +part_2_cable_a2:this.allImgsDom[index++], +part_2_cable_e:this.allImgsDom[index++], +part_2_cable_n2:this.allImgsDom[index++], +part_2_cable_p1:this.allImgsDom[index++], +part_2_cable_p2:this.allImgsDom[index++], +part_2_cable_r2:this.allImgsDom[index++], +part_2_cable_v1:this.allImgsDom[index++], +part_2_cable_v2:this.allImgsDom[index++], +part_2_cable_vg1:this.allImgsDom[index++], +part_2_cable_vg2:this.allImgsDom[index++], +part_2_calculations:this.allImgsDom[index++], +part_2_components:this.allImgsDom[index++], +part_2_conclusion_box:this.allImgsDom[index++], +part_2_nomenclature_box:this.allImgsDom[index++], +part_2_procedure_box:this.allImgsDom[index++], +select_option_1_1:this.allImgsDom[index++], +select_option_1_2:this.allImgsDom[index++], +select_option_2:this.allImgsDom[index++], +select_option_full:this.allImgsDom[index++], +slider_thumb:this.allImgsDom[index++], + + +btn_begin_experiment : new Dom("btn_begin_experiment"), +btn_conclusion : new Dom("btn_conclusion"), +btn_connection_completed : new Dom("btn_connection_completed"), +btn_make_connection : new Dom("btn_make_connection"), +btn_plot : new Dom("btn_plot"), +btn_procedure : new Dom("btn_procedure"), +component_1_on_text : new Dom("component_1_on_text"), +component_2_on_text : new Dom("component_2_on_text"), +part_1_1_cable_a2 : new Dom("part_1_1_cable_a2"), +part_1_1_cable_e : new Dom("part_1_1_cable_e"), +part_1_1_cable_n2 : new Dom("part_1_1_cable_n2"), +part_1_1_cable_p1 : new Dom("part_1_1_cable_p1"), +part_1_1_cable_p2 : new Dom("part_1_1_cable_p2"), +part_1_1_cable_r2 : new Dom("part_1_1_cable_r2"), +part_1_1_cable_v1 : new Dom("part_1_1_cable_v1"), +part_1_1_cable_v2 : new Dom("part_1_1_cable_v2"), +part_1_1_calculations : new Dom("part_1_1_calculations"), +part_1_1_components : new Dom("part_1_1_components"), +part_1_1_conclusion_box : new Dom("part_1_1_conclusion_box"), +part_1_1_instruction_box : new Dom("part_1_1_instruction_box"), +part_1_1_nomenclature_box : new Dom("part_1_1_nomenclature_box"), +part_1_1_procedure_box : new Dom("part_1_1_procedure_box"), +part_1_2_cable_a1 : new Dom("part_1_2_cable_a1"), +part_1_2_cable_cp : new Dom("part_1_2_cable_cp"), +part_1_2_cable_dvp : new Dom("part_1_2_cable_dvp"), +part_1_2_cable_e : new Dom("part_1_2_cable_e"), +part_1_2_cable_n2 : new Dom("part_1_2_cable_n2"), +part_1_2_cable_p1 : new Dom("part_1_2_cable_p1"), +part_1_2_cable_p2 : new Dom("part_1_2_cable_p2"), +part_1_2_cable_r2 : new Dom("part_1_2_cable_r2"), +part_1_2_cable_v1 : new Dom("part_1_2_cable_v1"), +part_1_2_cable_v2 : new Dom("part_1_2_cable_v2"), +part_1_2_calculations : new Dom("part_1_2_calculations"), +part_1_2_components : new Dom("part_1_2_components"), +part_1_2_conclusion_box : new Dom("part_1_2_conclusion_box"), +part_1_2_instruction_box : new Dom("part_1_2_instruction_box"), +part_1_2_nomenclature_box : new Dom("part_1_2_nomenclature_box"), +part_1_2_procedure_box : new Dom("part_1_2_procedure_box"), +part_2_cable_a2 : new Dom("part_2_cable_a2"), +part_2_cable_e : new Dom("part_2_cable_e"), +part_2_cable_n2 : new Dom("part_2_cable_n2"), +part_2_cable_p1 : new Dom("part_2_cable_p1"), +part_2_cable_p2 : new Dom("part_2_cable_p2"), +part_2_cable_r2 : new Dom("part_2_cable_r2"), +part_2_cable_v1 : new Dom("part_2_cable_v1"), +part_2_cable_v2 : new Dom("part_2_cable_v2"), +part_2_cable_vg1 : new Dom("part_2_cable_vg1"), +part_2_cable_vg2 : new Dom("part_2_cable_vg2"), +part_2_calculations : new Dom("part_2_calculations"), +part_2_components : new Dom("part_2_components"), +part_2_conclusion_box : new Dom("part_2_conclusion_box"), +part_2_nomenclature_box : new Dom("part_2_nomenclature_box"), +part_2_procedure_box : new Dom("part_2_procedure_box"), +select_option_1_1 : new Dom("select_option_1_1"), +select_option_1_2 : new Dom("select_option_1_2"), +select_option_2 : new Dom("select_option_2"), +select_option_full : new Dom("select_option_full"), +slider_thumb : new Dom("slider_thumb"), diff --git a/experiment/simulation/EE6/toolkit/btn_download.png b/experiment/simulation/EE6/toolkit/btn_download.png new file mode 100644 index 0000000..6873ade Binary files /dev/null and b/experiment/simulation/EE6/toolkit/btn_download.png differ diff --git a/experiment/simulation/EE6/toolkit/fix_styling.css b/experiment/simulation/EE6/toolkit/fix_styling.css new file mode 100644 index 0000000..b3dc4a7 --- /dev/null +++ b/experiment/simulation/EE6/toolkit/fix_styling.css @@ -0,0 +1,15 @@ +body{ + justify-content: unset; +} + +.right-box{ + margin-left: 0; +} + +.main-container{ + margin: auto; +} + +.right-container{ + width: unset; +} diff --git a/experiment/simulation/EE6/toolkit/main_spinner.css b/experiment/simulation/EE6/toolkit/main_spinner.css new file mode 100644 index 0000000..645e96e --- /dev/null +++ b/experiment/simulation/EE6/toolkit/main_spinner.css @@ -0,0 +1,173 @@ +:root { + --light-color: #c9bafc; + --mid-color: #9f91cc; + --dark-color: #3d246c; + --size: 30; + --trans: ease; + } + + .main-spinner { + display: none; + top: 50%; + left: 50%; + transform: translate(-50%,-63%); + width: calc(var(--size) * 1vmin); + height: calc(var(--size) * 1vmin); + position: fixed; + } + + .main-spinner:before { + content: ""; + background: var(--mid-color); + width: 50%; + height: 50%; + position: absolute; + left: 0%; + top: 0%; + transform-origin: right bottom; + animation: shadow 4s var(--trans) 0s infinite; + } + + .main-spinner:after { + content: ""; + background: var(--mid-color); + width: 33.33%; + height: 33.33%; + position: absolute; + left: 50%; + top: 16.66%; + transform-origin: left bottom; + animation: shadow 4s var(--trans) 1s infinite; + transform: scale(0); + z-index: -1; + } + + .main-spinner .loader { + width: calc(var(--size) * 0.5vmin); + height: calc(var(--size) * 0.5vmin); + background: var(--dark-color); + transform-origin: right bottom; + animation: outer 4s var(--trans) 0s infinite; + position: relative; + } + + .main-spinner .loader span { + width: 50%; + height: 50%; + display: block; + background: var(--light-color); + transform-origin: right bottom; + animation: inner 1s ease-in-out 0.5s infinite; + top: 50%; + left: 50%; + position: absolute; + } + + .main-spinner a { + position: absolute; + font-size: 1.5vmin; + text-shadow: 0 0px 0 #000; + bottom: 5vmin; + font-family: Arial, Helvetica, serif; + text-decoration: none; + background: #111; + color: #fff; + padding: 1.25vmin 1.5vmin; + text-transform: uppercase; + } + + .main-spinner a:hover { + background: #999; + color: #222; + text-shadow: -1px 0px 0 #fff8; + } + + .main-spinner a span { + color: #454545; + } + + .main-spinner .text{ + display: none; + left: 50%; + top: 50%; + transform: translate(-50%, -66%); + padding: 7px; + width: 700px; + position: relative; + text-align: center; + z-index: 10; + font-size: 18px; + } + + .main-spinner .text span{ + line-height: 1.4; + color: #500051; + padding: 0 5px; + border-radius: 6px; + background-color: #6b6b6b42; + /* font-style: italic; */ + font-weight: bold; + } + + @keyframes outer { + 0% { + transform: rotate(0deg) scale(1); + } + 12.5% { + transform: rotate(90deg) scale(1); + } + 25% { + transform: rotate(90deg) scale(0.75); + } + 37.5% { + transform: rotate(180deg) scale(0.75); + } + 50% { + transform: rotate(180deg) scale(0.5); + } + 62.5% { + transform: rotate(270deg) scale(0.5); + } + 75% { + transform: rotate(270deg) scale(0.25); + } + 87.5% { + transform: rotate(360deg) scale(0.25); + } + 100% { + transform: rotate(360deg) scale(1); + } + } + + @keyframes inner { + 50%, + 100% { + transform: rotate(360deg); + } + } + + @keyframes shadow { + 0%, + 8.25% { + transform: scale(0); + } + 16.5% { + transform: scale(1); + } + 49.5% { + transform: scale(0); + } + 50% { + transform: scale(0) rotate(180deg); + } + 50.5%, + 58.25% { + transform: scale(0) rotate(180deg); + } + 66.5% { + transform: scale(0.5) rotate(180deg); + } + 100% { + transform: scale(0) rotate(180deg); + } + } \ No newline at end of file diff --git a/experiment/simulation/EE6/toolkit/msg_download.png b/experiment/simulation/EE6/toolkit/msg_download.png new file mode 100644 index 0000000..fec5de6 Binary files /dev/null and b/experiment/simulation/EE6/toolkit/msg_download.png differ diff --git a/experiment/simulation/EE6/toolkit/setBlinkArrowYellow.png b/experiment/simulation/EE6/toolkit/setBlinkArrowYellow.png new file mode 100644 index 0000000..3715942 Binary files /dev/null and b/experiment/simulation/EE6/toolkit/setBlinkArrowYellow.png differ diff --git a/experiment/simulation/EE6/toolkit/toolkit.css b/experiment/simulation/EE6/toolkit/toolkit.css new file mode 100644 index 0000000..b70be09 --- /dev/null +++ b/experiment/simulation/EE6/toolkit/toolkit.css @@ -0,0 +1,150 @@ +/* ! Download Button CSS */ +/* print css */ +@media print { + * { + -webkit-print-color-adjust: exact !important; /* Chrome, Safari 6 – 15.3, Edge */ + color-adjust: exact !important; /* Firefox 48 – 96 */ + print-color-adjust: exact !important; /* Firefox 97+, Safari 15.4+ */ + } + body{ + background-color: white!important; + } + .main-container{ + scale: 1!important; + transform: none!important; + } + + #drawer, + .toolkit, + .progressbar, + .blinkArrow + .blinkArrowRed{ + display: none!important; + visibility: hidden; + } + .anime-header, .anime-footer{ + display: flex!important; + } + .main-window{ + border-radius: 10px; + } + @page { + size: landscape; + } +} + +body{ + /* height: 100vh; */ +} +/* ! Toolkit */ +.toolkit{ + width: 60px; + position: relative; + top: 34px; + background-color: #3d246c; + height: 604px; + /* border-right: 2px solid black; + border-top: 2px solid black; */ + border-top-right-radius: 10px; + border-bottom-right-radius: 10px; +} +.toolkit .btn-group{ + margin: 1px; + padding: 10px; + display: flex; + flex-direction: column; + justify-content: flex-end; + height: 100%; + gap: 10px; +} +.toolkit .btn{ + display: flex; + justify-content: center; + align-items: center; + width: 40px; + height: 40px; + padding: 7px; + margin: 0; +} +.toolkit .btn .title{ + position: absolute; + visibility: hidden; +} +.toolkit .btn-logo{ + height: 20px; + width: 20px; +} +.toolkit +/* for only mute btn */ +.toolkit .mute { + padding: 0; +} +.toolkit .mute img{ + width: 40px; + height: 40px; + padding: 10px; +} +.toolkit .msg-download{ + +} +/* .toolkit .btn:hover .title{ + visibility: visible; + position: relative; +} */ + +/* ! Adding border to containers */ +.main-window{ + border: none; + /* border-left: 2px solid black; + border-top: 2px solid black; + border-bottom: 2px solid black; */ + border-top-left-radius: 10px; + border-bottom-left-radius: 10px; + z-index: 10000; +} + +.anime-footer{ + background-color: #3d246c!important; +} +.toolkit{ + z-index: 9000; +} +.toolkit, .main-window{ + box-shadow: 0px 0px 20px -1px black; +} + +.border-right-radius{ + border-top-right-radius: 10px; + border-bottom-right-radius: 10px; +} +.toolkit .blinkArrowYellow{ + display: none; + height: 30px; + position: absolute; + bottom: 60px; + left: 12px; + rotate: 90deg; +} + +/* ! Universal CSS */ +*{ + user-select: none; +} + +img{ + user-drag: none; + -webkit-user-drag: none; + user-select: none; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; +} + +body{ + background-color: #f8f9fa; +} + +#drawer{ + background-color: #ffffff; +} + diff --git a/experiment/simulation/EE6/toolkit/toolkit.js b/experiment/simulation/EE6/toolkit/toolkit.js new file mode 100644 index 0000000..4998f69 --- /dev/null +++ b/experiment/simulation/EE6/toolkit/toolkit.js @@ -0,0 +1,282 @@ +// Define the function +// to screenshot the div + +const Download = { + btnDownload: null, + btnMute: null, + isMobileUser: false, + isSpinnerVisible: false, + btnDownloadBlinkAnime: null, + isBtnDownloadClicked: false, + mainContainerHeight: 638, + spinnerTimeoutSeconds: 2000, + checkForStepEndIntervalId: null, + previousRealCurrentStep: null, + // 1 step aage + // removeDownloadFromTheseSteps: [], + addDownloadToTheseSteps: [4], + init() { + this.setOnClicks(); + this.showTookitForCurrentStep(); + this.setBtnDownloadBlink(); + this.checkForStepEnd(); + this.stopImageDrag(); + this.disableRightClick(); + this.setBtnMuteOnClick(); + this.detectMobileUser(); + this.detectZoomLevel() + // TODO UNCOMMENT + this.setHeightOfMainContainerAuto(); + }, + setOnClicks() { + this.btnDownload = document.querySelector(".btn-download-pdf"); + this.btnMute = document.querySelector(".btn-mute"); + + this.btnDownload.onclick = this.capture; + }, + capture() { + window.print(); + Download.setBlinkArrowYellow(-1) + }, + showTookitForCurrentStep() { + $(".toolkit").hide(); + + let intervalForCheck = null; + const checkForCurrentStepChange = () => { + // ! don't try to understand (this is working) + // * add download to these + if (this.addDownloadToTheseSteps.indexOf(Scenes.realCurrentStep) != -1) { + // clearInterval(intervalForCheck) + $(".toolkit").show("slow"); + $(".main-window").removeClass("border-right-radius"); + } else { + $(".toolkit").hide("slow"); + $(".main-window").addClass("border-right-radius"); + } + }; + + intervalForCheck = setInterval(() => { + checkForCurrentStepChange(); + }, 1000); + }, + checkForStepEnd() { + if(this.checkForStepEndIntervalId != null){ + return + } + + this.checkForStepEndIntervalId = setInterval(() => { + if(this.previousRealCurrentStep == Scenes.realCurrentStep){ + return + } + if ( + this.addDownloadToTheseSteps.indexOf(Scenes.realCurrentStep) != -1 && + !isRunning + ) { + // * For running it only one time + this.setBlinkArrowYellow(true, 12, 495).play(); + this.btnDownloadBlinkAnime.play(); + this.previousRealCurrentStep = Scenes.realCurrentStep + } + + }, 1000); + }, + playDownloadButtonAnime(){ + // ! for remoging check for step end + if(!this.checkForStepEndIntervalId){ + clearInterval(this.checkForStepEndIntervalId) + } + + // * For running it only one time + this.setBlinkArrowYellow(true, 12, 495).play(); + this.btnDownloadBlinkAnime.play(); + setTimeout(() => { + this.setBlinkArrowYellow(-1) + }, 4000); + }, + setBlinkArrowYellow( + isX = true, + left = null, + top = null, + height = 30, + width = null, + rotate = 0 + ) { + let blinkArrow = new Dom(".blinkArrowYellow") + .set(left, top, height, width) + .rotate(rotate) + .zIndex(10000); + if (isX === -1) { + blinkArrow.hide(); + return; + } + let x = 0, + y = 0; + if (isX) { + x = 20; + } else { + y = 20; + } + var blink = anime({ + targets: blinkArrow.item, + easing: "easeInOutQuad", + opacity: 1, + translateX: x, + translateY: y, + direction: "alternate", + loop: true, + autoplay: false, + duration: 300, + }); + + return blink; + }, + setBtnDownloadBlink() { + this.btnDownloadBlinkAnime = anime({ + targets: this.btnDownload, + autoplay: false, + scale: [1, 1.2], + backgroundColor: ["#ffdbc3", "#fff000"], + loop: 4, + duration: 1000, + direction: 'alternate', + complete(anim) { + anim.reset(); + }, + }); + }, + stopImageDrag() { + $("img").on("dragstart", function (event) { + event.preventDefault(); + }); + }, + disableRightClick() { + document.addEventListener("contextmenu", (event) => event.preventDefault()); + }, + setBtnMuteOnClick() { + const btn_mute_old_functionality = () => { + this.btnMute.onclick; + }; + this.btnMute.onclick = () => { + btn_mute_old_functionality(); + window.speechSynthesis.cancel(); + }; + }, + detectMobileUser() { + let ratio = window.innerWidth / window.innerHeight; + if (ratio <= 1) { + this.isMobileUser = true; + } + // alert(`h: ${window.innerHeight}\nw: ${window.innerWidth}`) + }, + // ! set main-container height according to display + setHeightOfMainContainerAuto() { + // ! for mobile resising using width + if (this.isMobileUser) { + return; + } + const windowInnerHeight = parseFloat(window.innerHeight); + const mainContainerHeight = this.mainContainerHeight + let scalePercent = windowInnerHeight / mainContainerHeight; + let translateYValue = + (windowInnerHeight - mainContainerHeight) / 2 / scalePercent; + + // ! scale maxed up to 2x + if(scalePercent > 2){ + scalePercent = 2 + translateYValue = 160.4 + } + + // alert(scalePercent) + document.querySelector( + ".main-container" + ).style.transform = `scale(${scalePercent}) translateY(${translateYValue}px)`; + }, + toggleSpinner() { + $(".main-spinner").show(); + $(".main-container").hide(); + + setTimeout(() => { + $(".main-container").show("slow"); + $(".main-spinner").hide("slow"); + }, this.spinnerTimeoutSeconds); + }, + detectZoomLevel() { + var screenCssPixelRatio = (window.outerWidth - 8) / window.innerWidth; + let zoomLevel = "" + if (screenCssPixelRatio >= 0.46 && screenCssPixelRatio <= 0.54) { + zoomLevel = "-4"; + } else if (screenCssPixelRatio <= 0.64) { + zoomLevel = "-3"; + } else if (screenCssPixelRatio <= 0.76) { + zoomLevel = "-2"; + } else if (screenCssPixelRatio <= 0.92) { + zoomLevel = "-1"; + } else if (screenCssPixelRatio <= 1.1) { + zoomLevel = "0"; + } else if (screenCssPixelRatio <= 1.32) { + zoomLevel = "1"; + } else if (screenCssPixelRatio <= 1.58) { + zoomLevel = "2"; + } else if (screenCssPixelRatio <= 1.9) { + zoomLevel = "3"; + } else if (screenCssPixelRatio <= 2.28) { + zoomLevel = "4"; + } else if (screenCssPixelRatio <= 2.7) { + zoomLevel = "5"; + } else { + zoomLevel = "unknown"; + } + //! if zoom not 100% just show message warning + if(zoomLevel != "0" && !this.isMobileUser){ + $(".main-spinner .text").show(); + this.spinnerTimeoutSeconds = 5000 + } + if(this.isMobileUser){ + $(".main-spinner .text").show(); + $(".main-spinner .text").html("For better user experience use
    🖥️ Desktop Site and"); + this.spinnerTimeoutSeconds = 5000 + } + // alert(zoomLevel) + }, +}; + +setTimeout(() => { + // $(".main-container").hide(); +}, 100); + +$(document).ready(function () { + // TODO uncomment + Download.init(); + // Download.toggleSpinner() + + window.onbeforeprint = () => { + Dom.setBlinkArrowRed(-1); + Dom.setBlinkArrow(-1); + }; +}); + +// * image converter +// capture() { +// let div = document.querySelector(".main-container"); + +// // Use the html2canvas +// // function to take a screenshot +// // and append it +// // to the output div +// html2canvas(div).then(function (canvas) { +// // document.getElementById("output").appendChild(canvas); + +// let image = canvas +// .toDataURL("image/png") +// .replace("image/png", "image/octet-stream"); +// console.log(canvas.toDataURL("image/png")) + +// // location.href = image + +// var a = document.createElement('a') +// a.href = image +// a.download = "Experiment.jpeg" + +// a.click() +// }); +// }, diff --git a/experiment/simulation/images/README.md b/experiment/simulation/images/README.md deleted file mode 100644 index 9b47fb5..0000000 --- a/experiment/simulation/images/README.md +++ /dev/null @@ -1,2 +0,0 @@ -### This folder contains all the image files used in the simulation. -### Create sub-directories, if needed. ex: gifs/ \ No newline at end of file diff --git a/experiment/simulation/index.html b/experiment/simulation/index.html index ee9be23..c177440 100644 --- a/experiment/simulation/index.html +++ b/experiment/simulation/index.html @@ -1,13 +1,76 @@ - + - - + + + - + + + + let btn = document.querySelector("button") + let idx = 0 + // btn.onclick = ()=>{ + // iframe.attributes['src'].value = paths[idx++] + // } + // btn.click() + + function setIframeSrc(path){ + StepDone.goto = "" + localStorage.setItem("StepDone",JSON.stringify(StepDone)) + iframe.attributes['src'].value = paths[path] + } + + function detectMove(){ + StepDone = JSON.parse(localStorage.getItem("StepDone")) + let menu = "menu", + IGBT = "IGBT", + MOSFET = "MOSFET", + scr = "SCR" + switch(StepDone.goto){ + case menu: + setIframeSrc("SCR") + break + case IGBT: + setIframeSrc(IGBT) + break + case MOSFET: + setIframeSrc(MOSFET) + break + } + console.log(StepDone.goto) + } + + localStorage.setItem("StepDone",JSON.stringify(StepDone)) + setIframeSrc("SCR") + setInterval(detectMove, 1000) + let pdx = 0 + console.log("index:",pdx++,StepDone) + // iframe.attributes['src'].value = paths.MOSFET + + - + \ No newline at end of file diff --git a/experiment/theory.md b/experiment/theory.md index ef57af9..6a24aac 100644 --- a/experiment/theory.md +++ b/experiment/theory.md @@ -1 +1,615 @@ -### Link your theory in here \ No newline at end of file +### Theory + +### 1) SCR + +**Representation of SCR:** + +Fig. 1(a) and 1(b) show the symbolic representation of SCR and a typical SCR package available in market. + +
    + + + + + + +
    +
    + +
    + +

    +Fig. 1(a). Symbolic representation of SCR. +

    +
    +
    + +
    + +
    + +

    +Fig. 1(b). A typical SCR package. +

    +
    +
    +
    + +
    +

    + +**Introduction to SCR:** + +Fig. 2 shows the internal structure of a SCR. Some of the key features of SCR are compiled and given below. + +
    + +
    + + +
    +Fig. 2. Internal structure of SCR. +
    +
    +
    + +1. Silicon-controlled rectifier (SCR) is a semiconductor power device. It is used as a controlled switch in power electronic circuits as bistable switches (ON/ OFF State). In utility dc transmission line applications, series-connected SCRs are employed in It finds wide applications in AC-DC rectifiers, Choppers, AC Voltage controllers, Cycloconverters and Inverters.
    + +2. It has a four layer PNPN structure: Two P-type doped (p) layers, Two N-type doped layers, one is heavy doped (n+) and lightly doped (n-). It has three junctions: p-n (J1), n-p (J2) and p-n+ (J3).
    +3. The SCR has three external terminals namely: Anode (A), Cathode (K) and Gate (G).

    + +**Operating modes of SCR:** +
    + +1. Forward Blocking State: When the anode voltage is made more positive with respect to the cathode and the Gate current is zero, the junctions ‘J1 ‘ and ‘J3 ‘ are forward biased while ‘J2 ‘ is reverse biased. Only a small leakage current flows from anode to cathode. The SCR is then said to be in the forward blocking. + +2. Forward Conducting State: If the anode-to-cathode voltage (vAK) is increased to a sufficient value, the reverse-biased junction J2 breaks down. This is known as avalanche breakdown. All three junctions (J1, J2 and J3 ) are now forward biased, resulting in flow of current (iA). The device is now in conducting state, or ON-state. A minimum anode current known as ‘latching current’ (IL) needs to be maintained immediately after the SCR goes to ON- State. + +3. Once the SCR starts conducting, gate loses control over the device. It continues conducting even after gate signal is removed. However, if the forward anode current (IA) is reduced below a level known as the ‘holding current’ (IH), the SCR goes to blocking state. The holding current is less than the latching current. + +4. Reverse Blocking State: When the cathode voltage is more positive with respect to the anode, the junctions 'J1' and 'J3' are reverse biased while junction 'J2 is forward biased. No current flows from anode-to-cathode and hence the SCR is in reverse blocking state or OFF- State.

    + + + +**'v-i' Characteristics of the SCR:** + +1. 'v-i' characteristics of a SCR shows the variation between the anode current (iA) against the anode-to-cathode voltage (vAK).

    +2. The circuit diagram to plot the characteristics is given in Fig. 3.
    + +
    + + +
    +Fig. 3. Circuit to plot v-I characteristics. +
    +
    +
    + +3. The 'v-i' characteristics of SCR is shown in Fig. 4. + +
    + + +
    +Fig. 4. v-i characteristics of SCR. +
    +
    +
    + +4. SCR has three operating modes: Forward Blocking, Forward Conduction and Reverse Blocking as shown in Fig. 4. 'IH' is the holding current and 'IL' is the latching current. The Forward breakover voltages 'VBO1 , VBO2 and VBO3' (VBO1 BO2 BO3) correspond to the Gate currents 'Ig1, Ig2 and Ig3' (Ig1 > Ig2 > Ig3) respectively. + + + +

    + +**Circuit Diagram to plot 'v-i' Characteristics** + +The v-i characteristics of SCR can be obtained using the circuit diagram given in Fig. 3. AC supply is connected in series with SCR and a resistive load. In order to obtain the v-i characteristics, the Anode-to-Cathode voltage (vAK) and Anode current (iA) are to be recorded using any one of the following methods: + +1. Using Analog measuring instruments: Voltmeters and Ammeters +2. Using Digital Storage Oscilloscope + +**• Method-1: Using Analog measuring instruments: Voltmeters and Ammeters** +
    + +
    + + +
    +Fig. 5. Circuit Diagram using meters. +
    +
    +
    + +Steps for experimentation (Refer Fig. 5): + + 1. Ammeter to measure the anode current and Voltmeter to measure the anode-to-cathode voltage (vAK) are to be connected in series and parallel respectively to the SCR. + + 2. The gate supply circuit consists of a battery in series with the rheostat and an Ammeter. The rheostat (Rg) limits the gate current (Ig) magnitude since only a very small amount of gate current is required to trigger the SCR into ON-state. + + 3. The input supply voltage is increased in steps and the corresponding Voltmeter and Ammeter readings are to be tabulated. The data points indicate the v-i characteristics.

    + + +**Instruments required for the above method:** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +**Instrument** +
    +
    + +
    + +**Quantity** +
    +
    +
    + +SCR mounted on a heat sink +
    +
    + +
    + +**1** +
    +
    +
    +Variable AC supply (autotransformer) +
    +
    + +
    + +**1** +
    +
    +
    +Rheostats (Rating: 1 KΩ, 100 KΩ) +
    +
    + +
    + +**2** +
    +
    +
    +Multi-meter +
    +
    + +
    + +**1** +
    +
    +
    +AC- Voltmeter +
    +
    + +
    + +**1** +
    +
    +
    +AC-Ammeter +
    +
    + +
    + +**1** +
    +
    +
    +DC-Ammeter +
    +
    + +
    + +**1** +
    +
    + + + +**• Method-2: Using Digital Oscilloscope (DSO)** + + +
    + + +
    +Fig. 6. Circuit Diagram using probes. +
    +
    +
    + +Steps for experimentation (Refer Fig. 6): + + 1. A hall effect current probe is used to measure the anode current (iA) and a differential voltage probe (DVP) to is used to measure the anode-to-cathode voltage (vAK).
    + 2. Measure the anode current using the hall effect current probe (connect this probe to channel-2 of DSO which displays on y-axis). The voltage probe is connected across the SCR to measure the anode-to-cathode voltage (connect this probe to channel-1 of DSO which displays on x-axis).
    + 3. The gate supply circuit consists of a battery in series with a rheostat and a DC ammeter. The rheostat (Rg) limits the gate current (Ig) magnitude since only a very small amount of gate current is required to trigger the SCR into ON-state.
    + 4. Increase the input supply voltage (vin) gradually and observe the current-vs-voltage profile simultaneously on the DSO screen. This trace is the v-i characteristics of the SCR. + + + +**Instruments required for the above method:** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +**Instrument** +
    +
    + +
    + +**Quantity** +
    +
    +
    + +SCR mounted on a heat sink +
    +
    + +
    + +**1** +
    +
    +
    +Variable AC supply (autotransformer) +
    +
    + +
    + +**1** +
    +
    +
    +Rheostats (Rating: 1 KΩ, 100 KΩ) +
    +
    + +
    + +**2** +
    +
    +
    +Multi-meter +
    +
    + +
    + +**1** +
    +
    +
    +Digital Oscilloscope (DSO) +
    +
    + +
    + +**1** +
    +
    +
    +Differential Voltage Probe +
    +
    + +
    + +**1** +
    +
    +
    +Current Probe +
    +
    + +
    + +**1** +
    +
    + +### 2) IGBT + +**Representation of IGBT:** + +Fig. 7(a) and 7(b) show the symbolic representation of IGBT and a typical IGBT package available in market. + +
    + + + + + + +
    +
    + +
    + +

    +Fig. 7(a). Symbolic representation of IGBT. +

    +
    +
    + +
    + +
    + +

    +Fig. 7(b). A typical IGBT package. +

    +
    +
    +
    + +
    +

    + +**Introduction to IGBT:** + +Fig. 8 shows the internal structure of an IGBT. Some of the key features of IGBT are compiled and given below. + +
    + +
    + + +
    +Fig. 8. Internal structure of IGBT. +
    +
    +
    + +1. Insulated-Gate Bipolar Transistor (IGBT) is a semiconductor power device. It combines the advantages of a BJT and a MOSFET. It has high input impedance, like MOSFET, and low on-state conduction losses, like BJT. However, it shows higher switching time especially during the turn-off transition.
    + +2. It has a four PNPN layer structure: a) Two P-type doped (p) layers. b) Two N-type doped layers- one is heavy doped (n+) and the other is lightly doped (n-). It has three junctions: n+-p (J1), p-n- (J2) and n--p (J3).
    +3. The IGBT has three external terminals namely: Gate (G), Collector (C) and Emitter (E).

    + + +**Operating modes of IGBT:** +
    + +1. Forward Blocking State: An IGBT is a voltage controlled device. When the Collector voltage is made more positive with respect to the Emitter and the Gate current is zero, the Collector current is negligible. + +2. Forward Conducting State: When the Gate voltage is made more positive than the Emitter voltage, n carriers are drawn into the p-channel near the gate region; this results in a forward bias of the n-p and p-n junctions. Current freely flows from collector to emitter.
    +During forward conduction, the IGBT will operate in any one of the following states, depending on the values of Collector-to-Emitter voltage (VCE) and the Gate voltage (VGE) values: Cut-off region, Active region or Saturation region. + +3. Reverse Blocking State: When the Emitter voltage is higher with respect to the Collector voltage, no current can flow through the device even with gate current applied.

    + + + +**Characteristics of the IGBT:** + +1. Output Characteristics: It is the plot between the Collector-to-Emitter voltage (VCE) and the Collector current (IC) for a fixed Gate-to-Emitter voltage (VGE). The circuit diagram to plot the characteristics is given in Fig. 9. Voltage ‘VCE’ is measured by the voltmeter while the ammeter measures the current ‘IC’.

    + +
    + + +
    +Fig. 9. Circuit diagram for Output characteristics. +
    +
    +
    + +The output characteristics of IGBT is shown in Fig. 10. + +
    + + +
    +Fig. 10. Output characteristics of IGBT. +
    +
    +
    +IGBT has three operating regions: Cutoff region, Linear region and Saturation region as shown in Fig. 11.

    + +a) In cutoff region, the Gate voltage is lower than the threshold (VT) and the IGBT doesn’t conduct.
    +b) In linear region, the Collector current IC varies in proportion to the Collector-to-Emitter voltage VCE. IGBT is operated in the linear region for switching actions.
    +c) In the saturation region, the Collector current remains almost constant for any increase in the value of VCE.
    + +

    + +### 3) MOSFET + + +**Representation of MOSFET:** + +Fig. 12(a) and 12(b) show the symbolic representation of MOSFET and a typical MOSFET package available in market. + +
    + + + + + + +
    +
    + +
    + +

    +Fig. 12(a). Symbolic representation of MOSFET +

    +
    +
    + +
    + +
    + +

    +Fig. 12(b). A typical MOSFET package +

    +
    +
    +
    + +
    +

    + +**Introduction to MOSFET:** + +Fig. 13 shows the internal structure of MOSFET. Some of the key features of MOSFET are compiled and given below. + +
    + +
    + + +
    +Fig. 13. Internal structure of MOSFET. +
    +
    +
    + +1. It is a three-terminal majority carrier device. It exhibits high switching speed, low rise and fall time. It is suitable for low-power, high-frequency switching applications such as DC-DC converters.
    + +2. It is a voltage-controlled device and the ‘Gate circuit’ requires only a small amount of current for it to start conducting (ON-State).
    + +3. There are two types of MOSFETs: a) Depletion type, b) Enhancement type. Both have three terminals: Drain (D), Source (S) and Gate (G).
    + +4. Enhancement-type MOSFET works in two modes: ON-state (conducting) and OFF-state (blocking), controlled by the PWM signal given to the Gate terminal.
    + +5. For gate-to-source voltage more than threshold (VT), Enhancement-type MOSFET conducts. At zero gate voltage, it remains in OFF-state. Hence, it is generally used as switching device in power converters/ power conversion applications.
    + + +**Operating modes of MOSFET switching device:** +
    + +1. Forward Blocking State (vDS > 0, vGS = 0): A MOSFET is a voltage controlled device. When Drain-to-Source voltage (vDS) is positive, both the junctions remain reverse biased. MOSFET doesn’t conduct. + +2. Forward Conducting State (vDS > 0, vGS ≥ VT): When Drain-to-Source voltage (vDS) is positive, with Gate-to-Source voltage (vGS) more than threshold voltage, the MOSFET starts conducting and hence current flows from drain to source. +During forward conduction, the MOSFET will operate in any one of the following states, depending on the values of drain-to-source voltage (VDS) and the Gate voltage (VGS) values: Cut-off region, linear region and Saturation region. + +3. Reverse Blocking State (vDS < 0): When the drain-to-source voltage (VDS) is negative the junctions become reverse biased and MOSFET stops conducting.

    + +**Characteristics of the MOSFET:** + +Output Characteristics: It is the plot between the Drain-to-Source voltage (VDS) and the Drain current (ID) for a fixed Gate-to-Source voltage (VGS). The circuit diagram to plot these characteristics is given in Fig. 14. Voltage ‘VDS’ is measured by the voltmeter while the ammeter measures the current ‘ID’.

    + +
    + + +
    +Fig. 14. Circuit diagram for output characteristics. +
    +
    +
    + +The output characteristics of MOSFET is shown in Fig. 14. + +
    + + +
    +Fig. 15. Output characteristics of MOSFET. +
    +
    +
    +
    + +MOSFET has three operating regions: Cutoff region, Linear region and Saturation region as shown in Fig. 15. + +#### ("For more Information on mathematical analysis, see references") +